/* ══════════════════════════════════════════════════════════════════
   V2 追加层 —— 两类改动：
   1. 覆盖 v1.css 已有组件的响应式行为（如 KPI 窄屏 2×2）
   2. V2 新增区块的样式（高优信号、赛道分布、历史归档等）
   v1.css 保持「从 V1 原样 vendored」不漂移；V2 增量在此单独可见。
   新类名政策（2026-10-16 放宽）：v1.css 确无对应组件时，本层**可以定义新类名**，
   但必须落在下面这条前缀白名单内 —— tests/test_board_render.py 会按此断言
   （v2 新增类名 ⊆ 白名单前缀），挡住"随手加个 .card2"这类词汇漂移。
   新类名前缀白名单：must- arch- sec- src- track- hero- hl- filter- read- leads- bar- sort- et- insight- ind tech ops- rumor- is- net-
   （ops- 于 2026-11-03 加入：M10 运营台统一二级子导航与状态快速过滤组件）
   （rumor- / is- 于 2026-11-04 加入：传闻生命周期进度条与 /landscape 按阶段分组。
     rumor- = 传闻专用组件（rumor-steps/rumor-step/rumor-group …）；
     is-     = 统一状态修饰，仅限 done/current/pending（步骤）与 early/following/confirmed/refuted（分组））
   （net- 于 2026-11-04 加入：/landscape「关系网络」视图——产业链厂商节点、
     关系连线、传导路径标注与分层/网络 Tab 切换（net-tabs/net-node/net-edge …））
   （ind / tech 于 2026-11-02 加入：产业 / 技术分面是**独立新维度**，
     以 `.tag.ind` / `.tag.tech` 修饰已有标签，不加连字符是为了让语义名
     直接等于维度名；且与 track 不混用 —— track 是细分类，industry 是它的聚合）
   ══════════════════════════════════════════════════════════════════ */

/* KPI 行窄屏改 2×2。
   原因：`.statrow.nN`（0,2,0）优先级高于 v1.css 响应式块里的 `.statrow`
   （0,1,0），所以 4 格 KPI 在窄屏仍按 4 列铺开 —— 390px 时每格 79px、
   副说明折成 3 行、卡片高 177px。V1 首页是 3 格、同样吃这条规则
   （390px 时 116px），只是没到难看的地步；V2 有 4 格，需要这一条。 */
@media (max-width:920px){
  .statrow.n3,
  .statrow.n4{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}

/* 长列表渲染加速：屏外行跳过布局绘制。
   筛选正确性不受影响（显隐仍由 v1.js 的 display 控制）；
   intrinsic-size 防止滚动条跳动。 */
.hl-row{ content-visibility:auto; contain-intrinsic-size:auto 130px; }

/* ── V2 新增强调色（与门户 accent 同色相暗一档，小字正文 ≥4.5:1）── */
:root{
  --accent: oklch(50% 0.18 255);
  --accent-soft: oklch(96% 0.04 255);
  --ok: oklch(52% 0.14 145);
  --warn: oklch(58% 0.15 65);
  --warn-ink: oklch(50% 0.15 65);
  --ok-soft: oklch(96% 0.03 145);
  --warn-soft: oklch(96% 0.04 65);
  --hover: oklch(96% 0.01 250);
  --sunken: oklch(98% 0.005 250);
  --line: oklch(92% 0.01 250);
  --line-strong: oklch(88% 0.015 250);
  --fg: oklch(22% 0.015 255);
  --fg-soft: oklch(42% 0.02 250);
  --muted: oklch(54% 0.012 250);
  --bg: oklch(100% 0 0);
  --surface: oklch(100% 0 0);

  /* ── 字号体系收敛：14 种 → 6 档（12 / 14 / 16 / 20 / 28 / 36）─────────
     v1.css 的令牌是 8 档（11.5 / 13 / 16 / 17 / 19 / 22 / 26 / clamp30-40），
     外加散落各处的裸 px（10 / 11 / 12 / 12.5 / 13.5 / 14 / 15.5 / 19 / 26），
     实测一页渲染出 14 种字号 —— 读者感觉不到"字号有体系"，只觉得排版毛糙。
     这里在追加层把令牌重指到 6 档，v1.css 保持 vendored 不动。
     h3 与 body 同档（16px）：层级靠字重（600 vs 400）与颜色区分，
     不再靠 1px 的字号差 —— 1px 的差别人眼读不出来，只会让体系膨胀。 */
  --fs-micro: 12px;
  --fs-meta: 14px;
  --fs-body: 16px;
  --fs-h3: 16px;
  --fs-h2: 20px;
  --fs-lead: 16px;
  --fs-stat: 28px;
  --fs-h1: clamp(28px, 3.2vw, 36px);
}
[data-theme="dark"]{
  --accent: oklch(70% 0.16 255);
  --accent-soft: oklch(30% 0.08 255);
  --ok: oklch(72% 0.14 145);
  --warn: oklch(78% 0.15 65);
  --ok-soft: oklch(30% 0.06 145);
  --warn-soft: oklch(30% 0.07 65);
  --hover: oklch(28% 0.02 250);
  --sunken: oklch(24% 0.015 250);
  --line: oklch(32% 0.02 250);
  --line-strong: oklch(40% 0.03 250);
  --fg: oklch(94% 0.01 255);
  --fg-soft: oklch(76% 0.02 250);
  --muted: oklch(66% 0.02 250);
  --bg: oklch(18% 0.012 255);
  --surface: oklch(22% 0.015 255);
}

/* ── 高优信号卡片区 ── */
.must-grid{
  display:grid;
}
.must-card{
}
.must-card:hover{
}
.must-head{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:8px;
}
.must-head .hl-score{
  flex:0 0 auto;
  font-size:var(--fs-h2);
  color:var(--accent);
}
.must-head .tag{
  flex:0 0 auto;
  white-space:nowrap;
}
.must-title{
  font-weight:600;
  color:var(--fg);
}
.must-why{
  margin:6px 0 0;
  font-family:var(--font-body);
  font-size:12px;
  line-height:1.45;
  color:var(--muted);
}
.must-so{
  color:var(--muted);
}

/* ── 内容形态分布 chips ── */
.track-cloud{
  flex-wrap:wrap;
  margin-top:12px;
}
.track-cloud .chip{
  align-items:center;
  gap:4px;
  padding:6px 12px;
  border-radius:999px;
  border:1px solid var(--line);
  background:var(--surface);
  font-size:14px;
  color:var(--fg-soft);
  text-decoration:none;
  transition:all .15s;
}
.track-cloud .chip:hover{
  border-color:var(--accent);
  color:var(--accent);
  background:var(--accent-soft);
}

/* ── 历史归档 ── */
.arch-row{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin-top:12px;
}
.arch-row .dchip{
  display:inline-flex;
  align-items:center;
  padding:6px 12px;
  border-radius:8px;
  border:1px solid var(--line);
  background:var(--surface);
  font-size:14px;
  color:var(--fg-soft);
  text-decoration:none;
  transition:all .15s;
}
.arch-row .dchip:hover{
  border-color:var(--accent);
  color:var(--accent);
}

/* ── 子品类/实体标签（Apple / Microsoft / Galaxy Buds On）──
   2026-10-26：原来字号 12px + 圆角 6px，比同页的 .hl-meta .tag
   （11.5px / 999px / 高 20）高出 4.6px、形状也不同，视觉参差。
   语义上它确实与"赛道/类型"不同（这是实体名），保留 6px 圆角做区分，
   但**高度和字号必须对齐**，否则一行里像混了两种组件。 */
.tag.sub{
  background:var(--accent-soft);
  color:var(--accent);
  border-radius:999px;        /* 2026-11-03 统一：全站统一样式语言为优雅胶囊，消除方圆混杂 */
  font-size:var(--fs-micro);  /* 2026-10-26：原写死 11.5px，统一走令牌 */
  font-weight:500;
  text-decoration:none;
  /* 尺寸由文末「标签尺寸单一真相源」统一提供。
     2026-10-26：这里原来是 `height:20px` 的补丁，与其它标签的
     `min-height:20px` 表达同一件事但**语义不同** —— 实测长文字换行时
     `.tag.sub` 被截断在 20px，文字溢出到 border 外（overflow:visible），
     而其它标签能正常撑高。现在统一用 min-height，补丁撤销。 */
}
a.tag.sub:hover{
  background:var(--accent);
  color:#fff;
}

/* ── 时间组头增强 ── */
.time-group-header{
  font-size:14px;
  font-weight:600;
  color:var(--fg-soft);
  padding:16px 0 8px;
  border-bottom:1px solid var(--line);
  margin-bottom:8px;
}

/* ── 侧栏增强 ── */
.grid-home-side .section{
  margin-bottom:24px;
}
.grid-home-side .sec-head h2{
  font-size:16px;
  font-weight:600;
  color:var(--fg);
}

/* ── 响应式：高优信号网格 ── */
@media (max-width:768px){
  .must-grid{ grid-template-columns:1fr; }
}

/* ── 区头链接（历史归档入口 / 返回首页）── */
.sec-link{
  font-size:var(--fs-meta);
  color:var(--muted);
  text-decoration:none;
  margin-left:auto;
  white-space:nowrap;
  transition:color .15s;
}
.sec-link:hover{ color:var(--accent); }
.hl-title a,.must-title a{ text-decoration:none; color:inherit; }
.hl-title a:hover,.must-title a:hover{ text-decoration:underline; }
.must-src{ margin:6px 0 0; font-size:12px; color:var(--muted); }
/* 来源头像。用 inline-grid + place-items 居中，**不用 inline-flex，也不用
   inline-block + text-align**：定宽圆里放单个 CJK 字时，行内布局会把
   text-align:center 吃掉（实测 text-align 改成 left 位置不变），12px 的中文在
   20px 圆里从容器中心开始向右排，实际占到 25px（scrollWidth 25 > clientWidth 20），
   字贴右不居中。grid 的 place-items 不依赖行盒宽度计算，中文/拉丁/多字都稳。 */
.src-ava{ display:inline-grid; place-items:center; width:22px; height:22px; border-radius:50%; font-size:11px; color:#fff; background:hsl(var(--h,210),55%,45%); margin-right:3px; vertical-align:-6px; }
.must-src .src-ava{ width:20px; height:20px; font-size:11px; }
img.src-ava{ object-fit:contain; }

/* ══════════════════════════════════════════════════════════════════
   排版归一（2026-10-16）—— 字号 / 字重 / 圆角一次收敛成体系。
   全部写在追加层：v1.css 保持「从 V1 原样 vendored」不漂移。
   ══════════════════════════════════════════════════════════════════ */

/* ── ① 字号：把散落的裸 px 重指到 6 档令牌 ───────────────────────────
   注释里的「19 → 20」是 v1.css 原值 → 收敛后的档位。 */
.brand{ font-size:var(--fs-h2); }                          /* 19   → 20 */
.nav a,
.sn-drop>summary,
.nav-more-d>summary{ font-size:var(--fs-meta); }           /* 14   → 14 */
.panel-h h2{ font-size:var(--fs-h3); }                     /* 14   → 16 */
.trend-line,
.track-jump .chip{ font-size:var(--fs-micro); }            /* 12   → 12 */
.time-group-header{ font-size:var(--fs-meta); }            /* 13   → 14 */
.summary-panel .summary-item{ font-size:var(--fs-meta); }  /* 13.5 → 14 */
.spike-name{ font-size:var(--fs-meta); }                   /* 14   → 14 */
.spike-meta{ font-size:var(--fs-micro); }                  /* 12   → 12 */
.hl-title{ font-size:var(--fs-body); }                     /* 16   → 16 */
.hl-pin{ font-size:var(--fs-micro); }                      /* 11.5 → 12 */
.hl-so{ font-size:var(--fs-meta); }                        /* 13.5 → 14 */
.hl-meta,
.hl-meta .tag{ font-size:var(--fs-micro); }                /* 11.5 → 12 */
.fchip{ font-size:var(--fs-meta); }                        /* 13   → 14 */
.filter-row.sub .fchip,
.filter-note{ font-size:var(--fs-micro); }                 /* 12   → 12 */
.hl-sentinel{ font-size:var(--fs-micro); }                 /* 12.5 → 12 */
.nodes-line{ font-size:var(--fs-meta); }                   /* 13.5 → 14 */
.cutoff-line,
.rel-list,
.btn-read-all{ font-size:var(--fs-micro); }                /* 12/12.5 → 12 */
.page-home .hero .lead{ font-size:var(--fs-lead); }        /* 15.5 → 16 */
.page-home .hero .tile .v{ font-size:var(--fs-stat); }     /* 26   → 28 */
/* V2 自有区块 */
.must-head .hl-score{ font-size:var(--fs-h2); }            /* 22   → 20 */
.must-title{ font-size:var(--fs-body); }                   /* 16   → 16 */
.must-so{ font-size:var(--fs-meta); }                      /* 13.5 → 14 */
.track-cloud .chip,
.arch-row .dchip{ font-size:var(--fs-meta); }              /* 13   → 14 */

   /* 原来写 var(--fs-micro)=12px，导致 sub 标签比同页的 meta 标签高 4.6px */
.grid-home-side .sec-head h2{ font-size:var(--fs-h3); }    /* 15   → 16 */
.must-src{ font-size:var(--fs-micro); }                    /* 12   → 12 */

/* ── ② 字重：只用 400 / 500 / 600 / 700 ──────────────────────────────
   650 / 680 是非标准值，浏览器各自映射到最近的档（不同引擎的取整规则
   不同），同一份 CSS 在两台机器上会长得不一样。 */
.h1{ font-weight:700; }                /* 680 → 700 */
.sec-head h2,
.panel-head h3,
.panel-h h2{ font-weight:600; }        /* 650 → 600 */

/* ── ③ 圆角：收敛到 10 / 16 / 50% / 999 四档 ─────────────────────────
   小元素 10px、卡片 16px、头像 50%、细条 999px（药丸）。 */
.sn-menu .badge,
.ev-so .k,
.prov code,
.btn-read-all,
.hl-title a:focus-visible{ border-radius:var(--r); }       /* 2/3/4 → 10 */
.meter, .meter i,
.bar u,
.sp-bar, .sp-bar i{ border-radius:999px; }                 /* 2/3 → 药丸 */

/* ── ④ 表单控件继承字体 ─────────────────────────────────────────────
   <button>/<summary> 与 <input> 默认**不继承** font-family，会回落到 UA 的
   -webkit-standard（Times 一族）—— 整页实测里出现的衬线字体就是这个，
   而且是意外出现的，不是设计选择。 */
button, summary{ font-family:inherit; }
input, select, textarea{ font:inherit; }

/* ── ⑤ 来源头像里的字不再溢出 ───────────────────────────────────────
   见上方 .src-ava 的注释：定宽圆 + 单字 CJK 时行内布局会吃掉 text-align，
   字从容器中心向右排（12px 中文在 20px 圆里占到 25px）。改用 inline-grid +
   place-items:center，并给圆和字号留出余量。 */
.src-ava{ width:22px; height:22px; font-size:11px; }
.must-src .src-ava{ width:20px; height:20px; font-size:11px; }

/* ══════════════════════════════════════════════════════════════════
   首页审计修复（2026-10-16 第二轮）—— 逐项实测出来的 8 处缺陷。
   ══════════════════════════════════════════════════════════════════ */

/* ── ① hero h1 的字号漏归一 ─────────────────────────────────────────
   v1.css 里 `.page-home .hero .h1{font-size:clamp(26px,2.6vw,34px)}` 是**唯一**
   一处没被归一的字号 —— 它是 clamp()，逃过了「裸 px」审计的正则
   （`(\d+px)` 要求值以数字开头）。实测 1280px 视口下算出 33.28px，
   而全站其它 h1 走 --fs-h1（36px 上限）：同一个 h1 两套字号。 */
/* 2026-10-26：删除 font-size:var(--fs-h1)。它被下方 hero 重设计的
   clamp(30px,3.2vw,40px) 覆盖，从未生效。 */

/* ── ② 高优信号卡片密度 ─────────────────────────────────────────────
   5 张卡占 680px（两行 × 340）。单卡里最占地方的是 120 字摘要：
   14px 在 320px 宽里折 5–6 行。摘要是「补一句上下文」，不是正文 ——
   收 3 行足够；同时内边距 20 → 16、网格 gap 16 → 12。 */
.must-grid{ grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:12px; margin-top:12px; }
.must-card{ padding:16px; }
.must-head{ margin-bottom:8px; }
.must-title{ margin-bottom:6px; }
.must-so{
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:3;
  overflow:hidden;
}
.must-src{ margin-top:6px; }

/* ── ③ 传闻线索「展开全部」─────────────────────────────────────────
   原来 _LEADS_LIMIT=10 之后直接丢弃，而 KPI 写全量（实测 20）——
   读者以为丢了 10 条。现在 5 条可见 + <details> 展开到全量，零 JS。 */
.sec-more{ border-top:1px solid var(--line); }
.sec-more>summary{
  display:block; cursor:pointer; padding:12px 20px;
  font-size:var(--fs-micro); color:var(--muted); list-style:none;
}
.sec-more>summary::-webkit-details-marker{ display:none; }
.sec-more>summary::before{ content:"＋ "; }
.sec-more[open]>summary::before{ content:"－ "; }
.sec-more>summary:hover{ color:var(--accent); }

/* ── 传闻线索：按天分组（2026-10-24）───────────────────────────────
   迭代过三版：硬截断 → 「前 5 + details」→ 客户端分页 → 现在按天分组。
   实测 59 条里 41 条集中在一个自然日、今天只有 7 条 —— 线索是
   「每天少量、旧的自然死掉」的东西，分页是错的表现形态。

   不复用 .sec-more：那是给主体列表「展开更多」用的单行条，summary 整体弱化；
   分组头需要反过来 —— 强调日期、弱化条数。两者视觉诉求相反。 */

.leads-group{ border-top:1px solid var(--line); }
.leads-group:first-of-type{ border-top:0; }

/* 组头：日期（主）+ 条数 + 折叠指示（次）。
   用 grid 三列而不是 flex + ::before —— 上一版 ::before 的 ＋/－ 作为第三个
   flex item 参与 space-between，把日期顶到了中间。这里指示器走 ::after
   并固定在最右列，不参与内容分配。 */
.leads-group > summary{
  display: grid;
  grid-template-columns: 1fr auto 12px;
  align-items: center;
  gap: 12px;
  padding: 13px 0;
  cursor: pointer;
  list-style: none;
  color: var(--fg);
  min-height: 44px;               /* 触控目标下限 */
  box-sizing: border-box;
}
.leads-group > summary::-webkit-details-marker{ display:none; }

/* 日期：组头主信息，比线索标题降一档但仍明显 */
.leads-day{
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--fg);
  font-variant-numeric: tabular-nums;
  letter-spacing: .01em;
}
/* 相对日（今天/昨天/N 天前）：跟在日期后，弱化但可读 */
.leads-day-rel{
  margin-left: 6px;
  font-weight: 400;
  font-size: var(--fs-micro);
  color: var(--muted);
}
/* 条数：右对齐的辅助计数 */
.leads-count{
  font-size: var(--fs-micro);
  color: var(--muted);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
/* 折叠指示：旋转的雪佛龙，独立在最右列；跨浏览器不依赖 details marker */
.leads-group > summary::after{
  content: "";
  justify-self: end;
  width: 7px; height: 7px;
  border-right: 1.5px solid var(--muted);
  border-bottom: 1.5px solid var(--muted);
  transform: rotate(-45deg) translateY(-1px);
  transition: transform .15s ease;
}
.leads-group[open] > summary::after{
  transform: rotate(45deg) translateX(-1px);
}
@media (prefers-reduced-motion: reduce){
  .leads-group > summary::after{ transition: none; }
}
.leads-group > summary:hover .leads-day{ color: var(--accent); }

/* 展开后的行：去掉 content-visibility —— 折叠组内的行本来就不参与布局，
   那里的 130px 占位值反而把真实行高（~79px）撑成 165px。 */
.leads-group .panel-body > .hl-row{
  content-visibility: visible;
  contain-intrinsic-size: none;
  padding: 13px 0;
}
.leads-group .panel-body > .hl-row:first-child{ border-top: 0; }
.leads-group .panel-body > .hl-row:last-child{ border-bottom: 0; }
/* 展开组与下一个组头之间留白，避免内容贴着下一条分隔线 */
.leads-group[open] .panel-body{ padding-bottom: 4px; }

/* 今天那组：左侧色条 + 日期强调，其余组保持中性 */
.leads-group--today > summary{ position: relative; }
.leads-group--today > summary::before{
  content: "";
  position: absolute;
  left: -12px; top: 50%;
  transform: translateY(-50%);
  width: 2px; height: 16px;
  border-radius: 1px;
  background: var(--accent);
}
.leads-group--today .leads-day{ color: var(--accent-ink); }

@media (max-width: 640px){
  .leads-group > summary{ padding: 12px 0; gap: 10px; }
  .leads-group--today > summary::before{ left: -8px; }
}

/* ── ④ 兼类两行：行名 ──────────────────────────────────────────────
   .flabel 是 v1.css 现成组件（筛选行左侧的小标签），这里只补间距。 */
.filter-row.sub .flabel{ margin-right:4px; }

/* ── ⑤ 内容形态分布：选中态 ────────────────────────────────────────
   chip 的 href 一直是 ?track=…，但服务端从未解析该参数 —— 点了没反应，
   自然也没人发现它没有选中态。现在补上，与 .dchip.on 同一种表达。 */
.track-cloud .chip.on{
  border-color:var(--accent); color:var(--accent); background:var(--accent-soft);
}
/* ── 首页信号流翻页 ───────────────────────────────────────────── */
.hl-pagination{ display:flex; flex-wrap:wrap; gap:8px; justify-content:center; margin:14px 0 4px; }
.hl-page{ min-width:34px; height:34px; padding:0 10px; border:1px solid var(--border); border-radius:var(--r); background:var(--surface); color:var(--muted); font-size:var(--fs-meta); cursor:pointer; }
.hl-page:hover{ color:var(--fg); border-color:var(--line-strong); }
.hl-page.on{ background:var(--accent-soft); border-color:var(--accent); color:var(--accent-ink); font-weight:600; }
.hl-page-status{ width:100%; text-align:center; font-size:var(--fs-micro); color:var(--muted); margin-bottom:4px; }
.filter-sep{ color:var(--muted); padding:0 4px; user-select:none; }
/* 2026-10-28：`.filter-drawer*` 已删 —— 首页筛选器拍平成与频道页同构的
   平铺行（`filter-row` + `fchip`），嵌套折叠结构不再存在。 */
.read-all-top{ margin:0 0 12px; text-align:right; }

/* ── ⑥ 列表宽度不再被 content-visibility 的「旧宽度」撑破 ─────────────
   .evlist / .hl-list 是**隐式单列 grid**，列宽走 auto —— 会被子项的
   min-content 撑开。而 .hl-row 带 content-visibility:auto（屏外行跳过布局），
   它保留上一次布局的宽度；视口变窄时这个旧宽度回流成列的 min-content，
   整条列表就钉在旧宽度上。

   实测（1920 → 1280 → 1040 → 920 之后收窄）：documentElement.scrollWidth
   停在 **900**（首页）/ **996**（归档页），而视口只有 640 / 390 —— 窄屏出现
   整页横向滚动。逐档「刷新后直接量」量不出来，必须**连续缩窄**才复现。

   显式 minmax(0,1fr) 让列宽不再由子项 min-content 决定。只加这一条就够，
   content-visibility 的性能收益保留 —— 实测 1920→360 共 7 档
   scrollWidth == innerWidth。 */
.evlist,.hl-list{ grid-template-columns:minmax(0,1fr); }
/* ══════════════════════════════════════════════════════════════════
   主站视觉对齐（2026-10-20）
   —— 门户 huajun.wang：近白底 / 系统无衬线 / 蓝色 accent / 10–16px 圆角。
   保留日报的信息层级（高优信号 + 核心研判 + 信号流），去掉纸媒衬线/直角/朱红。
   新类名仍限定 must- / arch- / sec- / src- / track- 前缀。
   ══════════════════════════════════════════════════════════════════ */
:root{
  --container:1120px;
  --gutter:32px;
  --topbar-h:58px;
  --subnav-h:40px;
  /* 二级频道导航已移出 <header>：顶栏只剩和门户一样的一行，筛选条让开 58px 即可。 */
  --topbar-total:var(--topbar-h);
  --r:10px;
  --r-lg:16px;
  --bg:oklch(99% 0.002 240);
  --surface:oklch(100% 0 0);
  --sunken:oklch(97.2% 0.004 250);
}
[data-theme="dark"],
[data-theme="dark"] body{
  --bg:oklch(18% 0.012 255);
  --surface:oklch(22% 0.015 255);
  --sunken:oklch(24% 0.015 255);
}

body{
  background:var(--bg);
  color:var(--fg);
  font-family:var(--font-body);
  line-height:1.55;
}
::selection{background:var(--accent-soft);color:var(--fg)}
:focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* ── 顶栏：与门户 .topnav 同一语法 ─────────────────────────────── */
.topbar{
  background:color-mix(in oklch, var(--bg) 92%, transparent);
  border-bottom:1px solid var(--border);
  backdrop-filter:blur(12px);
  -webkit-backdrop-filter:blur(12px);
}
.topbar-in{min-height:0;padding-block:14px;gap:24px}
.brand-wrap{gap:10px;align-items:center}
.brand{
  font-family:var(--font-display);
  font-size:var(--fs-h2);  /* 2026-10-26：原写死 19px，覆盖了收敛声明 */
  font-weight:600;
  letter-spacing:-.01em;
  line-height:1.55;
  color:oklch(18% 0.012 250);
}
[data-theme="dark"] .brand{ color:var(--fg); }
.brand:hover{color:var(--accent)}
.nav{gap:32px}
.nav a{
  padding:0;
  font-size:14px;
  color:var(--muted);
  box-shadow:none;
}
.nav a:hover{color:var(--fg)}
.nav-more>summary{
  border:1px solid var(--border);
  border-radius:8px;
  padding:8px 12px;
  min-height:36px;
  color:var(--muted);
}
.nav-more>summary svg{width:22px;height:22px}
.nav-more-list{border-radius:12px;border-color:var(--border);background:var(--surface);box-shadow:0 16px 40px color-mix(in oklch, var(--fg) 12%, transparent)}
/* 雷达二级导航：首行保持门户 6 项，频道入口单独一行。 */
.sec-nav{
  display:flex;
  align-items:center;
  gap:20px;
  min-height:var(--subnav-h);
  border-bottom:1px solid var(--border);
}
.sec-nav a{
  display:inline-flex;
  align-items:center;
  min-height:var(--subnav-h);
  padding:0 2px;
  font-size:14px;
  color:var(--muted);
  text-decoration:none;
  white-space:nowrap;
}
.sec-nav a:hover{color:var(--fg)}
.sec-nav a.on{
  color:var(--fg);
  font-weight:600;
  box-shadow:inset 0 -2px 0 var(--accent);
}
/* 筛选条吸顶时要让开「首行 + 二级导航」，否则会压在二级导航下面。 */
.filterbar{top:var(--topbar-h)}
@media (min-width:769px){
  .topbar-in{flex-wrap:nowrap}
  .nav{display:flex}
  .nav-more{display:none}
  .sec-nav{display:flex}
}
@media (max-width:768px){
  .topbar-in{flex-wrap:nowrap;gap:14px}
  .nav{display:none}
  .topbar .nav-more{display:block;position:static;line-height:0}
  .sec-nav{display:none}
  .filterbar{position:static}
  .nav-more>summary{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    width:44px;
    height:44px;
    padding:11px;
    border:0;
    border-radius:0;
    color:var(--fg);
    list-style:none;
    margin:-11px;
  }
  .nav-more>summary::-webkit-details-marker{display:none}
  .nav-more .nav-more-list{
    position:absolute;
    top:100%;
    left:0;
    right:0;
    display:flex;
    flex-direction:column;
    flex-wrap:nowrap;
    gap:20px;
    padding:20px var(--gap-lg);
    max-height:calc(100dvh - var(--topbar-h));
    overflow-y:auto;
    border:0;
    border-bottom:1px solid var(--border);
    border-radius:0;
    background:var(--bg);
    box-shadow:none;
  }
  .nav-more .nav-more-list a{
    display:block;
    min-height:44px;
    padding:10px 0;
    border-radius:0;
    background:none;
    color:var(--muted);
    font-size:16px;
  }
  .nav-more .nav-more-list a.on{
    background:none;
    color:var(--fg);
    font-weight:600;
  }
}

/* ── 日期条：胶囊分段 ─────────────────────────────────────────── */
.datebar{background:transparent;border-bottom:1px solid var(--border)}
.datebar-in{min-height:50px;padding-block:9px;display:flex;flex-wrap:wrap;gap:6px}
.dchip{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:999px;
  padding:5px 12px;
  margin:0;
  font-family:var(--font-mono);
  font-size:var(--fs-micro);
  color:var(--muted);
}
.dchip:hover{color:var(--fg);border-color:var(--line-strong)}
.dchip.on,.dchip[aria-pressed="true"]{
  color:var(--accent-ink);
  border-color:color-mix(in oklch, var(--accent) 40%, var(--border));
  background:var(--accent-soft);
  box-shadow:none;
  font-weight:600;
}

/* ── Hero：门户式左对齐大标题，不再用衬线 ─────────────────────── */
.page-home .hero{padding-block:48px 8px;border-bottom:0}
.page-home .hero .eyebrow{
  display:flex;
  align-items:center;
  gap:8px;
  margin:0;
  font-family:var(--font-mono);
  font-size:12px;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:var(--muted);
}
.page-home .hero .eyebrow::before{
  content:"";
  width:6px;
  height:6px;
  border-radius:50%;
  background:var(--accent);
}
.page-home .hero .sec-head{
  border-top:0;
  padding-top:0;
  margin:16px 0 0;
  align-items:flex-end;
  gap:16px 24px;
}
.page-home .hero .h1{
  font-family:var(--font-display);
  /* 2026-10-26：删除 font-size:clamp(38px,5.2vw,60px) 与 line-height:1.06、
     letter-spacing:-.035em —— 三者都被下方 hero 重设计（原 1418 行）的同名
     声明覆盖，从未生效。保留仍生效的 font-family/font-weight/max-width。 */
  font-weight:600;
  max-width:18ch;
}
.page-home .hero .sec-note{
  margin-left:auto;
  padding-bottom:7px;
  font-family:var(--font-mono);
  font-size:12px;
  letter-spacing:.02em;
  color:var(--muted);
}
.cutoff-line{
  margin:18px 0 0;
  font-family:var(--font-mono);
  font-size:12px;
  letter-spacing:.03em;
  color:var(--muted);
}

/* ── KPI：门户卡片 ─────────────────────────────────────────────── */
.kpi-wrap{max-width:none;margin-top:30px}
.statrow{gap:12px;border:0}
.statrow.n4{grid-template-columns:repeat(4,minmax(0,1fr))}
.tile{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:14px;
  padding:18px 18px 16px;
}
.tile+.tile{border-left:1px solid var(--border);padding-left:18px}
.tile .v{
  font-family:var(--font-display);
  font-size:28px;
  font-weight:600;
  line-height:1.05;
  letter-spacing:-.03em;
  color:var(--accent);
}
.tile .k{
  margin-top:4px;
  font-family:var(--font-body);
  font-size:12px;
  letter-spacing:0;
  text-transform:none;
  color:var(--muted);
}
.tile .s{margin-top:3px;font-family:var(--font-mono);font-size:12px;color:var(--muted);opacity:.8}

/* ── 区块与卡片骨架 ───────────────────────────────────────────── */
.section{padding-block:0}
.section+.section{border-top:0}
main>.section:not(.hero){
  margin-top:16px;
  padding:22px;
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r-lg);
}
.sec-head{
  display:flex;
  align-items:center;
  gap:10px;
  flex-wrap:wrap;
  border-top:0;
  padding-top:0;
  margin-bottom:16px;
}
.sec-head h2{
  font-family:var(--font-display);
  font-size:20px;
  font-weight:600;
  line-height:1.2;
  letter-spacing:-.015em;
}
.sec-head .eyebrow{
  padding:3px 8px;
  border-radius:999px;
  background:var(--accent-soft);
  font-family:var(--font-mono);
  font-size:10px;
  letter-spacing:.1em;
  color:var(--accent-ink);
}
.sec-note{font-size:12px;color:var(--muted)}
.sec-link{
  margin-left:auto;
  padding:0;
  border:0;
  font-family:var(--font-body);
  /* 2026-10-26：原写死 12px，覆盖了上方收敛区块的 --fs-meta(14px) */
  font-size:var(--fs-meta);
  color:var(--accent);
  white-space:nowrap;
}
.sec-link:hover{color:var(--accent-ink);text-decoration:underline;text-underline-offset:3px}

/* ── 高优信号卡片 ───────────────────────────────────────────── */
.must-grid{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:12px;
  margin:0;
  border-top:0;
}
.must-card{
  padding:16px;
  background:var(--bg);
  border:1px solid var(--border);
  border-radius:12px;
  transition:border-color .15s ease, box-shadow .15s ease;
}
.must-card:hover{
  border-color:color-mix(in oklch, var(--accent) 36%, var(--border));
  box-shadow:0 8px 24px color-mix(in oklch, var(--fg) 7%, transparent);
}
.must-card:first-child{
  grid-column:1/-1;
  padding:20px;
  border-bottom:1px solid color-mix(in oklch, var(--accent) 26%, var(--border));
  background:linear-gradient(135deg,var(--accent-soft) 0%,var(--surface) 52%);
}
.must-head{gap:8px;margin-bottom:9px}
.must-head .hl-score{
  font-family:var(--font-mono);
  font-size:var(--fs-h2);  /* 2026-10-26：原写死 20px（与令牌同值，去裸 px） */
  font-weight:600;
  letter-spacing:-.03em;
  color:var(--accent);
}
.must-head .tag{
  border:1px solid var(--border);
  border-radius:999px;
  background:var(--surface);
  padding:2px 8px;
  font-family:var(--font-body);
  font-size:12px;
  color:var(--muted);
}
.must-title{
  margin:0 0 6px;
  font-family:var(--font-display);
  font-size:var(--fs-body);
  font-weight:600;
  line-height:1.42;
  letter-spacing:-.01em;
  display:-webkit-box;
  -webkit-box-orient:vertical;
  -webkit-line-clamp:2;
  overflow:hidden;
}
.must-card:first-child .must-title{
  font-size:clamp(22px,2.8vw,28px);
  line-height:1.25;
  letter-spacing:-.025em;
  max-width:100%;
  margin-bottom:8px;
  -webkit-line-clamp:2;
}
.must-title a{color:var(--fg);text-decoration:none}
.must-title a:hover{color:var(--accent-ink);text-decoration:underline;text-underline-offset:3px}
.must-so{
  font-size:var(--fs-meta);
  line-height:1.6;
  color:var(--muted);
  display:-webkit-box;
  -webkit-box-orient:vertical;
  -webkit-line-clamp:2;
  overflow:hidden;
}
.must-card:first-child .must-so{font-size:var(--fs-meta);line-height:1.65;max-width:100%;color:var(--muted);-webkit-line-clamp:2}
.must-card:first-child .must-head .tag{font-size:11px;padding:1px 7px}
.must-head .hl-score{min-width:34px;text-align:right}
.must-src{
  margin:8px 0 0;
  font-family:var(--font-body);
  font-size:var(--fs-micro);
  color:var(--muted);
}
/* ── 信号流 + 赛道：并排两张卡 ─────────────────────────────────── */
.grid-home{
  grid-template-columns:minmax(0,1.95fr) minmax(260px,.8fr);
  gap:16px;
  align-items:start;
  border-top:0;
  padding-top:0;
  margin-top:16px;
}
.grid-home>div>.section{
  padding:22px;
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r-lg);
}
.grid-home-side .section{
  margin:0;
  padding:20px;
  border:1px solid var(--border);
  border-radius:var(--r-lg);
  background:var(--surface);
}
.grid-home-side .sec-head{border:0;padding:0;margin-bottom:12px}
.grid-home-side .sec-head h2{font-size:var(--fs-h3)}  /* 2026-10-26：原写死 20px，覆盖收敛的 16px */

/* 赛道列表：与信号流的胶囊筛选刻意不同 —— 这里是整行“目录”，不是事件标签 */
.track-cloud{display:grid;gap:4px;margin:0}
.track-cloud .chip{
  display:flex;
  align-items:center;
  justify-content:space-between;
  min-height:38px;
  padding:8px 10px;
  border:1px solid transparent;
  border-radius:8px;
  background:var(--sunken);
  font-family:var(--font-body);
  font-size:var(--fs-meta);  /* 2026-10-26：原写死 12px，覆盖收敛的 14px */
  color:var(--fg);
}
.track-cloud .chip:hover{background:var(--accent-soft);color:var(--accent-ink);border-color:color-mix(in oklch, var(--accent) 24%, transparent)}
.track-cloud .chip.on{
  background:var(--accent-soft);
  color:var(--accent-ink);
  border-color:color-mix(in oklch, var(--accent) 40%, transparent);
  font-weight:600;
}
.track-note{
  margin:12px 0 0;
  padding-top:12px;
  border-top:1px dashed var(--border);
  font-size:12px;
  line-height:1.6;
  color:var(--muted);
}
.track-note b{margin:0 1px;color:var(--fg);font-weight:600}
.track-note span{color:var(--muted)}
.track-note a{color:var(--accent);text-decoration:none}
.track-note a:hover{text-decoration:underline;text-underline-offset:2px}

/* ── 信号流筛选：主类用胶囊，事件类型用轻量行 ─────────────────── */
.filter-row{
  display:flex;
  align-items:center;
  gap:6px;
  flex-wrap:wrap;
  margin:0;
  padding:0 0 12px;
  border-bottom:1px solid var(--border);
}
.filter-row.sub{margin:0;padding:10px 0 0;border-bottom:0;align-items:center}
.filter-row.sub+.filter-row.sub{padding-top:8px}
.flabel,.sec-label{
  margin-right:2px;
  font-family:var(--font-body);
  font-size:12px;
  font-weight:500;
  letter-spacing:0;
  color:var(--muted);
}
.fchip{
  margin:0;
  padding:5px 11px;
  border:1px solid var(--border);
  border-radius:999px;
  background:var(--surface);
  font-family:var(--font-body);
  /* 2026-10-26：原本写死 12px，覆盖了上方「字号收敛」区块里
     `.fchip{font-size:var(--fs-meta)}` 的声明（v1 13px → v2 14px）。
     同一属性两处定义、后写者胜，收敛等于没做。改用令牌。 */
  font-size:var(--fs-meta);
  letter-spacing:0;
  color:var(--muted);
}
.fchip:hover{color:var(--fg);border-color:var(--line-strong);background:var(--surface)}
.fchip.on{
  color:var(--accent-ink);
  border-color:color-mix(in oklch, var(--accent) 40%, var(--border));
  background:var(--accent-soft);
  font-weight:600;
}
.filter-row.sub .fchip{
  padding:4px 10px;
  font-size:var(--fs-micro);  /* 2026-10-26：原写死 12px，去裸 px */
  border-color:transparent;
  background:transparent;
}
.filter-row.sub .fchip:hover{background:var(--sunken);border-color:transparent}
.filter-row.sub .fchip.on{background:var(--accent-soft);border-color:transparent}
.filter-note{
  display:inline;
  margin-left:auto;
  font-family:var(--font-body);
  /* 2026-10-26：删掉写死的 12px —— 上方「字号收敛」区块已声明
     `font-size:var(--fs-micro)`，这里重复声明会覆盖令牌。 */
  color:var(--muted);
}

/* ── 列表行 ───────────────────────────────────────────────────── */
.evlist{display:block;margin-top:2px}
.time-group-header{
  display:flex;
  align-items:center;
  gap:8px;
  padding:18px 0 8px;
  border-bottom:1px solid var(--border);
  font-family:var(--font-mono);
  font-size:var(--fs-meta);  /* 2026-10-26：原写死 12px，覆盖收敛的 14px */
  font-weight:500;
  letter-spacing:.06em;
  color:var(--muted);
}
.time-group-header::before{width:6px;height:6px;background:var(--accent)}
.time-group+.time-group{margin-top:0}
.hl-list{display:block}
.hl-row{
  padding:15px 0;
  border-top:0;
  border-bottom:1px solid var(--border);
  border-radius:0;
  background:transparent;
}
.hl-row:first-child{border-top:0}
.hl-row:hover,.hl-row:focus-within{background:transparent}
.hl-title-row{gap:8px}
.hl-title{
  font-family:var(--font-display);
  font-size:var(--fs-body);
  font-weight:600;
  line-height:1.45;
  letter-spacing:-.01em;
}
.hl-title a{color:var(--fg);text-decoration:none}
.hl-title a:hover{color:var(--accent-ink);text-decoration:underline;text-underline-offset:3px}
.hl-pin{font-family:var(--font-body);font-size:var(--fs-micro);font-weight:600;color:var(--accent)}
/* 2026-10-28：「继续关注」section 已从首页删除，`.sec-continue-*` 一并清除
   （29 行死代码）。`info["continue"]` 字段仍在简报 JSON 里，若将来恢复渲染，
   样式需重新添加 —— 但先别留着，死 CSS 会让人以为这个区块还在。 */
/* 主题综述：独立类名，避免再复用已停用的 .tldr 语义（v1.css 里的 .tldr 仍冻结保留）。 */
.sec-digest{display:grid;grid-template-columns:3.6em minmax(0,1fr);column-gap:10px;row-gap:4px;margin:2px 0 14px}
.sec-digest p{grid-column:2;font-size:var(--fs-body);line-height:1.62}
.hl-so{margin-top:5px;font-size:var(--fs-meta);line-height:1.6;color:var(--muted)}
.hl-meta{
  gap:2px 10px;
  margin-top:8px;
  font-family:var(--font-body);
  font-size:12px;
  letter-spacing:0;
  color:var(--muted);
}
.hl-meta>*:not(:first-child)::before{margin-right:10px;color:var(--border)}
.hl-meta .tag{
  padding:2px 8px;
  border-radius:999px;
  /* 2026-10-26：原写死 12px，与文末「标签尺寸单一真相源」的 11.5px 冲突。
     尺寸已由那一处统一，这里不再声明 font-size。 */
  letter-spacing:0;
  background:var(--sunken);
}
/* 关注/需看只加属性，不新增类名（v2 新类前缀白名单不需要扩）。 */
.src-line .tag[data-focus="1"],
.hl-meta .tag[data-focus="1"]{
  color:var(--accent);
  background:var(--accent-soft);
  font-weight:600;
}
.src-line .tag[data-need="1"],
.hl-meta .tag[data-need="1"]{
  color:var(--warn-ink);
  background:var(--warn-soft);
  font-weight:600;
}
.hl-score{font-family:var(--font-mono);font-size:12px;font-weight:600;color:var(--accent)}
.src-ava{
  width:20px;
  height:20px;
  font-size:10px;
  background:var(--muted);
  color:var(--surface);
  margin-right:4px;
  vertical-align:-5px;
}
.must-src .src-ava{width:20px;height:20px;font-size:11px}
img.src-ava{filter:none}
.hl-meta .src-ava{opacity:.85}
.read-all-row{margin-top:12px;text-align:right}
.btn-read-all{
  padding:7px 12px;
  border:1px solid var(--border);
  border-radius:8px;
  background:var(--surface);
  font-family:var(--font-body);
  font-size:12px;
  color:var(--muted);
}
.btn-read-all:hover{border-color:var(--line-strong);color:var(--fg)}
.hl-sentinel{
  padding:18px 0;
  border-bottom:1px solid var(--border);
  font-family:var(--font-mono);
  font-size:var(--fs-micro);
  color:var(--muted);
  text-align:center;
}
.empty{
  padding:36px 0;
  border:0;
  border-top:1px solid var(--border);
  border-radius:0;
  font-family:var(--font-body);
  font-size:var(--fs-micro);
  color:var(--muted);
}

/* 传闻线索：去掉内层 panel 的双层边框 */
.page-home main>.section:not(.hero)>.panel{background:transparent;border:0;border-radius:0}
.page-home main>.section:not(.hero)>.panel>.panel-body{padding:0}
.sec-more{border-top:1px solid var(--border)}
.sec-more>summary{
  padding:14px 0;
  font-family:var(--font-body);
  font-size:var(--fs-micro);
  color:var(--muted);
}
.sec-more>summary:hover{color:var(--accent)}

/* ── 搜索页 ───────────────────────────────────────────────────── */
main form input[type="search"]{
  width:100%;
  margin-top:16px;
  padding:13px 14px;
  border:1px solid var(--border);
  border-radius:10px;
  background:var(--surface);
  color:var(--fg);
  font-family:var(--font-body);
  font-size:20px;
  line-height:1.3;
}
main form input[type="search"]:focus{border-color:var(--accent)}
main form input[type="search"]::placeholder{color:var(--muted)}

/* ── 页脚：门户的轻量 footer，不用深色块 ───────────────────────── */
.foot{
  margin-top:56px;
  padding-block:28px;
  background:transparent;
  border-top:1px solid var(--border);
}
.foot-in{gap:12px 24px}
.foot b{
  font-family:var(--font-display);
  font-size:14px;
  font-weight:500;
  letter-spacing:0;
  text-transform:none;
  color:var(--fg);
}
.foot .num,.foot .foot-sys,.foot-home{
  font-family:var(--font-body);
  font-size:12px;
  letter-spacing:0;
  color:var(--muted);
}
.foot-home{color:var(--accent);border:0;text-decoration:none}
.foot-home:hover{text-decoration:underline;text-underline-offset:3px}

/* ── 频道页：紧凑 Hero + 手机端赛道横滑 ───────────────────────── */
[data-channel-head]{
  padding-block:16px 6px;
  border-bottom:0;
}
[data-channel-head] .sec-head{
  margin-bottom:0;
  padding-bottom:0;
  border-bottom:0;
  align-items:baseline;
}
[data-channel-head] .h1{
  font-size:clamp(28px,3vw,34px);
  line-height:1.12;
}
details[data-channel-sections-wrap] > summary{
  list-style:none;
  cursor:pointer;
  margin-bottom:12px;
}
details[data-channel-sections-wrap] > summary::-webkit-details-marker{display:none}
details[data-channel-sections-wrap] > summary::after{
  content:"展开";
  margin-left:auto;
  font-size:var(--fs-micro);
  color:var(--accent);
}
details[data-channel-sections-wrap][open] > summary::after{content:"收起"}
@media (max-width:920px){
  [data-channel-head]{padding-block:10px 4px}
  [data-channel-head] .sec-head{gap:6px 12px}
  [data-channel-head] .h1{font-size:clamp(26px,7vw,32px)}
  /* 2026-10-25：原「赛道概览」是 5 张横滑卡片，这里给 [data-channel-sections]
     设了 display:flex + 子项 flex:0 0 min(82vw,340px)。改成条形图后这个选择器
     仍命中 .bar-list，把每行撑成 340px 高、1fr 列被压成 0 宽 —— 手机端条图
     完全不可读（实测行高 340px、bar-track 宽 0）。
     条图是纵向列表，不需要横滑，整段规则（含 scroll-note）已删除。 */
}
/* ── 响应式 ───────────────────────────────────────────────────── */
@media (max-width:1040px){
  .grid-home{grid-template-columns:minmax(0,1fr)}
  .grid-home-side{order:-1;margin-top:0;margin-bottom:16px}
}
@media (min-width:1041px){
  /* 一页 30 条全部展开；整页滚动，保留底部翻页。 */
  #evlist{
    max-height: none;
    overflow: visible;
  }
}
@media (max-width:920px){
  .topbar-in{flex-wrap:nowrap;gap:16px}
  /* 2026-10-26：删掉这里的 .page-home .hero 三条规则。
     它们在同一个断点内被下方（原 1471 行）的同名规则完全覆盖：
       .hero          padding-top:36px        → padding-block:22px 4px
       .hero .h1      clamp(34px,8vw,48px)    → var(--fs-stat)
       .hero .sec-note padding-bottom:4px     → 0
     实测 900px 渲染，删除前后完全一致（dead code）。 */
  .statrow.n4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .must-grid{grid-template-columns:minmax(0,1fr)}
  .must-card:first-child{grid-column:auto}
}
@media (max-width:640px){
  :root{--gutter:20px}
  .page-home .hero{padding-block:30px 8px}
  /* 2026-10-26：删除 .hero .h1 的 clamp(32px,9.5vw,42px)。
     它永远被 920 断点的 font-size:var(--fs-stat) 覆盖（640<920，
     两块同时命中时文件靠后的赢），实测 640/500/400/360px 全是 28px。 */
  .page-home .hero .sec-head{gap:8px 16px}
  .statrow.n4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .tile,.tile+.tile{padding:14px 16px;border-left:1px solid var(--border)}
  .tile .v{font-size:28px}
  main>.section:not(.hero),.grid-home>div>.section,.grid-home-side .section{padding:18px}
  .must-grid{gap:10px}
  .must-card:first-child{padding:16px}
  .must-card:first-child .must-title{font-size:20px}
  .filter-row{flex-wrap:wrap}
  .filter-note{display:none}
  .hl-title{font-size:16px}
  .hl-row{padding:14px 0}
  .foot-in{display:block}
  .foot-in>*{display:block;margin-bottom:8px}
}

/* ── 来源头像收尾（2026-10-20）────────────────────────────────────
   没有真实 favicon 时，纯灰底白字会变成一排黑点，比来源名更抢眼。
   兜底改为按来源名色相着色的低饱和字母块；真实图标仍原样显示。
   多个来源重叠成一组，避免两个圆把 meta 行拆碎。 */
.src-ava{
  margin-right:3px;
  background:hsl(var(--h,210) 58% 95%);
  color:hsl(var(--h,210) 42% 36%);
  border:1px solid hsl(var(--h,210) 38% 88%);
  font-family:var(--font-body);
  font-size:12px;
  font-weight:650;
  letter-spacing:0;
}
img.src-ava{
  background:#fff;
  border-color:var(--border);
  object-fit:contain;
}
.src-ava + .src-ava{
  margin-left:-6px;
  box-shadow:0 0 0 2px var(--surface);
}
.must-src .src-ava + .src-ava{
  box-shadow:0 0 0 1.5px var(--surface);
}
.hl-meta .src-ava{opacity:1}
[data-theme="dark"] .src-ava{
  background:hsl(var(--h,210) 30% 27%);
  color:hsl(var(--h,210) 58% 84%);
  border-color:hsl(var(--h,210) 26% 37%);
}
[data-theme="dark"] img.src-ava{
  background:#fff;
  border-color:var(--line);
}

/* v1 用「·」伪元素做 meta 分隔；.src-ava 是 inline-grid，伪元素会变成
   第二个 grid item，把字母挤到圆下面。头像自己就是分隔，不再生成点。 */
.hl-meta > .src-ava:not(:first-child)::before{
  content:none;
  margin:0;
}
.hl-meta > .src-ava + .meta::before{content:none;margin:0}

/* 信号流：事件类型是主标签，主类退为后面的辅助文字。 */
.hl-meta .tag[data-kind]{color:var(--fg-soft);font-weight:600}

/* 历史日期条移到底部：主页内容结束后的「往期」入口。 */
.datebar{
  border-top:1px solid var(--border);
  border-bottom:0;
}
.datebar .sec-label{align-self:center;margin-right:4px}
.datebar .sec-link{margin-left:auto}
@media (max-width:920px){
  .datebar .sec-link{margin-left:0}
}
.datebar + .foot{margin-top:0;border-top:0}

/* ══════════════════════════════════════════════════════════════════
   AIHOT 式署名行（2026-10-20）
   —— 来源 / 事件类型 / 评分上移到标题之前。AIHOT 的列表先给「谁在说、
   是什么、多少分」，再给标题与摘要；我们的行原来把全部 meta 压在标题下方，
   滚动时来源与分数最先被跳过。这里只调整信息顺序与呼吸感，不改内容口径。
   ══════════════════════════════════════════════════════════════════ */
.src-line{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:5px 8px;
  min-height:20px;
  margin-bottom:8px;
  font-size:var(--fs-micro);
  line-height:1.35;
}
.src-line .meta{color:var(--muted)}
.src-line .tag{
  padding:2px 8px;
  border-radius:999px;
  background:var(--sunken);
  /* 2026-10-26：同上，font-size 由文末统一声明提供 */
  font-weight:600;
  color:var(--fg-soft);
}
.src-line .hl-score{
  margin-left:auto;
  padding-left:8px;
  font-family:var(--font-mono);
  font-size:12px;
  font-weight:600;
  color:var(--accent);
}
.src-line .hl-score::before{
  content:"信号 ";
  font-family:var(--font-body);
  font-size:12px;
  font-weight:500;
  color:var(--muted);
}
.src-line .src-ava{margin-right:2px}
.src-line + .hl-title-row{margin-top:0}

/* 署名行承担来源后，底部只留主类 / 时间 / 同题 / 传闻，行距可以更松。 */
.hl-row{padding:17px 0}
.hl-so{
  margin-top:6px;
  font-size:var(--fs-meta);
  line-height:1.65;
}
.hl-meta{margin-top:7px}
.time-group-header{
  padding:22px 0 10px;
  font-family:var(--font-body);
  font-size:var(--fs-meta);
  font-weight:600;
  letter-spacing:0;
  color:var(--fg);
}
.src-avas{display:inline-flex;align-items:center;flex:0 0 auto}
.src-line .src-avas{margin-right:2px}

/* ══════════════════════════════════════════════════════════════════
   紧凑头图（2026-10-20）
   —— 行业雷达页不再用「eyebrow + 60px 大标题 + 数据批次 + 四张 KPI 卡」
   占掉首屏。标题、日期与四项计数压成两行，信号列表直接进入视野。
   KPI 的 DOM 结构保留（.kpi-wrap > .statrow.n4 > .tile），只改变呈现：
   四张卡变成一行「4 高优信号 · 9 近期事件 · 11 覆盖信源 · 20 传闻线索」。
   ══════════════════════════════════════════════════════════════════ */
.page-home .hero{
  /* 2026-10-26：删除 --fs-h1:var(--fs-stat)。这条局部令牌重定义本意是
     让 hero 内的 h1 变 28px，但 .hero .h1 用的是显式 clamp，从没读过它。 */
  padding-block:18px 4px;
}
.page-home .hero .sec-head{
  margin:0;
  align-items:baseline;
  gap:8px 16px;
}
.page-home .hero .h1{font-size:clamp(30px,3.2vw,40px);line-height:1.08;letter-spacing:-.03em}
.page-home .hero .sec-note{
  margin-left:auto;
  padding-bottom:0;
  font-size:12px;
  color:var(--muted);
}
.page-home .hero .hero-meta{
  margin:8px 0 0;
  font-family:var(--font-body);
  font-size:12px;
  line-height:1.5;
  color:var(--muted);
}
.page-home .hero .hero-meta b{
  font-family:var(--font-mono);
  font-weight:600;
  color:var(--fg-soft);
}
.page-home .hero .statrow,
.page-home .hero .statrow.n4{
  display:flex;
  flex-wrap:wrap;
  gap:0;
  border:0;
}
.page-home .hero .tile,
.page-home .hero .tile+.tile{
  display:inline-flex;
  align-items:baseline;
  gap:4px;
  padding:0;
  border:0;
  border-radius:0;
  background:transparent;
}
.page-home .hero .tile+.tile::before{
  content:"·";
  margin:0 9px 0 2px;
  color:var(--border);
}
.page-home .hero .tile .v{
  font-family:var(--font-mono);
  font-size:var(--fs-stat);  /* 2026-10-26：原写死 14px，覆盖收敛的 28px */
  font-weight:600;
  line-height:1;
  letter-spacing:0;
  color:var(--accent);
}
.page-home .hero .tile .k{
  margin:0;
  font-size:var(--fs-micro);
  line-height:1.2;
  color:var(--muted);
}
.page-home .hero .tile .s{display:none}

@media (max-width:920px){
  .page-home .hero{padding-block:22px 4px}
  .page-home .hero .h1{font-size:var(--fs-stat)}
  .page-home .hero .sec-note{margin-left:0;padding-bottom:0}
}

/* 首页头图整块不再占版面（2026-10-20）：视觉上从高优信号直接开始，
   h1 与计数仍留给屏幕阅读器与 SEO，不改变文档语义。 */
.sec-sr{
  position:absolute;
  width:1px;
  height:1px;
  margin:-1px;
  padding:0;
  border:0;
  overflow:hidden;
  clip:rect(0 0 0 0);
  clip-path:inset(50%);
  white-space:nowrap;
}

/* 移动端两轴筛选：横向滚动一行，避免 14 个赛道 chip 折成五屏。 */
@media (max-width:720px){
  .filter-row{
    flex-wrap:nowrap;
    overflow-x:auto;
    overscroll-behavior-x:contain;
    scrollbar-width:none;
    padding-bottom:11px;
  }
  .filter-row::-webkit-scrollbar{display:none}
  .filter-row>.flabel{
    position:sticky;
    left:0;
    z-index:1;
    flex:0 0 auto;
    padding-right:7px;
    background:var(--bg);
  }
  .filter-row>.filter-note{display:none}
  .filter-row>.fchip{flex:0 0 auto;white-space:nowrap}
}

/* ── 2026-10-21 审计修复 ─────────────────────────────────────────── */
.datebar{margin-top:8px}
.datebar .sec-label{font-size:12px;color:var(--muted);font-family:var(--font-body)}
@media (max-width:720px){
  .fchip,.dchip,.track-cloud .chip,.arch-row .dchip{
    min-height:44px;
    display:inline-flex;
    align-items:center;
    padding-inline:12px;
  }
  .filter-row>.fchip{flex:0 0 auto;white-space:nowrap}
  /* 卡片里的外链 chip 也是主要操作（代表原文 / 信源 / 实体），不能只有 32px。 */
  a.tag{
    min-height:44px;
    display:inline-flex;
    align-items:center;
  }
  .sec-link,.btn-read-all{
    min-height:44px;
    display:inline-flex;
    align-items:center;
  }
}
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    scroll-behavior:auto !important;
    transition:none !important;
    animation:none !important;
  }
}

/* ── 板块扩到 7 个后（2026-10-21）：二级导航窄屏横向滚动，避免撑破布局 ── */
@media (max-width: 860px){
  .sec-nav{ overflow-x:auto; scrollbar-width:none; gap:14px; }
  .sec-nav::-webkit-scrollbar{ display:none; }
  .sec-nav a{ white-space:nowrap; }
}


/* ══════════════════════════════════════════════════════════════════
   来源署名收敛 + 来源弹窗（2026-10-22）
   —— 列表与高优卡只保留一个来源入口：头像 + 货源名 + 计数，点击展开
   完整来源列表。原先同一批来源在「多源交叉报道」徽章、署名行、行尾
   「代表原文」各写一遍，读者要在三处之间拼信息。
   ══════════════════════════════════════════════════════════════════ */
.src-control{
  display:inline-flex;
  align-items:center;
  gap:6px;
  max-width:100%;
  min-height:28px;
  margin:-4px 0 -4px -4px;
  padding:2px 6px 2px 4px;
  border-radius:7px;
  font-family:var(--font-body);
  line-height:1.35;
  color:var(--muted);
  text-decoration:none;
}
.src-control:hover{ background:var(--sunken); color:var(--fg); }
.src-control:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
.src-control.src-static{ cursor:default; }
.src-control.src-static:hover{ background:transparent; color:var(--muted); }
.src-control .src-avas{ display:inline-flex; align-items:center; flex:none; }
.src-control .src-ava{ width:22px; height:22px; font-size:11px; margin-right:0; }
/* 2026-10-26：这里原来写 18px，**优先级高于 .src-ava 的 20px**，
   列表行里实际生效的是 18px —— 之前的「放大到 20px」根本没作用到这一处。
   10px 中文塞进 18px 圆是溢出的根源。.src-item 里的 22px 才是正确尺寸。 */
.src-control .src-ava + .src-ava{ margin-left:-6px; box-shadow:0 0 0 2px var(--surface); }
.src-control .src-names{
  max-width:14em;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  font-size:12px;
  font-weight:500;
  color:var(--fg);
}
.src-control .src-count{ font-size:12px; color:var(--muted); white-space:nowrap; }
.src-control .src-chev{ width:14px; height:14px; flex:none; color:var(--muted); }
.src-control:hover .src-count,
.src-control:hover .src-chev{ color:var(--fg); }
.must-src .src-control{ margin-left:-4px; }

/* 详情页来源行：来源名可点，域名补充可信度；行内不再生成「·」分隔点。 */
.hl-meta .src-name{
  font-size:12px;
  font-weight:600;
  color:var(--fg);
  text-decoration:none;
}
.hl-meta .src-name:hover{ color:var(--accent-ink); text-decoration:underline; text-underline-offset:3px; }
.src-meta .src-domain{ font-size:12px; color:var(--muted); }
.src-meta > *:not(:first-child)::before{ content:none; margin:0; }

/* ── 弹窗 ─────────────────────────────────────────────────────── */
.src-dialog{
  width:min(680px, calc(100vw - 32px));
  max-height:min(78vh, 720px);
  padding:0;
  border:1px solid var(--border);
  border-radius:16px;
  background:var(--surface);
  color:var(--fg);
  box-shadow:0 30px 90px rgba(15,23,42,.25);
}
.src-dialog:focus{ outline:none; }
.src-dialog::backdrop{ background:rgba(10,14,22,.42); backdrop-filter:blur(2px); }
.src-dialog-head{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:20px;
  padding:20px 22px;
  border-bottom:1px solid var(--border);
}
.src-dialog-kicker{
  font-family:var(--font-mono);
  font-size:10px;
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--muted);
}
.src-dialog-title{ margin-top:4px; font-size:20px; line-height:1.4; letter-spacing:-.01em; }
.src-dialog-meta{ margin-top:4px; font-size:12px; color:var(--muted); }
.src-dialog-close{
  flex:none;
  min-height:36px;
  padding:0 12px;
  border:1px solid var(--border);
  border-radius:8px;
  background:var(--surface);
  color:var(--muted);
  font-size:12px;
  cursor:pointer;
}
.src-dialog-close:hover{ color:var(--fg); border-color:var(--line-strong); }
.src-dialog-close:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
.src-dialog-list{ max-height:calc(78vh - 108px); overflow:auto; padding:6px 10px 12px; }
.src-item{
  display:grid;
  grid-template-columns:22px minmax(0,1fr);
  gap:10px;
  align-items:center;
  padding:12px 10px;
  border-bottom:1px solid var(--border);
}
.src-item:last-child{ border-bottom:0; }
.src-item .src-ava{ width:22px; height:22px; font-size:10px; margin:0; }
.src-top{ display:flex; align-items:baseline; flex-wrap:wrap; gap:6px; }
.src-name{ font-size:12px; font-weight:600; color:var(--fg); text-decoration:none; }
.src-name:hover{ color:var(--accent-ink); text-decoration:underline; text-underline-offset:3px; }
.src-domain{ font-size:12px; color:var(--muted); }
.src-date{ margin-left:auto; font-family:var(--font-mono); font-size:10px; color:var(--muted); }
.src-title{
  display:block;
  margin-top:3px;
  font-size:12px;
  line-height:1.55;
  color:var(--fg);
  text-decoration:none;
}
.src-title:hover{ color:var(--accent-ink); text-decoration:underline; text-underline-offset:3px; }
.src-title .src-arrow{ display:inline-block; margin-left:3px; font-size:10px; color:var(--muted); }
.src-fallback{ display:block; padding:18px 10px; font-size:12px; color:var(--accent-ink); text-decoration:none; }
.src-fallback:hover{ text-decoration:underline; }

@media (max-width:640px){
  .src-control{ min-height:32px; }
  .src-control .src-names{ max-width:9.5em; }
  .src-dialog{
    width:100%;
    max-width:100%;
    max-height:88vh;
    border-radius:16px 16px 0 0;
    margin:auto 0 0;
  }
  .src-dialog-list{ max-height:calc(88vh - 108px); }
}

/* ── 2026-10-22 视觉审计修复 ─────────────────────────────────────── */
/* P1-1 首页右栏：桌面端随左栏滚动固定，消除侧栏见底后的整列空白 */
@media (min-width:1041px){
  .grid-home-side{ position:sticky; top:calc(var(--topbar-h) + 16px); }
}
/* P1-2 分布条：轨道用浅色边线而不是深色块，填充用强调蓝（原朱红暗示地域） */
.bar{ max-width:420px; }
.bar u{ background:var(--border); }
.bar u i{ background:var(--accent); }
.bar span{ width:auto; min-width:2.5em; font-variant-numeric:tabular-nums; }
/* P1-3 频道页赛道卡片：4 卡铺成 2×2，5 卡铺成 3+2（后两张各占半行），
   不再固定 3 列把最后一张孤零零留在左侧。6 列网格让三种数量都能整除。 */
.grid-3{ grid-template-columns:repeat(6,minmax(0,1fr)); }
.grid-3>*{ grid-column:span 2; }
.grid-3:has(> :nth-child(4):last-child)>*{ grid-column:span 3; }
.grid-3:has(> :nth-child(5):last-child)>*:nth-child(n+4){ grid-column:span 3; }
@media (max-width:1040px){
  .grid-3>*{ grid-column:span 3; }
  .grid-3:has(> :nth-child(5):last-child)>*:last-child{ grid-column:span 6; }
}
@media (max-width:640px){
  .grid-3>*,
  .grid-3:has(> :nth-child(4):last-child)>*,
  .grid-3:has(> :nth-child(5):last-child)>*,
  .grid-3:has(> :nth-child(5):last-child)>*:last-child{ grid-column:span 6; }
}
/* P1-4 移动端横向筛选：给可滑动提示 + 右侧渐隐，不再静默裁切 */
.sec-filter-note{ display:none; }
@media (max-width:720px){
  .sec-filter-note{
    display:block;
    margin:2px 0 4px;
    font-size:var(--fs-micro);
    color:var(--muted);
  }
  .filter-row{
    -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent);
    mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent);
  }
}
/* P2-9 移动端触控目标：来源入口/弹窗关闭/返回链接至少 44px */
@media (max-width:768px){
  .src-control{ min-height:44px; padding-block:6px; }
  .src-dialog-close{ width:44px; height:44px; }
  .sec-note a,
  .hl-title a{
    display:inline-block;
    padding-block:10px;
    margin-block:-10px;
  }
}
/* P2-10 404：给搜索与回退入口，而不是一片空白 */
.sec-notfound-lead{ margin:10px 0 18px; color:var(--muted); font-size:var(--fs-body); }
.sec-notfound-links{ display:flex; flex-wrap:wrap; gap:10px; margin-top:20px; }
.sec-notfound-links a{
  padding:8px 14px;
  border:1px solid var(--border);
  border-radius:999px;
  font-size:var(--fs-meta);
  color:var(--fg);
  background:var(--surface);
  text-decoration:none;
}
.sec-notfound-links a:hover{ border-color:var(--line-strong); }
/* P2-11 图标文件里混入 HTML/XML 时，渲染层回退字母头像（见 _icon_map） */

/* 2026-10-28：分类树相关样式（`.filter-group` / `.filter-tree` /
   `.filter-branch`）已删 —— 首页筛选器改成平铺 3 行，与频道页同构。 */


/* 筛选 chip 的可读计数：用 data-n 渲染，避免把数字写进链接文字 */
.fchip[data-n]::after{
  content: attr(data-n);
  margin-left: 5px;
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 400;
  font-variant-numeric: tabular-nums;
  color: var(--muted);
}
.fchip.on[data-n]::after{ color: var(--accent-ink); }

/* 2026-10-28：`.grid-home-side` 整块已删 —— 首页不再有右栏
   （筛选器移到列表上方，两栏布局取消）。连带删掉的死样式：
   .grid-home-side .filter-drawer / .filter-group-summary /
   .filter-group-title 及其移动端覆盖。
   保留下来的共用规则：.fchip 基础、.filter-note、.flabel。 */
.filter-note{ font-weight:400; }
.fchip{ text-decoration:none; }
.fchip:hover{ text-decoration:none; }

@media (max-width:720px){
  /* 移动端筛选密度：44px 触控高度留给正文操作，筛选 chip 收到 34px */
  #type-row .fchip{
    min-height:34px;
    padding:4px 9px;
    border-color:var(--border);
    background:var(--surface);
  }
}

/* 2026-10-24 分页器：状态单独一行，页码按钮一行不换行；页数多时横向滚动 */
.hl-page-buttons{
  display:flex;
  flex-wrap:nowrap;
  align-items:center;
  justify-content:center;
  gap:8px;
  max-width:100%;
  overflow-x:auto;
  scrollbar-width:none;
  padding:2px 0;
}
.hl-page-buttons::-webkit-scrollbar{display:none}
.hl-page{flex:0 0 auto;white-space:nowrap}
.hl-page-ellipsis{
  flex:0 0 auto;
  min-width:18px;
  text-align:center;
  color:var(--muted);
  font-size:var(--fs-meta);
  user-select:none;
}
@media (max-width:640px){
  .hl-page-buttons{gap:5px}
  .hl-page{min-width:31px;padding:0 7px}
}

/* 2026-10-24 传闻详情时间线：按发布时间排序，显示来源、日期与核对层级 */
.hl-timeline{display:grid;gap:12px;margin-top:8px}
.hl-timeline-item{display:grid;grid-template-columns:88px 1fr;gap:12px;align-items:start;padding:10px 0;border-bottom:1px solid var(--line)}
.hl-timeline-item:last-child{border-bottom:0;padding-bottom:0}
.hl-timeline-date{font-size:12px;font-weight:600;color:var(--muted);font-variant-numeric:tabular-nums;padding-top:2px;white-space:nowrap}
.hl-timeline-body{min-width:0}
.hl-timeline-source{font-size:12px;font-weight:600;color:var(--accent-ink);margin-bottom:2px}
.hl-timeline-title{font-size:15px;font-weight:600;line-height:1.35}
.hl-timeline-title a{color:var(--fg);text-decoration:none}
.hl-timeline-title a:hover{text-decoration:underline;text-underline-offset:2px}
.hl-timeline-summary{margin:4px 0 0;font-size:13px;color:var(--muted);line-height:1.55}
/* 2026-10-24 坐实证据：显示「是哪条报道坐实的」，不再只是一个状态字 */
.hl-evidence{
  margin:6px 0 10px;padding:8px 10px;font-size:13px;line-height:1.5;
  border-left:3px solid var(--accent);background:var(--accent-soft);
  border-radius:0 6px 6px 0;color:var(--fg)
}
.hl-evidence a{color:inherit;text-decoration:underline;text-underline-offset:2px}
.hl-evidence .meta{color:var(--muted)}
/* 2026-11-04 传闻阶段进度条（爆料→跟进→官方回应→印证→结论）：已完成步骤高亮 */
.rumor-steps-wrap{display:flex;align-items:center;gap:10px;margin:8px 0 4px;flex-wrap:wrap}
.rumor-steps{display:flex;align-items:flex-start;flex:1;min-width:0}
.rumor-step{display:flex;flex-direction:column;align-items:center;gap:4px;flex:0 0 auto}
.rumor-step-dot{width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;line-height:1;border:2px solid var(--line);background:var(--bg-sub,#fff);color:var(--muted)}
.rumor-step-label{font-size:11px;color:var(--muted);white-space:nowrap}
.rumor-step-line{flex:1 1 auto;height:2px;min-width:10px;background:var(--line);margin:11px 2px 0}
.rumor-step.is-done .rumor-step-dot{background:var(--accent);border-color:var(--accent);color:#fff}
.rumor-step.is-done .rumor-step-label{color:var(--fg);font-weight:600}
.rumor-step.is-current .rumor-step-dot{background:var(--accent-soft);border-color:var(--accent);color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.rumor-step.is-current .rumor-step-label{color:var(--accent);font-weight:700}
.rumor-step-line.is-done{background:var(--accent)}
.rumor-verdict{font-size:12px;font-weight:700;color:var(--accent);padding:2px 10px;border:1px solid var(--accent);border-radius:999px;white-space:nowrap}
/* 2026-11-04 /landscape 传闻区按阶段分组（早期/跟进中/已证实/已辟谣） */
.rumor-groups{display:grid;gap:14px}
.rumor-group-head{display:flex;align-items:center;gap:8px;margin:2px 0 6px;padding-bottom:6px;border-bottom:1px solid var(--line)}
.rumor-group-label{font-size:12px;font-weight:700;letter-spacing:.04em;color:var(--muted)}
.rumor-group.is-confirmed .rumor-group-label{color:var(--accent)}
.rumor-group.is-refuted .rumor-group-label{color:var(--muted)}
.rumor-group.is-early .rumor-group-label{color:var(--muted)}
.rumor-group.is-following .rumor-group-label{color:var(--theme)}
.rumor-step.is-pending .rumor-step-dot{border-color:var(--line);color:var(--muted)}
.rumor-step-line.is-pending{background:var(--line)}
.rumor-group-count{font-size:11px;color:var(--muted);background:var(--bg-sub,rgba(0,0,0,.04));border-radius:999px;padding:1px 8px}
@media (max-width:640px){
  .hl-timeline-item{grid-template-columns:1fr;gap:4px;padding:12px 0}
  .hl-timeline-date{font-size:13px;color:var(--fg)}
  .rumor-steps-wrap{flex-direction:column;align-items:stretch;gap:6px}
  .rumor-step-label{font-size:10px}
  .rumor-step-dot{width:19px;height:19px;font-size:10px}
  .rumor-step-line{margin-top:9px}
}

/* 2026-10-24 传闻详情时间线：摘要最多 3 行，避免移动端单条过高 */
.hl-timeline-summary{
  display:-webkit-box;
  -webkit-line-clamp:3;
  -webkit-box-orient:vertical;
  overflow:hidden;
}

/* ── 2026-10-25 赛道分布条形图 ────────────────────────────────────────────
   替代原来的 5 张「每卡 3 条标题」卡片：那些标题和下方事件列表是同一批内容，
   读者滚一遍会看成重复；5 张卡占 900px 只给 15 个标题。条形图直接表达板块
   内部的量级结构，不复制列表内容。
   用 <a> 做整行，点任意位置都进筛选（含「未归类」那一行）。 */
.bar-list{display:flex;flex-direction:column;gap:2px}
.bar-row{
  display:grid;grid-template-columns:minmax(88px,152px) 1fr minmax(38px,auto);
  align-items:center;gap:12px;padding:9px 8px;border-radius:8px;
  text-decoration:none;color:inherit;min-height:40px;
  transition:background .12s ease;
}
.bar-row:hover{background:var(--sunken)}
.bar-row:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.bar-name{
  font-size:var(--fs-meta);color:var(--fg);line-height:1.35;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.bar-track{
  position:relative;height:8px;border-radius:4px;
  background:var(--sunken);overflow:hidden;
}
.bar-fill{
  display:block;height:100%;border-radius:4px;
  background:var(--accent);opacity:.75;
}
.bar-row:hover .bar-fill{opacity:1}
.bar-num{
  font-size:var(--fs-meta);color:var(--muted);text-align:right;
  font-variant-numeric:tabular-nums;
}
/* 未归类：虚线 + 灰色，视觉上和「真赛道」区分开 */
.bar-row[href*="track=other"] .bar-fill{background:var(--muted);opacity:.45}
.bar-row[href*="track=other"] .bar-name{color:var(--muted)}

@media (max-width:640px){
  /* 移动端把名称压窄、条变短，数字仍然贴右，保证一行放得下不换行 */
  .bar-row{grid-template-columns:minmax(72px,104px) 1fr 34px;gap:8px;padding:10px 4px}
  .bar-track{height:7px}
}
@media (prefers-reduced-motion: reduce){
  .bar-row{transition:none}
}


/* ── 排序切换（2026-10-26）─────────────────────────────────────────
   频道页事件列表头的「最新 / 热度」两个 chip。
   用户反馈 signal 没起作用，根源是排序写死 time；这里给出显式入口。
   与筛选 chip 复用 .chip 外观，只补容器布局。 */
.sort-switch{
  display:inline-flex;
  gap:6px;
  margin-left:auto;
  margin-right:8px;
}
.sort-switch .chip{
  padding:3px 10px;
  font-size:12px;
  min-height:24px;
}
@media (max-width:640px){
  .sort-switch{margin-left:0;margin-right:0}
}

/* ══ 2026-10-26 列表行视觉适配 ══════════════════════════════════════
   实测（Chromium 1280px 视口，频道页）：
     row 173px 高 · .src-ava 18×18 · .tag 高 22 · .hl-meta 标签 12px

   三个具体问题：
   1. 圆圈图标偏小：20px 圆装 12px 中文，注释里早就写过"12px 中文在 20px 圆里
      占到 25px"—— 当时只改成 inline-grid 居中，没动尺寸。
   2. 标签圆角不一致：.hl-meta 里的 .tag 被 v2 覆盖成胶囊(999px)，
      但 .src-line 里的仍走 v1 的矩形(var(--r)=10px)。同一行的两种标签形状不同。
   3. 行内 4 层（来源行/标题/摘要/meta）各带 margin，累计 173px 偏高。

   调整原则：不缩小正文（可读性优先），只收紧**装饰元素**和**层间距**。
   ────────────────────────────────────────────────────────────────── */

/* 2. 标签统一为胶囊，且 .src-line 里的与 .hl-meta 里的同高 */
.src-line .tag,
.hl-meta .tag{
  border-radius:999px;
  padding:2px 8px;
  /* 2026-10-26：原写死 11.5px；尺寸统一由文末单一真相源提供 */
  line-height:16px;
  min-height:20px;
}
/* 时间标签：等宽数字 + 只留必要宽度。
   2026-10-26 实测：min-width:44px 时实际渲染 72.6px ——
   因为 44 是 content-box 宽度，再叠加 padding 16px 和 border。
   改成按内容自适应 + tabular-nums（数字等宽，13:16/9:05 自然对齐），
   不再强制 min-width。 */
/* 时间标签用**等宽字体**（v1.css:745 `.hl-meta .tag.time{font-family:var(--font-mono)}`），
   所以 "13:16" 比比例字体宽 —— 这是**有意的对齐设计**，不是 bug。
   我一度想收窄它，实测只从 70.6 降到 68.6，说明宽度由字体决定而非 padding。
   这里只补 tabular-nums（数字等宽，防 9:05/13:16 抖动），padding 保持默认。 */
.hl-meta .tag.time{
  justify-content:center;
  font-variant-numeric:tabular-nums;
}
/* 信号分右对齐且等宽，多行时数字会成列 */
.src-line .hl-score{
  margin-left:auto;
  font-variant-numeric:tabular-nums;
  min-width:32px;
  text-align:right;
}

/* 3. 层间距收紧：来源行 8→6，meta 8→6；标题与摘要之间不额外加 */
.src-line{ margin-bottom:6px; }
.hl-meta{ margin-top:6px; gap:6px 8px; }
.hl-so{ margin-top:4px; }

/* 4. 负边距扩大点击热区保留，但把视觉间距补回来 */
.src-control{ margin-block:-3px; }

@media (max-width:640px){
  .src-ava{ width:20px; height:20px; font-size:10.5px; }
  .src-control .src-ava{ width:20px; height:20px; font-size:10.5px; }
  .src-line .tag, .hl-meta .tag{ font-size:11px; padding:2px 7px; }
}

/* sub 标签是**独立一行**（实体名，不属于筛选元数据）——
   语义上不该混进 .hl-meta 的赛道/类型/时间里，但间距要收紧，
   否则一个 Apple 标签独占一行会浪费 30px 高度。 */
.hl-row > .tag.sub{
  margin-top:4px;
  margin-bottom:0;
}
.hl-row > .tag.sub + .hl-meta{
  margin-top:4px;
}


/* ══════════════════════════════════════════════════════════════════
   事件类型：纯文字，不是胶囊（2026-10-26）
   ──────────────────────────────────────────────────────────────────
   原来用 .tag 胶囊，与相邻的赛道胶囊同权重，一行里两个胶囊抢注意力。
   但事件类型不是筛选轴的主入口（赛道才是），且 40% 数据是「未分类」
   （已改为不渲染）。所以这里只给最小字重/颜色，用 · 与前后分隔。

   为什么不用 .tag 而另起 .et：.tag 有 border+background+padding，
   是"可点/可扫读的独立单元"语义。事件类型只是标题的补充说明，
   视觉上不该有边界。
   ══════════════════════════════════════════════════════════════════ */
.et-type{ color:var(--muted); font-size:var(--fs-micro); letter-spacing:.02em; }
.et-type::before{ content:"·"; margin:0 6px 0 2px; opacity:.55; }

/* 传闻立场 / 来源权威：原来写了 data-* 但 0 条 CSS，
   属性形同摆设（653 个 data-event-type 就是这样白写的）。
   这里补最小区分：立场用 rumor 色系，权威用 4 级灰阶。 */
.tag[data-stance="support"]{ color:var(--rumor);
  border-color:color-mix(in oklch, var(--rumor) 40%, var(--border)); }
.tag[data-stance="verify"]{ color:var(--accent-ink);
  border-color:color-mix(in oklch, var(--accent-ink) 40%, var(--border)); }
.tag[data-authority="官方"]{ color:var(--ok);
  border-color:color-mix(in oklch, var(--ok) 45%, var(--border)); }
.tag[data-authority="媒体"]{ color:var(--accent-ink); }
.tag[data-authority="社区"]{ color:var(--muted); }
.tag[data-authority="其他"]{ color:var(--muted); opacity:.75; }


/* ══════════════════════════════════════════════════════════════════
   标签尺寸单一真相源（2026-10-26）
   ──────────────────────────────────────────────────────────────────
   背景：`.tag` 的尺寸规则此前分散在 5 处 —— v1.css 的 base（padding
   3px 9px，无 line-height）、v2 的 `.src-line .tag`、`.hl-meta .tag`、
   `.src-line .tag, .hl-meta .tag`（min-height:20px）、以及 `.tag.sub`
   的 height:20px 补丁。数值互相覆盖，改一处会被另一处盖掉。

   实测（headless Chrome，真实 CSS）：所有标签当前都是 20px 高，
   但那是**有人手动对齐过**的结果，不是规则保证的：
     - `.tag.sub` 用 height:20px  → 长文字换行时被截断（文字溢出）
     - 其它用 min-height:20px     → 能正常撑高
   同一个视觉组件不该有两种行为。

   现在统一到下面这一条。用 `min-height` 而非 `height`：标签文案长度
   不可控（实体名可能很长），宁可撑高也不能截断。

   放在文件末尾是为了赢过上面所有特异性相同的选择器（同权重时后写者胜）。
   ══════════════════════════════════════════════════════════════════ */
.tag,
.src-line .tag,
.hl-meta .tag,
.tag.sub{
  box-sizing:border-box;
  width:auto;
  max-width:180px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  min-height:20px;
  padding:2px 8px;
  /* 用令牌而非裸 px：v1 的 --fs-micro 是 11.5px，v2 重指为 12px。
     写死 11.5 会绕过收敛（实测一页曾渲染出 14 种字号，这个区块是修法）。 */
  font-size:var(--fs-micro);
  line-height:16px;
  border-radius:999px;
  letter-spacing:.02em;
}
/* 实体名（.tag.sub）：Primary Chip 强化，全站统一 999px 胶囊 + accent 柔底 + 细边框与悬浮反馈 */
.tag.sub{
  background:var(--accent-soft);
  color:var(--accent-ink);
  border:1px solid color-mix(in oklch, var(--accent) 26%, transparent);
  border-radius:999px;
  font-weight:600;
  text-decoration:none;
  transition:background .12s ease, border-color .12s ease, color .12s ease;
}
a.tag.sub:hover{
  background:var(--accent);
  color:var(--accent-fg);
  border-color:var(--accent);
}

/* ══════════════════════════════════════════════════════════════════
   2026-10-28 板块洞察页
   定位变化：频道页从「事件列表」改成「这个板块最近怎么样」。
   三个模块：摘要 / 活跃主题 / 主题脉络。
   刻意不做数字看板和趋势图 —— 事件量说明不了行业好坏，
   15 天数据也画不出可信趋势（见 services/board/insight_view.py）。
   ══════════════════════════════════════════════════════════════════ */

.insight-lede{
  margin:4px 0 2px;
  font-size:var(--fs-body);
  line-height:1.72;
  color:var(--fg);
  max-width:62em;
}

.insight-list{
  list-style:none;
  margin:2px 0 0;
  padding:0;
  display:grid;
  gap:2px;
}

/* 活跃主题：名字 / 类型 / 事件数 一行，数字右对齐 */
.insight-ent{
  display:flex;
  align-items:baseline;
  gap:10px;
  padding:7px 0;
  border-bottom:1px solid var(--border);
}
.insight-ent:last-child{border-bottom:0}
.insight-ent-name{
  font-size:var(--fs-body);
  font-weight:600;
  color:var(--fg);
  min-width:0;
  overflow-wrap:anywhere;
}
.insight-ent-type{
  flex:0 0 auto;
  font-size:var(--fs-micro);
  color:var(--muted);
  padding:1px 7px;
  border-radius:999px;
  background:var(--sunken);
}
.insight-ent-n{
  margin-left:auto;
  flex:0 0 auto;
  font-size:var(--fs-meta);
  color:var(--muted);
}

/* 主题脉络：标题行 + 最新一篇的标题 */
.insight-thread{
  padding:9px 0;
  border-bottom:1px solid var(--border);
}
.insight-thread:last-child{border-bottom:0}
.insight-thread-head{
  display:flex;
  align-items:baseline;
  gap:10px;
}
.insight-thread-name{
  font-size:var(--fs-body);
  font-weight:600;
  color:var(--fg);
  min-width:0;
  overflow-wrap:anywhere;
}
.insight-thread-meta{
  margin-left:auto;
  flex:0 0 auto;
  font-size:var(--fs-micro);
  color:var(--muted);
  white-space:nowrap;
}
.insight-thread-latest{
  margin:3px 0 0;
  font-size:var(--fs-meta);
  line-height:1.6;
  color:var(--muted);
  overflow-wrap:anywhere;
}

.insight-more{
  margin:2px 0 0;
  font-size:var(--fs-meta);
  color:var(--muted);
  line-height:1.7;
}
.insight-more .sec-link{margin-left:6px}

@media (max-width:720px){
  .insight-ent,.insight-thread-head{flex-wrap:wrap;gap:6px}
  .insight-ent-n,.insight-thread-meta{margin-left:0}
}

/* ── 产业 / 技术分面 chips（2026-11-02 步 5）─────────────────────────
   这两个是**新维度**，不是 track 的替代：
     track   = 细分类（手机/平板、智驾…）
     industry = 它的粗粒度聚合（消费电子、汽车…）
     tech    = 正交属性（AI、半导体…），可横切所有产业

   视觉意图：产业是「归属」，给稍重字重；技术是「属性」，给更淡的色。
   都沿用 hl-meta 的「去药丸化」——不加底色/边框，与同排其它标签一致。
   只修饰已有 .tag，不新增类名前缀，符合本层白名单。 */
/* ── 标签体系视觉层级打磨（2026-11-03 严格保持主站素雅基调）──
   完全复用主站原生设计令牌（--sunken / --surface / --border / --accent / --muted）
   杜绝生硬杂色与深黑补丁块，实现科技情报终端的高级克制感 */
.hl-meta{ gap:6px 8px; }

/* 1. 时效锚点：纯净时间戳，居左紧凑对齐，消除隐形空边距 */
.hl-meta .tag.time{
  font-family:var(--font-mono);
  color:var(--muted);
  background:transparent;
  border:0;
  padding:0 6px 0 0;
  min-height:unset;
  font-size:var(--fs-micro);
  letter-spacing:.02em;
}

/* 2. 赛道与形态徽章：底色统一收拢至主站 --sunken 极浅冷白灰，文字低饱和微呼应 */
.hl-meta .tag[data-track]{
  background:var(--sunken);
  border:1px solid var(--border);
  color:var(--muted);
  font-weight:500;
}
.hl-meta .tag[data-track="blue"]{ color:var(--geo-us); }
.hl-meta .tag[data-track="amber"]{ color:var(--warn); }
.hl-meta .tag[data-track="teal"]{ color:var(--geo-sea); }
.hl-meta .tag[data-track="slate"]{ color:var(--muted); }

.hl-meta .tag.type{
  color:var(--muted);
  background:var(--sunken);
  border:1px solid var(--border);
  font-weight:500;
}

/* 3. 核心实体主角：承接主站品牌蓝（--accent-soft / --accent-ink），一目了然的主角地位 */
.tag.sub{
  background:var(--accent-soft);
  color:var(--accent-ink);
  border:1px solid color-mix(in oklch, var(--accent) 24%, var(--border));
  border-radius:999px;
  font-weight:600;
  text-decoration:none;
  transition:background .12s ease, border-color .12s ease;
}
a.tag.sub:hover{
  background:var(--accent);
  color:var(--accent-fg);
  border-color:var(--accent);
}

/* 4. 产业与技术分面：统一使用主站克制底色，彻底消灭黑胶布感 */
.hl-meta .tag.ind{
  color:var(--muted);
  background:var(--sunken);
  border:1px solid var(--border);
  font-weight:500;
}
.hl-meta .tag.tech{
  color:var(--muted);
  background:transparent;
  border:0;
  padding:0 2px;
  min-height:unset;
}
.hl-meta .tag.tech::before{
  content:"·";
  margin-right:4px;
  color:var(--border);
  font-weight:700;
}

/* 5. 事实度与证据信度标签：温和融入主站语义令牌 */
.hl-meta .tag.rumor{
  color:var(--rumor);
  background:color-mix(in oklch, var(--rumor) 6%, var(--surface));
  border:1px solid color-mix(in oklch, var(--rumor) 30%, var(--border));
  font-weight:600;
}
.hl-meta .tag.src{
  color:var(--accent-ink);
  background:var(--accent-soft);
  border:1px solid color-mix(in oklch, var(--accent) 30%, var(--border));
  font-weight:500;
}
.hl-meta .tag.fresh{
  color:var(--ok);
  background:color-mix(in oklch, var(--ok) 6%, var(--surface));
  border:1px solid color-mix(in oklch, var(--ok) 30%, var(--border));
  font-weight:600;
}
.hl-meta .tag.price{
  color:var(--accent-ink);
  background:color-mix(in oklch, var(--accent) 8%, var(--surface));
  border:1px solid color-mix(in oklch, var(--accent) 26%, var(--border));
  font-weight:600;
  font-family:var(--font-mono, monospace);
  letter-spacing:0;
}

/* 6. 消除 .hl-meta > *:not(:first-child)::before 注入到独立药丸标签内的分隔点与左侧多余留白 */
.hl-meta > .tag:not(.tech)::before{
  content:none !important;
  margin:0 !important;
  display:none !important;
}

/* ── 行业图谱 /landscape 专属结构与微组件 ── */
.sec-pills{
  display:flex;
  gap:8px;
  flex-wrap:wrap;
  margin:12px 0 20px;
}
.sec-pill{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:6px 14px;
  border-radius:999px;
  font-size:14px;
  font-weight:500;
  color:var(--muted);
  background:var(--bg-soft, #f4f5f8);
  text-decoration:none;
  border:1px solid transparent;
  transition:all 0.15s ease;
}
.sec-pill:hover{
  color:var(--fg);
  border-color:var(--line);
}
.sec-pill.on{
  color:var(--accent-ink);
  background:var(--accent-soft, #edf2ff);
  border-color:var(--accent);
  font-weight:600;
}
.sec-pill .num{
  font-size:12px;
  opacity:0.8;
}
.sec-grid-two{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:16px;
  margin-bottom:20px;
}
@media (max-width:768px){
  .sec-grid-two{
    grid-template-columns:1fr;
  }
  .sec-pills{
    gap:6px;
    margin:8px 0 16px;
  }
  .sec-pill{
    padding:4px 10px;
    font-size:13px;
  }
  .sec-bar-label{
    width:70px;
    font-size:12px;
  }
  .sec-bar-num{
    width:32px;
    font-size:11px;
  }
}
.sec-card{
  background:var(--bg);
  border:1px solid var(--line);
  border-radius:8px;
  padding:16px;
}
.sec-card-title{
  font-size:14px;
  font-weight:600;
  color:var(--fg);
  margin-bottom:12px;
  display:flex;
  align-items:center;
  justify-content:space-between;
}
.sec-bar-item{
  display:flex;
  align-items:center;
  gap:8px;
  font-size:13px;
  margin-bottom:8px;
  text-decoration:none;
  color:inherit;
  border-radius:4px;
  padding:2px 4px;
  margin-left:-4px;
  transition:background .15s ease;
}
.sec-bar-item:hover{
  background:var(--bg-soft, #f4f5f8);
}
.sec-bar-item:hover .sec-bar-label{
  color:var(--accent);
}
.sec-bar-label{
  width:80px;
  color:var(--muted);
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
.sec-bar-track{
  flex:1;
  height:8px;
  background:var(--bg-soft, #f4f5f8);
  border-radius:4px;
  overflow:hidden;
}
.sec-bar-fill{
  height:100%;
  background:var(--accent);
  border-radius:4px;
}
.sec-bar-num{
  width:40px;
  text-align:right;
  font-variant-numeric:tabular-nums;
  font-weight:600;
  font-size:12px;
  color:var(--fg);
}

/* ── 搜索探索推荐与主体档案卡 ── */
.sec-explore{
  margin-top:20px;
}
.sec-explore-title{
  font-size:13px;
  font-weight:600;
  color:var(--muted);
  margin-bottom:10px;
}
.sec-explore-chips{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin-bottom:16px;
}
.sec-explore-chips .dchip{
  text-decoration:none;
}
.sec-stat-row{
  display:flex;
  flex-wrap:wrap;
  gap:16px;
  margin:12px 0 16px;
  padding:12px 16px;
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r);
}
.sec-stat-item{
  display:flex;
  align-items:center;
  gap:6px;
  font-size:13px;
  color:var(--muted);
}
.sec-stat-item b{
  color:var(--fg);
  font-weight:600;
}

/* ── 行业图谱细分赛道子导航 ── */
.sec-tracks{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin:10px 0 16px;
  align-items:center;
}
.sec-tracks .dchip{
  text-decoration:none;
}

/* ── M10 运营台公共组件与二级导航 ── */
.ops-header-bar{
  display:flex;
  justify-content:space-between;
  align-items:center;
  gap:12px;
  padding:8px 0 12px;
  margin-bottom:12px;
  border-bottom:1px solid var(--border);
  font-size:13px;
}
.ops-breadcrumb{
  display:flex;
  align-items:center;
  gap:6px;
  color:var(--muted);
  flex-wrap:wrap;
}
.ops-crumb-link{
  color:var(--muted);
  text-decoration:none;
  transition:color .15s ease;
}
.ops-crumb-link:hover{
  color:var(--fg);
  text-decoration:underline;
}
.ops-crumb-sep{
  color:var(--line-strong);
  user-select:none;
}
.ops-crumb-current{
  color:var(--fg);
  font-weight:600;
}
.ops-exit-link{
  display:inline-flex;
  align-items:center;
  color:var(--muted);
  text-decoration:none;
  font-size:12px;
  padding:3px 10px;
  border-radius:var(--r);
  border:1px solid var(--border);
  background:var(--surface);
  white-space:nowrap;
  transition:all .15s ease;
}
.ops-exit-link:hover{
  color:var(--accent);
  border-color:var(--accent);
}
.ops-subnav{
  display:inline-flex;
  align-items:center;
  gap:4px;
  padding:4px;
  background:var(--hover);
  border-radius:8px;
  border:1px solid var(--border);
  margin:10px 0 20px;
  max-width:100%;
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
}
.ops-tab{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  padding:6px 16px;
  font-size:13px;
  font-weight:500;
  color:var(--muted);
  text-decoration:none;
  border-radius:6px;
  white-space:nowrap;
  transition:all .15s ease;
}
.ops-tab:hover:not(.on){
  color:var(--fg);
  background:rgba(0,0,0,0.03);
}
.ops-tab.on{
  background:var(--surface);
  color:var(--accent);
  font-weight:600;
  box-shadow:0 1px 3px rgba(0,0,0,0.08);
}
.ops-filters{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
  margin:10px 0 14px;
}
.ops-filter-chip{
  padding:4px 10px;
  font-size:12px;
  border-radius:12px;
  border:1px solid var(--border);
  background:var(--surface);
  color:var(--muted);
  cursor:pointer;
  transition:all .15s ease;
}
.ops-filter-chip.on{
  background:var(--accent);
  color:#fff;
  border-color:var(--accent);
}
.ops-filter-chip:hover:not(.on){
  border-color:var(--line-strong);
  color:var(--fg);
}

/* ── M10 运营台源管理 ── */
.src-manage-panel{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r);
  padding:16px 20px;
  margin-bottom:20px;
}
.src-manage-head{
  display:flex;
  justify-content:space-between;
  align-items:center;
  margin-bottom:12px;
}
.src-manage-title{
  font-size:16px;
  font-weight:600;
  color:var(--fg);
}
.src-manage-form{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(220px, 1fr));
  gap:12px 16px;
  align-items:end;
}
.src-form-item{
  display:flex;
  flex-direction:column;
  gap:4px;
}
.src-form-label{
  font-size:12px;
  font-weight:500;
  color:var(--muted);
}
.src-form-input{
  border:1px solid var(--border);
  border-radius:var(--r);
  padding:8px 10px;
  font-size:13px;
  background:var(--bg);
  color:var(--fg);
  outline:none;
}
.src-form-input:focus{
  border-color:var(--accent);
}
.src-form-select{
  border:1px solid var(--border);
  border-radius:var(--r);
  padding:8px 10px;
  font-size:13px;
  background:var(--bg);
  color:var(--fg);
}
.src-form-check{
  display:flex;
  align-items:center;
  gap:6px;
  font-size:13px;
  color:var(--fg);
  padding-bottom:8px;
}
.src-btn-submit{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-height:36px;
  padding:0 16px;
  font-size:13px;
  font-weight:500;
  background:var(--accent);
  color:#fff;
  border-radius:var(--r);
  border:none;
  cursor:pointer;
}
.src-btn-submit:hover{
  opacity:0.9;
}
.src-actions-group{
  display:flex;
  align-items:center;
  gap:8px;
  margin-left:auto;
}
.src-btn-toggle, .src-btn-edit, .src-btn-link{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-height:30px;
  padding:3px 10px;
  font-size:12px;
  border-radius:var(--r);
  border:1px solid var(--border);
  cursor:pointer;
  background:var(--surface);
  color:var(--fg);
  text-decoration:none;
}
.src-btn-toggle:hover, .src-btn-edit:hover, .src-btn-link:hover{
  border-color:var(--line-strong);
}
.src-btn-link{
  color:var(--accent);
}
.src-btn-link:hover{
  border-color:var(--accent);
  background:rgba(67,97,238,0.05);
}

/* ── M10 成本与算力看板 ── */
.sec-metric-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));
  gap:16px;
  margin-bottom:24px;
}
.sec-metric-card{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r);
  padding:18px 20px;
}
.sec-metric-title{
  font-size:13px;
  font-weight:600;
  color:var(--muted);
  text-transform:uppercase;
  letter-spacing:0.04em;
  margin-bottom:12px;
}
.sec-metric-value{
  font-size:28px;
  font-weight:700;
  color:var(--fg);
  font-variant-numeric:tabular-nums;
  margin-bottom:6px;
}
.sec-metric-meta{
  font-size:12px;
  color:var(--muted);
}
.bar-progress{
  position:relative;
  height:10px;
  background:var(--hover);
  border-radius:5px;
  overflow:hidden;
  margin:10px 0 6px;
}
.bar-progress::after{
  content:'';
  position:absolute;
  left:80%;
  top:0;
  bottom:0;
  width:2px;
  background:var(--warn);
  opacity:0.8;
  z-index:2;
}
.bar-progress-fill{
  height:100%;
  background:var(--accent);
  border-radius:4px;
  transition:width .3s ease;
}
.bar-progress-fill.bar-warn{
  background:var(--warn);
}
.bar-chart-row{
  display:flex;
  align-items:center;
  gap:12px;
  font-size:13px;
  padding:6px 0;
  border-bottom:1px solid var(--border);
}
.bar-chart-label{
  width:90px;
  flex-shrink:0;
  font-variant-numeric:tabular-nums;
  color:var(--muted);
}
.bar-chart-track{
  flex:1;
  height:18px;
  background:var(--hover);
  border-radius:3px;
  overflow:hidden;
}
.bar-chart-bar{
  height:100%;
  background:var(--accent);
  border-radius:3px;
}
.bar-chart-val{
  width:75px;
  text-align:right;
  font-variant-numeric:tabular-nums;
  color:var(--fg);
  font-weight:600;
}

/* ── M10 成长机制与待审词条卡片 ── */
.sec-growth-box{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r);
  padding:16px 20px;
  margin-bottom:20px;
}
.sec-growth-title{
  font-size:14px;
  font-weight:600;
  color:var(--fg);
  margin-bottom:8px;
}
.sec-growth-desc{
  font-size:13px;
  color:var(--muted);
  line-height:1.5;
}
.sec-audit-list{
  display:grid;
  gap:12px;
  margin-bottom:24px;
}
.sec-candidate-card{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r);
  padding:14px 18px;
  display:flex;
  justify-content:space-between;
  align-items:center;
  gap:16px;
  border-left:4px solid var(--border);
}
.sec-card-grow{
  border-left-color:var(--accent);
}
.sec-card-dormant{
  border-left-color:var(--muted);
  opacity:0.92;
}
.sec-card-merge{
  border-left-color:var(--warn);
}
.sec-candidate-info{
  flex:1;
}
.sec-candidate-term{
  font-size:15px;
  font-weight:600;
  color:var(--fg);
  display:flex;
  align-items:center;
  gap:8px;
}
.sec-candidate-meta{
  font-size:12px;
  color:var(--muted);
  margin-top:4px;
}
.sec-candidate-actions{
  display:flex;
  align-items:center;
  gap:8px;
  flex-shrink:0;
}
.sec-btn-action{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-height:30px;
  padding:4px 12px;
  font-size:12px;
  border-radius:var(--r);
  border:1px solid var(--border);
  cursor:pointer;
  background:var(--bg);
  color:var(--fg);
  text-decoration:none;
}
.sec-btn-action:hover{
  border-color:var(--line-strong);
}
.sec-btn-action.sec-btn-accent{
  background:var(--accent);
  color:#fff;
  border-color:var(--accent);
}
.sec-btn-action.sec-btn-accent:hover{
  opacity:0.9;
}
.sec-btn-action.sec-btn-sample{
  background:var(--surface);
  color:var(--accent);
}
.sec-btn-action.sec-btn-sample:hover{
  border-color:var(--accent);
  background:rgba(67,97,238,0.05);
}

/* ── M10 独立运营后台控制台外壳 (Ops Console Shell) ── */
.ops-console-header{
  background:var(--surface);
  border-bottom:1px solid var(--border);
  position:sticky;
  top:0;
  z-index:100;
  backdrop-filter:blur(8px);
  -webkit-backdrop-filter:blur(8px);
}
.ops-console-in{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:16px;
  height:54px;
}
.ops-console-left{
  display:flex;
  align-items:center;
  gap:10px;
  flex-shrink:0;
}
.ops-console-brand{
  display:flex;
  align-items:center;
  gap:8px;
  color:var(--fg);
  text-decoration:none;
  font-weight:700;
  font-size:15px;
  letter-spacing:-0.01em;
}
.ops-console-logo{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:26px;
  height:26px;
  background:var(--accent);
  color:#fff;
  border-radius:6px;
  font-weight:800;
  font-size:14px;
}
.ops-console-title{
  color:var(--fg);
  font-weight:700;
  font-size:15px;
}
.ops-console-badge{
  font-size:11px;
  font-weight:500;
  padding:2px 8px;
  border-radius:10px;
  background:rgba(46,125,50,0.1);
  color:#2e7d32;
  border:1px solid rgba(46,125,50,0.25);
  white-space:nowrap;
}
.ops-console-nav{
  display:inline-flex;
  align-items:center;
  gap:4px;
  padding:3px;
  background:var(--hover);
  border-radius:8px;
  border:1px solid var(--border);
}
.ops-console-tab{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  padding:5px 14px;
  font-size:13px;
  font-weight:500;
  color:var(--muted);
  text-decoration:none;
  border-radius:6px;
  white-space:nowrap;
  transition:all .15s ease;
}
.ops-console-tab:hover:not(.on){
  color:var(--fg);
  background:rgba(0,0,0,0.03);
}
.ops-console-tab.on{
  background:var(--surface);
  color:var(--accent);
  font-weight:600;
  box-shadow:0 1px 3px rgba(0,0,0,0.08);
}
.ops-console-right{
  display:flex;
  align-items:center;
  gap:12px;
  flex-shrink:0;
}
.ops-console-run{
  font-size:12px;
  color:var(--muted);
  font-variant-numeric:tabular-nums;
}
.ops-console-exit{
  display:inline-flex;
  align-items:center;
  padding:4px 10px;
  font-size:12px;
  font-weight:500;
  color:var(--accent);
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--r);
  text-decoration:none;
  transition:all .15s ease;
}
.ops-console-exit:hover{
  border-color:var(--accent);
  background:rgba(67,97,238,0.05);
}
.ops-console-main{
  padding-top:20px;
  padding-bottom:40px;
  min-height:calc(100vh - 120px);
}
.ops-console-footer{
  background:var(--surface);
  border-top:1px solid var(--border);
  padding:16px 0;
  margin-top:auto;
}
.ops-console-foot-in{
  display:flex;
  justify-content:space-between;
  align-items:center;
  font-size:12px;
  color:var(--muted);
  flex-wrap:wrap;
  gap:8px;
}
.ops-console-foot-link{
  color:var(--muted);
  text-decoration:none;
}
.ops-console-foot-link:hover{
  color:var(--fg);
  text-decoration:underline;
}

/* ── 移动端响应式适配 (≤640px) ── */
@media (max-width:640px){
  .ops-console-in{
    height:auto;
    flex-direction:column;
    align-items:stretch;
    padding-top:10px;
    padding-bottom:10px;
    gap:10px;
  }
  .ops-console-left{
    justify-content:space-between;
  }
  .ops-console-nav{
    width:100%;
    overflow-x:auto;
    -webkit-overflow-scrolling:touch;
  }
  .ops-console-tab{
    flex:1;
    text-align:center;
    padding:5px 8px;
    font-size:12px;
  }
  .ops-console-right{
    justify-content:space-between;
  }
  .ops-console-foot-in{
    flex-direction:column;
    align-items:flex-start;
  }
  .ops-header-bar{
    flex-wrap:wrap;
    gap:8px;
  }
  .ops-subnav{
    display:flex;
    width:100%;
    overflow-x:auto;
    padding:3px;
  }
  .ops-tab{
    flex:1;
    text-align:center;
    padding:5px 8px;
    font-size:12px;
  }
  .src-manage-form{
    grid-template-columns:1fr;
    gap:10px;
  }
  .sec-candidate-card{
    flex-direction:column;
    align-items:flex-start;
    gap:12px;
  }
  .sec-candidate-actions{
    width:100%;
    justify-content:flex-end;
    flex-wrap:wrap;
  }
  .sec-candidate-actions .sec-btn-action{
    min-height:36px;
    padding:6px 14px;
    font-size:13px;
  }
  .src-actions-group .src-btn-toggle, .src-actions-group .src-btn-edit, .src-actions-group .src-btn-link{
    min-height:34px;
    padding:4px 12px;
    font-size:13px;
  }
  .bar-chart-label{
    width:76px;
    font-size:12px;
  }
  .bar-chart-val{
    width:65px;
    font-size:12px;
  }
}







/* ── 2026-11-04 产业链关系网络（/landscape「关系网络」视图）──────────
   节点 = 板块内厂商（按产业链列布：上游芯片 → 制造/零部件 → 整机 → 下游应用），
   连线 = entity_relationships 关系边，点击节点高亮关联边；虚线 = 传导路径标注。 */
.net-tabs{
  display:flex;
  gap:6px;
  margin:18px 0 12px;
  border-bottom:1px solid var(--line);
  padding-bottom:10px;
}
.net-tab{
  appearance:none;
  cursor:pointer;
  font:inherit;
  font-size:13px;
  font-weight:600;
  color:var(--muted);
  background:transparent;
  border:1px solid transparent;
  border-radius:8px;
  padding:7px 14px;
  transition:color .15s, background .15s, border-color .15s;
}
.net-tab:hover{ color:var(--fg); background:var(--hover); }
.net-tab.on{
  color:var(--accent-ink);
  background:var(--accent-soft);
  border-color:var(--accent);
}
.net-network{ overflow-x:auto; }
.net-svg{
  width:100%;
  min-width:1020px;
  height:auto;
  display:block;
  background:var(--sunken, #f8fafc);
  border:1px solid var(--line);
  border-radius:10px;
}
.net-layer-label{
  font-size:11px;
  font-weight:700;
  letter-spacing:.08em;
  fill:var(--muted);
}
.net-node{ cursor:pointer; outline:none; }
.net-node:focus-visible circle{ stroke:var(--accent); stroke-width:2.5; }
.net-node circle{ stroke:#fff; stroke-width:1.5; transition:opacity .15s; }
.net-node-label{
  font-size:10px;
  fill:var(--fg);
  pointer-events:none;
  transition:opacity .15s;
}
.net-edge{
  opacity:.5;
  stroke-linecap:round;
  transition:opacity .15s;
}
.net-chain{
  stroke:var(--accent);
  stroke-width:2.4;
  stroke-dasharray:6 4;
  opacity:.9;
  pointer-events:none;
}
.net-svg.net-on .net-edge,
.net-svg.net-on .net-chain{ opacity:.06; }
.net-svg.net-on .net-node{ opacity:.22; }
.net-svg.net-on .net-node-label{ opacity:.12; }
.net-svg.net-on .net-edge.net-hl{ opacity:.95; }
.net-svg.net-on .net-chain.net-hl{ opacity:1; }
.net-svg.net-on .net-node.net-hl{ opacity:1; }
.net-svg.net-on .net-node-label.net-hl{ opacity:1; }
.net-legend{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin-top:10px;
}
.net-chain-chip{
  font-size:12px;
  font-weight:600;
  color:var(--accent-ink);
  background:var(--accent-soft);
  border:1px dashed var(--accent);
  border-radius:8px;
  padding:5px 10px;
}
.net-hint{
  margin-top:10px;
  font-size:12px;
  color:var(--muted);
  line-height:1.7;
}
@media (max-width:640px){
  .net-tabs{ margin:14px 0 10px; }
  .net-tab{ flex:1; text-align:center; }
  .net-chain-chip{ font-size:11px; }
}

/* 2026-11-05：证据等级 A/B/C/D 徽章与其筛选条已在 UI 下线，
   `.tag.evidence` / `.filter-grade` 样式随之删除。
   证据等级数据仍在 DB（event_threads.evidence_grade）与 API。 */
