.tsw-app{--tsw-ac:#5b4bff;--tsw-hint:#ff7a3d;--tsw-bg:#f3f4fb;--tsw-card:#fff;--tsw-tx:#1b1e3b;--tsw-mut:#6a6e8e;--tsw-ok:#12a36b;--tsw-bad:#e5484d;--tsw-bd:#e2e4f4;--tsw-key:#f7f8ff;--tsw-f0:#ffc2d9;--tsw-f1:#ffd9a8;--tsw-f2:#fff0a0;--tsw-f3:#b9f2d3;--tsw-f4:#bfe2ff;
max-width:960px;margin:24px auto;padding:18px;background:var(--tsw-card);color:var(--tsw-tx);border:1px solid var(--tsw-bd);border-radius:20px;font-family:inherit;line-height:1.5;position:relative;box-sizing:border-box}
.tsw-app[data-theme="dark"]{--tsw-bg:#12132a;--tsw-card:#1c1e3c;--tsw-tx:#eceeff;--tsw-mut:#9ca0c8;--tsw-bd:#2d3060;--tsw-key:#25284d;--tsw-f0:#6b3a4f;--tsw-f1:#6b5236;--tsw-f2:#6a6234;--tsw-f3:#2f6150;--tsw-f4:#2f5578}
@media (prefers-color-scheme:dark){.tsw-app[data-theme="auto"]{--tsw-bg:#12132a;--tsw-card:#1c1e3c;--tsw-tx:#eceeff;--tsw-mut:#9ca0c8;--tsw-bd:#2d3060;--tsw-key:#25284d;--tsw-f0:#6b3a4f;--tsw-f1:#6b5236;--tsw-f2:#6a6234;--tsw-f3:#2f6150;--tsw-f4:#2f5578}}
.tsw-app *{box-sizing:border-box}
.tsw-app :focus-visible{outline:3px solid var(--tsw-hint);outline-offset:2px}
.tsw-top{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:14px}
.tsw-seg{display:flex;background:var(--tsw-bg);border:1px solid var(--tsw-bd);border-radius:999px;padding:4px}
.tsw-app .tsw-seg button{border:0;background:none;color:var(--tsw-mut);font:700 14px/1 inherit;padding:9px 16px;border-radius:999px;cursor:pointer;box-shadow:none;text-transform:none}
.tsw-app .tsw-seg button.tsw-on{background:var(--tsw-ac);color:#fff}
.tsw-app .tsw-sel{flex:1;min-width:160px;margin:0;padding:9px 12px;border-radius:12px;border:1px solid var(--tsw-bd);background:var(--tsw-bg);color:var(--tsw-tx);font:inherit;height:auto}
.tsw-app .tsw-btn{border:0;background:var(--tsw-ac);color:#fff;font:700 14px/1 inherit;padding:11px 18px;border-radius:12px;cursor:pointer;box-shadow:none;text-transform:none}
.tsw-app .tsw-btn.tsw-g{background:var(--tsw-bg);color:var(--tsw-tx);border:1px solid var(--tsw-bd)}
.tsw-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:12px}
.tsw-stats div{background:var(--tsw-bg);border-radius:12px;padding:8px 12px}
.tsw-stats b,.tsw-res b{display:block;font-size:26px;font-weight:800;line-height:1.15}
.tsw-stats span,.tsw-res span{font-size:12px;color:var(--tsw-mut)}
.tsw-bar{height:8px;background:var(--tsw-bg);border-radius:9px;overflow:hidden;margin-bottom:12px}
.tsw-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--tsw-ac),var(--tsw-hint));transition:width .15s}
.tsw-stage{outline:none;border-radius:14px;padding:4px}
.tsw-stage.tsw-active{box-shadow:0 0 0 2px var(--tsw-ac)}
.tsw-focus{font-size:13px;font-weight:700;color:var(--tsw-hint);margin:2px 4px 6px}
.tsw-stage.tsw-active .tsw-focus{visibility:hidden}
.tsw-pass{font-size:var(--tsw-fs,26px);line-height:1.9;white-space:pre-wrap;max-height:230px;overflow:auto;padding:10px 12px;border-radius:12px;background:var(--tsw-bg)}
.tsw-pass.tsw-hi{font-family:'Noto Sans Devanagari','Nirmala UI','Mangal',sans-serif;line-height:2.1}
.tsw-pass span{color:var(--tsw-mut);border-radius:4px}
.tsw-pass .tsw-ok{color:var(--tsw-ok)}
.tsw-pass .tsw-bad{color:#fff;background:var(--tsw-bad)}
.tsw-pass .tsw-cur{background:var(--tsw-hint);color:#fff}
.tsw-hint{margin:12px 0 8px;font-weight:700;min-height:28px}
.tsw-hint em{font-style:normal;background:var(--tsw-hint);color:#fff;padding:2px 10px;border-radius:8px;margin:0 4px}
.tsw-kbw{overflow-x:auto}
.tsw-kb{min-width:560px}
.tsw-row{display:flex;gap:4px;margin-bottom:4px}
.tsw-row.tsw-s{justify-content:center}
.tsw-key{height:clamp(34px,4.4vw,48px);background:var(--tsw-key);color:var(--tsw-tx);border-radius:8px;border:1px solid var(--tsw-bd);border-bottom:3px solid var(--tsw-bd);display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:14px;font-weight:600;line-height:1.1;overflow:hidden;user-select:none;font-family:'Noto Sans Devanagari','Nirmala UI','Mangal',inherit,sans-serif}
.tsw-key i{font-style:normal;font-size:11px;opacity:.7}
.tsw-key b{font-weight:700}
.tsw-fing .tsw-f0{background:var(--tsw-f0)}.tsw-fing .tsw-f1{background:var(--tsw-f1)}.tsw-fing .tsw-f2{background:var(--tsw-f2)}.tsw-fing .tsw-f3{background:var(--tsw-f3)}.tsw-fing .tsw-f4{background:var(--tsw-f4)}
.tsw-key.tsw-hintkey,.tsw-fing .tsw-key.tsw-hintkey{background:var(--tsw-hint);color:#fff;border-color:var(--tsw-hint);animation:tswp 1s infinite}
.tsw-key.tsw-press{transform:translateY(2px);box-shadow:0 0 0 3px var(--tsw-ac)}
@keyframes tswp{50%{box-shadow:0 0 0 4px rgba(255,122,61,.35)}}
@media (prefers-reduced-motion:reduce){.tsw-key.tsw-hintkey{animation:none}}
.tsw-leg{display:flex;flex-wrap:wrap;gap:10px;font-size:12px;color:var(--tsw-mut);margin-top:6px}
.tsw-leg i{display:inline-block;width:12px;height:12px;border-radius:4px;margin-right:4px;vertical-align:-1px}
.tsw-leg .tsw-f0{background:var(--tsw-f0)}.tsw-leg .tsw-f1{background:var(--tsw-f1)}.tsw-leg .tsw-f2{background:var(--tsw-f2)}.tsw-leg .tsw-f3{background:var(--tsw-f3)}.tsw-leg .tsw-f4{background:var(--tsw-f4)}
.tsw-opts{display:flex;flex-wrap:wrap;gap:16px;align-items:center;margin-top:12px;font-size:14px;color:var(--tsw-mut)}
.tsw-opts label{display:flex;gap:6px;align-items:center;cursor:pointer}
.tsw-opts input{margin:0}
.tsw-opts input[type=range]{width:90px}
.tsw-hist{margin-top:14px;font-size:13px;color:var(--tsw-mut)}
.tsw-hist p{margin:0 0 6px;font-weight:700;color:var(--tsw-tx)}
.tsw-hist div{display:flex;justify-content:space-between;border-bottom:1px dashed var(--tsw-bd);padding:3px 0}
.tsw-modal{position:absolute;inset:0;background:rgba(10,10,40,.55);border-radius:20px;display:flex;align-items:center;justify-content:center;padding:16px;z-index:5}
.tsw-modal[hidden]{display:none}
.tsw-mbox{background:var(--tsw-card);color:var(--tsw-tx);border-radius:18px;padding:22px;max-width:420px;width:100%}
.tsw-mbox h3{margin:0 0 12px;font-size:22px}
.tsw-res{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.tsw-res div{background:var(--tsw-bg);border-radius:12px;padding:8px 12px}
.tsw-weak{font-size:13px;color:var(--tsw-mut)}
.tsw-mact{display:flex;gap:8px;justify-content:flex-end}
.tsw-empty{margin:0;color:var(--tsw-mut)}
@media(max-width:600px){.tsw-stats{grid-template-columns:repeat(2,1fr)}}
