/* thezencircle.com 站点样式 · 手机优先 · 无框架
   U11 结构单元：token 名是契约（design/contract.md §2），U15 只改值不改名。
   皮肤值只写在 html[data-skin=…] 块里，不许进 :root；U18：三套版式主题 a=静室 / b=书案（默认）/ c=杂志；本文件只放 a 的值与结构性刻度。
   亮/暗：构建期写 <html data-skin="b" data-theme="light">，亮暗归 U12，版式主题切换/持久化 localStorage("skin") 归 src/reading.js。 */

/* == 字体栈 / 字号阶 / 间距 / 圆角 / 阴影：与皮肤无关的结构性刻度（全站只允许这些取值） == */
:root {
  /* 字体栈（三套中文字体分工，design/reference-spec.md §1） */
  --font-display: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif;
  --font-kai: "LXGW WenKai Screen", "Kaiti SC", STKaiti, KaiTi, serif;
  --font-body: var(--font-kai);
  --font-ui: system-ui, -apple-system, "PingFang SC", "Noto Sans CJK SC", "Source Han Sans SC", "Microsoft YaHei", sans-serif;

  /* 字号阶（px）：14 16 18 20 22 26 30 34 44 60（reference-spec §3） */
  --fs-14: .875rem;
  --fs-16: 1rem;
  --fs-18: 1.125rem;
  --fs-20: 1.25rem;
  --fs-22: 1.375rem;
  --fs-26: 1.625rem;
  --fs-30: 1.875rem;
  --fs-34: 2.125rem;
  --fs-44: 2.75rem;
  --fs-60: 3.75rem;
  --fs-body: 1.0625rem; /* 正文基准 17px ≥16px；U15 皮肤可覆盖 */

  /* 间距刻度（4/8 基，px） */
  --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
  --space-6: 24px; --space-8: 32px; --space-12: 48px; --space-16: 64px; --space-24: 96px;

  /* 圆角 / 阴影（值随皮肤，名字冻结；U31：阴影减淡——苹果风少投影，面板/弹层用毛玻璃 + 1px 边线代替重阴影）
     U40：全站圆角收敛到这三档，不再允许 ad-hoc 值（原 14/6/4/50% 特例已全部归到这三档，见 themes/reading/search/layout 各处 U40 注）。
     三档语义：icon=控件/小元素 8px；card=卡片/弹层 12px；pill=胶囊与圆钮 999px。同一 class 全站只用同一档。 */
  --radius-icon: 8px;
  --radius-card: 12px;
  --radius-pill: 999px;
  --shadow-1: 0 1px 2px rgb(0 0 0 / .05);
  --shadow-2: 0 12px 32px rgb(0 0 0 / .08);
}

/* == A 静室（D1）· 亮（值取自 design/proto2 D1 样张；b 书案 / c 杂志 的值在各自 themes/ 文件头） == */
html[data-skin="a"] {
  --bg: #f6f1e6;
  --bg-elevated: #fffcf5;
  --text: #2b261e;
  --text-secondary: #6d6354;
  --accent: #8c5409;
  --accent-weak: #efe3c6;
  --note: #365f8c;
  --border: #d9ceb8;
  color-scheme: light;
}

/* == A 静室 · 暗 == */
html[data-skin="a"][data-theme="dark"] {
  --bg: #16140f;
  --bg-elevated: #211e18;
  --text: #e7e2d6;
  --text-secondary: #a39a8a;
  --accent: #d99a3d;
  --accent-weak: #2e2616;
  --note: #8ab4e8;
  --border: #3a352b;
  color-scheme: dark;
}

/* == b 书案 / c 杂志（U18）：token 值在 src/styles/themes/b-shuan.css、c-zazhi.css 文件头的 html[data-skin="b"|"c"] 块；token 名不得改（design/contract.md §2） == */
/* base.css · reset / 排版基线（U11；值一律来自 tokens.css 的变量） */

* { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: var(--fs-body);  /* 17px ≥ 16px（reference-spec §3 字号阶） */
  line-height: 1.75;
  overflow-wrap: anywhere;   /* 长串不撑破布局 */
}

/* ---- 无横向滚动的兜底 ---- */
body { overflow-x: hidden; }
main, article { min-width: 0; }

img { max-width: 100%; height: auto; display: block; }
/* U77：video 元数据加载后按固有宽度渲染（如 109chenggong 页 480px mp4），390 视口撑出横向滚动；与 img 同口径约束 */
video { max-width: 100%; height: auto; }

/* ---- 跳转链接（无障碍） ---- */
.skip-link {
  position: absolute;
  left: -9999px;
  /* U50 A5：常态也给 ≥44px 高度（免聚焦态被按未聚焦 rect 量成 68×29.8）；
   聚焦态另有 min-height 46px + padding（见下）。反正在屏外，无视觉影响。 */
  display: flex;
  align-items: center;
  min-height: 44px;
}
.skip-link:focus {
  left: 8px; top: 8px;
  z-index: 100;
  background: var(--bg-elevated);
  color: var(--text);
  padding: 12px 16px;
  border-radius: var(--radius-card);
  /* U29 P8：焦点态也達 44px 触控目标 */
  display: inline-flex;
  align-items: center;
  min-height: 46px;
}

/* ---- 阅读进度条（U11 只给容器；滚动行为归 U12，宽度更新不得加过渡）
   U31：3px 实条 → 2px 细线（苹果风，少装饰）
   U224（Meta 1307 定，用户 10-30 第②条「PC 的进度条太细了」）：4px → 6px
     （桌面可读的最小值；用户若要回 4px 一句话即回滚，记在 reports/用户待决.md） ---- */
#reading-progress {
  position: fixed;
  top: 0; left: 0;
  height: 6px;
  width: 0;
  background: var(--accent);
  z-index: 50;
}

/* U97b：全站锚点平滑滚动（U97 误写进未打包的 main.css，此处补到真正打包的 base.css）
   尊重系统"减少动效"偏好：开启时直接到位，不做动画 */
html {
  scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
}
/* layout.css · 顶栏 / 抽屉导航 / hero / 落地页 / 讲义页骨架 / 面包屑 / 页脚（U11）
   颜色/圆角/阴影/字体一律用 tokens.css 的变量；A 的皮肤级变体写成 html[data-skin="a"] … 形式，不写死进基础样式。 */

/* ---- 顶部导航（sticky；桌面 ≥768 内联四项，两院同组 / 园地独立组） ---- */
.site-header {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  padding: 0 var(--space-3);
  padding-top: env(safe-area-inset-top);
  background: color-mix(in srgb, var(--bg) 88%, transparent);
  -webkit-backdrop-filter: blur(16px); /* U40：全站玻璃强度统一 16px（原 8/16/20 三种）；玻璃只留给有内容从底下滚过的悬浮层 */
  backdrop-filter: blur(16px);
  border-bottom: 1px solid var(--border);
}
.site-name {
  color: var(--text);
  text-decoration: none;
  font-weight: 700;
  font-size: var(--fs-16);
  display: block;
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  line-height: 44px;
  min-height: 44px;
  white-space: nowrap;
}
.site-nav { display: none; align-items: stretch; }
.site-nav a, .site-nav .site-nav-current {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--space-3);
  color: var(--text-secondary);
  text-decoration: none;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  white-space: nowrap;
}
.site-nav a[aria-current="page"], .site-nav .site-nav-current {
  color: var(--accent);
  font-weight: 600;
}
.nav-group { display: inline-flex; align-items: center; }

/* 汉堡按钮（≤767px 显示；A1c 移动端导航入口） */
.nav-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  flex: none;
  border: 1px solid var(--border);
  border-radius: var(--radius-icon);
  background: var(--bg-elevated);
  color: var(--text);
  cursor: pointer;
}
/* U43：汉堡由内联 SVG 改为字符 ☰（与 reading.js P16 入口「☰ 目录 · 设置」同字形）；图标来源收敛见 contract §5-U43 */
.nav-toggle-ico { font-family: var(--font-ui); font-size: 20px; line-height: 1; }

/* ---- 抽屉导航（≤767px；A1c） ---- */
.nav-overlay {
  position: fixed;
  inset: 0;
  z-index: 40;
  background: rgb(0 0 0 / .4);
}
.site-drawer {
  position: fixed;
  top: 0; right: 0; bottom: 0;
  z-index: 60;
  width: min(20rem, 82vw);
  background: var(--bg-elevated);
  border-left: 1px solid var(--border);
  box-shadow: var(--shadow-2);
  transform: translateX(100%);
  transition: transform .2s ease-out;
  padding: var(--space-4);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.site-drawer.open { transform: translateX(0); }
.drawer-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 44px;
}
.drawer-title { font-family: var(--font-kai); font-size: var(--fs-18); color: var(--text); }
.nav-close {
  width: 44px; height: 44px;
  flex: none; /* U50 A7：flex 行内被挤压（a 主题 /jing/、/search/ 实测 39.97×44），钉住 44×44 */
  border: 1px solid var(--border);
  border-radius: var(--radius-icon);
  background: transparent;
  color: var(--text);
  cursor: pointer;
}
.site-drawer a, .site-drawer .site-nav-current {
  display: flex;
  align-items: center;
  min-height: 48px;
  padding: 0 var(--space-3);
  color: var(--text);
  text-decoration: none;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  border-radius: var(--radius-icon);
}
.site-drawer a[aria-current="page"], .site-drawer .site-nav-current {
  color: var(--accent);
  font-weight: 600;
  background: var(--accent-weak);
}
.site-drawer .nav-group { display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1); }
.site-drawer .nav-group--yuan { border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-2); }
.site-drawer .nav-group--yandi { border: 1px dashed var(--border); border-radius: var(--radius-card); padding: var(--space-2); }

@media (min-width: 768px) {
  .site-nav { display: flex; }
  .nav-toggle, .site-drawer, .nav-overlay { display: none; }
}

/* ---- 主体布局 ---- */
main {
  padding: var(--space-3) var(--space-4) var(--space-12);
}
@media (min-width: 768px) {
  main { padding: var(--space-6) var(--space-8) var(--space-16); }
}
@media (min-width: 1100px) {
  main { max-width: 46rem; margin: 0 auto; padding: var(--space-8) var(--space-6) 80px; }
}

/* ---- 面包屑（院 → 大纲 → 课，逐级可点） ---- */
.breadcrumb {
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  color: var(--text-secondary);
  min-width: 0;
  line-height: 1.5;
  margin-bottom: var(--space-2);
}
.breadcrumb a { color: var(--text-secondary); display: inline-flex; align-items: center; justify-content: center; min-height: 46px; min-width: 44px; padding: 0 var(--space-1); }
.breadcrumb [aria-current="location"] { color: var(--text); }

/* U229 ②：目录浮层/落地页目录里的当前课高亮（is-current 由 sheet-nav.mjs 运行时打在浮层内） */
.landing-list a[aria-current="true"].is-current {
  color: var(--accent);
  font-weight: 600;
}
.landing-list .course-no {
  display: block;
  font-family: var(--font-ui);
  font-size: var(--fs-12, 0.75rem);
  color: var(--text-secondary);
}

/* 返回按钮（现仅离线页用） */
.back-link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--space-4);
  border-radius: var(--radius-pill);
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  color: var(--text);
  text-decoration: none;
  font-family: var(--font-ui);
  font-size: var(--fs-14);
}
.back-link:active { background: var(--accent-weak); }

/* ---- hero（学院首页 + 落地页；装饰元素 [data-hero-mark] 由皮肤决定形状） ----
   U34：渐变底退场（U31 同方向：纸面 + 大留白） */
.hero {
  padding: var(--space-12) var(--space-4) var(--space-8);
  text-align: left; /* U43：基线改左对齐（U39 §6.2「首屏一个焦点」；a/b/c 三套皮肤本就覆写为左对齐，基线随骨架收敛） */
  border-bottom: 1px solid var(--border);
  background: none;
}
.hero-title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-34);
  letter-spacing: 1.5px;
  color: var(--accent);
  line-height: 1.3;
  margin: var(--space-4) 0 0;
}
.hero-sub {
  font-family: var(--font-kai);
  font-size: var(--fs-20);
  color: var(--text-secondary);
  margin: var(--space-4) 0 0;
  letter-spacing: .75px;
}
.hero-actions {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  margin-top: var(--space-6);
}
.pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 12px var(--space-8);
  border-radius: var(--radius-pill);
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  text-decoration: none;
}
.pill--solid { background: var(--accent); color: #fff; border: 1px solid var(--accent); }
.pill--outline { background: transparent; color: var(--accent); border: 1px solid var(--accent); }
.textlink {
  color: var(--text-secondary);
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
/* A 经卷的 hero 装饰 = 双细线（B 的「圈相」、C 的工具条由 U15 在 skins.css 里换） */
html[data-skin="a"] .hero-mark {
  width: 64px;
  border-top: 1px solid var(--border);
  box-shadow: 0 3px 0 var(--border);
  margin: 0 auto;
}
@media (min-width: 1024px) {
  .hero { padding: var(--space-24) var(--space-12) var(--space-16); }
  .hero-title { font-size: var(--fs-60); }
  .hero-sub { font-size: var(--fs-22); }
  .hero-actions { flex-direction: row; justify-content: center; gap: var(--space-6); }
}

/* ---- 落地页卡片（大纲 / 分类序列 / 补充入口） ---- */
.card {
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: var(--space-6);
  margin: var(--space-6) 0;
}
.card .eyebrow, .landing-hero .eyebrow {
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  color: var(--text-secondary);
  display: block;
}
.card h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-26);
  letter-spacing: .75px;
  color: var(--text);
  line-height: 1.3;
  margin: var(--space-2) 0 var(--space-2);
}
.card ul { list-style: none; margin: var(--space-4) 0 0; padding: 0; }
.card li { padding: var(--space-2) 0; border-bottom: 1px solid var(--border); }
.card li:last-child { border-bottom: 0; }
.card li a { color: var(--text); text-decoration: none; font-family: var(--font-ui); font-size: var(--fs-16); display: inline-flex; align-items: center; min-height: 44px; }
.card li a:hover { color: var(--accent); }
@media (min-width: 768px) {
  .card ul { columns: 2; column-gap: var(--space-12); }
}

/* ---- 页标题（非首页文档页） ---- */
h1.page-title {
  /* P1-2：楷体优先（换字体栈）——宋体小字号标题里忄旁字竖心旁几乎不可见，读者把「忉利天宫」误读成
     「切利天宫」（桌面 6a 报告）。标题改走正文字体（楷体，已加载，零新增字节），宋体退为缺字兜底。 */
  font-family: var(--font-kai), var(--font-display);
  font-weight: 400;
  font-size: var(--fs-30);
  line-height: 1.3;
  margin: var(--space-3) 0 var(--space-4);
  color: var(--text);
}
@media (min-width: 768px) {
  h1.page-title { font-size: var(--fs-34); }
}

/* ---- 本页目录 TOC（U11 容器 + 基础样式；aria-current 跟随归 U12） ---- */
.toc {
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: var(--space-1) var(--space-4);
  margin: 0 0 var(--space-6);
}
.toc summary {
  display: flex;
  align-items: center;
  min-height: 44px;
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--fs-16);
  cursor: pointer;
  list-style: none;
}
.toc summary::-webkit-details-marker { display: none; }
.toc summary::after { content: "▾"; margin-left: auto; color: var(--text-secondary); }
.toc[open] summary::after { content: "▴"; }
/* U73：目录去序号（ol marker 不再显示）；层级用缩进表达（h3 深一档，章节表并入条目按层级递进） */
.toc ol { list-style: none; margin: var(--space-1) 0 var(--space-3); padding-left: 12px; }
.toc li.toc-l3 { margin-left: 16px; }
.toc li.toc-l4 { margin-left: 32px; }
.toc li.toc-l5 { margin-left: 48px; }
.toc a { color: var(--accent); text-decoration: none; }

/* ---- 正文排版 ---- */
article { text-wrap: pretty; }
article p {
  font-size: var(--fs-body);
  /* U55：段距 1.1em→1.5em、行高 1.75→1.9 —— 楷体正文需要更松的行距与段距（U39 §6.2「段间距拉大，
     这是苹果风的关键一步」；U44 §⑥-1「字号/行高/字重的层次」）。只动呈现，文字零改动。 */
  line-height: 1.9;
  margin: 0 0 1.5em;
  text-wrap: pretty;
}
article a {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-color: color-mix(in srgb, var(--accent) 45%, transparent);
}
/* U92 · 节题锚链去「链接相」（⑥ 避免 AI 味）：h2/h3 里的跳转锚是目录副产物，读者先看到的是章节眉题——
   科技产品味的最大来源就是「标题长得像蓝链接」。继承标题色、无下划线，hover 才示意可点。 */
article h1 a, article h2 a, article h3 a, article h4 a {
  color: inherit;
  text-decoration: none;
}
article h1 a:hover, article h2 a:hover, article h3 a:hover, article h4 a:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}
article h2, article h3, article h4 {
  line-height: 1.3;
  /* U55：节前距 1.6em→2.4em —— 章节起首的留白节奏（U44 §⑥-2「章节起首的留白节奏、分隔方式」），
     让 h2 成为明确的换气点而不是连续文本里的一行粗字。 */
  margin: 2.4em 0 .75em;
}
article h2 { font-size: var(--fs-26); }
article h3 { font-size: var(--fs-22); }
article blockquote {
  margin: 1em 0;
  padding: .25em 1em;
  border-left: 3px solid var(--accent);
  background: var(--bg-elevated);
  border-radius: 0 var(--radius-card) var(--radius-card) 0;
}
article hr { border: 0; border-top: 1px solid var(--border); margin: 2em 0; }
article img { margin: 1em auto; border-radius: var(--radius-icon); }

/* 正文三层容器（U11 只给语义与占位；内容分层归 U12 的 renderReading/injectPage） */
.reading-layers { min-width: 0; }
.layer-note, .layer-plain { color: var(--text-secondary); }
.layer-plain[hidden], .layer-note[hidden] { display: none; }

/* ---- 段级导航 / 阅读工具（U11 只挂容器；显示时机与行为归 U12，默认不显示） ---- */
.segnav, .reading-tools { display: none; }
.seg-pos { font-family: var(--font-ui); font-size: var(--fs-14); color: var(--text-secondary); }
.ctl {
  min-width: 44px;
  min-height: 44px;
  border: 1px solid var(--border);
  border-radius: var(--radius-icon);
  background: var(--bg-elevated);
  color: var(--text);
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
}
/* 术语弹层容器（U12 填充内容与定位） */
.term-layer { display: none; }

/* ---- 表格：外层横滚，内容不撑破页面
     U40：去边框化（U39 §6.1-9「原站带边框表格 = 2005 年观感」）——外层 .table-scroll 框退场（b/a 主题本就归零，这里统一），
     单元格只留行分隔发丝线（原 1px 全网格线去杮）；DOM/文字零改动，只改值。行分隔线比 --border 更淡一档（混入 45% 透明），
     贴「苹果风 = 少框靠留白」；课程表手机卡转置规则自带覆盖，不受影响。 ---- */
.table-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  margin: 1em 0;
  border: 0;
  border-radius: 0;
}
article table {
  border-collapse: collapse;
  min-width: 100%;
}

/* ---- U29 P8：独立链接/导航目标可点高度 ≥44px（取 46px 避开 isMobile+dsf2 亚像素取整）。
     密排链接阵（/xiuxueyd/ 索引阵、手机卡片化课程表里的课名）不做 44×44 方块，只抬条目行高；
     句中行内链接（段内 <p> 里）按 WCAG 2.5.8 行内豁免不动；桌面数据表保持原行高。 ---- */
html[data-section="xiuxueyd"] article td a,
.landing-framed td a,
article td a { display: inline-flex; align-items: center; min-height: 46px; min-width: 44px; justify-content: center; }
/* U47 R8（U44 §2-14）：.landing-framed 在 <article> 外，链接原吃浏览器默认蓝 #0000EE ——
   改「下划线 + hover 上强调色」。U134 ①：基色从 --text 改 --accent，与 article a 同语言 ——
   A2 实测 /jing/ 正文卡链是深色下划线、/chan///xiuxueyd/ 正文链是强调色下划线，同页元素两套。
   正文链接（含包装卡里的正文）统一「--accent + 下划线 + 字号随上下文」一套。 */
.landing-framed a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, var(--accent) 45%, transparent); }
.landing-framed a:hover, .landing-framed a:focus-visible { text-decoration-color: var(--accent); }
/* U47 R8：声明段改 ul/li（build.mjs declTableToList 生成；「·」保留在 li 行首，悬挂对齐） */
.landing-framed .decl { margin: var(--space-6) 0 0; }
.landing-framed .decl-head { margin: 0 0 var(--space-2); }
.landing-framed .decl-list { list-style: none; margin: 0; padding: 0; }
.landing-framed .decl-list li { padding-left: 1em; text-indent: -1em; }
html[data-section="xiuxueyd"] article td p a,
.landing-framed td p a,
article td p a { display: inline; min-height: 0; }
article td, article th {
  padding: var(--space-2) var(--space-3);
  border: 0;
  border-bottom: 1px solid color-mix(in srgb, var(--border) 45%, transparent); /* U40：全网格 1px → 行分隔发丝线 */
  vertical-align: top;
  text-align: left;
  /* U96：竖排根因修——CJK 的 min-content = 1 字宽，auto 表格算法把窄列（如 2 列「书名｜简介」的书名列）
     压到一字一行竖排；keep-all 把最小宽抬到词/标点边界（书名 ≥整串），列不再塔缩；
     overflow-wrap 保底：无标点长串紧急断行，不出横滚。只作用表格单元格，正文段落换行不受影响 */
  word-break: keep-all;
  overflow-wrap: break-word;
}

/* ---- U26 P13：空白占位盒（构建期在 reading.mjs 打 .blank-box）——原站文末空 <pre>/<td> 等去边框去底色，不再显示空框；元素与文字保留 ---- */
article pre.blank-box { border: 0; background: none; padding: 0; overflow: visible; }
article td.blank-box { border: 0; padding: 0; }

/* ---- U25 P12：横滑提示 ----
   内容宽于容器（可横滑）时右缘文字渐隐 + › 箭头；滑到底两者消失。
   纯 CSS：@property 登记的 --swipe-hint 由 scroll(self inline) 滚动时间线驱动——
   不可滑（无溢出）时时间线不激活，--swipe-hint 保持初始值 1（提示全隐）；
   可滑时动画把它压到 0（提示全显），滑到 90% 之后升回 1（提示渐隐到消失）。
   不支持 scroll() 时间线的浏览器：变量恒为初始值 1，提示不出现，回退到 U11 的裸横滚。 */
@property --swipe-hint {
  syntax: "<number>";
  inherits: true;
  initial-value: 1;
}
@keyframes swipe-hint-fade {
  0% { --swipe-hint: 0; }
  90% { --swipe-hint: 0; }
  100% { --swipe-hint: 1; }
}
.table-scroll {
  display: flex;               /* 让 ::after 箭头能作为 flex 项粘在可视右缘 */
  animation: swipe-hint-fade linear both;
  animation-timeline: scroll(self inline);
  /* 右缘 36px 渐隐：mask 颜色只取透明度，随主题无关；--swipe-hint=1 时整段全黑（无渐隐） */
  mask-image: linear-gradient(to right, #000 calc(100% - 36px), rgb(0 0 0 / calc(var(--swipe-hint) * 100%)));
}
/* flex 项不收缩：fit-content = 块级表的收缩适配公式（max(min-content, min(max-content, 可用宽))），
   保证园地索引这类 min-content 1277px 的表不被压到容器宽内、窄表照旧充满容器 */
.table-scroll > table { flex: 0 0 fit-content; }
.table-scroll::after {
  content: '›';
  flex: none;
  position: sticky;            /* 钉在滚动视口右缘，不随内容滚走 */
  inset-inline-end: 40px;      /* 落在渐隐区左侧，保证箭头自身对比度不被 mask 稀释 */
  align-self: center;
  width: 0;                    /* 不占内容宽：非溢出表不因箭头变“可滑” */
  display: flex;
  justify-content: flex-end;   /* 0 宽盒子靠右排 → 字形向左溢出（左溢不计入滚动区，不虚增 sw） */
  font-family: var(--font-ui);
  font-size: var(--fs-26);
  font-weight: 700;
  color: var(--text-secondary);
  opacity: calc(1 - var(--swipe-hint));
  pointer-events: none;
}

/* 回落：课程表同构（8 行且末行 4 格）但某行不足 4 格的（如 002baiyunxy）——
   无法安全转置成卡，改用加宽列 + 横滑提示；严格 8×4 的表由下方卡片规则覆盖（特异性更高） */
@media (max-width: 767px) {
  html[data-section="jing"] .table-scroll:has(> table > tbody > tr:nth-child(8):last-child > td:nth-child(4)) > table,
  html[data-section="chan"] .table-scroll:has(> table > tbody > tr:nth-child(8):last-child > td:nth-child(4)) > table {
    min-width: 640px;
  }
  html[data-section="jing"] .table-scroll:has(> table > tbody > tr:nth-child(8):last-child > td:nth-child(4)) tr:nth-child(-n+2) td,
  html[data-section="chan"] .table-scroll:has(> table > tbody > tr:nth-child(8):last-child > td:nth-child(4)) tr:nth-child(-n+2) td {
    background: var(--accent-weak);
  }
}

/* ---- U25 P3：两院课程表手机可读 ----
   课程表结构固定为 8 行 × 4 列，每列是一个学年：首行=修学主题，第 2 行=学年名，
   中 5 行=课程，末行=每日功课。参考参考站 /all 的“卡片纵列 + 元信息胶囊”做法，
   纯 CSS 转置成单列卡片：display:contents 拆掉行结构，每个 td 作为网格项显式定位，
   让原第 C 列的 8 格竖排成第 C 张卡（主题胶囊 + 学年大字 + 课程链接 + 每日功课）。
   守卫：仅当每行恰好 4 格且无 colspan/rowspan 才生效（/jing/ /chan/ 落地页与两份
   教学大纲的课程表实测严格 8×4；不满足结构的表自动回落到“加宽列 + 横滑”）。 */
@media (max-width: 767px) {
  html[data-section="jing"], html[data-section="chan"] {
    /* 守卫链必须单行：:has 是复合选择器的一部分，换行会被当后代组合器解析 */
    .table-scroll:has(> table > tbody > tr:nth-child(1) > td:nth-child(4):last-child):has(> table > tbody > tr:nth-child(2) > td:nth-child(4):last-child):has(> table > tbody > tr:nth-child(3) > td:nth-child(4):last-child):has(> table > tbody > tr:nth-child(4) > td:nth-child(4):last-child):has(> table > tbody > tr:nth-child(5) > td:nth-child(4):last-child):has(> table > tbody > tr:nth-child(6) > td:nth-child(4):last-child):has(> table > tbody > tr:nth-child(7) > td:nth-child(4):last-child):has(> table > tbody > tr:nth-child(8):last-child > td:nth-child(4):last-child):not(:has([colspan])):not(:has([rowspan])) {
      display: block;
      overflow: visible;           /* 单列卡片不再横滑，P12 提示一并关掉 */
      border: 0;
      animation: none;
      mask-image: none;
      &::after { content: none; }
      & > table {
        display: grid;
        grid-template-columns: 1fr;
        min-width: 0;
        border: 0;
      }
      & tbody, & tr { display: contents; }
      & td {
        display: block;
        background: var(--bg-elevated);
        border: 0;
        border-inline: 1px solid var(--border);
        padding: var(--space-2) var(--space-3);
      }
      /* 首行 = 修学主题 → 元信息胶囊（参考站 /all 的黄底小胶囊做法） */
      & tr:nth-child(1) td {
        justify-self: start;       /* 宽随内容 → 胶囊形 */
        background: var(--accent-weak);
        color: var(--accent);
        border-radius: var(--radius-pill);
        border: 0;
        padding: 2px var(--space-3);
        margin-bottom: var(--space-2);
        font: 600 var(--fs-14)/1.6 var(--font-ui);
      }
      /* 第 2 行 = 学年名 → 卡题（书名楷体大字做法） */
      & tr:nth-child(2) td {
        border-top: 1px solid var(--border);
        /* U47 R4（U44 §2-7）：单边圆角归零——「表格当卡片」的模板做法，圆角刻度归入全站四档 */
        padding-top: var(--space-3);
        font: 700 var(--fs-20)/1.4 var(--font-body);
        color: var(--text);
      }
      /* 课程各行 + 每日功课：卡体内部分隔线 */
      & tr:nth-child(n+3) td { border-top: 1px solid var(--border); }
      /* 末行 = 每日功课：收尾 + 卡间距（U47 R4：单边圆角归零，同上） */
      & tr:nth-child(8) td {
        border-bottom: 1px solid var(--border);
        margin-bottom: var(--space-6);
        color: var(--text-secondary);
      }
      /* 转置：原第 C 列第 R 行 → 网格第 (C-1)*8+R 行（卡片 C 的第 R 格） */
      & tr:nth-child(1) td:nth-child(1) { grid-row: 1; }
      & tr:nth-child(2) td:nth-child(1) { grid-row: 2; }
      & tr:nth-child(3) td:nth-child(1) { grid-row: 3; }
      & tr:nth-child(4) td:nth-child(1) { grid-row: 4; }
      & tr:nth-child(5) td:nth-child(1) { grid-row: 5; }
      & tr:nth-child(6) td:nth-child(1) { grid-row: 6; }
      & tr:nth-child(7) td:nth-child(1) { grid-row: 7; }
      & tr:nth-child(8) td:nth-child(1) { grid-row: 8; }
      & tr:nth-child(1) td:nth-child(2) { grid-row: 9; }
      & tr:nth-child(2) td:nth-child(2) { grid-row: 10; }
      & tr:nth-child(3) td:nth-child(2) { grid-row: 11; }
      & tr:nth-child(4) td:nth-child(2) { grid-row: 12; }
      & tr:nth-child(5) td:nth-child(2) { grid-row: 13; }
      & tr:nth-child(6) td:nth-child(2) { grid-row: 14; }
      & tr:nth-child(7) td:nth-child(2) { grid-row: 15; }
      & tr:nth-child(8) td:nth-child(2) { grid-row: 16; }
      & tr:nth-child(1) td:nth-child(3) { grid-row: 17; }
      & tr:nth-child(2) td:nth-child(3) { grid-row: 18; }
      & tr:nth-child(3) td:nth-child(3) { grid-row: 19; }
      & tr:nth-child(4) td:nth-child(3) { grid-row: 20; }
      & tr:nth-child(5) td:nth-child(3) { grid-row: 21; }
      & tr:nth-child(6) td:nth-child(3) { grid-row: 22; }
      & tr:nth-child(7) td:nth-child(3) { grid-row: 23; }
      & tr:nth-child(8) td:nth-child(3) { grid-row: 24; }
      & tr:nth-child(1) td:nth-child(4) { grid-row: 25; }
      & tr:nth-child(2) td:nth-child(4) { grid-row: 26; }
      & tr:nth-child(3) td:nth-child(4) { grid-row: 27; }
      & tr:nth-child(4) td:nth-child(4) { grid-row: 28; }
      & tr:nth-child(5) td:nth-child(4) { grid-row: 29; }
      & tr:nth-child(6) td:nth-child(4) { grid-row: 30; }
      & tr:nth-child(7) td:nth-child(4) { grid-row: 31; }
      & tr:nth-child(8) td:nth-child(4) { grid-row: 32; }
    }
  }
}

/* ---- pre / code 同样可横滚 ---- */
article pre {
  overflow-x: auto;
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-icon);
  padding: var(--space-3);
  font-size: var(--fs-14);
}
article code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }

/* ---- 页脚 ---- */
.site-footer {
  border-top: 1px solid var(--border);
  padding: var(--space-6) var(--space-4) var(--space-12);
  padding-bottom: calc(var(--space-6) + env(safe-area-inset-bottom));
  color: var(--text-secondary);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  text-align: center;
}
.site-footer a { color: var(--text-secondary); }
/* U34：页脚工具链接（朗读/离线下载收进二级位置）；触控目标 ≥44px。
   U42 P18：从「次要灰字」提为明确链接——正文色 + 下划线（对任何主题背景 ≥4.5:1，可点面积同前） */
.footer-line { margin: 0; }
.footer-tools { display: flex; justify-content: center; gap: var(--space-4); margin: var(--space-2) 0 0; flex-wrap: wrap; }
.footer-tools a { display: inline-flex; align-items: center; min-height: 44px; padding: 0 var(--space-2); font-size: var(--fs-14); color: var(--text); text-decoration: underline; text-underline-offset: 3px; }
.footer-tools a:hover { text-decoration-thickness: 2px; }

/* ---- U78 「添加到主屏」：页脚低调入口（平时 hidden，浏览器可装才显现；样式对齐 .footer-tools a） ----
   不弹窗、不遮阅读；用户拒绝后本次会话不再出现（逻辑在 src/install.js） ---- */
.footer-tools button[data-install] {
  border: 0; background: none; cursor: pointer;
  display: inline-flex; align-items: center; min-height: 44px; padding: 0 var(--space-2);
  font: inherit; font-size: var(--fs-14); color: var(--text);
  text-decoration: underline; text-underline-offset: 3px;
}
.footer-tools button[data-install]:hover { text-decoration-thickness: 2px; }
.install-tip { margin: var(--space-2) 0 0; color: var(--text-secondary); font-size: var(--fs-14); }

/* ---- U13 链接卫生：原站自带 404（已登记）渲染为不可点文本 ---- */
.broken {
  color: var(--text-secondary);
  text-decoration: underline dashed;
  text-decoration-color: var(--border);
  text-underline-offset: 3px;
  cursor: not-allowed;
}

/* ---- U13 C3：>25MB 原站托管媒体标注 ---- */
.ext-media {
  margin: var(--space-3) 0;
  padding: 10px 14px;
  background: var(--accent-weak);
  border: 1px solid var(--border);
  border-radius: var(--radius-icon);
  font-size: var(--fs-16);
}
.ext-media-label { color: var(--text-secondary); }
.ext-media a { color: var(--accent); }
.ext-media-badge {
  display: inline-block;
  margin: 0 var(--space-2);
  padding: 1px var(--space-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  font-size: var(--fs-14);
  color: var(--text-secondary);
  vertical-align: middle;
  white-space: nowrap;
}
.ext-media-orig { display: none; }

/* ---- 离线页 ---- */
.offline-wrap { max-width: 30rem; margin: 0 auto; text-align: center; padding: var(--space-12) var(--space-4); }
.offline-wrap h1 { font-size: var(--fs-26); }
.offline-wrap .back-link { margin-top: var(--space-4); }

/* ---- U78：离线页已缓存页面清单（Cache API 取到才显现；安静列表，不发卡不滚动） ---- */
.offline-cached { margin-top: var(--space-8); text-align: left; }
.offline-cached h2 { font-size: var(--fs-18); margin: 0 0 var(--space-2); }
.offline-cached-list { margin: 0; padding: 0 0 0 1.2em; text-align: left; }
.offline-cached-list li { margin: var(--space-1) 0; line-height: 1.6; }
.offline-cached-list a { color: var(--text); text-underline-offset: 3px; }

/* ---- U26 P14：≤420px 站名缩一号，360px 宽不再被省略号截断 ----
   U29 P14 补：首页页头比落地页多「搜索」入口（56px），同一档把页头留白/间距收紧（触控目标仍 ≥44px），
   给站名让出 ≥64px —— 三套皮肤 × 首页 @360 clientW==scrollW（改前 cw=102 < sw=161~166） */
@media (max-width: 420px) {
  /* body 前缀抬升优先级：main.css/search.css 在拼接序上靠后，同名无前缀规则会盖掉本块 */
  /* html[data-skin] 前缀再抬一级：themes/*.css 用 html[data-skin="…"] .site-header (0,2,0) 设 padding，本块必须压过它 */
  html[data-skin] body .site-header { padding-left: var(--space-1); padding-right: var(--space-1); gap: 0; }
  body .header-search { padding: 0 var(--space-2); font-size: var(--fs-14); }
  body .header-ctl { gap: 0; }
  .site-name { font-size: var(--fs-14); }
  html[data-skin="a"] .site-name { font-size: var(--fs-14); letter-spacing: .12em; }
  html[data-skin="c"] .site-name { font-size: var(--fs-14); }
}

/* ---- 键盘焦点（reference-spec §7：2px accent outline, offset 2px） ---- */
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* ---- 学院首页入口（U11b B-1：原首页正文已搬 /jing/，首页只留入口）----
   U43 骨架重构：单列目录式细线列表（去「hero+三卡网格」模板骨架，U39 §6.1-2/§6.2）；
   卡片底/边框/圆角全部退场，各区靠发丝线分隔；三套皮肤在此基线上各自覆写
   （a=留白块 / b=细线行 / c=杂志网格与墨带，c 的 .card 覆写特异性更高不受影响） */
.home-cols { display: flex; flex-direction: column; /* U55：节间 gap 24→32、卡首 padding 24→32 —— 首页纵向节奏：每节 ≥64px 换气，不再是均匀一坨（U44 §⑥-3） */ gap: var(--space-8); margin: var(--space-6) 0 0; }
.home-card, .home-garden, .home-dict {
  background: none;
  border: 0;
  border-top: 1px solid var(--border);
  border-radius: 0;
  padding: var(--space-8) 0 0;
  margin: 0;
}
.home-card .card-desc, .home-garden .card-desc, .home-dict .card-desc { font-family: var(--font-kai); font-size: var(--fs-16); color: var(--text-secondary); margin: var(--space-2) 0 var(--space-4); }
.card-links { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; margin: 0; }

/* ---- term013d 查词入口：与首页细线区块同一语言（无卡底、发丝线分隔）；
   输入框与「查」钮都 ≥44px（390px 视口手指可点），楷体输入、胶囊钮同 .pill--college 口径 ---- */
.dict-entry { display: flex; align-items: center; gap: var(--space-2); margin: 0; max-width: 30rem; }
.dict-entry input[type="text"] {
  flex: 1; min-width: 0; min-height: 44px;
  padding: 0 var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--bg-elevated) 94%, transparent);
  color: var(--text);
  font-family: var(--font-kai);
  font-size: var(--fs-16);
}
.dict-entry input[type="text"]::placeholder { color: var(--text-secondary); opacity: 1; }
.dict-entry input[type="text"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; border-color: var(--accent); }
.dict-entry .pill--college { flex: none; }

/* ---- U18：三套版式主题共用的中性基线（各主题在 src/styles/themes/*.css 里覆写） ---- */
/* ---- U34 首页动作统一为一种样式：U31 .entry-fab 的视觉语言（胶囊 + 1px 低对比边线 + 系统字体 + 毛玻璃），
   两院入口 / 教学大纲 / 修学园地 / 怎样学佛 全部同款；层级靠位置不靠样式。基线给三套主题共用，主题可在同语言内微调 ---- */
/* U40：首页/落地页动作胶囊在文档流内、无内容从底下滚过，玻璃退场（背景不透明度相应提高），
   玻璃只留给真悬浮层（页头/entry-fab/段导航/面板/目录抽屉/术语弹层） */
.pill--college,
.home-card .textlink,
.hero-garden a,
.home-garden .card-links a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 0 var(--space-6);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--bg-elevated) 94%, transparent);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  font-weight: 500;
  letter-spacing: .04em;
  text-decoration: none;
}
.pill--college:hover,
.home-card .textlink:hover,
.hero-garden a:hover,
.home-garden .card-links a:hover { border-color: color-mix(in srgb, var(--text) 35%, var(--border)); }
.hero-slogan, .hero-qi { font-family: var(--font-kai); margin: var(--space-4) 0 0; }
.hero-garden { margin: var(--space-4) 0 0; }
/* 首页 home-aims（培养目标）：仅 b 主题启用（见主题文件），基线隐藏（原状） */
.home-aims { display: none; }
.page-head { min-width: 0; }
.header-ctl { display: flex; gap: var(--space-2); align-items: center; margin-left: auto; flex: none; }
.header-ctl .ctl { padding: 0 var(--space-2); }

/* ---- U38 刷新按钮（U74 降权）：去玻璃/去边线/去阴影，弱色按需轻提示 ----
   讲义页=底部工具行里入口胶囊右侧的纯图标幽灵钮（同 44px 触达目标，但无框无底、弱色）；
   其余页面（首页/落地页等）=右下角小字「刷新」轻提示（无边框无底色，不再像主控件）。
   出现时机不变（U47 R7：仅「有新版本可刷新」或「离线」时显现，平时 hidden）。 */
.entry-fab.refresh-fab {
  width: 44px;
  min-width: 44px;
  padding: 0;
  margin-left: var(--space-2);
  justify-content: center;
  flex: none;
  border: 0;
  background: none;
  box-shadow: none;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  color: var(--text-secondary);
}
.entry-fab.refresh-fab:hover,
.entry-fab.refresh-fab[aria-expanded="true"] { color: var(--text); }
body:not(:has([data-reading-body])) .refresh-fab {
  position: fixed;
  right: calc(16px + env(safe-area-inset-right));
  bottom: calc(16px + env(safe-area-inset-bottom));
  z-index: 30;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  padding: 0 var(--space-2);
  border: 0;
  border-radius: var(--radius-icon);
  background: none;
  color: var(--text-secondary);
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  box-shadow: none;
}
body:not(:has([data-reading-body])) .refresh-fab:hover { color: var(--text); }
/* U47 R7：按需出现——默认 hidden（display:none 需显式写：上方 display:inline-flex 会压过 UA 的 [hidden]） */
.refresh-fab[hidden] { display: none !important; }

/* ---- U223 刷新可见反馈（读者走查 P4/P19）：进行中态 + 刷新后轻提示 ----
   轻提示条固定定位、pointer-events:none，不遮正文不占布局；色值全用 token（随亮暗/皮肤）。
   底部工具行/入口胶囊上方（手机）或底缘上方（桌面），出现/消失带 0.2s 过渡。 */
[data-refresh-toast] {
  position: fixed;
  left: 50%;
  bottom: calc(96px + env(safe-area-inset-bottom));
  transform: translate(-50%, 8px);
  z-index: 90;
  max-width: min(80vw, 320px);
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius-pill);
  background: var(--bg);
  color: var(--text);
  border: 1px solid var(--border);
  box-shadow: var(--shadow-2);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  text-align: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.2s ease, transform 0.2s ease;
}
[data-refresh-toast].is-show { opacity: 1; transform: translate(-50%, 0); }
/* 进行中态：图标钮转圈（触屏/鼠标都可见）；无动画偏好时只留轻提示 */
.refresh-fab.is-refreshing svg { animation: u223-spin 0.9s linear infinite; }
@keyframes u223-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .refresh-fab.is-refreshing svg { animation: none; }
  [data-refresh-toast] { transition: none; }
}

/* ---- U38 顺手修一 u31 遗留视觉缺陷（截图发现，只加 CSS 不动 DOM 与契约 class）----
   u31 的窄屏规则「段导航靠左」因特异性别（少了 html[data-skin] 前缀）被基础 left:50% 压住，
   ≤420px 实际仍居中；加上刷新按钮后与入口胶囊重叠。补同前缀版本让意图生效。
   （另一处 drawer-search 演出曾在此同轮修补，现已在 master 根因修复，此处不重复处理。） */
@media (max-width: 420px) {
  html[data-skin] body:has([data-reading-body]) .reading-tools .segnav { left: 12px; transform: none; }
}
/* reading.css · 讲义页阅读体验样式（本文件在 layout.css 之后、themes/*.css 之前拼接；主题文件在同名规则上更晚，
   因此讲义页内的改写一律用 html[data-skin] body:has([data-reading-body]) … 前缀抬特异性压过主题值）。
   全部引用 tokens.css 变量；字号只用 reference-spec §3 字号阶（14/16/18/20/22/…）。

   U31 · 苹果风简化（用户 11:2x：「讲义也可以不放上方的 tab，最上方的按钮也是，搞得简化，高级，苹果风」）：
   - 顶部：tab（.site-nav）、顶栏搜索、面包屑、页头按钮条（.header-ctl，JS 已从 DOM 摘除）全部隐藏；
     页头退为不吸顶的一行小站名（+手机汉堡），滚走即净；
   - 底部：旧的全功能常驻栏收起，只留一个极简入口按钮（.entry-fab，[data-skin-toggle] 挂位）+
     段级导航小字；目录/主题/字号/亮暗/搜索/站内浏览全部收进入口面板（.skin-menu，reading.js 建）；
   - 视觉：系统字体栈 UI + 楷/宋正文、大留白、1px 低对比分隔线、少色少边框少图标；
     卡片底/描边/阴影、渐变、饰符（« » ▾）、emoji 一律退场。 */

/* ---- 0 · 讲义页顶栏：不吸顶、无底色无边线 ---- */
html[data-skin] body:has([data-reading-body]) .site-header {
  position: static;
  background: none;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  border-bottom: 0;
  box-shadow: none;
}
html[data-skin] body:has([data-reading-body]) .site-name {
  color: var(--text-secondary);
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--fs-14);
  letter-spacing: .04em;
}
html[data-skin] body:has([data-reading-body]) .site-name::before { content: none; } /* b 主题的印章方块退场 */
/* 顶部 tab / 顶栏搜索 / 面包屑：隐藏（不删 DOM，站内导航从入口面板「浏览」组到达） */
html[data-skin] body:has([data-reading-body]) .site-nav,
html[data-skin] body:has([data-reading-body]) .header-search,
html[data-skin] body:has([data-reading-body]) .breadcrumb { display: none; }
/* c 主题给这几处用的是墨带上的 on-ink 混色；讲义页它们退到纸上，颜色回 token（对比度 ≥4.5 由 token 保证） */
html[data-skin] body:has([data-reading-body]) .breadcrumb,
html[data-skin] body:has([data-reading-body]) .breadcrumb a,
html[data-skin] body:has([data-reading-body]) .site-nav a,
html[data-skin] body:has([data-reading-body]) .site-nav .site-nav-current { color: var(--text-secondary); }
html[data-skin] body:has([data-reading-body]) .site-nav a[aria-current="page"],
html[data-skin] body:has([data-reading-body]) .site-nav .site-nav-current[aria-current="page"] { color: var(--accent); }
/* 汉堡（≤767px 站点导航入口）只留这一个顶部按钮，去边框去底色 */
html[data-skin] body:has([data-reading-body]) .nav-toggle {
  background: none;
  border: 0;
  color: var(--text-secondary);
}
html[data-skin] body:has([data-reading-body]) .nav-toggle:hover { color: var(--text); }

/* ---- 1 · 页首：大留白 + 左对齐宋体标题（退卡片、退墨带、退居中大标题） ----
   U47 R3：.page-head 与 article 同 max-width（42rem）同中轴（margin-inline:auto）——
   修桌面讲义页 h1 与正文列错位 192–232px（U44 §2-13）；注释小字宽度不变。
   U115：栅格内（≥1024 有目录列）改随轨道拉伸（见文末 U115 块），此值为栅格外回退 */
html[data-skin] body:has([data-reading-body]) .page-head {
  background: none;
  border: 0;
  box-shadow: none;
  clip-path: none;
  border-radius: 0;
  padding: var(--space-6) 0 0;
  margin-bottom: var(--space-6);
  max-width: 42rem;
  margin-inline: auto;
}
@media (min-width: 768px) {
  html[data-skin] body:has([data-reading-body]) .page-head { padding-top: var(--space-12); margin-bottom: var(--space-8); }
}
html[data-skin] body:has([data-reading-body]) h1.page-title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-30);
  line-height: 1.3; /* U115：与非讲义页 h1 行高统一（改前 1.35，同类元素跨页不一致） */
  letter-spacing: .02em;
  color: var(--text);
  margin: var(--space-2) 0 0;
}
@media (min-width: 768px) {
  html[data-skin] body:has([data-reading-body]) h1.page-title { font-size: var(--fs-34); }
}
/* 阅读面板退卡片：白纸一张，正文列居中（主题文件的卡片底/描边/内衬在此通用化） */
html[data-skin] body:has([data-reading-body]) main > article {
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  padding: 0;
  margin-inline: auto;
  max-width: 42rem;
}

/* ---- 2 · 底部：一个极简入口 + 段级导航小字 ----
   [data-reading-tools] 仍是挂位容器（fixed 贴底），视觉上不再是一根栏；
   旧控件（字号/亮暗/目录挂位）保留在容器内但隐藏，入口面板委托它们，逻辑单份。 */
html[data-skin] body:has([data-reading-body]) .reading-tools {
  display: flex;
  align-items: flex-end;
  justify-content: flex-end;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  top: auto;
  /* U137：z 30→84 —— 唯一入口侧签要压过浮层（sheet z 80，U116），否则「看正文（浮层里）
     同时调设置」不成立；仍低于术语弹层 85 / 目录抽屉 88 / 设置面板 95 */
  z-index: 84;
  margin: 0;
  padding: 0 calc(12px + env(safe-area-inset-right)) 0 calc(12px + env(safe-area-inset-left));
  padding-bottom: calc(12px + env(safe-area-inset-bottom));
  background: none;
  border: 0;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  pointer-events: none;
}
html[data-skin] body:has([data-reading-body]) .reading-tools > * { pointer-events: auto; }
/* 挂位按钮/控件组：保留在容器里（面板委托目标），一律不显示；
   c 主题给它们的墨带配色（on-ink）随底色一起退场，回 token 色（④ 对比度闸读的是 computed color） */
html[data-skin] body:has([data-reading-body]) .reading-tools > :not(.entry-fab):not(.segnav):not(.skin-menu) { display: none; }
html[data-skin] body:has([data-reading-body]) .reading-tools .ctl {
  color: var(--text);
  background: var(--bg-elevated);
  border-color: var(--border);
}

/* 页尾留白：只给入口按钮/段导航让位（旧常驻栏的 128px 不再需要） */
html[data-skin] body:has([data-reading-body]) {
  padding-bottom: calc(96px + env(safe-area-inset-bottom));
  background-image: none; /* c 主题给旧底垫填的墨色条退场 */
}

/* 极简入口按钮：胶囊、毛玻璃、1px 低对比边线；U42 P16：文字改「☰ 目录 · 设置」（reading.js 刷新），当前主题名在 aria-label */
/* U137：唯一入口改「右侧常驻竖排侧签」——用户：「设置的按钮没有了……不能只放在最上面，
   我肯定是要一边看一边调的。」改前实测（线上，滚到正文中部）：P20/U67 的向下滚收起
   会把底部胶囊连段导航一起滑出屏，5 个视口（1440/1280/1024/900/390）入口全部不可见。
   改为右缘竖签：常驻不收（.tools-hidden 只收段导航，见下），浮层开着也在其上
   （容器 z 84 > sheet 80，且容器已挪出 main——<1024 浮层开着时 main[inert] 不再连坐，
   同 U134 ② 先例）；竖排文字与书卷语言一致。面板/目录抽屉的 z 同步抬（本文件下方与
   02-toc-body.css），否则入口在浮层上、它打开的面板却在浮层下，点了没反应。 */
.entry-fab {
  position: fixed;
  right: 0;
  top: 42%;
  transform: translateY(-50%);
  z-index: 5;
  min-width: 0;
  min-height: 0;
  /* U137：水平内衬 14px —— 竖排签触达目标 ≥44px 宽（playwright 交互控件 <44 断言红线），8px 时签宽 33 */
  padding: var(--space-4, 24px) 14px;
  writing-mode: vertical-rl;
  border: 1px solid var(--border);
  border-right: 0;
  border-radius: var(--radius-card) 0 0 var(--radius-card);
  background: color-mix(in srgb, var(--bg-elevated) 88%, transparent);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
  color: var(--text);
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  font-weight: 500;
  letter-spacing: .14em;
  line-height: 1;
  white-space: nowrap;
  /* P0-6（Meta 1303 第 3 条，用户看到「·」在竖排里自己占一行）：文案「目录 · 设置」里
     「·」两侧的空格各占一个字位（实测竖排步进 ≈6.4px/个，14px 字号），
     叠加字距后「·」上下各留 ≈10px 空白，被顶成孤立一节、四字读断。
     最小改法：word-spacing 只作用于空格字符——收掉「·」两侧空格大半（-.3em，
     净空 ≈2px，与字间 2px 字距同量级），读感回到「目录·设置」连贯四字＋分隔；
     不动字距、字形与其余布局。横排复用者（.refresh-fab）在下方重置回 normal。 */
  word-spacing: -.3em;
  box-shadow: var(--shadow-1);
}
.entry-fab:hover { border-color: color-mix(in srgb, var(--text) 35%, var(--border)); background: color-mix(in srgb, var(--bg-elevated) 96%, transparent); }
.entry-fab[aria-expanded="true"] { color: var(--accent); border-color: color-mix(in srgb, var(--text) 35%, var(--border)); }
/* U42 P16：胶囊内图标（☰）与文案间距（竖排后改向下间距） */
.entry-fab .entry-fab-ico { margin-bottom: var(--space-2); font-size: var(--fs-16); line-height: 1; }
/* U137：刷新按钮回归横排（它复用 .entry-fab 但不是侧签：非阅读页固定右下、阅读页容器内幽灵钮）；
   P0-6：横排无「·」孤立问题，word-spacing 一并重置，避免负值殃及横排文案 */
.entry-fab.refresh-fab { writing-mode: horizontal-tb; word-spacing: normal; }

/* U161（用户 10-30「手机版的目录一直出现在右边，这太傻了……最好是滚动出现」）：
   手机档（≤1023px）入口侧签不常驻——页首(scrollY≤240)藏在右缘外，滚过 240px 淡入，
   滚回页首再收起；面板开着（JS 保 .fab-on）不收。只动侧签自己：refresh-fab
   （横排复用皮）与浮层内 .entry-fab--sheet 不在此列；桌面 ≥1024 无此规则，
   U137「常驻不收」口径零改动。 */
@media (max-width: 1023px) {
  html[data-skin] body:has([data-reading-body]) .entry-fab:not(.refresh-fab):not(.entry-fab--sheet) {
    opacity: 0;
    visibility: hidden;
    transform: translateY(-50%) translateX(10px);
    transition: opacity .2s ease-out, transform .2s ease-out, visibility .2s ease-out;
  }
  html[data-skin] body:has([data-reading-body]) .entry-fab.fab-on:not(.refresh-fab):not(.entry-fab--sheet) {
    opacity: 1;
    visibility: visible;
    transform: translateY(-50%);
  }
}

/* 段级导航：底部居中的三个小字控件（‹ n / N ›），无边框无底色 */
html[data-skin] body:has([data-reading-body]) .segnav {
  display: none;
  align-items: center;
  justify-content: center;
  gap: var(--space-1);
  margin: 0;
  position: absolute;
  left: 50%;
  bottom: calc(12px + env(safe-area-inset-bottom));
  transform: translateX(-50%);
  padding: 0 var(--space-1);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--bg-elevated) 86%, transparent);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
}
html[data-skin] body:has([data-reading-body]) .seg-btn {
  min-width: 44px;
  min-height: 44px;
  padding: 0 var(--space-2);
  border: 0;
  border-radius: var(--radius-icon);
  background: none;
  color: var(--text);
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  white-space: nowrap;
  flex: none;
}
.seg-btn:disabled { opacity: .35; cursor: default; }
.seg-btn:not(:disabled):hover { color: var(--accent); }
html[data-skin] body:has([data-reading-body]) .seg-pos {
  min-width: 4.5em;
  text-align: center;
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  font-variant-numeric: tabular-nums;
  color: var(--text-secondary);
  white-space: nowrap;
  flex: none;
}
/* 窄屏：段导航抬到入口胶囊行上方靠左、入口胶囊靠右（U42 P16：胶囊加宽后 360/390 一行放不下三件，垂直错开互不相撞；放在基础规则之后才能盖住 left:50%） */
@media (max-width: 420px) {
  html[data-skin] body:has([data-reading-body]) .segnav { left: 12px; transform: none; bottom: calc(64px + env(safe-area-inset-bottom)); }
  html[data-skin] body:has([data-reading-body]) { padding-bottom: calc(124px + env(safe-area-inset-bottom)); }
}

/* P20/U67：向下滚收起底部控件（入口胶囊+段导航整条滑出屏），向上滚/轻触/近页底/控件获焦
   由 reading.js 摘掉 .tools-hidden 唤回；U67 起全宽度生效（桌面阅读中途药丸也不再压正文末行），
   左侧常驻目录列在 .reading-tools 容器外，不随收。
   隐藏只平移出屏（不 display:none），焦点序与读屏树不撤——获焦即唤回，可达性不倒退。 */
/* U137：收起只收段导航，不再整条平移——入口侧签常驻（见 .entry-fab 块注释）。
   translate 属性与居中用的 transform: translateX(-50%) 相加不互覆，≥421/≤420 两档都干净。 */
html[data-skin] body:has([data-reading-body]) .segnav { translate: 0 0; transition: translate .25s ease-out; }
html[data-skin] body:has([data-reading-body]) .reading-tools.tools-hidden .segnav {
  translate: 0 calc(100% + 160px);
  pointer-events: none;
}
/* U137：浮层开着时底层段导航整体退场——改前它被浮层盖住一半（1440 实测 32 格采样
   只命中 20 格，「下段」钮落在浮层正文上，看得到点不到）；段跳转属于底层页，
   浮层页有自己的目录侧签与滚动，不与半盖状态共处。 */
html[data-skin][data-sheet-open] body:has([data-reading-body]) .segnav {
  translate: 0 calc(100% + 160px);
  pointer-events: none;
}

/* ---- 3 · 入口面板（.skin-menu，reading.js 动态建；定位 fixed 由 JS 按触发按钮算） ---- */
.skin-menu {
  position: fixed;
  /* U137：z 70→95 —— 入口侧签在浮层上（容器 84），面板若还在 70 会被浮层（80）盖住，
     「浮层里点设置」就成了点了没反应；高于目录抽屉 88 / 术语弹层 85，低于 skip-link 100 */
  z-index: 95;
  /* U137：小视口兑底 —— 面板 JS 定位（05-skin.js，本票不可写）把超视口高的面板钳到
     innerHeight-mh-8（如 900×700 得 top=-84），顶部「版式三选一」在屏外点不到（改前既有，
   线上同病）。面板自身限高滚动后，钳位恒为 top≥8 且全部条目可达。 */
  max-height: calc(100vh - 16px);
  overflow-y: auto;
  width: min(17rem, calc(100vw - 24px));
  padding: var(--space-2);
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  background: color-mix(in srgb, var(--bg-elevated) 96%, transparent);
  -webkit-backdrop-filter: blur(16px); /* U40：玻璃强度全站归一 16px（原 20） */
  backdrop-filter: blur(16px);
  border: 1px solid var(--border);
  border-radius: var(--radius-card); /* U40：14px ad-hoc → card 档 */
  /* U140 · 票B：设置面板退「科技玻璃」→ 纸上坐谈——底不透明度 94→96（毛玻璃只剩隐约），
     阴影从 shadow-2 换成单侧落地影（居中环影是浮空 UI 相，纸页只要贴桌的影） */
  box-shadow: 0 12px 32px -12px color-mix(in srgb, var(--text) 22%, transparent);
}
.skin-opt {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  min-height: 44px;
  padding: 0 var(--space-3);
  border: 0;
  border-radius: var(--radius-icon);
  background: none;
  color: var(--text);
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  text-align: left;
}
.skin-opt:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
.skin-opt[aria-checked="true"] { color: var(--accent); font-weight: 600; }
.skin-opt .skin-opt-check { visibility: hidden; }
.skin-opt[aria-checked="true"] .skin-opt-check { visibility: visible; }
.skin-opt:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }

/* 面板工具区：亮暗 / 字号 / 目录 / 搜索 / 浏览 */
.menu-sep { height: 1px; margin: var(--space-2) var(--space-1); background: var(--border); opacity: .6; }
.menu-row { display: flex; align-items: center; gap: var(--space-2); min-height: 44px; }
.menu-row--split { justify-content: flex-start; }
.menu-label {
  flex: none;
  min-width: 44px;
  /* P0-5：行首文字与其它行对齐——menu-btn/skin-opt 文字距行左 12px（--space-3 内衬），
     标签没内衬（改前文字在 1124、其它行在 1136，实测差 12px）；用 margin 把标签本体
     与文字一起推到同一位（padding 只推文字、推不动元素本体，既有断言量的是本体/内层）。 */
  margin-left: var(--space-3);
  font-family: var(--font-ui);
  /* U140 · 票B：标签退后一级（14/次要色）——「不暴露细碎选项」：工具行里响的是值，
     标签只是注脚；收窄 16→14 与值钮拉开层级 */
  font-size: var(--fs-14);
  color: var(--text-secondary);
}
.menu-btn {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  min-height: 44px;
  padding: 0 var(--space-3);
  border: 0;
  border-radius: var(--radius-icon);
  background: none;
  color: var(--text);
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  text-decoration: none;
  text-align: left;
}
.menu-btn:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
.menu-btn--compact {
  flex: none;
  min-width: 56px;
  justify-content: center;
  border: 1px solid var(--border);
}
.menu-btn--nav { color: var(--text-secondary); }
.menu-btn--nav:hover { color: var(--text); }
.menu-btn--nav[aria-current="page"] { color: var(--accent); font-weight: 600; }
.menu-btn:focus-visible, .entry-fab:focus-visible, .seg-btn:focus-visible, .book-link:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* ---- 4 · 本页目录（U56 恢复桌面左右分栏）：≥1024px 左侧常驻目录列（sticky + scrollspy 高亮 +
   点击平滑滚动），右侧正文 ≤42rem 不被拉宽；≤1023px 沿用 U31 全宽底部抽屉（不占首屏）。
   P17 的 ✕ 与入口胶囊让位只属抽屉形态（手机）。b 主题重点：安静书房感——无卡片底/阴影，
   细线分隔，目录弱色小字。 ---- */
/* 共通：目录内容排版（列表/链接/当前节高亮），两种形态一致 */
html[data-skin] body:has([data-reading-body]) .toc summary::after { content: none; } /* ▾/▴ 饰符退场 */
/* U96：目录左侧连续对齐——ol 不再加 padding（改前 20px，首级条目比「本页目录」头右凸一格）；
   层级区分交给 li 逐级缩进（base.css l3/4/5 = 16/32/48px），首级与头左缘对齐 */
html[data-skin] body:has([data-reading-body]) .toc ol { margin: 0; padding-left: 0; }
html[data-skin] body:has([data-reading-body]) .toc li { margin-left: 0; }
html[data-skin] body:has([data-reading-body]) .toc li.toc-l3 { margin-left: 16px; }
html[data-skin] body:has([data-reading-body]) .toc li.toc-l4 { margin-left: 32px; }
html[data-skin] body:has([data-reading-body]) .toc li.toc-l5 { margin-left: 48px; }
/* U106 ③：当前项「书签线」—— 左缘 2px accent 细线，全条目常挂透明边框占位（滚动切换零位移），
   颜色随 accent 走主题；比色块克制，像书页侧标 */
html[data-skin] body:has([data-reading-body]) .toc a {
  border-left: 2px solid transparent;
  margin-left: -2px; /* 边框占位不占宽：题名与「本页目录」头仍左缘对齐 */
}
/* U106 ③：条目编号与题名分栏（一、/（一）/第X章…）—— 题名换行回到编号之后，不回到行首，
   长条目左缘规整；无编号条目不拆 */
html[data-skin] body:has([data-reading-body]) .toc .toc-num { flex: none; min-width: 2.4em; }
html[data-skin] body:has([data-reading-body]) .toc a {
  color: var(--text);
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  text-decoration: none;
}
/* U96b：scrollspy 去加重——滚动时切 font-weight 会让目录条目宽度变化重排抖动；强调交由 accent 色 */
html[data-skin] body:has([data-reading-body]) .toc a[aria-current="true"] { color: var(--accent); background: none; border-radius: 0; }

/* ≤1023px：全宽底部抽屉（U31 形态，原样保留） */
@media (max-width: 1023px) {
  html[data-skin] body:has([data-reading-body]) .toc {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    top: auto;
    z-index: 88; /* U137：40→88 —— 浮层（80）之上，否则浮层里开目录抽屉点了没反应；高于工具容器 84 */
    margin: 0;
    background: color-mix(in srgb, var(--bg-elevated) 96%, transparent);
    -webkit-backdrop-filter: blur(16px); /* U40：玻璃强度全站归一 16px（原 20） */
    backdrop-filter: blur(16px);
    border: 0;
    border-top: 1px solid var(--border);
    border-radius: var(--radius-card) var(--radius-card) 0 0; /* U40：14px ad-hoc → card 档 */
    box-shadow: var(--shadow-2);
    padding: var(--space-2) var(--space-4) var(--space-4);
    max-height: 68vh;
    overflow-y: auto;
    transform: translateY(105%);
    transition: transform .25s ease-out;
  }
  html[data-skin] body:has([data-reading-body]) .toc.open { transform: translateY(0); }
  /* P17②：抽屉标题行钉在抽屉顶部（列表滚动不没），右侧 44px「✕」明显关闭入口
     （JS 注入；色用 --text 对 bg-elevated ≥4.5:1，与页头导航关闭钮同字形） */
  html[data-skin] body:has([data-reading-body]) .toc summary {
    position: sticky;
    top: 0;
    z-index: 1;
    background: var(--bg-elevated);
    padding-right: var(--space-12);
  }
  html[data-skin] body:has([data-reading-body]) .toc .toc-close {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    right: var(--space-1);
    width: 44px;
    height: 44px;
    display: grid;
    place-items: center;
    border: 0;
    border-radius: var(--radius-icon);
    background: none;
    color: var(--text);
    cursor: pointer;
    font-family: var(--font-ui);
    font-size: var(--fs-20);
  }
  html[data-skin] body:has([data-reading-body]) .toc .toc-close:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
  /* P17①：抽屉开着时入口胶囊明确让位（模态面板不与浮动件同屏抢焦点；
     ✕ 一键关闭/点外任意处关闭，重开面板路径明确）——过渡淡出，抽屉一关即回 */
  html[data-skin] body:has([data-reading-body]) .entry-fab { transition: opacity .2s ease-out; }
  html[data-skin] body:has([data-reading-body]):has(.toc.open) .entry-fab { opacity: 0; pointer-events: none; }
  html[data-skin] body:has([data-reading-body]) .toc summary {
    min-height: 48px;
    font-family: var(--font-ui);
    font-weight: 600;
    font-size: var(--fs-16);
    color: var(--text-secondary);
    cursor: default;
    border-bottom: 1px solid var(--border);
    margin-bottom: var(--space-2);
  }
  /* 抽屉条目 ≥44px 点目标（U15p 先例：取 48px 避开 isMobile+dsf2 亚像素取整） */
  html[data-skin] body:has([data-reading-body]) .toc a { display: flex; align-items: center; min-height: 48px; padding: 0 var(--space-1); }
}

/* ≥1024px：桌面左右分栏（U56）——左目录列 sticky 常驻，正文列 ≤42rem 中轴不拉宽；
   基准取 b（15rem/42rem），a/c 主题文件的同位 @media 覆盖因本前缀特异性更高而不再生效（a/c 观感不破，见 DONE 报告） */
@media (min-width: 1024px) {
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) {
    display: grid;
    grid-template-columns: 15rem minmax(0, var(--w-body, 42rem));
    justify-content: center;
    column-gap: var(--space-12);
    align-items: start;
    width: 100%;
    max-width: calc(15rem + var(--w-body, 42rem) + var(--space-12) + 2 * var(--space-8));
  }
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) > * { grid-column: 2; }
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) > .toc {
    grid-column: 1;
    grid-row: 1 / span 6;
    position: sticky;
    top: var(--space-8);
    align-self: start;
    max-height: calc(100vh - 96px);
    overflow-y: auto;
    margin: 0;
    padding: 0;
    background: none;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
  /* 目录列头：细线分隔的小节标题（非可点折叠——JS 已把 details 常开，点击 summary 无折叠） */
  html[data-skin] body:has([data-reading-body]) .toc summary {
    min-height: 0;
    padding: 0 0 var(--space-2);
    margin-bottom: var(--space-2);
    background: none;
    border-bottom: 1px solid var(--border);
    font-family: var(--font-ui);
    font-weight: 600;
    font-size: var(--fs-14);
    letter-spacing: .08em;
    color: var(--text-secondary);
    cursor: default;
  }
  html[data-skin] body:has([data-reading-body]) .toc .toc-close { display: none; } /* ✕ 属抽屉形态，桌面不注入视觉 */
  /* 目录弱色小字 + 宽松行距（安静书房感）；当前节 scrollspy 高亮为 accent。
     U106 ③：层级用灰度+字重区分（l2 章部级最重、l3 常规、l4/5 最淡，静态不随滚动变，防宽度抖动）；
     行高收紧一档（min-height 40→36 + 上下 padding），同系列标题层级归一后章部级呼吸感由 margin 给 */
  html[data-skin] body:has([data-reading-body]) .toc a {
    display: flex;
    align-items: baseline;
    min-height: 26px; /* U115 目录压缩：36→26，行距/内衬同步收紧（层级/书签线/可点不变） */
    padding: 2px 0;
    color: var(--text-secondary);
    font-size: var(--fs-14);
    line-height: 1.45;
  }
  html[data-skin] body:has([data-reading-body]) .toc li.toc-l2 a { color: var(--text); font-weight: 600; }
  html[data-skin] body:has([data-reading-body]) .toc li.toc-l4 a,
  html[data-skin] body:has([data-reading-body]) .toc li.toc-l5 a { color: color-mix(in srgb, var(--text-secondary) 74%, transparent); }
  /* 章部级之间留一口呼吸（首条不留，与列头贴）；U115 压缩 7→4px */
  html[data-skin] body:has([data-reading-body]) .toc li.toc-l2:not(:first-child) { margin-top: 4px; }
  html[data-skin] body:has([data-reading-body]) .toc a:hover { color: var(--text); }
    html[data-skin] body:has([data-reading-body]) .toc a[aria-current="true"] { color: var(--accent); } /* U96b：去加重，同上 */
}

/* ---- 5 · 正文基准：18px（≥16px，B4）；字号三档绑定 token 阶（B3，值∈字号阶） ----
   U134 ①：限定讲义阅读体（data-reading-body）——原全局 article p 会汫到栏目页（/jing/、/chan/、
   /xiuxueyd/）的正文卡，同页表格内容继承 17px 基准 ⇒ 同页 17/18 两套、跨页三样（U132 A2 实测）。
   栏目页正文回 17px 基准（--fs-body），讲义页不变。 */
html[data-skin] body:has([data-reading-body]) article p { font-size: var(--fs-18); }
html[data-fs="s"] body:has([data-reading-body]) article p { font-size: var(--fs-16); }
html[data-fs="l"] body:has([data-reading-body]) article p { font-size: var(--fs-20); }

/* ---- 5b · U92 书卷节奏（⑥ 避免 AI 味）：正文段首行缩进两字 + 段距收小——
   分段信号交给缩进（书页惯例），段间不再均匀撒 1.5em 空档（「均匀大留白 + 卡片」是 AI 味重灾区）；
   换气交给节题（h2 前 2.4em+，主题另有加码），形成「密排书页 / 大拍换气」两级节奏。
   只作用讲义正文的直接子段且无 class 的朴素段；引文/注释/列表不动（各有起止记号）。 */
html[data-skin] body:has([data-reading-body]) [data-reading-body] > p:not([class]) {
  text-indent: 2em;
  margin-bottom: .75em;
}

/* ---- 5c · U92 配图层次（⑥）：插图是「文主图从」，不是 app 卡片——
   去圆角（圆角=控件相）、图随段呼吸（上下 2em），宽度不过正文列；
   占位图（原站图片不可用）退成安静空位：限宽 + 半透明，亮暗主题都不再是一块突兀亮洞。 */
html[data-skin] body:has([data-reading-body]) [data-reading-body] img { border-radius: 0; }
html[data-skin] body:has([data-reading-body]) [data-reading-body] p img,
html[data-skin] body:has([data-reading-body]) [data-reading-body] > img { margin: var(--space-8) auto; }
html[data-skin] body:has([data-reading-body]) [data-reading-body] img[src*="external-image-placeholder"] {
  max-width: min(20rem, 80%);
  opacity: .55;
}

/* ---- 5c½ · U96：视频不再吃首行缩进——video 是 inline 替换元素，U92 的 text-indent: 2em
   会把它整块顶出正文列右缘（/xiuxueyd/109chenggong 360 视口 docSW 380>360，线上 master 同病）；
   改块级居中，缩进语义只属文字行 */
html[data-skin] body:has([data-reading-body]) [data-reading-body] video {
  display: block;
  max-width: 100%;
  margin: var(--space-6) auto;
}

/* ---- 6 · 原文/注分层（B9）：注释段小一号 + 注色 + 细缩进线；经文引文用宋体大一号 ---- */
/* U47 R2（U44 §2-9）：注释块线型统一——原「灰 dashed top（b 主题）+ 红棕 solid left（--note 系）」自相矛盾，
   统一为全 dashed var(--border)（去 --acc2 系红棕；b 主题 .fn-note 的 border-top 同色同型） */
p.p-note {
  font-size: var(--fs-16);
  color: var(--note);
  padding-left: var(--space-4);
  border-left: 1px dashed var(--border);
}
article blockquote {
  font-family: var(--font-display);
  font-size: var(--fs-20);
  background: none;
  border-radius: 0;
}

/* ---- 6a · U96 署名行（p-byline）：撰/注/译落款——楷体小字、次要色、右对齐、无首行缩进，
   与开篇偈（quote--verse）形成「偈左署右」的传统书页版式；三主题用 token 色自适应 ---- */
html[data-skin] body:has([data-reading-body]) article p.p-byline {
  text-indent: 0;
  font-family: var(--font-kai);
  font-size: var(--fs-16);
  line-height: 1.8;
  color: var(--text-secondary);
  text-align: right;
  margin: var(--space-2) 0 var(--space-8);
}

/* ---- 7 · 上一篇 / 下一篇（B8）：文末，细分隔线起头，纯文字链接 ---- */
.seg-book {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  margin: var(--space-12) 0 var(--space-4);
  padding-top: var(--space-6);
  border-top: 1px solid var(--border);
}
.book-gap { flex: 1; }
.book-link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--space-2);
  border: 0;
  border-radius: var(--radius-icon);
  background: none;
  color: var(--accent);
  text-decoration: none;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
}
.book-link:hover { color: var(--text); }
html[data-skin] body:has([data-reading-body]) .seg-book .book-link { border: 0; background: none; }
.book-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }


/* ---- 4b · U137 · 浮层内目录：左缘竖排侧签（原生 details 开合零 JS），不再只在浮层页顶 ----
   用户：「目录……引到侧面。不能只放在最上面，我肯定是要一边看一边调的。」浮层页的目录是
   sheet-nav 克隆来的 details.toc（原生开合），原样是一块顶在浮层页首的卡片（改前实测：读到
   浮层中部要回滚整屏才能看到）。改法：目录整体 absolute 挂到浮层左缘外（.sheet 本身是
   positioned，被埋层 transform 平移时侧签随层走），summary 变竖排签（点击原生开合），
   open 时 ol 弹出为面板盖浮层正文（条目 48px 触达、scrollspy 书签线语言不变）。
   sheet.css 在本文件之后拼接，故全部用 .sheet details.toc[data-toc] 抬特异性压它。
   点条目跳节后面板不自动收（克隆无监听、零 JS 可用性限度内）；再点签收起。 */
html[data-skin] body:has([data-reading-body]) .sheet details.toc[data-toc] {
  position: absolute;
  left: 0;
  right: auto; /* ≤1023 抽屉形态的 right:0/bottom:0 会让绝对定位盒拉伸（占满浮层宽/通高），签被 translateX(-100%) 推出屏、盒体拦截 scrim 点击 */
  bottom: auto;
  top: 96px;
  z-index: 5;
  width: auto;
  max-width: none;
  max-height: none;
  overflow: visible;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
  transform: translateX(-100%);
}
html[data-skin] body:has([data-reading-body]) .sheet details.toc[data-toc] summary {
  position: static;
  writing-mode: vertical-rl;
  min-height: 0;
  /* U137：水平内衬 14px —— 竖排签触达目标 ≥44px 宽（同 .entry-fab） */
  padding: var(--space-3) 14px;
  border: 1px solid var(--border);
  border-right: 0;
  border-radius: var(--radius-card) 0 0 var(--radius-card);
  background: color-mix(in srgb, var(--bg-elevated) 88%, transparent);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
  color: var(--text);
  font-family: var(--font-ui);
  font-weight: 500;
  font-size: var(--fs-14);
  letter-spacing: .14em;
  line-height: 1.2;
  cursor: pointer;
}
html[data-skin] body:has([data-reading-body]) .sheet details.toc[data-toc] summary:hover { color: var(--accent); }
html[data-skin] body:has([data-reading-body]) .sheet details.toc[data-toc] ol {
  position: absolute;
  top: 0;
  left: calc(100% + 12px);
  width: min(18rem, 78vw);
  max-height: min(60vh, 30rem);
  overflow-y: auto;
  margin: 0;
  padding: var(--space-2) var(--space-3);
  background: color-mix(in srgb, var(--bg-elevated) 96%, transparent);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-2);
}
/* ---- 8 · 两级术语标注（B5）：站内注=点状底边+help；外链=虚线下划线小字 ---- */
.term--internal {
  color: inherit;
  background: none;
  border: 0;
  border-bottom: 1px dotted var(--note);
  padding: 0;
  font: inherit;
  cursor: help;
}
.term--internal:hover { color: var(--note); }
.term--external {
  display: inline;
  color: var(--accent);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  white-space: nowrap;
  margin-left: 2px;
  text-decoration: underline dashed;
  text-decoration-color: color-mix(in srgb, var(--accent) 60%, transparent);
  text-underline-offset: 3px;
  cursor: pointer;
}
.term--external:hover { text-decoration-style: solid; }

/* ---- 9 · 术语释义弹层（B5④⑤）：毛玻璃薄层、1px 边线、无重投影 ---- */
.term-layer {
  position: fixed;
  z-index: 60;
  max-width: min(24rem, calc(100vw - 32px));
  padding: var(--space-4);
  padding-right: var(--space-6);
  background: color-mix(in srgb, var(--bg-elevated) 96%, transparent);
  -webkit-backdrop-filter: blur(16px); /* U40：玻璃强度全站归一 16px（原 20） */
  backdrop-filter: blur(16px);
  border: 1px solid var(--border);
  border-radius: var(--radius-card); /* U40：14px ad-hoc → card 档 */
  box-shadow: var(--shadow-2);
}
.term-layer.open { display: block; }
.term-head { display: flex; align-items: center; gap: var(--space-2); padding-right: var(--space-6); }
.term-head b { color: var(--text); font-size: var(--fs-16); }
.term-close {
  position: absolute;
  top: 0;
  right: 0;
  min-width: 44px;
  min-height: 44px;
  border: 0;
  background: none;
  color: var(--text-secondary);
  cursor: pointer;
}
.term-close:hover { color: var(--text); }
.term-def { margin: var(--space-2) 0 var(--space-2); color: var(--text); font-size: var(--fs-16); line-height: 1.5; }
.term-layer .term--external { margin-left: 0; }

@media (prefers-reduced-motion: reduce) {
  .toc, html[data-skin] body:has([data-reading-body]) .toc { transition: none; }
  html[data-skin] body:has([data-reading-body]) .reading-tools { transition: none; } /* P20 收起/唤回也不动 */
  .entry-fab, .menu-btn, .seg-btn:active { transform: none; }
  html[data-skin] body:has([data-reading-body]) .fn-note { transition: none; } /* U72 对应高亮也不动 */
}

/* ==== U72 · 词典式词条注（划线 ↔ 右栏注一一对应）====
   用户 10-28 ①②④⑤：阅读区居中不再偏右；右栏注加宽用掉最右空白；正文里划线标出被解释的词，
   与右侧注一一对应（点/悬停能对上，手机点划线即看）；长解释不把正文拉长（<1280 已配对注收进弹层，
   不再内联撑页）。划线样式与佛学词典明显区分：词典 = 1px 点线灰（.term--internal），
   注释 = 2px 实线赭（.fn-ref，线型/线宽/色三重区分）。构建期配对见 src/fnlinks.mjs。 ---- */

/* 正文划线：实线赭色下划线，文字本体不变色（区别于词典的点线灰与链接的赭色文字） */
.fn-ref {
  border: 0;
  background: none;
  padding: 0;
  font: inherit;
  color: inherit;
  cursor: pointer;
  text-decoration: underline;
  text-decoration-line: underline;
  text-decoration-style: solid;
  text-decoration-color: var(--accent);
  text-decoration-thickness: 2px;
  text-underline-offset: 4px;
}
.fn-ref:hover { background: color-mix(in srgb, var(--accent-weak) 80%, transparent); text-decoration-thickness: 3px; }
.fn-ref:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* 对应高亮：划线 hover/点击时，右栏对应注明显可辨（U91 ④：淡赭底之外加 accent 左条 +
   向正文侧位移 + 细描边 —— 位移+描边让「哪条在应答」一眼看出；纯 token，三主题/暗色自适应） */
html[data-skin] body:has([data-reading-body]) p.fn-note {
  transition: background-color .3s ease-out, transform .2s ease-out, box-shadow .2s ease-out;
}
html[data-skin] body:has([data-reading-body]) p.fn-note.fn-note--hit {
  background: var(--accent-weak);
  border-left-color: var(--accent); /* 只变色：盒宽与基类相同，零重排 */
  transform: translateX(-8px);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
}

/* U96b：反向高亮——点右侧注后，左侧原文划线的应答样式（底色淡赭，文字不动不重排） */
.fn-ref.fn-ref--hit {
  background: var(--accent-weak);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
}
.fn-ref { transition: background-color .3s ease-out, box-shadow .2s ease-out; }
.fn-ref.fn-ref--hit { transition: none; }

/* <1280（手机/窄桌面）：已配对注收进弹层（点划线即看），不再内联拉长页面；
   未配对注（正文找不到被解释词）保持原样内联，内容不丢 */
@media (max-width: 1279px) {
  html[data-skin] body:has([data-reading-body]) p.fn-note--linked { display: none; }
}

/* 注释弹层：复用 .term-layer 基底（毛玻璃薄层/1px 边线/✕ 关闭），只放宽宽度、
   长注内部滚动（不撑高视口、更不撑正文） */
.fn-layer { max-width: min(30rem, calc(100vw - 32px)); }
.fn-layer .term-def { max-height: 56vh; overflow-y: auto; }

/* ≥1280 桌面：预留右侧注栏为第 3 列，整块居中——目录列与注栏同宽（U87：15→16rem 消掉
   左右留白 16px 差），正文列回到视口中轴；注由 JS 逐条对齐到锚点高度（absolute，见下）。
   各主题目录/正文列宽沿用各自 ≥1024 规则，只在末尾补同宽注栏。
   U87 加宽：≥1440 目录列/注栏一起放宽到 18rem（对称不变），1280–1439 保持 16rem
   （16+42+16+2×3 气口 = 80rem 恰好装进 1280，正文列自动收缩，不出横滚）。 */
/* U98：栏宽改为变量 --w-toc / --w-note（默认值与改前逐档相等：1280 档 16/16、
   ≥1440 档 18/18、≥1600 注栏 22）——U98 标尺拖拽只改这两个变量（内联在 html 上），
   关闭标尺/未拖拽时布局与改前逐像素一致。 */
@media (min-width: 1280px) {
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) {
    grid-template-columns: var(--w-toc, 16rem) minmax(0, var(--w-body, 42rem)) var(--w-note, 16rem);
    column-gap: var(--space-12);
    max-width: calc(var(--w-toc, 16rem) + var(--w-body, 42rem) + var(--w-note, 16rem) + 2 * var(--space-12) + 2 * var(--space-8));
  }
}
@media (min-width: 1440px) {
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) {
    grid-template-columns: var(--w-toc, 18rem) minmax(0, var(--w-body, 42rem)) var(--w-note, 18rem);
    max-width: calc(var(--w-toc, 18rem) + var(--w-body, 42rem) + var(--w-note, 18rem) + 2 * var(--space-12) + 2 * var(--space-8));
  }
}

/* U91 ②：页内去重的重复注隐藏（文字留在 DOM 不删，fidelity 子序列口径不受影响；
   划线已改指保留条，故无「点进隐藏条」的死链） */
html[data-skin] body:has([data-reading-body]) p.fn-note--dup { display: none; }

/* ==== U58 · web 端自己的版式 + 非正文块特殊排版 ====
   用户 16:2x：「web 端要有自己的设计」「作者介绍/经上怎么说/以前大师怎么说/目录这些非主体部分要做特殊排版」
   「怎么把重点标出来、符合人的视觉工序」。本单元管画布与块排版；左侧目录列骨架归 U56（rebase 时合流）。
   层级手段 = 字体（宋/楷/黑）× 字号阶 × 饰线（细线/虚线）× 淡底 × 缩排 × 留白，不靠颜色堆叠；值全走 tokens。
   作用域：讲义页（body:has([data-reading-body])），落地页/首页不动；class 名零改动（契约 §1/§5）。 */

/* ---- 1 · 经上怎么说（quote--scripture）：全块最高层级——宋体大一号 + 2 倍行距 + 淡底 + accent 细左线，庄重不花 ---- */
html[data-skin] body:has([data-reading-body]) article p.quote--scripture {
  font-family: var(--font-display);
  font-size: var(--fs-20);
  line-height: 2;
  letter-spacing: .02em;
  color: var(--text);
  background: color-mix(in srgb, var(--accent-weak) 60%, transparent);
  border-left: 3px solid var(--accent);
  border-radius: 0;
  padding: var(--space-3) var(--space-4) var(--space-3) var(--space-6);
  margin: var(--space-8) 0;
}

/* ---- 2 · 以前大师怎么说（quote--saying）：层级低于经——楷体正文字号、无底、note 色细左线；
   与经四条线索可分（字体/字号/底色/线色），不靠颜色深浅硬凑 ---- */
html[data-skin] body:has([data-reading-body]) article p.quote--saying {
  font-family: var(--font-kai);
  font-size: var(--fs-18);
  line-height: 1.9;
  color: var(--text-secondary);
  background: none;
  border-left: 3px solid var(--note);
  border-radius: 0;
  padding: var(--space-1) 0 var(--space-1) var(--space-4);
  margin: var(--space-6) 0;
}

/* ---- 3 · 偈颂（quote--verse）：经的家族、偈的排法——宋体 + 拉开字距 + 无底 ---- */
html[data-skin] body:has([data-reading-body]) article p.quote--verse {
  font-family: var(--font-display);
  font-size: var(--fs-18);
  line-height: 2;
  letter-spacing: .12em;
  color: var(--text);
  background: none;
  border-left: 3px solid var(--accent);
  border-radius: 0;
  padding: var(--space-1) 0 var(--space-1) var(--space-4);
}

/* ---- 4 · 注释/出典（fn-note / fn-src）：小字 + 虚线分隔，视觉退出正文流；
   桌面（≥1280）正文列右侧挂边栏注（Tufte 式），不打断正文；手机保持行内小字（≥16px 断言不动）。
   只对正文列直属段浮动（表格内/嵌套的注释留在原位，避免撑破表格）。 ---- */
html[data-skin] body:has([data-reading-body]) article p.fn-note {
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  line-height: 1.7;
  color: var(--note);
  /* U96b：几何常驻预留（3px 透明左条 + 8px 内衬）——--hit 只变色不改宽，
     悬停/点击时注栏文字不再重排抖动（用户 10-29：悬停左侧原文，右侧文字宽度变化整段重排） */
  border-left: 3px solid transparent;
  border-top: 1px dashed var(--border);
  padding: var(--space-2) 0 0 var(--space-2);
  margin: var(--space-3) 0;
  cursor: pointer;
}
html[data-skin] body:has([data-reading-body]) article .fn-src {
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  color: var(--note);
}
@media (min-width: 1280px) {
  /* 边栏注（U87 重排）：注改为 absolute、由 JS（initFnRefs 的 layoutMarginNotes）把每条注的顶边
     对齐到它对应划线的顶边——不再是 float+clear 纵向接力（改前实测注列最大空档 2424px、
     注顶与锚点错位最大 1064px，「右侧完全占了空间、中间空一大块」即此）。
     JS 未跑/窄层时 top:auto 退回静态位置，内容不丢。16/18rem 栏宽与栅格第 3 列同宽同层。 */
  html[data-skin] body:has([data-reading-body]) [data-reading-body] { position: relative; }
  /* U98：边栏注/辞典条目统一用 --w-note 变量（与栅格第 3 列同宽同层；外挑 3rem 气口不变） */
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note,
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note {
    position: absolute;
    top: var(--fn-top, auto);
    right: calc(-3rem - var(--w-note, 16rem));
    box-sizing: border-box;
    width: var(--w-note, 16rem);
    margin: 0;
    font-size: var(--fs-14);
  }
  /* U89：顺延滞后超窗（>1.5 屏，见 initFnRefs 的 layoutMarginNotes）的注逐出边栏，
     点划线改走弹层（JS activate 分流）；仅 ≥1280 生效，<1280 本就收弹层，内容零丢 */
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note--over { display: none; }
  /* 经引外挂两侧（引经满幅，宋体大字更庄重）；外挑恰为 3rem 气口，不侵入注栏 */
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.quote--scripture {
    width: calc(100% + 6rem);
    margin-left: -3rem;
    margin-right: -3rem;
    padding-left: var(--space-8);
  }
  /* 末注超出正文时的清垫（U87：接替原 float 清浮伪元素；高度由 JS 算，空伪元素不改 DOM 文本） */
  html[data-skin] body:has([data-reading-body]) [data-reading-body]::after { content: ""; display: block; height: var(--fn-clear, 0px); }
}
/* ≥1440 加宽层（U87）：注栏 16→18rem，与 ≥1440 栅格第 3 列同宽；
   须排在基底规则之后（同特异性，后者胜） */
@media (min-width: 1440px) {
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note,
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note {
    right: calc(-3rem - var(--w-note, 18rem));
    width: var(--w-note, 18rem);
  }
}
/* U91 ③：注栏弹性——≥1600 吃掉宽屏两侧余白，注栏 18→22rem（长注少折行、注列矮一截），
   随视口加宽而加宽，不是写死一个宽度；≤1599 各档不变（不出横滚）。
   须排在上面 U87 的 1440 加宽层之后（同特异性，后者胜才不会盖回 18rem）。 */
@media (min-width: 1600px) {
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) {
    grid-template-columns: var(--w-toc, 18rem) minmax(0, var(--w-body, 42rem)) var(--w-note, 22rem);
    max-width: calc(var(--w-toc, 18rem) + var(--w-body, 42rem) + var(--w-note, 22rem) + 2 * var(--space-12) + 2 * var(--space-8));
  }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note,
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note {
    right: calc(-3rem - var(--w-note, 22rem));
    width: var(--w-note, 22rem);
  }
}

/* ---- 5 · 页头元信息横排（≥1024 桌面专属）：面包屑回到页首作眉行（小字、次要色、宽间距），
   手机维持 U31 的隐藏口径 ---- */
@media (min-width: 1024px) {
  html[data-skin] body:has([data-reading-body]) .breadcrumb {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    margin: 0 0 var(--space-1);
  }
  /* 桌面鼠标目标：解除手机 44px 触控行高，眉行保持一行小字 */
  html[data-skin] body:has([data-reading-body]) .breadcrumb a {
    min-height: 24px;
    min-width: 0;
    padding: 0 var(--space-1) 0 0;
  }
}

/* ==== U98 · 两组注释合一（佛学辞典 / 原文注释）+ 栏宽标尺 + 注折叠 + 组多选 ====
   用户 10-28 口径：词典与原文注统一进右侧直接展示，标准化两组、划线样式区分（词典=点线灰、
   原文注=实线赭，沿用 U72 既有划线）；手机照 Web 做成右侧抽屉（两组直接展示，视口内）；
   注多时逐条限高折叠（只露前几行），点开即看，不挤压不悬浮纠缠（placeNotes 链照跑）；
   组别可多选（chips，aria-pressed，localStorage 持久化）；栏宽标尺（Word 式）≥1280 显示，
   拖拽调 --w-toc/--w-note，localStorage 持久化，关闭回默认。契约 §1/§5 class 名零改动，
   新增类全部 u98/annot 前缀。 */

/* ---- 1 · 边栏辞典条目（p.term-note）：与原文注同一套骨架（3px 透明左条 + 虚线上边 + 注色小字），
   差异只在词头——点状底线回指正文点线划线（词典组）；对应高亮与 fn-note 共用 fn-note--hit ---- */
/* 边栏辞典条目（p.term-note）：桌面专属呈现（<1280 隐藏、走抽屉），
   样式全部收进 ≥1280——隐藏态的 computed 字号保持正文继承（≥16px），不碰手机字号断言 */
@media (min-width: 1280px) {
  html[data-skin] body:has([data-reading-body]) article p.term-note {
    font-family: var(--font-ui);
    font-size: var(--fs-14);
    line-height: 1.7;
    color: var(--note);
    border-left: 3px solid transparent;
    border-top: 1px dashed var(--border);
    padding: var(--space-2) 0 0 var(--space-2);
    margin: var(--space-3) 0;
    cursor: pointer;
  }
  html[data-skin] body:has([data-reading-body]) article p.term-note .term-note-head {
    font-family: var(--font-kai);
    color: var(--text);
    font-weight: 400;
    border-bottom: 1px dotted var(--note); /* 词典组记号：点线，与正文 .term--internal 同族 */
    padding-bottom: 1px;
  }
  html[data-skin] body:has([data-reading-body]) article p.term-note .term-note-def { display: block; margin: var(--space-1) 0 0; }
}
/* 对应高亮：词典条目与原文注同一套应答（U96 口径：只变色不改宽，零重排） */
html[data-skin] body:has([data-reading-body]) p.term-note.fn-note--hit {
  background: var(--accent-weak);
  border-left-color: var(--accent);
  transform: translateX(-8px);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
}
/* 正文词典划线被点/被悬停时的应答（与 .fn-ref--hit 同法，只变色不重排） */
.term--internal.term--hit { background: var(--accent-weak); box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent); }
.term--internal { transition: background-color .3s ease-out, box-shadow .2s ease-out; }
.term--internal.term--hit { transition: none; }
/* <1280 边栏条目一律不显示（手机走抽屉；未配对原文注保持行内不丢） */
@media (max-width: 1279px) {
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note { display: none; }
}

/* ---- 2 · 注折叠（#7 注太多）：限高只露前几行 + 尾部 ⋯ 提示；点条目/点划线展开；
   placeNotes 用折叠后高度算，密簇不挤压；展开/收起由 ResizeObserver 重排（既有机制）。
   只作用 ≥1280 边栏条：手机行内未配对注不折叠（文字零遮挡） ---- */
@media (min-width: 1280px) {
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note.fn-clamp,
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note.fn-clamp {
    max-height: 8.5em; /* 约 5 行（1.7 行高），余下折叠 */
    overflow: hidden;
  }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note.fn-clamp::after,
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note.fn-clamp::after {
    content: "⋯ 展开";
    display: block;
    font-family: var(--font-ui);
    color: var(--accent);
    padding-top: var(--space-1);
  }
}

/* ---- 3 · 组多选开关（#8 → U101 重构）：U98 的右栏常驻 chips 条（.annot-bar，sticky 浮层）已退役——
   随滚动跟手压住边栏注/正文，按用户原话「归到设置里」；开关现在 = 设置面板行
   （initSkin 建，data-annot-chip 复用 chipSync 同步）+ 手机注抽屉头部 chips（开抽屉才出现）。
   .annot-chip 样式保留（抽屉头部在用）；组关时 html[data-annot-*-off] 隐藏对应组条目（运行时重排链条） ---- */
.annot-chip {
  min-height: 32px;
  padding: 0 var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--bg-elevated);
  color: var(--text-secondary);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  cursor: pointer;
  white-space: nowrap;
}
.annot-chip[aria-pressed="true"] { color: var(--text); border-color: var(--accent); }
.annot-chip[aria-pressed="false"] { opacity: .55; }
.annot-chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* U101：设置面板里的两组注释开关行（复用 menu-btn + aria-pressed，按压态与 chips 同口径） */
.skin-menu .menu-btn[data-annot-chip] { text-align: left; }
.skin-menu .menu-btn[data-annot-chip][aria-pressed="true"] { color: var(--accent); }
.skin-menu .menu-btn[data-annot-chip][aria-pressed="false"] { color: var(--text-secondary); opacity: .7; }
html[data-annot-terms="off"] [data-reading-body] > p.term-note { display: none !important; }
html[data-annot-notes="off"] [data-reading-body] > p.fn-note--linked { display: none !important; }

/* ---- P1-1 · 边注默认不常驻（读者原话：「边注常驻、无法关闭」「用户要的是点击出现」）----
   ≥1280 桌面边注列（原文注 p.fn-note + 辞典条 p.term-note）默认不显示：点正文划线/术语
   才出对应注释（P0-1 贴词弹层，自带 ✕ 关闭钮）；「查看全部注」走弹层内入口 → 抽屉。
   display:none 与 <1280（03-terms-fnrefs.css）/浮层开着（sheet.css）同一口径——注仍在 DOM
   一条不丢（U121 收编口径，抽屉全量可达）。不用 visibility:hidden：幻影盒会被浏览器
   滚动锚定选中，开浮层时底层页被甩出万像素（u120-check 1280 档 B 项实测挂）。
   组开关（data-annot-*-off）语义不变。 ---- */
@media (min-width: 1280px) {
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note,
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note {
    display: none;
  }
}

/* ---- 4 · 栏宽标尺（#6，Word 式）：≥1280 且 html[data-ruler="on"] 才显示；sticky 在正文列顶
   （负边距外挑覆盖三栏，宽度随 --w-toc/--w-note），两把手拖拽（role=slider + 方向键），手机不显示；
   sticky top 由 JS 按页头实际高度同步（不盖顶栏/不顶出常驻控件） ---- */
.col-ruler { display: none; }
@media (min-width: 1280px) {
  html[data-skin][data-ruler="on"] body:has([data-reading-body]) [data-reading-body] > .col-ruler {
    display: flex;
    position: sticky;
    top: var(--u98-header-h, 72px);
    z-index: 9; /* chips 条 z-8 之上：两 sticky 相遇时标尺在上 */
    align-items: stretch;
    justify-content: space-between;
    gap: 0;
    height: 36px;
    margin: 0 calc(-3rem - var(--w-note, 16rem)) var(--space-2) calc(-3rem - var(--w-toc, 16rem));
    padding: 0 3rem; /* 回挑两道气口，内部段落与三栏对齐 */
    box-sizing: border-box;
    background: var(--bg-elevated);
    border-bottom: 1px solid var(--border);
    font-family: var(--font-ui);
    font-size: var(--fs-14);
    color: var(--text-secondary);
  }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-seg {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2);
    overflow: hidden;
    white-space: nowrap;
  }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-seg[data-ruler-seg="toc"] { width: var(--w-toc, 16rem); flex: none; margin-left: -3rem; padding-left: 3rem; box-sizing: border-box; }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-seg[data-ruler-seg="note"] { width: var(--w-note, 16rem); flex: none; margin-right: -3rem; padding-right: 3rem; box-sizing: border-box; }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-seg--body { flex: 1; }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-seg b { color: var(--text); font-weight: 400; }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-val { color: var(--note); font-variant-numeric: tabular-nums; }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-hd {
    align-self: center;
    flex: none;
    width: 14px;
    height: 24px;
    min-height: 24px;
    min-width: 14px;
    margin: 0 var(--space-1);
    padding: 0;
    border: 1px solid var(--border);
    border-radius: var(--radius-icon);
    background: var(--bg);
    color: var(--note);
    cursor: col-resize;
    font-size: 10px;
    line-height: 1;
    touch-action: none;
  }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-hd:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
  html[data-skin] body:has([data-reading-body]) [data-reading-body] > .col-ruler .col-ruler-hd:hover { border-color: var(--accent); color: var(--accent); }
}

/* ---- 5 · 手机注抽屉（#5 手机照 Web）：右侧滑入、两组直接展示、视口内不顶出；
   点正文划线（词典点线/注实线均可）→ 抽屉开到对应条；chips 同款多选 ---- */
.annot-overlay {
  position: fixed;
  inset: 0;
  z-index: 64;
  background: color-mix(in srgb, var(--text) 24%, transparent);
  opacity: 0;
  transition: opacity .25s ease-out;
}
.annot-overlay.open { opacity: 1; }
.annot-drawer {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 65;
  width: min(24rem, 92vw);
  box-sizing: border-box;
  background: var(--bg);
  border-left: 1px solid var(--border);
  box-shadow: var(--shadow-2);
  transform: translateX(102%);
  transition: transform .3s ease-out;
  display: flex;
  flex-direction: column;
}
.annot-drawer.open { transform: translateX(0); }
.annot-drawer-head {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-3);
  border-bottom: 1px solid var(--border);
  background: var(--bg-elevated);
}
.annot-drawer-head b { font-family: var(--font-kai); font-weight: 400; color: var(--text); white-space: nowrap; }
.annot-drawer-head .annot-chip { min-height: 36px; white-space: nowrap; }
.annot-drawer-close {
  margin-left: auto;
  min-width: 44px;
  min-height: 44px;
  border: 0;
  background: none;
  color: var(--text-secondary);
  cursor: pointer;
}
.annot-drawer-close:hover { color: var(--text); }
.annot-drawer-body { overflow-y: auto; -webkit-overflow-scrolling: touch; padding: var(--space-2) var(--space-3) var(--space-8); }
.annot-drawer section[hidden] { display: none; }
.annot-group-title {
  font-family: var(--font-kai);
  font-size: var(--fs-16);
  font-weight: 400;
  color: var(--text);
  margin: var(--space-3) 0 var(--space-2);
}
.annot-item { border-top: 1px dashed var(--border); padding: var(--space-2) 0; }
.annot-item-head {
  display: block;
  width: 100%;
  min-height: 44px;
  border: 0;
  background: none;
  padding: 0;
  text-align: left;
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  color: var(--text);
  line-height: 1.6;
}
.annot-item--term .annot-item-head b { font-family: var(--font-kai); font-weight: 400; border-bottom: 1px dotted var(--note); }
.annot-item--note .annot-item-head b { color: var(--note); }
.annot-item-head .annot-item-preview { color: var(--text-secondary); font-size: var(--fs-14); }
.annot-item-body { padding: var(--space-1) 0 0; font-size: var(--fs-16); color: var(--text); line-height: 1.7; }
.annot-item-body .term-note-ext { color: var(--accent); font-family: var(--font-ui); font-size: var(--fs-14); }
.annot-item-loc {
  margin-top: var(--space-2);
  min-height: 44px;
  border: 1px solid var(--border);
  border-radius: var(--radius-icon);
  background: none;
  color: var(--accent);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  padding: 0 var(--space-3);
  cursor: pointer;
}
.annot-item-loc:hover { border-color: var(--accent); }
.annot-item.annot-item--hit { background: var(--accent-weak); box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent); }
@media (prefers-reduced-motion: reduce) {
  .annot-drawer, .annot-overlay { transition: none; }
}

/* ---- A13(左) · 桌面 ROOT 态（≥1280、无浮层）左栏唤起的抽屉只占左半区 ----
   用户原话（U5-B）：「“显示全部注释”面板现在跑到最右并覆盖整页 ⇒ 应只占左半边」。
   改前：抽屉基则 right:0（右缘贴视口右）＋蒙层 inset:0 盖全页，而桌面 ROOT 态没有
   .sheet-layer.open，U122 B/U129 的左半规则（都挂在 body:has(.sheet-layer.open) 上）
   全不命中 ⇒ closing-check A13(左) 实测抽屉 x=1056..1440、蒙层 0..1440。
   改法：ROOT 态 data-side="left"（drawerOpenAll 依弹层 data-from 记录，左栏唤起恒 left）
   改锚左缘：x≥0、宽 min(24rem, 50vw) ⇒ 右缘 ≤ 视口一半 ≤ 浮层左缘（判据
   right ≤ 736@1440）；关态 -100vw 完整退出左缘（U128 口径：display:flex 打穿 hidden、
   可见性全靠 transform，-110% 在 1440 档露 314px 的教训）；蒙层同步收进左半
   （右半可读可点，与 U122 B scrim 只盖一侧同一口径）。
   不碰邻票：浮层开着（body:has(.sheet-layer.open)）不命中本块，U122 B（贴浮层左缘）/
   U129（右栏贴右缘）照旧；data-side="right" 也不命中；<1024 手机照旧（右缘滑入）。 ---- */
@media (min-width: 1280px) {
  body:not(:has(.sheet-layer.open)) .annot-drawer[data-side="left"] {
    right: auto;
    left: 0;
    width: min(24rem, 50vw);
    transform: translateX(-100vw);
  }
  body:not(:has(.sheet-layer.open)) .annot-drawer[data-side="left"].open { transform: translateX(0); }
  body:not(:has(.sheet-layer.open)) .annot-overlay[data-side="left"] { right: 50%; }
}

/* ==== U115 · 宽度调整 + 目录压缩（用户 10-29：横向统一太窄、内容展示不全；目录要紧凑）==== */
/* ① 含表格的文档页（课程大纲等）：正文列 42rem→48rem（构建期在 <html> 打 data-wide-tables），
   ≥1440 目录/注栏回 16rem 换正文 48rem —— 大纲表格（实测最宽 744px）桌面不再横向滚动。
   栏宽标尺（U98）拖拽仍写 inline --w-toc/--w-note，始终压过这里的默认值。 */
html[data-wide-tables] { --w-body: 48rem; }
@media (min-width: 1440px) { html[data-wide-tables] { --w-toc: 16rem; --w-note: 16rem; } }
/* ② 栅格内正文/页头改随轨道拉伸（去掉 margin-inline:auto 造成的 fit-content 定宽）——
   修 1280 视口三栏溢出：改前 article 固守 42rem=672px 而轨道只有 608px，边栏注右缘 1312 > 视口
   （docSW 1312，注被裁 32px）；改后正文随轨道（1280 档 608px），注栏完整，1440 档像素不变。 */
@media (min-width: 1024px) {
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) > article,
  html[data-skin] body:has([data-reading-body]) main:has(> .toc) .page-head {
    margin-inline: 0;
    max-width: none;
  }
}
/* U116 · 栈式浮层导航（sheet）样式 —— 点站内链接不整页跳转，从右推入一层浮层页。
   用户 2026-10-29：半页面浮出、左边内容藏起、多层叠盖、倒回也要放动画、层数要控制。
   口径（领导已定）：桌面宽 68%（左侧露 32%）；手机 88%（露一条，知道后面还有东西）；
   推入＝从右滑入 + 底层轻微左移并变暗（每层 scrim 叠加）；回退＝同一过渡反向播放；
   动效直接开，不设开关；prefers-reduced-motion 不适用（沿用 U103c 既定决定）。
   结构决策：浮层页＝单栏（页题 + 原生 details 目录 + 正文含内联注）——
   68% 宽再切桌面三栏每栏过窄；details 原生收纳零 JS（贴合「目录压缩」反馈）；
   注释内联流式，不复制 placeNotes/initFnRefs 落位机制（reading.js 为本批独占热点文件）。
   本文件只写浮层自身与底层位移；不改 base/reading/skins（他票占用中）。 */

/* U120（用户 10-29 追加）：左半要真能读——
   桌面浮层不再固定 68%，改「给正文列让位」：宽度 = 视口 − 正文列(42rem) − 主体左右衬距(64px)，
   下限 320px（浮层自己也要能读），上限 50%（宽屏不倒挂）；实测 1440/1280 档左栏都保得住整列 672px。
   768–1023 维持 68%（窄层不做左右同看，判据只按 ≥1024 验收）。 */
:root {
  --sheet-w: 88%; /* 手机：88%，左侧露一条 */
  --sheet-dur: 320ms;
  --sheet-ease: cubic-bezier(0.32, 0.72, 0.24, 1); /* iOS 风推入曲线 */
}
@media (min-width: 768px) {
  :root { --sheet-w: 68%; } /* 窄桌面：68% */
}
@media (min-width: 1024px) {
  :root { --sheet-w: clamp(320px, calc(100% - 42rem - 64px), 50%); } /* 桌面：给左栏正文列让位（U120） */
}

/* ---- 浮层层容器：全视口 fixed，DOM 序即叠层序（后开的在上） ---- */
.sheet-layer {
  position: fixed;
  inset: 0;
  z-index: 80; /* 高于顶栏(40)/抽屉(40)/术语弹层(60)/注抽屉(64-65)，低于 skip-link(100) */
  pointer-events: none; /* U120：容器不挡点击——桌面左半是活页面（可滚可点可开下一层）；
                           交互仍由 scrim/sheet 自己接（手机左半由全幅 scrim 兼住，点暗处关层不变） */
}
.sheet-scrim, .sheet-layer .sheet { pointer-events: auto; }

/* ★U186/A13（2026-10-31 领导定）：**被埋层的 .sheet 整体不吃点击**。
   来路：合入两栏新模型后，被埋层的 .sheet 覆盖到 [672,1392]（跨过中缝），它的正文/目录子树会把本该落在
   「顶层右栏」或「左栏底文档」上的点击截住 ⇒ `closing-check` A13 的 page.click 30s 超时、进程被打死。
   读者体验上同理：被埋层只露中缝一条素纸带，正文本来就不可读，没有理由让它抢点击。
   关闭/回到该层仍走：本层 ✕（被埋时隐藏）／浏览器后退／本栏栏头「全部关闭」。 */
.sheet-layer[data-buried] .sheet { pointer-events: none; }
.sheet-scrim {
  position: absolute;
  inset: 0;
  background: color-mix(in srgb, var(--text) 32%, transparent);
  opacity: 0;
  transition: opacity var(--sheet-dur) var(--sheet-ease);
}
.sheet {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: var(--sheet-w);
  max-width: var(--sheet-w);
  display: flex;
  flex-direction: column;
  background: var(--bg);
  border-left: 1px solid var(--border);
  /* U136：右缘内嵌 1px 细线——摞里每层的露边边界可数（改前只有 box-shadow，素缝看不出层界）。
   U140 · 票A「庄重学佛道场」：单根 14% 灰线是科技产品 demo 的缝，改「书口」三层语言——
   ① 细线提纯到 16%（纸缘裁切线，更清晰＝「一摞」读得出来）；
   ② 右缘内晕 9%（inset 负 spread，读作纸页回折，不是被裁断的字）；
   ③ 左缘向下的软纸影 -18px（上层压下层的深度，摞叠有了体积）；
   影色全从 --text 混出（墨色纸），不引新色。 */
  box-shadow:
    var(--shadow-2),
    -18px 0 36px -14px color-mix(in srgb, var(--text) 20%, transparent),
    inset -1px 0 0 color-mix(in srgb, var(--text) 16%, transparent),
    inset -7px 0 16px -9px color-mix(in srgb, var(--text) 9%, transparent);
  transform: translateX(102%); /* 关闭态：停在右缘外 */
  /* U136：过渡只留 transform（+scrim 自己的 opacity）——改前 margin-right/width 也在过渡里，
     逐帧 layout，整栏正文每帧重排＝掉帧主因（实测变化跨 408–498ms > 配置 320ms） */
  transition: transform var(--sheet-dur) var(--sheet-ease);
  will-change: transform;
}
.sheet-layer.open .sheet-scrim { opacity: 1; }
.sheet-layer.open .sheet { transform: none; }
/* 被上层盖住的浮层「浮到左边去」：<1024 逐层错位（U136：改前全部同 -24 完全重叠，
   手机上整摞只见一张脸＝看不出撨了几份；改后桩顶 -28、更旧 -56，每层露 28px 带字缝的边）；
   ≥1024 见文件尾 U136：整层 transform 平移到左半＋逐层露 48px 边。 */
.sheet-layer.open[data-buried] .sheet {
  transform: translateX(-28px);
  /* U140 · 票A：被埋层底色微退（墨 3% 混入）——纸压纸，露出的带子一眼是「下面还有一张」，
     与上层 scrim 叠暗同向；桌面左半无 scrim（U120 只盖浮层侧），靠这里补出层次 */
  background: color-mix(in srgb, var(--text) 3%, var(--bg));
}
.sheet-layer.open[data-buried]:not(:nth-last-child(1 of .sheet-layer[data-buried])) .sheet { transform: translateX(-56px); }

/* P2②（读者手机 #2c：叠层左缘残留旧层碎字）：被埋层左移露出的是它自己的左缘 28px，
   而内容内边距仅 16px —— 露出带里是上一层的被裁碎字，读者读作「没清干净」。改法：
   被埋层左缘 32px 铺一条与被埋层底色同源的素纸「书口」带（伪元素盖在内容上），
   露出带变成素纸＋原有左缘细线，字不进带；≥1024 不受影响（左右同看的是整页阅读面，
   且桌面被埋层露的是右缘边，见文件尾 U136）。 */
@media (max-width: 1023px) {
  .sheet-layer.open[data-buried] .sheet::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 32px;
    background: color-mix(in srgb, var(--text) 3%, var(--bg));
    z-index: 1; /* 盖过静态流的正文，不挡 head 交互（书口带在 .sheet 内左缘，head 的 ✕ 在右缘） */
  }
}

/* P2③（读者桌面 #3：顶部并排 3 个 X）：多层叠盖时被埋层整层平移到左半/露出带，
   它们的 sheet-head 连同关闭钮也跟着露出来——顶层、桩顶、更旧层三个 ✕ 顶部一字排开，
   读者不知点哪个。改法：被埋层 ✕ 退场（visibility 不拆布局、pointer-events 拒点），
   只保留顶层浮层自己的 ✕（关层本来就只从顶往下关；U120 左半照常可读可点，
   点左栏链接开新层的路径不变）。 */
.sheet-layer[data-buried] .sheet-close {
  visibility: hidden;
  pointer-events: none;
}

/* U120 B/C：贴词小弹层（术语/注释共用 .term-layer 基底）必须浮在浮层页之上，
   否则点了「看不见」＝用户说的「点不开」（改前 z 60/65 全被浮层 80 压住，实测复现）。 */
[data-term-layer] { z-index: 85; }

/* U146：浮层内「目录 · 设置」入口签（P0-2：首页/落地页起点的浮层无任何把手——底文档无
   .reading-tools，U137 的 z 84 侧签不存在）。复用 .entry-fab 皮肤（竖排、胶囊、毛玻璃），
   贴顶层浮层自身右缘（absolute 于 .sheet，层关即随层走）；面板 z 95 已高于浮层（U137）。
   P0-5（用户 10-30：「一个按钮服务整页，不是每层各一个」）：入口签只留在顶层浮层上——
   被埋层的一律退场（面板是全局态，多枚同屏＝读者不知哪枚管哪层）；
   顶层被关后 unburyTop 摘 data-buried，次顶层自己的签自然回位。 */
.entry-fab--sheet {
  position: absolute;
  right: 0;
  top: 42%;
  z-index: 5;
}
.sheet-layer[data-buried] .entry-fab--sheet {
  visibility: hidden;
  pointer-events: none;
}

/* 浮层头：页题 + ✕（每层都有可见关闭方式；44px 触达目标） */
.sheet-head {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-3) var(--space-2) var(--space-4);
  border-bottom: 1px solid var(--border);
  background: var(--bg);
  flex: none;
}
.sheet-title {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  /* U140 · 票B：浮层页题回书卷语言——与正文页 h1 同用 --font-display（楷/宋），
     去掉 UI 粗黑（600 sans 是 app 顶栏相，不是讲义页题相）；字号沿用 --fs-18 阶 */
  font-family: var(--font-display);
  font-weight: 400;
  letter-spacing: .02em;
  color: var(--text);
}
.sheet-close {
  flex: none;
  width: 44px;
  height: 44px;
  border: 0;
  border-radius: 999px;
  background: none;
  color: var(--text-secondary);
  font-size: var(--fs-18);
  cursor: pointer;
}
.sheet-close:hover { background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text); }

/* U161 · 「放大为正文」钮（手机）：顶在 ✕ 左侧，44px 触达目标（playwright <44 红线）；
   桌面 ≥1024 不提供（用户说的是手机，桌面行为零改动）；被埋层同 ✕ 的 P2③ 口径退场。 */
.sheet-zoom {
  flex: none;
  min-width: 44px;
  height: 44px;
  padding: 0 12px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: none;
  color: var(--text-secondary);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  cursor: pointer;
  white-space: nowrap;
}
.sheet-zoom:hover { color: var(--text); border-color: color-mix(in srgb, var(--text) 35%, var(--border)); }
@media (min-width: 1024px) { .sheet-zoom { display: none; } }
.sheet-layer[data-buried] .sheet-zoom { visibility: hidden; pointer-events: none; }

/* U161 · 放大后（data-zoomed）：这层就是正文本身——铺满全宽、去浮层相
   （左缘线/书口影/scrim），不再是堆叠层；钮退场（已是正文，无须再放大），
   ✕ 保留（关了回装载时正文，后退语义不变）。 */
.sheet-layer[data-zoomed] .sheet {
  width: 100%;
  max-width: 100%;
  border-left: 0;
  box-shadow: none;
}
.sheet-layer[data-zoomed] .sheet-scrim { display: none; }
.sheet-layer[data-zoomed] .sheet-zoom { display: none; }

/* 浮层体：独立滚动容器（不与底层页面串滚） */
.sheet-scroll {
  flex: 1;
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
}
.sheet-page {
  max-width: 46rem;
  margin: 0 auto;
  /* U140 · 票C：手机底部留出安全区（home indicator 不压末行；桌面 env=0 无影响） */
  padding: var(--space-6) var(--space-4) calc(var(--space-6) + env(safe-area-inset-bottom));
}

/* 浮层内目录：原生 details 收纳（压缩展示，无 JS；默认收起） */
html[data-skin] body:has([data-reading-body]) .sheet .toc {
  position: static;
  width: auto;
  transform: none;
  margin: 0 0 var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-card, 14px);
  background: var(--bg-elevated, transparent);
}
html[data-skin] body:has([data-reading-body]) .sheet .toc summary { cursor: pointer; }
html[data-skin] body:has([data-reading-body]) .sheet .toc ol { margin: 0; padding-left: var(--space-4); }

/* U122（用户 10-29 追加）·A：浮层内注释改回「点击才出现」——默认不铺开。
   用户原话：「右侧的注释又放到正文里了，完全可以做成和原来一样，点击才出现」。
   根因登记（查清非猜测）：铺开不是 U121 的 --linked 收编造成——U116 起
   `.sheet p.fn-note{display:block}` 就对每条注生效（内联流式决策），U120/U121 沿用未动。
   改法：display:none——注仍在 DOM 一条不丢（U121 收编注全带 data-fn-note，
   「查看全部注」抽屉全量可达）；点划线 → 贴词弹层就地出现（reading.js activate 分流）。
   U148：去掉 body:has([data-reading-body]) 门——首页/落地页起点（底文档无阅读体）的
   浮层同样适用，否则浮层内注回退成 U116 的 display:block 全量内联直出（desktop-run2 #3/#13，
   589 条注全部平铺，与整页「点击才出现」两套口径）。 */
html[data-skin] .sheet p.fn-note,
html[data-skin] .sheet p.term-note {
  display: none;
}
html[data-skin] .sheet [data-sheet-body] { position: static; }
/* U120：浮层内辞典条目 <1280 的 display:none 一并覆盖（和 fn-note 同口径，内容零丢）；
   U148：去 :has 门同上（首页起点浮层同口径） */
html[data-skin] .sheet p.fn-note.fn-clamp,
html[data-skin] .sheet p.term-note.fn-clamp { max-height: none; overflow: visible; }
html[data-skin] .sheet p.fn-clamp::after,
html[data-skin] .sheet p.term-note.fn-clamp::after { content: none; }

/* ---- U139 · A4 注释折叠要「看得出折叠过」（用户：「折叠了也看不出来…最好不要直接截断，
   能有一些样式上的处理」；S3 建议：复用站内 fn-clamp 8.5em＋「⋯ 展开」既有模式＋渐变收尾，
   不发明新交互）---- */
/* ① 抽屉注体：展开后限高 8.5em（与边栏注 fn-clamp 同口径），超出部分渐变淡出而非生硬断掉；
   「⋯ 展开」钮叠在渐变上（08b bodyClampSync 量到超出才加 .annot-clamp），点开看全文。
   基座 .annot-item-* 规则在 05-u98-notes.css（U137 独占不碰），故这里落 sheet.css。 */
html[data-skin] body:has([data-reading-body]) .annot-item-body.annot-clamp {
  position: relative;
  max-height: 8.5em;
  overflow: hidden;
  background-image: linear-gradient(180deg, transparent 0, transparent calc(100% - 3.2em), var(--bg) 100%);
}
html[data-skin] body:has([data-reading-body]) .annot-expand {
  position: absolute;
  right: 0;
  bottom: 0;
  min-height: 28px;
  padding: 0 0 0 var(--space-4);
  border: 0;
  background: linear-gradient(90deg, transparent, var(--bg) 45%);
  color: var(--accent);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  cursor: pointer;
}
/* ② 预览不再 JS 18 字硬截断——全文进预览、CSS 单行省略（出处下一行），外观仍收敛 */
html[data-skin] body:has([data-reading-body]) .annot-item--note .annot-item-head .annot-item-preview {
  display: block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* ③ 桌面边栏注（≥1280 fn-clamp）：已有「⋯ 展开」，补渐变收尾（S3 中问题「边栏注无渐变」，
   最后一句不生硬断掉）；只叠渐变一层，随三主题 --bg 走。 */
html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.fn-note.fn-clamp,
html[data-skin] body:has([data-reading-body]) [data-reading-body] > p.term-note.fn-clamp {
  background-image: linear-gradient(180deg, transparent 0, transparent calc(100% - 3.2em), var(--bg) 100%);
}

/* ---- U116b 手机释义聚焦态：抽屉默认只露点中一条，「显示全部释义（N）」点了才铺开 ---- */
html[data-skin] body:has([data-reading-body]) .annot-drawer[data-focus] .annot-item { display: none; }
html[data-skin] body:has([data-reading-body]) .annot-drawer[data-focus] .annot-item[data-revealed] { display: block; }
html[data-skin] body:has([data-reading-body]) .annot-drawer[data-focus] .annot-group-title { display: none; }
.annot-showall:not([hidden]) {
  display: block;
  width: 100%;
  min-height: 44px;
  margin: 0 0 var(--space-2);
  padding: 0 var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: none;
  color: var(--text-secondary);
  font-size: var(--fs-14);
  text-align: center;
  cursor: pointer;
}
.annot-showall:not([hidden]):hover { color: var(--text); border-color: color-mix(in srgb, var(--text) 35%, var(--border)); }

/* 底层页面配合（<1024：浮层 68/88% 盖住大半，维持 U116 口径：锁滚动、左移、变暗由 scrim 承担）---- */
main > .page-head,
main > article,
main > .segnav {
  transition: transform var(--sheet-dur) var(--sheet-ease);
}
@media (max-width: 1023px) {
  html[data-sheet-open] main > .page-head,
  html[data-sheet-open] main > article,
  html[data-sheet-open] main > .segnav {
    transform: translateX(-24px);
    will-change: transform;
  }
  /* 浮层打开期间锁底层滚动（浮层自己滚，overscroll-behavior 兜住链式滚动） */
  html[data-sheet-open] body { overflow: hidden; }
}

/* ==== U120 · 桌面（≥1024）左右同看：底层重排进左半，不缩不暗可滚动可点 ====
   用户 10-29：「右侧出来之后左侧就看不了了，应该做到左右两侧能同时看」。做法：
   ① 浮层宽度给正文列让位（--sheet-w clamp，见文件头）；
   ② 底层 body 右侧让出浮层宽度 → 正文列整个重排进左半（不是露一条缝）；
   ③ 目录列/边栏注收起（68% 时代它们反正被盖住；注交互走划线弹层，见 reading.js activate 分流）；
   ④ 不锁滚动、不加 inert、scrim 只盖浮层一侧 —— 左半真的可读可滚可点。 */
@media (min-width: 1024px) {
  html[data-sheet-open] body { padding-right: var(--sheet-w); }
  /* 目录列收起：左半装不下三栏，正文独占（浮层页自带 details 目录，导航不丢）。
   子元素的 grid-column: 2（U56 分栏）一并归位到第 1 列，否则隐掉目录列后正文被挤进隐式轨道。
   用 :root 前缀压过 reading.css 同位规则（:root(0,1,0)+attr(0,1,0) 比 html[data-skin] 多一级 class 位，
   实测 1440 档不加就输给 `> * { grid-column: 2 }`，正文列被挤成 0 宽）。 */
  :root[data-sheet-open] body:has([data-reading-body]) main:has(> .toc) { grid-template-columns: minmax(0, var(--w-body, 42rem)); }
  :root[data-sheet-open] body:has([data-reading-body]) main:has(> .toc) > * { grid-column: 1; }
  :root[data-sheet-open] body main > .toc { display: none; }
  /* 边栏注/辞典条收起（绝对定位会探进浮层底下；要看注点划线，弹层贴词开） */
  :root[data-sheet-open] body:has([data-reading-body]) [data-reading-body] > p.fn-note,
  :root[data-sheet-open] body:has([data-reading-body]) [data-reading-body] > p.term-note { display: none; }
  /* 旧口径的左移 24px 退场：重排代替位移，正文不再斜着眼看 */
  html[data-sheet-open] main > .page-head,
  html[data-sheet-open] main > article,
  html[data-sheet-open] main > .segnav { transform: none; }
  /* scrim 只盖浮层一侧：左半不蒙灰（要读字），点左半也不误关浮层（左半是活页面） */
  .sheet-scrim { left: calc(100% - var(--sheet-w)); }
}

/* ---- U120：贴词弹层里的「查看全部注（N）」入口钮（显式开抽屉，U121 无锚注手机唯一可达路径） ---- */
.term-layer .pop-all {
  display: block;
  width: 100%;
  min-height: 44px;
  margin: var(--space-2) 0 0;
  border: 1px dashed var(--border);
  border-radius: var(--radius-pill);
  background: none;
  color: var(--text-secondary);
  font-size: var(--fs-14);
  cursor: pointer;
}
.term-layer .pop-all:hover { color: var(--text); border-color: color-mix(in srgb, var(--text) 35%, var(--border)); }

/* ==== U122 · B：「显示全部注/释义」抽屉只占左半边（≥1024 且浮层开着）====
   用户原话：抽屉「跑到了最右侧，并且覆盖住了整个页面。它应该只占左半边，不要占到最右侧」。
   改法：抽屉贴浮层左缘（right: var(--sheet-w)），宽度不出左半；
   蒙层同步收进左半（浮层侧不蒙灰，与 U120 scrim 只盖一侧同一口径）。
   <1024 与无浮层场景维持原状（手机 92vw 抽屉、桌面无浮层不经抽屉）。 */
@media (min-width: 1024px) {
  body:has(.sheet-layer.open) .annot-drawer {
    right: var(--sheet-w);
    width: min(24rem, calc(100% - var(--sheet-w)));
    /* 关态停靠位同步改：原 translateX(102%) 以自身宽为基准，right 挪到浮层左缘后
       102% 只推到 x≈浮层内 —— 看不见的关态抽屉会挡住浮层划线点击（u120-check 循环
       点击实抓 elementFromPoint=annot-drawer-body）。改从左缘外滑入。
       U128：-110% 不够退出屏外——抽屉关态停 x=(100%-sheet-w-W)..(100%-sheet-w)，
       -110% 只左移 1.1W，1440 档还剩 x=0..314 露在屏上（.annot-drawer{display:flex}
       打穿 hidden 属性，可见性全靠 transform；用户实测「点完注释左侧自动冒出全部
       列表还关不掉」＝这个没关严的抽屉，✕/点外都走 drawerSet(false) 状态无变化）。
       改 -100vw：位移 ≥ 全视口宽，任何档位完整退出左缘，滑入动画不变。 */
    transform: translateX(-100vw);
  }
  body:has(.sheet-layer.open) .annot-drawer.open { transform: translateX(0); }
  body:has(.sheet-layer.open) .annot-overlay { right: var(--sheet-w); }
}

/* ==== U122 · D：右层点跳 → 原浮层「移到左面」＝左右对照（≥1024）====
   用户原话：「右侧的内容应该移到左面，代表现在是新的对照了，然后再把刚才点击的
   新文章浮现在右侧」——要能同时比较两个内容。改前：被埋层只左移 24px、仍挤在右半，
   被新顶层完全盖住＝没法比较。改法：被埋层整层平移到左半（margin-right 动画，
   百分比相对浮层容器＝含滚动条的视口宽，左缘正好贴 0）；左＝原来的，右＝新点的。
   栈语义不变：关顶层 → 次顶层回右半（动画反向同一条过渡），再下一层补位左半。
   <1024 维持 24px 让位（窄屏不做左右同看，同 U120 口径）。

   ==== U129 · 左栏一摞（模型 B：左右各自可堆叠）====
   用户确认模型 B 逐字：「有了右侧后，点击左侧的链接应该是在右侧的堆叠；点击右侧后应该是
   右侧的移动到左侧堆叠，右侧的更新」。改前（U122 D）：被埋层全部同缘 [0,736] 完全重叠，
   只看得到最上一份＝看不出左栏摞了几份。改法：被埋层逐层露边——桩顶（最晚被埋）右缘收
   48px，更旧的逐层多 24px，右缘从底下露出一条；最底下主页也露 24px＝一摞几份可数。
   所有被埋层右缘 ≤ 浮层左缘（U122 [0,736]/[736..] 严丝合缝不破坏）；unbury 回右半
   仍是同一条过渡反向播放。

   ==== U136 · 撑叠看得见 + 动画只走合成器（2025 用户：左/右撨都不明显；动画不流畅）====
   改前：被埋层用 margin-right+width 收边（桩顶 48/更旧 24）——两属性都在 transition 里，
   逐帧 layout，整栏正文每帧重排（实测变化跨 408–498ms、最大帧隙 139ms）；且更旧层只露
   24px 素缝、撨在屏上读起来还是一张脸。
   改法（宽度/边距永不变，过渡只留 transform，零重排）：
   - 桩顶（最晚被埋）收进顶层下面、更旧层右缘贴浮层左缘露 48px 带字的边（见下 U169 节的现行数值）：
   - 每层右缘 inset 细线（见 .sheet 基规则）逐层可数；scrims 逐层叠加＝越旧越暗（已有）。

   ==== U169 · 桩顶不越右半区（closing-check A12/堆 是唯一红项）====
   改前（P0-5 起）：桩顶 translateX(calc(-100% + 48px)) ⇒ 右缘 = 浮层左缘 **+48px**（越进右半区、
   压在顶层左缘上），closing-check A12/堆 判「一摞不在左半区」红（1440 档实测 [80,784] vs 左缘 736）。
   U136 注释里那句「收进浮层左缘内 48px」写的是 P0-5 **之前**的 U136/U139 实现 translateX(-100%-48px)
   —— 是注释没跟着改号，不是注释写错方向；那次换号是为修「左缘出屏 16px」与「桩顶与顶层之间 48px
   缝露出底页」，代价是越界 48px（两个毛病换位，没消掉）。
   U169 修法（两个毛病一起消，不动 U136 的合成器口径）：
   - 桩顶：把 P0-5 的 +48 改回 −48，并同步收窄 16px（min(浮层宽−16px, 半屏−32px)）——整层位移
     = 自身宽 + 64 ⇒ 右缘 = 浮层左缘 − 48（收进顶层下面＝U136 原意），左缘落在 0（P0-5 的
     左缘出屏不再发生）。1440 档 [0,688]、1280 档 [160,688]、≥1472 档按「半屏−32」收、左缘恒 0；
   - 只有一层被埋时桩顶**不收进**（translateX(-100%) ⇒ 右缘贴浮层左缘）：那种情形下面没有更旧层
     去填 48px 带，收进就会露出底页（P0-5 原话的「48px 缝露底页」）。收进只在「下面还有更旧层」
     时生效（.sheet-layer[data-buried] ~ 兄弟前导选择器），缝由更旧层填住；
   - 更旧被埋层：translateX(-100%) 不变 ⇒ 右缘贴浮层左缘（与顶层无缝），
     在桩顶右侧露 48px 带正文字的边（宽度回到 --sheet-w，U136 口径不变）；
   - 宽度不是过渡属性（只在被埋瞬间取一次），动画仍只有 transform ⇒ 零逐帧重排；
   U129 不变量恢复：全部被埋层右缘 ≤ 浮层左缘（桩顶 688、更旧 736），且逐层露边互不相同。 */
@media (min-width: 1024px) {
  /* 被埋层基准：整层左移自身宽 ⇒ 右缘贴浮层左缘（只有一层被埋时就是这一条＝与顶层严丝合缝）。
     两条写同一个 transform 是必要的：窄屏那条 `:not(:nth-last-child(1 of …)) −56px` 是 0,6,0，
     单靠上面 0,4,0 的基准规则赢不了它（U169 首跑实测更旧层停在 x=680 = −56px）。 */
  /* ★u188（Meta 12:08 裁决，方案 1）：两条加 html:not([data-dual]) 前缀——两栏模式下不再套用
     「整层平移到左半」的旧几何，被埋层由 v2 两栏规则接管、露边留在中缝带（A12/堆）；
     非两栏（单栏/原版浮层堆叠）选择器恒真，行为逐像素不变。 */
  html:not([data-dual]) .sheet-layer.open[data-buried] .sheet,
  html:not([data-dual]) .sheet-layer.open[data-buried]:not(:nth-last-child(1 of .sheet-layer[data-buried])) .sheet {
    transform: translateX(-100%);
  }
  /* 桩顶（DOM 里排在有更旧被埋层之后）：收进 48px + 收窄 16px，缝由更旧层填住 */
  html:not([data-dual]) .sheet-layer.open[data-buried] ~ .sheet-layer.open[data-buried] .sheet {
    width: min(calc(var(--sheet-w) - 16px), calc(50% - 32px));
    transform: translateX(calc(-100% - 64px));
  }
}
/* 浮层开着时抽屉提到浮层之上（显式开抽屉必须看得见；改前 z 64/65 被浮层 80 压住＝点不开的另一半） */
body:has(.sheet-layer.open) .annot-drawer,
body:has(.sheet-layer.open) .annot-overlay { z-index: 82; }

/* ==== U129 · 注释归属 A：每栏自己的注释列挂自己栏内（≥1024）====
   用户选的：「左栏内容的注释列挂在左栏（左侧区域），右栏内容的注释列挂在右栏（右侧区域），
   互不串栏」。改前（U122 B 口径）：「查看全部注/释义」抽屉一律钉左半（right: var(--sheet-w)）
   ——跟着「被埋层平移进左半」的口径走，右栏内容唤起的注释列也跑到左半（实测 1440 档
   抽屉 x=352..736 ＝串栏）。改法：唤起源在右栏（未被埋顶层浮层）时抽屉贴右缘
   （data-side="right"，由 reading 侧 popAllBtn/drawerOpenAll 依弹层 data-from 记录）；
   左栏（主页/被埋层）唤起维持 U122 B 左半口径不变。关态 102% 出右缘（右锚自身宽基准，
   完整出屏；U128 的 -100vw 是左锚口径，右锚不适用）。 */
@media (min-width: 1024px) {
  body:has(.sheet-layer.open) .annot-drawer[data-side="right"] {
    right: 0;
    width: min(24rem, calc(var(--sheet-w) - 24px));
    transform: translateX(102%);
  }
  body:has(.sheet-layer.open) .annot-drawer[data-side="right"].open { transform: translateX(0); }
}

/* ==== u184 · 两栏同级模型（html[data-stack-v2] 门控；原版零改动）====
   用户 10-30 第二轮 8 条（briefs/u184-stack-fit/STATUS.tsv）逐条落成的几何：
   1 两栏同级——双栏时站点页头退场，两栏各有一条 61px 栏头（左 .col-head / 右 .sheet-head），
     同高、同款、同在 y=0；右栏不再"压"在左栏上（双栏下撤掉书口影/圆角/压边，只留 1px 栏界线）。
   2 纵深/中间展开都不要——没有缩放、没有中间展开；就是两栏平铺。
   3 两栏只在讲义→讲义时出现；列表页点讲义＝整页直达（sheet-nav 分流，未动）。
   4 每栏各自一层一层关：每层自己的 ✕；栏头另有「全部关闭」只关本栏。
   5 被埋层露边贴中间：左栏被埋层露在它的右侧、右栏露在它的左侧；栏的目录/设置钮在各栏外缘。
   6/7 目录与设置拆开，目录一键开贴中面板，两栏各一枚、可同开对照。
   8 目录面板（注＝目录）贴靠中间：左栏面板右缘贴中线、右栏面板左缘贴中线。
   几何（两栏，桌面 ≥1024；手机走 U98 单栏原版，本块不生效）：
   - 底文档（左栏正文）重排进左半（body padding-right 50%，U120 同机制），顶部让出栏头高；
   - 左栏层 [0, 50%-peek]，被埋层右移 peek 露在 [50%-peek, 50%] ＝贴中；
   - 右栏层 [50%+peek, 100%]，被埋层左移 peek 露在 [50%, 50%+peek] ＝贴中；
   - scrim 退场（两栏都要能读，不蒙灰；关层由 ✕ / 后退 / 全部关闭承担）。 */
:root { --v2-peek: 48px; --v2-head-h: 61px; }

html[data-stack-v2][data-dual] { --sheet-w: 50%; }
/* 页头退场：两栏各用自己的栏头（这才叫同级；改前右栏头在 y=0、左栏顶着站点页头，看着就是压住） */
html[data-stack-v2][data-dual] .site-header { display: none; }
html[data-stack-v2][data-dual] body { padding-right: 50%; overflow: visible; }
html[data-stack-v2][data-dual] body > main { padding-top: calc(var(--v2-head-h) + var(--space-4)); box-shadow: inset -1px 0 0 var(--border); } /* 中线栏界（栏头以下也看得见） */
/* 底文档（左栏正文）只留正文列；目录走贴中面板 */
:root[data-stack-v2][data-dual] body:has([data-reading-body]) main:has(> .toc) { grid-template-columns: minmax(0, var(--w-body, 42rem)); }
:root[data-stack-v2][data-dual] body:has([data-reading-body]) main:has(> .toc) > * { grid-column: 1; }
:root[data-stack-v2][data-dual] body main > .toc { display: none; }
:root[data-stack-v2][data-dual] body:has([data-reading-body]) [data-reading-body] > p.fn-note,
:root[data-stack-v2][data-dual] body:has([data-reading-body]) [data-reading-body] > p.term-note { display: none; }
html[data-stack-v2][data-dual] main > .page-head,
html[data-stack-v2][data-dual] main > article,
html[data-stack-v2][data-dual] main > .segnav { transform: none; }
/* U229 ④：浮层/两栏打开期间，底文档（左栏）的面包屑退场——它属于底文档，换院后仍显示
   上一院课程名，读者把它当当前页位置＝「面包屑滞留」（诊断：briefs/u229-reader-medium/DIAGNOSIS.md）。
   浮层页自带各自正确面包屑；全关后本条自动失效，底文档面包屑照常回来。 */
html[data-sheet-open] main > .page-head .breadcrumb { display: none; }

/* 左栏栏头：与 .sheet-head 同 padding / 同 44px 钮 / 同底边线（同高由内容定，不写死高度） */
.col-head {
  position: fixed;
  top: 0;
  left: 0;
  width: 50%;
  box-sizing: border-box;
  z-index: 78; /* 低于浮层(80)，高于正文；左栏有层时它退场（那一层的 .sheet-head 顶上来） */
  display: flex;
  align-items: center;
  gap: var(--space-2);
  /* 左内衬让出 48px 车道：外缘的目录/设置竖签不盖页题 */
  padding: var(--space-2) var(--space-3) var(--space-2) calc(var(--space-4) + 48px);
  background: var(--bg);
  border-bottom: 1px solid var(--border);
  border-right: 1px solid var(--border); /* 中线栏界 */
}
/* 栏头里「全部关闭」：与右栏栏头里的同一枚同款（右栏在 sheet.css 与 .sheet-zoom 同尺寸） */
.col-head-all {
  flex: none;
  min-width: 44px;
  height: 44px;
  padding: 0 12px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: none;
  color: var(--text-secondary);
  font-family: var(--font-ui);
  font-size: var(--fs-14);
  cursor: pointer;
  white-space: nowrap;
}
.col-head-all:hover { color: var(--text); border-color: color-mix(in srgb, var(--text) 35%, var(--border)); }
/* 被埋层的头只在露边里露出一条：钮随 ✕ 退场（P2③ 同口径） */
.sheet-layer[data-buried] .col-head-all { visibility: hidden; pointer-events: none; }

/* 两栏几何：右栏 [50%+peek, 100%]，被埋层左移 peek 露边贴中 */
html[data-stack-v2][data-dual] .sheet-layer[data-col="right"] .sheet {
  width: 50%;
  max-width: 50%;
  box-shadow: none;            /* 同级：没有压在被埋层上的投影 */
  border-left: 1px solid var(--border);
}
/* 只有真有被埋层时才让出贴中露边带（data-peek，sheet-nav buryCols 打）；
   改前每栏恒让 48px ⇒ 右栏只有一层时右半凭空多一条空缝。 */
html[data-stack-v2][data-dual] .sheet-layer[data-col="right"][data-peek] .sheet {
  width: calc(50% - var(--v2-peek));
  max-width: calc(50% - var(--v2-peek));
}
html[data-stack-v2][data-dual] .sheet-layer[data-col="right"][data-buried] .sheet {
  transform: translateX(calc(-1 * var(--v2-peek)));
}
/* ★u188（Meta 12:08 裁决方案 1 配套）：右栏被埋层（n≥2）收成中缝带内窄条——
   宽 = peek×2（既有素纸书口带宽，A14/D2 判据原文「48×2 素纸书口」，不随层数变、无新公式）；
   两档错位：更旧层右缘贴中线（right:50% ⇒ [624,720]），最新被埋层右缘贴顶层左缘
   （right:50%−peek ⇒ [672,768]）——整条 rect 落在带内（A12/堆 的 b.right ≤ 顶层左缘）
   且露边互不相同；被 U169 桩顶平移降权后，老模型的 transform 不再把它推到屏幕最左。
   选择器天然只在 n≥2 生效：n=1（唯一被埋）不命中，D2 的 -48px 整层平移原样保留。 */
html[data-stack-v2][data-dual] .sheet-layer[data-col="right"][data-buried]:not(:nth-last-child(1 of .sheet-layer[data-col="right"][data-buried])) .sheet {
  width: calc(var(--v2-peek) * 2);
  max-width: calc(var(--v2-peek) * 2);
  right: 50%;
  transform: none;
}
html[data-stack-v2][data-dual] .sheet-layer[data-col="right"][data-buried] ~ .sheet-layer[data-col="right"][data-buried]:nth-last-child(1 of .sheet-layer[data-col="right"][data-buried]) .sheet {
  width: calc(var(--v2-peek) * 2);
  max-width: calc(var(--v2-peek) * 2);
  right: calc(50% - var(--v2-peek));
  transform: none;
}
/* 左栏：[0, 50%-peek]，被埋层右移 peek 露边贴中（镜像） */
html[data-stack-v2][data-dual] .sheet-layer[data-col="left"] .sheet {
  left: 0;
  right: auto;
  width: calc(50% - var(--v2-peek)); /* 左栏必有被埋层（底文档），恒让露边带 */
  max-width: calc(50% - var(--v2-peek));
  border-left: 0;
  border-right: 1px solid var(--border);
  box-shadow: none;
  transform: translateX(-102%);
}
html[data-stack-v2][data-dual] .sheet-layer[data-col="left"].open .sheet { transform: none; }
html[data-stack-v2][data-dual] .sheet-layer[data-col="left"][data-buried] .sheet {
  transform: translateX(var(--v2-peek));
}
/* u188：左栏镜像窄条（n≥2）：更旧层左缘贴中线（[720,816]），最新被埋层左缘 50%−peek
   （[672,768]）——露边向右递进、互不相同，全落在中缝带右半。 */
html[data-stack-v2][data-dual] .sheet-layer[data-col="left"][data-buried]:not(:nth-last-child(1 of .sheet-layer[data-col="left"][data-buried])) .sheet {
  width: calc(var(--v2-peek) * 2);
  max-width: calc(var(--v2-peek) * 2);
  left: 50%;
  right: auto;
  transform: none;
}
html[data-stack-v2][data-dual] .sheet-layer[data-col="left"][data-buried] ~ .sheet-layer[data-col="left"][data-buried]:nth-last-child(1 of .sheet-layer[data-col="left"][data-buried]) .sheet {
  width: calc(var(--v2-peek) * 2);
  max-width: calc(var(--v2-peek) * 2);
  left: calc(50% - var(--v2-peek));
  right: auto;
  transform: none;
}
/* 两栏下 scrim 退场：不蒙灰、不挡另一栏与底层面点击 */
/* ★#5 用户「露出来的部分都放在中间」：中缝露边带只放素纸书口，不放被切断的正文
   （改前被埋层的正文会透进这条 96px 带里，看着像压住了旁边那栏的字）。 */
html[data-stack-v2][data-dual] .sheet-layer[data-col="right"][data-buried] .sheet::before,
html[data-stack-v2][data-dual] .sheet-layer[data-col="left"][data-buried] .sheet::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  width: calc(var(--v2-peek) * 2);
  background: color-mix(in srgb, var(--text) 3%, var(--bg));
  z-index: 1;
  pointer-events: none;
}
html[data-stack-v2][data-dual] .sheet-layer[data-col="right"][data-buried] .sheet::before {
  left: 0;
  border-right: 1px solid var(--border);
}
html[data-stack-v2][data-dual] .sheet-layer[data-col="left"][data-buried] .sheet::before {
  left: auto;
  right: 0;
  border-left: 1px solid var(--border);
}

html[data-stack-v2][data-dual] .sheet-scrim { display: none; }

/* 左栏关掉之后（data-cols="1r"）：右栏占满整屏，底层文档让位（否则它会在右栏层下透出来/串滚） */
html[data-cols="1r"] body { padding-right: 0; }
/* #important：桌面分栏规则 html[data-skin] body:has(...) main:has(> .toc){display:grid} 特异度更高 */
html[data-cols="1r"] .site-header,
html[data-cols="1r"] body > main,
html[data-cols="1r"] .site-footer,
html[data-cols="1r"] .reading-tools { display: none !important; }
html[data-cols="1r"] .sheet-layer[data-col="right"] .sheet {
  width: 100%;
  max-width: 100%;
  border-left: 0;
  box-shadow: none;
}
html[data-cols="1r"] .sheet-layer[data-col="right"][data-buried] .sheet { transform: translateX(0); }

/* 浮层内流式 details 目录退场（目录走一键贴中面板；面板内容从克隆 innerHTML 读，display 不影响） */
:root[data-stack-v2] .sheet .toc { display: none !important; }

/* 栏的目录/设置钮在各栏外缘（#5）：左栏层贴左缘、右栏层贴右缘；被埋层退场 */
.v2-tab { top: 40%; }
.v2-tab-set { top: calc(40% + 84px); }
.sheet-layer[data-col="left"] .v2-tab {
  right: auto;
  left: 0;
  border-left: 0;
  border-right: 1px solid var(--border);
  border-radius: 0 var(--radius-card) var(--radius-card) 0;
}
.sheet-layer[data-buried] .v2-tab { visibility: hidden; pointer-events: none; }
/* 底文档（左栏本体）的双钮：单栏时在原位，两栏时挪到左外缘（它是左栏的钮） */
html[data-stack-v2] .reading-tools .entry-fab--toc { top: calc(40% - 96px); }
html[data-stack-v2][data-dual] .reading-tools .entry-fab {
  right: auto;
  left: 0;
  border-left: 0;
  border-right: 1px solid var(--border);
  border-radius: 0 var(--radius-card) var(--radius-card) 0;
}
html[data-stack-v2][data-dual] .reading-tools .entry-fab--toc { top: 26%; }
html[data-stack-v2][data-dual] .reading-tools .entry-fab:not(.entry-fab--toc) { top: calc(26% + 96px); }
/* 左栏顶层是本栏的层时，底文档的双钮退场（那层自己有一对） */
html[data-stack-v2][data-dual] body:has(.sheet-layer[data-col="left"].open) .reading-tools .entry-fab { visibility: hidden; pointer-events: none; }

/* U201（用户 10-30「目录不该一直出现在右边，应随滚动或点击出现（偏好滚动出现）」）：
   桌面 V2 的目录入口（.reading-tools .entry-fab--toc）不再常驻——默认原位透明（opacity 0、
   不可点、不占新布局），滚过阈值（JS 常量 0.6×视口高）加 .toc-fab-on 淡入 200ms，
   滚回首屏收起；面板开着（JS 保 .toc-fab-on）不收。只动这枚钮：refresh-fab（横排复用皮）、
   浮层内 .v2-tab（各层自己的目录/设置签）不在此列，零改动；手机（<1024）无此规则
   （手机本无这枚钮，U98 单栏＋抽屉＋U161 合并签滚动出现照旧）。 */
@media (min-width: 1024px) {
  /* 加 body 提特异度：压过 01-chrome.css 的 .reading-tools > * { pointer-events:auto }
     （两者同 (0,3,2)，本文件在 cssList 里靠后，同分后者胜）——
     否则透明态仍可点，隐身钮吃点击。 */
  html[data-stack-v2] body .reading-tools .entry-fab--toc {
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--toc-reveal-fade, 200ms) ease-out;
  }
  html[data-stack-v2] body .reading-tools .entry-fab--toc.toc-fab-on {
    opacity: 1;
    pointer-events: auto;
  }
}

/* 车道：正文向签侧让出 48px，签不盖字（v3 已验；不限 data-dual——单栏左栏层仍要） */
html[data-stack-v2] .sheet-layer[data-col="left"] .sheet-page { padding-left: calc(var(--space-4) + 48px); }
html[data-stack-v2] .sheet-layer[data-col="right"] .sheet-page { padding-right: calc(var(--space-4) + 48px); }
html[data-stack-v2][data-dual] main { padding-left: 48px; }

/* 目录面板：贴靠中间（左栏面板右缘贴中线、右栏面板左缘贴中线），两栏可同开对照。
   面板 fixed 定位恒可见——改前目录是正文流里的 details，层内下滚后点开会长在视口外
   （y=-2336），这就是用户说的「目录点开看不到」。 */
.col-toc {
  position: fixed;
  top: 8px;
  bottom: 8px;
  width: min(320px, 38vw);
  z-index: 86; /* 浮层 80 之上、贴词弹层 85 旁；低于 skip-link 100 */
  display: none;
  flex-direction: column;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card, 14px);
  box-shadow: var(--shadow-2);
}
html[data-stack-v2][data-dual] .col-toc { top: calc(var(--v2-head-h) + 8px); } /* 不盖两栏栏头 */
html[data-cols="1r"] .col-toc[data-col="right"] { left: auto; right: 8px; } /* 只剩一栏：没有中线可贴，靠右缘 */
.col-toc.open { display: flex; }
.col-toc[data-col="left"] { right: 50%; }
.col-toc[data-col="right"] { left: 50%; }
.col-toc-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--space-2) var(--space-3);
  border-bottom: 1px solid var(--border);
  font-family: var(--font-display);
  flex: none;
}
.col-toc-close {
  width: 44px;
  height: 44px;
  border: 0;
  border-radius: 999px;
  background: none;
  color: var(--text-secondary);
  font-size: var(--fs-18);
  cursor: pointer;
}
.col-toc-list { flex: 1; overflow-y: auto; padding: var(--space-2) var(--space-3) var(--space-4); }
.col-toc-list ol { margin: 0; padding-left: var(--space-4); }
.col-toc-list a { color: var(--text); }
/* U17 正文语义标记 · 最小可辨样式（引文 / 脚注）。
   只负责「能看出来是引文/脚注」；版式与皮肤归 U16/U18/U15 重做这些 class 的值。
   class 名是契约：src/semantics.mjs 生成，勿改名。全部取值走 tokens 刻度与颜色变量。 */

/* 引文（经文/祖师语录/偈颂）：左侧饰线 + 次要色 + 微缩进 */
.quote {
  margin: var(--space-3) 0;
  padding-left: var(--space-3);
  border-left: 3px solid var(--border);
  color: var(--text-secondary);
}
.quote .quote-text { color: inherit; } /* 段内引文包裹：跟随段级引文样式 */
.quote--verse { color: var(--text-secondary); }

/* 脚注（词条注 / 编者按）：注释色，与引文块在颜色上可辨；字号保持 16px（mobile 断言：p ≥16px） */
.fn-note {
  font-size: var(--fs-16);
  color: var(--note);
  margin: var(--space-2) 0;
}
.fn-note--editor { color: var(--text-secondary); }

/* 引文段尾书证出处（（《…》））：注释色小字，视觉上归脚注族 */
.fn-src { color: var(--note); font-size: var(--fs-14); }

/* U24② 释义总表页（/cidian/）：每条术语一处 —— 词条（链首见课）+ 词典↗ + 释义 + 课数。
   全走 tokens；对比度与术语弹层同源（--text / --note / --text-secondary）。 */
.terms-list { list-style: none; margin: var(--space-4) 0 0; padding: 0; }
.terms-item { padding: var(--space-3) 0; border-bottom: 1px solid var(--border); break-inside: avoid; }
.terms-item:last-child { border-bottom: 0; }
.terms-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); min-height: 46px; }
.terms-head a { display: inline-flex; align-items: center; align-self: stretch; }
.terms-name { font-family: var(--font-display); font-weight: 600; font-size: var(--fs-18); color: var(--text); text-decoration: none; }
.terms-name:hover { color: var(--accent); }
.terms-count { font-family: var(--font-ui); font-size: var(--fs-14); color: var(--text-secondary); white-space: nowrap; }
.terms-def { margin: var(--space-1) 0 0; font-family: var(--font-ui); font-size: var(--fs-16); line-height: 1.7; color: var(--text); overflow-wrap: anywhere; }

/* U57 词典主体：页内检索框（纯前端过滤）+ 首字分组头；8.7k 条用 content-visibility 跳屏外渲染 */
.cidian-search { margin: var(--space-4) auto 0; max-width: 56rem; } /* U115：42→56rem，随正文列加宽（输入框与列表同宽） */
.cidian-search input { width: 100%; min-height: 44px; padding: 0 var(--space-3); font-family: var(--font-ui); font-size: var(--fs-16); color: var(--text); background: var(--bg); border: 1px solid var(--border); border-radius: 8px; }
.cidian-search input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.cidian-filter-count { margin: var(--space-1) 0 0; font-family: var(--font-ui); font-size: var(--fs-14); color: var(--text-secondary); }
/* U234 /xiuxueyd/ 页内筛选：防止表格/列表 display 规则覆盖原生 [hidden]，保证筛选项严格消失 */
article tr[hidden], article td[hidden], .extra-list li[hidden], .landing-extra[hidden], .cidian-filter-count[hidden] { display: none !important; }
.terms-group { margin-top: var(--space-5); }
.terms-group[hidden] { display: none; }
.terms-group-h { font-family: var(--font-display); font-size: var(--fs-18); color: var(--text-secondary); border-bottom: 1px solid var(--border); padding-bottom: var(--space-2); }
/* U115 样式统一：组头 h2 被主题的 article h2 规则（30px/700）误盖 —— 字号/字重/颜色回归本条
   本意（组标签，18px/400/次要色），加同前缀抬特异性；否则词条页组头与正文节题两种 h2 混作一团。
   注：terms-group-h 角色是「列表组标签」（同 .eyebrow 族），不是节题，故不与 article h2 同值。 */
html[data-skin] article h2.terms-group-h { font: 400 var(--fs-18)/1.4 var(--font-display); color: var(--text-secondary); letter-spacing: 0; }
/* U71 余组哨兵：纯提示无控件，滚近时页脚本增量渲染余组 */
.cidian-more { margin-top: var(--space-6); text-align: center; }
.cidian-more-note { color: var(--text-secondary); font-size: var(--fs-14); }
.terms-item { content-visibility: auto; contain-intrinsic-size: auto 96px; }

/* U65 H4：/cidian/ 每条一个「词典↗」外链（8.7k 个同款青色下划线链接排成链接墙）——词条页上降为
   弱色小字、无下划线，hover 才显色；正文术语弹层（.term-layer）里的 .term--external 不受影响 */
.terms-item .term--external { color: var(--text-secondary); font-size: var(--fs-14); text-decoration: none; }
.terms-item .term--external:hover { color: var(--accent); text-decoration: underline dashed; }

/* U24④ 译文竖线根因修复（全站）：原站译文用 <blockquote> 层层嵌套（最深 7 层），基线给每层都画
   border-left 饰线 + 内边距 → 手机上「好几道竖线」+ 文字被挤成一列。规则：嵌套引用容器只保留最外层
   一道饰线，内层归零（边线/底色/圆角/额外缩进全去掉）。作用于全部皮肤。 */
article blockquote blockquote {
  margin: 0;
  padding: 0;
  border-left: 0;
  background: none;
  border-radius: 0;
}

/* U88 ③：裸 URL 残段（正文里整段可见文字恰是一个裸网址）——呈现为可读的「网址块」：等宽、
   可断行、淡底圆角，读者一眼认出这是网址而非残句；手机上 break-all 防溢出。文字零改动、
   不是链接（不做 <a>：link-hygiene D7 长文本链接口径见 body.mjs 0¾ 注）。全走 tokens，
   淡底用 color-mix(currentColor 8%)，三主题与亮/暗自适应。 */
.bare-url {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 0.85em;
  word-break: break-all;
  overflow-wrap: anywhere;
  padding: 0.1em 0.4em;
  border-radius: 4px;
  background: color-mix(in srgb, currentColor 8%, transparent);
}
/* search.css · U27 站内全文搜索：页头入口（.header-search / .drawer-search）+ /search/ 页面
   颜色/字号/间距只用 tokens.css 变量；输入框与提交按钮 ≥44px 触控目标；正文字号 ≥16px。 */

/* ---- 页头入口：顶栏右侧（桌面内联导航旁，移动端汉堡旁），抽屉内顶格 ---- */
.header-search {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--space-3);
  color: var(--text-secondary);
  text-decoration: none;
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  white-space: nowrap;
  flex: none;
}
/* U96b：hover 不再加重（font-weight 改字宽 → 页头文字重排抖动）；当前页保持加重（静态不改宽） */
.header-search:hover { color: var(--accent); }
.header-search[aria-current="page"] { color: var(--accent); font-weight: 600; }
.site-drawer .drawer-search {
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  background: var(--bg);
}

/* U40：抽屉内搜索入口收编为抽屉项同语言（去「裸链接」感）；
   U43：文字里的 🔍 emoji 已由模板票去除（四处改纯文字「全站搜索」，入口可达性不变，
   ia-check A1c / theme-check ⑦ 照常过）。 */
.site-drawer .drawer-search {
  display: inline-flex;
  align-items: center;
  align-self: stretch;
  min-height: 44px;
  padding: 0 var(--space-3);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: var(--fs-16);
  text-decoration: none;
}

/* ---- /search/ 页面 ----
   U47 R6（U44 §2-11）：搜索页减重——标题 44→22px（字号阶 fs-22）、lede 压成一行、
   输入框与按钮合成一个胶囊搜索框（去「大标题 + 说明 + 表单」三段式模板形状） */
.search-head { padding: var(--space-6) var(--space-3) var(--space-8); max-width: 56rem; margin: 0 auto; } /* U115：46→56rem，随非讲义页正文列加宽 */
html[data-skin] .search-head .page-title { margin: var(--space-2) 0 0; } /* U115：外边距对齐其他文档页页题（8/0），字号字重已同款 */
.search-lede { margin: 0 0 var(--space-4); color: var(--text-secondary); font-size: var(--fs-16); }
.search-form {
  display: flex;
  align-items: stretch;
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: var(--bg-elevated);
  overflow: hidden;
}
.search-form:focus-within { outline: 2px solid var(--accent); outline-offset: 1px; }
.search-label {
  position: absolute;
  width: 1px; height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.search-input {
  flex: 1 1 12rem;
  min-width: 0;
  min-height: 44px;
  padding: 0 var(--space-4);
  font-family: var(--font-body);
  font-size: 1rem; /* ≥16px，避免 iOS 聚焦自动放大 */
  color: var(--text);
  background: none;
  border: 0;
  border-radius: 0;
}
.search-input:focus-visible { outline: none; } /* 焦点圈由 .search-form:focus-within 承担，胶囊内不被裁切 */
.search-form .search-submit { flex: 0 0 auto; min-height: 44px; min-width: 5.25rem; border: 0; border-radius: var(--radius-pill); box-shadow: none; }
.search-status { min-height: 1.5em; margin: var(--space-3) 0 var(--space-2); color: var(--text-secondary); font-size: var(--fs-16); }
.search-results { list-style: none; margin: var(--space-2) 0 0; padding: 0; display: grid; gap: var(--space-3); }
.search-more { margin-top: var(--space-4); min-height: 44px; width: 100%; }
.search-more[hidden] { display: none; }
.r-item {
  /* U40：搜索结果去卡片化（U39 §6.1-4 card soup）——细线分隔列表，阴影退场 */
  border: 0;
  border-bottom: 1px solid var(--border);
  border-radius: 0;
  background: none;
  box-shadow: none;
}
.r-item a {
  display: block;
  padding: var(--space-3) var(--space-1);
  color: inherit;
  text-decoration: none;
  border-radius: 0;
}
.r-item a:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.r-title {
  display: block;
  font-family: var(--font-kai);
  font-size: var(--fs-18);
  font-weight: 600;
  color: var(--accent);
}
.r-excerpt {
  display: block;
  margin-top: var(--space-2);
  font-size: var(--fs-16);
  line-height: 1.7;
  color: var(--text);
  word-break: break-word;
}
.r-excerpt mark {
  background: var(--accent-weak);
  color: var(--text);
  padding: 0 2px;
  border-radius: var(--radius-icon); /* U40：4px ad-hoc → 归到 icon 档 */
}
/* skins.css · 版式主题已拆到 src/styles/themes/{a-jingshi,b-shuan,c-zazhi}.css（U18；token 值写在各自 html[data-skin=…] 块）。本文件保留为空占位，build 仍按序拼接。 */

/* ==================================================================
   U99 · 三主题共享版式骨架（自 b 书案提升；b=默认主题，观感不变）
   用户 10-28 定口径：换主题只换「配色 + 标题风格（字体/字重/字距/字号）」，
   顶多再加一点点分隔线样式差异；版式骨架（栏数/栏宽/边距/缩进/段距/行高/
   对齐/正文块结构/控件位置形态）三套必须一致。
   故把原 b-shuan.css 里的结构规则以 html[data-skin] 前缀提升到本段
   （特异性与原 html[data-skin="b"] 前缀相同，加载序在主题文件之前 →
   主题文件仍可用同前缀覆盖配色与标题）。骨架值 = b 现值，b 观感不变。
   ================================================================== */

/* ---- 页头：面板色 + 页签导航（结构） ---- */
html[data-skin] .site-header { -webkit-backdrop-filter: none; backdrop-filter: none; padding-left: var(--space-4); padding-right: var(--space-4); }
html[data-skin] .site-name { display: flex; align-items: center; gap: var(--space-2); }
@media (min-width: 768px) {
  html[data-skin] .site-header { min-height: 64px; gap: var(--space-6); padding-left: var(--space-8); padding-right: var(--space-8); }
  html[data-skin] .site-nav { flex: 1; max-width: 36rem; align-self: stretch; gap: var(--space-2); }
  html[data-skin] .site-nav a, html[data-skin] .site-nav .site-nav-current { min-height: 64px; padding: 0 var(--space-3); border-bottom: 3px solid transparent; }
  html[data-skin] .nav-group { gap: var(--space-2); }
  html[data-skin] .nav-group--yuan { border-left: 1px solid var(--border); border-right: 1px solid var(--border); padding: 0 var(--space-2); }
  html[data-skin] .nav-group--yandi { margin-left: var(--space-2); }
}

/* ---- 主体：宽工作区（结构） ---- */
html[data-skin] main { padding: var(--space-4) var(--space-4) var(--space-12); }
@media (min-width: 768px) { html[data-skin] main { padding: var(--space-4) var(--space-8) var(--space-16); } }
@media (min-width: 1100px) { html[data-skin] main { max-width: 75rem; padding: var(--space-4) var(--space-8) 80px; } }
html[data-skin] .breadcrumb { margin: 0 0 var(--space-2); }

/* ---- 首页 hero：纸面 + 大留白，培养目标右栏（结构；U34 退卡片退色块） ---- */
html[data-skin] .hero { display: grid; gap: var(--space-3); text-align: left; background: none; border: 0; border-bottom: 1px solid var(--border); border-radius: 0; padding: var(--space-6) 0; margin-top: var(--space-2); }
html[data-skin] .hero > * { min-width: 0; }
html[data-skin] .hero-mark { display: none; }
html[data-skin] .hero-sub { order: -1; margin: 0; font: 600 var(--fs-16)/1.5 var(--font-ui); letter-spacing: .04em; }
html[data-skin] .hero-slogan, html[data-skin] .hero-qi { margin: 0; }
html[data-skin] .hero-slogan { font: var(--fs-22)/1.6 var(--font-kai); }
html[data-skin] .hero-qi { font: var(--fs-18)/1.7 var(--font-kai); color: var(--text-secondary); }
html[data-skin] .hero-actions { display: flex; flex-direction: column; gap: var(--space-2); align-items: flex-start; } /* U92：入口胶囊左对齐 */
html[data-skin] .hero-garden { margin: 0; text-align: left; }
/* 培养目标：退卡片成小字（U34；基线 .home-aims display:none，此处对三主题统一启用） */
html[data-skin] .home-aims { display: block; background: none; border: 0; border-top: 1px solid var(--border); border-radius: 0; padding: var(--space-4) 0 0; }
html[data-skin] .aim-title { margin: 0; font: 600 var(--fs-18)/1.4 var(--font-ui); }
html[data-skin] .aim-text { margin: var(--space-1) 0 var(--space-3); font: var(--fs-16)/1.7 var(--font-kai); color: var(--text-secondary); }
html[data-skin] .aim-text:last-child { margin-bottom: 0; }
@media (min-width: 768px) {
  html[data-skin] .hero { grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); column-gap: var(--space-6); padding: var(--space-6); align-items: start; }
  html[data-skin] .hero > :not(.home-aims) { grid-column: 1; }
  html[data-skin] .home-aims { grid-column: 2; grid-row: 1 / span 6; }
  /* 桌面首屏两院卡片（.home-cols）本就可见，hero 内入口收起 */
  html[data-skin] .hero-actions { display: none; }
}

/* ---- 两院/园地：细线分隔 + 统一胶囊（U40 卡片降级为细线；结构） ---- */
html[data-skin] .card { background: none; border: 0; border-top: 1px solid var(--border); border-radius: 0; padding: var(--space-4) 0 0; margin: var(--space-6) 0 0; }
html[data-skin] .home-card { background: none; border: 0; border-top: 1px solid var(--border); border-radius: 0; padding: var(--space-6) 0 0; margin: 0; display: flex; flex-direction: column; }
html[data-skin] .card .eyebrow { color: var(--text-secondary); font-weight: 400; }
html[data-skin] .home-card .card-links { margin-top: auto; flex-direction: column; align-items: flex-start; gap: var(--space-2); } /* U55：内容宽度、左对齐 */
html[data-skin] .home-garden { background: none; border: 0; border-top: 1px solid var(--border); border-radius: 0; padding: var(--space-6) 0 0; }
/* U24⑤：两院格子：多行课程名不拆列、行高放宽、内边距加厚 */
html[data-skin] .card li { padding: var(--space-3) 0; break-inside: avoid; page-break-inside: avoid; }
html[data-skin] .card li a { font: var(--fs-16)/1.6 var(--font-kai); }
html[data-skin] article { background: transparent; }

/* ---- 落地页：hero 细线 + 大纲卡响应式栏数（结构） ---- */
html[data-skin] .landing-hero { background: none; border: 0; border-top: 1px solid var(--border); border-radius: 0; padding: var(--space-6) 0 0; text-align: left; margin-top: var(--space-2); }
html[data-skin] .landing-hero .hero-title { margin-top: var(--space-2); }
html[data-skin] .landing-hero .hero-sub { order: 0; margin-top: var(--space-3); font: var(--fs-18)/1.7 var(--font-kai); letter-spacing: 0; }
html[data-skin] .landing-list ul { columns: 1; }
@media (min-width: 768px) { html[data-skin] .landing-list ul { columns: 2; } }
@media (min-width: 1024px) { html[data-skin] .landing-list ul { columns: 3; } }

/* ---- 讲义页：标题面板退卡片 + 白纸阅读面板 + 左目录（结构；值同 b） ---- */
html[data-skin] body:has([data-reading-body]) .page-head { background: none; border: 0; border-radius: 0; padding: var(--space-3) 0 var(--space-4); margin-bottom: var(--space-4); }
/* U115：非讲义页（首页/落地页/词条/搜索等）正文列 42rem→56rem —— 用户：讲义可窄，其他地方要适当宽度。
   讲义页（data-reading-body）由 reading.css 同名更高特异性规则压回窄列，不在此影响面。 */
html[data-skin] main > article { background: none; border: 0; border-radius: 0; padding: var(--space-4) 0; max-width: 56rem; }
@media (min-width: 768px) { html[data-skin] main > article { padding: var(--space-6) var(--space-8); } }
/* U15p P3.5：去内层 .table-scroll 框（框中框），三主题统一 */
html[data-skin] .table-scroll { border: 0; border-radius: 0; }
/* U65 H2：节题分隔结构（发丝线 + 节前距 2.6em）为三主题共享；标题字体/字重/颜色归主题文件 */
html[data-skin] body:has([data-reading-body]) article h2 { border-top: 1px solid var(--border); padding-top: var(--space-3); margin: 2.6em 0 .6em; }
@media (min-width: 1024px) {
  html[data-skin] main:has(> .toc) { grid-template-columns: 15rem minmax(0, var(--w-body, 42rem)); max-width: calc(15rem + var(--w-body, 42rem) + var(--space-12) + 2 * var(--space-8)); column-gap: var(--space-4); }  /* U15p P3.10：TOC 页正文列 42rem；U115 随 --w-body 变量（含表格页 48rem） */
}
html[data-skin] .seg-book { margin-top: var(--space-8); }

/* ---- 正文语义（U17 结构统一；颜色随各主题 token）：引文 = 左饰线 + 宋体；脚注 = ui 小字注色 ---- */
html[data-skin] article .quote { font-family: var(--font-display); font-size: var(--fs-18); line-height: 1.9; border-left: 3px solid var(--accent); border-radius: 0; padding: 0 0 0 var(--space-6); margin: var(--space-6) 0; } /* U115：饰线 2px→3px，与讲义页引文统一 */
html[data-skin] article .quote--verse { letter-spacing: .06em; font-weight: 700; }
html[data-skin] article .quote .quote-text { color: inherit; }
html[data-skin] article blockquote { font-size: var(--fs-18); }
html[data-skin] article .fn-note { font-family: var(--font-ui); font-size: var(--fs-16); line-height: 1.6; margin: var(--space-3) 0; }
html[data-skin] article .fn-src { font-family: var(--font-ui); font-size: var(--fs-14); }
/* 段内引文（span.quote-text）：楷体 + 细底线（U55），线色随主题 accent */
html[data-skin] article p:not(.quote) .quote-text { font-family: var(--font-kai); border-bottom: 1px solid color-mix(in srgb, var(--accent) 45%, transparent); padding: 0; -webkit-box-decoration-break: clone; box-decoration-break: clone; }

/* ---- 页脚：左对齐 + 宽工作区（结构） ---- */
html[data-skin] .site-footer { text-align: left; }
@media (min-width: 1100px) { html[data-skin] .site-footer { max-width: 75rem; margin: 0 auto; padding-left: var(--space-8); } }
/* U70：宋/楷自托管子集（构建期 tools/build/subset-fonts-u70.py 生成 dist/fonts/）。
   @font-face 家族名 = 字体栈首位（tokens.css --font-display / --font-kai 不动，系统回退链原样保留）；
   font-display: swap 首屏不阻塞（swap 期用系统栈渲染，字体到位后换装）。
   许可：两字体均 SIL OFL 1.1（可商用），许可文本随 dist/fonts/ 分发。 */

@font-face {
  font-family: "Noto Serif SC";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: local("Noto Serif SC"), url("/fonts/serif-400-700.woff2") format("woff2");
}

@font-face {
  font-family: "LXGW WenKai Screen";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: local("LXGW WenKai Screen"), url("/fonts/kai-400.woff2") format("woff2");
}
/* themes/a-jingshi.css · D1 静室（html[data-skin="a"]）
   U99 收窄：三主题共享版式骨架已提升到 skins.css（值 = b 书案现值）。
   用户 10-28 口径：换主题只换「配色 + 标题风格」，顶多加一点分隔线样式差异；
   版式骨架（栏数/栏宽/边距/缩进/段距/行高/对齐/正文块结构/控件形态）不再在此声明。
   静室性格收敛为：暖纸配色（tokens.css a 块）+ 楷意疏朗的标题（宋体 400 + 宽字距）+ 几乎无框。
   token 值（亮/暗）在 tokens.css 的 html[data-skin="a"] 块。 */

/* ---- 页头：纸底、无底线（配色 + 分隔线装饰）；页签结构在 skins.css ---- */
html[data-skin="a"] .site-header { background: var(--bg); border-bottom: 0; }
html[data-skin="a"] .site-name { font-family: var(--font-kai); font-weight: 400; letter-spacing: .12em; }
html[data-skin="a"] .site-nav a[aria-current="page"], html[data-skin="a"] .site-nav .site-nav-current { border-bottom-color: var(--accent); font-weight: 400; }

/* ---- 标题风格：宋体 400 + 宽字距（静室署名；字号属标题风格，保留差异） ---- */
html[data-skin="a"] .hero-title { font: 400 var(--fs-34)/1.4 var(--font-display); letter-spacing: .04em; color: var(--text); text-wrap: balance; }
@media (min-width: 768px) { html[data-skin="a"] .hero-title { font-size: var(--fs-60); letter-spacing: .06em; } }
html[data-skin="a"] .hero-sub { color: var(--accent); }
html[data-skin="a"] .landing-hero .eyebrow { color: var(--accent); }
html[data-skin="a"] .landing-hero .hero-title { letter-spacing: .14em; font-size: var(--fs-44); }
@media (min-width: 768px) { html[data-skin="a"] .landing-hero .hero-title { font-size: var(--fs-60); } }
html[data-skin="a"] body:has([data-reading-body]) h1.page-title { font: 400 var(--fs-44)/1.35 var(--font-kai), var(--font-display); letter-spacing: .1em; }
@media (min-width: 768px) { html[data-skin="a"] body:has([data-reading-body]) h1.page-title { font-size: var(--fs-60); } }
html[data-skin="a"] .card h2 { font: 400 var(--fs-30)/1.3 var(--font-kai), var(--font-display); letter-spacing: .2em; color: var(--accent); }
html[data-skin="a"] article h2 { font: 400 var(--fs-30)/1.3 var(--font-kai), var(--font-display); letter-spacing: .16em; color: var(--accent); }
html[data-skin="a"] article h3 { font: 400 var(--fs-26)/1.4 var(--font-kai), var(--font-display); letter-spacing: .08em; }
html[data-skin="a"] article h4 { font: 400 var(--fs-20)/1.5 var(--font-kai), var(--font-display); letter-spacing: .06em; }
@media (min-width: 768px) { html[data-skin="a"] article h2 { font-size: var(--fs-34); } }

/* ---- 引文饰线颜色（结构在 skins.css）：大师言退墨色（基线 --note 的蓝在静室让位给「无花」） ---- */
html[data-skin="a"] article .quote { color: var(--text-secondary); } /* U15p P3.7：引文次级墨色，对纸色 5.23:1（暗 6.61:1）≥4.5 */
html[data-skin="a"] article .quote--saying { border-left-color: var(--text-secondary); }
html[data-skin="a"] body:has([data-reading-body]) article p.quote--saying { border-left-color: var(--text-secondary); }

/* ---- 目录/正文链接颜色（装饰配色）；同前缀抬特异性压过 reading.css 基线（同 U61 做法） ---- */
html[data-skin="a"] body:has([data-reading-body]) .toc a { color: var(--text-secondary); }
html[data-skin="a"] body:has([data-reading-body]) .toc a[aria-current="true"] { color: var(--accent); }
html[data-skin="a"] .reading-tools { background: var(--bg); }
/* themes/b-shuan.css · D2 书案（默认主题，html[data-skin="b"]）
   U99 收窄：三主题共享版式骨架已提升到 skins.css（html[data-skin] 段，值 = 原 b 结构规则）。
   本文件按用户 10-28 口径只留「配色 + 标题风格（字体/字重/字距/字号）+ 分隔线小装饰」；
   结构（栏数/栏宽/边距/段距/行高/控件形态）不再在此声明。b 的渲染结果与收窄前一致。 */

html[data-skin="b"] {
  /* U55 纸墨（方向纠正版）：纸与墨的关系——淡暖灰纸 + 深墨字，不再是冷灰工作台底；
     宋体标题（--font-display 不再指向黑体）：宋体标题 + 楷体正文 = 经书排版的老搭档，端庄不俏皮。
     只有亮色改；暗色是墨块底，原值不动。 */
  --bg: #eae8e0;
  --bg-elevated: #fbfaf7;
  --text: #1c2a33;
  --text-secondary: #51626c;
  --accent: #1e4d6b;
  --accent-weak: #eef3f4;
  --note: #9a3f2a;
  --border: #c9c4b6;
  --acc2: #b3392a;          /* 书案专属：印章红（页签下标/编号/logo 块） */
  --font-display: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif;
  color-scheme: light;
}
html[data-skin="b"][data-theme="dark"] {
  --bg: #0e1519;
  --bg-elevated: #26363e;  /* U15p P3.6：原 #172228 对页底仅 1.14:1（暗色 hero 卡边界糊），提到 1.47:1（≥1.4，不加边框硬撑）；正文文字对其 9.94:1 */
  --text: #dde7ea;
  --text-secondary: #9fb0b8;
  --accent: #86bfdf;
  --accent-weak: #1d2b32;
  --note: #e8a08f;
  --border: #3a4b55;       /* U15p：随 elevated 提亮，否则边线对新卡底仅 1.06:1 不可见（对页底 2.03:1） */
  --acc2: #e58a7a;         /* U15p：随 elevated 提亮重校，原 #e0806f 对新卡底 4.46<4.5，提亮到 4.91 */
  color-scheme: dark;
}

/* ---- 页头：面板色（配色）；页签结构在 skins.css ---- */
html[data-skin="b"] .site-header { background: var(--bg-elevated); }
html[data-skin="b"] .site-name { font-family: var(--font-ui); }
html[data-skin="b"] .site-name::before { content: "如"; flex: none; width: 32px; height: 32px; border-radius: var(--radius-icon); background: var(--acc2); color: #fff; display: grid; place-items: center; font: 700 var(--fs-18)/1 var(--font-ui); } /* U40：icon 档；红（--acc2）只留给印章与语录饰线（U39 §6.2「红只给印章一处」） */
html[data-skin="b"] .nav-toggle, html[data-skin="b"] .ctl { background: var(--bg-elevated); }
html[data-skin="b"] .site-nav a[aria-current="page"], html[data-skin="b"] .site-nav .site-nav-current { background: var(--accent-weak); border-bottom-color: var(--accent); }

/* ---- 首页 hero：眉标色 + 标题（宋体 700，U55）；骨架在 skins.css ---- */
html[data-skin="b"] .hero-sub { color: var(--text-secondary); } /* U40：hero 眉行去红（U39 §6.1-3「每个标题上方一条红色小字」）——红只给印章/语录饰线 */
html[data-skin="b"] .hero-title { font: 700 var(--fs-44)/1.3 var(--font-kai), var(--font-display); letter-spacing: .02em; color: var(--text); margin: 0; } /* U55：标题改宋体（敬） */

/* ---- 卡片标题（宋体 400；结构与眉标色在 skins.css） ---- */
html[data-skin="b"] .card h2 { font: 400 var(--fs-30)/1.3 var(--font-display); letter-spacing: .04em; }
html[data-skin="b"] .home-card .card-desc { font-family: var(--font-kai); color: var(--text-secondary); }

/* ---- 落地页：眉标色 ---- */
html[data-skin="b"] .landing-hero .eyebrow { color: var(--text-secondary); font-weight: 600; } /* U40：眉标去红 */

/* ---- 讲义页：标题层级（U65 H2）——页题 700/44px、节题压到 26px，重排「页题 > 节题 > 正文」三级
   （1440 验收：h1 ≥ 44 且 h1 ≥ h2 × 1.4；a/c 的 60px 性格不破，theme-check ① 照常） ---- */
@media (min-width: 768px) {
  html[data-skin="b"] body:has([data-reading-body]) h1.page-title { font-size: var(--fs-44); font-weight: 700; }
  html[data-skin="b"] body:has([data-reading-body]) article h2 { font-size: var(--fs-26); }
}
html[data-skin="b"] h1.page-title { font: 700 var(--fs-44)/1.3 var(--font-kai), var(--font-display); letter-spacing: .02em; }  /* U15p P2.4：手机 h1 34→44px；U55：改宋体（敬：题像经题，不像 app 启动页） */
html[data-skin="b"] article h2 { font: 700 var(--fs-26)/1.3 var(--font-kai), var(--font-display); } /* U55：标题改宋体；节前距/发丝线结构在 skins.css */
html[data-skin="b"] article h3 { font: 700 var(--fs-22)/1.3 var(--font-kai), var(--font-display); } /* U55：改宋体（敬） */
html[data-skin="b"] article h4 { font: 700 var(--fs-18)/1.4 var(--font-kai), var(--font-display); } /* U55：改宋体（敬） */
@media (min-width: 768px) { html[data-skin="b"] article h2 { font-size: var(--fs-30); } }

/* ---- 目录：内容页唯一保留的卡容器（U39 §6.2「列表页最多 1 个卡」）+ 当前页底色（装饰/配色） ---- */
html[data-skin="b"] .toc { border-radius: var(--radius-card); } /* U40 */
html[data-skin="b"] .toc a[aria-current="true"] { background: var(--accent-weak); border-radius: var(--radius-icon); } /* U40：icon 档 */

/* ---- 阅读工具栏底色（配色） ---- */
html[data-skin="b"] .reading-tools { background: var(--bg-elevated); }

/* ---- 正文语义（U17）：引文 = 左饰线颜色；脚注 = 上虚线分隔（分隔线样式，b=虚线）。
   字体/字号/行高/缩排结构在 skins.css ---- */
html[data-skin="b"] article .quote { color: var(--text); }
html[data-skin="b"] article .quote--saying { border-left-color: var(--acc2); }
html[data-skin="b"] article .fn-note { color: var(--note); border-top: 1px dashed var(--border); padding-top: var(--space-2); }
html[data-skin="b"] article .fn-note--editor { color: var(--text-secondary); }
html[data-skin="b"] article .fn-src { color: var(--note); }

/* ---- 页脚 / U58 非正文块（配色） ---- */
html[data-skin="b"] body:has([data-reading-body]) article p.quote--saying { border-left-color: var(--acc2); } /* 大师言饰线沿用印章红（U39 §6.2） */
/* themes/c-zazhi.css · D3 杂志（html[data-skin="c"]）
   U99 收窄：三主题共享版式骨架已提升到 skins.css（值 = b 书案现值）。
   用户 10-28 口径 + 早先「c 保留杂志性格」合并执行：杂志性格只落在【配色对比 + 标题字体】上——
   墨色通栏（页头/首屏/页标题/页脚的墨带，含出血渲染机制）与红色园地通栏 = 配色应用，
   4px 黑色栏目上边线 = 分隔线样式装饰；栏数/栏宽/边距/段距/行高/控件形态不再在此声明
   （原 80svh 封面、两栏大块入口、46rem 宽栏、1.7 行距等结构覆盖全部撤除，统一到共享骨架）。
   token 值只写在本文件 html[data-skin="c"] 块；内部 token：--ink / --on-ink / --acc-ink。 */

html[data-skin="c"] {
  --bg: #f3f2ee;
  --bg-elevated: #ffffff;
  --text: #14120f;
  --text-secondary: #5d5850;
  --accent: #c0301b;
  --accent-weak: #e9e5da;
  --note: #b02a16;
  --border: #cfcbc0;
  --ink: #14120f;          /* 通栏墨色 */
  --on-ink: #f3f2ee;       /* 墨色上的文字 */
  --acc-ink: #ff8570;      /* 红色在墨色上的亮版（文字用，≥4.5:1） */
  color-scheme: light;
}
html[data-skin="c"][data-theme="dark"] {
  --bg: #17150f;
  --bg-elevated: #211e17;
  --text: #ece9e1;
  --text-secondary: #a8a396;
  --accent: #ef6a52;
  --accent-weak: #2c2820;
  --note: #f08a76;
  --border: #38342b;
  --ink: #6a644a;          /* 通栏墨色；U18f F3 → U14a → U54（Meta 代定 A6）：非文字图形 ≥3:1 → #6a644a 对纸色 3.07:1；连带 --acc-ink 提到 #ffe0d3 */
  --on-ink: #ece9e1;
  --acc-ink: #ffe0d3;      /* U14a/U54：随墨带提亮重校，对新墨带 4.77 */
  --acc-paper: #b02a16;    /* U14a：暗色浅纸挖空上的红（入口条箭头/hover，对挖空纸 ≥4.5:1） */
  color-scheme: dark;
}

/* ---- U14a/U54：墨带提亮后，墨上的透明混色次要文字在暗色下提高混比（对墨带 ≥4.5:1；亮色不变）——配色 ---- */
html[data-skin="c"][data-theme="dark"] .site-nav a, html[data-skin="c"][data-theme="dark"] .site-nav .site-nav-current,
html[data-skin="c"][data-theme="dark"] .breadcrumb, html[data-skin="c"][data-theme="dark"] .breadcrumb a,
html[data-skin="c"][data-theme="dark"] .site-footer,
html[data-skin="c"][data-theme="dark"] .reading-tools .seg-pos { color: color-mix(in srgb, var(--on-ink) 94%, var(--ink)); }
html[data-skin="c"][data-theme="dark"] .hero-qi { color: color-mix(in srgb, var(--on-ink) 94%, var(--ink)); }

/* ---- 页头：墨色通栏（配色；页签结构在 skins.css） ---- */
html[data-skin="c"] .site-header { background: var(--ink); color: var(--on-ink); border-bottom: 1px solid rgb(255 255 255 / .22); }
html[data-skin="c"] .site-name { color: var(--on-ink); font: 700 var(--fs-14)/44px var(--font-ui); letter-spacing: .3em; }
html[data-skin="c"] .site-header .ctl, html[data-skin="c"] .nav-toggle { background: transparent; color: var(--on-ink); border-color: rgb(255 255 255 / .32); }
html[data-skin="c"] .site-header .ctl:hover { color: var(--acc-ink); border-color: var(--acc-ink); }
html[data-skin="c"] .site-nav a, html[data-skin="c"] .site-nav .site-nav-current { color: color-mix(in srgb, var(--on-ink) 75%, transparent); }
html[data-skin="c"] .site-nav a:hover { color: var(--on-ink); }
html[data-skin="c"] .site-nav a[aria-current="page"], html[data-skin="c"] .site-nav .site-nav-current { color: var(--on-ink); box-shadow: inset 0 -3px var(--accent); }
html[data-skin="c"] .header-search { color: var(--on-ink); } /* U50 A1 */
html[data-skin="c"] .header-search:hover, html[data-skin="c"] .header-search[aria-current="page"] { color: var(--acc-ink); }

/* ---- 手机抽屉：墨色（配色） ---- */
html[data-skin="c"] .site-drawer { background: var(--ink); color: var(--on-ink); }
html[data-skin="c"] .site-drawer a, html[data-skin="c"] .site-drawer .site-nav-current { color: var(--on-ink); }
html[data-skin="c"] .site-drawer a[aria-current="page"], html[data-skin="c"] .site-drawer .site-nav-current { background: var(--accent); color: var(--bg); }
html[data-skin="c"] .drawer-title { color: var(--on-ink); }
html[data-skin="c"] .nav-close { color: var(--on-ink); border-color: rgb(255 255 255 / .32); }
/* U50 A2：抽屉搜索框同墨带语言（配色） */
html[data-skin="c"] .site-drawer .drawer-search { color: var(--on-ink); background: transparent; border-color: rgb(255 255 255 / .32); }
html[data-skin="c"] .site-drawer .nav-group--yuan, html[data-skin="c"] .site-drawer .nav-group--yandi { border-color: rgb(255 255 255 / .28); }

/* ---- 通栏墨带（配色载体：背景/前景色 + 出血渲染机制；盒子的位置尺寸归共享骨架） ---- */
html[data-skin="c"] .hero, html[data-skin="c"] .page-head, html[data-skin="c"] .landing-hero { background: var(--ink); color: var(--on-ink); box-shadow: 0 0 0 100vmax var(--ink); clip-path: inset(0 -100vmax); border: 0; border-radius: 0; }
html[data-skin="c"] .hero-mark { display: none; }
html[data-skin="c"] .breadcrumb, html[data-skin="c"] .breadcrumb a { color: color-mix(in srgb, var(--on-ink) 75%, transparent); }
html[data-skin="c"] .breadcrumb [aria-current="location"] { color: var(--on-ink); }

/* ---- 标题风格：900 黑体紧字距 + 封面超大字（字号属标题风格） ---- */
html[data-skin="c"] .hero-sub { color: var(--acc-ink); }
html[data-skin="c"] .hero-title { font: 900 var(--fs-60)/1 var(--font-display); letter-spacing: -.02em; color: var(--on-ink); text-wrap: balance; }
@media (min-width: 768px) { html[data-skin="c"] .hero-title { font-size: 6rem; } }
@media (min-width: 1100px) { html[data-skin="c"] .hero-title { font-size: clamp(7.5rem, 10.5vw, 9.375rem); } }
html[data-skin="c"] .hero-qi { color: color-mix(in srgb, var(--on-ink) 72%, transparent); }

/* ---- 两院入口在墨带上的配色（形态在共享骨架）：亮=纸色挖空块，暗=浅纸挖空（U14a 同极性） ---- */
html[data-skin="c"] .hero-actions .pill--college { background: var(--bg); color: var(--text); }
html[data-skin="c"] .hero-actions .pill--college:hover { color: var(--accent); }
html[data-skin="c"][data-theme="dark"] .hero-actions .pill--college { background: var(--on-ink); color: var(--bg); }
html[data-skin="c"][data-theme="dark"] .hero-actions .pill--college:hover { color: var(--acc-paper); }

/* ---- 首页：园地红色通栏（配色对比 + 出血渲染；结构在 skins.css） ---- */
html[data-skin="c"] .home-garden { background: var(--accent); color: var(--bg); border: 0; box-shadow: 0 0 0 100vmax var(--accent); clip-path: inset(0 -100vmax); padding: var(--space-12) 0; margin-top: var(--space-16); }
html[data-skin="c"] .home-garden .eyebrow, html[data-skin="c"] .home-garden h2, html[data-skin="c"] .home-garden .card-desc { color: inherit; }
html[data-skin="c"] .home-garden h2 { font-size: var(--fs-44); }
@media (min-width: 768px) { html[data-skin="c"] .home-garden h2 { font-size: var(--fs-60); } }

/* ---- 落地页：墨带上的标题（标题风格 + 带上配色） ---- */
html[data-skin="c"] .landing-hero .eyebrow { color: var(--acc-ink); }
html[data-skin="c"] .landing-hero .hero-title { font-size: var(--fs-60); }
html[data-skin="c"] .landing-hero .hero-sub { color: color-mix(in srgb, var(--on-ink) 85%, transparent); }
@media (min-width: 768px) { html[data-skin="c"] .landing-hero .hero-title { font-size: 6rem; } }
@media (min-width: 1100px) { html[data-skin="c"] .landing-hero .hero-title { font-size: clamp(7.5rem, 11vw, 9.375rem); } }

/* ---- 讲义页：墨色标题带（U75 恢复，杂志配色性格）+ 900 黑体标题 ----
   带是通栏的；盒子的留白/栏宽归共享骨架。≥1024 分栏时目录列在行 1 会被通栏带的
   100vmax 外扩压在下面 → 带跨两列成首行、目录退到行 2（带的渲染机制，非版式性格）；
   正文起点不变。标题用 --on-ink 对墨带 ≥4.5（theme-check ④b 在盯）。 */
html[data-skin="c"] body:has([data-reading-body]) .page-head { background: var(--ink); color: var(--on-ink); box-shadow: 0 0 0 100vmax var(--ink); clip-path: inset(0 -100vmax); } /* (0,3,2) 前缀压过 reading.css 基线 background:none，带才画得出来 */
html[data-skin="c"] body:has([data-reading-body]) .breadcrumb,
html[data-skin="c"] body:has([data-reading-body]) .breadcrumb a { color: var(--on-ink); } /* U75：带上同语言回 on-ink（亮 16.69 / 暗 4.9，均 ≥4.5） */
html[data-skin="c"] body:has([data-reading-body]) h1.page-title { font: 900 var(--fs-44)/1.1 var(--font-kai), var(--font-display); letter-spacing: -.02em; color: var(--on-ink); text-wrap: balance; }
@media (min-width: 768px) { html[data-skin="c"] body:has([data-reading-body]) h1.page-title { font-size: var(--fs-60); } }
@media (min-width: 1024px) {
  html[data-skin="c"] body:has([data-reading-body]) main:has(> .toc) > .page-head { grid-column: 1 / -1; }
  html[data-skin="c"] body:has([data-reading-body]) main:has(> .toc) > .toc { grid-row: 2 / span 6; }
}

/* ---- 栏目上边线：4px 黑色粗规则线（分隔线样式装饰，杂志签名；位置间距在共享骨架） ---- */
html[data-skin="c"] .card { border-top: 4px solid var(--text); }
html[data-skin="c"] .card h2 { font: 900 var(--fs-30)/1.2 var(--font-display); letter-spacing: 0; color: var(--text); }
@media (min-width: 768px) { html[data-skin="c"] .card h2 { font-size: var(--fs-44); } }
html[data-skin="c"] article h2 { font: 900 var(--fs-30)/1.15 var(--font-kai), var(--font-display); border-top: 4px solid var(--text); }
html[data-skin="c"] article h3 { font: 900 var(--fs-22)/1.3 var(--font-kai), var(--font-display); }
html[data-skin="c"] article h4 { font: 900 var(--fs-18)/1.4 var(--font-kai), var(--font-display); }
@media (min-width: 768px) { html[data-skin="c"] article h2 { font-size: var(--fs-44); } html[data-skin="c"] article h3 { font-size: var(--fs-26); } }
/* U15p P3.8：小节标题退出红强调——h2 内的锡点锚链承墨色无饰线（配色） */
html[data-skin="c"] article h2 a { color: inherit; text-decoration: none; }

/* ---- 目录：粗黑上边线（分隔线装饰）+ 当前页红（配色） ---- */
html[data-skin="c"] .toc { background: none; border: 0; border-top: 4px solid var(--text); border-radius: 0; }
@media (min-width: 1024px) { html[data-skin="c"] main:has(> .toc) > .toc { border-top: 4px solid var(--text); } }
html[data-skin="c"] .toc a[aria-current="true"] { color: var(--accent); }

/* ---- 阅读工具栏：墨色（配色） ---- */
html[data-skin="c"] .reading-tools { background: var(--ink); color: var(--on-ink); }
html[data-skin="c"] .reading-tools .ctl, html[data-skin="c"] .reading-tools .seg-btn { background: transparent; color: var(--on-ink); border-color: rgb(255 255 255 / .32); }
html[data-skin="c"] .reading-tools .ctl:hover, html[data-skin="c"] .reading-tools .seg-btn:hover { color: var(--acc-ink); border-color: var(--acc-ink); }
html[data-skin="c"] .reading-tools .seg-pos { color: color-mix(in srgb, var(--on-ink) 80%, transparent); }

/* ---- 正文语义（配色）：结构（字体/字号/行高/缩排/2px 饰线）在共享骨架；
   c 的差异只有颜色：引文饰线承 accent 红、脚注注色红族、上边线实线（分隔线样式） ---- */
html[data-skin="c"] article .quote--saying { border-left-color: var(--text); }
html[data-skin="c"] body:has([data-reading-body]) article p.quote--saying { border-left-color: var(--text); } /* U58：墨线才与红经引一眼可分 */
html[data-skin="c"] article .fn-note { color: var(--note); border-top: 1px solid var(--border); padding-top: var(--space-2); }
html[data-skin="c"] article .fn-note--editor { color: var(--text-secondary); }
html[data-skin="c"] article .fn-src { color: var(--note); }

/* ---- 页脚：墨色通栏（配色 + 出血渲染） ----
   U15p：body 底垫用墨色背景条填实（不占布局，footerBottom ≤ toolsTop） */
html[data-skin="c"] body { padding-bottom: calc(128px + env(safe-area-inset-bottom)); background-image: linear-gradient(var(--ink), var(--ink)); background-position: bottom; background-size: 100% calc(128px + env(safe-area-inset-bottom)); background-repeat: no-repeat; }
html[data-skin="c"] .site-footer { background: var(--ink); color: color-mix(in srgb, var(--on-ink) 75%, transparent); border: 0; padding: var(--space-12) max(var(--space-4), calc((100% - 75rem) / 2 + var(--space-8))); margin-top: var(--space-8); } /* U99：内衬对齐共享骨架 75rem（原 90rem 随旧主栏宽退场） */
html[data-skin="c"] .site-footer .footer-tools a { color: var(--on-ink); } /* U42 P18 */
