/* styles.css — 青蓝智学 v2 原型令牌+布局（2026-09-15 重建）。
 * 视觉延续旧壳（qinglan.0915 tokens.css）：deepseek 蓝主色 + 中性灰蓝 + 8/12 圆角 + 同款字体栈。
 * 原型阶段：本文件是唯一允许裸色值的文件；暗色态 = body[data-theme="dark"]。
 * 响应式：>760px 侧栏固定；≤760px 侧栏收为抽屉 + 顶栏汉堡按钮。 */

:root {
  --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB',
    'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  --blue-50: #edf3fe; --blue-100: #e4edfd; --blue-400: #679efe; --blue-500: #4176e6; --blue-600: #2f5fc4;
  --bg: #f5f6f7; --bg-card: #ffffff; --bg-hover: #eef1f4; --bg-side: #ffffff;
  --bd: #e5e9ee; --bd-2: #d3d9e0;
  --tx: #1b1b1c; --tx-2: #61666b; --tx-3: #979da6;
  --red: #ef4444; --red-bg: #fef2f2; --green: #16a34a; --green-bg: #e6faed;
  --amber: #d97706; --amber-bg: #fef7e6;
  /* M4 掌握度看板 L 级色板（v9 原型裸色令牌化，亮暗双主题成对定义）：gold 系 = L3 应用
     （--gold meter/定义点 · --gold-bg 分布格/徽标底 · --gold-tx 分布格/徽标字），
     --lv0-dot = L0 未点亮灰点/灰条。本区位于文件头令牌区 = 三套零裸色断言扫描起点之前，
     裸色值合法（既有先例：--bdg-gold 系同区定义）。 */
  --gold: #d9b300; --gold-bg: #fff9db; --gold-tx: #a18300; --lv0-dot: #c3c8cf;
  /* M7 错题本重建（task 10-19-mistake-book-rebuild）：解题模型紫 tag/donut·分布条令牌
     （v4 原型紫药丸令牌化；与 ktree 段 --kt-dom-compr 分区自治，亮暗双主题成对）。 */
  --purple: #7c3aed; --purple-bg: #f1ecfe;
  --r-sm: 8px; --r-md: 12px;
  --shadow: 0 1px 2px rgb(15 17 21 / 0.06), 0 4px 12px rgb(15 17 21 / 0.05);
  --side-w: 216px;
}
body[data-theme="dark"] {
  --bg: #141517; --bg-card: #1c1d20; --bg-hover: #26272b; --bg-side: #18191c;
  --bd: #2c2d31; --bd-2: #3a3b40;
  --tx: #ececee; --tx-2: #a6a8ad; --tx-3: #7c7e83;
  --blue-50: #1a2440; --blue-100: #16203a; --red-bg: #2a1516; --green-bg: #12241a; --amber-bg: #2a2010;
  --gold: #e3c531; --gold-bg: #2a2410; --gold-tx: #ddc05c; --lv0-dot: #5a5e66; /* M4 看板暗色对（gold 提亮保对比度，bg 沿 -bg 深底惯例） */
  --purple: #a78bfa; --purple-bg: #251b3d; /* M7 模型紫暗色对（提亮保对比度，bg 沿 -bg 深底惯例） */
  --shadow: 0 1px 2px rgb(0 0 0 / 0.4), 0 4px 14px rgb(0 0 0 / 0.35);
}

* { box-sizing: border-box; }
/* 作者 display 规则（如 .modal-mask 的 grid）会压过 UA 的 [hidden]{display:none}，
   导致 hidden 属性失效、遮罩常驻拦截点击 → 全局兜底（2026-09-15 弹窗关不掉修复）。 */
[hidden] { display: none !important; }
html, body { margin: 0; padding: 0; }
body {
  font-family: var(--font); font-size: 14px; color: var(--tx); background: var(--bg);
  -webkit-font-smoothing: antialiased;
}
button { font-family: inherit; touch-action: manipulation; }

/* ---------- 壳：顶栏 + 侧栏 + 主区 ---------- */
.shell { display: flex; min-height: 100vh; }
.side {
  width: var(--side-w); flex: 0 0 var(--side-w); background: var(--bg-side);
  border-right: 1px solid var(--bd); display: flex; flex-direction: column;
  position: sticky; top: 0; height: 100vh; z-index: 30;
}
.logo { display: flex; align-items: center; gap: 10px; padding: 16px 16px 12px; font-size: 18px; font-weight: 700; } /* 字号 16→18（2026-09-21 用户要求放大） */
/* logo 图标（2026-09-19 换鲸鱼芽苗图；2026-09-21 源图升级 256×256、显示 32→40→48px，用户两次要求放大保证鲸头青苗可辨）：img 元素，圆角裁切 */
.logo .mark { width: 48px; height: 48px; border-radius: 10px; object-fit: cover; display: block; }
/* 侧栏收起/展开按钮（2026-09-19 用户要求）：展开时靠 logo 行右下，收起时居中 */
.side-toggle { align-self: flex-end; margin: -6px 10px 0 0; border: none; background: none; color: var(--tx-2); cursor: pointer; font-size: 15px; line-height: 1; padding: 5px 9px; border-radius: 6px; touch-action: manipulation; } /* touch-action：消移动端点按 300ms 延迟/双击缩放干扰（2026-09-20） */
.side-toggle:hover { background: rgba(65, 118, 230, .10); color: var(--tx-1); }
/* ---------- 侧栏收起档：仅小图标（2026-09-19 用户要求；2026-09-20 解除 pointer:fine 门禁——
   触屏设备切 side-collapsed 类无视觉变化的根因就是被锁在 fine 媒体块里，手机图标列同档） ---------- */
body.side-collapsed .side { width: 64px; flex: 0 0 64px; } /* flex-basis 优先于 width，必须同改（浏览器实测） */
body.side-collapsed .logo { justify-content: center; padding: 16px 0 6px; }
body.side-collapsed .logo .txt { display: none; }
body.side-collapsed .side-toggle { align-self: center; margin: 0 0 6px; }
body.side-collapsed .nav { padding: 2px 8px 10px; }
/* 收起档：图标放大 + 行距压紧（2026-09-19 用户反馈截图调整） */
body.side-collapsed .nav a { justify-content: center; padding: 6px 0; margin: 1px 0; }
body.side-collapsed .nav a .ico { width: auto; font-size: 22px; line-height: 1; }
body.side-collapsed .nav .txt { display: none; }
body.side-collapsed .nav .grp { display: none; }
body.side-collapsed .side-foot { display: none; }
.nav { flex: 1; overflow-y: auto; padding: 4px 10px 12px; }
.nav .grp { font-size: 11px; color: var(--tx-3); padding: 12px 8px 6px; letter-spacing: 0.06em; }
.nav a {
  display: flex; align-items: center; gap: 10px; padding: 9px 10px; margin: 1px 0;
  border-radius: var(--r-sm); color: var(--tx-2); text-decoration: none; font-size: 13.5px;
}
.nav a:hover { background: var(--bg-hover); color: var(--tx); }
.nav a.on { background: var(--blue-50); color: var(--blue-600); font-weight: 600; }
.nav a .ico { width: 18px; text-align: center; font-size: 15px; line-height: 1; } /* 全菜单图标桌面统一 15px（2026-10-23 拍板）：emoji 走字号，svg 走 1em 同步缩放 */
.nav a .ico svg { width: 1em; height: 1em; vertical-align: -0.15em; fill: none; stroke: var(--green); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } /* 问下AI/AI对话 绿色笑脸：颜色走令牌，尺寸随 .ico 字号（15/13/22） */
.nav a .ico svg .dot { fill: var(--green); stroke: none; }
.side-foot { border-top: 1px solid var(--bd); padding: 8px 10px 12px; }

.main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.topbar {
  position: sticky; top: 0; z-index: 20; display: flex; align-items: center; gap: 10px;
  padding: 10px 20px; background: var(--bg-card); border-bottom: 1px solid var(--bd);
}
.topbar h1 { font-size: 15px; margin: 0; font-weight: 700; }
.topbar .sub { color: var(--tx-3); font-size: 12px; }
.topbar .sp { flex: 1; }
.hamb { display: none; border: 1px solid var(--bd-2); background: var(--bg-card); border-radius: var(--r-sm); width: 34px; height: 34px; font-size: 16px; cursor: pointer; color: var(--tx-2); }
.acct { display: flex; align-items: center; gap: 8px; border: 1px solid var(--bd-2); border-radius: 999px; padding: 3px 12px 3px 4px; background: var(--bg-card); cursor: pointer; }
.acct .av { width: 26px; height: 26px; border-radius: 50%; background: var(--blue-100); color: var(--blue-600); display: grid; place-items: center; font-weight: 700; font-size: 12px; }
.workarea { padding: 18px 22px 40px; width: 100%; }

/* ---------- 通用组件 ---------- */
.card { background: var(--bg-card); border: 1px solid var(--bd); border-radius: var(--r-md); box-shadow: var(--shadow); padding: 16px; margin-bottom: 16px; }
.card > h3 { margin: 0 0 4px; font-size: 14.5px; }
.card .desc { color: var(--tx-3); font-size: 12.5px; margin: 0 0 12px; }
.row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.sp { flex: 1; }
.btn {
  border: 1px solid var(--blue-500); background: var(--blue-500); color: #fff;
  border-radius: var(--r-sm); padding: 8px 16px; font-size: 13.5px; cursor: pointer;
}
.btn:hover { background: var(--blue-600); }
.btn.gray { background: var(--bg-card); color: var(--tx-2); border-color: var(--bd-2); }
.btn.gray:hover { background: var(--bg-hover); color: var(--tx); }
.btn.sm { padding: 5px 10px; font-size: 12.5px; }
.btn:disabled { opacity: 0.55; cursor: not-allowed; }
.btn.red { background: var(--red); } /* 危险操作确认钮（confirmModal 删除类，2026-10-09） */
.btn.red:hover { background: var(--red); filter: brightness(0.92); }
.tag { display: inline-flex; align-items: center; gap: 4px; border-radius: 999px; padding: 2px 10px; font-size: 11.5px; font-weight: 600; }
.tag.blue { background: var(--blue-50); color: var(--blue-600); }
.tag.red { background: var(--red-bg); color: var(--red); }
.tag.green { background: var(--green-bg); color: var(--green); }
.tag.amber { background: var(--amber-bg); color: var(--amber); }
.tag.gray { background: var(--bg-hover); color: var(--tx-2); }
.dim { color: var(--tx-3); font-size: 12.5px; }
.mono { font-family: ui-monospace, 'SF Mono', Consolas, Menlo, monospace; font-size: 12px; }
.grid { display: grid; gap: 14px; }
.grid.c4 { grid-template-columns: repeat(4, 1fr); }
.grid.c5 { grid-template-columns: repeat(5, 1fr); }
.grid.c6 { grid-template-columns: repeat(6, 1fr); } /* M2-b 总览 6 格（D23/D24 统一次序） */
.grid.c2 { grid-template-columns: repeat(2, 1fr); }
.stat { background: var(--bg-card); border: 1px solid var(--bd); border-radius: var(--r-md); padding: 14px 16px; }
.stat b { display: block; font-size: 22px; margin-bottom: 4px; }
.stat span { color: var(--tx-3); font-size: 12px; }
table.tbl { width: 100%; border-collapse: collapse; font-size: 13px; }
table.tbl th, table.tbl td { text-align: left; padding: 9px 10px; border-bottom: 1px solid var(--bd); vertical-align: top; }
table.tbl th { color: var(--tx-3); font-weight: 600; font-size: 12px; }
input.ctl, select.ctl, textarea.ctl {
  width: 100%; border: 1px solid var(--bd-2); border-radius: var(--r-sm); background: var(--bg-card);
  color: var(--tx); padding: 8px 10px; font-size: 13.5px; font-family: inherit;
}
input.ctl:focus, textarea.ctl:focus { outline: 2px solid var(--blue-100); border-color: var(--blue-400); }
.drop {
  border: 1.5px dashed var(--bd-2); border-radius: var(--r-md); padding: 22px; text-align: center;
  color: var(--tx-2); background: var(--bg); cursor: pointer;
}
.drop:hover { border-color: var(--blue-400); color: var(--blue-600); }
.modal-mask { position: fixed; inset: 0; background: rgb(15 17 21 / 0.45); display: grid; place-items: center; z-index: 60; }
/* 移动端上传三选项底部弹层（2026-09-24 用户要求：点上传区弹自有 sheet 取代系统面板；
   upload-modes.js 动态生成；[hidden] 全局兜底管显隐；形态三轮澄清定稿 = 系统面板同款
   横排深色大块：图标在上文字在下，拍照/相册/本地文件） */
.sheet-mask { position: fixed; inset: 0; background: rgb(15 17 21 / 0.45); display: flex; align-items: flex-end; justify-content: center; z-index: 60; }
.sheet {
  width: min(420px, 100vw); display: flex; gap: 10px;
  padding: 0 12px calc(12px + env(safe-area-inset-bottom, 0px));
}
.sheet-it {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 9px; border: 0;
  background: rgb(35 36 40 / 0.96); color: #f2f3f5; border-radius: var(--r-md);
  padding: 18px 8px 14px; font-size: 12.5px; cursor: pointer;
}
.sheet-it svg { width: 26px; height: 26px; }
.sheet-it:active { background: rgb(58 60 66 / 0.96); }
.modal { width: min(440px, calc(100vw - 32px)); background: var(--bg-card); border-radius: var(--r-md); border: 1px solid var(--bd); padding: 18px; box-shadow: var(--shadow); }
.modal h3 { margin: 0 0 12px; }
/* 模型错误详情弹窗（2026-09-28 用户要求：加宽 + 顶栏固定 X 随时可关；head 在滚动区外恒可见，手机 92vw 自适应） */
.mj-modal { width: min(92vw, 1080px); max-height: 86vh; display: flex; flex-direction: column; padding: 10px 16px 16px; overflow: hidden; }
.mj-head { flex: none; display: flex; justify-content: flex-end; }
.mj-x { width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--bd-2); background: var(--bg-hover); color: var(--tx-2); font-size: 15px; line-height: 1; cursor: pointer; }
.mj-x:hover { color: var(--tx); }
.mj-body { overflow-y: auto; min-height: 0; }
.mj-body h3 { margin-top: 2px; }
.toast { position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%); background: var(--tx); color: var(--bg-card); border-radius: 999px; padding: 9px 18px; font-size: 13px; z-index: 80; box-shadow: var(--shadow); }
/* 账号菜单下拉（三角色模型演示，2026-09-15） */
.menu { position: absolute; right: 0; top: calc(100% + 6px); min-width: 168px; background: var(--bg-card); border: 1px solid var(--bd); border-radius: var(--r-sm); box-shadow: var(--shadow); padding: 6px; z-index: 40; }
.menu .mi { display: block; width: 100%; text-align: left; border: 0; background: none; padding: 8px 10px; border-radius: 6px; font-size: 13px; color: var(--tx-2); cursor: pointer; }
.menu .mi:hover { background: var(--bg-hover); color: var(--tx); }
.menu .mi.grp { font-size: 11px; color: var(--tx-3); cursor: default; padding: 6px 10px 2px; }
.menu .mi.grp:hover { background: none; color: var(--tx-3); }

/* ---------- 作业批阅 ---------- */
/* 整体情况题 Tab（题号-结果）：颜色随结果，选中填实 */
.tabbar { display: flex; gap: 8px; flex-wrap: wrap; margin: 0 0 12px; }
.tab { border: 1px solid var(--bd-2); background: var(--bg-card); border-radius: var(--r-sm); padding: 6px 12px; font-size: 12.5px; cursor: pointer; color: var(--tx-2); }
.tab.ok { color: var(--green); border-color: var(--green); }
.tab.bad { color: var(--red); border-color: var(--red); }
.tab.pend { color: var(--amber); border-color: var(--amber); }
.tab.on { color: #fff; }
.tab.on.ok { background: var(--green); }
.tab.on.bad { background: var(--red); }
.tab.on.pend { background: var(--amber); }
/* 中性视图 Tab（错题本视图切换） */
.tab.ntrl { color: var(--tx-2); }
.tab.on.ntrl { background: var(--blue-500); border-color: var(--blue-500); color: #fff; }
/* 归类视图分组头 */
.grp-h { display: flex; align-items: center; gap: 8px; margin: 16px 0 8px; font-size: 13px; flex-wrap: wrap; }
.grp-h:first-child { margin-top: 4px; }
/* 整体情况按作业分组标签（2026-10-21 用户指令：多文件混批按标题分开显示，grading.js fileGroupsOf）：
   tabbar 内占整行（flex-basis:100% 换行）形成「标题行 + 题 Tab 行」；移动端 tabbar nowrap
   横滑（上方媒体查询）退化为行内标签随组横滑，max-width 防长标题独占视口 */
.rp-file-group { flex-basis: 100%; display: flex; align-items: center; margin: 8px 0 0; padding: 2px 0 2px 8px; border-left: 3px solid var(--blue-500); font-size: 13px; font-weight: 600; color: var(--tx-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rp-file-group:first-child { margin-top: 0; }
/* 分区子组标签（2026-10-21 用户拍板：题型类别+组内题号与原卷对应）：比文件组标签轻一级（无左框、缩进、tx-3） */
.rp-sec-group { flex-basis: 100%; display: flex; align-items: center; margin: 6px 0 0; padding: 1px 0 1px 14px; font-size: 12px; font-weight: 600; color: var(--tx-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rp-sec-group:first-child { margin-top: 0; }
/* 题末教学区（考察知识点/易错点/解题思路/学生思路对比） */
.teach { border-top: 1px dashed var(--bd-2); margin-top: 10px; padding-top: 10px; font-size: 12.5px; color: var(--tx-2); }
.teach .li { display: flex; gap: 8px; margin: 6px 0; align-items: flex-start; flex-wrap: wrap; }
.teach .li > :last-child { flex: 1; min-width: 200px; } /* 原 span:last-child；富文本行值为 <div class="rich">（rich-render 增补①） */
/* 错因归类卡（错因词表 CAUSE_ORDER 单源；R2/D30 起枚举外/空不渲染卡） */
.cause { background: var(--red-bg); border: 1px solid var(--red); border-radius: var(--r-sm); padding: 10px 12px; margin: 10px 0; font-size: 12.5px; color: var(--tx-2); }
.cause div { margin-top: 3px; }
.qcard { border: 1px solid var(--bd); border-radius: var(--r-md); padding: 14px; margin-bottom: 12px; background: var(--bg-card); }
.qcard.dispute { border-color: var(--amber); box-shadow: 0 0 0 3px var(--amber-bg); }
.qhead { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.qhead .no { font-weight: 700; }
.stem { font-size: 13.5px; margin: 0 0 8px; white-space: pre-wrap; }
.dual { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 8px 0; }
.model { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px; background: var(--bg); }
.model .name { font-size: 12px; color: var(--tx-3); margin-bottom: 6px; display: flex; gap: 6px; align-items: center; }
.model .verdict { font-weight: 700; font-size: 13px; margin-bottom: 4px; }
.model .reason { color: var(--tx-2); font-size: 12.5px; }
.model.win { border-color: var(--blue-400); background: var(--blue-50); }
.resolve { border-top: 1px dashed var(--bd-2); margin-top: 10px; padding-top: 10px; }
.resolve label { display: inline-flex; align-items: center; gap: 6px; margin-right: 14px; font-size: 13px; cursor: pointer; }
.expl { border-left: 3px solid var(--blue-400); background: var(--bg); border-radius: 0 var(--r-sm) var(--r-sm) 0; padding: 10px 12px; margin-top: 10px; font-size: 12.5px; color: var(--tx-2); white-space: pre-wrap; }

/* ---------- 错题本 ---------- */
.chips { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.chip { border: 1px solid var(--bd-2); background: var(--bg-card); color: var(--tx-2); border-radius: 999px; padding: 5px 14px; font-size: 12.5px; cursor: pointer; }
.chip.on { background: var(--blue-500); border-color: var(--blue-500); color: #fff; }

/* ---------- 批阅列表三维筛选（2026-10-21 今日作业合并：卡内 日期/学科/学年 三行 + 指标行） ----------
   挂载 js/filter-bar.js；DOM 见 index.html #taskFilterBar / #exHistFilterBar。
   chips 行横滑不换行（日期 chips 最多 1+7+动态插入，窄屏滚动可达；.chip 本体样式复用上方错题本块）。 */
.filterbar { margin: 0 0 10px; padding: 8px 0 2px; border-top: 1px dashed var(--bd-2); }
.fltrow { display: flex; align-items: center; gap: 8px; margin: 4px 0; }
.fltlabel { flex: 0 0 34px; font-size: 12px; color: var(--tx-2); text-align: right; }
.fltrow .chips { flex: 1 1 auto; min-width: 0; margin: 0; flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; padding-bottom: 2px; }
.fltrow .chip { flex: 0 0 auto; }
.metricbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 6px 0 2px; padding: 6px 10px; background: var(--bg); border-radius: var(--r-sm); font-size: 13px; }
.metricbar b { font-size: 16px; color: var(--blue-500); }
.calwrap { margin: 6px 0 4px; }
.calwrap .card { margin: 0; } /* 日历卡嵌在筛选区内：去掉 .card 默认下边距防行距失衡 */

.mcard { border: 1px solid var(--bd); border-radius: var(--r-md); padding: 12px 14px; margin-bottom: 10px; background: var(--bg-card); cursor: pointer; }
.mcard:hover { border-color: var(--blue-400); }
.mcard .t { font-size: 13.5px; margin: 0 0 6px; }

/* ---------- 原始作业文件清单 + 原件放大 ---------- */
.filegrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
.fileitem { border: 1px solid var(--bd); border-radius: var(--r-md); background: var(--bg-card); padding: 8px; cursor: pointer; text-align: center; min-height: 36px; }
.fileitem:hover, .fileitem:focus-visible { border-color: var(--blue-400); box-shadow: var(--shadow); outline: none; }
.fileitem .thumb { height: 132px; display: grid; place-items: center; background: var(--bg); border-radius: var(--r-sm); overflow: hidden; margin-bottom: 6px; }
.fileitem .thumb svg { height: 100%; width: auto; }
.fileitem .fn { font-size: 12px; color: var(--tx-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fileitem .fm { font-size: 11px; color: var(--tx-3); margin-top: 2px; }
/* 纸张扫描件 SVG：原件不随主题变（真实纸张恒为白），裸色值仅允许在本文件 */
.pp-paper { fill: #fff; stroke: #d3d9e0; }
.pp-ink { stroke: #9aa0a8; }
.pp-no { fill: #1b1b1c; font-size: 20px; font-weight: 700; }
.pp-head { fill: #61666b; font-size: 13px; }
.pp-ok { stroke: #16a34a; }
.pp-bad { stroke: #ef4444; }
/* 原件放大 lightbox */
.lightbox { position: fixed; inset: 0; background: rgb(15 17 21 / 0.78); z-index: 70; display: flex; flex-direction: column; padding: 14px 16px; }
.lb-head { display: flex; align-items: center; gap: 8px; color: #f2f3f5; margin-bottom: 10px; }
.lb-name { font-weight: 600; font-size: 13.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lb-body { flex: 1; min-height: 0; display: grid; place-items: center; overflow: auto; }
.lb-body svg { max-height: 100%; max-width: 100%; box-shadow: var(--shadow); border-radius: var(--r-sm); }
.lb-body img { max-height: 100%; max-width: 100%; box-shadow: var(--shadow); border-radius: var(--r-sm); } /* 上传缩略图放大（2026-09-24）同 svg 画框 */
.lb-foot { text-align: center; margin-top: 10px; font-size: 12px; }

/* ---------- 当日作业：当天日期 + 科目 Tab 详情卡 ---------- */
.dtoday { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.dtoday .big { font-size: 20px; font-weight: 700; }
.dtoday .clock { color: var(--tx-3); font-size: 13px; }
.dsub { border: 1px solid var(--bd); border-radius: var(--r-md); background: var(--bg-card); padding: 14px; }
.ds-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.ds-name { font-weight: 700; font-size: 14px; }
.ds-rate { font-weight: 700; font-size: 16px; }
.ds-bar { height: 6px; border-radius: 999px; background: var(--bg-hover); overflow: hidden; margin-bottom: 8px; }
.ds-bar i { display: block; height: 100%; border-radius: 999px; }
.ds-bar i.g { background: var(--green); }
.ds-bar i.y { background: var(--gold); } /* M8e R41 四桶色带第二段（适中）：绿→金→琥珀→红热度斜坡，令牌零裸色 */
.ds-bar i.a { background: var(--amber); }
.ds-bar i.r { background: var(--red); }
.ds-meta { font-size: 12px; }

/* ---------- 日历视图（2026-10-09 daily 页新增：月网格按天选日期；令牌 only，零裸色值） ---------- */
.calgrid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.calwd { text-align: center; font-size: 12px; color: var(--tx-3); padding: 2px 0; }
.calcell { position: relative; border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg-card); min-height: 46px; padding: 5px 6px; font-size: 12.5px; color: var(--tx-2); cursor: pointer; text-align: left; }
.calcell:hover { background: var(--bg-hover); color: var(--tx); }
.calcell.empty { border-color: transparent; background: transparent; cursor: default; pointer-events: none; }
.calcell.today { border-color: var(--blue-500); color: var(--tx); }
.calcell.on { background: var(--blue-500); border-color: var(--blue-500); color: #fff; } /* #fff 沿 .chip.on 先例 */
.caln { position: absolute; right: 4px; top: 4px; font-style: normal; font-size: 10px; line-height: 14px; padding: 0 4px; border-radius: 999px; background: var(--blue-500); color: #fff; }
.calcell.on .caln { background: var(--bg-card); color: var(--tx); }
/* 日历年月选择面板（2026-10-09 用户追加，element-ui 两级式）：标题可点文字 + 4列月/5列年网格 */
.calpick { cursor: pointer; }
.calpick:hover { color: var(--blue-500); }
.calpk4 { grid-template-columns: repeat(4, 1fr); }
.calpk5 { grid-template-columns: repeat(5, 1fr); }
.calcell.pk { min-height: 40px; text-align: center; font-size: 13px; }

/* ---------- 响应式：mobile ----------
 * 抽屉化条件 = 窄屏 + 触控设备（2026-09-19 用户要求）：手机收为 ☰ 抽屉；
 * 鼠标环境（桌面窄窗 / IDE 内置预览浏览器，逻辑宽可能 ≤760）侧栏常开。 */
@media (max-width: 760px) and (pointer: coarse) {
  .side { position: fixed; left: 0; top: 0; transform: translateX(-100%); transition: transform 0.2s var(--ds-ease, ease); box-shadow: var(--shadow); }
  body.nav-open .side { transform: translateX(0); }
  .hamb { display: block; }
  /* 抽屉默认收起为图标栏后，保留展开按钮供切换文字菜单（2026-09-20） */
  .workarea { padding: 14px 12px 32px; }
  .grid.c4 { grid-template-columns: repeat(2, 1fr); }
  .grid.c5 { grid-template-columns: repeat(2, 1fr); }
  .grid.c6 { grid-template-columns: repeat(2, 1fr); } /* M2-b：6 格手机 2 列（c4/c5 收敛惯例同款） */
  .grid.c2 { grid-template-columns: 1fr; }
  .dual { grid-template-columns: 1fr; }
  table.tbl th:nth-child(3), table.tbl td:nth-child(3) { display: none; } /* 手机上收起次要列 */
  .topbar { padding: 8px 12px; }
  .acct .nm { display: none; }
  .topbar .sub { display: none; } /* v2：≤760px 隐藏页副标题，给「演示数据」角标腾位（375px 实测挤压） */
  /* 移动端操作便捷性（用户长期约束 2026-09-15）：Tab 横滑不换行、触控目标 ≥36px、裁决单选竖排加大 */
  .tabbar { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 4px; -webkit-overflow-scrolling: touch; }
  .tab { flex: 0 0 auto; min-height: 36px; }
  /* 分组标签退化行内（nowrap 横滑下 flex-basis:100% 会独占视口宽，2026-10-21） */
  .rp-file-group { flex: 0 0 auto; flex-basis: auto; margin: 0; align-self: center; max-width: 40vw; }
  .rp-sec-group { flex: 0 0 auto; flex-basis: auto; margin: 0; align-self: center; max-width: 32vw; }
  /* 日历按钮移动端只显 📅+箭头（「日历」二字隐藏，2026-10-21 用户拍板） */
  .cal-txt { display: none; }
  .btn, .chip, .hamb { min-height: 36px; }
  .resolve label { display: flex; align-items: center; margin: 8px 0; min-height: 32px; }
  .resolve input[type="radio"] { width: 18px; height: 18px; margin: 0; }
  .resolve .ctl { max-width: 100% !important; display: block !important; margin-top: 6px; }
}

/* ---------- 窄屏紧凑模式（IDE 预览/桌面窄窗/手机抽屉统一，2026-09-20 扩到全指针类型）：侧栏收窄减空白 ---------- */
@media (max-width: 760px) {
  :root { --side-w: 120px; } /* 148→120：图标+四字标签实测 ≈92px，压缩右侧空白（2026-09-20 红框反馈） */
  .logo { font-size: 16px; padding: 12px 10px 10px; } /* 窄屏字号 14→16（2026-09-21 放大） */
  .logo .mark { width: 38px; height: 38px; } /* 窄屏图标 26→32→38（2026-09-21 再放大） */
  .nav { padding: 2px 6px 10px; }
  .nav a { font-size: 12.5px; padding: 8px; gap: 8px; }
  .nav a .ico { font-size: 13px; } /* 全菜单图标移动端统一 13px（2026-10-23） */
  .nav .grp { padding: 10px 8px 4px; }
  .side-foot { padding: 6px 8px 10px; font-size: 11px; }
}

/* ================= v2 应用化新增（2026-09-17，子任务①） ================= */

/* 启动首帧防闪：bootstrap+首次 route() 定案前主壳不可见（main.js 摘除 .booting） */
body.booting .shell { visibility: hidden; }

/* ---------- 试卷批阅（2026-09-19 原型）：单槽上传 + 双栏对照 ---------- */
.exam-ups { display: grid; grid-template-columns: 1fr; gap: 14px; } /* 2026-09-19 单槽混传：试卷+答题纸不分槽 */
/* 总览压缩（2026-09-19 用户反馈）：单行摘要条替代 5 张 stat 卡 + 紧凑表格 */
.ex-sumline { font-size: 12.5px; padding: 2px 2px 0; }
.ex-sumline b { font-size: 14px; color: var(--tx-1); font-weight: 700; }
table.tbl.compact th, table.tbl.compact td { padding: 6px 8px; font-size: 12.5px; }
table.tbl.compact th { font-size: 11.5px; }
/* 得分/满分合并列三色（2026-09-19 用户要求）：满分绿/零分红/部分橙 */
.ex-got.ok { color: var(--green); }
.ex-got.bad { color: var(--red); }
.ex-got.part { color: var(--amber); }
/* 题号内联题型（2026-09-19 用户要求：桌面/手机都显示） */
.ex-tno { color: var(--tx-3); font-size: 11px; margin-left: 3px; }
/* 手机 1 屏看全结果：藏题型/满分/失分列（得分+结果+失分类别已够判读） */
#exBtnReopen { display: none; }
@media (max-width: 760px) {
  table.tbl-ex th:nth-child(2), table.tbl-ex td:nth-child(2),
  table.tbl-ex th:nth-child(3), table.tbl-ex td:nth-child(3),
  table.tbl-ex th:nth-child(5), table.tbl-ex td:nth-child(5) { display: none; }
  table.tbl.compact th, table.tbl.compact td { padding: 5px 6px; font-size: 12px; }
  /* 提交后上传卡收为标题行，给总览腾 1 屏（2026-09-19 用户要求） */
  .exam-upcard.ex-done .drop, .exam-upcard.ex-done .uplist, .exam-upcard.ex-done .ex-uprow { display: none; }
  .exam-upcard.ex-done { padding: 10px 16px; }
  .exam-upcard.ex-done .row { margin-bottom: 0 !important; } /* inline style 优先级高，需 !important */
  .exam-upcard.ex-done #exBtnReopen { display: inline-block; }
}
.exam-split { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
/* 逐题批阅双视图（2026-09-19 用户要求）：视图切换 tab 中性蓝底 + 题型分组块 */
.tabbar.exview .tab.on { background: var(--blue-500); border-color: var(--blue-500); color: #fff; }
.ex-typegrp { margin: 0 0 10px; }
.ex-typegrp h4 { font-size: 13px; color: var(--tx-1); }
.ex-typegrp .tabbar { margin: 4px 0 0; gap: 6px; }
/* 紧凑题 chip（2026-09-19 用户要求）：题号+结果符号，✓绿/✕红/半对勾琥珀 */
.ex-chip { border: 1px solid var(--bd-2); background: var(--bg-card); border-radius: var(--r-sm); padding: 5px 10px; font-size: 15px; line-height: 1; cursor: pointer; color: var(--tx-1); display: inline-flex; align-items: center; gap: 3px; }
.ex-chip .ic { font-size: 15px; font-weight: 700; }
.ex-chip .ic.ok { color: var(--green); }
.ex-chip .ic.bad { color: var(--red); }
.ex-chip .ic.half { color: var(--amber); position: relative; }
/* 半对勾：琥珀对勾+长臂短杠（2026-09-19 用户手写样张：杠垂直交叉勾臂，与 ✓/✕ 同风格） */
.ex-chip .ic.half::after { content: ''; position: absolute; left: 31%; top: 27%; width: 6px; height: 2px; border-radius: 1px; background: var(--amber); transform: rotate(25deg); }
/* 选中态：蓝环+淡蓝底（保留结果符号色） */
.ex-chip.on { border-color: var(--blue-500); box-shadow: 0 0 0 2px rgba(65, 118, 230, .22); background: rgba(65, 118, 230, .08); }
/* 明细区与题型分组分隔 */
#exViewDetail { border-top: 1px dashed var(--bd); padding-top: 12px; }
.exam-col { background: var(--bg); border: 1px solid var(--bd); border-radius: var(--r-md); padding: 12px 14px; }
.exam-col h4 { margin: 0 0 8px; font-size: 13px; }
.exam-col p { margin: 0 0 8px; font-size: 13px; line-height: 1.6; }
.exam-score { display: flex; align-items: center; gap: 8px; margin: 0 0 10px; font-size: 13px; }
.exam-score input { width: 76px; }
@media (max-width: 760px) { .exam-ups, .exam-split { grid-template-columns: 1fr; } }

/* ---------- 登录 / 注册页（独立于 .shell，body.login-mode 时全屏居中） ---------- */
.auth-wrap { min-height: 100vh; display: grid; place-items: center; background: var(--bg); padding: 24px 16px; }
.auth-card { width: min(400px, 100%); background: var(--bg-card); border: 1px solid var(--bd); border-radius: var(--r-md); box-shadow: var(--shadow); padding: 24px; }
.auth-card .logo { padding: 0 0 16px; font-size: 20px; justify-content: center; } /* 登录卡字号 18→20（2026-09-21 放大） */
.auth-card .logo .mark { width: 56px; height: 56px; } /* 登录卡图标 38→48→56（2026-09-21 再放大） */
.auth-card > .desc { margin: 0 0 16px; text-align: center; }
/* 登录/注册底部操作行：提交按钮占主宽 + 切换链接居侧（2026-09-18 用户要求） */
.auth-actions { display: flex; align-items: center; gap: 12px; margin-top: 4px; }
.auth-actions .auth-submit { flex: 1; min-height: 34px; }
.auth-link { border: none; background: none; color: var(--blue-500); font-size: 13px; cursor: pointer; text-decoration: underline; padding: 6px 2px; white-space: nowrap; }
.auth-link:hover { color: var(--blue-600); }
.auth-form { display: grid; gap: 12px; }
.auth-field { display: grid; gap: 5px; font-size: 12.5px; color: var(--tx-2); }
.auth-field .ctl { width: 100%; }
.auth-err { background: var(--red-bg); color: var(--red); border-radius: var(--r-sm); padding: 8px 10px; font-size: 12.5px; }
.auth-submit { width: 100%; min-height: 40px; font-size: 14px; }
.auth-note { margin: 16px 0 0; font-size: 11.5px; line-height: 1.7; border-top: 1px dashed var(--bd-2); padding-top: 12px; }

/* ---------- 空态占位（生产路径无数据；文案标注接线子任务） ---------- */
.empty { text-align: center; padding: 44px 16px; color: var(--tx-2); }
.empty p { margin: 4px 0; }
.empty p:first-child { font-size: 14px; font-weight: 600; color: var(--tx); }

/* ---------- 用户表：停用行整行淡化 ---------- */
table.tbl tr.off td { opacity: 0.55; }

/* ================= v2 作业批阅接线新增（2026-09-18，子任务③ P5；令牌 only，零裸色值） ================= */

/* ---------- 上传列表（逐件 XHR 进度 + 预检告警角标） ---------- */
.uplist { display: grid; gap: 8px; margin-top: 12px; }
.uprow { display: flex; align-items: center; gap: 10px; border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 8px 10px; background: var(--bg-card); flex-wrap: wrap; }
.uprow.err { border-color: var(--red); }
.uprow .nm { flex: 1; min-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12.5px; }
.upbar { display: inline-block; width: 120px; height: 6px; border-radius: 999px; background: var(--bg-hover); overflow: hidden; }
.upbar i { display: block; height: 100%; border-radius: 999px; background: var(--blue-500); transition: width 0.15s ease; }
.warnmsg { color: var(--tx-3); font-size: 12px; margin: -4px 0 6px 10px; }
.ermsg { color: var(--red); font-size: 12px; margin: -4px 0 6px 10px; }
.notice { background: var(--red-bg); color: var(--red); border-radius: var(--r-sm); padding: 8px 10px; font-size: 12.5px; margin-top: 10px; }

/* ---------- 任务条（队列位次 / 进度 / merging / failed 红条 + 重试） ---------- */
.taskrow { border: 1px solid var(--bd); border-radius: var(--r-md); padding: 10px 12px; margin-bottom: 10px; background: var(--bg-card); }
.taskrow.failed { border-color: var(--red); }
.taskrow .prog { height: 8px; border-radius: 999px; background: var(--bg-hover); overflow: hidden; margin-top: 8px; }
.taskrow .prog i { display: block; height: 100%; border-radius: 999px; background: var(--blue-500); transition: width 0.3s ease; }
.taskrow .notice { margin-top: 8px; }
.taskrow .warnmsg { margin: 6px 0 0; }

/* ---------- 局部 loading 转圈（裁决 custom 在途） ---------- */
.spin { display: inline-block; width: 14px; height: 14px; border: 2px solid var(--bd-2); border-top-color: var(--blue-500); border-radius: 50%; animation: qlspin 0.8s linear infinite; vertical-align: -2px; }
@keyframes qlspin { to { transform: rotate(360deg); } }

/* ---------- 真实原件：缩略图 + lightbox 媒体 ---------- */
.fileitem .thumb img { max-height: 100%; max-width: 100%; object-fit: contain; }
.fileitem .thumb .tk { display: grid; place-items: center; height: 100%; color: var(--tx-3); font-size: 13px; font-weight: 600; background: var(--bg-hover); border-radius: var(--r-sm); width: 100%; }
.lb-body img { max-height: 100%; max-width: 100%; object-fit: contain; box-shadow: var(--shadow); border-radius: var(--r-sm); background: var(--bg-card); }
.lb-body iframe { width: min(920px, 100%); height: 100%; border: 0; border-radius: var(--r-sm); background: var(--bg-card); }
.lbpre { width: min(920px, 100%); max-height: 100%; overflow: auto; background: var(--bg-card); color: var(--tx); border-radius: var(--r-sm); padding: 16px; white-space: pre-wrap; font-size: 13px; }

/* （R2/D30 删除：「未分类」容错组 .cause.other——OTHER_CAUSE 取消后 causeHtmlV2 枚举外直接
   不渲染卡，本规则无消费者，随机制物理删除） */

/* ---------- 375px 走查（题卡/裁决/lightbox 全可用） ---------- */
@media (max-width: 760px) {
  .uprow { gap: 6px; padding: 8px; }
  .uprow .nm { min-width: 100%; order: -1; }
  .upbar { width: 84px; }
  .taskrow { padding: 8px 10px; }
  .taskrow .row { gap: 6px; }
  .taskrow .mono { display: none; } /* 手机上收起 batch_id，状态/操作优先 */
  .lb-body iframe, .lbpre { width: 100%; }
}

/* ================= v2 今日作业+错题本接线新增（2026-09-18，子任务④ P3；令牌 only，零裸色值） ================= */

/* ---------- 错题本 · 错因分布条（stats.by_cause 固定序渲染，宽度=占比 max 归一） ---------- */
.dist { display: grid; gap: 6px; background: var(--bg-card); border: 1px solid var(--bd); border-radius: var(--r-md); padding: 12px 14px; }
.distrow { display: flex; align-items: center; gap: 10px; font-size: 12.5px; }
.distrow .dlabel { flex: 0 0 96px; color: var(--tx-2); text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.distrow .dbar { flex: 1; height: 8px; border-radius: 999px; background: var(--bg-hover); overflow: hidden; }
.distrow .dbar i { display: block; height: 100%; border-radius: 999px; background: var(--red); opacity: 0.72; }
.distrow .dnum { flex: 0 0 28px; color: var(--tx-3); font-variant-numeric: tabular-nums; }

/* ---------- 错题卡：争议待裁决（琥珀左缘；展开区 .mkx 由 [hidden] 全局规则管显隐） ---------- */
.mcard.pend { border-left: 3px solid var(--amber); }
.mcard .mkx { margin-top: 8px; }
.mcard .mkx .cause { margin: 0 0 4px; }

/* ---------- 375px：分布条标签收窄，给条形留宽 ---------- */
@media (max-width: 760px) {
  .dist { padding: 10px; }
  .distrow { gap: 8px; }
  .distrow .dlabel { flex-basis: 78px; font-size: 11.5px; }
}


/* ---------- v2 试卷批阅转真新增（2026-09-20，task 09-19 S7；仅令牌，零裸色值） ---------- */
.notice.amber { background: var(--amber-bg); color: var(--amber); }
.exam-col.dispute { border-color: var(--amber); box-shadow: 0 0 0 3px var(--amber-bg); } /* 争议题黄框（.qcard.dispute 同款） */
#exRows tr:hover { background: var(--bg-hover); } /* 得分表行可点选（跳逐题明细） */

/* ---------- 订正功能新增（2026-09-20，task 09-20-correction-grading S5；仅令牌，零裸色值） ----------
   自 prototype/correction/prototype.css 全量迁入（选择器命名已按生产风格取，逐条对应不改结构）；
   转真差异仅三处：① .tab.on .cbadge 的裸白色值 → inherit（零裸色值红线；.tab.on 本身已是白字）；
   ② 订正图/上传缩略由原型 svg 占位换真 <img>（corrections/image 端点 + objectURL 预览），补 img 规则；
   ③ 新增 .corr-cand.cur（单题再订正 scope 高亮，原型走查页无此态）。
   既有组件（tag/btn/qcard/mcard/uprow/upbar/notice/spin/modal-mask/lightbox/chips/drop/ctl）直接复用不重定义。 */

/* ---------- 题 Tab 上的订正角标（Q11：被订正题加角标） ---------- */
.tab .cbadge { font-style: normal; font-size: 11px; margin-left: 3px; font-weight: 700; }
.tab .cbadge.pass { color: var(--green); }
.tab .cbadge.fail { color: var(--amber); }
.tab.on .cbadge.pass, .tab.on .cbadge.fail { color: inherit; opacity: 0.85; } /* 原型裸白色值 → inherit（选中 tab 白字，同效） */

/* ---------- 订正进度条（报告页统计区，Q11：订正完成 x/y） ---------- */
.corr-prog { display: flex; align-items: center; gap: 10px; margin-top: 10px; font-size: 12.5px; color: var(--tx-2); flex-wrap: wrap; }
.corr-prog .pbar { flex: 1; min-width: 120px; max-width: 320px; height: 8px; border-radius: 999px; background: var(--bg-hover); overflow: hidden; }
.corr-prog .pbar i { display: block; height: 100%; border-radius: 999px; background: var(--green); transition: width 0.3s ease; }

/* ---------- 订正记录块（Q11：题卡内原记录 vs 订正记录同屏对比） ---------- */
.corr { border: 1px solid var(--bd); border-left: 3px solid var(--green); border-radius: var(--r-sm); background: var(--bg); padding: 12px 14px; margin-top: 12px; }
.corr.fail { border-left-color: var(--amber); }
.corr-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.corr-head .t { font-weight: 700; font-size: 13px; }
.corr-body { display: grid; grid-template-columns: 128px 1fr; gap: 12px; align-items: start; }
@media (max-width: 760px) { .corr-body { grid-template-columns: 96px 1fr; gap: 10px; } }
.corr-img { border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg-card); cursor: zoom-in; overflow: hidden; }
.corr-img svg { display: block; width: 100%; height: auto; }
.corr-img img { display: block; width: 100%; height: auto; } /* 转真：订正图 = <img>（corrections/image/:sid/:idx，heic 服务端转码透明） */
.corr-meta { font-size: 12.5px; color: var(--tx-2); }
.corr-meta .note { color: var(--tx); margin: 4px 0; line-height: 1.6; }
.corr-acts { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
.corr-none { border: 1px dashed var(--bd-2); border-radius: var(--r-sm); padding: 10px 12px; margin-top: 12px; font-size: 12.5px; color: var(--tx-3); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

/* ---------- M3-W6：轮次 tab v46 逐轮史面板（correction.js corrHistRoundHtml；复用 .corr-head/.corr-img） ---------- */
.corr-hist { border: 1px solid var(--bd); border-left: 3px solid var(--green); border-radius: var(--r-sm); background: var(--bg); padding: 10px 12px; margin: 8px 0; }
.corr-hist.kept { border-left-color: var(--bd-2); border-style: dashed; color: var(--tx-2); } /* 情形③仍空白注记轮（无 v46 行，「—」不改写） */
.corr-hist .corr-img { max-width: 128px; margin-top: 6px; } /* 独立缩略（不在 .corr-body grid 内），点击放大 = wireCorrHistLb */

/* ---------- 订正提交会话（Q8/Q9/Q12/Q14/Q15） ---------- */
.corr-wizard { display: grid; gap: 14px; }
.corr-cands { display: flex; gap: 8px; flex-wrap: wrap; }
.corr-cand { border: 1px solid var(--bd-2); background: var(--bg-card); border-radius: 999px; padding: 4px 12px; font-size: 12.5px; color: var(--tx-2); display: inline-flex; align-items: center; gap: 6px; }
.corr-cand.done-pass { border-color: var(--green); color: var(--green); }
.corr-cand.done-fail { border-color: var(--amber); color: var(--amber); }
.corr-cand.cur { outline: 2px solid var(--blue-500); outline-offset: 1px; color: var(--tx); } /* 单题再订正 scope 高亮（转真新增） */
.preset-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px; }
.preset { border: 1px solid var(--bd); border-radius: var(--r-md); background: var(--bg-card); padding: 10px; cursor: pointer; text-align: left; font-size: 12.5px; color: var(--tx-2); display: flex; gap: 10px; align-items: center; }
.preset:hover { border-color: var(--blue-400); color: var(--tx); }
.preset .pthumb { flex: 0 0 52px; border: 1px solid var(--bd); border-radius: 6px; overflow: hidden; background: var(--bg); }
.preset .pthumb svg { display: block; width: 100%; height: auto; }
.preset .pt b { display: block; color: var(--tx); font-size: 12.5px; margin-bottom: 2px; }

/* 批阅进度阶段列表（转真：running 相四阶段 medium→match→grade→aggregate） */
.stages { list-style: none; margin: 8px 0 0; padding: 0; font-size: 13px; color: var(--tx-3); }
.stages li { padding: 7px 2px; display: flex; gap: 8px; align-items: center; border-bottom: 1px dashed var(--bd); }
.stages li.done { color: var(--green); }
.stages li.cur { color: var(--tx); font-weight: 600; }
.stages li .st-ic { width: 18px; text-align: center; }

/* 会话结果：匹配/未匹配（Q14） */
.corr-res-item { border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg-card); padding: 10px 12px; margin-bottom: 8px; font-size: 13px; }
.corr-res-item.unmatched { border-color: var(--amber); background: var(--amber-bg); }
.corr-res-item .rhead { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 4px; }
.corr-res-item .rhead b { font-size: 13px; }
.corr-res-item .sug { font-size: 12.5px; color: var(--tx-2); margin: 4px 0; }
.corr-res-item .racts { display: flex; gap: 8px; margin-top: 8px; flex-wrap: wrap; }

/* 上传行内缩略图（复用 .uprow，加缩略图位） */
.uprow .uthumb { flex: 0 0 40px; border: 1px solid var(--bd); border-radius: 6px; overflow: hidden; background: var(--bg); }
.uprow .uthumb svg { display: block; width: 100%; height: auto; }
.uprow .uthumb img { display: block; width: 100%; height: auto; cursor: zoom-in; } /* 转真：本地 objectURL 预览；2026-09-24 点击放大（lightbox） */

/* ---------- 试卷得分表订正状态列（Q3/Q11：口径不变 + 状态展示） ---------- */
td.corr-st .tag { white-space: nowrap; }

/* ---------- 错题本订正状态筛选（Q10）+ 卡上状态 tag ---------- */
.mcard .cstat { font-weight: 700; }
.mk-filterbar { display: flex; gap: 16px; flex-wrap: wrap; align-items: center; margin-bottom: 12px; }
.mk-filterbar .fl { font-size: 12px; color: var(--tx-3); margin-right: -8px; }

/* ---------- 原型首页走查脚本样式（全选择器迁入红线：生产无走查页，留档备文档/验收页复用） ---------- */
.walk { counter-reset: wk; display: grid; gap: 8px; }
.walk a.wk { display: flex; gap: 10px; align-items: baseline; border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg-card); padding: 10px 12px; text-decoration: none; color: var(--tx-2); font-size: 13px; }
.walk a.wk:hover { border-color: var(--blue-400); color: var(--tx); }
.walk a.wk::before { counter-increment: wk; content: counter(wk); flex: 0 0 22px; height: 22px; border-radius: 50%; background: var(--blue-50); color: var(--blue-600); font-weight: 700; display: grid; place-items: center; font-size: 12px; align-self: center; }
.walk a.wk b { color: var(--tx); }
.consensus { font-size: 12.5px; color: var(--tx-2); line-height: 1.8; }
.consensus li { margin: 2px 0; }

/* ---------- 富文本渲染（task 09-20-rich-render R5 + design 增补①②③；零裸色值，仅令牌） ----------
   rich()（js/rich.js）产出结构 → 本块样式钩子：
     <p class="rich-p">      段落（单换行已转 <br>，breaks 语义）
     <ul|ol class="rich-list">  列表；(1)/① 型标记已在渲染层剥离 → 加 .rich-num 用原生 decimal 计数，
                             -/1./A. 型标记文本保留在 <li> 内 → 关原生符号防「• - 项」重复
     <h3|h4|h5 class="rich-h">  标题（# / ## / ###）
     <div|span class="rich-math-block">  块级公式容器（横向可滚，AC6 移动端不撑破卡片）
     <code>                  公式渲染失败回退（原文转义显示）
   容器由调用方加 .rich（ui.js 题卡/教学区、exam.js 双栏、mistakes.js 卡）。 */
.rich { white-space: normal; } /* 增补③：覆盖 .stem/.expl 既有 pre-wrap——与 rich() 的 <br> 叠加会双倍换行（同特异性后到覆盖） */
.rich .rich-p { margin: 0 0 6px; line-height: 1.7; }
.rich .rich-p:last-child { margin-bottom: 0; }
.rich .rich-list { margin: 4px 0 6px; padding-left: 1.1em; list-style: none; }
.rich ol.rich-num { list-style: decimal; padding-left: 1.9em; }
.rich .rich-list li { margin: 2px 0; line-height: 1.7; }
.rich .rich-h { margin: 8px 0 4px; line-height: 1.5; font-weight: 700; }
.rich h3.rich-h { font-size: 15px; }
.rich h4.rich-h { font-size: 14px; }
.rich h5.rich-h { font-size: 13px; }
.rich code { font-family: ui-monospace, 'SF Mono', Consolas, Menlo, monospace; font-size: .95em; background: var(--bg-hover); border-radius: 4px; padding: 0 3px; } /* 沿 .mono 字体栈；背景走令牌 */
/* 块级公式：katex display 输出 white-space:nowrap → 长公式必须容器横滚（AC6） */
.rich-math-block { display: block; max-width: 100%; overflow-x: auto; overflow-y: hidden; margin: 6px 0; padding: 2px 0; -webkit-overflow-scrolling: touch; }
.rich-math-block > .katex-display { margin: 0; } /* katex 默认 1em 上下 margin，容器已给间距 */
/* M4.6a 渲染三连：题干大图（rich.js renderStemWithFigures 的 [图:] 占位替换产物；/qbank-assets/ 同源）。
   2026-10-20 尺寸收口（CP 批阅结果页超宽原图 2566×1132 按容器 100% 宽铺满屏）：max-width:100% 之外
   加绝对上限 480px/320px；width/height auto 双 max 约束下浏览器等比缩不裁切（无需 object-fit），
   窄屏 min() 自动退让容器 100%。消费面 = practice 作答区/得分卡 + exam 批阅页同源类。 */
.rich-fig { display: block; max-width: min(100%, 480px); max-height: 320px; height: auto; margin: 8px auto; }
/* 增补②：标签前缀与模型文本同行（「学生作答：」「【参考答案】」「图片识别的学生思路：…」）。
   只放开**首个**段落——全量 inline 会让多段 reference 段间失去分隔（首段之后的块仍按块级排版）。 */
.rich-inline > .rich-p:first-child { display: inline; }
/* 增补①：试卷页左栏原 .exam-col p 间距复刻到富文本容器（<p> → <div class="rich">） */
.exam-col .rich { margin: 0 0 8px; font-size: 13px; line-height: 1.6; }
.exam-col .rich:last-child { margin-bottom: 0; }
@media (max-width: 760px) {
  .rich .rich-list { padding-left: .8em; }
  .rich ol.rich-num { padding-left: 1.5em; }
  .rich-math-block { margin: 4px 0; padding: 1px 0; }
  .rich .rich-p { line-height: 1.65; }
}

/* ---------- 积分页 + nav 未读红点（task 09-22-points-reward-system M3；零裸色值，全走令牌） ----------
   结构钩子：pages/points.js（行/展开/商城/订单）+ points-kit.js（快照人话内部片段）+ unread.js（红点落灯）。 */
.navdot {
  margin-left: auto; min-width: 17px; height: 17px; padding: 0 5px; box-sizing: border-box;
  border-radius: 999px; background: var(--red); color: #fff; /* 白字沿 .tab.on/.chip.on 既有先例 */
  font-size: 10px; font-weight: 700; line-height: 17px; text-align: center;
}
body.side-collapsed .nav a { position: relative; } /* 收起态红点锚定图标右上角 */
body.side-collapsed .navdot {
  position: absolute; top: 2px; right: 8px; margin: 0;
  min-width: 9px; width: 9px; height: 9px; padding: 0; border-radius: 50%;
  font-size: 0; line-height: 9px; /* 收起态只留圆点不显数字 */
}
.pt-row { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px 12px; margin-bottom: 8px; background: var(--bg-card); cursor: pointer; }
.pt-row:hover { border-color: var(--bd-2); }
.pt-row.new { border-left: 3px solid var(--blue-500); background: var(--blue-50); } /* NEW 未读高亮（进页 viewed 后本次会话内保留） */
.pt-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pt-head b { font-size: 13.5px; }
.pt-delta { margin-left: auto; font-weight: 700; font-variant-numeric: tabular-nums; }
.pt-delta.pos { color: var(--green); }
.pt-delta.neg { color: var(--red); }
.pt-delta.zero { color: var(--tx-3); }
.pt-sum { margin-top: 4px; font-size: 13px; color: var(--tx); }
.pt-x { border-top: 1px dashed var(--bd-2); margin-top: 8px; padding-top: 8px; font-size: 12.5px; color: var(--tx-2); line-height: 1.7; }
.pt-x .rule { color: var(--tx-3); font-size: 11.5px; margin-top: 6px; } /* snapshot.rule 口径原文 */
.pt-x .tag { margin-right: 6px; }
.pt-raw summary { cursor: pointer; color: var(--tx-3); font-size: 11.5px; margin-top: 6px; }
.pt-raw pre { margin: 6px 0 0; padding: 8px; background: var(--bg-hover); border-radius: var(--r-sm); font-size: 11px; overflow-x: auto; white-space: pre-wrap; word-break: break-all; }
.pt-ord { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px 12px; margin-bottom: 8px; background: var(--bg-card); font-size: 13px; }
.gift-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(215px, 1fr)); gap: 12px; margin-bottom: 6px; }
.gift { border: 1px solid var(--bd); border-radius: var(--r-md); padding: 12px; background: var(--bg-card); display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
.gift .gname { font-weight: 600; }
.gift .gcost { font-size: 20px; font-weight: 700; color: var(--blue-600); font-variant-numeric: tabular-nums; }
.gift .gcost .dim { font-size: 12px; font-weight: 400; }
.gift.cant { opacity: .55; } /* 余额不足置灰（按钮 disabled + 「还差 n 分」提示） */
.gift .gfoot { margin-top: auto; display: flex; align-items: center; gap: 8px; padding-top: 4px; }
.chip.static { cursor: default; } /* 规则页只读归因胶囊（非可点筛选项） */
#ptRedeemModal textarea.ctl { width: 100%; box-sizing: border-box; resize: vertical; }
@media (max-width: 760px) {
  .pt-head { gap: 6px; }
  .pt-delta { margin-left: auto; } /* 保持右贴（flex-wrap 换行时仍居行尾） */
  .gift-grid { grid-template-columns: 1fr; } /* 小屏单列（同 .grid.c4 收敛惯例） */
}


/* ---------- 积分管理页（task 09-22-points-reward-system M4；只增不改，零裸色值全走令牌） ----------
   结构钩子：pages/points-admin.js（①总览选中行 / 其余复用 .tbl/.tag/.pt-row/.pt-ord/.chip/.notice 既有令牌）。 */
.tbl tbody tr[data-uid] { cursor: pointer; } /* ① 点行联动 ② 流水筛选 */
.tbl tbody tr.sel > td { background: var(--blue-50); } /* ① 选中学生行高亮（.pt-row.new 同款令牌） */
/* ================= 勋章墙新增（2026-09-22，task 09-22-badge-system M5；仅令牌 + 稀有度专用变量，
   零新增图片资源——40 枚 icon 为 emoji 字符直渲，稀有度三档全靠边框/底色/光效区分） ================= */
:root {
  /* 传说金（稀有度专用；本文件是全站唯一允许裸色值处，收敛为令牌供勋章区块引用） */
  --bdg-gold: #b07d1a; --bdg-gold-bg: #fdf6e5; --bdg-gold-glow: rgb(203 150 30 / 0.45);
}
body[data-theme="dark"] {
  --bdg-gold: #d9a944; --bdg-gold-bg: #2a2010; --bdg-gold-glow: rgb(217 169 68 / 0.32);
}

/* ---------- 侧栏红点（unread 跨学年计数角标；收起档图标列也要可见） ---------- */
.nav a { position: relative; }
.navdot {
  position: absolute; top: 3px; right: 8px; min-width: 15px; height: 15px; border-radius: 999px;
  background: var(--red); color: #fff; font-size: 9.5px; font-weight: 700; line-height: 1;
  display: grid; place-items: center; padding: 0 3px;
}
body.side-collapsed .nav a .navdot { top: 2px; right: 10px; }

/* ---------- 墙网格与三态卡 ---------- */
.bd-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); gap: 12px; }
/* 科目组头（2026-09-23 用户要求：学科争锋按科目分组）——复用 .grp-h 令牌，网格内占整行 */
.bd-grid .grp-h { grid-column: 1 / -1; margin: 10px 0 -4px; }
.bd-grid .grp-h:first-child { margin-top: 0; }
.bd-card {
  position: relative; border: 1px solid var(--bd); border-radius: var(--r-md); background: var(--bg-card);
  padding: 16px 10px 12px; text-align: center; cursor: pointer; overflow: visible;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.bd-card:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
.bd-ico { font-size: 34px; line-height: 1.25; margin-bottom: 6px; }
.bd-name { font-size: 13px; font-weight: 600; margin-bottom: 3px; }
.bd-sub { font-size: 11.5px; color: var(--tx-3); }
.bd-cond { margin: 2px 0 6px; font-size: 11.5px; color: var(--tx-2); line-height: 1.5; }

/* 稀有度三档（仅对已点亮卡上妆；灰卡统一素框，不剧透稀有度观感差异） */
.bd-card.earned.r-rare {
  border-color: var(--blue-400);
  background: linear-gradient(165deg, var(--blue-50), var(--bg-card) 58%);
  box-shadow: 0 0 0 1px var(--blue-100), var(--shadow);
}
.bd-card.earned.r-legend {
  border-color: var(--bdg-gold);
  background: linear-gradient(165deg, var(--bdg-gold-bg), var(--bg-card) 60%);
  animation: bdglow 2.8s ease-in-out infinite;
}
@keyframes bdglow {
  0%, 100% { box-shadow: 0 0 5px var(--bdg-gold-glow); }
  50% { box-shadow: 0 0 14px var(--bdg-gold-glow); }
}

/* 未获得常规卡：灰剪影 + 条件文案 + 进度条 */
.bd-card.locked .bd-ico { filter: grayscale(1); opacity: 0.38; }
.bd-card.locked .bd-name { color: var(--tx-2); }
.bd-prog { height: 6px; border-radius: 999px; background: var(--bg-hover); overflow: hidden; margin: 6px 12px 4px; }
.bd-prog i { display: block; height: 100%; border-radius: 999px; background: var(--blue-500); }

/* hidden 未点亮：「？」神秘卡（虚线框，不揭示任何信息） */
.bd-card.mystery { border-style: dashed; background: var(--bg); }
.bd-card.mystery .bd-ico { color: var(--tx-3); font-weight: 700; }
.bd-card.mystery .bd-name { color: var(--tx-3); }

/* 角标：NEW（未读已点亮）/ 隐藏达成 */
.bd-new {
  position: absolute; top: -7px; right: -5px; background: var(--red); color: #fff;
  font-size: 10px; font-weight: 700; border-radius: 999px; padding: 2px 7px; box-shadow: var(--shadow);
}
.bd-htag {
  position: absolute; top: 6px; left: 6px; background: var(--green-bg); color: var(--green);
  font-size: 10px; font-weight: 700; border-radius: 999px; padding: 2px 7px;
}

/* ---------- 点亮仪式：网格卡 灰→彩 + 遮罩获得卡 ---------- */
.bd-card.bd-pre { filter: grayscale(1); opacity: 0.5; }
.bd-card.bd-pop { animation: bdpop 0.7s ease; }
@keyframes bdpop {
  0% { transform: scale(0.55) rotateY(90deg); opacity: 0.3; }
  60% { transform: scale(1.08) rotateY(0deg); opacity: 1; }
  100% { transform: scale(1); }
}
.bd-cer { position: fixed; inset: 0; background: rgb(15 17 21 / 0.74); z-index: 75; display: grid; place-items: center; cursor: pointer; padding: 16px; }
.bd-cer-card {
  width: min(340px, calc(100vw - 40px)); background: var(--bg-card); border: 1px solid var(--bd);
  border-radius: var(--r-md); padding: 26px 22px 20px; box-shadow: var(--shadow);
  animation: bdcin 0.45s ease;
}
@keyframes bdcin { from { transform: scale(0.7); opacity: 0; } to { transform: scale(1); opacity: 1; } }
.bd-cer-ico {
  font-size: 62px; line-height: 1.15; text-align: center; margin-bottom: 10px;
  display: block; animation: bdcglow 1.6s ease-in-out infinite;
}
@keyframes bdcglow {
  0%, 100% { transform: scale(1); filter: drop-shadow(0 0 4px var(--bdg-gold-glow)); }
  50% { transform: scale(1.09); filter: drop-shadow(0 0 15px var(--bdg-gold-glow)); }
}
.bd-cer-tip { text-align: center; margin-top: 14px; color: #e8eaee; font-size: 12px; } /* 深色遮罩上的浅字（裸值仅本文件） */

/* ---------- 详情弹窗大图标 ---------- */
.bd-m-ico { font-size: 56px; text-align: center; margin: 12px 0 8px; }
.bd-m-ico.locked { filter: grayscale(1); opacity: 0.4; }

/* ---------- 两级 tab（M9）：一级学年 #bdYearTabs（.tabbar 既有样式）+ 二级三类 #bdCatTabs ---------- */
#bdCatTabs { margin: -4px 0 12px; } /* 上收 4px：与学年 tab 行的净距 = 8px（.tabbar margin-bottom 12px） */
#bdCatTabs .tab { white-space: nowrap; }
.bd-catn { margin-left: 4px; font-size: 11px; opacity: 0.72; } /* 类内点亮计数 n/total（弱化小字） */

/* ---------- 375px 走查：网格两列保底、仪式卡不溢出 ---------- */
@media (max-width: 760px) {
  .bd-grid { grid-template-columns: repeat(auto-fill, minmax(132px, 1fr)); gap: 10px; }
  .bd-card { padding: 14px 8px 10px; }
  .bd-ico { font-size: 30px; }
  /* M9：三枚类别 tab 一行放下（勤学不辍 2/7 · 学科争锋 0/30 · 神秘珍藏 0/3 ≈ 280px < 375px 版心） */
  #bdCatTabs { gap: 6px; }
  #bdCatTabs .tab { padding: 5px 9px; font-size: 12px; }
  .bd-catn { margin-left: 3px; font-size: 10.5px; }
}

/* ---------- 问下AI（task 09-30-ask-ai-dsh-chat M2）：整页 iframe 容器 ----------
   高度 = 视口 − topbar(≈57px) − workarea 上下 padding（桌面 18+40 / 移动 14+32）；
   dvh 跟随移动端地址栏收展。iframe 铺满、无边框，视觉与 .card 同令牌。 */
.askai-wrap {
  height: calc(100dvh - 57px - 58px);
  min-height: 420px;
  background: var(--bg-card);
  border: 1px solid var(--bd);
  border-radius: var(--r-md);
  box-shadow: var(--shadow);
  overflow: hidden;
}
.askai-frame { display: block; width: 100%; height: 100%; border: none; }
@media (max-width: 760px) {
  .askai-wrap { height: calc(100dvh - 57px - 46px); min-height: 360px; }
}

/* ---------- 费用账单页（task 10-09-billing-admin M4）：bil-* 命名空间，颜色全走令牌 ---------- */
/* flags 告警条：settle_errors 红（异常）、unpriced/partial 琥珀（提醒） */
.bil-flag { background: var(--amber-bg); color: var(--amber); border-radius: var(--r-sm); padding: 8px 10px; font-size: 12.5px; margin-bottom: 8px; }
.bil-flag.red { background: var(--red-bg); color: var(--red); }
/* 环比角标（汇总卡内）：费用上涨 = 红、下降 = 绿（账单语义） */
.bil-delta { font-style: normal; font-weight: 600; }
.bil-delta.up { color: var(--red); }
.bil-delta.down { color: var(--green); }
.bil-delta.flat { color: var(--tx-3); }
/* 每日费用堆叠条形图：纯 CSS（div 高度% 由 billing.js 内联，色值全令牌）；横向可滚 */
.bil-chart { display: flex; align-items: stretch; gap: 4px; height: 150px; overflow-x: auto; border-bottom: 1px solid var(--bd); padding: 6px 2px 0; }
.bil-col { display: flex; flex-direction: column; flex: 1 0 20px; min-width: 20px; height: 100%; }
.bil-bars { flex: 1; display: flex; flex-direction: column; justify-content: flex-end; min-height: 0; }
.bil-seg { width: 100%; }
.bil-seg.g { background: var(--blue-500); }   /* 批阅 */
.bil-seg.c { background: var(--green); }      /* 问下AI */
.bil-seg.t { background: var(--amber); }      /* 流量 */
.bil-xlab { text-align: center; font-size: 10px; color: var(--tx-3); padding-top: 4px; flex: 0 0 auto; }
/* 图例小色块 */
.bil-legend { gap: 14px; margin-top: 8px; font-size: 12px; color: var(--tx-2); }
.bil-sw { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 4px; vertical-align: -1px; }
.bil-sw.g { background: var(--blue-500); }
.bil-sw.c { background: var(--green); }
.bil-sw.t { background: var(--amber); }
@media (max-width: 760px) {
  .bil-chart { height: 120px; }
}

/* ---------- 我的宠物（task 10-10-pet-companion MS1） ----------
   复用既有令牌（.card/.chip/.tag/.ctl/.btn/.row/.notice/.empty）；新增类只做布局与
   行内校验提示，色值全走 var()（零裸色值红线）。暂无需新增 --pet-* 色板 token，
   引入新色时按纪律进 :root（命名 --pet-*），勿写裸值。 */
.pet-field { display: grid; gap: 5px; font-size: 12.5px; color: var(--tx-2); margin: 0 0 12px; max-width: 460px; }
.pet-field .ctl { width: 100%; }
.pet-err { background: var(--red-bg); color: var(--red); border-radius: var(--r-sm); padding: 8px 10px; font-size: 12.5px; margin: 0 0 10px; } /* .auth-err 同款 */
.pet-link { color: var(--blue-600); font-size: 13.5px; font-weight: 600; text-decoration: none; }
.pet-link:hover { text-decoration: underline; }
#petPrefInput { flex: 1; min-width: 220px; resize: vertical; }
.pet-pref { display: flex; align-items: flex-start; gap: 10px; flex-wrap: wrap; border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px 12px; margin-bottom: 8px; background: var(--bg-card); } /* .pt-row 同款令牌，无 pointer（不整行可点） */
.pet-pref-main { flex: 1; min-width: 180px; display: flex; gap: 8px; align-items: baseline; }
.pet-pref-main .tag { flex: none; }
.pet-pref-text { font-size: 13.5px; color: var(--tx); word-break: break-all; }
.pet-pref-meta { font-size: 11.5px; white-space: nowrap; }
.pet-pref-ops { display: flex; gap: 6px; }
.pet-pref-edit { flex: 1; min-width: 240px; display: flex; gap: 8px; align-items: center; }
.pet-pref-edit .ctl { flex: 1; }
@media (max-width: 760px) {
  .pet-pref-meta { width: 100%; } /* 窄屏：时间戳独占一行，操作钮不挤压正文 */
}

/* R2.8 口头禅自定义组合框（2026-10-12 替换原生 datalist 交互缺陷）：input + × 清空 + ▾ 开合 + 下拉面板。
   下拉面板沿 .menu（账号菜单）同款令牌与 z-index:40 先例；色值全走 var()（零裸色值红线），
   暗色态随 body[data-theme="dark"] 令牌自动翻转（对比度同 .menu，无新增色板）。 */
.pet-combo { position: relative; display: flex; align-items: center; gap: 6px; }
.pet-combo .ctl { flex: 1; min-width: 0; }
.pet-combo-clear, .pet-combo-toggle {
  flex: none; width: 28px; height: 28px; display: grid; place-items: center; padding: 0;
  border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg-card);
  color: var(--tx-3); font-size: 13px; line-height: 1; cursor: pointer;
}
.pet-combo-clear:hover, .pet-combo-toggle:hover { background: var(--bg-hover); color: var(--tx); }
.pet-combo-pop {
  position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 40;
  max-height: 224px; overflow-y: auto; padding: 4px;
  background: var(--bg-card); border: 1px solid var(--bd); border-radius: var(--r-sm); box-shadow: var(--shadow);
}
.pet-combo-item {
  display: block; width: 100%; text-align: left; border: 0; background: none;
  padding: 7px 10px; border-radius: 6px; font-size: 13px; color: var(--tx-2); cursor: pointer;
}
.pet-combo-item:hover { background: var(--bg-hover); color: var(--tx); }

/* ---------- 我的宠物 MS2 状态照片（task 10-10-pet-companion R2.7/AC2.7） ----------
   ①形象预览区 + ③六槽位 grid（桌面 3 列 / ≤760px 2 列，沿本文件既有窄屏断点惯例）。
   色值全走 var() 令牌（零裸色值红线）；布局类 pet- 前缀。 */
.pet-preview-stage { display: grid; place-items: center; min-height: 168px; padding: 10px 0 4px; }
.pet-preview-stage img { max-width: 160px; max-height: 160px; object-fit: contain; border-radius: var(--r-sm); }
.pet-preview-ph { display: grid; place-items: center; gap: 6px; min-height: 140px; color: var(--tx-3); font-size: 12.5px; text-align: center; }
.pet-preview-emoji { font-size: 52px; line-height: 1; }
.pet-preview-cap { text-align: center; font-size: 12.5px; padding-bottom: 2px; }
/* AC2.7 页面无死图：静态照片预览加轻量呼吸微动效（chat 域桌宠的动效在插件 tapIndex CSS，两处独立） */
.pet-breathe { animation: pet-breathe 3s ease-in-out infinite; }
@keyframes pet-breathe { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.03); } }
@media (prefers-reduced-motion: reduce) { .pet-breathe { animation: none; } }

.pet-photos { display: grid; gap: 10px; grid-template-columns: repeat(3, 1fr); }
.pet-slot { display: grid; gap: 6px; align-content: start; border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px; background: var(--bg-card); }
.pet-slot-head { display: flex; align-items: center; gap: 8px; }
.pet-slot-head b { font-size: 13.5px; color: var(--tx); }
.pet-slot-head .tag { margin-left: auto; }
.pet-slot-desc { font-size: 11.5px; min-height: 2.6em; }
.pet-slot-img { display: grid; place-items: center; min-height: 104px; padding: 6px; background: var(--bg-hover); border-radius: var(--r-sm); }
.pet-slot-img img { max-width: 100%; max-height: 110px; object-fit: contain; border-radius: 4px; }
.pet-slot-ph { display: grid; place-items: center; gap: 3px; font-size: 11px; }
.pet-slot-ph span:first-child { font-size: 30px; line-height: 1; }
.pet-slot-ops { display: flex; gap: 6px; }
@media (max-width: 760px) {
  .pet-photos { grid-template-columns: repeat(2, 1fr); } /* 窄屏 2 列（任务口径：移动 2 / 桌面 3） */
}

/* ---------- 宠物照片巡查弹层（admin，task 10-10-pet-companion MS2/AC2.6） ----------
   仅一条加宽规则：默认 .modal 440px 放不下六态缩略图墙（3 列 ×2 行），加宽到 640px；
   高度上限沿 .mj-modal 的 86vh 先例。墙/槽位样式全部复用上方 .pet-photos/.pet-slot 家族
   （窄屏 2 列断点一并继承），零新增色值（零裸色值红线）。 */
.pet-patrol { width: min(640px, calc(100vw - 32px)); max-height: 86vh; overflow: auto; }

/* ---------- 全站宠物 overlay（task 10-10-pet-companion MS4/R4，pet-overlay.js 专用） ----------
   z-index 梯度选址：45 = 高于内容/menu(40)、低于全部弹层（modal/sheet 60、lightbox 70、
   bd-cer 75、toast 80）——宠物永不压过弹窗与提示。容器 fixed 右下角且 **pointer-events:none**，
   只有宠物本体/气泡/收起钮可点（.pet-ov-* 交互件逐个 auto）——透明容器区不吃事件，
   不遮挡列表操作按钮（AC4.4）。色值全走 var() 令牌（零裸色值红线）；动画仅 transform/opacity
   （轻量合成层，不触发重排）；移动 39px / 桌面 54px（2026-10-23 用户四轮指令：36/26 的 150%
   取整〔39=26×1.5〕——figure/img/emoji 本体与把手/收起钮全部同比放；同日三轮曾 30/22→36/26
   〔120%〕，此前 2026-10-13 二次验收指令为 120/88 的 25% 取整 30/22，把手与本体同大口径不变；
   hover scale 系数不动），
   pointer:coarse 禁 hover 效果。铭牌规则块已整删退役（2026-10-23 用户指令「默认不需要
   展示名字」，pet-overlay.js 不再建该 DOM，勿恢复）。 */
.pet-ov {
  position: fixed; right: 14px; bottom: 14px; z-index: 45;
  pointer-events: none; /* 容器透明区不吃事件（AC4.4）；交互件各自 auto */
  display: flex; flex-direction: column; align-items: flex-end; gap: 6px;
}
.pet-ov-figure {
  pointer-events: auto; position: relative; width: 54px; height: 54px; /* 2026-10-23 用户四轮指令：36→54（150%） */
  display: grid; place-items: center; cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.pet-ov-img { max-width: 100%; max-height: 100%; object-fit: contain; }
.pet-ov-emoji { font-size: 26px; line-height: 1; } /* 兜底 🐋 随 figure 同比 150%（17→26，25.5 取整） */
.pet-ov-min {
  pointer-events: auto; position: absolute; top: -4px; right: -4px; width: 15px; height: 15px; /* 2026-10-23 用户八轮指令「缩小按钮比现在小一半」：29→15（14.5 取整；四轮 150% 曾 19→29） */
  display: grid; place-items: center; padding: 0; cursor: pointer;
  border: 1px solid var(--bd); border-radius: 50%; background: var(--bg-card); color: var(--tx-3);
  font-size: 8px; line-height: 1; box-shadow: var(--shadow); /* 字形随钮同比（15px 钮下取可读下限 8px，「−」单字符） */
}
.pet-ov-handle {
  pointer-events: auto; width: 54px; height: 54px; padding: 0; cursor: pointer; /* 与本体同大（2026-10-23 用户四轮指令 150%：36→54；同大口径沿 2026-10-13 拍板） */
  display: grid; place-items: center; font-size: 24px; line-height: 1; /* 字形随把手同比（≈0.45 比例沿 20@44/13@30 先例） */
  border: 1px solid var(--bd); border-radius: 50%; background: var(--bg-card);
  box-shadow: var(--shadow); color: var(--tx);
}
.pet-ov-bubble {
  pointer-events: auto; position: relative; max-width: 240px; padding: 8px 12px;
  font-size: 12.5px; line-height: 1.5;
  color: var(--tx); background: var(--bg-card); border: 1px solid var(--bd);
  border-radius: var(--r-md); box-shadow: var(--shadow); word-break: break-word;
  animation: pet-ov-pop 0.18s ease-out;
}
/* 气泡小尾巴（指向宠物：旋转方块半露，背景/边框全走令牌） */
.pet-ov-bubble::after {
  content: ''; position: absolute; right: 22px; bottom: -6px; width: 10px; height: 10px;
  background: var(--bg-card); border-right: 1px solid var(--bd); border-bottom: 1px solid var(--bd);
  transform: rotate(45deg);
}
@keyframes pet-ov-pop { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (hover: hover) and (pointer: fine) {
  /* hover 微反馈仅精确指针环境（桌面）；触屏（pointer:coarse）天然不命中 = 禁 hover（R4.4） */
  .pet-ov-figure:hover .pet-ov-img, .pet-ov-figure:hover .pet-ov-emoji { transform: scale(1.05); transition: transform 0.15s ease-out; }
  .pet-ov-min:hover { color: var(--tx); border-color: var(--bd-2); }
}
@media (pointer: coarse) {
  /* 触屏显式禁 hover 效果（任务口径；双保险——hover 规则本就只在 (hover:hover)+(pointer:fine) 内生效） */
  .pet-ov-figure:hover .pet-ov-img, .pet-ov-figure:hover .pet-ov-emoji { transform: none; }
}
@media (max-width: 760px) {
  /* 移动竖屏可见（AC4.1）：自有组件不受上游 mobile-adapt 影响；39px 紧凑尺寸（2026-10-23 用户四轮指令 150%：26→39）+ 收窄边距 */
  .pet-ov { right: 10px; bottom: calc(10px + env(safe-area-inset-bottom, 0px)); }
  .pet-ov-figure { width: 39px; height: 39px; }
  .pet-ov-emoji { font-size: 20px; } /* 13→20（150%，19.5 取整） */
  .pet-ov-handle { width: 39px; height: 39px; font-size: 15px; } /* 把手随移动端本体同缩，字形同比 */
  .pet-ov-bubble { max-width: min(200px, calc(100vw - 96px)); }
}
@media (prefers-reduced-motion: reduce) {
  .pet-ov-bubble, .pet-ov-figure .pet-breathe { animation: none; }
}

/* ---------- 我的知识树（task 10-14-knowledge-tree M1 骨架 → M4 点亮；design §5 / D15） ----------
   领域色 = 结构语义（四大领域描边），与掌握度无关；M4.2 点亮态：L0-L5 等级色阶令牌
   （L0 灰暗 → L1-L3 渐进绿 → L4/L5 描金光效）+ 空心回填 + 节点角标（短板/动摇）。SVG 着色
   全走 CSS 类（--kt-* 令牌），pages/ktree.js 零裸色值（红线：styles.css 是唯一例外文件）。
   交互：画布 touch-action:none（pan/zoom 不与页面滚动打架）；hover 效果仅 (hover:hover)+(pointer:fine)。 */
:root {
  --kt-dom-algebra: #3b82f6;   /* 数与代数 · 蓝 */
  --kt-dom-geometry: #10b981;  /* 图形与几何 · 绿 */
  --kt-dom-stats: #f59e0b;     /* 统计与概率 · 琥珀 */
  --kt-dom-compr: #a855f7;     /* 综合与实践 · 紫 */
  --kt-edge: #b6bfcc; --kt-edge-hl: #ef4444;
  --kt-band: #eef2f7; --kt-bandlbl: #9ca3af;
  /* M4.2 等级色阶（D15 定案实施）：--kt-lv* = SVG 节点填充；HTML 侧（图例点/说明徽标/
     直方图/叶级徽标）经 .kt-lvb0..5 背景类消费同一令牌（本块下方） */
  --kt-lv0: #dfe3e9; --kt-lv1: #cdebd7; --kt-lv2: #a9dcbc; --kt-lv3: #7ecb9c;
  --kt-lv4: #f7e5b0; --kt-lv5: #f3d477;
  --kt-gold: #c9971c; --kt-gold-glow: rgb(201 151 28 / .55);
  --kt-badge-tx: #ffffff;      /* 角标/徽标字形色（深浅主题同一值：底色饱和度足够） */
}
body[data-theme="dark"] {
  --kt-edge: #4b5563; --kt-band: #232428; --kt-bandlbl: #7c7e83;
  --kt-lv0: #34343b; --kt-lv1: #1e4430; --kt-lv2: #27573d; --kt-lv3: #2f6e4c;
  --kt-lv4: #57451a; --kt-lv5: #6f581d;
  --kt-gold: #e0b452; --kt-gold-glow: rgb(224 180 82 / .45);
}
/* 画布容器：定高视口（clamp 适配屏幕），溢出隐藏 */
#ktSvgWrap {
  position: relative; width: 100%; height: clamp(420px, 62vh, 760px); overflow: hidden;
  background: var(--bg); border: 1px solid var(--bd); border-radius: var(--r-sm);
}
#ktSvg { width: 100%; height: 100%; display: block; touch-action: none; user-select: none; -webkit-user-select: none; cursor: grab; }
#ktSvg:active { cursor: grabbing; }
/* 层带与层标签（自底向上 L0-L5；偶数层铺底色带） */
.kt-band { fill: var(--kt-band); opacity: .55; }
.kt-bandlbl { font-size: 12px; fill: var(--kt-bandlbl); }
/* 依赖边（Bézier + 箭头 marker；hl = 依赖链高亮，dim = 淡出） */
.kt-edge { fill: none; stroke: var(--kt-edge); stroke-width: 1.6; opacity: .8; transition: opacity .15s, stroke .15s; }
.kt-edge.hl { stroke: var(--kt-edge-hl); stroke-width: 2.6; opacity: 1; }
.kt-edge.dim { opacity: .08; }
marker.kt-marker path { fill: var(--kt-edge); }
marker.kt-marker-hl path { fill: var(--kt-edge-hl); }
/* 节点：白底 + 领域描边（骨架态统一样式）；点亮态 nodeClassList 追加 kt-lv{0-5}/kt-derived */
.kt-node rect { fill: var(--bg-card); stroke-width: 2; cursor: pointer; }
.kt-node text { pointer-events: none; }
.kt-nname { font-size: 13.5px; font-weight: 600; fill: var(--tx); }
.kt-nname-sm { font-size: 12px; } /* 长名（>7 字，如「不等式与不等式组」）缩号 */
.kt-nsub { font-size: 10px; fill: var(--tx-3); }
.kt-node.kt-dom-algebra rect { stroke: var(--kt-dom-algebra); }
.kt-node.kt-dom-geometry rect { stroke: var(--kt-dom-geometry); }
.kt-node.kt-dom-stats rect { stroke: var(--kt-dom-stats); }
.kt-node.kt-dom-compr rect { stroke: var(--kt-dom-compr); }
.kt-node.dim { opacity: .25; }
@media (hover: hover) and (pointer: fine) {
  .kt-node:hover rect { filter: drop-shadow(0 2px 6px rgb(15 17 21 / 0.28)); }
}
/* M4.2 点亮：等级色阶填充（L0 灰暗 → L1-L3 渐进绿 → L4/L5 暖金底+描金光效，D15；
   领域描边保留，L4/L5 描金覆盖之——荣誉级视觉优先，备案）。置于领域/hover 规则之后生效 */
.kt-node.kt-lv0 rect { fill: var(--kt-lv0); }
.kt-node.kt-lv0 .kt-nname { fill: var(--tx-2); } /* L0 灰暗：名字同步弱化（未点亮语义） */
.kt-node.kt-lv1 rect { fill: var(--kt-lv1); }
.kt-node.kt-lv2 rect { fill: var(--kt-lv2); }
.kt-node.kt-lv3 rect { fill: var(--kt-lv3); }
.kt-node.kt-lv4 rect { fill: var(--kt-lv4); stroke: var(--kt-gold); filter: drop-shadow(0 0 4px var(--kt-gold-glow)); }
.kt-node.kt-lv5 rect { fill: var(--kt-lv5); stroke: var(--kt-gold); stroke-width: 2.6; filter: drop-shadow(0 0 4px var(--kt-gold-glow)) drop-shadow(0 0 9px var(--kt-gold-glow)); }
/* 空心半透明 = 回填估算（D10 derived；cap L3 保证永不与描金叠加） */
.kt-node.kt-derived rect { fill-opacity: .22; stroke-dasharray: 6 4; }
@media (hover: hover) and (pointer: fine) {
  /* 描金节点 hover：基础光效上叠浮起阴影（普通节点 hover 规则不适配 filter 叠加） */
  .kt-node.kt-lv4:hover rect { filter: drop-shadow(0 0 4px var(--kt-gold-glow)) drop-shadow(0 2px 6px rgb(15 17 21 / 0.28)); }
  .kt-node.kt-lv5:hover rect { filter: drop-shadow(0 0 4px var(--kt-gold-glow)) drop-shadow(0 0 9px var(--kt-gold-glow)) drop-shadow(0 2px 6px rgb(15 17 21 / 0.28)); }
}
/* M4.2 节点角标：短=短板（存在 ≤L1 细粒度，D9）/ 摇=荣誉级动摇（D3）；
   全局 pointer-events:none——不吃节点 click/不干扰 pan（延迟捕获模式红线） */
.kt-badge { pointer-events: none; }
.kt-badge circle { stroke: var(--bg-card); stroke-width: 1.2; }
.kt-badge-short circle { fill: var(--red); }
.kt-badge-shake circle { fill: var(--amber); }
.kt-badge text { font-size: 9.5px; font-weight: 700; fill: var(--kt-badge-tx); }
/* 图例（卡片顶部：四大领域色块 + 箭头语义说明） */
.kt-legend { display: inline-flex; flex-wrap: wrap; gap: 10px; align-items: center; font-size: 12px; color: var(--tx-2); }
.kt-chip { display: inline-flex; align-items: center; gap: 5px; }
.kt-dot { width: 11px; height: 11px; border-radius: 3px; display: inline-block; }
.kt-dot.kt-dom-algebra { background: var(--kt-dom-algebra); }
.kt-dot.kt-dom-geometry { background: var(--kt-dom-geometry); }
.kt-dot.kt-dom-stats { background: var(--kt-dom-stats); }
.kt-dot.kt-dom-compr { background: var(--kt-dom-compr); }
.kt-legend-note { color: var(--tx-3); }
/* M4.2 点亮图例：空心回填点（虚线描边）+ L4/L5 点描金圈（与节点光效同语义）+ 迷你角标 */
.kt-dot.kt-dot-drv { background: transparent; border: 1.5px dashed var(--tx-3); width: 10px; height: 10px; box-sizing: border-box; }
.kt-dot.kt-lvb4, .kt-dot.kt-lvb5 { box-shadow: 0 0 0 1.5px var(--kt-gold); }
.kt-lgb { display: inline-flex; width: 15px; height: 15px; border-radius: 50%; align-items: center; justify-content: center; font-size: 9.5px; font-weight: 700; color: var(--kt-badge-tx); flex: none; }
.kt-lgb.kt-badge-short { background: var(--red); }
.kt-lgb.kt-badge-shake { background: var(--amber); }
/* 等级说明（M2 发布后延续小需求）：可折叠静态文案块，默认收起只露 summary 按钮。
   M4.2 定色（spec 原「M4 定色值后替换」占位到期）：徽标接 kt-lvb* 等级色阶（下方共享类），
   荣誉级（L4/L5）叠加描金虚线；note 文案与「树的读法」段两态动态（ktree.js ensureLevelHelp）。 */
.kt-levels { margin-bottom: 8px; }
.kt-levels > summary { display: inline-block; list-style: none; cursor: pointer; }
.kt-levels > summary::-webkit-details-marker { display: none; }
.kt-levels > summary::after { content: ' ▸'; }
.kt-levels[open] > summary::after { content: ' ▾'; }
.kt-lv-body {
  border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg);
  padding: 10px 12px; margin-top: 8px; font-size: 12.5px; color: var(--tx-2); line-height: 1.7;
}
.kt-lv-note { color: var(--tx-3); margin-bottom: 8px; }
.kt-lv-row { display: flex; gap: 8px; align-items: baseline; padding: 3px 0; }
.kt-lv-badge {
  flex: none; min-width: 34px; text-align: center; font-weight: 700; font-size: 11.5px; line-height: 1.7;
  padding: 0 6px; border-radius: 6px; border: 1px solid var(--bd-2); background: var(--bg-card); color: var(--tx-2);
}
.kt-lv-badge.kt-lv-honor { border-style: dashed; border-color: var(--kt-gold); }
.kt-lv-name { flex: none; font-weight: 600; color: var(--tx); }
.kt-lv-h { display: inline-block; font-size: 12px; font-weight: 700; color: var(--blue-600); margin: 10px 0 4px; padding: 3px 10px; background: var(--blue-50); border-radius: 6px; }
.kt-lv-rules { margin: 4px 0 0; padding-left: 20px; }
.kt-lv-rules li { margin: 3px 0; }
/* 选择器「待开放」占位 tab（淡色示禁用感，仍可点击查看占位说明） */
.tab.kt-soon { opacity: .55; }
/* 节点详情面板：fixed 右侧抽屉（ktree.js 挂 body；transform 滑入滑出，不用 hidden——保过渡动画） */
.kt-panel {
  position: fixed; top: 0; right: 0; z-index: 60; width: 400px; max-width: 92vw; height: 100vh;
  background: var(--bg-card); border-left: 1px solid var(--bd); box-shadow: var(--shadow);
  overflow-y: auto; transform: translateX(105%); transition: transform .22s ease;
  -webkit-overflow-scrolling: touch;
}
.kt-panel.open { transform: none; }
.kt-ph { position: sticky; top: 0; background: var(--bg-card); padding: 16px 20px 10px; border-bottom: 1px solid var(--bd); }
.kt-ph h2 { margin: 0; font-size: 17px; padding-right: 30px; }
.kt-pm { margin-top: 4px; }
.kt-depline { font-size: 12.5px; color: var(--tx-2); margin-top: 4px; line-height: 1.6; }
.kt-pclose { position: absolute; top: 12px; right: 14px; border: 0; background: none; font-size: 18px; line-height: 1; cursor: pointer; color: var(--tx-3); padding: 6px 8px; border-radius: 6px; }
.kt-pbody { padding: 10px 20px 30px; }
/* CATS 分组头 + 细粒度条目（title 属性悬停可见 kp_id，v0.3 审阅口径；M4.3 flex 行=标题+徽标+标记） */
.kt-ghead { font-size: 12px; font-weight: 700; color: var(--blue-600); margin: 12px 0 6px; padding: 4px 10px; background: var(--blue-50); border-radius: 6px; }
.kt-ghead:first-child { margin-top: 0; }
.kt-leaf { font-size: 13px; padding: 7px 10px; border-radius: var(--r-sm); background: var(--bg-hover); margin-bottom: 6px; color: var(--tx-2); cursor: default; display: flex; align-items: center; gap: 6px; }
.kt-leaf-t { flex: 1; min-width: 0; overflow-wrap: anywhere; } /* 标题列弹性截断，徽标不挤行 */
.kt-leaf.kt-leaf-drv { background: transparent; border: 1px dashed var(--bd-2); } /* M4.3 回填叶：虚线框 */
.kt-leaf-lv { flex: none; font-size: 10.5px; font-weight: 700; color: var(--tx); padding: 1px 6px; border-radius: 5px; }
.kt-leaf-lv.kt-drv { background: transparent; border: 1px dashed var(--tx-3); color: var(--tx-2); font-weight: 600; }
.kt-tag { flex: none; font-size: 10.5px; padding: 1px 6px; border-radius: 5px; font-weight: 600; }
.kt-tag-shake { color: var(--amber); background: var(--amber-bg); } /* 全站 tag 配色口径（深浅主题令牌齐备） */
.kt-tag-debt { color: var(--red); background: var(--red-bg); }
/* M4.5「费曼讲解」按钮（每叶行，仅点亮态渲染）：幽灵小按钮，色值全走令牌零裸值 */
.kt-leaf-fey { flex: none; font-size: 10.5px; font-weight: 600; color: var(--blue-600); background: transparent; border: 1px solid var(--bd-2); border-radius: 5px; padding: 1px 7px; cursor: pointer; }
.kt-leaf-fey:hover { background: var(--blue-50); border-color: var(--blue-600); }
/* M4.3 面板完全体：等级分布直方图（CSS 条=宽度%布局 inline + kt-lvb* 令牌色类，billing 图表零库先例） */
.kt-hist { margin: 2px 0 12px; padding: 9px 11px; border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg); }
.kt-hist-t { font-size: 11.5px; font-weight: 700; color: var(--tx-3); margin-bottom: 6px; }
.kt-hrow { display: flex; align-items: center; gap: 7px; margin: 3px 0; }
.kt-hlab { flex: none; width: 26px; text-align: center; font-size: 10.5px; font-weight: 700; color: var(--tx); border-radius: 5px; padding: 0.5px 0; }
.kt-htrack { flex: 1; height: 9px; background: var(--bg-hover); border-radius: 5px; overflow: hidden; }
.kt-hbar { height: 100%; border-radius: 5px; min-width: 0; }
.kt-hnum { flex: none; min-width: 22px; text-align: right; font-size: 11px; color: var(--tx-2); }
/* M4.2/M4.3 等级色 HTML 侧共享背景类（图例点/说明徽标/直方图标签+条/叶级徽标同源 SVG 填充色；
   置于组件规则之后：同特异性后者胜，覆盖 .kt-lv-badge 等组件的默认底色） */
.kt-lvb0 { background: var(--kt-lv0); } .kt-lvb1 { background: var(--kt-lv1); }
.kt-lvb2 { background: var(--kt-lv2); } .kt-lvb3 { background: var(--kt-lv3); }
.kt-lvb4 { background: var(--kt-lv4); } .kt-lvb5 { background: var(--kt-lv5); }
@media (max-width: 760px) {
  /* 手机（PWA 验收 AC8a）：抽屉全幅，画布降高留顶栏/选择器空间 */
  .kt-panel { width: 100vw; max-width: 100vw; }
  #ktSvgWrap { height: clamp(360px, 55vh, 560px); }
  .kt-lv-row { flex-wrap: wrap; } /* 等级说明行小屏换行（徽标+名称一行，描述折行） */
}
@media (prefers-reduced-motion: reduce) {
  .kt-panel, .kt-edge { transition: none; }
}

/* ── scope-picker（task 10-12-custom-paper M1）：范围选择器布局 ──────────────
   纯布局/间距类——状态色零裸值，全走既有令牌与 .chip/.btn/.dim/.notice/.row 复用 */
.scp-part { margin-bottom: 12px; }
.scp-part-t { font-size: 12px; margin-bottom: 6px; }
.scp-vol { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 6px 10px; margin-bottom: 6px; background: var(--bg-card); }
.scp-vol > .row { gap: 6px; }
.scp-chaps { margin: 4px 0 2px 22px; border-left: 1px solid var(--bd); padding-left: 10px; }
.scp-chap { margin-bottom: 2px; }
.scp-chap > .row { gap: 6px; }
.scp-sects { margin: 2px 0 4px 22px; border-left: 1px solid var(--bd); padding-left: 10px; }
.scp-sect { font-size: 13px; color: var(--tx-2); margin-bottom: 2px; }
/* R38②b（4.12.5e）：策略命中定位高亮（setHighlight display-only——纯视图态，value 零触碰；
   节 = 蓝底描边实标，含命中节的章/册 = 字色上浮轻标，帮用户看清「命中考点在教材哪里」） */
.scp-sect.scp-hl { background: var(--blue-50); box-shadow: inset 0 0 0 1px var(--blue-400); border-radius: var(--r-sm); }
.scp-hl-up { color: var(--blue-600); }
.scp-summary { font-size: 12px; border-top: 1px dashed var(--bd); padding-top: 8px; margin-top: 4px; }

/* ── 组卷页（task 10-12-custom-paper M2-E）：.cp-* 布局段 ─────────────────────
   纯布局/间距类——状态色零裸值，全走既有令牌；徽章/提示/难度条复用
   .tag(.gray/.green/.amber/.red)/.notice.amber/.ds-bar(i.g/.a/.r)/.dim/.mono 不重定义 */
.cp-sec-t { font-size: 12px; margin-bottom: 6px; }
.cp-size-row { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.cp-size-n { max-width: 110px; }
.cp-meta { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.cp-mix-t { margin-top: 8px; }
.cp-mix { display: flex; margin: 6px 0 10px; }
.cp-mix i { border-radius: 0; } /* 三段拼接：ds-bar 单段圆角在组合条上会断裂，改直角（容器 overflow 已裁圆） */
.cp-item { border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg-card); padding: 8px 12px; margin-bottom: 8px; font-size: 13px; }
.cp-pos { display: inline-block; min-width: 20px; margin-right: 4px; }
.cp-badges { margin-top: 6px; display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
/* 2026-10-15 验收修复：题干富渲染容器（消毒 stem_html / rich(stem_latex) fallback）+ 选项独立行（sp 内联样式同款收进 class） */
.cp-stem { margin-top: 2px; }
.cp-stem img { max-width: 100%; height: auto; }
/* 验收轮三：题库行内公式图原生带 style="vertical-align:middle"，消毒剥 style 后由本规则统一补回观感 */
.cp-stem img, .cp-opts img { vertical-align: middle; }
.cp-opts { margin-top: 6px; display: flex; flex-direction: column; gap: 4px; font-size: 13px; }
.cp-exits { margin-top: 12px; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.cp-nr-list { margin-top: 8px; display: flex; flex-direction: column; gap: 4px; }
.cp-nr-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; font-size: 12.5px; }

/* ── 练习中心（task 10-15-practice-center M1）：.pc-* 布局段 ───────────────────
   样式参照 = 原型 v9（research/原型v9-练习中心定稿.html，:root 令牌与本站完全同值）；
   纯布局/间距 + 令牌引用，零裸色值（暗色态随 body[data-theme="dark"] 令牌自动翻转）；
   卡片/主 Tab/科目条复用 .stat/.grid.c4/.tabbar/.tab.ntrl/.card/.btn/.notice 既有类不重定义 */
.pc-stats .stat { position: relative; } /* .pc-more 角标定位锚 */
.pc-stat.clickable { cursor: pointer; }
.pc-stat.clickable:hover { border-color: var(--blue-400); }
.pc-more { position: absolute; right: 12px; top: 12px; color: var(--tx-3); font-size: 11px; }
.pc-k { font-size: 12px; color: var(--tx-2); }
.pc-v { font-size: 22px; font-weight: 700; margin-top: 2px; }
.pc-v small { font-size: 12px; font-weight: 400; color: var(--tx-3); margin-left: 2px; }
.pc-v.warn { color: var(--amber); }
.pc-v.good { color: var(--green); }
.pc-hint { font-size: 11.5px; color: var(--tx-3); margin-top: 2px; }
/* 待复习展开面板（v9 .pend-panel：蓝边卡 + 行 + 来源标注 + × 移出钮） */
.pc-pend { border-color: var(--blue-100); padding: 12px 16px; }
.pc-pend h3 { margin: 0 0 4px; font-size: 13.5px; color: var(--blue-600); }
.pc-pend-note { font-size: 12px; color: var(--tx-3); margin-bottom: 8px; line-height: 1.6; }
.pc-pend-row { display: flex; align-items: center; gap: 8px; padding: 7px 2px; border-bottom: 1px solid var(--bd); font-size: 13px; }
.pc-pend-list .pc-pend-row:last-child { border-bottom: none; }
.pc-nm { flex: 1; }
.pc-why { font-size: 11.5px; color: var(--tx-3); background: var(--bg-hover); border-radius: 5px; padding: 2px 8px; }
.pc-why.hot { background: var(--red-bg); color: var(--red); } /* v9 原型裸色值 → 令牌 --red（零裸色值红线，本段 hex 字面量零容忍含注释） */
.pc-rm { border: none; background: none; color: var(--tx-3); font-size: 15px; padding: 2px 6px; border-radius: 6px; cursor: pointer; }
.pc-rm:hover { background: var(--red-bg); color: var(--red); }
.pc-rm:disabled { opacity: 0.45; cursor: not-allowed; }
.pc-pend-foot { margin-top: 8px; display: flex; gap: 8px; align-items: center; font-size: 12px; }

/* ── 练习中心 M2（task 10-15-practice-center 生成 Tab，v9 原型对齐）+ scope-picker
   strategyUnion 模式。复用不重定义：.chips/.chip(.on)/.tag/.notice/.ds-bar/.dim/.mono/
   .btn/.ctl/.row；零裸色值红线——v9 原型裸 hex 一律换令牌（dark 模式 :root 覆写自动适配） */
.chip.review::before { content: '↻ '; font-size: 12px; } /* v9 复习预设前缀符 */
.chip .pc-n { font-size: 11px; opacity: 0.75; margin-left: 3px; }
.chip:disabled { opacity: 0.45; cursor: not-allowed; } /* QLAN_REVIEW off 周/月禁用态 */
.pc-gen-head { display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; margin-bottom: 10px; font-size: 15px; }
.pc-gen-head .dim { font-size: 12px; }
.pc-confirm { border: 1px solid var(--blue-100); background: var(--blue-50); border-radius: var(--r-sm); padding: 12px 14px; margin-bottom: 12px; font-size: 13px; }
.pc-confirm h3 { margin: 0 0 8px; font-size: 13.5px; color: var(--blue-600); }
.pc-cf-note { font-size: 12px; margin-bottom: 6px; line-height: 1.6; }
.pc-kplist { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
.pc-kptag { background: var(--bg-card); border: 1px solid var(--bd); border-radius: 6px; padding: 3px 9px; font-size: 12px; color: var(--tx-2); cursor: pointer; display: inline-flex; align-items: center; gap: 4px; }
.pc-kptag.hot { border-color: var(--red); background: var(--red-bg); color: var(--red); }
.pc-qty { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; margin-top: 8px; color: var(--tx-2); font-size: 12.5px; }
.pc-qty label { display: flex; align-items: center; gap: 4px; }
.pc-qty input[type="number"] { width: 56px; padding: 4px 6px; }
/* 4.12.5 R35：难度四档 chip 行（题量行下方；选中态沿 .chip.on，副标比例一行小字） */
.pc-diff { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-top: 8px; color: var(--tx-2); font-size: 12.5px; }
.pc-diff .pc-diff-chip { padding: 3px 12px; font-size: 12px; }
.pc-diff .pc-diff-pct { font-size: 11.5px; }
.pc-cf-ops { margin-top: 10px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.pc-gen-hint { font-size: 12px; }
.pc-nl { display: flex; gap: 8px; margin-bottom: 12px; } /* M8f R43 起 = 智能出卷确认层输入行（原卡片级常驻 NL 行撤除，布局类接替复用） */
.pc-nl input { flex: 1; }
/* ── M8f R43 智能出卷（第五预设）：chip 前缀符 + 确认层三段（范围 pills/题量/难度 band 旁注）。
   复用不重定义：.chip(.on)/.pc-confirm/.pc-qty/.pc-diff/.tag/.dim/.btn/.ctl；零裸色红线——
   全走既有令牌（pill 形态沿 .pc-kptag 先例，refer 基线 pill 强调色沿 .pc-confirm h3 蓝系） */
.chip.smart::before { content: '✦ '; font-size: 12px; } /* 智能预设前缀符（.chip.review ↻ 同款手法） */
.pc-smart-sec { margin-top: 10px; }
.pc-smart-lbl { font-size: 12px; color: var(--tx-3); margin-bottom: 4px; }
.pc-smart-pills { display: flex; flex-wrap: wrap; gap: 6px; }
.pc-smart-pill { background: var(--bg-card); border: 1px solid var(--bd); border-radius: 6px; padding: 3px 9px; font-size: 12px; color: var(--tx-2); display: inline-flex; align-items: center; gap: 5px; }
.pc-smart-pill.refer { border-color: var(--blue-500); color: var(--blue-600); }
.pc-smart-pill b { cursor: pointer; font-weight: 600; color: var(--tx-3); }
.pc-smart-pill b:hover { color: var(--red); }
.pc-smart-band { font-size: 11.5px; margin-top: 4px; }
/* M8f R44（2026-10-20）：输入行下方示例文案行——placeholder 不可选中复制 → 示例句点击填入 + 可选中复制。
   形态沿 .pc-az-code 先例（bg-hover 底 + tx-2）；负上边距抵 .pc-nl 的 12px 下距使示例贴紧输入行；零裸色全令牌 */
.pc-smart-ex { font-size: 11.5px; margin: -6px 0 12px; }
.pc-smart-tpl { cursor: pointer; user-select: text; padding: 2px 8px; border: 1px dashed var(--bd-2); border-radius: 5px; background: var(--bg-hover); color: var(--tx-2); }
.pc-smart-tpl:hover { border-color: var(--blue-500); color: var(--blue-600); }
/* ─── M8b 原卷直搜面板（design §10.2/§10.3，原型 prototype-paper-search-v4.html）：纯布局/间距类，
   状态色零裸值——选中态沿 .pc-rec-row.active 蓝框先例、空态沿 .empty、提示沿 .dim/.notice ─── */
.pc-ps-range { font-size: 12px; margin: -4px 0 10px; }
.pc-ps-form { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 6px; }
.pc-ps-form select.ctl { flex: 0 0 auto; padding: 5px 8px; font-size: 12.5px; max-width: 120px; }
.pc-ps-form input.ctl { flex: 1 1 180px; min-width: 140px; }
#pcPsSchool { max-width: 190px; } /* 学校下拉放宽（置顶校名+计数徽标长于区/卷型，验收反馈⑥） */
.pc-ps-pgt { font-size: 12px; } /* pager 计数文案（mockup v4 renderPager 同款布局） */
.pc-ps-pgdots { align-self: center; padding: 0 2px; } /* 页码窗口折叠省略号 */
.pc-ps-hint { font-size: 11.5px; margin-bottom: 8px; }
.pc-ps-list { display: flex; flex-direction: column; gap: 6px; max-height: 320px; overflow: auto; margin: 8px 0; }
.pc-ps-card { display: flex; flex-direction: column; gap: 4px; text-align: left; border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 8px 10px; background: var(--bg-card); font-size: 13px; cursor: pointer; width: 100%; }
.pc-ps-card:hover { border-color: var(--blue-400); }
.pc-ps-card.on { border-color: var(--blue-500); box-shadow: 0 0 0 2px var(--blue-50); } /* 单选高亮（.pc-rec-row.active 同款） */
.pc-ps-t { font-weight: 600; }
.pc-ps-tags { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.pc-ps-selbar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; border-top: 1px dashed var(--bd-2); margin-top: 10px; padding-top: 10px; }
.pc-ps-selt { font-size: 13px; }
.pc-ps-selnote { flex-basis: 100%; font-size: 11.5px; }
.pc-preview { border-top: 1px dashed var(--bd-2); margin-top: 14px; padding-top: 14px; }
.pc-pv-head { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; font-size: 14.5px; }
.pc-pv-sub { font-size: 12.5px; margin-top: 4px; }
.pc-pv-oldmix { margin-left: 6px; font-size: 11.5px; color: var(--tx-3); } /* M8e R41 旧卷降级注记 */
.pc-pv-mix { display: flex; margin: 8px 0; }
.pc-pv-mix i { border-radius: 0; } /* 三/四段拼接直角（.cp-mix 同款：容器 overflow 已裁圆；R41 四桶同规则） */
.pc-qlist { border: 1px solid var(--bd); border-radius: var(--r-sm); max-height: 220px; overflow: auto; margin: 8px 0; background: var(--bg-card); }
.pc-qrow { display: flex; gap: 8px; padding: 7px 10px; border-bottom: 1px solid var(--bd); font-size: 12.5px; color: var(--tx-2); align-items: baseline; }
.pc-qrow:last-child { border-bottom: none; }
.pc-no { color: var(--tx-3); flex: 0 0 30px; text-align: right; }
.pc-t { flex: 0 0 40px; color: var(--tx-3); }
/* 4.12 R18⑥：预览行题面升 rich 三级链（stem_html/stem_latex 富渲染）→ 块级产物夹取 ~3 行，
   预览定位（确认卷面构成）不整题展开；p 边距压平保夹取行数、img 限高防单图撑爆行 */
.pc-stem { flex: 1; min-width: 0; max-height: 4.5em; overflow: hidden; }
.pc-stem p { margin: 0; }
.pc-stem img { max-height: 3.2em; width: auto; max-width: 100%; }
.pc-rep { flex: 0 0 auto; }
.pc-exits { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; align-items: center; }
.pc-offline-note { font-size: 12px; margin-top: 6px; }
.pc-nr { margin-top: 10px; }
.pc-nr-list { margin-top: 8px; display: flex; flex-direction: column; gap: 4px; }
.pc-nr-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; font-size: 12.5px; }
.pc-nr-ops { margin-top: 8px; }
/* R38③（4.12.5e 沙箱验收反馈）：试卷版/答案版操作行排一行（flex 一行、窄屏自然换行
   不主动折；行距 20px 拉开两 variant 组）；预览卡与记录行 PDF 盒（.pc-rec-pdfbox）共用生效 */
.pc-pdfbox { margin-top: 10px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 20px; }
.pc-pdfbox > .pc-nr-row { flex: 0 1 auto; min-width: 0; }
/* scope-picker strategyUnion（design §5.3）：策略复选 pill 组（v9 .strat 同款令牌化） */
.scp-strats { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin: 2px 0 10px; }
.scp-strat { background: var(--bg-card); border: 1px solid var(--bd-2); border-radius: 999px; padding: 4px 12px; font-size: 12.5px; color: var(--tx-2); display: inline-flex; gap: 5px; align-items: center; cursor: pointer; }
.scp-strat input { margin: 0; vertical-align: -1px; }
.scp-strat.on { border-color: var(--blue-400); background: var(--blue-50); color: var(--blue-600); font-weight: 600; }
/* R38②（4.12.5e）：策略命中考点清单面板（纯展示；pill 令牌化同 .scp-strat 语系，
   双活最多 24 pill → 清单限高滚动；显隐走 [hidden] 全局规则，.pc-hits[hidden] 无需另钉） */
.pc-hits { margin: 0 0 10px; display: flex; flex-direction: column; gap: 8px; }
.pc-hits-blk { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 8px 10px; background: var(--bg-card); }
.pc-hits-t { font-size: 12.5px; font-weight: 600; color: var(--tx-2); margin-bottom: 6px; }
.pc-hits-list { display: flex; flex-wrap: wrap; gap: 6px; max-height: 132px; overflow-y: auto; }
.pc-hit { display: inline-flex; gap: 5px; align-items: center; border: 1px solid var(--bd-2); border-radius: 999px; padding: 2px 9px; font-size: 12px; color: var(--tx-2); background: var(--bg-hover); }
.pc-hit b { color: var(--blue-600); font-size: 11px; }
/* R38②b：pill 尾缀教材定位徽标（「八上 11.2」形态；loc=null 不渲染） */
.pc-hit-loc { font-style: normal; font-size: 10.5px; color: var(--tx-3); border: 1px solid var(--bd); border-radius: 5px; padding: 0 4px; background: var(--bg-card); }
.pc-hits-load { font-size: 12px; display: flex; gap: 8px; align-items: center; }

/* ── 练习中心 M3（task 10-15-practice-center 记录 Tab + 内联作答区 + 得分卡，v9 原型
   records/answer-zone/scorecard 对齐）──────────────────────────────────────────
   零裸色值红线：全部走 var(--*) 令牌（practice-m2-fe S5.2 / m3-fe S3 扫描面含本段）。
   复用不重定义：.card/.empty/.notice(.amber)/.tag 五色/.btn(.sm/.gray)/.spin/.mono/
   .row/.sp/.modal-mask/.modal/.pc-gen-head（M2）。
   解答 textarea 书写行线（D16/AC11）：repeating-linear-gradient + background-attachment:local
   （行线随内容滚动）+ min-height 220px + resize:vertical。 */
.pc-rec-list { display: flex; flex-direction: column; gap: 6px; }
.pc-rec-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 8px 10px; background: var(--bg-card); font-size: 13px; }
.pc-rec-row.active { border-color: var(--blue-500); box-shadow: 0 0 0 2px var(--blue-50); } /* 蓝框高亮当前展开批（design §5.2） */
.pc-badge-cp, .pc-badge-rv, .pc-badge-op, .pc-badge-mb { flex: 0 0 auto; font-size: 11px; font-weight: 700; border-radius: 5px; padding: 2px 7px; letter-spacing: 0.02em; }
.pc-badge-cp { background: var(--blue-50); color: var(--blue-600); }
.pc-badge-rv { background: var(--amber-bg); color: var(--amber); }
.pc-badge-op { background: var(--green-bg); color: var(--green); } /* M8b 原卷直搜批（短码 OP-）——绿系沿 .tag.green 令牌 */
.pc-badge-mb { background: var(--purple-bg); color: var(--purple); } /* M8 错题练习批（短码 MB-）——紫系沿错题本模型紫令牌（亮/暗成对，M7 令牌区） */
.pc-rec-title { font-weight: 600; }
.pc-rec-err { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pc-rec-time { flex: 0 0 auto; font-size: 12px; }
/* 4.11.4（R13/AC21）记录行后 PDF 盒：内容复用 .notice/.pc-pdfbox/.pc-nr 全局口径（零裸色），
   包装层只收列表 gap 语境下的上边距 */
.pc-rec-pdfbox { font-size: 13px; }
.pc-rec-pdfbox > .pc-pdfbox, .pc-rec-pdfbox > .pc-nr { margin-top: 0; }
.pc-ans-zone { border: 1px solid var(--blue-400); border-radius: var(--r-md); background: var(--bg-card); margin-top: 14px; padding: 14px 16px; }
.pc-az-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pc-az-title { font-size: 15px; }
.pc-az-code { font-size: 12px; color: var(--tx-2); background: var(--bg-hover); border-radius: 5px; padding: 2px 7px; }
.pc-az-save { font-size: 12px; color: var(--green); }
.pc-az-body { margin-top: 10px; }
.pc-az-sum { margin-bottom: 12px; line-height: 1.7; }
.pc-qsec { margin-top: 14px; }
.pc-qsec-t { font-size: 13.5px; font-weight: 700; color: var(--tx); border-bottom: 1px solid var(--bd); padding-bottom: 6px; margin-bottom: 10px; }
.pc-qsec-n { font-weight: 400; color: var(--tx-3); font-size: 12px; margin-left: 6px; }
.pc-aq { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px 12px; margin-bottom: 10px; background: var(--bg); position: relative; }
.pc-aq-head { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 13px; margin-bottom: 6px; }
.pc-aq-no { font-weight: 700; }
/* 4.12.4 R25：题头三信息组（难度系数+完整来源，.tag gray 既有令牌复用；分值 tag 恒显不入组）
   ——容器 .pc-aq-meta 整组切换显隐（作答区头部 #pcAzMetaToggle，localStorage
   qlan:practice:hideMeta 持久；隐藏 = display:none 不摘节点，data-pc-meta 懒查回填锚点
   不变）；来源全称长文省略号收口（title 悬停全名） */
.pc-aq-meta { display: inline-flex; align-items: center; gap: 6px; min-width: 0; }
.pc-aq-src { max-width: 340px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pc-meta-hidden .pc-aq-meta { display: none; }
.pc-aq-stem { font-size: 13.5px; line-height: 1.8; word-break: break-word; }
/* 4.11.2（R12/AC20）题面 = rich.js 正式链：回落配图直接产 .rich-fig（:580 全局口径，尺寸
   基准已对齐），原自绘配图类随纯 esc 通道删除。懒查命中的题库 stem_html 保留 <img width/
   height> 原排版尺寸（用户反馈③「显示原始图片大小」）——此处仅 max-width 防窄屏溢出等比收口 */
.pc-aq-stem img { max-width: 100%; height: auto; }
/* 2026-10-20 CP 图过大修复伴生规则：.rich-fig（:584，0-1-0）的尺寸上限被上面 .pc-aq-stem img
   （0-1-1）的 max-width:100% 覆盖（该规则按用户反馈③保题库 stem_html 原排版，不动）→ 作答区
   容器内以更高特异度（0-2-1）对回落配图重申上限；得分卡错题回显同容器同规则覆盖 */
.pc-aq-stem img.rich-fig { max-width: min(100%, 480px); max-height: 320px; }
.pc-opts { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 8px; }
.pc-opts label { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; margin: 0; font-size: 13.5px; }
/* 4.12 R14①：懒查单选选项块（pcOptionsHtml 产物，落 .pc-aq-stem 容器内——img 尺寸收口
   沿用 .pc-aq-stem img 既有规则；字母键加粗、基础形态纵排 = 与选项富内容（公式/图）兼容） */
.pc-stem-opts { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
/* 2026-10-20 选项自适应排版（用户拍板：按选项内容净长在 1×4 / 2×2 / 4×1 三档择一，节约
   排版空间；判定函数 practice.js pcOptLayoutOf 与服务端 paper-pdf.ts optionLayoutOf 同源
   孪生，阈值改必须两端同步）：ol-r4 四列单行（净长 max ≤8）/ ol-g22 2×2（≤24）/ 其余
   ol-c4 竖排（长文本选项、非 4 选项 = 默认形态零回归）。minmax(0,1fr) 防长内容撑爆格；
   .pc-sopt 为格内 flex 行，长值自然换行。PDF 侧同构规则在 paper-pdf.ts .cp-opts */
.pc-stem-opts.ol-r4 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px 12px; }
.pc-stem-opts.ol-g22 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 12px; }
.pc-stem-opts.ol-c4 { display: flex; flex-direction: column; gap: 4px; }
.pc-sopt { display: flex; gap: 6px; align-items: baseline; }
.pc-sopt-k { font-weight: 700; flex: 0 0 auto; }
.pc-draft-saved { position: absolute; right: 10px; top: 10px; font-size: 11.5px; color: var(--green); opacity: 0; transition: opacity 0.3s; pointer-events: none; }
.pc-draft-saved.show { opacity: 1; }
.pc-judged { margin-top: 8px; border-top: 1px dashed var(--bd); padding-top: 8px; font-size: 13px; }
.pc-myans, .pc-expl { margin-top: 6px; line-height: 1.7; word-break: break-word; }
.pc-expl { color: var(--tx-2); }
.pc-ans-free { min-height: 220px; resize: vertical; line-height: 32px; background-image: repeating-linear-gradient(transparent 0 31px, var(--bd) 31px 32px); background-attachment: local; } /* D16/AC11：≥220px + 书写行线 + 可纵向拉伸 */
.pc-submit-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 14px; border-top: 1px solid var(--bd); padding-top: 12px; }
.pc-scorecard { border: 1px solid var(--green); background: var(--green-bg); border-radius: var(--r-md); padding: 14px 16px; margin: 10px 0 14px; }
.pc-sc-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.pc-sc-big { font-size: 26px; font-weight: 800; color: var(--green); }
.pc-sc-rows { font-size: 12.5px; color: var(--tx-2); margin-top: 6px; line-height: 1.9; }
.pc-sc-wrong { margin-top: 6px; font-size: 12.5px; }
.pc-sc-wrong > summary { cursor: pointer; color: var(--blue-600); }
.pc-sc-wrongitem { border-top: 1px dashed var(--bd); padding: 6px 0; }
.pc-sc-wrongitem > summary { cursor: pointer; color: var(--tx-2); }
.pc-sc-wrongbody { padding: 6px 2px; }
.pc-sc-mastery { margin-top: 8px; font-size: 12px; }
.pc-um-text { font-size: 13.5px; line-height: 1.7; color: var(--tx-2); margin: 0; }
.pc-um-ops { margin-top: 16px; }

/* 4.10 记录 Tab 增强（过滤条 + 分页条 + 截断注记）：纯布局/间距类，零裸色——交互件全部
   复用 .chips/.chip(.on)/.ctl/.dim 既有令牌类（mistakes.js pagerHtml/mk-filterbar 同款范式）；
   过滤条内 .chips 去全局下边距（布局归行容器 gap 管）；分页条居中（justify-content 覆盖）。
   R38④（2026-10-19 沙箱验收反馈，取代 2026-10-17 同行形态）：fbar 改纵向两行——
   「练习类型」行 /「生成时间」行各占一行（.pc-rec-frow 行容器 + .pc-rec-flabel 标签），
   行内窄屏自然换行不破坏行分隔。 */
.pc-rec-fbar { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; margin-bottom: 10px; }
.pc-rec-frow { display: flex; flex-wrap: wrap; gap: 6px 12px; align-items: center; }
.pc-rec-flabel { font-size: 12px; flex: 0 0 auto; }
.pc-rec-fbar .chips { margin: 0; flex: 0 1 auto; } /* chips 不撑满独占整行（布局归 frow 管） */
.pc-rec-fsel { display: flex; gap: 8px; flex: 0 0 auto; } /* 年/月同行容器（整体不拆行，窄屏随 frow wrap 整体换行） */
.pc-rec-fbar select.ctl { flex: 0 0 auto; padding: 4px 8px; font-size: 12.5px; max-width: 110px; } /* 下拉框限宽（验收反馈：不要太长） */
.pc-rec-pager { justify-content: center; margin-top: 12px; }
.pc-rec-pginfo { align-self: center; font-size: 12px; }
.pc-rec-trunc { font-size: 12px; text-align: center; margin-top: 8px; }

/* ── 练习中心 M4（task 10-15-practice-center 掌握度看板，v9 原型 pane-board 对齐）──────
   零裸色值红线：全部走 var(--*) 令牌——m3-fe S3.1（自「练习中心 M3」）/ m2-fe S5.2
   （自 .pc-pend-foot）两套在役扫描均切至文件尾含本段（原第三套 cp-e S9.2 已随 paper.js
   整页退役删除；m4-fe S4.1 另独立扫本段），hex/rgb/rgba 字面量
   零容忍（含注释）；v9 原型 L3 金黄/L0 灰四处裸色已令牌化为 --gold/--gold-bg/--gold-tx/
   --lv0-dot（定义在 :root + dark 双主题区，位于全部扫描起点之前）。
   复用不重定义：.card/.empty/.dim/.pc-gen-head（M2）/.pc-nm（M2 flex:1）。
   类名全带 pc- 前缀（红线）：裸 .dist 已被 mistakes.js 占用；原型 .lv/.kprow/.lvtag/
   .meter/.focus3/.lv-defs/.ld-row/.dot/.gt 一律改名防全局冲突。.pc-lv{n} 等级色类由
   分布格与 kp 清单徽标共用（v9 lvtag 内联五色 = 分布格色板同构）；.pc-mf{n} = meter
   实心填充色。原型 .lv-defs b 用 var(--tx-1)——该令牌全站未定义（原型自身悬空引用），
   以 var(--tx) 代入。 */
.pc-dist { display: flex; gap: 4px; margin: 10px 0 14px; }
.pc-dist .pc-lv { flex: 1; text-align: center; border-radius: 6px; padding: 6px 2px; font-size: 11px; cursor: pointer; user-select: none; transition: outline-color 0.15s; }
.pc-dist .pc-lv b { display: block; font-size: 15px; }
.pc-dist .pc-lv .pc-ld { display: block; font-style: normal; font-size: 10px; font-weight: 400; opacity: 0.75; margin-top: 2px; line-height: 1.3; }
.pc-dist .pc-lv:hover { opacity: 0.85; }
.pc-dist .pc-lv.sel { outline: 2px solid var(--blue-500); outline-offset: -2px; } /* AC15 选中描边（v9 同款） */
.pc-lv0 { background: var(--bg-hover); color: var(--tx-3); }
.pc-lv1 { background: var(--red-bg); color: var(--red); }
.pc-lv2 { background: var(--amber-bg); color: var(--amber); }
.pc-lv3 { background: var(--gold-bg); color: var(--gold-tx); }
.pc-lv4 { background: var(--blue-50); color: var(--blue-600); }
.pc-lv5 { background: var(--green-bg); color: var(--green); }
.pc-lv-defs { background: var(--bg-hover); border-radius: 8px; padding: 8px 12px; } /* AC16 六行清单容器（4.7② 起默认收起，外距归 .pc-lv-defs-box） */
/* 4.7②（沙箱验收，prd R7 2026-10-16 修订·用户拍板）：lv-defs 六行默认收起、点击头部行
   展开/收起——六行文案与分布格悬停 title 逐字不变（AC16 只约束文案，呈现形态改折叠） */
.pc-lv-defs-box { margin: -6px 0 12px; }
.pc-lv-defs-head { display: flex; align-items: center; gap: 6px; width: 100%; padding: 4px 2px; background: none; border: none; font-size: 12px; color: var(--tx-3); cursor: pointer; text-align: left; }
.pc-lv-defs-head:hover { color: var(--tx-2); }
.pc-lv-defs-ind { font-size: 10px; }
.pc-ld-row { font-size: 12px; line-height: 1.65; color: var(--tx-2); margin: 5px 0; display: flex; align-items: flex-start; gap: 7px; }
.pc-ld-row b { flex: none; color: var(--tx); font-size: 12px; }
.pc-dot { flex: none; width: 10px; height: 10px; border-radius: 3px; margin-top: 4px; }
.pc-dot-0 { background: var(--lv0-dot); }
.pc-dot-1 { background: var(--red); }
.pc-dot-2 { background: var(--amber); }
.pc-dot-3 { background: var(--gold); }
.pc-dot-4 { background: var(--blue-500); }
.pc-dot-5 { background: var(--green); }
.pc-lv-tip { font-size: 12px; color: var(--blue-600); margin: -4px 0 8px; } /* 过滤提示行（AC15） */
.pc-focus3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 14px; }
.pc-focus-card { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px 12px; }
.pc-focus-t { font-size: 12px; color: var(--tx-3); margin-bottom: 4px; }
.pc-focus-item { font-size: 12.5px; padding: 2px 0; color: var(--tx-2); }
.pc-focus-item b { color: var(--tx); }
.pc-kp-group { margin-bottom: 10px; }
.pc-kp-gt { font-size: 12.5px; color: var(--tx-3); margin: 8px 0 4px; font-weight: 600; }
.pc-kprow { display: flex; align-items: center; gap: 8px; padding: 6px 4px; border-bottom: 1px solid var(--bd); font-size: 13px; }
.pc-kprow:last-child { border-bottom: none; }
.pc-lvtag { font-size: 11px; border-radius: 5px; padding: 1px 7px; flex: 0 0 auto; }
.pc-meter { width: 80px; height: 5px; background: var(--bg-hover); border-radius: 3px; overflow: hidden; flex: 0 0 auto; }
.pc-meter i { display: block; height: 100%; }
.pc-mf0 { background: var(--lv0-dot); }
.pc-mf1 { background: var(--red); }
.pc-mf2 { background: var(--amber); }
.pc-mf3 { background: var(--gold); }
.pc-mf4 { background: var(--blue-500); }
.pc-mf5 { background: var(--green); }
@media (max-width: 760px) { .pc-focus3 { grid-template-columns: 1fr; } } /* 移动端三卡收单列（对齐全站 760px 断点惯例——既有 16 处同值；v9 原型 720 为 mock 孤立值不沿用，主会话 2026-10-16 裁定） */

/* ---------- M7 错题本重建（task 10-19-mistake-book-rebuild）：八维筛选面板 / 聚合卡增补 / 统计六项卡 ----------
   全部走令牌（零裸色值）；.chip/.tag/.distrow/.stat/.mcard 既有类复用，本段只补新形态。
   v4 原型（research/prototype-v4.html）对照落地：filter-panel 行式布局 / 紫模型药丸 / 金库外
   药丸 / donut 三态环 / rank 榜单 / 裁剪图并排 / 分段答案 / tag-src 真源小标。 */
.tag.purple { background: var(--purple-bg); color: var(--purple); }
.tag.gold { background: var(--gold-bg); color: var(--gold-tx); }
/* 八维筛选面板（mistake-filter.js 挂载；R4 2026-10-22 用户指令：知识点树筛选行退役，其专属样式已同轮删除） */
.mf-panel { background: var(--bg-card); border: 1px solid var(--bd); border-radius: var(--r-md); padding: 10px 14px; margin-bottom: 12px; }
.mf-row { display: flex; gap: 10px; align-items: flex-start; padding: 5px 0; }
.mf-label { flex: 0 0 84px; font-size: 12px; color: var(--tx-3); padding-top: 6px; text-align: right; }
.mf-body { flex: 1; min-width: 0; }
.mf-body .chips { margin: 0; }
.mf-foot { display: flex; align-items: center; gap: 10px; margin-top: 6px; padding-top: 8px; border-top: 1px solid var(--bd); }
/* count bar */
.mk-countbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; font-size: 13px; }
.mk-countbar b { font-variant-numeric: tabular-nums; }
/* 统计卡内部形态 */
.stat .stat-t { display: block; font-size: 12.5px; font-weight: 700; color: var(--tx); margin-bottom: 8px; }
.stat .stat-note { font-size: 11px; color: var(--tx-3); margin: 8px 0 0; line-height: 1.5; }
.stat .dist { display: flex; flex-direction: column; gap: 6px; }
.dbar i.purple { background: var(--purple); }
.dbar i.blue { background: var(--blue-500); }
.rank-list { max-height: 224px; overflow: auto; }
.rank-item { display: flex; align-items: baseline; gap: 6px; font-size: 12.5px; padding: 3px 0; color: var(--tx-2); }
.rank-item .mono { flex: none; color: var(--tx-3); }
.rank-item .rt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rank-item .rn { flex: none; color: var(--tx-3); font-variant-numeric: tabular-nums; }
.rank-item .tag { flex: none; }
/* R2：重复错题排行可点击定位（复用 dnLocate 深链机制）——全令牌零裸色 */
.rank-item.rank-link { cursor: pointer; border-radius: var(--r-1, 4px); }
.rank-item.rank-link:hover .rt { text-decoration: underline; }
/* 掌握状态 donut（三态环，v4 原型 r=15.9 周长≈100 → dasharray 百分比直填） */
.state-flex { display: flex; gap: 16px; align-items: center; }
.donut-wrap { position: relative; width: 96px; height: 96px; flex: none; }
.donut-wrap svg { width: 100%; height: 100%; display: block; }
.donut-seg.s-todo { stroke: var(--red); }
.donut-seg.s-mas { stroke: var(--amber); }
.donut-seg.s-con { stroke: var(--green); }
.donut-c { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.donut-c b { font-size: 18px; }
.donut-c span { font-size: 10.5px; color: var(--tx-3); }
.state-legend { display: flex; flex-direction: column; gap: 5px; font-size: 12px; color: var(--tx-2); }
.state-legend b { color: var(--tx); font-variant-numeric: tabular-nums; }
.state-legend i.dot { display: inline-block; width: 9px; height: 9px; border-radius: 3px; margin-right: 6px; }
.state-legend i.dot.s-todo { background: var(--red); }
.state-legend i.dot.s-mas { background: var(--amber); }
.state-legend i.dot.s-con { background: var(--green); }
/* 聚合卡增补：序号 / 裁剪图 / 分段答案 / 真源小标 / 我的作答・易错点盒 / 状态脚注 / 展开提示 */
.mk-num { color: var(--tx-3); margin-right: 6px; font-size: 12px; }
.mk-qt { font-size: 11.5px; }
/* 选项行（M7 check Issue A）：题干行下随卡展示，.pc-sopt 同构（标签粗体定宽、长值/img 自然换行） */
.mk-opts { margin: 6px 0 2px; }
.mk-opt { display: flex; gap: 6px; align-items: baseline; margin: 3px 0; font-size: 12.5px; color: var(--tx-2); }
.mk-opt-k { font-weight: 700; flex: 0 0 auto; color: var(--tx); }
.mk-opt img { max-width: 100%; }
.crop-row { display: flex; gap: 10px; flex-wrap: wrap; margin: 10px 0 4px; }
.crop-box { border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg); padding: 4px; max-width: 340px; }
.crop-img { display: block; max-width: 100%; border-radius: 4px; }
.crop-note { font-size: 11.5px; margin: 2px 0 6px; }
.mk-myans { background: var(--red-bg); border-left: 3px solid var(--red); border-radius: 0 var(--r-sm) var(--r-sm) 0; padding: 8px 12px; margin: 10px 0 4px; font-size: 12.5px; color: var(--tx-2); }
.mk-pit { background: var(--amber-bg); border-left: 3px solid var(--amber); border-radius: 0 var(--r-sm) var(--r-sm) 0; padding: 8px 12px; margin-top: 10px; font-size: 12.5px; color: var(--tx-2); }
.mk-ans { margin-top: 10px; font-size: 12.5px; color: var(--tx-2); }
.mk-ans .ans-part { display: flex; gap: 8px; align-items: flex-start; margin: 4px 0; }
.ans-part .no { flex: none; color: var(--blue-600); font-weight: 700; font-variant-numeric: tabular-nums; }
.mk-steps { margin-top: 10px; font-size: 12.5px; color: var(--tx-2); }
.mk-steps ol { margin: 4px 0; padding-left: 22px; }
.mk-steps li { margin: 3px 0; }
.mk-origins-t { margin: 12px 0 0; font-size: 12.5px; }
.tag-src { font-size: 10.5px; color: var(--tx-3); border: 1px solid var(--bd); border-radius: 999px; padding: 0 7px; margin-left: 8px; font-weight: 400; vertical-align: 1px; }
.state-note { font-size: 11.5px; margin: 10px 0 0; }
.mk-xbtn { font-size: 11.5px; cursor: pointer; user-select: none; white-space: nowrap; }
/* 分页条（页码 + 每页容量 chips） */
.mk-pager { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 12px; }
.mk-pager .chips { margin: 0; }
@media (max-width: 760px) {
  .mf-label { flex-basis: 64px; }
  .state-flex { flex-direction: column; align-items: flex-start; }
  .mk-pager { gap: 8px; }
}

/* R1（task 10-19 M9 验收反馈修复轮 2026-10-22）：#6 错题本页三段布局（筛选/分布/列表）+
   统计卡 grid blowout 防护；#1 disp_no 编号 chip；#8.2 深链定位高亮。全部走 var(--*) 令牌
   （暗色态自动翻转），零裸色值。 */
.mk-sec { margin-bottom: 6px; }
.mk-sec-t { font-size: 15px; font-weight: 700; margin: 18px 0 10px; color: var(--tx); }
.mk-sec:first-child .mk-sec-t { margin-top: 4px; }
/* .mk-sec-act 退役删除（R2 2026-10-22：「用当前筛选去生成错题练习」按钮随用户指令移除，死 CSS 不留） */
#mkStats > .stat { min-width: 0; overflow: hidden; } /* 1fr 轨内容撑宽防护：长标签（题干/知识点全文）不外溢，右列三卡免横向滚动可见（R1 #6b） */
.tag.mk-dn { background: var(--blue-50); color: var(--blue-600); font-weight: 700; letter-spacing: .3px; } /* 错题唯一编号 No.M-xxxxxxxx（读时派生，跨端一致） */
.mcard.mk-focus { border-color: var(--blue-500); box-shadow: 0 0 0 3px var(--blue-50); transition: box-shadow .3s; } /* #mistakes?dn= 深链定位高亮（5s 自动消退） */

/* ── 练习中心 M8 错题练习（task 10-19-mistake-book-rebuild practice.js #pcCfMistake
   三步流，原型 = research/prototype-v4.html 第二页 gen-steps/strategy-cards/sim-dims
   对齐；R3 #1 2026-10-22 用户指令：混合配比前端退役 → mix-row 布局规则删除）─────────
   零裸色值红线：全部走 var(--*) 令牌（本段在 m3-fe S3.1「练习中心 M3」→EOF 与 m2-fe
   S5.2 扫描面内）。复用不重定义：.pc-confirm 容器 / .mf-panel（筛选面板本体，M7 段）/
   .tag / .btn / .dim / .chips；[hidden] 全局 !important 兜底（:39）保证 dims 行
   显隐联动不被作者 display 规则压过。 */
.pc-mb-step { border: 1px solid var(--bd); border-radius: var(--r-md); background: var(--bg-card); padding: 10px 12px; margin: 10px 0; }
.pc-mb-stept { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.pc-mb-no { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 50%; background: var(--blue-500); color: var(--bg-card); font-size: 11px; margin-right: 5px; }
.pc-mb-filter .mf-panel { margin-bottom: 8px; }
.pc-mb-solid { display: flex; align-items: flex-start; gap: 6px; font-size: 12.5px; color: var(--tx-2); cursor: pointer; margin-top: 4px; }
.pc-mb-pool { font-size: 12px; margin-top: 6px; }
.pc-mb-strats { display: flex; gap: 8px; flex-wrap: wrap; }
.pc-mb-strat { flex: 1 1 180px; display: flex; flex-direction: column; gap: 4px; text-align: left; border: 1px solid var(--bd); border-radius: var(--r-md); background: var(--bg-card); padding: 10px 12px; cursor: pointer; font: inherit; color: var(--tx); }
.pc-mb-strat:hover { border-color: var(--blue-400); }
.pc-mb-strat.on { border-color: var(--blue-500); background: var(--blue-50); box-shadow: 0 0 0 2px var(--blue-50); }
.pc-mb-strat .dim { font-size: 12px; line-height: 1.5; }
.pc-mb-dims { margin-top: 10px; border: 1px solid var(--bd); border-radius: var(--r-sm); background: var(--bg-card); padding: 8px 10px; font-size: 12.5px; }
.pc-mb-dims label { display: flex; align-items: center; gap: 5px; margin: 3px 0; color: var(--tx-2); cursor: pointer; }
.pc-mb-dimst { font-size: 11.5px; }
.pc-mb-dimhint { font-size: 11px; margin-top: 4px; }
/* .pc-mb-mix 两规则退役删除（R3 #1 2026-10-22：混合配比策略前端退役，滑杆块随卡移除，死 CSS 不留——.mk-sec-act 同款先例） */
.pc-mb-genrow { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.pc-mb-kind { flex: 0 0 auto; }
@media (max-width: 760px) {
  .pc-mb-strats { flex-direction: column; }
}

/* ═════════ M2-b（task 10-23-grading-revamp，D13）：批阅结果页 v14 重构共享区块 ═════════
   视觉语义权威 = v14 原型（grill-grading-revamp-20261021-194757-mockup/v14.html:40-133 逐条搬运）。
   令牌化改写：v14 --orange → var(--amber)；v14 灰色系裸色值两枚 → --tx-3/--tx-2（本区块零裸色，
   M7/M8 段「零裸色值」EOF 切片扫描纪律同款——注释文本亦不得含色值字面量，2026-10-24 实证踩坑）；
   v14 .chip 静态标签（题型/跨页/状态徽标/KP）→ 生产 .tag 家族（不新增 .chip 变体，.chip 保持可点语义）。
   [hidden] 兜底自查（mockup-hidden-fallback 教训）：本区块零新增弹层/遮罩——lightbox/confirmModal
   走既有 .mask 家族；轮次切换用 .round/.active 类非 hidden 属性；全局 [hidden]{display:none!important}
   （本文件第 40 行）已覆盖一切 hidden 用法。 */

/* 总览 6 格数字着色（v14 .v.good/.bad/.blue 同语义，挂生产 .stat b 家族） */
.stat b.good { color: var(--green); }
.stat b.bad { color: var(--red); }
.stat b.blue { color: var(--blue-500); }

/* 通用小字/弱色工具类（v14:40-41 逐字；现全站 markup 零使用处，新增零漂移） */
.tiny { font-size: 12px; color: var(--tx-3); }
.muted { color: var(--tx-2); }

/* 详情导航：题型分组行 + 四态图标（v14:66-75） */
.tabrow { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-bottom: 7px; }
.tabrow:last-child { margin-bottom: 0; }
.tabtype { font-size: 12px; font-weight: 600; color: var(--tx-3); min-width: 56px; }
.tabrow .tab { border-radius: 999px; padding: 4px 11px; display: inline-flex; align-items: center; gap: 5px; }
.ric-no { color: var(--red); font-weight: 800; font-size: 13px; line-height: 1; }
.ric-blank { color: var(--tx-3); font-weight: 800; font-size: 13px; line-height: 1; }
.halfic { height: 14px; width: 14px; vertical-align: -2px; display: inline-block; }
.tab .halfic, .qcard-h .halfic { height: 13px; width: 13px; }
.ftag { font-size: 10px; color: var(--blue-600); border: 1px solid var(--blue-400); border-radius: 999px; padding: 0 5px; margin-left: 1px; background: var(--blue-50); line-height: 1.4; }
.inc { color: var(--amber); font-weight: 800; margin-left: 2px; }

/* 题卡 v14 变体：生产 .qcard 带 14px 内边距 → 修饰类归零由头/体自管；
   基类名 .qcard 保留 = p-corr-wiring el('.qcard') 选择器 / scheduleScrollToCard 兼容 */
.qcard.v14 { padding: 0; overflow: hidden; }
.qcard-h { display: flex; align-items: center; gap: 10px; padding: 11px 14px; flex-wrap: wrap; border-bottom: 1px solid var(--bd); background: var(--bg-hover); }
.qcard-h .grow { flex: 1; }
.qno { font-weight: 700; font-size: 15px; min-width: 52px; }

/* 订正轮次 tab（v14:84-90；.round 切换非遮罩，display 类开关） */
.rounds { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; padding: 8px 14px; background: var(--bg-card); border-bottom: 1px solid var(--bd); }
.rounds .rlab { font-size: 12px; color: var(--tx-3); font-weight: 600; margin-right: 2px; }
.rtab { border: 1px solid var(--bd-2); background: var(--bg-hover); border-radius: 999px; padding: 3px 12px; font-size: 12px; cursor: pointer; color: var(--tx-2); }
.rtab:hover { border-color: var(--blue-400); }
.rtab.on { border-color: var(--blue-500); background: var(--blue-50); color: var(--blue-600); font-weight: 600; }
.round { display: none; }
.round.active { display: block; }

/* 题卡体分区（v14:91-104） */
.qcard-b { padding: 14px 16px; }
.sec { margin-bottom: 12px; }
.sec .lab { font-size: 12px; color: var(--tx-3); margin-bottom: 4px; font-weight: 700; } /* 2026-10-27 问题8：分区标签加粗顶格（600→700） */
.tri3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }
.tri3 .cell { border: 1px solid var(--bd); border-radius: var(--r-sm); padding: 10px; background: var(--bg-card); min-height: 74px; }
.tri3 .cell .lab { font-size: 12px; color: var(--tx-3); margin-bottom: 6px; font-weight: 700; }
.btnrow { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 4px; align-items: center; }
ol.steps { margin: 4px 0; padding-left: 20px; line-height: 1.8; }
/* 小问摘要断行（2026-10-27 问题8）：思路/考察知识点/错因 每项独立成行、标签加粗顶格 */
.tiny.subtiny > div { margin-top: 3px; }
.tiny.subtiny > div:first-child { margin-top: 0; }
.tiny.subtiny b { color: var(--tx-2); }
/* 原件图链接（2026-10-27 二轮问题7：内嵌缩略图占位过大 → 单条文字链接，点击放大 lightbox；
   旧 .ex-thumb 缩略图样式随生成面退役删除） */
.ex-thumb-link { margin-top: 6px; }
.ex-thumb-link a, a.ex-thumb-a { cursor: zoom-in; font-size: 12px; color: var(--blue-600); text-decoration: none; white-space: nowrap; }
.ex-thumb-link a:hover, a.ex-thumb-a:hover { text-decoration: underline; }
@media (max-width: 760px) { .tri3 { grid-template-columns: 1fr; } }

/* 判定四态文字着色（v14:105-107,132；橙/裸灰 → 令牌）+ pend 降级桶（v14 无，随空白同色降级） */
.verdict-ok { color: var(--green); font-weight: 700; }
.verdict-no { color: var(--red); font-weight: 700; }
.verdict-half { color: var(--amber); font-weight: 700; }
.verdict-blank { color: var(--tx-2); font-weight: 700; }
.verdict-pend { color: var(--tx-2); font-weight: 700; }

/* 误判反馈单通道钮（D21①「学生正确」；v14 .btn.fb 琥珀语义；.btn:hover 蓝底需显式覆盖） */
.btn.fb { background: var(--amber-bg); border-color: var(--amber); color: var(--amber); }
.btn.fb:hover { background: var(--amber-bg); color: var(--amber); filter: brightness(0.96); }

/* 原始文件轮次分组（v14:112-114；缩略图沿用生产 .filegrid/.fileitem 家族不重复造） */
.fgroup { margin-bottom: 14px; }
.fgroup:last-child { margin-bottom: 0; }
.fgrouplab { font-size: 12px; font-weight: 600; color: var(--tx-3); margin-bottom: 6px; }

/* 多小问分组（v14 hw5 内联 border-left 类化：对=蓝浅 / 错=红浅 / 中性=边框灰，v14 同值） */
.subsec { border-left: 3px solid var(--bd-2); padding-left: 10px; margin-bottom: 12px; }
.subsec.ok { border-left-color: var(--blue-100); }
.subsec.bad { border-left-color: var(--red-bg); }
.subsec.mute { border-left-color: var(--bd-2); }

/* ═════════ M2-c（task 10-23-grading-revamp）：试卷结果页 v14 重构增量区块 ═════════
   仅两枚新增（judge-box 自助改判区 + scorein 得分输入），其余 v14 类全部复用上方 M2-b
   共享区块（tabrow、qcard.v14、tri3、sec、subsec、verdict 四态、btn.fb、round、rtab…两页同构）。
   视觉语义权威 = v14 原型试卷侧（judge-box/scorein 两段逐字搬运，本已全令牌零裸色值；
   EOF 切片扫描纪律同款——注释文本亦不得含色值字面量）。
   [hidden] 兜底自查（mockup-hidden-fallback 教训）：本区块零新增弹层/遮罩，无 hidden 用法。 */
.judge-box { border: 1px solid var(--bd-2); border-radius: var(--r-sm); padding: 10px 12px; background: var(--bg-hover); margin-top: 10px; font-size: 13px; }
.scorein { width: 68px; padding: 4px 6px; border: 1px solid var(--bd-2); border-radius: var(--r-sm); font-size: 13px; }

/* ═════════ M2-d（task 10-23-grading-revamp）：上传面区块（学科 tab + 常驻提醒 + 暂停确认文件行） ═════════
   v14:55-64 搬运（.subj/.remind/.frow/.fno），全令牌化零裸色值（EOF 切片扫描纪律同款——
   注释文本亦不得含色值字面量）。弹层复用既有 .modal-mask/.modal（confirmModal 范式，无新遮罩）；
   [hidden] 兜底（mockup-hidden-fallback 教训）：tab 容器/提醒块/黄条以 hidden 属性开关，
   本区块 display 均非 !important 级——全局 [hidden] 规则在文件头部单源覆盖。 */
.subj { display: flex; gap: 8px; flex-wrap: wrap; margin: 8px 0 4px; }
.subj button { border: 1px solid var(--bd-2); background: var(--bg-card); border-radius: var(--r-sm); padding: 8px 20px; cursor: pointer; font-size: 14px; color: var(--tx); }
.subj button.on { border-color: var(--blue-500); color: var(--blue-600); background: var(--blue-50); font-weight: 600; }
.remind { border-radius: var(--r-sm); padding: 10px 12px; margin-top: 10px; font-size: 13px; line-height: 1.6; }
.remind.info { background: var(--blue-50); border: 1px solid var(--blue-400); }
.remind.warn { background: var(--amber-bg); border: 1px solid var(--amber); }
/* 暂停确认弹窗文件清单（v14 .frow 虚线行；.fno = 批内文件编号/暂存序号，蓝重） */
.frows { max-height: 40vh; overflow: auto; margin: 10px 0 0; }
.frow { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border: 1px dashed var(--bd-2); border-radius: var(--r-sm); margin-bottom: 6px; background: var(--bg-card); flex-wrap: wrap; font-size: 13px; }
.fno { font-weight: 700; color: var(--blue-600); min-width: 34px; }

/* ═════════ gate3-r3（task 10-23-grading-revamp）：验收三轮五项直修增量区块 ═════════
   ②/D50 题号行 section 栏目分组行头（.tabtype.sec = 栏目标题加重；min-width 清零——长栏目名
   自然占位，不受题型行头 56px 强撑）；④/D52 lightbox 逐题定位（.lbwrap 相对定位容器 +
   .lbbox 高亮框，bbox 像素按 natural 尺寸百分比换算落框）；⑤/D50 小题级导航卡内聚焦
   （.subsec.focus 描边高亮，导航钮点击/深链定位消费）。
   全令牌化零裸色值（EOF 切片扫描纪律同款——注释文本亦不得含色值字面量）。
   [hidden] 兜底自查（mockup-hidden-fallback 教训）：.lbbox 以 hidden 属性开关（退化框/图尺寸
   缺失恒保持隐藏=整页降级 fail-open）——本区块无 display 覆盖更无 !important，全局 [hidden]
   规则在文件头部单源覆盖。 */
.tabtype.sec { color: var(--tx-2); font-weight: 700; min-width: 0; }
.lbwrap { position: relative; display: inline-block; max-width: 100%; line-height: 0; }
.lbwrap img { display: block; max-width: 100%; }
.lbbox { position: absolute; border: 2px solid var(--blue-500); background: var(--blue-50); opacity: 0.55; border-radius: var(--r-sm); pointer-events: none; }
.subsec.focus { outline: 2px solid var(--blue-400); outline-offset: 2px; border-radius: var(--r-sm); }
