: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;text-wrap:balance;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(--font);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 button{font:inherit;color:var(--ink);cursor:pointer;white-space:nowrap;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:8px 6px;margin:18px 0 16px;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:16px auto 0;container-type:inline-size}.practice .keyboard-frame{max-width:clamp(520px,282vh - 1579.2px,800px)}@media (width>=980px) and (height<=760px){.keys-and-hands{justify-content:center;align-items:center;gap:24px;margin-top:16px;display:flex}.practice .keyboard-frame{flex:none;width:clamp(480px,282vh - 1353.6px,700px);max-width:none;margin:0}.practice .hands-frame{flex:0 0 240px;margin:0}}@container (width<=520px){.key:not(.key-modifier) .key-label{font-size:calc(var(--unit) * .5)}.key-shifted,.key-base{font-size:calc(var(--unit) * .32)}}.chart-page .key-modifier[class*=finger-]{background:var(--finger);color:var(--finger-ink)}.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:1.2s 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{opacity:1;stroke:var(--wrong);stroke-width:6px;stroke-dasharray:9 5;animation:1.2s ease-out wrong-finger}.hand-label{fill:var(--muted);font:600 22px var(--font)}.hand-finger[data-drill]{cursor:pointer}.hand-finger[data-drill]:hover,.hand-finger[data-drill]:focus-visible{opacity:1;stroke:var(--ink);stroke-width:3px;outline:none}.hand-finger.is-drilled{opacity:1;stroke:var(--ink);stroke-width:5px}.practice-tips{text-align:center;color:var(--muted);margin:12px 0 0;font-size:.85rem}.touch-notice{background:var(--notice-bg);color:var(--notice-ink);border-radius:12px;margin:12px 0 0;padding:10px 14px;display:none}@media (hover:none) and (pointer:coarse){.touch-notice{display:block}.has-keyboard .touch-notice,.practice-tips{display:none}.has-keyboard .practice-tips{display:block}}.progress{max-width:860px}.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,.guide-article table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}.data-table td{white-space:nowrap}.data-table td.cell-wrap{white-space:normal}.data-table th,.data-table td,.finger-table th,.finger-table td,.key-table th,.key-table td,.guide-article th,.guide-article 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,.guide-article 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)}@media (width<=600px){.chart-axis{font-size:18px}.chart-label{font-size:19px}}.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 0 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}.guide-crumb{color:var(--muted);margin:0;font-size:.9rem}.guide img{border:1px solid var(--line);border-radius:var(--radius);max-width:100%;height:auto;display:block}.guide-contents{padding-left:1.4em}.guide-contents li{margin:.9em 0}.guide-contents a{font-weight:600}.guide-contents span{color:var(--muted);display:block}.guide-pager{grid-template-columns:1fr 1fr;gap:12px;max-width:68ch;margin-top:40px;display:grid}.guide-pager a{border:1px solid var(--line);background:var(--surface);color:var(--ink);border-radius:12px;align-content:start;gap:2px;padding:12px 16px;text-decoration:none;display:grid}.guide-pager a:hover,.guide-pager a:focus-visible{border-color:var(--accent)}.guide-pager span{color:var(--muted);font-size:.85rem}.guide-next{text-align:right;grid-column:2}@media (width<=560px){.guide-pager{grid-template-columns:1fr}.guide-next{text-align:left;grid-column:auto}}.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)}10%{box-shadow:0 0 0 4px var(--wrong);transform:translate(-3px)}20%{transform:translate(3px)}30%{transform:none}75%{box-shadow:0 0 0 4px var(--wrong)}to{box-shadow:0 0 #0000}}@keyframes shake{25%{transform:translate(-2px)}75%{transform:translate(2px)}}@keyframes wrong-finger{0%,75%{stroke-opacity:1}to{stroke-opacity:0}}@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}.site-footer a{padding:8px 0;display:inline-block}.data-table th,.data-table td{padding:.45em .35em}}@media print{:root{--bg:#fff;--surface:#fff;--surface-2:#efefeb;--ink:#1c1f1d;--muted:#5d6661;--line:#dcded9;--kb-case:#fff;--kb-shadow:none;--key-neutral:#e6e8e4;--key-modifier:#1f3a2c;--key-modifier-ink:#dfe9e2;--palm:#e9e6de;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.site-header,.site-footer,.chart-actions,.screen-only,.chart-page .hands-frame{display:none}body{color:#000;background:#fff;font-size:11pt}.chart-page .guide{margin-top:16px}.chart-page .guide h2{margin:1em 0 .4em}.chart-page .finger-table th,.chart-page .finger-table td{padding:.2em .5em}.chart-page .finger-table kbd{margin:1px 1px 1px 0;padding:0 .35em}.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}.mail-chooser{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);width:min(420px,100vw - 32px);color:var(--ink);box-shadow:var(--kb-shadow);padding:0}.mail-chooser::backdrop{background:#00000073}.mail-chooser-body{gap:14px;padding:18px 20px 20px;display:grid}.mail-chooser-head{justify-content:space-between;align-items:center;gap:12px;display:flex}.mail-chooser-head h2{margin:0;font-size:1.2rem}.mail-chooser-close{width:34px;height:34px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:8px;font-size:1.5rem;line-height:1}.mail-chooser-close:hover{background:var(--surface-2);color:var(--ink)}.mail-chooser-to{background:var(--surface-2);border-radius:10px;align-items:center;gap:10px;margin:0;padding:8px 8px 8px 12px;display:flex}.mail-chooser-to span{color:var(--muted);font-size:.9rem}.mail-chooser-to strong{overflow-wrap:anywhere;-webkit-user-select:all;user-select:all;flex:1}.mail-options{gap:8px;display:grid}.mail-option{border:1px solid var(--line);color:var(--ink);border-radius:12px;gap:2px;padding:11px 14px;text-decoration:none;display:grid;position:relative}.mail-option:hover,.mail-option:focus-visible{border-color:var(--accent);background:var(--surface-2)}.mail-option-hint{color:var(--muted);font-size:.88rem}.mail-option[target=_blank]:after{position:absolute;top:11px;right:14px}.intro-row{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:8px 16px;display:flex}.intro{flex:380px}.practice-settings{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}@media (width<=920px){.intro{flex-basis:100%}.practice-settings{justify-content:flex-start}}.labelled-control{flex-wrap:wrap;align-items:center;gap:4px 8px;display:flex}.labelled-control>span{color:var(--muted);font-size:.85rem}.card-bottom{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:4px 16px;display:flex}.hints-control{margin-left:auto}@media (width<=768px){.hints-control{margin-left:0}}.hints-control .segmented button{padding:.25em .6em;font-size:.8rem}[data-state=summary] .hints-control,.segmented.is-unused{display:none}.stage-all,.stage-weak{padding-left:.9em}.stage-weak[data-empty]{color:var(--muted)}.hint strong{white-space:nowrap}[data-mode=time-attack] .typing-text,[data-mode=perfect-run] .typing-text{height:3.3em;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}
