/* =========================================================
   BSIGHTS Design System V2
   Subject: 决策研究平台 — 账本/研究笔记式的编辑气质
   Palette: 纸白 / 墨黑 / 单一克制靛蓝 / 低饱和机会-风险色
   Type: 衬线标题 + 无衬线正文 + 等宽数字
   Layout: 横线分隔的账本式布局，不用卡片阴影套壳
   ---------------------------------------------------------
   ⚠ 字体策略（2026-09-24 落地时改）：原稿用 Google Fonts 的 @import，
   国内网络加载不到会让首屏白字/抖动，且引入外链依赖 →
   改为**系统字体栈**（原字体名仍排在最前：装了就用，没装自动回退）。
   ========================================================= */
/* 自托管字体（2026-09-24）：设计稿从 Google Fonts 取这三款，国内加载会失败 →
   改为本地 woff2（latin 子集 8 个文件 ≈ 175KB，**零外链**，与设计稿字形一致）。
   中文仍用系统衬线回退：Noto Serif SC / 思源宋体全量数 MB、分片会产生上百个请求，
   「英文 Web 字体 + 中文系统字体」是中文站点的通行做法（英文与数字完全一致，中文为系统衬线）。 */
@font-face{font-family:'Newsreader';font-style:normal;font-weight:400;font-display:swap;src:url('assets/fonts/newsreader-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:500;font-display:swap;src:url('assets/fonts/newsreader-latin-500-normal.woff2') format('woff2')}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:600;font-display:swap;src:url('assets/fonts/newsreader-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url('assets/fonts/ibm-plex-sans-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url('assets/fonts/ibm-plex-sans-latin-500-normal.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url('assets/fonts/ibm-plex-sans-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:700;font-display:swap;src:url('assets/fonts/ibm-plex-sans-latin-700-normal.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url('assets/fonts/ibm-plex-mono-latin-500-normal.woff2') format('woff2')}

/* 中文衬线 —— 原型的 `Noto Serif SC`，**自托管子集**（GB2312 全字表 + 站内真实用字，
   共 6936 字；由 fonttools 子集化为 woff2，两个字重各约 1MB）。
   ⚠ 为什么必须自托管而不是写成系统字体：中文系统宋体（SimSun）与思源宋体 **字形差异明显**
   （点阵感 vs 现代宋体，小字号尤其明显）—— 用户 2026-09-24 两次指出"字体还是不对"，
   起因就是我只自托管了英文、中文回退到了系统宋体。 */
@font-face{font-family:'Noto Serif SC';font-style:normal;font-weight:400;font-display:swap;src:url('assets/fonts/noto-serif-sc-sc-regular.woff2') format('woff2')}
@font-face{font-family:'Noto Serif SC';font-style:normal;font-weight:500;font-display:swap;src:url('assets/fonts/noto-serif-sc-sc-medium.woff2') format('woff2')}

:root{
  /* 字体栈**严格对齐原型**（原稿：`h1,h2,h3{font-family:'Newsreader',"Noto Serif SC",serif}`）。
     ⚠ 自托管的 Noto Serif SC **排在本地字体之前** —— 否则装了「思源宋体」的机器会命中本地版，
       不同机器字形不一致（虽然 Source Han Serif 与 Noto Serif 同源，但版本可能不同）。 */
  --serif:"Newsreader","Noto Serif SC","Source Han Serif SC","Songti SC","SimSun",Georgia,serif;
  --sans:"IBM Plex Sans",-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei","PingFang SC",Arial,sans-serif;
  --mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Consolas,"Courier New",monospace;

  --paper:#faf9f5;
  --paper-2:#f2f0e9;
  --ink:#181611;
  --ink-2:#4a4640;
  --mute:#8a8477;
  --rule:#ddd8c8;
  --rule-strong:#c7c1ae;
  --accent:#2b3a55;
  --accent-2:#e9ecf2;
  --up:#3c6b4f;
  --up-2:#e8efe9;
  --down:#8f3f34;
    /* ⚠ 2026-09-28 补：从原型 02.html 植入（页 6 的 .src-flag 需要「中度警示」）。
       此前结论「生产 0 页引用故不补」已失效 —— src-flag 现引用 --warn。 */
    --warn:#8a6a2e;
    --warn-2:#f5efdf;
  --down-2:#f3e9e6;
  --max:1180px;
}
*{box-sizing:border-box}
html{-webkit-font-smoothing:antialiased}
body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:15px;line-height:1.6}
a{text-decoration:none;color:inherit}
.container{width:min(var(--max),calc(100% - 56px));margin:auto}
h1,h2,h3{font-family:var(--serif);font-weight:500;color:var(--ink);margin:0}

/* ============ 顶部导航 ============ */
header{border-bottom:1px solid var(--ink);background:var(--paper)}
.nav{min-height:74px;display:flex;align-items:center;gap:40px;flex-wrap:wrap;padding:12px 0}
.brand{font-family:var(--serif);font-size:24px;font-weight:600;letter-spacing:-.3px;white-space:nowrap;display:flex;align-items:baseline;gap:10px}
.brand small{font-family:var(--sans);font-size:10.5px;color:var(--mute);font-weight:400;letter-spacing:.02em}
.links{display:flex;gap:30px;align-items:center}
.links a{font-size:13.5px;font-weight:500;color:var(--ink-2);padding:4px 0;border-bottom:2px solid transparent;white-space:nowrap}
.links a.active{color:var(--ink);border-bottom-color:var(--accent)}
.links a:hover{color:var(--ink)}
.search{margin-left:auto;width:280px;min-width:140px;height:36px;border-bottom:1px solid var(--rule-strong);display:flex;align-items:center;gap:8px;color:var(--mute);font-size:12.5px}
.search b{font-size:15px;font-weight:400}
.search input{border:0;background:none;outline:none;font:inherit;color:var(--ink);width:100%;padding:0}
.search input::placeholder{color:var(--mute)}
.login{border:1px solid var(--ink);background:none;color:var(--ink);padding:8px 16px;font-size:12.5px;font-weight:500;cursor:pointer;white-space:nowrap}
.login:hover{background:var(--ink);color:var(--paper)}
/* ⚠ 触控目标（2026-09-30）：汉堡按钮实测 **37x44** —— 高够了，宽差 7px。
   加 min-width 而不是加 padding：padding 会同时把高度推过 44（变成 48），
   而它的高度已经合规，只需补宽度。min-height 一并写死，防字体差异把它压回 44 以下。 */
.menu-btn{display:none;border:1px solid var(--ink);background:none;color:var(--ink);font-size:15px;line-height:1;padding:8px 11px;cursor:pointer;font-family:var(--sans);min-width:44px;min-height:44px}
.menu-btn:hover{background:var(--ink);color:var(--paper)}
@media(max-width:860px){
  .nav{gap:16px;padding:10px 0}
  .search{margin-left:auto;width:180px}
  /* 移动端导航（配合 site.js::bindMobileNav —— 它绑 `.menu-btn` 并切换 header.nav-open） */
  .menu-btn{display:block}
  .links{display:none;order:3;flex-direction:column;align-items:flex-start;gap:0;width:100%;padding-bottom:6px}
  .links a{padding:11px 0;width:100%;border-bottom:1px solid var(--rule)}
  header.nav-open .links{display:flex}
}

main{padding:0 0 60px}

/* ============ 页面标题区 ============ */
.page-header{padding:40px 0 28px;border-bottom:1px solid var(--ink);margin-bottom:32px}
.breadcrumb{font-size:12px;color:var(--mute);margin-bottom:14px}
.breadcrumb a{color:var(--accent);font-weight:500}
.page-header h1{font-size:32px;line-height:1.3;letter-spacing:-.3px;margin:0 0 12px}
.page-header .sub{font-size:14px;color:var(--ink-2);line-height:1.7;max-width:640px}

/* ============ 分区标题 ============ */
.section{margin-top:44px}
.section-title{display:flex;align-items:baseline;justify-content:space-between;gap:12px;border-bottom:1px solid var(--ink);padding-bottom:10px;margin-bottom:20px}
.section-title h2{font-size:20px}
.section-title .note{font-size:11.5px;color:var(--mute);font-family:var(--sans)}
.section-title .more{font-size:12px;color:var(--accent);font-weight:500}

/* ============ 筛选 ============ */
.filters{display:flex;gap:22px;flex-wrap:wrap;margin-bottom:26px;border-bottom:1px solid var(--rule);padding-bottom:14px}
.chip{background:none;border:0;padding:0;color:var(--mute);font-size:13px;font-weight:500;cursor:pointer;position:relative;font-family:var(--sans)}
.chip.active{color:var(--ink)}
.chip.active:after{content:"";position:absolute;left:0;right:0;bottom:-15px;height:2px;background:var(--ink)}

/* ============ 讯号标记(方向/置信/AI来源) ============ */
.dir{font-weight:600;font-size:13px}
.dir.up{color:var(--up)}
.dir.down{color:var(--down)}
.dir.flat{color:var(--mute)}
.mark{display:inline-block;font-size:11px;font-weight:500;color:var(--ink-2);padding:2px 0;border-bottom:1px solid var(--rule-strong)}
.mark-ai{color:var(--accent);border-bottom-color:var(--accent)}
.tag{font-size:11.5px;color:var(--ink-2)}
.tag-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-right:6px;vertical-align:middle}
.disclaimer{font-size:12px;color:var(--mute);line-height:1.75;padding:18px 0;border-top:1px solid var(--rule);margin-top:36px}

/* ============ 观察/洞察 —— 账本式行列表(替代卡片网格) ============ */
.obs-list{display:flex;flex-direction:column}
.obs-row{display:grid;grid-template-columns:1fr 200px;gap:28px;padding:26px 0;border-bottom:1px solid var(--rule)}
.obs-row:first-child{padding-top:0}
.obs-row .kicker{display:flex;gap:14px;align-items:center;margin-bottom:8px;font-size:11.5px;color:var(--mute);flex-wrap:wrap}
.obs-row h3{font-size:20px;line-height:1.4;margin:0 0 8px}
.obs-row p{font-size:13.5px;color:var(--ink-2);line-height:1.65;margin:0 0 10px;max-width:560px}
.obs-row .row-main{display:block}
.obs-row .co-line{font-size:12px;color:var(--ink-2)}
.obs-row .co-line a{color:var(--accent);font-weight:500}
.obs-row .co-line .star{color:var(--mute);margin-left:2px;cursor:pointer}
.obs-row .side{border-left:1px solid var(--rule);padding-left:24px;font-size:11.5px;color:var(--mute);display:flex;flex-direction:column;gap:6px}
@media(max-width:760px){.obs-row{grid-template-columns:1fr}.obs-row .side{border-left:0;padding-left:0;border-top:1px solid var(--rule);padding-top:10px;flex-direction:row;gap:16px}}

/* ============ 首页 Hero(排版驱动,不用装饰渐变) ============ */
.hero{padding:56px 0 44px;border-bottom:1px solid var(--ink)}
.hero .kicker{font-size:12px;color:var(--mute);margin-bottom:16px;letter-spacing:.01em}
.hero h1{font-size:46px;line-height:1.18;letter-spacing:-.8px;max-width:820px;margin-bottom:22px}
.hero p{font-size:15px;line-height:1.8;color:var(--ink-2);max-width:640px;margin-bottom:24px}
.hero-foot{display:flex;align-items:center;gap:22px;flex-wrap:wrap}
.hero-link{font-size:13.5px;font-weight:600;color:var(--ink);border-bottom:2px solid var(--ink);padding-bottom:2px}
@media(max-width:760px){.hero{padding:34px 0 28px}.hero h1{font-size:30px;letter-spacing:-.4px}}

/* ============ 今日焦点 / 侧边列表 ============ */
.side-list{display:flex;flex-direction:column}
.side-item{display:block;padding:16px 0;border-top:1px solid var(--rule)}
.side-item:first-child{border-top:0;padding-top:0}
.side-item .t{font-size:14px;font-weight:600;line-height:1.5;margin-bottom:4px}
.side-item .s{font-size:12px;color:var(--mute);line-height:1.5}
.side-item:hover .t{color:var(--accent)}

/* ============ 两栏区块 ============ */
.two-col{display:grid;grid-template-columns:1.15fr .85fr;gap:56px}
@media(max-width:900px){.two-col{grid-template-columns:1fr;gap:32px}}
.rank-list{display:flex;flex-direction:column}
.rank-row{display:grid;grid-template-columns:32px 1fr auto;gap:14px;align-items:baseline;padding:14px 0;border-top:1px solid var(--rule)}
.rank-row:first-child{border-top:0;padding-top:0}
.rank-row .n{font-family:var(--mono);font-size:12px;color:var(--mute)}
.rank-row h3{font-size:14px;font-weight:600;margin:0 0 3px;font-family:var(--sans)}
.rank-row p{font-size:11.5px;color:var(--mute);margin:0}
.rank-row time{font-size:11px;color:var(--mute);white-space:nowrap}
.rank-row:hover h3{color:var(--accent)}

/* ============ 综合评级(公司页扫描层核心) ============ */
.rating-line{display:flex;align-items:center;gap:18px;flex-wrap:wrap;padding:20px 0;border-top:1px solid var(--ink);border-bottom:1px solid var(--rule);margin:24px 0}
.rating-badge{font-size:14px;font-weight:600;padding:5px 0;border-bottom:2px solid currentColor}
.rating-watch{color:var(--up)}
.rating-neutral{color:#8a6a2e}
.rating-caution{color:var(--down)}
.rating-driver{font-size:13px;color:var(--ink-2)}
.rating-driver b{color:var(--ink);font-weight:600}

/* ============ 关键指标 ============ */
.metric-row{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);margin-bottom:26px}
.metric{padding:16px 22px 16px 0}
.metric+.metric{border-left:1px solid var(--rule);padding-left:22px}
.metric .k{font-size:11px;color:var(--mute);margin-bottom:6px}
.metric .v{font-family:var(--mono);font-size:19px;font-weight:500;color:var(--ink)}
@media(max-width:700px){.metric-row{grid-template-columns:repeat(2,1fr)}.metric:nth-child(2n+1){padding-left:0;border-left:0}}

/* ============ 折叠区块(理解层/专业层) ============ */
details.fold{border-top:1px solid var(--rule)}
details.fold:last-of-type{border-bottom:1px solid var(--rule)}
details.fold summary{padding:16px 0;cursor:pointer;font-size:13.5px;font-weight:600;color:var(--ink);list-style:none;display:flex;align-items:center;justify-content:space-between}
details.fold summary::-webkit-details-marker{display:none}
details.fold summary::after{content:"展开";font-size:11.5px;font-weight:500;color:var(--mute)}
details.fold[open] summary::after{content:"收起"}
details.fold .fold-body{padding:0 0 22px}

/* ============ 逻辑链 ============ */
.chain-flow{display:flex;flex-direction:column}
.chain-step{display:flex;align-items:baseline;gap:16px;padding:13px 0;border-top:1px solid var(--rule);font-size:14.5px}
.chain-step:first-child{border-top:0;padding-top:0}
.chain-step .idx{font-family:var(--mono);font-size:12px;color:var(--accent);flex:0 0 16px}

/* ============ 证据 ============ */
.evidence-list{display:flex;flex-direction:column}
.evidence-item{display:grid;grid-template-columns:120px 1fr;gap:18px;padding:14px 0;border-top:1px solid var(--rule)}
.evidence-item:first-child{border-top:0;padding-top:0}
.evidence-item .src{font-size:12px;color:var(--mute)}
.evidence-item .src .date{display:block;font-family:var(--mono);font-size:10.5px;margin-top:3px}
/* 来源序号（2026-09-26）：可被正文/讨论引用（"见来源 02"）。等宽字体 + 弱化色，
   让它像脚注编号而不像徽标 —— 序号只作定位，不带层级或强度暗示。 */
.evidence-item .src .ev-no{display:block;font-family:var(--mono);font-size:11px;
  color:var(--ink-2);letter-spacing:.04em;margin-bottom:2px}
.evidence-item .body{font-size:13.5px;color:var(--ink-2);line-height:1.55}
.evidence-item .body .title{color:var(--ink);font-weight:600;margin-bottom:2px}
@media(max-width:600px){.evidence-item{grid-template-columns:1fr;gap:6px}}

/* ============ 机会/防守两栏 ============ */
.strategy-cols{display:grid;grid-template-columns:1fr 1fr;gap:40px}
@media(max-width:760px){.strategy-cols{grid-template-columns:1fr;gap:0}}
.strategy-col{padding-top:14px;border-top:2px solid currentColor}
.strategy-col.opp{color:var(--up)}
.strategy-col.risk{color:var(--down)}
.strategy-col .lbl{font-size:12.5px;font-weight:600;margin-bottom:12px}
.strategy-col p{font-size:13.5px;color:var(--ink-2);line-height:1.7;margin:0 0 10px}

/* ============ 市场四维度 / kv列表 ============ */
.kv-list{display:grid;grid-template-columns:96px 1fr;gap:0;font-size:13.5px}
.kv-list .k{color:var(--mute);padding:12px 0;border-top:1px solid var(--rule)}
.kv-list .v{color:var(--ink-2);padding:12px 0;border-top:1px solid var(--rule);line-height:1.65}
.kv-list .k:first-of-type,.kv-list .v:first-of-type{border-top:0;padding-top:0}

/* ============ 表格(商业洞察/竞争对手/最新动态) ============ */
.mini-table{width:100%;border-collapse:collapse;font-size:13.5px}
.mini-table th{text-align:left;font-size:11px;color:var(--mute);font-weight:500;padding:8px 14px 8px 0;border-bottom:1px solid var(--ink)}
.mini-table td{padding:13px 14px 13px 0;border-bottom:1px solid var(--rule);color:var(--ink-2)}
.mini-table tr:last-child td{border-bottom:none}
.mini-table td:first-child{color:var(--ink)}

/* ============ 公司库列表 ============ */
.company-table{width:100%;border-collapse:collapse}
.company-row{display:grid;grid-template-columns:190px 1fr 110px 90px;gap:18px;align-items:center;padding:18px 0;border-top:1px solid var(--rule)}
.company-row:first-child{border-top:0;padding-top:0}
.company-row .nm{font-family:var(--serif);font-size:18px;font-weight:500}
.company-row .tk{font-family:var(--mono);font-size:11px;color:var(--mute);margin-top:2px}
.company-row .desc{font-size:12.5px;color:var(--ink-2);line-height:1.6}
.company-row .type{font-size:11.5px;color:var(--mute)}
.company-row:hover .nm{color:var(--accent)}
@media(max-width:760px){.company-row{grid-template-columns:1fr;gap:6px}}

/* ============ 研究问题 ============ */
.research-item{display:flex;gap:18px;align-items:flex-start;padding:18px 0;border-top:1px solid var(--rule)}
.research-item:first-child{border-top:0;padding-top:0}
.research-item .q{flex:1;font-size:14.5px;font-weight:500;line-height:1.55}
.research-item .rmeta{font-size:11.5px;color:var(--mute);margin-top:8px}
.research-item .status{font-size:11.5px;color:var(--ink-2);white-space:nowrap;padding-top:2px}

footer{border-top:1px solid var(--ink);padding:26px 0;color:var(--mute);font-size:11.5px}
.footer-inner{display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px}
.footer-brand{font-family:var(--serif);font-weight:600;color:var(--ink);font-size:14px}
.footer-links{display:flex;gap:20px;flex-wrap:wrap}
.footer-links a{color:var(--mute)}
.footer-links a:hover{color:var(--ink)}
.link-btn{color:var(--accent);font-weight:500;font-size:13px;cursor:pointer}

/* ============ 增补：分页 / 页头工具栏（原稿没有，列表页需要） ============ */
.pager{display:flex;gap:14px;align-items:center;margin-top:28px;padding-top:18px;border-top:1px solid var(--rule);font-size:12.5px;color:var(--mute)}
.pager a{color:var(--accent);font-weight:500}
/* ⚠ 「← 上一页」在首页时是 `a.off`（pointer-events:none）= **非活跃控件**，
   原来取 `--rule-strong`（#c7c1ae）在纸底上实测 **1.71** —— 用户几乎看不出
   那里有个分页控件。
   ⚠ WCAG 1.4.3 对「inactive user interface component」的文字**豁免**对比度要求，
     所以严格说不算违规；但"存在感"是另一回事：1.71 低到看不见，
     用户会以为**没有分页**而不是"这页是首页"。
   取 `--mute`（3.53）：比可用链接（--accent）淡，但能被看见并读出"上一页"。
   ⚠ 3.53 < 4.5，**没有达到 4.5** —— 见 commit 说明：`--mute` 本身即 3.53，
     要达 4.5 必须换成 --ink-2，而那会让禁用的分页比可用链接更深，语义倒置。 */
.pager a.off{color:var(--mute);pointer-events:none}
.pager .pnum{font-family:var(--mono)}
.count{font-size:11.5px;color:var(--mute);font-family:var(--mono)}
/* 列表内搜索（原型 view-co 的 `company-toolbar` / `company-search`，2026-09-29 落地）。
   ⚠ 原型的这两个类名在本文件里**原本不存在** —— 故本次是新增而非复用；
     视觉沿用 header `.search` 的语言（下划线，非描边框），颜色全取 V2 token。 */
.company-toolbar{display:flex;align-items:center;gap:14px;margin:0 0 16px}
.company-search{flex:1 1 auto;max-width:420px;height:34px;border:0;border-bottom:1px solid var(--rule-strong);background:none;outline:none;font-family:var(--sans);font-size:13px;color:var(--ink);padding:0}
.company-search::placeholder{color:var(--mute)}
.company-search:focus{border-bottom-color:var(--ink)}
.q-note{font-size:12.5px;color:var(--ink-2);margin-bottom:18px}
.q-note a{color:var(--accent);font-weight:500}

/* ============ 旧页内样式兼容（company-detail / article 等旧页的 :root 变量）============
   旧页形如 `:root{--bg;--paper;--ink;--muted;--line;--blue;--max}`，且 CSS 里用 var() 取色。
   本文件在旧 <style> **之后**加载 → 同名规则与同名变量以后者为准，故：
     · --paper / --ink / --max 与新体系同名 → 自动覆盖，无需处理；
     · 下面只补旧页**独有**的四个变量，让旧样式整体跟随新色板（背景纸白、线条 --rule、主色靛蓝）。
   ⚠ 刻意**不动** `--paper`：它在旧页里是"卡片白"，需与纸白背景区分出层次，改成背景色会让卡片消失。 */
:root{
  --bg:var(--paper);
  --muted:var(--ink-2);
  --line:var(--rule);
  --blue:var(--accent);
}

/* ============ 详情页：文章正文（覆盖旧 article.html 的页内样式；单栏 760px）============ */
.article-wrap{width:min(760px,calc(100% - 56px));margin:auto}
.crumbs{font-size:12px;color:var(--mute);padding:30px 0 14px}
.crumbs a{color:var(--accent);font-weight:500}
/* ⚠ 这里原先只有下面一条 `.crumbs span{color:var(--rule-strong)}`，
   它是**给分隔符「/」设计的**（所以带 margin:0 7px）—— 但面包屑的
   「当前项名」也是 <span>（`<span id="crumbName">赛道</span>`），
   于是一并继承了 #c7c1ae，实测对比度 **1.71**（像素法与计算法一致）。
   等于把当前位置写成了几乎看不见的浅色。
   现在拆成两条：分隔符保持浅色（它是装饰，不该抢注意力），
   当前项单独给可读色。
   ⚠ 用 `:last-child` 而不是 `#crumbName`：event-trend.html 的当前项
     **没有 id**（`<span>事件趋势</span>`），用 id 选不中它。
     面包屑的当前项恒为末元素，`:last-child` 是可靠判据且不用改各页 HTML。
   ⚠ 当前项用 `--mute`（#8a8477，3.53）而不是 `--ink-2`（#4a4640，8.89）：
     它与 .crumbs 容器的颜色一致，也与全站其它 meta 文本一致；
     用 --ink-2 会让面包屑比它的导航链接还深，视觉主次颠倒。
     代价是 3.53 < 4.5 —— 这是刻意与全站 meta 保持一致，不是遗漏。 */
.crumbs span{margin:0 7px;color:var(--rule-strong)}
.crumbs span:last-child{margin:0;color:var(--mute)}
.article-head{padding:0 0 22px;border-bottom:1px solid var(--ink)}
.article-head h1{font-family:var(--serif);font-size:36px;line-height:1.27;letter-spacing:-.8px;margin:0 0 14px}
.article-head .lead{font-size:15px;line-height:1.85;color:var(--ink-2);margin:0 0 16px;max-width:none}
.article-meta{display:flex;flex-wrap:wrap;gap:14px;align-items:center;font-size:12px;color:var(--mute)}
.article-meta .dot{width:3px;height:3px;border-radius:50%;background:var(--rule-strong)}
.article-meta .avatar{width:26px;height:26px;border-radius:50%;background:var(--paper-2);border:1px solid var(--rule)}
.article-meta b{color:var(--ink-2);font-weight:600}
.article-body{font-size:15px;line-height:1.9;color:var(--ink-2);padding-top:26px;min-width:0}
.article-body h2{font-family:var(--serif);font-size:23px;line-height:1.35;letter-spacing:-.3px;color:var(--ink);margin:34px 0 12px}
.article-body h3{font-size:16.5px;color:var(--ink);margin:24px 0 9px}
.article-body p{margin:0 0 16px}
.article-body .lead-art{font-family:var(--serif);font-size:18px;line-height:1.85;color:var(--ink);margin:0 0 26px}
.article-body .art-src{font-size:11.5px;color:var(--mute);margin:-10px 0 20px}
.article-body ul{margin:0 0 16px;padding-left:20px}
.article-body li{margin-bottom:5px;line-height:1.8}
.article-body blockquote{margin:26px 0;padding:6px 0 6px 20px;border-left:2px solid var(--accent);
  font-family:var(--serif);font-size:17.5px;line-height:1.7;color:var(--ink)}
.article-body .callout{border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:16px 0;margin:26px 0}
.article-body .callout b{display:block;font-size:12px;color:var(--accent);margin-bottom:8px}
.article-body .callout p{margin:0;font-size:13.5px;color:var(--ink-2);line-height:1.8}
.article-tags{display:flex;gap:14px;flex-wrap:wrap;margin:32px 0 0;padding-top:20px;border-top:1px solid var(--rule)}
.article-tags a{font-size:11.5px;color:var(--ink-2);border-bottom:1px solid var(--rule-strong)}
.share{display:flex;gap:18px;margin-top:20px;flex-wrap:wrap}
.share a{font-size:12.5px;color:var(--accent);font-weight:500;cursor:pointer;border-bottom:1px solid var(--rule-strong);padding-bottom:1px}
.share a:hover{color:var(--ink)}
.share-toast{position:fixed;left:50%;bottom:38px;transform:translateX(-50%);background:var(--ink);color:var(--paper);
  font-size:12.5px;padding:9px 16px;opacity:0;pointer-events:none;transition:opacity .2s;z-index:60}
.share-toast.on{opacity:1}
/* 核心结论（原侧栏「核心判断」移到正文之前 —— 它是内容本身，不是生产标注） */
.core-box{padding:22px 0;border-bottom:1px solid var(--rule)}
.core-box .core-label{font-size:11.5px;color:var(--mute);margin-bottom:9px}
.core-box p{font-family:var(--serif);font-size:17.5px;line-height:1.75;color:var(--ink);margin:0}
.skeleton{background:var(--paper-2);animation:sk 1.2s infinite}
@keyframes sk{0%,100%{opacity:1}50%{opacity:.55}}
/* 相关观察（沿用 renderRelated 的旧类名，这里给新式样） */
.related{margin-top:52px;padding-top:26px;border-top:1px solid var(--ink)}
.related h2,.related h3,.related h4{font-family:var(--serif);font-size:20px;margin:0 0 18px;color:var(--ink)}
.related .grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:28px}
@media(max-width:760px){.related .grid-3{grid-template-columns:1fr;gap:18px}}
.related .card{display:block;padding-top:14px;border-top:2px solid var(--ink)}
.related .card b,.related .card h3{font-family:var(--serif);font-size:16px;line-height:1.42;display:block;margin:0 0 8px;color:var(--ink)}
.related .card p{font-size:12.5px;color:var(--mute);line-height:1.6;margin:0}
.related .card .thumb,.related .card img{display:none}   /* 新体系不用封面缩略图（排版驱动） */

/* ============ 增补：状态与提示（原稿没有，页面需要） ============ */
.empty,.loading{font-size:13px;color:var(--mute);padding:28px 0;border-top:1px solid var(--rule)}
.empty{border-top:0}
.hint{font-size:11.5px;color:var(--mute);line-height:1.7}
.stale{color:var(--down);font-weight:500}
.badge{display:inline-block;font-size:11px;font-weight:500;padding:1px 7px;border:1px solid var(--rule-strong);color:var(--ink-2)}
.badge-ai{color:var(--accent);border-color:var(--accent)}
.badge-warn{color:var(--down);border-color:var(--down)}
.badge-mute{color:var(--mute)}
.dash{color:var(--mute)}


/* ============================================================
   对齐原型（2026-09-25）：来自 D:\\UI 简洁\\styles.css
   本地原缺 77 个类 / 138 条规则 —— 公司价值引擎(eng-*/tnode-*/dp-*/track-*/impact-*)、
   洞察模块树(im-m/im-d/im-tree)、定位块(position-block) 等新组件。
   ⚠ **未引入**原型的 fonts.googleapis.com @import：大陆不可达，字体已自托管
     （web-ui/assets/fonts/，见上一轮 subset_cjk_font.py）。
   ============================================================ */

.position-block {padding:26px 0;border-top:1px solid var(--ink);border-bottom:1px solid var(--rule);margin:24px 0}

.position-block .stance {font-size:19px;line-height:1.6;color:var(--ink);max-width:680px;margin-bottom:14px}

.position-block .stance b {font-weight:600;border-bottom:2px solid var(--accent)}

.position-block .rank-line {display:flex;gap:24px;flex-wrap:wrap;font-size:12.5px;color:var(--mute)}

.position-block .rank-line b {color:var(--ink-2);font-weight:600}

.position-block .driver {font-size:13.5px;color:var(--ink-2);line-height:1.75;margin-top:14px;padding-top:14px;border-top:1px dashed var(--rule);max-width:680px}

.position-block .driver b {color:var(--ink);font-weight:600}

.im-tree {margin:22px 0}

.im-m {border-top:1px solid var(--rule)}

.im-m:first-child {border-top:1px solid var(--ink)}

.im-m-head {display:grid;grid-template-columns:26px 130px 1fr 90px 70px 20px;gap:14px;align-items:center;padding:18px 0;cursor:pointer}

.im-m-head:hover {background:#f7f5ee}

.im-m-head .tri {font-size:11px;color:var(--mute);transition:transform .15s ease}

.im-m.open>.im-m-head .tri {transform:rotate(90deg)}

.im-m-head .mname {font-family:'Newsreader',serif;font-size:18px;font-weight:500}

.im-m-head .msub {font-size:12px;color:var(--mute)}

.im-m-head .mscore {font-family:'IBM Plex Mono',monospace;font-size:16px;text-align:right}

.im-m-head .mtrend {font-size:12px;text-align:right;font-weight:600}

.im-m-head .mtrend.up {color:var(--up)}

.im-m-head .mtrend.down {color:var(--down)}

.im-m-head .mtrend.flat {color:var(--mute)}

.im-m-body {display:none;padding:0 0 18px 40px}

.im-m.open>.im-m-body {display:block}

.im-d {border-top:1px solid var(--rule-strong)}

.im-d:first-child {border-top:0}

.im-d-head {display:grid;grid-template-columns:18px 1fr 70px 60px 16px;gap:12px;align-items:center;padding:12px 0;cursor:pointer;font-size:13.5px}

.im-d-head:hover {color:var(--accent)}

.im-d-head .tri {font-size:9px;color:var(--mute)}

.im-d.open>.im-d-head .tri {transform:rotate(90deg)}

.im-d-head .dname {font-weight:500}

.im-d-head .dcount {font-size:11px;color:var(--mute)}

.im-d-head .dscore {font-family:'IBM Plex Mono',monospace;text-align:right;color:var(--ink-2)}

.im-d-body {display:none;padding:4px 0 12px 26px}

.im-d.open>.im-d-body {display:block}

.factor-row {display:grid;grid-template-columns:1fr 60px 90px 90px;gap:12px;align-items:center;padding:9px 0;font-size:12.5px;border-top:1px dotted var(--rule)}

.factor-row:first-child {border-top:0}

.factor-row .fname {color:var(--ink-2)}

.factor-row .fdir {font-weight:700;text-align:center}

.factor-row .fdir.up {color:var(--up)}

.factor-row .fdir.down {color:var(--down)}

.factor-row .fdir.flat {color:var(--mute)}

.factor-row .fchange {color:var(--mute);font-size:11.5px}

.factor-row .fsrc {color:var(--accent);font-size:11px;cursor:pointer;text-align:right}

.factor-row .fsrc:hover {text-decoration:underline}

.factor-note {font-size:11.5px;color:var(--mute);line-height:1.6;padding:8px 0 8px 0;grid-column:1/-1;border-top:1px dashed var(--rule-strong);margin-top:2px;display:none}

.factor-row.expanded .factor-note {display:block}

.impact-item {padding:20px 0;border-top:1px solid var(--rule)}

.impact-item:first-child {padding-top:0;border-top:0}

.impact-item .isrc {font-size:11px;color:var(--mute);margin-bottom:6px}

.impact-item .isrc .badge-kind {color:var(--accent);font-weight:600}

.impact-item h4 {font-size:15px;font-weight:600;margin:0 0 10px;line-height:1.5}

.impact-path {display:flex;align-items:center;flex-wrap:wrap;gap:0;font-size:12px}

.impact-path .node {padding:5px 12px;border:1px solid var(--rule-strong);border-radius:3px;color:var(--ink-2);background:#fff}

.impact-path .node.hit {border-color:var(--accent);color:var(--accent);font-weight:600;background:var(--accent-2)}

.impact-path .arrow {padding:0 8px;color:var(--mute)}

.impact-item .idesc {font-size:12.5px;color:var(--mute);margin-top:10px;line-height:1.7}

.dual-track {margin:24px 0}

.track-row {display:grid;grid-template-columns:110px 1fr;gap:16px;align-items:center;padding:14px 0;border-top:1px solid var(--rule)}

.track-row:first-child {border-top:1px solid var(--ink)}

.track-lab {font-size:12.5px;font-weight:600;color:var(--ink-2)}

.track-lab .sm {display:block;font-size:10.5px;color:var(--mute);font-weight:400;margin-top:2px}

.track-line {position:relative;height:36px}

.track-base {position:absolute;left:0;right:0;top:17px;height:2px;background:var(--rule-strong)}

.track-dot {position:absolute;top:6px;width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:10px;font-weight:700;color:#fff;transform:translateX(-50%)}

.track-dot.up {background:var(--up)}

.track-dot.down {background:var(--down)}

.track-dot.flat {background:var(--mute)}

.track-scale {display:flex;justify-content:space-between;font-size:10px;color:var(--mute);margin-top:4px;padding-left:126px}

.evi-row {display:grid;grid-template-columns:90px 1fr 130px;gap:14px;padding:11px 0;border-top:1px solid var(--rule);font-size:12px}

.evi-row:first-child {border-top:0}

.evi-row .k {color:var(--mute)}

.evi-row .v {color:var(--ink-2)}

.evi-row .src {color:var(--accent);text-align:right}

/* 2026-09-25 code review 修正：原型是**独立页**结构（无站点头尾、内容固定一屏），
   故写 `overflow:hidden;height:100vh;display:flex`。本站页面有 header/footer、内容长度可变：
   该写法会让 body 固定一屏高、且 `.eng-shell{flex:1}` 在**非 flex 父级**下失效。
   （实测：滚动会落到 html 上，页面仍能滚、内容可达，但属隐患）→ 改回普通流式布局。 */
.eng-body {margin:0}

.eng-top {height:58px;flex:0 0 58px;border-bottom:1px solid var(--ink);display:flex;align-items:center;padding:0 22px;gap:20px;background:var(--paper)}

.eng-top .brand {font-family:'Newsreader',serif;font-size:17px;font-weight:600}

.eng-top .co {font-size:13px;color:var(--mute)}

.eng-top .co b {color:var(--ink);font-weight:600;font-family:'IBM Plex Mono',monospace}

.eng-top-actions {margin-left:auto;display:flex;gap:14px;font-size:12.5px}

.eng-shell {flex:1;display:flex;min-height:0}

.eng-side {width:340px;flex:0 0 340px;border-right:1px solid var(--ink);overflow-y:auto;background:#fbfaf6}

.eng-side-head {padding:16px 18px 10px;border-bottom:1px solid var(--rule)}

.eng-side-head .lab {font-size:10.5px;color:var(--mute);letter-spacing:.06em;text-transform:uppercase}

.eng-side-head .val {font-family:'IBM Plex Mono',monospace;font-size:22px;margin-top:4px}

.eng-side-head .sub {font-size:11.5px;color:var(--mute);margin-top:3px}

.tnode {}

.tnode-m {border-bottom:1px solid var(--rule)}

.tnode-m-row {display:flex;align-items:center;gap:8px;padding:13px 18px;cursor:pointer;font-size:13.5px}

.tnode-m-row:hover {background:#f0ede2}

.tnode-m-row .tri {font-size:9px;color:var(--mute);width:8px;transition:transform .12s}

.tnode-m.open>.tnode-m-row .tri {transform:rotate(90deg)}

.tnode-m-row .nm {font-weight:600;flex:1}

.tnode-m-row .sc {font-family:'IBM Plex Mono',monospace;color:var(--ink-2)}

.tnode-m-row .tr {font-size:11px;font-weight:700;width:34px;text-align:right}

.tnode-m-row .tr.up {color:var(--up)}

.tnode-m-row .tr.down {color:var(--down)}

.tnode-m-row .tr.flat {color:var(--mute)}

.tnode-d-list {display:none}

.tnode-m.open>.tnode-d-list {display:block}

.tnode-d-row {display:flex;align-items:center;gap:8px;padding:9px 18px 9px 34px;cursor:pointer;font-size:12.5px;color:var(--ink-2)}

.tnode-d-row:hover {background:#f0ede2;color:var(--ink)}

.tnode-d-row .tri {font-size:8px;color:var(--mute);width:8px}

.tnode-d.open>.tnode-d-row .tri {transform:rotate(90deg)}

.tnode-d-row .nm {flex:1}

.tnode-f-list {display:none}

.tnode-d.open>.tnode-f-list {display:block}

.tnode-f-row {display:flex;align-items:center;gap:8px;padding:7px 18px 7px 50px;cursor:pointer;font-size:12px;color:var(--mute)}

.tnode-f-row:hover {background:#eee9da;color:var(--ink)}

.tnode-f-row.selected {background:var(--accent);color:#fff}

.tnode-f-row .dot {width:5px;height:5px;border-radius:50%;flex:0 0 5px}

.tnode-f-row .dot.up {background:var(--up)}

.tnode-f-row .dot.down {background:var(--down)}

.tnode-f-row .dot.flat {background:var(--mute)}

.tnode-f-row.selected .dot {background:#fff}

.tnode-f-row .nm {flex:1}

.eng-main {flex:1;overflow-y:auto;padding:0}

.eng-main-inner {max-width:640px;margin:0 auto;padding:30px 34px 60px}

.pos-card {padding:0 0 24px;border-bottom:1px solid var(--ink);margin-bottom:26px}

.pos-card .stance {font-size:18px;line-height:1.65;margin-bottom:10px}

.pos-card .stance b {border-bottom:2px solid var(--accent)}

.pos-card .rank-line {display:flex;gap:20px;flex-wrap:wrap;font-size:12px;color:var(--mute)}

.pos-card .rank-line b {color:var(--ink-2)}

.detail-panel {display:none}

.detail-panel.active {display:block}

.dp-head {margin-bottom:18px;padding-bottom:14px;border-bottom:1px solid var(--rule)}

.dp-crumb {font-size:11px;color:var(--mute);margin-bottom:6px}

.dp-crumb b {color:var(--accent)}

.dp-title {font-family:'Newsreader',serif;font-size:22px;font-weight:500}

.dp-meta {display:flex;gap:16px;margin-top:8px;font-size:12px;color:var(--mute)}

.dp-chart {height:120px;border-bottom:1px solid var(--rule);margin-bottom:18px;position:relative}

.dp-chart svg {width:100%;height:100%}

.dp-row {display:grid;grid-template-columns:110px 1fr;gap:14px;padding:11px 0;border-top:1px solid var(--rule);font-size:13px}

.dp-row:first-child {border-top:0}

.dp-row .k {color:var(--mute)}

.dp-row .v {color:var(--ink-2)}

.dp-related {margin-top:6px}

.dp-related a {display:block;padding:10px 0;border-top:1px solid var(--rule);font-size:12.5px;color:var(--accent)}

.dp-related a:first-child {border-top:0}


/* ============ 桑基传导流量图（2026-09-27，引擎页） ============
   三列：事项类别 → 4M 维度 → 因子。手写 SVG，零外部依赖。
   ⚠ disabled 节点（流量低于阈值）灰化 + 标注「数据不足」，**不删除** ——
     把"该维度公开信息稀缺"如实呈现，而不是藏起来。 */
/* ⚠ 2026-09-30 加 position:relative —— 见下方 .sankey-hint-box 的绝对定位说明。 */
.sankey-wrap{margin:26px 0 0;border-top:1px solid var(--rule);padding-top:22px;position:relative}
.sankey-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:6px}
.sankey-head h3{font-size:15px;margin:0}
.sankey-reset{font-size:11.5px;color:var(--accent);cursor:pointer;display:none}
.sankey-reset.on{display:inline}
.sankey-hint{font-size:11.5px;color:var(--mute);margin:0 0 12px;line-height:1.75}
.sankey-svg{width:100%;height:auto;display:block}
.sankey-col-title{font-size:10.5px;fill:var(--mute);font-family:var(--mono,monospace);letter-spacing:.06em}
.sankey-label{font-size:12px;fill:var(--ink)}
.sankey-sub{font-size:10.5px;fill:var(--mute);font-family:var(--mono,monospace)}
.sankey-node{cursor:pointer;transition:opacity .15s}
.sankey-node.dimmed{opacity:.18}
.sankey-node.disabled{cursor:not-allowed}
.sankey-flow{transition:opacity .15s}
.sankey-flow.dimmed{opacity:.08}
.sankey-flow.hot{opacity:.85}
/* disabled 节点点击后的缺口说明（含建议补的源）。默认隐藏，点节点才显示。
   ⚠ 2026-09-30：改为 **position:absolute**（原先在文档流里）。原因是实测的连锁反应：
     显示它会把页面撑高 82px，浏览器的滚动锚定随即把滚动位置也下移 82px
     （实测 scrollY 1101→1183、bodyH 2101→2183）→ **同一视口坐标下的元素换人**。
     后果很具体：双击一个 disabled 因子节点时，第 1 次 click 命中该节点、
     第 2 次 click 与 dblclick 却落到相邻节点 → 打开**错误因子**的面板。
     绝对定位后它不再参与布局，撑高与滚动位移都消失。
     视觉上它停在 .sankey-wrap 底部：图底部本来有 56 viewBox 单位（≈73px 渲染高）空白，
     而提示盒高约 82px，故只会压住极小的空白边缘，不遮挡节点。 */
.sankey-hint-box{display:none;position:absolute;left:0;right:0;bottom:0;
  padding:10px 12px;border:1px solid var(--rule);background:var(--paper);
  border-left:3px solid #8a6a2e;font-size:12.5px;line-height:1.75;color:var(--ink-2)}
.sankey-hint-box.on{display:block}
.sankey-hint-box .sh-body{margin-top:4px;color:var(--mute)}


/* ===== 传导枢纽 flow 组件（2026-09-27 M2 纳入设计系统）=====
   来源：docs/页面原型01/02.html 的原型规格；布局改用 flex 以同时兼容 3 步与 4 步
   （原型 4 列 grid，transmission.html 原为 3 列 grid，两者同名类两套定义）。
   配色只用既有令牌（--ink / --rule-strong / --accent / --accent-2），未引入新色。 */
.transmission-flow{border:1px solid var(--ink);background:#fff;padding:22px;margin-bottom:24px}
.tf-title{font-size:10.5px;color:var(--mute);font-weight:600;margin-bottom:16px;letter-spacing:.08em;font-family:'IBM Plex Mono'}
.flow-grid{display:flex;align-items:stretch;gap:10px}
.flow-grid > .flow-node{flex:1}
.flow-grid > .flow-arr{flex:0 0 26px;display:grid;place-items:center;color:var(--mute);font-size:16px}
.flow-node{border:1px solid var(--rule-strong);padding:14px;background:var(--paper);transition:all .15s;cursor:pointer;display:block}
.flow-node:hover{border-color:var(--accent);background:var(--accent-2)}
.flow-node.hit{border-color:var(--accent);background:var(--accent-2)}
.flow-node .lbl{font-size:10px;color:var(--mute);font-family:'IBM Plex Mono';text-transform:uppercase}
.flow-node .val{font-size:13.5px;font-weight:600;margin-top:5px;color:var(--ink);line-height:1.4}
.flow-node .sm{font-size:11px;color:var(--mute);margin-top:5px;line-height:1.45}

/* ============ 用户菜单（登录态下拉，2026-09-28 M3 step2-A）============
   ⚠ 本组 `.auth-slot` / `.user-menu` 是**用户裁定允许新建**的例外：
   它们没有可复用的既有样式，属「确实不存在的浮层组件」，与 `.flow-*` 同类；
   而按钮本身仍复用 `.login`，未引入 `.auth-name`（「不新建类」的初衷是复用设计系统）。
   配色只用 V2 Token（--paper / --paper-2 / --rule-strong / --ink），无硬编码色值；
   定位为标准浮层：absolute + top:100% + right:0。 */
.auth-slot{position:relative;display:inline-flex;align-items:center;flex:0 0 auto}
.user-menu{position:absolute;top:100%;right:0;margin-top:6px;min-width:150px;z-index:40;
  background:var(--paper);border:1px solid var(--rule-strong);padding:6px 0;
  box-shadow:0 8px 24px rgba(24,22,17,.10)}
.user-menu[hidden]{display:none}
.user-menu a{display:block;padding:9px 16px;font-size:13px;color:var(--ink);white-space:nowrap}
.user-menu a:hover{background:var(--paper-2)}

/* ===== 页 6 来源区块（2026-09-28 M2 从 article.html 旧内联搬入设计系统）=====
   语义 Token 映射：区块背景 --paper-2 ｜ 引用正文 --ink-2 ｜ 辅助文字 --mute
                    框线 --rule ｜ 中度警示 --warn ｜ 链接 --accent
   分级（沿用原文案注释的意图）：未核原文 = --warn（中）｜预印本 = 中性 Token（轻，避免读成警告） */
.src-block{margin:34px 0 6px;padding:20px 22px;background:var(--paper-2)}
.src-block h4{font-size:13px;letter-spacing:.4px;color:var(--ink-2);margin:0 0 6px}
.src-block ul{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.src-block li{font-size:13px;line-height:1.6;color:var(--ink-2)}
.src-block .src-meta{display:block;font-size:11px;color:var(--mute);margin-bottom:2px}
.src-block a{color:var(--accent);text-decoration:none;border-bottom:1px solid var(--rule);word-break:break-word}
.src-block a:hover{color:var(--accent);border-bottom-color:var(--accent)}
.src-note{font-size:12px;color:var(--mute);margin:0 0 12px}
.src-meta{display:block;font-size:11px;color:var(--mute);margin-bottom:2px}
.src-flag{margin-left:8px;font-size:11px;color:var(--warn)}
.src-flag.src-preprint{margin-left:6px;padding:1px 6px;border:1px solid var(--rule);border-radius:3px;background:var(--paper-2);color:var(--mute)}
.src-preprint-note{font-size:12px;color:var(--mute);background:var(--paper-2);border-left:3px solid var(--rule);padding:8px 10px;border-radius:0 4px 4px 0;margin:0 0 12px}
.card-body{padding:16px}
.card .meta{display:flex;justify-content:space-between;margin-top:12px;font-size:10px;color:var(--mute)}

/* ===== 行业洞察 8 维（首版 2 维，2026-09-29 M6 轮3）=====
   新增类：dim-note / macro-grid / macro-cell / spark-* / tech-cols / freq-*
   均为新类（原文件不含），颜色全取 V2 token；曲线是行内 SVG ——
   现行 site.js 未提供图表工具（BS.charts 只存在于 _legacy），故在前端自绘。 */
.dim-note{font-size:11.5px;color:var(--mute);line-height:1.75;margin:-10px 0 18px;max-width:82ch}
.macro-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:0 24px;border-top:1px solid var(--rule)}
.macro-cell{padding:16px 0;border-bottom:1px solid var(--rule)}
.macro-cell .k{font-size:11.5px;color:var(--mute)}
.macro-cell .v{font-family:var(--serif);font-size:25px;line-height:1.1;margin:7px 0 3px}
.macro-cell .v .u{font-family:var(--sans);font-size:12px;color:var(--mute);margin-left:4px}
.macro-cell .m{font-size:11px;color:var(--mute);font-family:var(--mono)}
.spark-wrap{margin-top:22px}
.spark-head{display:flex;justify-content:space-between;align-items:baseline;font-size:11.5px;color:var(--mute);margin-bottom:8px}
.spark-head .lg-wrap{display:flex;gap:16px}
.spark-head .lg{display:flex;align-items:center;gap:6px}
.spark-head .dot{display:inline-block;width:14px;height:2px}
.spark-head .dot.c0{background:var(--accent)}
.spark-head .dot.c1{background:var(--ink-2)}
.spark-svg{width:100%;height:150px;display:block;border-bottom:1px solid var(--rule)}
.spark-line{fill:none;stroke-width:1.6;vector-effect:non-scaling-stroke}
.spark-line.c0{stroke:var(--accent)}
.spark-line.c1{stroke:var(--ink-2);stroke-dasharray:3 3}
.spark-foot{display:flex;justify-content:space-between;font-size:11px;color:var(--mute);font-family:var(--mono);margin-top:6px}
.tech-cols{display:grid;grid-template-columns:1.5fr 1fr;gap:44px;align-items:start}
.tech-freq{border-top:1px solid var(--rule);padding-top:14px}
.freq-head{font-size:11.5px;color:var(--mute);margin-bottom:12px}
.freq-row{display:flex;align-items:center;gap:10px;padding:5px 0;font-size:11.5px;font-family:var(--mono);color:var(--mute)}
.freq-row .mo{flex:0 0 58px}
.freq-row .bar{height:8px;background:var(--accent);opacity:.55;border-radius:1px}
.freq-row .n{flex:0 0 26px;text-align:right;color:var(--ink-2)}
@media(max-width:820px){.tech-cols{grid-template-columns:1fr;gap:28px}}

/* ===== 事件趋势（2026-09-29 M6 轮6）=====
   新增类：et-bars / et-list / et-row / et-chain-* / et-co-*
   刻意复用：spark-*（时间轴容器）、chain-flow/chain-step/.idx（传导链路）、
   .dir up/down/flat（方向色）、.badge/.badge-ai（审核态）、.empty/.dim-note。
   仅补布局类，颜色全部走 V2 token。 */
.et-bars rect{fill:var(--accent);opacity:.42;transition:opacity .12s}
.et-bars rect:hover{opacity:.85}
.et-bars rect.sel{opacity:1;fill:var(--ink)}
.et-list{display:flex;flex-direction:column}
.et-row{display:grid;grid-template-columns:1fr 96px 190px;gap:20px;align-items:center;
  padding:15px 0;border-top:1px solid var(--rule);cursor:pointer}
.et-row:first-child{border-top:0}
.et-row:hover{background:var(--paper-2)}
.et-row.active{background:var(--paper-2);box-shadow:inset 3px 0 0 var(--accent)}
.et-title{font-size:14.5px;line-height:1.5;color:var(--ink)}
.et-meta{font-size:11px;color:var(--mute);font-family:var(--mono);margin-top:4px}
.et-stat{text-align:right}
.et-stat b{font-family:var(--serif);font-size:21px;font-weight:500}
.et-stat span{font-size:11px;color:var(--mute);margin-left:3px}
.et-dir{font-size:11.5px;display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}
.et-chain-head{margin:-6px 0 16px}
.et-chain-title{font-family:var(--serif);font-size:17px;line-height:1.45;color:var(--ink)}
.et-chain-meta{font-size:11.5px;color:var(--mute);font-family:var(--mono);margin-top:5px}
.et-step{display:grid;grid-template-columns:16px 1fr 90px 86px;gap:14px;align-items:start;
  padding:14px 0;border-top:1px solid var(--rule);font-size:14.5px}
.et-step:first-child{border-top:0;padding-top:0}
.et-co-name{font-family:var(--serif);font-size:15.5px}
.et-co-why{font-size:11.5px;color:var(--mute);line-height:1.55;margin-top:3px}
.et-co-dir{text-align:right;font-size:12px}
.et-co-str{text-align:right;font-size:11px;color:var(--mute);font-family:var(--mono)}
@media(max-width:820px){.et-row{grid-template-columns:1fr 70px;gap:12px}
  .et-dir{grid-column:1/-1;justify-content:flex-start}
  .et-step{grid-template-columns:16px 1fr;gap:10px}
  .et-co-dir,.et-co-str{grid-column:2;text-align:left}}

/* ===== 登录 / 注册（2026-09-29 M6 轮8 V1→V2 迁移）=====
   来源：login.html / register.html 的内联 <style>（各约 5.1KB）。
   迁移要点：这两页原先**自带一套 :root 变量**（--bg/--ink/--blue…），
   直接搬进来会覆盖全站 token —— 故改为**全部映射到 V2 token**，
   只保留 auth 两栏布局这一结构性设计（登录页不做全站 nav）。
   新增类：minimal / back-link / auth-wrap / auth-brand / brand-mark / pitch /
   auth-features / quote / auth-form / auth-form-inner / eyebrow / field /
   auth-row / checkbox / btn-block / divider / socials / social-btn /
   social-hint / msg / auth-foot */
.minimal{height:64px;background:var(--paper);border-bottom:1px solid var(--ink);position:sticky;top:0;z-index:10}
.minimal .nav{height:100%;display:flex;align-items:center;justify-content:space-between;min-height:0;padding:0}
.back-link{font-size:13px;color:var(--mute);display:flex;align-items:center;gap:6px}
.back-link:hover{color:var(--ink)}
.auth-wrap{display:grid;grid-template-columns:1fr 1fr;min-height:calc(100vh - 64px)}
.auth-brand{background:linear-gradient(150deg,#33456b 0%,#22304a 55%,#161f30 100%);
  color:var(--paper);padding:64px;display:flex;flex-direction:column;justify-content:space-between;
  position:relative;overflow:hidden}
.auth-brand:after{content:"";position:absolute;right:-15%;top:12%;width:62%;height:62%;
  border-radius:45% 10% 45% 15%;background:linear-gradient(135deg,rgba(255,255,255,.10),rgba(140,160,190,.18));
  transform:skewX(-14deg) rotate(-9deg)}
.auth-brand:before{content:"";position:absolute;left:-20%;bottom:-25%;width:70%;height:70%;
  border-radius:50%;background:radial-gradient(circle,rgba(140,160,190,.18),transparent 70%)}
.brand-mark{position:relative;z-index:1;font-family:var(--serif);font-size:24px;font-weight:600;letter-spacing:-.3px}
.brand-mark small{display:block;font-family:var(--sans);font-size:10px;font-weight:400;
  color:rgba(250,249,245,.5);margin-top:7px;letter-spacing:.02em}
.auth-brand .pitch{position:relative;z-index:1}
.auth-brand h2{font-size:34px;line-height:1.28;letter-spacing:-.6px;margin:0 0 18px;color:var(--paper)}
.auth-brand p{font-size:14px;line-height:1.85;color:rgba(250,249,245,.7);max-width:400px;margin:0}
.auth-features{position:relative;z-index:1;display:flex;flex-direction:column;gap:14px;margin-top:36px}
.auth-features div{font-size:12px;color:rgba(250,249,245,.82);display:flex;align-items:center;gap:11px}
.auth-features i{width:6px;height:6px;border-radius:50%;background:rgba(250,249,245,.75);display:block;flex-shrink:0}
.auth-brand .quote{position:relative;z-index:1;font-size:11px;color:rgba(250,249,245,.45);letter-spacing:.02em}
.auth-form{background:var(--paper);padding:64px;display:flex;flex-direction:column;justify-content:center}
.auth-form-inner{max-width:390px;width:100%;margin:auto}
.auth-form .eyebrow{font-size:12px;color:var(--ink-2);font-weight:600;letter-spacing:.04em;margin-bottom:12px}
.auth-form h1{font-size:30px;letter-spacing:-.5px;margin:0 0 10px}
.auth-form .sub{font-size:13px;color:var(--mute);margin:0 0 30px;line-height:1.7}
.field{margin-bottom:18px}
.field label{display:block;font-size:12px;font-weight:600;color:var(--ink-2);margin-bottom:7px}
.field input{width:100%;height:46px;border:1px solid var(--rule-strong);border-radius:2px;padding:0 14px;
  font-size:14px;font-family:inherit;background:var(--paper);color:var(--ink);outline:none;transition:.15s}
.field input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-2)}
/* 密码可见切换（2026-09-30）。login 与 register 都用这套。
   ⚠ 两个刻意的取值：
      · `padding-right:76px` 是给按钮让位 —— 不让位的话长密码会被按钮压住；
      · 按钮 `height:44px` 是照用户 2026-09-30 定的触控线（主操作 44px），
        不是视觉拍脑袋。输入框 46px 高，44px 的按钮居中放得下。
   透明底 + 仅文字着色：视觉上它属于输入框内部，不是并列的第二个按钮。 */
.pw-wrap{position:relative}
.pw-wrap input{padding-right:76px}
.pw-toggle{position:absolute;right:6px;top:50%;transform:translateY(-50%);
  height:44px;min-width:64px;padding:0 10px;border:0;border-radius:2px;
  background:transparent;color:var(--accent);font-size:12px;font-weight:600;
  font-family:inherit;cursor:pointer;transition:.15s}
.pw-toggle:hover{background:var(--accent-2)}
.pw-toggle:active{background:var(--accent-2);opacity:.85}
.pw-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.auth-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;font-size:12px}
.checkbox{display:flex;align-items:center;gap:8px;color:var(--ink-2);cursor:pointer}
.checkbox input{width:15px;height:15px;accent-color:var(--accent)}
.auth-row a{color:var(--accent);font-weight:600}
.auth-row a:hover{text-decoration:underline}
.btn-block{width:100%;height:48px;background:var(--ink);color:var(--paper);border:0;border-radius:2px;
  font-size:14px;font-weight:600;cursor:pointer;transition:.15s;font-family:inherit}
.btn-block:hover{background:var(--ink-2)}
.btn-block[disabled]{opacity:.6;cursor:not-allowed}
.divider{display:flex;align-items:center;gap:14px;margin:26px 0;color:var(--mute);font-size:11px}
.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--rule)}
.socials{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.social-btn{height:48px;border:1px solid var(--rule);border-radius:2px;background:var(--paper);
  font-size:13px;color:var(--ink-2);font-weight:600;display:flex;align-items:center;
  justify-content:center;gap:7px;cursor:not-allowed;opacity:.55;font-family:inherit}
.social-btn svg{width:20px;height:20px;flex-shrink:0}
.social-hint{font-size:11px;color:var(--mute);margin-top:10px;line-height:1.6}
.msg{margin:0 0 16px;padding:10px 12px;border-radius:2px;font-size:13px;display:none}
.msg.err{display:block;background:var(--down-2);border:1px solid var(--down);color:var(--down)}
.msg.ok{display:block;background:var(--up-2);border:1px solid var(--up);color:var(--up)}
.auth-foot{text-align:center;font-size:12px;color:var(--mute);margin-top:28px}
.auth-foot a{color:var(--accent);font-weight:600}
.auth-foot a:hover{text-decoration:underline}
/* 注册页专有（2026-09-29 迁移时从 register.html 内联样式补入）：
   步骤条 / 两列表单 / 密码强度条 / 条款勾选 */
.steps-mini{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--mute);margin-bottom:22px}
.steps-mini b{color:var(--accent);font-weight:700}
.steps-mini i{flex:1;height:1px;background:var(--rule);display:block}
.field-row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.strength{margin-top:8px}
.strength-bar{display:flex;gap:5px}
.strength-bar i{flex:1;height:3px;background:var(--rule);border-radius:1px;transition:.15s}
.strength-bar i.on{background:var(--accent)}
.strength-label{font-size:11px;color:var(--mute);margin-top:6px}
.terms{display:flex;align-items:flex-start;gap:9px;font-size:12px;color:var(--ink-2);
  line-height:1.6;margin:4px 0 22px;cursor:pointer}
.terms input{width:15px;height:15px;accent-color:var(--accent);flex:0 0 auto;margin-top:1px}
.terms a{color:var(--accent);font-weight:600;border-bottom:1px solid var(--rule)}
.terms a:hover{border-bottom-color:var(--accent)}
@media(max-width:900px){.auth-wrap{grid-template-columns:1fr}.auth-brand{display:none}.auth-form{padding:40px 28px}}
@media(max-width:800px){.auth-wrap{min-height:calc(100vh - 58px)}.field-row{grid-template-columns:1fr}}

/* ===== 搜索页（2026-09-29 M6 轮8 V1→V2 迁移）=====
   来源：search.html 内联 <style>（约 5.3KB）。原页自带 :root（--line/--blue）→
   全部映射到 V2 token。⚠ `.filter`（单数）与 V2 已有的 `.filters`（容器）不冲突，
   故保留原类名，**不改页面 JS**（JS 里按 `.filter` 选择并绑定事件）。 */
.search-mini{margin-left:auto;display:flex;align-items:center;gap:7px;
  border:1px solid var(--rule);padding:8px 12px;font-size:12px;color:var(--mute);min-width:220px}
.eyebrow{font-size:12px;color:var(--ink-2);font-weight:600;letter-spacing:.04em;margin-bottom:10px}
.search-box{display:flex;gap:10px;margin-bottom:14px}
.search-box input{flex:1;height:50px;border:1px solid var(--rule-strong);padding:0 16px;
  font-size:15px;font-family:inherit;outline:none;background:var(--paper);color:var(--ink)}
.search-box input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-2)}
.search-box button{height:50px;padding:0 26px;background:var(--ink);color:var(--paper);
  border:0;font-size:14px;font-weight:600;cursor:pointer;font-family:inherit}
.search-box button:hover{background:var(--ink-2)}
.result-meta{font-size:12px;color:var(--mute);margin-bottom:14px}
.result-meta b{color:var(--ink)}
/* ⚠ 触控目标（2026-09-30）：原 `.filter` 实测只有 **35px 高**（padding 7+7 + 12px 行高），
   低于用户 2026-09-30 定的主操作 44px 线。改成 inline-flex 居中 + min-height，
   而不是加大 padding —— 加 padding 会让**视觉尺寸**跟着变（chip 看着变胖），
   而 min-height 只撑开可点区域，视觉上靠 align-items:center 保持文字居中不变。
   搜索结果标题链接同理：实测 277x42，差 2px；它虽是行内 <a>，但它是 h3 的
   全部内容、不是句子中的行内链接，因此不适用 WCAG 的行内例外。 */
.filter{padding:7px 14px;border:1px solid var(--rule-strong);font-size:12px;color:var(--ink-2);
  background:var(--paper);cursor:pointer;display:inline-flex;align-items:center;min-height:44px}
.filter i{font-style:normal;color:var(--mute);margin-left:5px}
.filter.active{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.filter.active i{color:rgba(250,249,245,.75)}
.layout{display:grid;grid-template-columns:minmax(0,1fr) 290px;gap:26px}
.results{display:flex;flex-direction:column;gap:12px}
/* 「加载更多」（2026-09-30）：搜索结果默认只渲染前 20 条。
   实测 48 条一次性渲染会让 DOM 达 2870 节点。
   ⚠ 按钮高 44px 是照用户 2026-09-30 定的主操作触控线，不是拍脑袋。 */
.more-wrap{display:flex;align-items:center;justify-content:center;gap:14px;
  padding:22px 0 6px;border-top:1px solid var(--rule);margin-top:6px}
.more-btn{height:44px;padding:0 26px;background:var(--paper);color:var(--ink);
  border:1px solid var(--rule-strong);font-size:13px;font-weight:600;
  font-family:inherit;cursor:pointer;transition:.15s}
.more-btn:hover{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.more-btn:active{transform:translateY(1px)}
.more-note{font-size:12px;color:var(--mute);font-family:var(--mono)}
.result-item{display:grid;grid-template-columns:132px 1fr;gap:16px;
  background:var(--paper);border:1px solid var(--rule);padding:16px}
.result-thumb{height:88px;overflow:hidden;position:relative;background:var(--accent)}
.result-thumb .cover-svg{display:block;width:100%;height:100%}
.result-thumb .cover{position:absolute;inset:0;overflow:hidden}
.result-type{font-size:11px;font-weight:600;color:var(--accent);margin-bottom:6px}
.result-item h3{font-size:17px;line-height:1.45;margin:0 0 7px}
/* 标题链接的可点区域撑到 44px（实测原先 277x42，差 2px）。
   用 inline-block + min-height 而不是 padding：padding 会把行高推高、
   影响 h3 与下方正文的间距；min-height 只在不足时补足。 */
.result-item h3 a{display:inline-block;min-height:44px}
.result-item h3 a:hover{color:var(--accent)}
.result-item h3 em{font-style:normal;background:var(--warn-2);padding:0 2px}
.result-item p{font-size:12.5px;line-height:1.75;color:var(--ink-2);margin:0 0 10px}
.result-item p em{font-style:normal;background:var(--warn-2);padding:0 2px}
.result-foot{display:flex;gap:7px;align-items:center;flex-wrap:wrap;font-size:10px}
.pill{border:1px solid var(--rule);background:var(--paper-2);padding:3px 9px;color:var(--ink-2)}
.result-foot time{color:var(--mute);margin-left:auto}
.side-card{background:var(--paper);border:1px solid var(--rule);padding:16px 18px;margin-bottom:14px}
.side-card h4{font-size:13px;margin:0 0 10px;color:var(--ink);font-family:var(--sans);font-weight:600}
.side-list a{display:flex;justify-content:space-between;gap:8px;padding:9px 0;
  border-top:1px solid var(--rule);font-size:12.5px;color:var(--ink-2);cursor:pointer}
.side-list a:first-child{border-top:0;padding-top:0}
.side-list a:hover{color:var(--accent)}
.side-list span{color:var(--mute)}
.tips{font-size:11.5px;color:var(--mute);line-height:1.8;margin:0}
@media(max-width:1050px){.layout{grid-template-columns:1fr}.search-mini{display:none}}
@media(max-width:800px){.result-item{grid-template-columns:1fr}.result-thumb{display:none}
  .search-box{flex-direction:column}.search-box button{height:46px}}

/* ===== 关于我们（2026-09-29 M6 轮8 V1→V2 迁移）=====
   来源：about.html 内联 <style>（约 6.9KB，7 页中最大）。原页自带 :root → 全部映射 V2 token。
   ⚠ `.section-title` 原页是「左侧 5px 竖条」，V2 是「下划线」→ **保留 V2 风格**（未覆盖）。 */
.about-hero{background:var(--paper);border:1px solid var(--rule);padding:38px 40px}
.lead{font-size:15px;line-height:1.9;color:var(--ink-2);margin:0;max-width:800px}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-top:28px;
  padding-top:24px;border-top:1px solid var(--rule)}
.stat b{display:block;font-family:var(--serif);font-size:26px;color:var(--accent);letter-spacing:-.5px}
.stat span{font-size:12px;color:var(--mute);line-height:1.6;display:block;margin-top:5px}
.what-grid,.contact-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.what-card,.contact-card{background:var(--paper);border:1px solid var(--rule);padding:20px 22px}
.what-card h3{font-size:15px;margin:0 0 9px;font-family:var(--sans);font-weight:600}
.what-card p{font-size:13px;color:var(--ink-2);margin:0 0 12px;line-height:1.8}
.what-card ul{margin:0;padding-left:18px}
.what-card li{font-size:12.5px;color:var(--mute);line-height:1.9}
.method{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);gap:26px;
  background:var(--paper);border:1px solid var(--rule);padding:26px 28px}
.method h3{font-size:19px;margin:0 0 12px;line-height:1.5}
.method p{font-size:13.5px;color:var(--ink-2);line-height:1.9;margin:0 0 12px}
.method p strong{color:var(--ink)}
.steps{display:grid;gap:12px}
.step{display:grid;grid-template-columns:40px 1fr;gap:12px;border-top:1px solid var(--rule);padding-top:12px}
.step:first-child{border-top:0;padding-top:0}
/* ⚠ `--rule-strong`（#c7c1ae）在纸底上实测 **1.66**，比 --mute 的 3.53 更差。
   这个色是给**分隔线/边框**用的，被这里当文字色用在「01 / 02 / 03」序列编号上。
   1.66 意味着编号几乎看不见 —— 而它承担的是"这三步是有顺序的"这一信息，
   看不见就等于丢了这个语义。
   改成 `--mute`（3.53）：与全站辅助文字一致，可见但仍是次要层级。
   ⚠ 3.53 < 4.5 —— 与 --mute 的其余 211 处一致，属"等设计确认后统一决定"的范围
     （2026-09-30 裁定：单独记录 --mute，不在本轮改）。这里不单独拔高到 --ink-2，
     否则「01」会比它右边的标题「信息采集」层级更高，语义倒置。
   ⚠ 只被 about.html 用（已 grep 确认 3 处），改动面可控。 */
.step-num{font-family:var(--serif);font-size:19px;color:var(--mute);font-weight:600}
.step h4{margin:0 0 5px;font-size:14px;font-family:var(--sans);font-weight:600}
.step p{margin:0;font-size:12.5px;color:var(--ink-2);line-height:1.8}
.principles{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.principle{background:var(--paper);border:1px solid var(--rule);padding:18px 20px;
  position:relative;overflow:hidden}
.principle .bar{position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent)}
.principle b{display:block;font-size:14px;margin-bottom:7px}
.principle p{font-size:12.5px;color:var(--ink-2);margin:0;line-height:1.8}
.cta{display:flex;justify-content:space-between;align-items:center;gap:20px;
  background:linear-gradient(120deg,#2b3a55,#1b2638);color:var(--paper);
  padding:28px 32px;margin-top:34px;flex-wrap:wrap}
.cta h3{margin:0 0 7px;font-size:20px;color:var(--paper)}
.cta p{margin:0;font-size:13px;color:rgba(250,249,245,.72)}
.cta-actions{display:flex;gap:10px;flex-wrap:wrap}
.btn-light{background:var(--paper);color:var(--accent);padding:11px 20px;font-size:13px;font-weight:600}
.btn-outline{border:1px solid rgba(250,249,245,.5);color:var(--paper);padding:11px 20px;
  font-size:13px;font-weight:600}
.btn-outline:hover{border-color:var(--paper)}
.contact-card b{display:block;font-size:14px;margin-bottom:7px}
.contact-card p{font-size:12.5px;color:var(--ink-2);margin:0 0 10px;line-height:1.8}
.contact-card a{color:var(--accent);font-size:12.5px;font-weight:600;word-break:break-all}
.qr-card{display:flex;gap:16px;align-items:center;background:var(--paper);
  border:1px solid var(--rule);padding:20px 22px;margin-top:14px}
.qr{width:132px;height:132px;flex:0 0 auto;border:1px solid var(--rule);background:#fff}
.qr-card p{margin:0 0 6px;font-size:13.5px}
.qr-card span{font-size:12.5px;color:var(--mute)}
@media(max-width:1050px){.stats,.principles{grid-template-columns:repeat(2,1fr)}.method{grid-template-columns:1fr}}
@media(max-width:800px){.what-grid,.contact-grid{grid-template-columns:1fr}
  .about-hero{padding:26px 22px}.qr-card{flex-direction:column;align-items:flex-start}}

/* ===== 我的研究池（2026-09-29 M4）=====
   新增类：mr-row / mr-main / mr-name / mr-note / mr-act
   为什么必须新增：既有表格类（.mini-table / .company-row）都是**纯展示**布局，
   没有「一行内放操作按钮」的形态；沿用 event-trend 的先例 —— 只补布局类，
   颜色一律走 V2 token（--ink / --mute / --rule / --accent），不引入新色。
   .mr-note.empty 是「未写备注」的弱化态，不是占位文案（文案由 JS 给）。 */
.mr-row{display:grid;grid-template-columns:1fr auto;gap:20px;align-items:start;
  padding:16px 0;border-top:1px solid var(--rule)}
.mr-row:first-child{border-top:0}
.mr-main{min-width:0}
.mr-name{font-family:var(--serif);font-size:17px;color:var(--ink);text-decoration:none}
.mr-name:hover{border-bottom:1px solid var(--accent)}
.mr-main .tag{margin-left:10px}
.mr-note{font-size:12.5px;color:var(--ink-2);line-height:1.7;margin-top:6px;
  white-space:pre-wrap;word-break:break-word;max-width:70ch}
.mr-note.empty{color:var(--mute);font-style:normal}
.mr-act{display:flex;gap:8px;flex:0 0 auto}
.mr-act .btn-ghost{padding:5px 11px;font-size:12px}
@media(max-width:700px){.mr-row{grid-template-columns:1fr;gap:10px}.mr-act{justify-content:flex-start}}

/* ===== B6 · 点按目标达标（2026-09-30）=====
   判据（用户 2026-09-30 裁定 3，来源 WCAG 2.5.5 / 2.5.8 AA 例外条款）：
     · 主操作（按钮 / chip / 输入框 / 导航控件）→ **44 × 44 px**
     · 辅助导航（页脚 / 次要文字链接）        → **32 × 32 px**
   ⚠ **为什么整块追加在文件末尾**：同特异性下**后写的赢**。原定义分散在前面 1000 行里，
     且部分被页内 <style> 覆盖；集中追加可以一次看清全部改动、便于回滚，
     也避免逐个改原定义时碰坏周边声明。**不是"重复定义"，是有意的覆盖层级。**
   ⚠ 只动 min-height / padding / display，**不动 font-size** —— 用户要求保持视觉不变。
   ⚠ `min-height` 对 `display:inline` 元素**无效** → 行内链接必须同时给 `inline-flex`，
     否则声明写了但不生效（这类"写了没生效"本项目已出现过多次）。
   ⚠ `input[type=checkbox]` **不设 44px** —— 那会把它变成巨大方块，是改坏不是改好。
     正确做法：扩大**它所在 label** 的命中区（视觉尺寸不变，可点区域变大）↓ */

/* ---- 主操作 → 44px ---- */
/* ⚠ **本规则绝不能写 `display`**（2026-09-30 修，B1 现状实测发现）：
   `.menu-btn` 的显示是**媒体查询控制的** —— L82 `.menu-btn{display:none}`（桌面默认隐藏）、
   L88 在 `@media(max-width:860px)` 里 `.menu-btn{display:block}`（窄屏才出现）。
   首版写了 `display:inline-flex` 且本块在文件末尾（后写的赢）→
   **把桌面的 `display:none` 覆盖掉，1440px 下多出一个无意义的 ☰ 按钮**。
   ⚠ 该回归 B6 的回归脚本**没抓到** —— 它只查 JS 错误 / 横向溢出 / 元素被裁切 /
   关键元素可见，**没查"不该显示的元素是否显示了"**。教训见待办 §5.19-H。
   只留 `min-height`：它对 `display:block` 的 `<button>` 有效，且按钮内容默认居中。 */
.menu-btn{min-height:44px}
.login{min-height:44px;display:inline-flex;align-items:center}
/* 头部搜索框：原来是 height:36px，改 min-height 以免窄屏下被压扁。
   ⚠ `input` 本身也要 44px —— 用户裁定「主操作含输入框」。
     只把外层 .search 撑到 44px 不够：点在 input 之外的容器区域**不会聚焦**，
     实际可点区仍是 input 自己那 32px（首版就这么漏过去了）。 */
.search{height:auto;min-height:44px}
.search input{min-height:44px}
/* ⚠ `search.html` 自己的搜索框用的是 `.search-box`（不是头部的 `.search`）——
   两套容器各写一条，别只改一处（首版漏了这个，该页 input 仍 319x21）。 */
.search-box input{min-height:44px}
/* chip 是纯文字按钮（原 padding:0）→ 用垂直 padding 补到 44px */
.chip{padding:13px 0}
/* ⚠ **必须同时改下划线偏移** —— 撑高 chip 的连带后果，实测踩到：
   下划线是 `position:absolute;bottom:-15px`，相对 **chip 自己的盒底** 定位。
   chip 加上 13px 底部 padding 后盒底随之下移，而 `.filters{padding-bottom:14px}`
   没变 → 实测下划线落到 `.filters` 底边框**下方 14px**（回归脚本量出 偏差=14）。
   改 -1px 使其重新贴回边框（chip 盒底本身已在内容底之下 13px，
   距 14px 的 padding 只差 1px）。改完必须复测，不能只看数值推算。 */
.chip.active:after{bottom:-1px}
.btn,.btn-ghost,.btn-primary{min-height:44px;display:inline-flex;
  align-items:center;justify-content:center}
.company-search{min-height:44px}

/* ---- 辅助导航 → 32px ---- */
.footer-links a{min-height:32px;display:inline-flex;align-items:center}
.crumbs a,.breadcrumb a{min-height:32px;display:inline-flex;align-items:center}
.back-link,.pager a,.section-title .more,.hero-link{
  min-height:32px;display:inline-flex;align-items:center}
/* ⚠ 备案号链接在 `.footer-beian`，**不在 `.footer-links`** ——
   首版只写了 .footer-links，21 页的备案链接一个都没覆盖到（实测 134x15）。
   这就是"选择器写对了但不适用"的典型：同一个页脚里两种容器。 */
.footer-beian a{min-height:32px;display:inline-flex;align-items:center}
/* 行内文字链接：`.auth-row`（忘记密码？）/ `.terms`（使用条款）。
   ⚠ 这类链接本可套 WCAG 2.5.8 的行内例外条款，但用户 2026-09-30 裁定
     「次要文字链接 → 32px」把它们一并纳入，故按裁定执行。
     用 inline-flex 保持行内级（不破坏整行排版）。 */
.auth-row a,.terms a{min-height:32px;display:inline-flex;align-items:center}
/* 登录/注册页底部的互跳链接（`.auth-foot`：立即注册 / 立即登录 / 返回首页） */
.auth-foot a{min-height:32px;display:inline-flex;align-items:center}
/* 列表型次要导航（`privacy` / `terms` / `404` 的「联系我们」在 <li> 里）——
   ⚠ 与"正文内联链接"要分开：这是**列表里的导航项**，不是句子里的链接。
   ⚠ 判据说明：WCAG 2.5.8 的例外条款只针对**行内（inline in a sentence）**文字链接；
     列表项、侧栏筛选这类**独立命中目标**不在豁免范围内，故必须达标。 */
.container li > a{min-height:32px;display:inline-flex;align-items:center}
/* search.html 侧栏「按类型筛选」—— 是导航控件，不是正文链接 */
.side-list a{min-height:32px;display:inline-flex;align-items:center}

/* ---- 表单：扩大命中区，但不放大控件本身 ---- */
/* 视觉上 checkbox 仍是 15px（.checkbox input / .terms input 的 width/height 不动），
   变大的只是**它所在的 label** —— 点文字也能勾选，触屏命中区达标。 */
.checkbox{min-height:44px;display:flex;align-items:center}
.terms{min-height:44px;padding:8px 0}

/* ===== 交互反馈：:active / :disabled（2026-09-30）=====
   审计实测（Playwright 遍历 document.styleSheets 统计伪类规则数）：
     :hover 29 条 ｜ :focus 3 条 ｜ **:active 0 条 ｜ :disabled 0 条**
   即：鼠标悬停有反馈，但**按下没有反馈、提交中禁用也没有视觉区别**。
   用户点「登录」后按钮只是文字变成"登录中…"，看不出自己被接受了；
   按下时也没有任何下沉感 —— 触屏上尤其明显（没有 hover 过渡，按了像没按）。

   用 V2 token，不引入新颜色、不加阴影（本项目是硬边风格，阴影会破风格）。

   ⚠ `transform:translateY(1px)` 而非 `scale()`：scale 会让文字在亚像素上重新
     采样，小字号下会发虚。1px 位移是"按下去了"的最小可感量。
   ⚠ 必须排除 `.pw-toggle` —— 它用 `translateY(-50%)` 做垂直居中，
     全局的 translateY(1px) 会把它从输入框中间推下去。下一段单独覆盖。 */
button:not(:disabled):active,
.btn-block:active,
.login:active,
.chip:active,
.filter:active,
.social-btn:active,
.pager a:active,
.page-btn:active {
  transform: translateY(1px);
}
.pw-toggle:active { transform: translateY(calc(-50% + 1px)); }

/* 禁用态：降透明度 + 明确禁止点击。
   ⚠ `pointer-events:none` 是必要的，不只是 `cursor`：本项目多处按钮用
     `addEventListener("click")` 而非表单提交，`disabled` 属性本身能挡住
     原生表单提交，但**挡不住已经绑上去的监听器**在父元素上冒泡触发。
     `pointer-events:none` 让元素根本不接收指针事件，这是唯一可靠的兜底。
   ⚠ 透明度取 .55 是下限 —— 再低文字与背景的对比度会掉到 3:1 以下，
     而禁用态的文字仍然需要可读（用户要看清"登录中…"）。 */
button:disabled,
.btn-block:disabled,
input[type=submit]:disabled {
  opacity: .55;
  cursor: not-allowed;
  pointer-events: none;
}
