/* ===== tokens =====
   真值源已迁到 cases-terminal/src/theme.css，编译为 assets/css/tokens.css，
   由 default.hbs 先于本文件引入（spec 2026-08-05 §4）。

   这里只留「旧名 → token」的别名映射：全站几百处 var(--red) / var(--ink) 一律不改写，
   零改写面才可能做到计算后样式逐属性零差异（spec §7.1 的门）。

   ★ --font-display / --content / --pad 三个**不在这里出现**：tokens.css 用的就是同名，
     再写一行 `--font-display: var(--font-display)` 是自引用循环 —— CSS 自定义属性成环时
     解析为 guaranteed-invalid，属性直接失效，全站衬线标题会静默回落到系统无衬线。
     下方 @media(≤900px) 对 --pad 的覆写仍在本文件，覆写同名 token 是正常层叠，不是环。 */
:root {
  --red: var(--color-red); --ink: var(--color-ink); --body: var(--color-body); --muted: var(--color-muted);
  --line: var(--color-line); --bg: var(--color-bg);
  --radius: var(--radius-card);
}
* { box-sizing: border-box; }
html { font-size: 16px; } /* 不学 Source 的 62.5% */
html, body { overflow-x: hidden; }
html { scroll-behavior: smooth; }
body {
  margin: 0; background: var(--bg); color: var(--ink);
  font-family: -apple-system, "PingFang SC", "Microsoft YaHei", "Noto Sans SC", sans-serif;
  line-height: var(--leading-body);
}
a { color: inherit; text-decoration: none; }
img { max-width: 100%; }
.wrap { max-width: calc(var(--content) + 2*var(--pad)); margin: 0 auto; padding: 0 var(--pad); }
@media (max-width: 900px) { :root { --pad: 24px; } }

/* ===== 设计语言五件套 ===== */
.h-page { font-family: var(--font-display); font-size: var(--text-display); font-weight: var(--font-weight-black); margin: 0; }
.accent { color: var(--red); }                 /* 句中红词 */
.watermark {                                    /* 巨型汉字水印，每页至多一个 */
  position: absolute; right: -40px; top: 120px; z-index: 0;
  font-size: 420px; font-weight: var(--font-weight-black); color: var(--red); opacity: .05;
  line-height: var(--leading-none); pointer-events: none; -webkit-user-select: none; user-select: none;
}
.divider { border: 0; border-top: 1px solid var(--line); margin: 0; }

/* ===== 微动效（统一 0.15s，克制：颜色/边框/位移） ===== */
a, button, .social-item, .chapter-tabs a, .back-top {
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.nav-menu a:hover { color: var(--ink); }
.nav-on-red .nav-menu a:hover { color: #fff; opacity: .8; }
.more-link:hover { letter-spacing: .5px; }
.home-post h3 { transition: color .15s ease; }
.home-post a:hover h3 { color: var(--red); }
.back-top:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,.14); }
.chapter-tabs a:hover { border-color: var(--ink); color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  a, button, .social-item, .chapter-tabs a, .back-top, .home-post h3 { transition: none; }
  .back-top:hover { transform: none; }
}

/* ── 两条滚动动效（T4，spec §5；用户已批两条，原第三条「战绩数字滚动」裁决 C 作废）──
   ② 区块滚动渐显：位移 18px、时长 550ms（expo，批 1 魔改升级；位移 SSOT=--m-reveal-y 在 motion.css，本文件仅 fallback）
   ③ 十步流程的序号滚动到时点亮（灰 → 品牌红）

   ★ 初始态一律挂在 `html.js-reveal` 下，而这个 class 由 assets/js/reveal.js 添加。
     脚本没跑 / 被拦 / 用户要求减少动效 → 一个字节都不生效，页面就是今天的样子。
     **绝不能反过来写**（CSS 先隐藏、JS 负责显示）—— 那样任何 JS 故障都变成整页空白。
     reveal.js 自己也读 prefers-reduced-motion，故这里不必再包一层 @media：
     两道闸任意一道拦住都不会播。
   ★ 只动 transform 与 opacity（走合成器，不触发重排）。绝不动 height/top/margin。
   ★ 首屏元素不带 .reveal（reveal.js 按初始视口折线过滤）—— 否则读者一进页面
     会看到首屏内容闪一下，观感上等同于 CLS。 */
.js-reveal .reveal {
  opacity: 0;
  transform: translateY(var(--m-reveal-y, 18px)); /* 位移 SSOT 在 motion.css（代码轮 R4） */
  transition: opacity .55s cubic-bezier(.16, 1, .3, 1), transform .55s cubic-bezier(.16, 1, .3, 1);
}
.js-reveal .reveal.is-in { opacity: 1; transform: none; }

/* ③ 序号点亮 —— 这条动效编码的是真东西（读到第几步），不是装饰。
   未点亮时用 --muted 而不是隐藏：序号始终可读，只是「还没走到」。 */
/* ⚠ 层叠：必须带上 `article.page-engine` 这一节。只写 `.js-reveal .engine-steps li::before`
   是 (0,2,1)，输给下方那条既有的 `article.page-engine .engine-steps li::before` (0,3,1)
   —— 实测序号纹丝不动仍是红的。两条选择器并列写，各自算各自的特异性，
   同时盖住 page-engine 内与（将来若有的）页外两种情形。 */
.js-reveal .engine-steps li::before,
.js-reveal article.page-engine .engine-steps li::before {
  color: var(--muted);
  transition: color .3s ease-out;
}
.js-reveal .engine-steps li.is-in::before,
.js-reveal article.page-engine .engine-steps li.is-in::before { color: var(--red); }
.sec-label { font-size: var(--text-caption); letter-spacing: 6px; color: var(--red); font-weight: var(--font-weight-bold); }
@media (max-width: 900px) {
  .watermark { font-size: 200px; right: -30px; }
  .home-sec .home-method { font-size: 24px; }
}

/* nav */
.nav { background: #fff; border-bottom: 1px solid var(--line); position: relative; z-index: 10; }
.nav-row { display: flex; align-items: center; justify-content: space-between; padding-top: 28px; padding-bottom: 28px; }
.nav-lockup { display: flex; align-items: center; gap: 8px; font-size: var(--text-title); white-space: nowrap; letter-spacing: -.01em; margin-right: auto; }
.nav-lockup svg, .footer-lockup svg { flex-shrink: 0; width: 28px; height: 28px; }
.nav-lockup b, .nav-pill { flex-shrink: 0; }
.nav-word { font-weight: var(--font-weight-bold); letter-spacing: -.01em; }
/* .nav-pill 仅剩 footer 一个消费者（partials/footer.hbs），导航区已不用 */
.nav-pill { background: var(--red); color: #fff; font-size: var(--text-micro); font-weight: var(--font-weight-bold); padding: 3px 9px; border-radius: 999px; letter-spacing: 1.5px; }
.nav-cn { color: var(--muted); font-size: var(--text-caption); letter-spacing: .5px; margin-left: 4px; padding-left: 13px; border-left: 1px solid var(--line); }
/* 导航 V1（2026-07-16 用户裁决）：菜单降噪（500/灰墨，当前页红字免下划线），
   登录升实心红胶囊主 CTA——解决全员 700 加粗无层级 + 细描边椭圆单薄的问题 */
/* ★ 菜单落 normal(400) 而不是 medium(600)。旧值 500 不在四档刻度上，必须归档；
   但归到 600 会同时犯两个错：(a) 与下面 .is-current 的 600 撞成同一字重，当前项
   的字重区分当场消失（实测六项全 600）；(b) 反转上一行那条「菜单降噪」的用户裁决。
   400 两个问题一起解 —— 更降噪，且与当前项拉开一整档。 */
.nav-menu { display: flex; align-items: center; gap: 34px; font-weight: var(--font-weight-normal); font-size: var(--text-body); }
/* ⚠ 层叠契约：`.nav-menu a` 与下方 `.nav-on-red a` specificity 相等(0,1,1)，靠源码序
   后者胜出保红底页白字——勿给本行提高 specificity 或调换两规则顺序 */
.nav-menu a { color: var(--body); }
/* 2026-08-06 导航方案 A「单红」（用户裁决）：原来一条 bar 里有三处红 ——
   CRISIS LAB 红药丸、当前项红字、登录引擎红按钮。红是品牌唯一的强调色，
   同时用在「标识 / 状态 / 动作」三个层级上就不再是强调。
   现在红只留给「登录引擎」这一个**动作**；当前项改用墨色 + 下划线表示**状态**。 */
.nav-menu .is-current { color: var(--ink); font-weight: var(--font-weight-medium); border-bottom: 2px solid var(--ink); padding-bottom: 3px; }
/* 登录描边按钮态（导航末项=登录引擎，2026-08-03 改名前为「登录」；本规则按位置
   选择器 :last-child 命中，不认文字，改 label 不影响样式。golive_admin NAV 数组
   保证次序；spec 2026-07-15 §2 SP0） */
.nav-menu a:last-child { background: var(--red); color: #fff; padding: 9px 22px; border-radius: 999px; font-weight: var(--font-weight-bold); margin-left: 6px; }
.nav-menu a:last-child:hover { background: #b01020; color: #fff; }
.nav-on-red .nav-menu a:last-child { background: #fff; color: var(--red); }
.nav-on-red .nav-menu a:last-child:hover { background: rgba(255,255,255,.92); color: var(--red); opacity: 1; }
/* ≥1280 单行压缩定妆：2026-07-17 改名批后菜单缩至 ~26 字，1280 起单行可容 lockup+中文名+菜单
   （原 1280-1439 藏 .nav-cn 的补丁块已删；spec SP0 宽度回归的根治：<1280 走汉堡包，见下方 max-width:1279px 块） */
@media (min-width: 1280px) {
  .nav-menu { gap: 28px; }
}
.nav-burger { display: none; font-size: 24px; cursor: pointer; }
/* 2026-07-25：.nav-search 族五条规则随搜索入口整项删除（全站移除检索）。
   .nav-lockup 的 margin-right:auto 保留——它现在把菜单/burger 推右，不再服务搜索图标。
   sodo-search 由 ghost_head 服务端注入，主题删不掉脚本本身：default.hbs 的抑制脚本
   拦 Ctrl/Cmd+K 并移除挂载点，此条是 JS 路径失效时的兜底（脚本仍会跑，但不露面）。 */
#sodo-search-root { display: none !important; }
.nav-on-red { background: var(--red); border-bottom: 0; }
.nav-on-red, .nav-on-red a { color: #fff; }
.nav-on-red .nav-pill { background: #fff; color: var(--red); }
.nav-on-red .nav-menu .is-current { color: #fff; }
.nav-on-red .nav-cn { color: rgba(255,255,255,.8); border-left-color: rgba(255,255,255,.32); }
/* 导航折叠断点 900→1279（SP0 2026-07-15）：34 字六项 <1280 单行物理放不下（901px 内容宽
   661px vs 菜单总需 ~890px），901–1279 复用同一套汉堡包下拉，零私有中间态 */
@media (max-width: 1279.98px) {
  /* ☰ 字形只有 22px 宽，裸 label 命中区 22×46 不到触控最小 44 的一半。
     padding 把命中区扩到 46px，负 margin 抵掉右侧 padding 让字形停在原位
     （右缘仍贴 wrap 的 24px 内边距线，扩出去的命中区落在内边距里，不溢出）。 */
  .nav-burger { display: block; padding: 0 12px; margin-right: -12px; }
  .nav-menu { display: none; position: absolute; top: 100%; left: 0; right: 0; background: #fff; color: var(--ink); flex-direction: column; align-items: stretch; padding: 24px; border-bottom: 1px solid var(--line); }
  /* align-items:stretch 复位桌面行的 center（PR#50 审阅 P1：穿透会把下拉链接点击区塌缩成文字宽） */
  .nav-on-red .nav-menu a { color: var(--ink); }
  .nav-on-red .nav-menu .is-current { color: var(--red); }
  #nav-toggle:checked ~ .nav-menu { display: flex; }
  .nav-cn { display: none; }
  /* margin-left:6px 是桌面横排里与前项拉开的间距；竖排菜单里它把红胶囊的左缘
     推离其他项的 24px 对齐线，归零。 */
  .nav-menu a:last-child { align-self: flex-start; margin-left: 0; }
  /* 当前项的下划线必须只包住文字。移动端 .nav-menu 是 column + align-items:stretch，
     不加这行的话 border-bottom 会横贯整个下拉宽度，看起来像一条分隔线而不是「你在这一页」。
     与上一行同因同治（红胶囊 CTA 早先已打过这个补丁）。 */
  .nav-menu .is-current { align-self: flex-start; }
}

/* back to top（复用 logo-mark 三角件，零 JS 锚回顶部） */
.back-top { position: fixed; right: 28px; bottom: 28px; z-index: 20; display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; background: #fff; border: 1px solid var(--line); border-radius: var(--radius); box-shadow: 0 4px 16px rgba(0,0,0,.08);
  opacity: 0; pointer-events: none; transition: opacity .25s ease, transform .15s ease, border-color .15s ease, box-shadow .15s ease; }
.back-top.is-shown { opacity: 1; pointer-events: auto; }  /* JS：滚动超过阈值才加 .is-shown */
.back-top:hover { border-color: var(--red); }
.back-top svg { display: block; }
@media (max-width: 900px) { .back-top { right: 16px; bottom: 16px; width: 44px; height: 44px; } }

/* footer */
.footer { border-top: 1px solid var(--line); margin-top: 120px; padding: 56px 0 40px; }
.footer-row { display: flex; justify-content: space-between; align-items: center; gap: 24px; }
.footer-lockup { display: flex; align-items: center; gap: 10px; font-size: var(--text-lead); min-width: 0; }
.footer-desc, .footer-copy, .footer-disclaimer { color: var(--muted); font-size: var(--text-caption); }
.footer-copy { flex-shrink: 0; }
.footer-disclaimer { text-align: center; margin-top: 40px; }
.footer-disclaimer p { margin: 0; }                       /* 压掉 UA 段落外边距 */
.footer-disclaimer .fd-line + .fd-line { margin-top: 8px; }
@media (max-width: 900px) {
  .footer { margin-top: 72px; padding: 40px 0 88px; } /* 底部给回顶按钮让位 */
  .footer-row { flex-direction: column; align-items: flex-start; gap: 14px; }
  .footer-lockup { flex-wrap: wrap; }
  .footer-desc { flex-basis: 100%; line-height: var(--leading-body); }
  .footer-disclaimer { text-align: left; margin-top: 28px; line-height: var(--leading-body); }
}

/* ===== 首页 hero v6（2026-07-15）——社论式左对齐 + F2v 二级式公式；hero6- 前缀与旧类零同名 ===== */
/* 水平几何交给内层 .wrap（与导航/正文同轴，2026-07-16 修：固定 56px 衬距在宽视口
   下与 .wrap 居中错轴——hero 贴左缘、导航居中，视口越宽越糟）；本级只管垂直与背景 */
/* ★ 批3（spec 2026-08-08 D6）：hero 五个互不相干的 clamp 收敛成**单变量派生**。
   --hero-fs 就是原 .hero6-title 的公式（375px≈31px → ≥913px 封顶 56px，像素级不变）；
   其余四件全部 calc(× 比率)：因子/超额收益 = .643（顶格 36px）、操作符/＝ = .5（顶格 28px）。
   比率随基准永恒成立 —— G2 门断言 op < factor < title 四视口恒真。
   旧态的病：op 顶格 44px 比操作数 40px 还响（操作符压过操作数）；五系数互不相干
   （4.6/2.8/2.6/3.1/3.4）中间视口层级会穿插 —— v6 spec §12.7 留的账，本批清。
   position:relative 是水印「危」的定位锚（既有四页全靠 .page-head 的 relative）。 */
.hero6{--hero-fs:clamp(30px,calc(4.6vw + 14px),56px);position:relative;background:linear-gradient(180deg,#fff 0%,#fff 58%,#fdf0f2 100%);padding:74px 0 84px}
/* z-index:1 把标题/公式抬到水印之上（.watermark 是 positioned z-index:0，会盖过普通行内层） */
.hero6-col{max-width:1040px;position:relative;z-index:1}
.hero6-eyebrow{font-size: var(--text-caption);font-weight: var(--font-weight-bold);letter-spacing:.34em;color:var(--red);margin-bottom:30px}
.hero6-title{font-family:var(--font-display);font-weight: var(--font-weight-black);font-size:var(--hero-fs);
  line-height: var(--leading-tight);letter-spacing:.01em;color:var(--ink)}
.hero6-ln{display:block;text-wrap:balance}
/* 2026-08-04 内容批 A2：纪要 §C·一 首句要求「错行排版」。main.css 全文没有等价物
   （text-indent 只有 :485 一处、语义是给眉标补 letter-spacing 尾隙），故新写这两条。
   只用 em（跟随 .hero6-title 的 clamp 字号自动缩放），不新增 token、不改 :root。
   批 B 重画首屏时由 token 层接管。 */
.hero6-ln-in1{padding-left:1.6em}
.hero6-ln-in2{padding-left:3.2em}
.hero6-accent{color:var(--red)}
.hero6-lat{margin:0 .1em}
.hero6-nw{white-space:nowrap}
.hero6-sub{font-size: var(--text-lead);line-height: var(--leading-body);color:var(--body);max-width:33em;margin-top:28px}
.hero6-fx{margin-top:48px;padding-top:36px;border-top:1px solid var(--line)}
.hero6-res-row{display:flex;align-items:baseline;column-gap:.5em;margin-bottom:22px}
.hero6-res{font-family:var(--font-display);font-weight: var(--font-weight-black);font-size:calc(var(--hero-fs)*.643);color:var(--ink)}
.hero6-rel{font-family:var(--font-display);font-weight: var(--font-weight-black);color:var(--red);font-size:calc(var(--hero-fs)*.5)}
.hero6-grid{display:flex;align-items:baseline;flex-wrap:wrap;column-gap:0;row-gap:24px}
.hero6-factor{display:flex;flex-direction:column}
.hero6-kw{font-family:var(--font-display);font-weight: var(--font-weight-black);font-size:calc(var(--hero-fs)*.643);color:var(--ink);line-height: var(--leading-tight);white-space:nowrap}
.hero6-note{font-weight: var(--font-weight-normal);font-size: var(--text-caption);letter-spacing:.03em;color:rgba(17,17,17,.6);margin-top:10px;white-space:nowrap}
/* 操作符从旧顶格 44px 降到 .5em 派生（28px）——操作数为主、操作符让位（调研：×/＝是结构不是内容）。
   ★ 对齐从 flex-start 改 baseline 跟随：44→28 后顶对齐会让 × 悬在因子字肩上方。 */
.hero6-op{font-family:var(--font-display);font-weight: var(--font-weight-black);color:var(--red);font-size:calc(var(--hero-fs)*.5);line-height: var(--leading-tight);padding:0 .52em}
/* sup: 54% / line-height:0 / 显式900 / lining-nums / ²前零间距; 语义由可见 note 承担 */
.hero6-sq{font-size:.54em;line-height:0;position:relative;top:-.42em;font-weight: var(--font-weight-black);font-variant-numeric:lining-nums;padding-left:0}
/* ≤900px（与全站断点统一）: 公式纵排, × 独立成行居左 */
@media (max-width:900px){
  .hero6{padding:56px 0 64px}  /* 水平 24px 由 .wrap 的 --pad 提供 */
  .hero6-eyebrow{letter-spacing:.22em}
  .hero6-grid{flex-direction:column;align-items:flex-start;flex-wrap:nowrap;row-gap:14px}
  /* ★ 批3 spec 轮审计 P0（§10「hero 移动覆写×3→D6/§3.7」）：旧 font-size:24px
     字面量删除 —— 纵排态照走 .5em 派生（375px 实算 op≈15.6 < 因子≈20.1 <
     标题≈31.3，序关系与桌面一致）。
     redesign-b3.test.mjs 有反向守卫：本块内 .hero6-op 出现 px 字号即红。 */
  .hero6-op{padding:0;line-height: var(--leading-none)}
  .hero6-kw,.hero6-note{white-space:normal}
  /* 2026-08-04 内容批 A2：窄视口收紧错行缩进（3.2em 在 390px 下会把第三行挤出可读宽度） */
  .hero6-ln-in1{padding-left:1em}
  .hero6-ln-in2{padding-left:2em}
}
.home-sec { padding-top: 100px; padding-bottom: 60px; position: relative; }
.home-method { font-family: var(--font-display); font-size: var(--text-h1); font-weight: var(--font-weight-black); margin: 24px 0; }
.more-link { color: var(--red); font-weight: var(--font-weight-bold); font-size: var(--text-body); }
.home-post { padding: 28px 0; border-bottom: 1px solid var(--line); }
.home-post h3 { font-size: var(--text-h2); margin: 0; }
.home-post-meta { color: var(--muted); font-size: var(--text-caption); margin: 8px 0 0; }
.home-about { max-width: 760px; margin: 0 auto; padding: 80px 24px 56px; }
.home-about p { color: var(--body); line-height: var(--leading-body); margin: 0 0 20px; }
.home-about a { color: var(--red); font-weight: var(--font-weight-bold); }
/* round2 #9 修正（delta 审阅 P0）：同元素双 class 下 margin:0 shorthand 会吃掉 .wrap 的
   margin:0 auto 居中（>1440px 视口贴左缘错位 240px）。水平几何全权交 .wrap，
   行长约束（680px）下沉到子元素——标题与条目左缘落在 wrap 内容轴与「最新研究」共轴。 */
.home-faq { padding-top: 8px; padding-bottom: 64px; }
.home-faq > * { max-width: 680px; }
.home-faq-title { font-size: var(--text-caption); letter-spacing: 4px; color: var(--muted); font-weight: var(--font-weight-bold); margin: 0 0 4px; }
.home-faq details { border-top: 1px solid var(--line); padding: 12px 0; }
.home-faq summary { font-size: var(--text-body); font-weight: var(--font-weight-bold); color: var(--ink); cursor: pointer; }
.home-faq details p { color: var(--body); font-size: var(--text-body); line-height: var(--leading-body); margin: 10px 0 0; }
@media (max-width: 900px) { .hero { padding: 72px 0 90px; } }

/* methodology */
/* 2026-07-25：顶部留白 100px → 72px（用户从 40/56/72 三档定案）。全站各页共用
   （2026-08-03 取消「关于我们」后由九页变八页，故不再写死页数），
   community 页的 .watermark「众」字是绝对定位，收紧后须回归截图确认未被压叠。 */
.page-head { position: relative; padding-top: 72px; padding-bottom: 40px; overflow: visible; }
.page-sub { color: var(--muted); margin: 16px 0 40px; }
.chapter-tabs { display: flex; flex-wrap: wrap; gap: 12px; }
.chapter-tabs a { border: 1.5px solid var(--line); color: var(--muted); border-radius: 999px; padding: 10px 22px 10px 20px; font-size: var(--text-body); font-weight: var(--font-weight-bold); }
.chapter-tabs a::after { content: " ↓"; color: var(--red); }
.chapter-tabs a:hover { border-color: var(--red); color: var(--ink); }
/* .chapter-h2 已删（T2c-2）：模板零命中 + 渲染 DOM 零实例（两路证据），
   它带的 scroll-margin-top:48px 也是冗余的 —— 下面 .method-doc [id] 那条
   已经覆盖全页所有锚点目标。同批删掉的还有 .h-display（72px）与 .home-about-title。
   这三条合计贡献了 44 个字号里的 3 个，却一个像素都没渲染过。 */
/* 2026-08-03 取消「关于我们」：`.methodology` / `::after` / `.methodology .kg-callout-card`
   三条随 page-community.hbs 一并删除 —— 全站唯一消费者就是该页的 <div class="wrap methodology">
   （已核对 master：page-methodology.hbs 从来用的是 .method-doc，不是这个类）。
   留着尤其危险：名字撞方法论页，后人极易误以为它承重而不敢动。 */

/* methodology — 纯文档排版（去卡片去编号，重内容） */
/* round2 #2：h4 18→19px——与正文 17px 仅 1px 级差靠字重硬顶（像素实测坐实），
   19px 形成 17/19/22/28 的可辨字阶且不侵蚀 h3 层级 */
.method-doc h4 { font-family: var(--font-display); font-size: var(--text-title); font-weight: var(--font-weight-black); color: var(--ink); margin: 30px 0 10px; }
.method-doc ol, .method-doc ul { padding-left: 22px; }
.method-doc li { margin: 7px 0; }
.method-note { color: var(--muted); font-size: var(--text-body); margin: 6px 0 18px; line-height: var(--leading-body); }
.community-sign { text-align: center; color: var(--body); font-size: var(--text-lead); margin: 56px 0 0; }
@media (max-width: 900px) { .chapter-tabs { flex-wrap: wrap; } }

/* ═══ 模型论文（page-methodology #ch3，2026-07-30）═══
   学术论文排版惯例，全部收在 .paper 作用域内，不影响本页其余两章与其它页面：
   题名区居中并以细线收口 / 摘要块靠左粗线 + 降一号字 / 章节标题带序号留白 /
   三线表（只留横线，纵线一概不画）/ 图题在图下、表题在表上 / 参考文献悬挂缩进。
   正文沿用 .gh-content 的 760px measure（17px CJK 约 44 字一行，长文久读不累），
   不另设宽度——论文与本页其余部分共轴才不会读成两个网站。 */
.paper { margin-top: 8px; }

/* 题名区。**居中必须写在 p 上**：下面 `.paper p{text-align:justify}` 是 (0,1,1)，
   直接命中这几个 <p>，压得过 .paper-head (0,1,0) 的继承值——只写在容器上的话，
   标题居中而作者/单位/简介三行仍靠左（首轮预览实测）。 */
.paper-head { text-align: center; margin: 0 0 40px; padding-bottom: 28px; border-bottom: 1px solid var(--line); }
.paper .paper-head p { text-align: center; }
.paper .paper-title { font-family: var(--font-display); font-size: var(--text-h2); font-weight: var(--font-weight-black); line-height: var(--leading-snug); color: var(--ink); margin: 0 0 18px; text-wrap: balance; }
.paper .paper-byline { font-size: var(--text-lead); font-weight: var(--font-weight-bold); color: var(--ink); margin: 0 0 4px; }
.paper .paper-affil { font-size: var(--text-body); color: var(--muted); margin: 0 0 14px; }
.paper .paper-bio { font-size: var(--text-caption); line-height: var(--leading-body); color: var(--muted); margin: 0; }

/* 摘要块：靠左粗线 + 降一号字，与正文拉开层级但不用背景色（背景块在长文里会变成噪点） */
.paper-abstract { border-left: 3px solid var(--line); padding: 2px 0 2px 22px; margin: 0 0 34px; }
.paper .paper-abstract p { font-size: var(--text-body); line-height: var(--leading-body); text-align: justify; margin: 0 0 14px; }
.paper .paper-abstract p:last-child { margin-bottom: 0; }
.paper .paper-keywords { color: var(--muted); }

/* 目次：紧凑、无装饰，只是给长文一个入口 */
.paper-toc { border: 1px solid var(--line); border-radius: var(--radius); padding: 18px 24px 8px; margin: 0 0 40px; }
.paper .paper-toc-t { font-family: var(--font-display); font-weight: var(--font-weight-black); font-size: var(--text-body); color: var(--ink); margin: 0 0 10px; letter-spacing: 2px; }
.paper .paper-toc ol { margin: 0; padding-left: 20px; columns: 2; column-gap: 32px; }
.paper .paper-toc li { margin: 0 0 8px; font-size: var(--text-body); break-inside: avoid; }
.paper .paper-toc a { color: var(--body); }
.paper .paper-toc a:hover { color: var(--red); }
@media (max-width: 640px) { .paper .paper-toc ol { columns: 1; } }

/* 章节标题：h4 承一级（一、二、…）、h5 承二级（（一）（二）…） */
.paper .paper-h1 { font-family: var(--font-display); font-size: var(--text-title); font-weight: var(--font-weight-black); color: var(--ink); margin: 54px 0 18px; scroll-margin-top: 24px; }
.paper .paper-h2 { font-family: var(--font-display); font-size: var(--text-lead); font-weight: var(--font-weight-black); color: var(--ink); margin: 32px 0 12px; }
.paper p { line-height: var(--leading-body); text-align: justify; }
.paper ul, .paper ol { padding-left: 24px; }
.paper li { margin: 10px 0; line-height: var(--leading-body); text-align: justify; }

/* 公式：居中、衬线、上下留白——它是全文唯一一处需要被单独看见的排版对象 */
.paper-formula {
  font-family: var(--font-display); font-size: var(--text-lead); font-weight: var(--font-weight-bold); line-height: var(--leading-body);
  color: var(--ink); text-align: center; margin: 26px 0 30px; padding: 22px 20px;
  border-top: 1.5px solid var(--ink); border-bottom: 1.5px solid var(--ink);
}
.paper .paper-formula { text-align: center; }

/* 插图：图题在图下、居中、降一号字 */
.paper-fig { margin: 30px 0 34px; }
.paper-fig img { display: block; width: 100%; height: auto; border: 1px solid var(--line); border-radius: 6px; }
.paper-fig figcaption { margin-top: 12px; font-size: var(--text-body); line-height: var(--leading-body); color: var(--muted); text-align: center; }

/* 三线表：只画横线（顶线与底线加粗、表头下一条细线），纵线一概不画。
   窄屏横向滚动沿用 .gh-content table 的 display:block + overflow-x:auto。 */
.paper-table-wrap { margin: 30px 0 34px; }
.paper .paper-tabcap { font-size: var(--text-body); font-weight: var(--font-weight-bold); color: var(--ink); text-align: center; margin: 0 0 10px; }
.paper .paper-table { font-size: var(--text-body); margin: 0; border-top: 1.5px solid var(--ink); border-bottom: 1.5px solid var(--ink); }
.paper .paper-table th, .paper .paper-table td { border: 0; padding: 10px 14px; line-height: var(--leading-body); vertical-align: top; text-align: left; }
.paper .paper-table thead th { border-bottom: 1px solid var(--ink); font-weight: var(--font-weight-bold); color: var(--ink); white-space: nowrap; }
.paper .paper-table tbody tr + tr td { border-top: 1px solid #f0eeea; }
.paper .paper-table-num td:first-child { text-align: center; font-variant-numeric: tabular-nums; color: var(--muted); }
.paper .paper-tabnote { font-size: var(--text-caption); line-height: var(--leading-body); color: var(--muted); margin: 10px 0 0; }

/* 参考文献：悬挂缩进（序号出挑、回行对齐正文），西文按原样不两端对齐 */
.paper .paper-refs { padding-left: 0; list-style: none; counter-reset: ref; font-size: var(--text-body); }
.paper .paper-refs li {
  counter-increment: ref; position: relative;
  padding-left: 50px; margin: 0 0 12px; line-height: var(--leading-body); text-align: left;
}
/* 序号盒**必须定宽**：绝对定位的 ::before 不占位，只靠 li 的 padding 留空——
   一位数留得下、两位数留不下，于是 ［10］ 起整列直接顶到正文（首轮预览实测
   「[10]Fisher」）。定宽 40px + padding 50px 让一位与两位数的正文都从同一竖线起排。 */
.paper .paper-refs li::before {
  content: "［" counter(ref) "］"; position: absolute; left: 0; top: 0;
  width: 40px; color: var(--muted); font-variant-numeric: tabular-nums;
}

/* 作者声明：全文末尾的元信息，降一号字并与正文以细线分隔 */
.paper .paper-decl {
  font-size: var(--text-caption); line-height: var(--leading-body); color: var(--muted);
  border-top: 1px solid var(--line); padding-top: 20px; margin-top: 40px;
}

@media (max-width: 900px) {
  .paper-abstract { padding-left: 16px; }
  .paper-formula { font-size: var(--text-lead); padding: 18px 14px; }
}
/* 打印：论文是唯一值得打出来的一章——去掉目次与图片边框，链接不展开 URL */
@media print {
  .paper-toc { display: none; }
  .paper-fig img { border: 0; }
  .paper .paper-refs li, .paper-fig, .paper-table-wrap { break-inside: avoid; }
  .paper a[href]::after { content: none; }
}

/* community */
.join-note { color: var(--muted); font-size: var(--text-caption); margin: 6px 0 0; }

/* 联系卡内部块（contact-card 复用；原收款/订阅区块已随裁决 6 删除） */
.sub-blk { margin: 0 0 18px; }
.sub-label { display: block; font-size: var(--text-caption); letter-spacing: .04em; color: var(--muted); margin-bottom: 6px; }
.sub-blk p { margin: 0; color: var(--body); }

/* 联系方式 · telegram + 二维码（contact.hbs，研究页 + 社区页共用） */
.contact-line { margin: 0 0 14px; color: var(--body); }
.contact-line a { color: var(--red); font-weight: var(--font-weight-bold); }
.qr-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; max-width: 420px; }
.qr-item { display: flex; flex-direction: column; align-items: center; gap: 10px; margin: 0; border: 1.5px solid var(--line); border-radius: var(--radius); padding: 16px; }
.qr-item img { width: 100%; max-width: 160px; height: auto; display: block; }
.qr-item figcaption { font-size: var(--text-caption); font-weight: var(--font-weight-bold); color: var(--muted); text-align: center; }

/* ★ grid-auto-rows:1fr（2026-08-06 巡检，用户指出）：不写的话每一行按自己那行的
   最高内容定高 —— 实测第一行 155px（有「即将开通」副标）、第二行 121px，
   两行卡片不一样高，看着像没做完而不是有意为之。1fr 让所有行等高。 */
.social-grid { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 1fr; gap: 16px; margin-top: 32px; max-width: 900px; }
/* ★ font-size 是 T2c-1 补的：这条规则原本**从没声明过字号**，七个社交链接一直在
   继承 html 的 16px —— 而 16px 不在刻度上（body 15 / lead 17 之间）。
   按声明迁移的做法对这种情况结构性免疫（没有声明就没有东西可迁），是靠渲染面
   断言「整页字号必须都在刻度内」才抓出来的。 */
/* ★ justify-content 必须是 flex-start 不能是 center（2026-08-06 巡检，用户指出）：
   七张卡里有两张带 <em>即将开通</em> 副标，内容比别人多一行。竖排 flex 居中时
   内容多的那张会把图标往上顶 —— 实测同一行内图标顶 23 vs 40、名称顶 73 vs 90，
   各差 17px，一眼就是没对齐。flex-start 让所有卡的图标都从 padding-top 起排，
   副标自然挂在名称下方，图标线与名称线各自成一条。 */
.social-item { display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: 10px; border: 1.5px solid var(--line); border-radius: var(--radius); padding: 22px; font-size: var(--text-body); font-weight: var(--font-weight-bold); text-align: center; }
.social-item svg { flex-shrink: 0; }
.sm-bg { fill: var(--red); }
.social-soon .sm-bg { fill: #BFBFBF; }
.social-item:hover { border-color: var(--red); color: var(--red); }
.social-soon { color: var(--muted); cursor: default; position: relative; }
.social-soon:hover { border-color: var(--line); color: var(--muted); }
.social-soon em { display: block; font-style: normal; font-weight: var(--font-weight-normal); font-size: var(--text-micro); margin-top: 4px; color: var(--muted); }
.social-wechat { cursor: pointer; font-family: inherit; font-size: inherit; background: #fff; }
.social-wechat em { display: block; font-style: normal; font-weight: var(--font-weight-normal); font-size: var(--text-micro); margin-top: 4px; color: var(--muted); }
.social-wechat:hover { border-color: var(--red); color: var(--red); }
.social-wechat.copied { border-color: var(--red); }
.social-wechat.copied em { color: var(--red); }
.kg-callout-card-grey { background: #F5F5F5; }
@media (max-width: 900px) { .social-grid { grid-template-columns: repeat(2, 1fr); } }

/* post */
.pagination { display: flex; justify-content: space-between; padding: 40px 0; color: var(--muted); font-size: var(--text-body); }

/* ===== koenig subset（标题/段落/表格/callout/toggle/引用/分隔）===== */
.gh-content { max-width: 760px; margin: 0 auto; font-size: var(--text-lead); color: var(--body); }
.gh-content-left { margin-left: 0; }
.gh-content h2 { font-family: var(--font-display); font-size: var(--text-h2); color: var(--ink); margin: 56px 0 16px; }
.gh-content h3 { font-family: var(--font-display); font-size: var(--text-title); color: var(--ink); margin: 40px 0 12px; }
.gh-content p { margin: 0 0 24px; }
/* ── 研报正文里的列表（T3）──────────────────────────────────────────────────
   在此之前 ul/li **一条规则都没有**，全吃浏览器默认，实测三处不对：
     (a) li 之间零间距 —— 真实研报里每条 li 是 2-3 行中文，挤在一起读者分不出
         一条在哪结束（生产 /research/crcl-us-20260624/ 上五条并成一坨）；
     (b) ul 的 margin 是 17px（1em），与全站段落的 24px 节奏不一致；
     (c) padding-left:40px 是拉丁式大缩进，中文正文用 em 相对量更稳。

   ★ 刻意**不引入** @tailwindcss/typography：真实研报只用 10 种标签
     （h2/h3/p/hr/blockquote/table/thead/tr/th/td/ul/li/strong/a），其中只有
     ul/li 没被覆盖 —— 零代码块、零图片、零 figure、零 h4+。为两个标签塞进
     十几 KB 的 .prose、再写一堆覆写把 token / 红色引用条 / 表格横滚 /
     CJK 的 word-break:keep-all 抢回来，是净亏。判据见 spec §13。 */
.gh-content ul, .gh-content ol { margin: 0 0 24px; padding-left: 1.6em; }
.gh-content li { margin: 0 0 12px; }
.gh-content li:last-child { margin-bottom: 0; }
/* 嵌套列表不再重复吃一份下外距，否则层级越深空隙越夸张 */
.gh-content li > ul, .gh-content li > ol { margin: 12px 0 0; }
.gh-content hr { border: 0; border-top: 1px solid var(--line); margin: 48px 0; }
.gh-content blockquote { border-left: 3px solid var(--red); margin: 0 0 24px; padding: 4px 0 4px 20px; color: var(--ink); }
.gh-content table { width: 100%; border-collapse: collapse; margin: 0 0 24px; font-size: var(--text-body); }
.gh-content th, .gh-content td { border: 1px solid var(--line); padding: 10px 12px; text-align: left; }
.kg-callout-card { display: flex; gap: 10px; padding: 20px 24px; border-radius: var(--radius); margin: 0 0 24px; background: #FBEAEA; }
.kg-callout-card-accent { background: #FBEAEA; }
.kg-toggle-card { border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 20px; margin: 0 0 16px; }
.kg-button-card a { display: inline-block; background: var(--red); color: #fff; border-radius: var(--radius); padding: 12px 28px; font-weight: var(--font-weight-bold); }

/* ===== koenig required (gscan) ===== */
.kg-width-wide { max-width: 1040px; margin-left: auto; margin-right: auto; }
.kg-width-full { max-width: 100%; }
.kg-gallery-container { display: flex; flex-direction: column; margin: 0 0 24px; }
.kg-gallery-row { display: flex; gap: 8px; }
.kg-gallery-image { flex: 1; }
.kg-gallery-image img { width: 100%; height: auto; display: block; }
.kg-bookmark-card { margin: 0 0 24px; }
.kg-bookmark-container { display: flex; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; color: inherit; text-decoration: none; }
.kg-bookmark-content { flex: 1; padding: 18px 20px; }
.kg-bookmark-title { font-weight: var(--font-weight-bold); }
.kg-bookmark-description { color: var(--muted); font-size: var(--text-body); margin-top: 6px; }
.kg-bookmark-metadata { color: var(--muted); font-size: var(--text-caption); margin-top: 12px; display: flex; align-items: center; gap: 8px; }
.kg-bookmark-icon { width: 18px; height: 18px; }
.kg-bookmark-author { font-weight: var(--font-weight-medium); }
.kg-bookmark-publisher { color: var(--muted); }
.kg-bookmark-thumbnail { min-width: 200px; }
.kg-bookmark-thumbnail img { width: 100%; height: 100%; object-fit: cover; }

/* 研报宽表（估值/财务）窄屏可横向滑动，不被 overflow-x:hidden 裁右列（覆盖上面 .gh-content table） */
.gh-content table { display: block; overflow-x: auto; max-width: 100%; }
/* 视觉审计 round1：CJK 表格单元禁字内断行（估值表「适用判定」列曾现「校\n验」孤字悬挂）；
   列变宽由既有 overflow-x:auto 横向滚动兜住 */
.gh-content table th, .gh-content table td { word-break: keep-all; }

/* 研报：首页区块 + 合集列表 + 文章页尾脚手架 */
.home-research { margin-top: 8px; }
.home-research-item { padding: 8px 0; border-top: 1px solid var(--line); }
.home-research-date, .research-list-meta, .research-related-date { color: var(--muted); font-size: var(--text-caption); }
.research-list { padding-top: 8px; }
.research-list-h, .research-related-h { font-size: var(--text-lead); font-weight: var(--font-weight-bold); margin: 0 0 12px; }
.research-list-item { padding: 14px 0; border-top: 1px solid var(--line); }
.research-list-item h3 { margin: 0 0 4px; font-size: var(--text-lead); }
.research-extra { margin-top: 40px; padding-top: 24px; border-top: 2px solid var(--line); }
.research-up { margin-bottom: 24px; }
.research-related-pool { list-style: none; margin: 0; padding: 0; }
.research-related-item { padding: 8px 0; display: flex; justify-content: space-between; gap: 12px; align-items: baseline; }
.research-related-pool li:nth-child(n+4) { display: none; }   /* 默认/无 JS：显最新 3；JS 打乱 DOM 序后自然显示随机 3 */
.research-cta { margin-top: 24px; padding: 20px; border: 1px solid var(--line); border-radius: var(--radius); }
.research-cta-lead { font-weight: var(--font-weight-medium); margin: 0 0 6px; }
.research-disclaimer { color: var(--muted); font-size: var(--text-caption); margin: 12px 0 0; }

/* ===== 研报列表卡（方向 A·编辑式） ===== */
.rcard-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 720px) { .rcard-grid { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); } }
.rcard { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: #fff; transition: border-color .15s ease, box-shadow .15s ease; }
.rcard:hover { border-color: #ddd; box-shadow: 0 6px 20px rgba(0,0,0,.06); }
.rcard-link { display: block; }
.rcard-bar { display: block; height: 3px; background: var(--red); }
.rcard-in { padding: 14px 16px 15px; }
.rcard-top { display: flex; justify-content: space-between; align-items: center; font-size: var(--text-micro); }
.rcard-mkt { color: var(--red); font-weight: var(--font-weight-bold); letter-spacing: 2px; }
.rcard-date { color: var(--muted); font-variant-numeric: tabular-nums; }
.rcard-tk { display: inline-block; margin: 9px 0 7px; font-family: "SF Mono", ui-monospace, Menlo, Consolas, monospace; font-size: var(--text-micro); font-weight: var(--font-weight-medium); color: #333; background: #f3f3f3; border-radius: 5px; padding: 2px 7px; letter-spacing: .5px; }
.rcard-tk:empty { display: none; }
.rcard-title { font-family: var(--font-display); font-weight: var(--font-weight-bold); font-size: var(--text-lead); line-height: var(--leading-snug); color: var(--ink); margin: 0; transition: color .15s ease; }
.rcard-link:hover .rcard-title { color: var(--red); }
.rcard-exc { font-size: var(--text-caption); color: var(--muted); line-height: var(--leading-snug); margin: 7px 0 10px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.rcard-foot { display: flex; justify-content: space-between; align-items: center; font-size: var(--text-micro); color: var(--muted); }
.rcard-read { color: var(--red); font-weight: var(--font-weight-medium); }
@media (prefers-reduced-motion: reduce) { .rcard, .rcard-title { transition: none; } }

/* 研报归档页：按市场筛选 chips（复用 Ghost /research/tag/<市场>/ 路由） */
.rcard-filter { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 20px; position: relative; z-index: 1; }
.rcard-chip { font-size: var(--text-caption); color: var(--ink); border: 1px solid var(--line); border-radius: 999px; padding: 5px 14px; transition: border-color .15s ease, color .15s ease; }
.rcard-chip:hover { border-color: var(--red); color: var(--red); }
@media (prefers-reduced-motion: reduce) { .rcard-chip { transition: none; } }

/* ===== 研报顶部 hero（research-hero partial） ===== */
.rhero { display: block; padding: 8px 0 4px; }
.rhero-main { display: block; min-width: 0; }
.rhero-crumb { font-size: var(--text-caption); color: var(--muted); letter-spacing: 2px; }
.rhero-crumb a { color: inherit; }
.rhero-crumb a:hover { color: var(--red); }
.rhero-tk-chip { display: inline-block; margin: 12px 0 0; font-family: "SF Mono", ui-monospace, Menlo, Consolas, monospace; font-size: var(--text-micro); font-weight: var(--font-weight-medium); color: #333; background: #f3f3f3; border-radius: 5px; padding: 2px 8px; letter-spacing: .5px; }
.rhero-tk-chip:empty { display: none; }
.rhero-title { font-family: var(--font-display); font-weight: var(--font-weight-black); font-size: var(--text-h1); line-height: var(--leading-tight); margin: 12px 0 0; color: var(--ink); }
.rhero-meta { color: var(--muted); font-size: var(--text-body); margin-top: 14px; font-variant-numeric: tabular-nums; }
.rhero-asof { display: inline-block; margin-top: 12px; font-size: var(--text-caption); color: var(--muted); background: #f6f6f6; border-radius: 999px; padding: 4px 12px; }
/* gap 18 与 .sm-link 的 padding:5/margin:-5 是一组：圆钮视觉 34px 不动，命中盒扩到
   44×44（触控最小），相邻命中盒之间 18-10=8px——三个数改任何一个都会破另外两条约束。 */
.rhero-share { display: flex; gap: 18px; margin-top: 16px; }
.rhero-rule { height: 2px; background: var(--red); width: 42px; margin: 20px 0 4px; }
.rhero-share .sm-link { display: inline-flex; padding: 5px; margin: -5px; border: 0; background: none; cursor: pointer; line-height: 0; position: relative; }
.rhero-share .sm { width: 34px; height: 34px; }
.rhero-share .sm-bg { fill: var(--ink); transition: fill .15s ease; }   /* 克制：深底而非实心红 */
.rhero-share .sm-link:hover .sm-bg { fill: var(--red); }
@media (prefers-reduced-motion: reduce) { .rhero-share .sm-bg { transition: none; } }
.rhero-copy.is-copied::after, .rhero-share-native.is-copied::after {
  content: "已复制"; position: absolute; left: 50%; bottom: 120%; transform: translateX(-50%);
  background: var(--ink); color: #fff; font-size: var(--text-caption); padding: 3px 8px; border-radius: 6px; white-space: nowrap;
}
/* 微信 QR 弹窗 */
.rhero-qr-mask { position: fixed; inset: 0; background: rgba(0,0,0,.55); display: flex; align-items: center; justify-content: center; z-index: 1000; }
.rhero-qr-box { background: #fff; padding: 24px; border-radius: var(--radius); text-align: center; max-width: 280px; }
.rhero-qr-box svg { width: 200px; height: 200px; }
.rhero-qr-cap { margin: 12px 0 0; font-size: var(--text-caption); color: var(--muted); }
@media (max-width: 900px) {
}

/* ===== A1 阅读进度条（纯 CSS scroll-timeline，渐进增强；仅研报页由 post-research 注入） ===== */
.read-progress { position: fixed; top: 0; left: 0; height: 3px; width: 100%; transform-origin: 0 50%; transform: scaleX(0); background: var(--red); z-index: 999; }
@supports (animation-timeline: scroll()) {
  .read-progress { animation: read-progress-grow linear; animation-timeline: scroll(root block); }
  @keyframes read-progress-grow { from { transform: scaleX(0); } to { transform: scaleX(1); } }
}
@supports not (animation-timeline: scroll()) { .read-progress { display: none; } }   /* 不支持则不显示 */

/* ===== A2 打印 / PDF 样式：留干净正文 + 强制保留 as-of 徽标与免责（诚实闸物理延伸） ===== */
@media print {
  /* 不整块隐藏 .research-cta（免责行嵌其内，父 display:none 会连子一起移除）；只隐藏 CTA 营销子元素。 */
  .nav, footer, .rhero-share, .research-related, .research-up, .read-progress, .back-top, .rcard-filter,
  .research-cta-lead { display: none !important; }
  body { color: #000; }
  .rhero-title, .gh-content { color: #000 !important; }
  .rhero-asof { border: 1px solid #000; background: #fff !important; }   /* 时点徽标随印保留 */
  .gh-content a[href]::after { content: " (" attr(href) ")"; font-size: var(--text-micro); color: #333; }  /* 展开外链 */
  .research-cta { margin: 0; padding: 0; border: 0; }                    /* CTA 容器留作免责载体，去框 */
  .research-disclaimer { display: block !important; color: #000 !important; }   /* 免责随印保留 */
}

/* 首屏判据句（v7 判据换代）：钩子主 + 定位副 + 判据卡（kicker + 问句 + 界定行 + 免责）。
   裁决 #18 合规视觉克制——免责同屏但浅色小字，不做打断式弹窗。
   判据块做成「一个问题」白色静卡：细红调边 + 软影，在渐变底上有视觉锚而不喧宾。 */
.acl-criterion { max-width: 720px; margin: 0 auto; padding: 26px 36px 20px; text-align: center; background: #fff; border: 1px solid rgba(223, 32, 32, .12); border-radius: 16px; box-shadow: 0 12px 36px rgba(223, 32, 32, .07); }
.acl-criterion-lead { display: block; font-size: var(--text-caption); font-weight: var(--font-weight-bold); letter-spacing: .28em; text-indent: .28em; color: var(--red); margin-bottom: 10px; }
.acl-criterion-q { margin: 0; font-size: clamp(17px, 2.2vw, 21px); color: var(--ink); line-height: var(--leading-body); }
.acl-criterion-q strong { font-weight: var(--font-weight-bold); }
.acl-criterion-def { max-width: 600px; margin: 12px auto 0; font-size: var(--text-caption); line-height: var(--leading-body); color: #9a9a9a; }
.acl-criterion-dyor { margin: 12px auto 0; padding-top: 10px; border-top: 1px solid #f2f2f2; font-size: var(--text-caption); line-height: var(--leading-body); color: #a6a6a6; }
@media (max-width: 720px) { .acl-criterion { padding: 20px 18px 16px; border-radius: 12px; } }

/* v5 首页：界定行 / 公式 / 三组内容列表（纲领落页） */
.acl-hedge-def { max-width: 640px; margin: 14px auto 0; font-size: var(--text-caption); line-height: var(--leading-body); color: var(--muted); }
/* ★ 左缘（2026-08-06 全站巡检）：原来是 `margin: 12px auto 28px` —— 居中。
   而同区块的眉标 .sec-label 与标题 .home-method 没有 max-width，落在 1200px 版心
   左缘 120px 上。实测 1440 视口下标题在 120、清单在 353，**横向差 233px**，
   视线一路左-右-左地跳；而且另一条轴 .home-sec .gh-content 是 760 居中（333），
   两条内容轴彼此还差 20px。
   处置与 /engine/ 当初「全页唯一一条左缘」同源（用户在那一页认可过这个做法）：
   内容列保持 720 宽但贴左，标题/眉标/正文共用一条左缘。 */
.home-list { max-width: 720px; margin: 12px 0 28px; padding: 0; list-style: none; text-align: left; }
.home-list li { padding: 8px 0; border-bottom: 1px solid var(--line); font-size: var(--text-lead); line-height: var(--leading-body); color: var(--body); }
.home-list li strong { color: var(--ink); }
/* 首页「实验室介绍」那块的正文用的是全站共享的 .gh-content（760 居中，实测左缘 333）。
   研报详情页居中是对的 —— 那是单栏文章页；但在首页它与同区块 120px 的标题错开 213px。
   只在 .home-sec 内贴左并收到与 .home-list 同宽，不动研报页。 */
.home-sec .gh-content { max-width: 720px; margin-left: 0; margin-right: auto; }
.home-sec .acl-criterion { text-align: left; margin-top: 24px; }
.home-sec .acl-criterion .home-list { margin-bottom: 8px; }

/* v5 引擎页：10 步流程 / 视频空态卡位 */
.page-title { font-family: var(--font-display); font-size: var(--text-h1); font-weight: var(--font-weight-black); margin: 8px 0 0; }
/* 引擎页架构段（2026-07-25）：四行小字，作为上方 engine-features 功能清单的注解层。
   轴对齐 .home-list（720px + margin auto，:393）而非页面左轴——注解必须贴着它注解的
   那份清单的左缘起排，否则读作两个不相干的块。engine 页 h1/engine-steps 走左轴，
   .home-list 走居中轴，这个不一致是既有的，本次不动它，只让注解跟对轴。 */
.engine-architecture { max-width: 720px; margin: 0 auto 28px; }
.engine-architecture p { margin: 2px 0; font-size: var(--text-caption); line-height: var(--leading-body); color: var(--muted); }
.engine-steps { max-width: 760px; margin: 20px 0 40px; padding-left: 0; list-style: none; counter-reset: step; }
.engine-steps li { counter-increment: step; padding: 14px 0 14px 56px; position: relative; border-bottom: 1px solid var(--line); font-size: var(--text-lead); line-height: var(--leading-body); color: var(--body); }
.engine-steps li::before { content: counter(step, decimal-leading-zero); position: absolute; left: 0; top: 14px; font-family: var(--font-display); font-weight: var(--font-weight-black); font-size: var(--text-title); color: var(--red); }
.engine-steps li strong { color: var(--ink); margin-right: 6px; }
.video-slot { max-width: 760px; margin: 16px 0 40px; padding: 56px 24px; border: 1px dashed var(--line); border-radius: var(--radius); text-align: center; background: #fafafa; }
.video-slot-note { margin: 0; font-size: var(--text-body); color: var(--muted); }

/* /research/ 页的机构联系卡（原收款卡已随裁决 6 删除）——与首屏判据卡同卡片语言 */
.contact-card { max-width: 640px; margin: 0 auto 48px; padding: 28px 32px 20px; border: 1px solid #e8e8e8; border-radius: 16px; box-shadow: 0 8px 28px rgba(0, 0, 0, .04); background: #fff; }

/* 方法论页：纲领四小节配图 + 评分制括注小字 */
.model-fig { max-width: 600px; width: 100%; height: auto; display: block; margin: 16px auto; }
.meth-note { font-size: var(--text-caption); color: var(--muted); }

/* 2026-08-03 批 A：社交矩阵从已删的 community 页迁到首页，贴 footer 前。
   复用既有 .social-grid/.social-item（删页后它们没有消费者了，本节接过来），
   此处只给外层节一个节间距：与紧邻的上一节 .home-faq（8/64）同节奏 ——
   plan 原稿写 72/72，与任何同级节都对不上（.home-sec 是 100/60）。
   批 B 重画首页时这条会被 token 层接管。 */
.home-follow { padding-top: 8px; padding-bottom: 64px; }

/* 2026-08-04 内容批 A2：首页路线图编年轴（spec D3 用户面板裁决 = 编年轴，左轴一线到底
   + 节点圆点）。main.css 全文没有任何「竖线 + 圆点」组件，最接近的 .engine-steps 是
   counter 编号列表、无轴无点 —— 故新写。约束照 spec D22：只用既有 :root 变量
   （--line/--red/--muted/--body/--ink/--font-display）与既有 900px 断点，不新增 token、
   不改 :root。批 B 重画首页时由 token 层接管。
   宽度 720px 与 .home-list（:494）同轴，与「快速了解」块左缘对齐。 */
/* 同上：贴左。保留 padding-left:28px —— 那是竖轴的沟槽（节点圆点骑在轴上），
   与 /engine/ 十步的 32px 同型，读作结构不是错位。 */
.road-axis { max-width: 720px; margin: 12px 0 28px; padding: 0 0 0 28px; list-style: none; position: relative; }
.road-axis::before { content: ""; position: absolute; left: 4px; top: 18px; bottom: 18px; width: 1px; background: var(--line); }
.road-node { position: relative; padding: 14px 0; }
.road-node::before { content: ""; position: absolute; left: -28px; top: 22px; width: 9px; height: 9px; border-radius: 50%; background: var(--bg); border: 2px solid var(--line); box-sizing: border-box; }
.road-node.is-live::before { border-color: var(--red); background: var(--red); }
.road-title { font-family: var(--font-display); font-size: var(--text-lead); font-weight: var(--font-weight-black); color: var(--ink); margin: 0 0 6px; line-height: var(--leading-snug); }
/* 2026-08-06：这里试过加 font-variant-numeric: tabular-nums，实测**零效果**
   （五行「｜」左缘加与不加都是 533.38px，偏差 0）。原因在内容层面：Node 序号
   本来就是补零的（01-05），补零已经让它们等宽，没有可修的东西。别再加一次。 */
.road-badge { margin-left: 10px; font-size: var(--text-caption); font-weight: var(--font-weight-bold); letter-spacing: .08em; color: var(--muted); white-space: nowrap; }
.road-node.is-live .road-badge { color: var(--red); }
.road-text { margin: 0; font-size: var(--text-body); line-height: var(--leading-body); color: var(--muted); }
.road-node.is-live .road-text { font-size: var(--text-lead); color: var(--body); }
@media (max-width: 900px) { .road-title { font-size: var(--text-lead); } .road-axis { padding-left: 22px; } .road-node::before { left: -22px; } }

/* 2026-08-04 内容批 A2：研究方法页 icon 分区栅格（纪要 §C·二「可点击icon」，spec §5.3
   「卡片栅格 8 个入口 · 单色描边 SVG · 禁 emoji」）。形状抄 .social-grid/.social-item
   （:326-331）但不复用它们——那套是 4 列社交按钮，本块是 8 项节级导航、字号与内距都不同，
   复用会让改一处动两处。约束照 spec D22：只用既有 :root 变量与既有 900px 断点。
   批 C 重画本页时由组件语言接管。
   scroll-margin-top 给全页带 id 的元素，否则 smooth 滚动会把标题顶到视口最上沿。 */
.mth-entries { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin: 12px 0 40px; padding: 0; list-style: none; max-width: 760px; }
.mth-entry { display: flex; flex-direction: column; align-items: center; gap: 8px; height: 100%; border: 1.5px solid var(--line); border-radius: var(--radius); padding: 18px 10px; font-size: var(--text-caption); font-weight: var(--font-weight-bold); color: var(--ink); text-align: center; line-height: var(--leading-snug); }
.mth-entry:hover { border-color: var(--red); color: var(--red); }
.mth-entry svg { flex-shrink: 0; color: var(--red); }
.method-doc [id] { scroll-margin-top: 24px; }
@media (max-width: 900px) { .mth-entries { grid-template-columns: repeat(2, 1fr); } }

/* ══════════════════════════════════════════════════════════════════════════
   AI研究工具页（article.page-engine）· 整页重做 · 批 E
   ──────────────────────────────────────────────────────────────────────────
   方向：用户 2026-08-05 选定「方向 C · 工程蓝图」的**结构装置**，但配色与字体
   一律回到本站既有语言（用户裁决：颜色/风格需与本站一致）。
     C 的骨架 —— 四格管线节点 / 十步贯通竖轴 / 三组自问成卡；
     本站的皮肤 —— 白底 #fff、品牌红 #DF2020、发丝线 #EDEDED、
                    标题走 --font-display 宋体、圆角 --radius 12px。
   **方案 C 原稿的深青 #0f6d7a 与冷白底 #f4f6f8 全部弃用** —— 那是站外配色。
   红色只落在序号与那两条语域短线上，不铺面。

   ★ 选择器必须写成 `article.page-engine`，不能只写 `.page-engine`：
     Ghost 的 {{body_class}} 会给 <body> 也加一个 `page-<slug>`，实测本页 body 是
     `page-template page-engine` —— 只写 `.page-engine >` 时，子组合器会同时命中
     <body> 的直接子元素（nav / main / footer）。本页 body 下恰好没有 <section>，
     今天看不出毛病，但那是巧合不是设计。
   ★ 全局规则一行不改。要打赢的 .gh-content(:356) / .home-list(:503) /
     .acl-criterion(:493) / .engine-steps(:517) 全是 (0,1,0)，本段一律用
     两类名 (0,2,0) 取胜，不依赖源码序（main.css:68 有条层叠契约注释在警告这个）。
   ★ 这些类在别处还有消费者（.home-list 共 7 处、.home-method 共 11 处、
     .engine-steps 在 home.hbs 还有一个），故差异全部走 article.page-engine 前缀。
   ══════════════════════════════════════════════════════════════════════════ */

article.page-engine {
  /* 2026-08-08 四页水印批：本元素兼任「智」水印的定位锚（.page-head 嵌在
     eng-hero 栏内锚不住整页右缘）。 */
  position: relative;
  /* 2026-08-06 用户裁决「买方机构派」：版心按实测同侪放宽 ——
     Bridgewater 840px、Baillie Gifford 795px，我们原来的 680 偏窄。
     放到 760；正文仍由 --eng-measure 卡在 40 字/行，所以放宽的是**块**不是**行长**。 */
  --eng-col: 760px;
  --eng-measure: 40em;   /* 行长 40 字。em 在 var() 的使用点解析：17px→680 / 14px→560 */
}

/* ── 1 · 全页唯一一条左缘 ──────────────────────────────────────────────────
   原页 760左 → 720居中 → 720居中 → 760左，1440px 下右移 240px、视线来回跳两次。
   ★ 绝不给 article.page-engine 本身写 margin —— 它与 .wrap 同元素，会吃掉
     .wrap 的 margin:0 auto，>1440px 时整页贴左。 */
article.page-engine > .page-head,
article.page-engine > .gh-content,
article.page-engine > section,
article.page-engine > .acl-criterion-dyor {
  max-width: var(--eng-col);
  margin-left: 0;
  margin-right: auto;
}
article.page-engine > .engine-features,
article.page-engine > .engine-architecture { margin-top: 48px; }
article.page-engine > .engine-steps-sec,
article.page-engine > .engine-before { margin-top: 80px; }

/* 两次语域转换各配一条红短线（形状取自 .rhero-rule） */
article.page-engine > .engine-steps-sec::before,
article.page-engine > .engine-before::before {
  content: "";
  display: block;
  width: 48px;
  height: 2px;
  background: var(--red);
  margin: 0 0 24px;
}

/* ── 2 · 报头：改名后眉标「AI 研 究 工 具」与 h1「AI研究工具」逐字相同，
   叠在一起是重复不是层级。h1 从全局 clamp 顶格的 44px 降到 40px（44 不在刻度上）。
   ★ h1/眉标的标签形状被 check_site_seo 两条整标签断言锁死，只能走后代选择器。 */
article.page-engine .page-head { padding: 56px 0 28px; }
article.page-engine .sec-label { margin: 0; }
article.page-engine .home-method,
article.page-engine .page-title {
  /* ★ 诚实标注：本页标题在实测的每个视口下都是**单行**，balance 当前是空转
     （820/1025/1280/1440 逐一量过，加与不加高度完全一致）。留着是防御性的 ——
     文案一旦变长、或换到更窄的设备上折行时才起作用。不要因为「加了它排版会变好」
     而以为现在变好了：现在没有任何可观测差别。 */
  text-wrap: balance;
}
article.page-engine .page-title {
  font-weight: var(--font-weight-medium);
  font-size: var(--text-h1);
  line-height: var(--leading-tight);
  margin: 8px 0 0;
}

/* ── 3 · 导语：首段升 standfirst，作 h1 与正文之间的过渡音阶 ───────────────── */
article.page-engine > .gh-content { max-width: var(--eng-col); font-size: var(--text-lead); }
article.page-engine > .gh-content > p { max-width: var(--eng-measure); margin: 0 0 24px; }
article.page-engine > .gh-content > p:first-child {
  font-size: var(--text-title);
  line-height: var(--leading-body);
  color: var(--ink);
  margin-bottom: 32px;
}

/* ── 3b · hero 两栏（方向 C 招牌）：左 报头+导语，右 覆盖规格 ────────────── */
article.page-engine > .eng-hero {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 64px;
  align-items: end;
  max-width: none;              /* 本块刻意通栏，是全页唯一一处 */
  padding-bottom: 40px;
  border-bottom: 1px solid var(--ink);
}
article.page-engine .eng-hero-main > .page-head,
article.page-engine .eng-hero-main > .gh-content { max-width: var(--eng-col); }
article.page-engine .eng-hero-main > .gh-content > p:last-child { margin-bottom: 0; }
article.page-engine .engine-features { margin: 0; }

/* ── 4 · 覆盖规格：成卡，与管线节点同一种材质（白底 + 发丝线框 + 12px 圆角）── */
/* 规格：一句导语 + 两组「标签 / 值」。原来三条同字号同色等权排开，
   读者看不出「第一条讲的是能力、后两条讲的是范围」。不用横线 —— 横线在本页
   只归十步流程。 */
article.page-engine .eng-spec-lead {
  margin: 0 0 24px;
  font-size: var(--text-body);
  line-height: var(--leading-body);
  color: var(--ink);
}
/* 这里曾加过一条 border-top:2px 想给规格块「立个锚」—— 去掉了。
   它左边没有任何东西与之对齐，读者看到的是一条无所指的装饰线（用户直接问
   「这横线是啥」，那就是它没传递任何信息的证据）。结构装置要编码内容里真实
   存在的东西，不编码就是装饰。规格块靠 hero 的两栏关系与留白站住，不需要线。 */
article.page-engine .engine-features { padding-top: 4px; }
article.page-engine .eng-spec { margin: 0; }
article.page-engine .eng-spec dt {
  font-size: var(--text-micro);
  letter-spacing: .18em;
  color: var(--muted);
  margin: 0 0 8px;
}
article.page-engine .eng-spec dd { margin: 0 0 20px; display: flex; flex-wrap: wrap; gap: 6px; }
article.page-engine .eng-spec dd:last-child { margin-bottom: 0; }
/* 覆盖项做成可数的标签：原来「美股 港股 A股 加密货币」是一句话，读者数不出
   有几项；拆成标签后「覆盖多少」一眼可数，这才是规格区该有的信息形态。 */
article.page-engine .eng-tag {
  display: inline-block;
  padding: 4px 10px;
  border: 1px solid var(--line);
  border-radius: 999px;
  font-size: var(--text-caption);
  line-height: var(--leading-snug);
  color: var(--ink);
  white-space: nowrap;
}

/* ── 5 · 数据管线：方向 C 的四格节点。C 原稿用深青做节点顶边，这里换成
   「顶边取消、序号用本站红」—— 四条彩色顶边在白底上太吵，红只留在序号。 */
article.page-engine .engine-architecture { max-width: var(--eng-col); margin-top: 48px; }
/* 四格管线：画成**真的管线** —— 一条贯通横线把四个节点串起来，节点用圆点骑线。
   原来给每格加一条顶线，等于把「一条管线」画成了「四条互不相干的横线」。 */
article.page-engine .eng-pipeline {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 28px;
  margin: 0 0 24px;
  position: relative;
  padding-top: 22px;
}
article.page-engine .eng-pipeline::before {
  content: "";
  position: absolute;
  top: 5px;
  left: 5px;
  right: 5px;
  height: 1px;
  background: var(--line);
}
article.page-engine .eng-node {
  position: relative;
  padding: 0;
  font-size: var(--text-body);
  line-height: var(--leading-snug);
  color: var(--ink);
}
article.page-engine .eng-node::before {
  content: "";
  position: absolute;
  top: -22px;
  left: 0;
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--bg);
  border: 2px solid var(--red);
}
article.page-engine .eng-node span {
  display: block;
  margin-bottom: 6px;
  color: var(--red);
  font-family: ui-monospace, "SF Mono", "Cascadia Mono", Consolas, monospace;
  font-size: var(--text-micro);
  letter-spacing: .16em;
  /* 不加 tabular-nums：本行已是 ui-monospace，等宽是它的定义，加了是同义反复 */
}
article.page-engine .engine-architecture p {
  max-width: var(--eng-measure);
  font-size: var(--text-caption);
  line-height: var(--leading-body);
  color: var(--muted);
  margin: 2px 0;
}
/* 三条并列保证。走到这一版之前试过两种都不成立，记下来省得再试：
     通栏三列 —— 每格文字只占格子四成，中间全是空白，读成「散落的三句话」；
     680 竖排 —— 空白只是从右侧挪到每行末尾，实测每行文字仅占块宽 23%-36%。
   这三条各约 200px，本来就该**并成一行**：三段加两个分隔正好填满这条版心，
   密度对了才像有人排过。分隔用红点，与页面其余红色（序号、语域短线）同源。
   窄屏 flex-wrap 自然折行，不需要额外断点。 */
article.page-engine .eng-guarantee {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 12px;
  font-size: var(--text-caption);
  line-height: var(--leading-body);
  color: var(--body);
}
article.page-engine .eng-guarantee li { display: flex; align-items: baseline; gap: 12px; }
article.page-engine .eng-guarantee li:not(:last-child)::after {
  content: "";
  width: 3px;
  height: 3px;
  border-radius: 50%;
  background: var(--red);
  flex: none;
  transform: translateY(-3px);
}
article.page-engine .eng-trace {
  margin: 10px 0 0;
  font-size: var(--text-caption);
  line-height: var(--leading-body);
  color: var(--muted);
}

/* 末句「这不是荐股，是研究。」是全页最锋利的一句 —— 原来和前两行一样是 13.5px
   灰色小字，等于把论点埋进注脚。提成本节的收束句：宋体、正文色、拉开距离。
   这是本页刻意「把胆量花在一处」的那一处，所以其余注记一律保持克制。 */
article.page-engine .engine-architecture p:last-child {
  margin: 28px 0 0;
  font-family: var(--font-display);
  font-size: var(--text-title);
  line-height: var(--leading-snug);
  color: var(--ink);
}

/* ── 6 · 十步：方向 C 的贯通竖轴，序号骑在轴上 ──────────────────────────────
   原 .engine-steps li 有 padding-left:56px，让十步正文比导语与 h1 右移 56px
   —— 那是第五条轴错位。改成整条 ol 内缩 32px 挂一条竖轴，序号骑轴、正文对齐轴。 */
/* 字重降档（用户裁决「买方机构派」）：全局 .home-method 是 900 —— 那是海报字重。
   实测同侪：GMO 的 90px H1 用 weight 100、Marginal Revolution 的 H1 只有 28px 常规字重，
   Jane Street 用 800 但配纯黑白零装饰。没有一家在「衬线 + 900」这个组合上。
   降到 550：宋体在 Windows 回退到 SimSun 时本就只有 regular/bold 两档，
   550 会落到 regular，反而比 900 更接近机构感。
   ★ 只改本页作用域 —— 全局 .home-method 另有 11 处消费者（首页 4 + 订阅页 7）。 */
article.page-engine .home-method { font-weight: var(--font-weight-medium); }
article.page-engine .engine-steps-sec .home-method {
  font-size: var(--text-h2);
  line-height: var(--leading-tight);
  margin: 0 0 24px;
}
/* 序号骑在竖轴上会与轴线打架 —— 眼睛要找的锚点正好被一条线穿过。改成表格：
   顶一条实线当表头线，每步一行、发丝线分隔，序号独占左槽。
   （调研实证：Linear 的方法论页与 Palantir 的能力表都是这个形状，
     不是竖轴+浮标；细线分隔比卡片与轴线都更「高级」。） */
article.page-engine .engine-steps {
  max-width: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--ink);
}
/* ★ 这里**不能**用 display:grid。li 的内容是
     `<strong>立案</strong>——输入一个股票代码…`
   —— `<strong>` 后面那段是**裸文本节点**，在 grid 容器里会变成一个
   **匿名 grid item**，被丢进下一行的 46px 窄列，正文当场塌成一字一行。
   （实测踩过：先以为是 column-count 的锅，撤掉分栏后照塌。）
   正解是老办法：li 留块级 + padding-left 让位，序号绝对定位。 */
article.page-engine .engine-steps li {
  position: relative;
  padding: 16px 0 16px 46px;
  border-bottom: 1px solid var(--line);
  font-size: var(--text-body);
  line-height: var(--leading-body);
  color: var(--body);
}
article.page-engine .engine-steps li:last-child { padding-bottom: 16px; }
article.page-engine .engine-steps li::before {
  content: counter(step, decimal-leading-zero);
  position: absolute;
  left: 0;
  top: 20px;
  font-family: ui-monospace, "SF Mono", "Cascadia Mono", Consolas, monospace;
  font-size: var(--text-caption);
  letter-spacing: .08em;
  color: var(--red);
  font-variant-numeric: tabular-nums;
}
/* ★ 不要写 display:block —— 原文是「<strong>立案</strong>——输入一个股票代码…」，
   把 strong 提成块之后，紧随其后的「——」就成了下一行的行首，中文排版里
   一行以破折号起头是明显的破相。保持行内，破折号仍连在步骤名后面。 */
article.page-engine .engine-steps li strong {
  font-size: var(--text-body);
  color: var(--ink);
  margin-right: 2px;
}

/* 【已否决】曾试过 ≥1200px 把十步分两栏来「填掉右侧空白」，实测不成立：
   本节版心 680px，两栏各 312px = 每行 22 字，远低于 35-45 下限；要让两栏成立
   就得把这一节放宽到 1200，那等于把「全页一条轴、一个宽度」重新破掉。
   （顺带记一个坑：多栏容器里 li 不能保持 display:grid —— 列宽与 `1fr` 互相
     解不出来，正文会塌成一字一行。） */

/* ── 7 · 决策之前：三组自问成三张同材质的卡 ────────────────────────────────
   用户 2026-08-05 裁决「这三块不一致」。原病灶两层：
     (a) ①②是裸 .home-list、③被 .acl-criterion 包成白卡（1px 边框 + 16px 圆角
         + 阴影 + 26/36/20 内距）—— 三块里唯一有外壳的；
     (b) 三个 h2 在 1200px 版心左缘、三份清单在 720px 居中轴，横向差 240px。
   处置：三块统一成卡（外层 .eng-ask-card），第三块的旧外壳就地中和 —— 不删类，
   因为 .acl-criterion 的规则还被 check_site_seo.py 的选择器在场闸要求存在。 */
/* 三组是**并列**关系（不是先后步骤），所以不给序号 —— 序号会谎报成流程。
   三个标题都以「每一次做投资决策前，」开头：单栏纵排时读成三次重复的噪音，
   并排时才读成排比。宽屏并排是「让重复变成结构」的唯一办法，且顺带吃掉
   右侧空白。窄屏回落纵排，靠留白分组。 */
article.page-engine .engine-before { display: grid; gap: 0; }
article.page-engine .eng-ask-card { padding: 40px 0 8px; }
article.page-engine .eng-ask-card:first-of-type { padding-top: 8px; }
article.page-engine .eng-fineprint { margin-top: 40px; }
article.page-engine .eng-fineprint .acl-criterion-def,
article.page-engine .eng-fineprint .acl-criterion-dyor {
  max-width: var(--eng-measure);
  margin: 0 0 8px;
  font-size: var(--text-caption);
  border-top: 0;
  padding-top: 0;
}
article.page-engine .eng-ask-card .home-method {
  /* ★ 必须 stretch 不能 start：subgrid 把三个组头放进同一条行轨后，start 会让
     一行的那组（第二组）贴着自己的文字收边，组头线就比另两组高 27px。
     stretch 让组头撑满行轨 —— 文字仍顶端起排，而 border-bottom 落在行轨底部，
     三条线自然对齐。实测 356/329/356 → 三条全齐。 */
  align-self: stretch;
  /* ★ 这里**不能**加 display:flex/column。组头的内容是
       `每一次做投资决策前，全方位判断<span class="accent">机会还是陷阱</span>。`
     —— span 前后各有一个裸文本节点，在竖排 flex 容器里它们会各自变成匿名 flex item，
     一句话当场被拆成三行：红词独占一行、句号孤零零掉在第三行。
     （批 E 曾为了配合 align-self:stretch 加过这三行，纯属多余：stretch 已经让组头
       撑满 subgrid 行轨，而块级元素的文字本来就从顶端起排、border-bottom 本来就落在
       盒底。同型事故见 .engine-steps li 那条匿名 grid item 注释。） */
  font-size: var(--text-lead);      /* 三个近乎一样的标题，越大越吵；降到与正文同级偏上 */
  line-height: var(--leading-snug);
  margin: 0 0 20px;
  padding-bottom: 14px;
  border-bottom: 2px solid var(--ink);   /* 每组一条组头线 —— 本块唯一的线 */
}
article.page-engine .eng-ask-card .home-list {
  max-width: none;
  margin: 0;
  font-size: var(--text-body);
}
/* ★ 条目**不要**发丝线：横线在本页只归十步流程（可枚举的长流程）。
   自问是并列问句，靠留白读；两块都用横线会糊成一块。
   （这几条曾在一次重写里被误删，导致全局 `.home-list li` 的 border-bottom
     透了上来，整块又变回横线墙。） */
article.page-engine .eng-ask-card .home-list li {
  padding: 0 0 18px;
  border-bottom: 0;
  line-height: var(--leading-body);
}
article.page-engine .eng-ask-card .home-list li:last-child { padding-bottom: 0; }
@media (min-width: 1200px) {
  /* 本块与 hero 是全页仅有的两处刻意通栏 —— 其余一律守 --eng-col 那条左缘 */
  article.page-engine > .engine-before {
    max-width: none;
    grid-template-columns: repeat(3, 1fr);
    gap: 48px 48px;
    align-items: start;
  }
  /* ★ 语域红线（::before）与「决 策 之 前」眉标**自己也是 grid item** ——
     不让它们通栏的话，它们会占掉第一行的前两格，把三张卡挤成
     「卡1 在第 3 格 / 卡2、卡3 掉到第二行」。实测踩过。 */
  article.page-engine > .engine-before::before,
  article.page-engine > .engine-before > .sec-label,
  article.page-engine > .engine-before > .eng-fineprint { grid-column: 1 / -1; }

  /* ★ 三个组头的**自然高度不一样**（第二组一行、第一三组两行），不处理的话三条
     组头线不在同一水平线上、三列正文起点各错开 —— 用户说的「排版不统一」就是这个。
     subgrid 让三张卡共用同一组行轨：组头占同一行、正文占同一行，线自然对齐。
     不支持 subgrid 的浏览器回落到各自然高度（只是不齐，不会错版）。 */
  article.page-engine > .engine-before { grid-template-rows: auto auto auto; }
  article.page-engine .eng-ask-card {
    display: grid;
    grid-template-rows: subgrid;
    grid-row: span 2;
    row-gap: 0;
  }
  article.page-engine .eng-ask-card { padding: 0; }
  article.page-engine .eng-ask-card:first-of-type { padding: 0; }
}

article.page-engine .acl-criterion {
  /* 外面那层 .eng-ask-card 已经是卡，这里再套一层就是双框 */
  max-width: none;
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  /* ★ 必须显式：本块外壳由 `wrap home-sec` 换成 `engine-before` 后，main.css:506 的
     `.home-sec .acl-criterion{text-align:left}` 不再命中，全局
     `.acl-criterion{text-align:center}` 会接管，六条自问会全部居中。别删。 */
  text-align: left;
}
article.page-engine .acl-criterion-def,
article.page-engine .acl-criterion-dyor {
  max-width: var(--eng-measure);
  margin: 14px 0 0;
  font-size: var(--text-caption);
}
article.page-engine .eng-ask-card .acl-criterion-dyor {
  border-top: 1px solid var(--line);
  padding-top: 12px;
}

/* ── 8 · 页末免责 ─────────────────────────────────────────────────────────── */
article.page-engine > .acl-criterion-dyor {
  max-width: var(--eng-measure);
  margin: 56px 0 0;
  font-size: var(--text-caption);
  border-top: 0;
  padding-top: 0;
}

/* ── 8b · hero 的断点比全站 900 早 ─────────────────────────────────────────
   两栏是 `minmax(0,1fr) 320px`：右栏定宽，左栏被压缩时**没有下限**。实测 1125px
   视口下左栏只剩 501px（29 字/行，低于 35-45 下限），488px 时直接塌成 56px —— 一栏
   40em 的导语挤成一柱。所以 hero 必须比全站 900 断点更早塌成单栏。 */
@media (max-width: 1200px) {
  article.page-engine > .eng-hero {
    grid-template-columns: 1fr;
    gap: 32px;
    align-items: start;
  }
  article.page-engine .eng-hero-main > .gh-content > p:last-child { margin-bottom: 24px; }
}

/* ── 9 · ≤900px ───────────────────────────────────────────────────────────
   ★ article.page-engine .home-method 是 (0,2,1)，恒胜全局 @media 里的 (0,1,0)，
     所以移动端字号必须在这里显式给全，漏一个就留一个桌面级孤儿标题。
   ★ 十步的序号在窄屏没有轴外空间，但竖轴内缩只有 32px，序号仍骑得住，不用改。 */
@media (max-width: 900px) {
  article.page-engine .page-head { padding: 48px 0 24px; }
  article.page-engine > .gh-content > p:first-child { font-size: var(--text-lead); margin-bottom: 24px; }
  article.page-engine > .engine-features,
  article.page-engine > .engine-architecture { margin-top: 48px; }
  article.page-engine > .engine-steps-sec,
  article.page-engine > .engine-before { margin-top: 72px; }
  article.page-engine .eng-pipeline { grid-template-columns: 1fr 1fr; }
  article.page-engine .engine-steps-sec .home-method { font-size: var(--text-title); }
  article.page-engine .eng-ask-card .home-method { font-size: var(--text-lead); }
  article.page-engine .eng-ask-card { padding: 32px 0 6px; }
}

/* ══════════════════════════════════════════════════════════════════════════
   批 3 · 首页重设计（spec 2026-08-08 §4 D2-D7/D17；plan Task 3-6）
   ──────────────────────────────────────────────────────────────────────────
   作用域 = body 类 .home-template 的后代。
   ★ 禁 `>` 子组合器接第一跳：.home-template 挂在 <body>，所有 section 隔着
     <main>（spec 轮审计，§10「.home-template 组合器→D2」：照抄批 E 的
     `article.page-engine >` 写法会得到一段零命中的死 CSS——批 E 的前提是
     容器元素与作用域类同体，首页不满足）。
   ★ 层叠契约：首页既有竞争规则 ≤(0,2,0)（.home-list li (0,1,1) /
     .home-research-item (0,1,0) / .home-sec .gh-content (0,2,0)…），本段一律
     两类名起步 (0,2,0)+，对打平项（.home-sec .gh-content）叠元素/类到更高——
     不靠源码序取胜；本段虽在文件末尾，位置只是整理习惯不是承重结构。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── D17 · 水印「等」中视口缩档（delta 审计 P1：901-1439 用公式档时与正文重叠
   260px（1024/1280 实算）而 1440 仅 100px；缩到 300px 收敛。措辞注意：本注释
   在 no-return-promises 闸的营销面扫描域内，「N 倍」字样连注释都不能写）。
   ≤900 沿用全站既有 200px 档（main.css 顶部 @media 块），不重复声明。 */
@media (min-width: 901px) and (max-width: 1439.98px) {
  .home-template .hero6 .watermark { font-size: 300px; top: 80px; }
}

/* ── D5 · 快速了解双轨定义表（P-1：悬挂缩进 + strong 绝对定位，engine-steps
   同款「老办法」——li 内部 grid 会让 strong 后的裸文本节点变匿名 item，
   main.css 有两起同型事故记录在案）。
   2026-08-10 用户裁决删冒号：分隔不再靠标点，靠**两条对齐线**——标签列 3em 分散
   对齐（text-align-last，「危　机　投　资」眉标同语汇；3em = 最长标签「投资观/
   价值观」），正文列 4.2em 悬挂（3em 轨 + 1.2em 沟槽）。em 随字号缩放，原 599.98
   断点的 72px 收窄覆盖随之删除（旧 88px 是 px 死值才需要手动收）。 */
.home-template .know-grid { max-width: 960px; }
.home-template .know-grid li {
  position: relative;
  padding: 18px 0 18px 4.2em;
  font-size: var(--text-lead);
  line-height: var(--leading-body);
}
.home-template .know-grid li strong {
  position: absolute;
  left: 0;
  top: 18px;
  width: 3em;
  text-align: justify;
  text-align-last: justify;
  color: var(--ink);
}

/* ── D4 · 路线图横轴（≥1280；<1280 现有竖轴一行不动）。
   eng-pipeline 的「圆点骑线」语言移植：既有 .road-axis::before 竖线转横轨，
   .road-node::before 圆点上移骑线。列底参差（Node05 长文 ≈6 行 vs 其余 3-4 行）
   是**报刊分栏的刻意形态**——G6 按此预期走查，别当 bug 修。
   is-live 的正文加大（17px）只属竖轴叙事态；横轴态五列并轨 13px，live 的
   识别交给红点/红徽章（spec D4，列宽 ~218px 装不下 17px/1.9 的长句）。 */
@media (min-width: 1280px) {
  .home-template .road-axis {
    max-width: none;
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 0 28px;
    padding: 22px 0 0;
  }
  .home-template .road-axis::before {
    left: 5px;
    right: 5px;
    top: 5px;
    bottom: auto;
    width: auto;
    height: 1px;
  }
  .home-template .road-node { padding: 0; }
  .home-template .road-node::before { left: 0; top: -22px; }
  .home-template .road-title {
    font-size: var(--text-body);
    line-height: var(--leading-snug);
    margin: 0 0 8px;
  }
  /* 徽章换行独立成行：列宽内「标题+徽章」同行必挤 */
  .home-template .road-badge { display: block; margin: 6px 0 0 0; }
  .home-template .road-node.is-live .road-text {
    font-size: var(--text-caption);
    color: var(--body);
  }
}

/* ── D3 · 最新研究 rcard 通栏。自建列公式（≥1024 三列 / 以下单列）——
   不复用 .rcard-grid 的 auto-fill minmax(320px,1fr)：720-1231px 区间它只排得出
   2 列+孤卡（spec 审计 P0 实算），而首页恒为 3 张卡，定列数才是对的形状。 */
.home-template .home-rgrid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
  margin-top: 24px;
}
@media (min-width: 1024px) {
  .home-template .home-rgrid { grid-template-columns: repeat(3, 1fr); }
}
/* 中和裸行原样式（.home-research-item (0,1,0) 的 padding/border-top）——卡壳接管 */
.home-template .home-rgrid .home-research-item { padding: 0; border-top: 0; }
/* <a> 内的卡件用 span 载体，逐个立块（rcard 原型是 div/h3/time，这里 a 包全卡） */
.home-template .home-rgrid .rcard-bar,
.home-template .home-rgrid .rcard-in { display: block; }
.home-template .home-rgrid .rcard-top { display: flex; justify-content: space-between; align-items: baseline; }
.home-template .home-rgrid .rcard-tk { margin: 9px 0 0; }
.home-template .home-rgrid .rcard-title {
  margin: 7px 0 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  /* clamp 封 2 行 + min-height 垫 2 行：1 行标题的卡与 2 行卡内容面等高
     （代码轮 boundary P1，1280 实测 27px 参差）。2lh 精确到本元素行盒；
     calc 行是不认 lh 单位的旧浏览器回退（--leading-snug 无单位 1.55）。 */
  min-height: calc(var(--leading-snug) * 2em);
  min-height: 2lh;
}
/* 键盘焦点环：rcard 的 overflow:hidden 会裁掉浏览器默认外描边（spec 审计 P1），
   内嵌 2px 环是批 2 终端定下的 Primer 形状 */
.home-template .home-rgrid .rcard-link:focus-visible {
  outline: 2px solid var(--red);
  outline-offset: -2px;
}
/* D15 数字面：日期/市场标走 Plex（ticker 保留等宽栈——rcard 语言有意设计，P-9） */
.home-template .home-rgrid .rcard-date,
.home-template .home-rgrid .rcard-mkt {
  font-family: "IBM Plex Sans", -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
}

/* ── D7 · 实验室介绍首段 standfirst（批 E `p:first-child` 同款，零 DOM 改动）。
   作用域链前段是后代组合器；`>` 只出现在 .gh-content 与 p 之间（合法）。
   (0,4,1)（三类名 + :first-child 伪类 + p）压过 .home-sec .gh-content 一族的
   继承字号（代码轮订正：伪类计入 class 位，原记 (0,3,1) 漏计）。 */
.home-template .home-sec .gh-content > p:first-child {
  font-size: var(--text-title);
  line-height: 1.8;
  color: var(--ink);
}

/* ══════════════════════════════════════════════════════════════════════════
   四页水印补挂（2026-08-08 用户裁决「engine/cases/post/404 四页要补水印」）
   字：engine=智（智慧大脑） cases=踪（研究跟踪，锚=既有 .page-head relative 零新规则）
       post=析（投研分析）  404=寻（error.hbs 独立文档，样式内联在该文件）
   全站水印图谱至此十页：等/究/报/机/签/著/智/踪/析/寻。
   ══════════════════════════════════════════════════════════════════════════ */
/* post 水印锚：article.wrap 本体（research-hero 与 .page-head 两分支共用同一锚） */
.post-template article.wrap { position: relative; }
