@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2) format("woff2-variations")}:root{--text-size:16px;font-size:var(--text-size);font-family:JetBrains Mono Variable,monospace;--bg:#f2f2f2;--ink:#444444;--muted:#777777;--ghost:#aaaaaa;--faint:#bbbbbb;--selection:#dddddd;--error:#c84343;--accent:#427cba;background:var(--bg);color:var(--ink);color-scheme:light;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}:root[data-theme=dark]{--bg:#151515;--ink:#bfbfbf;--muted:#999999;--ghost:#666666;--faint:#555555;--selection:#404040;--error:#ed7777;--accent:#82afe0;color-scheme:dark}*{box-sizing:border-box}body{margin:0;min-width:240px;background:var(--bg);transition:background .6s,color .6s}button,input,a{-webkit-tap-highlight-color:transparent}button{font:inherit;color:inherit;cursor:pointer;border:0;background:none;padding:0;transition:color .25s,opacity .25s;touch-action:manipulation}a{color:inherit;text-decoration:none}button:hover{color:var(--ink)}button:focus-visible,a:focus-visible{outline:1px solid var(--muted);outline-offset:4px;border-radius:2px}::selection{background:var(--selection)}.app{min-height:var(--available-height,100svh);display:flex;flex-direction:column;overflow:hidden;padding:0 clamp(24px,5vw,76px);color:var(--ink)}.header{height:100px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.wordmark{font-size:var(--text-size);font-weight:400;letter-spacing:0;display:flex;align-items:center;gap:10px}.wordmark .mark{display:none}.brand-period{color:var(--muted)}.theme-control{display:flex;width:36px;height:36px;align-items:center;justify-content:center;color:var(--muted)}.icon-button{display:inline-flex;width:36px;height:36px;align-items:center;justify-content:center;color:var(--muted)}.text-button{color:var(--muted);font-size:var(--text-size);line-height:24px}.header,.footer{transition:opacity .6s}.is-typing .header,.is-typing .footer{opacity:.5}.header:hover,.header:focus-within,.footer:hover,.footer:focus-within{opacity:1}main{display:flex;flex:1;align-items:center;justify-content:center;min-height:240px}.practice{width:100%;max-width:800px;margin:0 auto;padding:0 0 40px;text-align:left}.session-heading{margin:0 0 26px;font-size:var(--text-size);font-weight:400;color:var(--muted);letter-spacing:0;line-height:1.6;animation:appear .4s both}.typing-area{position:relative;cursor:text}.lane{height:66px;position:relative;overflow:hidden;mask-image:linear-gradient(to right,transparent 0%,#000 var(--left-fade,0px),#000 76%,transparent 100%);-webkit-mask-image:linear-gradient(to right,transparent 0%,#000 var(--left-fade,0px),#000 76%,transparent 100%);transition:opacity .5s}.word-strip{white-space:pre;display:flex;align-items:center;position:absolute;left:0;top:7px;font-family:JetBrains Mono Variable,monospace;font-size:var(--text-size);font-weight:400;letter-spacing:0;line-height:1.45;font-variant-ligatures:none;will-change:transform;text-align:left}.word{display:inline-block;margin-right:1ch;position:relative}.history{display:inline-flex;white-space:pre;color:var(--faint)}.word-space{display:inline-block;width:.8em}.upcoming{color:var(--ghost)}.current-word,.correct{color:var(--ink)}.untyped{color:var(--ghost)}.incorrect,.missed{color:var(--error)}.was-wrong{opacity:.7;text-decoration:line-through;text-decoration-thickness:1px}.extra{color:var(--ink);opacity:.65;text-decoration:underline wavy;text-underline-offset:7px}.caret{position:absolute;top:12%;height:76%;width:1.5px;background:var(--ink);transform:translate(-2px);transition:opacity .3s;pointer-events:none}.caret.resting{animation:blink 1.7s infinite}.typing-input{position:absolute;left:0;top:12px;width:32px;height:42px;opacity:0;font-size:var(--text-size);border:0;padding:0;pointer-events:none;caret-color:transparent}.is-paused .lane{opacity:.65}.is-flowing .caret{animation:breathe 4s ease-in-out infinite}.practice-foot{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-top:22px;min-height:24px}.stats{display:flex;gap:23px;font-size:var(--text-size);color:var(--muted)}.stats b{font-family:JetBrains Mono Variable,monospace;font-weight:400;font-variant-numeric:tabular-nums;color:var(--muted);margin-right:3px}.typing-help{font-size:var(--text-size);color:var(--muted);white-space:nowrap}.typing-help button{color:var(--muted)}.footer{display:flex;align-items:center;justify-content:space-between;gap:20px;height:88px;padding-bottom:env(safe-area-inset-bottom);flex-shrink:0}.local-status{font-size:var(--text-size);color:var(--muted)}.footer-actions{display:flex;align-items:center;gap:8px}.footer-actions .icon-button{width:36px;height:36px}.preloader{position:fixed;inset:0;z-index:10;display:flex;gap:12px;align-items:center;justify-content:center;background:var(--bg);font-size:var(--text-size);font-weight:400;letter-spacing:0;transition:opacity .6s,visibility .6s}.is-loaded .preloader{opacity:0;visibility:hidden;pointer-events:none}.is-loaded .practice{animation:enter .8s both}.toast{position:fixed;bottom:max(90px,env(safe-area-inset-bottom));left:50%;transform:translate(-50%,5px);width:max-content;max-width:calc(100vw - 40px);font-size:var(--text-size);line-height:1.7;text-align:center;padding:8px 14px;background:var(--bg);color:var(--ink);opacity:0;pointer-events:none;transition:opacity .3s,transform .3s;z-index:30}.toast.show{opacity:1;transform:translate(-50%)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.wordmark{transition:color .6s}@keyframes blink{0%,45%,to{opacity:1}65%,85%{opacity:.2}}@keyframes breathe{0%,to{opacity:.55}50%{opacity:1}}@keyframes appear{0%{opacity:0}to{opacity:1}}@keyframes enter{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}@media(max-width:700px){.header{height:80px}.footer{height:76px}.practice{padding-bottom:35px}.word-strip{font-size:var(--text-size);letter-spacing:0}.lane{height:58px}.session-heading{font-size:var(--text-size);margin-bottom:23px}.practice-foot{margin-top:20px;gap:12px}.stats{gap:16px;font-size:var(--text-size)}.typing-help{font-size:var(--text-size)}.footer-actions{gap:3px}.local-status{font-size:var(--text-size)}}@media(max-width:360px){.app{padding:0 20px}.footer-actions{gap:0}.footer-actions .icon-button{width:32px}.stats{gap:12px}}@media(max-height:480px){.header{height:54px}.footer{height:50px}main{min-height:170px}.practice{padding-bottom:12px}.session-heading{margin-bottom:14px}.practice-foot{margin-top:12px}}:root[data-keyboard=open] .header{height:48px}:root[data-keyboard=open] .footer{height:44px}:root[data-keyboard=open] main{min-height:170px}:root[data-keyboard=open] .practice{padding-bottom:10px}:root[data-keyboard=open] .session-heading{margin-bottom:12px}:root[data-keyboard=open] .practice-foot{margin-top:10px}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}}:root[data-motion=off] *{animation:none!important;transition:none!important}[data-character]{display:inline-block;width:1ch;letter-spacing:0}.completed-word .correct{color:var(--muted)}.upcoming .untyped,.suspended-word .untyped{color:var(--ghost)}.is-paused .lane{opacity:1}.is-paused .current-word .correct{color:var(--accent)}.is-paused .caret{background:var(--accent)}button,input{font-family:inherit}.word-strip{font-kerning:none;font-variant-ligatures:none;font-weight:400;letter-spacing:0;line-height:1.5}.word{flex-shrink:0}[data-character]{vertical-align:baseline;font:inherit;width:1ch;line-height:inherit;letter-spacing:0}.icon-control{position:relative;display:inline-flex}.icon-tooltip{position:absolute;bottom:calc(100% + 10px);right:0;width:max-content;max-width:min(180px,calc(100vw - 40px));padding:7px 9px;font-size:var(--text-size);font-weight:400;line-height:1.6;color:var(--ink);background:var(--bg);opacity:0;visibility:hidden;transform:translateY(5px);pointer-events:none;transition:opacity .18s ease,transform .18s ease,visibility .18s;z-index:5}.tooltip-below .icon-tooltip{bottom:auto;top:calc(100% + 6px)}.icon-control:focus-within .icon-tooltip{opacity:1;visibility:visible;transform:translateY(0)}@media(hover:hover){.icon-control:hover .icon-tooltip{opacity:1;visibility:visible;transform:translateY(0)}}@media(max-width:320px){.app{padding:0 14px}.footer{gap:5px}.footer-actions .icon-button{width:30px}.stats{gap:10px;font-size:var(--text-size)}.typing-help,.word-strip{font-size:var(--text-size)}.icon-tooltip{max-width:140px}.footer-actions{gap:0}.footer-actions .text-button{font-size:var(--text-size)}}@media(max-height:360px){.header{height:42px}.footer{height:40px}main{min-height:130px}.practice{padding:0}.session-heading{margin-bottom:8px}.practice-foot{margin-top:6px}}.practice-foot{flex-wrap:wrap;row-gap:12px}.footer{height:auto;min-height:88px;flex-wrap:wrap;padding-top:12px;padding-bottom:max(12px,env(safe-area-inset-bottom))}.footer-actions{flex-wrap:wrap}.icon-tooltip{max-width:min(240px,calc(100vw - 40px))}.word-strip{top:7px}.lane{height:42px}@media(max-width:520px){.footer{min-height:104px;gap:8px;align-content:center}.footer-actions{margin-left:auto}.practice-foot{align-items:flex-start}.stats{gap:14px}.icon-tooltip{max-width:170px}}@media(max-height:480px){.footer{min-height:56px;padding-top:6px;padding-bottom:6px}.practice{padding-bottom:8px}.session-heading{margin-bottom:10px}}:root{--text-size:16px}.practice{max-width:720px;padding-bottom:20px}.session-heading{text-align:center;margin:20px 0 38px;min-height:1.6em}.score-counter{display:flex;justify-content:center;align-items:center;gap:1ch;font-size:inherit;line-height:1.5;color:var(--ink)}.score-counter>span:last-child{color:var(--muted)}.practice-foot{justify-content:center;gap:24px;margin-top:30px}.typing-help{flex-basis:100%;text-align:center;min-height:1.5em}.stats{justify-content:center;align-items:center;gap:3ch}.stats>span,.stats b{display:inline-flex;align-items:center;gap:.35ch}.stats b{font-weight:400;margin:0}.copyright{font-size:inherit;line-height:1.5;color:var(--muted);white-space:nowrap}.footer{align-content:center;gap:12px}.rolling-number{display:inline-block;position:relative;height:1.5em;line-height:1.5;font-size:inherit;font-weight:400;font-variant-numeric:tabular-nums;vertical-align:middle;transition:width .4s cubic-bezier(.2,.8,.2,1);isolation:isolate}.number-column{position:absolute;top:0;height:1.5em;width:1ch;overflow:hidden;opacity:1;transition:opacity .2s;mask-image:linear-gradient(transparent,#000 12%,#000 88%,transparent)}.number-reel{display:flex;flex-direction:column;will-change:transform}.number-reel>span{display:block;height:1.5em;line-height:1.5;flex-shrink:0}.number-dash{position:absolute;inset:0;opacity:1;transition:opacity .2s}.number-column.hidden,.number-dash.hidden{opacity:0}.icon-tooltip{line-height:1.5}.footer-actions{justify-content:flex-end}.typing-help button{font-size:inherit}@media(max-width:520px){.header{height:64px}.footer{justify-content:center;min-height:100px}.footer-actions{margin-left:0}.copyright{flex-basis:100%;text-align:center}.practice{padding-bottom:12px}.session-heading{margin:18px 0 26px}.practice-foot{margin-top:22px;gap:18px}.stats{gap:2ch}}@media(max-height:480px){.header{height:42px}.footer{min-height:48px}.practice{padding-bottom:0}.session-heading{margin:8px 0 10px}.practice-foot{margin-top:10px;gap:8px}.copyright,.typing-help{flex-basis:auto}.stats{gap:2ch}main{min-height:180px}}@media(max-width:300px){.stats{gap:1ch}.footer{min-height:96px}.icon-tooltip{max-width:150px}}:root[data-keyboard=open] .session-heading{margin:8px 0 12px}:root[data-keyboard=open] .practice-foot{margin-top:10px;gap:8px}:root[data-keyboard=open] .footer{height:auto;min-height:70px}.recovery{min-height:100svh;flex-direction:column;gap:20px;padding:24px;text-align:center}.recovery p{margin:0;font:inherit}.stats>span{gap:1ch}.stats b{gap:0}.number-column{animation:appear .2s}.lane{mask-image:linear-gradient(to right,transparent 0%,#000 var(--left-fade,0px),#000 76%,transparent 100%);-webkit-mask-image:linear-gradient(to right,transparent 0%,#000 var(--left-fade,0px),#000 76%,transparent 100%)}.word-strip{--typed:var(--ink);--pending:var(--ghost);--past:var(--ghost)}@property --typed{syntax:"<color>";inherits:true;initial-value:#bfbfbf}@property --pending{syntax:"<color>";inherits:true;initial-value:#666666}@property --past{syntax:"<color>";inherits:true;initial-value:#999999}.word-strip{transition:--typed 1.2s ease,--pending 1.2s ease,--past 1.2s ease}.is-flowing .word-strip{--typed:var(--accent);--pending:var(--accent);--past:var(--accent)}.word-strip .correct{color:var(--typed)}.word-strip .untyped,.word-strip .upcoming .untyped,.word-strip .suspended-word .untyped{color:var(--pending)}.word-strip .completed-word .correct{color:var(--past)}.word-strip .incorrect,.word-strip .missed{color:var(--error)}.resume-word{animation:resume-arrive .6s ease-out;overflow:hidden}.resume-word [data-character]{transition:opacity .1s}.caret.revealing{opacity:0;animation:none}.icon-button svg,.theme-control svg{width:1em;height:1em}.stats{flex-wrap:wrap;row-gap:12px}.stats>span{white-space:nowrap}@keyframes resume-arrive{0%{width:0;opacity:0}to{width:6ch;opacity:1}}@media(max-width:520px){.stats{column-gap:2ch}.stats>span:last-child{justify-content:center}.practice-foot{row-gap:16px}}@media(prefers-reduced-motion:reduce){.resume-word{animation:none}.word-strip{transition:none}}.caret{transition:opacity .3s,background 1.2s}.is-flowing .caret{background:var(--accent)}.app{--brand-x:clamp(24px,5vw,76px);--brand-y:50px}.wordmark{position:fixed;z-index:10;left:var(--brand-x);top:var(--brand-y);transform:translate3d(calc(50vw - var(--brand-x) - 50%),calc(50dvh - var(--brand-y) - 50%),0);transition:transform .8s cubic-bezier(.22,1,.36,1);will-change:transform;min-height:1.5em;white-space:pre}.intro-cursor{display:inline-block;height:1em;border-right:1px solid var(--muted);margin-left:2px;vertical-align:-.12em;animation:blink 1.4s infinite;transition:opacity .4s}.is-loaded .wordmark{transform:translate3d(0,-50%,0)}.is-loaded .intro-cursor{opacity:0;animation:none}.app:not(.is-loaded) main,.app:not(.is-loaded) .footer,.app:not(.is-loaded) .header-right{opacity:0;visibility:hidden;pointer-events:none}main,.header-right{transition:opacity .65s .35s,visibility .65s}.header{justify-content:flex-end}.app:not(.is-loaded) .session-heading{animation:none}.footer-actions .icon-button,.theme-control,.icon-button{width:auto;min-height:36px;padding:0 .3ch}.footer-actions{gap:2ch}.stats{gap:2ch;align-items:flex-start;flex-wrap:nowrap}.stat-pair{display:flex;flex-direction:column;gap:.3em}.stat-pair>span{display:flex;align-items:center;justify-content:center;gap:1ch;white-space:nowrap}.stat-pair .personal-best{color:var(--ghost)}.personal-best b{color:inherit}.stats .stat-divider{color:var(--ghost);padding-top:.15em}.stats b{display:inline-flex;align-items:center;gap:0}.practice-foot{gap:20px}.stats{line-height:1.5}@media(max-width:700px){.app{--brand-y:40px}}@media(max-width:520px){.app{--brand-y:32px}.stats{gap:1ch}.practice-foot{row-gap:16px}}@media(max-width:360px){.app{--brand-x:20px}}@media(max-width:320px){.app{--brand-x:14px}.stats{gap:.5ch}.stat-pair>span{gap:.5ch}}@media(max-height:480px){.app{--brand-y:21px}.practice-foot{gap:8px}}:root[data-keyboard=open] .app{--brand-y:24px}.theme-text{display:inline-block;width:6ch;text-align:right;white-space:pre}@property --left-fade{syntax:"<length>";inherits:false;initial-value:0px}.lane{transition:opacity .5s,--left-fade .22s ease-out}.wordmark{cursor:text;user-select:text;-webkit-user-select:text}.intro-cursor{user-select:none;-webkit-user-select:none;pointer-events:none}.app:not(.is-loaded) .wordmark{user-select:none;-webkit-user-select:none}.copyright{white-space:normal}@media(max-width:520px){.stats{flex-wrap:wrap}.flow-stat{flex-basis:100%}.stats>.flow-divider{display:none}}.intro-word:not(.font-ready){visibility:hidden}.word-strip .completed-word [data-character]{transition:color .35s ease-out}.score-counter{margin-bottom:38px}@media(max-width:520px){.score-counter{margin-bottom:26px}}@media(max-height:480px){.score-counter{margin-bottom:10px}}:root[data-keyboard=open] .score-counter{margin-bottom:12px}
