{"version":3,"sources":["../../../templates/js/src/alignment_game.ts"],"sourcesContent":["const DEBUG = true;\nconst GRID_PATH = \"/static/images/grid/v3\";\n\nfunction shuffleArray(array: T[]): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\nfunction isSorted(arr: T[]): boolean {\n for (let i = 0; i < arr.length - 1; i++) {\n if (arr[i] > arr[i + 1]) {\n return false;\n }\n }\n return true;\n}\n\ninterface ImagePath {\n src: string;\n order: number;\n}\n\nclass ImageGenerator {\n dragElement: HTMLElement;\n spawnIntoContainer: HTMLElement;\n images: Array;\n imageElements: Array;\n disabled: boolean = false;\n imageWidth: number;\n imageHeight: number;\n onBeforeNextImage?: (gen: ImageGenerator, index: number) => boolean;\n onFinish?: (gen: ImageGenerator) => void;\n\n constructor(\n dragElement: HTMLElement,\n spawnIntoContainer: HTMLElement,\n images: Array,\n imageWidth: number = 256,\n imageHeight: number = 192,\n ) {\n this.dragElement = dragElement;\n this.spawnIntoContainer = spawnIntoContainer;\n this.images = images;\n this.imageElements = new Array(images.length).fill(null);\n this.imageWidth = imageWidth;\n this.imageHeight = imageHeight;\n }\n\n getNextImage(i: number) {\n if (this.disabled) {\n return null;\n }\n\n if (this.onBeforeNextImage && this.onBeforeNextImage(this, i)) {\n return null;\n }\n\n if (i >= this.images.length) {\n return null;\n }\n\n const index = i;\n return {\n src: `${GRID_PATH}/${this.images[i].src}`,\n width: 256,\n height: 192,\n onDragStop: (_: MouseEvent | TouchEvent, element: HTMLElement) => {\n if (this.imageElements[index] === null) {\n this.imageElements[index] = element;\n }\n DEBUG && console.debug(this.images[index].order);\n this.checkInOrder();\n },\n };\n }\n onNoImage() {}\n\n checkInOrder() {\n {\n const grid = new Map();\n\n for (let i = 0; i < this.images.length; i++) {\n const elementA = this.imageElements[i];\n if (!elementA) {\n return;\n }\n\n const aRect = elementA.getBoundingClientRect();\n\n const mx = Math.floor(aRect.x / this.imageWidth);\n const my = Math.floor(aRect.y / this.imageHeight);\n\n const k = my * this.images.length + mx;\n grid.set(k, i);\n }\n\n const sortedValues = Array.from(grid.entries())\n .sort((a, b) => a[0] - b[0])\n .map((kv) => kv[1]);\n\n DEBUG &&\n console.info(sortedValues.map((x) => this.imageElements[x]));\n DEBUG &&\n console.info(sortedValues.map((x) => this.images[x].order));\n\n if (isSorted(sortedValues.map((x) => this.images[x].order))) {\n for (let i = 0; i < this.imageElements.length; i++) {\n this.imageElements[i]?.classList.remove(\"border-c-black\");\n this.imageElements[i]?.classList.add(\"border-c-yellow\");\n }\n DEBUG && console.debug(\"You are finished!!!!!!!!!!\");\n } else {\n for (let i = 0; i < this.imageElements.length; i++) {\n this.imageElements[i]?.classList.add(\"border-c-black\");\n this.imageElements[i]?.classList.remove(\"border-c-yellow\");\n }\n }\n }\n }\n}\n\ninterface Image {\n src: string;\n width: number;\n height: number;\n onDragStop: (e: MouseEvent | TouchEvent, element: HTMLElement) => void;\n}\n\nfunction createImageContainer(\n parent: HTMLElement,\n src: string,\n x: number,\n y: number,\n width: number,\n height: number,\n classList?: string,\n): HTMLElement {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = `${x}px`;\n container.style.top = `${y}px`;\n container.style.width = `${width}px`;\n container.style.height = `${height}px`;\n container.style.cursor = \"grab\";\n if (classList) {\n container.className = classList;\n }\n\n const img = document.createElement(\"img\");\n img.src = src;\n img.alt = \"Image\";\n img.classList.add(\"no-drag\");\n img.style.width = \"100%\";\n img.style.height = \"100%\";\n\n container.appendChild(img);\n parent.appendChild(container);\n\n return container;\n}\nconst disableTextSelection = () => {\n document.body.style.userSelect = \"none\";\n};\n\nconst enableTextSelection = () => {\n document.body.style.userSelect = \"\";\n};\n\nfunction makeDraggable(element: HTMLElement, image: Image) {\n let zindex = 1;\n let offsetX = 0;\n let offsetY = 0;\n let isDragging = false;\n\n const onMouseMove = (e: MouseEvent | TouchEvent) => {\n const clientX =\n e instanceof MouseEvent ? e.clientX : e.touches[0].clientX;\n const clientY =\n e instanceof MouseEvent ? e.clientY : e.touches[0].clientY;\n\n const x = Math.floor(clientX / image.width) * image.width;\n const y = Math.floor(clientY / image.height) * image.height;\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n // element.style.left = `${clientX - offsetX}px`;\n // element.style.top = `${clientY - offsetY}px`;\n };\n\n const onMouseUp = (e: MouseEvent | TouchEvent) => {\n isDragging = false;\n element.style.cursor = \"grab\";\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.removeEventListener(\"touchmove\", onMouseMove);\n document.removeEventListener(\"touchend\", onMouseUp);\n enableTextSelection();\n image.onDragStop(e, element);\n };\n\n const startDragging = (clientX: number, clientY: number) => {\n offsetX = clientX - element.offsetLeft;\n offsetY = clientY - element.offsetTop;\n isDragging = true;\n\n element.style.zIndex = `${zindex++}`;\n element.style.cursor = \"grabbing\";\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n document.addEventListener(\"touchmove\", onMouseMove);\n document.addEventListener(\"touchend\", onMouseUp);\n disableTextSelection();\n };\n\n return startDragging;\n}\n\nfunction createSpawner(spawner: ImageGenerator) {\n var i = 0;\n\n const dragToSpawn = (e: MouseEvent | TouchEvent) => {\n e.preventDefault();\n\n disableTextSelection();\n\n const onMouseMove = (e: MouseEvent | TouchEvent) => {\n const clientX =\n e instanceof MouseEvent ? e.clientX : e.touches[0].clientX;\n const clientY =\n e instanceof MouseEvent ? e.clientY : e.touches[0].clientY;\n\n // const rect = spawner.dragElement.getBoundingClientRect();\n // if (\n // !(\n // clientX < rect.left ||\n // clientX > rect.right ||\n // clientY < rect.top ||\n // clientY > rect.bottom\n // )\n // ) {\n // spawner.onNoImage();\n // return;\n // }\n\n const nextImage = spawner.getNextImage(i++);\n\n if (nextImage === null) {\n return;\n }\n\n const image = createImageContainer(\n spawner.spawnIntoContainer,\n nextImage.src,\n clientX - nextImage.width / 2,\n clientY - nextImage.height / 2,\n nextImage.width,\n nextImage.height,\n \"rounded-lg border-2 border-c-black dark:border-c-white\",\n );\n\n const startDragging = makeDraggable(image, nextImage);\n\n const dragImage = (e: MouseEvent | TouchEvent) => {\n e.preventDefault();\n const clientX =\n e instanceof MouseEvent ? e.clientX : e.touches[0].clientX;\n const clientY =\n e instanceof MouseEvent ? e.clientY : e.touches[0].clientY;\n startDragging(clientX, clientY);\n };\n\n startDragging(clientX, clientY);\n\n image.addEventListener(\"mousedown\", dragImage);\n image.addEventListener(\"touchstart\", dragImage);\n\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"touchmove\", onMouseMove);\n };\n\n const onMouseUp = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.removeEventListener(\"touchmove\", onMouseMove);\n document.removeEventListener(\"touchend\", onMouseUp);\n enableTextSelection();\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n document.addEventListener(\"touchmove\", onMouseMove);\n document.addEventListener(\"touchend\", onMouseUp);\n };\n spawner.dragElement.addEventListener(\"mousedown\", dragToSpawn);\n spawner.dragElement.addEventListener(\"touchstart\", dragToSpawn);\n}\n\nexport function RunExplorePage() {\n var binaryStoryDragElement: HTMLElement | null =\n document.getElementById(\"binary-story\");\n var teaStoryDragElement: HTMLElement | null =\n document.getElementById(\"tea-story\");\n var erasureStoryDragElement: HTMLElement | null =\n document.getElementById(\"erasure-story\");\n var antStoryDragElement: HTMLElement | null =\n document.getElementById(\"ant-story\");\n\n if (binaryStoryDragElement == null) {\n console.error(\"could not find binaryStoryDragElement\");\n return;\n }\n if (teaStoryDragElement == null) {\n console.error(\"could not find teaStoryDragElement\");\n return;\n }\n if (erasureStoryDragElement == null) {\n console.error(\"could not find erasureStoryDragElement\");\n return;\n }\n if (antStoryDragElement == null) {\n console.error(\"could not find antStoryDragElement\");\n return;\n }\n\n const binaryStoryImages = [\n { src: \"0034.png\", order: 0 },\n { src: \"0036.png\", order: 1 },\n { src: \"0038.png\", order: 2 },\n { src: \"0040.png\", order: 3 },\n { src: \"0042.png\", order: 4 },\n ];\n const teaStoryImages = [\n { src: \"0060.png\", order: 0 },\n { src: \"0062.png\", order: 1 },\n { src: \"0064.png\", order: 2 },\n { src: \"0066.png\", order: 3 },\n ];\n const erasureStoryImages = [\n { src: \"0050.png\", order: 0 },\n { src: \"0052.png\", order: 1 },\n { src: \"0054.png\", order: 2 },\n { src: \"0056.png\", order: 3 },\n ];\n const antStoryImages = [\n { src: \"0102.png\", order: 0 },\n { src: \"0104.png\", order: 1 },\n { src: \"0106.png\", order: 2 },\n { src: \"0108.png\", order: 3 },\n { src: \"0110.png\", order: 4 },\n { src: \"0112.png\", order: 5 },\n { src: \"0114.png\", order: 6 },\n { src: \"0116.png\", order: 7 },\n { src: \"0118.png\", order: 8 },\n { src: \"0120.png\", order: 9 },\n { src: \"0122.png\", order: 10 },\n ];\n\n shuffleArray(binaryStoryImages);\n shuffleArray(teaStoryImages);\n shuffleArray(erasureStoryImages);\n shuffleArray(antStoryImages);\n\n const binaryGenerator = new ImageGenerator(\n binaryStoryDragElement,\n document.body,\n binaryStoryImages,\n );\n const teaGenerator = new ImageGenerator(\n teaStoryDragElement,\n document.body,\n teaStoryImages,\n );\n const erasureGenerator = new ImageGenerator(\n erasureStoryDragElement,\n document.body,\n erasureStoryImages,\n );\n const antGenerator = new ImageGenerator(\n antStoryDragElement,\n document.body,\n antStoryImages,\n );\n\n const gens = [\n binaryGenerator,\n teaGenerator,\n erasureGenerator,\n antGenerator,\n ];\n const disableOthers = (gen: ImageGenerator, index: Number) => {\n if (index !== 0) {\n return false;\n }\n for (const otherGen of gens) {\n if (gen !== otherGen) {\n otherGen.dragElement.classList.add(\"grayscale\");\n otherGen.disabled = true;\n }\n }\n return false;\n };\n binaryGenerator.onBeforeNextImage = disableOthers;\n teaGenerator.onBeforeNextImage = disableOthers;\n erasureGenerator.onBeforeNextImage = disableOthers;\n antGenerator.onBeforeNextImage = disableOthers;\n\n createSpawner(binaryGenerator);\n createSpawner(teaGenerator);\n createSpawner(erasureGenerator);\n createSpawner(antGenerator);\n}\n\ndeclare global {\n interface Window {\n alignmentGame: {\n RunExplorePage: () => void;\n };\n }\n}\n\nwindow.alignmentGame = {\n RunExplorePage: RunExplorePage,\n};\n"],"mappings":"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","names":["GRID_PATH","shuffleArray","array","i","j","isSorted","arr","ImageGenerator","dragElement","spawnIntoContainer","images","imageWidth","imageHeight","index","_","element","_a","_b","_c","_d","grid","elementA","aRect","mx","k","sortedValues","a","b","kv","x","createImageContainer","parent","src","y","width","height","classList","container","img","disableTextSelection","enableTextSelection","makeDraggable","image","zindex","offsetX","offsetY","isDragging","onMouseMove","e","clientX","clientY","onMouseUp","createSpawner","spawner","dragToSpawn","nextImage","startDragging","dragImage","RunExplorePage","binaryStoryDragElement","teaStoryDragElement","erasureStoryDragElement","antStoryDragElement","binaryStoryImages","teaStoryImages","erasureStoryImages","antStoryImages","binaryGenerator","teaGenerator","erasureGenerator","antGenerator","gens","disableOthers","gen","otherGen"]}