:root{
  --bg:#f4f6fb; --card:#ffffff; --ink:#1f2533; --sub:#7a8597;
  --line:#e6eaf2; --brand:#2f6bff; --brand-soft:#eaf1ff; --brand2:#5b8bff;
  --ok:#16a34a; --ok-soft:#e8f7ee; --warn:#d97706; --warn-soft:#fdf2e2;
  --bad:#e11d48; --bad-soft:#fdeaef; --chip:#eef1f7;
  --mascot:#2f6bff;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
/* ② 字体：圆润黑体优先——学生最习惯的微软雅黑 / 苹方，回退到系统无衬线 */
html,body{margin:0;padding:0;background:var(--bg);
  font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB","Heiti SC",-apple-system,BlinkMacSystemFont,"Helvetica Neue",sans-serif;
  color:var(--ink);line-height:1.62;letter-spacing:.2px;-webkit-font-smoothing:antialiased}
/* #phone 必须限定高度（不能 min-height）：否则 #screen{flex:1} 拿不到约束高度，
   内部从不滚动、真正滚动发生在 document 上，所有 $screen.scrollTop 的滚动记忆全部失效。
   height:100dvh 兼容手机地址栏伸缩；旧的 min-height 写法正是「返回不恢复位置」的最底层根因。 */
#phone{position:relative;max-width:430px;margin:0 auto;height:100vh;height:100dvh;background:var(--bg);display:flex;flex-direction:column;overflow:hidden}
#topbar{background:linear-gradient(135deg,var(--brand),var(--brand2));color:#fff;padding:14px 18px 12px}
#appTitle{font-size:18px;font-weight:700}
#appSub{font-size:12px;opacity:.85;margin-top:2px}
#screen{flex:1;overflow-y:auto;padding:14px 14px 90px}
#tabbar{position:fixed;bottom:0;left:50%;transform:translateX(-50%);width:100%;max-width:430px;
  display:flex;background:#fff;border-top:1px solid var(--line);box-shadow:0 -2px 10px rgba(0,0,0,.04)}
.tab{flex:1;border:0;background:none;padding:8px 0 6px;display:flex;flex-direction:column;align-items:center;gap:2px;color:var(--sub);font-size:11px;cursor:pointer}
.tab .ti{font-size:18px}
.tab.active{color:var(--brand)}
.tab.active .ti{filter:drop-shadow(0 0 2px rgba(47,107,255,.4))}
.card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:12px}
.row{display:flex;align-items:center;justify-content:space-between;gap:8px}
.h2{font-size:16px;font-weight:700;margin:4px 0 10px}
.muted{color:var(--sub);font-size:12px}
.chip{display:inline-block;background:var(--chip);color:var(--sub);border-radius:999px;padding:2px 9px;font-size:11px;margin:2px 4px 2px 0}
.chip.core{background:var(--brand-soft);color:var(--brand)}
.chip.hard{background:var(--bad-soft);color:var(--bad)}
.chip.key{background:var(--warn-soft);color:var(--warn)}
.grade-group{margin-bottom:6px}
.grade-title{font-size:13px;font-weight:700;color:var(--sub);margin:14px 2px 8px;letter-spacing:1px}
.ch-btn{display:flex;align-items:center;justify-content:space-between;width:100%;text-align:left;border:1px solid var(--line);
  background:#fff;border-radius:12px;padding:12px 14px;margin-bottom:8px;cursor:pointer}
.ch-btn:active{background:var(--brand-soft)}
.ch-btn .nm{font-weight:600;font-size:15px}
.ch-btn .meta{font-size:11px;color:var(--sub);margin-top:3px}
.badge{font-size:10px;padding:2px 7px;border-radius:999px}
.badge.ok{background:var(--ok-soft);color:var(--ok)}
.badge.soon{background:var(--warn-soft);color:var(--warn)}
.badge.self{background:#fff4e0;color:#b76e00;border:1px solid #f0c674}
.calc-cat{cursor:pointer;transition:transform .08s ease,box-shadow .08s ease}
.calc-cat:active{transform:scale(.985)}
.badge.no{background:var(--chip);color:var(--sub)}
.kp{display:flex;align-items:center;justify-content:space-between;border:1px solid var(--line);border-radius:12px;padding:11px 13px;margin-bottom:8px;cursor:pointer;background:#fff}
.kp:active{background:var(--brand-soft)}
.kp .left{display:flex;flex-direction:column;gap:4px}
.kp .kn{font-weight:600;font-size:14px}
.kp .ks{font-size:11px;color:var(--sub)}
.back{color:var(--brand);font-size:13px;cursor:pointer;margin-bottom:8px;display:inline-block}
.q-stem{font-size:16px;line-height:1.7;background:#fff;border:1px solid var(--line);border-radius:14px;padding:16px;margin-bottom:12px}
.ans-input{width:100%;border:1px solid var(--line);border-radius:12px;padding:12px 14px;font-size:16px;font-family:inherit;resize:vertical;min-height:54px;outline:none}
.ans-input:focus{border-color:var(--brand)}
.btn{border:0;border-radius:12px;padding:12px 16px;font-size:15px;font-weight:600;cursor:pointer;background:var(--brand);color:#fff;width:100%}
.btn:active{opacity:.85}
.btn.ghost{background:#fff;color:var(--brand);border:1px solid var(--brand)}
.btn.warn{background:var(--warn);color:#fff}
.btn.sm{width:auto;padding:8px 14px;font-size:13px}
.hint-box{background:var(--warn-soft);border-radius:10px;padding:10px 12px;margin:8px 0;font-size:14px;color:#7a4a06}
.hint-box b{color:var(--warn)}
.sol{background:var(--chip);border-radius:10px;padding:12px;font-size:14px;line-height:1.7;margin-top:10px}
.sol .st{margin:6px 0}
.cause{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.cause button{flex:1 1 45%;border:1px solid var(--line);background:#fff;border-radius:10px;padding:9px;font-size:13px;cursor:pointer}
.cause button:active{background:var(--brand-soft)}
.cause button.sel{color:#fff;font-weight:600}
.cause-tag{display:inline-block;border-radius:8px;padding:2px 8px;font-size:11px;color:#fff;font-weight:600}
.streak{display:flex;gap:6px;margin:10px 0}
.dot{flex:1;height:8px;border-radius:999px;background:var(--line)}
.dot.on{background:var(--ok)}
.stat{text-align:center;flex:1}
.stat .n{font-size:22px;font-weight:800}
.stat .l{font-size:11px;color:var(--sub);margin-top:2px}
.banner{background:var(--brand-soft);color:var(--brand);border-radius:12px;padding:12px 14px;font-size:13px;line-height:1.6;margin-bottom:12px}
.empty{text-align:center;color:var(--sub);padding:40px 10px;font-size:14px}
.wrong-item{border:1px solid var(--line);border-radius:12px;padding:12px;margin-bottom:9px;background:#fff}
.wrong-item .q{font-size:14px;font-weight:600;margin-bottom:6px}
.katex{font-size:1.02em}
/* 语音朗读控制条 */
.tts-bar{position:fixed;left:50%;transform:translateX(-50%);bottom:22px;z-index:999;
  display:flex;align-items:center;gap:12px;max-width:min(92vw,420px);
  background:#111827;color:#fff;border-radius:14px;padding:10px 14px;
  box-shadow:0 6px 20px rgba(0,0,0,.28);font-size:13px}
.tts-bar span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tts-bar .tts-stop{flex:none;border:0;border-radius:9px;padding:6px 11px;font-size:12px;
  font-weight:600;cursor:pointer;background:#ef4444;color:#fff}
/* 生动感：微动效（尊重系统「减少动效」设置） */
@keyframes cardIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes pop{0%{transform:scale(1)}45%{transform:scale(1.1)}100%{transform:scale(1)}}
@keyframes shake{0%,100%{transform:translateX(0)}20%{transform:translateX(-6px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(4px)}}
@keyframes floatUp{0%{opacity:0;transform:translateY(8px) scale(.85)}22%{opacity:1;transform:translateY(-2px) scale(1.12)}100%{opacity:0;transform:translateY(-30px) scale(1)}}
@media (prefers-reduced-motion: no-preference){
  .card,.kp,.pre-node,.wrong-item{animation:cardIn .26s ease both}
  .pop{animation:pop .34s ease}
  .shake{animation:shake .4s ease}
}
.float-pt{position:absolute;right:14px;top:-10px;font-weight:800;font-size:19px;
  color:var(--ok);text-shadow:0 1px 2px rgba(0,0,0,.12);pointer-events:none;
  animation:floatUp 1.1s ease forwards}
.sol{position:relative}
.combo{display:inline-block;background:var(--warn);color:#fff;border-radius:999px;
  padding:2px 10px;font-size:11px;font-weight:700;animation:pop .34s ease}
.hero{background:linear-gradient(135deg,var(--brand),var(--brand2));color:#fff;border:0}
.hero .h2{color:#fff}
.hero .muted{color:rgba(255,255,255,.85)}
.hero .hs{font-size:26px;font-weight:800;line-height:1.2}
.cheer{background:var(--ok-soft);color:var(--ok);border-radius:12px;padding:10px 12px;
  font-size:13px;font-weight:600;margin-top:8px;text-align:center;animation:pop .34s ease}
/* 几何示意图 */
.diag{background:#fff;border:1px solid var(--line);border-radius:12px;padding:8px;margin-top:10px}
.diag img{width:100%;display:block}
/* 前置知识点链路 */
.pre-node{display:flex;gap:10px;align-items:flex-start;padding:9px 10px;border:1px solid var(--line);border-radius:12px;margin-bottom:8px;background:#fff}
.pre-node:active{background:var(--brand-soft)}
.pre-dot{width:10px;height:10px;border-radius:50%;margin-top:6px;flex:none}
.pre-main{flex:1;min-width:0}
.pre-name{font-weight:600;font-size:13px;line-height:1.5}
.pre-pre{font-size:11px;color:var(--sub);margin-top:3px;line-height:1.7}
.pre-chip{font-weight:600}
.pre-arrow{margin:0 3px;color:var(--line)}
.pre-jump{color:var(--brand);font-weight:600;cursor:pointer}
/* 应用内确认弹窗（替代原生 confirm） */
.modal-ov{position:fixed;inset:0;z-index:1000;background:rgba(15,23,42,.45);display:flex;align-items:center;justify-content:center;padding:24px;animation:cardIn .2s ease both}
.modal{background:#fff;border-radius:16px;padding:18px;max-width:340px;width:100%;box-shadow:0 12px 40px rgba(0,0,0,.25)}
.modal .mt{font-size:16px;font-weight:700;margin-bottom:8px}
.modal .mm{font-size:14px;color:var(--sub);line-height:1.7}
.modal .mr{display:flex;gap:10px;margin-top:16px}
.modal .mr .btn{flex:1}
/* 答题框下方的答案格式提示 */
.ans-hint{margin-top:8px;background:var(--brand-soft);color:var(--brand);border-radius:10px;padding:9px 12px;font-size:13px;line-height:1.5}
.ans-hint b{font-weight:700}
/* 操作成功轻提示 */
.toast{position:fixed;left:50%;top:18px;transform:translateX(-50%);z-index:1200;background:#111827;color:#fff;border-radius:12px;padding:10px 16px;font-size:13px;box-shadow:0 6px 20px rgba(0,0,0,.28);animation:floatUp .3s ease}
/* ============ 付费墙 / 会员 / 兑换码（v0.81） ============ */
.pay-modal{max-width:360px}
.pay-tip{margin:0 0 12px;font-size:13px;color:var(--sub);line-height:1.7}
.pay-prods{display:flex;gap:8px;margin-bottom:12px}
.pay-prod{flex:1;border:1px solid var(--line);border-radius:12px;padding:10px 8px;text-align:center;background:var(--brand-soft)}
.pay-prod-top{display:flex;align-items:center;justify-content:center;gap:4px}
.pay-prod-name{font-weight:700;font-size:14px;color:var(--ink)}
.pay-tag{font-size:10px;background:var(--brand);color:#fff;border-radius:999px;padding:1px 6px}
.pay-prod-price{font-size:20px;font-weight:800;color:var(--brand);margin:4px 0 2px}
.pay-prod-unit{font-size:11px;font-weight:600;color:var(--sub)}
.pay-prod-desc{font-size:11px;color:var(--sub);line-height:1.4}
.pay-flow{font-size:12px;color:var(--sub);line-height:1.7;background:var(--chip);border-radius:10px;padding:8px 10px;margin-bottom:12px}
.pay-flow b{color:var(--ink)}
.pay-redeem-box{display:flex;flex-direction:column;gap:8px}
.pay-input{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;padding:11px 12px;font-size:14px;background:#fff;color:var(--ink)}
.pay-btn{width:100%;border:0;border-radius:12px;padding:12px 16px;font-size:15px;font-weight:700;cursor:pointer;background:var(--brand);color:#fff}
.pay-btn:disabled{opacity:.6}
.pay-msg{font-size:12px;margin-top:8px;min-height:16px;line-height:1.5}
.pay-msg.ok{color:var(--ok)}
.pay-msg.bad{color:var(--bad)}
/* 路径页锁定 / 免费标记 */
.lock-badge{display:inline-block;margin-left:6px;font-size:11px;color:var(--warn);font-weight:600}
.free-badge{display:inline-block;margin-left:6px;font-size:11px;color:var(--ok);font-weight:600}
/* 会员状态卡 */
.sub-card{border:1px solid var(--brand-soft);background:linear-gradient(180deg,var(--brand-soft),#fff)}
.sub-card.ok{border-color:var(--ok-soft)}
.sub-card .btn{width:100%}
/* 生成器 */
.admin-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:8px 0}
.admin-row>span{font-size:13px;color:var(--ink)}
.admin-out{margin-top:10px}
.code-line{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px;background:var(--chip);border-radius:8px;padding:8px 10px;margin:4px 0;cursor:pointer;word-break:break-all;letter-spacing:.5px}
.code-line:hover{background:var(--brand-soft)}
 sect{display:none}
@media(max-width:430px){#phone{height:100vh;height:100dvh}}
/* ============ 皮肤切换（data-skin 覆盖变量） ============ */
[data-skin="orange"]{
  --brand:#ff7a18; --brand-soft:#fff1e6; --brand2:#ff9d4d;
  --bg:#fff7f0; --chip:#fdeede; --mascot:#ff7a18;
}
[data-skin="pink"]{
  --brand:#ff4d8d; --brand-soft:#ffe6f0; --brand2:#ff7eb0;
  --bg:#fff5f9; --chip:#ffe9f2; --mascot:#ff4d8d;
}
[data-skin="dark"]{
  --bg:#161a24; --card:#222838; --ink:#e8ebf2; --sub:#9aa4bd;
  --line:#323a4f; --brand:#5b9dff; --brand-soft:#1f2c44; --brand2:#7fb4ff;
  --ok:#3ddc84; --ok-soft:#16331f; --warn:#ffb454; --warn-soft:#33280f;
  --bad:#ff6b8a; --bad-soft:#331420; --chip:#2a3142; --mascot:#5b9dff;
}
[data-skin="dark"] .card,[data-skin="dark"] .kp,[data-skin="dark"] .wrong-item,[data-skin="dark"] .ch-btn,
[data-skin="dark"] .cause button,[data-skin="dark"] .dcard,[data-skin="dark"] .map .node,[data-skin="dark"] .pre-node{
  background:var(--card);
}
[data-skin="dark"] .banner{background:var(--brand-soft);color:var(--brand)}
[data-skin="dark"] .hint-box{color:#ffd9a0}
/* ============ 吉祥物「数宝」 ============ */
.mascot{position:absolute;right:12px;bottom:66px;z-index:60;display:flex;align-items:flex-end;gap:8px;max-width:80vw;pointer-events:none}
.mascot .face{font-size:34px;pointer-events:auto;cursor:pointer;filter:drop-shadow(0 3px 6px rgba(0,0,0,.18));animation:bob 2.6s ease-in-out infinite}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
.mascot .bubble{background:#fff;border:1px solid var(--line);border-radius:14px 14px 4px 14px;padding:9px 12px;font-size:12.5px;line-height:1.55;color:var(--ink);box-shadow:0 6px 18px rgba(0,0,0,.14);max-width:235px;pointer-events:auto}
.mascot .bubble b{color:var(--brand)}
[data-skin="dark"] .mascot .bubble{background:var(--card);border-color:var(--line)}
/* ============ 错因「抓凶手」卡牌 ============ */
.detective{margin-top:10px}
.detective .dh{font-weight:700;font-size:14px;margin-bottom:7px}
.dcard{position:relative;border:1px solid var(--line);border-radius:14px;padding:12px;margin-bottom:8px;background:#fff;cursor:pointer;overflow:hidden;transition:transform .14s,background .2s}
.dcard:active{transform:scale(.98)}
.dcard .back{display:flex;align-items:center;gap:10px}
.dcard .emo{font-size:26px}
.dcard .suspect{font-weight:700;font-size:14px}
.dcard .hint{font-size:11px;color:var(--sub)}
.dcard.flip{background:var(--brand-soft);border-color:var(--brand)}
.dcard .front{display:none}
.dcard.flip .back{display:none}
.dcard.flip .front{display:block;animation:cardIn .25s ease both}
.dcard .cname{font-weight:700;color:var(--brand)}
.dcard .cfix{font-size:12px;color:var(--ink);margin-top:5px;line-height:1.55}
.dcard .tag{display:inline-block;margin-top:7px;font-size:11px;font-weight:700;border-radius:999px;padding:3px 10px}
.dcard .tag.got{background:var(--ok);color:#fff}
.dcard .tag.miss{background:var(--chip);color:var(--sub)}
/* ============ 各章节专项练习 ============ */
.sp-group{margin-top:8px}
.sp-gt{font-size:13px;font-weight:800;color:var(--brand);margin:6px 0 4px}
.sp-sub{font-size:11px;color:var(--sub);margin:4px 0 2px}
.sp-btn{display:block;width:100%;text-align:left;background:#fff;border:1px solid var(--line);border-radius:10px;padding:8px 10px;margin:5px 0;cursor:pointer}
.sp-btn:active{transform:scale(.99)}
.sp-btn .nm{font-size:13px;font-weight:700;line-height:1.35}
.sp-btn .meta{font-size:11px;color:var(--sub);margin-top:2px;word-break:break-all}
.sp-detail{margin:0 0 8px;padding:8px 10px;background:var(--chip);border-radius:10px;border:1px dashed var(--line)}
.sp-prev .sp-h{font-size:11px;color:var(--ink);margin-top:5px;line-height:1.5}
.badge.ok{background:var(--ok);color:#fff}
.badge.ex{background:var(--brand);color:#fff}
/* 「对应教材第X章」标签：专项练习/讲解按中考专题组织，用它挂回人教版章节 */
.badge.ch{background:var(--chip);color:var(--ink);border:1px solid var(--line);margin-right:5px}
.sp-row{display:flex;gap:6px;align-items:stretch}
.sp-mini{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;min-width:52px;background:#fff;border:1px solid var(--brand);color:var(--brand);border-radius:10px;font-size:13px;font-weight:700;cursor:pointer;padding:6px 6px;font-family:inherit}
.sp-mini span{font-size:10px;font-weight:600}
.sp-mini:active{transform:scale(.97)}
/* ---- 专项练习 · 开练模式 ---- */
.spq-stem{font-size:14px;line-height:1.75;margin:6px 0;color:var(--ink)}
.spq-figs{margin:8px 0}
.spq-fig{display:block;width:100%;height:auto;max-width:520px;border:1px solid var(--line);border-radius:10px;background:#fff;margin:6px 0}
[data-skin="dark"] .spq-fig{background:#fff}
.spq-opts{display:flex;flex-direction:column;gap:7px;margin-top:6px}
.spq-opt{display:block;width:100%;text-align:left;background:#fff;border:1px solid var(--line);border-radius:10px;padding:9px 11px;font-size:13.5px;line-height:1.6;color:var(--ink);cursor:pointer;font-family:inherit}
.spq-opt:active{transform:scale(.99)}
.spq-opt.sel{border-color:var(--brand);background:var(--brand-soft);font-weight:600}
.spq-opt:disabled{cursor:default;opacity:.85}
.spq-opt.sel:disabled{opacity:1}
.spq-optimg{max-width:200px;max-height:140px;display:block;margin:6px auto 0;border:1px solid var(--line);border-radius:6px;background:#fff}
.spq-fb{margin-top:10px;padding:9px 11px;border-radius:10px;font-size:13.5px;font-weight:700}
.spq-fb.ok{background:#e7f7ec;color:#1a7f37}
.spq-fb.no{background:#fdecec;color:#c0392b}
.spq-ana{margin-top:8px;padding:9px 11px;border-radius:10px;background:var(--chip);font-size:12.5px;line-height:1.75;color:var(--ink);white-space:normal}
.spq-sum{margin:8px 0;padding:10px 12px;border-radius:10px;background:var(--brand-soft);font-size:13.5px;font-weight:700;color:var(--brand);line-height:1.7}
/* ---- 知识讲解（模型方法精讲）---- */
.ex-intro{padding:9px 11px;border-radius:10px;background:var(--chip);font-size:12.5px;line-height:1.8;color:var(--ink)}
.ex-maplist{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.ex-maplist .mp{font-size:11.5px;padding:4px 9px;border-radius:999px;background:var(--brand-soft);color:var(--brand);font-weight:600}
.ex-model{margin-top:9px;padding:9px 11px;border:1px solid var(--line);border-left:3px solid var(--brand);border-radius:10px;background:#fff}
.ex-model .mh{font-size:13px;font-weight:800;color:var(--brand)}
.ex-model .mb{font-size:12.5px;line-height:1.8;color:var(--ink);margin-top:4px;white-space:normal}
.ex-model .mb em{font-style:normal;font-weight:700;color:var(--brand)}
/* 提分笔记重点说明事项高亮（拓展延伸/归纳总结/注意/方法点拨/实际意义/易错提醒 等） */
.note-hl{color:#e8590c;font-weight:700;background:rgba(232,89,12,.10);border-radius:4px;padding:0 2px}
.ex-n{font-size:11px;color:var(--sub);margin-top:6px;line-height:1.6}
/* ---- 真题原图（截取自官方试卷，非重画）---- */
.pfig{margin-top:8px}
.pfig img{display:block;width:100%;height:auto;max-width:520px;border:1px solid var(--line);border-radius:10px;background:#fff}
.pfig-cap{font-size:11px;color:var(--sub);margin-top:4px}
[data-skin="dark"] .pfig img{background:#fff}
/* ============ 皮肤色板 ============ */
.skins{display:flex;gap:12px;margin-top:8px;align-items:center}
.skins .sw{width:34px;height:34px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px var(--line);cursor:pointer}
.skins .sw.on{box-shadow:0 0 0 2px var(--brand)}
/* ============ 示意图（内联 SVG，随皮肤变色） ============ */
.diagfig{margin:10px 0 2px}
.diagfig .dfbox{border:1px solid var(--line);border-radius:12px;background:#fff;padding:8px 6px}
.diagfig svg,.diag svg{width:100%;height:auto;max-height:230px;display:block;color:var(--ink)}
.diagfig svg .f,.diag svg .f{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.diagfig svg .d,.diag svg .d{fill:none;stroke:currentColor;stroke-width:1.6;stroke-dasharray:5 4}
.diagfig svg .g,.diag svg .g{fill:var(--brand-soft);stroke:var(--brand);stroke-width:2;stroke-linejoin:round}
.diagfig svg .fp,.diag svg .fp{fill:currentColor}
.diagfig svg .t,.diag svg .t{fill:currentColor;font-size:13px;font-weight:600;font-family:inherit}
.diagfig .dfnote{font-size:11px;color:var(--sub);text-align:center;margin-top:6px}
[data-skin="dark"] .diagfig .dfbox{background:var(--card)}

/* ============ 每日目标 · 连续打卡 · 错因统计 ============ */
.goalbar{margin-top:10px;padding:9px 10px;border-radius:10px;background:rgba(255,255,255,.18);color:#fff;font-size:13px}
.goal-opts{display:flex;gap:8px;margin-top:8px}
.goal-opts .btn{flex:1;padding:8px 0}
.crow{padding:8px 0;border-top:1px dashed var(--line)}
.crow:first-of-type{border-top:0}
.cbar{height:8px;border-radius:6px;background:var(--chip);overflow:hidden;margin-top:5px}
.cbar i{display:block;height:100%;border-radius:6px;transition:width .35s ease}
.ccnt{display:inline-block;margin-left:6px;font-size:11px;font-weight:600;padding:1px 7px;border-radius:9px;background:rgba(0,0,0,.08);color:var(--sub)}
/* 摸底诊断 */
.diag-entry{border-left:4px solid #6366f1}
.diag-row{display:flex;align-items:center;gap:8px;padding:8px 4px;border-top:1px solid var(--line)}
.diag-row:first-of-type{border-top:0}
.diag-row .dn{flex:1;font-size:13px;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.diag-row .badge{margin-right:2px}

/* ---------- 中考真题计时模考 ---------- */
.exam-bar{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--card);border-bottom:1px solid var(--line)}
.exam-timer{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;color:#e11d48;min-width:62px}
.exam-timer.low{color:#e11d48;animation:tpulse 1s infinite}
@keyframes tpulse{50%{opacity:.45}}
.exam-bar-meta{flex:1;font-size:11px;color:var(--sub)}
.exam-nav{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px}
.exam-navbtn{width:34px;height:34px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--sub);font-size:13px;font-weight:600}
.exam-navbtn.done{background:#e0f2fe;border-color:#38bdf8;color:#0369a1}
.exam-sec{font-weight:700;margin:14px 12px 4px;font-size:14px}
.exam-q{padding:10px 12px;border-bottom:1px solid var(--line)}
.exam-qno{font-weight:700;font-size:13px;margin-bottom:4px}
.exam-stem{line-height:1.6;font-size:14px;white-space:pre-wrap}
.exam-opts{margin-top:8px;display:flex;flex-direction:column;gap:6px}
.exam-opt{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);font-size:13px;line-height:1.4}
.exam-opt input{margin-top:2px}
.exam-input{margin-top:8px;width:100%;box-sizing:border-box;padding:10px;border:1px solid var(--line);border-radius:8px;font-size:15px;background:var(--bg);color:var(--text)}
.exam-area{margin-top:8px;width:100%;box-sizing:border-box;min-height:90px;padding:10px;border:1px solid var(--line);border-radius:8px;font-size:14px;background:var(--bg);color:var(--text);resize:vertical}
.exam-report-hd{text-align:center}
.exam-report-score{font-size:40px;font-weight:800;color:#e11d48}
.exam-report-score span{font-size:16px;color:var(--sub);font-weight:600}
.exam-solve{padding:10px 0;border-top:1px solid var(--line)}
.exam-solve:first-of-type{border-top:0}
.exam-ans{margin-top:6px;font-size:13px}
.exam-ans summary{cursor:pointer;color:#0369a1;font-size:12px}
.exam-self{margin-top:6px;display:flex;align-items:center;gap:6px}
.btn.xs{padding:3px 10px;font-size:12px;border-radius:7px}
.btn.xs.on{background:#16a34a;color:#fff;border-color:#16a34a}
.exam-total{font-size:15px;margin-bottom:6px}
.exam-total b{font-size:24px;color:#e11d48}
.exam-wrong{display:flex;flex-direction:column;gap:4px;margin-top:4px}
.exam-wrong-row{font-size:12px;padding:6px 8px;background:var(--bg);border-radius:6px;border-left:3px solid #f59e0b;line-height:1.4}

/* ---------- 中考真题计时模考 ---------- */
.exam-bar{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--card);border-bottom:1px solid var(--line)}
.exam-timer{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;color:#e11d48;min-width:62px}
.exam-timer.low{color:#e11d48;animation:tpulse 1s infinite}
@keyframes tpulse{50%{opacity:.45}}
.exam-bar-meta{flex:1;font-size:11px;color:var(--sub)}
.exam-nav{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px}
.exam-navbtn{width:34px;height:34px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--sub);font-size:13px;font-weight:600}
.exam-navbtn.done{background:#e0f2fe;border-color:#38bdf8;color:#0369a1}
.exam-sec{font-weight:700;margin:14px 12px 4px;font-size:14px}
.exam-q{padding:10px 12px;border-bottom:1px solid var(--line)}
.exam-qno{font-weight:700;font-size:13px;margin-bottom:4px}
.exam-stem{line-height:1.6;font-size:14px;white-space:pre-wrap}
.exam-opts{margin-top:8px;display:flex;flex-direction:column;gap:6px}
.exam-opt{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);font-size:13px;line-height:1.4}
.exam-opt input{margin-top:2px}
.exam-input{margin-top:8px;width:100%;box-sizing:border-box;padding:10px;border:1px solid var(--line);border-radius:8px;font-size:15px;background:var(--bg);color:var(--text)}
.exam-area{margin-top:8px;width:100%;box-sizing:border-box;min-height:90px;padding:10px;border:1px solid var(--line);border-radius:8px;font-size:14px;background:var(--bg);color:var(--text);resize:vertical}
.exam-report-hd{text-align:center}
.exam-report-score{font-size:40px;font-weight:800;color:#e11d48}
.exam-report-score span{font-size:16px;color:var(--sub);font-weight:600}
.exam-solve{padding:10px 0;border-top:1px solid var(--line)}
.exam-solve:first-of-type{border-top:0}
.exam-ans{margin-top:6px;font-size:13px}
.exam-ans summary{cursor:pointer;color:#0369a1;font-size:12px}
.exam-self{margin-top:6px;display:flex;align-items:center;gap:6px}
.btn.xs{padding:3px 10px;font-size:12px;border-radius:7px}
.btn.xs.on{background:#16a34a;color:#fff;border-color:#16a34a}
.exam-total{font-size:15px;margin-bottom:6px}
.exam-total b{font-size:24px;color:#e11d48}
.exam-wrong{display:flex;flex-direction:column;gap:4px;margin-top:4px}
.exam-wrong-row{font-size:12px;padding:6px 8px;background:var(--bg);border-radius:6px;border-left:3px solid #f59e0b;line-height:1.4}

/* 解答题分步得分点（勾选式自评，v0.40） */
.exam-got{float:right;font-size:12px;font-weight:700;color:var(--sub)}
.exam-got.ok{color:#16a34a}
.exam-steps{margin-top:6px;display:flex;flex-direction:column;gap:4px}
.exam-step{display:flex;align-items:flex-start;gap:6px;padding:6px 8px;border:1px solid var(--line);
  border-radius:8px;background:#fbfcfe;cursor:pointer;font-size:13px;line-height:1.45;user-select:none}
.exam-step .cb{color:var(--sub);font-size:14px;flex:0 0 auto}
.exam-step .st{flex:1}
.exam-step .ss{flex:0 0 auto;color:var(--sub);font-size:12px}
.exam-step.on{background:var(--ok-soft);border-color:#bfe6cc}
.exam-step.on .cb{color:#16a34a}
.exam-step.on .ss{color:#16a34a;font-weight:700}

/* 🎯 专注模式（番茄钟）+ 目标梯度提示（v0.41） */
.banner.goal{background:linear-gradient(90deg,#fff7e6,#fffdf8);border-left:3px solid #f59e0b}
.focus-bar{display:flex;align-items:center;gap:8px;background:#f6f8fc;border:1px dashed var(--line);border-radius:8px;padding:6px 8px}
.focus-bar.on{background:var(--brand-soft);border:1px solid #c7dbff}
.focus-bar.on #focusTime{color:var(--brand);font-size:13px}

/* 👨‍👩‍👦 家长看板（v0.41） */
.pbars{display:flex;align-items:flex-end;gap:2px;height:48px}
.pbar{flex:1;border-radius:2px;min-width:2px}

/* ============ 满屏水印「青砚承露」（v0.75） ============
   需求：满屏平铺，真正 90% 透明（极淡，fill-opacity=0.1）。
   实现要点：
   ① 用 SVG data-URI 作 background-image 平铺，比逐个 DOM 节点省一个数量级的元素；
      文字已在 SVG 内旋转 -30°，无需 CSS transform，缩放时也不会糊。
   ② 固定定位铺满视口（不随 #phone 滚动），z-index 置于内容之上、弹层之下，
      pointer-events:none 保证不拦截任何点击。
   ③ 打印时隐藏，避免污染错题本的「导出/打印」稿。            */
#watermark{
  position:fixed; inset:0; z-index:900;
  pointer-events:none; user-select:none;
  background-repeat:repeat;
  background-position:center center;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='260' height='170' viewBox='0 0 260 170'%3E%3Ctext x='75' y='55' fill='%232f6bff' fill-opacity='0.1' font-size='24' font-family='PingFang SC,Microsoft YaHei,sans-serif' font-weight='700' text-anchor='middle' dominant-baseline='central' transform='rotate(-30 75 55)'%3E%E9%9D%92%E7%A0%9A%E6%89%BF%E9%9C%B2%3C/text%3E%3Ctext x='200' y='130' fill='%232f6bff' fill-opacity='0.1' font-size='24' font-family='PingFang SC,Microsoft YaHei,sans-serif' font-weight='700' text-anchor='middle' dominant-baseline='central' transform='rotate(-30 200 130)'%3E%E9%9D%92%E7%A0%9A%E6%89%BF%E9%9C%B2%3C/text%3E%3C/svg%3E");
}
@media print{ #watermark{display:none!important} }
