:root{--bg: #f2f5f1;--panel: #ffffff;--ink: #22402f;--muted: #7d8a80;--brand: #3e7c4f;--brand-deep: #2c5e3a;--ok: #2fa35c;--ok-bg: #e6f5ec;--err: #d9534f;--err-bg: #fdeceb;--warn: #e2703a;--border: #e0e7e0;--radius: 14px;--shadow: 0 2px 10px rgba(34, 64, 47, .06);font-family:Nunito,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--ink);font-size:15px;-webkit-font-smoothing:antialiased}.app{min-height:100%;display:flex;flex-direction:column;max-width:1080px;margin:0 auto;padding:0 20px 24px}button{font-family:inherit;cursor:pointer}kbd{font-family:inherit;font-size:11px;padding:1px 6px;border-radius:6px;background:#22402f0f;border:1px solid var(--border);color:var(--muted);margin-left:4px}.topbar{display:flex;align-items:center;gap:18px;flex-wrap:wrap;padding:14px 0 12px;border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--bg);z-index:20}.brand{display:flex;align-items:baseline;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.brand-icon{font-size:22px}.brand-name{font-size:20px;font-weight:800;letter-spacing:.5px}.brand-tag{font-size:12px;color:var(--brand);background:var(--ok-bg);border-radius:999px;padding:2px 10px;font-weight:700}.filters{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.filters label,.rate-label{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted);font-weight:700}.filters select,.rate-label select{font-family:inherit;font-size:13px;padding:5px 8px;border-radius:9px;border:1px solid var(--border);background:var(--panel);color:var(--ink);font-weight:700;cursor:pointer}.shuffle-label{cursor:pointer;-webkit-user-select:none;user-select:none}.shuffle-label input{accent-color:var(--brand);width:15px;height:15px;cursor:pointer}.wrong-mode-banner{display:flex;align-items:center;gap:10px;font-weight:800;color:var(--warn);background:#fdf1e8;padding:6px 8px 6px 14px;border-radius:999px}.topbar-right{margin-left:auto;display:flex;align-items:center;gap:14px;flex-wrap:wrap}.stat-group{display:flex;gap:12px;font-size:13px;font-weight:700;color:var(--muted)}.stat.ok{color:var(--ok)}.stat.err{color:var(--err)}.wrongbook-btn{position:relative}.wrongbook-btn.active{background:var(--brand);color:#fff}.badge{background:var(--err);color:#fff;border-radius:999px;font-size:11px;padding:1px 7px;margin-left:6px;font-weight:800}.btn{border:1px solid var(--border);background:var(--panel);color:var(--ink);padding:8px 16px;border-radius:999px;font-size:14px;font-weight:700;transition:all .15s;box-shadow:var(--shadow)}.btn:hover{border-color:var(--brand);color:var(--brand)}.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}.btn.primary:hover{background:var(--brand-deep);color:#fff}.btn.primary:disabled{opacity:.5;cursor:not-allowed}.btn.ghost{background:transparent;box-shadow:none}.btn.small{padding:4px 12px;font-size:12px}.icon-btn{border:none;background:transparent;font-size:15px;padding:2px 6px;border-radius:8px}.icon-btn:hover{background:#22402f0f}.progress-strip{padding:14px 4px 4px}.progress-info{display:flex;justify-content:space-between;font-size:13px;font-weight:700;color:var(--muted);margin-bottom:6px}.q-no{color:var(--brand)}.progress-track{height:8px;background:var(--border);border-radius:999px;overflow:hidden}.progress-fill{height:100%;background:linear-gradient(90deg,var(--ok),var(--brand));border-radius:999px;transition:width .25s}.practice{flex:1;display:flex;flex-direction:column;align-items:center;gap:22px;padding:26px 0 10px}.last-review{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted);background:var(--panel);border:1px solid var(--border);border-radius:999px;padding:4px 14px 4px 6px;max-width:100%}.last-mark{font-weight:800;border-radius:999px;padding:1px 8px;font-size:12px;background:var(--border)}.last-mark.ok{background:var(--ok-bg);color:var(--ok)}.last-mark.err{background:var(--err-bg);color:var(--err)}.last-en{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600}.zh-line{font-size:26px;font-weight:800;text-align:center;letter-spacing:1px;min-height:40px;display:flex;align-items:center}.word-slots{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 26px;padding:18px 10px;width:100%;max-width:960px}.word{display:inline-flex;align-items:flex-end;gap:2px;font-size:30px;font-weight:800;line-height:1.1}.word.current{filter:drop-shadow(0 2px 4px rgba(62,124,79,.15))}.slot{min-width:.72em;text-align:center;border-bottom:3px solid var(--border);padding:0 1px 4px;color:transparent;position:relative;transition:border-color .1s}.word.current .slot.caret{border-bottom-color:var(--brand)}.word.current .slot.caret:after{content:"";position:absolute;left:50%;bottom:-1px;transform:translate(-50%);width:4px;height:4px;border-radius:50%;background:var(--brand);animation:blink 1s infinite}@keyframes blink{50%{opacity:0}}.typed-ch{color:var(--ok);border-bottom-color:var(--ok)}.revealed-ch{color:var(--warn);border-bottom-color:var(--warn)}.word.flash{animation:shake .3s}.slot.err-ch{border-bottom-color:var(--err)!important}.slot.err-ch:after{background:var(--err)!important}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-3px)}75%{transform:translate(3px)}}.word-punct{color:var(--muted);font-size:24px;padding-bottom:4px}.punct-only{color:var(--muted);font-size:24px;align-self:flex-end}.result-board{width:100%;max-width:960px;display:flex;flex-direction:column;gap:16px;animation:fade-in .25s}@keyframes fade-in{0%{opacity:0;transform:translateY(6px)}}.result-meta{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}.meta-chip{font-size:12px;font-weight:700;color:var(--muted);background:var(--panel);border:1px solid var(--border);border-radius:999px;padding:3px 12px}.meta-chip.grammar{color:var(--brand);background:var(--ok-bg);border-color:transparent}.meta-chip.level{color:#8a6d1a;background:#faf3dd;border-color:transparent}.token-cards{display:flex;flex-wrap:wrap;justify-content:center;gap:10px}.token-card{display:grid;grid-template-columns:auto auto;grid-template-areas:"pos pos" "word word" "ipa ipa" "meaning meaning";justify-items:center;gap:2px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px;box-shadow:var(--shadow);cursor:pointer;transition:transform .12s,box-shadow .12s;min-width:72px}.token-card:hover{transform:translateY(-2px);box-shadow:0 6px 16px #22402f1a}.token-card.wrong{border-color:#d9534f80;background:snow}.pos-chip{font-size:11px;font-weight:800;border-radius:999px;padding:1px 10px;grid-area:pos}.pos-pron{background:#f0e8fc;color:#8b5cd6}.pos-noun{background:#fdeae8;color:#d9534f}.pos-verb{background:#fdefe3;color:#e2703a}.pos-func{background:#e8f0f9;color:#5b7fa6}.pos-adj{background:#e8f5ec;color:#3e8e55}.pos-other{background:#fbe9f2;color:#c25588}.token-word{grid-area:word;font-size:22px;font-weight:800;color:var(--brand-deep)}.token-card.wrong .token-word{color:var(--err);text-decoration:underline wavy rgba(217,83,79,.5)}.token-ipa{grid-area:ipa;font-size:12px;color:var(--muted)}.token-meaning{grid-area:meaning;font-size:12px;color:var(--muted);font-weight:600}.result-banner{font-size:15px;font-weight:800;border-radius:999px;padding:8px 22px}.result-banner.ok{background:var(--ok-bg);color:var(--ok)}.result-banner.err{background:var(--err-bg);color:var(--err)}.result-banner.neutral{background:#22402f0d;color:var(--muted);font-weight:700}.action-bar{display:flex;gap:12px;flex-wrap:wrap;justify-content:center;margin-top:auto;padding-top:10px}.finish-panel,.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:60px 0;text-align:center}.finish-emoji,.empty-icon{font-size:56px}.finish-panel h2{margin:0;font-size:24px}.finish-sub{color:var(--muted);font-weight:600;margin:0}.finish-actions{display:flex;gap:12px;margin-top:12px}.empty-state p{color:var(--muted);font-weight:600}.wrongbook{flex:1;padding:22px 0;display:flex;flex-direction:column;gap:16px}.wrongbook-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.wrongbook-head h2{margin:0;font-size:20px}.wrongbook-sub{color:var(--muted);font-size:13px;font-weight:600}.wrongbook-actions{margin-left:auto;display:flex;gap:10px}.wrongbook-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.wrongbook-item{display:flex;align-items:center;gap:14px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:14px 18px;box-shadow:var(--shadow)}.wb-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.wb-en{display:flex;align-items:center;gap:6px;font-size:16px;font-weight:800}.wb-zh{font-size:13px;color:var(--muted);font-weight:600}.wb-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:2px}.wrong-chip{font-size:12px;font-weight:800;color:var(--err);background:var(--err-bg);border-radius:999px;padding:1px 10px}.wb-count{font-size:12px;color:var(--err);font-weight:700}.app-footer{text-align:center;color:var(--muted);font-size:12.5px;padding:18px 0 4px;border-top:1px solid var(--border);font-weight:600}.beian{margin-top:6px}.beian a{color:var(--muted);text-decoration:none}.beian a:hover{color:var(--brand)}.app.prestart .topbar,.app.prestart .app-footer{pointer-events:none;opacity:.4}.start-panel{flex:1;display:flex;align-items:center;justify-content:center;padding:30px 0;animation:fade-in .3s}.start-card{display:flex;flex-direction:column;align-items:center;gap:12px;background:var(--panel);border:1px solid var(--border);border-radius:26px;box-shadow:0 12px 44px #22402f1f;padding:42px 58px 34px;text-align:center;max-width:620px}.start-emoji{font-size:54px;line-height:1}.start-card h2{margin:0;font-size:28px;letter-spacing:1px}.start-sub{margin:0;color:var(--muted);font-weight:600;font-size:14px}.start-label{margin-top:14px;font-size:12px;font-weight:800;letter-spacing:2px;color:var(--muted)}.diff-chips{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;max-width:480px}.diff-chip{border:1.5px solid var(--border);background:#fbfdfb;color:var(--ink);border-radius:999px;padding:7px 14px;font-size:13.5px;font-weight:700;cursor:pointer;font-family:inherit;transition:all .15s}.diff-chip:hover{border-color:var(--brand);color:var(--brand)}.diff-chip.active{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 4px 12px #3e7c4f4d}.start-circle{margin-top:18px;width:132px;height:132px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(145deg,#46915a,var(--brand-deep));display:flex;align-items:center;justify-content:center;box-shadow:0 12px 32px #2c5e3a61,inset 0 2px 6px #ffffff40;transition:transform .15s,box-shadow .15s}.start-circle:hover{transform:scale(1.06);box-shadow:0 16px 40px #2c5e3a7a,inset 0 2px 6px #ffffff40}.start-circle:active{transform:scale(.96)}.start-circle svg{width:46px;height:46px;margin-left:8px;fill:#fff;filter:drop-shadow(0 2px 4px rgba(0,0,0,.25))}.start-hint{margin:6px 0 0;color:var(--muted);font-size:12.5px;font-weight:600}.game-wrap{flex:1;display:flex;flex-direction:column;gap:10px;padding:14px 0 6px;min-height:0}.game-stage-box{position:relative;flex:1;min-height:500px;border-radius:18px;overflow:hidden;background:radial-gradient(120% 100% at 50% 0%,#141a44,#0b1030 55%,#090c22);box-shadow:0 8px 30px #0b103059}.game-stage{position:absolute;top:0;right:0;bottom:0;left:0}.game-stage canvas{display:block}.monster-labels{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden}.monster-label{position:absolute;transform:translate(-50%,-50%);white-space:nowrap}.label-inner{display:inline-block;background:#fffffff2;color:#22402f;border-radius:10px;padding:2px 12px;font-size:17px;font-weight:800;letter-spacing:1px;box-shadow:0 2px 8px #00000059}.monster-label.target .label-inner{outline:2px solid #ffd76a;box-shadow:0 0 16px #ffd76acc}.label-inner b{font-weight:800}.label-inner b.done{color:#2fa35c}.game-hud{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;display:flex;align-items:flex-start;padding:14px 16px;gap:10px;z-index:4}.game-chip{background:#ffffff1f;color:#eef3ff;border-radius:999px;padding:4px 14px;font-size:13px;font-weight:800;border:1px solid rgba(255,255,255,.18);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}button.game-chip{font-family:inherit;cursor:pointer;pointer-events:auto}button.game-chip:hover{background:#ffffff38}.game-chip.miss{margin-left:auto;background:#d9534f38;border-color:#d9534f80}.game-chip.miss.urgent{animation:miss-pulse .8s infinite}@keyframes miss-pulse{50%{background:#d9534f80}}.game-chip.hit{position:absolute;left:16px;bottom:14px;background:#2fa35c38;border-color:#2fa35c80}.game-title{position:absolute;left:50%;top:14px;transform:translate(-50%);color:#eef3ff;font-weight:800;font-size:15px;text-shadow:0 2px 8px rgba(0,0,0,.5);z-index:4;pointer-events:none}.combo-pop{position:absolute;right:16px;bottom:14px;color:#ffd76a;font-weight:800;font-size:17px;text-shadow:0 0 12px rgba(255,215,106,.6);animation:combo-in .25s}@keyframes combo-in{0%{transform:scale(1.6);opacity:0}}.game-countdown{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:96px;font-weight:800;color:#ffd76a;text-shadow:0 4px 30px rgba(0,0,0,.6);pointer-events:none;z-index:4;animation:countdown-pop 1s infinite}@keyframes countdown-pop{0%{transform:scale(1.35);opacity:.4}}.game-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#090c2299;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:6;animation:fade-in .2s}.game-overlay-card{background:#fff;color:var(--ink);border-radius:18px;padding:26px 34px;display:flex;flex-direction:column;align-items:center;gap:10px;box-shadow:0 16px 50px #0006;min-width:320px;text-align:center}.game-overlay-card h3{margin:0;font-size:22px}.game-overlay-card p{margin:0;color:var(--muted);font-weight:600;font-size:13px}.result-emoji{font-size:46px}.stars{font-size:30px;color:#f2b01e;letter-spacing:6px}.result-grid{display:grid;grid-template-columns:auto auto;gap:4px 18px;font-size:13.5px;font-weight:700;color:var(--muted)}.result-grid span{text-align:left}.result-grid b{color:var(--ink);text-align:right}.game-overlay-card .finish-actions{margin-top:6px}.game-tips{text-align:center;color:var(--muted);font-size:12.5px;font-weight:600}
