/* 学习方法论速查手册 样式
   版式规范见 试卷生成手册.md：mm 单位、手工分页、白底黑线、可打印 */

/* ============================================================
   配色 —— 颜色是语义，不是装饰
   ------------------------------------------------------------
   唯一的判断标准：
       <b>把这个颜色抽掉，读者会少知道什么？</b>
       答不上来，就说明它是装饰，删掉。

   （曾经走过的弯路：用一个「朱色」去替换原本是黑色的核心句左条、
     口诀左条、卡片编号底色。看着像有设计，实际上信息量一点没增加——
     那些地方本来就是全卡最重的，黑色已经足够重。换成朱色纯属涂色。）

   所以颜色只给<b>有对错含义</b>的地方，其余一律黑白灰：

     红 = 错 · 易错 · 会丢分       ✗ 标签 · 小心别错 · 常见错答 · 最常漏的那一步
     绿 = 对 · 得分                ✓ 标签 · 正确答法 · 得分点

   这两个颜色抽掉，孩子就分不出「哪个是对的答法」——所以它们必须在。
   而正文、标题、核心句、口诀、编号一律<b>黑</b>：它们靠字号、字重、位置
   就已经分出了层级，不需要颜色帮忙。<b>页面以黑白为主，颜色只落在对错上。</b>

   灰阶继续做「让次要的退回去」这件事：
   「为什么是这样」故意压到 --ink-3，因为手册第 3 页写着那栏可以先跳过。
   ============================================================ */
:root {
  /* —— 语义色：只用在有对错含义的地方 —— */
  --red:      #C62828;   /* 错 · 易错 · 丢分 */
  --red-line: #E9A8A4;
  --red-wash: #FDF0EE;
  --green:    #2E7D32;   /* 对 · 得分 */
  --green-line:#A8CDAA;
  --green-wash:#EFF6EF;
  /* —— 黑白灰：页面主体 —— */
  --ink:      #111;      /* 正文 */
  --ink-2:    #3A3A38;   /* 次要文字 */
  --ink-3:    #6E6E6A;   /* 更次要：可跳过的内容 */
  --rule:     #C9C9C4;   /* 细线 */
  --wash:     #F5F5F2;   /* 最浅底 */
  --wash-2:   #E9E9E4;   /* 次浅底 */
}

/* ============================================================
   打印版 vs 网页版
   ------------------------------------------------------------
   同一份 HTML 要出两种东西：屏幕上看，和彩打出来贴在书桌前。
   两者的物理特性不一样，所以<b>语义不变、取值要变</b>：

     · 纸上没有背光，浅灰会比屏幕上更淡。屏幕上刚好的 --ink-3（110/255）
       印出来会发虚 → 打印时加深到 90。同理细线加深。
     · 喷墨的浅色底容易偏色发脏，大面积淡底尤其明显
       → 打印时把 wash 系整体提亮，让它接近纯白，只留一点点区分。
     · 红绿在纸上（CMYK）会比屏幕（RGB）暗一档、灰一档
       → 打印时把红绿各提亮提饱和一点，印出来才接近屏幕观感。
     · 屏幕不吃墨，可以用稍重的底色做分区；纸吃墨，就靠线条。

   ⚠️ 只调颜色取值，<b>不改语义</b>：红永远是错、绿永远是对。
   ============================================================ */
@media print {
  :root {
    --red:      #D32F2F;   /* 提亮，抵消 CMYK 转换后的压暗 */
    --red-line: #E5A5A2;
    --red-wash: #FDF4F3;   /* 更接近白，避免喷墨大面积浅红发脏 */
    --green:    #388E3C;
    --green-line:#A9CFAB;
    --green-wash:#F3F9F3;
    --ink-3:    #5A5A56;   /* 纸上没有背光，浅灰要加深才不发虚 */
    --rule:     #B4B4AE;   /* 细线加深，否则印出来可能断断续续 */
    --wash:     #F8F8F6;
    --wash-2:   #EFEFEA;
  }
  /* 预览页外壳的阴影和灰底不打印 */
  body { background:#fff !important; padding:0 !important; }
}

/* ⚠️ 这里<b>没有</b> @page，是故意的。
   纸张、边距、以及打印时的 @page{margin:0}（用来把 Chrome 自己的日期/URL/页码挤掉）
   全部由 doc-page.js 注入。自己再写一条会和它打架。见 线上与打印实现.md §1。 */
* { margin:0; padding:0; box-sizing:border-box; }
html, body { background:#fff; }
body {
  font-family:"Songti SC","STSong","SimSun",serif;
  font-size:9.4pt; color:#000; line-height:1.6;
  -webkit-print-color-adjust:exact; print-color-adjust:exact;
}
/* ============================================================
   纸张骨架
   ------------------------------------------------------------
   ⚠️ 不要在这里写 @page，也不要用 position:fixed 做页眉 ——
      纸张外壳交给 doc-page.js（见 线上与打印实现.md §1）。
      fixed 元素会盖在每一页上，@page 手写会和 doc-page 打架。
   双面装订的左右不等边距由生成器注入 @page :left/:right。
   ============================================================ */

/* 页眉：篇名 + 拇指索引十格。合上书从侧面看黑格位置就知道是第几篇 */
.phead { display:flex; justify-content:space-between; align-items:center;
  border-bottom:0.6mm solid #000; padding-bottom:1.2mm; }
.phead .pt { font-family:"Heiti SC","STHeiti","SimHei",sans-serif; font-size:11pt; font-weight:bold; }
.thumb { display:flex; gap:0.9mm; }
.thumb i { width:2.6mm; height:2.6mm; border:0.25mm solid var(--ink-3); display:block; }
.thumb i.on { background:#111; border-color:#111; }
.pfoot { border-top:0.2mm solid var(--rule); padding-top:0.8mm;
  display:flex; justify-content:space-between; font-size:7.8pt; color:var(--ink-3); }

/* ============================================================
   卡片 —— 四拍固定结构（版式规范_v4.md §1）
     卡头 / 触发条 / ①一句话 ②怎么做 ③看个例子 ④小心别错 / 尾注 / 掌握条
   顺序不许调换：孩子的四个使用场景各自从固定位置切入。
   高度：优先<b>整张放进一页</b>；真的放不下时由 paginate.js 按四拍边界切开，
   每一段重复卡头并标「（续）」。<b>丢内容比拆卡严重得多</b>——
   第八篇那张巨表卡就曾被 overflow:hidden 整段裁掉。
   ============================================================ */
.card { border:0.3mm solid #111; background:#fff; margin-bottom:5mm;
  page-break-inside:avoid; break-inside:avoid; }
/* 校内 = 细左条；校外 = 粗左条。不要再用颜色重复表达同一件事 */
.card.in  { border-left:0.5mm solid #111; }
.card.out { border-left:1.6mm solid #111; }

/* —— 卡头 —— */
.card > .ct { display:flex; align-items:stretch; border-bottom:0.3mm solid #111; }
.ct .cn { width:14mm; flex:none; background:#111; color:#fff;
  display:flex; flex-direction:column; align-items:center; justify-content:center; padding:2mm 0; }
.ct .cn .no { font:bold 16pt/1 "Heiti SC","STHeiti",sans-serif; }
.ct .cn .sub { font-size:7pt; letter-spacing:1.5px; margin-top:1.2mm;
  font-family:"Heiti SC",sans-serif; }
.ct .hd { flex:1; min-width:0; padding:2.2mm 3mm; background:var(--wash-2); }
.ct .hd h2 { font-family:"Heiti SC","STHeiti","SimHei",sans-serif;
  font-size:14pt; line-height:1.32; font-weight:bold; margin:0; }
.ct .meta { display:flex; gap:3mm; flex-wrap:wrap; align-items:center; margin-top:1.6mm;
  font-family:"Heiti SC",sans-serif; font-size:8pt; color:var(--ink-2); }
.ct .meta .u { border:0.25mm solid var(--ink-3); padding:0.4mm 1.6mm; }
.ct .meta .lv { letter-spacing:1px; }
.ct .meta .tip { color:var(--ink-3); }

/* —— 四拍与触发条共用的「左栏 + 右内容」骨架 —— */
.sec { display:flex; align-items:stretch; border-top:0.25mm solid var(--rule); }
.sec:first-of-type { border-top:0; }
.sec > .lb { width:21mm; flex:none; padding:1.7mm 2.2mm 1.7mm 0; text-align:right;
  border-right:0.25mm solid var(--rule);
  font-family:"Heiti SC","STHeiti","SimHei",sans-serif; font-size:9.6pt;
  font-weight:bold; line-height:1.3; color:var(--ink); }
.sec > .lb .n { display:inline-flex; width:5.2mm; height:5.2mm; border-radius:50%;
  background:#111; color:#fff; font:bold 8pt "Heiti SC",sans-serif;
  align-items:center; justify-content:center; margin-bottom:1.2mm; }
.sec > .lb .t { display:block; }
.sec > .bd { flex:1; min-width:0; padding:1.7mm 3mm; }
.sec > .bd > table { margin-top:0; }
.sec > .bd > :first-child { margin-top:0; }

/* 触发条：从作业里的题干反查卡片 */
.trig { background:var(--wash); border-bottom:0.25mm solid var(--rule); }
.trig > .lb { font-weight:normal; font-size:8.6pt; color:var(--ink-3); }
.trig > .bd { font-size:9.8pt; line-height:1.75; }

/* ① 一句话说清 —— 全卡最重的一行 */
.beat1 > .bd { font-family:"Heiti SC","STHeiti",sans-serif;
  font-size:13pt; line-height:1.6; font-weight:bold; color:var(--ink); }
/* ② 怎么做 */
.beat2 > .bd { font-size:9.8pt; line-height:1.8; }
/* ③ 看个例子 */
.beat3 > .bd { font-size:9.6pt; line-height:1.8; }
/* ④ 小心别错 —— 红＝会丢分 */
.beat4 > .lb { color:var(--red); border-right-color:var(--red-line); }
.beat4 > .lb .n { background:var(--red); }
.beat4 > .bd { font-size:9.6pt; line-height:1.8; background:var(--red-wash); }
/* 并列项：一条一行。
   ⚠️ 这里<b>不能</b>再写 `b:first-child{display:block}` 这类靠位置猜语义的规则——
      它在「句中加粗」的卡片上会把普通的加粗词拽成独立一行。
      哪里是一条，由 card_render.js 的 并列项() 决定，CSS 只负责排。 */
.li { display:block; margin-top:0.9mm; }
.li:first-child { margin-top:0; }
.item { display:block; margin-top:0.9mm; }   /* 旧别名，等价于 .li */

/* 尾注：为什么 + 它连着谁。整块压灰，明写「可以先跳过」 */
.tail { background:var(--wash); }
.tail > .lb { font-weight:normal; color:var(--ink-3); font-size:8.8pt; }
.tail > .bd { font-size:9.2pt; line-height:1.8; color:var(--ink-3); }
.tail .h { font-family:"Heiti SC",sans-serif; font-weight:bold; color:var(--ink-2);
  display:block; margin-top:1.4mm; }
.tail .h:first-child { margin-top:0; }

/* 掌握条：屏幕上可点，纸上手写 */
.done { display:flex; align-items:center; gap:3mm; flex-wrap:wrap;
  border-top:0.25mm solid var(--rule); padding:1.8mm 3mm; font-size:9.2pt; }
.done .bx { width:3.8mm; height:3.8mm; border:0.3mm solid #111; flex:none; display:inline-block; }
.done .dt { margin-left:auto; color:var(--ink-3); white-space:nowrap; }

/* 口诀：只有它用楷体。字体本身就是「这段要背」的信号 */
.kj { border-left:1.1mm solid #111; background:var(--wash);
  padding:1.4mm 2mm 1.4mm 2.4mm; margin:1.4mm 0;
  font-family:"Kaiti SC","STKaiti","KaiTi",serif; font-size:12pt; line-height:1.7; }
.steps { line-height:1.8; }
.steps > div { margin-bottom:1mm; }
.steps > div:last-child { margin-bottom:0; }

/* ============================================================
   ★☆☆ 低年级卡：整体大一档
   翻到大字页就知道这是低年级内容 —— 难度做进版式，不用另设标记
   ============================================================ */
.card.lv1 .ct .hd h2 { font-size:16pt; }
.card.lv1 .beat1 > .bd { font-size:14.2pt; }
.card.lv1 .kj { font-size:13pt; }
.card.lv1 .beat2 > .bd,
.card.lv1 .beat3 > .bd,
.card.lv1 .beat4 > .bd { font-size:10.6pt; }
.card.lv1 .sec > .lb { font-size:10.4pt; }
.card.lv1 .t { font-size:9.8pt; }
.card.lv1 .sec > .bd { padding:1.8mm 3mm; }

/* 拼音注解（注音规范.md）。加了 ruby 的卡行高要放大，高度预算另算 */
ruby { ruby-position:over; -webkit-ruby-position:before; }
rt { font-family:"Times New Roman",serif; font-size:7pt; line-height:1;
  color:var(--ink-2); font-weight:normal; }
.card.zhuyin .beat1 > .bd,
.card.zhuyin .beat2 > .bd,
.card.zhuyin .beat3 > .bd,
.card.zhuyin .beat4 > .bd { line-height:calc(1.8em + 0.62em); }

/* ============================================================
   重点突出：黑白打印也要看得出层级
   原来只有「加粗」一档，正文里到处 <b> 反而谁都不突出。
   现在分三档，从强到弱：
     .key   反白（黑底白字）—— 一张卡片最多用 1—2 次，留给最该记住的那句
     .em    着重号（字下加点）—— 中文传统重点标记，比加粗更醒目且不吵
     <b>    普通加粗 —— 一般强调
   ============================================================ */
/* 强调是「重要」，不是「对错」，所以一律黑 —— 靠反白和着重号的形式取胜，不靠颜色 */
.key { background:#000; color:#fff; padding:0.2mm 1.4mm; border-radius:0.6mm;
  font-family:"Heiti SC","STHeiti","SimHei",sans-serif; font-weight:bold; }
.em { font-weight:bold;
  text-emphasis:dot #000; -webkit-text-emphasis:dot #000;
  text-emphasis-position:under right; -webkit-text-emphasis-position:under right; }

/* 行内语义标记：只用在确实有对错含义的词上 */
.ok { color:var(--green); font-weight:bold; }   /* 对 · 得分 */
.no { color:var(--red);   font-weight:bold; }   /* 错 · 丢分 */

/* ============================================================
   .flow 三步流程条 —— 把「① → ② → ③」这类步骤从文字段落变成看得见的流程
   用途：口诀式的固定答题步骤、固定解题顺序。
   黑白友好：靠边框和底色深浅区分，不靠颜色。
   ============================================================ */
.flow { display:table; width:100%; border-collapse:separate; border-spacing:1.2mm 0; margin:1.8mm 0; }
.flow > .s { display:table-cell; width:33%; vertical-align:top; text-align:center;
  border:0.28mm solid var(--rule); border-top:0.7mm solid #000;
  padding:1.6mm 1.2mm; background:var(--wash); }
.flow > .s .n { display:block; font-size:8pt; color:#fff; background:#000;
  width:4.8mm; height:4.8mm; line-height:4.8mm; border-radius:50%; margin:0 auto 1.1mm; }
.flow > .s .h { display:block; font-family:"Heiti SC","STHeiti",sans-serif;
  font-size:10.2pt; font-weight:bold; line-height:1.45; color:var(--ink); }
.flow > .s .d { display:block; font-size:8.4pt; line-height:1.6; color:var(--ink-2); margin-top:0.9mm; }
/* 得分点 —— 绿＝能拿分，这是颜色在传信息，不是涂色 */
.flow > .s .p { display:block; font-size:8pt; margin-top:0.9mm;
  border-top:0.2mm dotted var(--rule); padding-top:0.7mm;
  color:var(--green); font-weight:bold; }
/* 这一步最常漏 —— 红＝会丢分，整格改成红顶红底做预警 */
.flow > .s.risk { border-top-color:var(--red); background:var(--red-wash); }
.flow > .s.risk .p { color:var(--red); }
.flow > .a { display:table-cell; width:4mm; vertical-align:middle; text-align:center;
  font-size:12pt; font-weight:bold; color:var(--ink-3); }

/* 对错对照：✗ 常见错答 / ✓ 正确答法，两栏并排，比上下堆叠好扫
   ✗ 一行整体压灰后退，✓ 一行保持黑正文 —— 视线自然落到对的那行 */
.vs { display:table; width:100%; border-collapse:collapse; margin:1.5mm 0; font-size:8.8pt; }
.vs > div { display:table-row; }
.vs .lab { display:table-cell; width:11mm; text-align:center; font-weight:bold;
  padding:1.3mm 0.6mm; vertical-align:middle; font-size:13pt; color:#fff; }
.vs .txt { display:table-cell; border:0.25mm solid var(--rule); padding:1.3mm 2mm; line-height:1.75; }
/* ✗ 红＝这是错的　✓ 绿＝这是对的。颜色本身就在说「哪个能抄」 */
.vs .bad  .lab { background:var(--red); }
.vs .bad  .txt { background:var(--red-wash);   border-color:var(--red-line);   color:var(--ink-2); }
.vs .good .lab { background:var(--green); }
.vs .good .txt { background:var(--green-wash); border-color:var(--green-line); color:var(--ink); }
.sec > .bd b { font-family:"Heiti SC","STHeiti","SimHei",sans-serif; }
.fm { font-family:"Times New Roman",serif; font-size:10pt; }

/* ── 分数：上下结构 + 中间横线 ──────────────────────────────
   全年级统一这一种写法，见 版式规范_v4.md §10。生成只走 分数.js，别手写。

   为什么用 inline-block 而不是 inline-flex：
   inline-flex 的 vertical-align 在<b>打印</b>时表现不一致（同一份 HTML，
   屏幕上居中、打印预览里下沉半行）。inline-block + 两个 block 子元素
   是最老实的写法，屏幕和纸上一个样。

   为什么子元素不起类名：靠 .fr > span 定位。少两个类名就少两处和别人撞车
   的机会 —— .fm 已经被「公式字体」占了，.u 被目录和卡头元信息占了。 */
.fr {
  display:inline-block;
  vertical-align:-0.42em;      /* 让横线大致落在文字中线上 */
  text-align:center;
  margin:0 0.16em;
  font-family:"Times New Roman",serif;
  font-size:0.92em;            /* 跟着上下文缩一点，免得把行高撑得太开 */
}
.fr > span { display:block; line-height:1.18; padding:0 0.2em; white-space:nowrap; }
.fr > span + span { border-top:0.3mm solid currentColor; }
/* 带分数：整数紧挨着分数，中间不留空 */
.fr-w { white-space:nowrap; }
.fr-w .fr { margin-left:0.06em; }

@media print {
  /* 纸上线要实、要够黑：0.3mm 在 600dpi 上偶尔会被渲染成灰线。
     颜色跟着 currentColor 走，所以红色区里的分数线也是红的，语义不会漏。 */
  .fr > span + span { border-top-width:0.32mm; }
  /* 分数不许被拆到两行/两页之间 —— 上下断开就成了两个数 */
  .fr { break-inside:avoid; page-break-inside:avoid; }
}

.figwrap { margin:1.4mm 0; text-align:center; }
.figwrap svg { display:inline-block; }

/* 表格 */
.t { width:100%; border-collapse:collapse; font-size:8.8pt; margin-top:0.8mm; }
/* 表格对齐：表头与正文<b>统一左对齐</b>（原来 th 居中、td 左对齐，看起来不齐）。
   需要居中的短列（数字格、占格标签等）由作者显式加 .c；th、td 都认 .c。 */
.t th, .t td { border:0.2mm solid #777; padding:0.75mm 1.5mm; vertical-align:top; text-align:left; }
.t th { background:#f0f0f0; font-family:"Heiti SC",sans-serif; }
.t td.c, .t th.c { text-align:center; }
.t td.hd { font-family:"Heiti SC",sans-serif; background:#fafafa; white-space:nowrap; }
.t td.k { font-family:"Times New Roman",serif; font-size:9.6pt; letter-spacing:0.6px; }

.two { display:flex; gap:3mm; }
.two > * { flex:1; min-width:0; }

/* ---------- 封面 / 说明页 ---------- */
.cv { text-align:center; margin:10mm 0 5mm; }
.cv h1 { font-family:"Heiti SC","STHeiti","SimHei",sans-serif; font-size:25pt; letter-spacing:2px; }
.cv .s1 { font-size:13pt; margin-top:3mm; }
.cv .s2 { font-size:10pt; color:#555; margin-top:2mm; }
.box { border:0.35mm solid #000; padding:2.6mm 3.4mm; margin-bottom:2.6mm; font-size:9.2pt; line-height:1.8; }
.box .bt { font-family:"Heiti SC",sans-serif; font-size:10.5pt; margin-bottom:1.2mm; }
.box b { font-family:"Heiti SC",sans-serif; }

/* 目录 */
.toc { font-size:9pt; line-height:1.75; }
.toc .g { font-family:"Heiti SC",sans-serif; font-size:10pt; margin-top:1.6mm; }
.toc .g:first-child { margin-top:0; }
.toc .d { padding-left:4mm; color:#222; }

/* 标记图例 */
.legend { width:100%; border-collapse:collapse; font-size:9pt; }
.legend td { border:0.2mm solid #777; padding:1.2mm 2mm; vertical-align:middle; }
.legend .sw { width:26mm; text-align:center; }
.legend .demo { display:inline-block; width:20mm; height:5mm; border:0.28mm solid #000; }
.legend .demo.in { border-left:0.5mm solid #000; }
.legend .demo.out { border-left:1.6mm solid #000; }

/* 索引表 */
.idx > .ct { background:#e4e4e4; }
.idxt td { padding:0.6mm 1.5mm; }
.idxt tr td:first-child { font-family:"Heiti SC",sans-serif; font-size:8.4pt; }

@media screen {
  /* 网页版就是一本可以滚动的书：同一套版式、同一套节奏。
     不做展开/折叠、不做点击揭示答案 —— 一旦屏幕和纸上的信息量不同，
     孩子在两个介质之间就要重新学一次怎么读。 */
  body { background:#e9e9e9; }
}

/* ============================================================
   宽度兜底
   ------------------------------------------------------------
   doc-page 打印时把正文放进一张 .frame 表里（用 thead/tfoot 撑页眉页脚）。
   表格会被内容撑开：<b>任何一处过宽的元素，都会把整张表撑宽，于是每一页都右溢</b>——
   连封面也跟着歪。所以这里给所有可能超宽的东西上硬约束。
   ============================================================ */
.figwrap svg, .sec > .bd svg { max-width:100%; height:auto; }
.sec > .bd { overflow-wrap:break-word; }
.t, .flow, .vs { max-width:100%; table-layout:fixed; }
.t td, .t th { overflow-wrap:break-word; }
/* ============================================================
   页 —— 由 paginate.js 在浏览器里装箱后生成
   ------------------------------------------------------------
   doc-page 的「显式分页」模式：直接子元素 .page 就是一页，
   打印时每页正好一张纸，超出会被裁掉（所以装箱必须准，故在运行时量真高度）。
   页边距<b>四边相等</b>：屏幕和纸上都一样，不做左右不等。
   （装订版的内宽外窄见文末「双面装订」段，默认关闭——
     两套边距会让页码在切换时变化，先保证左右一致。）
   ============================================================ */
.page { padding:16mm; display:flex; flex-direction:column; background:#fff; }
/* 正文区：<b>绝不裁剪</b>。
   这里曾经是 overflow:hidden，理由是「万一装箱算多了，宁可裁掉也别压到页脚」。
   那是错的——裁剪等于<b>用丢内容来掩盖算不准</b>，而且丢得无声无息：
   「关键词 → 专题对照表」的后半张表就是这么消失的。
   现在：先靠量真高度 + 拆块/拆卡/降级把「装不下」消灭在源头；
   万一还偏满就<b>让它破格</b>——破格看得见，丢字看不见。 */
.page > .pbody { flex:1; min-height:0; overflow:visible; }
.page > .phead { flex:none; margin-bottom:3.5mm; }
.page > .pfoot { flex:none; margin-top:auto; padding-top:1.2mm; }
.empty { text-align:center; color:var(--ink-3); padding:40mm 0; font-size:11pt; line-height:2; }

/* 封面 */
.cv { text-align:center; margin:22mm 0 8mm; }
.cv h1 { font-family:"Heiti SC","STHeiti","SimHei",sans-serif; font-size:25pt; letter-spacing:2px; }
.cv .s1 { font-size:13pt; margin-top:3mm; }
.cv .s2 { font-size:10pt; color:var(--ink-3); margin-top:2mm; }
.cv .s3 { margin-top:6mm; display:flex; gap:4mm; justify-content:center; }
.cv .s3 span { font-family:"Heiti SC",sans-serif; font-size:11pt;
  border:0.3mm solid #111; padding:1.2mm 5mm; }
.cv .s3 span.on { background:#111; color:#fff; }

/* 学科说明块 */
.box.subj .bt .sub { font-family:"Songti SC",serif; font-weight:normal;
  font-size:9.4pt; color:var(--ink-3); }

/* ============================================================
   目录 —— 页码由 paginate.js 按<b>当前打印范围</b>算出来
   所以整本打、只打四年级、只打四上，页码都是对的。
   ============================================================ */
.tocwrap { margin-bottom:4mm; }
.tochd h2 { font-family:"Heiti SC","STHeiti",sans-serif; font-size:16pt; margin-bottom:2.5mm; }
.tochd p { font-size:9.4pt; line-height:1.8; margin-bottom:1.5mm; }
.tochd .scope { display:inline-block; border:0.3mm solid #111; padding:1mm 3mm; font-size:9.2pt; }
.toct { width:100%; border-collapse:collapse; font-size:9.4pt; margin-bottom:3mm; }
.toct th, .toct td { border-bottom:0.2mm solid var(--rule); padding:1.3mm 2mm; vertical-align:top; }
.toct thead th { border-bottom:0.4mm solid #111; font-family:"Heiti SC",sans-serif;
  font-size:8.6pt; color:var(--ink-2); text-align:left; }
.toct .u { width:34mm; }
.toct .p { width:12mm; text-align:right; font-family:"Times New Roman",serif; font-weight:bold; }
.toct tr.grp td { font-family:"Heiti SC",sans-serif; font-size:10.5pt; font-weight:bold;
  background:var(--wash-2); border-bottom:0.3mm solid #111; padding:1.6mm 2mm; }

/* ============================================================
   屏幕工具条 —— 打印时整条消失
   ⚠️ 与旧规范的改动：原来「筛选只影响屏幕，打印永远整本」。
      现在要按年级/学期分册打印，所以改成<b>筛什么就打印什么</b>。
   ============================================================ */
@media print { [data-screen-only] { display:none !important; } }
.toolbar { position:sticky; top:0; z-index:9; display:flex; align-items:center;
  gap:6px; flex-wrap:wrap; padding:8px 14px; background:#fff;
  border-bottom:1px solid #bbb; font-family:"Heiti SC",sans-serif; font-size:12.5px; }
.toolbar .grp { display:flex; align-items:center; gap:4px; }
.toolbar .grp b { color:#666; font-weight:normal; margin-right:2px; }
.toolbar button { font:inherit; padding:3px 9px; border:1px solid #aaa;
  background:#fff; border-radius:3px; cursor:pointer; }
.toolbar button.on { background:#111; color:#fff; border-color:#111; }
.toolbar button:disabled { opacity:.35; cursor:default; }
.toolbar input { font:inherit; padding:3px 8px; border:1px solid #aaa;
  border-radius:3px; min-width:150px; }
.toolbar .sep { width:1px; height:20px; background:#ccc; margin:0 4px; }
.toolbar .hint { color:#888; font-size:11.5px; margin-left:auto; }
#页码, #张数 { color:#555; font-variant-numeric:tabular-nums; }

/* 测量用的隐藏容器：宽度必须和页内正文一致，否则量出来的高度是错的 */
#尺 { position:absolute; left:-9999px; top:0; width:178mm; visibility:hidden; }

/* 已掌握勾选：屏幕上点一下打勾，纸上是空心方框手写 */
.done .bx.checked { background:#111; position:relative; }
.done .bx.checked::after { content:"✓"; color:#fff; position:absolute;
  left:0; top:-0.6mm; width:100%; text-align:center; font-size:8pt; line-height:3.8mm; }
@media print { .done .bx.checked { background:#fff; } .done .bx.checked::after { color:#111; } }

@media screen {
  body { background:#e9e9e9; }
  body.翻页 .page { margin-bottom:0; }
}

/* ============================================================
   源容器与安全兜底
   ------------------------------------------------------------
   #源 存放所有块的原始副本，paginate.js 从这里取材。<b>必须隐藏</b>，
   否则整本内容会渲染两遍（一遍原始、一遍分页后）。
   ============================================================ */
#源 { display:none; }

/* 分页失败时的降级页：把源块原样摊开，保证内容看得见。
   ⚠️ 不再往正文里插任何红色警告条——诊断只进 console。 */
.page.fallback { height:auto; aspect-ratio:auto; overflow:visible; }

@media screen {
  /* 页与页之间留出间隔，最后一页下面也要留白，否则滚到底时贴着窗口边 */
  doc-page { display:block; padding-bottom:40px; }
  .page { margin:0 auto 8mm; box-shadow:0 1px 8px rgba(0,0,0,.22);
    /* doc-page 对 .page 设了 overflow:hidden（shadow DOM 内），
       装箱偏满时会把内容裁掉——丢字比溢出难看严重得多 */
    overflow:visible !important; }
}

.page > .pfoot { position:relative; z-index:1; background:#fff; }


/* 并列项里的小条（分号并列 / 嵌套数组）：缩进一层，一条一行 */
.li > .sub { display:block; padding-left:2.5mm; margin-top:0.5mm; }
.kj .li { margin-top:0.6mm; }

/* ============================================================
   降级档位 —— 由 paginate.js 在「差一点点放不下」时临时套上
   ------------------------------------------------------------
   档 1「紧1」：<b>只收紧间距，不动字号、不改结构</b>。一张卡约省 8—14mm（≈2 行）。
                这是最便宜的一档：读者几乎无感，却常常刚好够把卡片留在本页。
   档 2「紧2」：并列项从「一条一行」压回接排。省得更多，但扫读变难，所以排在后面。
   都不够才拆卡（拆卡要重复卡头，更贵）。
   <b>宁可挤间距，也不轻易接排；宁可接排，也不轻易拆卡；宁可拆卡，也绝不裁掉。</b>
   ============================================================ */
.card.紧1 > .sec > .bd,
.card.紧1 > .sec > .lb { padding-top:1.05mm; padding-bottom:1.05mm; }
.card.紧1 .li { margin-top:0.35mm; }
.card.紧1 .li > .sub { margin-top:0.2mm; padding-left:2mm; }
.card.紧1 .kj { margin:0.9mm 0; padding-top:1mm; padding-bottom:1mm; }
.card.紧1 .steps > .li { margin-top:0.5mm; }
.card.紧1 > .done { padding-top:1.15mm; padding-bottom:1.15mm; }
.card.紧1 .ct .hd { padding-top:1.6mm; padding-bottom:1.6mm; }
.card.紧1 .ct .meta { margin-top:1.1mm; }
.card.紧1 .figwrap { margin:0.9mm 0; }
.card.紧1 .t td, .card.紧1 .t th { padding:0.55mm 1.5mm; }

.card.紧2 .li { display:inline; margin-top:0; }
.card.紧2 .li + .li::before { content:"　"; }
.card.紧2 .li > .sub { display:inline; padding-left:0; }
.card.紧2 .li > .sub::before { content:"；"; }
.card.紧2 .steps > .li { display:block; }   /* 步骤有先后，再紧也不接排 */

/* 续卡标记：超高的卡片按四拍切开时，每一段都重复卡头并标「（续）」，确保不断档 */
.ct .hd h2 .xu { font-size:9.5pt; font-weight:normal; color:var(--ink-3); margin-left:2mm; }
