:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#f4f4f1;--surface:#fff;--surface-2:#efefeb;--ink:#1c1f1d;--muted:#5d6661;--done:#a3aaa5;--line:#dcded9;--accent:#17725d;--wrong:#c9354f;--wrong-tint:#fbe3e7;--notice-bg:#fff4d6;--notice-ink:#5a4300;--chart-line:#2b62c4;--heat-color:#c9354f;--kb-case:#fff;--kb-shadow:0 10px 30px #00000014, 0 1px 2px #0000000f;--key-neutral:#e6e8e4;--key-modifier:#1f3a2c;--key-modifier-ink:#dfe9e2;--palm:#e9e6de;--c-left-pinky:#3e8c4f;--c-left-ring:#e39a2c;--c-left-middle:#f2c14e;--c-left-index:#1f8a8a;--c-thumb:#4f86d0;--c-right-index:#8fd19b;--c-right-middle:#f2c14e;--c-right-ring:#e39a2c;--c-right-pinky:#d4506a;--radius:14px;--font:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--mono:ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#121413;--surface:#1b1e1c;--surface-2:#252927;--ink:#e9ece9;--muted:#9aa39d;--done:#5d6661;--line:#2e3430;--accent:#5fc4a6;--wrong:#ef6b84;--wrong-tint:#4a2028;--notice-bg:#3a3016;--notice-ink:#f6e3a8;--chart-line:#5f8ad6;--heat-color:#e05f79;--kb-case:#0d0f0e;--kb-shadow:0 10px 30px #0006;--key-neutral:#2a2f2c;--key-modifier:#26332c;--palm:#2c302d}}.finger-left-pinky{--finger:var(--c-left-pinky);--finger-ink:#fff}.finger-left-ring{--finger:var(--c-left-ring);--finger-ink:#1c1f1d}.finger-left-middle{--finger:var(--c-left-middle);--finger-ink:#1c1f1d}.finger-left-index{--finger:var(--c-left-index);--finger-ink:#fff}.finger-thumb{--finger:var(--c-thumb);--finger-ink:#fff}.finger-right-index{--finger:var(--c-right-index);--finger-ink:#1c1f1d}.finger-right-middle{--finger:var(--c-right-middle);--finger-ink:#1c1f1d}.finger-right-ring{--finger:var(--c-right-ring);--finger-ink:#1c1f1d}.finger-right-pinky{--finger:var(--c-right-pinky);--finger-ink:#fff}*,:before,:after{box-sizing:border-box}[hidden]{display:none!important}body{background:var(--bg);color:var(--ink);font:16px/1.5 var(--font);-webkit-font-smoothing:antialiased;margin:0}a{color:var(--accent)}h1,h2,h3{letter-spacing:-.01em;line-height:1.2}.muted{color:var(--muted)}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.skip-link{background:var(--ink);color:var(--surface);z-index:10;border-radius:8px;padding:8px 12px;position:absolute;top:-48px;left:16px}.skip-link:focus{top:8px}kbd{font:600 .85em/1.2 var(--mono);border:1px solid var(--line);background:var(--surface-2);color:var(--ink);white-space:pre;border-bottom-width:2px;border-radius:6px;padding:.1em .45em}.swatch{background:var(--finger);vertical-align:-.1em;border-radius:4px;width:.9em;height:.9em;margin-right:.4em;display:inline-block}.site-header,main,.site-footer{max-width:1040px;margin:0 auto;padding-left:16px;padding-right:16px}.site-header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;padding-top:12px;padding-bottom:8px;display:flex}.brand{color:var(--ink);align-items:center;gap:8px;font-size:1.05rem;font-weight:800;text-decoration:none;display:inline-flex}.site-nav{flex-wrap:wrap;gap:2px;display:flex}.site-nav a{color:var(--muted);border-radius:10px;padding:.4em .75em;font-size:.95rem;font-weight:600;text-decoration:none}.site-nav a:hover{color:var(--ink)}.site-nav a[aria-current=page]{color:var(--ink);background:var(--surface);box-shadow:0 0 0 1px var(--line)}main{padding-bottom:48px}.site-footer{border-top:1px solid var(--line);color:var(--muted);flex-wrap:wrap;gap:8px 18px;padding-top:20px;padding-bottom:40px;font-size:.9rem;display:flex}.site-footer a{color:var(--muted)}.intro h1{margin:4px 0;font-size:clamp(1.45rem,2.8vw,2rem)}.lede{color:var(--muted);max-width:68ch;margin:0}.button{font:inherit;border:1px solid var(--line);background:var(--surface);color:var(--ink);cursor:pointer;border-radius:10px;align-items:center;gap:.45em;padding:.5em .9em;font-size:.92rem;font-weight:600;text-decoration:none;display:inline-flex}.button:hover{background:var(--surface-2)}.button[aria-pressed=true]{box-shadow:inset 0 0 0 2px var(--ink)}.button-primary{background:var(--ink);border-color:var(--ink);color:var(--surface)}.button-primary:hover{background:var(--ink);opacity:.9}.button-primary kbd{color:inherit;opacity:.8;background:0 0;border-color:currentColor}.button-danger{color:var(--wrong)}button:focus-visible,a:focus-visible{outline:3px solid var(--chart-line);outline-offset:2px}.segmented{border:1px solid var(--line);background:var(--surface);border-radius:12px;align-items:center;gap:2px;padding:3px;display:inline-flex}.segmented-label{color:var(--muted);padding:0 .5em;font-size:.85rem}.segmented button{font:inherit;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:9px;padding:.35em .75em;font-size:.88rem}.segmented button:hover{background:var(--surface-2)}.segmented button[aria-pressed=true]{background:var(--ink);color:var(--surface)}.stages{flex-wrap:wrap;gap:6px;margin:12px 0 8px;display:flex}.stage{font:inherit;border:1px solid var(--line);background:var(--surface);color:var(--ink);cursor:pointer;border-radius:999px;align-items:center;gap:.45em;padding:.3em .8em .3em .35em;font-size:.88rem;font-weight:600;display:inline-flex}.stage:hover{background:var(--surface-2)}.stage-number{background:var(--surface-2);border-radius:50%;place-items:center;width:1.4rem;height:1.4rem;font-size:.72rem;font-weight:700;display:inline-grid}.stage[data-passed] .stage-number{background:var(--accent);color:var(--surface);font-size:0}.stage[data-passed] .stage-number:after{content:"✓";font-size:.75rem}.stage[aria-pressed=true]{background:var(--ink);border-color:var(--ink);color:var(--surface)}.stage[aria-pressed=true] .stage-number{background:var(--surface);color:var(--ink)}.typing-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);outline:none;flex-direction:column;gap:8px;min-height:176px;padding:14px 20px 12px;display:flex}.card-top{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:4px 16px;min-height:1.5em;font-size:.9rem;display:flex}.goal{color:var(--muted);margin:0}.goal strong{color:var(--ink);margin-right:.35em}.goal kbd{font-size:.8em}.stats{color:var(--muted);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:4px 14px;margin:0;display:flex}.stat-value{color:var(--ink);font-weight:700}.typing-text{font-family:var(--mono);white-space:pre-wrap;letter-spacing:.02em;min-height:3.3em;color:var(--ink);font-size:clamp(1.2rem,2.6vw,1.8rem);line-height:1.65;position:relative}.ch{border-radius:4px}.ch.done{color:var(--done)}.ch.done.was-missed{color:var(--wrong);text-underline-offset:.18em;text-decoration:underline;text-decoration-thickness:2px}.ch.current{box-shadow:inset 0 -3px 0 var(--ink)}[data-hint=shown] .ch.current{background:color-mix(in srgb, var(--finger) 38%, transparent);box-shadow:inset 0 -3px 0 var(--finger)}.ch.is-shaking{animation:.3s ease-out shake;background:var(--wrong-tint)!important}.hint{min-height:1.75em;margin:0;line-height:1.75}.hint[data-kind=miss]:before,.hint[data-kind=slip]:before{content:"";background:var(--wrong);vertical-align:.05em;border-radius:50%;width:.6em;height:.6em;margin-right:.45em;display:inline-block}.hint[data-kind=slip]:before{background:var(--c-left-ring)}.hint kbd{margin:0 .1em}.summary{gap:8px;display:grid}[data-state=summary] .hint{display:none}.summary-figures{flex-wrap:wrap;align-items:baseline;gap:4px 24px;display:flex}.figure{color:var(--muted);margin:0}.figure-value{color:var(--ink);font-variant-numeric:tabular-nums;margin-right:.15em;font-size:1.9rem;font-weight:800}.summary-best{color:var(--accent);margin:0;font-weight:700}.summary-verdict{margin:0}.summary-verdict.is-passed{color:var(--accent);font-weight:650}.summary-detail{color:var(--muted);flex-wrap:wrap;gap:2px 18px;margin:0;font-size:.92rem;display:flex}.summary-actions{flex-wrap:wrap;gap:8px;display:flex}.notices{background:var(--notice-bg);color:var(--notice-ink);border-radius:12px;margin-top:8px;padding:10px 14px;font-size:.92rem}.notices p{margin:0}.notices p+p{margin-top:4px}.keyboard-frame{max-width:800px;margin:10px auto 0;container-type:inline-size}.kb{--pad:max(6px, 1.4cqw);--gap:max(3px, .65cqw);--unit:calc((100cqw - 2 * var(--pad) - 14 * var(--gap)) / 15);gap:var(--gap);padding:var(--pad);background:var(--kb-case);border-radius:calc(var(--unit) * .35);box-shadow:var(--kb-shadow);display:grid}.kb-row{gap:var(--gap);display:flex}.key{width:calc(var(--unit) * var(--w) + var(--gap) * (var(--w) - 1));height:var(--unit);border-radius:calc(var(--unit) * .17);background:var(--finger,var(--key-neutral));color:var(--finger-ink,var(--ink));font-weight:750;font-size:calc(var(--unit) * .36);box-shadow:inset 0 calc(var(--unit) * -.07) 0 #0003;-webkit-user-select:none;user-select:none;flex-direction:column;flex:none;justify-content:center;align-items:center;line-height:1;transition:opacity .15s,filter .15s;display:flex;position:relative}.key-shifted,.key-base{font-size:.78em;line-height:1.05}.key-modifier{background:var(--key-modifier);color:var(--key-modifier-ink);font-size:calc(var(--unit) * .25);padding-left:calc(var(--unit) * .18);align-items:flex-start;font-weight:600}.key-modifier.is-next{background:var(--finger);color:var(--finger-ink)}.key-bump{width:24%;height:max(2px, calc(var(--unit) * .05));opacity:.65;background:currentColor;border-radius:2px;position:absolute;bottom:16%}[data-state=typing][data-hint=shown]~.keyboard-frame .key:not(.is-next){opacity:.72;filter:saturate(.85)}.key.is-next{z-index:1;box-shadow:0 0 0 3px var(--kb-case), 0 0 0 6px var(--ink), 0 8px 18px #00000040;animation:1.4s ease-in-out infinite glow;transform:translateY(-2px)scale(1.06)}.key.is-pressed{animation:.14s ease-out press}.key.is-wrong{animation:.45s ease-out wrong-key}.heat .key,.heat .key-modifier{background:var(--key-neutral);color:var(--muted)}.heat .key.has-heat{background:color-mix(in oklab, var(--heat-color) calc(var(--heat) * 100%), var(--key-neutral));color:var(--ink)}.hands-frame{max-width:300px;margin:4px auto 0}.hands{width:100%;height:auto;display:block;overflow:visible}.hand-palm{fill:var(--palm);stroke:var(--line);stroke-width:2px}.hand-finger{fill:var(--finger);transition:opacity .15s}.hand-finger.is-resting{opacity:.22}.hand-finger.is-active{stroke:var(--ink);stroke-width:4px}.hand-finger.is-wrong{fill:var(--wrong);opacity:1;animation:.6s ease-out fade-wrong}.hand-label{fill:var(--muted);font:600 15px var(--font)}.controls{flex-wrap:wrap;justify-content:center;align-items:center;gap:10px 16px;margin:14px 0 0;display:flex}.controls .button kbd{font-size:.8em}.keys-help{color:var(--muted);margin:0;font-size:.85rem}.progress{max-width:860px;margin:0 auto}.view-title{margin:12px 0 4px;font-size:clamp(1.45rem,2.8vw,2rem)}.progress h3{margin:30px 0 10px;font-size:1.1rem}.data-table,.finger-table,.key-table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}.data-table th,.data-table td,.finger-table th,.finger-table td,.key-table th,.key-table td{text-align:left;border-bottom:1px solid var(--line);vertical-align:middle;padding:.5em .6em}.data-table thead th,.finger-table thead th,.key-table thead th{color:var(--muted);font-size:.85rem;font-weight:600}.finger-table td kbd,.key-table kbd{margin:2px 2px 2px 0;display:inline-block}.finger-table th[scope=row]{white-space:nowrap}.chart{position:relative}.chart svg{width:100%;height:auto;display:block}.chart-grid{stroke:var(--line);stroke-width:1px}.chart-axis{fill:var(--muted);font:11px var(--font)}.chart-line{fill:none;stroke:var(--chart-line);stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}.chart-dot{fill:var(--chart-line);stroke:var(--surface);stroke-width:2px}.chart-label{fill:var(--ink);font:600 12px var(--font)}.chart-crosshair{stroke:var(--muted);stroke-width:1px;stroke-dasharray:3 3}.chart-tooltip{background:var(--ink);color:var(--surface);pointer-events:none;white-space:nowrap;border-radius:8px;padding:6px 10px;font-size:.85rem;line-height:1.35;position:absolute;transform:translate(-50%,calc(-100% - 12px))}.chart-tooltip .muted{color:color-mix(in srgb, var(--surface) 72%, transparent)}.progress .keyboard-frame{margin-top:12px}.slip-list{padding-left:1.2em}.slip-list li{margin:4px 0}.backup-actions{flex-wrap:wrap;gap:8px;display:flex}.backup-status{min-height:1.5em}.guide{max-width:760px;margin:64px auto 0}.guide h2{margin:2em 0 .6em;font-size:1.4rem}.guide h3{margin:1.5em 0 .3em;font-size:1.05rem}.guide p,.guide li{max-width:68ch}.steps li{margin:.4em 0}.document{margin-top:24px}.document h1{font-size:clamp(1.45rem,2.8vw,2rem)}.chart-page .intro{margin-top:8px}.chart-actions{flex-wrap:wrap;justify-content:center;gap:10px;margin:18px 0 0;display:flex}@keyframes glow{50%{box-shadow:0 0 0 3px var(--kb-case), 0 0 0 8px var(--ink), 0 10px 22px #00000047}}@keyframes press{50%{transform:translateY(1px)scale(.94)}}@keyframes wrong-key{0%{box-shadow:0 0 0 4px var(--wrong)}25%{box-shadow:0 0 0 4px var(--wrong);transform:translate(-3px)}50%{transform:translate(3px)}to{box-shadow:0 0 #0000}}@keyframes shake{25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes fade-wrong{0%{opacity:1}to{opacity:.22}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}@media (width<=640px){.typing-card{padding:12px 14px}.stage{font-size:.8rem}.card-top{font-size:.82rem}}@media print{.site-header,.site-footer,.chart-actions{display:none}body{color:#000;background:#fff}.kb{box-shadow:none;border:1px solid #ccc}*{-webkit-print-color-adjust:exact;print-color-adjust:exact}}.feedback-form{gap:6px;max-width:560px;margin-top:16px;display:grid}.feedback-form label{margin-top:10px;font-weight:600}.feedback-form textarea,.feedback-form input{font:inherit;color:var(--ink);background:var(--surface);border:1px solid var(--line);box-sizing:border-box;border-radius:10px;width:100%;padding:.6em .75em}.feedback-form textarea{resize:vertical;min-height:9rem}.feedback-form .button{justify-self:start;margin-top:14px}.feedback-form .button:disabled{opacity:.6;cursor:progress}.hp{width:1px;height:1px;position:absolute;left:-10000px;overflow:hidden}.form-status{min-height:1.5em;color:var(--muted)}.lead{font-size:1.15rem;font-weight:600}a[target=_blank]:not([href^=mailto\:]):after{content:" ↗";font-size:.8em}.intro-row{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:8px 16px;display:flex}.mode-row{flex-wrap:wrap;gap:8px;display:flex}.stage-all{padding-left:.9em}.keys-help kbd{font-size:.85em}[data-mode=time-attack] .typing-text{height:4.95em;min-height:0;overflow:hidden}.key.is-on{background:var(--notice-bg);color:var(--notice-ink);box-shadow:0 0 0 2px var(--notice-ink), inset 0 calc(var(--unit) * -.07) 0 #0003}.key.is-held{box-shadow:0 0 0 3px var(--ink), inset 0 calc(var(--unit) * -.07) 0 #0003}.modifier-table{border-collapse:collapse;width:100%;font-size:.92rem}.modifier-table th,.modifier-table td{text-align:left;vertical-align:top;border-bottom:1px solid var(--line);padding:.55em .7em}.modifier-table thead th{color:var(--muted);font-size:.82rem;font-weight:600}
