/* Lapdrop Games — original code, MIT licence (c) 2026 Lapdrop */
:root{--p:#7b2ff7;--o:#ff7a18;--y:#ffd200;--bg:#140a26;--card:#22143d;--tx:#fff}
*{box-sizing:border-box}html,body{margin:0;background:var(--bg);color:var(--tx);font-family:Inter,system-ui,sans-serif;min-height:100%}
body{background:radial-gradient(circle at 20% 0,#3a1670 0,transparent 55%),radial-gradient(circle at 100% 100%,#5a2a10 0,transparent 50%),var(--bg)}
.top{display:flex;align-items:center;gap:10px;padding:12px 16px}
.top img{width:36px;height:36px}.top h1{font-size:20px;margin:0;flex:1;background:linear-gradient(90deg,var(--p),var(--o),var(--y));-webkit-background-clip:text;background-clip:text;color:transparent}
.top a,.btn{color:#fff;text-decoration:none;border:0;border-radius:12px;padding:8px 12px;font:600 14px Inter,system-ui,sans-serif;background:rgba(255,255,255,.12);cursor:pointer}
.btn.primary{background:linear-gradient(90deg,var(--p),var(--o),var(--y));color:#1a0b00}
.lang{display:flex;gap:4px}.lang button{background:rgba(255,255,255,.1);color:#fff;border:0;border-radius:8px;padding:4px 8px;font-size:12px;cursor:pointer}.lang button.on{background:var(--o)}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px;padding:8px 16px 24px;max-width:900px;margin:0 auto}
.game{background:var(--card);border-radius:16px;padding:14px;display:flex;flex-direction:column;gap:6px;text-decoration:none;color:#fff;border:1px solid rgba(255,255,255,.08)}
.game .ico{font-size:30px}.game h2{font-size:16px;margin:0}.game p{margin:0;font-size:12px;opacity:.75}
.tag{align-self:flex-start;font-size:11px;font-weight:700;border-radius:999px;padding:2px 8px;background:rgba(255,255,255,.12)}
.tag.play{background:linear-gradient(90deg,var(--p),var(--o),var(--y));color:#1a0b00}
.game.soon{opacity:.55}
.foot{text-align:center;font-size:11px;opacity:.6;padding:12px}
.wrap{max-width:520px;margin:0 auto;padding:0 12px 16px;display:flex;flex-direction:column;align-items:center;gap:10px}
.hud{display:flex;gap:16px;font-weight:700;width:100%;justify-content:space-between}
canvas{width:100%;max-width:480px;aspect-ratio:1;border-radius:16px;background:#0d0619;border:2px solid transparent;background-clip:padding-box;box-shadow:0 0 0 2px var(--p),0 0 24px rgba(255,122,24,.35);touch-action:none}
.ctl{display:grid;grid-template-columns:repeat(3,64px);grid-template-rows:repeat(2,56px);gap:8px}
.ctl button{font-size:22px;border-radius:14px;border:0;background:rgba(255,255,255,.14);color:#fff}
.ctl .u{grid-column:2}.ctl .l{grid-column:1;grid-row:2}.ctl .d{grid-column:2;grid-row:2}.ctl .r{grid-column:3;grid-row:2}
.row{display:flex;gap:8px}.msg{min-height:20px;font-size:14px;opacity:.85;text-align:center}
@media(min-width:700px){.ctl{display:none}}
/* 2048 + Minesweeper */
.board{width:100%;max-width:420px;aspect-ratio:1;display:grid;gap:8px;padding:8px;border-radius:16px;background:#0d0619;box-shadow:0 0 0 2px var(--p),0 0 24px rgba(255,122,24,.35);touch-action:none;user-select:none;-webkit-user-select:none}
.b2048{grid-template-columns:repeat(4,1fr)}
.tile{border-radius:10px;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:clamp(18px,7vw,34px);color:#fff}
.tile.n8,.tile.n16{font-size:clamp(18px,7vw,32px)}.tile.big{font-size:clamp(14px,5vw,24px)}
.ms{gap:3px;padding:6px}
.cell{border-radius:5px;background:linear-gradient(135deg,#4a23a0,#7b2ff7);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:clamp(10px,3.4vw,18px);color:#fff;cursor:pointer;-webkit-touch-callout:none}
.cell.open{background:rgba(255,255,255,.07)}.cell.boom{background:#c0262d}
.seg{display:flex;gap:4px}.seg button{background:rgba(255,255,255,.1);color:#fff;border:0;border-radius:10px;padding:6px 10px;font:600 13px Inter,system-ui,sans-serif;cursor:pointer}.seg button.on{background:linear-gradient(90deg,var(--p),var(--o));}
.board.ms{aspect-ratio:auto;height:auto}.ms .cell{aspect-ratio:1;min-width:0}
/* Memory + Sudoku */
.mem{aspect-ratio:auto;gap:8px}.card{aspect-ratio:3/4;border-radius:12px;background:linear-gradient(135deg,#7b2ff7,#ff7a18 60%,#ffd200);display:flex;align-items:center;justify-content:center;font-size:clamp(22px,8vw,40px);cursor:pointer;transition:transform .2s}
.card.up{background:#fff3;transform:rotateY(0)}.card.done{background:rgba(255,210,0,.25);cursor:default}.card img{width:55%;opacity:.9}
.sud{aspect-ratio:1;gap:0;padding:4px;grid-template-columns:repeat(9,1fr)}
.sc{display:flex;align-items:center;justify-content:center;font-weight:700;font-size:clamp(14px,5vw,24px);border:1px solid rgba(255,255,255,.08);cursor:pointer;color:#ffd200}
.sc.g{color:#fff}.sc.br{border-right:2px solid #ff7a18}.sc.bb{border-bottom:2px solid #ff7a18}.sc.sel{background:rgba(123,47,247,.55)}.sc.peer{background:rgba(255,255,255,.05)}.sc.bad{color:#ff5a7a}.sc.same{background:rgba(255,122,24,.3)}
.pad{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;width:100%;max-width:420px}.pad button{font:700 20px Inter,sans-serif;padding:10px 0;border-radius:12px;border:0;background:rgba(255,255,255,.14);color:#fff}
/* Board games (chess, checkers, connect four) */
.cb{grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(8,1fr);gap:0;padding:6px}.cb .cq{min-height:0;overflow:hidden;aspect-ratio:1}.board.cb{aspect-ratio:auto;height:auto}
.cq{display:flex;align-items:center;justify-content:center;font-size:clamp(22px,9vw,44px);cursor:pointer;line-height:1;user-select:none}
.cq.lt{background:#3b2266}.cq.dk{background:#23123f}.cq.sel{background:#7b2ff7!important}.cq.tg{box-shadow:inset 0 0 0 4px rgba(255,210,0,.7)}.cq.lm{background:rgba(255,122,24,.35)!important}
.pw{color:#fff;text-shadow:0 0 2px #000,0 0 6px rgba(255,210,0,.6)}.pb{color:#ff7a18;text-shadow:0 0 2px #000}
.ck{width:78%;aspect-ratio:1;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:clamp(12px,4vw,22px)}
.ck.w{background:radial-gradient(circle at 35% 30%,#fff,#d8c9ff);color:#7b2ff7}.ck.b{background:radial-gradient(circle at 35% 30%,#ffd200,#ff7a18);color:#1a0b00}
.c4{grid-template-columns:repeat(7,1fr);aspect-ratio:7/6;gap:6px;padding:8px;background:#2a1560}
.c4 div{border-radius:50%;background:#0d0619;cursor:pointer}.c4 .y{background:radial-gradient(circle at 35% 30%,#fff7b0,#ffd200)}.c4 .r{background:radial-gradient(circle at 35% 30%,#ffb0c0,#e0566a)}.c4 .win{box-shadow:0 0 0 3px #fff}
/* Appear only on new pieces (.born). Re-renders of .cq/.ck/.tile must not flash. */
.born{animation:ldpop .22s ease-out}
@keyframes ldpop{from{transform:scale(.82);opacity:.4}to{transform:none;opacity:1}}
.ld-burst{pointer-events:none;position:fixed;inset:0;overflow:hidden;z-index:40}
.ld-burst i{position:absolute;left:50%;top:42%;width:8px;height:8px;border-radius:50%;transform:rotate(var(--a)) translateY(calc(-1 * var(--d))) scale(1);animation:ldspark .8s ease-out forwards}
@keyframes ldspark{to{opacity:0;transform:rotate(var(--a)) translateY(calc(-8 * var(--d))) scale(.2)}}
@media(prefers-reduced-motion:reduce){.born,.ld-burst i{animation:none!important}}
/* === Games page layout (App agent, 31 Oct). Do not rewrite; see specs/games-autopilot.md === */
#ldgx{max-width:960px;margin:0 auto;padding:4px 16px 32px}
.gx-hero{border-radius:20px;padding:18px;margin:6px 0 12px;background:linear-gradient(120deg,#7b2ff7,#ff7a18 70%,#ffd200);color:#1a0b00;box-shadow:0 10px 30px rgba(123,47,247,.35)}
.gx-hero h2{margin:8px 0 4px;font-size:22px;line-height:1.15;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.25)}.gx-hero p{margin:0;font-size:13px;color:#fff;opacity:.95}
.gx-badge{display:inline-block;background:#fff;color:#7b2ff7;font:800 11px Inter,system-ui,sans-serif;border-radius:999px;padding:3px 9px;letter-spacing:.02em}
.gx-filt{display:flex;gap:6px;margin:0 0 12px}.gx-filt button{flex:1;border:0;border-radius:999px;padding:9px 10px;font:700 13px Inter,system-ui,sans-serif;background:rgba(255,255,255,.1);color:inherit;cursor:pointer}.gx-filt button.on{background:var(--o);color:#1a0b00}
.gx-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
@media(min-width:700px){.gx-grid{grid-template-columns:repeat(3,1fr)}}
.gx-card{background:var(--card);border-radius:18px;overflow:hidden;display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.08);text-decoration:none;color:inherit;transition:transform .15s}
.gx-card:active{transform:scale(.98)}
.gx-feat{grid-column:span 2}@media(min-width:700px){.gx-feat{grid-column:span 1}.gx-feat:first-child{grid-column:span 2}}
.gx-art{position:relative;display:block;aspect-ratio:16/9;background:#0d0619}.gx-art img{width:100%;height:100%;object-fit:cover;display:block}
.gx-orig{position:absolute;left:8px;top:8px;background:rgba(255,255,255,.95);color:#7b2ff7;font:800 10px Inter,system-ui,sans-serif;border-radius:999px;padding:3px 8px}
.gx-orig.s{position:static;align-self:flex-start}
.gx-live{position:absolute;right:8px;top:8px;background:#e0283c;color:#fff;font:800 10px Inter,system-ui,sans-serif;border-radius:999px;padding:3px 8px}
.gx-body{padding:10px 12px 12px;display:flex;flex-direction:column;gap:6px;flex:1}.gx-body h3{margin:0;font-size:15px}.gx-body p{margin:0;font-size:12px;opacity:.75;flex:1}
.gx-btns{display:flex;flex-direction:column;gap:6px;margin-top:4px}.gx-feat .gx-btns{flex-direction:row}
.gx-b{flex:1;text-align:center;text-decoration:none;border-radius:12px;padding:9px 8px;font:700 13px Inter,system-ui,sans-serif;background:rgba(255,255,255,.12);color:inherit}
.gx-fr{background:linear-gradient(90deg,var(--p),var(--o));color:#fff}.gx-code{font:800 10px ui-monospace,monospace;background:rgba(0,0,0,.25);border-radius:6px;padding:1px 5px;margin-left:2px}
.gx-more{margin:18px 0 8px;font-size:15px}.gx-how{text-align:center;font-size:12px;opacity:.7;margin:16px 0 0}
html[data-theme=light]{--bg:#f6f3fb;--card:#fff;--tx:#1d1530}
html[data-theme=light] body{background:radial-gradient(circle at 20% 0,#e6d8ff 0,transparent 55%),radial-gradient(circle at 100% 100%,#ffe2cc 0,transparent 50%),var(--bg);color:var(--tx)}
html[data-theme=light] .top a,html[data-theme=light] .btn:not(.primary),html[data-theme=light] .lang button:not(.on){background:rgba(29,21,48,.08);color:var(--tx)}
html[data-theme=light] .gx-card{border-color:rgba(29,21,48,.08);box-shadow:0 4px 14px rgba(29,21,48,.08)}
html[data-theme=light] .gx-filt button:not(.on),html[data-theme=light] .gx-b:not(.gx-fr){background:rgba(29,21,48,.07)}
html[data-theme=light] .foot,html[data-theme=light] a{color:inherit}
.gx-card:not(.gx-feat) .gx-orig:not(.s){top:auto;bottom:6px;left:6px}
.gx-card:not(.gx-feat) .gx-live{top:6px;right:6px}
.gx-card:not(.gx-feat) .gx-b{font-size:12px;padding:8px 4px;white-space:nowrap}
@media(max-width:699px){.gx-card:not(.gx-feat) .gx-code{display:none}}

/* Quick fixes 31 Oct: old emoji list stays hidden under the catalog; light mode for every game page */
main.grid[hidden]{display:none!important}
html[data-theme=light] .game{color:var(--tx);border-color:rgba(29,21,48,.08)}
html[data-theme=light] .tag:not(.play){background:rgba(29,21,48,.08)}
html[data-theme=light] .ctl button,html[data-theme=light] .pad button,html[data-theme=light] .seg button:not(.on){background:rgba(29,21,48,.08);color:var(--tx)}
html[data-theme=light] .board{background:#e9e1f5;box-shadow:0 0 0 2px var(--p),0 6px 18px rgba(123,47,247,.18)}
html[data-theme=light] .tile{background:rgba(29,21,48,.07);color:#1d1530}
html[data-theme=light] .cell.open{background:#fff;color:#1d1530}
html[data-theme=light] .sc{color:#b45309;border-color:rgba(29,21,48,.12)}html[data-theme=light] .sc.g{color:#1d1530}html[data-theme=light] .sc.peer{background:rgba(29,21,48,.05)}
html[data-theme=light] .card.up{background:#fff}
html[data-theme=light] .msg,html[data-theme=light] .hud{color:var(--tx)}
html[data-theme=light] .c4 div{background:#fff}html[data-theme=light] .c4{background:#c9b6ef}
html[data-theme=light] .cq.lt{background:#efe6ff}html[data-theme=light] .cq.dk{background:#b9a1e6}
html[data-theme=light] .gx-body,html[data-theme=light] .gx-body h3{color:var(--tx)}
/* games-layout: full-height themed backgrounds, light inputs */
html{min-height:100%;background:var(--bg)}
body{min-height:100vh;min-height:100dvh}
html body.has-bg,html[data-theme=light] body.has-bg{background:transparent}
.gbg{position:fixed;inset:-4%;z-index:-1;background-size:cover;background-position:center;opacity:0;transition:opacity .5s;pointer-events:none}
.gbg.on{opacity:1}
.gbg::after{content:"";position:absolute;inset:0;background:linear-gradient(rgba(20,10,38,.58),rgba(20,10,38,.76))}
html[data-theme=light] .gbg::after{background:linear-gradient(rgba(246,243,251,.42),rgba(246,243,251,.6))}
.gbg.drift{animation:gbgdrift 40s ease-in-out infinite alternate}
@keyframes gbgdrift{from{transform:translate3d(0,0,0) scale(1)}to{transform:translate3d(-2%,-1.5%,0) scale(1.04)}}
@media (prefers-reduced-motion:reduce){.gbg{animation:none!important;transition:none}}
html[data-theme=light] .lobby input{background:#fff;color:var(--tx);border-color:rgba(29,21,48,.25)}
html[data-theme=light] .lobby input::placeholder{color:rgba(29,21,48,.5)}
.solo-link{text-decoration:none;display:inline-flex;align-items:center}
html[data-theme=light] .clk b{background:#fff;color:var(--tx);border-color:rgba(29,21,48,.2)}
html[data-theme=light] .clk b.on{color:#b45309;border-color:#d97706}
html[data-theme=light] .wc{border-color:rgba(29,21,48,.28);background:rgba(255,255,255,.75);color:var(--tx)}
html[data-theme=light] .wc.g,html[data-theme=light] .wc.y{color:#fff}html[data-theme=light] .wc.n{background:#8a7aa6;border-color:#8a7aa6;color:#fff}
html[data-theme=light] .kb button{background:#fff;color:var(--tx);box-shadow:0 1px 3px rgba(29,21,48,.18)}
html[data-theme=light] .kb button.g,html[data-theme=light] .kb button.y{color:#fff}html[data-theme=light] .kb button.n{background:#c9bfd9;color:#5b5070}
/* no-jump (2026-10-31): status above boards keeps a fixed 2-line height; HUD never wraps; temp messages use .ld-toast overlay */
.wrap>#st,.wrap>.msg,.wrap>#msg{box-sizing:content-box;width:100%;line-height:1.35;height:2.7em;min-height:2.7em;max-height:2.7em;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;text-overflow:ellipsis;text-align:center;flex:none}
.wrap>#st{margin:6px 0}
.hud{flex-wrap:wrap;align-items:center;row-gap:6px;min-height:38px}
.hud>*{flex:none;white-space:nowrap}.hud>span{font-variant-numeric:tabular-nums}
.hud b{font-variant-numeric:tabular-nums;display:inline-block;min-width:3.2ch;text-align:left}
.ld-toast{position:fixed;left:50%;bottom:calc(16px + env(safe-area-inset-bottom));transform:translateX(-50%);z-index:9999;max-width:90vw;padding:10px 16px;border-radius:12px;background:rgba(20,10,38,.94);color:#fff;font:600 14px Inter,system-ui,sans-serif;box-shadow:0 6px 24px rgba(0,0,0,.4);pointer-events:none;opacity:0;transition:opacity .2s}
.ld-toast.on{opacity:1}
html[data-theme=light] .ld-toast{background:rgba(255,255,255,.96);color:#1a0b2e}
/* Shared © notice: in document flow below HUD/controls so 390px D-pads and keyboards stay tappable. */
.ldg-copy{font-weight:700;opacity:.85;margin:2px 0 0;padding:8px 12px calc(10px + env(safe-area-inset-bottom,0px));pointer-events:none;flex:none;width:100%;line-height:1.2;position:relative;z-index:0}
html[data-theme=light] .ldg-copy{color:inherit}
