:root{background:#0f0f0f;color:#f5f5f5}*{box-sizing:border-box;margin:0;padding:0}body{min-width:320px;background:#0f0f0f;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:inherit;text-decoration:none}:root{color-scheme:dark;--font-ui: "Figtree", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-mono: "Azeret Mono", monospace;--bg-root: #0f0f0f;--bg-surface: #1a1a1a;--bg-hover: #222222;--b-subtle: rgba(255, 255, 255, .05);--b-normal: rgba(255, 255, 255, .1);--t-primary: #f5f5f5;--t-secondary: #999999;--t-muted: #555555;--t-dim: #333333;--accent: #00d4aa;--accent-dim: rgba(0, 212, 170, .1);--error: #ff6b9d;--error-dim: rgba(255, 107, 157, .1);--error-past: #ffb86c;--error-corrected: #bd93f9;--r-small: 4px;--r-medium: 8px;--ease: .15s ease;font-family:var(--font-ui);font-size:16px;line-height:1.5;color:var(--t-primary);background:var(--bg-root);text-rendering:optimizeLegibility}body{margin:0;padding:0}button,select,input{font:inherit}button{cursor:pointer;border:none;background:none;color:inherit;padding:0}.app-shell{min-height:100dvh;display:flex;flex-direction:column;background:var(--bg-root);overflow-x:hidden}.loading-shell{height:100dvh;display:grid;place-items:center;background:var(--bg-root);font-family:var(--font-mono);color:var(--t-muted)}.workspace{flex:1;display:flex;flex-direction:column;align-items:center;padding:2.25rem 1.5rem 4rem;width:100%;max-width:1000px;margin:0 auto}.typing-container{width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:50vh}.control-stack{display:flex;flex-direction:column;align-items:center;gap:.85rem;margin-bottom:4rem;width:100%}.control-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.45rem;padding:.35rem;border:1px solid var(--b-normal);border-radius:999px;background:linear-gradient(180deg,#ffffff0d,#ffffff05),#ffffff05;box-shadow:inset 0 1px #ffffff08}.control-row--actions{background:linear-gradient(180deg,#ffffff09,#ffffff04),#ffffff04}.practice-surface{position:relative;width:100%;padding:0;outline:none;contain:layout;cursor:text;overflow:hidden}.practice-text-stage{width:100%;min-height:clamp(18rem,42vh,24rem);display:grid;place-items:center;position:relative}.practice-text-layer{width:100%;min-height:inherit;display:grid;place-items:center;position:relative;z-index:1;transition:filter .18s ease,opacity .18s ease,transform .22s ease}.practice-text-layer--blurred{filter:blur(8px);opacity:.32;transform:scale(.985)}.practice-text{width:min(100%,44rem);font-family:var(--font-mono);font-size:2.25rem;line-height:1.6;color:var(--t-dim);-webkit-user-select:none;user-select:none;word-wrap:break-word;text-align:center;max-width:100%;min-height:inherit;transition:color var(--ease);display:flex;flex-wrap:wrap;justify-content:center;align-content:center;column-gap:0;row-gap:.65rem;margin:0 auto}.practice-text__word{display:inline-flex;white-space:pre}.practice-text__char{position:relative;display:inline-block;transition:color .1s ease;min-height:1.2em;vertical-align:baseline}.practice-text__char--done{color:var(--t-primary)}.practice-text__char--current{color:var(--accent)}.practice-text__char--current:after{content:"";position:absolute;bottom:-4px;left:0;width:100%;height:2px;background:var(--accent)}.practice-text__char--error-current{color:var(--error)}.practice-text__char--error-past{color:var(--error-past)}.practice-text__char--error-corrected{color:var(--error-corrected)}.practice-text__char--space{min-width:.6em}.practice-focus-hint{position:absolute;inset:50% auto auto 50%;transform:translate(-50%,-50%);z-index:2;width:min(100%,20rem);text-align:center;pointer-events:none}.practice-focus-hint strong{color:var(--t-secondary);font-size:.95rem;font-weight:500}.live-metrics{display:flex;gap:2rem;margin-bottom:6rem;font-family:var(--font-mono);font-size:.9rem;color:var(--t-muted);justify-content:center}.metric-item{display:flex;align-items:baseline;gap:.4rem}.metric-item span{color:var(--t-muted);font-size:.8rem}.metric-item strong{color:var(--t-secondary);font-weight:500}.metric--met{color:var(--accent)!important}.metric--unmet{color:var(--error)!important}.unlock-progress-container{display:flex;flex-direction:column;align-items:center;gap:1rem;margin-top:6rem;contain:layout}.unlock-progress-strip{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);font-family:var(--font-mono);font-size:.9rem;color:var(--t-muted);align-items:baseline;column-gap:clamp(1.5rem,4vw,3rem);width:min(100%,64rem);min-height:1.75rem}.unlock-progress-strip__core{grid-column:2;display:flex;align-items:baseline;justify-content:center;gap:clamp(1rem,2.4vw,1.9rem)}.unlock-progress-strip .metric-item{min-width:8.75rem;justify-content:center}.unlock-progress-strip__title{position:relative;text-transform:uppercase;letter-spacing:.12em;font-size:.7rem;font-weight:600;font-family:var(--font-ui);color:var(--t-muted);min-height:1em;min-width:17ch;margin-bottom:.2rem}.unlock-progress-strip__title-text{position:absolute;inset:0;white-space:nowrap;text-align:center;opacity:1;transform:translateY(0);transition:opacity .22s ease,transform .28s cubic-bezier(.22,1,.36,1)}.unlock-progress-strip__title-text--hidden{opacity:0;transform:translateY(.35rem)}.unlock-target-chip{min-height:2.45rem;padding:.45rem .95rem;border:1px solid rgba(255,255,255,.02);border-radius:999px;background:transparent;transition:border-color var(--ease),background var(--ease),color var(--ease),transform .2s ease}button.unlock-target-chip:hover,button.unlock-target-chip:focus-visible{outline:none;border-color:#ffffff14;background:#ffffff06;transform:translateY(-1px)}button.unlock-target-chip:focus-visible{border-color:color-mix(in srgb,var(--accent) 28%,rgba(255,255,255,.08))}.unlock-target-chip--editing{border-color:color-mix(in srgb,var(--accent) 35%,rgba(255,255,255,.08));background:#ffffff08}.unlock-target-editor{display:inline-flex;align-items:baseline;gap:.12rem}.unlock-target-editor strong{white-space:nowrap}.unlock-target-editor__input{width:4ch;padding:0;border:none;border-bottom:1px solid color-mix(in srgb,var(--accent) 45%,rgba(255,255,255,.12));background:transparent;color:var(--t-primary);font-family:inherit;font-size:inherit;font-weight:600;line-height:1;text-align:left;outline:none;appearance:textfield}.unlock-target-editor__input::-webkit-outer-spin-button,.unlock-target-editor__input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.unlock-target-editor__input--error{border-bottom-color:color-mix(in srgb,var(--error) 75%,transparent);color:var(--error)}.unlock-target-editor__suffix{color:var(--t-secondary)}.unlock-progress-strip__hint{min-height:.95rem;font-family:var(--font-mono);font-size:.72rem;color:var(--t-secondary);text-align:center}.unlock-progress-strip__hint--error{color:var(--error)}.free-mode-panel{display:flex;align-items:center;gap:1rem;padding:.9rem 1.2rem;border:1px solid var(--b-normal);border-radius:999px;background:#ffffff08;font-family:var(--font-mono);color:var(--t-secondary)}.free-mode-panel__copy{margin:0;color:var(--t-muted);font-size:.76rem}.metric-item--next-letter{grid-column:3;justify-self:end;white-space:nowrap;opacity:1;transform:translateZ(0);filter:blur(0);transition:opacity .18s ease,transform .32s cubic-bezier(.22,1,.36,1),filter .32s cubic-bezier(.22,1,.36,1)}.metric-item--next-letter-hidden{opacity:0;transform:translate3d(.8rem,0,0);filter:blur(4px);pointer-events:none}@media(prefers-reduced-motion:reduce){.practice-text{transition:color var(--ease)}.practice-surface,.practice-text-layer,.unlock-progress-strip__core,.unlock-progress-strip__title-text,.metric-item--next-letter,.unlock-target-chip{transition:none}}@media(max-width:760px){.unlock-progress-strip{grid-template-columns:1fr;row-gap:.8rem;justify-items:center}.unlock-progress-strip__core{grid-column:auto;flex-wrap:wrap;gap:.75rem}.metric-item--next-letter{grid-column:auto;justify-self:center}.free-mode-panel{flex-direction:column;align-items:flex-start;border-radius:1rem}}@supports (view-transition-name: none){.practice-surface{view-transition-name:practice-surface}.unlock-progress-container{view-transition-name:progress-strip}::view-transition-old(practice-surface),::view-transition-new(practice-surface),::view-transition-old(progress-strip),::view-transition-new(progress-strip){animation-duration:.42s;animation-timing-function:cubic-bezier(.22,1,.36,1)}::view-transition-old(practice-surface),::view-transition-old(progress-strip){animation-name:content-fade-out}::view-transition-new(practice-surface),::view-transition-new(progress-strip){animation-name:content-fade-in}@keyframes content-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-.4rem)}}@keyframes content-fade-in{0%{opacity:0;transform:translateY(.65rem)}to{opacity:1;transform:translateY(0)}}}.secondary-info{width:100%;margin-top:8rem;display:flex;flex-direction:column;align-items:stretch;gap:4rem;border-top:1px solid var(--b-subtle);padding-top:6rem}.info-section-title{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--t-muted);margin-bottom:2rem}.progress-section{display:flex;flex-direction:column;gap:3rem}.unlock-bars{display:grid;gap:1.5rem}.progress-meter{display:grid;gap:.5rem}.progress-meter__header{display:flex;align-items:baseline;flex-wrap:wrap;gap:.5rem 1rem;justify-content:space-between;font-size:.8rem;color:var(--t-secondary)}.progress-meter__text{font-family:var(--font-mono);color:var(--t-muted)}.progress-meter__track{height:2px;background:var(--b-subtle);border-radius:1px;overflow:hidden}.progress-meter__value{height:100%;background:var(--accent);transition:width .3s ease}.sessions-list{display:flex;flex-direction:column;gap:.7rem}.sessions-group{width:min(100%,52rem);margin:0 auto}.session-row{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1.25rem;align-items:center;padding:1rem 1.1rem;border-radius:.85rem;background:#ffffff04;font-size:.85rem;color:var(--t-secondary);transition:background var(--ease),transform var(--ease)}.session-row:hover{background:#ffffff07}.session-row__cell{min-width:0;font-variant-numeric:tabular-nums;white-space:nowrap}.session-row__mode,.session-row__detail,.session-row__stat,.session-row__time{text-align:left}.session-row__mode{color:var(--t-primary);font-weight:500}.session-row__detail{color:var(--t-primary);font-family:var(--font-mono)}.session-row__stat{color:#b3b3b3}.session-row__time{color:#8b8b8b}.session-row--empty{color:var(--t-muted);font-size:.85rem;padding:1rem 0}@media(max-width:760px){.session-row{grid-template-columns:repeat(5,minmax(0,1fr));gap:.9rem}}.kbd{display:flex;flex-direction:column;align-items:center;gap:3rem;width:100%;margin:0 auto;padding:4rem 0}.kbd__board{display:flex;flex-direction:column;align-items:center;gap:1rem}.kbd__row{display:flex;gap:1rem}.kbd__key{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;width:5.4rem;height:5.4rem;border-radius:1.25rem;border:2px solid rgba(255,255,255,.08);background:#1c1c1c;font-family:var(--font-mono);cursor:pointer;-webkit-user-select:none;user-select:none;transition:border-color .15s ease,background .15s ease,transform .15s ease,box-shadow .15s ease}.kbd__key:hover{transform:translateY(-5px);box-shadow:0 10px 30px #0009;border-color:#ffffff4d}.kbd__key:active{transform:translateY(0)}.kbd__letter{font-size:1.8rem;font-weight:800;line-height:1;color:var(--t-muted);transition:color .15s ease}.kbd__key--locked{background:#151515;border-color:#ffffff0d}.kbd__key--locked .kbd__letter{color:#ffffff73}.kbd__key--unlocked{border-color:color-mix(in srgb,var(--accent) 40%,transparent);background:color-mix(in srgb,var(--accent) 12%,#1c1c1c)}.kbd__key--unlocked .kbd__letter{color:color-mix(in srgb,var(--accent) 95%,#fff)}.kbd__key--mastered{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 22%,#1c1c1c);box-shadow:0 0 20px #00d4aa33}.kbd__key--mastered .kbd__letter{color:var(--accent)}.kbd__key--active{border-color:var(--error);box-shadow:0 0 30px #ff6b9d40}.kbd__key--active .kbd__letter{color:var(--error)}.kbd__legend{display:flex;justify-content:center;align-items:center;gap:3rem;margin-top:2rem}.kbd__legend-item{display:inline-flex;align-items:center;gap:.8rem;color:var(--t-muted);font-size:.85rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase}.kbd__legend-item--hint{color:var(--t-dim);text-transform:none;font-size:.7rem;letter-spacing:.04em}.kbd__dot{width:.7rem;height:.7rem;border-radius:50%}.kbd__dot--unlocked{background:var(--accent)}.kbd__dot--active{background:var(--error)}.kbd__dot--locked{background:#ffffff73}@media(max-width:1200px){.kbd__key{width:4.5rem;height:4.5rem;border-radius:1rem}.kbd__letter{font-size:1.5rem}}@media(max-width:800px){.kbd__key{width:3.5rem;height:3.5rem;border-radius:.85rem}.kbd__letter{font-size:1.2rem}}@media(max-width:600px){.kbd__key{width:3rem;height:3rem;border-radius:.7rem}.kbd__letter{font-size:1.1rem}.kbd__legend-item--hint{display:none}}.btn{padding:.4rem .8rem;font-size:.85rem;font-weight:500;border-radius:var(--r-small);transition:all var(--ease);color:var(--t-secondary)}.btn:hover{background:var(--bg-hover);color:var(--t-primary)}.btn--active{color:var(--accent)}.btn--minimal{min-height:2.25rem;padding:.55rem .95rem;border:1px solid transparent;border-radius:999px;background:transparent;line-height:1;letter-spacing:.01em}.btn--minimal:hover{border-color:#ffffff14;background:#ffffff0d;color:var(--t-primary)}.btn--minimal.btn--active{color:#04231c;border-color:color-mix(in srgb,var(--accent) 55%,rgba(255,255,255,.1));background:linear-gradient(180deg,color-mix(in srgb,white 10%,var(--accent)),var(--accent));box-shadow:inset 0 1px #ffffff29}.btn--minimal:focus-visible{outline:none;border-color:color-mix(in srgb,var(--accent) 40%,rgba(255,255,255,.12));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 40%,transparent)}.btn--danger{color:color-mix(in srgb,var(--error) 55%,var(--t-secondary))}.btn--danger:hover,.btn--danger:focus-visible{border-color:color-mix(in srgb,var(--error) 30%,transparent);background:#ff6b9d1a;color:var(--error)}.target-select{display:flex;align-items:center;gap:.55rem;min-height:2.25rem;padding:.2rem .3rem .2rem .75rem;border:1px solid rgba(255,255,255,.08);border-radius:999px;background:#ffffff09;font-size:.78rem;color:var(--t-muted)}.target-select span{font-size:.68rem;letter-spacing:.14em;text-transform:uppercase;color:var(--t-secondary)}.target-select select{min-height:1.9rem;background:#ffffff0a;border:1px solid rgba(255,255,255,.06);border-radius:999px;color:var(--t-primary);padding:.3rem .8rem .3rem .65rem;outline:none}.target-select select:focus{border-color:color-mix(in srgb,var(--accent) 45%,transparent)}.target-select:focus-within{border-color:color-mix(in srgb,var(--accent) 35%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}.ehm{display:flex;flex-direction:column;align-items:center;gap:2.5rem;width:100%}.ehm__header{display:flex;flex-direction:column;align-items:center;gap:.4rem}.ehm__header .info-section-title{margin-bottom:0}.ehm__header-meta{display:flex;align-items:center;gap:.75rem}.ehm__session-count{font-family:var(--font-mono);font-size:.65rem;color:var(--t-dim);letter-spacing:.06em}.ehm__reset-btn{font-family:var(--font-mono);font-size:.6rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--t-dim);background:transparent;border:1px solid rgba(255,255,255,.1);border-radius:.35rem;padding:.18rem .5rem;cursor:pointer;transition:color .15s ease,border-color .15s ease,background .15s ease}.ehm__reset-btn:hover{color:var(--error);border-color:#ff505059;background:#ff505012}.ehm__empty{color:var(--t-muted);font-size:.82rem;font-family:var(--font-mono);padding:3rem 0;text-align:center}.ehm__board{display:flex;flex-direction:column;align-items:flex-start;gap:.5rem}.ehm__row{display:flex;gap:.5rem}.ehm__key{position:relative;display:flex;align-items:center;justify-content:center;width:4.2rem;height:4.2rem;border-radius:.75rem;border:1.5px solid rgba(255,255,255,.06);background:var(--bg-surface);font-family:var(--font-mono);cursor:default;-webkit-user-select:none;user-select:none;overflow:hidden;transition:transform .15s ease,box-shadow .15s ease,border-color .2s ease}.ehm__key:hover,.ehm__key--active{transform:translateY(-2px);box-shadow:0 6px 16px #00000040}.ehm__key--no-data{opacity:.25}.ehm__key--no-data:hover{transform:none;box-shadow:none}.ehm__key--clickable{cursor:pointer}.ehm__key--clickable:active{transform:translateY(-1px);transition-duration:60ms}.ehm__key--confirm-target{border-color:#ff505080!important}.ehm__letter{font-size:1.2rem;font-weight:700;line-height:1;color:var(--t-primary)}.ehm__key--no-data .ehm__letter{color:var(--t-dim);font-weight:600}.ehm__detail-container{min-height:6.5rem;width:min(100%,22rem);display:flex;align-items:flex-start;justify-content:center}.ehm__detail{width:100%;padding:1.1rem 1.3rem;border:1px solid var(--b-normal);border-radius:.85rem;background:var(--bg-surface);font-family:var(--font-mono);animation:ehm-fade-in .12s ease}.ehm__detail--placeholder{border-color:var(--b-subtle);background:transparent;color:var(--t-dim);text-align:center;padding:1.8rem 1.3rem;font-size:.72rem;letter-spacing:.03em}@keyframes ehm-fade-in{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}.ehm__confirm{width:100%;padding:1.1rem 1.3rem;border:1px solid rgba(255,80,80,.3);border-radius:.85rem;background:var(--bg-surface);font-family:var(--font-mono);animation:ehm-fade-in .12s ease;display:flex;align-items:center;justify-content:space-between;gap:1rem}.ehm__confirm-text{font-size:.78rem;color:var(--t-muted);letter-spacing:.02em}.ehm__confirm-actions{display:flex;gap:.5rem;flex-shrink:0}.ehm__confirm-btn{font-family:var(--font-mono);font-size:.68rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;border-radius:.4rem;padding:.3rem .75rem;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.ehm__confirm-btn--yes{background:#ff50501f;border:1px solid rgba(255,80,80,.4);color:var(--error)}.ehm__confirm-btn--yes:hover{background:#ff505038;border-color:#ff5050b3}.ehm__confirm-btn--no{background:transparent;border:1px solid rgba(255,255,255,.1);color:var(--t-dim)}.ehm__confirm-btn--no:hover{background:#ffffff0d;border-color:#fff3;color:var(--t-muted)}.ehm__detail-header{display:flex;align-items:baseline;gap:.5rem;margin-bottom:.85rem}.ehm__detail-letter{font-size:1.15rem;font-weight:800;color:var(--t-primary);line-height:1}.ehm__detail-rate{font-size:.82rem;font-weight:600;color:var(--error);line-height:1}.ehm__detail-summary{color:var(--t-muted);font-size:.68rem;line-height:1;margin-left:auto}.ehm__confusions{display:flex;flex-direction:column;gap:.45rem}.ehm__confusions-label{font-size:.58rem;color:var(--t-dim);text-transform:uppercase;letter-spacing:.12em;font-weight:600;margin-bottom:.1rem}.ehm__confusion-row{display:grid;grid-template-columns:2.4rem 1fr 2.2rem;align-items:center;gap:.7rem;height:1.2rem}.ehm__confusion-key{font-weight:700;font-size:.78rem;color:var(--t-primary)}.ehm__confusion-bar-track{height:3px;background:#ffffff0f;border-radius:2px;overflow:hidden}.ehm__confusion-bar{height:100%;background:var(--error);border-radius:2px;min-width:3px;opacity:.55}.ehm__confusion-count{text-align:right;color:var(--t-muted);font-size:.65rem;font-variant-numeric:tabular-nums}.ehm__legend{display:flex;align-items:center;justify-content:center;gap:1.5rem}.ehm__legend-item{display:flex;align-items:center;gap:.45rem}.ehm__legend-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.ehm__legend-dot--accurate{background:#3cdda7;opacity:.7}.ehm__legend-dot--moderate{background:#e8ab30;opacity:.7}.ehm__legend-dot--error{background:#e6336e;opacity:.7}.ehm__legend-label{font-size:.58rem;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--t-dim)}@media(max-width:1200px){.ehm__key{width:3.6rem;height:3.6rem;border-radius:.65rem}.ehm__letter{font-size:1.05rem}.ehm__row,.ehm__board{gap:.4rem}}@media(max-width:800px){.ehm__key{width:2.8rem;height:2.8rem;border-radius:.5rem}.ehm__letter{font-size:.88rem}.ehm__row,.ehm__board{gap:.3rem}}@media(prefers-reduced-motion:reduce){.ehm__key{transition:none}.ehm__detail{animation:none}}.focus-badge{font-size:.7rem;font-family:var(--font-mono);color:var(--t-muted)}.footer{width:100%;padding:4rem 0 3rem;border-top:1px solid var(--b-subtle);text-align:center;font-family:var(--font-mono);font-size:.72rem;color:var(--t-muted);letter-spacing:.02em}.footer a{color:var(--t-secondary);text-decoration:none;transition:color var(--ease)}.footer a:hover{color:var(--accent)}.footer__separator{margin:0 .6rem;color:var(--t-dim);-webkit-user-select:none;user-select:none}.mobile-overlay{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center;background:var(--bg-root);z-index:9999;font-family:var(--font-mono);font-size:1.5rem;color:var(--t-secondary)}@media(min-width:801px){.mobile-overlay{display:none}}@media(max-width:800px){.secondary-info{gap:4rem}}
