:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--text:#1f1d24;--text-muted:#6b6672;--bg:#f6f5f3;--surface:#fcfcfb;--surface-2:#efeee9;--border:#dedcd6;--accent:#5b3fe0;--accent-ink:#fff;--error:#c62828;--error-bg:#fbe3e3;--fixed:#b35c00;--focus:#5b3fe0;--finger-pinky:#2a78d6;--finger-ring:#eb6834;--finger-middle:#1baf7a;--finger-index:#eda100;--finger-index-right:#8b5cf6;--finger-thumb:#e87ba4;--series-1:#2a78d6;--grid:#e6e4de;--sans:system-ui, "Segoe UI", Roboto, sans-serif;--mono:ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace;font:16px/1.5 var(--sans);color:var(--text);background:var(--bg)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--text:#ecebef;--text-muted:#a19ca8;--bg:#141417;--surface:#1c1c20;--surface-2:#26262b;--border:#34343b;--accent:#a390ff;--accent-ink:#141417;--error:#ff7b7b;--error-bg:#4a1f22;--fixed:#f0a45c;--focus:#a390ff;--finger-pinky:#3987e5;--finger-ring:#d95926;--finger-middle:#199e70;--finger-index:#c98500;--finger-index-right:#9a72f5;--finger-thumb:#d55181;--series-1:#3987e5;--grid:#2c2c32}}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--text:#ecebef;--text-muted:#a19ca8;--bg:#141417;--surface:#1c1c20;--surface-2:#26262b;--border:#34343b;--accent:#a390ff;--accent-ink:#141417;--error:#ff7b7b;--error-bg:#4a1f22;--fixed:#f0a45c;--focus:#a390ff;--finger-pinky:#3987e5;--finger-ring:#d95926;--finger-middle:#199e70;--finger-index:#c98500;--finger-index-right:#9a72f5;--finger-thumb:#d55181;--series-1:#3987e5;--grid:#2c2c32}*{box-sizing:border-box}body{background:var(--bg);margin:0}h1,h2,h3{margin:0;line-height:1.25}h2{font-size:1.15rem}h3{color:var(--text-muted);font-size:.95rem;font-weight:600}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer;border:1px solid var(--border);background:var(--surface);border-radius:6px;padding:6px 14px}button:hover:not(:disabled){background:var(--surface-2)}button:disabled{opacity:.5;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);font-weight:600}button.primary:hover:not(:disabled){background:var(--accent);filter:brightness(1.08)}button.link{color:var(--accent);background:0 0;border:none;padding:2px 4px;text-decoration:underline}button.link.danger{color:var(--error)}.panel>button.link{align-self:flex-start}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}input,textarea,select{background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:6px 10px}textarea{width:100%;font-family:var(--mono);resize:vertical;tab-size:4;font-size:.9rem}kbd,code{font-family:var(--mono);background:var(--surface-2);border:1px solid var(--border);white-space:pre;border-radius:4px;padding:0 5px;font-size:.9em}.muted{color:var(--text-muted)}.app{flex-direction:column;gap:20px;max-width:980px;margin:0 auto;padding:20px 16px 48px;display:flex}.app-footer{text-align:center;color:var(--text-muted);font-size:.875rem}.app-footer a{color:var(--accent)}.app-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.brand{color:var(--text);letter-spacing:-.03em;background:0 0;border:none;align-items:center;gap:10px;padding:0;font-size:1.4rem;font-weight:800;display:flex}.logo{flex:none;width:36px;height:36px;transition:transform .15s}.brand:hover:not(:disabled) .logo{transform:translateY(1px)}.logo-cap{fill:var(--accent)}.logo-edge{fill:color-mix(in srgb, var(--accent) 60%, #000)}.logo-key{fill:var(--accent-ink);opacity:.92}.logo-target{fill:var(--finger-index)}.wordmark{align-items:center;gap:.28em;display:inline-flex}.wordmark-accent{color:var(--accent)}.wordmark-caret{background:var(--accent);border-radius:1px;width:3px;height:1.05em;margin-left:-.12em;animation:1.1s step-end infinite caret-blink}@keyframes caret-blink{50%{opacity:0}}@media (prefers-reduced-motion:reduce){.wordmark-caret{animation:none}}.brand:disabled{opacity:1;cursor:default}.brand:hover:not(:disabled){color:var(--accent);background:0 0}.panel{background:var(--surface);border:1px solid var(--border);border-radius:10px;flex-direction:column;gap:12px;padding:18px;display:flex}.setup{flex-direction:column;gap:20px;display:flex}.actions{flex-wrap:wrap;gap:8px;display:flex}.notice{background:var(--surface-2);border-radius:6px;margin:0;padding:8px 12px;font-size:.9rem}.settings{position:relative}.settings summary{cursor:pointer;border:1px solid var(--border);background:var(--surface);border-radius:6px;padding:6px 12px;list-style:none}.settings summary::-webkit-details-marker{display:none}.settings-body{z-index:10;background:var(--surface);border:1px solid var(--border);border-radius:8px;flex-direction:column;gap:10px;min-width:260px;padding:14px;display:flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 8px 24px #00000026}.settings-body label{justify-content:space-between;align-items:center;gap:8px;display:flex}.settings-body label:has(input[type=checkbox]){justify-content:flex-start}.custom-form{flex-direction:column;gap:6px;display:flex}.custom-form label{color:var(--text-muted);margin-top:4px;font-size:.85rem}.custom-form .actions{margin-top:8px}.text-list{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px;margin:0;padding:0;list-style:none;display:grid}.text-list li{flex-direction:column;align-items:flex-start;gap:2px;display:flex}.text-item{text-align:left;flex-direction:column;gap:4px;width:100%;padding:10px 12px;display:flex}.text-item-title{font-weight:600}.text-item-preview{font-family:var(--mono);color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:.78rem;overflow:hidden}.lessons-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.lessons-header p{margin:4px 0 0;font-size:.9rem}.lesson-meter{border-radius:3px;height:6px}.lesson-group{flex-direction:column;gap:8px;display:flex}.lesson-list{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;margin:0;padding:0;list-style:none;display:grid}.lesson-item{text-align:left;align-items:center;gap:10px;width:100%;height:100%;padding:8px 10px;display:flex}.lesson-number{background:var(--surface-2);width:26px;height:26px;color:var(--text-muted);border-radius:50%;flex:none;place-items:center;font-size:.8rem;font-weight:700;display:grid}.lesson-body{flex-direction:column;gap:3px;min-width:0;display:flex}.lesson-keys{flex-wrap:wrap;gap:3px;display:flex}.lesson-keys kbd{padding:0 4px;font-size:.8rem}.lesson-status{color:var(--text-muted);font-size:.75rem}.lesson-item.passed .lesson-number{background:var(--accent);color:var(--accent-ink)}.lesson-item.next{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.lesson-item.next .lesson-number{background:color-mix(in srgb, var(--accent) 18%, var(--surface));color:var(--accent)}.lesson-item.next .lesson-status{color:var(--accent);font-weight:600}.lesson-outcome{border-left:4px solid;border-radius:8px;margin:0;padding:10px 14px}.lesson-outcome.passed{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, var(--surface))}.lesson-outcome.failed{border-color:var(--fixed);background:color-mix(in srgb, var(--fixed) 12%, var(--surface))}.section-intro{margin:4px 0 0;font-size:.9rem}.ngram-groups{flex-direction:column;gap:10px;margin:0;padding:0;list-style:none;display:flex}.ngram-group{grid-template-columns:8.5rem 1fr auto;align-items:center;gap:12px;display:grid}.ngram-chips{flex-wrap:wrap;gap:6px;display:flex}.ngram-chip{min-width:2.6em;font-family:var(--mono);border-bottom-width:3px;padding:3px 8px;font-size:.9rem}.ngram-chip:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}@media (width<=640px){.ngram-group{grid-template-columns:1fr auto}.ngram-chips{grid-area:2/1/auto/-1}}.tag{color:var(--text-muted);border:1px solid var(--border);border-radius:999px;margin-left:4px;padding:0 6px;font-size:.7rem;font-weight:500}.drills{grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px;display:grid}.drills>div{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.key-list,.word-list{flex-wrap:wrap;align-items:center;gap:6px;margin:0;display:flex}.area-stats{grid-template-columns:max-content 1fr max-content;align-items:center;gap:6px 10px;width:100%;margin:0;padding:0;font-size:.9rem;list-style:none;display:grid}.area-stats li{display:contents}.area-bar{background:var(--surface-2);border-radius:4px;height:8px;overflow:hidden}.area-bar span{background:var(--finger,var(--accent));border-radius:4px;height:100%;display:block}.area-value{color:var(--text-muted);font-variant-numeric:tabular-nums;text-align:right}.key-heatmap{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.key-heatmap p{margin:0}.heatmap .key{border-bottom-width:1px;border-color:var(--border);padding:0;font-weight:400}.heatmap button.key{cursor:pointer}.heatmap .key.missed{background:color-mix(in srgb, var(--error) var(--heat), var(--surface))}.heatmap .key.landed{background:color-mix(in srgb, var(--accent) var(--heat), var(--surface))}.heatmap .key.slow{background:color-mix(in srgb, var(--series-1) var(--heat), var(--surface))}.heatmap .key.strong{color:var(--accent-ink)}.heatmap button.key:hover{outline:2px solid var(--accent);outline-offset:1px}.heatmap .key.selected{outline:2px solid var(--text);outline-offset:1px;font-weight:700}.heatmap .key.missed .key-shift,.heatmap .key.landed .key-shift,.heatmap .key.slow .key-shift{color:inherit}.practice{flex-direction:column;gap:12px;display:flex}.practice-bar{flex-wrap:wrap;align-items:center;gap:12px 20px;display:flex}.practice-title{text-overflow:ellipsis;white-space:nowrap;flex:200px;min-width:0;overflow:hidden}.live-stats{color:var(--text-muted);font-variant-numeric:tabular-nums;gap:16px;display:flex}.live-stats strong{color:var(--text);font-size:1.1rem}.timer{align-items:center;gap:6px;display:inline-flex}.timer.paused strong{color:var(--text-muted)}.paused-badge{text-transform:uppercase;letter-spacing:.04em;color:var(--accent);border:1px solid;border-radius:999px;padding:0 7px;font-size:.72rem;font-weight:600}.practice-actions{gap:8px;display:flex}.progress{background:var(--surface-2);border-radius:2px;height:4px;overflow:hidden}.progress-fill{background:var(--accent);height:100%;transition:width .1s linear}.typing-area{background:var(--surface);border:1px solid var(--border);cursor:text;border-radius:10px;max-height:40vh;padding:22px 26px;position:relative;overflow-y:auto}.typing-area:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 25%, transparent);outline:none}.chars{font-family:var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;tab-size:4;font-size:clamp(1.15rem,2.4vw,1.5rem);line-height:1.9}.ch{border-radius:2px}.ch.pending{color:var(--text-muted)}.ch.done{color:var(--text)}.ch.fixed{color:var(--fixed);text-underline-offset:4px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.ch.skipped{color:var(--text-muted);opacity:.4}.ch.in-word.pending{color:var(--text)}.ch.current{background:color-mix(in srgb, var(--accent) 22%, transparent);box-shadow:inset 0 -3px 0 var(--accent);color:var(--text)}.ch.current.wrong{background:var(--error-bg);box-shadow:inset 0 -3px 0 var(--error);color:var(--error);animation:.15s shake}.ch.newline{color:var(--text-muted);opacity:.55}.ch.newline.current{opacity:1}@keyframes shake{25%{left:-2px}75%{left:2px}}.ch.current.wrong{position:relative}.typing-focus-hint{color:var(--text-muted);text-align:center;margin:12px 0 0;font-size:.85rem;display:none}.typing-area:not(:focus) .typing-focus-hint{display:block}.typing-area:not(:focus) .chars{opacity:.6}.guidance{min-height:1.6em;color:var(--text-muted);margin:0}.guidance strong{color:var(--text)}.guides{flex-direction:column;align-items:center;gap:12px;display:flex}.keyboard{-webkit-user-select:none;user-select:none;flex-direction:column;gap:4px;width:100%;max-width:760px;display:flex;position:relative}.hands-overlay{pointer-events:none;mix-blend-mode:multiply;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.ov-palm{fill:var(--text-muted);opacity:.06}.ov-finger line{stroke:var(--finger);stroke-linecap:round}.ov-finger .ov-fill{opacity:.16}.ov-finger .ov-outline{opacity:0}.ov-finger .ov-tip{fill:none;stroke:var(--finger);stroke-width:1.5px;opacity:.5}.ov-finger.active .ov-fill{opacity:.55}.ov-finger.active .ov-outline{opacity:.9}.ov-finger.active .ov-tip{stroke:var(--text);stroke-width:2px;opacity:1}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .hands-overlay{mix-blend-mode:screen}}:root[data-theme=dark] .hands-overlay{mix-blend-mode:screen}.kb-row{gap:4px;display:flex}.kb-row.space-row{justify-content:center}.key{aspect-ratio:auto;border:1px solid var(--border);border-bottom:4px solid var(--finger);background:var(--surface);height:clamp(28px,5.5vw,44px);font-family:var(--mono);color:var(--text);white-space:nowrap;border-radius:6px;flex-direction:column;justify-content:center;align-items:center;font-size:clamp(.6rem,1.6vw,.85rem);line-height:1.1;transition:transform 80ms,background 80ms;display:flex;position:relative;overflow:hidden}.key-shift{color:var(--text-muted);font-size:.8em}.key.home:after{content:"";background:var(--text-muted);border-radius:1px;width:10px;height:2px;position:absolute;bottom:5px}.key.target{background:var(--finger);color:#111;box-shadow:0 0 0 2px var(--surface), 0 0 0 4px var(--finger);font-weight:700;transform:translateY(-2px)}.key.target .key-shift{color:inherit}.key.wrong{outline:2px solid var(--error);outline-offset:1px}.finger-pinky{--finger:var(--finger-pinky)}.finger-ring{--finger:var(--finger-ring)}.finger-middle{--finger:var(--finger-middle)}.finger-index{--finger:var(--finger-index)}.hand-right.finger-index{--finger:var(--finger-index-right)}.finger-thumb{--finger:var(--finger-thumb)}.hands{width:100%;max-width:380px;height:auto}.hands .palm{fill:var(--surface-2);stroke:var(--border)}.hands .finger{fill:color-mix(in srgb, var(--finger) 22%, var(--surface));stroke:var(--finger);stroke-width:1.5px}.hands .finger.active{fill:var(--finger);stroke:var(--text);stroke-width:2.5px}.hands .finger.active.shift{stroke-dasharray:4 3}.finger-legend{color:var(--text-muted);flex-wrap:wrap;justify-content:center;gap:6px 16px;margin:0;padding:0;font-size:.85rem;list-style:none;display:flex}.finger-legend li{align-items:center;gap:6px;display:flex}.swatch{background:var(--finger);border-radius:3px;width:12px;height:12px}.stat-tiles{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin:0;display:grid}.stat-tiles>div{background:var(--surface-2);border-radius:8px;padding:12px 14px}.stat-tiles dt{color:var(--text-muted);font-size:.8rem}.stat-tiles dd{font-variant-numeric:tabular-nums;margin:0;font-size:1.8rem;font-weight:700}.stat-tiles dd small{color:var(--text-muted);font-size:.9rem;font-weight:500}.stat-tiles dd.stat-delta{color:var(--text-muted);font-size:.8rem;font-weight:500}table{border-collapse:collapse;font-variant-numeric:tabular-nums;font-size:.9rem}th,td{text-align:left;border-bottom:1px solid var(--border);padding:6px 14px 6px 0}th{color:var(--text-muted);font-weight:600}.history-chart{flex-direction:column;gap:8px;display:flex}.chart-head{justify-content:space-between;align-items:baseline;display:flex}.chart-grid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px 24px;display:grid}.metric-chart{min-width:0;margin:0}.metric-chart figcaption{margin-bottom:4px;font-size:.85rem;font-weight:600}.chart-wrap{width:100%;position:relative;overflow:hidden}.chart-wrap svg{display:block}.chart-wrap .grid{stroke:var(--grid);stroke-width:1px}.chart-wrap .axis-label{fill:var(--text-muted);font-variant-numeric:tabular-nums;font-size:11px}.chart-wrap .series-line{fill:none;stroke:var(--series-1);stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}.chart-wrap .series-dot{fill:var(--series-1);stroke:var(--surface);stroke-width:2px}.chart-wrap .crosshair{stroke:var(--text-muted);stroke-width:1px;stroke-dasharray:3 3}.chart-wrap .hit-area{fill:#0000}.chart-tooltip{pointer-events:none;background:var(--surface);border:1px solid var(--border);border-radius:6px;width:max-content;padding:6px 10px;font-size:.8rem;position:absolute;box-shadow:0 4px 12px #0000001f}.tip-value{font-size:.95rem;font-weight:700}.tip-muted{color:var(--text-muted)}.table-scroll{max-height:320px;overflow:auto}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}@media (width<=600px){.chars{font-size:1.05rem}.live-stats{gap:10px}}
