@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono-latin-400.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono-latin-600.woff2)format("woff2");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono-latin-700.woff2)format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:IBM Plex Sans;src:url(/fonts/ibm-plex-sans-latin-400.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:IBM Plex Sans;src:url(/fonts/ibm-plex-sans-latin-600.woff2)format("woff2");font-weight:600;font-style:normal;font-display:swap}:root,[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--font-ui:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--bg:#f6f5f1;--surface:#fff;--surface-2:#f2f0eb;--surface-3:#e8e5de;--border:#e4e0d8;--border-strong:#cdc8bd;--text:#1e1d1a;--text-2:#57534b;--text-3:#8b867b;--accent:#2f5fd0;--accent-hover:#2550b6;--accent-soft:#e8eefb;--accent-ink:#2450b8;--on-accent:#fff;--good:#1d8155;--good-soft:#e4f3ea;--bad:#c93535;--bad-soft:#fbe9e7;--warn:#a4640a;--star:#e2a300;--star-off:#dedad0;--scrim:#1c1a145c;--typed:#1e1d1a;--pending:#aaa598;--error:#d23a3a;--error-bg:#d23a3a21;--fixed:#b77700;--caret:#2f5fd0;--f-pinky:#d9707a;--f-ring:#d9a04e;--f-middle:#56ad73;--f-index:#5b8ddb;--f-thumb:#9c9a94;--heat-color:#d23a3a;--speed-color:#6d5bd0;--shadow-sm:0 1px 2px #231e0f0d;--shadow:0 1px 2px #231e0f0a, 0 6px 20px #231e0f0d;--shadow-lg:0 20px 60px #14120a33;--ring:0 0 0 3px #2f5fd052;--radius:14px;--radius-sm:9px;--type-size:1.75rem}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#15161a;--surface:#1d1f24;--surface-2:#24272d;--surface-3:#2c3037;--border:#2e3239;--border-strong:#41454e;--text:#ebe9e3;--text-2:#b3b0a8;--text-3:#7f7c75;--accent:#7d9dff;--accent-hover:#95b0ff;--accent-soft:#7d9dff24;--accent-ink:#9ab3ff;--on-accent:#0d1122;--good:#55c08b;--good-soft:#55c08b24;--bad:#f07575;--bad-soft:#f0757521;--warn:#e3a44a;--star:#f0b92c;--star-off:#3a3d44;--scrim:#0000008c;--typed:#ebe9e3;--pending:#5d616a;--error:#f47a7a;--error-bg:#f47a7a29;--fixed:#e0a94a;--caret:#7d9dff;--f-pinky:#d8737d;--f-ring:#d6a257;--f-middle:#5fb57c;--f-index:#6e98e4;--f-thumb:#8f8d88;--heat-color:#f06a6a;--speed-color:#9d8cff;--shadow-sm:0 1px 2px #0000004d;--shadow:0 1px 2px #00000040, 0 8px 24px #00000038;--shadow-lg:0 24px 70px #0000008c;--ring:0 0 0 3px #7d9dff61}[data-palette=cb]{--error:#d55e00;--error-bg:#d55e0024;--bad:#c35400;--bad-soft:#d55e001f;--fixed:#8a4fbf;--good:#0072b2;--good-soft:#0072b21f;--heat-color:#d55e00}[data-theme=dark][data-palette=cb]{--error:#f08a3c;--bad:#f08a3c;--fixed:#c49ae6;--good:#56b4e9;--heat-color:#f08a3c}[data-palette=hc]{--text:#000;--text-2:#2b2a27;--text-3:#4f4c45;--typed:#000;--pending:#6d6960;--border:#9a958b;--border-strong:#5e5a52;--error:#b3001b;--bad:#b3001b;--accent:#1d47b0;--caret:#1d47b0}[data-theme=dark][data-palette=hc]{--text:#fff;--text-2:#e3e1dc;--text-3:#bdbab3;--typed:#fff;--pending:#9ea2ab;--border:#6d717a;--border-strong:#a2a6af;--error:#ff7b7b;--bad:#ff7b7b;--accent:#a9bfff;--caret:#a9bfff}*,:before,:after{box-sizing:border-box}*{margin:0;padding:0}html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}body{background:var(--bg);min-height:100vh;color:var(--text);font-family:var(--font-ui);-webkit-font-smoothing:antialiased;font-size:16px;line-height:1.5}a{color:var(--accent-ink);text-underline-offset:3px}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer}ul,ol{list-style:none}table{border-collapse:collapse}kbd{font-family:var(--font-mono)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}::selection{background:var(--accent-soft)}.kb-sr-only{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;overflow:hidden;position:absolute!important}[hidden]{display:none!important}.kb-icon{flex:none}#app{flex-direction:column;min-height:100vh;display:flex}.kb-skip{z-index:100;background:var(--surface);color:var(--text);border-radius:var(--radius-sm);box-shadow:var(--shadow);padding:10px 14px;position:absolute;top:-60px;left:12px}.kb-skip:focus{top:12px}.kb-header{z-index:20;background:color-mix(in srgb, var(--bg) 88%, transparent);-webkit-backdrop-filter:saturate(1.4)blur(10px);backdrop-filter:saturate(1.4)blur(10px);border-bottom:1px solid var(--border);transition:opacity .3s;position:sticky;top:0}.kb-header-inner{align-items:center;gap:24px;max-width:1120px;height:60px;margin:0 auto;padding:0 24px;display:flex}.kb-brand{color:var(--text);font-family:var(--font-mono);letter-spacing:-.02em;align-items:center;gap:9px;font-size:1.15rem;font-weight:700;text-decoration:none;display:inline-flex}.kb-brand-mark{background:var(--accent);width:30px;height:30px;color:var(--on-accent);border-radius:8px;place-items:center;font-size:1rem;display:inline-grid;box-shadow:inset 0 -3px #0000002e}.kb-brand-name{padding-top:1px}.kb-nav{flex:1;min-width:0}.kb-nav-list{scrollbar-width:none;gap:2px;display:flex;overflow-x:auto}.kb-nav-link{color:var(--text-2);white-space:nowrap;border-radius:8px;padding:7px 12px;font-size:.94rem;font-weight:500;text-decoration:none;display:block}.kb-nav-link:hover{color:var(--text);background:var(--surface-2)}.kb-nav-link[aria-current=page]{color:var(--text);background:var(--surface-3);font-weight:600}.kb-header-tools{align-items:center;gap:8px;margin-left:auto;display:flex}.kb-iconbtn{width:36px;height:36px;color:var(--text-2);background:0 0;border:1px solid #0000;border-radius:9px;place-items:center;display:inline-grid}.kb-iconbtn:hover,.kb-iconbtn[aria-current=page]{background:var(--surface-2);color:var(--text)}.kb-menu-btn{display:none}.kb-account-btn.kb-account-signed{background:var(--surface-2)}.kb-main{flex:1;width:100%;max-width:1120px;margin:0 auto;padding:36px 24px 64px}.kb-main:focus{outline:none}.kb-footer{border-top:1px solid var(--border);color:var(--text-3);font-size:.85rem}.kb-footer-inner{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 24px;max-width:1120px;margin:0 auto;padding:18px 24px;display:flex}.kb-foot-layout{align-items:center;gap:7px;display:inline-flex}.kb-foot-links{gap:18px;display:inline-flex}.kb-footer a{color:var(--text-3)}.kb-footer a:hover{color:var(--text)}:is(body:has(.kb-typing[data-state=running]) .kb-header,body:has(.kb-typing[data-state=running]) .kb-footer,body:has(.kb-typing[data-state=running]) .kb-test-options,body:has(.kb-typing[data-state=running]) .kb-lesson-head){opacity:.28}.kb-footer,.kb-test-options,.kb-lesson-head{transition:opacity .3s}.kb-page{flex-direction:column;gap:24px;display:flex}.kb-page-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:12px 24px;display:flex}.kb-page-title{letter-spacing:-.02em;font-size:1.85rem;font-weight:650;line-height:1.2}.kb-page-title:focus{outline:none}.kb-title-small{font-size:1.2rem;font-weight:600}.kb-lead{color:var(--text-2);max-width:62ch;margin-top:6px;font-size:1.05rem}.kb-page-body{flex-direction:column;gap:20px;display:flex}.kb-eyebrow{color:var(--text-3);letter-spacing:.06em;text-transform:uppercase;font-size:.8rem;font-weight:600}.kb-muted{color:var(--text-2)}.kb-small{font-size:.86rem}.kb-subtitle{color:var(--text-2);margin-top:4px;font-size:.95rem;font-weight:600}.kb-note{border-radius:var(--radius-sm);background:var(--surface-2);color:var(--text-2);padding:10px 14px;font-size:.92rem}.kb-note-warn{background:color-mix(in srgb, var(--warn) 14%, var(--surface));color:var(--text)}.kb-warn-text{color:var(--warn)}.kb-loading{color:var(--text-3);padding:8px 0}.kb-grid-2{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;display:grid}.kb-grid-3{grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;display:grid}.kb-grid-top{align-items:start}.kb-stack{flex-direction:column;gap:20px;min-width:0;display:flex}.kb-actions{flex-wrap:wrap;align-items:center;gap:10px;margin-top:6px;display:flex}.kb-inline{align-items:center;gap:8px;display:flex}.kb-back{color:var(--text-2);background:0 0;border:none;align-items:center;gap:6px;padding:4px 0;font-size:.92rem;text-decoration:none;display:inline-flex}.kb-back:hover{color:var(--text)}.kb-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow-sm);flex-direction:column;gap:12px;min-width:0;padding:22px 24px;display:flex}.kb-card-title{letter-spacing:-.01em;font-size:1.08rem;font-weight:600}.kb-card-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px 16px;display:flex}.kb-card-icon{background:var(--accent-soft);width:38px;height:38px;color:var(--accent-ink);border-radius:10px;place-items:center;display:inline-grid}.kb-card-action .kb-actions,.kb-card-action>.kb-btn{align-self:flex-start;margin-top:auto}.kb-empty{background:var(--surface);border:1px dashed var(--border-strong);border-radius:var(--radius);color:var(--text-2);flex-direction:column;align-items:flex-start;gap:14px;padding:28px;display:flex}.kb-error-box{border-style:solid;border-color:color-mix(in srgb, var(--bad) 40%, var(--border))}.kb-btn{border:1px solid var(--border-strong);background:var(--surface);color:var(--text);white-space:nowrap;border-radius:10px;justify-content:center;align-items:center;gap:8px;padding:9px 16px;font-size:.95rem;font-weight:600;line-height:1.25;text-decoration:none;transition:background .12s,border-color .12s,transform 80ms;display:inline-flex}.kb-btn:hover{background:var(--surface-2)}.kb-btn:active{transform:translateY(1px)}.kb-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.kb-btn-primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent);box-shadow:inset 0 -2px #0000001f}.kb-btn-primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.kb-btn-danger{color:var(--bad);border-color:color-mix(in srgb, var(--bad) 45%, var(--border))}.kb-btn-done{color:var(--good);border-color:color-mix(in srgb, var(--good) 45%, var(--border))}.kb-btn-danger:hover{background:var(--bad-soft)}.kb-btn-quiet{color:var(--accent-ink);background:0 0;border-color:#0000}.kb-btn-quiet:hover{background:var(--accent-soft)}.kb-btn-link{color:var(--accent-ink);text-underline-offset:3px;background:0 0;border:none;padding:0;font-weight:500;text-decoration:underline}.kb-btn-link:hover{background:0 0}.kb-btn-small{border-radius:8px;padding:6px 11px;font-size:.86rem}.kb-btn-large{border-radius:12px;padding:13px 24px;font-size:1.05rem}.kb-btn:focus-visible,.kb-iconbtn:focus-visible,.kb-seg-btn:focus-visible,.kb-lesson:focus-visible,.kb-classcard:focus-visible{box-shadow:var(--ring);outline:none}.kb-kbd-inline{border:1px solid var(--border-strong);background:var(--surface);text-align:center;min-width:1.6em;color:var(--text-2);border-bottom-width:2px;border-radius:5px;padding:1px 6px;font-size:.8em;line-height:1.4;display:inline-block}.kb-seg{background:var(--surface-2);border:1px solid var(--border);border-radius:11px;gap:2px;padding:3px;display:inline-flex}.kb-seg-btn{color:var(--text-2);background:0 0;border:none;border-radius:8px;padding:6px 12px;font-size:.9rem;font-weight:500}.kb-seg-btn:hover{color:var(--text)}.kb-seg-btn[aria-checked=true]{background:var(--surface);color:var(--text);box-shadow:var(--shadow-sm);font-weight:600}.kb-stats-row{grid-template-columns:repeat(auto-fit,minmax(128px,1fr));gap:12px;display:grid}.kb-stat{background:var(--surface-2);border-radius:12px;padding:14px 16px}.kb-stats-tiles .kb-stat{background:var(--surface);border:1px solid var(--border)}.kb-stat-value{font-family:var(--font-mono);letter-spacing:-.03em;font-variant-numeric:tabular-nums;font-size:1.75rem;font-weight:600;line-height:1.15}.kb-stat-unit{color:var(--text-3);letter-spacing:0;margin-left:4px;font-size:.9rem;font-weight:500}.kb-stat-label{color:var(--text-2);margin-top:2px;font-size:.86rem}.kb-stat-hint{color:var(--text-3);font-size:.76rem}.kb-bar{background:var(--surface-3);border-radius:3px;height:6px;overflow:hidden}.kb-bar-fill{background:var(--accent);border-radius:3px;height:100%}.kb-chips{flex-wrap:wrap;gap:6px;display:flex}.kb-keychip{border:1px solid var(--border-strong);background:var(--surface);min-width:32px;height:32px;font-family:var(--font-mono);border-bottom-width:2px;border-radius:8px;place-items:center;padding:0 8px;font-size:1rem;font-weight:600;display:inline-grid}.kb-keychip-weak{border-color:color-mix(in srgb, var(--bad) 45%, var(--border));background:var(--bad-soft)}.kb-keychip-small{border-radius:6px;min-width:24px;height:24px;padding:0 5px;font-size:.85rem}.kb-stars{vertical-align:middle;gap:2px;display:inline-flex}.kb-star{width:16px;height:16px}.kb-star path{fill:var(--star-off)}.kb-star-on path{fill:var(--star)}.kb-stars-big .kb-star{width:44px;height:44px}.kb-stars-big .kb-star-on{animation:.45s cubic-bezier(.2,1.4,.4,1) both kb-pop}.kb-stars-big .kb-star-on:nth-child(2){animation-delay:.12s}.kb-stars-big .kb-star-on:nth-child(3){animation-delay:.24s}@keyframes kb-pop{0%{opacity:0;transform:scale(.4)}to{opacity:1;transform:scale(1)}}.kb-badge{background:var(--surface-2);white-space:nowrap;border-radius:999px;align-items:center;gap:4px;padding:3px 9px;font-size:.8rem;font-weight:600;display:inline-flex}.kb-badge-good{background:var(--good-soft);color:var(--good)}.kb-home{gap:28px}.kb-hero{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);align-items:center;gap:32px;padding:12px 0 8px;display:grid}.kb-hero-title{letter-spacing:-.03em;margin-top:8px;font-size:2.5rem;font-weight:650;line-height:1.12}.kb-hero-title:focus{outline:none}.kb-hero-next{background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:18px;flex-direction:column;align-items:flex-start;gap:14px;padding:24px;display:flex}.kb-next-label{color:var(--text-2);font-size:.92rem;font-weight:600}.kb-next-keys-text{font-family:var(--font-mono);font-size:1.4rem;font-weight:600}.kb-hero-progress{width:100%;color:var(--text-3);flex-direction:column;gap:6px;margin-top:4px;font-size:.86rem;display:flex}.kb-goal{align-items:center;gap:16px;display:flex}.kb-goal-ring{--p:0;background:conic-gradient(var(--accent) calc(var(--p) * 1%), var(--surface-3) 0);border-radius:50%;flex:none;place-items:center;width:64px;height:64px;display:grid;position:relative}.kb-goal-ring:before{content:"";background:var(--surface);border-radius:50%;position:absolute;inset:7px}.kb-goal-ring span{font-family:var(--font-mono);font-size:1.05rem;font-weight:600;position:relative}.kb-home-recent{color:var(--text-2);text-align:center}.kb-keycaps{flex-wrap:wrap;gap:14px;display:flex}.kb-keycap{flex-direction:column;align-items:center;gap:8px;display:flex}:where(.kb-keycap,.kb-kbd-key,.kb-next-hint){--f:var(--text-3)}.kb-keycap-face{background:color-mix(in srgb, var(--f) 16%, var(--surface));border:1px solid color-mix(in srgb, var(--f) 45%, var(--border));min-width:58px;height:58px;box-shadow:inset 0 -3px 0 color-mix(in srgb, var(--f) 30%, transparent);font-family:var(--font-mono);border-radius:12px;place-items:center;padding:0 12px;font-size:1.6rem;font-weight:600;display:grid}.kb-keycap-finger{color:var(--text-2);text-align:center;max-width:11ch;font-size:.8rem;line-height:1.25}[data-finger=lp],[data-finger=rp]{--f:var(--f-pinky)}[data-finger=lr],[data-finger=rr]{--f:var(--f-ring)}[data-finger=lm],[data-finger=rm]{--f:var(--f-middle)}[data-finger=li],[data-finger=ri]{--f:var(--f-index)}[data-finger=th]{--f:var(--f-thumb)}.kb-course-summary{color:var(--text-2);align-items:center;gap:8px;font-weight:500;display:inline-flex}.kb-unit{flex-direction:column;gap:10px;display:flex}.kb-unit+.kb-unit{margin-top:12px}.kb-unit-head{align-items:baseline;gap:12px;display:flex}.kb-unit-title{font-size:1.15rem;font-weight:600}.kb-unit-count{color:var(--text-3);font-size:.86rem;font-family:var(--font-mono)}.kb-unit-desc{color:var(--text-2);max-width:70ch;font-size:.94rem}.kb-lessons{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:4px;display:grid}.kb-lesson{background:var(--surface);border:1px solid var(--border);height:100%;color:var(--text);box-shadow:var(--shadow-sm);border-radius:13px;flex-direction:column;gap:6px;padding:14px 16px;text-decoration:none;transition:border-color .12s,transform .12s;display:flex;position:relative}a.kb-lesson:hover{border-color:var(--border-strong);transform:translateY(-1px)}.kb-lesson-num{color:var(--text-3);font-size:.78rem;font-weight:600;font-family:var(--font-mono)}.kb-lesson-keys{font-family:var(--font-mono);letter-spacing:.02em;min-height:1.8rem;font-size:1.25rem;font-weight:600}.kb-lesson-keys-word{font-family:var(--font-ui);letter-spacing:0;font-size:1.05rem;line-height:1.3}.kb-lesson-meta{color:var(--text-3);margin-top:auto;font-size:.82rem}.kb-lesson-lock{align-items:center;gap:5px;display:inline-flex}.kb-lesson-current{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.kb-lesson-passed{background:color-mix(in srgb, var(--good-soft) 45%, var(--surface))}.kb-lesson-locked{box-shadow:none;color:var(--text-3);background:0 0;border-style:dashed}.kb-lesson-badge{background:var(--accent);color:var(--on-accent);border-radius:999px;padding:2px 8px;font-size:.72rem;font-weight:600;position:absolute;top:12px;right:12px}.kb-lesson-page{gap:20px}.kb-lesson-head{flex-direction:column;gap:6px;display:flex}.kb-lesson-intro{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);align-items:start;gap:20px;display:grid}.kb-intro-keys{gap:18px}.kb-intro-keys .kb-lead{margin-top:0}.kb-steps{flex-direction:column;display:flex}.kb-step{border-bottom:1px solid var(--border);grid-template-columns:28px minmax(0,1fr) auto auto;align-items:center;gap:12px;padding:10px 0;display:grid}.kb-step:last-child{border-bottom:none}.kb-step-num{background:var(--surface-2);width:26px;height:26px;color:var(--text-2);border-radius:50%;place-items:center;font-size:.82rem;font-weight:600;display:inline-grid}.kb-step-name{font-weight:500}.kb-step-best{color:var(--text-3);font-size:.84rem;font-family:var(--font-mono)}.kb-goal-list{color:var(--text-2);flex-direction:column;gap:6px;font-size:.9rem;display:flex}.kb-goal-list li{align-items:center;gap:10px;display:flex}.kb-goal-list .kb-star{width:13px;height:13px}.kb-stepdots{gap:6px;margin-top:4px;display:flex}.kb-stepdot{background:var(--surface-3);border-radius:3px;width:26px;height:5px}.kb-stepdot-done{background:color-mix(in srgb, var(--good) 60%, var(--surface-3))}.kb-stepdot-cur{background:var(--accent)}.kb-result{gap:18px;width:100%;max-width:820px;margin:0 auto}.kb-result-head{text-align:center;flex-direction:column;align-items:center;gap:8px;padding:8px 0 4px;display:flex}.kb-result-msg{font-size:1.2rem;font-weight:600}.kb-result .kb-actions{justify-content:center}.kb-result>.kb-small{text-align:center}.kb-errlist{flex-direction:column;gap:8px;display:flex}.kb-errlist li{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.kb-errlist-n{color:var(--text-2);min-width:11ch;font-size:.9rem}.kb-errlist-instead{color:var(--text-3);align-items:center;gap:5px;font-size:.84rem;display:inline-flex}.kb-typing{flex-direction:column;gap:16px;width:100%;max-width:920px;margin:0 auto;display:flex}.kb-live{font-family:var(--font-mono);color:var(--text-3);flex-wrap:wrap;align-items:baseline;gap:22px;display:flex}.kb-live-item{align-items:baseline;gap:4px;display:inline-flex}.kb-live-value{color:var(--accent-ink);font-variant-numeric:tabular-nums;min-width:2ch;font-size:1.35rem;font-weight:600}.kb-live-unit{font-size:.85rem}.kb-live-progress{background:var(--surface-3);border-radius:2px;flex:120px;align-self:center;height:3px;overflow:hidden}.kb-live-progress-bar{background:var(--accent);transform-origin:0;height:100%;transition:transform .12s linear;transform:scaleX(0)}.kb-typing-box{cursor:text;padding:18px 4px;position:relative}.kb-text{font-family:var(--font-mono);font-size:var(--type-size);font-variant-ligatures:none;height:4.7em;line-height:1.6;position:relative;overflow:hidden}.kb-text-inner{transition:transform .18s;position:relative}.kb-word{white-space:pre;vertical-align:top;display:inline-block}.kb-ch{color:var(--pending);border-radius:3px}.kb-ch.kb-ok{color:var(--typed)}.kb-ch.kb-err{color:var(--error);text-underline-offset:5px;text-decoration:underline;text-decoration-thickness:2px}.kb-ch.kb-space.kb-err{background:var(--error-bg)}.kb-ch.kb-fixed{-webkit-text-decoration:underline dotted 2px color-mix(in srgb, var(--fixed) 75%, transparent);text-decoration:underline dotted 2px color-mix(in srgb, var(--fixed) 75%, transparent);text-underline-offset:5px}.kb-ch.kb-cur.kb-miss{color:var(--error);background:var(--error-bg)}.kb-caret{pointer-events:none;background:var(--caret);border-radius:1px;position:absolute;top:0;left:0}.kb-caret-ready.kb-caret-smooth{transition:transform 90ms ease-out,width 90ms ease-out}.kb-caret-line{margin-top:.23em;margin-left:-1px;width:2px!important;height:1.15em!important}.kb-caret-block{opacity:.28;border-radius:3px;margin-top:.18em;height:1.25em!important}.kb-caret-underline{margin-top:1.38em;height:3px!important}.kb-typing[data-state=idle] .kb-caret,.kb-typing[data-state=done] .kb-caret{animation:1.1s step-end infinite kb-blink}.kb-caret-block.kb-caret-ready{animation-name:kb-blink-soft}@keyframes kb-blink{50%{opacity:0}}@keyframes kb-blink-soft{50%{opacity:.08}}.kb-input-sink{opacity:0;resize:none;pointer-events:none;border:0;width:1px;height:1px;padding:0;font-size:16px;position:absolute;top:0;left:0;overflow:hidden}.kb-focus-hint{color:var(--text-2);place-items:center;font-size:1rem;font-weight:500;display:none;position:absolute;inset:0}.kb-typing.kb-unfocused .kb-focus-hint{display:grid}.kb-typing.kb-unfocused .kb-text{filter:blur(4px);opacity:.45}.kb-typing.kb-unfocused .kb-caret{visibility:hidden}.kb-composing .kb-ch.kb-cur{-webkit-text-decoration:underline 2px var(--accent);text-decoration:underline 2px var(--accent);text-underline-offset:5px}.kb-shake{animation:.16s kb-shake}@keyframes kb-shake{25%{transform:translate(-2px)}75%{transform:translate(2px)}}.kb-hints{flex-direction:column;align-items:center;gap:12px;display:flex}.kb-hints:empty{display:none}.kb-next-hint{min-height:1.8em;color:var(--text-2);align-items:center;gap:8px;font-size:.95rem;display:flex}.kb-shortcuts{text-align:center;color:var(--text-3);font-size:.84rem}.kb-kbd{width:100%;max-width:640px;font-family:var(--font-mono);-webkit-user-select:none;user-select:none;flex-direction:column;gap:5px;margin:0 auto;display:flex}.kb-kbd-row{grid-template-columns:repeat(60,minmax(0,1fr));gap:5px;display:grid}.kb-kbd-key{background:var(--surface);border:1px solid var(--border);height:38px;box-shadow:inset 0 -2px 0 color-mix(in srgb, var(--border-strong) 45%, transparent);color:var(--text-2);border-radius:7px;place-items:center;font-size:.82rem;transition:background .1s,transform .1s;display:grid;position:relative}.kb-kbd-mod{background:var(--surface-2);color:var(--text-3);font-family:var(--font-ui);font-size:.72rem}.kb-kbd-main{color:var(--text);font-weight:600}.kb-kbd-top{color:var(--text-3);font-size:.64rem;position:absolute;top:2px;left:5px}.kb-kbd-top+.kb-kbd-main{font-size:.78rem;position:absolute;bottom:3px;left:5px}.kb-kbd-alt{color:var(--text-3);font-size:.6rem;position:absolute;bottom:3px;right:5px}.kb-kbd-anchor:after{content:"";background:var(--text-3);border-radius:1px;width:10px;height:2px;margin-left:-5px;position:absolute;bottom:5px;left:50%}.kb-kbd-fingers .kb-kbd-key:not(.kb-kbd-mod){background:color-mix(in srgb, var(--f) 15%, var(--surface));border-color:color-mix(in srgb, var(--f) 32%, var(--border))}.kb-kbd-new{outline:2px solid color-mix(in srgb, var(--f) 70%, transparent);outline-offset:1px}.kb-kbd .kb-kbd-next{color:#fff;box-shadow:0 0 0 3px color-mix(in srgb, var(--f) 30%, transparent);transform:translateY(1px);background:var(--f)!important;border-color:var(--f)!important}.kb-kbd-next .kb-kbd-main,.kb-kbd-next .kb-kbd-top,.kb-kbd-next .kb-kbd-alt,.kb-kbd-next .kb-kbd-modlabel{color:#fff}.kb-kbd-heat{background:color-mix(in srgb, var(--heat-color) var(--heat), var(--surface))!important}.kb-heat-speed .kb-kbd-heat{background:color-mix(in srgb, var(--speed-color) var(--heat), var(--surface))!important}.kb-heat .kb-kbd-key:not(.kb-kbd-heat):not(.kb-kbd-mod){background:var(--surface-2);color:var(--text-3)}.kb-heat .kb-kbd-key:not(.kb-kbd-heat) .kb-kbd-main{color:var(--text-3)}.kb-next-hint[data-finger] .kb-kbd-inline{background:color-mix(in srgb, var(--f) 20%, var(--surface));border-color:color-mix(in srgb, var(--f) 55%, var(--border));color:var(--text);font-weight:600}.kb-test-page{gap:28px}.kb-test-options{flex-wrap:wrap;justify-content:center;gap:12px 26px;display:flex}.kb-opt{align-items:center;gap:10px;display:flex}.kb-opt-label{color:var(--text-3);font-size:.86rem;font-weight:500}.kb-test-stage{padding-top:12px}.kb-test-result{gap:20px;width:100%;max-width:820px;margin:0 auto}.kb-test-hero{text-align:center;flex-direction:column;align-items:center;gap:4px;display:flex}.kb-test-big{align-items:baseline;gap:10px;display:flex}.kb-test-big-value{font-family:var(--font-mono);letter-spacing:-.05em;color:var(--accent-ink);font-size:4.5rem;font-weight:600;line-height:1}.kb-test-big-unit{font-family:var(--font-mono);color:var(--text-3);font-size:1.3rem}.kb-test-result .kb-result-msg{color:var(--text-2);font-size:1rem;font-weight:500}.kb-test-result .kb-actions{justify-content:center}.kb-test-result>.kb-small{text-align:center}.kb-figure{flex-direction:column;gap:6px;display:flex}.kb-figure figcaption{color:var(--text-3);font-size:.82rem}.kb-chart{width:100%;height:auto;display:block;overflow:visible}.kb-chart-grid line{stroke:var(--border);stroke-width:1px}.kb-chart-grid text,.kb-chart-axis text{fill:var(--text-3);font-size:12px;font-family:var(--font-mono)}.kb-chart-line{fill:none;stroke:var(--accent);stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}.kb-chart-area{fill:var(--accent);opacity:.08}.kb-chart-dot{fill:var(--surface);stroke:var(--accent);stroke-width:2px}.kb-chart-last{fill:var(--accent);stroke:var(--surface)}.kb-chart-hit{fill:#0000}.kb-chart-hit:hover{fill:color-mix(in srgb, var(--accent) 12%, transparent)}.kb-chart-mark{fill:var(--error)}.kb-source{margin-top:-8px}.kb-heat{flex-direction:column;gap:14px;padding:8px 0;display:flex}.kb-heat-controls{flex-wrap:wrap;gap:10px;display:flex}.kb-heat-legend{color:var(--text-3);flex-wrap:wrap;justify-content:center;align-items:center;gap:10px;font-size:.82rem;display:flex}.kb-heat-ramp{background:linear-gradient(90deg, var(--surface), var(--heat-color));border:1px solid var(--border);border-radius:5px;width:120px;height:10px}.kb-heat-ramp.kb-heat-speed{background:linear-gradient(90deg, var(--surface), var(--speed-color))}.kb-heat-nodata{margin-left:12px}.kb-weak-block{border-top:1px solid var(--border);flex-direction:column;align-items:flex-start;gap:10px;padding-top:14px;display:flex}.kb-weaklist{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px 16px;width:100%;display:grid}.kb-weaklist li{color:var(--text-2);align-items:center;gap:10px;font-size:.9rem;display:flex}.kb-table-wrap{margin:0 -4px;overflow-x:auto}.kb-table{width:100%;font-size:.92rem}.kb-table th{text-align:left;color:var(--text-3);border-bottom:1px solid var(--border);white-space:nowrap;padding:8px 10px;font-size:.8rem;font-weight:600}.kb-table td{border-bottom:1px solid var(--border);vertical-align:middle;padding:10px}.kb-table tr:last-child td{border-bottom:none}.kb-table .kb-num{text-align:right;white-space:nowrap;font-family:var(--font-mono);font-variant-numeric:tabular-nums}.kb-table-compact td{padding:6px 10px}.kb-rowlist{flex-direction:column;display:flex}.kb-rowlist>li{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:14px;padding:12px 0;display:flex}.kb-rowlist>li:last-child{border-bottom:none}.kb-assign-main{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.kb-assign-done .kb-assign-main strong{color:var(--text-2)}.kb-assign-detail{margin-top:10px}.kb-row-actions{flex:none;align-items:center;gap:6px;display:flex}.kb-textlist{flex-direction:column;gap:8px;display:flex}.kb-textlist-item{border:1px solid var(--border);background:var(--surface);text-align:left;border-radius:11px;flex-direction:column;align-items:flex-start;gap:2px;width:100%;padding:12px 14px;display:flex}.kb-textlist-item:hover{border-color:var(--border-strong);background:var(--surface-2)}.kb-textlist-title{font-weight:600}.kb-textlist-meta{color:var(--text-3);font-size:.84rem}.kb-classlist{flex-direction:column;gap:8px;display:flex}.kb-classcard{border:1px solid var(--border);background:var(--surface);color:var(--text);border-radius:12px;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:16px;padding:14px 16px;text-decoration:none;display:grid}.kb-classcard:hover{border-color:var(--border-strong);background:var(--surface-2)}.kb-classcard-name{font-weight:600}.kb-archived{opacity:.65}.kb-joincode-panel{flex-direction:column;align-items:flex-start;gap:12px;display:flex}.kb-joincode{font-family:var(--font-mono);letter-spacing:.14em;background:var(--surface-2);border:1px solid var(--border);-webkit-user-select:all;user-select:all;border-radius:14px;gap:14px;padding:10px 18px;font-size:2.4rem;font-weight:700;display:flex}.kb-howto{color:var(--text-2);flex-direction:column;gap:4px;padding-left:22px;font-size:.93rem;list-style:decimal;display:flex}.kb-mini-lessons{grid-template-columns:repeat(auto-fill,minmax(64px,1fr));gap:6px;display:grid}.kb-mini-lessons li{background:var(--surface-2);border-radius:8px;flex-direction:column;align-items:center;gap:2px;padding:6px;display:flex}.kb-mini-lessons .kb-star{width:11px;height:11px}.kb-mini-passed{background:var(--good-soft)!important}.kb-mini-num{font-family:var(--font-mono);color:var(--text-2);font-size:.8rem}.kb-field{flex-direction:column;gap:6px;display:flex}.kb-field+.kb-field{margin-top:12px}.kb-field-label{font-size:.9rem;font-weight:600}.kb-field-hint{color:var(--text-3);font-size:.84rem}.kb-field-error,.kb-form-error{color:var(--bad);font-size:.88rem}.kb-form-status{border-radius:var(--radius-sm);margin-top:6px;padding:10px 12px;font-size:.9rem}.kb-form-status[data-kind=error]{background:var(--bad-soft);color:var(--bad)}.kb-form-status[data-kind=info]{background:var(--good-soft);color:var(--good)}.kb-input,.kb-select{border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--surface);width:100%;color:var(--text);padding:9px 12px;line-height:1.35}.kb-select{appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--text-3) 50%), linear-gradient(135deg, var(--text-3) 50%, transparent 50%);background-position:calc(100% - 17px) 55%,calc(100% - 12px) 55%;background-repeat:no-repeat;background-size:5px 5px,5px 5px;width:auto;min-width:12rem;max-width:100%;padding-right:32px}.kb-select-small{min-width:0;padding:5px 28px 5px 8px;font-size:.88rem}.kb-input:focus,.kb-select:focus{border-color:var(--accent);box-shadow:var(--ring);outline:none}.kb-input[aria-invalid=true]{border-color:var(--bad)}.kb-input-short{width:auto;max-width:12rem}.kb-textarea{resize:vertical;min-height:9rem;font-family:var(--font-mono);font-size:.95rem}.kb-code{font-family:var(--font-mono);font-size:.9rem}.kb-code-input{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;max-width:16rem;font-size:1.3rem}.kb-form-grid{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px 16px;margin-top:12px;display:grid}.kb-form-grid .kb-field+.kb-field{margin-top:0}.kb-form-grid .kb-select{width:100%}.kb-inline-form{flex-wrap:wrap;align-items:flex-start;gap:10px 12px;display:flex}.kb-inline-form .kb-field{flex:240px}.kb-inline-form .kb-actions{margin-top:28px}.kb-join .kb-actions{margin-top:12px}.kb-checkbox{width:18px;height:18px;accent-color:var(--accent);flex:none;margin-top:2px}.kb-check-line{align-items:flex-start;gap:10px;display:flex}.kb-check-label{font-weight:500}.kb-settings-grid{grid-template-columns:repeat(3,minmax(0,1fr));align-items:start;gap:20px;display:grid}.kb-settings-grid>.kb-card:last-child{grid-column:1/-1}.kb-settings-group{gap:0}.kb-settings-group .kb-card-title{margin-bottom:6px}.kb-setting{border-top:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;padding:12px 0;display:flex}.kb-card-title+.kb-setting{border-top:none}.kb-setting-text{flex:180px;min-width:0}.kb-setting-label{font-size:.93rem;font-weight:600}.kb-setting-help{color:var(--text-3);flex-basis:100%;margin-top:2px;font-size:.84rem}.kb-setting-control{max-width:100%}.kb-setting-control .kb-select{min-width:11rem}.kb-account-value{color:var(--text-2)}.kb-settings-summary{margin:8px 0;font-weight:600}.kb-switch{color:var(--text-2);background:0 0;border:none;align-items:center;gap:8px;padding:4px 0;font-size:.9rem;display:inline-flex}.kb-switch-track{background:var(--border-strong);border-radius:11px;width:38px;height:22px;transition:background .15s;position:relative}.kb-switch-thumb{background:#fff;border-radius:50%;width:16px;height:16px;transition:transform .15s;position:absolute;top:3px;left:3px;box-shadow:0 1px 2px #0000004d}.kb-switch[aria-checked=true] .kb-switch-track{background:var(--accent)}.kb-switch[aria-checked=true] .kb-switch-thumb{transform:translate(16px)}.kb-switch:focus-visible{outline:none}.kb-switch:focus-visible .kb-switch-track{box-shadow:var(--ring)}.kb-range-row{align-items:center;gap:10px;display:flex}.kb-range{width:150px;accent-color:var(--accent)}.kb-range-value{font-family:var(--font-mono);color:var(--text-2);min-width:4.5ch;font-size:.86rem}.kb-caret-choice{align-items:center;gap:12px;display:flex}.kb-caret-preview{font-family:var(--font-mono);background:var(--surface-2);border-radius:8px;padding:0 8px;font-size:1.3rem;line-height:1.6;position:relative}.kb-caret-preview .kb-caret{width:1ch;height:1.6em;position:absolute;top:0;left:calc(8px + 2ch)}.kb-caret-static{animation:1.1s step-end infinite kb-blink}.kb-account-grid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:20px;display:grid}.kb-account-inline{flex-direction:column;gap:8px;padding-bottom:8px;display:flex}.kb-account-flow{background:var(--surface-2);border-radius:12px;flex-direction:column;gap:10px;margin:8px 0;padding:14px;display:flex}.kb-row{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.kb-row-tight{flex-wrap:nowrap;margin-top:0}.kb-backup-codes{font-family:var(--font-mono)}.kb-legal{gap:20px;max-width:760px;line-height:1.65}.kb-legal-section{flex-direction:column;gap:8px;display:flex}.kb-legal h2{font-size:1.08rem}.kb-legal ul{flex-direction:column;gap:4px;padding-left:22px;list-style:outside;display:flex}.kb-imprint-text{white-space:pre-wrap}.kb-tabs{border-bottom:1px solid var(--border);gap:2px;display:flex;overflow-x:auto}.kb-tab{color:var(--text-2);white-space:nowrap;background:0 0;border:none;border-radius:8px 8px 0 0;padding:10px 14px;font-weight:500}.kb-tab:hover{color:var(--text)}.kb-tab[aria-selected=true]{color:var(--text);box-shadow:inset 0 -2px 0 var(--accent);font-weight:600}#ui-root{z-index:50;position:relative}.kb-backdrop{background:var(--scrim);place-items:center;padding:16px;animation:.15s kb-fade;display:grid;position:fixed;inset:0;overflow-y:auto}@keyframes kb-fade{0%{opacity:0}}.kb-account{background:var(--surface);border:1px solid var(--border);width:min(520px,100%);max-height:calc(100vh - 32px);box-shadow:var(--shadow-lg);border-radius:18px;flex-direction:column;gap:16px;padding:24px 26px;display:flex;overflow-y:auto}.kb-account-wide{width:min(760px,100%)}.kb-account-head{justify-content:space-between;align-items:center;gap:12px;display:flex}.kb-account-head h2{letter-spacing:-.01em;font-size:1.3rem;font-weight:650}.kb-account-body{flex-direction:column;gap:12px;display:flex}.kb-modal{background:var(--surface);border:1px solid var(--border);width:min(440px,100% - 32px);box-shadow:var(--shadow-lg);z-index:60;border-radius:18px;padding:24px 26px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.kb-modal-confirm:before{content:"";background:var(--scrim);z-index:-1;position:fixed;inset:-100vmax}.kb-modal h2{margin-bottom:8px;font-size:1.2rem;font-weight:650}.kb-confirm-body{color:var(--text-2);margin-bottom:14px}.kb-auth-note,.kb-auth-optional,.kb-auth-notice{color:var(--text-2);font-size:.92rem}.kb-auth-notice{background:var(--good-soft);border-radius:var(--radius-sm);padding:10px 12px}.kb-auth-form{flex-direction:column;gap:4px;display:flex}.kb-auth-or{color:var(--text-3);align-items:center;gap:12px;margin:8px 0;font-size:.85rem;display:flex}.kb-auth-or:before,.kb-auth-or:after{content:"";background:var(--border);flex:1;height:1px}.kb-auth-alt{flex-direction:column;gap:6px;display:flex}.kb-choices{flex-direction:column;gap:8px;display:flex}.kb-choice{text-align:left;border:1px solid var(--border);background:var(--surface);border-radius:12px;flex-direction:column;align-items:flex-start;gap:2px;padding:12px 14px;display:flex}.kb-choice:hover{border-color:var(--border-strong)}.kb-choice[aria-checked=true]{border-color:var(--accent);background:var(--accent-soft)}.kb-choice-label{font-weight:600}.kb-choice-desc{color:var(--text-2);font-size:.86rem}.kb-choice-default{color:var(--text-3);text-transform:uppercase;letter-spacing:.05em;font-size:.72rem}.kb-onb-progress{color:var(--text-3);font-size:.84rem}.kb-onb-title{font-size:1.1rem}.kb-onb-skip{color:var(--text-3);background:0 0;border:none;align-self:flex-start;padding:4px 0;text-decoration:underline}.kb-toasts{z-index:70;flex-direction:column;gap:10px;max-width:min(360px,100vw - 40px);display:flex;position:fixed;bottom:20px;right:20px}.kb-toast{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--accent);box-shadow:var(--shadow-lg);opacity:0;cursor:pointer;border-radius:12px;padding:12px 16px;transition:opacity .2s,transform .2s;transform:translateY(8px)}.kb-toast-show{opacity:1;transform:none}.kb-toast-title{font-weight:600}.kb-toast-body{color:var(--text-2);margin-top:2px;font-size:.9rem}@media (width<=1000px){.kb-settings-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.kb-settings-grid>:first-child{grid-column:1/-1}}@media (width<=860px){.kb-menu-btn{display:inline-grid}.kb-nav{background:var(--surface);border-bottom:1px solid var(--border);box-shadow:var(--shadow);padding:8px 16px 14px;display:none;position:absolute;top:60px;left:0;right:0}.kb-menu-open .kb-nav{display:block}.kb-nav-list{flex-direction:column}.kb-nav-link{padding:10px 12px}.kb-hero,.kb-lesson-intro,.kb-grid-2,.kb-grid-3{grid-template-columns:minmax(0,1fr)}.kb-hero-title{font-size:2rem}}@media (width<=640px){.kb-header-inner{gap:12px;padding:0 16px}.kb-main{padding:24px 16px 48px}.kb-footer-inner{padding:16px}.kb-account-btn span{display:none}.kb-account-btn{padding:8px}.kb-settings-grid,.kb-account-grid{grid-template-columns:minmax(0,1fr)}.kb-page-title{font-size:1.55rem}.kb-card{padding:18px 16px}.kb-kbd,.kb-kbd-row{gap:3px}.kb-kbd-key{border-radius:5px;height:30px;font-size:.7rem}.kb-kbd-top,.kb-kbd-alt,.kb-kbd-modlabel{display:none}.kb-kbd-top+.kb-kbd-main{font-size:.72rem;position:static}.kb-test-big-value{font-size:3.4rem}.kb-live{gap:14px}.kb-lessons{grid-template-columns:repeat(2,minmax(0,1fr))}.kb-step{grid-template-columns:28px minmax(0,1fr) auto}.kb-step .kb-btn,.kb-step .kb-step-best{grid-column:2/-1;justify-self:start}.kb-joincode{gap:10px;font-size:1.7rem}.kb-opt{flex-direction:column;align-items:center;gap:4px}.kb-setting-control .kb-select{width:100%;min-width:0}.kb-setting-control{flex:100%}.kb-row-tight{flex-wrap:wrap}}[data-motion=reduced] *,[data-motion=reduced] :before,[data-motion=reduced] :after{scroll-behavior:auto!important;transition:none!important;animation-duration:1ms!important;animation-iteration-count:1!important}@media print{.kb-header,.kb-footer,.kb-actions{display:none}}
