:root{--colour-bg: #fff5f7;--colour-board: #f8bbd0;--colour-cell-empty: #f48fb1;--colour-text: #4a0e2a;--colour-accent: #e91e63;--colour-button: #ec407a;--colour-button-hover: #e91e63;--colour-button-active: #c2185b;--font-family: "Nunito", system-ui, sans-serif;--board-gap: 8px;--slide-duration: .15s;--merge-duration: .2s;--spawn-duration: .15s;--border-radius: 12px;--border-radius-sm: 8px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px}body{font-family:var(--font-family);background-colour:var(--colour-bg);background:var(--colour-bg);color:var(--colour-text);min-height:100dvh;display:flex;flex-direction:column;align-items:center;justify-content:center}#root{width:100%;max-width:600px;padding:16px;display:flex;flex-direction:column;align-items:center;gap:16px}h1{font-size:2.2rem;font-weight:800;color:var(--colour-accent);letter-spacing:-.5px;text-align:center}h1 .tagline{display:block;font-size:.9rem;font-weight:600;color:var(--colour-text);opacity:.7;margin-top:2px;letter-spacing:0}.board-wrapper{position:relative;width:100%;display:flex;justify-content:center}.board-container{position:relative;border-radius:var(--border-radius);background:var(--colour-board);padding:var(--board-gap);width:100%;aspect-ratio:1;-webkit-user-select:none;user-select:none}.board-background{display:grid;gap:var(--board-gap);width:100%;height:100%}.board-cell-empty{border-radius:var(--border-radius-sm);background:var(--colour-cell-empty);opacity:.4}.board-tiles{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.tile{position:absolute;transition:transform var(--slide-duration) ease;will-change:transform}.tile-inner{width:100%;height:100%;border-radius:var(--border-radius-sm);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;overflow:hidden;box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73}.tile-new .tile-inner{animation:tile-spawn var(--spawn-duration) cubic-bezier(.34,1.56,.64,1) forwards}.tile-merged .tile-inner{animation:tile-merge var(--merge-duration) cubic-bezier(.34,1.56,.64,1) forwards}.tile-number{font-weight:800;line-height:1;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.15)}@keyframes tile-spawn{0%{transform:scale(0);opacity:0}60%{transform:scale(1.15);opacity:1}to{transform:scale(1);opacity:1}}.tile-prestige .tile-inner{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 12px 2px #b39ddb8c;animation:tile-prestige-pulse 2.8s ease-in-out infinite}.tile-epic .tile-inner{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 18px 4px #ffb74da6;animation:tile-epic-pulse 2.2s ease-in-out infinite}.tile-legendary .tile-inner{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 24px 6px #f48fb1bf,0 0 48px 10px #f48fb14d;animation:tile-legendary-pulse 1.8s ease-in-out infinite}.tile-mythic .tile-inner{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 30px 8px #69f0aebf,0 0 60px 14px #69f0ae4d;animation:tile-mythic-pulse 2.4s ease-in-out infinite}.tile-new.tile-prestige .tile-inner,.tile-new.tile-epic .tile-inner,.tile-new.tile-legendary .tile-inner,.tile-new.tile-mythic .tile-inner{animation:tile-spawn var(--spawn-duration) cubic-bezier(.34,1.56,.64,1) forwards}.tile-merged.tile-prestige .tile-inner,.tile-merged.tile-epic .tile-inner,.tile-merged.tile-legendary .tile-inner,.tile-merged.tile-mythic .tile-inner{animation:tile-merge var(--merge-duration) cubic-bezier(.34,1.56,.64,1) forwards}.tile-prestige.tile-merged:before,.tile-epic.tile-merged:before,.tile-legendary.tile-merged:before,.tile-mythic.tile-merged:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:var(--border-radius-sm);pointer-events:none;animation:merge-ring var(--merge-duration) ease-out forwards}.tile-prestige.tile-merged:before{border:3px solid rgba(179,157,219,.9)}.tile-epic.tile-merged:before{border:3px solid rgba(255,183,77,.9)}.tile-legendary.tile-merged:before{border:3px solid rgba(244,143,177,.9)}.tile-mythic.tile-merged:before{border:3px solid rgba(255,255,255,.95)}@keyframes tile-prestige-pulse{0%,to{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 10px 2px #b39ddb73}50%{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 18px 5px #b39ddbbf}}@keyframes tile-epic-pulse{0%,to{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 14px 3px #ffb74d80}50%{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 26px 7px #ffb74dcc}}@keyframes tile-legendary-pulse{0%,to{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 20px 5px #f48fb199,0 0 40px 8px #f48fb140}50%{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 30px 8px #f48fb1d9,0 0 60px 14px #f48fb166}}@keyframes tile-mythic-pulse{0%{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 28px 7px #69f0aea6,0 0 55px 12px #69f0ae40}33%{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 32px 9px #ea80fcbf,0 0 62px 15px #ea80fc4d}66%{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 32px 9px #80deeabf,0 0 62px 15px #80deea4d}to{box-shadow:0 3px 10px #4a0e2a38,0 1px 3px #4a0e2a1f,inset 0 1px #ffffff73,0 0 28px 7px #69f0aea6,0 0 55px 12px #69f0ae40}}@keyframes merge-ring{0%{transform:scale(1);opacity:1}to{transform:scale(1.7);opacity:0}}@keyframes tile-merge{0%{transform:scale(1);filter:brightness(1)}45%{transform:scale(1.28);filter:brightness(1.12)}to{transform:scale(1);filter:brightness(1)}}.tile-art{--mx: 50;--my: 50;--rx: 0;--ry: 0;position:relative;width:100%;height:100%;border-radius:inherit;overflow:hidden;isolation:isolate;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;transition:transform .4s cubic-bezier(.2,.8,.2,1);pointer-events:auto}.tile-inner:has(>.tile-art){perspective:900px}.tile-art.is-hovering,.tile-art.is-fading{will-change:transform;transform:rotateX(calc(var(--ry) * 1deg)) rotateY(calc(var(--rx) * 1deg))}.tile-art.is-hovering{transition:transform .08s linear}.tile-art>svg,.tile-art>.tile-number{position:relative;z-index:2}.tile-art>.tile-number{text-shadow:0 1px 6px rgba(0,0,0,.55)}.tile-holo{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;pointer-events:none;border-radius:inherit;opacity:0;transition:opacity .25s ease}.tile-art.is-hovering .tile-holo{opacity:1}.tile-bg-nebula{background:radial-gradient(ellipse 120% 120% at 50% 50%,#2a0a3d,#0a0418 80%)}.tile-bg-nebula:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none;background-image:radial-gradient(1.5px 1.5px at 12% 12%,#fff,transparent),radial-gradient(1px 1px at 38% 24%,#fff,transparent),radial-gradient(1.2px 1.2px at 56% 42%,#fff,transparent),radial-gradient(1px 1px at 20% 78%,#fff,transparent),radial-gradient(1.8px 1.8px at 88% 30%,#fff,transparent),radial-gradient(1px 1px at 94% 85%,#fff,transparent),radial-gradient(1.4px 1.4px at 70% 95%,#fff,transparent),radial-gradient(1px 1px at 14% 50%,#fff,transparent),radial-gradient(1.2px 1.2px at 44% 96%,#fff,transparent),radial-gradient(1px 1px at 78% 62%,#fff,transparent),radial-gradient(1px 1px at 64% 16%,#fff,transparent),radial-gradient(1.3px 1.3px at 26% 36%,#fff,transparent),radial-gradient(1px 1px at 98% 54%,#fff,transparent);animation:tile-nebula-twinkle 3.5s ease-in-out infinite alternate}.tile-bg-nebula:after{content:"";position:absolute;top:-25%;right:-25%;bottom:-25%;left:-25%;z-index:0;pointer-events:none;background:radial-gradient(ellipse 55% 45% at 25% 30%,rgba(224,64,251,.55),transparent 70%),radial-gradient(ellipse 50% 55% at 75% 70%,rgba(33,150,243,.55),transparent 70%),radial-gradient(ellipse 40% 35% at 70% 25%,rgba(255,64,129,.45),transparent 65%),radial-gradient(ellipse 45% 40% at 20% 80%,rgba(156,39,176,.35),transparent 70%);animation:tile-nebula-drift 30s ease-in-out infinite alternate}.tile-bg-nebula .star-layer{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none}.tile-bg-nebula .star-layer-b{background-image:radial-gradient(1.6px 1.6px at 28% 10%,#fff,transparent),radial-gradient(1.2px 1.2px at 52% 38%,#fff,transparent),radial-gradient(1.8px 1.8px at 70% 72%,#fff,transparent),radial-gradient(1.3px 1.3px at 18% 66%,#fff,transparent),radial-gradient(1.5px 1.5px at 86% 20%,#fff,transparent),radial-gradient(1.7px 1.7px at 40% 92%,#fff,transparent),radial-gradient(1.1px 1.1px at 100% 44%,#fff,transparent),radial-gradient(1.4px 1.4px at 14% 30%,#fff,transparent),radial-gradient(1.2px 1.2px at 78% 86%,#fff,transparent),radial-gradient(1.6px 1.6px at 58% 20%,#fff,transparent);animation:tile-nebula-shimmer-b 5.5s ease-in-out infinite}.tile-bg-nebula .star-layer-c{background-image:radial-gradient(1.3px 1.3px at 32% 70%,#fff,transparent),radial-gradient(1.7px 1.7px at 64% 30%,#fff,transparent),radial-gradient(1.1px 1.1px at 92% 80%,#fff,transparent),radial-gradient(1.5px 1.5px at 22% 48%,#fff,transparent),radial-gradient(1.9px 1.9px at 80% 58%,#fff,transparent),radial-gradient(1.2px 1.2px at 46% 86%,#fff,transparent),radial-gradient(1.4px 1.4px at 10% 100%,#fff,transparent),radial-gradient(1.6px 1.6px at 100% 14%,#fff,transparent),radial-gradient(1.1px 1.1px at 72% 10%,#fff,transparent);animation:tile-nebula-shimmer-c 4.2s ease-in-out infinite -1.8s}.tile-bg-nebula .tile-holo{background-image:radial-gradient(2.4px 2.4px at 30% 20%,#fff,transparent),radial-gradient(2px 2px at 65% 35%,#fff,transparent),radial-gradient(2.8px 2.8px at 80% 60%,#fff,transparent),radial-gradient(2px 2px at 20% 55%,#fff,transparent),radial-gradient(2.5px 2.5px at 45% 80%,#fff,transparent),radial-gradient(2px 2px at 70% 85%,#fff,transparent),radial-gradient(2.6px 2.6px at 15% 85%,#fff,transparent),radial-gradient(2.2px 2.2px at 85% 15%,#fff,transparent),radial-gradient(2px 2px at 50% 50%,#fff,transparent),radial-gradient(2.4px 2.4px at 35% 40%,#fff,transparent),radial-gradient(2px 2px at 75% 75%,#fff,transparent),radial-gradient(2.6px 2.6px at 25% 70%,#fff,transparent),radial-gradient(2.2px 2.2px at 60% 20%,#fff,transparent),radial-gradient(2px 2px at 90% 45%,#fff,transparent),radial-gradient(2.4px 2.4px at 10% 35%,#fff,transparent);-webkit-mask:radial-gradient(ellipse 28% 28% at calc(var(--mx) * 1%) calc(var(--my) * 1%),black 25%,transparent 75%);mask:radial-gradient(ellipse 28% 28% at calc(var(--mx) * 1%) calc(var(--my) * 1%),black 25%,transparent 75%)}@keyframes tile-nebula-twinkle{0%{opacity:.55}50%{opacity:.95}to{opacity:.7}}@keyframes tile-nebula-drift{0%{transform:rotate(0) scale(1.05) translate(0)}50%{transform:rotate(8deg) scale(1.12) translate(-2%,1%)}to{transform:rotate(-6deg) scale(1.08) translate(2%,-2%)}}@keyframes tile-nebula-shimmer-b{0%,to{opacity:0}45%{opacity:.95}60%{opacity:.7}}@keyframes tile-nebula-shimmer-c{0%,to{opacity:.85}35%{opacity:0}70%{opacity:0}}.tile-bg-holo-pastel{background:conic-gradient(from 45deg at 50% 50%,#ffd1dc,#ffe0b3,#fff8b3,#d6f5d6,#c8e8ff,#d4c5f9,#ffd1dc)}.tile-bg-holo-pastel:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none;background:radial-gradient(circle at 30% 25%,rgba(255,255,255,.55),transparent 45%),radial-gradient(circle at 70% 75%,rgba(255,255,255,.3),transparent 50%);mix-blend-mode:screen}.tile-bg-holo-pastel:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none;background:radial-gradient(ellipse 100% 100% at 50% 50%,transparent 60%,rgba(120,90,160,.25) 100%)}.tile-bg-holo-pastel .tile-holo{background:repeating-linear-gradient(125deg,#e91e63,#ff9800,#ffeb3b,#4caf50,#00bcd4,#3f51b5,#9c27b0,#e91e63 56%);background-size:320% 320%;background-position:calc(var(--mx) * 1%) calc(var(--my) * 1%);mix-blend-mode:overlay}@media (prefers-reduced-motion: reduce){.tile-bg-nebula:before,.tile-bg-nebula:after,.tile-bg-nebula .star-layer-b,.tile-bg-nebula .star-layer-c{animation:none}}.btn{font-family:var(--font-family);font-weight:700;font-size:.9rem;padding:8px 16px;border:none;border-radius:var(--border-radius-sm);cursor:pointer;background:var(--colour-button);color:#fff;transition:background .12s ease,transform 80ms ease,opacity .12s ease;white-space:nowrap}.btn:hover:not(:disabled){background:var(--colour-button-hover)}.btn:active:not(:disabled){background:var(--colour-button-active);transform:scale(.97)}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-secondary{background:transparent;color:var(--colour-button);border:2px solid var(--colour-button)}.btn-secondary:hover:not(:disabled){background:var(--colour-button);color:#fff}.score-board{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;width:100%}.score-card{background:var(--colour-board);border-radius:var(--border-radius-sm);padding:8px 12px;min-width:80px;text-align:center;flex:1 1 70px}.score-card-label{font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;opacity:.7;margin-bottom:2px}.score-card-value{font-size:1.2rem;font-weight:800;color:var(--colour-accent)}.game-controls{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;align-items:center;width:100%}.grid-stepper{display:flex;align-items:center;gap:6px}.grid-stepper-label{font-size:.85rem;font-weight:700;min-width:70px;text-align:center}.btn-stepper{font-family:var(--font-family);font-size:1rem;font-weight:800;width:30px;height:30px;border:2px solid var(--colour-button);border-radius:50%;background:transparent;color:var(--colour-button);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .12s ease,color .12s ease;line-height:1;padding:0}.btn-stepper:hover:not(:disabled){background:var(--colour-button);color:#fff}.btn-stepper:disabled{opacity:.35;cursor:not-allowed}.game-over-overlay{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:var(--border-radius);background:#fce4ece0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;z-index:10;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.game-over-title{font-size:2rem;font-weight:800;color:var(--colour-accent)}.game-over-stats{font-size:1rem;font-weight:600;text-align:center;line-height:1.6}.game-over-highscore{font-size:.95rem;font-weight:800;color:var(--colour-accent);background:#fff;padding:4px 12px;border-radius:20px}.game-over-buttons{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#4a0e2a66;display:flex;align-items:center;justify-content:center;z-index:100;padding:16px}.modal{background:var(--colour-bg);border-radius:var(--border-radius);padding:24px;max-width:520px;width:100%;max-height:80dvh;overflow-y:auto;box-shadow:0 8px 32px #4a0e2a40}.modal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.modal-title{font-size:1.3rem;font-weight:800;color:var(--colour-accent)}.scores-table{width:100%;border-collapse:collapse;font-size:.85rem}.scores-table th{font-weight:700;text-transform:uppercase;font-size:.7rem;letter-spacing:.05em;padding:6px 8px;border-bottom:2px solid var(--colour-board);text-align:right;opacity:.7}.scores-table th:first-child,.scores-table td:first-child{text-align:left}.scores-table td{padding:8px;border-bottom:1px solid var(--colour-board);text-align:right;font-weight:600}.scores-table tr:last-child td{border-bottom:none}.scores-table .rank-1 td{color:var(--colour-accent);font-weight:800}.scores-empty{text-align:center;opacity:.6;padding:24px 0;font-weight:600}.high-scores-btn-row{width:100%;display:flex;justify-content:center;gap:8px;margin-top:4px}.settings-modal{max-width:420px}.settings-list{display:flex;flex-direction:column;gap:20px}.settings-item{display:flex;flex-direction:column;gap:6px}.settings-item-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.settings-label{font-size:1rem;font-weight:700;color:var(--colour-text);cursor:default}.settings-value-badge{font-size:.95rem;font-weight:800;color:var(--colour-accent);background:var(--colour-board);padding:2px 10px;border-radius:20px;min-width:48px;text-align:center}.settings-desc{font-size:.8rem;font-weight:600;opacity:.6;line-height:1.4}.settings-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:6px;background:var(--colour-board);border-radius:3px;outline:none;cursor:pointer;margin-top:4px}.settings-slider::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:22px;height:22px;background:var(--colour-accent);border-radius:50%;cursor:pointer;border:3px solid #fff;box-shadow:0 1px 4px #4a0e2a4d;transition:background .12s ease}.settings-slider::-moz-range-thumb{width:22px;height:22px;background:var(--colour-accent);border-radius:50%;cursor:pointer;border:3px solid #fff;box-shadow:0 1px 4px #4a0e2a4d}.settings-slider-labels{display:flex;justify-content:space-between;font-size:.7rem;font-weight:700;opacity:.5;text-transform:uppercase;letter-spacing:.04em;margin-top:2px}.settings-toggle{position:relative;width:46px;height:26px;border:none;border-radius:13px;background:var(--colour-board);cursor:pointer;padding:0;transition:background .2s ease;flex-shrink:0}.settings-toggle--on{background:var(--colour-accent)}.settings-toggle-thumb{position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 1px 4px #0003;transition:transform .2s cubic-bezier(.34,1.56,.64,1)}.settings-toggle--on .settings-toggle-thumb{transform:translate(20px)}.confirm-modal{max-width:380px;text-align:center}.confirm-modal--final{animation:confirm-shake .4s ease}.confirm-emoji{font-size:2.6rem;line-height:1;margin-bottom:6px;animation:confirm-pop .24s ease}.confirm-title{font-size:1.4rem;font-weight:800;color:var(--colour-accent);margin-bottom:10px}.confirm-body{font-size:.95rem;font-weight:600;line-height:1.5;min-height:3em;animation:confirm-pop .24s ease}.confirm-dots{display:flex;gap:7px;justify-content:center;margin:14px 0 18px}.confirm-dot{width:8px;height:8px;border-radius:50%;background:var(--colour-board);transition:background .22s ease,transform .22s ease}.confirm-dot--active{background:var(--colour-accent);transform:scale(1.25)}.confirm-buttons{display:flex;flex-direction:column;gap:8px}.confirm-buttons .btn{width:100%}.btn-danger{background:#d64550;color:#fff;border-color:#d64550}.btn-danger:hover:not(:disabled){background:#c02b38;color:#fff;border-color:#c02b38}.btn-danger:active:not(:disabled){background:#a81f2b}@keyframes confirm-pop{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}@keyframes confirm-shake{0%,to{transform:translate(0)}20%{transform:translate(-6px)}40%{transform:translate(6px)}60%{transform:translate(-4px)}80%{transform:translate(4px)}}.helper{display:flex;align-items:flex-end;gap:10px;width:100%;padding:0 4px;min-height:52px}.helper-avatar{font-size:2rem;line-height:1;flex-shrink:0;animation:helper-idle 3s ease-in-out infinite;transform-origin:bottom center}@keyframes helper-idle{0%,to{transform:rotate(-4deg)}50%{transform:rotate(4deg)}}.helper-bubble{background:#fff;border:2px solid var(--colour-board);border-radius:14px 14px 14px 4px;padding:8px 14px;font-size:.85rem;font-weight:600;color:var(--colour-text);line-height:1.4;box-shadow:0 2px 8px #4a0e2a14;animation:bubble-in .25s cubic-bezier(.34,1.56,.64,1);flex:1}@keyframes bubble-in{0%{opacity:0;transform:scale(.85) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}
