:root{--bg:#f5f7fb;--surface:#fff;--surface2:#f9fafc;--ink:#172036;--muted:#7b8497;--line:#e6eaf1;--brand:#465ed4;--brand-dark:#3249bc;--brand-soft:#eef0ff;--green:#15865c;--red:#df5c61;--shadow:0 12px 35px rgba(27,39,74,.035);font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",Arial,sans-serif;color-scheme:light}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font-size:14px;-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit}button{cursor:pointer}button:disabled{opacity:.45;cursor:not-allowed}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:3px solid #8898ff;outline-offset:2px}a{color:inherit;text-decoration:none}h1,h2,h3,p{margin:0}h1,h2,h3{letter-spacing:-.035em}small{font-size:11px}.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}.skip-link{position:fixed;left:8px;top:-80px;z-index:99;background:var(--brand);color:#fff;padding:10px;border-radius:8px}.skip-link:focus{top:8px}[hidden]{display:none!important}.shell{max-width:1850px;min-height:100vh;margin:auto;display:flex;flex-direction:column}.topbar{min-height:76px;display:flex;align-items:center;padding:12px 30px;gap:16px;background:#fff;border-bottom:1px solid var(--line)}.brand{display:flex;gap:10px;align-items:center;font-size:18px;letter-spacing:-.7px}.brandmark{background:#1d2b55;color:#fff;width:32px;height:32px;border-radius:10px;display:grid;place-items:center;font-weight:900;font-size:16px}.top-divider{height:22px;border-left:1px solid #e3e6ec}.app-name{font-weight:700;font-size:15px;letter-spacing:-.4px}.app-name span{font-weight:400;color:var(--muted)}.local-pill{font-size:11px;color:#56716d;margin-left:8px;display:flex;align-items:center;gap:5px}.local-pill svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.header-actions{margin-left:auto;display:flex;align-items:center;gap:8px}.btn{border:1px solid var(--line);background:#fff;border-radius:10px;padding:10px 15px;font-size:12px;font-weight:650;min-height:37px;color:var(--ink);transition:.15s}.btn:hover:not(:disabled){border-color:#aeb9e9;background:#f5f6ff}.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 5px 10px rgba(67,86,204,.12)}.btn.primary:hover:not(:disabled){background:var(--brand-dark)}.btn.subtle{border-color:transparent;background:0 0;color:#58647a}.btn.mini{padding:7px 9px;min-height:30px}.workspace{flex:1;display:grid;grid-template-columns:minmax(230px,278px) minmax(450px,1fr) minmax(245px,298px);align-items:stretch}.panel{background:#fff}.sidebar{border-right:1px solid var(--line);display:flex;flex-direction:column;min-width:0}.sidebar-head{padding:32px 25px 27px;border-bottom:1px solid var(--line)}.eyebrow{display:block;font-size:10px;letter-spacing:1.5px;color:#8c95a8;font-weight:800;margin-bottom:11px}.sidebar-head h1{font-size:25px;line-height:1.17;font-weight:780;max-width:230px}.sidebar-head p{font-size:12px;color:var(--muted);line-height:1.7;margin-top:10px}.sidebar-body{padding:24px 23px;flex:1}.setting-section{margin-bottom:29px}.setting-label,.setting-section h2{display:block;font-size:12px;font-weight:800;margin-bottom:13px;letter-spacing:-.01em}.mode-list{display:grid;gap:7px}.mode-btn{border:1px solid transparent;border-radius:12px;background:0 0;display:flex;align-items:center;text-align:left;gap:12px;padding:10px 11px;color:#3d4860;width:100%}.mode-btn:hover{background:#f7f8fc}.mode-btn.active{border-color:#d6dafe;background:#f0f1ff;color:#3446a7}.mode-btn strong{display:block;font-size:12px}.mode-btn small{display:block;margin-top:3px;color:#8b93a4;font-weight:450}.mode-icon{height:32px;width:32px;flex:0 0 32px;display:grid;place-items:center;background:#fff;border:1px solid #eceef3;border-radius:10px;font-size:17px;font-weight:600}.chip-group{display:flex;gap:6px;flex-wrap:wrap}.chip{border:1px solid #e7e9ef;background:#fff;border-radius:9px;padding:9px 11px;font-size:12px;color:#707c90;font-weight:700;min-width:46px}.chip.active{background:var(--brand-soft);border-color:#aebaff;color:#3348b5}.toggle-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 0;font-size:12px;font-weight:650}.toggle-row small{display:block;color:#939bae;font-weight:400;margin-top:4px}.toggle-row input{appearance:none;width:34px;height:20px;background:#e5e8ef;border-radius:15px;position:relative;flex:0 0 auto;cursor:pointer}.toggle-row input:before{content:"";position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #aeb4c0;transition:transform .15s}.toggle-row input:checked{background:var(--brand)}.toggle-row input:checked:before{transform:translateX(14px)}.sidebar select{width:100%;padding:10px;border:1px solid var(--line);border-radius:9px;color:var(--ink);background:#fff}.setting-hint{margin-top:10px;font-size:11px;color:var(--muted);line-height:1.55}.side-buttons{display:flex;gap:6px;margin-top:9px}.sidebar-footer{margin-top:auto;padding:21px 23px;border-top:1px solid var(--line);background:#fbfcfe;font-size:11px}.sidebar-footer strong{font-size:12px}.sidebar-footer p{margin-top:8px;color:var(--muted);line-height:1.7}.privacy-dot{background:#25a879;display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px}.practice-main{min-width:0;padding:33px clamp(20px,3.2vw,52px) 45px}.hero-card{background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:25px 28px 22px;box-shadow:var(--shadow)}.hero-top{display:flex;align-items:flex-start;justify-content:space-between;gap:20px}.hero-card h2{font-size:25px;letter-spacing:-.9px}.hero-card p{color:var(--muted);font-size:12px;line-height:1.65;margin-top:7px;max-width:475px}.session-tag{border-radius:999px;padding:7px 10px;background:#f2f4f8;color:#7c8491;font-weight:650;white-space:nowrap;font-size:10px}.session-tag.running{background:#e2f7ea;color:#147b58}.session-tag.paused{background:#fff1d9;color:#986315}.metrics-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:30px}.metric{padding:0 18px;border-left:1px solid var(--line)}.metric:first-child{padding-left:0;border:0}.metric>span{color:#8a94a7;font-weight:650;font-size:11px}.metric div{display:flex;align-items:baseline;gap:5px;margin-top:8px}.metric strong{font-size:32px;letter-spacing:-1.8px;font-variant-numeric:tabular-nums;line-height:1.12}.metric small{color:#8891a3;font-size:11px;font-weight:650}.progress-rail{background:#ecf0fb;height:5px;border-radius:10px;overflow:hidden;margin-top:25px}.progress-rail>span{display:block;width:0%;height:100%;background:var(--brand);transition:width .18s}.typing-card{position:relative;margin-top:19px;background:#fff;border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow);padding:25px 28px 21px}.typing-header{display:flex;justify-content:space-between;align-items:center;gap:15px}.typing-header .eyebrow{margin:0 0 6px}.subtle-text{font-size:11px;color:var(--muted)}.toolbar-actions{display:flex;gap:6px}.icon-button{border:1px solid var(--line);background:#fff;border-radius:9px;width:34px;height:34px;display:grid;place-items:center;font-size:18px;color:#64738b}.icon-button:hover:not(:disabled){background:var(--brand-soft)}.passage{height:174px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",monospace;font-size:19px;line-height:2.05;letter-spacing:.15px;color:#9199a6;padding:16px 4px;margin:13px 0 12px;scrollbar-color:#e2e6ef transparent;scrollbar-width:thin}.char{white-space:pre-wrap;border-radius:2px}.char.correct{color:#258964;background:#e7f7ec}.char.wrong{color:#c93f49;background:#ffe6e6;text-decoration:underline wavy #cf5460;text-underline-offset:3px}.char.cursor{position:relative;background:#e9ecff;border-bottom:2px solid #5266d9;color:#344bc0}.input-label{display:block;margin-bottom:9px;color:#53617a;font-size:12px;font-weight:700}.typing-input{display:block;width:100%;min-height:102px;border:1.5px solid #dfe4ee;resize:vertical;border-radius:12px;background:#fcfdff;padding:16px;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:15px;line-height:1.6;color:var(--ink);caret-color:var(--brand)}.typing-input:focus{border-color:#8996ec;outline:3px solid #e8ebff}.typing-input:disabled{opacity:.75;background:#f6f7fa}.typing-input::placeholder{color:#a3abb9}.typing-bottom{display:flex;justify-content:space-between;gap:16px;margin-top:12px;font-size:11px;color:#9aa2b1}.typing-bottom #characterCount{white-space:nowrap}.pause-overlay{position:absolute;inset:0;border-radius:15px;background:rgba(250,251,255,.94);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:3;text-align:center;gap:12px;padding:20px}.pause-overlay strong{font-size:21px}.pause-overlay p{color:var(--muted);font-size:12px}.keyboard-card{margin-top:19px;background:#fff;border:1px solid var(--line);border-radius:16px;padding:23px 28px 18px;box-shadow:var(--shadow)}.section-heading{display:flex;justify-content:space-between;align-items:center;gap:10px}.section-heading h2{font-size:16px}.section-heading p{margin-top:5px;color:var(--muted);font-size:11px}.key-guide-pill{background:#f2f4fe;border:1px solid #e1e6ff;color:#6672b8;font-size:11px;padding:7px 10px;border-radius:99px;white-space:nowrap}.key-guide-pill strong{color:#2e3fb7;font-size:13px}.keyboard{max-width:655px;margin:25px auto 8px;display:grid;gap:7px}.kb-row{display:flex;justify-content:center;gap:6px}.key{border:1px solid #e4e8ef;border-bottom:3px solid #e5e9f1;background:#f9fafc;border-radius:7px;display:grid;place-items:center;min-width:0;flex:1;max-width:54px;height:37px;font-size:11px;color:#65718a;transition:background .1s}.key.left-key{background:#f4f5ff}.key.right-key{background:#f5f9ff}.key.space-key{flex:6;max-width:300px}.key.active{background:#d6deff;border-color:#8a9be9;color:#293ca4;font-weight:900;box-shadow:0 0 0 3px #edf0ff}.finger-legend{display:flex;justify-content:center;flex-wrap:wrap;gap:16px;font-size:10px;color:#929bae}.finger-legend span{display:flex;align-items:center;gap:5px}.finger-legend i{display:inline-block;width:9px;height:9px;border-radius:3px}.finger.left{background:#b8bdf3}.finger.right{background:#b5d5f5}.finger.center{background:#cbd2de}.result-card{margin-top:18px;background:#f9faff;border:1px solid #d6ddfe;padding:23px;border-radius:16px}.result-card h2{font-size:20px}.result-card p{font-size:12px;color:var(--muted);margin-top:6px}.result-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:19px 0}.result-grid div{border-radius:9px;background:#fff;padding:13px;min-width:0}.result-grid strong{font-size:20px;display:block}.result-grid small{display:block;color:#8d98aa;margin-top:4px}.mobile-analytics{display:none}.analytics{border-left:1px solid var(--line);display:flex;flex-direction:column;min-width:0}.analytics-head{padding:30px 24px 23px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:10px}.analytics-head h2{font-size:19px}.analytics-head .eyebrow{margin-bottom:6px}.analytics-chip{font-size:10px;background:#f4f5ff;color:#6571be;border-radius:99px;white-space:nowrap;align-self:center;padding:7px 8px;font-weight:650}.analytics-scroll{padding:23px 24px;flex:1}.summary-tiles{display:grid;grid-template-columns:1fr 1fr;gap:9px}.summary-tile{border:1px solid var(--line);padding:13px 11px;border-radius:12px;min-width:0}.summary-tile>span{display:block;color:#8c94a4;font-size:10px}.summary-tile strong{display:inline-block;font-size:25px;margin-top:11px;letter-spacing:-1px;font-variant-numeric:tabular-nums}.summary-tile small{margin-left:4px;color:#a1a7b5}.analytics-block{padding:24px 0;border-bottom:1px solid var(--line)}.analytics-block-title{display:flex;align-items:center;justify-content:space-between;gap:6px}.analytics-block h3{font-size:13px}.analytics-block-title span,.text-button{font-size:10px;color:#96a0b0}.text-button{background:0 0;border:0;color:var(--brand);font-weight:750;padding:4px}.chart-container{height:142px;margin-top:18px;display:flex;align-items:center;justify-content:center}.chart-container svg{width:100%;height:100%;overflow:visible}.empty-chart{font-size:11px;line-height:1.7;text-align:center;color:#a0a8b6;max-width:190px}.mistake-list,.recent-history{margin-top:14px;display:grid;gap:10px}.muted{color:#98a1b0;font-size:11px;line-height:1.6}.mistake-row{display:flex;align-items:center;gap:9px;font-size:11px}.mistake-row kbd{display:grid;place-items:center;background:#f4f5fa;border:1px solid #e8ebf3;border-radius:6px;padding:4px 6px;min-width:36px}.mistake-row .bar{height:5px;background:#f1f2f8;flex:1;border-radius:7px;overflow:hidden}.mistake-row .bar>i{background:#dc8992;display:block;height:100%}.history-row{display:flex;align-items:center;gap:12px}.history-row strong{font-size:13px}.history-row small{font-size:10px;color:#9fa7b5}.history-row .history-date{margin-left:auto;text-align:right}.data-block h3{font-size:13px}.data-block p{font-size:11px;color:#939caf;line-height:1.65;margin-top:9px}.data-buttons{display:flex;gap:7px;flex-wrap:wrap;margin-top:12px}.data-buttons .btn{font-size:11px;padding:7px 9px}.storage-status{color:#16805a!important}.storage-status.warning{color:#b65320!important}.footer{padding:18px 30px;border-top:1px solid var(--line);display:flex;gap:10px;justify-content:space-between;color:#919bac;font-size:11px}.modal{border:1px solid #e1e5ef;border-radius:16px;box-shadow:0 25px 90px rgba(22,31,60,.23);padding:25px;width:min(95vw,520px);max-height:min(90vh,850px);color:var(--ink)}.modal.wide{width:min(95vw,700px)}.modal::backdrop{background:rgba(31,40,72,.46)}.modal-top{display:flex;justify-content:space-between;align-items:center;gap:15px}.modal h2{font-size:21px}.modal p{font-size:12px;color:#778197;line-height:1.65;margin:13px 0 18px}.modal label{display:block;font-weight:700;font-size:12px;margin:15px 0 7px}.modal input,.modal textarea{display:block;width:100%;padding:12px;border:1px solid #dfe4ec;border-radius:10px;resize:vertical}.modal-bottom{margin-top:18px;display:flex;justify-content:flex-end;gap:8px}.modal-close{background:#f2f4f9;border:0;width:30px;height:30px;border-radius:8px;color:#65718a;font-size:20px}.history-table-wrap{max-height:52vh;overflow:auto}.history-table{width:100%;border-collapse:collapse;font-size:12px;text-align:left}.history-table td,.history-table th{border-bottom:1px solid #edf0f5;padding:10px 8px}.history-table th{position:sticky;top:0;background:#fff;font-size:11px;color:#808a9b}.guide-content{max-height:58vh;overflow:auto}.guide-content h3{font-size:13px;margin-top:14px}.guide-content p{margin-top:6px;margin-bottom:12px}.guide-content kbd{border:1px solid #d6dbe6;background:#f5f6fa;border-radius:4px;padding:1px 4px;font-size:11px}.toast{position:fixed;bottom:18px;left:50%;transform:translateX(-50%);background:#1c2b4c;color:#fff;border-radius:10px;padding:12px 17px;box-shadow:0 14px 35px #1d264352;z-index:100;max-width:min(440px,90vw);text-align:center;font-size:12px}.contrast-mode{--muted:#536079;--line:#bac3d5}.contrast-mode .char.correct{color:#045f37;background:#cbf1da}.contrast-mode .char.wrong{color:#9a0b1d;background:#ffd2d5}.contrast-mode .passage{color:#50607b}@media(max-width:1400px){.workspace{grid-template-columns:240px minmax(420px,1fr) 270px}.practice-main{padding:24px}.analytics-head,.analytics-scroll,.sidebar-body,.sidebar-footer,.sidebar-head{padding-left:19px;padding-right:19px}.hero-card,.keyboard-card,.typing-card{padding-left:22px;padding-right:22px}}@media(max-width:1160px){.workspace{grid-template-columns:226px minmax(0,1fr)}.analytics{grid-column:1/-1;border-left:none;border-top:1px solid var(--line)}.analytics-scroll{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 24px}.analytics-head{padding:17px 22px}.summary-tiles{align-self:center}.analytics-block{padding:12px 0}.data-block{grid-column:1/-1}.chart-container{height:115px}}@media(max-width:740px){.topbar{min-height:64px;padding:12px 15px;gap:10px;flex-wrap:wrap}.brand{font-size:15px}.brandmark{width:28px;height:28px}.app-name{font-size:12px}.local-pill{display:none}.header-actions{gap:3px}.header-actions .btn{padding:7px 8px;font-size:11px;min-height:31px}.workspace{display:flex;flex-direction:column}.sidebar{border:0;border-bottom:1px solid var(--line)}.sidebar-head{padding:17px 18px 9px;border:0}.sidebar-head h1{font-size:20px;max-width:none}.sidebar-head p{margin-top:3px}.sidebar-body{padding:11px 18px 4px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 15px}.sidebar-footer{display:none}.setting-section{margin-bottom:13px}.setting-section:first-child{grid-column:1/-1}.mode-list{grid-template-columns:repeat(4,minmax(0,1fr));gap:5px}.mode-btn{padding:10px 5px;display:flex;flex-direction:column;text-align:center;gap:3px}.mode-icon{height:24px;width:24px;flex:0 0 24px;font-size:14px}.mode-btn strong{font-size:10px}.mode-btn small{display:none}.setting-section h2{margin-bottom:7px}.sidebar-body #difficultySection,.sidebar-body .setting-section:last-child{grid-column:1/-1}.sidebar-body #difficultySection .toggle-row,.sidebar-body .setting-section:last-child .toggle-row{display:inline-flex;width:49%;vertical-align:top;padding-right:8px}.practice-main{padding:15px 14px 25px}.hero-card,.keyboard-card,.typing-card{padding:17px;border-radius:12px}.hero-card h2{font-size:21px}.hero-card p{font-size:11px}.session-tag{font-size:9px}.metrics-grid{margin-top:22px}.metric{padding:0 10px}.metric strong{font-size:27px}.metric>span{font-size:10px}.keyboard-card,.typing-card{margin-top:12px}.passage{font-size:17px;height:145px;line-height:1.95}.analytics{border-top:1px solid var(--line)}.analytics-scroll{display:block}.footer{padding:12px;flex-wrap:wrap;font-size:10px}}@media(max-width:440px){.app-name{display:none}.top-divider{display:none}.topbar{gap:7px}.header-actions .btn{font-size:10px;padding:7px}.header-actions .btn:nth-child(2){display:none}.hero-top{gap:7px}.hero-card h2{font-size:19px}.session-tag{padding:5px;white-space:normal;max-width:78px;text-align:center}.metrics-grid{gap:0}.metric{padding:0 7px}.metric strong{font-size:23px}.metric>span{font-size:9px}.metric small{font-size:9px}.passage{font-size:16px}.key{height:30px;font-size:10px}.kb-row{gap:3px}.keyboard{gap:5px}.key-guide-pill{font-size:10px}.section-heading h2{font-size:14px}.result-grid{grid-template-columns:repeat(2,1fr)}.typing-input{min-height:88px}}@media(prefers-reduced-motion:reduce){*,:after,:before{animation:none!important;transition:none!important;scroll-behavior:auto!important}}@media(max-width:390px){.sidebar-body #difficultySection .toggle-row,.sidebar-body .setting-section:last-child .toggle-row{width:100%}.side-buttons{flex-wrap:wrap}}.goal-label{display:block;margin:8px 0 5px;font-size:12px;font-weight:650;color:#65738b}#goalMinutesSelect{max-width:100%;width:100%;border:1px solid #d9e1ed;background:#fff;color:#27334a;border-radius:9px;padding:9px}.goal-summary{font-size:13px;color:#42516e;margin:10px 0 8px;font-weight:650}.goal-track{height:9px;border-radius:99px;background:#e7edf6;overflow:hidden}.goal-track span{display:block;height:100%;width:0;background:#4b62d8;border-radius:inherit;transition:width .2s ease}.lesson-progress-list{display:flex;flex-direction:column;gap:9px;margin-top:10px}.lesson-progress-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid #edf1f7}.lesson-progress-row span{display:flex;flex-direction:column;min-width:0}.lesson-progress-row strong{font-size:12px;color:#2b3548}.lesson-progress-row small{font-size:11px;color:#6b778b;line-height:1.4}.lesson-progress-row button{flex:none}.adaptive-launch{margin-top:12px;width:100%}@media(prefers-reduced-motion:reduce){.goal-track span{transition:none}}