:root{--bg: #0f172a;--surface: #1e293b;--surface-2: #273449;--text: #e2e8f0;--muted: #94a3b8;--primary: #6366f1;--primary-d: #4f46e5;--border: #334155;--again: #ef4444;--hard: #f59e0b;--good: #22c55e;--easy: #38bdf8}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,Segoe UI,Noto Sans TC,system-ui,sans-serif}button{font-family:inherit;cursor:pointer}input,textarea{font-family:inherit;width:100%;padding:13px 14px;margin:6px 0;border-radius:11px;border:1px solid var(--border);background:var(--surface-2);color:var(--text);font-size:16px}textarea{min-height:64px;resize:vertical}.muted{color:var(--muted)}.error{color:#fca5a5;font-size:14px;margin:4px 0}.info{color:#86efac;font-size:14px;margin:4px 0}.center{text-align:center}.app{display:flex;flex-direction:column;min-height:100vh;max-width:560px;margin:0 auto}.topbar{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--bg);z-index:5}.brand{font-weight:700;letter-spacing:.3px}.link{background:none;border:none;color:var(--muted);font-size:14px}.content{flex:1;padding:18px 18px 92px}.tabbar{position:fixed;bottom:0;left:0;right:0;max-width:560px;margin:0 auto;display:grid;grid-template-columns:repeat(5,1fr);background:var(--surface);border-top:1px solid var(--border);padding-bottom:env(safe-area-inset-bottom)}.tabbar button{font-size:11px;background:none;border:none;color:var(--muted);padding:11px 0 13px;font-size:12px;display:flex;flex-direction:column;align-items:center;gap:3px}.tabbar button.active{color:var(--text)}.tabbar .ico{font-size:20px}.card{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:20px}.login-wrap{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:20px}.login-card{width:100%;max-width:360px}.login-card h1{margin:0 0 4px;font-size:22px}.primary{width:100%;padding:14px;margin-top:10px;background:var(--primary);color:#fff;border:none;border-radius:12px;font-size:16px;font-weight:600}.primary:active{background:var(--primary-d)}.primary:disabled{opacity:.6}.primary.wide{margin-top:18px}.review{display:flex;flex-direction:column}.progress-row{display:flex;justify-content:space-between;font-size:14px;margin-bottom:12px}.flashcard{background:var(--surface);border:1px solid var(--border);border-radius:18px;padding:30px 22px;min-height:230px;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center}.flashcard .word{font-size:34px;font-weight:700;text-align:center}.flashcard .badge{position:absolute;top:14px;right:14px;background:var(--primary);color:#fff;font-size:11px;padding:3px 9px;border-radius:999px}.tap-hint{color:var(--muted);margin-top:22px;font-size:14px}.back{margin-top:18px;width:100%;text-align:center}.back .pos{color:var(--easy);font-style:italic;margin-bottom:8px}.back .zh{font-size:20px;font-weight:600;margin-bottom:6px}.back .en{color:var(--muted);margin-bottom:12px}.back .syn{background:var(--surface-2);border-radius:10px;padding:9px 12px;font-size:14px;margin-bottom:12px;text-align:left}.syn-label{display:inline-block;background:var(--primary);color:#fff;font-size:11px;padding:2px 7px;border-radius:6px;margin-right:8px}.back .ex{font-style:italic;color:#cbd5e1;text-align:left;line-height:1.5}.grades{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:18px}.grade{border:none;border-radius:12px;padding:12px 4px;color:#fff;display:flex;flex-direction:column;align-items:center;gap:2px}.grade .g-label{font-size:15px;font-weight:600}.grade .g-hint{font-size:11px;opacity:.85}.g-again{background:var(--again)}.g-hard{background:var(--hard)}.g-good{background:var(--good)}.g-easy{background:var(--easy)}.grade:active{filter:brightness(.9)}.done .big-emoji{font-size:48px}.done h2{margin:8px 0}.stat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:16px}.stat{background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:14px 8px;text-align:center}.stat.accent{border-color:var(--primary)}.stat-n{font-size:26px;font-weight:700}.stat-suffix{font-size:13px;font-weight:500;color:var(--muted);margin-left:2px}.stat-label{font-size:12px;color:var(--muted);margin-top:3px}.card h3{margin:0 0 14px;font-size:16px}.forecast{display:flex;align-items:flex-end;gap:6px;height:130px}.bar-col{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;justify-content:flex-end}.bar-val{font-size:11px;color:var(--muted);height:16px}.bar{width:70%;min-height:3px;background:var(--primary);border-radius:5px 5px 0 0;transition:height .3s}.bar-label{font-size:11px;color:var(--muted);margin-top:6px}.add-form h3{margin-top:0}.grader .card,.result .card{margin-bottom:14px}.fld-label{display:block;font-size:13px;color:var(--muted);margin:10px 0 2px}.row-between{display:flex;align-items:center;justify-content:space-between;margin-top:10px}.row-between .fld-label{margin:0}select{width:100%;padding:12px 14px;margin:6px 0;font-size:16px;border-radius:11px;border:1px solid var(--border);background:var(--surface-2);color:var(--text)}textarea.tall{min-height:90px}textarea.taller{min-height:160px}.ghost{width:100%;padding:12px;margin-top:8px;background:transparent;color:var(--muted);border:1px solid var(--border);border-radius:12px;font-size:15px}.grading{padding:40px 20px}.spinner{width:38px;height:38px;margin:0 auto 16px;border-radius:50%;border:4px solid var(--border);border-top-color:var(--primary);animation:spin .9s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.score-card{text-align:center}.score-big{font-size:46px;font-weight:800;color:var(--good)}.score-max{font-size:20px;color:var(--muted);font-weight:600}.delta{margin-top:8px;font-size:14px}.delta.up{color:var(--good)}.delta.down{color:var(--hard)}.dim{margin:10px 0}.dim-top{display:flex;justify-content:space-between;font-size:14px;margin-bottom:4px}.dim-track{height:9px;background:var(--surface-2);border-radius:6px;overflow:hidden}.dim-fill{height:100%;background:var(--primary);border-radius:6px;transition:width .3s}.dim-fill.warn{background:var(--hard)}.summary{line-height:1.6}.prob{border-left:3px solid var(--border);padding:6px 0 6px 12px;margin-bottom:14px}.prob-orig{color:#fca5a5;line-height:1.5}.prob-issue{color:var(--muted);font-size:13px;margin:4px 0}.prob-fix{color:#86efac;line-height:1.5}.model-ver{line-height:1.7;white-space:pre-wrap;color:#cbd5e1}.tags{display:flex;flex-wrap:wrap;gap:6px}.tag{background:var(--surface-2);border:1px solid var(--border);color:var(--text);font-size:12px;padding:4px 10px;border-radius:999px}.segmented{display:flex;gap:6px;margin-bottom:14px}.segmented button{flex:1;padding:10px;border-radius:10px;font-size:14px;background:var(--surface-2);color:var(--muted);border:1px solid var(--border)}.segmented button.on{background:var(--primary);color:#fff;border-color:var(--primary)}.tts{background:var(--surface-2);border:1px solid var(--border);color:var(--text);border-radius:8px;padding:4px 8px;font-size:15px;line-height:1;cursor:pointer}.card-tts{position:absolute;top:14px;left:14px}.browse-count{margin:2px 2px 12px;font-size:13px}.letter-group{padding:12px 16px;margin-bottom:12px}.letter-head{font-size:18px;font-weight:800;color:var(--primary);border-bottom:1px solid var(--border);padding-bottom:6px;margin-bottom:8px}.vocab-row{display:flex;gap:10px;align-items:flex-start;padding:8px 0;border-bottom:1px solid var(--border)}.vocab-row:last-child{border-bottom:none}.vocab-main{flex:1;cursor:pointer}.vocab-word{font-size:16px;font-weight:600}.vocab-pos{font-size:12px;color:var(--easy);font-style:italic;font-weight:400;margin-left:4px}.vocab-zh{font-size:14px;color:var(--muted);margin-top:2px}.vocab-detail{margin-top:8px;font-size:14px}.vocab-detail .ven{color:var(--muted);margin-bottom:6px}.vocab-detail .vsyn{background:var(--surface-2);border-radius:8px;padding:6px 10px;margin-bottom:6px}.vocab-detail .vex{font-style:italic;color:#cbd5e1}.two-col{display:flex;gap:10px}.two-col>div{flex:1}.pc-flag{font-size:30px;font-weight:800}.pc-flag.ok{color:var(--good)}.pc-flag.no{color:var(--again)}
