/* ============================================================
   rl-control 学习指南站点样式
   专业排版 · 清晰层次 · light/dark 双模式 · 移动/打印友好
   ============================================================
   约束：纯 CSS（含 CSS 变量），不改 JS/HTML/Python。
   兼容：保留全部既有 class/id，新增 .evo-* / img.svg-lineage
        等统一样式（即便渲染器另注入内联
        样式也不会冲突——内联优先级更高）。
   ============================================================ */

/* ---------- 设计 tokens（light） ---------- */
:root {
  color-scheme: light;
  /* 背景与前景 */
  --c-bg:        #eceff3;   /* 页面底色（比 #fff 深约 6%，容器/表格明确浮起） */
  --c-text:      #1f2328;   /* 主要正文 */
  --c-muted:     #57606a;   /* 辅助文字 */
  --c-faint:     #8c959f;   /* 更弱的辅助 */
  /* 品牌与强调（WCAG AA on white） */
  --c-primary:   #0969da;   /* 蓝 */
  --c-primary-h: #0550ae;   /* 蓝 hover 加深 */
  --c-accent:    #6f42c1;   /* 紫 */
  --c-accent-h:  #4c2889;
  --c-warn:      #9a6700;
  --c-good:      #1a7f37;
  --c-warn-h:    #bf8700;
  --c-good-h:    #2da44e;
  --c-danger:    #cf222e;
  /* 卡片 / 边框 */
  --c-card:      #ffffff;
  --c-card-alt:  #f6f8fa;
  --c-border:    #d0d7de;
  --c-border-h:  #afb8c1;
  /* 标签 */
  --c-tag-bg:    #ddf4ff;
  --c-tag-text:  #0969da;
  /* 语义 callout 底色 */
  --c-warn-bg:   #fff8c5;
  --c-good-bg:   #dafbe1;
  --c-tip-bg:    #fbefff;
  --c-info-bg:   #ddf4ff;
  /* 代码 */
  --c-code-bg:   #f6f8fa;
  --c-code-text: #24292f;
  /* 阴影 / 圆角 / 节奏 */
  --shadow-xs:   0 1px 0 rgba(31,35,40,.04);
  --shadow-sm:   0 1px 3px rgba(31,35,40,.06), 0 1px 2px rgba(31,35,40,.04);
  --shadow-md:   0 3px 8px rgba(31,35,40,.08), 0 2px 4px rgba(31,35,40,.06);
  --shadow-lg:   0 12px 28px rgba(31,35,40,.12), 0 4px 8px rgba(31,35,40,.06);
  --radius-xs:   4px;
  --radius-sm:   6px;
  --radius:      10px;
  --radius-lg:   14px;
  --radius-pill: 999px;
  /* 字体 */
  --font-sans:   system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
                 "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
                 "Helvetica Neue", Arial, sans-serif;
  --font-mono:   "SFMono-Regular", ui-monospace, Consolas,
                 "Liberation Mono", Menlo, monospace;
  /* 节奏 */
  --content-max: 820px;        /* 正文最大宽度 */
  --transition:  150ms cubic-bezier(.4,0,.2,1);
}

/* ---------- 设计 tokens（dark） ----------
   手动 + 系统 dark 双触发：
     - [data-theme="dark"]                  → 用户手动选 dark（任意系统）
     - @media prefers-color-scheme: dark
         :root:not([data-theme="light"])    → 系统 dark 且用户未手动选 light
   两块变量完全一致；render_research.py / render_content.py 在 <head> 内联
   一段 pre-DOM 脚本读 localStorage 立即写 data-theme，避免 FOUC。
   ------------------------------------------------------------ */

/* A. 手动 dark：[data-theme="dark"]（与系统主题无关） */
:root[data-theme="dark"] {
  color-scheme: dark;
  --c-bg:        #0d1117;
  --c-text:      #e6edf3;
  --c-muted:     #8b949e;
  --c-faint:     #6e7681;
  --c-primary:   #58a6ff;
  --c-primary-h: #79c0ff;
  --c-accent:    #bc8cff;
  --c-accent-h:  #d2a8ff;
  --c-warn:      #d29922;
  --c-good:      #3fb950;
  --c-warn-h:    #e3b341;
  --c-good-h:    #56d364;
  --c-danger:    #f85149;
  --c-card:      #161b22;
  --c-card-alt:  #1c2128;
  --c-border:    #30363d;
  --c-border-h:  #484f58;
  --c-tag-bg:    rgba(56,139,253,.18);
  --c-tag-text:  #79c0ff;
  --c-warn-bg:   rgba(187,128,9,.18);
  --c-good-bg:   rgba(63,185,80,.16);
  --c-tip-bg:    rgba(188,140,255,.16);
  --c-info-bg:   rgba(56,139,253,.16);
  --c-code-bg:   #161b22;
  --c-code-text: #e6edf3;
  --shadow-xs:   0 1px 0 rgba(0,0,0,.4);
  --shadow-sm:   0 1px 3px rgba(0,0,0,.5), 0 1px 2px rgba(0,0,0,.4);
  --shadow-md:   0 3px 8px rgba(0,0,0,.55), 0 2px 4px rgba(0,0,0,.45);
  --shadow-lg:   0 12px 28px rgba(0,0,0,.65), 0 4px 8px rgba(0,0,0,.45);
}

/* B. 系统 dark：仅当用户未手动选 light（:not([data-theme="light"]）。
   无 data-theme 属性 = 跟随系统；data-theme="dark" 时 A 已覆盖，此处重复无害。 */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --c-bg:        #0d1117;
    --c-text:      #e6edf3;
    --c-muted:     #8b949e;
    --c-faint:     #6e7681;
    --c-primary:   #58a6ff;
    --c-primary-h: #79c0ff;
    --c-accent:    #bc8cff;
    --c-accent-h:  #d2a8ff;
    --c-warn:      #d29922;
    --c-good:      #3fb950;
    --c-warn-h:    #e3b341;
    --c-good-h:    #56d364;
    --c-danger:    #f85149;
    --c-card:      #161b22;
    --c-card-alt:  #1c2128;
    --c-border:    #30363d;
    --c-border-h:  #484f58;
    --c-tag-bg:    rgba(56,139,253,.18);
    --c-tag-text:  #79c0ff;
    --c-warn-bg:   rgba(187,128,9,.18);
    --c-good-bg:   rgba(63,185,80,.16);
    --c-tip-bg:    rgba(188,140,255,.16);
    --c-info-bg:   rgba(56,139,253,.16);
    --c-code-bg:   #161b22;
    --c-code-text: #e6edf3;
    --shadow-xs:   0 1px 0 rgba(0,0,0,.4);
    --shadow-sm:   0 1px 3px rgba(0,0,0,.5), 0 1px 2px rgba(0,0,0,.4);
    --shadow-md:   0 3px 8px rgba(0,0,0,.55),  0 2px 4px rgba(0,0,0,.45);
    --shadow-lg:   0 12px 28px rgba(0,0,0,.65), 0 4px 8px rgba(0,0,0,.45);
  }
}

/* ---------- 全局 / reset ---------- */
*, *::before, *::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
  /* 给锚点跳转留出 sticky 顶栏的空间 */
  scroll-padding-top: 24px;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  padding: 0;
  background: var(--c-bg);
  color: var(--c-text);
  font-family: var(--font-sans);
  font-size: 16px;
  line-height: 1.75;
  letter-spacing: .003em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-feature-settings: "kern", "liga", "calt";
}

img, svg, video { max-width: 100%; height: auto; }

a {
  color: var(--c-primary);
  text-decoration: none;
  transition: color var(--transition), border-color var(--transition);
}
a:hover  { color: var(--c-primary-h); text-decoration: underline; }
a:active { color: var(--c-primary-h); }
a:focus-visible {
  outline: 2px solid var(--c-primary);
  outline-offset: 2px;
  border-radius: 3px;
}

::selection {
  background: var(--c-tag-bg);
  color: var(--c-tag-text);
}

/* 自定义滚动条（仅 webkit） */
::-webkit-scrollbar       { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--c-border); border-radius: 999px; border: 2px solid var(--c-bg); }
::-webkit-scrollbar-thumb:hover { background: var(--c-border-h); }

/* ============================================================
   布局
   ============================================================ */
.layout {
  display: grid;
  grid-template-columns: 280px minmax(0, 1fr);
  max-width: 1400px;
  width: 100%;
  margin: 0 auto;
  min-height: 100vh;
}

/* ---------- 侧边栏 ---------- */
.sidebar {
  position: sticky;
  top: 0;
  min-width: 0;
  height: 100vh;
  overflow-y: auto;
  padding: 28px 18px 40px;
  border-right: 1px solid var(--c-border);
  background: var(--c-card);
  background-image:
    linear-gradient(to bottom, var(--c-card), var(--c-card));
}
.sidebar .brand {
  font-size: 18px;
  font-weight: 700;
  letter-spacing: -.01em;
  margin-bottom: 4px;
  color: var(--c-text);
  /* 品牌行改 flex：左标题 + 右主题切换按钮 */
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.sidebar .brand-sub {
  font-size: 12px;
  color: var(--c-muted);
  margin-bottom: 24px;
  line-height: 1.5;
}
/* 主题切换按钮（sidebar 品牌区右侧；onclick="toggleTheme()"，theme.js 提供） */
.theme-toggle {
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  padding: 0;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  background: var(--c-card-alt);
  color: var(--c-text);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  font-family: inherit;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: border-color var(--transition), background var(--transition),
              transform var(--transition);
}
.theme-toggle:hover {
  border-color: var(--c-primary);
  transform: translateY(-1px);
}
.theme-toggle:focus-visible {
  outline: 3px solid var(--c-tag-bg);
  outline-offset: 2px;
}
.theme-toggle:active { transform: translateY(0); }
.sidebar nav .group { margin-bottom: 20px; }
.sidebar nav .group-title {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--c-muted);
  font-weight: 700;
  padding: 0 8px 6px;
}
.sidebar nav a {
  display: block;
  padding: 6px 10px;
  border-radius: var(--radius-sm);
  color: var(--c-text);
  font-size: 14px;
  line-height: 1.45;
  border-left: 2px solid transparent;
  transition: background var(--transition), color var(--transition);
}
.sidebar nav a:hover {
  background: var(--c-card-alt);
  text-decoration: none;
  color: var(--c-primary);
}
.sidebar nav a.active {
  background: var(--c-tag-bg);
  color: var(--c-tag-text);
  font-weight: 600;
}

/* ============================================================
   主内容（正文）
   ============================================================ */
.main {
  padding: 40px 56px 96px;
  max-width: calc(var(--content-max) + 112px); /* 正文宽 + 左右 padding */
  min-width: 0;
  width: 100%;
  overflow-wrap: break-word;
  word-break: break-word;
}

.main > *,
.paper-widgets {
  min-width: 0;
}

/* 正文内部的可读区块（不约束全宽 grid/table） */
.main > p,
.main > ul,
.main > ol,
.main > blockquote,
.main > pre,
.main > .callout,
.main > .paper-card,
.main > .timeline,
.main > figure { max-width: var(--content-max); }

/* ---------- 标题层次 ---------- */
.main h1 {
  font-size: 2em;           /* 32 px */
  line-height: 1.2;
  letter-spacing: -.02em;
  font-weight: 800;
  margin: 0 0 10px;
  color: var(--c-text);
}
.main h2 {
  font-size: 1.5em;         /* 24 px */
  line-height: 1.3;
  letter-spacing: -.01em;
  font-weight: 700;
  margin: 44px 0 14px;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--c-border);
}
.main h3 {
  font-size: 1.25em;        /* 20 px */
  line-height: 1.35;
  letter-spacing: -.005em;
  font-weight: 700;
  margin: 32px 0 8px;
  color: var(--c-text);
}
.main h4 {
  font-size: 1em;           /* 16 px */
  font-weight: 700;
  margin: 22px 0 6px;
  color: var(--c-text);
}
.main h5, .main h6 {
  font-size: .92em;
  font-weight: 700;
  color: var(--c-muted);
  margin: 18px 0 6px;
}

.main p  { margin: 12px 0; }
.main ul, .main ol { padding-left: 26px; margin: 12px 0; }
.main li { margin: 6px 0; }
.main li::marker { color: var(--c-muted); }

.main strong, .main b { font-weight: 700; color: var(--c-text); }
.main em, .main i { font-style: italic; }

/* 引文 / 引用块 */
.main blockquote {
  margin: 18px 0;
  padding: 8px 18px;
  border-left: 4px solid var(--c-border);
  color: var(--c-muted);
  background: var(--c-card-alt);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.main blockquote p { margin: 6px 0; }

/* 段落小注 */
.muted { color: var(--c-muted); }
.hint  { font-size: 13px; color: var(--c-muted); }

/* 水平分隔 */
.main hr {
  border: 0;
  border-top: 1px solid var(--c-border);
  margin: 36px 0;
}

/* ============================================================
   卡片 / 提示（callout）
   ============================================================ */
.callout {
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-left: 4px solid var(--c-primary);
  border-radius: var(--radius);
  padding: 14px 18px;
  margin: 18px 0;
  box-shadow: var(--shadow-sm);
  color: var(--c-text);
  transition: box-shadow var(--transition);
}
.callout:hover { box-shadow: var(--shadow-md); }
.callout > p:first-child { margin-top: 0; }
.callout > p:last-child  { margin-bottom: 0; }
.callout.warn  { border-left-color: var(--c-warn-h); background: var(--c-warn-bg); }
.callout.good  { border-left-color: var(--c-good-h); background: var(--c-good-bg); }
.callout.tip   { border-left-color: var(--c-accent); background: var(--c-tip-bg); }
.callout .ttl,
.callout > strong:first-child {
  font-weight: 700;
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 6px;
  font-size: 14px;
  letter-spacing: .01em;
  color: var(--c-text);
}

/* ============================================================
   标签 / chip / badge
   ============================================================ */
.tag {
  display: inline-flex;
  align-items: center;
  padding: 2px 10px;
  border-radius: var(--radius-pill);
  background: var(--c-tag-bg);
  color: var(--c-tag-text);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .02em;
  margin: 0 4px 4px 0;
  line-height: 1.6;
  white-space: nowrap;
}
.tag.year { background: var(--c-card-alt); color: var(--c-muted); }
.tag.amp  { background: #fbe6ff; color: #8957e5; }
/* dark：手动 [data-theme="dark"] 或系统 dark 且未手动选 light */
:root[data-theme="dark"] .tag.amp { background: rgba(188,140,255,.18); color: #d2a8ff; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .tag.amp { background: rgba(188,140,255,.18); color: #d2a8ff; }
}

.chip, .badge {
  display: inline-block;
  padding: 2px 8px;
  font-size: 12px;
  font-weight: 600;
  border-radius: var(--radius-sm);
  border: 1px solid var(--c-border);
  background: var(--c-card-alt);
  color: var(--c-muted);
}
.badge-ok    { color: var(--c-good);  border-color: var(--c-good-h); background: var(--c-good-bg); }
.chip-row    { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }

/* ============================================================
   论文卡片
   ============================================================ */
.paper-card {
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  padding: 16px 20px;
  margin: 18px 0;
  background: var(--c-card);
  box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition), transform var(--transition);
}
.paper-card:hover { box-shadow: var(--shadow-md); }
.paper-card h4 {
  margin-top: 0;
  font-size: 17px;
  letter-spacing: -.005em;
}
.paper-card .meta {
  color: var(--c-muted);
  font-size: 13px;
  margin: 4px 0 10px;
}
.paper-card .links a { margin-right: 14px; font-size: 13px; }
.paper-card .summary { margin: 8px 0; }
.paper-card .analysis {
  margin-top: 12px;
  padding-top: 10px;
  border-top: 1px dashed var(--c-border);
  font-size: 14px;
  color: var(--c-text);
}
.paper-card .analysis b { color: var(--c-accent); }

/* ============================================================
   时间线
   ============================================================ */
.timeline { position: relative; padding-left: 30px; margin: 22px 0; }
.timeline::before {
  content: '';
  position: absolute;
  left: 8px; top: 4px; bottom: 4px;
  width: 2px;
  background: linear-gradient(to bottom, var(--c-primary), var(--c-border));
}
.timeline .ev { position: relative; margin-bottom: 20px; }
.timeline .ev::before {
  content: '';
  position: absolute;
  left: -27px; top: 6px;
  width: 12px; height: 12px;
  border-radius: 50%;
  background: var(--c-primary);
  border: 2px solid var(--c-bg);
  box-shadow: 0 0 0 2px var(--c-border);
}
.timeline .ev .when {
  font-size: 12px;
  color: var(--c-muted);
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
}
.timeline .ev .what { font-size: 15px; margin-top: 2px; }

/* ============================================================
   表格
   ============================================================ */
.table-wrap {
  max-width: 100%;
  overflow-x: auto;
  overscroll-behavior-inline: contain;
  -webkit-overflow-scrolling: touch;
  margin: 16px 0;
}
table {
  border-collapse: collapse;
  background: var(--c-card);   /* 白底，明确浮在 #eceff3 页面上 */
  width: 100%;
  margin: 16px 0;
  font-size: 14px;
  line-height: 1.5;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
thead { background: #e8ebee; }   /* 比 --c-card(#fff) 深约 7%，表头清晰可辨 */
th, td {
  border: 1px solid var(--c-border);
  padding: 10px 14px;
  text-align: left;
  vertical-align: top;
}
th {
  font-weight: 700;
  font-size: 13px;
  letter-spacing: .02em;
  color: var(--c-text);
  background: #e8ebee;   /* 表头底（比 #fff 深约 7%），与 white 表底形成层次 */
  position: sticky;
  top: 0;
}
tbody tr { transition: background var(--transition); }
tbody tr:nth-child(even) td { background: #f5f6f8; }   /* 斑马纹（比 #fff 深约 3%，可见） */
tbody tr:hover td { background: var(--c-info-bg); }
td > p:first-child, th > p:first-child { margin-top: 0; }
td > p:last-child,  th > p:last-child  { margin-bottom: 0; }

/* dark mode：light 把 thead/th/zebra 硬编码为浅色（在 white 表底上加深），
   dark 表底是 --c-card(#161b22) 深色，需改回 --c-card-alt(#1c2128，更浅)
   才能在深表底上辨识。覆盖 both 手动 [data-theme="dark"] 与系统 dark。 */
:root[data-theme="dark"] thead,
:root[data-theme="dark"] th { background: var(--c-card-alt); }
:root[data-theme="dark"] tbody tr:nth-child(even) td { background: var(--c-card-alt); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) thead,
  :root:not([data-theme="light"]) th { background: var(--c-card-alt); }
  :root:not([data-theme="light"]) tbody tr:nth-child(even) td { background: var(--c-card-alt); }
}

/* ============================================================
   代码
   ============================================================ */
pre, code, kbd, samp {
  font-family: var(--font-mono);
  font-size: .9em;
}
code {
  background: var(--c-code-bg);
  color: var(--c-code-text);
  padding: 2px 6px;
  border-radius: var(--radius-xs);
  border: 1px solid var(--c-border);
  font-size: 85%;
  overflow-wrap: anywhere;
  word-break: normal;
}
pre {
  background: var(--c-code-bg);
  color: var(--c-code-text);
  padding: 16px 18px;
  border-radius: var(--radius);
  overflow-x: auto;
  max-width: 100%;
  overscroll-behavior-inline: contain;
  border: 1px solid var(--c-border);
  box-shadow: var(--shadow-xs);
  font-size: 13px;
  line-height: 1.6;
}
pre code {
  background: transparent;
  padding: 0;
  border: 0;
  font-size: inherit;
  word-break: normal;
}

/* ============================================================
   SVG / 图（含 svg-lineage 谱系图）
   ============================================================ */
figure {
  margin: 28px 0;
  text-align: center;
}
figure svg, figure img { max-width: 100%; height: auto; }
figcaption {
  font-size: 13px;
  color: var(--c-muted);
  margin-top: 10px;
  font-style: italic;
}

/* 渲染器把谱系 SVG 作为 <img class="svg-lineage"> 引入 */
img.svg-lineage,
.svg-lineage {
  display: block;
  margin: 24px auto;
  max-width: 100%;
  height: auto;
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  padding: 12px;
  box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition);
}
img.svg-lineage:hover { box-shadow: var(--shadow-md); }

/* 引用关系图容器 */
.citation-graph {
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  padding: 16px;
  margin: 18px 0;
  overflow-x: auto;
  box-shadow: var(--shadow-sm);
}

/* ============================================================
   章节导航（上 / 下一篇）
   ============================================================ */
.chapter-nav {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  margin: 48px 0 0;
  padding-top: 22px;
  border-top: 1px solid var(--c-border);
}
.chapter-nav a {
  padding: 10px 16px;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  font-size: 14px;
  background: var(--c-card);
  transition: all var(--transition);
  max-width: 48%;
}
.chapter-nav a:hover {
  border-color: var(--c-primary);
  color: var(--c-primary);
  text-decoration: none;
  box-shadow: var(--shadow-sm);
  transform: translateY(-1px);
}

/* ============================================================
   线索页章节 TOC（浮动迷你目录）
   - 仅在 render_page 检测到 ≥4 个 H2 时注入（短页不渲染）。
   - 桌面：sticky + float:right，正文右侧常驻；正文自动让出宽度环绕。
   - 移动（≤900px）：static + 100% 宽，正文顶部完整展示。
   - 与 .chapter-nav（页脚导航）和 .breadcrumb（位置）配套：知道在哪 + 怎么跳。
   ============================================================ */
.page-toc {
  float: right;
  width: 200px;
  margin: 12px 0 16px 24px;
  padding: 10px 14px 12px;
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-xs);
  position: sticky;
  top: 20px;
  z-index: 4;
  font-size: 0.85em;
  color: var(--c-muted);
  align-self: start;
}
.page-toc__title {
  margin: 0;
  font-weight: 700;
  color: var(--c-text);
  font-size: 0.95em;
  padding-bottom: 4px;
}
.page-toc ul {
  list-style: none;
  padding: 6px 0 0;
  margin: 0;
  border-top: 1px dashed var(--c-border);
}
.page-toc li { margin: 3px 0; line-height: 1.45; }
.page-toc a {
  display: block;
  padding: 3px 4px;
  color: var(--c-muted);
  text-decoration: none;
  border-radius: var(--radius-xs);
  transition: background var(--transition), color var(--transition);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.page-toc a:hover {
  background: var(--c-card-alt);
  color: var(--c-primary);
}

/* 主题页补充内容与手机目录：都用原生 disclosure，不依赖脚本。 */
.page-toc-mobile { display: none; }
.optional-review,
.page-toc-mobile {
  margin: 18px 0;
  padding: 0 14px 12px;
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
}
.optional-review > summary,
.page-toc-mobile > summary {
  padding: 12px 0;
  color: var(--c-text);
  cursor: pointer;
  font-weight: 700;
}
.optional-review > summary::marker,
.page-toc-mobile > summary::marker { color: var(--c-primary); }
.page-toc-mobile ul {
  margin: 0;
  padding: 8px 0 0 20px;
  border-top: 1px dashed var(--c-border);
}
.page-toc-mobile li { margin: 6px 0; }
.page-toc-mobile a { color: var(--c-muted); }
.page-toc-mobile a:hover { color: var(--c-primary); }

/* ============================================================
   回到顶部浮动按钮（全站）
   - 滚动后一键回顶；纯 inline onclick，无 JS 依赖。
   - 移动端也显示；打印时隐藏（与 .chapter-nav 等导航一致）。
   ============================================================ */
.back-to-top {
  position: fixed;
  right: 20px;
  bottom: 20px;
  z-index: 50;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--c-border);
  background: rgba(255, 255, 255, 0.78);
  color: var(--c-text);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  box-shadow: var(--shadow-md);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  transition: background var(--transition),
              color var(--transition),
              transform var(--transition),
              box-shadow var(--transition);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  font-family: inherit;
}
.back-to-top:hover {
  background: var(--c-primary);
  color: #fff;
  border-color: var(--c-primary);
  transform: translateY(-2px);
  box-shadow: var(--shadow-lg);
}
.back-to-top:focus-visible {
  outline: 3px solid var(--c-tag-bg);
  outline-offset: 2px;
}
:root[data-theme="dark"] .back-to-top { background: rgba(22, 27, 34, 0.78); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .back-to-top { background: rgba(22, 27, 34, 0.78); }
}

/* ============================================================
   首页 hero
   ============================================================ */
.hero {
  background: linear-gradient(135deg, #0969da 0%, #6f42c1 60%, #bf3989 100%);
  color: #fff;
  padding: 52px 44px;
  border-radius: var(--radius-lg);
  margin-bottom: 36px;
  box-shadow: var(--shadow-md);
  position: relative;
  overflow: hidden;
}
.hero::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 80% 20%, rgba(255,255,255,.18), transparent 60%);
  pointer-events: none;
}
.hero h1 {
  color: #fff;
  font-size: 2.25em;
  margin: 0 0 10px;
  border: none;
  padding: 0;
  letter-spacing: -.02em;
  position: relative;
}
.hero p {
  font-size: 1.0625em;
  opacity: .96;
  margin: 8px 0;
  position: relative;
}
.hero .meta-line {
  margin-top: 18px;
  font-size: 13px;
  opacity: .88;
  letter-spacing: .02em;
  position: relative;
}
.hero .glossary-stats {
  color: rgba(255, 255, 255, .88);
}

/* ============================================================
   网格卡片（首页方向入口）
   ============================================================ */
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 18px;
  margin: 22px 0;
}
.dir-card {
  display: block;
  padding: 20px;
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  color: var(--c-text);
  box-shadow: var(--shadow-sm);
  transition:
    transform var(--transition),
    box-shadow var(--transition),
    border-color var(--transition);
}
.dir-card:hover {
  transform: translateY(-3px);
  box-shadow: var(--shadow-lg);
  border-color: var(--c-primary);
  text-decoration: none;
}
.dir-card .icon {
  font-size: 26px;
  display: inline-block;
  margin-bottom: 4px;
}
.dir-card .ttl {
  font-weight: 700;
  font-size: 16px;
  margin: 6px 0 4px;
  letter-spacing: -.005em;
}
.dir-card .desc {
  font-size: 13px;
  color: var(--c-muted);
  line-height: 1.55;
}

/* ============================================================
   教学页内容层级
   --------------------------------------------------------
   data-layer 只用于结构着色；所有正文层级始终展示。
   ============================================================ */

/* 深度区块的左侧色带（教学页 section[data-layer]；data-layer 仅内部管线用） */
main section[data-layer],
.main section[data-layer] {
  border-left: 3px solid transparent;
  padding: 4px 0 4px 16px;
  margin-left: -16px;
  border-radius: 2px;
  transition: background var(--transition);
}
main section[data-layer="D0"],   .main section[data-layer="D0"]   { border-left-color: var(--c-good-h); }
main section[data-layer="D1"],   .main section[data-layer="D1"]   { border-left-color: var(--c-primary); }
main section[data-layer="D2"],   .main section[data-layer="D2"]   { border-left-color: var(--c-accent); }
main section[data-layer="D3"],   .main section[data-layer="D3"]   { border-left-color: var(--c-warn-h); }
main section[data-layer="V"],    .main section[data-layer="V"]    { border-left-color: #bf3989; }

/* ============================================================
   演进位置框（evo-box）：建立在前作 / 催生 / 同线索
   ============================================================ */
.callout.evo-box {
  margin: 18px 0 22px;
  padding: 14px 18px 16px;
  border-left-color: var(--c-accent);
  background: var(--c-tip-bg);
}
.callout.evo-box .ttl { font-size: 14px; color: var(--c-accent); }
.evo-row {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 12px;
  margin-top: 8px;
  align-items: baseline;
}
.evo-row > .evo-k {
  font-size: 11px;
  color: var(--c-muted);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .06em;
  flex: 0 0 auto;
  width: 5.5em;
}
.evo-row > .evo-v { flex: 1 1 auto; min-width: 0; }
.evo-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 4px 10px;
}
.evo-list li {
  font-size: 13px;
  line-height: 1.6;
}
.evo-list li::before {
  content: "·";
  color: var(--c-muted);
  margin-right: 6px;
}
.evo-list li:first-child::before { content: none; }
.evo-list a {
  color: var(--c-text);
  border-bottom: 1px dashed var(--c-border);
  transition: color var(--transition), border-color var(--transition);
}
.evo-list a:hover {
  color: var(--c-primary);
  border-bottom-style: solid;
  border-color: var(--c-primary);
  text-decoration: none;
}
.evo-empty { font-size: 13px; color: var(--c-muted); font-style: italic; }

/* ============================================================
   术语自动注解（DESIGN §4.2）
   --------------------------------------------------------
   渲染器把教学页首次出现的术语包成 <dfn class="term" title="...">，
   原生 title 属性即 hover tooltip（无 JS / 无 CDN）。
   ============================================================ */
dfn.term, .term {
  font-style: inherit;
  font-weight: 500;
  border-bottom: 1px dotted var(--c-muted);
  cursor: help;
  text-decoration: none;
  color: inherit;
  transition: color var(--transition), border-color var(--transition);
}
dfn.term:hover, .term:hover {
  border-bottom-style: solid;
  border-color: var(--c-primary);
  color: var(--c-primary);
  background: var(--c-tag-bg);
  border-radius: 2px;
}

/* ============================================================
   MathJax 公式样式
   ============================================================ */
mjx-container {
  max-width: 100%;
  overflow-x: auto;
  overflow-y: hidden;
  overscroll-behavior-inline: contain;
  padding: 4px 0;
}
mjx-container[display="true"] {
  margin: 14px 0;
  background: var(--c-card-alt);
  border-radius: var(--radius-sm);
  padding: 16px;
  border: 1px solid var(--c-border);
}

/* ============================================================
   glossary / 术语表（共用 base；完整样式见文末「术语表页」节）
   --------------------------------------------------------
   沿用既有 class（.glossary-list / .glossary-item / .glossary-alias
   / .glossary-cat / .glossary-count）作为最小排版底座；增强的字母导航、
   分类 chip、卡片、badge 样式统一在本文件末尾定义（后定义优先级更高）。
   ============================================================ */
.glossary-list    { margin: 18px 0; }
.glossary-item > b, .glossary-item > strong {
  font-size: 1em;
  color: var(--c-text);
}
.glossary-alias   { color: var(--c-muted); font-size: 13px; }
.glossary-count   { color: var(--c-muted); font-size: 13px; }

/* 内容页页脚 */
.content-footer {
  margin-top: 48px;
  padding-top: 18px;
  border-top: 1px solid var(--c-border);
  color: var(--c-muted);
  font-size: 13px;
}

/* 通用 stats 行 */
.stats {
  display: flex;
  flex-wrap: wrap;
  gap: 18px;
  margin: 18px 0;
  font-size: 13px;
  color: var(--c-muted);
}

/* ============================================================
   响应式
   ============================================================ */
@media (max-width: 900px) {
  .layout {
    grid-template-columns: minmax(0, 1fr);
    width: 100%;
    max-width: 100%;
  }
  .sidebar {
    position: relative;
    height: auto;
    border-right: none;
    border-bottom: 1px solid var(--c-border);
    padding: 20px 18px;
  }
  .main {
    width: 100%;
    max-width: 100%;
    padding: 28px 22px 72px;
  }
  .main > p,
  .main > ul,
  .main > ol,
  .main > blockquote,
  .main > pre,
  .main > .callout,
  .main > .paper-card,
  .main > .timeline,
  .main > figure { max-width: none; }
  /* 主题页：首屏摘要后只显示按需打开的紧凑目录。 */
  .page-toc {
    display: none;
  }
  .page-toc-mobile { display: block; }
}

/* 真正的移动端：折叠侧栏更紧凑 */
@media (max-width: 768px) {
  body { font-size: 15px; }
  .main { padding: 22px 16px 60px; }
  .main h1 { font-size: 1.7em; }
  .main h2 { font-size: 1.3em; margin: 32px 0 10px; }
  .main h3 { font-size: 1.1em; }
  .hero { padding: 36px 22px; border-radius: var(--radius); }
  .hero h1 { font-size: 1.7em; }
  .grid { grid-template-columns: 1fr; gap: 12px; }
  .chapter-nav { flex-direction: column; }
  .chapter-nav a { max-width: 100%; }
  .paper-card { padding: 14px 16px; }
  pre { padding: 12px; font-size: 12px; }
  mjx-container[display="true"] { padding: 10px; font-size: .9em; }
}

@media (max-width: 480px) {
  .main { padding: 18px 12px 52px; }
  .hero { padding: 24px 16px; }
  .paper-card,
  .callout,
  figure { padding-left: 12px; padding-right: 12px; }
  .featured-grid,
  .entry-grid,
  .mini-grid,
  .bottom-links {
    grid-template-columns: minmax(0, 1fr);
  }
  .ts-title {
    min-width: 0;
    flex-basis: calc(100% - 2.5rem);
  }
}

@media (max-width: 360px) {
  /* 极窄屏已有页脚“顶部”链接；隐藏浮动按钮可避免它与宽表滚动区争抢空间。 */
  .back-to-top { display: none; }
}

/* ============================================================
   打印
   ============================================================ */
@media print {
  :root {
    --c-bg: #fff;
    --c-text: #000;
    --c-muted: #444;
    --c-card: #fff;
    --c-card-alt: #fff;
    --c-border: #ccc;
    --c-code-bg: #f5f5f5;
    --c-tag-bg: #f0f0f0;
    --c-tag-text: #000;
  }
  html { scroll-behavior: auto; }
  body {
    background: #fff !important;
    color: #000 !important;
    font-size: 11pt;
    line-height: 1.5;
  }
  .layout { display: block; max-width: none; }
  .sidebar, .chapter-nav, .hero, .search-bar,
  .page-toc, .page-toc-mobile, .back-to-top { display: none !important; }
  .main {
    padding: 0;
    margin: 0;
    max-width: none;
  }
  .main > p,
  .main > ul,
  .main > ol,
  .main > blockquote,
  .main > pre,
  .main > .callout,
  .main > .paper-card,
  .main > .timeline,
  .main > figure { max-width: none; }
  /* depth 分层永远展开 */
  main section[data-layer][hidden],
  .main section[data-layer][hidden] { display: block !important; }
  a { color: #000; text-decoration: underline; }
  a[href]::after {
    content: " (" attr(href) ")";
    font-size: 9pt;
    color: #555;
  }
  a[href^="#"]::after, a[href^="javascript"]::after { content: none; }
  pre, code { background: #f5f5f5 !important; color: #000 !important; }
  .callout, .paper-card, .dir-card {
    box-shadow: none !important;
    border: 1px solid #ccc;
    page-break-inside: avoid;
  }
  img.svg-lineage { box-shadow: none; border: 1px solid #ccc; page-break-inside: avoid; }
  h1, h2, h3 { page-break-after: avoid; }
}

/* ============================================================
   过动效降级（无障碍）
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition-duration: 0ms !important;
    animation-duration: 0ms !important;
    animation-iteration-count: 1 !important;
    scroll-behavior: auto !important;
  }
}

/* ============================================================
   面包屑（教学页内：首页 › 自学教材 › 线索 › 当前页）
   - 易学性：学习者一进门就知道自己在知识树的哪条枝上。
   - 与 .chapter-nav（页脚导航）配套，组成「知道在哪 + 怎么继续」。
   ============================================================ */
.breadcrumb {
  font-size: 0.85em;
  color: var(--c-muted);
  padding: 0 2px 10px;
  margin: 0 0 14px;
  line-height: 1.6;
  border-bottom: 1px dashed var(--c-border);
  word-break: break-word;
}
.breadcrumb a {
  color: var(--c-muted);
  text-decoration: none;
}
.breadcrumb a:hover {
  color: var(--c-primary);
  text-decoration: underline;
}
/* › 分隔符：每个链接后追加，最后一个 <span>（当前页）不是 <a> 故自动无分隔 */
.breadcrumb a::after {
  content: " ›";
  margin: 0 6px 0 4px;
  color: var(--c-muted);
  opacity: 0.65;
  font-weight: 400;
}
.breadcrumb span {
  color: var(--c-text);
  font-weight: 600;
}
/* 移动端：面包屑换行不溢出 */
@media (max-width: 720px) {
  .breadcrumb { font-size: 0.8em; }
  .breadcrumb a::after { margin: 0 4px 0 3px; }
}
/* 打印：面包屑与页脚导航一并隐藏（与既有 .chapter-nav 打印规则一致） */
@media print {
  .breadcrumb { display: none !important; }
}

/* ============================================================
   教学页 Q&A 卡片（scripts/render_content.py）
   - 检查点 → 编号卡片组（蓝）
   - 常见误区 → 误区/正确 警告卡片（红/绿）
   - FAQ → 问题与回答直接展示
   纯 CSS；复用全局 tokens；light/dark 双模式；移动/打印友好。
   ============================================================ */

/* ---------- 检查点：编号卡片组 ---------- */
.checkpoint-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 14px;
  margin: 18px 0 24px;
}
.checkpoint-card {
  position: relative;
  background: var(--c-info-bg);
  border: 1px solid var(--c-border);
  border-left: 4px solid var(--c-primary);
  border-radius: var(--radius);
  padding: 14px 16px 14px 56px;
  box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition), transform var(--transition);
}
.checkpoint-card:hover {
  box-shadow: var(--shadow-md);
  transform: translateY(-1px);
}
.checkpoint-num {
  position: absolute;
  top: 12px;
  left: 12px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: var(--c-primary);
  color: #fff;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .02em;
  line-height: 1;
}
.checkpoint-body { min-width: 0; }
.checkpoint-body > p:first-child { margin-top: 0; }
.checkpoint-body > p:last-child { margin-bottom: 0; }
.checkpoint-body code { font-size: .9em; }

/* ---------- 常见误区：警告卡片 ---------- */
.misconception-grid {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin: 18px 0 24px;
}
.misconception-card {
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition);
}
.misconception-card:hover { box-shadow: var(--shadow-md); }
.misconception-warn,
.misconception-fix {
  padding: 10px 14px;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 10px;
  align-items: start;
}
.misconception-warn {
  background: var(--c-warn-bg);
  border-left: 4px solid var(--c-warn-h);
}
.misconception-fix {
  background: var(--c-good-bg);
  border-left: 4px solid var(--c-good-h);
  border-top: 1px solid var(--c-border);
}
.ms-icon {
  font-weight: 700;
  font-size: 13px;
  line-height: 1.65;
  white-space: nowrap;
  color: var(--c-text);
}
.ms-text { min-width: 0; }
.ms-text > p:first-child { margin-top: 0; }
.ms-text > p:last-child { margin-bottom: 0; }
.ms-text code { font-size: .9em; }

/* ---------- FAQ：平铺问答 ---------- */
.faq-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 18px 0 24px;
}
.faq-item {
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition);
}
.faq-item:hover { box-shadow: var(--shadow-md); }
.faq-q {
  margin: 0;
  padding: 11px 14px;
  font-weight: 600;
  font-size: 15px;
  color: var(--c-text);
  line-height: 1.55;
  border-bottom: 1px solid var(--c-border);
  background: var(--c-card-alt);
}
.faq-a {
  padding: 12px 14px;
  color: var(--c-text);
  font-size: 14.5px;
  line-height: 1.7;
}
.faq-a > p:first-child { margin-top: 0; }
.faq-a > p:last-child { margin-bottom: 0; }
.faq-a code { font-size: .9em; }

/* ---------- 移动端：检查点单列 ---------- */
@media (max-width: 720px) {
  .checkpoint-grid { grid-template-columns: 1fr; }
  .checkpoint-card { padding-left: 52px; }
}

/* ---------- 打印：卡片保持完整 ---------- */
@media print {
  .checkpoint-card,
  .misconception-card,
  .faq-item { box-shadow: none; break-inside: avoid; }
}

/* ---------- dark 模式微调（卡片背景已用 token，badge 反色保持可读） ---------- */
:root[data-theme="dark"] .checkpoint-num { color: #0d1117; }   /* 蓝 badge 上深色字更清晰 */
:root[data-theme="dark"] .ms-icon { opacity: .95; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .checkpoint-num { color: #0d1117; }
  :root:not([data-theme="light"]) .ms-icon { opacity: .95; }
}

/* ============================================================
   移动端 + 无障碍审计修复（追加；2026-07）
   --------------------------------------------------------
   audit:
     mobile (≤768px)
       - 表格：markdown 渲染的 <table> 未包 .table-wrap，宽表会挤压
         单元格到不可读；追加 block + overflow-x 让小屏水平滚动。
       - tap target：ds-chip / ds-reset / search-bar input / sidebar
         链接原始高度 ~28-32px，低于 WCAG 2.5.5 推荐 44px；统一拉到
         ≥40px（触屏可用阈值，兼顾信息密度）。
       - search-bar：flex 单行在小屏会截断；改为 wrap，hint 换行。
       - sidebar：900px 已转 relative；768px 再收紧 padding，让正文
         更早进入视口（无 JS 折叠，padding 是纯 CSS 能做的极限）。
       - SVG / figure：全局已有 max-width:100%，再加一层 .main 限定
         保险，防止内联 style 透传。

     a11y
       - .sr-only 工具类：HTML 暂未用，但提供后渲染器/未来页可立即用。
       - .skip-link 容器样式：HTML 若加 <a class="skip-link" href="#main">
         即自动生效（Tab 可见、聚焦滑入）。
       - :focus-visible 全局强化：补足 input、button、[tabindex] 等
         selector 盲区，统一 2px primary
         外环。citation-graph SVG .clickable 节点也获得键盘焦点样式
         （JS 现以 mouseover 驱动；CSS 焦点环是未来键盘化的预留）。
       - prefers-reduced-motion 已存在（line 1012），不重写。
       - 触屏 (hover: none)：把 hover-only 的 translateY / shadow 增强
         降级，避免 sticky hover（移动浏览器点一下会卡在 hover 态）。

   无法在 CSS 内修复的（HTML/JS 改动，已列入审计报告）：
       - search.html #results 缺 aria-live（HTML 改动）。
       - citation-graph.js 用 mouseover/mouseout 驱动 focus，键盘替代
         需 JS 改动（CSS 仅能预留 :focus-visible 样式）。
       - 侧边栏折叠按钮需 JS（小屏 padding 是 CSS 极限）。
   ============================================================ */

/* ---------- 无障碍工具类 ---------- */
/* sr-only：视觉隐藏，屏幕阅读器可读（Bootstrap/HTML5 Boilerplate 同款） */
.sr-only {
  position: absolute !important;
  width: 1px !important; height: 1px !important;
  padding: 0 !important; margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  clip-path: inset(50%) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

/* skip-link：跳到正文。HTML 提供 <a class="skip-link" href="#main"> 即生效 */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 1000;
  padding: 10px 16px;
  background: var(--c-primary);
  color: #fff;
  border-radius: 0 0 var(--radius-sm) var(--radius-sm);
  font-weight: 600;
  font-size: 14px;
}
.skip-link:focus,
.skip-link:focus-visible {
  left: 0;
  color: #fff;
  text-decoration: none;
  outline: 2px solid #fff;
  outline-offset: 2px;
}

/* ---------- 全局键盘 focus 强化（补足既有 selector 盲区） ---------- */
a[href]:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:not([tabindex="-1"]):focus-visible {
  outline: 2px solid var(--c-primary);
  outline-offset: 2px;
  border-radius: 3px;
}

/* citation-graph / field-map 内可点击 SVG 节点的键盘焦点环
   （预留：JS 当前以 mouseover 驱动；键盘化后此样式立即生效） */
.citation-graph svg .clickable:focus-visible,
.citation-graph svg .g-node.clickable:focus-visible,
svg .g-node.clickable:focus-visible {
  outline: 2px solid var(--c-primary);
  outline-offset: 3px;
  border-radius: 4px;
}

/* ---------- 移动端 (≤768px)：tap target + wrap ---------- */
@media (max-width: 768px) {
  /* tap target */
  .search-bar input[type="text"],
  .search-bar input[type="search"],
  #glossary-search {
    min-height: 44px;
  }
  .sidebar nav a {
    min-height: 44px;
    padding-top: 11px;
    padding-bottom: 11px;
  }
  .alpha-chip,
  .cat-chip {
    min-height: 36px;
  }
  .cat-reset {
    min-height: 44px;
    padding-block: 8px;
  }
  .glossary-alpha {
    flex-wrap: nowrap;
    max-width: 100%;
    overflow-x: auto;
    overscroll-behavior-inline: contain;
    -webkit-overflow-scrolling: touch;
  }
  .progress-bar:not(.progress-mini) {
    flex-wrap: wrap;
    gap: 10px;
    padding: 12px 14px;
  }
  .progress-bar:not(.progress-mini) .progress-track {
    flex-basis: 100%;
    min-width: 0;
  }
  .progress-bar:not(.progress-mini) .progress-label {
    max-width: 100%;
    white-space: normal;
  }

  /* search-bar：小屏允许换行；hint 占满一行 */
  .search-bar {
    flex-wrap: wrap;
    gap: 8px;
  }
  .search-bar .hint {
    white-space: normal;
    flex-basis: 100%;
  }

  /* sidebar：再收紧 padding，让正文更早进入视口 */
  .sidebar {
    padding: 16px 14px 22px;
  }
  .sidebar .brand-sub { margin-bottom: 14px; }

  /* SVG / figure / img：再保险，避免任何内联 style 透传撑破视口 */
  .main svg,
  .main img,
  figure svg,
  figure img {
    max-width: 100%;
    height: auto;
  }

  /* citation-graph 容器在小屏严守视口宽 */
  .citation-graph {
    max-width: 100%;
    overflow-x: auto;
  }
}

/* ---------- 触屏降级：hover-only 效果避免 sticky hover ---------- */
@media (hover: none) {
  .dir-card:hover,
  .paper-card:hover,
  .checkpoint-card:hover,
  .misconception-card:hover,
  .faq-item:hover,
  .callout:hover,
  img.svg-lineage:hover {
    transform: none;
    box-shadow: var(--shadow-sm);
  }
  /* 侧边栏链接 hover 不要变色卡住 */
  .sidebar nav a:hover {
    background: transparent;
    color: var(--c-text);
  }
}

/* ---------- 打印：sr-only / skip-link 也隐藏 ---------- */
@media print {
  .sr-only,
  .skip-link { display: none !important; }
}

/* ============================================================
   移动端侧边栏折叠（CSS checkbox hack · 无 JS）
   ----------------------------------------------------------------
   HTML 结构（由 render_research.sidebar() 生成）：
     <input type="checkbox" id="sidebar-toggle" class="sidebar-toggle" hidden>
     <label for="sidebar-toggle" class="sidebar-toggle-label">☰ 菜单</label>
     <aside class="sidebar">...</aside>
   三者同父（.layout）→ `:checked ~ .sidebar` 兄弟选择器可生效。
   桌面端：checkbox/label 由 display:none 隐藏，layout 完全不变。
   打印端：继承 display:none，不会污染打印输出。
   ============================================================ */
.sidebar-toggle,
.sidebar-toggle-label,
.sidebar-overlay { display: none; }

@media (max-width: 768px) {
  /* hamburger 按钮：sticky 顶栏，常驻可见 */
  .sidebar-toggle-label {
    display: flex;
    align-items: center;
    min-height: 48px;
    position: sticky;
    top: 0;
    z-index: 100;
    /* 固定使用能与白字达到 AA 的品牌蓝；dark token 的亮蓝不适合作底色。 */
    background: #0969da;
    color: #fff;
    padding: 12px 16px;
    cursor: pointer;
    font-size: 1.1em;
    line-height: 1.4;
    user-select: none;
    -webkit-user-select: none;
    border-bottom: 1px solid var(--c-border);
  }
  .sidebar-toggle-label:hover {
    background: #0550ae;
  }
  .sidebar-toggle:focus-visible ~ .sidebar-toggle-label {
    outline: 2px solid var(--c-accent);
    outline-offset: -2px;
  }

  /* 侧栏默认移出视口；只用 transform 做抽屉动画。 */
  .sidebar {
    position: fixed;
    left: 0;
    top: 0;
    width: min(80vw, 320px);
    height: 100vh;
    height: 100dvh;
    transform: translateX(-105%);
    transition: transform 0.24s ease;
    overflow-y: auto;
    z-index: 99;
    box-shadow: var(--shadow-lg);
    /* 覆盖 900px 媒体查询里的 relative + border-bottom */
    border-right: 1px solid var(--c-border);
    border-bottom: none;
    padding: calc(64px + env(safe-area-inset-top)) 18px
             calc(40px + env(safe-area-inset-bottom));
  }
  .sidebar-toggle:checked ~ .sidebar {
    transform: translateX(0);
  }
  /* 选中时 hamburger 悬浮 fixed，避免被侧栏遮挡；再点一次关闭 */
  .sidebar-toggle:checked ~ .sidebar-toggle-label {
    position: fixed;
    top: 0;
    left: 0;
    width: min(80vw, 320px);
    padding-top: max(12px, env(safe-area-inset-top));
  }

  .sidebar-overlay {
    position: fixed;
    inset: 0 auto 0 0;
    width: 100vw;
    max-width: 100vw;
    z-index: 98;
    display: block;
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
    background: rgba(0, 0, 0, .48);
    border: 0;
    border-radius: 0;
    padding: 0;
    transition: opacity .24s ease, visibility .24s ease;
  }
  .sidebar-toggle:checked ~ .sidebar-overlay {
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
  }

  html.drawer-open,
  html.drawer-open body,
  body:has(.sidebar-toggle:checked) {
    overflow: hidden;
  }
  .sidebar-toggle:checked ~ .main {
    position: relative;
    z-index: 1;
  }
}

/* 打印：双保险隐藏 hamburger（base rule 已 display:none，但 768px
   媒体查询会让 label 变 block；打印时视口可能 ≤768px → 显式再压一次） */
@media print {
  .sidebar-toggle,
  .sidebar-toggle-label,
  .sidebar-overlay { display: none !important; }
}

/* ============================================================
   全站视觉一致性最终修复（追加；2026-07-21）
   --------------------------------------------------------
   audit findings（仅 CSS 可修部分；HTML/JS 改动另列）：
     A. 渲染 bug 产生 3 处空 callout（<div class="callout"><p></p></div>）：
        - site/papers/P-RMA-2021.html:104
        - site/content/papers/P-GraspNet-2020.html:171
        - site/content/papers/P-AnyGrasp-2023.html:171
        用户会看到带阴影/边框的空盒子 → 用 :has() 防御性隐藏。
        现代 browser（Chrome 105+/Safari 15.4+/Firefox 121+）均支持。
     B. index.html 的 domain-overview SVG 用内联 style 写死
        border:1px solid #eee + background:#fff，dark mode 下出现亮白框；
        SVG 自身已含 <rect fill="#FFFFFF">，外层 #fff/#eee 与暗底冲突。
        dark mode 下覆盖边框颜色与卡片色对齐（背景保留白，因 SVG 内容
        为浅色设计；这与图表暗模式降级到「白卡」惯例一致）。
     C. index.html 第 107 行 figcaption 内联 color:#666，dark mode 下
        #666 在 #0d1117 上对比度不足；用 !important 覆盖回 muted token。
   ============================================================ */

/* A. 防御：隐藏空 callout（任何「仅含一个空 <p>」的 callout） */
.callout:has(> p:only-child:empty),
.callout:has(> p:only-child:whitespace-only) {
  display: none !important;
}

/* B. dark mode：domain-overview SVG 的内联 #eee 边框换成 token 边框 */
:root[data-theme="dark"] img[src$="domain-overview.svg"] {
  border-color: var(--c-border) !important;
  /* background:#fff 保留：SVG 内文本/色块按浅色设计，整体作为「白卡」
     嵌入暗模式页面，与 citation-graph/field-map 浅色图一致。 */
}
:root[data-theme="dark"] figcaption {
  color: var(--c-muted) !important;        /* C. dark mode：figcaption 内联 color:#666 → muted token */
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) img[src$="domain-overview.svg"] {
    border-color: var(--c-border) !important;
  }
  :root:not([data-theme="light"]) figcaption {
    color: var(--c-muted) !important;
  }
}

/* ============================================================
   教学页 meta-bar（难度 / 阅读时间 / reader 理解分）
   --------------------------------------------------------
   位置：面包屑之后、深度选择器之前（site/content/**/*.html）。
   作用：学习者一眼看到本页深度、预计耗时、AI 撰写理解分。
   配色：layer=蓝 / reading-time=灰 / reader-score=绿；pill 圆角。
   dark mode 通过既有 token 自适应（--c-info-bg / --c-card-alt /
   --c-good-bg 均已在 :root dark override 中重写）。
   ============================================================ */
.page-meta-bar{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin:0 0 12px 0;
  padding:0;
  font-size:.85em;
  line-height:1.5;
  align-items:center;
}
.page-meta-bar .badge{
  display:inline-flex;
  align-items:center;
  gap:4px;
  padding:2px 10px;
  border-radius:999px;             /* pill */
  border:1px solid transparent;
  font-weight:500;
  white-space:nowrap;
}
/* 难度 badge：蓝。class 带 layer-badge-{D0|D1|...} 后缀供未来按层着色，
   当前统一蓝（spec：layer=蓝）。*/
.page-meta-bar .layer-badge{
  background:var(--c-info-bg);
  color:var(--c-primary);
  border-color:var(--c-tag-bg);
}
/* 阅读时间：灰。*/
.page-meta-bar .reading-time{
  background:var(--c-card-alt);
  color:var(--c-muted);
  border-color:var(--c-border);
}
/* reader 理解分：绿。border 用半透明绿，dark mode 下单独提亮。*/
.page-meta-bar .reader-score{
  background:var(--c-good-bg);
  color:var(--c-good);
  border-color:rgba(26,127,55,.25);
}
:root[data-theme="dark"] .page-meta-bar .reader-score{
  border-color:rgba(63,185,80,.3);
}
@media(prefers-color-scheme:dark){
  :root:not([data-theme="light"]) .page-meta-bar .reader-score{
    border-color:rgba(63,185,80,.3);
  }
}

/* ============================================================
   检查点 · 参考答案
   问题之后直接展示答案要点，不再要求点击展开。
   ============================================================ */
.checkpoint-answer{
  margin-top:10px;
  padding-top:8px;
  border-top:1px dashed var(--c-border);
}
.checkpoint-answer__label{
  margin:0 0 4px;
  font-weight:600;
  font-size:13.5px;
  color:var(--c-primary);
  line-height:1.55;
}
.checkpoint-answer ul{
  margin:8px 0 2px;
  padding-left:22px;
  color:var(--c-text);
  font-size:13.5px;
  line-height:1.7;
}
.checkpoint-answer ul > li{
  margin:4px 0;
}
.checkpoint-answer ul > li:last-child{
  margin-bottom:0;
}
.checkpoint-answer code{ font-size:.9em; }

/* 打印：参考答案虚线变实线，避免裁切。 */
@media print{
  .checkpoint-answer{ border-top-style:solid; break-inside:avoid; }
}

/* ============================================================
   阅读进度追踪（read-toggle / read-badge / progress-bar）
   --------------------------------------------------------
   纯 vanilla JS + localStorage，离线可用（详见 assets/progress.js）。
   - .read-toggle：教学页底部 pill 按钮（未读灰、已读绿）。
   - .progress-bar：目录页顶部水平进度条 + 文案。
   - .progress-bar.progress-mini：首页迷你 widget（更紧凑）。
   - .read-badge：目录卡片右上角 ✓ 圆标（已读时显示）。
   所有颜色复用 CSS 变量，light / dark 自动一致。
   ============================================================ */

/* 教学页底部 toggle 按钮 */
.read-toggle-wrap{
  display:flex;
  justify-content:center;
  margin:28px 0 12px;
}
.read-toggle{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:9px 22px;
  border:1.5px solid var(--c-border);
  border-radius:var(--radius-pill);
  background:var(--c-card-alt);
  color:var(--c-muted);
  font-family:inherit;
  font-size:14.5px;
  font-weight:600;
  cursor:pointer;
  user-select:none;
  transition:background var(--transition),
             color var(--transition),
             border-color var(--transition),
             transform var(--transition);
}
.read-toggle:hover{
  border-color:var(--c-good);
  color:var(--c-good);
  background:var(--c-good-bg);
  transform:translateY(-1px);
}
.read-toggle:active{ transform:translateY(0); }
.read-toggle:focus-visible{
  outline:2px solid var(--c-primary);
  outline-offset:3px;
}
/* 已读态：绿色填充 + 加粗 ✓。hover 时退回未读态颜色，暗示「点一下取消」。 */
.read-toggle.is-read{
  background:var(--c-good-bg);
  color:var(--c-good);
  border-color:var(--c-good);
}
.read-toggle.is-read:hover{
  background:var(--c-card-alt);
  color:var(--c-muted);
  border-color:var(--c-border);
}

/* 标准进度条（目录页 _index.html） */
.progress-bar{
  display:flex;
  align-items:center;
  gap:16px;
  margin:20px 0;
  padding:14px 20px;
  background:var(--c-card);
  border:1px solid var(--c-border);
  border-radius:var(--radius);
  box-shadow:var(--shadow-sm);
}
.progress-bar .progress-track{
  flex:1 1 auto;
  min-width:140px;
  height:12px;
  background:var(--c-card-alt);
  border:1px solid var(--c-border);
  border-radius:var(--radius-pill);
  overflow:hidden;
}
.progress-bar .progress-fill{
  height:100%;
  width:0;
  background:linear-gradient(90deg, var(--c-good) 0%, var(--c-good-h) 100%);
  border-radius:var(--radius-pill);
  transition:width 450ms cubic-bezier(.4,0,.2,1);
}
.progress-bar .progress-label{
  flex:0 0 auto;
  font-size:13.5px;
  font-weight:600;
  color:var(--c-text);
  white-space:nowrap;
  letter-spacing:.01em;
}

/* 首页迷你 widget（index.html hero 内）
   hero 是渐变背景（.hero::before 有半透明叠层），widget 自身要 position:relative
   才能浮在叠层之上。背景用半透明白（dark 下半透黑），与 hero 渐变形成对比。 */
.progress-bar.progress-mini{
  position:relative;
  display:inline-flex;
  flex:0 0 auto;
  align-items:center;
  gap:10px;
  margin-top:14px;
  padding:6px 14px 6px 8px;
  background:rgba(255,255,255,.16);
  border:1px solid rgba(255,255,255,.28);
  border-radius:var(--radius-pill);
  box-shadow:none;
  backdrop-filter:blur(4px);
  -webkit-backdrop-filter:blur(4px);
}
.progress-bar.progress-mini .pm-track{
  display:inline-block;
  width:84px;
  height:7px;
  background:rgba(255,255,255,.25);
  border:none;
  border-radius:var(--radius-pill);
  overflow:hidden;
  vertical-align:middle;
}
.progress-bar.progress-mini .pm-fill{
  display:block;
  height:100%;
  width:0;
  background:#fff;
  border-radius:var(--radius-pill);
  transition:width 450ms cubic-bezier(.4,0,.2,1);
}
.progress-bar.progress-mini .pm-label{
  font-size:12.5px;
  font-weight:600;
  color:#fff;
  white-space:nowrap;
  letter-spacing:.02em;
}
@media(prefers-color-scheme:dark){
  .progress-bar.progress-mini{
    background:rgba(0,0,0,.22);
    border-color:rgba(255,255,255,.18);
  }
  .progress-bar.progress-mini .pm-track{
    background:rgba(255,255,255,.18);
  }
}

/* 目录卡片角标：右上角 ✓ 圆标（已读才显示） */
.feat-card,
.entry-card,
.dir-card,
.mini-card{
  position:relative;
}
.read-badge{
  position:absolute;
  top:8px;
  right:8px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:22px;
  height:22px;
  border-radius:50%;
  background:var(--c-good);
  color:#fff;
  font-size:12.5px;
  font-weight:700;
  line-height:1;
  box-shadow:var(--shadow-sm);
  z-index:2;
  pointer-events:none;
}
.read-badge:empty{ display:none; }
/* mini-card 紧凑卡：角标略小，避免遮住年份/读者分 badge */
.mini-card .read-badge{
  width:16px;
  height:16px;
  font-size:10px;
  top:5px;
  right:5px;
}
/* entry-card（线索/概念入口）：右上角与 desc 文字重叠风险更低，保持默认 */
/* 打印：badge 不显示（自学状态不上纸面） */
@media print{
  .read-toggle-wrap,
  .read-badge{ display:none !important; }
  .progress-bar{ border:1px solid #000; }
  .progress-bar .progress-fill{
    background:#000 !important;
    print-color-adjust:exact;
    -webkit-print-color-adjust:exact;
  }
}

/* 同线索推荐（教学页发现辅助：演进位置框之后，列出同线索高被引论文）
   颜色全部走 CSS 变量（--c-card-alt / --c-border / --c-text / --c-muted），
   dark 模式下变量自动重定义，无需额外规则。 */
.related-papers{
  margin-top:20px;
}
.related-papers h3{
  font-size:16px;
  margin:0 0 10px;
  color:var(--c-text);
}
.related-list{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
}
.related-card{
  display:flex;
  flex-direction:column;
  gap:3px;
  width:200px;
  padding:10px 12px;
  background:var(--c-card-alt);
  border:1px solid var(--c-border);
  border-radius:var(--radius-sm);
  text-decoration:none;
  color:var(--c-text);
  transition:box-shadow .12s, border-color .12s;
}
.related-card:hover{
  box-shadow:var(--shadow-md);
  border-color:var(--c-primary);
}
.related-title{
  font-weight:700;
  font-size:.9em;
  line-height:1.35;
}
.related-meta{
  font-size:.8em;
  color:var(--c-muted);
}
@media print{
  .related-papers{ display:none; }
}

/* ============================================================
   术语表页 site/glossary.html（增强 UX）
   --------------------------------------------------------
   组件：
     · hero + 自动注解 callout（沿用全局 .hero / .callout.tip）
     · #glossary-search              即时搜索输入框
     · .glossary-alpha / .alpha-chip 字母导航（A-Z + #）
     · .glossary-cats / .cat-chip    分类筛选 chip（6 类）
     · .glossary-cat <section>       分类分组容器
     · .glossary-item.glossary-card  单条术语卡片（左条色 + hover）
     · .glossary-badge               类别彩色 pill
     · .glossary-flash               字母跳转后短暂高亮

   配色：每个分类注入 --cat-color（chip / 卡片左条 / badge / 标题点）。
   color-mix() 用于 chip 激活态 / badge 背景（现代浏览器支持；
   不支持时退化为透明背景，文字仍可读）。
   ============================================================ */

/* hero */
.glossary-hero{padding:32px 32px;}
.glossary-hero h1{margin-top:0;}
.glossary-stats{opacity:.85;font-size:13px;margin-top:10px;color:var(--c-muted);}

/* 搜索框 */
#glossary-search{
  width:100%;
  padding:11px 16px;
  font-size:15px;
  border:1px solid var(--c-border);
  border-radius:var(--radius-sm);
  margin:14px 0 6px;
  background:var(--c-card);
  color:var(--c-text);
  font-family:inherit;
  box-sizing:border-box;
  transition:border-color .12s, box-shadow .12s;
}
#glossary-search:focus{
  outline:none;
  border-color:var(--c-primary);
  box-shadow:0 0 0 3px var(--c-tag-bg);
}

/* 字母导航（A-Z + #） */
.glossary-alpha{
  display:flex;
  flex-wrap:wrap;
  gap:4px;
  align-items:center;
  margin:14px 0 10px;
  padding:10px 12px;
  background:var(--c-card-alt);
  border:1px solid var(--c-border);
  border-radius:var(--radius-sm);
  box-shadow:var(--shadow-xs);
}
.glossary-alpha .alpha-label{
  font-size:12px;
  color:var(--c-muted);
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.06em;
  margin-right:4px;
  flex-shrink:0;
}
.alpha-chip{
  display:inline-flex;
  align-items:center;
  gap:4px;
  min-width:30px;
  padding:4px 8px;
  border:1px solid var(--c-border);
  border-radius:var(--radius-pill);
  background:var(--c-card);
  color:var(--c-text);
  font-size:12.5px;
  font-weight:600;
  font-family:inherit;
  text-decoration:none;
  cursor:pointer;
  transition:transform .12s, border-color .12s, color .12s, background .12s;
}
.alpha-chip:hover{
  border-color:var(--c-primary);
  color:var(--c-primary);
  transform:translateY(-1px);
}
.alpha-chip:focus-visible{
  outline:2px solid var(--c-primary);
  outline-offset:1px;
}
.alpha-chip .alpha-letter{line-height:1;}
.alpha-chip .alpha-cnt{
  font-size:10.5px;
  font-weight:400;
  color:var(--c-muted);
  padding:1px 5px;
  background:var(--c-card-alt);
  border-radius:var(--radius-pill);
  line-height:1.3;
}
.alpha-chip:hover .alpha-cnt{
  color:var(--c-primary);
  background:var(--c-tag-bg);
}
/* 当前可见范围内无该字母的术语 → 置灰且不可点 */
.alpha-chip.alpha-empty{
  opacity:.3;
  pointer-events:none;
  filter:grayscale(.4);
}

/* 分类筛选 chip */
.glossary-cats{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
  align-items:center;
  margin:6px 0 10px;
}
.glossary-cats .cat-label{
  font-size:12px;
  color:var(--c-muted);
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.06em;
  margin-right:4px;
  flex-shrink:0;
}
.cat-chip{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:5px 11px;
  border:1px solid var(--c-border);
  border-radius:var(--radius-pill);
  background:var(--c-card);
  color:var(--c-text);
  font-size:13px;
  font-family:inherit;
  cursor:pointer;
  transition:border-color .12s, background .12s, opacity .12s;
}
.cat-chip:hover{
  border-color:var(--cat-color, var(--c-primary));
}
.cat-chip:focus-visible{
  outline:2px solid var(--cat-color, var(--c-primary));
  outline-offset:1px;
}
.cat-chip[aria-pressed="true"]{
  border-color:var(--cat-color, var(--c-primary));
  background:color-mix(in srgb, var(--cat-color, var(--c-primary)) 10%, var(--c-card));
}
.cat-chip[aria-pressed="false"]{
  opacity:.45;
  background:var(--c-card-alt);
}
.cat-dot{
  display:inline-block;
  width:9px;
  height:9px;
  border-radius:50%;
  background:var(--cat-color, var(--c-muted));
  flex-shrink:0;
}
.cat-chip[aria-pressed="false"] .cat-dot{
  background:transparent;
  border:1px solid var(--c-cat-muted, var(--c-muted));
}
.cat-cnt{
  font-size:11px;
  color:var(--c-muted);
  padding:0 6px;
  background:var(--c-card-alt);
  border-radius:var(--radius-pill);
  line-height:1.5;
}
.cat-chip[aria-pressed="false"] .cat-cnt{
  background:transparent;
  padding:0;
}
.cat-reset{
  margin-left:auto;
  padding:5px 11px;
  border:1px dashed var(--c-border);
  border-radius:var(--radius-pill);
  background:transparent;
  color:var(--c-muted);
  font-size:12px;
  font-family:inherit;
  cursor:pointer;
  transition:color .12s, border-color .12s, border-style .12s;
}
.cat-reset:hover{
  color:var(--c-text);
  border-style:solid;
  border-color:var(--c-border-h);
}

/* 分类分组 section */
.glossary-cat{
  margin-top:28px;
  display:block;  /* 覆盖任何 inline-block 残留 */
}
.glossary-cat > h2{
  font-size:20px;
  display:flex;
  align-items:center;
  gap:9px;
  margin:0 0 4px;
}
.glossary-cat > h2 .cat-dot{
  width:11px;
  height:11px;
  flex-shrink:0;
}
.glossary-cat-name{color:var(--c-text);}
.glossary-cat-count{
  font-size:13px;
  color:var(--c-muted);
  font-weight:400;
  margin-left:4px;
}

/* 术语卡片 */
.glossary-list{margin:10px 0 18px;padding-left:0;}
.glossary-item{
  padding:12px 14px;
  border-radius:var(--radius-sm);
  border:1px solid var(--c-border);
  background:var(--c-card);
  margin:0 0 8px 0;
  transition:background .12s, border-color .12s, box-shadow .12s, transform .12s;
}
.glossary-item:hover{
  border-color:var(--c-border-h);
  box-shadow:var(--shadow-sm);
  transform:translateY(-1px);
}
/* 卡片化增强：左侧 3px 彩色条（--cat-color） */
.glossary-card{
  border-left:3px solid var(--cat-color, var(--c-border));
  padding-left:14px;
}

/* dt：术语名 + 英文别名 + 类别 badge，一行 flex wrap */
.glossary-list dt{
  font-weight:700;
  font-size:15.5px;
  line-height:1.55;
  display:flex;
  flex-wrap:wrap;
  align-items:baseline;
  gap:5px 10px;
  margin:0;
}
.glossary-term-name{
  font-weight:700;
  color:var(--c-text);
  /* 让 dfn.term 的虚线下划线只贴在术语文字下方，不撑整行 */
  display:inline;
}
.glossary-term-name .term{font-weight:700;}

/* 英文别名（muted 小字，吃掉剩余空间把 badge 推到右边） */
.glossary-alias{
  color:var(--c-muted);
  font-size:12px;
  font-weight:400;
  flex:1 1 auto;
  min-width:0;
}

/* 类别 badge（彩色 pill） */
.glossary-badge{
  display:inline-flex;
  align-items:center;
  font-size:11px;
  font-weight:600;
  padding:2px 9px;
  border-radius:var(--radius-pill);
  background:color-mix(in srgb, var(--cat-color, var(--c-muted)) 14%, var(--c-card));
  color:var(--cat-color, var(--c-muted));
  border:1px solid color-mix(in srgb, var(--cat-color, var(--c-muted)) 35%, var(--c-card));
  white-space:nowrap;
  flex-shrink:0;
  letter-spacing:.02em;
  align-self:center;
}

/* dd：定义（normal） */
.glossary-list dd{
  margin:6px 0 0 0;
  padding:0;
  color:var(--c-text);
  font-size:14px;
  line-height:1.65;
  font-weight:400;
}

/* 字母跳转后短暂高亮目标卡片 */
.glossary-flash{
  animation:glossary-flash 1.6s ease-out;
}
@keyframes glossary-flash{
  0%   { background:var(--c-tag-bg); border-color:var(--c-primary); }
  100% { background:var(--c-card); }
}

/* dark 模式：cat-dot / badge / 左条颜色都用 CSS 变量传递，自动随 --cat-color；
   color-mix 在暗背景下把 cat-color 与 --c-card（dark 重定义为深色）混合，
   生成同色系深底 badge——保证对比度。 */

/* 移动端：字母导航横向滚动，避免在小屏挤成多行 */
@media (max-width:640px){
  .glossary-alpha{
    flex-wrap:nowrap;
    overflow-x:auto;
    -webkit-overflow-scrolling:touch;
    padding:8px 10px;
  }
  .alpha-chip{flex-shrink:0;}
  .glossary-cats .cat-reset{margin-left:0;flex-shrink:0;}
  .glossary-hero{padding:24px 18px;}
  /* 移动端英文别名不再占据剩余空间，让 badge 自然换到下一行 */
  .glossary-alias{flex-basis:100%;}
}

/* 打印：字母导航与 chip 不上纸面，卡片保留并避免跨页断开 */
@media print{
  .glossary-alpha,
  .glossary-cats,
  #glossary-search,
  .glossary-count{display:none !important;}
  .glossary-item{
    break-inside:avoid;
    border-left-color:#000 !important;
    box-shadow:none !important;
  }
  .glossary-badge{
    border:1px solid #000 !important;
    color:#000 !important;
    background:#fff !important;
  }
}

/* ============================================================
   目录页：每条线索 header 的阅读进度 pill
   ------------------------------------------------------------
   由 progress.js 在 section.thread-section > header 内动态注入。
   紧跟 .ts-count（"X 深度 + Y 浅入口"），插在 .ts-link 之前。
   四档颜色：0% 灰 / <50% 橙 / ≥50% 绿 / 100% ✓ 反白。
   ============================================================ */
.thread-progress{
  display:inline-flex;
  align-items:center;
  gap:3px;
  padding:2px 9px;
  margin-left:6px;
  border-radius:999px;
  border:1px solid var(--c-border);
  background:var(--c-card-alt);
  color:var(--c-muted);
  font-size:.8em;
  font-weight:600;
  letter-spacing:.2px;
  line-height:1.5;
  white-space:nowrap;
  vertical-align:middle;
  transition:background .15s,color .15s,border-color .15s;
}
/* 0%：灰（未起步） */
.thread-progress.tp-none{
  background:var(--c-card-alt);
  color:var(--c-muted);
  border-color:var(--c-border);
}
/* <50%：橙（在途中） */
.thread-progress.tp-low{
  background:var(--c-warn-bg);
  color:var(--c-warn);
  border-color:var(--c-warn);
}
/* ≥50% 且 <100%：绿（过半） */
.thread-progress.tp-mid{
  background:var(--c-good-bg);
  color:var(--c-good);
  border-color:var(--c-good);
}
/* 100%：实心绿 + ✓ */
.thread-progress.tp-done{
  background:var(--c-good);
  color:#fff;
  border-color:var(--c-good-h);
}
/* 空线索（统计不到教学卡）：弱化隐藏，避免"已读 0/0"造成噪音 */
.thread-progress.tp-empty{
  display:none;
}
/* 打印：自学进度不上纸面 */
@media print{
  .thread-progress{ display:none !important; }
}

/* 前后篇导航 */
.chapter-nav .nav-prev, .chapter-nav .nav-next {
  font-size: 0.85em;
  max-width: 200px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.chapter-nav .nav-prev { text-align: left; }
.chapter-nav .nav-next { text-align: right; }
.chapter-nav span:empty { min-width: 200px; display: inline-block; }
@media (max-width: 768px) {
  .chapter-nav { flex-wrap: wrap; gap: 8px; justify-content: center; }
  .chapter-nav .nav-prev, .chapter-nav .nav-next { max-width: 100%; }
  .chapter-nav span:empty { display: none; }
}

/* ---------- SVG dark mode 适配 ---------- */
/* 白底 SVG 在 dark mode 下做 figure card 处理：圆角+阴影+border，
   让白底 SVG 看起来像嵌入的学术 figure（不是刺眼白块）。 */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    /* SVG 图片容器：figure card 样式 */
    figure img[src$=".svg"],
    img[src*="assets/svg/"],
    img[src*="../assets/svg/"],
    img[src*="../../assets/svg/"] {
      border-radius: var(--radius);
      box-shadow: var(--shadow-sm);
      border: 1px solid var(--c-border);
      padding: 8px;
      background: #ffffff;
    }
    /* 概念图 SVG 特殊处理：给圆角 */
    img[src*="C-"]:not([src*="content"]) {
      border-radius: var(--radius);
      box-shadow: var(--shadow-sm);
    }
  }
}
:root[data-theme="dark"] {
  figure img[src$=".svg"],
  img[src*="assets/svg/"],
  img[src*="../assets/svg/"],
  img[src*="../../assets/svg/"] {
    border-radius: var(--radius);
    box-shadow: var(--shadow-sm);
    border: 1px solid var(--c-border);
    padding: 8px;
    background: #ffffff;
  }
}

/* 搜索键盘导航高亮 */
.result-card.kb-active {
    outline: 2px solid var(--c-primary);
    outline-offset: 2px;
    background: var(--c-info-bg);
}

/* ---------- 打印优化（自学打印 PDF） ---------- */
@media print {
  /* 侧边栏、按钮、控件全隐藏 */
  .sidebar, .sidebar-toggle, .sidebar-toggle-label,
  .back-to-top, .read-toggle, .read-toggle-wrap,
  .breadcrumb, .chapter-nav, .page-toc, .page-meta-bar,
  .theme-toggle, .skip-link, .related-papers,
  .progress-bar, .read-badge, .thread-progress,
  .glossary-alpha, .glossary-cats, #glossary-search { }
  
  /* 正文全宽、无背景 */
  .main {
    max-width: 100% !important;
    padding: 0 !important;
    background: white !important;
    color: black !important;
  }
  
  /* SVG 图全展开 */
  img[src$=".svg"] {
    max-width: 100% !important;
    page-break-inside: avoid;
    border: none !important;
    box-shadow: none !important;
    padding: 0 !important;
  }
  
  /* 每个线索从新页开始 */
  h2 { page-break-after: avoid; }
  h3 { page-break-after: avoid; }
  .callout { page-break-inside: avoid; }
  table { page-break-inside: avoid; }
  
  /* URL 显示（打印时在链接后显示 URL） */
  a[href^="http"]::after {
    content: " (" attr(href) ")";
    font-size: 0.8em;
    color: #666;
  }
}

/* ---------- 内容渐入动画（专业感） ---------- */
/* 正文区域首次渲染时微妙淡入 */
@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}
.main > * {
  animation: fadeInUp 0.3s ease-out;
}
/* 卡片 hover 微动画 */
.dir-card, .feat-card, .related-card, .entry-card, .checkpoint-card, .glossary-card {
  transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
/* SVG 图加载完成后的渐入 */
img[src$=".svg"] {
  animation: fadeInUp 0.4s ease-out;
}
/* 深度选择器切换层时微动画 */
[data-layer] {
  transition: opacity 0.15s ease;
}
/* 降低动画偏好用户 */
@media (prefers-reduced-motion: reduce) {
  .main > *, img[src$=".svg"], [data-layer] {
    animation: none !important;
    transition: none !important;
  }
}

/* 分享/复制链接按钮 */
.share-btn {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 12px;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-pill, 999px);
  background: var(--c-card-alt);
  color: var(--c-muted);
  font-size: 0.8em;
  cursor: pointer;
  font-family: inherit;
  transition: all 0.15s;
}
.share-btn:hover { color: var(--c-text); border-color: var(--c-primary); }
.share-btn.copied { color: var(--c-good); border-color: var(--c-good); }

/* 键盘按键样式 */
kbd {
  display: inline-block;
  padding: 2px 8px;
  font-family: var(--font-mono, monospace);
  font-size: 0.85em;
  background: var(--c-card-alt);
  border: 1px solid var(--c-border);
  border-radius: 4px;
  box-shadow: 0 1px 0 var(--c-border);
}

/* 帮助弹窗 */
.kb-help-overlay > div {
  font-family: var(--font-sans, system-ui, sans-serif);
  color: var(--c-text);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .kb-help-overlay > div {
    background: var(--c-card) !important;
    color: var(--c-text) !important;
  }
  :root:not([data-theme="light"]) .kb-help-overlay kbd {
    background: rgba(255,255,255,0.08);
    border-color: rgba(255,255,255,0.15);
  }
}
:root[data-theme="dark"] .kb-help-overlay > div {
  background: var(--c-card) !important;
  color: var(--c-text) !important;
}
:root[data-theme="dark"] .kb-help-overlay kbd {
  background: rgba(255,255,255,0.08);
  border-color: rgba(255,255,255,0.15);
}

/* 全局表格窄屏滚动（覆盖 markdown 渲染的裸 table）。
   阈值放宽到 900px：769–900px 平板带宽表（analytics 多列表）仍可能挤压。 */
.main table {
  display: block;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-inline: contain;
  max-width: 100%;
}
@media (min-width: 901px) {
  .main table {
    display: table;
    overflow: visible;
  }
}

.back-to-top {
  right: max(12px, env(safe-area-inset-right));
  bottom: max(12px, env(safe-area-inset-bottom));
}

.home-visit-counter {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .35rem .55rem;
  width: fit-content;
  max-width: 100%;
  padding: .4rem .7rem;
  border: 1px solid color-mix(in srgb, var(--c-primary) 24%, transparent);
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--c-card) 82%, transparent);
  color: var(--c-muted);
  font-size: .875rem;
  line-height: 1.45;
  font-variant-numeric: tabular-nums;
}
.home-visit-counter[hidden] {
  display: none !important;
}

html.graph-fullscreen,
html.graph-fullscreen body {
  overflow: hidden;
}

/* ============================================================
   首页：全景与正文优先
   首页不使用宣传 hero、数据战报或重复 CTA。标题之后直接展示领域全景，
   后续入口沿正文阅读顺序平铺；分享工具默认收起，只保留一个入口。
   ============================================================ */
.main[data-home-page] {
  padding-bottom: calc(56px + env(safe-area-inset-bottom));
}

.main[data-home-page] h2 {
  margin: 0 0 16px;
  padding: 0 0 8px;
  border-bottom: 1px solid var(--c-border);
  font-size: clamp(1.25rem, 2.5vw, 1.55rem);
}

.home-intro {
  display: flex;
  align-items: end;
  justify-content: space-between;
  gap: 24px;
  margin-bottom: 18px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--c-border);
}

.home-intro h1 {
  margin: 0 0 6px;
  font-size: clamp(1.8rem, 4vw, 2.45rem);
  line-height: 1.15;
  letter-spacing: -.025em;
}

.home-intro p {
  margin: 0;
  color: var(--c-muted);
}

.home-intro .home-visit-counter {
  flex: 0 0 auto;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  font-size: .78rem;
}

.home-panorama {
  margin: 0 0 clamp(32px, 6vw, 56px);
}

.home-panorama > a {
  display: block;
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  background: #fff;
  overflow: hidden;
}

.home-panorama img {
  display: block;
  width: 100%;
  height: auto;
}

.home-panorama figcaption {
  margin-top: 8px;
  color: var(--c-muted);
  font-size: .82rem;
  line-height: 1.55;
}

.home-panorama figcaption a,
.home-section > p a,
.home-footer a {
  text-decoration: underline;
  text-decoration-thickness: .08em;
  text-underline-offset: .16em;
}

.home-section {
  margin: 0 0 clamp(36px, 6vw, 56px);
}

.home-directory {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 32px;
}

.home-directory a {
  display: grid;
  gap: 3px;
  min-height: 68px;
  padding: 12px 4px;
  border-bottom: 1px solid var(--c-border);
  color: var(--c-text);
}

.home-directory a:hover,
.home-thread-list a:hover,
.home-tool-list a:hover {
  color: var(--c-primary);
}

.home-directory span,
.home-tool-list span {
  color: var(--c-muted);
  font-size: .86rem;
  line-height: 1.5;
}

.home-thread-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 32px;
}

.home-thread-list a {
  display: flex;
  align-items: center;
  min-height: 48px;
  padding: 8px 4px;
  border-bottom: 1px solid var(--c-border);
  color: var(--c-text);
}

.home-lineage {
  margin: 0;
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--c-border);
}

.home-lineage li {
  margin: 0;
  border-bottom: 1px solid var(--c-border);
}

.home-lineage a {
  display: grid;
  grid-template-columns: 64px 88px minmax(0, 1fr);
  gap: 14px;
  align-items: baseline;
  min-height: 52px;
  padding: 12px 4px;
  color: var(--c-text);
}

.home-lineage time,
.home-lineage span {
  color: var(--c-muted);
}

.home-tool-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.home-tool-list li {
  display: grid;
  grid-template-columns: minmax(120px, .35fr) minmax(0, 1fr);
  gap: 18px;
  align-items: baseline;
  padding: 11px 4px;
  border-bottom: 1px solid var(--c-border);
}

.home-footer {
  display: flex;
  align-items: start;
  justify-content: space-between;
  gap: 24px;
  padding-top: 20px;
  border-top: 1px solid var(--c-border);
  color: var(--c-muted);
  font-size: .88rem;
}

.home-footer > p {
  margin: 0;
}

.home-share-utility {
  position: relative;
  flex: 0 0 auto;
  text-align: right;
}

.home-share-link {
  min-height: 44px;
  margin: -10px 0 0;
  padding: 10px 0;
  border: 0;
  background: transparent;
  color: var(--c-primary);
  font: inherit;
  cursor: pointer;
  text-decoration: underline;
  text-decoration-thickness: .08em;
  text-underline-offset: .16em;
}

.home-share-panel {
  width: min(360px, calc(100vw - 48px));
  margin-top: 8px;
  padding: 14px;
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  background: var(--c-card);
  box-shadow: var(--shadow-sm);
  text-align: left;
}

.home-share-panel[hidden],
.home-share-qr[hidden],
.home-copy-fallback[hidden],
.home-wechat-hint[hidden] {
  display: none !important;
}

.home-share-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.home-share-actions button {
  min-height: 44px;
  padding: 8px 12px;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  background: var(--c-card-alt);
  color: var(--c-text);
  font: inherit;
  cursor: pointer;
}

.home-share-actions button:hover {
  border-color: var(--c-primary);
  color: var(--c-primary);
}

.home-share-qr {
  margin-top: 12px;
}

.home-share-qr img {
  display: block;
  width: min(240px, 100%);
  height: auto;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  background: #fff;
}

.home-wechat-hint,
.home-share-status {
  margin: 10px 0 0;
  font-size: .8rem;
  line-height: 1.5;
}

.home-copy-fallback {
  margin-top: 10px;
}

.home-copy-fallback label {
  display: grid;
  gap: 5px;
}

.home-copy-fallback input {
  width: 100%;
  min-height: 44px;
  padding: 8px 10px;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  background: var(--c-card-alt);
  color: var(--c-text);
  font: inherit;
}

@media (max-width: 720px) {
  .main[data-home-page] {
    padding-top: 20px;
  }

  .home-intro,
  .home-footer {
    align-items: stretch;
    flex-direction: column;
    gap: 10px;
  }

  .home-intro .home-visit-counter {
    align-self: start;
  }

  .home-directory,
  .home-thread-list {
    grid-template-columns: minmax(0, 1fr);
  }

  .home-lineage a {
    grid-template-columns: 54px 72px minmax(0, 1fr);
    gap: 10px;
  }

  .home-tool-list li {
    grid-template-columns: minmax(0, 1fr);
    gap: 3px;
  }

  .home-share-utility {
    text-align: left;
  }

  .home-share-panel {
    width: 100%;
  }
}

@media (max-width: 420px) {
  .home-lineage a {
    grid-template-columns: 50px minmax(0, 1fr);
  }

  .home-lineage span {
    grid-column: 1 / -1;
  }
}

@media print {
  .home-visit-counter,
  .home-share-utility {
    display: none !important;
  }
}
