/* ============================================================
   AutoNews v3 设计系统 — main.css
   奶油纸白 + 蜂蜜金 · 衬线标题 + Fraunces 数字 · 日间 + 夜航
   ============================================================ */

/* ---------- 0. 字体 ---------- */
/* 中文衬线不走网络字体：Noto Serif SC 的分片表实测一个首页要拉 22 个分片 / 1.7MB
   （原注释估的「每页 100-300KB」低估了 6-17 倍），手机端 FCP 被拖到 12.8s。
   标题全是数据库来的新闻标题，字符集不可预知，子集化也压不下来——改用系统衬线：
   iOS/macOS 落 Songti SC、Android 落自带的 Noto Serif CJK、Windows 落宋体。详见 #65。 */

/* Fraunces（拉丁数字/英文展示字）：只留拉丁段，ttf → woff2，123KB → 50KB */
@font-face { font-family:'Fraunces'; font-weight:400; font-display:swap; src:url("../vendor/fonts/fraunces-400.2d01d65af8fa.woff2") format('woff2'); }
@font-face { font-family:'Fraunces'; font-weight:700; font-display:swap; src:url("../vendor/fonts/fraunces-700.52f45901fdda.woff2") format('woff2'); }
@font-face { font-family:'Fraunces'; font-weight:900; font-display:swap; src:url("../vendor/fonts/fraunces-900.fbe1cf30f16a.woff2") format('woff2'); }

/* ---------- 1. 设计 Token ---------- */
:root {
    /* 字体栈 */
    /* 拉丁字面放最前：中文衬线（尤其 Windows 的 SimSun）自带的西文极难看，站名
       AutoNews、SUV、日期数字都要先走拉丁字。用已经在本地的 Fraunces（不多一个请求），
       不用 Georgia——Georgia 只有旧式数字，「30万」会印成「3o万」。中文再往后落各平台宋体。 */
    --font-serif: 'Fraunces','Times New Roman','Songti SC','Source Han Serif SC','Noto Serif CJK SC','STSong','SimSun',serif;
    --font-display: 'Fraunces',Georgia,'Times New Roman',serif;
    --font-body: 'PingFang SC','Microsoft YaHei',-apple-system,'Segoe UI',sans-serif;

    /* 色彩：日间 */
    --paper: #FAF8F4;
    --paper-rgb: 250,248,244;
    --card: #FFFFFF;
    --ink: #1E1C18;
    --ink-2: #4A4640;
    /* ink-3 从 #8A8578 调暗到 #726D60：原值 on 白只有 3.68:1，不过 WCAG AA(4.5)，
       而它是 --text-meta 的实体、被元信息行大量当小字用。现 5.16:1。 */
    --ink-3: #6A6659;
    /* ink-4 是**图形/装饰专用**（分隔符、占位图标、大字）——原值 #B5AFA3 只有 2.18:1，
       连图形的 3:1 都不到。现 3.68:1，过图形 AA。**禁止用于正文小字**，小字一律用 ink-3。 */
    --ink-4: #8A8578;
    /* 金色分两支（UI设计规范「图形色与文字色分离」原则，此前只写在文档里、代码没执行）：
       --gold 是**图形色**（边框/图标/下划线/进度条），2.25:1，不许当文字色；
       --gold-text 是**文字色**，on 白 5.17:1、on 浅金 4.80:1，金色文字一律用它。 */
    --gold: #D9A514;
    --gold-text: #856A00;
    --on-gold: #1E1C18;   /* 金底上的字色，深浅两套主题都用深墨（见下方 btn-primary 说明）*/
    --gold-bright: #F5C518;
    --gold-dark: #B08A10;
    --gold-light: #FFF6DC;
    --gold-wash: rgba(217,165,20,0.08);
    /* 反相药丸（选中的筛选 chip / sub-nav）：底色跟着主题翻面，字色必须跟着一起翻。
       此前写死 background:var(--ink) + 金色字——深色模式下 --ink 变成浅米色，
       金字压浅底只有 1.33:1，选中的筛选条在深色模式下**基本看不见**（真 bug，非洁癖）。 */
    --invert-bg: #1E1C18;
    --on-invert: #F5C518;   /* 10.4:1 on invert-bg */
    --line: #E9E4D8;
    --line-2: #F0ECE2;
    /* green/red 各调暗一档：原值叠在自己的 8~10% 淡底上只有 4.56/4.39:1（红的直接不达标），
       现 5.22/5.08:1，留出余量——这两个色会叠在白底和暖白底两种背景上。 */
    --green: #556957;
    --green-light: rgba(94,114,97,0.1);
    --red: #A94A32;
    --red-light: rgba(181,84,59,0.08);
    /* 红底徽章的字色（跟 --on-gold 一个道理）：日间红是深砖红，压白字 6.9:1；
       深色模式的红是浅珊瑚，白字只有 2.5:1，必须翻成深墨。 */
    --on-red: #FFFFFF;
    /* 骨架屏的流光：深色模式下白色高光会在深底上闪成一道亮条 */
    --sk-sheen: rgba(255,255,255,0.55);
    /* 次级软底：白卡片内部的二级区块底（投票区、入口卡、免责条、来源说明）。
       比 --paper 再深一档，在 --card 白底上分出层次又不必再画一条边。
       此前四处模板/样式引用它却从没定义过，其中无 fallback 的两处整条 background 静默失效（#630）。
       --bg-soft 是同义别名：两个名字在仓库里各长了一半，统一到这一个值上。 */
    --paper-2: #F5F2EA;
    --bg-soft: var(--paper-2);
    /* 同一个语义在仓库里又长出两个名字（#643）：--bg-subtle 三处、--bg-2 一处，
       全都无 fallback ⇒ background 整条静默失效（月报两页和答题页的区块底消失、
       订阅表 hover 完全没反馈）。跟 --bg-soft 一样收敛到 --paper-2，不造第三个值。
       这些是 var() 别名，夜航靠 --paper-2 自己翻面，不必在深色块里重复定义。 */
    --bg-subtle: var(--paper-2);
    --bg-2: var(--paper-2);
    /* algorithm.html:258 的注释早就写着「写 var(--danger,#A94A32) 等于一直在吃那个
       硬编码回退值」——发现过，没人补。#A94A32 就是日间的 --red。 */
    --danger: var(--red);
    /* 等宽栈：六处引用都带 fallback，所以一直是 fallback 在干活（#643）。 */
    --font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
    --r: 10px;
    --r-sm: 6px;

    /* 向后兼容旧 token 名 */
    --yellow: var(--gold-bright);
    --yellow-dark: var(--gold-dark);
    --yellow-light: var(--gold-light);
    --yellow-text: var(--gold-text);   /* 旧模板里的「黄系文字」指向真·文字色，不再是图形金 */
    --bg: var(--paper);
    --white: var(--card);
    --text: var(--ink);
    --text-light: var(--ink-2);
    --text-meta: var(--ink-3);
    /* #640：--text-lighter 从 --ink-4 改指 --ink-3。这个别名的名字写着「text」，
       它却指着图形专用色（3.47:1，正文 AA 要 4.5）——写代码的人以为在用浅文字色，
       全站 82 处 var(--text-lighter) 因此全部不过 AA。改这一行 = 82 处一次修好。
       原本借它拿图形色的 5 处已改成直引 var(--ink-4)（见 #640 审计单）。 */
    --text-lighter: var(--ink-3);
    --border: var(--line);
    --q-good: #2E7D32;
    --q-mid: #A85D00;   /* 原 #E8890C on 白仅 2.62:1，橙色在浅底上几乎必然不达标；现 4.96:1 */
    --q-bad: #D93025;
    --ai-badge: #1A73E8;
    --ai-wash: #F8FBFF;

    /* 阴影 → 极淡柔影(取代旧硬阴影)。
       颜色不用纯黑：纸面是暖白 #FAF8F4，压中性黑会把暖调压成脏灰。阴影色往表面色相偏
       （取墨色 #1E1C18 的暖褐向），并拆成两层——近处一层收边、远处一层散开。 */
    --shadow: 0 1px 2px rgba(56,46,28,0.04), 0 2px 6px rgba(56,46,28,0.03);
    --shadow-hover: 0 2px 4px rgba(56,46,28,0.05), 0 8px 22px rgba(56,46,28,0.06);

    /* 圆角 */
    --radius: var(--r);
    --radius-sm: var(--r-sm);
    --radius-full: 999px;

    /* 字号阶梯: 12/14/16/20/28/44 */
    --fs-xs: 12px;
    --fs-sm: 14px;
    --fs-base: 16px;
    --fs-md: 16px;
    --fs-lg: 20px;
    --fs-xl: 20px;
    --fs-2xl: 28px;
    --fs-3xl: 44px;

    /* 间距 */
    --sp-1: 4px;
    --sp-2: 8px;
    --sp-3: 12px;
    --sp-4: 16px;
    --sp-6: 24px;
    --sp-8: 32px;
    --sp-12: 48px;

    /* 缓动 */
    --ease: cubic-bezier(0.4,0,0.2,1);
    --ease-out: cubic-bezier(0,0,0.2,1);
}

/* ---------- 1b. 夜航模式 ---------- */
[data-theme="dark"] {
    --paper: #1A1714;
    --paper-rgb: 26,23,20;
    --card: #242018;
    --ink: #E8E2D6;
    --ink-2: #C4BCB0;
    --ink-3: #A6A093;   /* 原 #8A8578 on 深卡片 4.41:1 差一点点不过 AA；现 5.38:1 */
    --ink-4: #7A7466;   /* 图形专用，原 2.23:1 连图形 3:1 都不到；现 3.49:1 */
    --gold: #F0C040;
    --gold-text: #F0C040;
    --on-gold: #1E1C18;   /* 深色模式下 --ink 是浅色，压在亮金上只有 1.07:1，必须固定深墨 */   /* 深色底上金色本身就够亮（9.51:1），文字色不必再分支 */
    --gold-bright: #FFD866;
    --gold-dark: #D9A514;
    --gold-light: rgba(240,192,64,0.1);
    --gold-wash: rgba(240,192,64,0.06);
    --invert-bg: #E8E2D6;   /* 深色模式下反相药丸变浅底 */
    --on-invert: #1E1C18;   /* 13.1:1 on invert-bg */
    --line: #2E2A24;
    --line-2: #363028;
    --green: #7FA882;
    --green-light: rgba(127,168,130,0.1);
    --red: #E07A5F;
    --red-light: rgba(224,122,95,0.08);
    --on-red: #1E1C18;   /* 8.4:1 on 珊瑚红 */
    --sk-sheen: rgba(255,255,255,0.06);
    --paper-2: #1E1A15;   /* 夜航：比 --card 再暗一档，同样是卡内二级区块底 */
    /* 旧 token 别名跟随 */
    --yellow: var(--gold-bright);
    --yellow-dark: var(--gold-dark);
    --yellow-light: var(--gold-light);
    --yellow-text: var(--gold-text);
    --bg: var(--paper);
    --white: var(--card);
    --text: var(--ink);
    --text-light: var(--ink-2);
    --text-meta: var(--ink-3);
    /* #640：--text-lighter 从 --ink-4 改指 --ink-3。这个别名的名字写着「text」，
       它却指着图形专用色（3.47:1，正文 AA 要 4.5）——写代码的人以为在用浅文字色，
       全站 82 处 var(--text-lighter) 因此全部不过 AA。改这一行 = 82 处一次修好。
       原本借它拿图形色的 5 处已改成直引 var(--ink-4)（见 #640 审计单）。 */
    --text-lighter: var(--ink-3);
    --border: var(--line);
    /* 质量分/AI 徽章色此前没做深色覆盖，日间的深色值直接落在深卡片上：
       q-good 3.16:1、q-bad 3.40:1、ai-badge 3.60:1 全部不过 AA。这里各提亮一档。 */
    --q-good: #6FBF73;
    --q-mid: #F0A03C;
    --q-bad: #F07567;
    --ai-badge: #6BA6F5;
    --ai-wash: rgba(107,166,245,.10);
}

/* 长辈模式 */
html.elder {
    --fs-xs: 14px;
    --fs-sm: 15px;
    --fs-base: 18px;
    --fs-md: 18px;
    --fs-lg: 22px;
    --fs-xl: 24px;
    --fs-2xl: 30px;
    --fs-3xl: 48px;
    --paper: #FFFDF8;
    --card: #FFFFFF;
    --ink: #111111;
    --ink-2: #222222;
    --ink-3: #333333;
    --ink-4: #555555;
    --gold-text: #5C4200;
    /* 长辈模式合并高对比：正文/状态文字按 AAA 7:1 留余量。 */
    --gold-dark: #6B4F00;
    --green: #2E4A32;
    --red: #7D2F20;
    --q-good: #245F28;
    --q-mid: #7D4300;
    --q-bad: #9B2118;
    --ai-badge: #0057A8;
    --ai-wash: #EEF5FF;
    --gold-wash: rgba(0,0,0,0);
    --line: #5A5A5A;
    --line-2: #D8D2C6;
    --shadow: none;
    --shadow-hover: none;
    line-height: 1.9;
}

html.elder[data-theme="dark"] {
    --paper: #111111;
    --card: #181818;
    --ink: #F5F5F5;
    --ink-2: #E3E3E3;
    --ink-3: #D6D6D6;
    --ink-4: #C6C6C6;
    --gold: #FFD54D;
    --gold-text: #FFD54D;
    --gold-dark: #FFD54D;
    --gold-light: rgba(255,213,77,0.12);
    --gold-wash: rgba(0,0,0,0);
    --line: #AFAFAF;
    --line-2: #2D2D2D;
    --green: #9BE39F;
    --red: #FF9B85;
    --q-good: #9BE39F;
    --q-mid: #FFBD70;
    --q-bad: #FF9B85;
    --ai-badge: #8FC2FF;
    --ai-wash: rgba(143,194,255,.14);
}

/* ---------- 2. 重置 & 基础 ---------- */
*,*::before,*::after { margin:0; padding:0; box-sizing:border-box; }
html { scroll-behavior:smooth; overflow-x:hidden; }

body {
    font-family: var(--font-body);
    background: var(--paper);
    color: var(--ink);
    font-size: var(--fs-base);
    line-height: 1.75;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    transition: background 0.4s var(--ease), color 0.4s var(--ease);
}

/* 印刷噪点纹理 */
body::after {
    content:''; position:fixed; inset:0; pointer-events:none; z-index:9990; opacity:.025;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
}

::selection { background: var(--gold); color: var(--on-gold); }
a { color:inherit; text-decoration:none; }
img { display:block; max-width:100%; }

/* ---------- 3. 排版工具 ---------- */
.serif { font-family: var(--font-serif); }
.display { font-family: var(--font-display); }
.gradient-text {
    background: linear-gradient(135deg, #F5C518 0%, #F0A830 50%, #E8875A 100%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
}
[data-theme="dark"] .gradient-text {
    background: linear-gradient(135deg, #FFD866 0%, #F5C518 50%, #F0A830 100%);
    -webkit-background-clip: text;
    background-clip: text;
}
.divider-gold {
    height: 1px;
    background: linear-gradient(90deg, transparent, var(--gold), transparent);
    border: none;
}

/* ---------- 4. 按钮 ---------- */
.btn {
    padding: 8px 20px;
    border-radius: var(--r-sm);
    font-size: var(--fs-sm);
    font-weight: 600;
    cursor: pointer;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: var(--sp-1);
    transition: all 0.2s var(--ease);
    border: 1px solid transparent;
}
.btn-outline {
    border: 1px solid var(--line);
    background: var(--card);
    color: var(--ink-2);
}
.btn-outline:hover { border-color: var(--gold); color: var(--ink); }

.btn-primary {
    background: var(--gold);
    color: var(--on-gold);
    border-color: var(--gold);
    font-weight: 700;
}
.btn-primary:hover { background: var(--gold-dark); border-color: var(--gold-dark); }

.btn-ghost {
    background: none;
    border: none;
    color: var(--ink-3);
}
.btn-ghost:hover { color: var(--ink); }

.btn-block {
    width: 100%;
    padding: var(--sp-3);
    background: var(--gold);
    color: var(--ink);
    border: none;
    border-radius: var(--r-sm);
    font-size: 15px;
    font-weight: 700;
    cursor: pointer;
    transition: background 0.2s;
    margin-top: var(--sp-2);
}
.btn-block:hover { background: var(--gold-dark); }

html.elder .btn { min-height: 44px; padding: 10px 24px; }

/* ---------- 5. 布局容器 ---------- */
.main {
    max-width: 1200px;
    margin: 0 auto;
    padding: var(--sp-6) 28px;
}

.section-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: var(--sp-6);
}
/* 次级区块标题：事件详情、车型时间线、首页侧栏里那一层 h3，原来在 10 个地方各写各的
   内联 `font-size:17px`（#390）。17px 不在字阶（12/14/16/20/28/44）上，收进 --fs-lg。 */
.section-title.sub {
    font-size: var(--fs-lg);
    font-weight: 700;
    letter-spacing: 0.01em;
}

.section-title {
    font-family: var(--font-serif);
    font-size: var(--fs-2xl);
    font-weight: 900;
    color: var(--ink);
    letter-spacing: 0.02em;
    line-height: 1.3;
}

/* ---------- 6. 导航：毛玻璃 ---------- */
/* 旧的顶部黄条 → 隐藏(v3 不需要) */
.top-bar { display: none; }

.main-header {
    position: sticky;
    top: 0;
    z-index: 100;
    background: rgba(var(--paper-rgb), 0.82);
    backdrop-filter: blur(20px) saturate(180%);
    -webkit-backdrop-filter: blur(20px) saturate(180%);
    border-bottom: 1px solid transparent;
    transition: border-color 0.3s, background 0.4s var(--ease);
}
.main-header.scrolled {
    border-bottom-color: var(--line);
}
/* 跳到正文：键盘用户不用一路 Tab 过整条导航才能进内容，平时藏在屏幕外 */
.skip-link {
    position: fixed; top: -60px; left: var(--sp-4); z-index: 10000;
    padding: 10px 18px; border-radius: 0 0 var(--r-sm) var(--r-sm);
    background: var(--gold); color: var(--on-gold);
    font-size: var(--fs-sm); font-weight: 700; text-decoration: none;
    transition: top 0.2s var(--ease);
}
.skip-link:focus { top: 0; }
#main-content:focus { outline: none; }
.header-inner {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 28px;
    display: flex;
    align-items: center;
    /* min-height 而不是 height：长辈模式字号顶到 18px、按钮最小高 44px，
       写死 56px 会让 logo 和按钮从头部溢出去 */
    min-height: 56px;
    gap: 8px;
}
html.elder .header-inner { padding-top: 6px; padding-bottom: 6px; }
html.elder { --header-h: 72px; }
.logo {
    font-family: var(--font-serif);
    font-size: 22px;
    font-weight: 900;
    color:var(--gold-text);
    letter-spacing: -0.02em;
    margin-right: 28px;
    text-decoration: none;
    flex-shrink: 0;
}
.main-nav { display:flex; gap:2px; }
.main-nav a {
    font-size: var(--fs-sm);
    font-weight: 600;
    color: var(--ink-3);
    padding: 6px 14px;
    border-radius: 8px;
    transition: color 0.2s, background 0.2s;
    text-decoration: none;
    white-space: nowrap;
}
.main-nav a:hover { color: var(--ink); background: var(--gold-wash); }
.main-nav a.active {
    color:var(--gold-text);
    background: var(--gold-wash);
    font-weight: 700;
}

html.elder .main-nav a { font-size: var(--fs-md); padding: var(--sp-3) var(--sp-4); }

.header-right { margin-left: 8px; display: flex; align-items: center; gap: var(--sp-2); flex-shrink:0; }

/* 暗色切换按钮 */
.theme-toggle {
    width: 36px; height: 36px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ink-3);
    cursor: pointer;
    transition: color 0.2s, background 0.2s;
    border: none;
    background: none;
    font-family: inherit;
    font-size: 18px;
    padding: 0;
}
.theme-toggle:hover { background: var(--gold-wash); color:var(--gold-text); }

/* ---------- 7. 分类导航（v3 暂隐，#58 重做为首页 chips） ---------- */
.sub-nav {
    background: var(--card);
    border-bottom: 1px solid var(--line) !important;
    transition: background 0.4s, border-color 0.4s;
}
.sub-nav-inner {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 28px;
    display: flex;
    align-items: center;
    height: 40px;
    gap: 6px;
    overflow-x: auto;
    scrollbar-width: thin;
    -webkit-overflow-scrolling: touch;
}
.sub-nav a {
    text-decoration: none;
    color: var(--ink-3);
    font-size: var(--fs-sm);
    padding: 4px 12px;
    border-radius: var(--radius-full);
    transition: all 0.2s;
    white-space: nowrap;
    border: 1px solid transparent;
}
.sub-nav a:hover { color: var(--ink); border-color: var(--line); }
.sub-nav a.active {
    background: var(--invert-bg);
    color: var(--on-invert);
    border-color: var(--invert-bg);
    font-weight: 700;
}
.sub-nav .dim-label {
    font-size: var(--fs-xs);
    color: var(--ink-3);
    margin-right: var(--sp-1);
    flex-shrink: 0;
    white-space: nowrap;
    font-weight: 600;
}

/* ---------- 8. 筛选栏（chips 风格） ---------- */
.filter-bar {
    display: flex;
    gap: var(--sp-2);
    margin-bottom: 20px;
    flex-wrap: wrap;
}
.filter-item {
    padding: 4px 16px;
    border-radius: var(--radius-full);
    font-size: var(--fs-sm);
    font-weight: 500;
    text-decoration: none;
    color: var(--ink-3);
    background: var(--card);
    border: 1px solid var(--line);
    transition: all 0.2s;
}
.filter-item:hover { border-color: var(--gold); color: var(--ink-2); }
.filter-item.active {
    background: var(--invert-bg);
    color: var(--on-invert);
    border-color: var(--invert-bg);
    font-weight: 700;
}

/* 事件类型筛选行：和栏目/品牌行视觉上分开一档（它分的是「事件性质」不是「内容板块」），
   所以给个前缀标签 + 更小的字号；数字用 em 弱化，避免和类型名抢焦点 */
.filter-bar-type { align-items: center; }
.filter-label {
    font-size: var(--fs-xs);
    color: var(--ink-3);
    font-weight: 600;
    margin-right: var(--sp-1);
    flex-shrink: 0;
}
.type-chip { padding: 3px 12px; font-size: var(--fs-xs); }
/* 篇数是给用户看的信息不是装饰，用 ink-3（4.5:1 过 AA）而非 ink-4（3.68:1 只够图形） */
.type-chip em { font-style: normal; color: var(--ink-3); margin-left: 3px; font-weight: 400; }
.type-chip.active em { color: inherit; opacity: .75; }
/* 硬事件（召回/事故/维权）用红系提示，降价用绿系——和卡片上的类型 chip 同色系，
   点了之后能一眼对上是同一维度 */
.type-chip.type-recall, .type-chip.type-accident, .type-chip.type-rights { color: var(--red); }
.type-chip.type-price { color: var(--green); }
.type-chip.type-flag { color: var(--red); border-color: var(--red-light); }
.type-chip.active { color: var(--on-invert); }

/* ---------- 9. 新闻列表（保留 class 名，重设风格） ---------- */
.news-list { display: flex; flex-direction: column; gap: var(--sp-3); }

.news-item {
    background: var(--card);
    border-radius: var(--r);
    padding: 20px var(--sp-6);
    display: flex;
    gap: 20px;
    cursor: pointer;
    transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s;
    border: 1px solid var(--line);
}
.news-item:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-hover);
    border-color: var(--gold);
}

.news-thumb {
    width: 200px;
    height: 130px;
    border-radius: var(--r);
    background: linear-gradient(135deg, var(--line-2) 0%, var(--line) 100%);
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 40px;
    color: var(--ink-3);
    overflow: hidden;
}
.news-thumb img { width:100%; height:100%; object-fit:cover; transition:transform 0.6s var(--ease); }
.news-item:hover .news-thumb img { transform: scale(1.03); }
/* 无封面条目（#291）：整块缩略图不渲染，正文吃满整行宽。
   原来还加一道 3px 金色左条「标出条目起点」——那是按「无图是少数」设计的。实际库里
   1257 篇只有 14 篇有封面，金线等于逐条常亮，既不再指示任何东西，又让金色在列表里泛滥。
   卡片自己的 1px 描边 + 12px 间距已经标住了起点，金线去掉。 */

.news-body { flex: 1; display: flex; flex-direction: column; }
.news-body h3 {
    font-family: var(--font-serif);
    font-size: 17px;
    font-weight: 700;
    color: var(--ink);
    margin-bottom: var(--sp-2);
    line-height: 1.5;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.news-item:hover .news-body h3 {
    text-decoration: underline;
    text-decoration-color: var(--gold);
    text-decoration-thickness: 2px;
    text-underline-offset: 4px;
}

.news-body .summary {
    font-size: var(--fs-sm);
    color: var(--ink-2);
    line-height: 1.7;
    flex: 1;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.news-body .info-row {
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    margin-top: auto;
    font-size: var(--fs-xs);
    color: var(--ink-3);
}

.tag {
    display: inline-block;
    padding: 2px 10px;
    border-radius: 4px;
    font-size: 11px;
    font-weight: 700;
    background: var(--gold-wash);
    color:var(--gold-text);
}

.news-item.low-quality { opacity: .55; }
.news-item.low-quality:hover { opacity: 1; }

/* ---------- 10. 论坛 ---------- */
.post-list { display:flex; flex-direction:column; gap:1px; background:var(--line); border-radius:var(--r); overflow:hidden; }
.post-item {
    background: var(--card);
    padding: var(--sp-4) var(--sp-6);
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    transition: background 0.2s;
}
.post-item:hover { background: var(--line-2); }
.post-item-main {
    display:flex; align-items:center; gap:var(--sp-4); flex:1; min-width:0;
    color:inherit; text-decoration:none;
}
.post-report-control { margin:0; flex-shrink:0; }
.post-report-btn {
    min-height:32px; padding:5px 10px; font-size:var(--fs-xs); white-space:nowrap;
}
.post-report-btn[disabled] { opacity:.55; cursor:default; }
.post-detail-report {
    display:flex; justify-content:flex-end; margin-top:var(--sp-4); padding-top:var(--sp-3);
    border-top:1px solid var(--line-2);
}
.post-avatar {
    width:40px; height:40px; border-radius:50%;
    background: var(--line-2);
    display:flex; align-items:center; justify-content:center;
    font-size: var(--fs-md); color: var(--ink-3);
    flex-shrink:0; font-weight:600;
}
.post-info { flex:1; min-width:0; }
.post-info h4 { font-size:var(--fs-base); color:var(--ink); font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.post-info .post-meta { font-size:var(--fs-xs); color:var(--ink-3); margin-top:3px; }
.post-replies { font-size:var(--fs-xs); color:var(--ink-3); text-align:right; flex-shrink:0; }
.post-replies strong { color:var(--ink-2); font-size:var(--fs-base); }

@media (max-width:640px) {
    .post-item { flex-wrap:wrap; padding:var(--sp-3) var(--sp-4); gap:var(--sp-2); }
    .post-item-main { flex-basis:100%; gap:var(--sp-3); }
    .post-report-control { margin-left:auto; }
}

/* ---------- 11. 表单 ---------- */
.form-card {
    background: var(--card);
    border-radius: var(--r);
    padding: 36px 40px;
    max-width: 480px;
    margin: 40px auto;
    border: 1px solid var(--line);
}
.form-card h2 { text-align:center; font-family:var(--font-serif); font-size:var(--fs-xl); margin-bottom:28px; color:var(--ink); }

.form-group { margin-bottom: var(--sp-4); }
.form-group label {
    display:block; font-size:var(--fs-sm); font-weight:600;
    color: var(--ink-2); margin-bottom:6px;
}
.form-group input,
.form-group textarea,
.form-group select {
    width:100%; padding:10px 14px;
    border:1px solid var(--line); border-radius:var(--r-sm);
    font-size:var(--fs-base); font-family:inherit;
    transition: border-color 0.2s;
    background: var(--card); color: var(--ink);
}
.form-group input:focus,
.form-group textarea:focus,
.form-group select:focus {
    /* 焦点态原来只换了 1px 金边（对白底 2.25:1，WCAG 非文字要 3:1），
       再叠一层 10% 的淡晕基本看不出来。改成实心 2px 描边 + 深金边框。 */
    outline: 2px solid var(--gold-dark);
    outline-offset: 1px;
    border-color:var(--gold-dark);
    box-shadow: 0 0 0 3px rgba(217,165,20,0.14);
}
.form-group textarea { resize:vertical; min-height:130px; }
.form-group .helptext { font-size:11px; color:var(--ink-3); margin-top:var(--sp-1); display:block; }
.form-group .errorlist { font-size:var(--fs-xs); color:var(--red); list-style:none; margin-top:var(--sp-1); }
.form-footer { text-align:center; margin-top:20px; font-size:var(--fs-sm); color:var(--ink-3); }
.form-footer a { color:var(--gold-text); text-decoration:none; font-weight:600; }
.form-footer a:hover { text-decoration:underline; }

/* ---------- 12. 空状态 ---------- */
.empty-state { text-align:center; padding:60px 20px; color:var(--ink-3); }
.empty-state .empty-icon { font-size:56px; margin-bottom:var(--sp-4); }
.empty-state p { font-size:15px; color:var(--ink-3); }
.empty-state a { color:var(--gold-text); text-decoration:none; font-weight:600; }

/* ---------- 13. 页脚 ---------- */
.site-footer {
    text-align: center;
    padding: var(--sp-8) 28px;
    color: var(--ink-3);
    font-size: var(--fs-xs);
    max-width: 1200px;
    margin: 48px auto 0;
    border-top: 1px solid var(--line);
    transition: border-color 0.4s;
}
.site-footer a { color:var(--ink-3); text-decoration:none; margin:0 var(--sp-2); }
.site-footer a:hover { color:var(--gold-text); }

/* ---------- 14. 轮播（保留，#58 重做为 hero） ---------- */
.carousel {
    max-width:1200px; margin:var(--sp-6) auto 0; padding:0 28px;
    position:relative;
}
.carousel-slide {
    display:none; position:relative;
    border-radius:var(--r); overflow:hidden;
    height:360px; text-decoration:none;
}
.carousel-slide.active { display:block; }
.carousel-slide img { width:100%; height:100%; object-fit:cover; }
.carousel-caption {
    position:absolute; left:0; right:0; bottom:0;
    padding:60px 28px 22px;
    background: linear-gradient(transparent, rgba(0,0,0,0.7));
}
.carousel-caption h2 {
    color:#fff;
    font-family: var(--font-serif);
    font-size: var(--fs-2xl);
    font-weight:900;
    margin-top:var(--sp-2);
    line-height:1.35;
}
.carousel-dots { position:absolute; bottom:16px; right:40px; display:flex; gap:var(--sp-2); }
.carousel-dots .dot {
    width:9px; height:9px; border-radius:50%;
    background:rgba(255,255,255,0.4); cursor:pointer; transition:all 0.2s;
}
.carousel-dots .dot.active { background:var(--gold-dark); width:28px; border-radius:5px; }
.carousel-progress { position:absolute; bottom:0; left:0; right:0; height:3px; background:rgba(255,255,255,0.2); border-radius:0 0 var(--r) var(--r); overflow:hidden; }
.carousel-progress .bar { height:100%; background:var(--gold); width:0; }

/* ---------- 15. 首页两栏 ---------- */
.home-grid {
    max-width:1200px;
    margin:var(--sp-6) auto 0;
    padding:0 28px;
    display:grid;
    grid-template-columns:1fr 300px;
    gap:var(--sp-8);
    align-items:start;
}
.home-main { min-width:0; }
.home-side { display:flex; flex-direction:column; gap:20px; }

/* 侧栏卡 */
.side-card {
    background: var(--card);
    border-radius: var(--r);
    padding: 20px 22px;
    border: 1px solid var(--line);
    position: sticky;
    top: 76px;
    transition: background 0.4s, border-color 0.4s;
}
.hot-item {
    display:flex; align-items:center; gap:10px;
    padding:8px 0; text-decoration:none;
    border-bottom:1px solid var(--line-2);
    transition: color 0.2s;
}
.hot-item:last-child { border-bottom:none; }
.hot-thumb {
    width:52px; height:38px; flex-shrink:0; border-radius:4px;
    object-fit:cover; background:var(--line-2);
}
.hot-rank {
    flex-shrink:0;
    font-family: var(--font-display);
    font-weight:900; font-size:18px;
    font-variant-numeric:tabular-nums;
    width:24px; text-align:center;
    color: var(--ink-3);
    line-height:1;
}
.hot-rank.top, .hot-rank.top-1 { color:var(--gold-text); font-size: 22px; }
.hot-rank.top-2 { color:var(--gold-text); opacity:.7; }
.hot-rank.top-3 { color:var(--gold-text); opacity:.5; }
.hot-title {
    font-size:var(--fs-sm); color:var(--ink-2); line-height:1.5;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.hot-item:hover .hot-title { color:var(--ink); }

/* ---------- 16. 分页 ---------- */
.pagination {
    display:flex; gap:6px; justify-content:center; flex-wrap:wrap;
    margin-top:var(--sp-6);
}
.pagination a, .pagination span {
    min-width:36px; height:36px; padding:0 10px;
    display:inline-flex; align-items:center; justify-content:center;
    border:1px solid var(--line); border-radius:var(--r-sm);
    font-size:var(--fs-sm); text-decoration:none; color:var(--ink-3);
    background:var(--card); transition:all 0.2s;
    font-variant-numeric:tabular-nums;   /* 页码等宽，翻页时数字不左右抖 */
}
.pagination a:hover { border-color:var(--gold); color:var(--ink); }
.pagination .current { background:var(--gold); color:var(--on-gold); border-color:var(--gold); font-weight:700; }
/* 省略号不是可点页码：去掉方框，只留一个呼吸位 */
.pagination .ellipsis { border:none; background:none; min-width:20px; padding:0 2px; color:var(--ink-3); }

/* ---------- 17. 数据统计 ---------- */
.stat-cards { display:grid; grid-template-columns:repeat(4,1fr); gap:var(--sp-4); }
.stat-card {
    background:var(--card); border-radius:var(--r);
    border:1px solid var(--line);
    padding:var(--sp-6) var(--sp-4); text-align:center;
    transition: background 0.4s, border-color 0.4s;
}
.stat-num {
    font-family: var(--font-display);
    font-size:34px; font-weight:900;
    color:var(--gold-text);
    font-variant-numeric:tabular-nums;
}
.stat-label { margin-top:6px; font-size:var(--fs-sm); color:var(--ink-3); }
.stats-curve { width:100%; height:auto; display:block; }
.stats-curve .curve-value { font-size:11px; fill:var(--ink-2); }
.stats-curve .curve-label { font-size:10px; fill:var(--ink-3); }

/* ---------- 17b. 数据页 v3：Bento 拼盘 + 滚动叙事（#60） ---------- */
/* side-card 的 sticky 是给侧栏用的；数据页里它会和 GSAP pin、bento 网格打架 */
#stats-root { counter-reset: stats-chapter; }
#stats-root .side-card { position: static; }
#stats-root .side-card > .section-title { font-size: 17px; margin-bottom: 14px; }
#stats-root .card-sub { font-size: 12px; font-weight: 400; color: var(--text-meta); }
/* 大数字卡：Fraunces 渐变大字（64px 封顶，窄屏随视口缩） */
#stats-root .stat-num {
    font-size: clamp(36px, 4.5vw, 64px);
    line-height: 1.1;
    background: linear-gradient(135deg, var(--gold-bright), var(--gold-dark));
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
}
/* 章节编号：按出现顺序自动编号，{% if %} 抽走哪张都不断号 */
#stats-root .side-card > .section-title::before {
    counter-increment: stats-chapter;
    /* 补零交给 decimal-leading-zero：原来是死写一个 "0" 前缀，第 10 张卡就成了「010」 */
    content: counter(stats-chapter, decimal-leading-zero);
    display: block;
    font-family: var(--font-display);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 2px;
    color: var(--gold-text);
    margin-bottom: 4px;
}
/* pin 章节：大数字 + 曲线左右分栏 */
.stats-chapter { margin-top: var(--sp-6); }
.chapter-grid {
    display: grid;
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    gap: var(--sp-6);
    align-items: center;
}
/* Bento 拼盘：12 列不对称拼排，dense 让缺席的卡自动补位 */
.stats-bento {
    margin-top: var(--sp-4);
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    grid-auto-flow: dense;
    gap: var(--sp-4);
}
.stats-bento > .side-card { grid-column: 1 / -1; min-width: 0; }
@media (min-width: 900px) {
    .stats-bento > .span-7 { grid-column: span 7; }
    .stats-bento > .span-5 { grid-column: span 5; }
}
@media (max-width: 899px) {
    .chapter-grid { grid-template-columns: 1fr; gap: var(--sp-3); }
}
/* 榜单卡：sparkline 嵌进列表流 */
.brand-rank { list-style: none; margin: 0; padding: 0; }
.brand-rank-row {
    display: flex; align-items: center; gap: var(--sp-3);
    padding: 9px 0; border-bottom: 1px solid var(--line-2);
}
.brand-rank-row:last-child { border-bottom: none; }
.rank-no {
    font-family: var(--font-display); font-weight: 900; font-size: 15px;
    color: var(--gold-text); width: 20px; flex-shrink: 0; text-align: center;
}
.brand-rank-row:nth-child(n+4) .rank-no { color: var(--ink-3); }
.rank-name {
    font-size: var(--fs-sm); font-weight: 600; color: var(--ink);
    min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.rank-count { font-size: var(--fs-xs); color: var(--ink-3); font-variant-numeric: tabular-nums; flex-shrink: 0; }
.rank-note { margin-top: 10px; font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.7; }

/* ---------- 18. 质量分 ---------- */
.q-badge { display:inline-block; padding:1px 7px; border-radius:10px; font-size:var(--fs-xs); font-weight:700; line-height:1.6; }
.q-high { background:var(--green-light); color:var(--green); }
.q-mid  { background:var(--gold-light); color:var(--gold-text); }
.q-low  { background:var(--red-light); color:var(--red); }
.q-flag { display:inline-block; padding:1px 7px; border-radius:3px; font-size:11px; background:var(--red-light); color:var(--red); border:1px solid rgba(181,84,59,0.2); }
.quality-panel { margin:var(--sp-4) 0; padding:var(--sp-3) var(--sp-4); border-radius:var(--r-sm); border:1px solid var(--line); background:var(--card); }
.quality-panel.q-low { background:var(--red-light); border-color:rgba(181,84,59,0.15); }
.quality-head { display:flex; align-items:center; gap:var(--sp-2); flex-wrap:wrap; }
/* 「这篇没有质量分」那一格（#669）。刻意**不用红/黄任何告警色**：
   没判不是问题也不是警告，是一条中性的事实。用描边和留白跟质量分面板同族，
   靠位置和字说话，不靠颜色。 */
.unjudged {
    margin:var(--sp-4) 0; padding:var(--sp-3) var(--sp-4);
    border-radius:var(--r-sm); border:1px dashed var(--line);
    background:var(--card);
}
.unjudged-t { font-size:var(--fs-sm); font-weight:700; color:var(--ink-2); }
.unjudged-why { margin-top:var(--sp-2); font-size:var(--fs-sm); color:var(--ink-3); line-height:1.9; }
.unjudged-more { display:inline-block; margin-top:var(--sp-2); font-size:var(--fs-xs); color:var(--gold-text); text-decoration:none; }
.unjudged-more:hover { text-decoration:underline; }
.quality-why { margin-top:var(--sp-2); }
.quality-why summary { cursor:pointer; font-size:var(--fs-sm); color:var(--gold-text); user-select:none; }
.quality-detail { margin-top:var(--sp-2); font-size:var(--fs-sm); color:var(--ink-2); }
.q-signal { margin:6px 0; padding:6px 10px; background:var(--card); border-left:3px solid var(--gold); border-radius:3px; }
.q-signal .q-hit, .quality-detail .q-hit { display:inline-block; margin:1px 3px; padding:0 5px; background:var(--gold-light); color:var(--gold-text); border-radius:3px; font-size:var(--fs-xs); }
mark.q-hit { background:var(--gold-light); color:var(--gold-text); padding:0 2px; border-radius:2px; }
.folded-low { margin-top:14px; }
.folded-low summary { cursor:pointer; user-select:none; padding:10px var(--sp-4); background:var(--card); border:1px dashed var(--line); border-radius:var(--r-sm); font-size:var(--fs-sm); color:var(--ink-3); }
.folded-low summary:hover { color:var(--ink-2); border-color:var(--gold); }
.folded-low[open] summary { border-bottom-left-radius:0; border-bottom-right-radius:0; }

/* 摘要要点溯源（#191）：每条要点旁边挂原文出处，对不上的如实标出 */
.cite-point { margin:6px 0; }
.cite-src { display:inline; margin-left:6px; }
.cite-src summary { display:inline; cursor:pointer; user-select:none; font-size:var(--fs-xs); color:var(--gold-text); }
.cite-src summary::marker { content:''; }
.cite-src q { display:block; margin:4px 0 0 18px; padding:6px 10px; background:var(--card); border-left:3px solid var(--gold); border-radius:3px; font-size:var(--fs-sm); color:var(--ink-2); }
/* 文字用 ink-3 不用 ink-4：ink-4 的定义那里自己写着「禁止用于正文小字」（3.68:1 不过
   AA 4.5），而这行小字恰恰是最该被看清的那句实话——把「这条没对上」印成灰得看不见
   等于没标。下划线是装饰，留 ink-4 没问题。 */
.cite-none { margin-left:6px; font-size:var(--fs-xs); color:var(--ink-3); border-bottom:1px dotted var(--ink-4); cursor:help; }
/* 措辞没过对外校验的两档（#270）。同 cite-none 的理由：这两行是「你现在看的不是
   模型原话」的唯一提示，印成看不清就等于没说，所以照样走 ink-2/ink-3 而不是灰到底。
   cite-quoted 展示的是本篇正文原句（可信度比要点更高），所以不做减弱处理，只在
   句尾挂一枚「· 原文」的小标区分来源。 */
.cite-quoted { color:var(--ink-2); }
.cite-quoted-tag { font-size:var(--fs-xs); color:var(--gold-text); white-space:nowrap; }
.cite-withheld { font-size:var(--fs-sm); color:var(--ink-3); border-bottom:1px dotted var(--ink-4); cursor:help; }

/* ---------- 19. 搜索高亮 ---------- */
mark { background:var(--gold-light); color:var(--gold-text); padding:0 2px; border-radius:2px; }

/* ---------- 20. 内容卡片（详情页/报告页通用） ---------- */
.content-card {
    background: var(--card);
    border-radius: var(--r);
    padding: var(--sp-6) 40px;
    border: 1px solid var(--line);
    transition: background 0.4s, border-color 0.4s;
}
.content-card + .content-card { margin-top: var(--sp-4); }
.content-card h1 {
    font-family: var(--font-serif);
    font-size: 26px;
    font-weight: 900;
    line-height: 1.4;
    color: var(--ink);
    margin-bottom: var(--sp-4);
}

.detail-meta {
    display:flex; gap:var(--sp-4); font-size:var(--fs-sm);
    color:var(--ink-3);
    padding-bottom:var(--sp-4);
    border-bottom:1px solid var(--line);
    flex-wrap:wrap;
}

.event-link {
    display:block; margin-top:var(--sp-4);
    padding:10px var(--sp-4);
    background:var(--gold-wash); border-left:3px solid var(--gold);
    border-radius:var(--r-sm); text-decoration:none;
    color:var(--gold-text); font-size:var(--fs-base);
}
.event-link:hover { background:var(--gold-light); }

/* 同源文本路径（#457）：谁先发的 + 两篇正文重合多少，一行一篇按时间排 */
.lineage-box {
    margin-top:var(--sp-4);
    padding:12px var(--sp-4);
    border:1px solid var(--line); border-radius:var(--r-sm);
    background:var(--card);
}
.lineage-head {
    font-size:var(--fs-sm); font-weight:700;
    color:var(--ink-2); margin-bottom:10px;
}
.lineage-list { list-style:none; margin:0; padding:0; }
.lineage-item {
    position:relative;
    padding-top:6px; padding-bottom:6px;
    border-top:1px solid var(--line);
    display:flex; flex-wrap:wrap; align-items:baseline; gap:8px;
    font-size:var(--fs-sm);
}
.lineage-item:first-child { border-top:none; }
/* 当前这篇要一眼找得到——读者是从这篇点进来的，不标出来就得自己逐行找 */
.lineage-item.current { background:var(--gold-wash); border-radius:var(--r-sm); }
.lineage-when { color:var(--text-lighter); font-variant-numeric:tabular-nums; }
.lineage-src { font-weight:700; color:var(--ink-2); }
.lineage-sim { color:var(--text-meta); font-size:var(--fs-xs); }
.lineage-sim.first { color:var(--gold-text); font-weight:700; }
.lineage-you {
    font-size:var(--fs-xs); color:var(--gold-text);
    border:1px solid var(--gold); border-radius:999px; padding:0 8px;
}
/* 标题独占一行：来源和重合度是这一块的主信息，标题是给点击用的 */
.lineage-title {
    flex-basis:100%; color:var(--ink); text-decoration:none;
    line-height:1.5;
}
a.lineage-title:hover { color:var(--gold-text); text-decoration:underline; }
.lineage-foot {
    margin-top:10px; font-size:var(--fs-xs); color:var(--text-lighter);
    line-height:1.7;
}
.lineage-foot a { color:var(--gold-text); }

/* AI 摘要 */
.ai-summary {
    margin:20px 0; padding:14px var(--sp-4);
    background:var(--gold-wash);
    border-left:3px solid var(--gold);
    border-radius:0 var(--r-sm) var(--r-sm) 0;
}
.ai-summary-label {
    font-size:var(--fs-xs); font-weight:700;
    color:var(--gold-text); margin-bottom:var(--sp-1);
    letter-spacing:0.04em;
}

.source-link {
    display:block; margin-top:var(--sp-4);
    padding:14px 20px;
    background:var(--gold-wash); border:1px solid var(--gold);
    border-radius:var(--r); text-decoration:none;
    color:var(--gold-text); font-size:15px; font-weight:600; text-align:center;
}
.source-link:hover { background:var(--gold); color:var(--on-gold); }

/* 内容来路角标（#185）：形状共用一份、只有配色分家——写法照本文件下面
   `.data-chip` / `.data-chip.chip-brand` 的基类 + 修饰符，别再各抄一遍那 5 条声明
   （原来两块 7 条里 5 条逐字重复，改一个圆角得记着改两处）。 */
.ai-badge, .rule-badge {
    display:inline-block; padding:2px 6px; border-radius:3px;
    /* 11px → 字阶 --fs-xs（#644）：.rule-badge 印的是「规则摘录 · 正文首句」，
       8 个字带分隔符，不是规则库允许 11px 的那种 2–3 字短状态。 */
    font-size:var(--fs-xs); font-weight:600;
    vertical-align:middle; margin-left:var(--sp-1);
}
.ai-badge { background:rgba(26,115,232,0.08); color:var(--ai-badge); }
/* 「这一格不是模型出的」——同一个位置的另一档（#185）。
   一句话总结、早报摘要这类格子有 LLM 和规则两条来路；来路是规则时不能留白，
   留白读者会顺着旁边那些蓝角标以为也是模型写的。灰底中性色，刻意不碰
   .ai-badge 的蓝——蓝色在本站只代表「模型生成」这一件事。
   文字色走 --ink-3（明/暗两套主题各自定义过，与 .digest-summary 同一档），
   不新增颜色 token，也就不动 tools/contrast_check.py 的那张配对表。 */
.rule-badge { background:var(--line-2); color:var(--ink-3); }
/* 卡片摘要那一格的角标（首页 `.card-summary` + 列表条目 `.news-body .summary`，
   两处都是 `-webkit-line-clamp:2`）：角标必须**前置**，挂文字后面会被裁掉、等于没标，
   所以左边距归零、右边留 4px 跟文字分开。原来这串是两个模板各写一份 inline style、
   逐字重复（含同一串 `margin-left:0;margin-right:4px`），收进修饰符。 */
.ai-badge--lead { margin-left:0; margin-right:4px; }

/* ---------- 21. Toast ---------- */
.toast {
    position:fixed; bottom:var(--sp-8); left:50%;
    transform:translateX(-50%) translateY(100px);
    background:var(--ink); color:var(--paper);
    padding:var(--sp-3) var(--sp-6); border-radius:var(--r);
    font-size:var(--fs-sm); z-index:9999;
    opacity:0; transition:all 0.3s ease; pointer-events:none;
}
.toast.show { transform:translateX(-50%) translateY(0); opacity:1; }

/* ---------- 22. 动画 ---------- */
@keyframes fadeInUp {
    from { opacity:0; transform:translateY(16px); }
    to   { opacity:1; transform:translateY(0); }
}
.fade-in-up { animation: fadeInUp 0.5s var(--ease-out) both; }
.stagger-1 { animation-delay: 0.05s; }
.stagger-2 { animation-delay: 0.10s; }
.stagger-3 { animation-delay: 0.15s; }
.stagger-4 { animation-delay: 0.20s; }
.stagger-5 { animation-delay: 0.25s; }

@keyframes shake {
    0%,100% { transform:translateX(0); }
    20% { transform:translateX(-4px); }
    40% { transform:translateX(4px); }
    60% { transform:translateX(-3px); }
    80% { transform:translateX(2px); }
}
.anim-shake { animation: shake 0.4s ease-in-out 0.6s both; }

@keyframes pulse {
    0%,100% { box-shadow:0 0 0 0 rgba(181,84,59,0.3); }
    50%     { box-shadow:0 0 0 5px rgba(181,84,59,0); }
}
.pulse-red { animation: pulse 2s ease-in-out infinite; }

@keyframes shimmer {
    0%   { background-position: -200% 0; }
    100% { background-position:  200% 0; }
}

/* 滚动浮现
   默认什么都不做——首页有 28 个 .reveal，一旦 GSAP/ScrollTrigger 没加载上
   （断网、JS 关掉、老浏览器），opacity:0 就再也没人还原，整页内容看不见。
   起始态改由 interactions.js 确认 ScrollTrigger 可用后加 .reveal-armed 才生效。 */
.reveal {
    transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
}
.reveal-armed { opacity:0; transform:translateY(16px); }

/* ---------- 23. SVG 环形质量分 ---------- */
.score-ring { position:relative; display:inline-flex; align-items:center; justify-content:center; }
.score-ring svg { transform:rotate(-90deg); }
.score-ring .ring-bg { fill:none; stroke:var(--line); stroke-width:4; }
.score-ring .ring-fg { fill:none; stroke-width:4; stroke-linecap:round; }
.score-ring .ring-value {
    position:absolute; inset:0;
    display:flex; flex-direction:column; align-items:center; justify-content:center;
    font-variant-numeric:tabular-nums;
}
.score-ring .ring-num {
    font-family: var(--font-display);
    font-size:26px; font-weight:900; line-height:1;
}
.score-ring .ring-label { font-size:11px; color:var(--ink-3); margin-top:2px; }

/* ---------- 24. 导航下拉 ---------- */
.nav-dropdown { position:relative; }
.nav-dropdown > a::after { content:' ▾'; font-size:10px; opacity:0.5; }
.nav-dropdown .dropdown-menu {
    display:none; position:absolute;
    top:calc(100% + 4px); left:50%; transform:translateX(-50%);
    background:var(--card); border:1px solid var(--line);
    border-radius:var(--r);
    box-shadow: 0 12px 32px rgba(0,0,0,0.08);
    min-width:150px; padding:var(--sp-1) 0; z-index:200;
}
.nav-dropdown:hover .dropdown-menu,
.nav-dropdown:focus-within .dropdown-menu { display:block; }
.dropdown-menu a {
    display:block; padding:8px 18px;
    font-size:var(--fs-sm) !important; color:var(--ink-2);
    text-decoration:none; white-space:nowrap;
    transition:background 0.15s;
    border-radius:0 !important; background:none !important; font-weight:400 !important;
}
.dropdown-menu a:hover { background:var(--gold-wash) !important; color:var(--ink); }
.dropdown-menu a.active { color:var(--gold-text); font-weight:600 !important; }
/* 下拉里的分组标题（「方法」簇下的「其它入口」）：一条抽屉装两类东西时，
   没有分隔的清单会重新变回杂物抽屉——这是把「更多」改名成「方法」时要还的债。
   不可点，所以用 span 不用 a，读屏也不会把它读成链接。 */
.dropdown-menu .dropdown-group {
    display:block; padding:10px 18px 4px;
    font-size:var(--fs-xs); color:var(--ink-3);
    border-top:1px solid var(--line); margin-top:4px;
}

/* ---------- 25. 骨架屏 ---------- */
.skeleton {
    background: linear-gradient(90deg, var(--line-2) 25%, var(--line) 50%, var(--line-2) 75%);
    background-size:200% 100%;
    animation: shimmer 1.5s infinite;
    border-radius:var(--r-sm);
}
.skeleton-text { height:14px; margin-bottom:8px; border-radius:4px; }
.skeleton-text.short { width:60%; }
.skeleton-text.medium { width:80%; }
.skeleton-circle { border-radius:50%; }
.loading-overlay { text-align:center; padding:var(--sp-8) var(--sp-4); }
.loading-spinner {
    width:36px; height:36px;
    border:3px solid var(--line); border-top-color:var(--gold);
    border-radius:50%; animation:spin 0.8s linear infinite;
    margin:0 auto var(--sp-4);
}
@keyframes spin { to { transform:rotate(360deg); } }
.loading-text { font-size:var(--fs-sm); color:var(--ink-3); }

/* ---------- 26. 时间线 ---------- */
.timeline { position:relative; padding-left:24px; }
.timeline::before { content:''; position:absolute; left:7px; top:0; bottom:0; width:2px; background:var(--line); }
.timeline-item { position:relative; padding-bottom:20px; }
.timeline-item:last-child { padding-bottom:0; }
.timeline-dot {
    position:absolute; left:-21px; top:6px;
    width:12px; height:12px; border-radius:50%;
    background:var(--gold); border:2px solid var(--card); z-index:1;
}
.timeline-dot.dot-red { background:var(--red); }
.timeline-dot.dot-green { background:var(--green); }
.timeline-dot.dot-orange { background:var(--q-mid); }
.timeline-dot.dot-blue { background:var(--ai-badge); }
.timeline-meta { font-size:var(--fs-xs); color:var(--ink-3); }
.timeline-title { display:block; font-size:15px; color:var(--ink); text-decoration:none; margin-top:3px; }
a.timeline-title:hover { color:var(--gold-text); }
.timeline-tags { margin-top:6px; display:flex; gap:6px; flex-wrap:wrap; }
.timeline-item.after-buy { background:var(--red-light); margin:0 -12px; padding:10px 12px 10px 36px; border-radius:var(--r-sm); }

/* ---------- 27. 状态胶囊 ---------- */
.status-capsule {
    display:inline-flex; align-items:center; gap:4px;
    padding:3px 10px; border-radius:var(--radius-full);
    font-size:var(--fs-xs); font-weight:600; white-space:nowrap;
}
.status-active { background:var(--green-light); color:var(--green); }
.status-upcoming { background:var(--gold-light); color:var(--gold-text); }
.status-draft { background:var(--line-2); color:var(--ink-3); }
.status-countdown { font-variant-numeric:tabular-nums; }

/* ---------- 28. 事件色条 ---------- */
.event-bar { width:4px; flex-shrink:0; align-self:stretch; border-radius:2px; }
.event-bar-cut { background:var(--red); }
.event-bar-up { background:var(--green); }
.event-bar-rights { background:var(--q-mid); }
.event-bar-launch { background:var(--ai-badge); }
.event-bar-default { background:var(--gold-dark); }

/* ---------- 29. 收据（计算器） ---------- */
.receipt { font-variant-numeric:tabular-nums; }
.receipt-row {
    display:flex; justify-content:space-between; align-items:baseline;
    padding:8px 0; font-size:var(--fs-sm);
}
.receipt-row + .receipt-row { border-top:1px solid var(--line-2); }
.receipt-row .receipt-label { color:var(--ink-2); }
.receipt-row .receipt-value { font-weight:600; text-align:right; }
.receipt-row.receipt-total {
    border-top:2px solid var(--ink);
    padding-top:12px; margin-top:4px;
    font-size:var(--fs-md); font-weight:700;
}
.receipt-total .receipt-value { color:var(--green); }
.receipt-check { color:var(--green); }
.receipt-miss { color:var(--ink-3); }

/* ---------- 30. 杂项 ---------- */
.result-enter { animation: fadeInUp 0.4s ease-out both; }
.big-num { font-family:var(--font-display); font-variant-numeric:tabular-nums; font-weight:900; }
.ai-summary-blue {
    margin:20px 0; padding:14px var(--sp-4);
    background: rgba(26,115,232,0.06);
    border-left:3px solid var(--ai-badge);
    border-radius:0 var(--r-sm) var(--r-sm) 0;
}
.ai-summary-blue .ai-summary-label { color:var(--ai-badge); }
.result-bg-good { background:var(--green-light); }
.result-bg-mid { background:var(--gold-wash); }
.result-bg-bad { background:var(--red-light); }

/* ---------- 31. 响应式：中屏 ---------- */
@media (max-width: 1024px) {
    .home-grid { grid-template-columns:1fr 260px; }
    .stat-cards { grid-template-columns:repeat(2,1fr); }
}

/* ---------- 32. 响应式：小屏 ---------- */
@media (max-width: 768px) {
    .main, .home-grid, .carousel, .sub-nav-inner, .header-inner { padding-left:var(--sp-4); padding-right:var(--sp-4); }
    .home-grid { grid-template-columns:1fr; }
    .side-card { position:static; }
    .carousel-slide { height:200px; }
    .carousel-caption h2 { font-size:var(--fs-lg); }
    .news-item { padding:14px var(--sp-4); gap:var(--sp-3); }
    .news-thumb { width:120px; height:78px; font-size:28px; }
    .news-body h3 { font-size:15px; }
    .header-inner { flex-wrap:wrap; height:auto; padding-top:10px; padding-bottom:10px; gap:var(--sp-2); }
    .stat-cards { grid-template-columns:repeat(2,1fr); }
    .stat-num { font-size:26px; }
    .content-card { padding:20px var(--sp-4); }
    .form-card { padding:var(--sp-6) 20px; margin:20px var(--sp-4); max-width:none; }
    .nav-dropdown .dropdown-menu { position:static; transform:none; box-shadow:none; border:none; min-width:0; display:none; padding:0; }
    .nav-dropdown.open .dropdown-menu { display:flex; flex-wrap:wrap; gap:2px; }
    .dropdown-menu a { padding:6px 12px; }
    .score-ring .ring-num { font-size:22px; }
    .sub-nav { display:none; }
    .site-footer { padding:var(--sp-6) var(--sp-4); margin-top:var(--sp-8); }
}

/* ---------- 33. 响应式：极小屏 ---------- */
@media (max-width: 480px) {
    .news-item { flex-direction:column; }
    .news-thumb { width:100%; height:180px; }
    .carousel-slide { height:160px; }
    .main-nav { flex-wrap:wrap; gap:var(--sp-1); }
    .main-nav a { padding:6px 10px; font-size:var(--fs-sm); }
}

/* ==========================================================
   v3 UI 改版 — 新增组件（#67）
   ========================================================== */

/* ---------- 35. 启动动画 ----------
   遮罩盖满全屏 z-index:10000，只有 JS 会移除它——JS 一挂就是全站白屏。
   所以默认 display:none，由 base.html 的内联脚本加 html.startup 才显示，
   同一段内联脚本还挂了硬超时兜底，interactions.js 没跑起来也会自动收掉。 */
.startup-overlay { display:none; }
html.startup .startup-overlay {
    position:fixed; inset:0; z-index:10000;
    background:var(--paper);
    display:flex; flex-direction:column; align-items:center; justify-content:center;
    transition: opacity 0.6s var(--ease);
}
.startup-overlay.fade-out { opacity:0; pointer-events:none; }
/* 进站仪式（改版 ⑭；2026-08-11 第三版，**逐条照抄**设计稿 1_首页_v4检测站.html
   的 `.gate`）：抬杆 → 五工位灯依次亮 → 累计数落定，三拍共 1.8s。
   纯 CSS keyframes，不依赖 GSAP——它是 defer 加载的，没跑起来时这段也得演完。

   ⚠️ **被否掉的两版，别往回走**（两版都是自己重解释设计稿的结果）：
   ① 描线版：杆/车/灯全是 `stroke:var(--gold); stroke-width:2` 的描线，
      viewBox 260×120，灯是 4px 空心圆——淡金细线摆在整块 --paper 遮罩正中，
      远看只是一撮毛。
   ② SVG 小场景版：把杆砍到 110 长（稿 206）、条纹节距拉稀，还自己加了**车和
      地面线**（稿上没有）。车在左、闸在右，把「一根杆的居中主视觉」打散成一个
      歪的小场景，跟底下站名/灯/数字那条中轴对不上；沛伶「做的特别丑」。
   这一段的主视觉**就是一根又长又粗的抬杆**：居中、干净、别加道具、别砍长度。

   下面所有尺寸都是设计稿原值（.gate-bar-wrap / .gate-post / .gate-bar），
   改之前先想清楚为什么稿子是这个数。 */
.startup-gate { position: relative; width: 300px; height: 230px; }
.startup-gate .sg-post {
    position: absolute; left: 38px; bottom: 0;
    width: 12px; height: 58px; border-radius: 3px;
    background: linear-gradient(180deg, var(--ink-3), var(--ink));
}
/* 横杆：以**左端**为轴抬起（道闸就是这么转的），抬到 -74° 时杆尖会伸出舞台上沿
   约 14px——稿子就是这样，`.startup-gate` 别加 overflow:hidden 去「装下」它。 */
.startup-gate .sg-bar {
    position: absolute; left: 46px; bottom: 46px;
    width: 206px; height: 10px; border-radius: 3px;
    background: repeating-linear-gradient(45deg, var(--red) 0 13px, #F5F2EA 13px 26px);
    box-shadow: 0 2px 6px rgba(0, 0, 0, .18);
    transform-origin: left center;
    /* 第一拍 0.24~1.19s */
    animation: sg-lift .95s cubic-bezier(.34, 1.3, .64, 1) .24s forwards;
}
@keyframes sg-lift { from { transform: rotate(0deg); } to { transform: rotate(-74deg); } }

/* 站名：设计稿是 serif 900 + 大字距的英文副题，跟门头同一套字 */
.sg-sign { text-align: center; margin-top: var(--sp-4); }
.sg-sign b {
    display: block; font-family: var(--font-display);
    font-size: 28px; font-weight: 900; letter-spacing: .08em; color: var(--ink);
}
.sg-sign span {
    display: block; margin-top: 4px;
    font-size: var(--fs-xs); letter-spacing: .3em; color: var(--ink-3);
}

/* 第二拍 0.30~1.32s：五个工位灯依次点亮。跟抬杆**同时**演（稿子也是这样），
   排在抬杆后面等它演完，1.8 秒就不够用了。
   灯下面的工位名不是装饰——它是「每篇稿件过五个工位」的所指，删了这段仪式就没内容了 */
.sg-lamps { display: flex; gap: 14px; margin-top: var(--sp-5); }
.sg-lamp {
    display: flex; flex-direction: column; align-items: center; gap: 6px;
    opacity: .25; animation: sg-lamp .3s ease-out both;
}
.sg-lamp i {
    width: 11px; height: 11px; border-radius: 50%;
    background: var(--ink-4); transition: none;
}
.sg-lamp span { font-size: var(--fs-xs); color: var(--ink-3); }
.sg-lamp:nth-child(1) { animation-delay: 0.30s; }
.sg-lamp:nth-child(2) { animation-delay: 0.48s; }
.sg-lamp:nth-child(3) { animation-delay: 0.66s; }
.sg-lamp:nth-child(4) { animation-delay: 0.84s; }
.sg-lamp:nth-child(5) { animation-delay: 1.02s; }
@keyframes sg-lamp { from { opacity: .25; } to { opacity: 1; } }
/* 亮灯的金色和光晕跟着同一拍走——写在 i 上是因为 opacity 动画管不了子元素的底色 */
.sg-lamp i { animation: sg-lamp-on .3s ease-out both; animation-delay: inherit; }
@keyframes sg-lamp-on {
    to { background: var(--gold); box-shadow: 0 0 0 4px var(--gold-wash), 0 0 12px var(--gold); }
}

/* 第三拍：收在累计数字上（rAF 数数在 interactions.js）。设计稿 42px serif 金字 + 一行说明 */
.sg-screen { text-align: center; margin-top: var(--sp-5); }
.startup-odometer {
    display: block;
    font-family: var(--font-display); font-size: 42px; font-weight: 900; line-height: 1;
    color: var(--gold-text); font-variant-numeric: tabular-nums;
}
.startup-label {
    display: block; margin-top: 6px;
    font-size: var(--fs-xs); color: var(--ink-3); letter-spacing: .04em;
}

/* 跳过：遮罩盖着全屏，不给出口就是把人按在这 1.8 秒里 */
.sg-skip {
    position: absolute; right: 24px; bottom: 22px;
    background: none; border: none; cursor: pointer;
    font-family: inherit; font-size: var(--fs-xs); color: var(--ink-3);
    padding: 6px 10px; border-radius: var(--r-sm);
}
.sg-skip:hover { color: var(--gold-text); background: var(--gold-wash); }

/* ---------- 36. Hero 区（替代轮播） ---------- */
.hero {
    max-width:1200px; margin:var(--sp-6) auto 0; padding:0 28px;
    display:grid; grid-template-columns:2fr 1fr; gap:var(--sp-4);
    position:relative; overflow:hidden;
}
.hero, .hero-main, .hero-secondary, .hero-side-card, .hero-side-body { min-width:0; }
.hero-main {
    position:relative; border-radius:var(--r); overflow:hidden;
    min-height:400px; display:flex; flex-direction:column; justify-content:flex-end;
    text-decoration:none; color:#fff;
}
.hero-main img {
    position:absolute; inset:0; width:100%; height:100%; object-fit:cover;
    transition:transform 0.8s var(--ease);
}
.hero-main:hover img { transform:scale(1.03); }
.hero-main .hero-overlay {
    position:relative; z-index:1;
    padding:48px 32px 28px;
    background:linear-gradient(transparent, rgba(0,0,0,0.75));
}
.hero-main .hero-overlay h2 {
    font-family:var(--font-serif); font-size:var(--fs-3xl); font-weight:900;
    line-height:1.15; letter-spacing:0.02em; margin-bottom:var(--sp-2);
}
.hero-main .hero-overlay .hero-meta {
    font-size:var(--fs-sm); opacity:0.8;
}
.hero-watermark {
    position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);
    font-family:var(--font-display); font-size:120px; font-weight:900;
    color:rgba(255,255,255,0.04); pointer-events:none; z-index:0;
    white-space:nowrap; letter-spacing:0.05em;
}
.hero-secondary {
    display:flex; flex-direction:column; gap:var(--sp-4);
}
.hero-side-card {
    flex:1; background:var(--card); border-radius:var(--r);
    padding:0; border:1px solid var(--line); overflow:hidden;
    display:flex; flex-direction:column; justify-content:center;
    text-decoration:none; color:inherit;
    transition:border-color 0.3s, transform 0.3s var(--ease), box-shadow 0.3s;
}
.hero-side-thumb { height:112px; overflow:hidden; background:var(--line-2); }
.hero-side-thumb img { width:100%; height:100%; object-fit:cover; transition:transform .6s var(--ease); }
.hero-side-card:hover .hero-side-thumb img { transform:scale(1.03); }
.hero-side-body { padding:var(--sp-4); display:flex; flex:1; flex-direction:column; }
.hero-side-card:hover {
    border-color:var(--gold); transform:translateY(-2px); box-shadow:var(--shadow-hover);
}
.hero-side-card h3 {
    font-family:var(--font-serif); font-size:var(--fs-lg); font-weight:700;
    line-height:1.4; margin-bottom:var(--sp-2); overflow-wrap:anywhere;
}
.hero-side-card .data-chips { margin-bottom:var(--sp-2); }

/* 车灯光轨 .headlight-streak 已删：没有任何模板挂过这个类（配套 JS 同删） */

/* ---------- 37. Bento 数据带 ---------- */
.bento-strip {
    max-width:1200px; margin:var(--sp-6) auto 0; padding:0 28px;
    display:grid; grid-template-columns:repeat(4,1fr); gap:var(--sp-4);
}
.bento-card {
    background:var(--card); border-radius:var(--r);
    padding:var(--sp-6) var(--sp-4);
    border:1px solid var(--line);
    text-align:center; position:relative; overflow:hidden;
    transition:border-color 0.3s, transform 0.3s var(--ease), box-shadow 0.3s;
}
.bento-card:hover {
    border-color:var(--gold); transform:translateY(-2px); box-shadow:var(--shadow-hover);
}
.bento-card.card-glow::before {
    content:''; position:absolute; inset:0; border-radius:var(--r);
    background:radial-gradient(300px circle at var(--glow-x,50%) var(--glow-y,50%),
        rgba(217,165,20,0.08), transparent 60%);
    pointer-events:none; opacity:0; transition:opacity 0.3s;
}
.bento-card:hover.card-glow::before { opacity:1; }
.bento-num {
    font-family:var(--font-display); font-size:36px; font-weight:900;
    color:var(--gold-text); line-height:1;
    font-variant-numeric:tabular-nums;
}
.bento-label {
    font-size:var(--fs-sm); color:var(--ink-3); margin-top:var(--sp-2);
}
.bento-icon {
    font-size:24px; margin-bottom:var(--sp-2);
}
.bento-card a {
    display:block; margin-top:var(--sp-2);
    font-size:var(--fs-xs); color:var(--gold-text); text-decoration:none;
}
.bento-card a:hover { text-decoration:underline; }

/* ---------- 38. 杂志网格 ---------- */
.magazine-section {
    max-width:1200px; margin:var(--sp-8) auto 0; padding:0 28px;
    display:grid; grid-template-columns:1fr 300px; gap:var(--sp-8);
    align-items:start;
}
.magazine-grid {
    display:grid; grid-template-columns:repeat(2,1fr); gap:var(--sp-4);
}
.magazine-grid .news-card:first-child {
    grid-column:1 / -1;
}
.magazine-grid .news-card:first-child .news-card-thumb {
    height:280px;
}
.magazine-grid .news-card:first-child h3 {
    font-size:var(--fs-2xl);
}

/* ---------- 39. 结构化新闻卡 ---------- */
.news-card {
    background:var(--card); border-radius:var(--r);
    border:1px solid var(--line); overflow:hidden;
    text-decoration:none; color:inherit; display:flex; flex-direction:column;
    transition:border-color 0.3s, transform 0.3s var(--ease), box-shadow 0.3s;
    position:relative;
}
.news-card:hover {
    border-color:var(--gold); transform:translateY(-2px); box-shadow:var(--shadow-hover);
}
.news-card .news-card-thumb {
    width:100%; height:180px; overflow:hidden; position:relative;
    background:linear-gradient(135deg, var(--line-2), var(--line));
}
.news-card .news-card-thumb img {
    width:100%; height:100%; object-fit:cover;
    transition:transform 0.6s var(--ease);
}
.news-card:hover .news-card-thumb img { transform:scale(1.03); }
/* 无封面卡（#291）：不占位、不摆假图，改用排版撑住——顶部金线代替图片给卡片一个视觉锚点，
   标题放大并多给一行，摘要多摆两行，把省下的高度还给文字 */
/* 原来这里还有 `border-top:3px solid var(--gold)`，和列表版的 `.news-item.no-cover` 左金条
   是同一个设计的两个出口，一起删（理由写在那一处）：库里 1257 篇只有 14 篇有封面，
   首页 20 张卡就是 20 条金线，标记不再指示"这条没图"，只是把金色铺满了整个列表。
   下面放大标题、加长摘要的补偿保留——那是真的把省下的高度还给了文字。 */
.news-card.no-cover .news-card-body h3 {
    font-size:19px; -webkit-line-clamp:3;
}
.news-card.no-cover .news-card-body .card-summary {
    -webkit-line-clamp:5;
}
/* 通栏头条无封面：上一条跟 `.magazine-grid .news-card:first-child h3` 特异性打平(0,3,1)、
   且写在后面，会把头条字号从 28px 压到 19px——图没了字还变小，整块塌成一条小字带。
   头条本来就该更大，这里明确抢回来。 */
.magazine-grid .news-card:first-child.no-cover .news-card-body {
    padding:var(--sp-6);
}
.magazine-grid .news-card:first-child.no-cover .news-card-body h3 {
    font-size:var(--fs-2xl); -webkit-line-clamp:2;
}
.news-card-body {
    padding:var(--sp-4); flex:1; display:flex; flex-direction:column;
}
.news-card-body h3 {
    font-family:var(--font-serif); font-size:17px; font-weight:700;
    line-height:1.5; color:var(--ink); margin-bottom:var(--sp-2);
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.news-card:hover h3 {
    text-decoration:underline; text-decoration-color:var(--gold);
    text-decoration-thickness:2px; text-underline-offset:4px;
}
.news-card-body .card-summary {
    font-size:var(--fs-sm); color:var(--ink-2); line-height:1.7; flex:1;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.news-card-body .card-meta {
    display:flex; align-items:center; gap:var(--sp-3); margin-top:var(--sp-3);
    font-size:var(--fs-xs); color:var(--ink-3);
}

/* 数据 chips */
.data-chips {
    display:flex; flex-wrap:wrap; gap:4px; margin-bottom:var(--sp-2);
}
.data-chip {
    display:inline-flex; align-items:center; gap:2px;
    padding:2px 8px; border-radius:var(--radius-full);
    font-size:11px; font-weight:600; white-space:nowrap;
    border:1px solid var(--line);
    background:var(--card);
    color:var(--ink-2);
    transition:border-color 0.2s;
}
.data-chip:hover { border-color:var(--gold); }
.data-chip.chip-brand { background:var(--gold-wash); color:var(--gold-text); border-color:transparent; }
.data-chip.chip-price-down { background:var(--green-light); color:var(--green); border-color:transparent; }
.data-chip.chip-price-up { background:var(--red-light); color:var(--red); border-color:transparent; }
.data-chip.chip-event { background:rgba(26,115,232,0.06); color:var(--ai-badge); border-color:transparent; }
.data-chip.chip-section { background:var(--gold-wash); color:var(--gold-text); border-color:transparent; }

/* 事件动作类型 chip（召回/降价/上市…，见 news/nlp/event_type.py）。
   配色只分三档、不给每类一个颜色——十三种颜色等于没有颜色，列表页会变成调色盘：
     · 红 = 与安全/权益直接相关（召回/事故/维权），用户最该先看到；
     · 绿 = 与钱包直接相关的利好（降价）；
     · 中性 = 其余类型，只做归类不抢注意力。
   同时满足 UI 规范「黄占版面 ≤15%」——类型 chip 一律不用黄，把黄留给品牌/栏目。 */
.data-chip.chip-type { background:var(--line-2); color:var(--ink-2); border-color:transparent; }
.data-chip.chip-type.type-recall,
.data-chip.chip-type.type-accident,
.data-chip.chip-type.type-rights { background:var(--red-light); color:var(--red); }
.data-chip.chip-type.type-price { background:var(--green-light); color:var(--green); }

/* Sparkline 占位 */
.sparkline-mini {
    width:60px; height:20px; margin-left:auto; flex-shrink:0;
}
.sparkline-mini polyline {
    fill:none; stroke:var(--green); stroke-width:1.5;
    stroke-linecap:round; stroke-linejoin:round;
}

/* ---------- 40. 命令面板 Ctrl+K ---------- */
.cmdk-overlay {
    display:none; position:fixed; inset:0; z-index:9995;
    background:rgba(0,0,0,0.5); backdrop-filter:blur(8px);
    align-items:flex-start; justify-content:center; padding-top:20vh;
}
.cmdk-overlay.open { display:flex; }
.cmdk-box {
    width:560px; max-width:90vw;
    background:var(--card); border-radius:var(--r);
    box-shadow:0 24px 64px rgba(0,0,0,0.2);
    border:1px solid var(--line); overflow:hidden;
}
.cmdk-header {
    padding:var(--sp-4); border-bottom:1px solid var(--line);
    display:flex; align-items:center; gap:var(--sp-3);
}
.cmdk-header .cmdk-icon {
    font-size:var(--fs-lg); color:var(--ink-3);
}
.cmdk-input {
    flex:1; border:none; outline:none; background:transparent;
    font-size:var(--fs-base); font-family:var(--font-body); color:var(--ink);
}
.cmdk-input::placeholder { color:var(--ink-3); }
.cmdk-kbd {
    font-size:var(--fs-xs); color:var(--ink-3);
    padding:2px 6px; border:1px solid var(--line); border-radius:4px;
    font-family:var(--font-body);
}
.cmdk-body {
    padding:var(--sp-3); max-height:40vh; overflow-y:auto;
}
.cmdk-hint {
    font-size:var(--fs-sm); color:var(--ink-3);
    padding:var(--sp-4); text-align:center;
}
/* 实时结果（#63）：标题一行 + 栏目/相关度条一行；选中态浅金洗底 */
.cmdk-item {
    display:block; padding:10px var(--sp-3); border-radius:var(--r-sm);
    text-decoration:none; cursor:pointer;
}
.cmdk-item.active { background:var(--gold-wash); }
/* 「问一句」那一条（#589）：常驻在结果末尾，跟真结果分开——中间一道线，
   免得看起来像检索出来的第 9 条 */
.cmdk-item-ask { border-top:1px solid var(--line-2); margin-top:var(--sp-2); padding-top:var(--sp-3); }
.cmdk-item-ask .cmdk-item-title { color:var(--gold-text); }
.cmdk-item-title {
    display:block; font-size:var(--fs-sm); color:var(--ink); font-weight:600;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.cmdk-item-meta { display:flex; align-items:center; gap:var(--sp-2); margin-top:5px; }
.cmdk-item-section { font-size:var(--fs-xs); color:var(--ink-3); flex-shrink:0; }
/* 相关度条：金色渐变，宽度=相对本次最高分的百分比 */
.cmdk-score-bar {
    flex:1; max-width:180px; height:4px; border-radius:2px;
    background:var(--line-2); overflow:hidden;
}
.cmdk-score-fill {
    display:block; height:100%; border-radius:2px;
    background:linear-gradient(90deg, var(--gold-dark), var(--gold-bright));
    transition:width 0.3s var(--ease-out);
}
.cmdk-score-pct {
    font-size:var(--fs-xs); color:var(--gold-text); flex-shrink:0;
    font-variant-numeric:tabular-nums; font-family:var(--font-display); font-weight:700;
}
.cmdk-footer {
    display:flex; align-items:center; justify-content:space-between;
    padding:var(--sp-2) var(--sp-4); border-top:1px solid var(--line);
    font-size:var(--fs-xs); color:var(--ink-3);
}
.cmdk-footer[hidden] { display:none; }
.cmdk-all {
    border:none; background:none; cursor:pointer; padding:4px 6px;
    font-size:var(--fs-xs); color:var(--gold-text); font-weight:600;
}
.cmdk-all:hover { text-decoration:underline; }
@media (prefers-reduced-motion: reduce) {
    .cmdk-score-fill { transition:none; }
}

/* ---------- 41. 移动端底部 Tab Bar ---------- */
.mobile-tab-bar {
    display:none; position:fixed; bottom:0; left:0; right:0;
    z-index:100; background:rgba(var(--paper-rgb),0.92);
    backdrop-filter:blur(20px); -webkit-backdrop-filter:blur(20px);
    border-top:1px solid var(--line);
    padding:6px 0 env(safe-area-inset-bottom,0);
}
.mobile-tab-bar nav {
    display:flex; justify-content:space-around;
}
.mobile-tab-bar a {
    display:flex; flex-direction:column; align-items:center; gap:2px;
    /* 改版 ④：10px → 字阶 12px。这是全站最高频被看的一处中文小字，
       10px 汉字在手机上低于舒适可读。
       2026-08-27 五词化后是 **6 格**（行情/车/媒体/封存馆/方法 + 搜索），最长的
       「封存馆」3 字：实算最窄约 288px，375px 的 iPhone SE 仍放得下，不溢出。 */
    font-size:var(--fs-xs); color:var(--ink-3); text-decoration:none;
    padding:6px 12px; transition:color 0.2s;
}
.mobile-tab-bar a.active { color:var(--gold-text); }
.mobile-tab-bar a:hover { color:var(--gold-text); }
/* 搜索是 <button>（要开命令面板不是跳页），样式跟其它 tab 对齐 */
.mobile-tab-bar .tab-search {
    display:flex; flex-direction:column; align-items:center; gap:2px;
    font-size:var(--fs-xs); font-family:inherit; color:var(--ink-3);
    background:none; border:none; cursor:pointer;
    padding:6px 12px; transition:color 0.2s;
}
.mobile-tab-bar .tab-search:hover { color:var(--gold-text); }

/* 汉堡菜单 */
.hamburger {
    display:none; width:36px; height:36px;
    border:none; background:none; cursor:pointer;
    flex-direction:column; align-items:center; justify-content:center; gap:5px;
    padding:0; flex-shrink:0;
}
.hamburger span {
    display:block; width:20px; height:2px; background:var(--ink);
    border-radius:1px; transition:all 0.3s var(--ease);
}
.hamburger.open span:nth-child(1) { transform:rotate(45deg) translate(4px,4px); }
.hamburger.open span:nth-child(2) { opacity:0; }
.hamburger.open span:nth-child(3) { transform:rotate(-45deg) translate(5px,-5px); }

.mobile-menu {
    /* 长辈模式头部会变高，写死 56px 菜单会盖住头部一角 */
    display:none; position:fixed; inset:0; top:var(--header-h,56px); z-index:99;
    background:var(--paper); padding:var(--sp-6) var(--sp-4);
    flex-direction:column; gap:var(--sp-2);
    overflow-y:auto;
}
.mobile-menu.open { display:flex; }
.mobile-menu a {
    font-size:var(--fs-lg); font-weight:600; color:var(--ink);
    padding:var(--sp-3) var(--sp-4); border-radius:var(--r-sm);
    text-decoration:none; transition:background 0.2s;
}
.mobile-menu a:hover { background:var(--gold-wash); }
.mobile-menu a.active { color:var(--gold-text); background:var(--gold-wash); }
/* 分组标题：汉堡菜单里十几条链接平铺，「记录在案」这五条得看得出是一伙的 */
.mobile-menu-label {
    padding:var(--sp-2) var(--sp-4) 0;
    font-size:var(--fs-xs); font-weight:700; letter-spacing:.14em;
    color:var(--ink-3);
}
.mobile-menu-search {
    font-size:var(--fs-base); font-family:inherit; color:var(--ink-3);
    text-align:left; padding:var(--sp-3) var(--sp-4);
    border:1px solid var(--line); border-radius:var(--r-sm);
    background:var(--card); cursor:pointer; margin-bottom:var(--sp-2);
}

/* ---------- 42. 页脚跑马灯 ---------- */
/* 页脚跑马灯（.footer-marquee / .marquee-track / @keyframes marquee）已随模板一起删除，
   见 base.html 的说明：装饰大字全站只留 hero 与板块两处水印。 */

/* ---------- 43. 详情页：NYT 阅读体验 ---------- */
.article-nyt {
    max-width:680px; margin:0 auto;
}
.article-nyt h1 {
    font-family:var(--font-serif); font-size:36px; font-weight:900;
    line-height:1.2; letter-spacing:0.02em;
    color:var(--ink); margin-bottom:var(--sp-4);
}
.article-nyt .article-meta {
    display:flex; gap:var(--sp-4); font-size:var(--fs-sm);
    color:var(--ink-3); padding-bottom:var(--sp-4);
    border-bottom:1px solid var(--line); margin-bottom:var(--sp-6);
    flex-wrap:wrap; align-items:center;
}
.article-nyt .article-hero-img {
    width:calc(100% + 160px); max-width:100vw;
    margin:0 -80px var(--sp-6); border-radius:var(--r);
    overflow:hidden;
}
.article-nyt .article-hero-img img {
    width:100%; display:block;
    /* 只限宽不限高，源站给什么比例就照单全收（#641）：一张 1160×2062 的竖构图官图
       在 1456 宽下撑到 1493px = 1.92 个屏幕高，读者要连滚两屏才能翻过一张天空照片。
       62vh 是让竖图和横构图官图（16:9 约 470px）看起来是同一套版式的那个数。

       object-position 偏**下**（70%），不是偏上：车图上半通常是天空和背景建筑，
       车压在中下部。真机试过 30%（票上原本写的值）——整台车被切得只剩车顶，
       70% 才把车头车尾车轮都框住。竖图越竖，这个偏移越关键。

       横构图不受影响：840 宽下等比高约 472px < 566px，没有溢出，cover 不裁。
       只有宽高比小于 1.48（比 3:2 更方/更竖）才会进入裁切。 */
    max-height:62vh; object-fit:cover; object-position:center 70%;
}
/* 爬取稿封面图的署名条：图片版权比文字硬，来源必须跟着图走 */
.hero-credit {
    padding:var(--sp-2) var(--sp-4);
    background:var(--line-2);
    font-size:var(--fs-xs); color:var(--ink-3); text-align:right;
}
.hero-credit a { color:var(--gold-text); }
/* 列表/首页里的官图署名（#464）：授权条款给的是「编辑用途 + 注明来源」，
   详情页那条 figcaption 只覆盖详情页，而官图同样出现在首页头条和卡片缩略图上。
   压在图右下角、跟着图走——图在哪儿，出处就在哪儿，不靠用户点进详情页才看得到。 */
.img-credit {
    position:absolute; right:0; bottom:0; z-index:2;
    max-width:100%; padding:2px 6px;
    background:rgba(0,0,0,.55); color:#fff;
    font-size:10px; line-height:1.4; letter-spacing:.02em;
    border-top-left-radius:4px;
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    pointer-events:none;
}
.hero-side-thumb, .news-thumb { position:relative; }
.article-nyt .article-body {
    font-size:var(--fs-base); line-height:1.8; color:var(--ink);
    white-space:pre-wrap;
}
/* 首字放大 */
.article-body.drop-cap::first-letter {
    font-family:var(--font-serif);
    float:left; font-size:3.4em; font-weight:900;
    line-height:0.8; padding:4px 8px 0 0;
    color:var(--gold-text);
}
/* 进度渐变线 */
.reading-bar {
    position:fixed; top:0; left:0; height:3px; z-index:101;
    background:linear-gradient(90deg, var(--gold-bright), var(--gold), #E8875A);
    width:0; transition:width 0.1s linear;
}

/* 阅读进度速度表 */
.reading-speedo {
    position:fixed; bottom:28px; right:28px; z-index:90;
    width:56px; height:56px;
    background:var(--card); border:1px solid var(--line);
    border-radius:50%; box-shadow:var(--shadow);
    display:flex; align-items:center; justify-content:center;
}
.reading-speedo svg { width:48px; height:48px; }
.reading-speedo .speedo-bg { fill:none; stroke:var(--line); stroke-width:3; }
.reading-speedo .speedo-fg {
    fill:none; stroke:var(--gold); stroke-width:3; stroke-linecap:round;
    stroke-dasharray:85 28; stroke-dashoffset:85;
    transition:stroke-dashoffset 0.15s linear;
}
.reading-speedo .speedo-pct {
    position:absolute; font-family:var(--font-display);
    font-size:12px; font-weight:700; color:var(--gold-text);
}

/* ---------- 44. 中英叠排水印 ---------- */
.section-watermark {
    position:relative;
}
.section-watermark::before {
    content:attr(data-watermark);
    position:absolute; top:50%; left:0; transform:translateY(-50%);
    font-family:var(--font-display); font-size:80px; font-weight:900;
    color:var(--ink); opacity:0.03; pointer-events:none;
    white-space:nowrap; line-height:1;
}

/* ---------- 45. 渐变微光描边 ---------- */
.glow-border {
    position:relative;
}
.glow-border::after {
    content:''; position:absolute; inset:-1px; border-radius:calc(var(--r) + 1px);
    background:linear-gradient(135deg, var(--gold), #E8875A, var(--gold));
    z-index:-1; opacity:0; transition:opacity 0.3s;
}
.glow-border:hover::after { opacity:1; }

/* ---------- 46. Kinetic 标题 ---------- */
.kinetic-title span {
    display:inline-block;
    opacity:0; transform:translateY(100%);
}
.kinetic-title.animated span {
    opacity:1; transform:none;
    transition:opacity 0.4s var(--ease), transform 0.4s var(--ease);
}

/* ---------- 47. 早报入口卡（首页） ---------- */
.brief-card {
    background:linear-gradient(135deg, var(--gold-light), rgba(var(--paper-rgb),0.5));
    border-radius:var(--r); padding:var(--sp-4) var(--sp-6);
    border:1px solid var(--gold-wash);
    text-decoration:none; color:inherit; display:block;
    transition:border-color 0.3s, transform 0.3s var(--ease);
}
[data-theme="dark"] .brief-card {
    background:linear-gradient(135deg, rgba(240,192,64,0.06), rgba(var(--paper-rgb),0.5));
}
.brief-card:hover {
    border-color:var(--gold); transform:translateY(-1px);
}

/* ---------- 34. 减弱动效（移到末尾） ---------- */
@media (prefers-reduced-motion: reduce) {
    .reveal { opacity:1; transform:none; }
    .fade-in-up { animation:none; opacity:1; transform:none; }
    .kinetic-title span { opacity:1; transform:none; }
    .startup-overlay { display:none !important; }
    *, *::before, *::after { transition-duration:0.01ms !important; animation-duration:0.01ms !important; }
}

/* ---------- 响应式覆盖（v3 新组件） ---------- */
@media (max-width: 1024px) {
    .hero { grid-template-columns:1fr; }
    .hero-main { min-height:300px; }
    .hero-secondary { flex-direction:row; }
    .bento-strip { grid-template-columns:repeat(2,1fr); }
    .magazine-section { grid-template-columns:1fr; }
    .article-nyt .article-hero-img { width:100%; margin:0 0 var(--sp-6); }
}

@media (max-width: 768px) {
    .hamburger { display:flex; }
    .main-nav { display:none; }
    #cmdk-trigger { display:none; }
    .mobile-tab-bar { display:block; }
    body { padding-bottom:64px; }

    /* 头部：右侧按钮缩减，只保留主题切换和汉堡 */
    .header-right .btn { font-size:var(--fs-xs); padding:4px 10px; }
    .header-inner { padding:0 var(--sp-4); gap:var(--sp-1); }
    .logo { margin-right:auto; font-size:19px; }

    .hero { padding:0 var(--sp-4); margin-top:var(--sp-4); }
    .hero-main { min-height:240px; }
    .hero-main .hero-overlay { padding:32px 20px 20px; }
    .hero-main .hero-overlay h2 { font-size:var(--fs-2xl); }
    .hero-secondary { flex-direction:column; }
    .hero-watermark { font-size:60px; }
    .hero-side-card { padding:var(--sp-4); }
    .hero-side-card h3 { font-size:var(--fs-base); }

    .bento-strip { padding:0 var(--sp-4); grid-template-columns:repeat(2,1fr); gap:var(--sp-3); }
    .bento-num { font-size:28px; }
    .bento-card { padding:var(--sp-4) var(--sp-3); }

    .magazine-section { padding:0 var(--sp-4); gap:var(--sp-4); }
    .magazine-grid { grid-template-columns:1fr; }
    .magazine-grid .news-card:first-child .news-card-thumb { height:200px; }
    .magazine-grid .news-card:first-child h3 { font-size:var(--fs-lg); }

    /* 筛选栏分隔符在小屏隐藏 */
    .filter-bar > span[style*="width:1px"] { display:none; }

    /* 早报快讯卡 */
    .brief-card { padding:var(--sp-4) !important; }

    .reading-speedo { width:44px; height:44px; bottom:72px; right:16px; }
    .reading-speedo svg { width:36px; height:36px; }

    /* 详情页 */
    .article-nyt h1 { font-size:var(--fs-2xl); }
    .article-nyt .article-hero-img { width:100%; margin:0 0 var(--sp-4); }
    .article-nyt .article-meta { gap:var(--sp-2); }
    .main { padding-left:var(--sp-4) !important; padding-right:var(--sp-4) !important; }

    /* 质量面板 */
    .quality-panel { padding:var(--sp-2) var(--sp-3); }
    .quality-head { gap:var(--sp-2); }

    .cmdk-box { width:100%; max-width:100%; border-radius:0; }

    .sub-nav { display:none; }

    /* 统计卡 */
    .stat-cards { grid-template-columns:repeat(2,1fr); gap:var(--sp-3); }

    /* 侧栏在移动端下移 */
    .home-side { margin-top:var(--sp-4); }
}

@media (max-width: 480px) {
    .hero-main .hero-overlay h2 { font-size:var(--fs-lg); }
    .hero-main { min-height:180px; }
    .bento-strip { grid-template-columns:1fr 1fr; }
    .bento-num { font-size:24px; }

    /* 头部进一步精简 */
    .header-right .btn-outline, .header-right .btn-primary { padding:4px 8px; font-size:11px; }
    .logo { font-size:17px; }

    /* 详情页标题 */
    .article-nyt h1 { font-size:var(--fs-lg); }
    .article-body.drop-cap::first-letter { font-size:2.6em; }

    /* 分页 */
    .pagination { flex-wrap:wrap; gap:var(--sp-1); }
    .pagination a, .pagination .current { padding:6px 10px; font-size:var(--fs-xs); }

    /* 论坛帖列表 */
    .forum-list .forum-post { padding:var(--sp-3); }
}

/* ============================================================
   21. 跨文档页面转场（Cross-document View Transitions）
   Chrome 126+ / Safari 18.2+；不支持的浏览器自动降级为普通跳转
   ============================================================ */
@view-transition { navigation: auto; }

/* 整页交叉淡入淡出：默认动画偏慢，改快一点更像 App */
::view-transition-old(root) { animation: vt-fade-out 0.22s var(--ease) both; }
::view-transition-new(root) { animation: vt-fade-in 0.28s var(--ease) both; }

@keyframes vt-fade-out { to { opacity: 0; } }
@keyframes vt-fade-in { from { opacity: 0; } }

/* 头部/底 Tab 固定不参与整页淡出，避免导航闪烁 */
.main-header { view-transition-name: vt-header; }
.mobile-tab-bar { view-transition-name: vt-tabbar; }
::view-transition-group(vt-header),
::view-transition-group(vt-tabbar) { animation-duration: 0.22s; }

/* 共享元素：封面图 + 标题（名字由 interactions.js 在点击瞬间赋予） */
::view-transition-group(vt-cover) {
    animation-duration: 0.45s;
    animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
}
::view-transition-image-pair(vt-cover) { isolation: none; }
::view-transition-old(vt-cover),
::view-transition-new(vt-cover) {
    animation: none;
    mix-blend-mode: normal;
    height: 100%;
    object-fit: cover;
}

::view-transition-group(vt-title) {
    animation-duration: 0.4s;
    animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
}
::view-transition-old(vt-title) { animation: vt-fade-out 0.18s both; }
::view-transition-new(vt-title) { animation: vt-fade-in 0.32s both; }

@media (prefers-reduced-motion: reduce) {
    @view-transition { navigation: none; }
}

/* ============================================================
   22. 车市大盘行情条（首页顶部跑马灯）
   ============================================================ */
.ticker-strip {
    max-width:1200px; margin:var(--sp-4) auto 0; padding:0 28px;
    display:flex; align-items:stretch; gap:var(--sp-3);
}
.ticker-badge {
    flex-shrink:0; display:flex; align-items:center; gap:var(--sp-1);
    padding:0 var(--sp-3); border-radius:var(--r-sm);
    background:var(--ink); color:var(--paper);
    font-size:var(--fs-xs); font-weight:700; letter-spacing:.06em;
    white-space:nowrap;
}
.ticker-viewport {
    flex:1; overflow:hidden; position:relative;
    border:1px solid var(--line); border-radius:var(--r-sm);
    background:var(--card);
    -webkit-mask-image:linear-gradient(90deg,transparent,#000 3%,#000 97%,transparent);
    mask-image:linear-gradient(90deg,transparent,#000 3%,#000 97%,transparent);
}
.ticker-track {
    display:flex; width:max-content; align-items:center;
    animation:ticker-scroll 48s linear infinite;
}
.ticker-viewport:hover .ticker-track { animation-play-state:paused; }
@keyframes ticker-scroll { to { transform:translateX(-50%); } }

.ticker-item {
    display:inline-flex; align-items:baseline; gap:var(--sp-2);
    padding:8px var(--sp-4); white-space:nowrap;
    border-right:1px solid var(--line-2);
    font-size:var(--fs-sm); color:var(--ink-2);
    transition:background .2s var(--ease);
}
.ticker-item:hover { background:var(--gold-wash); color:var(--ink); }
.ticker-name { font-weight:600; }
.ticker-num {
    font-family:var(--font-display); font-variant-numeric:tabular-nums;
    color:var(--ink-3); font-size:var(--fs-xs);
}
.ticker-delta {
    font-family:var(--font-display); font-size:var(--fs-xs); font-weight:700;
    font-variant-numeric:tabular-nums;
}
.ticker-delta.d-up { color:var(--red); }
.ticker-delta.d-down { color:var(--green); }
.ticker-delta.d-flat { color:var(--ink-3); }
/* 上期无数据的品牌（首次上榜）：不能跟「上涨」共用红色，那是把冷启动说成暴涨 */
.ticker-delta.d-new { color:var(--ink-3); }

@media (prefers-reduced-motion: reduce) {
    .ticker-track { animation:none; }
    .ticker-viewport { overflow-x:auto; }
}
@media (max-width:768px) {
    .ticker-strip { padding:0 var(--sp-4); }
    .ticker-badge { font-size:11px; padding:0 var(--sp-2); }
}

/* ============================================================
   23. 今日车市温度计
   ============================================================ */
.bento-strip { grid-template-columns:1.35fr repeat(4,1fr); }

.temp-card { color:var(--gold-text); text-align:center; }
.temp-card.t-hot { color:var(--red); }
.temp-card.t-warm { color:var(--gold-text); }
.temp-card.t-cut { color:#4E7CA8; }
.temp-card.t-cool { color:var(--ink-3); }

.temp-gauge { margin-bottom:var(--sp-1); }
.temp-arc { transition:stroke-dashoffset 1.1s var(--ease-out); }
.temp-needle {
    transform-origin:60px 60px; transform:rotate(-90deg);
    transition:transform 1.1s cubic-bezier(0.34,1.4,0.64,1);
}
.temp-readout {
    display:flex; align-items:baseline; justify-content:center; gap:var(--sp-2);
}
.temp-icon { font-size:18px; }
.temp-score {
    font-family:var(--font-display); font-size:34px; font-weight:900;
    line-height:1; color:currentColor; font-variant-numeric:tabular-nums;
}
.temp-label { font-size:var(--fs-sm); font-weight:700; color:currentColor; }

.temp-why { margin-top:var(--sp-2); text-align:left; }
.temp-why > summary {
    cursor:pointer; list-style:none; text-align:center;
    font-size:11px; color:var(--ink-3); border-bottom:1px dashed var(--line);
    display:inline-block; width:100%; padding-bottom:2px;
}
.temp-why > summary::-webkit-details-marker { display:none; }
.temp-why > summary:hover { color:var(--gold-text); border-color:var(--gold); }
.temp-why-body {
    margin-top:var(--sp-2); font-size:11px; line-height:1.6; color:var(--ink-3);
}
.temp-why-nums { margin-top:4px; color:var(--ink-3); }

@media (max-width:900px) {
    .bento-strip { grid-template-columns:repeat(2,1fr); }
    .temp-card { grid-column:1/-1; }
}

/* ============================================================
   24. 验稿器 X 光报告（逐句证据）
   ============================================================ */
.xray-head {
    display:flex; align-items:flex-start; justify-content:space-between;
    gap:var(--sp-4); flex-wrap:wrap; margin-bottom:var(--sp-4);
}
.xray-dial { position:relative; color:var(--gold-text); flex-shrink:0; text-align:center; }
.xray-dial .dial-arc { transition:stroke-dashoffset 1s var(--ease-out); }
.xray-dial .dial-needle {
    transform-origin:60px 60px; transform:rotate(-90deg);
    transition:transform 1s cubic-bezier(0.34,1.4,0.64,1);
}
.xray-dial .dial-num {
    position:absolute; left:0; right:0; bottom:6px;
    font-family:var(--font-display); font-size:24px; font-weight:900;
    color:currentColor; font-variant-numeric:tabular-nums; line-height:1;
}

/* 证据构成条 */
.xray-dist {
    display:flex; height:8px; border-radius:4px; overflow:hidden;
    background:var(--line-2); margin-bottom:var(--sp-2);
}
.xray-dist span { transition:width .8s var(--ease-out); }
.xray-dist .d-green { background:var(--q-good); }
.xray-dist .d-gold  { background:var(--q-mid); }
.xray-dist .d-red   { background:var(--q-bad); }

.xray-legend {
    display:flex; flex-wrap:wrap; gap:var(--sp-2) var(--sp-4);
    font-size:var(--fs-xs); color:var(--text-meta); margin-bottom:var(--sp-4);
}
.xray-legend i {
    display:inline-block; width:9px; height:9px; border-radius:2px;
    margin-right:5px; vertical-align:middle;
}
.xray-legend .lg-green { background:var(--q-good); }
.xray-legend .lg-gold  { background:var(--q-mid); }
.xray-legend .lg-red   { background:var(--q-bad); }
.xray-legend .lg-plain { background:var(--ink-4); }

/* 正文容器 + 扫描光带 */
.xray-body {
    position:relative; overflow:hidden;
    border:1px solid var(--line); border-radius:var(--r);
    background:var(--paper);
    padding:var(--sp-4); line-height:2.1;
    font-size:var(--fs-sm); color:var(--ink-2);
    max-height:460px; overflow-y:auto;
}
.xray-scan {
    position:absolute; left:0; right:0; top:0; height:120px;
    pointer-events:none; opacity:0; z-index:2;
    background:linear-gradient(180deg,
        transparent, rgba(217,165,20,.14) 45%, rgba(217,165,20,.42) 50%,
        rgba(217,165,20,.14) 55%, transparent);
}
.xray-body.scanning .xray-scan { animation:xray-sweep 1.6s var(--ease) 1; }
@keyframes xray-sweep {
    0%   { opacity:1; transform:translateY(-120px); }
    100% { opacity:0; transform:translateY(460px); }
}

/* 逐句：扫描前中性，扫过后显色 */
.xr {
    border-radius:3px; padding:1px 2px;
    background:transparent; color:inherit;
    box-shadow:inset 0 0 0 0 transparent;
    transition:background .35s var(--ease), color .35s var(--ease),
               box-shadow .35s var(--ease);
}
.xr.lit.xr-green {
    background:rgba(46,125,50,.10);
    box-shadow:inset 0 -2px 0 0 var(--q-good);
}
.xr.lit.xr-gold {
    background:rgba(232,137,12,.13);
    box-shadow:inset 0 -2px 0 0 var(--q-mid);
}
.xr.lit.xr-red {
    background:rgba(217,48,37,.12); color:var(--ink);
    box-shadow:inset 0 -2px 0 0 var(--q-bad);
}
.xr.lit.xr-red::after {
    content:'无据'; margin-left:5px; padding:0 4px;
    font-size:10px; border-radius:2px; vertical-align:2px;
    background:var(--q-bad); color:var(--on-red); font-weight:700;
}
.xr[title]:hover { filter:brightness(.96); cursor:help; }

@media (max-width:768px) {
    .xray-head { flex-direction:column; align-items:center; text-align:center; }
    .xray-body { max-height:340px; }
}

/* ============================================================
   25. 车载电台（早报播报器）
   ============================================================ */
.radio {
    margin-bottom:var(--sp-6);
    border-radius:14px; overflow:hidden;
    background:linear-gradient(160deg,#2b2721,#1b1814);
    border:1px solid #3a342b;
    box-shadow:0 10px 30px rgba(0,0,0,.18), inset 0 1px 0 rgba(255,255,255,.06);
}
.radio-face {
    display:flex; align-items:center; gap:var(--sp-4);
    padding:var(--sp-4) var(--sp-6);
}
/* 左侧喇叭网罩 */
.radio-speaker {
    width:56px; height:56px; flex-shrink:0; border-radius:50%;
    background:
        radial-gradient(circle at 30% 30%, rgba(255,255,255,.10), transparent 60%),
        repeating-radial-gradient(circle, #45403a 0 1.5px, #211e1a 1.5px 3.5px);
    border:2px solid #4b453c;
    box-shadow:inset 0 0 12px rgba(0,0,0,.7);
}
.radio.playing .radio-speaker { animation:radio-thump 0.9s var(--ease) infinite; }
@keyframes radio-thump { 0%,100%{transform:scale(1);} 50%{transform:scale(1.05);} }

.radio-center { flex:1; min-width:0; }
.radio-brandline { display:flex; align-items:baseline; gap:var(--sp-3); }
.radio-brand {
    font-family:var(--font-display); font-size:13px; font-weight:900;
    letter-spacing:.12em; color:#F0C040;
}
.radio-freq {
    font-family:var(--font-display); font-size:11px; color:#8a8578;
    font-variant-numeric:tabular-nums;
}

/* 波形：静止时压平，播放时逐条跳动 */
.radio-wave {
    display:flex; align-items:flex-end; gap:3px; height:30px; margin:var(--sp-2) 0;
}
.radio-wave i {
    flex:1; min-width:2px; height:3px; border-radius:2px;
    background:linear-gradient(180deg,#F0C040,#B08A10);
    opacity:.45; transition:height .2s var(--ease), opacity .2s var(--ease);
}
.radio.playing .radio-wave i {
    opacity:1; animation:radio-bounce 0.9s ease-in-out infinite;
}
.radio.playing .radio-wave i:nth-child(3n)   { animation-duration:1.15s; }
.radio.playing .radio-wave i:nth-child(3n+1) { animation-duration:0.75s; }
.radio.playing .radio-wave i:nth-child(4n)   { animation-delay:.18s; }
.radio.playing .radio-wave i:nth-child(5n)   { animation-delay:.35s; }
@keyframes radio-bounce { 0%,100%{height:4px;} 50%{height:26px;} }

.radio-status { font-size:var(--fs-xs); color:#a9a294; min-height:18px; }
.radio-progress {
    margin-top:6px; height:4px; border-radius:2px; cursor:pointer;
    background:rgba(255,255,255,.10); overflow:hidden;
}
.radio-progress span {
    display:block; height:100%; width:0;
    background:linear-gradient(90deg,#B08A10,#F0C040);
}

.radio-knobs { flex-shrink:0; text-align:center; }
.radio-play {
    width:52px; height:52px; border-radius:50%; cursor:pointer;
    border:2px solid #5b5347; color:#1b1814;
    background:radial-gradient(circle at 35% 30%,#FFD866,#D9A514);
    font-size:17px; display:flex; align-items:center; justify-content:center;
    box-shadow:0 3px 10px rgba(0,0,0,.35);
    transition:transform .15s var(--ease), box-shadow .15s var(--ease);
}
.radio-play:hover:not(:disabled) { transform:scale(1.06); box-shadow:0 5px 16px rgba(217,165,20,.45); }
.radio-play:active:not(:disabled) { transform:scale(.96); }
.radio-play:disabled { opacity:.35; cursor:not-allowed; }
.radio-time {
    margin-top:6px; font-family:var(--font-display); font-size:11px;
    color:#8a8578; font-variant-numeric:tabular-nums; white-space:nowrap;
}
.radio-hint {
    padding:10px var(--sp-6); font-size:var(--fs-xs); color:#8a8578;
    border-top:1px solid rgba(255,255,255,.06);
}
.radio-hint code { background:rgba(255,255,255,.08); padding:1px 5px; border-radius:3px; }

/* 早报条目 + 跟读高亮 */
.digest-list {
    background:var(--card); border:1px solid var(--line);
    border-radius:var(--r); padding:var(--sp-4) var(--sp-6);
}
.digest-item {
    display:flex; gap:14px; padding:14px var(--sp-3);
    border-bottom:1px solid var(--line-2); border-radius:var(--r-sm);
    transition:background .3s var(--ease), box-shadow .3s var(--ease);
}
.digest-item:last-child { border-bottom:none; }
.digest-item.reading {
    background:var(--gold-wash);
    box-shadow:inset 3px 0 0 0 var(--gold);
}
.digest-item .hot-rank { margin-top:3px; flex-shrink:0; }
.digest-title {
    font-size:15px; color:var(--ink); font-weight:600;
    text-decoration:none; line-height:1.5;
}
.digest-title:hover { color:var(--gold-text); }
.digest-summary { margin-top:4px; font-size:13px; color:var(--ink-3); line-height:1.7; }
.digest-meta { margin-top:4px; font-size:12px; color:var(--ink-3); }

@media (prefers-reduced-motion: reduce) {
    .radio.playing .radio-wave i,
    .radio.playing .radio-speaker { animation:none; }
    .radio.playing .radio-wave i { height:14px; }
}
@media (max-width:600px) {
    .radio-face { padding:var(--sp-4); gap:var(--sp-3); }
    .radio-speaker { width:42px; height:42px; }
    .radio-play { width:44px; height:44px; }
    .digest-list { padding:var(--sp-3) var(--sp-4); }
}


/* ==========================================================================
   26. 滚动叙事专题页「2026 车市半年记」 /story/
   固定 Canvas 舞台 + 一屏一章。舞台 sticky 在顶部，章节在其上滚过。
   ========================================================================== */
.story-wrap {
    position: relative;
    /* 通栏按**内容列**算，不按视口算。原来是 `width:100vw` + `margin-left:calc(50% - 50vw)`
       ——那是老外壳（居中容器）里挣出通栏的写法。改版换成真侧栏 DOM 后内容列本来就
       通栏，再按视口算就比可用宽度多出一个侧栏：整页滚动条被 html{overflow-x:hidden}
       按住，溢出改跑进 .content 自己的横向滚动里（2026-08-11 实测 1440 下可横滚 152px，
       触控板横向一划整块内容就横移）。量具见 tools/desktop_scan.py。 */
    width: 100%;
    margin-top: calc(var(--sp-6) * -1);
    background: #080c1e;
    color: #fff;
    /* 章节总高决定滚动行程，6 章 × 100vh */
}

.story-stage {
    position: sticky;
    top: 0;
    height: 100vh;
    width: 100%;
    overflow: hidden;
    z-index: 0;
}
.story-stage canvas { display: block; width: 100%; height: 100%; }

/* 四周压暗，让文字始终读得清 */
.story-vignette {
    position: absolute; inset: 0; pointer-events: none;
    background:
        radial-gradient(120% 80% at 50% 55%, rgba(0,0,0,0) 40%, rgba(0,0,0,0.55) 100%),
        linear-gradient(180deg, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0) 28%);
}

.story-progress {
    position: absolute; left: 0; right: 0; top: 0; height: 3px;
    background: rgba(255,255,255,0.12);
}
.story-progress span {
    display: block; height: 100%; width: 0;
    background: linear-gradient(90deg, var(--gold, #f5c518), #ffe98a);
    box-shadow: 0 0 12px rgba(245,197,24,0.7);
}

/* 里程表：把滚动进度翻译成「开了多少公里」 */
.story-odo {
    position: absolute; right: 18px; bottom: 18px;
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 26px; font-weight: 700; letter-spacing: 1px;
    color: rgba(255,255,255,0.55);
    text-shadow: 0 2px 12px rgba(0,0,0,0.6);
}
.story-odo small { font-size: 11px; margin-left: 3px; opacity: 0.7; }

/* --- 章节 --- */
.story-chapters { position: relative; z-index: 1; margin-top: -100vh; }

.story-ch {
    min-height: 100vh;
    display: flex; align-items: center;
    padding: 12vh 28px;
}
.story-inner {
    max-width: 720px; margin: 0 auto; width: 100%;
    opacity: 0; transform: translateY(28px);
    transition: opacity 0.7s var(--ease, cubic-bezier(0.22,1,0.36,1)),
                transform 0.7s var(--ease, cubic-bezier(0.22,1,0.36,1));
}
.story-ch.in .story-inner { opacity: 1; transform: none; }

.story-kicker {
    font-size: 12px; letter-spacing: 3px; text-transform: uppercase;
    color: var(--gold, #f5c518); margin-bottom: 18px;
}
.story-title {
    font-size: clamp(48px, 11vw, 118px); line-height: 0.92;
    font-weight: 800; letter-spacing: -2px; margin: 0 0 22px;
    text-shadow: 0 8px 40px rgba(0,0,0,0.6);
}
.story-title span {
    background: linear-gradient(92deg, #f5c518, #ffe98a 55%, #f5c518);
    -webkit-background-clip: text; background-clip: text; color: transparent;
}
.story-lede { font-size: clamp(15px, 2.2vw, 19px); line-height: 1.75; color: rgba(255,255,255,0.78); max-width: 30em; }

.story-chno {
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 12px; letter-spacing: 2px; color: var(--gold, #f5c518);
    margin-bottom: 12px; opacity: 0.9;
}
.story-h2 {
    font-size: clamp(26px, 5.4vw, 46px); line-height: 1.25; font-weight: 800;
    margin: 0 0 26px; text-shadow: 0 6px 30px rgba(0,0,0,0.55);
}
.story-note {
    margin-top: 22px; font-size: 14px; line-height: 1.85;
    color: rgba(255,255,255,0.62); max-width: 34em;
}

.story-scroll-hint {
    margin-top: 44px; font-size: 12px; letter-spacing: 2px;
    color: rgba(255,255,255,0.5); display: flex; align-items: center; gap: 10px;
}
.story-scroll-hint span {
    width: 1px; height: 34px; background: linear-gradient(180deg, var(--gold,#f5c518), transparent);
    animation: story-hint 1.8s ease-in-out infinite;
}
@keyframes story-hint { 0%,100% { transform: scaleY(0.4); opacity: 0.4; } 50% { transform: scaleY(1); opacity: 1; } }

/* 数字组 */
.story-figs { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 22px 18px; }
.story-fig b {
    display: block;
    font-size: clamp(34px, 6.5vw, 56px); font-weight: 800; line-height: 1;
    color: var(--gold, #f5c518); font-variant-numeric: tabular-nums;
    text-shadow: 0 0 34px rgba(245,197,24,0.35);
}
.story-fig span { display: block; margin-top: 8px; font-size: 13px; color: rgba(255,255,255,0.62); }

.story-bigfig { display: flex; align-items: baseline; gap: 16px; flex-wrap: wrap; }
.story-bigfig b {
    font-size: clamp(58px, 14vw, 128px); font-weight: 800; line-height: 1;
    color: var(--gold, #f5c518); font-variant-numeric: tabular-nums;
    text-shadow: 0 0 50px rgba(245,197,24,0.4);
}
.story-bigfig span { font-size: 15px; color: rgba(255,255,255,0.7); max-width: 20em; line-height: 1.7; }

/* 声量条 */
.story-bars { display: flex; flex-direction: column; gap: 14px; }
.sbar { display: grid; grid-template-columns: 68px 1fr 44px; align-items: center; gap: 12px; }
.sbar-name { font-size: 14px; color: rgba(255,255,255,0.85); }
.sbar-track { height: 12px; border-radius: 999px; background: rgba(255,255,255,0.10); overflow: hidden; }
.sbar-track i {
    display: block; height: 100%; width: 0; border-radius: 999px;
    background: linear-gradient(90deg, #d4a800, #f5c518 60%, #ffe98a);
    box-shadow: 0 0 18px rgba(245,197,24,0.45);
    transition: width 1.1s cubic-bezier(0.22,1,0.36,1);
}
.story-ch.in .sbar-track i { width: var(--w); }
.sbar-num {
    text-align: right; font-size: 14px; font-weight: 700;
    color: var(--gold, #f5c518); font-variant-numeric: tabular-nums;
}
/* 逐条错峰，像仪表依次点亮 */
.sbar:nth-child(2) .sbar-track i { transition-delay: 0.08s; }
.sbar:nth-child(3) .sbar-track i { transition-delay: 0.16s; }
.sbar:nth-child(4) .sbar-track i { transition-delay: 0.24s; }
.sbar:nth-child(5) .sbar-track i { transition-delay: 0.32s; }
.sbar:nth-child(6) .sbar-track i { transition-delay: 0.40s; }

.story-chips { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
.story-chip {
    padding: 6px 14px; border-radius: 999px; font-size: 13px;
    background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.14);
    color: rgba(255,255,255,0.85);
}
.story-chip b { color: var(--gold, #f5c518); margin-left: 4px; }

.story-btn {
    display: inline-block; margin-top: 26px; padding: 12px 26px;
    border-radius: 999px; font-size: 14px; font-weight: 600; text-decoration: none;
    background: var(--gold, #f5c518); color: #1a1400;
    transition: transform 0.25s var(--ease, ease), box-shadow 0.25s var(--ease, ease);
}
.story-btn:hover { transform: translateY(-2px); box-shadow: 0 10px 30px rgba(245,197,24,0.35); }
.story-btn.ghost { background: transparent; color: #fff; border: 1px solid rgba(255,255,255,0.35); }
.story-btn.ghost:hover { box-shadow: 0 10px 30px rgba(0,0,0,0.4); }
.story-actions { display: flex; gap: 12px; flex-wrap: wrap; }

.story-events { list-style: none; padding: 0; margin: 0 0 8px; }
.story-events li {
    display: flex; justify-content: space-between; align-items: baseline; gap: 14px;
    padding: 14px 0; border-bottom: 1px solid rgba(255,255,255,0.12);
}
.story-events a { color: #fff; text-decoration: none; font-size: 15px; line-height: 1.5; }
.story-events a:hover { color: var(--gold, #f5c518); }
.story-events span { flex: none; font-size: 12px; color: rgba(255,255,255,0.5); }

@media (max-width: 640px) {
    .story-ch { padding: 10vh 20px; }
    .story-odo { font-size: 18px; right: 12px; bottom: 12px; }
    .sbar { grid-template-columns: 56px 1fr 36px; }
}

@media (prefers-reduced-motion: reduce) {
    .story-inner { opacity: 1; transform: none; transition: none; }
    .story-scroll-hint span { animation: none; }
    .sbar-track i { transition: none; width: var(--w); }
}


/* ==========================================================================
   27. 车型时间线「道路叙事」 /car/<id>/timeline/
   左侧一条随滚动前进的弯道，右侧是节点卡片；降价节点标红为「路桩」。
   ========================================================================== */
.road-legend {
    font-size: var(--fs-xs); color: var(--text-meta);
    margin: -6px 0 var(--sp-4); line-height: 1.7;
}
.road-legend-cut { color: var(--red); font-weight: 600; }

.road-tl { position: relative; padding-left: 92px; }

.road-lane {
    position: absolute; left: 0; top: 0; bottom: 0; width: 74px;
    pointer-events: none;
}
.road-svg { display: block; overflow: visible; }

.road-edge   { stroke: var(--line, #e6e2d8); stroke-width: 30; stroke-linecap: round; }
.road-surface{ stroke: #2a2d3c; stroke-width: 26; stroke-linecap: round; opacity: .92; }
.road-dash   { stroke: #f5c518; stroke-width: 2.4; stroke-dasharray: 12 14; stroke-linecap: round; }
[data-theme="dark"] .road-edge { stroke: rgba(255,255,255,0.10); }

.road-car {
    position: absolute; left: 0; top: 0; width: 30px; height: 18px;
    transform-origin: 50% 50%;
    filter: drop-shadow(0 4px 10px rgba(0,0,0,0.35));
    transition: transform 0.18s linear;
    will-change: transform;
}

.road-items { position: relative; }

.road-item {
    position: relative;
    padding: 0 0 var(--sp-5) 0;
    opacity: 0; transform: translateY(16px);
    transition: opacity .55s var(--ease, ease), transform .55s var(--ease, ease);
}
.road-item.in { opacity: 1; transform: none; }

/* 圆点由 JS 贴到道路曲线上，所以定位在 .road-tl 坐标系里 */
.road-dot {
    position: absolute; width: 11px; height: 11px; border-radius: 50%;
    margin-left: -5.5px; margin-top: -5.5px;
    background: var(--gold, #f5c518);
    border: 2px solid var(--paper, #fff);
    box-shadow: 0 0 0 2px rgba(245,197,24,0.35);
    z-index: 2;
}
/* 圆点在 build() 里被搬进 .road-lane，父级不再是 .road-item，
   所以降价色只能挂在圆点自己身上（模板同步加了 .cut）。 */
.road-dot.cut {
    background: var(--red, #d93025);
    box-shadow: 0 0 0 2px rgba(217,48,37,0.30), 0 0 14px rgba(217,48,37,0.55);
}
.road-item.cut .timeline-title { color: var(--red, #d93025); }
.road-flag {
    background: var(--red-light, #fdecea) !important;
    color: var(--red, #d93025) !important;
    border-color: rgba(217,48,37,0.35) !important;
}

@media (max-width: 640px) {
    .road-tl { padding-left: 58px; }
    .road-lane { width: 48px; }
}
@media (prefers-reduced-motion: reduce) {
    .road-item { opacity: 1; transform: none; transition: none; }
    .road-car { transition: none; }
}


/* ==========================================================================
   28. 质感层：卡片聚光 / 拖尾光标
   只在真鼠标设备生效（JS 里判过 hover:hover + pointer:fine，且跳过长辈模式）。
   ========================================================================== */
.content-card, .side-card, .stat-card, .temp-card, .bento-card {
    position: relative;
}
.content-card, .side-card, .stat-card, .news-card, .temp-card, .bento-card {
    isolation: isolate;
}

/* 聚光高光：跟着鼠标的一团柔光，压在内容下面（z-index:-1 + isolation 兜住） */
.content-card::after, .side-card::after, .stat-card::after,
.news-card::after, .temp-card::after, .bento-card::after {
    content: '';
    position: absolute; inset: 0;
    border-radius: inherit;
    pointer-events: none;
    opacity: 0;
    transition: opacity 0.35s var(--ease);
    background: radial-gradient(220px circle at var(--mx, 50%) var(--my, 50%),
                rgba(245, 197, 24, 0.16), rgba(245, 197, 24, 0) 62%);
    z-index: -1;
}
.spotlit::after { opacity: 1; }
[data-theme="dark"] .spotlit::after {
    background: radial-gradient(220px circle at var(--mx, 50%) var(--my, 50%),
                rgba(245, 197, 24, 0.22), rgba(245, 197, 24, 0) 62%);
}

@media (prefers-reduced-motion: reduce) {
    .content-card::after, .side-card::after, .stat-card::after,
    .news-card::after, .temp-card::after, .bento-card::after { display: none; }
}


/* 封面图水波：canvas 盖在原图之上，WebGL 失败时这段样式不会被加上（JS 才加 liquid-on） */
.liquid-canvas { display: none; }
.liquid-on { position: relative; }
.liquid-on .liquid-canvas {
    display: block;
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    border-radius: inherit;
    pointer-events: none;
}


/* ==========================================================================
   29. 背刺计算器：价格走势曲线 + 分享海报
   ========================================================================== */
.bs-chart {
    margin: var(--sp-4) 0 var(--sp-2);
    padding: var(--sp-3) 0;
    border-top: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
    overflow-x: auto;
}
.bs-chart svg { display: block; width: 100%; min-width: 420px; height: auto; }

.bs-share {
    display: flex; align-items: center; gap: var(--sp-3);
    flex-wrap: wrap; margin-top: var(--sp-4);
}
.bs-share-tip { font-size: var(--fs-xs); color: var(--text-lighter); }

.bs-poster {
    display: none;
    width: 100%; max-width: 360px; height: auto;
    margin-top: var(--sp-4);
    border-radius: var(--r-sm);
    box-shadow: var(--shadow-hover, 0 12px 34px rgba(0,0,0,.18));
}
.bs-poster.shown { display: block; }
.bs-poster-dl {
    display: inline-block; margin-top: var(--sp-2);
    font-size: var(--fs-sm); color: var(--yellow-text, #b08d00);
}


/* ==========================================================================
   30. 数据总览「大屏模式」
   一键把统计页切成深色指挥中心：双列铺满、字号放大、卡片发光。
   答辩现场投屏用，退出用同一个按钮或 Esc。
   ========================================================================== */
.bigscreen-btn { flex: none; }

#stats-root.bigscreen {
    background: #0d1018;
    color: #e8e8ea;
    padding: 26px 34px;
    overflow-y: auto;
    /* 大屏自带一套深底，而图表脚本是从 #stats-root 读 token 算 canvas 颜色的——
       不在这里覆盖，坐标轴/网格线就会拿日间的浅灰画在 #0d1018 上，投屏基本看不见 */
    --card: #161A24;
    --ink: #E8E8EA;
    --ink-3: #A6A093;
    --line: #2A3040;
    --line-2: #1C2130;
}
#stats-root.bigscreen .section-title { color: #fff; }
#stats-root.bigscreen .stat-cards {
    grid-template-columns: repeat(4, 1fr);
    gap: 18px;
}
#stats-root.bigscreen .stat-card,
#stats-root.bigscreen .side-card {
    background: rgba(255, 255, 255, 0.035);
    border-color: rgba(255, 255, 255, 0.10);
    position: static;   /* side-card 原本 sticky，大屏里会错位 */
    box-shadow: 0 0 0 1px rgba(245, 197, 24, 0.06), 0 18px 44px rgba(0, 0, 0, 0.45);
}
/* 大屏用发光实色：渐变文字（背景裁剪）和 text-shadow 叠加会糊 */
#stats-root.bigscreen .stat-num {
    font-size: 52px; text-shadow: 0 0 32px rgba(245, 197, 24, 0.4);
    background: none; -webkit-text-fill-color: currentColor; color: var(--gold-bright);
}
#stats-root.bigscreen .stat-label { color: rgba(255, 255, 255, 0.55); }

/* 图表两列铺开，投屏时一眼看完 */
#stats-root.bigscreen .side-card { margin-top: 0 !important; }
#stats-root.bigscreen > * + * { margin-top: 18px; }
#stats-root.bigscreen .stats-bento { margin-top: 0; gap: 18px; }

@media (min-width: 1100px) {
    #stats-root.bigscreen {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: 18px;
        align-content: start;
    }
    #stats-root.bigscreen > * + * { margin-top: 0; }
    #stats-root.bigscreen > .section-header,
    #stats-root.bigscreen > .stat-cards,
    #stats-root.bigscreen > .csv-export,
    #stats-root.bigscreen > .stats-chapter { grid-column: 1 / -1; }
    /* bento 在大屏里退回规整两列（跟外层网格同宽同 gap，视觉上是一张网） */
    #stats-root.bigscreen > .stats-bento { grid-column: 1 / -1; grid-template-columns: 1fr 1fr; }
    #stats-root.bigscreen .stats-bento > .span-7,
    #stats-root.bigscreen .stats-bento > .span-5 { grid-column: auto; }
}

body.bigscreen-on { overflow: hidden; }
body.bigscreen-on .main-header,
body.bigscreen-on .site-footer,
body.bigscreen-on .mobile-tab-bar { display: none; }
body.bigscreen-on #stats-root.bigscreen {
    position: fixed; inset: 0; z-index: 9000;
}


/* ==========================================================================
   31. 标题逐字进场（配合 interactions.js §14）
   split-ready 才隐藏，保证 JS 没跑时标题照常可见（渐进增强）。
   ========================================================================== */
.split-ready .split-ch {
    display: inline-block;
    opacity: 0;
    transform: translateY(0.5em) rotateX(-55deg);
    transform-origin: 50% 100%;
    transition: opacity 0.55s var(--ease), transform 0.55s var(--ease);
    will-change: transform, opacity;
}
.split-ready.split-in .split-ch { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
    .split-ready .split-ch { opacity: 1; transform: none; transition: none; }
}


/* ==========================================================================
   32. 政策雷达：扫描屏 + 四维对比
   刻意不用中国行政区划地图——比赛作品用无审图号的地图数据有合规风险，
   这里用经纬度落点的抽象雷达屏，既扣「雷达」主题又不涉及边界绘制。
   ========================================================================== */
.radar-card {
    display: grid;
    grid-template-columns: minmax(260px, 340px) 1fr;
    gap: var(--sp-5);
    align-items: center;
    margin-bottom: var(--sp-4);
}

.radar-scope {
    position: relative;
    aspect-ratio: 1 / 1;
    border-radius: 50%;
    background:
        radial-gradient(circle at 50% 50%, rgba(74,157,91,0.10), rgba(10,16,14,0.92) 72%),
        #0b1210;
    border: 1px solid rgba(122, 200, 140, 0.35);
    overflow: hidden;
    box-shadow: inset 0 0 40px rgba(0,0,0,0.6);
}

/* 同心圈 + 十字准线 */
.radar-rings {
    position: absolute; inset: 0;
    background:
        repeating-radial-gradient(circle at 50% 50%,
            rgba(122,200,140,0.22) 0 1px, transparent 1px 16.6%),
        linear-gradient(rgba(122,200,140,0.18), rgba(122,200,140,0.18)) 50% 0/1px 100% no-repeat,
        linear-gradient(rgba(122,200,140,0.18), rgba(122,200,140,0.18)) 0 50%/100% 1px no-repeat;
}

/* 扫描光束：一个扇形渐变绕圆心转 */
.radar-sweep {
    position: absolute; inset: 0;
    background: conic-gradient(from 0deg,
        rgba(122,200,140,0.42) 0deg, rgba(122,200,140,0.10) 26deg, transparent 60deg, transparent 360deg);
    animation: radar-spin 4.5s linear infinite;
    mix-blend-mode: screen;
}
@keyframes radar-spin { to { transform: rotate(360deg); } }

/* 锚点本身零尺寸，圆点和标签各自绝对定位，保证圆点正好压在经纬度上 */
.radar-blip {
    position: absolute; width: 0; height: 0;
    text-decoration: none;
}
.radar-blip i {
    position: absolute; left: -4px; top: -4px;
    width: 8px; height: 8px; border-radius: 50%;
    background: #7ac88c;
    box-shadow: 0 0 0 0 rgba(122,200,140,0.55);
    animation: radar-ping 2.6s ease-out infinite;
}
.radar-blip span {
    position: absolute; left: 10px; top: -9px;
    font-size: 11px; white-space: nowrap;
    color: rgba(210,240,215,0.72);
    text-shadow: 0 1px 4px rgba(0,0,0,0.9);
}
.radar-blip.flip span { left: auto; right: 10px; }
.radar-blip:hover span { color: #fff; }
.radar-blip.on i {
    left: -5.5px; top: -5.5px; width: 11px; height: 11px;
    background: var(--gold, #f5c518);
    box-shadow: 0 0 14px rgba(245,197,24,0.9);
    animation-name: radar-ping-gold;
}
.radar-blip.on span { color: var(--gold, #f5c518); font-weight: 700; font-size: 12px; }

@keyframes radar-ping {
    0%   { box-shadow: 0 0 0 0 rgba(122,200,140,0.55); }
    70%  { box-shadow: 0 0 0 12px rgba(122,200,140,0); }
    100% { box-shadow: 0 0 0 0 rgba(122,200,140,0); }
}
@keyframes radar-ping-gold {
    0%   { box-shadow: 0 0 0 0 rgba(245,197,24,0.6); }
    70%  { box-shadow: 0 0 0 16px rgba(245,197,24,0); }
    100% { box-shadow: 0 0 0 0 rgba(245,197,24,0); }
}

@media (max-width: 720px) {
    .radar-card { grid-template-columns: 1fr; }
    .radar-scope { max-width: 320px; margin: 0 auto; }
}
@media (prefers-reduced-motion: reduce) {
    .radar-sweep { animation: none; opacity: 0.35; }
    .radar-blip i { animation: none; }
}

/* ==========================================================================
   33. 骨架屏 / 事件卡 3D 翻面 / 质量分四维雷达 / clip-path 揭幕
   ========================================================================== */

/* ---- 33.1 图表骨架屏 -------------------------------------------------
   echarts.min.js 有 1MB，慢网下图表容器会空白一段时间。外层 .chart-box
   先摆一块流光占位，JS 里 echarts.init 成功后加 .ready 让它淡出。
   骨架用伪元素画，模板里不用塞额外节点。 */
.chart-box { position: relative; width: 100%; }
.chart-box > div { width: 100%; height: 100%; }
.chart-box::after {
    content: '';
    position: absolute; inset: 0;
    border-radius: var(--r-sm);
    background:
        linear-gradient(90deg, transparent, var(--sk-sheen), transparent) 0 0/40% 100% no-repeat,
        repeating-linear-gradient(90deg,
            var(--line-2) 0 8%, transparent 8% 12%) 0 100%/100% 62% no-repeat,
        var(--line-2);
    background-blend-mode: normal;
    animation: sk-shimmer 1.4s linear infinite;
    opacity: 1;
    transition: opacity 0.35s ease;
    pointer-events: none;
}
.chart-box.ready::after { opacity: 0; animation: none; }
@keyframes sk-shimmer {
    0%   { background-position: -60% 0, 0 100%, 0 0; }
    100% { background-position: 160% 0, 0 100%, 0 0; }
}
@media (prefers-reduced-motion: reduce) {
    .chart-box::after { animation: none; }
}
/* echarts 没加载出来时的兜底文案：骨架屏收掉，明确告诉用户图没了但数据还在 */
.chart-fallback {
    display: flex; align-items: center; justify-content: center;
    height: 100%; min-height: 120px; margin: 0; padding: var(--sp-4);
    text-align: center; line-height: 1.7;
    font-size: var(--fs-sm); color: var(--ink-3);
    border: 1px dashed var(--line); border-radius: var(--r-sm);
}

/* ---- 33.2 事件卡 3D 翻面 ---------------------------------------------
   默认（触屏 / 长辈模式 / 减少动效）正反面直接上下平铺，信息一个不少；
   只有精确指针 + 允许动效的桌面端才启用 3D 翻转。 */
.ev-deck { display: flex; flex-direction: column; gap: var(--sp-3); }

.ev-flip {
    display: block;
    text-decoration: none;
    color: inherit;
    perspective: 1100px;
}
.ev-inner {
    position: relative;
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: var(--r-sm);
    overflow: hidden;
    transition: box-shadow 0.25s ease, border-color 0.25s ease;
}
.ev-flip:hover .ev-inner { border-color: var(--gold); box-shadow: 0 6px 22px rgba(0,0,0,0.09); }

.ev-face { display: flex; align-items: stretch; }
.ev-body { flex: 1; padding: var(--sp-3) var(--sp-4); min-width: 0; }
.ev-front h3 {
    font-size: var(--fs-md, 16px);
    line-height: 1.5;
    margin: 0 0 var(--sp-2);
    color: var(--ink);
}
.ev-front .info-row { display: flex; flex-wrap: wrap; gap: var(--sp-2); font-size: 12px; color: var(--ink-3); }
.ev-hint {
    position: absolute; right: 10px; top: 8px;
    font-size: 13px; color: var(--ink-3);
    opacity: 0; transition: opacity 0.25s ease;
}

.ev-back { background: var(--gold-wash, rgba(217,165,20,0.07)); }
.ev-back-label { font-size: 12px; color: var(--ink-3); margin-bottom: var(--sp-2); }
.ev-srcs { display: flex; flex-wrap: wrap; gap: 6px; }
.ev-src {
    font-size: 12px; padding: 3px 10px;
    border: 1px solid var(--line); border-radius: 999px;
    background: var(--card); color: var(--ink-2);
}
.ev-src-more { color: var(--ink-3); }
.ev-cta { margin-top: var(--sp-3); font-size: 13px; font-weight: 600; color:var(--gold-text); }

/* 平铺态下用一条分割线把正反面分开 */
.ev-back { border-top: 1px solid var(--line-2); }

@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
    html:not(.elder) .ev-inner {
        transform-style: preserve-3d;
        /* overflow 只要不是 visible，规范就强制 transform-style 退回 flat，
           翻转会变成"正面被照镜子"而不是翻到背面。圆角改由两个面各自负责。 */
        overflow: visible;
        transition: transform 0.62s cubic-bezier(.2,.7,.2,1), box-shadow 0.25s ease, border-color 0.25s ease;
    }
    html:not(.elder) .ev-face { border-radius: inherit; overflow: hidden; }
    html:not(.elder) .ev-flip:hover .ev-inner,
    html:not(.elder) .ev-flip:focus-visible .ev-inner { transform: rotateY(180deg); }

    html:not(.elder) .ev-face { backface-visibility: hidden; }
    /* 正面留在文档流里撑高度，背面绝对定位盖上去 */
    html:not(.elder) .ev-back {
        position: absolute; inset: 0;
        transform: rotateY(180deg);
        border-top: 0;
        overflow: hidden;
    }
    html:not(.elder) .ev-front { min-height: 96px; }
    html:not(.elder) .ev-flip:hover .ev-hint { opacity: 1; }
}

/* ---- 33.3 质量分四维雷达（hover 分数环展开）--------------------------
   纯静态 SVG（坐标在 views.py 算好），JS 挂了也照样能看；
   这里只负责收起/展开。 */
.score-ring.has-radar { position: relative; cursor: help; }
/* 原来一句 outline:none 把键盘焦点框也抹了——分数环是 tabindex=0 的，
   Tab 过来完全看不出停在哪。改成鼠标点不描边、键盘聚焦画一圈金框。 */
.score-ring.has-radar:focus { outline: none; }
.score-ring.has-radar:focus-visible {
    outline: 2px solid var(--gold-dark);
    outline-offset: 3px;
    border-radius: 50%;
}
.q-radar-pop {
    position: absolute;
    left: 50%; top: calc(100% + 10px);
    transform: translate(-50%, -6px);
    z-index: 30;
    padding: var(--sp-2) var(--sp-3) var(--sp-1);
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: var(--r-sm);
    box-shadow: 0 10px 30px rgba(0,0,0,0.14);
    opacity: 0; visibility: hidden;
    transition: opacity 0.22s ease, transform 0.22s ease, visibility 0.22s;
    pointer-events: none;
}
/* 触屏没有 hover，点一下只会拿到 :focus（不是 :focus-visible）——
   少了 :focus 这一支，手机上这块雷达根本打不开。 */
.score-ring.has-radar:hover .q-radar-pop,
.score-ring.has-radar:focus .q-radar-pop,
.score-ring.has-radar:focus-visible .q-radar-pop {
    opacity: 1; visibility: visible; transform: translate(-50%, 0);
}
.qr-grid { fill: none; stroke: var(--line); stroke-width: 1; }
.qr-grid-in { transform: scale(0.5); transform-origin: 60px 60px; transform-box: view-box; }
.qr-spoke { stroke: var(--line); stroke-width: 1; }
.qr-area {
    fill: rgba(217,165,20,0.28);
    stroke: var(--gold); stroke-width: 2; stroke-linejoin: round;
}
.qr-label { font-size: 9px; fill: var(--ink-3); }
/* 「四维健康度：越满越干净」是整句中文说明，不是角标（#644）。 */
.qr-tip { font-size: var(--fs-xs); color: var(--ink-3); text-align: center; }

@media (max-width: 640px) {
    /* 窄屏上 hover 本来就不存在，弹层贴左对齐防溢出 */
    .q-radar-pop { left: 0; transform: translate(0, -6px); }
    .score-ring.has-radar:hover .q-radar-pop,
    .score-ring.has-radar:focus .q-radar-pop,
    .score-ring.has-radar:focus-visible .q-radar-pop { transform: translate(0, 0); }
}

/* ---- 33.4 clip-path 揭幕 ---------------------------------------------
   .wipe-ready 由 interactions.js 加，JS 没跑就完全没有这层，内容照常显示。 */
.wipe-ready {
    clip-path: inset(0 100% 0 0);
    transition: clip-path 0.85s cubic-bezier(.16,1,.3,1), opacity 0.5s ease;
    opacity: 0.001;
}
.wipe-ready.wipe-in { clip-path: inset(0 0 0 0); opacity: 1; }
@media (prefers-reduced-motion: reduce) {
    .wipe-ready { clip-path: none; opacity: 1; transition: none; }
}

/* ==========================================================================
   验稿台 · 首页 Hero 第二主角（#125）
   跑马灯说的是「市场在发生什么」，验稿台说的是「你手上这篇能不能信」。
   放在首页主位是刻意的：监督是低频行为，藏得越深越没人用。
   ========================================================================== */
.deck {
    max-width:1200px; margin:var(--sp-4) auto 0; padding:0 28px;
}
.deck-box {
    position:relative; padding:var(--sp-6);
    border:1px solid var(--line); border-radius:var(--r);
    background:var(--card);
    /* 左侧一道金边：和监督层的装订线呼应，暗示「这条是另一路东西」 */
    box-shadow:inset 3px 0 0 var(--gold, var(--ink));
}
.deck-label {
    display:block; margin-bottom:var(--sp-3);
    font-family:var(--font-serif); font-size:var(--fs-lg);
    color:var(--ink); letter-spacing:.01em;
}
.deck-row { display:flex; gap:var(--sp-3); flex-wrap:wrap; }
.deck-row input {
    flex:1; min-width:220px; padding:12px var(--sp-4);
    border:1px solid var(--line); border-radius:var(--r-sm);
    background:var(--paper); color:var(--ink);
    font-size:var(--fs-base); font-family:inherit;
    transition:border-color .2s var(--ease), box-shadow .2s var(--ease);
}
.deck-row input:focus {
    outline:none; border-color:var(--gold-text);
    box-shadow:0 0 0 3px color-mix(in srgb, var(--gold-text) 18%, transparent);
}
.deck-go { flex-shrink:0; padding:12px 30px; font-size:var(--fs-base); }
.deck-foot {
    display:flex; flex-wrap:wrap; gap:var(--sp-2) var(--sp-4); align-items:baseline;
    margin-top:var(--sp-3); font-size:var(--fs-xs); color:var(--ink-3);
}
.deck-count { white-space:nowrap; }
/* 数字用等宽 + 定宽数位，count-up 跑的时候不会左右抽动 */
.deck-count b {
    font-variant-numeric:tabular-nums; font-feature-settings:"tnum" 1;
    font-size:var(--fs-sm); color:var(--ink-2);
}
.deck-hint { flex:1; min-width:16em; line-height:1.7; }
.deck-hint strong { color:var(--ink-2); font-weight:600; }

@media (max-width:640px) {
    .deck { padding:0 16px; }
    .deck-box { padding:var(--sp-4); }
    .deck-label { font-size:var(--fs-base); }
    .deck-go { width:100%; }
}

/* ==========================================================================
   双气质缝合 · 进档案室换一次空气（#125）
   行情大厅是黄的（金色 = 数字在跳），档案室是纸色的（墨与纸 = 话已经写死）。
   进监督簇时导航栏由金转墨——两种气质中间有一扇门，不是硬切。
   过渡挂在 .main-header 已有的 0.3s/0.4s transition 上；跨页时由
   view-transition-group(vt-header) 接手，所以刷新进来也不会突兀。
   ========================================================================== */
body.archive-mode .main-header {
    background: rgba(var(--paper-rgb), 0.94);
    border-bottom-color: var(--line);
}
/* 金色高亮全部退成墨色。active 仍然看得出来——靠的是墨底加重而不是彩色 */
body.archive-mode .main-nav a.active,
body.archive-mode .dropdown-menu a.active {
    color: var(--paper);
    background: var(--ink);
}
body.archive-mode .main-nav a:hover {
    color: var(--ink);
    background: color-mix(in srgb, var(--ink) 8%, transparent);
}
/* logo 的金渐变收成单色墨：站名不变，语气变了 */
body.archive-mode .logo .gradient-text {
    background: none;
    -webkit-text-fill-color: var(--ink-2);
    color: var(--ink-2);
}
/* 档案室的顶灯：导航条下缘一道极淡的横纹，和 .sv-ruled 的稿纸线同源 */
body.archive-mode .main-header::after {
    content: '';
    position: absolute; left: 0; right: 0; bottom: -3px; height: 2px;
    background: repeating-linear-gradient(90deg,
        var(--line) 0 6px, transparent 6px 12px);
    opacity: .5; pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
    body.archive-mode .main-header { transition: none; }
}

/* ── 免责声明 + 申诉入口（#128，组件 templates/_disclaimer.html）──────────
   全站统一一个样式：这块东西要在监督层五页、新闻详情、事件页、体检报告上
   反复出现，样式散在各模板里改一次要找八处。刻意做得「安静但看得见」——
   压过正文会喧宾夺主，藏起来又等于没挂。 */
.disclaimer-bar {
    display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-4);
    align-items: center; justify-content: space-between;
    margin: var(--sp-4) 0; padding: var(--sp-3) var(--sp-4);
    border: 1px solid var(--line-2); border-left: 3px solid var(--line);
    border-radius: var(--r-sm); background: var(--bg-soft, transparent);
}
.disclaimer-text {
    flex: 1 1 320px; font-size: var(--fs-xs); line-height: 1.85; color: var(--text-meta);
}
.disclaimer-text strong { color: var(--text-light); margin-right: .4em; }
.disclaimer-text b { color: var(--text-light); font-weight: 600; }
.disclaimer-appeal {
    flex-shrink: 0; font-size: var(--fs-xs); color: var(--gold-dark);
    text-decoration: none; white-space: nowrap;
    padding: 5px 12px; border: 1px solid var(--line); border-radius: var(--radius-full);
}
.disclaimer-appeal:hover { border-color: var(--gold); background: var(--gold-wash); }

/* 调查详情页轨迹（#318） */
.inv-detail-page { max-width: 860px; margin: 0 auto; }
.trace-debate-strip {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-2);
    margin-bottom: var(--sp-3);
}
.trace-debate-chip {
    display: inline-flex;
    gap: 8px;
    align-items: center;
    padding: 5px 10px;
    border-radius: var(--r-sm);
    border: 1px solid var(--line);
    background: var(--line-2);
    font-size: var(--fs-xs);
}
.trace-debate-chip.is-rejected {
    background: var(--red-light);
    border-color: var(--red);
}
.trace-debate-chip.is-passed {
    background: var(--green-light);
    border-color: var(--green);
}
.trace-debate-round { font-weight: 700; color: var(--ink-2); }
.trace-debate-copy { color: var(--ink-3); }
.trace-stack { display: flex; flex-direction: column; gap: var(--sp-2); }
.trace-row {
    border: 1px solid var(--line);
    border-radius: var(--r-sm);
    background: var(--line-2);
    overflow: hidden;
}
.trace-row.is-success { background: var(--green-light); border-color: var(--green); }
.trace-row.is-error { background: var(--red-light); border-color: var(--red); }
.trace-row.is-pending { background: var(--line-2); border-color: var(--border); }
.trace-summary {
    list-style: none;
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--sp-3);
    padding: 10px 14px;
    cursor: pointer;
}
.trace-summary::-webkit-details-marker { display: none; }
.trace-summary-main {
    min-width: 0;
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    flex: 1;
}
.trace-summary-side {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    flex-shrink: 0;
}
.trace-status { font-size: 16px; }
.trace-tool { font-size: var(--fs-sm); font-weight: 700; color: var(--ink); }
.trace-preview {
    min-width: 0;
    font-size: var(--fs-xs);
    color: var(--ink-3);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.trace-duration {
    font-size: 11px;
    color: var(--ink-3);
    font-variant-numeric: tabular-nums;
}
.trace-body {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--sp-2);
    padding: 0 14px 14px;
}
.trace-panel {
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: var(--r-sm);
    padding: 10px 12px;
}
.trace-panel-label {
    font-size: 11px;
    font-weight: 700;
    color: var(--ink-3);
    margin-bottom: 8px;
    letter-spacing: .04em;
}
.trace-preview-block {
    margin-bottom: 8px;
    font-size: var(--fs-xs);
    color: var(--ink-2);
}
.trace-pre {
    margin: 0;
    white-space: pre-wrap;
    word-break: break-word;
    font-size: 12px;
    line-height: 1.7;
    color: var(--ink);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
.trace-spinner {
    display: inline-block;
    width: 14px;
    height: 14px;
    border: 2px solid var(--ink-4);
    border-top-color: var(--yellow-dark, var(--gold-dark));
    border-radius: 50%;
    animation: trace-spin .6s linear infinite;
}
@keyframes trace-spin { to { transform: rotate(360deg); } }

@media (max-width: 640px) {
    .trace-summary {
        align-items: flex-start;
        flex-direction: column;
    }
    .trace-summary-side {
        width: 100%;
        justify-content: flex-end;
    }
    .trace-preview {
        white-space: normal;
    }
}

@media (prefers-reduced-motion: reduce) {
    .trace-spinner { animation: none; }
}
/* ==========================================================================
   45. 开车灯：主题切换的车灯扫光 + 夜航氛围灯
   总概念「白天是杂志，晚上是夜路」：点暗色按钮 = 天黑开车灯。
   一道暖光从左掠到右，主题在光束过半时翻面（base.html 的 theme-toggle 脚本）。
   光用 screen 混合：压浅色是一闪柔光，压深色是真车灯；减少动效时 JS 整段不建。
   ========================================================================== */
.headlight-beam {
    position: fixed; inset: 0; z-index: 9995;
    pointer-events: none;
    background: linear-gradient(104deg,
        transparent 34%,
        rgba(255, 216, 102, 0.16) 44%,
        rgba(255, 240, 190, 0.72) 50%,
        rgba(255, 216, 102, 0.16) 56%,
        transparent 66%);
    mix-blend-mode: screen;
    transform: translateX(-100%);
    animation: headlight-pass 0.72s cubic-bezier(.45, 0, .2, 1) forwards;
}
@keyframes headlight-pass {
    from { transform: translateX(-100%); }
    to   { transform: translateX(100%); }
}

/* 夜航氛围灯：暗色模式下导航条下缘一条金色光带（新能源座舱内饰那种）。
   档案室（archive-mode）是墨与纸的气质，不点灯。 */
[data-theme="dark"] body:not(.archive-mode) .main-header::before {
    content: '';
    position: absolute; left: 0; right: 0; bottom: -1px; height: 2px;
    background: linear-gradient(90deg,
        transparent, rgba(240, 192, 64, .9) 22%, #FFD866 50%,
        rgba(240, 192, 64, .9) 78%, transparent);
    box-shadow: 0 0 14px rgba(240, 192, 64, .45), 0 0 4px rgba(240, 192, 64, .6);
    opacity: .7;
    pointer-events: none;
}

/* ==========================================================================
   46. 仪表化数据组件
   全站数据组件统一进「仪表语言」，只用在两处：质量分环（表盘刻度）、
   stats 大数字（里程表翻牌）。别的数字不套，套满就成主题公园了。
   ========================================================================== */

/* 46.1 质量分环的表盘刻度圈：纯静态 SVG 线条（news_detail 模板里写死），
   这里只管颜色。别的页复用 .score-ring 时没有刻度组，互不影响。 */
.ring-ticks line { stroke: var(--line); stroke-width: 1.4; }
.ring-ticks line.tick-major { stroke: var(--ink-4); }

/* 46.2 里程表翻牌：[data-odometer] 由 base.html 全局脚本接管，数字拆成
   一列列 0-9 滚轮，高位先停低位后停。JS 挂了 / 减少动效时保持服务端
   渲染的原文，数字一个不丢。 */
.odo { display: inline-flex; overflow: hidden; vertical-align: bottom; }
.odo-col { display: inline-block; height: 1.15em; overflow: hidden; }
.odo-strip {
    display: block;
    transform: translateY(0);
    transition: transform 1.15s cubic-bezier(.16, 1, .3, 1);
    will-change: transform;
}
.odo-strip span { display: block; height: 1.15em; line-height: 1.15; }
/* 数据页 v3（§17b）给 .stat-num 上了 background-clip:text 渐变字——文字透明、
   靠裁剪出的背景显形。但滚轮列带 transform/overflow，Chrome 画不出这种组合，
   数字会整块隐形。修法：父级停掉裁剪，把同一条渐变搬到每个数字 span 自己身上
   （span 内没有再变换的后代，clip:text 能正常画）。大屏模式的实色发光字
   text-fill 会盖回 currentColor，不受影响。 */
#stats-root .stat-num .odo { background: none; }
#stats-root .stat-num .odo-strip span {
    background: linear-gradient(135deg, var(--gold-bright), var(--gold-dark));
    -webkit-background-clip: text;
    background-clip: text;
}

/* ==========================================================================
   47. 车型库「专利图纸」 /cars/
   奶油纸底 + 墨线泛型车剪影（templates/_patent_cars.html，原创手绘 path，
   不指向任何真实车型）+ 工程标注线。图纸感来自坐标纸网格 + 内衬虚线框 +
   FIG. 角标，配色全走既有 token，暗色模式自动翻面。
   ========================================================================== */
.patent-head {
    position: relative;
    margin-bottom: var(--sp-4);
    padding: var(--sp-4) var(--sp-5);
    border: 1px solid var(--ink-4);
    background: var(--card);
    border-radius: var(--r-sm);
}
.patent-head::before {
    content: '';
    position: absolute; inset: 5px;
    border: 1px solid var(--line);
    border-radius: 3px;
    pointer-events: none;
}
.patent-head-eyebrow {
    font-family: var(--font-display);
    font-size: 11px; font-weight: 700;
    letter-spacing: .22em; text-transform: uppercase;
    color: var(--ink-3);
}
.patent-head h2 {
    font-family: var(--font-serif);
    font-size: var(--fs-2xl); font-weight: 900;
    color: var(--ink); line-height: 1.3;
    margin: 2px 0 0;
}
.patent-head-sub { font-size: var(--fs-xs); color: var(--ink-3); margin-top: 4px; }
.patent-head-fig {
    position: absolute; top: 14px; right: 18px;
    font-family: var(--font-display);
    font-size: var(--fs-xs); font-weight: 700;
    letter-spacing: .14em;
    color: var(--ink-3);
    text-align: right;
}
.patent-head-fig small { display: block; font-size: 10px; font-weight: 400; color: var(--ink-3); letter-spacing: .08em; }

/* 图纸卡：坐标纸网格 + 内衬虚线框 + 底角车身剪影水印 */
.patent-card {
    position: relative;
    overflow: hidden;
    background-image:
        linear-gradient(var(--line-2) 1px, transparent 1px),
        linear-gradient(90deg, var(--line-2) 1px, transparent 1px);
    background-size: 24px 24px;
}
.patent-card > * { position: relative; z-index: 1; }
.patent-frame {
    position: absolute; inset: 6px; z-index: 0;
    border: 1px dashed var(--line);
    border-radius: 5px;
    pointer-events: none;
}
.pat-fig {
    position: absolute; top: 10px; right: 14px; z-index: 0;
    font-family: var(--font-display);
    font-size: 11px; font-weight: 700; letter-spacing: .14em;
    color: var(--ink-3);
    pointer-events: none;
}
.patent-car {
    position: absolute; right: 10px; bottom: 4px; z-index: 0;
    width: 170px; height: auto;
    color: var(--ink);
    opacity: .09;
    pointer-events: none;
}
[data-theme="dark"] .patent-car { opacity: .15; }
@media (max-width: 640px) { .patent-car { width: 128px; } }

/* 工程标注线：|——— 32 篇报道 ———|，两端是尺寸界线 */
.pat-dim {
    display: inline-flex; align-items: center; gap: 8px;
    font-size: var(--fs-xs); color: var(--ink-3);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
.pat-dim i {
    display: inline-block; width: 26px; height: 7px;
    border-left: 1px solid var(--ink-4);
    border-right: 1px solid var(--ink-4);
    background: linear-gradient(var(--ink-4), var(--ink-4)) center / 100% 1px no-repeat;
}
.patent-brand {
    font-family: var(--font-serif);
    font-size: var(--fs-md); font-weight: 700;
    color: var(--ink); text-decoration: none;
}
.patent-brand:hover { color: var(--gold-text); }

/* 空状态的整幅「FIG. 0」图纸：线稿车 + 尺寸标注，替掉 emoji 占位 */
.patent-empty { text-align: center; padding: 48px 20px; }
.patent-empty svg { width: min(300px, 80%); height: auto; margin: 0 auto; color: var(--ink-3); display: block; }
.patent-empty .pe-fig {
    font-family: var(--font-display);
    font-size: var(--fs-xs); font-weight: 700; letter-spacing: .18em;
    color: var(--ink-3); margin-top: var(--sp-3);
}
.patent-empty p { font-size: 15px; color: var(--ink-3); margin-top: var(--sp-2); }

/* ==========================================================================
   48. 到站仪式：文章读完 = 入位挂 P 挡
   读到 98% 速度表回零、亮 P 挡并泛一圈金光，「下一目的地」导航卡浮出；
   往回翻就复原。短文（正文不满一屏）不触发——刚打开就弹卡是噪音。
   ========================================================================== */
.reading-speedo.arrived { border-color: var(--gold); animation: speedo-park .9s var(--ease); }
.reading-speedo.arrived .speedo-fg {
    stroke-dashoffset: 85;
    transition: stroke-dashoffset .8s var(--ease);
}
.reading-speedo.arrived .speedo-pct { color: var(--gold-text); font-size: 15px; }
@keyframes speedo-park {
    0%   { box-shadow: 0 0 0 0 rgba(240, 192, 64, .55); }
    100% { box-shadow: 0 0 0 18px rgba(240, 192, 64, 0); }
}

.next-dest {
    position: fixed; right: 28px; bottom: 96px; z-index: 89;
    width: min(300px, calc(100vw - 56px));
    padding: 12px 14px;
    background: var(--card);
    border: 1px solid var(--gold);
    border-radius: var(--r-sm);
    box-shadow: var(--shadow-hover);
    text-decoration: none;
    opacity: 0; visibility: hidden; transform: translateY(10px);
    transition: opacity .35s var(--ease), transform .35s var(--ease),
                visibility .35s, border-color .2s;
}
.next-dest.show { opacity: 1; visibility: visible; transform: none; }
.next-dest:hover { border-color: var(--gold-dark); }
.next-dest .nd-label {
    display: flex; align-items: center; gap: 6px;
    font-size: 11px; color: var(--ink-3); letter-spacing: .04em;
}
.next-dest .nd-p {
    display: inline-flex; align-items: center; justify-content: center;
    width: 16px; height: 16px; flex: none;
    border: 1.5px solid var(--gold); border-radius: 4px;
    color: var(--gold-text);
    font-family: var(--font-display); font-size: 11px; font-weight: 700;
}
.next-dest .nd-title {
    margin-top: 6px;
    font-size: var(--fs-sm); font-weight: 600;
    color: var(--ink); line-height: 1.55;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
}
.next-dest .nd-go { display: block; margin-top: 6px; font-size: var(--fs-xs); font-weight: 600; color: var(--gold-text); }
@media (max-width: 768px) {
    .next-dest { right: 16px; bottom: 124px; }
}

@media (prefers-reduced-motion: reduce) {
    .headlight-beam { display: none; }
    .reading-speedo.arrived { animation: none; }
    .next-dest { transition: none; }
    .odo-strip { transition: none; }
}

/* ==========================================================================
   49. 驾驶舱反馈：算钱表盘 / 调价刻度尺 / 汇流线 / 断头路
   工具页的结果用站上已有的仪表·道路·图纸语言给反馈，逻辑零改动。
   ========================================================================== */
/* 49.1 算钱页优惠力度表盘（calculator.html）：0~30% 刻度，指针甩到位 */
.calc-cluster {
    display: flex; align-items: center; justify-content: center;
    gap: var(--sp-6); flex-wrap: wrap;
    padding: var(--sp-5) 0 var(--sp-6);
}
.calc-gauge { position: relative; width: 150px; flex: none; }
.calc-gauge svg { display: block; width: 100%; height: auto; overflow: visible; }
.calc-gauge .cg-ticks line { stroke: var(--line); stroke-width: 1.6; }
.calc-gauge .cg-ticks line.tick-major { stroke: var(--ink-4); stroke-width: 2; }
.calc-gauge .cg-scale { font-family: var(--font-display); font-size: 9px; fill: var(--ink-3); }
.calc-gauge .cg-arc-bg { fill: none; stroke: var(--line); stroke-width: 5; stroke-linecap: round; }
.calc-gauge .cg-arc {
    fill: none; stroke: var(--gold); stroke-width: 5; stroke-linecap: round;
    transition: stroke-dasharray 0.9s cubic-bezier(.16, 1, .3, 1);
}
.calc-gauge .cg-needle {
    stroke: var(--ink); stroke-width: 2.5; stroke-linecap: round;
    transform-origin: 60px 64px;
    transform: rotate(-135deg);
    transition: transform 0.9s cubic-bezier(.16, 1, .3, 1);
}
.calc-gauge .cg-hub { fill: var(--gold); stroke: var(--ink); stroke-width: 1.5; }
/* 读数放进 270° 弧留出的下缺口（viewBox 120 → 150px 显示是 1.25 倍） */
.calc-gauge .cg-read {
    position: absolute; left: 0; right: 0; top: 112px;
    text-align: center; color: var(--ink);
    font-family: var(--font-display); line-height: 1;
}
.calc-gauge .cg-read b { font-size: 19px; font-weight: 900; }
.calc-gauge .cg-read span { font-size: 11px; color: var(--ink-3); margin-left: 1px; }
.calc-gauge .cg-cap {
    margin-top: 2px; text-align: center;
    font-size: 11px; color: var(--ink-3); letter-spacing: .04em;
}
.calc-total { text-align: center; }

/* 49.2 调价刻度尺（backstab.html）：工程卡尺画法。从 0 量到车价，
   两根钉一上一下（价再接近标签也不打架），差额画成金色带，宽度是真比例。 */
.bs-ruler { position: relative; height: 134px; margin: var(--sp-6) 0; }
.bs-ruler .bsr-track {
    position: absolute; left: 0; right: 0; top: 52px; height: 28px;
    border-bottom: 2px solid var(--ink-4);
    background:
        repeating-linear-gradient(90deg, var(--line) 0, var(--line) 1px, transparent 1px, transparent 46px) left bottom / 100% 15px no-repeat,
        repeating-linear-gradient(90deg, var(--line-2) 0, var(--line-2) 1px, transparent 1px, transparent 9px) left bottom / 100% 8px no-repeat;
}
.bs-ruler .bsr-band {
    position: absolute; bottom: -2px; height: 6px; width: 0;
    background: var(--gold); border-radius: 3px;
    transition: width 0.9s cubic-bezier(.16, 1, .3, 1);
}
.bs-ruler .bsr-pin {
    position: absolute; transform: translateX(-50%);
    width: max-content; max-width: 200px; text-align: center;
}
.bs-ruler .bsr-pin b { display: block; font-family: var(--font-display); font-size: 16px; color: var(--ink); line-height: 1.2; }
.bs-ruler .bsr-pin small { display: block; font-size: 11px; color: var(--ink-3); margin-top: 1px; line-height: 1.4; }
.bs-ruler .bsr-pin i { display: block; width: 1.5px; height: 13px; background: var(--ink-4); margin: 3px auto 0; }
.bs-ruler .bsr-pin--buy { top: 0; }
.bs-ruler .bsr-pin--cur { top: 86px; }
.bs-ruler .bsr-pin--cur i { margin: 0 auto 3px; }
@media (prefers-reduced-motion: reduce) {
    .bs-ruler .bsr-band, .calc-gauge .cg-needle, .calc-gauge .cg-arc { transition: none; }
}

/* 49.3 事件卡汇流线（event_list.html）：N 条车道汇进卡片的金条。
   细墨线、低透明度，列表几十张卡也不吵；进视口 draw-in 一次（脚本在模板里）。 */
.ev-merge { flex: none; width: 34px; height: 68px; align-self: center; margin-left: 6px; }
.ev-merge path { fill: none; stroke: var(--ink-4); stroke-width: 1.5; stroke-linecap: round; opacity: .55; }
@media (max-width: 480px) { .ev-merge { display: none; } }

/* ==========================================================================
   50. 首页瘦身（改版 ①，见 docs/前端改版总规划.md §4.1）
   首屏原来 1440×900 里一条新闻都没有：行情条 + 验稿台大块 + 我的车 + bento 四卡
   把 hero 压到折叠线以下。这一节配合模板里的重排——验稿台压成一行、bento 搬去
   数据总览、早报收进信息流网格、底部补半年记横幅。
   全部走已有 token，不引入新的圆角/字号档位。
   ========================================================================== */

/* 50.1 验稿台压扁版：标签内联进输入行，说明收成一行，口径挪到链接 */
.deck-slim { padding-top: var(--sp-3); padding-bottom: var(--sp-2); }
.deck-slim .deck-box { padding: var(--sp-4); }
.deck-slim .deck-row { align-items: center; gap: var(--sp-2); flex-wrap: nowrap; }
.deck-label-inline {
    flex-shrink: 0; font-family: var(--font-display); font-size: var(--fs-base);
    font-weight: 700; color: var(--ink); white-space: nowrap;
}
.deck-slim .deck-row input { flex: 1; min-width: 0; }
.deck-slim .deck-go { padding: 10px 22px; font-size: var(--fs-sm); }
.deck-slim .deck-foot { margin-top: var(--sp-2); align-items: baseline; }
.deck-slim .deck-hint {
    /* 一行封顶：说明是给扫一眼的人看的，展开成三行就等于又把首屏吃回去了 */
    min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.deck-more {
    flex-shrink: 0; margin-left: auto; color: var(--gold-text);
    font-size: var(--fs-xs); text-decoration: none; white-space: nowrap;
}
.deck-more:hover { text-decoration: underline; }
@media (max-width: 768px) {
    /* 手机上不硬挤一行：按钮换行占满，输入框才有正常宽度 */
    .deck-slim .deck-row { flex-wrap: wrap; }
    .deck-slim .deck-go { width: 100%; }
    .deck-slim .deck-hint { white-space: normal; }
    .deck-more { margin-left: 0; }
}

/* 50.2 「我的车」一行：原来写在模板内联里，收编成类（改版 ④ 的同一条纪律） */
.mycar-line {
    max-width: 1200px; margin: var(--sp-3) auto 0; padding: 0 28px;
    font-size: var(--fs-sm); color: var(--ink-3);
}
.mycar-line a { color: var(--gold-text); font-weight: 600; text-decoration: none; }
.mycar-line a:hover { text-decoration: underline; }

/* 50.3 早报卡（进了 magazine-grid，跟新闻卡同一套语言，只靠角标区分身份） */
.chip-brief { background: var(--gold-wash); color: var(--gold-text); font-weight: 600; }
.brief-card-grid .brief-mini {
    list-style: none; margin: var(--sp-2) 0 0; padding: 0;
    font-size: var(--fs-sm); color: var(--ink-2); line-height: 1.8;
}
.brief-card-grid .brief-mini li {
    padding-left: 14px; position: relative;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.brief-card-grid .brief-mini li::before {
    content: ""; position: absolute; left: 0; top: 0.7em;
    width: 5px; height: 5px; border-radius: 50%; background: var(--gold);
}

/* 50.4 筛选折叠：事件类型 14 个 chip 默认收起，选中时模板给 open */
.filter-fold { margin-bottom: var(--sp-4); }
.filter-fold > summary {
    cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: 6px;
    font-size: var(--fs-xs); color: var(--ink-3);
    padding: 4px 10px; border: 1px dashed var(--line); border-radius: 999px;
}
.filter-fold > summary::-webkit-details-marker { display: none; }
.filter-fold > summary::before { content: "＋"; font-size: 11px; color: var(--gold-text); }
.filter-fold[open] > summary::before { content: "－"; }
.filter-fold > summary:hover { border-color: var(--gold); color: var(--ink-2); }
.filter-fold[open] > summary { margin-bottom: var(--sp-2); }

/* 50.5 半年记横幅：首页最底，线稿车 + 一句话，和 404/搜索无结果同族插画语言 */
.story-banner {
    max-width: 1200px; margin: var(--sp-8) auto var(--sp-6); padding: var(--sp-4) var(--sp-6);
    display: flex; align-items: center; gap: var(--sp-4);
    border: 1px solid var(--line); border-radius: var(--r-sm);
    background: var(--card); color: var(--ink); text-decoration: none;
    transition: border-color .25s var(--ease), transform .25s var(--ease);
}
.story-banner:hover { border-color: var(--gold); transform: translateY(-2px); }
.story-banner-car { width: 150px; height: 52px; flex-shrink: 0; color: var(--ink-3); }
.story-banner:hover .story-banner-car { color: var(--gold-text); }
.story-banner-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.story-banner-text b { font-family: var(--font-display); font-size: var(--fs-lg); }
.story-banner-text span { font-size: var(--fs-sm); color: var(--ink-3); }
.story-banner-go {
    margin-left: auto; flex-shrink: 0;
    font-size: var(--fs-sm); color: var(--gold-text); font-weight: 600;
}
@media (max-width: 768px) {
    .story-banner { flex-wrap: wrap; gap: var(--sp-2); padding: var(--sp-4); }
    .story-banner-car { width: 110px; height: 40px; }
    .story-banner-go { margin-left: 0; width: 100%; }
}

/* 50.6 温度卡搬到数据总览后的版式（原来在 bento 网格里，靠 grid 撑；这里是通栏卡） */
.temp-chapter-body { display: flex; align-items: center; gap: var(--sp-6); flex-wrap: wrap; }
.temp-chapter .temp-gauge { width: 160px; flex-shrink: 0; }
.temp-chapter .temp-readout { display: flex; align-items: baseline; gap: var(--sp-2); }
.temp-chapter .temp-score {
    font-family: var(--font-display); font-size: var(--fs-3xl); font-weight: 900;
    font-variant-numeric: tabular-nums;
}
.temp-chapter .temp-icon { font-size: var(--fs-xl); }
.temp-chapter .temp-label { font-size: var(--fs-base); color: var(--ink-3); }

/* ==========================================================================
   51. 召回查询页（改版 ⑦，templates/recall.html）
   999 条总局公告此前没有独立入口。版式按「可核」来排：日期/涉及台数/编号在前，
   缺陷描述截断到两行，原文链接每条都给——我们不复述公告，只摆事实字段 + 回链。
   ========================================================================== */
.recall-stats {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-6);
    padding: var(--sp-4) var(--sp-6); margin-bottom: var(--sp-4);
    border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--card);
}
.recall-stat { display: flex; align-items: baseline; gap: 8px; }
.recall-stat b {
    font-family: var(--font-display); font-size: var(--fs-2xl); font-weight: 900;
    color: var(--gold-text); font-variant-numeric: tabular-nums;
}
.recall-stat span { font-size: var(--fs-sm); color: var(--ink-3); }
.recall-stat-note {
    flex: 1; min-width: 16em; font-size: var(--fs-xs); color: var(--ink-3);
    line-height: 1.8; display: block;
}
.recall-stat-note b { font-size: inherit; font-family: inherit; color: var(--ink-2); }

/* 去车身病历的入口（#506）：列表读不出「这个牌子老坏在哪儿」，那一层在另一页 */
.recall-anatomy-entry {
    display: grid; grid-template-columns: auto 1fr auto; align-items: center;
    gap: 4px 14px; margin-bottom: var(--sp-3); padding: 13px 16px;
    border: 1px solid var(--line); border-left: 3px solid var(--gold);
    border-radius: var(--r-sm); background: var(--paper-2);
    color: inherit; text-decoration: none;
    transition: border-color .18s ease, background .18s ease;
}
.recall-anatomy-entry:hover { border-color: var(--gold); background: var(--gold-light); }
.recall-anatomy-entry b { font-size: var(--fs-sm); white-space: nowrap; }
.recall-anatomy-entry span { color: var(--ink-3); font-size: var(--fs-xs); line-height: 1.6; }
.recall-anatomy-entry i { font-style: normal; color: var(--gold-text); font-weight: 700; }
@media (max-width: 640px) {
    .recall-anatomy-entry { grid-template-columns: 1fr auto; }
    .recall-anatomy-entry span { grid-column: 1 / -1; }
}

.recall-search { display: flex; gap: var(--sp-2); align-items: center; margin-bottom: var(--sp-3); flex-wrap: wrap; }
.recall-search input {
    flex: 1; min-width: 14em; padding: 11px 14px;
    border: 1px solid var(--line); border-radius: var(--r-sm);
    background: var(--paper); color: var(--ink); font-size: var(--fs-sm); font-family: inherit;
}
.recall-search input:focus { outline: none; border-color: var(--gold); }
.recall-clear { font-size: var(--fs-sm); color: var(--ink-3); text-decoration: none; }

.recall-list { display: flex; flex-direction: column; gap: var(--sp-3); margin-top: var(--sp-4); }
.recall-item {
    padding: var(--sp-4) var(--sp-6);
    border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--card);
    transition: border-color .2s var(--ease);
}
.recall-item:hover { border-color: var(--gold); }
.recall-item-head {
    display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2);
    font-size: var(--fs-xs); color: var(--ink-3); margin-bottom: 6px;
}
.recall-item-head time { font-variant-numeric: tabular-nums; }
.recall-model { color: var(--gold-text); text-decoration: none; font-weight: 600; }
.recall-count {
    padding: 1px 8px; border-radius: 999px;
    background: var(--gold-wash); color: var(--gold-text); font-variant-numeric: tabular-nums;
}
.recall-no { color: var(--ink-3); font-variant-numeric: tabular-nums; }
.recall-title { font-size: var(--fs-base); line-height: 1.6; margin: 0 0 6px; }
.recall-defect { font-size: var(--fs-sm); color: var(--ink-3); line-height: 1.8; margin: 0 0 8px; }
.recall-src { font-size: var(--fs-xs); color: var(--gold-text); text-decoration: none; }
.recall-src:hover { text-decoration: underline; }

.recall-disclaimer {
    margin-top: var(--sp-8); padding-top: var(--sp-4); border-top: 1px solid var(--line-2);
    font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.9;
}
.recall-disclaimer a { color: var(--ink-3); }
.empty-hint { font-size: var(--fs-sm); color: var(--ink-3); margin-top: 6px; }

/* ==========================================================================
   52. 导航三角度 + 线稿图标（改版 ② / ④）
   一级入口 15 → 3，每个回答一个用户问题；emoji 全部换成 currentColor 线稿。
   ========================================================================== */

/* 52.1 线稿图标基类：全站图标的唯一形态。fill:none + currentColor，
   颜色永远跟着上下文（选中态、暗色模式）走，不自带色相。 */
.ico-line, .tab-ico {
    width: 1.15em; height: 1.15em; display: inline-block; vertical-align: -0.18em;
    fill: none; stroke: currentColor; stroke-width: 1.7;
    stroke-linecap: round; stroke-linejoin: round;
}
.tab-ico { width: 22px; height: 22px; display: block; margin: 0 auto 2px; stroke-width: 1.6; }

/* 52.2 三角度一级项：主词 + 一行小字说明（术语墙的解药） */
.main-nav-3 { gap: var(--sp-1); }
.nav-angle { display: inline-flex; flex-direction: column; line-height: 1.25; }
.nav-angle em {
    /* 字阶：12px（--fs-xs）。这行小字是给人读的说明，不是角标。 */
    font-style: normal; font-size: var(--fs-xs); font-weight: 400;
    color: var(--ink-3); letter-spacing: .02em; margin-top: 1px;
}
.nav-angle.active em { color: var(--gold-text); }
/* 下拉里的 3D 角标：标出「这里有个别人没有的东西」，但不喧宾夺主 */
.dropdown-menu i {
    /* 10px 而不是字阶 12px：这里只放拉丁字母角标（「3D」），
       中文最小可读那条针对的是汉字，不适用。不许拿它塞中文。 */
    font-style: normal; font-size: 10px; font-weight: 700; letter-spacing: .06em;
    padding: 1px 5px; margin-left: 4px; border-radius: 999px;
    background: var(--gold-wash); color: var(--gold-text); vertical-align: 1px;
}

/* 52.3 长辈模式按钮：状态靠 aria-pressed，不靠换图标 */
#elder-toggle[aria-pressed="true"] { color: var(--gold-text); border-color: var(--gold); }

/* 52.4 页脚「更多入口」：从导航退下来的六个入口 */
.footer-more {
    display: flex; flex-wrap: wrap; justify-content: center;
    gap: var(--sp-2) var(--sp-4); margin: var(--sp-3) auto 0; max-width: 1200px;
    padding: 0 var(--sp-4);
}
.footer-more a { font-size: var(--fs-xs); color: var(--ink-3); text-decoration: none; }
.footer-more a:hover { color: var(--gold-text); }

@media (max-width: 900px) {
    /* 窄屏放不下小字说明，只留主词——但分组本身不变 */
    .nav-angle em { display: none; }
}

/* 52.5 主题切换图标：日/月两个 SVG 都在 DOM 里，按 data-theme 显示其一。
   放 CSS 里而不是 JS 里，是为了 JS 没跑起来时图标也是对的（渐进增强）。 */
.theme-icon { display: inline-flex; align-items: center; justify-content: center; }
.ico-moon { display: none; }
[data-theme="dark"] .ico-sun { display: none; }
[data-theme="dark"] .ico-moon { display: inline-block; }

/* 52.6 热力图极值描边（改版 ⑤）
   26/29 格是正值且挤在 0.2~0.4，纯色深归一化下所有格子长得一样，眼睛没有落点。
   给净值最高的 3 格和所有负值格加描边——**只加描边和字重，不动色阶也不动数值**。
   用视觉手段制造数据里没有的对比是骗人，标出真实极值不是。 */
.heat-cell.heat-x { font-weight: 800; position: relative; }
.heat-cell.heat-x-pos { box-shadow: inset 0 0 0 2px var(--gold); }
.heat-cell.heat-x-neg { box-shadow: inset 0 0 0 2px var(--red); }
.heat-key.heat-x-pos { box-shadow: inset 0 0 0 2px var(--gold); }
.heat-key.heat-x-neg { box-shadow: inset 0 0 0 2px var(--red); }

/* 52.7 详情页导语（改版 ⑤）
   「一句话总结」原来是首屏第三块小卡、字号跟正文一样，夹在多源提示和质量分面板
   中间，读起来像系统提示。它其实是这页最该先被读到的一句话。 */
.article-lede {
    margin: var(--sp-6) 0;
    padding: var(--sp-4) 0 var(--sp-4) var(--sp-6);
    border-left: 3px solid var(--gold);
}
.article-lede-label {
    display: flex; align-items: center; gap: 6px;
    font-size: var(--fs-xs); font-weight: 700; color: var(--ink-3);
    margin-bottom: var(--sp-2);
}
.article-lede-text {
    font-family: var(--font-serif); font-size: var(--fs-lg); line-height: 1.85;
    color: var(--ink); margin: 0;
}
.article-lede-src {
    display: inline-block; margin-top: var(--sp-2);
    font-size: var(--fs-sm); color: var(--gold-text); font-weight: 600; text-decoration: none;
}
.article-lede-src:hover { text-decoration: underline; }
@media (max-width: 768px) {
    .article-lede { padding-left: var(--sp-4); }
    .article-lede-text { font-size: var(--fs-base); }
}

/* 52.8 退订落地页 + 邮件推送开关（改版 ⑥ / #405） */
.unsub-wrap { max-width: 620px; margin: var(--sp-12) auto; padding: 0 var(--sp-4); }
.unsub-text { font-size: var(--fs-base); line-height: 2; color: var(--ink-2); margin: var(--sp-4) 0; }
.unsub-text a { color: var(--gold-text); }
.unsub-form { display: flex; align-items: center; gap: var(--sp-4); margin-top: var(--sp-6); flex-wrap: wrap; }
.unsub-cancel { font-size: var(--fs-sm); color: var(--ink-3); text-decoration: none; }
.unsub-note { margin-top: var(--sp-4); font-size: var(--fs-xs); color: var(--ink-3); }
.notify-mail-row { display: flex; align-items: flex-start; gap: 10px; cursor: pointer; }
.notify-mail-row input { margin-top: 4px; flex-shrink: 0; }
.notify-mail-row b { display: block; font-size: var(--fs-sm); }
.notify-mail-row em {
    display: block; font-style: normal; margin-top: 3px;
    font-size: var(--fs-xs); color: var(--ink-3);
}

/* 52.9 今日两篇（改版 ⑨）：最可信的一篇 / 拦下的一篇，一正一反。
   刻意跟 .news-card 长得不一样——它们是「站方挑出来的」，不是信息流的一条。 */
.pick-card {
    display: block; margin-bottom: var(--sp-4); padding: var(--sp-4) var(--sp-6);
    border-radius: var(--r-sm); text-decoration: none; color: var(--ink);
    border: 1px solid var(--line); background: var(--card);
    transition: border-color .2s var(--ease), transform .2s var(--ease);
}
.pick-card:hover { transform: translateY(-2px); }
.pick-trusted { border-left: 3px solid var(--green); }
.pick-trusted:hover { border-color: var(--green); }
.pick-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); margin-bottom: 6px; }
.pick-tag {
    font-size: var(--fs-xs); font-weight: 700; padding: 2px 9px; border-radius: 999px;
    background: var(--green-light); color: var(--green);
}
.pick-why { font-size: var(--fs-xs); color: var(--ink-3); font-variant-numeric: tabular-nums; }
.pick-card h3 { font-size: var(--fs-md); line-height: 1.6; margin: 0 0 6px; }

/* 52.10 分享进来的内容提示（改版 ⑩） */
.shared-note {
    margin: 0 0 var(--sp-3); padding: 8px 14px; border-radius: var(--r-sm);
    background: var(--gold-wash); color: var(--ink-2); font-size: var(--fs-sm);
}

/* 52.11 演示模式（改版 ⑮）：?demo=1 全站放大一档，给答辩投影用。
   只放大字号和关键数字，不动布局——投影上要的是「看得清」，
   不是换一套版式（换版式等于演示的不是真站）。 */
.demo-mode {
    --fs-xs: 14px; --fs-sm: 16px; --fs-base: 18px; --fs-md: 18px;
    --fs-lg: 24px; --fs-xl: 24px; --fs-2xl: 34px; --fs-3xl: 52px;
}
.demo-mode .stat-num, .demo-mode .bento-num, .demo-mode .recall-stat b { letter-spacing: .01em; }
/* 投影通常偏暗，正文再压一档对比度会看不清 */
.demo-mode { --ink-3: var(--ink-2); --ink-4: var(--ink-3); }

/* 验稿失败的降级出路（改版 ⑮）：抽取成功率 17/20，当场演示有 3/20 抓不到，
   错误旁边必须常驻一条走得通的路。 */
.check-error-msg { color: var(--red); font-size: var(--fs-md); line-height: 1.8; }
.check-error-act {
    margin-top: var(--sp-4); display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
}
.check-error-hint { font-size: var(--fs-sm); color: var(--ink-3); }

/* 52.12 当场复算（改版 ⑪ / C1）：读者在自己的浏览器里重算规则层。 */
.rc-input {
    width: 100%; padding: 12px 14px; border: 1px solid var(--line);
    border-radius: var(--r-sm); background: var(--paper); color: var(--ink);
    font-family: inherit; font-size: var(--fs-sm); line-height: 1.9; resize: vertical;
}
.rc-input:focus { outline: none; border-color: var(--gold); }
.rc-actions { display: flex; gap: var(--sp-2); margin-top: var(--sp-3); flex-wrap: wrap; }
.rc-result {
    margin-top: var(--sp-4); padding: var(--sp-4);
    border: 1px dashed var(--line); border-radius: var(--r-sm); background: var(--paper);
}
.rc-score {
    font-family: var(--font-display); font-size: var(--fs-lg); font-weight: 900;
    margin-bottom: var(--sp-3); font-variant-numeric: tabular-nums;
}
.rc-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; padding: 6px 0; line-height: 1.8; }
.rc-row + .rc-row { border-top: 1px solid var(--line-2); }
.rc-row b { min-width: 7em; font-size: var(--fs-sm); }
.rc-verdict { font-size: var(--fs-sm); font-weight: 600; }
.rc-ok .rc-verdict { color: var(--green); }
.rc-bad .rc-verdict { color: var(--red); }
.rc-detail { flex: 1 1 100%; font-size: var(--fs-xs); color: var(--ink-3); }
.rc-note { margin: var(--sp-3) 0 0; font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.9; }
.rc-empty { font-size: var(--fs-sm); color: var(--ink-3); margin: 0; }

/* 52.13 AI 调用透明面板（改版 ⑪ / C4） */
.usage-grid { display: flex; flex-wrap: wrap; gap: var(--sp-6); margin-bottom: var(--sp-4); }
.usage-cell { display: flex; flex-direction: column; gap: 2px; }
.usage-cell b {
    font-family: var(--font-display); font-size: var(--fs-2xl); font-weight: 900;
    color: var(--gold-text); font-variant-numeric: tabular-nums;
}
.usage-cell span { font-size: var(--fs-xs); color: var(--ink-3); }
.usage-sub { margin: var(--sp-4) 0 6px; font-size: var(--fs-sm); font-weight: 700; color: var(--ink-2); }
.usage-list { list-style: none; margin: 0; padding: 0; }
.usage-list li {
    display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-4);
    padding: 5px 0; border-bottom: 1px solid var(--line-2); font-size: var(--fs-sm);
}
.usage-list code { font-size: var(--fs-xs); color: var(--ink-2); }
.usage-list span { color: var(--ink-3); font-variant-numeric: tabular-nums; }
.usage-note { margin-top: var(--sp-4); font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.9; }

/* 52.14 你也判一下（改版 ⑧ / A1）
   两侧对等的两栏，不是「标准答案 vs 你的作答」——抽检准确率只有五成多，
   没资格把读者的不同判断称作错。 */
.reader-judge { margin-top: var(--sp-8); padding-top: var(--sp-6); border-top: 1px solid var(--line-2); }
.reader-judge h3 { font-size: var(--fs-md); margin: 0 0 6px; }
.reader-judge > p { font-size: var(--fs-sm); color: var(--ink-3); margin: 0 0 var(--sp-3); }
.reader-judge-actions { display: flex; gap: var(--sp-2); flex-wrap: wrap; }
.rj-btn[aria-pressed="true"] { border-color: var(--gold); color: var(--gold-text); font-weight: 700; }
.rj-compare {
    margin-top: var(--sp-4); padding: var(--sp-4);
    border: 1px dashed var(--line); border-radius: var(--r-sm); background: var(--paper);
    display: flex; flex-wrap: wrap; gap: var(--sp-6);
}
.rj-side { display: flex; flex-direction: column; gap: 3px; }
.rj-who { font-size: var(--fs-xs); color: var(--ink-3); }
.rj-side b { font-size: var(--fs-md); }
.rj-note { flex: 1 1 100%; margin: 0; font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.9; }
/* 互判第二题（表述倾向）：结构复用上面整套，只补题间距和依据句引块 */
.rj-q2 { margin-top: var(--sp-5); }
.rj-q2 h3 { font-size: var(--fs-md); margin: 0 0 var(--sp-3); }
.rj-evidence {
    flex: 1 1 100%; margin: 0; padding-left: var(--sp-3);
    border-left: 3px solid var(--gold); font-size: var(--fs-sm); color: var(--ink-2);
}

/* 52.15 质量分卡的标签行（改版 ⑤：多源提示并进来，四层并两层） */
.q-flag-row { margin-top: var(--sp-1); display: flex; gap: var(--sp-2); flex-wrap: wrap; align-items: center; }
.q-clean { font-size: var(--fs-xs); color: var(--green); }
.q-multi {
    font-size: var(--fs-xs); color: var(--gold-text); text-decoration: none; font-weight: 600;
    padding: 1px 8px; border: 1px solid var(--gold); border-radius: 999px;
}
.q-multi:hover { background: var(--gold-wash); }

/* ── 复算口径（#456）：把「任何人能本地复现同一个分」变成页面上真拿得到的东西 ──
   默认折叠：它是给要较真的人看的，不该占普通读者的注意力；
   但**必须在判决书里面**，不能挪到别处——离开了那份判决，口径版本没有意义。 */
.q-recompute { margin-top: var(--sp-3); border-top: 1px dashed var(--line); padding-top: var(--sp-2); }
.q-recompute > summary { cursor: pointer; font-size: var(--fs-xs); color: var(--ink-3);
                         list-style: none; display: inline-flex; align-items: center; gap: 5px; }
.q-recompute > summary::-webkit-details-marker { display: none; }
.q-recompute > summary::before { content: '⌗'; font-size: 13px; color: var(--gold-text); }
.q-recompute > summary:hover { color: var(--ink); }
.q-recompute-body { margin: var(--sp-2) 0 0; font-size: var(--fs-xs); }
.q-recompute-body > div { display: flex; gap: 10px; padding: 5px 0; border-bottom: 1px solid var(--line); }
.q-recompute-body > div:last-child { border-bottom: none; }
.q-recompute-body dt { flex: 0 0 62px; color: var(--ink-3); }
.q-recompute-body dd { margin: 0; flex: 1; min-width: 0; color: var(--ink-2); line-height: 1.8; }
/* 版本号和哈希要能被准确抄走，也不能把窄屏撑出横向滚动 */
.q-mono { font-family: var(--font-mono, ui-monospace, Menlo, monospace);
          word-break: break-all; user-select: all; }
.q-recompute-note { margin: var(--sp-2) 0 0; font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.9; }
.rc-version { margin: calc(var(--sp-3) * -1) 0 var(--sp-4); font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.9; }
.rc-version-note { color: var(--ink-3); }

/* 对照阅读入口（#411）：详情页正文之后的一张小卡。
   长相跟站内其它「往下查」入口一族（尺寸对比卡 / 调查入口），
   别自成一格——同一页上三种入口三种样子，就成了三个广告位。 */
.versus-entry {
    display: block;
    margin: var(--sp-5, 28px) 0;
    padding: 16px 20px;
    background: var(--card);
    border: 1px solid var(--line);
    border-left: 3px solid var(--gold);
    border-radius: 0 var(--r) var(--r) 0;
    text-decoration: none;
    transition: border-color .2s, box-shadow .2s;
}
.versus-entry:hover { box-shadow: 0 6px 20px rgba(30,28,24,.07); }
.versus-entry .ve-t {
    display: block;
    font-family: var(--font-serif);
    font-size: 17px;
    font-weight: 600;
    color: var(--ink);
}
.versus-entry .ve-s {
    display: block;
    margin-top: 6px;
    font-size: var(--fs-sm);
    color: var(--ink-3);
    line-height: 1.8;
}
.versus-entry .ve-go {
    display: inline-block;
    margin-top: 10px;
    font-size: var(--fs-sm);
    color: var(--gold-text);
}
/* 事件宇宙（#584）：事件列表上方的可信度地图。
   亮度编码的是**核验强度**不是热度，口径见 views._event_universe。 */
.uni-wrap {
    margin: 0 0 var(--sp-5, 28px);
    padding: 18px 20px 16px;
    background: linear-gradient(180deg, #1A1712 0%, #12100C 100%);
    border: 1px solid var(--line);
    border-radius: var(--r);
    overflow: hidden;
}
.uni-lead { font-size: var(--fs-sm); color: #C9C1AF; line-height: 1.9; }
.uni-lead b { color: #F5EFDF; font-variant-numeric: tabular-nums; }
.uni-lead b.uni-hi { color: var(--gold-bright); }
.uni-lead .uni-sub { color: #8A8172; }

.uni-stage { position: relative; margin: 10px 0 4px; min-height: 0; }
.uni-stage canvas { display: block; width: 100%; }
.uni-tip {
    position: absolute;
    z-index: 3;
    max-width: 250px;
    pointer-events: none;
    background: rgba(20,17,13,.96);
    border: 1px solid #3A352C;
    border-radius: var(--r-sm);
    padding: 8px 11px;
    font-size: var(--fs-xs);
    line-height: 1.6;
    color: #E8E2D4;
    box-shadow: 0 8px 24px rgba(0,0,0,.5);
}
.uni-tip b { display: block; margin-bottom: 2px; color: #F5EFDF; }
.uni-tip span { color: #A89F8C; }

.uni-legend {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 18px;
    font-size: var(--fs-xs);
    color: #A89F8C;
}
.uni-legend span { display: inline-flex; align-items: center; gap: 7px; }
.uni-legend b { color: #E8E2D4; font-variant-numeric: tabular-nums; }
.uni-legend i { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.uni-legend .ul-3 { background: #F7CE2E; box-shadow: 0 0 8px rgba(247,206,46,.75); }
.uni-legend .ul-2 { background: #9C7C2A; }
.uni-legend .ul-1 { background: #7E776B; }

.uni-note {
    margin-top: 12px;
    padding-top: 11px;
    border-top: 1px solid #2A2620;
    font-size: var(--fs-xs);
    line-height: 1.9;
    color: #8A8172;
}
.uni-note b { color: #C9C1AF; }

/* 宇宙图切换页签（_universe_tabs.html）：/events/ 与 /dossier/map/ 共用的门面，
   两页在读者眼里是「一张宇宙图的两个视图」。合并理由与不合画布的理由都在模板注释里。 */
.uni-tabs {
    display: flex;
    align-items: stretch;
    gap: var(--sp-2, 8px);
    margin: 0 0 var(--sp-4, 20px);
    flex-wrap: wrap;
}
.uni-tabs-name {
    align-self: center;
    font-size: var(--fs-xs);
    font-weight: 700;
    letter-spacing: .12em;
    color: var(--ink-3);
}
.uni-tab {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 8px 16px;
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: var(--r);
    text-decoration: none;
    color: var(--ink-2);
    font-size: var(--fs-sm);
    font-weight: 700;
    /* 移动端可点目标 ≥44px（#171 的红线）：两行文字 + 上下 8px 实测 46px */
    min-height: 44px;
    justify-content: center;
}
.uni-tab small { font-size: var(--fs-xs); font-weight: 500; color: var(--ink-3); }
.uni-tab:hover { border-color: var(--gold); }
.uni-tab.is-on {
    border-color: var(--gold);
    background: var(--gold-light);
    color: var(--gold-text);
}
.uni-tab.is-on small { color: var(--gold-text); }

/* 新闻营养成分表（#410）：详情页头部五格。
   像食品包装背面那张表——克制、等宽、不喧宾夺主。
   每格是 <details>，点开看依据；不用 JS。 */
.nutri {
    margin: var(--sp-4, 20px) 0;
    border: 1px solid var(--line);
    border-radius: var(--r);
    background: var(--card);
    overflow: hidden;
}
.nutri-h {
    padding: 10px 16px;
    border-bottom: 2px solid var(--ink);
    display: flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
}
.nutri-h b { font-family: var(--font-serif); font-size: 15px; letter-spacing: .06em; }
.nutri-h span { font-size: var(--fs-xs); color: var(--ink-3); }

.nutri-row { display: grid; grid-template-columns: repeat(5, 1fr); }
@media (max-width: 720px) { .nutri-row { grid-template-columns: repeat(2, 1fr); } }

.nutri-cell { border-right: 1px solid var(--line-2, var(--line)); }
.nutri-cell:last-child { border-right: none; }
@media (max-width: 720px) {
    .nutri-cell { border-right: 1px solid var(--line-2, var(--line)); border-bottom: 1px solid var(--line-2, var(--line)); }
    .nutri-cell:nth-child(2n) { border-right: none; }
}
.nutri-cell > summary {
    list-style: none;
    cursor: pointer;
    padding: 12px 14px;
    display: block;
    transition: background .18s;
}
.nutri-cell > summary::-webkit-details-marker { display: none; }
.nutri-cell > summary:hover { background: var(--bg); }
.nc-label { display: block; font-size: var(--fs-xs); color: var(--ink-3); }
.nc-value {
    display: block;
    margin-top: 5px;
    font-family: var(--font-serif);
    font-size: 24px;
    font-weight: 700;
    line-height: 1.1;
    color: var(--ink);
}
.nc-value i { font-style: normal; font-size: 11px; font-weight: 400; color: var(--ink-3); margin-left: 3px; }
.nutri-cell.nc-empty .nc-value { color: var(--ink-3); }
.nutri-cell[open] > summary { background: var(--bg); }

/* 展开的那一格**占满整行**，其余格顺次换行。
   试过 `display:contents` 把 summary 和 body 变成网格项——那会让展开的格
   只占第一列、正文挤成面条，其余四格被顶得老高（实测截图确认）。
   现在是最朴素的手风琴：一个 grid item 变整行宽，布局可预测。 */
.nutri-cell[open] { grid-column: 1 / -1; border-right: none; }
.nc-body {
    padding: 12px 16px 14px;
    border-top: 1px dashed var(--line);
    background: var(--bg);
}
.nc-note { font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.85; }
.nc-none { margin-top: 6px; font-size: var(--fs-xs); color: var(--ink-3); }
.nc-ev { margin-top: 9px; display: flex; flex-wrap: wrap; gap: 6px; }
.nc-chip {
    font-size: var(--fs-xs);
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: 99px;
    padding: 2px 10px;
    color: var(--ink-2);
}
.nc-more { margin-top: 9px; font-size: var(--fs-xs); color: var(--ink-3); }
.nc-more b { color: var(--ink-2); }
.nc-more a { color: var(--gold-text); }

/* 证据锚点（#586）：跟在数字后面的一个小记号，点开看口径。
   **不包住数字**——包住会拆断页面上的连续文本，也没法用在本身是链接的数字上
   （`<details>` 不许出现在 `<a>` 内，解析器会重构 DOM）。做成记号就能摆在 `</a>` 后面。
   纯 <details>，不依赖 JS。 */
.ea { display: inline-block; position: relative; vertical-align: super; }
.ea > summary {
    list-style: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 13px;
    height: 13px;
    margin-left: 3px;
    border-radius: 50%;
    border: 1px solid var(--line);
    background: var(--card);
    color: var(--ink-3);
    font-size: 9px;
    font-weight: 700;
    font-family: var(--font-body);
    line-height: 1;
    cursor: help;
    transition: color .18s, border-color .18s;
}
.ea > summary::-webkit-details-marker { display: none; }
.ea > summary:hover,
.ea[open] > summary { color: var(--gold-text); border-color: var(--gold); }

.ea-pop {
    position: absolute;
    z-index: 40;
    top: calc(100% + 6px);
    left: 50%;
    transform: translateX(-50%);
    width: max(240px, 19rem);
    max-width: 78vw;
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: var(--r);
    box-shadow: 0 12px 32px rgba(30,28,24,.14);
    padding: 12px 14px;
    text-align: left;
    /* 记号常挂在大号衬线数字旁，弹层要回到正文字号与常规字重 */
    font-family: var(--font-body);
    font-size: var(--fs-xs);
    font-weight: 400;
    vertical-align: baseline;
}
.ea-t { display: block; font-size: var(--fs-xs); letter-spacing: .1em; color: var(--gold-text); }
.ea-n { margin-top: 6px; line-height: 1.85; color: var(--ink-2); }
.ea-go { display: inline-block; margin-top: 9px; color: var(--gold-text); }

@media (max-width: 720px) {
    /* 窄屏定死在视口里，否则贴着右边的记号会把弹层顶出屏幕 */
    .ea-pop { position: fixed; left: 12px; right: 12px; top: auto; width: auto; max-width: none; transform: none; }
}


/* ---- 跨文档 View Transitions（#599 T0-1）----
   列表卡封面 → 详情页头图连续过渡（MPA 原生，Ameba News 同款路数）。
   不支持的浏览器（Firefox 跨文档暂无）整段被忽略，自动退化为普通跳转——
   所以这里只做增强，不许有任何功能依赖它。
   列表侧的 view-transition-name 不写在 CSS 里：一页几十张卡，
   同名元素超过一个整个过渡会被浏览器取消，只能在点击那一刻由 JS 点名（interactions.js）。 */
@view-transition { navigation: auto; }

.article-hero-img img { view-transition-name: news-hero; }
/* 标题配对：头图常在折叠线下（实测 /news/13 在 1069px），封面对飞会消失在画面底部；
   标题永远在首屏，是更稳的锚点。两对同时存在时浏览器各自动画，互不干扰。 */
.vt-news-title { view-transition-name: news-title; }

/* 缩略图和头图宽高比不同，默认动画会把图拉扁；按官方配方裁切代替拉伸 */
::view-transition-old(news-hero),
::view-transition-new(news-hero) {
    height: 100%;
    object-fit: cover;
}

@media (prefers-reduced-motion: reduce) {
    ::view-transition-group(*),
    ::view-transition-old(*),
    ::view-transition-new(*) { animation: none !important; }
}

/* ==========================================================================
   §48 页头解剖（方案② 3.1，2026-08-23）
   一级页面共用的开场三件套：大标题 + 一句人话 + （有真数才摆的）一个数。
   车型库的 patent-head 是它的美术加强版，不替换；问车市的 ask-head 同形，
   后续合并到这里。数字没有现成出处时宁可空着，不为了齐三件套编一个。
   ========================================================================== */
.page-head { margin: var(--sp-2) 0 var(--sp-6); }
.page-head h1 {
    font-family: var(--font-serif);
    font-size: var(--fs-3xl);
    font-weight: 700;
    line-height: 1.2;
    letter-spacing: .04em;
    color: var(--text);
    margin: 0 0 var(--sp-2);
}
.page-head .ph-tag {
    font-size: var(--fs-sm);
    font-weight: 400;
    color: var(--ink-3);
    letter-spacing: .1em;
    margin-left: var(--sp-2);
}
.page-head .ph-sub { font-size: var(--fs-base); color: var(--ink-2); line-height: 1.7; margin: 0; }
.page-head .ph-stat { margin-top: var(--sp-2); font-size: var(--fs-sm); color: var(--ink-3); }
.page-head .ph-stat b { font-family: var(--font-serif); font-size: var(--fs-lg); color: var(--gold-text); }
@media (max-width: 640px) { .page-head h1 { font-size: var(--fs-2xl); } }

/* 算钱页空态示例帽：#645 拆掉（开屏改为真算的默认账），样式随模板一起下线 */

/* 车型库「最近 30 天车市动了什么」条（方案② 3.2） */
.wm-card { margin-bottom: 14px; padding: 14px 16px; }
.wm-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-2); }
.wm-head b { font-size: var(--fs-sm); color: var(--text); }
.wm-head span { font-size: var(--fs-xs); color: var(--ink-3); }
.wm-row { display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-6); }
.wm-item { text-decoration: none; color: var(--ink-2); font-size: var(--fs-sm); line-height: 1.6; }
.wm-item > b { font-family: var(--font-serif); font-size: var(--fs-lg); color: var(--gold-text); margin-right: 2px; }
.wm-item span { display: block; font-size: var(--fs-xs); color: var(--ink-3); }
.wm-item:hover span { color: var(--gold-text); }
/* 召回是「少数需要注意的」，数字用状态红；正常动向保持金 */
.wm-recall > b { color: var(--q-bad); }
