{"project":{"id":"yFeMZbk","userId":"davidyarham@gmail.com","username":null,"userPicture":null,"name":"Crossy Voxel","thumbnail":"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","visible":true,"contributors":"","githubRepo":"davidyarham/blnq-crossy-voxel","forkedFrom":null,"tags":"","files":{"folder":"","files":[{"name":"index.html","content":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Untitled</title>\n  <link rel=\"stylesheet\" href=\"style.css\">\n<script src=\"https://unpkg.com/three@0.160.0/build/three.min.js\"></script>\n<script src=\"https://unpkg.com/lucide@latest/dist/umd/lucide.js\"></script>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;800&display=swap\" rel=\"stylesheet\">\n</head>\n<body>\n<main class=\"game-shell\">\n\t<section class=\"hud\" aria-label=\"Game status\">\n\t\t<div class=\"hud__brand\">\n\t\t\t<div class=\"hud__title-wrap\">\n\t\t\t\t<p class=\"hud__eyebrow\">Arcade hopper</p>\n\t\t\t\t<h1 class=\"hud__title\">Crossy Voxel</h1>\n\t\t\t</div>\n\t\t\t<button class=\"hud__button\" id=\"muteButton\" type=\"button\" aria-pressed=\"false\" aria-label=\"Toggle sound\">\n        <i data-lucide=\"volume-2\"></i>\n      </button>\n\t\t</div>\n\n\t\t<div class=\"hud__stats\">\n\t\t\t<article class=\"stat-card\">\n\t\t\t\t<span class=\"stat-card__label\">Score</span>\n\t\t\t\t<strong class=\"stat-card__value\" id=\"scoreValue\">0</strong>\n\t\t\t</article>\n\t\t\t<article class=\"stat-card\">\n\t\t\t\t<span class=\"stat-card__label\">Best</span>\n\t\t\t\t<strong class=\"stat-card__value\" id=\"bestValue\">0</strong>\n\t\t\t</article>\n\t\t\t<article class=\"stat-card\">\n\t\t\t\t<span class=\"stat-card__label\">State</span>\n\t\t\t\t<strong class=\"stat-card__value stat-card__value--small\" id=\"stateValue\">Ready</strong>\n\t\t\t</article>\n\t\t</div>\n\t</section>\n\n\t<section class=\"game-stage\" aria-label=\"Crossy Voxel game area\">\n\t\t<div id=\"gameCanvas\" class=\"game-stage__canvas\"></div>\n\n\t\t<div class=\"overlay overlay--start\" id=\"startOverlay\">\n\t\t\t<div class=\"overlay__panel\">\n\t\t\t\t<p class=\"overlay__kicker\">Hop. Dodge. Drift.</p>\n\t\t\t\t<h2 class=\"overlay__title\">Make it absurdly far.</h2>\n\t\t\t\t<p class=\"overlay__text\">Cross roads, ride logs, avoid bumpers, and keep climbing for a bigger score.</p>\n\t\t\t\t<div class=\"overlay__actions\">\n\t\t\t\t\t<button class=\"overlay__button overlay__button--primary\" id=\"startButton\" type=\"button\">Start game</button>\n\t\t\t\t\t<button class=\"overlay__button\" id=\"howButton\" type=\"button\">How to play</button>\n\t\t\t\t</div>\n\t\t\t\t<ul class=\"overlay__tips\" aria-label=\"Controls\">\n\t\t\t\t\t<li><i data-lucide=\"arrow-up\"></i><span>WASD or arrow keys to move</span></li>\n\t\t\t\t\t<li><i data-lucide=\"smartphone\"></i><span>Swipe or use touch buttons on mobile</span></li>\n\t\t\t\t\t<li><i data-lucide=\"waves\"></i><span>Ride logs across rivers or splash out</span></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"overlay overlay--hidden\" id=\"gameOverOverlay\" aria-hidden=\"true\">\n\t\t\t<div class=\"overlay__panel overlay__panel--compact\">\n\t\t\t\t<p class=\"overlay__kicker\">Game over</p>\n\t\t\t\t<h2 class=\"overlay__title\">Splat happens.</h2>\n\t\t\t\t<p class=\"overlay__text\" id=\"gameOverText\">You made it 0 rows.</p>\n\t\t\t\t<div class=\"overlay__actions\">\n\t\t\t\t\t<button class=\"overlay__button overlay__button--primary\" id=\"restartButton\" type=\"button\">Hop again</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"touch-controls\" aria-label=\"Touch controls\">\n\t\t\t<button class=\"touch-controls__button touch-controls__button--up\" data-move=\"up\" type=\"button\" aria-label=\"Move up\">\n        <i data-lucide=\"arrow-up\"></i>\n      </button>\n\t\t\t<button class=\"touch-controls__button touch-controls__button--left\" data-move=\"left\" type=\"button\" aria-label=\"Move left\">\n        <i data-lucide=\"arrow-left\"></i>\n      </button>\n\t\t\t<button class=\"touch-controls__button touch-controls__button--down\" data-move=\"down\" type=\"button\" aria-label=\"Move down\">\n        <i data-lucide=\"arrow-down\"></i>\n      </button>\n\t\t\t<button class=\"touch-controls__button touch-controls__button--right\" data-move=\"right\" type=\"button\" aria-label=\"Move right\">\n        <i data-lucide=\"arrow-right\"></i>\n      </button>\n\t\t</div>\n\t</section>\n</main>\n  <script type=\"module\" src=\"main.js\"></script>\n</body>\n</html>"},{"name":"main.js","content":"const gameRoot = document.getElementById('gameCanvas');\nconst scoreValue = document.getElementById('scoreValue');\nconst bestValue = document.getElementById('bestValue');\nconst stateValue = document.getElementById('stateValue');\nconst startOverlay = document.getElementById('startOverlay');\nconst gameOverOverlay = document.getElementById('gameOverOverlay');\nconst gameOverText = document.getElementById('gameOverText');\nconst startButton = document.getElementById('startButton');\nconst restartButton = document.getElementById('restartButton');\nconst howButton = document.getElementById('howButton');\nconst muteButton = document.getElementById('muteButton');\nconst touchButtons = [...document.querySelectorAll('[data-move]')];\n\nconst laneWidth = 2;\nconst laneDepth = 2;\nconst worldHalfWidth = 5;\nconst visibleBack = 4;\nconst visibleAhead = 16;\nconst laneCount = visibleBack + visibleAhead + 14;\n\nlet score = 0;\nlet best = Number(localStorage.getItem('crossy-voxel-best') || 0);\nlet gameState = 'ready';\nlet muted = false;\nlet moveQueue = [];\nlet lanes = [];\nlet animationId = null;\n\nbestValue.textContent = String(best);\n\nclass AudioEngine {\n\tconstructor() {\n\t\tthis.ctx = null;\n\t\tthis.master = null;\n\t\tthis.enabled = true;\n\t}\n\n\tinit() {\n\t\tif (this.ctx) return;\n\t\tconst AudioContext = window.AudioContext || window.webkitAudioContext;\n\t\tif (!AudioContext) {\n\t\t\tthis.enabled = false;\n\t\t\treturn;\n\t\t}\n\t\tthis.ctx = new AudioContext();\n\t\tthis.master = this.ctx.createGain();\n\t\tthis.master.gain.value = 0.18;\n\t\tthis.master.connect(this.ctx.destination);\n\t}\n\n\tresume() {\n\t\tthis.init();\n\t\tif (this.ctx && this.ctx.state === 'suspended') this.ctx.resume();\n\t}\n\n\tsetMuted(value) {\n\t\tthis.enabled = !value;\n\t\tif (this.master) this.master.gain.value = value ? 0 : 0.18;\n\t}\n\n\tbeep({\n\t\tfrequency = 440,\n\t\tduration = 0.12,\n\t\ttype = 'square',\n\t\tvolume = 0.15,\n\t\tslide = 0,\n\t\twhen = 0\n\t}) {\n\t\tif (!this.ctx || !this.enabled) return;\n\t\tconst now = this.ctx.currentTime + when;\n\t\tconst osc = this.ctx.createOscillator();\n\t\tconst gain = this.ctx.createGain();\n\t\tosc.type = type;\n\t\tosc.frequency.setValueAtTime(frequency, now);\n\t\tif (slide) osc.frequency.linearRampToValueAtTime(frequency + slide, now + duration);\n\t\tgain.gain.setValueAtTime(0.0001, now);\n\t\tgain.gain.exponentialRampToValueAtTime(volume, now + 0.01);\n\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + duration);\n\t\tosc.connect(gain);\n\t\tgain.connect(this.master);\n\t\tosc.start(now);\n\t\tosc.stop(now + duration + 0.03);\n\t}\n\n\thop() {\n\t\tthis.beep({\n\t\t\tfrequency: 420,\n\t\t\tslide: 120,\n\t\t\tduration: 0.08,\n\t\t\ttype: 'square',\n\t\t\tvolume: 0.12\n\t\t});\n\t}\n\n\tscore() {\n\t\tthis.beep({\n\t\t\tfrequency: 540,\n\t\t\tduration: 0.08,\n\t\t\ttype: 'triangle',\n\t\t\tvolume: 0.1,\n\t\t\twhen: 0\n\t\t});\n\t\tthis.beep({\n\t\t\tfrequency: 760,\n\t\t\tduration: 0.12,\n\t\t\ttype: 'triangle',\n\t\t\tvolume: 0.1,\n\t\t\twhen: 0.06\n\t\t});\n\t}\n\n\thit() {\n\t\tthis.beep({\n\t\t\tfrequency: 180,\n\t\t\tslide: -90,\n\t\t\tduration: 0.28,\n\t\t\ttype: 'sawtooth',\n\t\t\tvolume: 0.14\n\t\t});\n\t}\n\n\tsplash() {\n\t\tthis.beep({\n\t\t\tfrequency: 260,\n\t\t\tslide: -160,\n\t\t\tduration: 0.18,\n\t\t\ttype: 'triangle',\n\t\t\tvolume: 0.13\n\t\t});\n\t\tthis.beep({\n\t\t\tfrequency: 180,\n\t\t\tslide: -100,\n\t\t\tduration: 0.24,\n\t\t\ttype: 'square',\n\t\t\tvolume: 0.1,\n\t\t\twhen: 0.03\n\t\t});\n\t}\n}\n\nconst audio = new AudioEngine();\n\nconst scene = new THREE.Scene();\nscene.fog = new THREE.Fog(0x15120f, 16, 42);\n\nconst camera = new THREE.PerspectiveCamera(52, 1, 0.1, 100);\ncamera.position.set(0, 12.8, 15.8);\ncamera.lookAt(0, 0, 6.5);\n\nconst renderer = new THREE.WebGLRenderer({\n\tantialias: true,\n\talpha: true\n});\nrenderer.setPixelRatio(Math.min(window.devicePixelRatio, 1.5));\nrenderer.shadowMap.enabled = true;\nrenderer.shadowMap.type = THREE.PCFSoftShadowMap;\nrenderer.outputColorSpace = THREE.SRGBColorSpace;\nrenderer.toneMapping = THREE.ACESFilmicToneMapping;\nrenderer.toneMappingExposure = 1.08;\ngameRoot.appendChild(renderer.domElement);\n\nconst ambientLight = new THREE.HemisphereLight(0xfff4dc, 0x4b3424, 1.45);\nscene.add(ambientLight);\n\nconst sunLight = new THREE.DirectionalLight(0xffd39a, 1.75);\nsunLight.position.set(12, 20, 10);\nsunLight.castShadow = true;\nsunLight.shadow.mapSize.width = 1024;\nsunLight.shadow.mapSize.height = 1024;\nsunLight.shadow.camera.left = -18;\nsunLight.shadow.camera.right = 18;\nsunLight.shadow.camera.top = 18;\nsunLight.shadow.camera.bottom = -18;\nscene.add(sunLight);\n\nconst fillLight = new THREE.DirectionalLight(0xb8d4ff, 0.35);\nfillLight.position.set(-10, 8, 12);\nscene.add(fillLight);\n\nconst rimLight = new THREE.DirectionalLight(0xffb36b, 0.28);\nrimLight.position.set(4, 6, -10);\nscene.add(rimLight);\n\nconst world = new THREE.Group();\nscene.add(world);\n\nconst materials = {\n\tgrass: new THREE.MeshToonMaterial({\n\t\tcolor: 0x6f9f45\n\t}),\n\tgrassAlt: new THREE.MeshToonMaterial({\n\t\tcolor: 0x83b65a\n\t}),\n\tgrassEdge: new THREE.MeshToonMaterial({\n\t\tcolor: 0x4f7332\n\t}),\n\troad: new THREE.MeshToonMaterial({\n\t\tcolor: 0x2f2a2c\n\t}),\n\tshoulder: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x4a4447\n\t}),\n\twater: new THREE.MeshToonMaterial({\n\t\tcolor: 0x2b7c78\n\t}),\n\twaterEdge: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x245d58\n\t}),\n\tlaneStripe: new THREE.MeshLambertMaterial({\n\t\tcolor: 0xf3d18f\n\t}),\n\tcurb: new THREE.MeshLambertMaterial({\n\t\tcolor: 0xb8aea3\n\t}),\n\tlog: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x8b5a34\n\t}),\n\tlogRing: new THREE.MeshLambertMaterial({\n\t\tcolor: 0xb27a4f\n\t}),\n\tturtle: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x5f9a62\n\t}),\n\tturtleShell: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x314a31\n\t}),\n\tcarA: new THREE.MeshToonMaterial({\n\t\tcolor: 0xf06a2b\n\t}),\n\tcarB: new THREE.MeshToonMaterial({\n\t\tcolor: 0xf6c453\n\t}),\n\tcarC: new THREE.MeshLambertMaterial({\n\t\tcolor: 0xcf4d1f\n\t}),\n\ttruck: new THREE.MeshToonMaterial({\n\t\tcolor: 0xcab59c\n\t}),\n\twindow: new THREE.MeshToonMaterial({\n\t\tcolor: 0xd7e7f3\n\t}),\n\tbumper: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x221c1d\n\t}),\n\twheel: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x181414\n\t}),\n\tplayer: new THREE.MeshToonMaterial({\n\t\tcolor: 0xf5eedf\n\t}),\n\tplayerWing: new THREE.MeshToonMaterial({\n\t\tcolor: 0xf4d26a\n\t}),\n\tplayerBeak: new THREE.MeshToonMaterial({\n\t\tcolor: 0xee8d31\n\t}),\n\tplayerDark: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x433329\n\t}),\n\teye: new THREE.MeshLambertMaterial({\n\t\tcolor: 0x211714\n\t})\n};\n\nfunction makeBox(w, h, d, material) {\n\tconst mesh = new THREE.Mesh(new THREE.BoxGeometry(w, h, d), material);\n\tmesh.castShadow = true;\n\tmesh.receiveShadow = true;\n\treturn mesh;\n}\n\nfunction addGrassTuft(parent, x, z) {\n\tconst tuft = makeBox(0.24, 0.08, 0.24, Math.random() > 0.5 ? materials.grassAlt : materials.grass);\n\ttuft.position.set(x, 0.02, z);\n\ttuft.castShadow = false;\n\tparent.add(tuft);\n}\n\nfunction createPlayer() {\n\tconst group = new THREE.Group();\n\n\tconst feet = makeBox(0.46, 0.1, 0.34, materials.playerBeak);\n\tfeet.position.set(0, 0.05, 0.1);\n\n\tconst body = makeBox(0.9, 0.62, 0.96, materials.player);\n\tbody.position.y = 0.46;\n\n\tconst chest = makeBox(0.56, 0.26, 0.48, materials.playerWing);\n\tchest.position.set(0, 0.45, 0.34);\n\n\tconst wingLeft = makeBox(0.18, 0.34, 0.56, materials.playerWing);\n\tconst wingRight = wingLeft.clone();\n\twingLeft.position.set(-0.5, 0.48, 0.04);\n\twingRight.position.set(0.5, 0.48, 0.04);\n\n\tconst tail = makeBox(0.34, 0.22, 0.24, materials.player);\n\ttail.position.set(0, 0.45, -0.54);\n\n\tconst head = makeBox(0.66, 0.58, 0.66, materials.player);\n\thead.position.set(0, 0.95, 0.06);\n\n\tconst beak = makeBox(0.34, 0.14, 0.32, materials.playerBeak);\n\tbeak.position.set(0, 0.88, 0.48);\n\n\tconst comb = makeBox(0.16, 0.12, 0.16, materials.playerWing);\n\tcomb.position.set(0, 1.32, 0.03);\n\n\tconst eyeLeft = makeBox(0.08, 0.08, 0.08, materials.eye);\n\tconst eyeRight = eyeLeft.clone();\n\teyeLeft.position.set(-0.16, 0.98, 0.36);\n\teyeRight.position.set(0.16, 0.98, 0.36);\n\n\tgroup.add(feet, body, chest, wingLeft, wingRight, tail, head, beak, comb, eyeLeft, eyeRight);\n\treturn group;\n}\n\nfunction createTree(offsetX, z) {\n\tconst tree = new THREE.Group();\n\tconst trunk = makeBox(0.28, 0.82, 0.28, materials.log);\n\ttrunk.position.y = 0.41;\n\tconst leavesBase = makeBox(0.92, 0.52, 0.92, materials.grassEdge);\n\tleavesBase.position.y = 0.96;\n\tconst leavesTop = makeBox(0.66, 0.46, 0.66, materials.grassAlt);\n\tleavesTop.position.y = 1.38;\n\ttree.add(trunk, leavesBase, leavesTop);\n\ttree.position.set(offsetX, 0, z);\n\tworld.add(tree);\n}\n\nfor (let i = 0; i < 18; i += 1) {\n\tconst x = (Math.random() > 0.5 ? -1 : 1) * (worldHalfWidth + 1.5 + Math.random() * 3.5);\n\tconst z = -4 + i * 1.6;\n\tcreateTree(x, z);\n}\n\nconst player = {\n\tgroup: createPlayer(),\n\tlane: 0,\n\txIndex: 0,\n\tworldX: 0,\n\tworldZ: 0,\n\ttargetX: 0,\n\ttargetZ: 0,\n\tmoving: false,\n\tmoveTime: 0,\n\trideVelocity: 0\n};\nworld.add(player.group);\nplayer.group.traverse((child) => {\n\tif (child.isMesh) {\n\t\tchild.castShadow = true;\n\t\tchild.receiveShadow = true;\n\t}\n});\n\nfunction laneToWorldZ(index) {\n\treturn index * laneDepth;\n}\n\nfunction xIndexToWorldX(index) {\n\treturn index * laneWidth;\n}\n\nfunction randomFrom(list) {\n\treturn list[Math.floor(Math.random() * list.length)];\n}\n\nfunction createGroundLane(index, type) {\n\tconst lane = new THREE.Group();\n\tlane.userData.type = type;\n\tlane.userData.index = index;\n\tlane.position.z = laneToWorldZ(index);\n\n\tconst width = (worldHalfWidth * 2 + 3) * laneWidth;\n\tconst baseMaterial = type === 'road' ? materials.road : type === 'water' ? materials.water : materials.grass;\n\tconst edgeMaterial = type === 'road' ? materials.shoulder : type === 'water' ? materials.waterEdge : materials.grassEdge;\n\n\tconst base = makeBox(width, 0.35, laneDepth, baseMaterial);\n\tbase.receiveShadow = true;\n\tbase.castShadow = false;\n\tbase.position.y = -0.18;\n\tlane.add(base);\n\n\tconst edgeA = makeBox(width, 0.16, 0.12, edgeMaterial);\n\tconst edgeB = edgeA.clone();\n\tedgeA.position.set(0, 0.03, -laneDepth * 0.5 + 0.06);\n\tedgeB.position.set(0, 0.03, laneDepth * 0.5 - 0.06);\n\tlane.add(edgeA, edgeB);\n\n\tif (type === 'grass') {\n\t\tfor (let i = 0; i < 14; i += 1) {\n\t\t\taddGrassTuft(lane, (Math.random() - 0.5) * (width - 1.4), (Math.random() - 0.5) * 1.3);\n\t\t}\n\t}\n\n\tif (type === 'road') {\n\t\tfor (let x = -worldHalfWidth - 1; x <= worldHalfWidth + 1; x += 2) {\n\t\t\tconst stripe = makeBox(0.9, 0.04, 0.18, materials.laneStripe);\n\t\t\tstripe.position.set(x * laneWidth * 0.5, 0.03, 0);\n\t\t\tstripe.castShadow = false;\n\t\t\tlane.add(stripe);\n\t\t}\n\t\tconst curbLeft = makeBox(0.26, 0.08, laneDepth, materials.curb);\n\t\tconst curbRight = curbLeft.clone();\n\t\tcurbLeft.position.set(-width * 0.5 + 0.13, 0.05, 0);\n\t\tcurbRight.position.set(width * 0.5 - 0.13, 0.05, 0);\n\t\tlane.add(curbLeft, curbRight);\n\t}\n\n\tif (type === 'water') {\n\t\tfor (let x = -worldHalfWidth; x <= worldHalfWidth; x += 1) {\n\t\t\tconst ripple = makeBox(0.72, 0.03, 0.14, materials.waterEdge);\n\t\t\tripple.position.set(x * laneWidth, 0.02, Math.random() * 0.8 - 0.4);\n\t\t\tripple.castShadow = false;\n\t\t\tlane.add(ripple);\n\t\t}\n\t}\n\n\treturn lane;\n}\n\nfunction createVehicle(length, color) {\n\tconst group = new THREE.Group();\n\tconst body = makeBox(length, 0.54, 0.98, color);\n\tbody.position.y = 0.38;\n\tconst cabin = makeBox(length * 0.58, 0.36, 0.68, materials.window);\n\tcabin.position.set(0, 0.8, -0.02);\n\tconst hood = makeBox(length * 0.32, 0.16, 0.86, color);\n\thood.position.set(length * 0.14, 0.62, 0);\n\tconst bumperFront = makeBox(0.08, 0.16, 0.9, materials.bumper);\n\tconst bumperBack = bumperFront.clone();\n\tbumperFront.position.set(length * 0.5 + 0.01, 0.28, 0);\n\tbumperBack.position.set(-length * 0.5 - 0.01, 0.28, 0);\n\tconst wheelOffsets = [-length * 0.34, length * 0.34];\n\twheelOffsets.forEach((offset) => {\n\t\tconst left = makeBox(0.24, 0.24, 0.22, materials.wheel);\n\t\tconst right = left.clone();\n\t\tleft.position.set(offset, 0.12, 0.4);\n\t\tright.position.set(offset, 0.12, -0.4);\n\t\tgroup.add(left, right);\n\t});\n\tgroup.add(body, cabin, hood, bumperFront, bumperBack);\n\treturn group;\n}\n\nfunction createLog(length, turtle = false) {\n\tconst group = new THREE.Group();\n\tconst material = turtle ? materials.turtle : materials.log;\n\tconst piece = makeBox(length, 0.34, 0.9, material);\n\tpiece.position.y = 0.2;\n\tgroup.add(piece);\n\n\tif (turtle) {\n\t\tconst shell = makeBox(length * 0.42, 0.18, 0.58, materials.turtleShell);\n\t\tshell.position.set(0, 0.44, 0);\n\t\tconst head = makeBox(0.18, 0.12, 0.18, materials.turtle);\n\t\thead.position.set(length * 0.3, 0.33, 0);\n\t\tgroup.add(shell, head);\n\t} else {\n\t\tconst ringA = makeBox(0.08, 0.24, 0.82, materials.logRing);\n\t\tconst ringB = ringA.clone();\n\t\tringA.position.set(-length * 0.5 + 0.08, 0.24, 0);\n\t\tringB.position.set(length * 0.5 - 0.08, 0.24, 0);\n\t\tgroup.add(ringA, ringB);\n\t}\n\n\treturn group;\n}\n\nfunction laneTypeForIndex(index) {\n\tif (index <= 1) return 'grass';\n\tconst roll = Math.random();\n\tif (roll < 0.36) return 'road';\n\tif (roll < 0.58) return 'water';\n\treturn 'grass';\n}\n\nfunction populateLane(lane) {\n\tlane.userData.obstacles = [];\n\tlane.userData.speed = 0;\n\tlane.userData.direction = 1;\n\tlane.userData.safeSpots = [];\n\n\tconst {\n\t\ttype,\n\t\tindex\n\t} = lane.userData;\n\n\tif (type === 'grass') {\n\t\tlane.userData.safeSpots = [];\n\t\tif (index > 2 && Math.random() > 0.34) {\n\t\t\tconst blockedSpots = new Set();\n\t\t\tconst count = Math.floor(Math.random() * 3) + 1;\n\t\t\twhile (blockedSpots.size < count) {\n\t\t\t\tblockedSpots.add(Math.floor(Math.random() * (worldHalfWidth * 2 + 1)) - worldHalfWidth);\n\t\t\t}\n\t\t\tblockedSpots.forEach((spot) => {\n\t\t\t\tconst tree = new THREE.Group();\n\t\t\t\tconst trunk = makeBox(0.28, 0.82, 0.28, materials.log);\n\t\t\t\ttrunk.position.y = 0.41;\n\t\t\t\tconst leavesBase = makeBox(0.92, 0.52, 0.92, materials.grassEdge);\n\t\t\t\tleavesBase.position.y = 0.96;\n\t\t\t\tconst leavesTop = makeBox(0.66, 0.46, 0.66, materials.grassAlt);\n\t\t\t\tleavesTop.position.y = 1.38;\n\t\t\t\ttree.add(trunk, leavesBase, leavesTop);\n\t\t\t\ttree.position.set(xIndexToWorldX(spot), 0, 0);\n\t\t\t\tlane.add(tree);\n\t\t\t\tlane.userData.safeSpots.push(spot);\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\n\tlane.userData.safeSpots = [];\n\tlane.userData.direction = Math.random() > 0.5 ? 1 : -1;\n\tlane.userData.speed = type === 'road' ? 2.2 + Math.random() * 3 : 1.2 + Math.random() * 1.55;\n\tconst minGap = type === 'road' ? 1.8 : 2.4;\n\tconst baseSpacing = type === 'road' ? 6.4 + Math.random() * 1.6 : 6.8 + Math.random() * 1.8;\n\tconst count = 4;\n\n\tfor (let i = 0; i < count; i += 1) {\n\t\tconst isTruck = type === 'road' && Math.random() > 0.7;\n\t\tconst length = type === 'road' ? (isTruck ? 2.35 : 1.5 + Math.random() * 0.42) : 2.05 + Math.random() * 1.45;\n\t\tconst mesh = type === 'road' ?\n\t\t\tcreateVehicle(length, randomFrom([materials.carA, materials.carB, materials.carC, materials.truck])) :\n\t\t\tcreateLog(length, Math.random() > 0.74);\n\n\t\tconst previous = lane.userData.obstacles[i - 1];\n\t\tconst startOffset = i * baseSpacing + Math.random() * 0.8;\n\t\tconst x = previous ?\n\t\t\tprevious.x + lane.userData.direction * ((previous.length * 0.5) + (length * 0.5) + minGap) :\n\t\t\tstartOffset * lane.userData.direction;\n\n\t\tconst obstacle = {\n\t\t\tmesh,\n\t\t\tlength,\n\t\t\tx,\n\t\t\tspeed: lane.userData.speed * lane.userData.direction,\n\t\t\ttype,\n\t\t\tsinkOffset: Math.random() * Math.PI * 2\n\t\t};\n\n\t\tmesh.position.set(obstacle.x, 0, 0);\n\t\tlane.add(mesh);\n\t\tlane.userData.obstacles.push(obstacle);\n\t}\n}\n\nfunction buildWorld() {\n\tlanes.forEach((lane) => world.remove(lane));\n\tlanes = [];\n\tfor (let i = -visibleBack; i < laneCount; i += 1) {\n\t\tconst type = laneTypeForIndex(i);\n\t\tconst lane = createGroundLane(i, type);\n\t\tpopulateLane(lane);\n\t\tlanes.push(lane);\n\t\tworld.add(lane);\n\t}\n}\n\nfunction getLane(index) {\n\treturn lanes.find((lane) => lane.userData.index === index);\n}\n\nfunction canOccupy(laneIndex, xIndex) {\n\tif (xIndex < -worldHalfWidth || xIndex > worldHalfWidth) return false;\n\tconst lane = getLane(laneIndex);\n\tif (!lane) return false;\n\tif (lane.userData.type !== 'grass') return true;\n\treturn !lane.userData.safeSpots.includes(xIndex);\n}\n\nfunction resetPlayer() {\n\tplayer.lane = 0;\n\tplayer.xIndex = 0;\n\tplayer.worldX = 0;\n\tplayer.worldZ = 0;\n\tplayer.targetX = 0;\n\tplayer.targetZ = 0;\n\tplayer.group.position.set(0, 0, 0);\n\tplayer.group.rotation.set(0, 0, 0);\n\tplayer.moving = false;\n\tplayer.moveTime = 0;\n\tplayer.rideVelocity = 0;\n}\n\nfunction updateScore(next) {\n\tscore = next;\n\tscoreValue.textContent = String(score);\n\tif (score > best) {\n\t\tbest = score;\n\t\tbestValue.textContent = String(best);\n\t\tlocalStorage.setItem('crossy-voxel-best', String(best));\n\t}\n}\n\nfunction setState(next) {\n\tgameState = next;\n\tstateValue.textContent = next.charAt(0).toUpperCase() + next.slice(1);\n}\n\nfunction queueMove(direction) {\n\tif (gameState !== 'playing') return;\n\tif (moveQueue.length > 2) return;\n\tmoveQueue.push(direction);\n}\n\nfunction tryMove(direction) {\n\tif (player.moving) return false;\n\tlet lane = player.lane;\n\tlet xIndex = player.xIndex;\n\tif (direction === 'up') lane += 1;\n\tif (direction === 'down') lane -= 1;\n\tif (direction === 'left') xIndex += 1;\n\tif (direction === 'right') xIndex -= 1;\n\tif (lane < 0 || !canOccupy(lane, xIndex)) return false;\n\n\tplayer.lane = lane;\n\tplayer.xIndex = xIndex;\n\tplayer.targetX = xIndexToWorldX(xIndex);\n\tplayer.targetZ = laneToWorldZ(lane);\n\tplayer.moving = true;\n\tplayer.moveTime = 0;\n\tplayer.group.rotation.y = direction === 'left' ? Math.PI * 0.5 : direction === 'right' ? -Math.PI * 0.5 : direction === 'down' ? Math.PI : 0;\n\taudio.hop();\n\n\tif (lane > score) {\n\t\tupdateScore(lane);\n\t\taudio.score();\n\t}\n\treturn true;\n}\n\nfunction triggerGameOver(reason) {\n\tif (gameState !== 'playing') return;\n\tsetState('down');\n\tgameOverText.textContent = reason === 'water' ? `You drifted ${score} rows before the splash.` : `You hopped ${score} rows before becoming road paint.`;\n\tgameOverOverlay.classList.remove('overlay--hidden');\n\tgameOverOverlay.setAttribute('aria-hidden', 'false');\n\tif (reason === 'water') audio.splash();\n\telse audio.hit();\n}\n\nfunction startGame() {\n\taudio.resume();\n\tstartOverlay.classList.add('overlay--hidden');\n\tgameOverOverlay.classList.add('overlay--hidden');\n\tgameOverOverlay.setAttribute('aria-hidden', 'true');\n\tbuildWorld();\n\tresetPlayer();\n\tupdateScore(0);\n\tmoveQueue = [];\n\tsetState('playing');\n}\n\nfunction animatePlayer(delta) {\n\tconst moveDuration = 0.16;\n\tif (player.moving) {\n\t\tplayer.moveTime += delta;\n\t\tconst t = Math.min(player.moveTime / moveDuration, 1);\n\t\tconst eased = 1 - Math.pow(1 - t, 3);\n\t\tplayer.worldX += (player.targetX - player.worldX) * Math.min(1, delta * 18);\n\t\tplayer.worldZ += (player.targetZ - player.worldZ) * Math.min(1, delta * 18);\n\t\tplayer.group.position.x = player.worldX;\n\t\tplayer.group.position.z = player.worldZ;\n\t\tplayer.group.position.y = Math.sin(eased * Math.PI) * 0.55;\n\t\tif (t >= 1) {\n\t\t\tplayer.moving = false;\n\t\t\tplayer.worldX = player.targetX;\n\t\t\tplayer.worldZ = player.targetZ;\n\t\t\tplayer.group.position.set(player.worldX, 0, player.worldZ);\n\t\t}\n\t} else {\n\t\tplayer.group.position.y = Math.sin(performance.now() * 0.008) * 0.04;\n\t\tif (moveQueue.length) tryMove(moveQueue.shift());\n\t}\n}\n\nfunction recycleLanes() {\n\tconst minNeeded = player.lane - visibleBack;\n\tconst maxNeeded = player.lane + visibleAhead;\n\tlanes.forEach((lane) => {\n\t\tif (lane.userData.index < minNeeded) {\n\t\t\tlane.userData.index = maxNeeded + Math.floor(Math.random() * 4) + 1;\n\t\t\tlane.position.z = laneToWorldZ(lane.userData.index);\n\t\t\tlane.userData.type = laneTypeForIndex(lane.userData.index);\n\t\t\twhile (lane.children.length) lane.remove(lane.children[0]);\n\t\t\tlane.userData.obstacles = [];\n\t\t\tlane.userData.safeSpots = [];\n\t\t\tconst rebuilt = createGroundLane(lane.userData.index, lane.userData.type);\n\t\t\tworld.remove(lane);\n\t\t\tlanes = lanes.map((entry) => entry === lane ? rebuilt : entry);\n\t\t\tpopulateLane(rebuilt);\n\t\t\tworld.add(rebuilt);\n\t\t}\n\t});\n}\n\nfunction updateLanes(delta) {\n\tlanes.forEach((lane) => {\n\t\tconst {\n\t\t\ttype,\n\t\t\tobstacles\n\t\t} = lane.userData;\n\t\tif (!obstacles || !obstacles.length) return;\n\t\tobstacles.forEach((obstacle) => {\n\t\t\tobstacle.x += obstacle.speed * delta;\n\t\t\tconst wrap = 15;\n\t\t\tif (obstacle.speed > 0 && obstacle.x > wrap) obstacle.x = -wrap;\n\t\t\tif (obstacle.speed < 0 && obstacle.x < -wrap) obstacle.x = wrap;\n\t\t\tobstacle.mesh.position.x = obstacle.x;\n\t\t\tif (type === 'water') {\n\t\t\t\tobstacle.mesh.position.y = Math.sin(performance.now() * 0.002 + obstacle.sinkOffset) * 0.05;\n\t\t\t}\n\t\t});\n\t});\n}\n\nfunction updateCamera(delta) {\n\tconst targetZ = player.worldZ - 3.8;\n\tcamera.position.z += (targetZ - camera.position.z) * Math.min(1, delta * 3.5);\n\tcamera.position.x += ((player.worldX * 0.2) - camera.position.x) * Math.min(1, delta * 2.8);\n\tcamera.position.y += (12.8 - camera.position.y) * Math.min(1, delta * 2.6);\n\tcamera.lookAt(player.worldX * 0.08, 0.8, player.worldZ + 2.8);\n}\n\nfunction checkCollisions(delta) {\n\tif (gameState !== 'playing') return;\n\tconst lane = getLane(player.lane);\n\tif (!lane) return;\n\n\tplayer.rideVelocity = 0;\n\tif (lane.userData.type === 'road') {\n\t\tfor (const obstacle of lane.userData.obstacles) {\n\t\t\tif (Math.abs(obstacle.x - player.worldX) < obstacle.length * 0.5 + 0.35) {\n\t\t\t\ttriggerGameOver('road');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lane.userData.type === 'water') {\n\t\tlet onLog = null;\n\t\tfor (const obstacle of lane.userData.obstacles) {\n\t\t\tif (Math.abs(obstacle.x - player.worldX) < obstacle.length * 0.5 + 0.15) {\n\t\t\t\tonLog = obstacle;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!onLog && !player.moving) {\n\t\t\ttriggerGameOver('water');\n\t\t\treturn;\n\t\t}\n\n\t\tif (onLog && !player.moving) {\n\t\t\tplayer.rideVelocity = onLog.speed;\n\t\t\tplayer.worldX += onLog.speed * delta;\n\t\t\tplayer.targetX = player.worldX;\n\t\t\tplayer.group.position.x = player.worldX;\n\t\t\tconst clampedIndex = Math.round(player.worldX / laneWidth);\n\t\t\tplayer.xIndex = clampedIndex;\n\t\t\tif (player.worldX < xIndexToWorldX(-worldHalfWidth) - 0.8 || player.worldX > xIndexToWorldX(worldHalfWidth) + 0.8) {\n\t\t\t\ttriggerGameOver('water');\n\t\t\t}\n\t\t}\n\t}\n}\n\nlet previousTime = performance.now();\n\nfunction loop(now) {\n\tconst delta = Math.min((now - previousTime) / 1000, 0.033);\n\tpreviousTime = now;\n\tif (gameState === 'playing') {\n\t\tupdateLanes(delta);\n\t\tanimatePlayer(delta);\n\t\tcheckCollisions(delta);\n\t\trecycleLanes();\n\t} else {\n\t\tplayer.group.position.y = Math.sin(now * 0.006) * 0.05;\n\t}\n\tupdateCamera(delta);\n\trenderer.render(scene, camera);\n\tanimationId = requestAnimationFrame(loop);\n}\n\nfunction resize() {\n\tconst width = gameRoot.clientWidth;\n\tconst height = gameRoot.clientHeight;\n\trenderer.setSize(width, height);\n\tcamera.aspect = width / height;\n\tcamera.updateProjectionMatrix();\n}\n\nwindow.addEventListener('resize', resize);\n\nwindow.addEventListener('keydown', (event) => {\n\tconst key = event.key.toLowerCase();\n\tconst map = {\n\t\tarrowup: 'up',\n\t\tw: 'up',\n\t\tarrowdown: 'down',\n\t\ts: 'down',\n\t\tarrowleft: 'left',\n\t\ta: 'left',\n\t\tarrowright: 'right',\n\t\td: 'right'\n\t};\n\tif (map[key]) {\n\t\tevent.preventDefault();\n\t\tqueueMove(map[key]);\n\t}\n\tif (key === ' ' && gameState !== 'playing') {\n\t\tevent.preventDefault();\n\t\tstartGame();\n\t}\n});\n\nlet touchStart = null;\ngameRoot.addEventListener('pointerdown', (event) => {\n\ttouchStart = {\n\t\tx: event.clientX,\n\t\ty: event.clientY\n\t};\n});\n\ngameRoot.addEventListener('pointerup', (event) => {\n\tif (!touchStart) return;\n\tconst dx = event.clientX - touchStart.x;\n\tconst dy = event.clientY - touchStart.y;\n\tconst absX = Math.abs(dx);\n\tconst absY = Math.abs(dy);\n\tif (Math.max(absX, absY) > 18) {\n\t\tqueueMove(absX > absY ? (dx > 0 ? 'right' : 'left') : (dy > 0 ? 'up' : 'down'));\n\t}\n\ttouchStart = null;\n});\n\ntouchButtons.forEach((button) => {\n\tbutton.addEventListener('click', () => queueMove(button.dataset.move));\n});\n\nstartButton.addEventListener('click', startGame);\nrestartButton.addEventListener('click', startGame);\nhowButton.addEventListener('click', () => {\n\tconst tips = document.querySelector('.overlay__tips');\n\ttips.scrollIntoView({\n\t\tbehavior: 'smooth',\n\t\tblock: 'nearest'\n\t});\n});\n\nmuteButton.addEventListener('click', () => {\n\tmuted = !muted;\n\taudio.setMuted(muted);\n\tmuteButton.setAttribute('aria-pressed', String(muted));\n\tmuteButton.innerHTML = `<i data-lucide=\"${muted ? 'volume-x' : 'volume-2'}\"></i>`;\n\tlucide.createIcons();\n});\n\nbuildWorld();\nresetPlayer();\nresize();\nlucide.createIcons();\nloop(performance.now());"},{"name":"style.css","content":" :root {\n \tcolor-scheme: dark;\n \tfont-family: Inter, system-ui, sans-serif;\n \t--bg: #15120f;\n \t--bg-elevated: rgba(34, 28, 22, 0.88);\n \t--panel: rgba(58, 47, 38, 0.82);\n \t--panel-strong: rgba(75, 61, 50, 0.95);\n \t--line: rgba(255, 236, 204, 0.1);\n \t--text: #fff5e6;\n \t--muted: #d1bfa8;\n \t--accent: #f97316;\n \t--accent-2: #ffd166;\n \t--danger: #ff7b72;\n \t--shadow: 0 18px 40px rgba(0, 0, 0, 0.28);\n }\n\n * {\n \tbox-sizing: border-box;\n }\n\n html,\n body {\n \tmargin: 0;\n \tmin-height: 100%;\n \tbackground:\n \t\tradial-gradient(circle at top, rgba(255, 177, 104, 0.12), transparent 28%),\n \t\tlinear-gradient(180deg, #211b16 0%, #15120f 100%);\n \tcolor: var(--text);\n }\n\n body {\n \tmin-height: 100vh;\n }\n\n button {\n \tfont: inherit;\n }\n\n .game-shell {\n \tmin-height: 100vh;\n \tdisplay: grid;\n \tgrid-template-rows: auto 1fr;\n \tgap: 1rem;\n \tpadding: 1rem;\n }\n\n .hud {\n \tdisplay: grid;\n \tgap: 0.9rem;\n \talign-items: start;\n }\n\n .hud__brand,\n .hud__stats {\n \tdisplay: flex;\n \tjustify-content: space-between;\n \talign-items: center;\n \tgap: 0.8rem;\n \tflex-wrap: wrap;\n }\n\n .hud__title-wrap {\n \tdisplay: grid;\n \tgap: 0.15rem;\n }\n\n .hud__eyebrow {\n \tmargin: 0;\n \ttext-transform: uppercase;\n \tletter-spacing: 0.18em;\n \tfont-size: 0.72rem;\n \tcolor: var(--accent-2);\n }\n\n .hud__title {\n \tmargin: 0;\n \tfont-size: clamp(1.7rem, 3vw, 2.8rem);\n \tline-height: 0.95;\n }\n\n .hud__button,\n .overlay__button,\n .touch-controls__button {\n \tborder: 1px solid var(--line);\n \tbackground: var(--panel);\n \tcolor: var(--text);\n \tborder-radius: 14px;\n \tcursor: pointer;\n \ttransition: transform 160ms ease, background 160ms ease, border-color 160ms ease;\n }\n\n .hud__button:hover,\n .overlay__button:hover,\n .touch-controls__button:hover,\n .hud__button:focus-visible,\n .overlay__button:focus-visible,\n .touch-controls__button:focus-visible {\n \ttransform: translateY(-1px);\n \tbackground: var(--panel-strong);\n \tborder-color: rgba(255, 236, 204, 0.25);\n }\n\n .hud__button {\n \twidth: 3rem;\n \theight: 3rem;\n \tdisplay: grid;\n \tplace-items: center;\n }\n\n .hud__button i,\n .touch-controls__button i,\n .overlay__tips i {\n \twidth: 1.1rem;\n \theight: 1.1rem;\n }\n\n .hud__stats {\n \tjustify-content: flex-start;\n }\n\n .stat-card {\n \tmin-width: 6.8rem;\n \tpadding: 0.8rem 1rem;\n \tdisplay: grid;\n \tgap: 0.3rem;\n \tbackground: var(--bg-elevated);\n \tborder: 1px solid var(--line);\n \tborder-radius: 16px;\n \tbox-shadow: var(--shadow);\n \tbackdrop-filter: blur(10px);\n }\n\n .stat-card__label {\n \tfont-size: 0.72rem;\n \ttext-transform: uppercase;\n \tletter-spacing: 0.14em;\n \tcolor: var(--muted);\n }\n\n .stat-card__value {\n \tfont-size: 1.5rem;\n \tline-height: 1;\n }\n\n .stat-card__value--small {\n \tfont-size: 1rem;\n }\n\n .game-stage {\n \tposition: relative;\n \tmin-height: 66vh;\n \tborder-radius: 28px;\n \toverflow: hidden;\n \tborder: 1px solid var(--line);\n \tbackground:\n \t\tlinear-gradient(180deg, rgba(255, 211, 145, 0.08), transparent 22%),\n \t\t#120f0d;\n \tbox-shadow: var(--shadow);\n }\n\n .game-stage__canvas {\n \tposition: absolute;\n \tinset: 0;\n }\n\n .overlay {\n \tposition: absolute;\n \tinset: 0;\n \tdisplay: grid;\n \tplace-items: center;\n \tpadding: 1rem;\n \tbackground: rgba(12, 10, 8, 0.45);\n \tbackdrop-filter: blur(8px);\n \tz-index: 3;\n }\n\n .overlay--hidden {\n \topacity: 0;\n \tpointer-events: none;\n }\n\n .overlay__panel {\n \twidth: min(100%, 34rem);\n \tpadding: 1.4rem;\n \tborder-radius: 24px;\n \tbackground: rgba(34, 28, 22, 0.9);\n \tborder: 1px solid rgba(255, 236, 204, 0.12);\n \tbox-shadow: var(--shadow);\n }\n\n .overlay__panel--compact {\n \twidth: min(100%, 24rem);\n \ttext-align: center;\n }\n\n .overlay__kicker {\n \tmargin: 0 0 0.45rem;\n \ttext-transform: uppercase;\n \tletter-spacing: 0.16em;\n \tcolor: var(--accent-2);\n \tfont-size: 0.74rem;\n }\n\n .overlay__title {\n \tmargin: 0;\n \tfont-size: clamp(2rem, 5vw, 3.4rem);\n \tline-height: 0.95;\n }\n\n .overlay__text {\n \tmargin: 0.9rem 0 0;\n \tcolor: var(--muted);\n \tmax-width: 32ch;\n }\n\n .overlay__actions {\n \tmargin-top: 1.15rem;\n \tdisplay: flex;\n \tgap: 0.75rem;\n \tflex-wrap: wrap;\n }\n\n .overlay__button {\n \tmin-height: 3rem;\n \tpadding: 0.85rem 1.1rem;\n }\n\n .overlay__button--primary {\n \tbackground: var(--accent);\n \tcolor: #1b1209;\n \tborder-color: transparent;\n \tfont-weight: 700;\n }\n\n .overlay__tips {\n \tlist-style: none;\n \tpadding: 0;\n \tmargin: 1rem 0 0;\n \tdisplay: grid;\n \tgap: 0.7rem;\n }\n\n .overlay__tips li {\n \tdisplay: flex;\n \talign-items: center;\n \tgap: 0.7rem;\n \tcolor: var(--muted);\n }\n\n .touch-controls {\n \tposition: absolute;\n \tright: 1rem;\n \tbottom: 1rem;\n \tdisplay: grid;\n \tgrid-template-columns: repeat(3, 3.4rem);\n \tgrid-template-areas:\n \t\t'. up .'\n \t\t'left down right';\n \tgap: 0.45rem;\n \tz-index: 2;\n }\n\n .touch-controls__button {\n \twidth: 3.4rem;\n \theight: 3.4rem;\n \tdisplay: grid;\n \tplace-items: center;\n \tbackground: rgba(34, 28, 22, 0.72);\n \tbackdrop-filter: blur(6px);\n }\n\n .touch-controls__button--up {\n \tgrid-area: up;\n }\n\n .touch-controls__button--left {\n \tgrid-area: left;\n }\n\n .touch-controls__button--down {\n \tgrid-area: down;\n }\n\n .touch-controls__button--right {\n \tgrid-area: right;\n }\n\n @media (min-width: 860px) {\n \t.game-shell {\n \t\tpadding: 1.2rem;\n \t}\n\n \t.hud {\n \t\tgrid-template-columns: 1fr auto;\n \t\talign-items: end;\n \t}\n }\n\n @media (max-width: 640px) {\n \t.game-shell {\n \t\tpadding: 0.75rem;\n \t}\n\n \t.game-stage {\n \t\tmin-height: 72vh;\n \t\tborder-radius: 22px;\n \t}\n\n \t.touch-controls {\n \t\tleft: 50%;\n \t\tright: auto;\n \t\ttransform: translateX(-50%);\n \t\tbottom: 0.85rem;\n \t}\n\n \t.overlay__panel {\n \t\tpadding: 1.15rem;\n \t}\n }"}],"folders":[]},"variants":null,"createdAt":"2026-03-08T18:29:22.355Z","updatedAt":"2026-03-11T17:20:56.722Z"}}