/* Self-hosted fonts — latin subset, vendored from Google Fonts into ui/fonts/ so
   the page makes NO runtime CDN/Google call. build.mjs prepends this verbatim to
   shell.min.css (kept out of the Bun CSS bundler, which would inline the woff2 as
   base64 into the render-blocking CSS). Regenerate with tools/vendor-fonts.mjs. */
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;font-display:swap;src:url(./fonts/jetbrains-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:500;font-display:swap;src:url(./fonts/jetbrains-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:700;font-display:swap;src:url(./fonts/jetbrains-mono-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'VT323';font-style:normal;font-weight:400;font-display:swap;src:url(./fonts/vt323-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
:root{--bg:#0b1021;--bg2:#161d3c;--ink:#f6e7b2;--mut:#9aa6c8;--acc:#20d9a2;--acc-ink:#06210f;--coral:#ff7a59;--line:#283766;--panel:#161d3c8c;--tap:48px;--r:10px;--font-display:"VT323",ui-monospace,monospace;--font-ui:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace}*{box-sizing:border-box}html,body{height:100%}body{background:radial-gradient(130% 95% at 50% 38%,var(--bg2)0%,var(--bg)80%);color:var(--ink);font:15px/1.45 var(--font-ui);-webkit-text-size-adjust:100%;margin:0}.app{position:relative;height:100vh;min-height:100vh;overflow:hidden;width:100%;height:100dvh;min-height:100dvh}.topbar{position:absolute;z-index:5;display:flex;padding:6px 10px 8px;padding:calc(env(safe-area-inset-top) + 6px)max(10px,env(safe-area-inset-right))8px max(10px,env(safe-area-inset-left));pointer-events:none;background:linear-gradient(#080b18eb 0%,#080b18b3 78%,#080b1800 100%);justify-content:space-between;align-items: center;gap:8px;top:0;left:0;right:0}.topbar>*{pointer-events:auto}.brand{letter-spacing:1.5px;color:var(--ink);white-space:nowrap;flex:none;font-family:VT323,ui-monospace,monospace;font-size:22px;line-height:1}.brand .ball{vertical-align:-.17em;display:inline-block;width:.86em;height:.86em;margin:0 .01em}.vh{position:absolute;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0}.turn{display:inline-flex;white-space:nowrap;border:1px solid var(--line);color:var(--mut);background:#0a0e1eb3;border-radius:999px;flex:none;align-items:baseline;gap:1px;padding:3px 9px;line-height:1}.turn .t-lab{letter-spacing:1.5px;color:var(--mut);align-self: center;margin-right:4px;font-size:9px}.turn b{color:var(--ink);font-family:VT323,ui-monospace,monospace;font-size:21px;font-weight:400}.turn .t-tot{color:var(--mut);font-size:13px}.turn.last{border-color:#ffcf2e;box-shadow:0 0 10px #ffcf2e59}.turn.last b{color:#ffcf2e}.legend{display:flex;color:var(--mut);flex-wrap:wrap;align-items: center;gap:10px;font-size:11.5px}.legend .lg{display:inline-flex;white-space:nowrap;align-items: center;gap:5px}.legend .dot{display:inline-block;border-radius:50%;width:10px;height:10px}.legend .dot.cream{background:var(--ink)}.legend .dot.coral{background:var(--coral)}.legend .dot.gold{background:#ffcf2e;box-shadow:0 0 5px 1px #ffcf2ecc}.legend .dir,.legend .dir #legendDir{color:var(--ink);font-weight:700}.menu{position:relative;flex:none}.menu>summary{list-style:none;cursor:pointer}.menu>summary::-webkit-details-marker{display:none}.menu-pop{position:absolute;z-index:6;display:flex;min-width:210px;max-width:300px;max-width:min(82vw,300px);max-height:calc(100vh - 64px);overflow-y:auto;border:1px solid var(--line);background:#0c1022fa;border-radius:13px;flex-direction:column;align-items: flex-start;gap:10px;max-height:calc(100dvh - 64px);padding:12px;top:calc(100% + 6px);right:0;box-shadow:0 12px 30px #0000008c}.menu-pop .status{white-space:normal;overflow:visible;width:100%;min-width:0;font-size:13px}.menu-pop .turn{align-self: flex-start}.menu-pop .turn .t-lab{display:inline}.menu-icons{display:flex;align-self:stretch;gap:6px}.menu-sep{background:var(--line);width:100%;height:1px;margin:4px 0}.menu-icons .iconbtn{flex:1 1 0;width:auto;height:38px;font-size:15px}.menu-pop .mbtn{color:var(--ink);background:var(--bg2);border:1px solid var(--line);cursor:pointer;border-radius:9px;justify-content:flex-start;gap:10px;width:100%;min-height:42px;padding:0 12px;font-size:14px;font-weight:700}.menu-pop .mbtn .g-ic{width:18px;font-size:15px}.menu-pop .mbtn:hover{background:var(--hov)}.iconbtn{display:grid;background:var(--bg2);color:var(--ink);border:1px solid var(--line);cursor:pointer;border-radius:9px;flex:none;place-items: center;width:44px;height:44px;padding:0;font-size:16px;line-height:1}.iconbtn:hover{background:var(--hov)}g-btn{display:inline-flex;cursor:pointer;user-select:none;-webkit-tap-highlight-color:transparent;justify-content:center;align-items: center;gap:8px}g-btn[disabled]{pointer-events:none}g-btn:focus-visible{outline:2px solid var(--acc);outline-offset:2px}.g-ic{display:inline-flex;flex:none;justify-content:center;align-items: center;line-height:1}.g-lb{display:inline-flex;align-items: center;min-width:0}#stage{position:absolute;z-index:0;overflow:hidden;touch-action:none;background:0 0;inset:0}.hud{position:absolute;z-index:4;display:flex;pointer-events:none;flex-direction:column;align-items:stretch;bottom:0;left:0;right:0}.hud button,.hud select,.hud summary{pointer-events:auto}.dock{pointer-events:auto;display:flex;padding:6px 10px 22px;padding:6px max(10px,env(safe-area-inset-right))calc(22px + env(safe-area-inset-bottom))max(10px,env(safe-area-inset-left));box-shadow:none;background:0 0;border-top:0;align-items:stretch;gap:8px}.dock .act,.dock .commit{filter:drop-shadow(0 4px 12px #00000080)}.modes{display:flex;flex:auto;gap:7px;min-width:0}.modes .act{display:flex;flex-direction:column;flex:1 1 0;justify-content:center;align-items: center;gap:2px;min-width:0;min-height:52px;padding:5px 4px}.modes .act .ic{font-size:18px;line-height:1}.modes .act .lb{letter-spacing:.4px;font-size:11px}.act .lb,.commit{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.modes .act[hidden]{display:none}.dock .commit{flex:none;min-width:92px}.dock .mini{display:flex;flex-direction:column;flex:none;justify-content:center;align-items: center;gap:2px;min-width:46px;min-height:52px;padding:5px 6px}.dock .mini .ic{font-size:17px;line-height:1}.dock .mini .lb{letter-spacing:.3px;font-size:10px}@media (min-width:680px){.dock .mini{min-width:88px}}.act[disabled]{opacity:.34;pointer-events:none}@media (max-width:679px){.dock{flex-wrap:wrap}.modes{flex:100%}.dock .mini .lb{display:none}.dock .commit{flex:auto}}.overflow{position:relative;flex:none}.overflow>summary{list-style:none;cursor:pointer}.overflow>summary::-webkit-details-marker{display:none}.overflow .ovf{min-width:48px;min-height:52px}.overflow-pop{position:absolute;z-index:6;display:flex;border:1px solid var(--line);background:#0c1022fa;border-radius:13px;flex-direction:column;align-items:stretch;gap:7px;width:max-content;max-width:82vw;padding:9px;bottom:calc(100% + 8px);right:0;box-shadow:0 -10px 30px #0000008c}.overflow-pop>button{text-align:left;color:var(--ink);background:var(--bg2);border:1px solid var(--line);cursor:pointer;border-radius:9px;min-height:44px;padding:0 14px;font-size:14px;font-weight:700}.overflow-pop>button:hover{background:var(--hov)}.sw{display:inline-block;border-radius:3px;width:11px;height:11px}.sw.round{border-radius:50%}.sw.cream{background:var(--ink)}.sw.gold{background:#ffcf2e;border-radius:50%;box-shadow:0 0 5px 1px #ffcf2ed9}.sw.coral{background:var(--coral)}.sw.ghost{background:var(--coral);opacity:.4;outline:1px dashed var(--coral)}.sw.mint{border-top:3px solid var(--acc);border-radius:0;width:16px;height:0}.sw.dash{border-top:3px dashed var(--coral);border-radius:0;width:16px;height:0}.status{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:0 1px 2px #0000008c;flex:auto;min-width:40px;font-size:12.5px;line-height:1.3}.status b,.status.ok{color:var(--acc);font-weight:700}.status.bad{color:var(--coral);font-weight:700}.status.ok b,.status.bad b{color:inherit}.act{letter-spacing:.5px;background:var(--bg2);color:var(--ink);border:1px solid var(--line);cursor:pointer;border-radius:9px;min-height:44px;padding:0 14px;transition:background .12s,border-color .12s;font-size:15px;font-weight:700}.act:hover{background:var(--hov)}.act.active{color:var(--acc);border-color:var(--acc);box-shadow:inset 0 2px 0 0 var(--acc),0 0 12px #20d9a24d;animation:armedPulse 2.2s ease-in-out infinite;background:#20d9a22e}.act.active .ic{text-shadow:0 0 8px #20d9a299}@keyframes armedPulse{0%,to{box-shadow:inset 0 2px 0 0 var(--acc),0 0 8px #20d9a233}50%{box-shadow:inset 0 2px 0 0 var(--acc),0 0 16px #20d9a273}}@media (prefers-reduced-motion:reduce){.act.active{animation:none}}.act-hint{pointer-events:none;text-align:center;color:var(--acc);letter-spacing:.3px;text-shadow:0 1px 3px #000000b3;background:linear-gradient(#090c1a00 0%,#090c1ad1 35%,#090c1af5 100%);padding:7px 12px;font-size:12.5px;font-weight:700;line-height:1.3}.act-hint[hidden]{display:none}.commit{letter-spacing:.5px;background:var(--acc);color:var(--acc-ink);border:1px solid var(--acc);cursor:pointer;border-radius:9px;min-width:92px;min-height:52px;padding:0 16px;transition:filter .12s;font-size:15px;font-weight:700}.commit:hover{filter:brightness(1.08)}.sheet-card .commit{width:100%;min-height:48px}.setup-toggle[aria-expanded=true]{background:var(--hov);border-color:var(--acc);border-bottom-right-radius:0;border-bottom-left-radius:0}.setup-row{display:flex;border:1px solid var(--acc);border-top-color:var(--line);background:#00000038;border-radius:0 0 9px 9px;flex-direction:column;align-items:stretch;gap:6px;margin-top:-1px;padding:9px}.setup-row[hidden]{display:none}.setup-row .act{letter-spacing:.3px;justify-content:flex-start;gap:9px;min-height:36px;font-size:13px;font-weight:600}.setup-row label{color:var(--mut);display:flex;justify-content:space-between;align-items: center;gap:6px;font-size:12px}.setup-row select{background:var(--bg2);color:var(--ink);border:1px solid var(--line);font:inherit;border-radius:7px;min-height:36px;padding:7px 6px;font-size:12px}.setup-row .iconbtn{align-self: flex-end;width:40px;height:40px;font-size:14px}.sheet{position:fixed;z-index:20;display:grid;background:#050812b8;place-items: center;padding:18px;inset:0}.sheet[hidden]{display:none}.sheet-card{width:100%;max-width:360px;max-height:80vh;overflow:auto;background:var(--bg2);color:var(--ink);border:1px solid var(--line);border-radius:14px;max-height:80dvh;padding:18px;box-shadow:0 18px 60px #00000080}.sheet-card h2{letter-spacing:.5px;margin:0 0 8px;font-size:16px}.sheet-card h2.res-win{color:var(--acc)}.sheet-card h2.res-lose{color:var(--coral)}.sheet-card p,#resBody{color:var(--mut);margin:0 0 12px;font-size:13px}.res-chips{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;margin:2px 0 10px}.res-chips .chip{color:var(--ink);background:var(--bg2);border:1px solid var(--line);border-radius:999px;padding:3px 9px;font-size:12.5px;font-weight:700}.res-mini{letter-spacing:1px;text-align:center;margin:4px 0 10px;font-family:ui-monospace,Menlo,monospace;font-size:19px;line-height:1.04}.res-next{text-align:center;color:var(--mut);margin-bottom:2px;font-size:12px}@keyframes eurekaPop{0%{transform:scale(.6);opacity:0}55%{transform:scale(1.12)}to{transform:scale(1);opacity:1}}h2.eureka{color:var(--acc);animation:eurekaPop .5s cubic-bezier(.2,1.4,.4,1)both}@keyframes sheetScrimIn{0%{opacity:0}to{opacity:1}}@keyframes sheetCardIn{0%{transform:translateY(16px)scale(.97);opacity:0}to{transform:none;opacity:1}}#resultSheet:not([hidden]){animation:sheetScrimIn .34s ease both}#resultSheet:not([hidden]) .sheet-card{animation:sheetCardIn .42s cubic-bezier(.2,.9,.3,1)both}#resultSheet:not([hidden]) .sheet-card:has(h2.res-win){animation-timing-function:cubic-bezier(.2,1.3,.35,1)}#resultSheet:not([hidden]) .sheet-card:has(h2.res-lose){animation-duration:.5s}.legend-list{list-style:none;display:flex;flex-direction:column;gap:7px;margin:0 0 14px;padding:0;font-size:12.5px}.legend-list li{display:flex;align-items: center;gap:8px}.howto-steps{list-style:none;display:flex;flex-direction:column;gap:16px;margin:0 0 14px;padding:0}.howto-steps li{display:flex;align-items: center;gap:13px}.howto-steps img{border:1px solid var(--line);background:#0b1021;border-radius:10px;flex:none;width:132px;height:auto;box-shadow:0 6px 18px #00000073}.howto-cap{display:flex;flex-direction:column;gap:3px;min-width:0}.howto-cap b{color:var(--ink);letter-spacing:.3px;font-size:13.5px}.howto-cap span{color:var(--mut);font-size:12px;line-height:1.32}.howto-cap b{color:var(--acc)}#resActions{display:flex;flex-direction:column;gap:8px}#resActions .act{width:100%}.level-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:14px}.level-grid[hidden]{display:none}.level-tile{display:flex;text-align:left;border:1px solid var(--line);background:var(--bg2);color:var(--ink);cursor:pointer;font:inherit;border-radius:10px;flex-direction:column;gap:2px;padding:9px 10px}.level-tile:hover{background:var(--hov)}.level-tile .lt-title{font-size:12.5px;font-weight:700}.level-tile .lt-sub{color:var(--mut);font-size:11px}.level-tile.locked{opacity:.42;cursor:not-allowed}.level-tile.cleared{border-color:var(--acc)}.level-tile.cleared .lt-title{color:var(--acc)}@media (max-width:430px){.level-grid{grid-template-columns:1fr}}.title-card{text-align:center}.title-card>*{margin-bottom:12px}.title-card .commit,.title-card .act{width:100%}.title-brand{letter-spacing:3px;color:var(--ink);margin-bottom:6px;font-family:VT323,ui-monospace,monospace;font-size:52px;line-height:1}.title-brand .ball{vertical-align:-.17em;display:inline-block;width:.86em;height:.86em;margin:0 .01em}.title-tag{color:var(--mut);font-size:13px;line-height:1.5}.title-progress{color:var(--acc);min-height:14px;font-size:12.5px;font-weight:700}.title-progress:empty{display:none}.credit{text-align:center;color:var(--mut);margin:4px 0 0;font-size:11.5px}.credit a{color:var(--mut);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--mut)45%,transparent)}.credit a:hover{color:var(--acc);border-bottom-color:var(--acc)}.setup-row .credit{margin-top:8px}.set-row{display:flex;justify-content:space-between;align-items: center;gap:10px;margin-bottom:12px;font-size:13.5px}.setup-row .set-row{margin-bottom:0;font-size:13px}.toggle{border:1px solid var(--line);background:var(--bg2);color:var(--mut);cursor:pointer;font:inherit;border-radius:8px;min-width:66px;min-height:38px;padding:0 12px;font-weight:700}.toggle.on{color:var(--acc);border-color:var(--acc);background:#20d9a229}#setReset{color:var(--coral);border-color:var(--coral)}#recStats{color:var(--acc);font-size:12.5px;font-weight:700}.rec-list{list-style:none;display:flex;flex-direction:column;gap:7px;margin:0 0 14px;padding:0}.rec-item{display:flex;border:1px solid var(--line);background:var(--bg2);opacity:.55;border-radius:9px;align-items: flex-start;gap:9px;padding:8px 9px;font-size:12.5px}.rec-item.on{opacity:1;border-color:var(--acc)}.rec-item.on b{color:var(--acc)}.rec-badge{font-size:16px;line-height:1.1}.rec-desc{color:var(--mut);font-size:11.5px}#statsSheet{z-index:21}.stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin:4px 0 14px}.stat-cell{display:flex;flex-direction:column;align-items: center;gap:2px}.stat-num{font-family:var(--font-display);color:var(--ink);font-size:34px;line-height:1}.stat-lab{letter-spacing:.4px;color:var(--mut);text-align:center;font-size:10px}.stats-h3{letter-spacing:1.2px;text-transform:uppercase;color:var(--mut);margin:0 0 8px;font-size:11px}.dist{display:flex;flex-direction:column;gap:5px;margin-bottom:16px}.dist-row{display:grid;grid-template-columns:74px 1fr;align-items: center;gap:8px;font-size:12px}.dist-lab{color:var(--mut);white-space:nowrap}.dist-bar{display:inline-flex;background:var(--line);color:var(--ink);border-radius:4px;justify-content:flex-end;align-items: center;min-width:22px;padding:2px 8px;font-size:12px;font-weight:700}.dist-bar.on{background:var(--acc);color:var(--acc-ink)}.stats-foot{display:flex;flex-direction:column;gap:10px;margin-bottom:10px}.stats-next{color:var(--mut);text-align:center;font-size:12.5px;line-height:1.3}.stats-next:empty{display:none}.stats-foot .commit{width:100%}.stats-foot .commit[hidden]{display:none}#statsSheet .act{width:100%}.toast{position:fixed;left:50%;top:calc(env(safe-area-inset-top) + 64px);z-index:25;pointer-events:none;opacity:0;white-space:nowrap;background:var(--acc);color:var(--acc-ink);border-radius:999px;padding:9px 14px;transition:opacity .3s,transform .3s;font-size:13px;font-weight:700;transform:translate(-50%,-12px);box-shadow:0 8px 24px #00000080}.toast[hidden]{display:none}.toast.show{opacity:1;transform:translate(-50%)}.fx-flash{position:fixed;z-index:15;pointer-events:none;opacity:0;background:radial-gradient(120% 90% at 50% 42%,transparent 35%,var(--flash,transparent)100%);inset:0}.fx-flash.go{animation:flashPulse .6s ease-out;--flash:#ffcf2e8c}.fx-flash.bad{animation:flashPulse .6s ease-out;--flash:#ff7a5980}.fx-confetti{position:fixed;z-index:16;pointer-events:none;width:100%;height:100%;inset:0}.tutor{position:fixed;left:50%;bottom:calc(176px + env(safe-area-inset-bottom));z-index:6;pointer-events:none;display:flex;max-width:360px;color:var(--ink);border:1px solid var(--acc);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#0a0e1eeb;border-radius:12px;align-items: center;gap:10px;max-width:min(92vw,360px);padding:9px 12px;font-size:13px;line-height:1.35;transform:translate(-50%);box-shadow:0 8px 26px #00000080}.tutor[hidden]{display:none}.tutor #tutorSkip{pointer-events:auto;color:var(--mut);cursor:pointer;background:0 0;border:0;flex:none;padding:4px 2px;font-size:11px}.tutor #tutorSkip:hover{color:var(--ink)}@keyframes flashPulse{0%{opacity:0}18%{opacity:1}to{opacity:0}}.app.shake{animation:shake .42s cubic-bezier(.36,.07,.19,.97)}@keyframes shake{10%,90%{transform:translate(-1px)}20%,80%{transform:translate(2px)}30%,50%,70%{transform:translate(-4px)}40%,60%{transform:translate(4px)}}button:focus-visible{outline:2px solid var(--acc);outline-offset:2px}select:focus-visible{outline:2px solid var(--acc);outline-offset:2px}@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}.fx-flash.go,.fx-flash.bad{animation:none;opacity:0}}@media (max-width:560px){.brand{letter-spacing:1px;font-size:22px}}@media (min-width:680px){.brand{font-size:30px}.dock{padding-bottom:calc(14px + env(safe-area-inset-bottom));justify-content:center;gap:10px}.modes{flex:none}.modes .act{min-width:108px}.act-hint{font-size:13px}.commit{min-width:150px;font-size:16px}}
