/* 高中生学习工作台 · 样式（从单文件拆分而来，勿改主题变量） */
:root{
  --blue:#2563eb; --blue-d:#1d4ed8; --blue-l:#eff6ff;
  --ink:#1e293b; --ink2:#64748b; --line:#e2e8f0;
  --bg:#f1f5f9; --card:#ffffff; --ok:#16a34a; --ok-l:#f0fdf4;
  --warn:#f59e0b; --warn-l:#fffbeb; --bad:#dc2626; --bad-l:#fef2f2;
  --radius:16px;
  --shadow:0 1px 3px rgba(15,23,42,.06),0 8px 24px rgba(15,23,42,.05);
}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html{scroll-behavior:smooth}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--ink);font-size:15px;line-height:1.6;
}
/* ===== 顶部 ===== */
.topbar{
  position:sticky;top:0;z-index:50;
  background:linear-gradient(135deg,#2563eb,#1d4ed8);
  color:#fff;padding:12px 16px 0;
}
.topbar-inner{max-width:1080px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:12px}
.brand{display:flex;align-items:center;gap:10px;font-weight:700;font-size:17px;letter-spacing:.5px}
.brand svg{flex:none}
.points-chip{
  display:flex;align-items:center;gap:6px;background:rgba(255,255,255,.16);
  border:1px solid rgba(255,255,255,.25);border-radius:999px;padding:5px 14px;
  font-weight:700;font-size:14px;backdrop-filter:blur(4px);cursor:pointer;min-height:44px;
}
.points-chip .lv{font-size:11px;font-weight:600;opacity:.85;background:rgba(255,255,255,.22);border-radius:999px;padding:2px 8px;margin-left:4px}
.backup-row{
  max-width:1080px;margin:0 auto;display:flex;gap:8px;padding:10px 0 8px;overflow-x:auto;
}
.backup-row::-webkit-scrollbar{height:0}
.mini-btn{
  flex:none;display:inline-flex;align-items:center;gap:5px;background:rgba(255,255,255,.14);
  border:1px solid rgba(255,255,255,.28);color:#fff;border-radius:10px;
  padding:7px 12px;font-size:12.5px;font-weight:600;cursor:pointer;min-height:36px;transition:.2s;
}
.mini-btn:hover{background:rgba(255,255,255,.26)}
.mini-btn.warn{background:rgba(220,38,38,.55);border-color:rgba(255,255,255,.35)}
.mini-btn.dev{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.18);color:#bfdbfe;opacity:.7;font-size:12px}
.mini-btn.dev:hover{background:rgba(255,255,255,.18);opacity:1}
/* 科目切换 */
.subj-tabs{
  max-width:1080px;margin:0 auto;display:flex;gap:6px;padding:0 0 10px;overflow-x:auto;
}
.subj-tabs::-webkit-scrollbar{height:0}
.subj-tab{
  flex:none;display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:12px 12px 0 0;
  background:rgba(255,255,255,.12);color:#dbeafe;font-weight:600;font-size:14px;cursor:pointer;
  border:1px solid transparent;border-bottom:none;transition:.2s;min-height:42px;
}
.subj-tab.on{background:#fff;color:var(--blue-d)}
.subj-tab.soon{color:#bfdbfe;opacity:.75}
.subj-tab .soon-tag{font-size:10px;background:rgba(255,255,255,.25);border-radius:999px;padding:1px 6px}
/* ===== 主体 ===== */
.wrap{max-width:1080px;margin:0 auto;padding:16px 16px calc(90px + env(safe-area-inset-bottom))}
/* 视图切换（桌面） */
.view-tabs{
  display:flex;gap:4px;background:#fff;border:1px solid var(--line);border-radius:14px;
  padding:5px;margin-bottom:16px;box-shadow:var(--shadow);
  position:sticky;top:var(--topbar-h,128px);z-index:30;
}
.view-tab{
  flex:1;min-width:96px;display:flex;align-items:center;justify-content:center;gap:6px;
  padding:9px 6px;border-radius:10px;font-size:13.5px;font-weight:600;color:var(--ink2);
  cursor:pointer;transition:.2s;border:none;background:transparent;white-space:nowrap;
}
.view-tab svg{flex:none}
.view-tab.on{background:var(--blue);color:#fff}
section.view{display:none;animation:fade .25s ease}
section.view.on{display:block}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
/* ===== 卡片 ===== */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px;margin-bottom:16px}
.card-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px}
.card-h h2{font-size:16.5px;font-weight:700;display:flex;align-items:center;gap:8px}
.card-h h2 svg{color:var(--blue)}
.card-h .sub{font-size:12px;color:var(--ink2);font-weight:500}
/* ===== 今天要处理 ===== */
.today{background:linear-gradient(135deg,#fff,#f8faff);border:1px solid #dbeafe}
.today .card-h h2{color:var(--blue-d)}
.today-list{display:flex;flex-direction:column;gap:10px}
.today-item{
  display:flex;align-items:center;gap:12px;background:#fff;border:1px solid var(--line);
  border-radius:12px;padding:12px 14px;cursor:pointer;transition:.15s;
}
.today-item:hover{border-color:#bfdbfe;box-shadow:0 2px 8px rgba(37,99,235,.08)}
.today-item .t-ico{flex:none;width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center}
.today-item.overdue .t-ico{background:var(--bad-l);color:var(--bad)}
.today-item.due .t-ico{background:var(--warn-l);color:var(--warn)}
.today-item.review .t-ico{background:var(--blue-l);color:var(--blue)}
.today-item .t-body{flex:1;min-width:0}
.today-item .t-title{font-weight:600;font-size:14.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.today-item .t-meta{font-size:12px;color:var(--ink2);margin-top:1px}
.today-item.overdue .t-title{color:var(--bad)}
.today-item .t-badge{flex:none;font-size:11px;font-weight:700;padding:3px 9px;border-radius:999px}
.today-item.overdue .t-badge{background:var(--bad-l);color:var(--bad)}
.today-item.due .t-badge{background:var(--warn-l);color:var(--warn)}
.today-item.review .t-badge{background:var(--blue-l);color:var(--blue)}
.today-item .t-btn{
  flex:none;min-height:44px;display:inline-flex;align-items:center;gap:5px;border:none;border-radius:10px;
  padding:0 14px;font-size:13px;font-weight:700;cursor:pointer;transition:.15s;
}
.today-item.overdue .t-btn,.today-item.due .t-btn{background:var(--blue);color:#fff}
.today-item.overdue .t-btn:hover,.today-item.due .t-btn:hover{background:var(--blue-d)}
.today-item.review .t-btn{background:var(--warn);color:#fff}
.empty{text-align:center;color:var(--ink2);font-size:13.5px;padding:18px 10px}
.empty svg{opacity:.4;margin-bottom:6px}
/* ===== 统计卡 ===== */
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.stat-card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px;box-shadow:var(--shadow)}
.stat-card .s-num{font-size:24px;font-weight:800;color:var(--blue-d);line-height:1.2}
.stat-card .s-label{font-size:12px;color:var(--ink2);margin-top:2px}
.stat-card.orange .s-num{color:#d97706}
.stat-card.green .s-num{color:var(--ok)}
.stat-card.red .s-num{color:var(--bad)}
/* ===== 各科 ===== */
.subj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.subj-card{
  background:#fff;border:1px solid var(--line);border-radius:14px;padding:16px;cursor:pointer;transition:.2s;position:relative;overflow:hidden;
}
.subj-card:hover{transform:translateY(-2px);box-shadow:var(--shadow)}
.subj-card .sc-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.subj-card .sc-ico{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;color:#fff}
.subj-card .sc-name{font-weight:700;font-size:15px}
.subj-card .sc-desc{font-size:12px;color:var(--ink2);margin-top:2px}
.subj-card .sc-bar{height:6px;background:var(--bg);border-radius:99px;margin-top:12px;overflow:hidden}
.subj-card .sc-bar i{display:block;height:100%;border-radius:99px;background:var(--blue);transition:.4s}
.subj-card .sc-stat{display:flex;justify-content:space-between;font-size:11.5px;color:var(--ink2);margin-top:6px}
.subj-card.soon-card{opacity:.75;background:var(--bg)}
.subj-card.soon-card .soon-tag{position:absolute;top:10px;right:10px;font-size:10px;background:#e2e8f0;color:var(--ink2);border-radius:999px;padding:2px 8px;font-weight:600}
/* ===== 趋势图 ===== */
.chart-wrap{overflow-x:auto}
svg.barchart{display:block;width:100%;min-width:520px}
/* ===== 模块通用 ===== */
.add-bar{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
.input,.select,.textarea{
  border:1.5px solid var(--line);border-radius:11px;padding:10px 12px;font-size:16px;
  font-family:inherit;color:var(--ink);background:#fff;outline:none;transition:.15s;min-height:44px;
}
.input:focus,.select:focus,.textarea:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
.textarea{min-height:64px;resize:vertical}
.add-bar .input{flex:1;min-width:180px}
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:11px;
  padding:0 18px;font-size:14.5px;font-weight:700;cursor:pointer;transition:.15s;min-height:44px;
}
.btn.primary{background:var(--blue);color:#fff}
.btn.primary:hover{background:var(--blue-d)}
.btn.ghost{background:var(--blue-l);color:var(--blue-d);border:1px solid #dbeafe}
.btn.ghost:hover{background:#dbeafe}
.btn.ghost.on{background:var(--blue);color:#fff;border-color:var(--blue-d);font-weight:600}
.btn.ghost.on:hover{background:var(--blue-d)}
.btn.soft{background:var(--bg);color:var(--ink2)}
.btn.soft:hover{background:#e2e8f0}
.btn.soft.on{background:var(--blue);color:#fff;border-color:var(--blue-d);font-weight:600}
.btn.soft.on:hover{background:var(--blue-d)}
.btn.danger{background:var(--bad-l);color:var(--bad)}
.btn.sm{min-height:36px;padding:0 12px;font-size:12.5px;border-radius:9px}
.btn:active{transform:scale(.97)}
/* 任务 */
.task-item{background:#fff;border:1px solid var(--line);border-radius:13px;padding:14px;margin-bottom:12px;transition:.15s}
.task-item.overdue-task{border-color:#fecaca;background:linear-gradient(135deg,#fff,#fef2f2)}
.task-item.done-task{opacity:.62}
.task-head{display:flex;align-items:flex-start;gap:10px}
.task-head .chk{
  flex:none;width:26px;height:26px;border-radius:8px;border:2px solid #cbd5e1;cursor:pointer;
  display:flex;align-items:center;justify-content:center;margin-top:2px;transition:.15s;background:#fff;color:transparent;
}
.task-head .chk.checked{background:var(--ok);border-color:var(--ok);color:#fff}
.task-title{flex:1;font-weight:600;font-size:14.5px}
.task-title .tag{display:inline-block;font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:999px;margin-left:6px;vertical-align:2px}
.tag.homework{background:var(--blue-l);color:var(--blue-d)}
.tag.review{background:var(--warn-l);color:#b45309}
.tag.preview{background:#f0fdf4;color:var(--ok)}
.tag.exam{background:#faf5ff;color:#7c3aed}
.task-meta{font-size:12px;color:var(--ink2);margin-top:3px;display:flex;gap:12px;flex-wrap:wrap}
.task-meta .late{color:var(--bad);font-weight:700}
.steps{margin:12px 0 4px;padding-left:6px;display:flex;flex-direction:column;gap:6px}
.step{display:flex;align-items:center;gap:9px;font-size:13.5px;color:var(--ink2)}
.step .step-chk{
  flex:none;width:22px;height:22px;border-radius:7px;border:2px solid #cbd5e1;cursor:pointer;
  display:flex;align-items:center;justify-content:center;transition:.15s;background:#fff;color:transparent;font-size:12px;
}
.step .step-chk.checked{background:var(--ok);border-color:var(--ok);color:#fff}
.step.done-step{color:#94a3b8;text-decoration:line-through}
.step-txt{flex:1}
.task-foot{display:flex;justify-content:space-between;align-items:center;margin-top:10px;padding-top:10px;border-top:1px dashed var(--line)}
.task-foot .prog{font-size:12px;color:var(--ink2);font-weight:600}
.task-foot .prog b{color:var(--blue-d);font-size:14px}
.progbar{height:5px;background:var(--bg);border-radius:99px;overflow:hidden;margin-top:6px}
.progbar i{display:block;height:100%;background:var(--blue);border-radius:99px;transition:.4s}
/* 拆解提示 */
.decompose-hint{
  background:var(--warn-l);border:1px dashed #fcd34d;border-radius:11px;padding:10px 14px;
  font-size:12.5px;color:#92400e;margin-bottom:12px;display:flex;gap:8px;align-items:flex-start;
}
.decompose-hint svg{flex:none;margin-top:2px}
/* 学习锦囊卡 */
.tip-card{background:#fffbeb;border:1px solid #fde68a;border-radius:11px;padding:10px 13px;margin:10px 0 4px}
.tip-title{display:flex;align-items:center;gap:6px;font-size:12.5px;color:#92400e;margin-bottom:6px}
.tip-title svg{color:#d97706;flex:none}
.tip-line{display:flex;gap:7px;font-size:12px;color:#78350f;line-height:1.7}
.tip-line .tip-k{flex:none;font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:6px;background:#dbeafe;color:#1d4ed8;height:18px;line-height:16px;margin-top:1px}
.tip-line .tip-k.warn{background:#fee2e2;color:#b91c1c}
.tip-line .tip-k.ok{background:#dcfce7;color:#15803d}
/* 错题知识点分组 */
.mk-group{margin-bottom:8px}
.mk-group-h{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:700;color:var(--blue-d);padding:8px 4px 6px}
.mk-group-h svg{color:var(--blue)}
.mk-group-h span{font-size:11px;font-weight:600;background:var(--blue-l);color:var(--blue-d);border-radius:999px;padding:1px 9px}
.mk-group-h b{color:var(--ink)}
/* 公式/错题 */
.f-item{background:#fff;border:1px solid var(--line);border-radius:13px;padding:14px;margin-bottom:12px}
.f-item .f-top{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap}
.f-cat{font-size:10.5px;font-weight:700;padding:2px 9px;border-radius:999px;background:var(--blue-l);color:var(--blue-d)}
.f-cat.cat-shulie{background:#f0fdf4;color:var(--ok)}
.f-cat.cat-sanjiao{background:var(--warn-l);color:#b45309}
.f-cat.cat-jihe{background:#faf5ff;color:#7c3aed}
.f-cat.cat-gailv{background:#fdf2f8;color:#be185d}
.f-cat.cat-qita{background:#f1f5f9;color:var(--ink2)}
.f-kind{font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:999px;background:#eef2ff;color:#4f46e5}
.f-name{flex:1;font-weight:700;font-size:14.5px}
/* v3.9.7 六次修复：word-break:break-all → overflow-wrap:break-word
   原 break-all 强制字符级断行，会在 KaTeX 输出内的 inline-block 边界（如 \frac{}{} 的 "}{"）切散成新视觉行，
   导致 }{ / \} / $  等关键字符被截到不完整位置 → KaTeX 报 katex-error 红字。
   overflow-wrap:break-word 更温和，只在中文/超长词边界断，不破坏 inline-block 内部 */
.f-formula{background:var(--bg);border-radius:10px;padding:10px 14px;font-size:14.5px;font-family:"Cambria Math","Times New Roman",serif;margin:8px 0;color:var(--ink);white-space:pre-wrap;overflow-wrap:break-word}
.f-ans{
  background:#fffbeb;border-left:3px solid var(--warn);border-radius:8px;padding:8px 12px;
  font-size:13px;color:#92400e;margin-top:8px;white-space:pre-wrap;display:none;overflow-wrap:break-word;
}
.f-ans.show{display:block}
.f-foot{display:flex;align-items:center;justify-content:space-between;margin-top:10px;flex-wrap:wrap;gap:8px}
.f-foot .meta{font-size:11.5px;color:var(--ink2)}
.f-actions{display:flex;gap:6px;flex-wrap:wrap}
.mastery{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:700;padding:4px 10px;border-radius:999px}
.mastery.m0{background:var(--bad-l);color:var(--bad)}
.mastery.m1{background:var(--warn-l);color:#b45309}
.mastery.m2{background:var(--ok-l);color:var(--ok)}
.mastery.m3{background:var(--ok-l);color:var(--ok)}
/* 错题回顾 */
.review-mode{background:var(--blue-l);border:1.5px solid #bfdbfe;border-radius:13px;padding:14px;margin-bottom:14px}
.review-mode .rm-q{font-weight:700;font-size:14.5px;margin-bottom:6px}
.review-mode .rm-detail{font-size:13px;color:var(--ink2);white-space:pre-wrap;margin-bottom:10px}
.review-mode .rm-btns{display:flex;gap:8px;flex-wrap:wrap}
/* ===== 奖励 ===== */
.reward-top{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}
.reward-stat{background:linear-gradient(135deg,#fff8ec,#fff);border:1px solid #fde68a;border-radius:14px;padding:14px;text-align:center}
.reward-stat .r-num{font-size:26px;font-weight:800;color:#d97706}
.reward-stat .r-label{font-size:12px;color:#92400e;margin-top:2px}
.level-banner{
  display:flex;align-items:center;gap:14px;background:linear-gradient(135deg,#2563eb,#4f46e5);
  color:#fff;border-radius:16px;padding:16px;margin-bottom:16px;
}
.level-banner .lb-ico{flex:none;width:54px;height:54px;border-radius:50%;background:rgba(255,255,255,.18);display:flex;align-items:center;justify-content:center}
.level-banner .lb-name{font-size:20px;font-weight:800}
.level-banner .lb-sub{font-size:12px;opacity:.85;margin-top:2px}
.level-banner .lb-bar{flex:1;height:10px;background:rgba(255,255,255,.22);border-radius:99px;overflow:hidden;min-width:120px}
.level-banner .lb-bar i{display:block;height:100%;background:#fbbf24;border-radius:99px;transition:.4s}
.ach-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}
.ach-item{background:#fff;border:1px solid var(--line);border-radius:13px;padding:14px;text-align:center;transition:.2s}
.ach-item.locked{opacity:.45;filter:grayscale(1)}
.ach-item .a-ico{width:42px;height:42px;border-radius:50%;background:var(--warn-l);color:#d97706;display:flex;align-items:center;justify-content:center;margin:0 auto 8px}
.ach-item .a-name{font-size:12.5px;font-weight:700}
.ach-item .a-desc{font-size:11px;color:var(--ink2);margin-top:2px}
.shop-item{display:flex;align-items:center;gap:12px;background:#fff;border:1px solid var(--line);border-radius:13px;padding:13px;margin-bottom:10px}
.shop-item .sh-ico{flex:none;width:42px;height:42px;border-radius:12px;background:var(--blue-l);color:var(--blue);display:flex;align-items:center;justify-content:center}
.shop-item .sh-body{flex:1;min-width:0}
.shop-item .sh-name{font-weight:700;font-size:14px}
.shop-item .sh-desc{font-size:12px;color:var(--ink2)}
.shop-item .sh-cost{font-size:13px;font-weight:800;color:#d97706;white-space:nowrap}
.flow-list{max-height:180px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}
.flow-item{display:flex;justify-content:space-between;font-size:12.5px;padding:6px 10px;background:var(--bg);border-radius:8px;color:var(--ink2)}
.flow-item b{color:var(--blue-d)}
/* ===== toast 多消息堆叠（最多 3 条同时） ===== */
#toast{
  position:fixed;left:50%;bottom:calc(96px + env(safe-area-inset-bottom));transform:translateX(-50%);
  display:flex;flex-direction:column-reverse;align-items:center;gap:8px;pointer-events:none;z-index:100;
}
#toast .toast-item{
  background:#0f172a;color:#fff;padding:11px 20px;border-radius:12px;font-size:14px;font-weight:600;
  box-shadow:0 10px 30px rgba(0,0,0,.25);opacity:0;transform:translateY(20px);transition:.3s;
  max-width:86vw;text-align:center;white-space:pre-line;
}
#toast .toast-item.show{opacity:1;transform:translateY(0)}
/* ===== AI 录入：字段麦克风 ===== */
.ai-mic{
  width:38px;height:38px;border-radius:9px;border:1px solid #dbeafe;background:var(--blue-l);color:var(--blue-d);
  cursor:pointer;font-size:16px;flex-shrink:0;display:flex;align-items:center;justify-content:center;
  transition:background .15s,color .15s;
}
.ai-mic:active,.ai-mic.rec{background:#dc2626;color:#fff;border-color:#dc2626}
/* ===== 录入弹窗：题目/答案框调大（用户核对） ===== */
.form-row textarea.textarea{
  min-height:120px;font-size:14px;line-height:1.7;resize:vertical;
}
.form-row textarea#mk-q,
.form-row textarea#fm-content{min-height:140px}
.form-row textarea#mk-right,
.form-row textarea#fm-ans{min-height:180px}
/* ===== KaTeX 预览（录入弹窗） ===== */
.math-preview{
  background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;
  padding:14px 16px;margin-bottom:10px;font-size:15px;line-height:1.8;
  min-height:60px;color:var(--ink);
  /* v3.9.7 二次修复：阈值放宽后可能仍出现超长单行，
     改 overflow-x:auto 让用户能横向滚动查看完整内容（之前 hidden 会截断隐藏）；
     KaTeX 输出 <span class="katex"> 是 inline 不是 inline-block，
     配合 word-break:break-all 让超长 inline 公式能字符级自然断行 */
  max-height:320px;
  overflow-y:auto;
  overflow-x:auto;
  word-break:break-word;
  overflow-wrap:anywhere;
}
/* v3.9.7：KaTeX 输出（<span class="katex">）内部允许字符级断行，
   作为 splitLongLatex 阈值放宽后的兜底——避免 LaTeX 命令在容器边界被硬切
   v3.9.7 六次修复：word-break:break-all → overflow-wrap:break-word（防止 }{ 等成对字符被切散触发 KaTeX 报错） */
.math-preview .katex{font-size:1.05em;white-space:normal;overflow-wrap:break-word}
/* v3.9.7 六次修复：KaTeX text 模式（<span class="mord text">）内的中文允许在词边界断行（不强制字符级） */
.math-preview .katex .mord.text,
.math-preview .katex .mord .mord.text{white-space:normal!important;overflow-wrap:break-word!important;display:inline!important}
.math-preview-empty{color:var(--ink2);font-style:italic}
/* KaTeX 错误样式：不强制改色——保留 KaTeX 默认红色报错（方便调试定位非法 LaTeX）。
   之前尝试用 !important 灰显，但用户明确要求保留红色标错 */
.math-preview .katex-error,
.math-preview .katex .katex-error{
  font-size:0.95em;
  font-family:inherit;padding:0;display:inline;
}
/* ===== 数学符号快捷工具栏（手改题目插入 LaTeX） ===== */
.math-bar{
  display:flex;flex-wrap:wrap;gap:4px;margin:-4px 0 8px;align-items:center;
}
.math-bar .btn.ghost.sm{
  padding:2px 8px;font-size:12.5px;min-height:0;line-height:1.6;flex:none;
}
.math-bar .btn.ghost.sm:hover{background:var(--bg)} /* P3：--bg2 未定义，改用 --bg */
.math-bar .reparse-btn{margin-left:auto;padding:2px 10px;font-size:12.5px;color:#0369a1;border-color:#bae6fd}
.math-bar .reparse-btn:hover{background:#e0f2fe}
.math-bar-toggle{font-size:12px;padding:2px 10px;color:#0369a1;border-color:#bae6fd}
.math-bar-toggle:hover{background:#e0f2fe}
.math-bar-more{margin:4px 0 8px;padding:8px;background:var(--bg);border:1px solid var(--line);border-radius:10px;display:flex;flex-direction:column;gap:8px}
.math-bar-group{display:flex;flex-wrap:wrap;gap:4px;align-items:center}
.math-bar-group>b{font-size:11px;color:var(--ink2);font-weight:700;margin-right:4px;min-width:42px}
/* 重新解析后高亮标记变化的字段（持续显示，不消失——直到弹窗关闭） */
.field-changed{background:#fef08a;box-shadow:0 0 0 2px #fde047;border-radius:6px;transition:background 0.2s}
.field-changed:focus-within{background:#fde047} /* 字段被聚焦时变深色，提示"已查看" */
@keyframes fieldFlashIn{0%{background:#facc15;box-shadow:0 0 0 4px #facc15}100%{background:#fef08a;box-shadow:0 0 0 2px #fde047}}
.field-changed{animation:fieldFlashIn 0.4s ease-out}
/* AI 识别忙状态旋转动画 */
@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}
/* ===== 弹窗 ===== */
.modal-mask{
  position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:90;display:none;
  align-items:flex-end;justify-content:center;backdrop-filter:blur(2px);
}
.modal-mask.show{display:flex}
.modal{
  background:#fff;border-radius:20px 20px 0 0;width:100%;max-width:640px;max-height:88vh;overflow-y:auto;
  padding:20px 20px calc(20px + env(safe-area-inset-bottom));animation:slideup .25s ease;
}
@media(min-width:700px){.modal-mask{align-items:center}.modal{border-radius:20px;max-height:82vh}}
@keyframes slideup{from{transform:translateY(40px);opacity:.4}to{transform:none;opacity:1}}
.modal h3{font-size:17px;font-weight:800;margin-bottom:16px;display:flex;align-items:center;gap:8px}
.modal-close{display:flex;justify-content:flex-end;margin:-6px -6px 0 0}
.modal-close button{border:none;background:transparent;cursor:pointer;color:var(--ink2);width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:8px}
.modal-close button:hover{background:var(--bg);color:var(--ink)}
.form-row{margin-bottom:14px}
.form-row label{display:block;font-size:12.5px;font-weight:700;color:var(--ink2);margin-bottom:6px}
.form-row .input,.form-row .select,.form-row .textarea{width:100%}
.form-row .hint{font-size:11.5px;color:#94a3b8;margin-top:4px}
.form-btns{display:flex;gap:10px;margin-top:18px}
.form-btns .btn{flex:1}
/* ===== 底部导航（移动端） ===== */
.bottom-nav{
  position:fixed;left:0;right:0;bottom:0;z-index:60;background:#fff;border-top:1px solid var(--line);
  display:flex;padding:6px 4px calc(6px + env(safe-area-inset-bottom));
}
.bottom-nav .bn-item{
  flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 2px;
  border:none;background:transparent;font-size:10.5px;color:var(--ink2);font-weight:600;cursor:pointer;border-radius:10px;
}
.bottom-nav .bn-item.on{color:var(--blue-d);background:var(--blue-l)}
.bottom-nav .bn-item svg{width:22px;height:22px}
/* ===== 隐藏文件输入 ===== */
.hidden-file{display:none}
/* ===== 提示条 ===== */
.notice{
  display:flex;align-items:center;gap:9px;background:var(--warn-l);border:1px solid #fde68a;color:#92400e;
  border-radius:11px;padding:10px 14px;font-size:12.5px;font-weight:600;margin-bottom:14px;
}
.notice svg{flex:none}
/* 响应式 */
@media(max-width:767px){
  .stat-grid{grid-template-columns:repeat(2,1fr)}
  .subj-grid{grid-template-columns:repeat(2,1fr)}
  .reward-top{grid-template-columns:repeat(3,1fr)}
  .view-tabs{display:none}
  .topbar-inner{padding-top:4px}
  .brand{font-size:15px}
  .points-chip{font-size:13px;padding:4px 10px}
}
@media(min-width:768px){
  .bottom-nav{display:none}
  .wrap{padding-bottom:40px}
}
@media(max-width:400px){
  .subj-grid{grid-template-columns:1fr 1fr}
  .today-item{flex-wrap:wrap}
  .today-item .t-btn{width:100%}
}
/* P3-3：打印样式——只打印当前 view（避免 5 个 view 全打浪费纸/动画初始态导致空白页） */
@media print{
  /* 强制动画完成态（防止 @keyframes fade 初始 opacity:0 导致内容透明） */
  section.view,.f-item,.task-item{animation:none!important;opacity:1!important;transform:none!important}
  /* 默认全隐藏，只显示当前 .on 的 view（用户切到哪个 tab 就打哪个的内容） */
  section.view{display:none!important}
  section.view.on{display:block!important}
  /* 隐藏 UI 操作件 */
  .topbar,.bottom-nav,.view-tabs,.subj-tabs,.add-bar,.f-actions,.t-btn,.btn,.backup-row,.hidden-file,.notice,.notLoggedWarn{display:none!important}
  body{background:#fff}
  .card,.f-item,.f-formula,.f-ans,.stat-card,.task-item{box-shadow:none;border-color:#ccc}
  /* 答案/解析强制展开（复习、知识库、复习答案） */
  .f-ans,.f-ans.show,.ans-box{display:block!important}
  /* 公式预览/图片避免被截断 */
  .f-formula,.f-ans{page-break-inside:avoid}
  /* KaTeX 颜色保持（默认打印会移除背景色，但 KaTeX 的彩色字符需要保留） */
  *{-webkit-print-color-adjust:exact;print-color-adjust:exact}
}
