:root{--bg:#0f1220;--bg-2:#161a2e;--card:#1c2140;--card-2:#232a4d;--text:#eef1ff;--muted:#9aa3c7;--line:#2c3358;--accent:#6c8cff;--accent-2:#8f6cff;--good:#3ddc97;--bad:#ff5d73;--warn:#ffc857;--focus:3px;--radius:14px;--font-bopomofo:"Noto Sans TC", "PMingLiU", "MingLiU", sans-serif}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;overscroll-behavior:none;-webkit-user-select:none;user-select:none;margin:0;font-family:-apple-system,BlinkMacSystemFont,Noto Sans TC,PingFang TC,Microsoft JhengHei,system-ui,sans-serif}button{font-family:inherit}.app{max-width:560px;min-height:100%;padding-bottom:env(safe-area-inset-bottom);flex-direction:column;margin:0 auto;display:flex}.topbar{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:20;border-bottom:1px solid var(--line);background:#0f1220d9;align-items:center;gap:10px;padding:14px 16px;display:flex;position:sticky;top:0}.topbar .title{flex:1;font-size:17px;font-weight:700}.icon-btn{background:var(--card);border:1px solid var(--line);color:var(--text);cursor:pointer;border-radius:10px;place-items:center;width:38px;height:38px;font-size:18px;display:grid}.icon-btn:active{transform:scale(.94)}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:16px}.card+.card{margin-top:12px}.muted{color:var(--muted)}.small{font-size:13px}.btn{cursor:pointer;color:#0f1220;background:linear-gradient(135deg, var(--accent), var(--accent-2));border:none;border-radius:12px;width:100%;padding:13px 18px;font-size:15px;font-weight:600;transition:transform 80ms}.btn:active{transform:scale(.98)}.btn.secondary{background:var(--card);color:var(--text);border:1px solid var(--line)}.btn.ghost{color:var(--muted);border:1px dashed var(--line);background:0 0}.btn.good{background:linear-gradient(135deg, var(--good), #2fbf8b)}.btn:disabled{opacity:.5}.mode-grid{grid-template-columns:1fr 1fr;gap:12px;display:grid}.mode-card{background:var(--card);border:2px solid var(--line);border-radius:var(--radius);cursor:pointer;text-align:left;flex-direction:column;gap:6px;padding:16px 14px;transition:border-color .12s,transform 80ms;display:flex}.mode-card:active{transform:scale(.98)}.mode-card.active{border-color:var(--accent);background:var(--card-2)}.mode-card .ico{font-size:26px}.mode-card .name{font-size:15px;font-weight:700}.mode-card .desc{color:var(--muted);font-size:12px}.practice{flex-direction:column;flex:1;display:flex}.progress{background:var(--line);border-radius:3px;height:6px;margin:12px 16px 0;overflow:hidden}.progress>i{background:var(--accent);height:100%;transition:width .2s;display:block}.stimulus{text-align:center;padding:22px 16px 8px}.stimulus .zh{font-size:44px;font-weight:700;line-height:1.2}.stimulus .bo{font-family:var(--font-bopomofo);color:var(--accent);min-height:30px;margin-top:8px;font-size:26px}.stimulus .en-target{letter-spacing:2px;font-size:40px;font-weight:700}.stimulus .hint{color:var(--warn);letter-spacing:3px;min-height:26px;margin-top:6px;font-size:22px}.stimulus .example{color:var(--muted);margin-top:10px;font-size:13px}.answer-line{background:var(--bg-2);border:2px solid var(--line);letter-spacing:2px;border-radius:12px;flex-wrap:wrap;align-items:center;gap:2px;min-height:56px;margin:8px 16px 0;padding:10px 14px;font-size:26px;display:flex}.answer-line.correct{border-color:var(--good)}.answer-line.wrong{border-color:var(--bad)}.answer-line .ch{text-align:center;min-width:16px}.answer-line .ch.done{color:var(--muted)}.answer-line .ch.cur{color:var(--text);background:#6c8cff40;border-radius:4px}.answer-line .ch.bad{color:var(--bad)}.bo-answer{flex-wrap:wrap;justify-content:center;gap:8px;margin-top:6px;display:flex}.bo-answer span{font-family:var(--font-bopomofo);background:var(--bg-2);border:1px solid var(--line);color:var(--muted);border-radius:8px;padding:4px 8px;font-size:22px}.bo-answer span.done{color:var(--good);border-color:var(--good)}.bo-answer span.cur{color:var(--text);border-color:var(--accent);background:#6c8cff2e}.bo-answer span.bad{color:var(--bad);border-color:var(--bad)}.live-stats{gap:8px;margin:14px 16px 0;display:flex}.live-stats .pill{background:var(--card);border:1px solid var(--line);text-align:center;border-radius:12px;flex:1;padding:10px}.live-stats .pill .v{font-size:20px;font-weight:700}.live-stats .pill .l{color:var(--muted);font-size:11px}.vk{padding:12px 10px 18px}.vk-row{justify-content:center;gap:6px;margin-bottom:6px;display:flex}.vk-row.center{justify-content:center}.key{background:var(--card);border:1px solid var(--line);cursor:pointer;min-width:34px;height:46px;color:var(--text);border-radius:10px;place-items:center;font-size:19px;transition:transform 60ms,background 60ms;display:grid}.key:active{background:var(--card-2);transform:scale(.92)}.key.wide{min-width:90px;font-size:14px}.key.tone{background:#2a2150;border-color:#4a3a80}.key.tone:active{background:#3a2d6b}.key.final{background:#1e3a3a;border-color:#2f5f5f}.key.initial{background:var(--card)}.key.flash{background:var(--accent);color:#0f1220}.report-hero{text-align:center;padding:8px 0 4px}.report-hero .big{background:linear-gradient(135deg, var(--accent), var(--accent-2));color:#0000;-webkit-background-clip:text;background-clip:text;font-size:52px;font-weight:800}.report-hero .cap{color:var(--muted);font-size:13px}.stat-row{grid-template-columns:1fr 1fr 1fr;gap:10px;display:grid}.stat-box{background:var(--card);border:1px solid var(--line);text-align:center;border-radius:12px;padding:12px}.stat-box .v{font-size:22px;font-weight:700}.stat-box .l{color:var(--muted);font-size:11px}.word-chip{background:var(--bg-2);border:1px solid var(--line);border-radius:10px;align-items:center;gap:6px;padding:6px 10px;font-size:13px;display:inline-flex}.word-chip .en{color:var(--muted)}.word-chip.new{border-color:var(--good)}.rater{background:var(--bg-2);border:1px solid var(--line);border-radius:12px;justify-content:space-between;align-items:center;margin-top:8px;padding:10px 12px;display:flex}.rater .zh{font-size:17px;font-weight:700}.rater .en{color:var(--muted);font-size:13px}.rater .ex{color:var(--muted);margin-top:2px;font-size:11px}.seg{gap:4px;display:flex}.seg button{background:var(--card);border:1px solid var(--line);color:var(--text);cursor:pointer;border-radius:8px;width:26px;height:26px;font-size:12px}.seg button.on{background:var(--accent);color:#0f1220;border-color:var(--accent)}.seg button.warn.on{background:var(--warn);border-color:var(--warn)}.rater .correct-btn{background:var(--good);color:#062;cursor:pointer;border:none;border-radius:8px;padding:6px 12px;font-size:12px;font-weight:700}.upload-drop{border:2px dashed var(--line);border-radius:var(--radius);text-align:center;color:var(--muted);padding:24px}.upload-drop:active{border-color:var(--accent)}.tag-row{flex-wrap:wrap;gap:6px;display:flex}.tag{background:var(--card);border:1px solid var(--line);cursor:pointer;border-radius:20px;padding:6px 12px;font-size:12px}.tag.active{background:var(--accent);color:#0f1220;border-color:var(--accent)}.list-item{background:var(--card);border:1px solid var(--line);border-radius:10px;justify-content:space-between;align-items:center;margin-top:8px;padding:10px 14px;font-size:14px;display:flex}.list-item .zh{font-weight:600}.list-item .meta{color:var(--muted);font-size:12px}.onb{padding:24px 20px}.onb h2{margin:0 0 8px;font-size:22px}.onb p{color:var(--muted);font-size:14px;line-height:1.6}.steps{gap:6px;margin-top:12px;display:flex}.steps i{background:var(--line);border-radius:3px;flex:1;height:5px}.steps i.on{background:var(--accent)}.footer-actions{gap:10px;margin-top:16px;display:flex}.footer-actions .btn{flex:1}.section-title{color:var(--muted);margin:18px 4px 10px;font-size:13px;font-weight:600}.heatmap{flex-direction:column;gap:4px;display:flex}.heat-row{gap:4px;display:flex}.heat-cell{aspect-ratio:1.6;color:var(--muted);background:var(--card);border-radius:6px;flex:1;place-items:center;font-size:12px;display:grid}.toast{background:var(--card-2);border:1px solid var(--line);z-index:50;border-radius:12px;padding:10px 18px;font-size:13px;animation:.2s fadein;position:fixed;bottom:24px;left:50%;transform:translate(-50%)}@keyframes fadein{0%{opacity:0;transform:translate(-50%,8px)}to{opacity:1;transform:translate(-50%)}}.hidden-focus{opacity:0;border:none;outline:none;width:1px;height:1px;position:absolute}.pwabar{background:var(--accent);z-index:100;width:0;height:3px;position:fixed;top:0;left:0}
