/* css/source-reading.css */
.source-image{margin:16px 0;max-width:100%;overflow:hidden;border-radius:10px;background:var(--card-bg-2,#202024)}
.source-image img{display:block;width:100%;height:auto;aspect-ratio:16/9;object-fit:contain;max-height:440px}
.source-image figcaption,.source-reading-note{font-size:13px;line-height:1.6;color:var(--label-2,#a6a6ad);padding:8px 12px;overflow-wrap:anywhere}
.source-image--thumb{float:right;width:96px;flex:0 0 96px;margin:0 0 8px 12px;align-self:flex-start}
.source-image--thumb img{aspect-ratio:4/3;object-fit:cover}
.source-image--failed{min-height:48px}
.source-reading{margin:24px 0;padding-top:16px;border-top:1px solid var(--border-color,#5555);min-width:0}
.source-reading h2,.source-summary-heading{font-size:18px;line-height:1.5;margin:0 0 8px}
.source-reading-note{padding:0;margin:0 0 12px}
.source-reading-text{white-space:pre-wrap;overflow-wrap:anywhere;font-size:16px;line-height:1.8;max-width:74ch}
.source-reading-text p{margin:.75em 0}
.source-reading-text h3{font-size:18px;line-height:1.5;margin:1em 0 .5em}
.source-reading button{min-height:44px;min-width:44px;margin:8px 8px 8px 0;padding:8px 12px;border:1px solid var(--separator);border-radius:8px;background:var(--card-bg-2);color:var(--label-1)}
.source-reading button[aria-pressed="true"]{background:var(--tint-soft);color:var(--tint-on-soft);border-color:var(--tint);font-weight:600}
.source-reading button:focus-visible{outline:2px solid var(--tint);outline-offset:3px}
@media(max-width:360px){.source-image--thumb{width:72px;flex-basis:72px;margin-left:8px}}

/* css/news-heat.css */
/* Only the flame moves: no layout changes or moving numbers. */
.news-heat-chip.news-heat { display:inline-flex; align-items:center; gap:5px; white-space:nowrap; font-variant-numeric:tabular-nums; }
.news-heat-chip .heat-flame { display:inline-flex; width:22px; height:28px; align-items:center; justify-content:center; flex:0 0 22px; }
.news-heat-chip .heat-flame svg { width:17px; height:22px; overflow:visible; transform-origin:50% 90%; animation:heat-burn 2s ease-in-out infinite alternate; }
.news-heat-chip .heat-flame-outer { fill:#efaa50; }
.news-heat-chip .heat-flame-inner { fill:#ffe4a1; }
.news-heat-chip.heat-mid .heat-flame svg { width:19px; height:24px; }
.news-heat-chip.heat-high .heat-flame svg { width:21px; height:26px; }
.news-heat-chip.heat-high .heat-flame-outer { fill:#f88742; }
.news-heat-chip.trend-up .heat-flame svg { animation:heat-rise .95s ease-in-out infinite alternate; }
.news-heat-chip.trend-up .heat-flame-outer { fill:#ff8545; }
.news-heat-chip.trend-down .heat-flame svg { animation:heat-fade 3s ease-in-out infinite alternate; }
.news-heat-chip.trend-down .heat-flame-outer { fill:#b39a7f; }
.news-heat-chip.trend-down .heat-flame-inner { fill:#d9c4a5; }
@keyframes heat-burn { from {transform:scale(.92,.94) rotate(-2deg);} to {transform:scale(1.03,1.08) rotate(2deg);} }
@keyframes heat-rise { from {transform:scale(.98,1) rotate(-3deg);} to {transform:scale(1.12,1.22) rotate(3deg);} }
@keyframes heat-fade { from {transform:scale(.72,.76);opacity:.64;} to {transform:scale(.82,.90);opacity:.86;} }
.news-attention-detail { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; margin:16px 0; padding:12px 14px; border:1px solid #bc9b5b26; border-radius:12px; background:#bc9b5b08; }
.news-attention-detail div { display:flex; flex-direction:column; gap:4px; min-width:0; }
.news-attention-detail div + div { border-left:1px solid #bc9b5b26; padding-left:12px; }
.news-attention-detail span { color:var(--label-2,var(--ao-label-2,#999)); font-size:12px; line-height:1.4; }
.news-attention-detail strong { color:inherit; font-size:18px; font-weight:600; line-height:1.4; font-variant-numeric:tabular-nums; }
.news-attention-detail div:first-child strong { color:var(--tint,var(--ao-gold,#e3c78f)); }
@media(prefers-reduced-motion:reduce) { .news-heat-chip .heat-flame svg {animation:none!important;transform:none!important;} }
@media(forced-colors:active) { .news-heat-chip path {fill:currentColor!important;} }

/* css/mobile.css */
/* Hotspot Work 移动阅读端样式（2026-09-19 UI 打磨）。
   色板对齐桌面端 Apple 深色体系：卡片 #1c1c1e / 浮层 #2c2c2e / 蓝 #0091ff。
   设计原则：信息层级清晰（标题/概要/元信息三级）、**所有触控目标 ≥44px**、
   骨架屏代替干等、深色对比度全部 ≥ WCAG AA 4.5:1。

   2026-09-19 修正（均为真实 Chrome 390×844 实测，不是目测）：
   - 触控目标：此前 31 个可点元素里 29 个不足 44px（chip 38.4 / segment 38 /
     news-action 34 / 退出 36 / 返回 40）→ 全部提到 44px。
   - 对比度：`--label-3` 透明度 0.36 在卡片上实测仅 3.01:1、低于 AA →
     提到 0.52（实测 ≈4.8:1）；次要文字不再用"更淡"来分层。
   - 空占位：`p.state-note` 加载完成后被置空但保留 32px padding，形成 64px
     空白条 → `:empty` 直接不渲染。 */

:root {
  --page-bg: #0e0e10;
  --card-bg: #1a1a1c;
  --card-bg-hover: #222224;
  --card-bg-2: #2c2c2e;
  --separator: rgba(235, 235, 245, 0.10);
  --label-1: #f5f5f7;
  --label-2: rgba(235, 235, 245, 0.62);
  /* 0.36 在卡片底上实测 3.01:1，未达 AA；0.52 → 4.87:1，但 .news-action.muted /
     .heat-low 这几处压在更亮的浮层底（#2c2c2e / rgba(118,118,128,.2)）
     上仍只有 4.33–4.46:1。0.58 让最差一处也过 4.5:1（浮层 5.04 / 卡片 5.69）。 */
  --label-3: rgba(235, 235, 245, 0.58);
  /* --tint 是**文字/图标**用蓝：在卡片上 4.76:1 ✓。
     --tint-fill 是**填充底**用蓝：纯白字压 #0a84ff 只有 3.65:1（14px chip 与 17px
     按钮都不算 WCAG 大号文字，需 4.5:1），压 #0a6fd8 为 4.91:1 ✓。
     注意桌面端用的 #0091ff 白字只有 3.23:1，比原来更差，不能照抄。 */
  --tint: #0a84ff;
  --tint-fill: #0a6fd8;
  /* 小号 tint 文字压在 --tint-soft 底（rgb(24,42,62)）上的专用色：5.56:1 ✓。
     直接用 --tint 只有 4.00:1。 */
  --tint-on-soft: #4da3ff;
  --tint-soft: rgba(10, 132, 255, 0.15);
  --danger: #ff453a;
  --warn: #ffd60a;
  --radius: 16px;
  /* 触控目标下限：iOS HIG / Material 均为 44pt，集中一处便于审查。 */
  --tap: 44px;
  --safe-top: env(safe-area-inset-top, 0px);
  --safe-bottom: env(safe-area-inset-bottom, 0px);
}

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

/* 全局焦点可见（2026-09-19）：原先只有登录输入框有焦点样式，键盘用户与
   iOS 全键盘控制看不到焦点落在哪个 chip / tab / 按钮上。 */
:focus-visible { outline: 2px solid var(--tint); outline-offset: 2px; }

/* 触摸反馈补偿（2026-09-19）：下面这行关掉了系统 tap 高亮，但多数控件没有
   自己的 :active，点下去屏幕零反馈，慢网时会被当成"没点上"而重复点击。
   这里统一补一个轻量反馈，各控件不再逐个依赖。 */
button:active, .chip:active, .tab:active, .news-action:active,
.report-download:active, .detail-link:active, .back-link:active { opacity: 0.7; }

html, body {
  margin: 0;
  padding: 0;
  background: var(--page-bg);
  color: var(--label-1);
  font: 16px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
        "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
  /* 去掉 -webkit-font-smoothing: antialiased：它关闭次像素渲染，在"浅字压深底"
     （本 app 的全部场景）下会让笔画变细发虚，12–13px 中文尤其明显。 */
}

/* 长英文标识符 / 裸 URL 不会在无空格处断行，会把卡片顶破或造成横向溢出。
   中文可在任意字符换行，所以这条只对拉丁串生效。 */
.news-title, .news-brief, .report-title, .detail-title, .detail-brief { overflow-wrap: anywhere; }

/* 尊重用户的减少动态偏好（2026-09-19）：骨架屏在每次首屏/切分类/切报告版本
   都会无限脉冲，对前庭敏感用户是不适来源。 */
@media (prefers-reduced-motion: reduce) {
  .skeleton { animation: none; }
  * { transition-duration: 0.01ms !important; }
}

body { min-height: 100dvh; overscroll-behavior-y: none; }

a { color: var(--tint); text-decoration: none; }
button { font: inherit; color: inherit; cursor: pointer; }

.hidden { display: none !important; }

/* ---------- 骨架屏（加载态） ---------- */

@keyframes skeleton-pulse { 0%, 100% { opacity: 0.45; } 50% { opacity: 0.9; } }
.skeleton {
  background: linear-gradient(100deg, var(--card-bg) 40%, var(--card-bg-2) 50%, var(--card-bg) 60%);
  background-size: 200% 100%;
  animation: skeleton-pulse 1.4s ease infinite;
  border-radius: 10px;
}
.skeleton-line { height: 14px; margin: 8px 2px; }
.skeleton-line.w60 { width: 60%; }
.skeleton-line.w35 { width: 35%; }
.skeleton-card { border-radius: var(--radius); padding: 16px; margin-bottom: 10px; }
/* 报告正文加载占位（report.js 一直在用 .skeleton-block，此前未定义 → 0 高度）。 */
.skeleton-block { height: 120px; border-radius: var(--radius); margin-bottom: 12px; }

/* ---------- 视图容器与底部 Tab ---------- */

/* 顶栏移除后（M02）顶部安全区没有别人处理了：黑透状态栏（black-translucent）
   下内容会顶到刘海/灵动岛下面。这里补上 --safe-top，与原先 .app-header 的
   padding-top 同一来源。 */
.view-root { padding: calc(var(--safe-top) + 24px) 16px calc(84px + var(--safe-bottom)); max-width: 720px; margin: 0 auto; }

.app-tabbar {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 10;
  display: flex;
  background: rgba(14, 14, 16, 0.92);
  backdrop-filter: blur(18px) saturate(1.4);
  -webkit-backdrop-filter: blur(18px) saturate(1.4);
  border-top: 1px solid var(--separator);
  padding-bottom: var(--safe-bottom);
}

.app-tabbar .tab {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3px;
  padding: 8px 0 6px;
  min-height: var(--tap);
  color: var(--label-3);
  font-size: 11px;
  transition: color 0.15s;
}
.app-tabbar .tab.on { color: var(--tint); }
.app-tabbar .tab-icon { display: flex; align-items: center; justify-content: center; height: 24px; }
.app-tabbar .tab-icon svg { display: block; }
.app-tabbar .tab-label { font-weight: 500; }

/* ---------- 业务切换（2026-09-29 设计定稿）：底栏右缘档位 ----------
   与两个 tab 同构：线性「带环星球」图标 + 当前业务名小字；左侧发丝线与
   tab 分隔。业务是整页口径（概览/七日焦点/列表跟随），入口常驻跟屏。
   data-tab 仍只有 news/reports：本档位是动作位，不是第三个页面 tab。 */
.app-tabbar .tab-edge {
  display: flex;
  align-items: center;
  padding: 4px 6px 4px 12px;
  border-left: 1px solid rgba(242, 212, 164, 0.12);
}
.biz-slot {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
  min-width: 62px;
  min-height: var(--tap);
  padding: 7px 4px 6px;
  border: 0;
  background: none;
  color: var(--label-2);
  font-size: 11px;
  cursor: pointer;
}
.biz-slot svg { display: block; }
.biz-slot-name {
  max-width: 60px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 500;
}

/* ---------- 业务底部面板 ----------
   从底部滑入（220ms），顶部一道金色发丝与仪表卡同一语言；行内右对齐
   各业务近 7 天真实信号数，细环单选标记当前业务。 */
.sheet-backdrop {
  position: fixed;
  inset: 0;
  z-index: 30;
  background: rgba(0, 0, 0, 0.6);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.2s ease, visibility 0.2s;
}
.sheet-backdrop.open { opacity: 1; visibility: visible; }
.biz-sheet {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 31;
  max-width: 720px;
  margin: 0 auto;
  background: #131417;
  border: 1px solid rgba(56, 62, 74, 0.5);
  border-bottom: 0;
  border-radius: 18px 18px 0 0;
  padding: 8px 18px calc(14px + var(--safe-bottom));
  opacity: 0;
  visibility: hidden;
  transform: translateY(28px);
  transition: transform 0.22s ease, opacity 0.22s ease, visibility 0.22s;
  overflow: hidden;
}
.biz-sheet::before {
  content: '';
  position: absolute; inset: 0 0 auto 0;
  height: 1px;
  background: linear-gradient(90deg,
    transparent 0%, rgba(224, 168, 111, 0.30) 22%, rgba(242, 212, 164, 0.45) 50%,
    rgba(224, 168, 111, 0.30) 78%, transparent 100%);
}
.biz-sheet.open { opacity: 1; visibility: visible; transform: none; }
.sheet-handle {
  width: 36px; height: 4px;
  border-radius: 2px;
  background: rgba(255, 255, 255, 0.16);
  margin: 4px auto 10px;
}
.biz-sheet .sheet-title {
  margin: 0 2px 4px;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: #fff;
}
.biz-list { list-style: none; margin: 0; padding: 0; }
.biz-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto 16px;
  align-items: center;
  gap: 12px;
  width: 100%;
  min-height: 58px;
  padding: 0 2px;
  border: 0;
  border-bottom: 1px solid rgba(242, 212, 164, 0.08);
  background: none;
  color: var(--label-2);
  font-size: 15px;
  text-align: left;
  cursor: pointer;
}
.biz-list li:last-child .biz-row { border-bottom: 0; }
.biz-row-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.biz-row[aria-current="true"] .biz-row-name { color: var(--tint); font-weight: 600; }
.biz-row-meta { text-align: right; }
.biz-row-count {
  display: block;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.2;
  color: var(--label-2);
  font-variant-numeric: tabular-nums;
}
.biz-row[aria-current="true"] .biz-row-count { color: var(--tint); }
.biz-row-caption {
  display: block;
  margin-top: 1px;
  font-size: 10.5px;
  color: var(--label-3);
}
.biz-row-radio {
  width: 16px; height: 16px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.28);
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.biz-row-radio.on { border-color: rgba(242, 212, 164, 0.75); }
.biz-row-radio.on::after {
  content: '';
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--gold, #f2d4a4);
  box-shadow: 0 0 6px 1px rgba(242, 212, 164, 0.4);
}
@media (prefers-reduced-motion: reduce) {
  .sheet-backdrop, .biz-sheet { transition: none; }
  .biz-sheet { transform: none; }
}

/* 底部导航（PIL-99）：只保留资讯/报告两个等宽栏目，均分整行、内容居中。
   导航右端原先的退出口（M02 加的文字按钮）已随节点一起删除；
   是否需要次级账户入口由主控收束，样式不预留死规则。 */

/* ---------- 通用模块 ---------- */

.module-title {
  font-size: 13px;
  font-weight: 700;
  color: var(--tint);
  letter-spacing: 0.03em;
  margin: 20px 4px 10px;
  text-transform: uppercase;
}
.module-title:first-child { margin-top: 4px; }

.card {
  background: var(--card-bg);
  border-radius: var(--radius);
  padding: 16px;
  margin-bottom: 12px;
  border: 1px solid rgba(255, 255, 255, 0.03);
  transition: background 0.12s;
}
.card:active { background: var(--card-bg-hover); }

.chip-row {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding: 2px 2px 4px;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.chip-row::-webkit-scrollbar { display: none; }
/* 滚动提示（2026-09-19）：原先最右侧 chip 被硬切、没有任何"还能横滑"的暗示。
   只在**确实还能向右滚**时加右缘渐隐（由 JS 打 .can-scroll-right）；否则会把
   末尾的按钮永久 painted 成半透明，看起来像禁用。
   向左滚过之后同样给出左缘提示。 */
.chip-row.can-scroll-right {
  -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 28px), transparent);
  mask-image: linear-gradient(90deg, #000 calc(100% - 28px), transparent);
}
.chip-row.can-scroll-left {
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 28px);
  mask-image: linear-gradient(90deg, transparent, #000 28px);
}
.chip-row.can-scroll-left.can-scroll-right {
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 28px, #000 calc(100% - 28px), transparent);
  mask-image: linear-gradient(90deg, transparent, #000 28px, #000 calc(100% - 28px), transparent);
}

.chip {
  flex: none;
  min-height: var(--tap);
  border: 0;
  background: var(--card-bg);
  color: var(--label-2);
  font-size: 14px;
  font-weight: 500;
  padding: 8px 16px;
  border-radius: 22px;
  transition: all 0.15s;
}
.chip.on { background: var(--tint-fill); color: #fff; font-weight: 600; }

.segment {
  display: flex;
  background: rgba(118, 118, 128, 0.22);
  border-radius: 11px;
  padding: 3px;
  margin: 0 0 6px;
}
.segment button {
  flex: 1;
  min-height: var(--tap);
  border: 0;
  background: none;
  font-size: 14px;
  font-weight: 500;
  color: var(--label-2);
  padding: 7px 0;
  border-radius: 9px;
  transition: all 0.15s;
}
/* 选中态可辨识度（2026-09-19）：原先轨道 rgb(37,37,41) 与选中面板 #2c2c2e 只有
   1.10:1，远低于 WCAG 1.4.11 对"状态指示"要求的 3:1——户外强光下看不出
   "重点关注 / 实时热点"选中了哪个，而它是首屏第一个控件。改用 accent 实底。 */
.segment button.on { background: var(--tint-fill); color: #fff; font-weight: 600; }

.state-note { color: var(--label-2); font-size: 14px; text-align: center; padding: 32px 20px; }
.state-note.error { color: var(--danger); }
/* 加载完成后 note 会被置空，但 padding 仍在 → 形成 64px 空白条，实测存在。
   :empty 时彻底不渲染（含仅剩空白的节点）。 */
.state-note:empty { display: none; }

.retry-btn {
  min-height: 44px;
  display: block;
  margin: 12px auto 0;
  border: 0;
  background: var(--card-bg-2);
  color: var(--label-1);
  font-size: 14px;
  font-weight: 500;
  padding: 10px 28px;
  border-radius: 22px;
}
.retry-btn:active { transform: scale(0.97); }

/* ---------- 登录 ---------- */

/* 登录视图隐藏底部导航（showShell(false)），因此这里必须自己处理顶部安全区，
   否则黑透状态栏（black-translucent）下内容会顶到刘海下面。
   原先只有底部 --safe-bottom，顶部是漏的。
   注：M02 起全局顶栏已移除，.view-root 自己承担 --safe-top，登录页同样自己处理。 */
.login-wrap { min-height: 100dvh; display: flex; flex-direction: column; justify-content: center; padding: calc(var(--safe-top) + 32px) 24px calc(32px + var(--safe-bottom)); max-width: 420px; margin: 0 auto; }

.login-logo {
  width: 72px; height: 72px; border-radius: 18px;
  background: var(--card-bg);
  display: flex; align-items: center; justify-content: center;
  font-size: 34px; margin-bottom: 22px;
  border: 1px solid rgba(255, 255, 255, 0.05);
}
.login-title { font-size: 30px; font-weight: 700; margin: 0 0 6px; letter-spacing: 0; }
.login-sub { font-size: 14px; color: var(--label-2); margin: 0 0 30px; }

.login-field { margin-bottom: 16px; }
.login-field label { display: block; font-size: 13px; color: var(--label-2); margin-bottom: 7px; font-weight: 500; }

.login-field input {
  width: 100%;
  min-height: 50px;
  border: 1px solid var(--separator);
  border-radius: 14px;
  background: var(--card-bg);
  color: var(--label-1);
  font: inherit;
  padding: 13px 16px;
  outline: none;
  transition: border-color 0.15s;
}
.login-field input:focus { border-color: var(--tint); box-shadow: 0 0 0 3px var(--tint-soft); }

.login-error { color: var(--danger); font-size: 14px; min-height: 22px; margin: 2px 0 12px; }

.login-submit {
  width: 100%;
  min-height: 50px;
  border: 0;
  border-radius: 14px;
  background: var(--tint-fill);
  color: #fff;
  font-size: 17px;
  font-weight: 700;
  padding: 13px 0;
  transition: opacity 0.12s, transform 0.12s;
}
.login-submit:active { opacity: 0.85; transform: scale(0.98); }
.login-submit[disabled] { opacity: 0.5; }

/* ---------- 资讯列表 ---------- */

.news-item { padding: 15px 16px; position: relative; }
.news-item .news-title { font-size: 16.5px; font-weight: 600; line-height: 1.42; margin: 0 0 7px; letter-spacing: 0; }
/* 伸展链接（2026-09-19 可访问性）：标题是唯一的 <a>，用 ::after 把点击区铺满整卡，
   这样键盘/读屏可达、又不必把「收藏/隐藏」按钮嵌进 <a>（那样既非法也会误触发跳转）。
   操作行用 z-index 抬到覆盖层之上，保证按钮仍可点。 */
.news-item .news-title-link { color: inherit; }
.news-item .news-content { position: relative; }
.news-item .news-title-link:active { opacity: .8; }
.news-item .news-title-link::after { content: ''; position: absolute; inset: 0; z-index: 1; }
.news-item .news-actions { position: relative; z-index: 2; }
.news-item .news-tags, .news-item .news-meta { position: relative; z-index: 0; }

.view-root .news-item .news-brief {
  font-size: 14px;
  color: var(--label-2);
  margin: 0 0 10px;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.view-root .news-item .news-title,
.view-root .news-item.is-read .news-title {
  font-size: 18px;
  font-weight: 700;
  line-height: 1.45;
  color: #f5f2ec;
  margin: 0 0 9px;
  display: block;
  overflow: visible;
}

.view-root .news-item .news-brief {
  font-size: 14.5px;
  line-height: 1.65;
  color: #c9c7c3;
}

.news-item .news-meta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12px; color: var(--label-3); }
/* 信源名（label-2 同色系，比时间稍亮一档以示区分；不用 chip 样式避免与主题标签混淆） */
.news-item .news-src { color: var(--label-2); }

.news-tags { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
.news-tag {
  font-size: 12px; color: var(--label-2);
  background: rgba(118, 118, 128, 0.20);
  padding: 3px 10px; border-radius: 11px;
}
.news-tag.kind { color: var(--tint-on-soft); background: var(--tint-soft); font-weight: 600; }
/* 热度角标三档（2026-09-17，与桌面 news-kind heat-* 同色系） */
.news-tag.heat-high { color: #ff8a5c; background: rgba(255, 138, 92, 0.14); font-weight: 700; }
.news-tag.heat-mid { color: #f5c26b; background: rgba(245, 194, 107, 0.14); }
.news-tag.heat-low { color: var(--label-3); background: rgba(142, 142, 147, 0.12); }

.news-item.is-read .news-title { color: var(--label-2); font-weight: 500; }

.news-actions { display: flex; gap: 8px; margin-top: 12px; }
/* 行内变体（2026-09-29 用户反馈：独立一行难看且占高）：并入标签行右缘。 */
.news-actions--inline { margin-left: auto; margin-top: 0; gap: 2px; }
.news-action {
  min-height: var(--tap);
  border: 0; background: rgba(118, 118, 128, 0.20); color: var(--label-2);
  font-size: 13px; padding: 6px 16px; border-radius: 22px;
}
/* 幽灵图标：无底色不占视觉宽，44px 触达保留；失败闪警示色 + title 说明。 */
.news-action--icon {
  padding: 0;
  background: transparent;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--label-2);
}
.news-action--icon svg { width: 18px; height: 18px; }
.news-action--icon.failed { color: var(--warn); }
.news-action.on { color: var(--warn); background: transparent; }
.news-action.muted { color: var(--label-3); }

.feed-count { font-size: 12px; color: var(--label-3); margin: 0 4px 2px; }

/* 撤销提示（2026-09-19）：隐藏是持久化写操作，误触后需要回滚入口。
   固定在 tabbar 之上，不遮挡内容与导航。 */
.undo-toast {
  position: fixed;
  left: 16px; right: 16px;
  bottom: calc(66px + var(--safe-bottom));
  z-index: 30;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  background: var(--card-bg-2);
  border: 1px solid var(--separator);
  border-radius: 14px;
  padding: 10px 10px 10px 16px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
}
.undo-toast-text { font-size: 14px; color: var(--label-1); }
.undo-toast-action {
  flex: none;
  min-height: var(--tap);
  min-width: var(--tap);
  border: 0;
  background: transparent;
  color: var(--tint);
  font-size: 15px;
  font-weight: 600;
  border-radius: 10px;
  padding: 0 12px;
}
.undo-toast-action[disabled] { opacity: 0.5; }

/* 中文转换未完成的说明条（2026-09-19）：轮询超时后如实告知，并给刷新入口。 */
.feed-pending {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  background: var(--card-bg); border-radius: 12px;
  padding: 8px 8px 8px 14px; margin: 0 0 10px;
}
.feed-pending-text { font-size: 13px; color: var(--label-2); }
.feed-pending-action {
  flex: none; min-height: var(--tap); min-width: var(--tap);
  border: 0; background: transparent; color: var(--tint);
  font-size: 14px; font-weight: 600; padding: 0 12px; border-radius: 10px;
}

/* 列表底部：加载更多 / 已到底部。
   JS 里一直在用 .feed-more / .feed-more-btn，但此前 CSS 未定义（死类名）。 */
.feed-more { padding: 4px 0 8px; }
.feed-more-btn { width: 100%; margin: 8px 0 0; }

/* ---------- 资讯详情 ---------- */

.back-link { display: inline-flex; align-items: center; min-height: var(--tap); font-size: 15px; color: var(--tint); padding: 0 0 12px; }
/* 「查看原文」等同为唯一入口的内联链接，同样需要 44px 触控高度。 */
.detail-link { display: inline-flex; align-items: center; min-height: var(--tap); font-size: 15px; }
.detail-title { font-size: 21px; font-weight: 700; line-height: 1.38; margin: 2px 0 10px; letter-spacing: 0; }
.detail-brief { font-size: 15px; color: var(--label-2); white-space: pre-wrap; margin: 0 0 14px; }
.detail-meta { font-size: 13px; color: var(--label-3); margin-bottom: 18px;
  /* 来源图标与时间文字垂直居中对齐（2026-10-20 用户反馈：图标按基线排，比文字低一截）。 */
  display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.detail-meta[hidden] { display: none; }

.interpret-box { white-space: normal; }

/* ---------- 站内 AI 解读详情（M02）----------
   详情页结构：标题 / 摘要 / 元信息 / 主题标签 / **醒目的原文入口** / 站内解读。
   原文入口在解读之上，解读未就绪时读者第一眼也能拿到原文；它不是可选的补充，
   而是「站内详情不能替代原文」这条合同要求的落点。 */
.detail-origin-slot { margin: 0 0 22px; }
.detail-origin {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--tap);
  width: 100%;
  padding: 10px 16px;
  border-radius: 22px;
  background: var(--card-bg-2);
  border: 1px solid var(--separator);
  color: var(--tint);
  font-size: 15px;
  font-weight: 600;
}
.detail-origin:active { transform: scale(0.98); }

/* Reading actions stay with the article header; hide is a secondary action. */
.news-detail-actions { display:flex; align-items:center; flex-wrap:wrap; gap:8px; margin:0 0 22px; }
.news-detail-actions .detail-origin { flex:1 1 120px; width:auto; padding:10px 12px; gap:6px; }
.news-detail-actions > button.news-detail-icon { box-sizing:border-box; display:inline-flex; align-items:center; justify-content:center; flex:0 0 44px; width:44px; min-width:44px; max-width:44px; height:44px; min-height:44px; padding:0; border:0; border-radius:8px; background:transparent; color:var(--label-2); font-size:0; line-height:0; }
.news-detail-icon svg { width:20px; height:20px; flex:none; }
.news-detail-actions > .news-detail-icon.on { color:var(--tint); background:transparent; }
.news-detail-icon.on svg { fill:var(--tint-soft); }
.news-detail-icon:hover { background:var(--tint-soft); }
.news-detail-status { flex-basis:100%; color:var(--label-2); font-size:13px; }
.news-detail-status:empty { display:none; }
.news-detail-actions :focus-visible { outline:2px solid var(--tint); outline-offset:3px; }

/* 解读分段：把「事实」「业务关联」「待核实」拆成可扫读的小节，
   标题用小号 accent 色，正文沿用 .report-body 的可读性基线。 */
.interpret-section { margin: 0 0 16px; }
.interpret-section:last-child { margin-bottom: 0; }
.interpret-section-title {
  font-size: 14px;
  font-weight: 700;
  color: var(--tint-on-soft);
  letter-spacing: 0.02em;
  margin: 0 0 6px;
}
.interpret-section .report-body { font-size: 15px; line-height: 1.72; }
.interpret-section .report-body h1,
.interpret-section .report-body h2,
.interpret-section .report-body h3 { font-size: 15.5px; margin: 0.8em 0 0.35em; }

/* ---------- 报告 ---------- */

.report-item { padding: 15px 16px; position: relative; }
.report-item .report-title { font-size: 16px; font-weight: 600; line-height: 1.45; margin: 0 0 8px; }
.report-item .report-title-link { color: inherit; }
.report-item .report-title-link::after { content: ''; position: absolute; inset: 0; z-index: 1; }
.report-item .report-meta { font-size: 13px; color: var(--label-2); display: flex; gap: 10px; flex-wrap: wrap; }

.case-meta {
  background: var(--card-bg);
  border-radius: var(--radius);
  padding: 14px 16px;
  margin: 2px 0 14px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-size: 13.5px;
  color: var(--label-2);
}

.report-status {
  font-size: 13px; font-weight: 600; color: var(--tint-on-soft);
  background: var(--tint-soft);
  display: inline-block;
  padding: 5px 14px; border-radius: 12px; margin: 0 0 12px;
}
.report-status.warn { color: var(--warn); background: rgba(255, 214, 10, 0.13); }

.report-frame-wrap { background: #fff; border-radius: 14px; overflow: hidden; }
/* 78vh 的问题（2026-09-19）：iOS Safari 的 vh 是"大视口"（假设地址栏已收起），
   地址栏展开时 iframe 会超出可视区并被 fixed tabbar 盖住；且 78vh + header +
   tabbar + 下方操作行总和 > 100vh，页面必然额外滚动。改用 dvh 并扣掉固定元素。 */
.report-frame {
  width: 100%;
  height: calc(100dvh - var(--safe-top) - var(--safe-bottom) - 190px);
  min-height: 320px;
  border: 0; display: block;
}
.report-frame-actions { margin: 12px 4px 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.frame-note { font-size: 12px; color: var(--label-3); }

/* ---------- Markdown 渲染 ---------- */

.report-body { font-size: 15.5px; line-height: 1.75; }
.report-body h1, .report-body h2, .report-body h3,
.report-body h4, .report-body h5, .report-body h6 { line-height: 1.4; margin: 1.2em 0 0.5em; letter-spacing: 0; }
.report-body h1 { font-size: 22px; }
.report-body h2 { font-size: 19px; }
.report-body h3 { font-size: 17px; }
.report-body p { margin: 0.65em 0; }
.report-body pre {
  background: var(--card-bg);
  border-radius: 12px;
  padding: 14px;
  overflow-x: auto;
  font-size: 13px;
  line-height: 1.55;
  font-family: ui-monospace, "Cascadia Mono", Consolas, monospace;
}
.report-body table { border-collapse: collapse; width: 100%; font-size: 14px; margin: 0.9em 0; }
.report-body th, .report-body td { border: 1px solid var(--separator); padding: 8px 10px; text-align: left; }
.report-body th { color: var(--label-2); font-weight: 600; background: var(--card-bg); }
.table-scroll { overflow-x: auto; margin: 0.9em 0; -webkit-overflow-scrolling: touch; }
/* 2026-09-19 实测：结构化报告的定量基线表列多且内容长，把整个页面撑到 453px
   （视口 390），造成全页横向滚动。这里限制表格容器宽度并给一个下限宽度，
   让表格在**容器内**横向滚动，而不是撑破页面。 */
.table-scroll { max-width: 100%; }
.table-scroll table { min-width: 420px; }
.report-body figure { margin: 0.9em 0; }
.report-body figure img { max-width: 100%; border-radius: 12px; display: block; }
.report-body figcaption { font-size: 13px; color: var(--label-3); margin-top: 7px; }

.report-asset {
  background: var(--card-bg);
  border-radius: 12px;
  padding: 12px 14px;
  margin: 0.65em 0;
  font-size: 14px;
  color: var(--label-2);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}
.report-asset .download {
  color: var(--tint); flex: none; font-weight: 500;
  /* 触控目标（2026-09-19）：纯文字链接此前只有 ~30×21px，是"下载附件"这类
     唯一入口，拇指很难点中。统一到 44px 下限。 */
  min-height: var(--tap); display: inline-flex; align-items: center;
}
/* markdown.js/applyAsset 会读取 .asset-name 作为图片 alt；渲染期需可换行截断，
   否则超长附件路径会把卡片撑破。 */
.asset-name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.asset-pending { color: var(--label-3); font-size: 13px; flex: none; }

.report-download {
  color: var(--tint); font-weight: 600; font-size: 15px;
  min-height: var(--tap); display: inline-flex; align-items: center;
  background: none; border: 0; padding: 0; font-family: inherit; cursor: pointer;
}

/* ---------- 结构化正式报告（market-research-report-v1/v2/v3） ----------
   markdown.js 的 renderStructuredReport 产出；与 Markdown 报告共用 .report-body，
   这里只补它特有的分节/字段/提示层级。 */
.report-doc-title { font-size: 22px; line-height: 1.4; margin: 0.2em 0 0.9em; letter-spacing: 0; }
.report-section { margin: 1.6em 0 0; }
.report-section-title {
  font-size: 17px; font-weight: 700; color: var(--tint);
  margin: 0 0 0.5em; padding-bottom: 0.35em;
  border-bottom: 1px solid var(--separator);
}
.report-subsection { margin: 1.1em 0 0; }
.report-subsection-title { font-size: 15.5px; font-weight: 600; margin: 0 0 0.4em; }
/* 小节论点：左侧色条区分"结论句"与正文，不靠加粗堆叠。 */
.report-thesis {
  margin: 0 0 0.6em; padding: 2px 0 2px 10px;
  border-left: 3px solid var(--tint); color: var(--label-1);
}
.report-field { margin: 0.5em 0; }
.report-field-label {
  font-size: 13px; font-weight: 600; color: var(--label-3);
  margin: 0 0 0.15em; letter-spacing: 0.02em;
}
.report-cite-hint { font-size: 12px; color: var(--label-3); margin: 0.5em 0 0; }
.report-caveats { margin: 0.6em 0 0; font-size: 13.5px; color: var(--label-2); }
.report-caveats summary { color: var(--label-3); font-size: 13px; min-height: var(--tap); display: flex; align-items: center; }
.report-caveats p { margin: 0.3em 0; }
.report-questions { margin: 0.3em 0 0; padding-left: 1.2em; }
.report-questions li { margin-bottom: 0.8em; }
.report-questions li p { margin: 0.15em 0; }
.report-question-note { font-size: 13px; color: var(--label-2); }

/* Age of a previously successful response, cleared when refreshed or denied. */
.feed-stale { padding: 4px 20px; font-size: 12px; color: var(--label-2); }

/* Compact list sources; full reporting material is revealed by the reader. */
.news-item .news-brief {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
.news-focus-evidence { margin-top: 8px; font-size: 12px; color: var(--label-2); }
.news-focus-evidence > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  min-height: var(--tap, 44px);
  cursor: pointer;
}
.news-focus-evidence > summary::-webkit-details-marker { display: none; }
.news-focus-evidence > summary::after { content: '查看'; color: var(--tint); flex: none; }
.news-focus-evidence[open] > summary::after { content: '收起'; }
.news-focus-evidence > summary.is-compact { min-height:48px; border-block:1px solid var(--separator); }
.news-focus-evidence > summary.is-compact .ev-related-meta { margin-left:auto; }
.news-focus-evidence > summary.is-compact::after { content:'⌄'; }
.news-focus-evidence[open] > summary.is-compact::after { content:'⌃'; }
.news-focus-counts { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }
.news-focus-count { white-space: nowrap; }
.news-focus-count-separator { color: var(--label-3); }
.news-focus-media-list { display: flex; flex-wrap: wrap; gap: 6px; }
.news-focus-media-name { padding: 3px 7px; border-radius: 6px; background: var(--card-bg); }
.news-focus-reports-head { margin: 10px 0 6px; font-size: 12px; font-weight: 600; }
.news-focus-report { padding: 9px 0; border-top: 1px solid var(--separator); }
.news-focus-report-head { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 4px 10px; }
.news-focus-report-date { color: var(--label-3); }
.news-focus-report-title { margin: 5px 0; line-height: 1.6; overflow-wrap: anywhere; }
.news-focus-link { display: inline-flex; align-items: center; min-height: var(--tap, 44px); color: var(--tint); }
.news-focus-note, .news-focus-aggregate-note { margin: 6px 0; line-height: 1.6; color: var(--label-3); }
.news-focus-aggregate { margin-top: 6px; border-top: 1px solid var(--separator); }
.news-focus-aggregate > summary { min-height: var(--tap, 44px); line-height: 1.6; cursor: pointer; }
.news-focus-aggregate-section h5 { margin: 10px 0 5px; font-size: 12px; }
.news-focus-aggregate-list { padding-left: 18px; line-height: 1.7; }
.news-focus-aggregate-source { margin: 5px 0; overflow-wrap: anywhere; }

/* Reports open with authored highlights; original files are an explicit step. */
/* 报告阅读页正文排版见 report-gold.css（2026-10-17 图文版）。 */
.report-reading-actions { display: flex; gap: 12px; margin: 24px 0; }
.report-reading-actions button.report-download { width: auto; flex: 1; min-height: 44px; margin: 0; }
.report-original-frame { display: block; width: 100%; height: 75vh; min-height: 480px; border: 1px solid var(--separator); border-radius: 12px; background: white; }
.report-original-text { white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.8; }
.report-original[hidden] { display: none; }

/* 启动画面（2026-10-17 第三版：华芯智讯黑金 H 标志＋首页金色星球）。index.html 的独立遮罩层，
   首屏内容就绪时由 js/boot.js 加 .boot-done 淡出（不设固定时长）。
   舞台 360px 见方，中心在视口正中上移 44px；星球 260px、轨道 313px（与首页同比例与偏移）、
   标志 128px。iOS 启动图由 scripts/make_startup_images.py 按同一组数值合成静态首帧——
   改这里的尺寸/位置/不透明度须同步该脚本。动效（反光、呼吸光、浮动、光点公转、文字淡入）
   只在页面里；减少动态效果时全部静止。 */
.boot-screen { position: fixed; inset: 0; z-index: 1000; background: #07080a; overflow: hidden; transition: opacity 0.32s ease, visibility 0s linear 0.32s; }
.boot-screen.boot-done { opacity: 0; visibility: hidden; pointer-events: none; }
.boot-stage { position: absolute; left: 50%; top: 50%; width: 360px; height: 360px; margin: -180px 0 0 -180px; transform: translateY(-44px); }
.boot-stage img { position: absolute; display: block; height: auto; user-select: none; -webkit-user-drag: none; }
.boot-planet { left: 50px; top: 56.15px; width: 260px; opacity: 0.5; }
.boot-orbit { left: 26.4px; top: 79.73px; width: 313.2px; opacity: 0.85; }
.boot-orbit-front { -webkit-mask-image: linear-gradient(159deg, transparent 53.5%, #000 56.5%); mask-image: linear-gradient(159deg, transparent 53.5%, #000 56.5%); }
.boot-glow { position: absolute; left: 70px; top: 70px; width: 220px; height: 220px; border-radius: 50%; background: radial-gradient(closest-side, rgba(242, 212, 164, 0.26), rgba(242, 212, 164, 0) 72%); opacity: 0.6; animation: boot-breathe 3.2s ease-in-out infinite; }
.boot-logo, .boot-sheen { left: 116px; top: 116px; width: 128px; height: 128px; animation: boot-float 4.8s ease-in-out infinite; }
.boot-logo { filter: drop-shadow(0 6px 18px rgba(0, 0, 0, 0.55)); }
/* 反光只落在标志本体上：用标志的透明通道作蒙版，一道斜向高光周期性扫过。 */
.boot-sheen { position: absolute; -webkit-mask: url("/m/assets/brand/logo.webp") center / contain no-repeat; mask: url("/m/assets/brand/logo.webp") center / contain no-repeat; background: linear-gradient(115deg, rgba(255, 236, 200, 0) 43%, rgba(255, 236, 200, 0.5) 50%, rgba(255, 236, 200, 0) 57%) no-repeat; background-size: 260% 100%; mix-blend-mode: screen; background-position: 160% 0; animation: boot-float 4.8s ease-in-out infinite, boot-sheen 3.2s ease-in-out 0.6s infinite; }
/* 轨道上的光点：两层互相错开 1/4 周期的往复位移合成椭圆（cubic-bezier 近似正弦），再整体倾斜。 */
.boot-comet { position: absolute; left: 183px; top: 186px; width: 0; height: 0; transform: rotate(-24deg); opacity: 0; animation: boot-fade 0.6s ease 0.4s forwards; }
.boot-comet > span { position: absolute; width: 6px; height: 6px; margin: -3px 0 0 -3px; border-radius: 50%; background: #fff3d6; box-shadow: 0 0 8px 3px rgba(242, 212, 164, 0.75), 0 0 22px 6px rgba(233, 176, 110, 0.35); animation: boot-orbit-x 3.6s cubic-bezier(0.37, 0, 0.63, 1) infinite alternate, boot-orbit-y 3.6s cubic-bezier(0.37, 0, 0.63, 1) -1.8s infinite alternate; }
.boot-title, .boot-sub { position: absolute; left: 16px; right: 16px; top: 50%; text-align: center; opacity: 0; animation: boot-fade 0.6s ease 0.15s forwards; }
.boot-title { margin: 106px 0 0; color: #f4ead8; font-family: var(--f-serif, "Noto Serif SC", "Songti SC", serif); font-size: 28px; font-weight: 600; letter-spacing: 0.16em; text-indent: 0.16em; }
.boot-sub { margin: 152px 0 0; color: rgba(242, 212, 164, 0.66); font-size: 13px; letter-spacing: 0.08em; animation-delay: 0.3s; }
.boot-slow { position: absolute; left: 16px; right: 16px; bottom: calc(36px + var(--safe-bottom, 0px)); margin: 0; text-align: center; font-size: 14px; color: rgba(236, 235, 232, 0.58); opacity: 0; animation: boot-reveal 0s linear 8s forwards; }
.boot-slow a { color: #ecebe8; text-decoration: underline; text-underline-offset: 3px; display: inline-block; padding: 12px 4px; }
@keyframes boot-breathe { 0%, 100% { opacity: 0.6; transform: scale(1); } 50% { opacity: 1; transform: scale(1.06); } }
@keyframes boot-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-3px); } }
@keyframes boot-sheen { 0% { background-position: 160% 0; } 55%, 100% { background-position: -60% 0; } }
@keyframes boot-orbit-x { from { transform: translateX(-150px); } to { transform: translateX(150px); } }
@keyframes boot-orbit-y { from { translate: 0 -58px; } to { translate: 0 58px; } }
@keyframes boot-fade { to { opacity: 1; } }
@keyframes boot-reveal { to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  .boot-glow, .boot-logo, .boot-sheen, .boot-comet > span { animation: none; }
  .boot-comet { display: none; }
  .boot-title, .boot-sub { animation: none; opacity: 1; }
  .boot-screen { transition: none; }
}

/* 2026-10-21 离线壳发现新版：阅读中顶部提示，轻点刷新。 */
.update-banner { position: fixed; z-index: 60; left: 50%; transform: translateX(-50%);
  top: calc(env(safe-area-inset-top, 0px) + 8px); min-height: 40px; padding: 0 18px; border: 0; border-radius: 20px;
  background: var(--gold, #f2d4a4); color: #07080a; font: inherit; font-size: 13.5px; font-weight: 600;
  box-shadow: 0 6px 20px rgba(0, 0, 0, .45); cursor: pointer; white-space: nowrap; }

/* css/theme-gold.css */
/* ============================================================
   黑金主题层（gold-v1 定稿视觉）· 2026-09-23
   ------------------------------------------------------------
   用户 2026-09-23 明确：要完整设计稿样式，**完全抛弃从前的蓝色设计**。
   本层在 mobile.css 之后加载，只覆盖变量与关键视觉，**不改任何结构选择器、
   不动任何布局/逻辑** —— 列表、报告、登录的既有行为零改动。

   为什么用覆盖层而不是直接改 mobile.css：
   · mobile.css 里大量对比度结论（--label-3 0.58 → 4.87:1 等）是实测校准的，
     改色板后这些数值需重新校准；覆盖层把改动收敛在一处，逐项核对。
   · 回退干净：删掉 index.html 里这一行 <link> 即回到蓝色设计（M05 回退点）。
   ============================================================ */

:root {
  /* ---- 黑金色板（取自 design-gold-v1.css 的 :root）---- */
  --page-bg: #07080a;
  --card-bg: #14161a;
  --card-bg-hover: #181a1e;
  --card-bg-2: #1d2026;
  --separator: rgba(56, 62, 74, 0.5);

  /* 文字：沿用 mobile.css 的实测结论（次要文字压卡片底 ≥4.5:1），
     但换成暖白/暖灰以贴合黑金，重新核对对比度（见下）。
     #ecebe8 压 #14161a = 13.9:1 ✓
     rgba(236,235,232,.62) 压 #14161a ≈ 7.5:1 ✓
     rgba(236,235,232,.58) 压 #14161a ≈ 7.0:1 ✓（比蓝色版更高） */
  --label-1: #ecebe8;
  --label-2: rgba(236, 235, 232, 0.62);
  --label-3: rgba(236, 235, 232, 0.58);

  /* 铜金强调：替代蓝 tint。
     #f2d4a4 压 #14161a = 10.9:1 ✓（文字/图标）
     #e9b06e 压 #14161a = 7.4:1 ✓（图标/描边）
     #c99062 压 #14161a = 4.9:1 ✓（小字标签） */
  --tint: #f2d4a4;
  --tint-fill: #b17f47;
  --tint-on-soft: #f2d4a4;
  --tint-soft: rgba(242, 212, 164, 0.14);

  --danger: #ff6b5e;
  --warn: #f2d4a4;

  /* 衬线标题字体（设计稿的层级感来自它） */
  --f-serif: "Noto Serif SC", "Source Han Serif SC", "Songti SC", "SimSun", Georgia, serif;
  --gold: #f2d4a4;
  --copper: #cc9166;
}

/* 焦点环用金色 */
:focus-visible { outline-color: var(--gold); }

/* ---------- 页面底：纯黑 ---------- */
html, body {
  background: var(--page-bg);
  color: var(--label-1);
}

a { color: var(--gold); }

/* ---------- 顶栏：M02 已整体移除 ----------
   原先这里有 .app-header / .header-logout 的黑金覆盖。顶栏在 M02（2026-09-24
   用户口径）被移除后这两条规则不再作用于任何节点，已删除。 */

/* ---------- 底部导航（PIL-99）：两栏等宽、金色选中 ----------
   导航右端原先的退出口（M02 加的文字按钮）已随节点一起删除，
   这里不再保留它的黑金覆盖。 */

/* ---------- 卡片：深灰渐变 + 顶部金色发丝光带 ---------- */
.card {
  background: linear-gradient(168deg, var(--card-bg-hover) 0%, #131519 46%, var(--card-bg) 100%);
  border: 1px solid var(--separator);
  box-shadow: 0 10px 30px -16px rgba(0, 0, 0, 0.9), inset 0 1px 0 rgba(255, 255, 255, 0.04);
  position: relative;
  overflow: hidden;
}
.card::before {
  content: '';
  position: absolute; inset: 0 0 auto 0; height: 1px;
  background: linear-gradient(90deg,
    transparent 0%, rgba(224, 168, 111, 0.28) 22%, rgba(242, 212, 164, 0.42) 50%,
    rgba(224, 168, 111, 0.28) 78%, transparent 100%);
  pointer-events: none;
}

/* ---------- 标签 chip ---------- */
.chip {
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(224, 168, 111, 0.20);
  color: var(--label-2);
}
/* mobile.css 的激活态是 .chip.on（蓝底白字）→ 金描边金字 */
.chip.on {
  background: var(--tint-soft);
  border-color: rgba(242, 212, 164, 0.55);
  color: var(--gold);
  font-weight: 600;
}

/* ---------- 切换器（重点关注/实时热点）---------- */
.segment { background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(224, 168, 111, 0.18); }
.segment button {
  background: transparent;
  color: var(--label-2);
  border-radius: 9px;
}
.segment button.on {
  background: linear-gradient(180deg, #2a2118 0%, #20180f 100%);
  color: var(--gold);
  font-weight: 600;
  box-shadow: inset 0 0 0 1px rgba(242, 212, 164, 0.35);
}

/* ---------- 按钮 / 动作 ---------- */
.news-action, .retry-btn, .report-download, .back-link, .detail-link {
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid rgba(224, 168, 111, 0.22);
  color: var(--label-2);
}
.retry-btn { color: var(--gold); border-color: rgba(242, 212, 164, 0.4); }

/* ---------- 骨架屏：暖灰 ---------- */
.skeleton {
  background: linear-gradient(100deg, #14161a 40%, #1f2228 50%, #14161a 60%);
  background-size: 200% 100%;
}

/* ---------- 底部 tab bar ---------- */
.app-tabbar {
  background: rgba(7, 8, 10, 0.94);
  border-top: 1px solid rgba(224, 168, 111, 0.20);
}
.tab { color: var(--label-3); }
.tab.on { color: var(--gold); }

/* ---------- 登录页 ---------- */
.login-logo {
  /* 2026-10-17：黑金 H 标志自带造型，不再套方块底。 */
  background: none;
  border: 0;
  color: var(--gold);
}
.login-logo img { display: block; width: 72px; height: 72px; filter: drop-shadow(0 6px 16px rgba(0, 0, 0, 0.5)); }
/* 登录主按钮：金色填充（设计稿的层级感） */
#btn-login, .login-submit {
  background: linear-gradient(180deg, #d9a765 0%, #b17f47 100%);
  color: #1a1206;
  border: 0;
  font-weight: 600;
}

/* ---------- 热度徽章 / 标签 ---------- */
.news-tag {
  background: var(--tint-soft);
  color: var(--gold);
  border: 1px solid rgba(242, 212, 164, 0.22);
}
.module-title {
  font-size: 15px;
  font-weight: 600;
  color: var(--gold);
  letter-spacing: 0.02em;
  text-transform: none;
}

/* ---------- 资讯卡片：黑金卡面（.news-item 在 .card 上）---------- */
.news-title { color: var(--label-1); }
.news-brief { color: var(--label-2); }

/* ---------- 报告 ---------- */
.report-title { color: var(--label-1); }
.report-status { color: var(--gold); }
.case-meta, .detail-meta { color: var(--label-3); }
.interpret-box {
  background: rgba(242, 212, 164, 0.06);
  border: 1px solid rgba(224, 168, 111, 0.20);
}
/* 站内解读的分段标题：金色小标题，与正文形成层级但不抢原文入口的注意力 */
.interpret-section-title { color: var(--gold); }
/* 醒目的原文入口（M02 合同要求）：金描边实心按钮，是详情页的主要动作。
   比一般次级按钮更亮，但不使用金色实底——避免与「登录」这类主操作同权重。 */
.detail-origin {
  background: linear-gradient(168deg, rgba(242, 212, 164, 0.14) 0%, rgba(242, 212, 164, 0.06) 100%);
  border: 1px solid rgba(242, 212, 164, 0.45);
  color: var(--gold);
}
.report-body { color: var(--label-1); }
.report-section-title, .report-subsection-title, .report-doc-title {
  color: #fff;
}
.report-thesis {
  border-left: 3px solid rgba(242, 212, 164, 0.5);
  background: rgba(242, 212, 164, 0.05);
}

/* ---------- 表格（报告里的长表）---------- */
.table-scroll table { color: var(--label-1); }
.table-scroll th { background: rgba(255, 255, 255, 0.05); }
.table-scroll td { border-color: var(--separator); }

/* ---------- 无障碍：金色焦点环全局 ---------- */
.tab.on .tab-label { font-weight: 600; }

/* css/overview.css */
/* ============================================================
   信息概览（gold-v1 定稿视觉）· 正式接入版
   ------------------------------------------------------------
   只服务 mobile/js/overview.js 渲染的 .ov-* 结构。
   设计值取自 design-gold-v1.css（用户已定稿），但：
   · 全部类名加 ov- 前缀，不与 mobile.css 既有选择器冲突（M04：不污染正式主题）
   · 变量局部化在 .ov-section 上，不改 :root（避免影响资讯/报告两栏目的既有视觉）
   · 字号沿用 mobile.css 的可读性下限结论（正文≥13.5 / 元信息≥12）
   ============================================================ */

.ov-section {
  /* —— gold-v1 局部变量（只在概览区内生效）—— */
  --ov-bg: #07080a;
  --ov-card-hi: #181a1e;
  --ov-card-lo: #0e1014;
  --ov-card-line: rgba(56, 62, 74, 0.5);
  --ov-text: #ecebe8;
  --ov-light: #f2d4a4;
  --ov-copper: #cc9166;

  /* 仪表外接尺寸。素材亮环外径只占图片 64.4%（实测 206/320），
     参考图环外径 ≈118 CSS → 图片盒 118/0.644 ≈ 183px。
     按 132px 设会让环只有 85 CSS（"仪表盘明显偏小"的根因，勿回退）。
     2026-09-29 首屏压缩：183 → 158（环外径 118 → 102，仍明显大于 85 的下限）。 */
  --ov-gauge: 158px;

  margin: 0 0 4px;
}

/* ---------- 资讯页头（设计稿版式，不含星球装饰）---------- */
.ov-hero {
  margin: 2px 0 16px;
}
.ov-hero-date {
  margin: 0 0 6px;
  font-size: 15px;
  font-weight: 600;
  color: var(--ov-light);
}
.ov-hero-date i {
  font-style: normal;
  margin-left: 8px;
  font-weight: 500;
  color: var(--ov-label-2, rgba(236, 235, 232, 0.62));
}
.ov-hero-title {
  margin: 0;
  font-family: var(--f-serif, "Noto Serif SC", Georgia, serif);
  font-size: clamp(28px, 8.6vw, 33px);
  font-weight: 600;
  line-height: 1.18;
  letter-spacing: 0.01em;
  color: #fff;
}
.ov-hero-sub {
  margin: 8px 0 0;
  font-size: 13.5px;
  color: rgba(236, 235, 232, 0.62);
}

/* ---------- 卡头与分隔线（2026-09-29 合并仪表卡）----------
   「信息概览」标题在卡内；细分隔线负外边距通到卡缘，把上半仪表与
   下方七日焦点分成同卡的两个分区。 */
.ov-dash-head { margin: 0 0 6px; }
.ov-dash-sep {
  border: 0;
  border-top: 1px solid rgba(242, 212, 164, 0.14);
  margin: 10px -11px 0;
}

.ov-title {
  margin: 0;
  font-size: 19px;
  font-weight: 600;
  line-height: 1.35;
  color: #fff;
}

/* ---------- 总览卡片 ---------- */
.ov-dash {
  position: relative;
  padding: 7px 11px;
  border-radius: 14px;
  border: 1px solid var(--ov-card-line);
  background: linear-gradient(168deg, var(--ov-card-hi) 0%, #131519 46%, var(--ov-card-lo) 100%);
  box-shadow: 0 10px 30px -16px rgba(0, 0, 0, 0.9), inset 0 1px 0 rgba(255, 255, 255, 0.04);
  overflow: hidden;
}
/* 卡片顶部一道极淡的金色光带（点缀） */
.ov-dash::before {
  content: '';
  position: absolute; inset: 0 0 auto 0;
  height: 1px;
  background: linear-gradient(90deg,
    transparent 0%, rgba(224, 168, 111, 0.30) 22%, rgba(242, 212, 164, 0.45) 50%,
    rgba(224, 168, 111, 0.30) 78%, transparent 100%);
  pointer-events: none;
}

/* 上排：圆环 + KPI 竖排 */
.ov-dash-top {
  display: grid;
  grid-template-columns: minmax(0, var(--ov-gauge)) minmax(0, 1fr);
  gap: 10px;
  align-items: center;
}
/* 窄屏断点合并进 KPI 节末尾的 @media (max-width: 379px)。 */

/* ---------- 圆环仪表 ---------- */
.ov-gauge { display: flex; justify-content: center; }
.ov-gauge-stage {
  position: relative; isolation: isolate;
  width: 100%; max-width: var(--ov-gauge);
  aspect-ratio: 1 / 1;
  margin-inline: auto;
}
.ov-gauge-art {
  position: absolute; inset: 0; z-index: 0;
  width: 100%; height: 100%;
  object-fit: contain;
  pointer-events: none;
  /* 素材是不透明黑底图（交接单明示，非透明 PNG）。
     设计稿整页就是纯黑底所以看不出；正式页卡片底是深灰渐变，
     必须把图片外沿的黑底淡出，否则露出一块方形黑底（实测踩过）。 */
  -webkit-mask-image: radial-gradient(circle closest-side at 50% 50%, #000 62%, transparent 96%);
  mask-image: radial-gradient(circle closest-side at 50% 50%, #000 62%, transparent 96%);
}
/* 环描边：素材环半径占半宽 ≈0.613（实测正圆，椭圆度 1.037）→ 内缩 19% */
.ov-gauge-stage::before {
  content: '';
  position: absolute; inset: 19%;
  border-radius: 50%;
  border: 1.5px solid rgba(240, 200, 140, 0.55);
  box-shadow: 0 0 12px 2px rgba(224, 168, 111, 0.34),
              inset 0 0 10px 1px rgba(224, 168, 111, 0.22);
  pointer-events: none;
  z-index: 1;
  -webkit-mask-image: linear-gradient(135deg, #000 6%, rgba(0,0,0,0.90) 44%, rgba(0,0,0,0.42) 100%);
  mask-image: linear-gradient(135deg, #000 6%, rgba(0,0,0,0.90) 44%, rgba(0,0,0,0.42) 100%);
  animation: ov-ring-breathe 8s ease-in-out infinite;
}
/* 环外柔光（与环本体同步 8s） */
.ov-gauge-stage::after {
  content: '';
  position: absolute; inset: -4%;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(242, 212, 164, 0.18) 0%, rgba(204, 145, 102, 0.09) 44%, transparent 70%);
  animation: ov-gauge-breathe 8s ease-in-out infinite;
  pointer-events: none;
  z-index: 0;
}
@keyframes ov-ring-breathe {
  0%, 100% { opacity: 0.72; }
  50%      { opacity: 1; }
}
@keyframes ov-gauge-breathe {
  0%, 100% { opacity: 0.40; transform: scale(1); }
  50%      { opacity: 0.62; transform: scale(1.02); }
}

/* 环上亮点：旋转载体绕中心公转（26s/圈，很慢） */
.ov-gauge-ring {
  position: absolute; inset: 19%;
  border-radius: 50%;
  pointer-events: none;
  z-index: 3;
  animation: ov-ring-spin 26s linear infinite;
}
@keyframes ov-ring-spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
.ov-gauge-node {
  position: absolute;
  top: 0; left: 50%;
  width: 7px; height: 7px; border-radius: 50%;
  margin: -3.5px 0 0 -3.5px;
  background: radial-gradient(circle, #fffaf0 0%, #f2d4a4 55%, rgba(242, 212, 164, 0) 100%);
  box-shadow: 0 0 9px 3px rgba(253, 240, 213, 0.75);
  animation: ov-node-pulse 8s ease-in-out infinite;
  animation-delay: -4s;
}
@keyframes ov-node-pulse {
  0%, 100% { opacity: 0.82; transform: scale(0.95); }
  50%      { opacity: 1;   transform: scale(1.06); }
}

.ov-gauge-copy {
  position: absolute; inset: 0; z-index: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center;
}
.ov-gauge-value {
  font-size: 27px; font-weight: 600; line-height: 1.1;
  font-variant-numeric: tabular-nums;
  color: #fff;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.55);
}
.ov-gauge-label {
  margin-top: 2px;
  font-size: 12px;
  color: var(--ov-light);
  opacity: 0.9;
}

/* ---------- 两项 KPI（PIL-103）----------
   原三格（信源数 / 7日热词 / AI 解读）缺少决策价值，改为仪表右侧单列两项：
   「24h动态」（独立 24h 统计）与「信源」（168h total_sources）。
   沿用 PIL-100 的排版结论：数值在上、短标签在下，行间只用细分隔线 + 留白。
   360px 实算：卡片内宽约 300，减仪表 158 + 间距 10，右栏约 130px；
   「24h动态」19px 数字 + 12px 四字标签（≈48px）均单行放得下。
   两项时格子更矮，不足以撑满 168px 仪表：grid-auto-rows:1fr 拉伸等高。 */
.ov-kpi-grid {
  list-style: none;
  margin: 0; padding: 0;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-auto-rows: 1fr;
  min-width: 0;
}
.ov-kpi-cell {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px;
  padding: 12px 4px;
  min-width: 0;
}
.ov-kpi-cell + .ov-kpi-cell {
  border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.ov-kpi-value {
  font-size: 19px; font-weight: 600; line-height: 1.15;
  font-variant-numeric: tabular-nums;
  color: var(--ov-light);
  white-space: nowrap;
}
.ov-kpi-label {
  font-size: 13px;
  line-height: 1.3;
  color: rgba(235, 235, 245, 0.58);
  white-space: nowrap;
}

/* <379px：仪表上下排，KPI 退到仪表下方两列，分隔线随之转竖。 */
@media (max-width: 379px) {
  .ov-dash-top { grid-template-columns: minmax(0, 1fr); }
  .ov-kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ov-kpi-cell + .ov-kpi-cell {
    border-top: 0;
    border-left: 1px solid rgba(255, 255, 255, 0.06);
  }
}

/* ---------- TOP 区宿主 ----------
   2026-09-29 合并仪表卡：宿主在卡内、分隔线之下，挂 hotspots.js 的
   七日焦点排名榜（.hs-*）；自身的纵向间距交给分隔线与卡底内边距。 */
.ov-top-host { margin-top: 2px; padding-bottom: 6px; }

/* ---------- 骨架 / 重试 ---------- */
.ov-body { display: grid; gap: 10px; }
.ov-skeleton {
  height: 78px;
  border-radius: 12px;
  border: 1px solid rgba(255, 255, 255, 0.05);
  background: linear-gradient(100deg, rgba(255,255,255,0.03) 30%, rgba(255,255,255,0.07) 50%, rgba(255,255,255,0.03) 70%);
  background-size: 220% 100%;
  animation: ov-shimmer 1.4s linear infinite;
}
@keyframes ov-shimmer {
  from { background-position: 180% 0; }
  to   { background-position: -80% 0; }
}
.ov-retry {
  min-height: 44px;
  padding: 10px 14px;
  border-radius: 10px;
  border: 1px solid rgba(255, 255, 255, 0.10);
  background: rgba(255, 255, 255, 0.04);
  color: rgba(235, 235, 245, 0.80);
  font-size: 13.5px;
  cursor: pointer;
}
.ov-retry:disabled { opacity: 0.55; }

/* ---------- 降级：不做呼吸/公转，但停在可见状态 ---------- */
@media (prefers-reduced-motion: reduce) {
  .ov-gauge-stage::before,
  .ov-gauge-stage::after,
  .ov-gauge-ring,
  .ov-gauge-node { animation: none !important; }
  .ov-gauge-stage::before { opacity: 1; }
  .ov-skeleton { animation: none !important; }
}

/* css/hotspots-gold.css */
/* ============================================================
   七日焦点（近 7 天热点词）· 黑金主题 · 排名条形榜
   ------------------------------------------------------------
   只服务 mobile/js/hotspots.js 渲染的 .hs-* 结构（类名全部 hs- 前缀，
   不与 mobile.css / overview.css 既有选择器冲突，变量局部化在 .hs-panel 上，
   不改 :root）。

   2026-09-29 用户定稿（替换 PIL-102 的圆形轨道图）：
   · 设计真相源：design-ref/mobile-gold-v2-20260929.html（回最初设计稿的
     「本周热点 TOP」形态）——序号 + 词 + 篇数条 + 准确篇数，单列降序。
   · 条长 = 该词篇数 ÷ 本业务最大篇数，走 barLevel 的 **5% 档位**（21 个确定
     取值），由 JS 经 CSSOM 写 width——CSP 的 style-src 'self' 禁止 HTML 内联
     style 属性，CSSOM 赋值不受限（本仓库既有做法，如搜索框的 flex）。
   · 篇数缺失（或真实为零）时**不画条**（条形只留空轨道底槽）：
     「不知道」不能画成「没有热度」；文字上「篇数缺失」与「0 篇」可辨别。
   · 颜色从不独占信息：序号、「n 篇」数字与条长同时在场，色觉障碍用户不漏信息；
     读屏用户由 <ol> 的序号与 aria-label 里的序号/词/篇数拿到全部事实；
     条形整体 aria-hidden。
   · 每行是整块按钮，min-height 走 --tap（≥44px），键盘可聚焦（focus-visible 金色描边）。
   · 不渲染「比较说明」：客户端不承担上期/环比口径。
   · 面板内嵌在概览仪表卡内（overview.js 合并卡），不再自带业务选择器
     （切换入口在底栏，见 app.js）。

   本层仍然只是一层视觉：不改任何数据结构、请求时序或路由行为。
   ============================================================ */

.hs-panel {
  --hs-text: #ecebe8;
  --hs-gold: #f2d4a4;
  --hs-copper: #cc9166;
  --hs-track: rgba(255, 255, 255, 0.09);

  margin-top: 0; /* 内嵌在仪表卡内，纵向节奏由卡与分隔线承担 */
}

.hs-host { margin-top: 0; }

.hs-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
}
.hs-title {
  margin: 0;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.35;
  color: var(--hs-gold);
}
.hs-scope {
  font-size: 11.5px;
  color: rgba(236, 235, 232, 0.42);
  white-space: nowrap;
}

/* ---------- 排名榜容器 ----------
   一个 <ol>：位置即频率（服务端已按篇数降序，面板不再重排）。
   单列整宽行，行间发丝线。display:grid 在 Safari/VoiceOver 下会吃掉列表语义，
   所以 <ol> 显式带 role="list"（见 hotspots.js）。 */
.hs-ranked {
  list-style: none;
  margin: 0;
  padding: 0;
}

/* ---------- 每行都是整宽按钮（点哪里都进钻取，触控高度 ≥44px）----------
   列：序号 / 词（可收缩，省略号截断展示、完整词面在 aria 里） / 条 / 篇数。 */
.hs-word {
  display: grid;
  grid-template-columns: 24px minmax(0, 1fr) minmax(48px, 88px) auto;
  align-items: center;
  gap: 10px;
  width: 100%;
  min-height: var(--tap, 44px);
  padding: 8px 2px;
  border: 0;
  border-radius: 0;
  background: none;
  color: var(--hs-text);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
/* 行分隔：只在与上一行之间画一条发丝线。 */
.hs-ranked-item + .hs-ranked-item .hs-word {
  border-top: 1px solid rgba(255, 255, 255, 0.055);
}
/* 焦点描边内收：整宽行上不会越出容器造成横向溢出。 */
.hs-word:focus-visible { outline: 2px solid var(--hs-gold); outline-offset: -2px; }

/* 序号与篇数：小号文字必须过 WCAG AA。
   0.34 在 #0e0e10 上实测仅 2.75:1，12px 小字达不到 AA（需 4.5:1）——
   与 mobile.css 里 --label-3 从 0.36 提到 0.58 是同一个坑，勿回退。
   序号用铜金强调（榜的次序感），篇数用金色——两者都 ≥4.5:1（hero 卡深底实测）。 */
.hs-word-rank {
  font-size: 12px;
  line-height: 1.3;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.04em;
  color: var(--hs-copper);
}
.hs-word-count {
  font-size: 13px;
  line-height: 1.3;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--hs-gold);
}
.hs-word-label {
  min-width: 0;
  /* 长词不撑破布局：展示上单行省略，完整词面仍由 aria 转述（keywordAria）。 */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-weight: 500;
  line-height: 1.3;
  color: var(--hs-text);
}

/* ---------- 篇数条：长度 = 篇数 ÷ 本业务最大篇数（barLevel 5% 档位）----------
   条是装饰（篇数已由文本与 aria 承载），整个条 aria-hidden；
   底槽是所有行等长的淡轨道，填充电平由 JS 写在 .hs-bar-fill 的 width 上。 */
.hs-bar {
  height: 4px;
  border-radius: 2px;
  background: var(--hs-track);
  overflow: hidden;
}
.hs-bar-fill {
  display: block;
  height: 100%;
  border-radius: 2px;
  background: linear-gradient(90deg, rgba(204, 145, 102, 0.55), var(--hs-gold));
  box-shadow: 0 0 6px rgba(242, 212, 164, 0.30);
}
/* 缺数据/零篇：底槽更淡一档，明确「这里没有画任何热度」。 */
.hs-bar-empty { background: rgba(255, 255, 255, 0.05); }

/* ---------- 四档：字重与明度逐级递减 ----------
   档位来自 篇数 ÷ 本业务最大篇数（hotspots.js weightTier），而列表已按篇数降序，
   所以「首位最重最亮、后续逐级降低」是数据本身推出来的，不是按行号硬编的。
   数字与序号始终在场：颜色与字重只是辅助编码。条长另有 barLevel 的独立编码。 */
.hs-w0 .hs-word-label { color: rgba(236, 235, 232, 0.64); }

.hs-w1 .hs-word-label { color: rgba(236, 235, 232, 0.80); }

.hs-w2 .hs-word-label { color: rgba(240, 226, 205, 0.93); font-weight: 600; }

.hs-w3 .hs-word-label { color: rgba(242, 229, 205, 0.97); font-weight: 600; }
.hs-w3 .hs-word-count { color: rgba(240, 226, 205, 0.92); }

/* 首位：金色词面 + 克制的光感（很淡的一层文字辉光）。 */
.hs-w4 .hs-word-label {
  color: var(--hs-gold);
  font-weight: 600;
  text-shadow: 0 0 14px rgba(242, 212, 164, 0.20);
}
.hs-w4 .hs-word-count { font-weight: 700; }
.hs-w4 .hs-word-rank { color: rgba(242, 212, 164, 0.72); }

/* ---------- 钻取页（#/news/keyword/…）---------- */
.hs-detail-head { margin: 0 0 10px; }
.hs-detail-title {
  margin: 0 0 4px;
  font-size: 20px;
  font-weight: 600;
  line-height: 1.35;
  color: #fff;
  overflow-wrap: anywhere;
}
.hs-detail-sub {
  margin: 0;
  font-size: 12.5px;
  color: rgba(236, 235, 232, 0.58);
}
.hs-keyword-item .news-meta { gap: 8px; }

/* ---------- 状态：加载 / 缺数据 ---------- */
.hs-skeleton {
  height: 44px;
  border-radius: 10px;
  border: 1px solid rgba(255, 255, 255, 0.05);
  background: linear-gradient(100deg, rgba(255, 255, 255, 0.03) 30%, rgba(255, 255, 255, 0.07) 50%, rgba(255, 255, 255, 0.03) 70%);
  background-size: 220% 100%;
  animation: hs-shimmer 1.4s linear infinite;
}
.hs-skeleton + .hs-skeleton { margin-top: 6px; }
@keyframes hs-shimmer {
  from { background-position: 180% 0; }
  to   { background-position: -80% 0; }
}

/* ---------- 窄屏（≤379px，含 320/360）：只收紧留白与间隙 ----------
   条形列会按 minmax(48px, 88px) 自行收缩，序号列固定 24px 不缩；
   真正防溢出的是 minmax(0,1fr) 的词列与省略号截断。 */
@media (max-width: 379px) {
  .hs-word { gap: 7px; padding: 8px 1px; grid-template-columns: 22px minmax(0, 1fr) minmax(40px, 72px) auto; }
  .hs-word-label { font-size: 13.5px; }
}

/* ---------- 降级：不做骨架微光，也不做首位辉光 ---------- */
@media (prefers-reduced-motion: reduce) {
  .hs-skeleton { animation: none !important; }
  .hs-w4 .hs-word-label { text-shadow: none; }
  .hs-bar-fill { box-shadow: none; }
}

/* css/hero.css */
/* ============================================================
   资讯页头 hero（照搬 design-gold-v1 的页头区，2026-09-23）
   ------------------------------------------------------------
   用户明确："把设计稿的东西都搬过来，元素只能多不能少"。
   几何参数、注释、实测结论**原样保留**自 design-gold-v1.css，
   仅把选择器前加 .ov-hero-section 作用域限定，避免与其它页面冲突。
   依赖的素材与 design-gold-v1 相同（assets/intelligence/ 分层素材）。
   ============================================================ */

/* ---------- 页头 ----------
   实测缺陷（勿回退）：星球 186px 绝对定位 + 页头高度不足时，
   星球溢出页头 50px 压住总览卡、并压住右侧竖排文案。 */

.ov-hero-section {
  /* 页头：装饰（星球/轨道）向右出血，由 overflow 裁切。
     ⚠️ 实测缺陷（勿回退）：裁剪边界必须落在**视口边缘**。
     用 `calc(50% - 50vw)` 抵消 padding 与 max-width 居中留白，
     页头铺满视口，裁剪边界因此始终等于屏幕边缘。
     装饰层的定位上下文交给 .hero-inner（= 内容列）。 */
  position: relative;
  padding: 0 0 6px;
  /* 2026-09-29 首屏压缩：214 → 162。星球/轨道同比缩小（221→176），
     球底（hero 内 ~184px）溢出页头 ~22px，落在「信息概览」标题行右侧空白，
     不接触总览卡与 KPI 数字（截图复验）；元素一个不少，只收紧高度，
     让 390×844 首屏能看到第一条资讯（合同 §4）。 */
  min-height: 156px;
  margin-inline: calc(50% - 50vw);
  overflow-x: clip;
  overflow-y: visible;
  z-index: 0;
}

/* 窄屏时 .view-root 只留 16px 水平内边距；直接抵消它即可铺到可用内容边缘。
   100vw 在带传统竖滚动条的浏览器仍包含滚动条宽，原式会多出横向滚动。 */
@media (max-width: 736px) {
  .ov-hero-section { margin-inline: -16px; }
}

.ov-hero-section .hero-inner {
  /* 内容列：重新施加宽度与居中（因为页头铺满视口），
     同时作为**装饰层的定位上下文** —— 装饰锚定内容列，
     窄屏时被视口裁切、宽屏时自然溢出到列外留白，都不会被硬切。 */
  position: relative; z-index: 2;
  max-width: var(--page-max, 560px);
  margin: 0 auto;
  padding-inline: var(--gutter, 14px);
}

/* ① 星球层 —— 透明背景、无轨道、无卫星、无标注文字。
   球直径 218，球心距右缘 50 → 球可见左缘 = 390 − 50 − 109 = 231（让开标题）。
   图 445x424，球体紧裁铺满 → 宽 = 218 × 445/439 ≈ 221。
   2026-09-29 首屏压缩：221 → 176（top/right 同步内收，保持同心与出血裁切）。 */
.ov-hero-section .hero-planet {
  position: absolute; z-index: 1;
  top: 8px; right: -44px;
  width: 176px; height: auto;
  pointer-events: none;
}

/* ② 轨道层 —— back（远侧，星球后）+ front（近侧，星球前，mask 只露下半）。
   两层完全同位，拼合后仍是完整一环。分割线 = 实测椭圆长轴（159deg）。
   2026-09-29 与星球同步缩放（268 → 212），top/right 保持同心。 */
.ov-hero-section .hero-orbits {
  position: absolute;
  top: 26px; right: -64px;
  width: 212px; height: auto;
  pointer-events: none;
}
.ov-hero-section .hero-orbits.back { z-index: 0; }
.ov-hero-section .hero-orbits.front {
  z-index: 2;
  /* 蒙版 = 沿实测椭圆长轴（159deg）的**硬分界**：远侧整段透明、近侧整段显示。
     2026-09-29 用户实测反馈修复：原先 38%→72% 的宽过渡带把 front 层里
     **远侧的环段**也从星球脸上漏了出来（远侧必须被星球挡住，不可见）。
     分界中点 55% 沿用原过渡带的中点，只收窄羽化（±1.5%），不改变近/远侧的划分。 */
  -webkit-mask-image: linear-gradient(159deg, transparent 53.5%, #000 56.5%);
  mask-image: linear-gradient(159deg, transparent 53.5%, #000 56.5%);
}

/* 卫星定位容器：必须与星球/轨道层**同心**，否则卫星的椭圆轨道会与
   画面里的轨道环错位。取与 .hero-orbits 相同的 top/right/width。 */
.ov-hero-section .hero-orbit {
  position: absolute;
  top: 26px; right: -64px;
  width: 212px; height: 140px;
  pointer-events: none;
}

/* 大气呼吸光：叠加在星球受光边缘（很弱的明暗呼吸，不改变素材形状）。 */
.ov-hero-section .hero-limb {
  position: absolute; z-index: 1;
  top: -36px; right: -102px;
  width: 256px; height: 256px;
  border-radius: 50%;
  pointer-events: none;
  background: radial-gradient(circle at 38% 32%,
    rgba(255, 214, 158, 0.30) 0%,
    rgba(233, 176, 118, 0.16) 34%,
    rgba(204, 145, 102, 0.05) 58%,
    transparent 72%);
  -webkit-mask-image: radial-gradient(circle closest-side at 50% 50%, #000 78%, transparent 100%);
  mask-image: radial-gradient(circle closest-side at 50% 50%, #000 78%, transparent 100%);
  animation: hero-limb-breathe 7.5s ease-in-out infinite;
}
@keyframes hero-limb-breathe {
  0%, 100% { opacity: 0.34; }
  50%      { opacity: 0.66; }
}

/* 页头文字（在星球左侧，与星球不共享水平区间） */
.ov-hero-section .hero-copy {
  position: relative;
  min-width: 0;
  padding-top: 2px;
}
.ov-hero-section .hero-date {
  margin: 0 0 6px;
  font-size: 15px;
  font-weight: 600;
  color: var(--gold, #f2d4a4);
}
.ov-hero-section .hero-date i {
  font-style: normal;
  margin-left: 8px;
  font-weight: 500;
  color: var(--label-2, rgba(236, 235, 232, 0.62));
}
.ov-hero-section .hero-title {
  margin: 0;
  font-family: var(--f-serif, "Noto Serif SC", Georgia, serif);
  font-size: clamp(28px, 8.6vw, 33px);
  font-weight: 600;
  line-height: 1.18;
  letter-spacing: 0.01em;
  color: #fff;
}
.ov-hero-section .hero-sub {
  margin: 8px 0 0;
  font-size: 13.5px;
  color: var(--label-2, rgba(236, 235, 232, 0.62));
}

/* ---------- 卫星（4 颗，公转由 hero-orbit.js 驱动）---------- */
.ov-hero-section .sat {
  position: absolute;
  left: 50%; top: 50%;
  display: block;
  /* 卫星可视宽度由 --sw 控制（img width:100% 跟随）——
     漏掉这条会让 img 用 HTML 属性的原始尺寸（178px），卫星巨大（实测踩过） */
  width: var(--sw, 34px);
  margin-left: calc(var(--sw, 34px) / -2);
  margin-top: -11px;
  will-change: transform;
}
.ov-hero-section .sat img {
  display: block;
  width: 100%; height: auto;
  /* 金色外发光，让卫星在深底上"亮"起来（素材自带高光，不额外描边） */
  filter: drop-shadow(0 0 6px rgba(242, 212, 164, 0.5));
}

/* 各卫星的基准尺寸与不透明度（与设计稿一致） */
.ov-hero-section .sat-1 { --sw: 15px; }
.ov-hero-section .sat-2 { --sw: 13px; opacity: 0.92; }
.ov-hero-section .sat-3 { --sw: 11px; opacity: 0.8; }
.ov-hero-section .sat-4 { --sw: 10px; opacity: 0.86; }

/* 尊重减少动态偏好：呼吸光停用但保留可见；卫星由 JS 停轮询 */
@media (prefers-reduced-motion: reduce) {
  .ov-hero-section .hero-limb { animation: none !important; opacity: 0.5; }
}

/* css/report-gold.css */
/* 手机最终报告：内容优先的黑金阅读界面。 */

.report-list { display: grid; gap: 12px; min-width: 0; }

.ov-report-item {
  position: relative;
  min-width: 0;
  padding: 20px 18px 18px 21px;
  overflow: hidden;
}
.ov-report-item::before {
  content: '';
  position: absolute;
  inset: 16px auto 16px 0;
  width: 3px;
  border-radius: 0 2px 2px 0;
  background: linear-gradient(180deg, rgba(242, 212, 164, 0.88), rgba(201, 144, 98, 0.3));
  pointer-events: none;
}
.ov-report-item .report-title {
  margin: 0;
  min-width: 0;
  font-size: clamp(17px, 4.6vw, 20px);
  font-weight: 600;
  line-height: 1.45;
  color: var(--label-1, #ecebe8);
  overflow-wrap: anywhere;
  text-wrap: balance;
}
.ov-report-item .report-title-link {
  color: inherit;
  text-decoration: none;
  outline-offset: 4px;
  touch-action: manipulation;
}
.ov-report-item .report-title-link::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
}
.ov-report-item:active { opacity: 0.82; }
.ov-report-item .report-summary {
  display: -webkit-box;
  margin: 10px 0 0;
  overflow: hidden;
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 14px;
  line-height: 1.65;
  overflow-wrap: anywhere;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
}

.ov-report-detail { min-width: 0; overflow-x: clip; }
.ov-report-detail .back-link,
.ov-report-detail .report-download {
  display: inline-flex;
  min-height: 44px;
  align-items: center;
  color: var(--gold, #f2d4a4);
  font-weight: 600;
  text-decoration: none;
  outline-offset: 3px;
  touch-action: manipulation;
}
.ov-report-detail .back-link::before { content: '‹'; margin-right: 7px; font-size: 22px; }
.ov-report-detail .detail-title {
  margin: 8px 0 20px;
  color: #fff;
  font-size: clamp(24px, 7vw, 34px);
  font-weight: 600;
  line-height: 1.28;
  overflow-wrap: anywhere;
  text-wrap: balance;
}
.ov-report-detail .report-overview {
  --report-pad: 18px;
  min-width: 0;
  padding: 22px var(--report-pad) 24px;
  border: 1px solid rgba(242, 212, 164, 0.18);
  border-radius: 18px;
  background: linear-gradient(155deg, rgba(242, 212, 164, 0.075), rgba(255, 255, 255, 0.025) 34%, rgba(255, 255, 255, 0.018));
}
.ov-report-detail .report-overview-title {
  margin: 0 0 18px;
  color: var(--gold, #f2d4a4);
  font-size: 19px;
  font-weight: 650;
  line-height: 1.35;
}
.ov-report-detail .report-summary-block + .report-summary-block {
  margin-top: 20px;
  padding-top: 20px;
  border-top: 1px solid var(--separator, rgba(56, 62, 74, 0.5));
}
.ov-report-detail .report-visual + .report-summary-block,
.ov-report-detail .report-pathways + .report-summary-block,
.ov-report-detail .report-data-visual + .report-summary-block {
  margin-top: 24px;
  padding-top: 20px;
  border-top: 1px solid var(--separator, rgba(56, 62, 74, 0.5));
}
.ov-report-detail .report-summary-block h3,
.ov-report-detail .report-key-data figcaption {
  margin: 0 0 8px;
  color: var(--label-2, rgba(236, 235, 232, 0.82));
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.06em;
}
.ov-report-detail .report-summary-block p {
  margin: 0;
  color: var(--label-1, #ecebe8);
  font-size: 16px;
  line-height: 1.8;
  overflow-wrap: anywhere;
  white-space: pre-line;
}
.ov-report-detail .report-key-data,
.ov-report-detail .report-visual,
.ov-report-detail .report-pathways,
.ov-report-detail .report-data-visual { margin: 28px 0 0; min-width: 0; }
.ov-report-detail .report-visual { margin-inline: calc(-1 * var(--report-pad)); }
.ov-report-detail .report-key-data > figcaption,
.ov-report-detail .report-pathways > figcaption,
.ov-report-detail .report-data-visual > figcaption {
  margin: 0 0 12px;
  color: var(--gold, #f2d4a4);
  font-size: 14px;
  font-weight: 650;
  letter-spacing: 0.02em;
}
.ov-report-detail .report-data-visual {
  padding: 18px;
  border: 1px solid rgba(242, 212, 164, 0.23);
  border-radius: 14px;
  background: linear-gradient(140deg, rgba(242, 212, 164, 0.09), rgba(4, 5, 7, 0.43));
}
.ov-report-detail .report-data-visual > figcaption { margin-bottom: 5px; }
.ov-report-detail .report-data-snapshot > figcaption { margin-bottom: 12px; }
.ov-report-detail .report-data-note {
  margin: 0 0 17px;
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 12.5px;
  line-height: 1.55;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-data-bars { display: grid; gap: 16px; }
.ov-report-detail .report-data-bar-heading {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 3px 12px;
  color: var(--label-1, #ecebe8);
  font-size: 13.5px;
  line-height: 1.5;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-data-bar-heading strong {
  color: var(--gold, #f2d4a4);
  font-variant-numeric: tabular-nums;
  font-weight: 650;
}
.ov-report-detail .report-data-meter {
  display: block;
  width: 100%;
  height: 11px;
  margin-top: 7px;
  appearance: none;
  background: rgba(242, 212, 164, 0.13);
}
.ov-report-detail .report-data-meter::-webkit-meter-bar {
  border: 0;
  border-radius: 7px;
  background: rgba(242, 212, 164, 0.13);
}
.ov-report-detail .report-data-meter::-webkit-meter-optimum-value {
  border-radius: 7px;
  background: var(--gold, #f2d4a4);
}
.ov-report-detail .report-data-meter::-moz-meter-bar {
  border-radius: 7px;
  background: var(--gold, #f2d4a4);
}
.ov-report-detail .report-data-snapshot-list { display: grid; gap: 0; margin: 0; }
.ov-report-detail .report-data-snapshot-item {
  min-width: 0;
  padding: 13px 0;
  border-top: 1px solid rgba(242, 212, 164, 0.17);
}
.ov-report-detail .report-data-snapshot-item dt {
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 13px;
  line-height: 1.55;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-data-snapshot-item dd { margin: 0; overflow-wrap: anywhere; }
.ov-report-detail .report-data-snapshot-value {
  margin-top: 4px !important;
  color: var(--gold, #f2d4a4);
  font-size: 17px;
  font-weight: 620;
  line-height: 1.55;
  font-variant-numeric: tabular-nums;
}
.ov-report-detail .report-data-snapshot-context {
  margin-top: 4px !important;
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 12px;
  line-height: 1.55;
}
.ov-report-detail .report-metrics { display: grid; gap: 10px; margin: 0; padding: 0; }
.ov-report-detail .report-metric {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 4px;
  padding: 14px 16px;
  border: 1px solid rgba(242, 212, 164, 0.13);
  border-radius: 12px;
  background: rgba(4, 5, 7, 0.3);
}
.ov-report-detail .report-metric dt {
  min-width: 0;
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 13px;
  font-weight: 600;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-metric-value {
  min-width: 0;
  margin: 0;
  color: var(--gold, #f2d4a4);
  font-size: 25px;
  font-weight: 650;
  line-height: 1.3;
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-metric-detail {
  margin: 0;
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 13px;
  line-height: 1.55;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-visual img {
  display: block;
  width: 100%;
  height: auto;
  max-height: none;
  object-fit: contain;
  border: 1px solid rgba(242, 212, 164, 0.15);
  border-radius: 14px;
}
.ov-report-detail .report-visual figcaption {
  margin-top: 9px;
  padding-inline: var(--report-pad);
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 12.5px;
  line-height: 1.55;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-pathway + .report-pathway { margin-top: 18px; }
.ov-report-detail .report-pathway-title {
  margin: 0 0 10px;
  color: var(--label-1, #ecebe8);
  font-size: 15px;
  line-height: 1.5;
}
.ov-report-detail .report-pathway-steps {
  margin: 0;
  padding: 0;
  list-style: none;
  counter-reset: pathway-step;
}
.ov-report-detail .report-pathway-step {
  position: relative;
  min-width: 0;
  margin-left: 12px;
  padding: 0 0 16px 26px;
  border-left: 1px solid rgba(242, 212, 164, 0.3);
  counter-increment: pathway-step;
}
.ov-report-detail .report-pathway-step:last-child { padding-bottom: 0; border-left-color: transparent; }
.ov-report-detail .report-pathway-step::before {
  content: counter(pathway-step);
  position: absolute;
  top: 0;
  left: -12px;
  display: grid;
  width: 23px;
  height: 23px;
  place-items: center;
  border: 1px solid rgba(242, 212, 164, 0.55);
  border-radius: 50%;
  background: #191814;
  color: var(--gold, #f2d4a4);
  font-size: 12px;
  font-variant-numeric: tabular-nums;
}
.ov-report-detail .report-pathway-step strong {
  display: block;
  color: var(--label-1, #ecebe8);
  font-size: 14px;
  line-height: 1.55;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-pathway-step p {
  margin: 3px 0 0;
  color: var(--label-2, rgba(236, 235, 232, 0.76));
  font-size: 13.5px;
  line-height: 1.6;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-narrative { min-width: 0; margin: 32px 2px 0; }
.ov-report-detail .report-narrative .report-section {
  min-width: 0;
  margin: 0;
  padding: 24px 0 2px;
  border-top: 1px solid rgba(242, 212, 164, 0.18);
}
.ov-report-detail .report-narrative .report-section + .report-section { margin-top: 23px; }
.ov-report-detail .report-narrative .report-section-title {
  margin: 0 0 13px;
  padding: 0;
  border: 0;
  color: var(--gold, #f2d4a4);
  font-size: 19px;
  font-weight: 650;
  line-height: 1.45;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-section-thesis {
  margin: 0 0 13px;
  padding-left: 13px;
  border-left: 2px solid rgba(242, 212, 164, 0.72);
  color: var(--label-1, #ecebe8);
  font-size: 16px;
  font-weight: 600;
  line-height: 1.65;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-section-body { min-width: 0; }
.ov-report-detail .report-section-body p {
  margin: 0 0 0.9em;
  color: var(--label-1, #ecebe8);
  font-size: 15.5px;
  line-height: 1.82;
  overflow-wrap: anywhere;
}
.ov-report-detail .report-section-body p:last-child { margin-bottom: 0; }
.ov-report-detail .report-download {
  width: 100%;
  min-height: 48px;
  justify-content: center;
  margin: 28px 0 0;
  border: 1px solid rgba(242, 212, 164, 0.38);
  border-radius: 12px;
  background: rgba(242, 212, 164, 0.08);
}
.ov-report-detail .report-download:active { background: rgba(242, 212, 164, 0.16); }
.ov-report-detail .retry-btn,
.report-retry { min-height: 44px; touch-action: manipulation; }

@media (min-width: 700px) {
  .report-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ov-report-detail { max-width: 760px; margin-inline: auto; }
  .ov-report-detail .report-overview { --report-pad: 30px; padding-block: 28px; }
  .ov-report-detail .report-metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 350px) {
  .ov-report-detail .report-overview { --report-pad: 15px; }
  .ov-report-detail .report-metric { padding-inline: 13px; }
}

@media (prefers-reduced-motion: reduce) {
  .ov-report-item, .ov-report-item * { transition: none !important; }
}

/* ---- 2026-10-17 报告阅读页：结论 → 关键数据 → 要点与图表交替（图文版） ---- */
.ov-report-detail .rd-hero { padding-bottom: 20px; border-bottom: 1px solid var(--separator); }
.ov-report-detail .rd-hero .detail-title { font-family: var(--f-serif); font-size: 26px; line-height: 1.32; letter-spacing: -0.01em; text-wrap: balance; margin: 6px 0 0; }
.ov-report-detail .rd-meta { margin: 12px 0 0; color: var(--label-3); font-size: 13px; font-variant-numeric: tabular-nums; }
.ov-report-detail .rd-verdict {
  margin: 24px 0 0; padding: 16px 18px 18px 16px;
  background: linear-gradient(180deg, rgba(242, 212, 164, 0.09), rgba(242, 212, 164, 0.03));
  border: 1px solid rgba(242, 212, 164, 0.16); border-left: 3px solid var(--copper); border-radius: 4px 14px 14px 4px;
}
.ov-report-detail .rd-eyebrow { margin: 0 0 8px; color: var(--gold); font-size: 12px; font-weight: 600; letter-spacing: 0.08em; }
.ov-report-detail .rd-verdict .report-reading-lead { margin: 0; color: var(--label-1); font-size: 17px; line-height: 1.75; text-wrap: pretty; }
.ov-report-detail .rd-heading {
  display: flex; align-items: center; gap: 12px; margin: 36px 0 14px;
  font-family: var(--f-serif); font-size: 20px; font-weight: 600; color: var(--label-1);
}
.ov-report-detail .rd-heading::after { content: ''; flex: 1; height: 1px; background: var(--separator); }
.ov-report-detail .report-reading-metrics {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); gap: 10px;
  margin: 0; padding: 0; list-style: none;
}
.ov-report-detail .rd-metric { display: grid; align-content: start; gap: 6px; min-width: 0; padding: 14px 15px 15px; background: var(--card-bg); border-radius: 12px; }
.ov-report-detail .rd-metric:has(.is-long) { grid-column: 1 / -1; }
.ov-report-detail .rd-metric-label { color: var(--label-3); font-size: 12.5px; line-height: 1.45; }
.ov-report-detail .rd-metric-value { color: var(--gold); font-size: 22px; font-weight: 650; line-height: 1.25; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.ov-report-detail .rd-metric-value.is-long { color: var(--label-1); font-size: 16px; font-weight: 600; line-height: 1.55; }
.ov-report-detail .rd-metric-note { position: relative; padding-left: 11px; color: var(--label-2); font-size: 13px; line-height: 1.6; }
.ov-report-detail .rd-metric-note::before { content: ''; position: absolute; left: 0; top: 0.68em; width: 4px; height: 4px; border-radius: 50%; background: rgba(242, 212, 164, 0.45); }
.ov-report-detail .rd-chapter { margin: 0; padding: 4px 0 2px; }
.ov-report-detail .rd-chapter + .rd-chapter, .ov-report-detail .report-reading-figure + .rd-chapter { margin-top: 26px; }
.ov-report-detail .rd-chapter-title { display: flex; align-items: baseline; gap: 10px; margin: 0; color: var(--label-1); font-size: 17px; font-weight: 650; line-height: 1.45; }
.ov-report-detail .rd-chapter-no { flex: none; min-width: 26px; color: var(--copper); font-family: var(--f-serif); font-size: 15px; font-variant-numeric: tabular-nums; }
.ov-report-detail .rd-chapter-text { margin: 8px 0 0 36px; color: var(--label-2); font-size: 15.5px; line-height: 1.85; text-wrap: pretty; }
.ov-report-detail .report-reading-figure { margin: 22px 0 0; }
.ov-report-detail .rd-figure-cap { display: flex; align-items: baseline; gap: 8px; margin: 0 2px 10px; color: var(--label-2); font-size: 13px; line-height: 1.5; }
.ov-report-detail .rd-figure-no { flex: none; color: var(--gold); font-weight: 600; }
.ov-report-detail .rd-figure-frame {
  padding: 4px; background: #fbfaf7; border-radius: 14px;
  box-shadow: inset 0 0 0 1px rgba(242, 212, 164, 0.22), 0 14px 30px -20px rgba(0, 0, 0, 0.9);
}
.ov-report-detail .rd-figure-frame img { display: block; width: 100%; height: auto; border-radius: 11px; }
.ov-report-detail .report-reading-actions { margin-top: 36px; }
@media (max-width: 350px) { .ov-report-detail .rd-chapter-text { margin-left: 0; } }

/* css/editorial.css */
/* 资讯与报告共用的阅读层：字号、留白和分隔承担层级，金色只标识范围与动作。 */
.view-root { --read-muted: #b9b7b3; }
.news-item, .ov-report-item {
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(242, 212, 164, .13);
  border-radius: 0;
  box-shadow: none;
  margin: 0;
}
.news-item:active, .ov-report-item:active { background: rgba(242, 212, 164, .045); }

/* 2026-09-29 设计定稿清理：七日焦点改排名条形榜（样式在 hotspots-gold.css，
   本文件原轨道覆盖规则随轨道图移除）；事件类型子栏目从首页主流程收进
   「筛选」面板（.chip），原 .feed-categories / .feed-category-tab 样式移除。
   业务切换入口在底栏（mobile.css 的 .tab-edge / .biz-slot）。 */

/* 同一行的业务切换；下一行只显示当前业务对应的栏目。 */
.report-businesses {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 2px;
  border-bottom: 1px solid rgba(242,212,164,.18);
  margin: 22px 0 10px;
}
.report-business-tab {
  min-width: 0; min-height: 46px; padding: 7px 0;
  border: 0; border-bottom: 2px solid transparent;
  background: transparent; color: var(--read-muted);
  font-size: 12px; font-weight: 500; line-height: 1.2;
  white-space: nowrap;
}
.report-business-tab.on {
  color: var(--gold); border-bottom-color: var(--gold); font-weight: 600;
}
.report-business-tab:focus-visible { outline: 2px solid var(--gold); outline-offset: -2px; }
.news-item { padding: 19px 2px 17px; }
.news-item .news-meta {
  display: flex; align-items: baseline; gap: 7px; margin-bottom: 8px;
  color: var(--read-muted); font-size: 12px; line-height: 1.4;
}
.news-business { color: var(--gold); font-weight: 600; }
.news-category::before { content: '·'; margin-right: 7px; color: var(--read-muted); }
.news-time { margin-left: auto; white-space: nowrap; }
.news-item .news-title { font-size: 17px; font-weight: 600; line-height: 1.48; margin: 0 0 7px; text-wrap: pretty; }
.news-item.is-read .news-title { color: #e4dfd8; font-weight: 600; }
.news-item .news-brief {
  display: block; overflow: visible; -webkit-line-clamp: unset;
  margin: 0 0 8px; color: #c9c7c3;
  font-size: 14.5px; line-height: 1.62; white-space: normal;
}
.news-item .news-tags { gap: 5px; margin-top: 7px; }
.news-item .news-tag {
  display: inline-flex; align-items: center; max-width: 100%;
  min-height: 26px; padding: 3px 9px;
  border: 1px solid rgba(242,212,164,.24); border-radius: 999px;
  background: rgba(242,212,164,.075); color: #dbc7a4;
  font-size: 11.5px; line-height: 1.25; white-space: nowrap;
}
.news-actions { justify-content: flex-end; gap: 12px; margin-top: 4px; }
.news-action, .news-action.muted, .news-action.on {
  min-height: 44px; padding: 8px 6px; border: 0; background: transparent;
  color: var(--read-muted); font-size: 13px;
}
.news-action.on { color: var(--gold); }
.feed-count { margin: 8px 2px 2px; color: var(--read-muted); font-size: 12px; }

/* 详情页是文章阅读页：标题、来源、事实、解读、原文。 */
.back-link, .ov-report-detail .back-link {
  display: inline-flex; align-items: center; min-height: 44px;
  padding: 0; border: 0; background: transparent;
  color: var(--gold); font-size: 14px;
}
.detail-eyebrow { display: flex; gap: 9px; margin: 13px 0 8px; color: var(--gold); font-size: 12px; font-weight: 600; }
.detail-eyebrow span + span::before { content: '·'; margin-right: 9px; color: var(--read-muted); }
.detail-title { font-size: 23px; font-weight: 650; line-height: 1.4; margin: 0 0 11px; text-wrap: pretty; }
.detail-meta { margin: 0 0 20px; color: var(--read-muted); font-size: 12px; }
.detail-brief { margin: 0 0 18px; color: #d8d5cf; font-size: 16px; line-height: 1.72; }
.detail-origin-slot { margin: 0 0 19px; border-top: 1px solid rgba(242,212,164,.18); border-bottom: 1px solid rgba(242,212,164,.18); }
.detail-origin {
  width: auto; min-height: 44px; padding: 7px 0;
  border: 0; border-radius: 0; background: transparent;
  color: var(--gold); font-size: 14px; justify-content: flex-start; gap: 9px;
}
.interpret-box { padding: 0; border: 0; background: transparent; }
.interpret-box.interpret-empty { min-height: 0; }
.interpret-box.interpret-empty .state-note { margin: 0; padding: 0; color: var(--read-muted); font-size: 13px; }
.interpret-box .interpret-section { padding: 0 0 8px; border-bottom: 1px solid rgba(242,212,164,.12); }
.interpret-box .interpret-section-title { font-size: 15px; }
.interpret-structured { color: #d8d5cf; }
.interpret-takeaway { margin: 0 0 7px; padding: 0 0 0 14px; border-left: 2px solid var(--gold); }
.interpret-takeaway-label { color: var(--gold); font-size: 12px; font-weight: 700; letter-spacing: .06em; }
.interpret-takeaway p { margin: 7px 0 0; color: #eee7dd; font-size: 17px; line-height: 1.62; }
.interpret-box .interpret-section--structured { margin: 0; padding: 18px 0 20px; border-bottom: 0; }
.interpret-box .interpret-section--structured + .interpret-section--structured { border-top: 1px solid rgba(242,212,164,.15); }
.interpret-section--structured .interpret-section-title { display: flex; align-items: center; gap: 9px; margin: 0 0 12px; }
.interpret-icon { width: 17px; height: 17px; flex: none; fill: none; stroke: var(--gold); stroke-width: 1.65; stroke-linecap: round; stroke-linejoin: round; }
.interpret-points { margin: 0; padding: 0 0 0 18px; color: #c9c7c3; font-size: 14.5px; line-height: 1.7; }
.interpret-points li + li { margin-top: 9px; }
.interpret-prose { margin: 0; color: #c9c7c3; font-size: 14.5px; line-height: 1.75; }
.interpret-legacy-body.report-body { margin: 0; padding: 0; color: #c9c7c3; font-size: 14.5px; line-height: 1.75; }
.interpret-legacy-body.report-body p { margin: 0 0 10px; font-size: inherit; line-height: inherit; }
.interpret-legacy-body.report-body p:last-child { margin-bottom: 0; }
.interpret-legacy-label { margin: 0 0 8px; color: var(--read-muted); font-size: 13px; line-height: 1.6; }
.interpret-figures { display: grid; gap: 0; }
.interpret-figure { display: grid; grid-template-columns: minmax(74px, 35%) 1fr; gap: 12px; padding: 9px 0; color: #c9c7c3; font-size: 14px; }
.interpret-figure + .interpret-figure { border-top: 1px solid rgba(242,212,164,.1); }
.interpret-figure-value { color: var(--gold); font-weight: 700; }
.interpret-application + .interpret-application { margin-top: 18px; }
.interpret-application-status { margin: 0 0 5px; color: var(--gold); font-size: 11px; line-height: 1.5; }
.interpret-application-title { margin: 0 0 7px; color: #eee7dd; font-size: 15px; line-height: 1.5; font-weight: 600; }
.module-title { margin: 26px 0 12px; color: #eee7dd; font-size: 18px; }

/* 报告目录是阅读索引，不用三块高边框卡片。 */
.report-page-title { margin: 10px 0 2px; font-size: 29px; font-weight: 650; line-height: 1.28; }
.report-businesses { margin-top: 16px; }
.report-directory-scope { margin: 18px 2px 5px; color: var(--gold); font-size: 13px; font-weight: 600; }
.report-list { display: block; }
.ov-report-item { padding: 21px 2px 23px; }
.ov-report-item::before { display: none; }
.ov-report-item .report-kicker { margin: 0 0 8px; color: var(--gold); font-size: 12px; font-weight: 600; }
.ov-report-item .report-title { font-size: 18px; line-height: 1.47; font-weight: 600; text-wrap: pretty; }
.ov-report-item .report-summary {
  display: block; overflow: visible; -webkit-line-clamp: unset;
  margin: 10px 0 11px; color: #c9c7c3;
  font-size: 14px; line-height: 1.62;
}
.report-open { color: var(--gold); font-size: 13px; font-weight: 600; }
.ov-report-detail .report-detail-kicker { margin: 12px 0 0; color: var(--gold); font-size: 12px; font-weight: 600; }
.ov-report-detail .detail-title { font-size: 23px; margin: 12px 0 22px; }
.ov-report-detail .report-overview { border: 0; border-top: 1px solid rgba(242,212,164,.24); border-radius: 0; background: transparent; padding: 22px 0; }
.ov-report-detail .report-summary-block p, .ov-report-detail .report-section-body p { font-size: 15.5px; line-height: 1.75; }
.ov-report-detail .report-summary-block p + p { margin-top: 12px; }

@media (max-width: 350px) {
  .report-business-tab { font-size: 11px; }
}
@media (min-width: 700px) {
  .report-list { display: block; }
}

/* News topics and heat occupy a full-width footer; actions live in detail. */
.news-item .news-card-footer { display:flex; flex-wrap:wrap; align-items:flex-start; gap:8px; clear:both; width:100%; }
.news-item .news-card-footer .news-tags { flex:1 1 140px; margin-top:0; justify-content:flex-start; }
.news-item .news-heat { margin-left:auto; flex:none; white-space:nowrap; }
.news-detail-actions { display:flex; flex-wrap:wrap; justify-content:flex-start; gap:12px; margin:12px 0 20px; }
.news-detail-actions .news-action { min-width:64px; }
.news-detail-status { flex-basis:100%; color:var(--read-muted); font-size:13px; }
.news-item::after { content:''; display:block; clear:both; }

/* css/source-avatar.css */
/* 来源头像 / 多源叠像（PIL-172 v3，2026-10-13）。
   类名全部 src- 前缀，不与 mobile.css / theme-gold.css / hotspots-gold.css 冲突。
   头像只出现在卡片 meta 的来源位与详情头（卡片外、标题旁），不进任何服务端
   文本驱动的展开区。坏图由 JS 回退为着色首字，这里不依赖图片内容。 */

/* ---------- 单个头像 ---------- */
.src-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  overflow: hidden;
  /* 官方 PNG 是宽 logo 且多为深色字：浅色衬底保证深/浅 logo 在深色卡上都有
     对比度（PIL-172 v5 复核）。首字回退由 JS 经 CSSOM 内联覆盖背景/前景色，
     不受此底色影响。 */
  background: rgba(255, 255, 255, 0.92);
  vertical-align: -4px;
}
/* 图片到位前：着色首字盖在（透明的）图片上，不再显示一个空白浅色圆（2026-10-17）。 */
.src-avatar { position: relative; }
.src-avatar-initial {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(255, 255, 255, 0.92);
  font-weight: 600;
  line-height: 1;
}
.src-avatar-pending .src-avatar-img { opacity: 0; }
.src-avatar-img {
  width: 100%;
  height: 100%;
  /* 完整标识优先：contain 保留宽 logo 全貌与对比度，不圆形 cover 裁掉标识。 */
  object-fit: contain;
  display: block;
}
/* 首字回退：尺寸/底色/字号由 JS 按名字写入（CSSOM 赋值，规避 CSP 内联限制）。 */
.src-avatar-fallback {
  color: rgba(255, 255, 255, 0.92);
  font-weight: 600;
  line-height: 1;
  letter-spacing: 0;
}

/* ---------- 多源叠像（Faces 适配）---------- */
.src-faces {
  display: inline-flex;
  align-items: center;
  flex: none;
  position: relative;
}
.src-faces-trigger {
  margin: -2px;
  padding: 2px;
  border: 0;
  border-radius: 999px;
  background: none;
  font: inherit;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
}
.src-faces-trigger:focus-visible {
  outline: 2px solid var(--hs-gold, #f2d4a4);
  outline-offset: 1px;
}
.src-faces-stack {
  display: inline-flex;
  align-items: center;
}
/* 相邻头像叠 6px；描边用卡底色隔开脸与脸。 */
.src-faces-stack .src-avatar + .src-avatar,
.src-faces-stack .src-faces-more {
  margin-left: -6px;
}
.src-faces-stack .src-avatar {
  box-shadow: 0 0 0 2px #181a1e;
}
.src-faces-more {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  padding: 0 4px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.12);
  color: rgba(236, 235, 232, 0.78);
  font-size: 10px;
  font-weight: 600;
  line-height: 1;
}
/* 名单弹层：贴着触发器下方，窄屏也不越出右缘。 */
.src-faces-pop {
  position: absolute;
  z-index: 30;
  top: calc(100% + 6px);
  left: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 140px;
  max-width: 220px;
  max-height: 200px;
  overflow-y: auto;
  padding: 8px 10px;
  border-radius: 10px;
  background: #1c1e23;
  box-shadow: 0 10px 26px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.07);
  text-align: left;
}
.src-faces-pop-head {
  font-size: 10.5px;
  color: rgba(236, 235, 232, 0.5);
}
.src-faces-pop-name {
  font-size: 12px;
  line-height: 1.5;
  color: rgba(236, 235, 232, 0.86);
  overflow-wrap: anywhere;
}

@media (prefers-reduced-motion: reduce) {
  .src-faces-pop { transition: none; }
}

/* css/events.css */
/* 事件追踪（2026-10-18，方案 docs/reviews/EVENT-TRACKING-REDESIGN-2026-10-18.md 视觉稿）。
   沿用黑金主题变量；类名统一 et- 前缀，不覆盖资讯卡与报告页选择器。 */
.et-page { max-width: 52rem; margin: 0 auto; padding-bottom: 2rem; }
.et-heading { margin: .4rem 0 1rem; }
.et-eyebrow { margin: 0 0 .35rem; color: var(--copper, #cc9166); font-size: 12px; letter-spacing: .08em; }
.et-title { margin: 0; font: 600 28px/1.3 var(--f-serif, serif); }
.et-sub { margin: .4rem 0 0; color: var(--label-2); font-size: 12.5px; line-height: 1.6; }
.et-tabs { display: flex; gap: 6px; margin: 4px 0 6px; }
.et-tab { min-height: 36px; padding: 0 14px; border-radius: 18px; border: 1px solid var(--separator); background: transparent;
  color: var(--label-2); font: inherit; font-size: 13px; cursor: pointer; }
.et-tab[aria-pressed="true"] { border-color: var(--gold, #f2d4a4); color: var(--gold, #f2d4a4); background: var(--tint-soft); }
.et-group { display: flex; align-items: baseline; justify-content: space-between; margin: 20px 0 6px; }
.et-group h2 { margin: 0; font-size: 13px; font-weight: 600; color: var(--label-2); letter-spacing: .06em; }
.et-group small { color: var(--label-3); font-size: 12px; }
.et-empty { padding: 2rem 0; color: var(--label-2); line-height: 1.75; }
.et-error { color: var(--danger); }
.et-note { margin: 18px 2px 0; color: var(--label-3); font-size: 11.5px; line-height: 1.7; }
.et-button { min-height: 44px; padding: .6rem .9rem; border: 1px solid var(--separator); border-radius: .5rem; background: var(--card-bg);
  color: var(--label-1); font: inherit; font-size: .86rem; cursor: pointer; }

/* 状态胶囊 */
.et-state { display: inline-flex; align-items: center; gap: 5px; padding: 1px 8px; border-radius: 10px; font-size: 11.5px; font-weight: 600; white-space: nowrap; }
.et-state i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; display: inline-block; }
.et-state.live { color: var(--gold, #f2d4a4); background: var(--tint-soft); }
.et-state.live i { box-shadow: 0 0 0 3px rgba(242, 212, 164, .22); }
.et-state.cool { color: var(--copper, #cc9166); background: rgba(204, 145, 102, .13); }
.et-state.done { color: #8f98a8; background: rgba(143, 152, 168, .12); }

/* 列表卡 */
.et-card { position: relative; margin: 10px 0; padding: 14px 14px 12px; border-radius: 16px; border: 1px solid var(--separator);
  background: linear-gradient(168deg, var(--card-bg-hover) 0%, #131519 46%, var(--card-bg) 100%); overflow: hidden; }
.et-card::before { content: ''; position: absolute; inset: 0 0 auto 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(224, 168, 111, .28) 22%, rgba(242, 212, 164, .42) 50%, rgba(224, 168, 111, .28) 78%, transparent); }
.et-card-top { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--label-2); font-variant-numeric: tabular-nums; }
.et-card-title { display: block; margin: 8px 0 4px; color: var(--label-1); font: 600 18px/1.45 var(--f-serif, serif); text-decoration: none; overflow-wrap: anywhere; }
.et-card.compact .et-card-title { font-size: 15.5px; margin: 6px 0 2px; }
.et-card-title::after { content: ''; position: absolute; inset: 0; }
.et-latest { margin: 0; font-size: 13px; color: var(--label-1); line-height: 1.6; overflow-wrap: anywhere; }
.et-latest b { color: var(--gold, #f2d4a4); font-weight: 600; margin-right: 6px; font-variant-numeric: tabular-nums; }
.et-foot { display: flex; align-items: center; gap: 8px; margin-top: 8px; font-size: 12px; color: var(--label-2); font-variant-numeric: tabular-nums; }
.et-spark { margin-left: auto; display: inline-flex; align-items: flex-end; gap: 2px; height: 18px; }
.et-spark span { width: 4px; border-radius: 1px; background: rgba(242, 212, 164, .35); }
.et-spark span.hot { background: var(--gold, #f2d4a4); }

/* 脉络条：节点按真实时间排在金色轨道上 */
.et-rail { position: relative; height: 40px; margin: 12px 2px 2px; }
.et-rail.compact { height: 18px; margin: 8px 0 4px; }
.et-rail-line { position: absolute; left: 0; right: 0; top: 12px; height: 2px; border-radius: 1px;
  background: linear-gradient(90deg, rgba(242, 212, 164, .12), rgba(242, 212, 164, .35)); }
.et-rail.compact .et-rail-line { top: 7px; }
.et-dot { position: absolute; top: 8px; width: 10px; height: 10px; margin-left: -5px; border-radius: 50%;
  background: var(--card-bg); border: 1.5px solid var(--copper, #cc9166); }
.et-rail.compact .et-dot { top: 3px; }
.et-dot.key { top: 6px; width: 14px; height: 14px; margin-left: -7px; background: var(--gold, #f2d4a4); border-color: var(--gold, #f2d4a4);
  box-shadow: 0 0 0 3px rgba(242, 212, 164, .16); }
.et-rail.compact .et-dot.key { top: 1px; }
.et-dot.now { background: var(--gold, #f2d4a4); border-color: var(--gold, #f2d4a4); box-shadow: 0 0 0 4px rgba(242, 212, 164, .22), 0 0 12px rgba(242, 212, 164, .55); }
.et-rail-label { position: absolute; top: 24px; font-size: 10.5px; color: var(--label-3); white-space: nowrap; }
.et-rail-label.start { left: 0; }
.et-rail-label.end { transform: translateX(-100%); }
.et-rail-label em { font-style: normal; color: var(--label-2); }

/* 资讯页入口条 */
.et-entry { margin: 14px 0 6px; }
.et-entry[hidden] { display: none; }
.et-entry-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 8px; }
.et-entry-head h2 { margin: 0; font: 600 16px/1.4 var(--f-serif, serif); }
.et-entry-count { color: var(--gold, #f2d4a4); font-size: 12px; font-weight: 600; }
.et-entry-all { margin-left: auto; color: var(--gold, #f2d4a4); font-size: 13px; min-height: 32px; display: inline-flex; align-items: center; text-decoration: none; }
.et-strip { display: flex; gap: 10px; overflow-x: auto; scroll-snap-type: x mandatory; padding-bottom: 4px; margin-right: -16px; padding-right: 16px; }
.et-strip { scrollbar-width: none; }
.et-strip::-webkit-scrollbar { display: none; }
.et-mini { flex: none; width: 236px; scroll-snap-align: start; padding: 12px; border-radius: 14px; border: 1px solid var(--separator);
  background: var(--card-bg); color: var(--label-1); text-decoration: none; }
.et-mini.new { border-color: rgba(242, 212, 164, .38); }
.et-mini h3 { margin: 6px 0 0; font: 600 15px/1.45 var(--f-serif, serif); height: 44px; overflow: hidden; }
.et-mini-meta { margin: 0; font-size: 11.5px; color: var(--label-2); font-variant-numeric: tabular-nums; }
.et-chip { position: relative; z-index: 2; display: flex; align-items: center; gap: 8px; margin-top: 10px; padding: 8px 10px; min-height: 36px;
  border-radius: 10px; background: var(--tint-soft); color: var(--gold, #f2d4a4); font-size: 12.5px; text-decoration: none; }
.et-chip span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.et-chip small { margin-left: auto; flex: none; color: var(--label-2); font-size: 11.5px; }

/* 详情 */
.et-nav { display: flex; align-items: center; gap: 12px; }
.et-detail-title { margin: 4px 0 8px; font: 700 23px/1.4 var(--f-serif, serif); overflow-wrap: anywhere; }
.et-detail-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 12.5px; color: var(--label-2); font-variant-numeric: tabular-nums; }
.et-verdict { margin: 14px 0; padding: 14px; border-radius: 14px; background: linear-gradient(160deg, rgba(242, 212, 164, .10), rgba(242, 212, 164, .03));
  border: 1px solid rgba(242, 212, 164, .22); }
.et-verdict-k { margin: 0 0 4px; font-size: 11.5px; color: var(--copper, #cc9166); letter-spacing: .08em; }
.et-verdict-text { margin: 0; font-size: 14.5px; line-height: 1.75; }
.et-verdict small { display: block; margin-top: 8px; color: var(--label-3); font-size: 11px; }
.et-kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin: 4px 0 14px; }
.et-kpis div { padding: 10px 0 8px; text-align: center; border-radius: 12px; background: var(--card-bg); border: 1px solid var(--separator); }
.et-kpis b { display: block; font: 600 20px/1.2 var(--f-serif, serif); color: var(--gold, #f2d4a4); font-variant-numeric: tabular-nums; }
.et-kpis span { font-size: 11px; color: var(--label-2); }
.et-panel { padding: 14px; border-radius: 16px; border: 1px solid var(--separator); background: var(--card-bg); margin-bottom: 16px; }
.et-panel-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
.et-panel-head h2 { margin: 0; font: 600 15px/1.4 var(--f-serif, serif); }
.et-panel-head small { color: var(--label-3); font-size: 11.5px; text-align: right; }
.et-timeline-head h2 { font-size: 17px; }
.et-bars { display: grid; gap: 6px; align-items: end; height: 84px; margin-top: 16px; }
.et-bar { position: relative; border-radius: 3px 3px 0 0; background: rgba(242, 212, 164, .28); min-height: 2px; }
.et-bar.key { background: linear-gradient(180deg, var(--gold, #f2d4a4), #b17f47); }
.et-bar.key::after { content: '◆'; position: absolute; top: -16px; left: 50%; transform: translateX(-50%); font-size: 9px; color: var(--gold, #f2d4a4); }
.et-bar.zero { height: 2px !important; background: rgba(236, 235, 232, .12); }
.et-bar-labels { display: grid; gap: 6px; margin-top: 6px; font-size: 10px; color: var(--label-3); text-align: center; font-variant-numeric: tabular-nums; }

/* 脉络时间线 */
.et-timeline { list-style: none; margin: 4px 0 0; padding: 0; position: relative; }
.et-timeline::before { content: ''; position: absolute; left: 56px; top: 6px; bottom: 6px; width: 2px;
  background: linear-gradient(180deg, rgba(242, 212, 164, .10), rgba(242, 212, 164, .35) 40%, rgba(242, 212, 164, .35)); }
.et-step { position: relative; display: grid; grid-template-columns: 42px 1fr; gap: 0 30px; padding: 0 0 18px; }
.et-when { text-align: right; font-size: 11.5px; color: var(--label-2); line-height: 1.35; font-variant-numeric: tabular-nums; padding-top: 1px; }
.et-when b { display: block; color: var(--label-1); font-size: 13px; font-weight: 600; }
.et-pin { position: absolute; left: 52px; top: 5px; width: 10px; height: 10px; border-radius: 50%; background: var(--page-bg); border: 1.5px solid var(--copper, #cc9166); }
.et-step.key .et-pin { left: 50px; top: 3px; width: 14px; height: 14px; background: var(--gold, #f2d4a4); border-color: var(--gold, #f2d4a4); box-shadow: 0 0 0 4px rgba(242, 212, 164, .16); }
.et-step.now .et-pin { background: var(--gold, #f2d4a4); border-color: var(--gold, #f2d4a4); box-shadow: 0 0 0 5px rgba(242, 212, 164, .20), 0 0 14px rgba(242, 212, 164, .6); }
.et-stage { display: inline-block; padding: 0 7px; border-radius: 8px; font-size: 11px; font-weight: 600; color: var(--copper, #cc9166); border: 1px solid rgba(204, 145, 102, .45); }
.et-step.key .et-stage { color: #07080a; background: var(--gold, #f2d4a4); border-color: var(--gold, #f2d4a4); }
.et-step h3 { margin: 5px 0 4px; font-size: 14.5px; line-height: 1.55; font-weight: 600; overflow-wrap: anywhere; }
.et-step.key h3 { font: 700 16px/1.5 var(--f-serif, serif); }
.et-step.minor h3 { font-weight: 500; color: var(--label-2); font-size: 13.5px; }
.et-step.minor .et-stage { color: var(--label-3); border-color: var(--separator); }
.et-step-src { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--label-2); }
.et-expand { margin-left: auto; min-height: 32px; padding: 0 4px; border: 0; background: none; color: var(--gold, #f2d4a4); font: inherit; font-size: 12px; cursor: pointer; }
.et-gap { list-style: none; margin: -8px 0 10px 72px; font-size: 10.5px; color: var(--label-3); }
.et-folded { display: none; }
.et-more { display: block; width: 100%; min-height: 44px; margin: 4px 0 16px; border: 1px dashed var(--separator); border-radius: 12px;
  background: transparent; color: var(--label-2); font: inherit; font-size: 13px; cursor: pointer; }
.et-reports { list-style: none; margin: 8px 0 0; padding: 4px 10px; border-radius: 10px; background: var(--card-bg); border: 1px solid var(--separator); }
.et-reports[hidden] { display: none; }
.et-report { display: flex; gap: 8px; padding: 8px 0; border-top: 1px solid var(--separator); }
.et-report:first-child { border-top: 0; }
.et-report-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.et-report-title { color: var(--label-1); font-size: 12.5px; line-height: 1.5; text-decoration: none; overflow-wrap: anywhere; }
.et-report-meta { color: var(--label-3); font-size: 11px; font-variant-numeric: tabular-nums; }
.et-report-origin { color: var(--gold, #f2d4a4); font-size: 11.5px; }

/* 资讯详情里的事件入口（沿用旧类名，资讯页样式依赖它） */
.ev-related-link { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 48px; padding: 10px 0;
  border-block: 1px solid var(--separator); margin: 16px 0; color: var(--tint); font-size: 14px; }
.ev-related-link[hidden] { display: none; }
.ev-related-meta { color: var(--label-2); font-size: 12px; flex: none; }

.et-page :focus-visible, .et-entry :focus-visible, .et-chip:focus-visible { outline: 2px solid var(--tint); outline-offset: 3px; }
@media (max-width: 360px) { .et-kpis { gap: 4px; } .et-title { font-size: 24px; } .et-mini { width: 210px; } }
@media (prefers-reduced-motion: reduce) { .et-dot.now, .et-step.now .et-pin { box-shadow: none; } }

/* 对标动态（2026-10-21）：与事件追踪同一套卡片、时间轴与脉络样式，只补 cp- 专用部分。 */
.cp-switch { display: flex; gap: 2px; margin: 0 0 10px; padding: 3px; border-radius: 12px; border: 1px solid var(--separator);
  background: var(--card-bg); width: fit-content; }
.cp-switch[hidden] { display: none; }
.cp-switch-tab { min-height: 34px; display: inline-flex; align-items: center; padding: 0 14px; border-radius: 9px;
  color: var(--label-2); font-size: 13px; text-decoration: none; }
.cp-switch-tab.on { color: #07080a; background: var(--gold, #f2d4a4); font-weight: 600; }
.cp-tag { display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: 11.5px; color: var(--copper, #cc9166);
  border: 1px solid rgba(204, 145, 102, .45); }
.cp-oneliner { margin: 6px 0 6px; color: var(--label-2); font-size: 12.5px; line-height: 1.6; }
.cp-card .et-card-title { margin-bottom: 2px; }
.cp-rail { margin-top: 10px; }
.cp-site { margin-left: 8px; color: var(--gold, #f2d4a4); font-size: 12.5px; }
.cp-analysis .cp-points { display: grid; grid-template-columns: auto 1fr; gap: 8px 10px; margin: 6px 0 0; }
.cp-points dt { padding: 1px 7px; height: fit-content; border-radius: 8px; font-size: 11.5px; font-weight: 600;
  color: #07080a; background: var(--gold, #f2d4a4); white-space: nowrap; }
.cp-points dd { margin: 0; font-size: 13.5px; line-height: 1.7; color: var(--label-1); }
.cp-implication { margin: 6px 0 0; padding: 6px 9px; border-left: 2px solid var(--gold, #f2d4a4); border-radius: 0 8px 8px 0;
  background: var(--tint-soft); font-size: 12.5px; line-height: 1.65; color: var(--label-1); }
.cp-implication b { color: var(--gold, #f2d4a4); font-weight: 600; }
.cp-tier { margin-top: 6px; }
.cp-facts .cp-fact-list { display: grid; grid-template-columns: auto 1fr; gap: 6px 12px; margin: 8px 0 0; font-size: 13px; line-height: 1.6; }
.cp-fact-list dt { color: var(--label-2); white-space: nowrap; }
.cp-fact-list dd { margin: 0; color: var(--label-1); overflow-wrap: anywhere; }
.cp-src { color: var(--copper, #cc9166); font-size: 11.5px; }

/* css/report-pages.css */
/* 2026-10-17 报告目录与阅读页：小图标、两端对齐、短段落、目录卡（加载在其余样式之后）。 */
.report-icon { width: 14px; height: 14px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }

/* ---- 目录 ---- */
.report-page-head { margin: 8px 2px 4px; }
.report-page-head .report-page-title { margin: 0; font-family: var(--f-serif); font-size: 30px; font-weight: 600; letter-spacing: -0.01em; }
.report-page-sub { margin: 6px 0 0; color: var(--label-3); font-size: 13px; }
.report-list { display: grid; gap: 12px; }
.ov-report-item.report-card {
  position: relative; padding: 17px 16px 16px; border-radius: 16px;
  background: var(--card-bg); border: 1px solid rgba(242, 212, 164, 0.08);
  transition: border-color .2s ease, background-color .2s ease;
}
.ov-report-item.report-card::before { display: none; }
.ov-report-item.report-card + .report-card { border-top: 1px solid rgba(242, 212, 164, 0.08); }
.ov-report-item.report-card.is-latest {
  border-color: rgba(242, 212, 164, 0.32);
  background: linear-gradient(160deg, rgba(242, 212, 164, 0.10), rgba(242, 212, 164, 0.02) 55%), var(--card-bg);
}
.ov-report-item.report-card:active { background-color: var(--card-bg-hover); }
.report-card-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; color: var(--label-3); font-size: 12px; }
.report-card-meta .report-kicker { display: inline-flex; align-items: center; gap: 6px; margin: 0; color: var(--gold); font-size: 12px; font-weight: 600; }
.report-card-meta .report-kicker::before { content: ''; width: 6px; height: 6px; border-radius: 2px; background: var(--copper); }
.report-card-meta-item { display: inline-flex; align-items: center; gap: 4px; font-variant-numeric: tabular-nums; }
.report-card-icon { width: 13px; height: 13px; color: rgba(242, 212, 164, 0.6); }
.report-card-badge { margin-left: auto; padding: 2px 7px; border-radius: 6px; background: var(--tint-soft); color: var(--gold); font-size: 11px; font-weight: 600; }
.ov-report-item.report-card .report-title { margin: 10px 0 0; font-family: var(--f-serif); font-size: 18.5px; line-height: 1.45; font-weight: 600; }
.ov-report-item.report-card .report-summary {
  margin: 8px 0 0; color: var(--label-2); font-size: 14px; line-height: 1.75;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.ov-report-item.report-card .report-open { display: inline-flex; align-items: center; gap: 4px; margin-top: 12px; color: var(--gold); font-size: 13px; font-weight: 600; }
.report-open-icon { width: 15px; height: 15px; }

/* ---- 阅读页 ---- */
.ov-report-detail .rd-meta { display: flex; flex-wrap: wrap; gap: 6px 14px; }
.ov-report-detail .rd-meta-item { display: inline-flex; align-items: center; gap: 5px; }
.ov-report-detail .rd-meta-icon { width: 14px; height: 14px; color: rgba(242, 212, 164, 0.6); }
.ov-report-detail .rd-eyebrow { display: inline-flex; align-items: center; gap: 6px; }
.ov-report-detail .rd-eyebrow-icon { width: 15px; height: 15px; }
.ov-report-detail .rd-heading-icon { width: 19px; height: 19px; color: var(--copper); }
.ov-report-detail .rd-figure-no { display: inline-flex; align-items: center; gap: 4px; }
.ov-report-detail .rd-figure-icon { width: 14px; height: 14px; }
.ov-report-detail .rd-verdict .report-reading-lead + .report-reading-lead { margin-top: 10px; }
.ov-report-detail .rd-chapter-body { margin: 8px 0 0 36px; }
.ov-report-detail .rd-chapter-body .rd-chapter-text { margin: 0; }
.ov-report-detail .rd-chapter-text + .rd-chapter-text { margin-top: 9px; }
/* 中文正文两端对齐 */
.ov-report-detail .report-reading-lead,
.ov-report-detail .rd-chapter-text,
.ov-report-detail .rd-metric-note,
.ov-report-item.report-card .report-summary { text-align: justify; }
@media (max-width: 350px) { .ov-report-detail .rd-chapter-body { margin-left: 0; } }

