:root{
  --paper:#f6f3ec;
  --paper-2:#fffdf8;
  --ink:#1e2622;
  --ink-2:#4a5a53;
  --muted:#8b968f;
  --line:#dcd6c8;
  --brand:#2f6f5e;
  --brand-d:#245848;
  --bronze:#a9762f;
  --ok:#2f7d4f;
  --ok-bg:#e7f3ea;
  --no:#a8352b;
  --no-bg:#fbebe8;
  --shadow:0 1px 2px rgba(30,38,34,.06),0 8px 24px -14px rgba(30,38,34,.24);
  --r:12px;
  --sans:"Noto Sans SC","PingFang SC","Microsoft YaHei",system-ui,-apple-system,"Segoe UI",sans-serif;
  --serif:"Noto Serif SC","Songti SC",SimSun,Georgia,serif;
  --mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--paper);color:var(--ink);font-family:var(--sans);
  font-size:16px;line-height:1.62;-webkit-text-size-adjust:100%;
  background-image:
    linear-gradient(rgba(47,111,94,.045) 1px,transparent 1px),
    linear-gradient(90deg,rgba(47,111,94,.045) 1px,transparent 1px);
  background-size:28px 28px;
}
button,input,select,textarea{font:inherit;color:inherit}
h1,h2,h3{font-family:var(--serif);font-weight:700;margin:0}
.muted{color:var(--muted);font-size:.86rem}
.small{font-size:.82rem}
[hidden]{display:none !important}
.spacer{flex:1}

/* ---------------- 登录 ---------------- */
.gate{min-height:100svh;display:grid;place-items:center;padding:20px}
.gate-card{
  width:min(430px,100%);background:var(--paper-2);border:1px solid var(--line);
  border-radius:16px;padding:28px 26px 24px;box-shadow:var(--shadow);
}
.gate-title{font-size:1.5rem;letter-spacing:.02em}
.gate-sub{color:var(--ink-2);margin:.4rem 0 1.2rem;font-size:.9rem}
.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:16px}
.tab{
  appearance:none;background:none;border:0;border-bottom:2px solid transparent;
  padding:8px 10px;font-size:.9rem;color:var(--muted);cursor:pointer;margin-bottom:-1px
}
.tab.is-on{color:var(--brand);border-bottom-color:var(--brand);font-weight:600}
.gate-form{display:grid;gap:12px}
.field{display:grid;gap:5px}
.field>span{font-size:.82rem;color:var(--ink-2)}
.field input{
  width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;
  background:#fff;transition:border-color .15s,box-shadow .15s
}
.field input:focus{outline:0;border-color:var(--brand);box-shadow:0 0 0 3px rgba(47,111,94,.14)}
.gate-hint{font-size:.8rem;color:var(--muted);margin:0}
.gate-msg{min-height:1.3em;font-size:.85rem;margin:.9rem 0 0;color:var(--no);white-space:pre-wrap}
.gate-msg.ok{color:var(--ok)}

/* ---------------- 按钮 ---------------- */
.btn{
  appearance:none;border:1px solid var(--line);background:#fff;color:var(--ink);
  padding:9px 15px;border-radius:9px;cursor:pointer;font-size:.92rem;
  transition:transform .08s,border-color .15s,background .15s
}
.btn:hover{border-color:var(--brand);background:#fbfaf6}
.btn:active{transform:translateY(1px)}
.btn:disabled{opacity:.45;cursor:not-allowed;transform:none}
.btn-primary{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.btn-primary:hover{background:var(--brand-d);border-color:var(--brand-d)}
.btn-ghost{border-color:transparent;background:transparent;color:var(--ink-2)}
.btn-ghost:hover{background:rgba(47,111,94,.08);border-color:transparent;color:var(--brand)}
.btn-danger{color:var(--no);border-color:#e6c9c4}
.btn-danger:hover{background:var(--no-bg);border-color:var(--no)}
.btn-sm{padding:6px 11px;font-size:.84rem;border-radius:8px}
.btn-block{width:100%;margin-top:4px}

/* ---------------- 外壳 ---------------- */
.shell{max-width:920px;margin:0 auto;padding:0 16px 64px}
.topbar{
  position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:12px;
  padding:12px 0 10px;background:linear-gradient(var(--paper) 72%,rgba(246,243,236,0));
}
.brand{display:flex;align-items:center;gap:10px;min-width:0}
.brand-mark{
  width:32px;height:32px;flex:none;border-radius:9px;background:var(--brand);color:#fff;
  display:grid;place-items:center;font-family:var(--serif);font-size:1.05rem
}
.brand strong{display:block;font-size:.98rem;letter-spacing:.01em}
.brand em{display:block;font-style:normal;font-size:.76rem;color:var(--muted);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:44vw}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:6px}
.sync{font-size:.9rem;color:var(--ok);transition:color .3s}
.sync[data-s="pending"]{color:var(--bronze)}
.sync[data-s="error"]{color:var(--no)}
.sync[data-s="local"]{color:var(--muted)}

.chapters{display:flex;gap:7px;overflow-x:auto;padding:2px 0 14px;scrollbar-width:thin}
.chapters::-webkit-scrollbar{height:5px}
.chapters::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px}
.chip{
  flex:none;appearance:none;border:1px solid var(--line);background:var(--paper-2);
  border-radius:999px;padding:7px 14px;font-size:.86rem;cursor:pointer;white-space:nowrap;
  display:flex;align-items:center;gap:7px
}
.chip i{font-style:normal;font-family:var(--mono);font-size:.72rem;color:var(--muted)}
.chip:hover{border-color:var(--brand)}
.chip.is-on{background:var(--brand);border-color:var(--brand);color:#fff}
.chip.is-on i{color:rgba(255,255,255,.72)}
.chip.all.is-on{background:var(--ink);border-color:var(--ink)}

/* ---------------- 首页 ---------------- */
.hero{
  background:var(--paper-2);border:1px solid var(--line);border-radius:var(--r);
  padding:18px 20px;display:flex;gap:20px;align-items:center;flex-wrap:wrap;box-shadow:var(--shadow)
}
.hero-main{flex:1;min-width:210px}
.hero-main h2{font-size:1.22rem;line-height:1.35}
.hero-meta{color:var(--ink-2);font-size:.86rem;margin:.5rem 0 0}
.hero-stats{display:flex;gap:18px}
.kpi{text-align:right}
.kpi b{display:block;font-family:var(--mono);font-size:1.5rem;line-height:1.1;color:var(--brand)}
.kpi span{font-size:.74rem;color:var(--muted)}
.ring{--p:0;width:64px;height:64px;border-radius:50%;flex:none;
  background:conic-gradient(var(--brand) calc(var(--p)*1%),#e5e0d4 0);
  display:grid;place-items:center}
.ring::after{content:attr(data-v);width:48px;height:48px;border-radius:50%;background:var(--paper-2);
  display:grid;place-items:center;font-family:var(--mono);font-size:.76rem;color:var(--brand)}

.modes{display:grid;grid-template-columns:repeat(auto-fit,minmax(158px,1fr));gap:10px;margin:14px 0}
.mode{
  text-align:left;border:1px solid var(--line);background:var(--paper-2);border-radius:var(--r);
  padding:13px 15px;cursor:pointer;transition:transform .1s,border-color .15s,box-shadow .15s
}
.mode:hover{border-color:var(--brand);transform:translateY(-2px);box-shadow:var(--shadow)}
.mode b{display:block;font-size:.98rem}
.mode span{display:block;font-size:.78rem;color:var(--muted);margin-top:3px}
.mode em{font-style:normal;font-family:var(--mono);font-size:.76rem;color:var(--bronze)}
.mode:disabled{opacity:.5;cursor:not-allowed;transform:none}

.panel{
  background:var(--paper-2);border:1px solid var(--line);border-radius:var(--r);
  padding:16px 18px;margin-top:14px;box-shadow:var(--shadow)
}
.panel-head{display:flex;align-items:baseline;gap:10px;margin-bottom:12px}
.panel-head h2{font-size:1.02rem}
.tags{display:flex;flex-wrap:wrap;gap:6px}
.tag{
  border:1px solid var(--line);border-radius:7px;padding:4px 9px;font-size:.78rem;
  background:#fff;cursor:pointer;display:flex;gap:6px;align-items:center
}
.tag:hover{border-color:var(--brand)}
.tag i{font-style:normal;font-family:var(--mono);font-size:.7rem;color:var(--muted)}
.tag[data-l="weak"]{background:var(--no-bg);border-color:#e8c6bf;color:var(--no)}
.tag[data-l="mid"]{background:#fdf4e3;border-color:#e8d7ae;color:var(--bronze)}
.tag[data-l="good"]{background:var(--ok-bg);border-color:#c2dcc9;color:var(--ok)}

/* ---------------- 答题 ---------------- */
.quiz-bar{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.quiz-track{flex:1;height:4px;border-radius:2px;background:#e2ddcf;overflow:hidden;min-width:40px}
.quiz-track i{display:block;height:100%;width:0;background:var(--brand);transition:width .25s}
.quiz-pos,.quiz-score{font-family:var(--mono);font-size:.78rem;color:var(--muted);white-space:nowrap}
.quiz-score{color:var(--ok)}

.card{
  background:var(--paper-2);border:1px solid var(--line);border-radius:var(--r);
  padding:20px 22px;box-shadow:var(--shadow)
}
.card-empty{color:var(--muted);text-align:center;padding:28px 0}
.q-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.badge{
  font-size:.7rem;padding:2px 8px;border-radius:999px;border:1px solid var(--line);
  background:#fff;color:var(--ink-2);white-space:nowrap
}
.badge[data-t=single]{border-color:#bcd0c6;color:var(--brand-d);background:#eef5f1}
.badge[data-t=multi]{border-color:#d6c39a;color:var(--bronze);background:#fbf4e6}
.badge[data-t=blank]{border-color:#bfc9d6;color:#3c5a78;background:#eef2f6}
.badge[data-t=judge]{border-color:#cbbcd6;color:#5d4370;background:#f3eef7}
.badge.lv{border:0;background:#f0ece0;color:var(--muted)}
.q-tag{font-size:.74rem;color:var(--muted)}
.q-no{margin-left:auto;font-family:var(--mono);font-size:.74rem;color:var(--muted)}
.stem{font-size:1.06rem;line-height:1.72;margin:0 0 14px;font-family:var(--serif)}
.stem .src{font-family:var(--mono);font-size:.7rem;color:var(--muted);vertical-align:super}

.opts{display:grid;gap:8px}
.opt{
  display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);
  border-radius:9px;cursor:pointer;background:#fff;transition:border-color .12s,background .12s
}
.opt:hover{border-color:var(--brand)}
.opt input{margin:2px 0 0;accent-color:var(--brand);flex:none}
.opt .key{
  font-family:var(--mono);font-size:.78rem;color:var(--ink-2);flex:none;width:1.2em;text-align:center;
  border-radius:4px;background:#f1eee4;line-height:1.5
}
.opt .txt{flex:1;word-break:break-word}
.opt.sel{border-color:var(--brand);background:#f2f7f4}
.opt.right{border-color:var(--ok);background:var(--ok-bg)}
.opt.wrong{border-color:var(--no);background:var(--no-bg)}
.opt.dim{opacity:.6}
.opt.locked{cursor:default}
.opt.locked:hover{border-color:var(--line)}
.opt.right.locked:hover,.opt.sel.locked:hover{border-color:var(--brand)}

.fills{display:flex;flex-wrap:wrap;gap:10px;align-items:center;font-size:1.02rem}
.blank-in{
  width:150px;padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;
  font-family:var(--mono)
}
.blank-in:focus{outline:0;border-color:var(--brand);box-shadow:0 0 0 3px rgba(47,111,94,.14)}
.blank-in.right{border-color:var(--ok);background:var(--ok-bg)}
.blank-in.wrong{border-color:var(--no);background:var(--no-bg)}
/* 填空嵌在题干里时，做成一条下划线空格 */
.stem .blank-in{
  width:9.2em;display:inline-block;margin:0 .18em;padding:2px 8px;font-size:.94em;
  border-width:0 0 1px;border-radius:4px 4px 0 0;background:rgba(47,111,94,.05)
}
.stem .blank-in.right,.stem .blank-in.wrong{border-width:1px}

.submit-row{display:flex;gap:10px;align-items:center;margin-top:16px}
.submit-row .hint{font-size:.78rem;color:var(--muted)}

.feedback{margin-top:16px;border-radius:10px;padding:13px 15px;font-size:.92rem;border:1px solid}
.feedback.ok{background:var(--ok-bg);border-color:#c2dcc9}
.feedback.no{background:var(--no-bg);border-color:#e8c6bf}
.feedback.info{background:#eef2f6;border-color:#cdd8e4}
.feedback b{display:block;margin-bottom:4px;font-family:var(--serif)}
.feedback .ans{color:var(--brand-d);font-weight:600}
.feedback .why{margin:.5rem 0 0;color:var(--ink-2);font-size:.89rem}
.feedback .ref{margin:.6rem 0 0;font-size:.78rem;color:var(--muted);display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.linklike{background:none;border:0;color:var(--brand);cursor:pointer;padding:0;font-size:.78rem;text-decoration:underline}

.card-actions{display:flex;align-items:center;gap:10px;margin-top:12px}
.switch{display:flex;align-items:center;gap:6px;font-size:.78rem;color:var(--muted);cursor:pointer}
.switch input{accent-color:var(--brand)}

/* ---------------- 统计 ---------------- */
.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px}
.stat{border:1px solid var(--line);border-radius:10px;padding:11px 13px;background:#fff}
.stat b{display:block;font-family:var(--mono);font-size:1.35rem;color:var(--brand)}
.stat span{font-size:.76rem;color:var(--muted)}
.bars{margin-top:14px;display:grid;gap:8px}
.bar-row{display:grid;grid-template-columns:118px 1fr 84px;gap:10px;align-items:center;font-size:.82rem;cursor:pointer}
.bar-row:hover .bar-name{color:var(--brand)}
.bar-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink-2)}
.bar{height:9px;border-radius:5px;background:#e6e1d4;overflow:hidden;display:flex}
.bar i{height:100%;background:var(--ok)}
.bar em{height:100%;background:#e3b7ad;font-style:normal}
.bar-num{font-family:var(--mono);font-size:.74rem;color:var(--muted);text-align:right}

.wrong-list,.weak-list{display:grid;gap:7px}
.wrong-item{
  border:1px solid var(--line);border-radius:9px;padding:9px 12px;background:#fff;cursor:pointer;
  display:flex;gap:9px;align-items:flex-start;font-size:.88rem
}
.wrong-item:hover{border-color:var(--no)}
.wrong-item .txt{flex:1}
.wrong-item .why{color:var(--muted);font-size:.78rem;margin-top:2px}
.wrong-item .from{font-size:.72rem;color:var(--muted);font-family:var(--mono);flex:none}
.weak-item{display:flex;gap:10px;align-items:center;border:1px solid var(--line);border-radius:9px;
  padding:8px 12px;background:#fff;font-size:.85rem;cursor:pointer}
.weak-item:hover{border-color:var(--brand)}
.weak-item .pct{font-family:var(--mono);font-size:.78rem;color:var(--no);flex:none}

.acct{display:grid;gap:8px;font-size:.9rem;margin-bottom:14px}
.acct-row{display:flex;gap:8px;flex-wrap:wrap;align-items:baseline}
.acct-row b{font-family:var(--mono);font-size:.82rem;color:var(--brand)}
.acct-ops{display:flex;flex-wrap:wrap;gap:8px}

.toast{
  position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(12px);
  background:var(--ink);color:#fff;padding:10px 18px;border-radius:10px;font-size:.86rem;
  box-shadow:var(--shadow);opacity:0;transition:opacity .2s,transform .2s;z-index:60;max-width:88vw
}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast[data-k=err]{background:var(--no)}
.toast[data-k=ok]{background:var(--ok)}

@media (max-width:600px){
  body{font-size:15px}
  .shell{padding:0 12px 56px}
  .card{padding:17px 15px;border-radius:10px}
  .stem{font-size:1.02rem}
  .hero{padding:15px}
  .hero-stats{gap:14px}
  .bar-row{grid-template-columns:92px 1fr 70px}
  .fills input{width:130px}
  .brand em{max-width:36vw}
}
@media (prefers-reduced-motion:reduce){
  *{transition:none !important}
}
@media (prefers-color-scheme:dark){
  :root{
    --paper:#151a17;--paper-2:#1d2420;--ink:#e7e5dc;--ink-2:#a9b3ac;--muted:#77817a;
    --line:#2e3733;--brand:#57a08a;--brand-d:#6fb59d;--bronze:#c99a52;
    --ok:#5aab78;--ok-bg:#1c2c22;--no:#d1685a;--no-bg:#2c1a17;
    --shadow:0 1px 2px rgba(0,0,0,.4),0 10px 28px -16px rgba(0,0,0,.6)
  }
  body{background-image:linear-gradient(rgba(87,160,138,.06) 1px,transparent 1px),
    linear-gradient(90deg,rgba(87,160,138,.06) 1px,transparent 1px)}
  .btn:not(.btn-primary),.opt,.tag,.stat,.wrong-item,.weak-item,.field input,.blank-in,.badge{background-color:#1d2420;border-color:#2e3733}
  .btn-primary{background-color:var(--brand);border-color:var(--brand);color:#0d1512}
  .opt .key{background:#28312c;color:var(--ink-2)}
  .ring::after{background:#1d2420}
  .tab,.chip{background-color:#1d2420}
  .quiz-track{background:#2a322d}
  .bar{background:#2a322d}
  .badge.lv{background:#28312c}
  .mode,.panel,.hero,.gate-card,.card{background-color:#1d2420}
}
