:root{--bg:#1a1a2e;--bg-surface:#2a2a42;--bg-overlay:#383858;--text:#d0d8f8;--text-dim:#9a9eb8;--text-bright:#fff;--accent:#89b4fa;--accent-dim:#4e5068;--green:#a6e3a1;--red:#f38ba8;--yellow:#f9e2af;--key-bg:#32324c;--key-border:#525272;--key-highlight:#89b4fa;--finger-active:#89b4fa;--finger-inactive:#4e5068;--font-mono:"SF Mono", "Fira Code", "Cascadia Code", "JetBrains Mono", monospace;--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif}[data-theme=light]{--bg:#eff1f5;--bg-surface:#fff;--bg-overlay:#d3d7e2;--text:#44475e;--text-dim:#6b7090;--text-bright:#1a1a2e;--accent:#1e66f5;--accent-dim:#b0b4c4;--green:#40a02b;--red:#d20f39;--yellow:#df8e1d;--key-bg:#d3d7e2;--key-border:#a8adc0;--key-highlight:#1e66f5;--finger-active:#1e66f5;--finger-inactive:#c0c4d0}*,:before,:after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-sans);background:var(--bg);color:var(--text);justify-content:center;min-height:100vh;display:flex}#app{gap:16px;width:100%;max-width:min(1800px,95vw);padding:24px 16px;display:flex}.site-logo{font-family:"Outfit", var(--font-sans);letter-spacing:4px;text-align:center;text-transform:uppercase;background:linear-gradient(135deg, color-mix(in srgb, var(--accent) 85%, transparent), color-mix(in srgb, var(--green) 85%, transparent));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:24px;font-weight:800}#main{flex-direction:column;flex:1;gap:16px;min-width:0;display:flex}#sidebar{flex-direction:column;flex-shrink:0;gap:16px;width:280px;display:flex}@media (width<=768px){#app{flex-direction:column;padding:16px 12px}#sidebar{flex-shrink:1;width:100%}}#text-display{background:var(--bg-surface);border:1px solid var(--bg-overlay);border-radius:8px;min-height:clamp(160px,14vw,240px);padding:10px;box-shadow:inset 0 1px 3px #0000001a}.td-placeholder{color:var(--text-dim);text-align:center;padding:40px;font-size:14px}.td-code{font-family:var(--font-mono);letter-spacing:.3px;white-space:pre-wrap;word-break:break-word;font-size:clamp(16px,1.35vw,24px);line-height:1.4}.td-line{border-left:3px solid #0000;padding:2px 0 2px 8px}.td-line-active{border-left-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}.td-correct{color:var(--green)}.td-error{color:var(--text-bright);background:var(--red);border-radius:2px}.td-cursor{color:var(--text-bright);background:var(--accent);border-radius:2px;animation:1s ease-in-out infinite cursor-blink}@keyframes cursor-blink{0%,to{opacity:1}50%{opacity:.7}}.td-pending{color:var(--text)}.td-skip{color:var(--accent-dim);opacity:.7}.td-newline{margin-left:2px;font-size:12px}#stats-display{background:var(--bg-surface);border-radius:8px;padding:12px 16px}.stats-bar{grid-template-columns:1fr 1fr;gap:8px 16px;display:grid}.stat{flex-direction:column;align-items:center;gap:2px;display:flex}.stat-label{text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);font-size:11px}.stat-value{font-family:var(--font-mono);color:var(--text-bright);font-size:16px;font-weight:700}.stats-result{background:var(--bg-overlay);text-align:center;border-radius:8px;margin-top:12px;padding:16px}.result-title{color:var(--green);margin-bottom:8px;font-size:18px;font-weight:700}.result-stats{color:var(--text-dim);text-align:center;grid-template-columns:1fr 1fr;gap:8px 12px;font-size:14px;display:grid}.result-stats strong{font-family:var(--font-mono);color:var(--text-bright);font-size:16px;font-weight:700}.result-retry{color:var(--bg);background:var(--green);cursor:pointer;border:none;border-radius:6px;margin-top:12px;padding:8px 24px;font-size:14px;font-weight:600;transition:opacity .15s}.result-retry:hover{opacity:.85}@media (width<=768px){.result-stats{grid-template-columns:repeat(4,1fr)}}#keyboard{justify-content:center;display:flex}.kb{background:var(--bg-surface);border-radius:12px;flex-direction:column;gap:4px;padding:12px;display:flex}.kb-row{justify-content:center;gap:4px;display:flex}.kb-key{--w:1;--kb-unit:clamp(44px, 3.2vw, 64px);width:calc(var(--w) * var(--kb-unit));height:var(--kb-unit);background:var(--key-bg);border:1px solid var(--key-border);font-family:var(--font-mono);color:var(--text);-webkit-user-select:none;user-select:none;border-radius:6px;flex-direction:column;flex-shrink:0;justify-content:center;align-items:center;font-size:clamp(13px,1vw,18px);transition:background .1s,border-color .1s,color .1s;display:flex;position:relative}.kb-key.kb-highlight{background:var(--key-highlight);border-color:var(--accent);color:var(--bg);font-weight:700;box-shadow:0 0 12px #89b4fa66}.kb-shift-label{color:var(--text-dim);font-size:clamp(10px,.8vw,14px);line-height:1;position:absolute;top:4px;left:6px}.kb-highlight .kb-shift-label{color:var(--bg-overlay)}.kb-main-label{font-size:clamp(14px,1.1vw,20px)}.kb-key.kb-gap{pointer-events:none;background:0 0;border:none;flex-grow:1}.kb-key.kb-layer,.kb-key.kb-unknown{opacity:.5;font-size:10px}.kb-key.kb-encoder{background:var(--bg-surface);border:2px dashed var(--text-dim);opacity:.8;border-radius:50%;gap:0;padding:2px}.enc-rot{color:var(--text-dim);font-size:8px;line-height:1.1}.enc-press{font-size:10px;line-height:1.1}.kb-key.kb-error-low{background:#f9e2af59;border-color:#f9e2af99}.kb-key.kb-error-mid{background:#fab38780;border-color:#fab387b3}.kb-key.kb-error-high{background:#f38ba899;border-color:#f38ba8cc}[data-theme=light] .kb-key.kb-error-low{background:#df8e1d33;border-color:#df8e1d66}[data-theme=light] .kb-key.kb-error-mid{background:#e664324d;border-color:#e6643280}[data-theme=light] .kb-key.kb-error-high{background:#d20f3959;border-color:#d20f398c}#finger-guide{justify-content:center;display:flex}.fg-wrapper{width:100%;max-width:500px;margin:0 auto}.fg-svg{width:100%;height:auto}.fg-palm{fill:var(--bg-overlay);stroke:var(--key-border);stroke-width:1px}.fg-finger rect,.fg-finger ellipse{fill:var(--finger-inactive);stroke:var(--key-border);stroke-width:1px;transition:fill .15s}.fg-finger.fg-active rect,.fg-finger.fg-active ellipse{fill:var(--finger-active);stroke:var(--accent);stroke-width:1.5px}#settings-panel{background:var(--bg-surface);border-radius:8px;padding:12px}.sp-header{flex-direction:column;gap:8px;display:flex}.sp-header-bottom{justify-content:space-between;align-items:center;display:flex}.sp-toggle-btn{color:var(--text-dim);font-size:13px;font-family:var(--font-sans);cursor:pointer;background:0 0;border:none;padding:4px 0}.sp-toggle-btn:hover{color:var(--text)}.sp-header-actions{align-items:center;gap:6px;display:flex}.sp-sound-btn,.sp-theme-btn{background:var(--bg-overlay);color:var(--text);border:1px solid var(--key-border);cursor:pointer;white-space:nowrap;border-radius:4px;padding:4px 8px;font-size:11px}.sp-sound-btn:hover,.sp-theme-btn:hover{border-color:var(--accent)}.sp-sound-btn.sp-sound-off{color:var(--text-dim)}.sp-bar{opacity:1;flex-direction:column;gap:10px;max-height:600px;margin-top:10px;transition:max-height .25s,margin-top .25s,opacity .2s;display:flex;overflow:hidden}.sp-bar.sp-collapsed{opacity:0;max-height:0;margin-top:0}.sp-row{flex-direction:column;gap:6px;display:flex}.sp-group{align-items:center;gap:6px;display:flex}.sp-label{text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);white-space:nowrap;min-width:52px;font-size:11px}.sp-select,.sp-input{background:var(--bg-overlay);color:var(--text);border:1px solid var(--key-border);font-size:12px;font-family:var(--font-mono);border-radius:4px;flex:1;min-width:0;padding:4px 6px}.sp-select-narrow{flex:none;width:auto;min-width:fit-content}.sp-btn{background:var(--accent);color:var(--bg);cursor:pointer;white-space:nowrap;border:none;border-radius:4px;padding:4px 10px;font-size:11px;font-weight:600}.sp-btn:hover{opacity:.9}.sp-btn:disabled{opacity:.5;cursor:not-allowed}.sp-file-input{color:var(--text-dim);flex:1;min-width:0;font-size:11px}.sp-file-input::file-selector-button{background:var(--bg-overlay);color:var(--text);border:1px solid var(--key-border);cursor:pointer;border-radius:4px;margin-right:6px;padding:3px 6px;font-size:11px}.sp-unit{color:var(--text-dim);font-size:11px}.sp-divider{border:none;border-top:1px solid var(--key-border);margin:2px 0}@media (width<=768px){.sp-row{flex-flow:wrap}.sp-group{flex:1;min-width:0}}
