*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;overscroll-behavior:none;touch-action:manipulation}#app{min-height:100%;display:flex;align-items:center;justify-content:center;padding:16px}.game{width:min(92vw,460px);display:flex;flex-direction:column;gap:14px}.crumb{font-size:14px}.crumb a{color:var(--accent);text-decoration:none;font-weight:700}.crumb a:hover{text-decoration:underline}.topbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px}.title{font-size:clamp(40px,12vw,64px);font-weight:800;line-height:1;letter-spacing:-1px;background:linear-gradient(135deg,#f2b616,#ef6f43 45%,#b3279a);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}.scores{display:flex;gap:8px}.score-box{background:linear-gradient(160deg,color-mix(in srgb,var(--board-bg) 82%,#fff 18%),var(--board-bg));color:var(--accent-text);border-radius:10px;padding:6px 14px;text-align:center;min-width:72px;box-shadow:inset 0 1px #ffffff40,0 3px 8px #00000024}.score-box .label{font-size:11px;text-transform:uppercase;letter-spacing:1px;opacity:.85;font-weight:700}.score-box .value{font-size:22px;font-weight:800;line-height:1.1}.controls{display:flex;align-items:center;justify-content:space-between;gap:10px}.how{font-size:13px;opacity:.85;flex:1}.how b{font-weight:700}.btn{background:linear-gradient(160deg,color-mix(in srgb,var(--accent) 85%,#fff 15%),var(--accent));color:var(--accent-text);border:none;border-radius:10px;padding:10px 16px;font-size:14px;font-weight:700;cursor:pointer;white-space:nowrap;box-shadow:inset 0 1px #ffffff4d,0 3px 7px #0000002e;transition:filter .12s ease,transform 80ms ease}.btn:hover{filter:brightness(1.06)}.btn:active{filter:brightness(.95);transform:translateY(1px)}.board{--gap: clamp(8px, 2.5vw, 14px);--board: min(92vw, calc(100dvh - 210px) , 460px);--cell: calc((var(--board) - 5 * var(--gap)) / 4);position:relative;width:var(--board);height:var(--board);min-width:260px;min-height:260px;align-self:center;background:linear-gradient(115deg,#ffffff1a,#fff0 40%),repeating-linear-gradient(112deg,#0000000d 0px 1px,#ffffff08 2px 5px),radial-gradient(120% 120% at 30% 12%,color-mix(in srgb,var(--board-bg) 80%,#fff 20%) 0%,var(--board-bg) 55%,color-mix(in srgb,var(--board-bg) 82%,#000 18%) 100%);border-radius:14px;padding:var(--gap);touch-action:none;box-shadow:inset 0 1px #ffffff40,inset 0 -2px 6px #0000002e,0 18px 40px #00000047,0 4px 10px #0000002e}.grid{position:absolute;inset:var(--gap);display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(4,1fr);gap:var(--gap)}.grid .cell{background:color-mix(in srgb,var(--cell-bg) 88%,#000 12%);border-radius:9px;box-shadow:inset 0 2px 5px #00000038,inset 0 -1px #ffffff1a}.tiles{position:absolute;inset:var(--gap)}.tile{position:absolute;width:var(--cell);height:var(--cell);border-radius:9px;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:calc(var(--cell) * .48);background:linear-gradient(135deg,#fdf8ef,#efe3cf);color:#6f6558;text-shadow:0 1px 2px rgba(0,0,0,.22);box-shadow:inset 0 2px #ffffff59,inset 0 -4px 8px #00000029,0 4px 9px #00000038;--tx: calc(var(--col) * (var(--cell) + var(--gap)));--ty: calc(var(--row) * (var(--cell) + var(--gap)));transform:translate(var(--tx),var(--ty));transition:transform .1s ease-in-out;will-change:transform}.tile.pop{animation:pop .2s ease}.tile.appear{animation:appear .2s cubic-bezier(.34,1.56,.64,1)}@keyframes pop{0%{transform:translate(var(--tx),var(--ty)) scale(1);filter:brightness(1)}40%{transform:translate(var(--tx),var(--ty)) scale(1.22);filter:brightness(1.4)}to{transform:translate(var(--tx),var(--ty)) scale(1);filter:brightness(1)}}@keyframes appear{0%{opacity:0;transform:translate(var(--tx),var(--ty)) scale(.15)}to{opacity:1;transform:translate(var(--tx),var(--ty)) scale(1)}}.tile[data-v="2"]{background:linear-gradient(135deg,#fdf8ef,#efe3cf);color:#6f6558;text-shadow:0 1px 0 rgba(255,255,255,.5)}.tile[data-v="4"]{background:linear-gradient(135deg,#f9edd1,#ecd5a9);color:#6f6558;text-shadow:0 1px 0 rgba(255,255,255,.5)}.tile[data-v="8"]{background:linear-gradient(135deg,#ffcb8e,#f5a463);color:#fff8f0}.tile[data-v="16"]{background:linear-gradient(135deg,#ffb26b,#f18a3f);color:#fff8f0}.tile[data-v="32"]{background:linear-gradient(135deg,#ff9e6b,#ef6f43);color:#fff8f0}.tile[data-v="64"]{background:linear-gradient(135deg,#ff7e5f,#e8492e);color:#fff8f0}.tile[data-v="128"]{background:linear-gradient(135deg,#57d9c9,#16a89a);color:#f2fffd;font-size:calc(var(--cell) * .4)}.tile[data-v="256"]{background:linear-gradient(135deg,#3ccaa6,#109a7c);color:#f2fffd;font-size:calc(var(--cell) * .4)}.tile[data-v="512"]{background:linear-gradient(135deg,#a385ff,#6a3fd6);color:#f8f4ff;font-size:calc(var(--cell) * .4)}.tile[data-v="1024"]{background:linear-gradient(135deg,#f472dc,#b3279a);color:#fff2fb;font-size:calc(var(--cell) * .32)}.tile[data-v="2048"]{background:linear-gradient(135deg,#ffe27a,#f2b616);color:#5a4410;text-shadow:0 1px 0 rgba(255,255,255,.45);font-size:calc(var(--cell) * .32);box-shadow:inset 0 2px #ffffff8c,inset 0 -4px 8px #0000001f,0 4px 12px #00000040,0 0 26px #f2b616cc;animation:gold-glow 2.2s ease-in-out infinite}.tile[data-big="1"]{background:linear-gradient(135deg,#2f2e3c,#14131c);color:#e8e6ff;font-size:calc(var(--cell) * .28);box-shadow:inset 0 2px #ffffff2e,inset 0 -4px 8px #0000004d,0 4px 12px #0000004d,0 0 22px #786eff80}@keyframes gold-glow{0%,to{box-shadow:inset 0 2px #ffffff8c,inset 0 -4px 8px #0000001f,0 4px 12px #00000040,0 0 20px #f2b616a6}50%{box-shadow:inset 0 2px #ffffff8c,inset 0 -4px 8px #0000001f,0 4px 12px #00000040,0 0 34px #f2b616f2}}.overlay{position:absolute;inset:0;border-radius:14px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;text-align:center;padding:20px;background:var(--overlay-bg);backdrop-filter:blur(2px);z-index:10;opacity:0;pointer-events:none;transition:opacity .22s ease}.overlay.show{opacity:1;pointer-events:auto}.overlay .msg{font-size:clamp(28px,9vw,44px);font-weight:800}.overlay.win .msg{background:linear-gradient(135deg,#ffe27a,#f2b616);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}.overlay .actions{display:flex;gap:10px}
