/* ============================================================
   AutoNews · 监督层工艺套件 — supervision.css   (#118)

   一句话设计律：**越接近判断，越克制。**
   克制管的是动效频率与情绪，不管工艺密度——
   公证处不装迪斯科灯球，但它的纸、印泥、火漆是最好的。
   所以这里全是「静态奢侈」：噪点纸纹、凸版压印、火漆光照、盖章物理，
   页面静止时就已经贵，不靠动起来才好看。

   只在监督层页面（封存馆/自验/成绩单/媒体档案/承诺账本）引入，
   不进 main.css——主站是「买车决策台」，两套气质靠 token 同源缝合，不靠混用。

   性能三档：html[data-perf] = high | mid | low
   由 interactions.js 测帧率自动降档；降的是动，不是质感（见 §9）。
   ============================================================ */

/* 判定芯片（.sv-verdict）拆去 verdict-chip.css：监督层之外的页面也要挂这枚芯片，
   但**不能**连带吃下本文件那条全局的 `@media print { .site-footer{display:none} }`
   （见 §11）。拆出去 + 这里 @import 接回来，芯片样式全站仍只有一份定义。
   @import 必须写在所有规则之前，别往下挪。 */
@import url("verdict-chip.818b6e27d0c9.css");

/* ---------- 0. 监督层专属 token（全部由 main.css 的色板派生，保证同源） ---------- */
.sv-scope {
    --sv-ink: var(--ink);
    --sv-fiber: rgba(30,28,24,0.035);      /* 纸纤维噪点浓度 */
    --sv-emboss-hi: rgba(255,255,255,0.85); /* 凸版高光 */
    --sv-emboss-lo: rgba(30,28,24,0.22);    /* 凸版投影 */
    --sv-wax: #8E2F24;                      /* 火漆红：比 --red 更深更饱和，蜡质感 */
    --sv-wax-dark: #5E1C15;
    --sv-rule: rgba(30,28,24,0.14);         /* 账本横线 */
    --sv-punch: var(--paper);               /* 装订孔颜色 = 底色（打穿的感觉） */
}
[data-theme="dark"] .sv-scope {
    /* 暗色不是「把纸调暗」，是**换了个房间**：档案室里一盏顶灯打在纸上。
       所以噪点更亮（灰尘在光里）、凸版高光更弱（侧光而非正光）。 */
    --sv-fiber: rgba(232,226,214,0.045);
    --sv-emboss-hi: rgba(255,255,255,0.10);
    --sv-emboss-lo: rgba(0,0,0,0.55);
    --sv-wax: #B8453A;
    --sv-wax-dark: #7A241C;
    --sv-rule: rgba(232,226,214,0.12);
}

/* ============================================================
   1. 纸感底座 — .sv-paper
   两层噪点叠加：粗纤维（feTurbulence baseFrequency 0.9）+ 细颗粒（0.65），
   频率错开才不会看出重复的方块。SVG 走 data-uri，零请求。
   ============================================================ */
.sv-paper {
    position: relative;
    background-color: var(--card);
    background-image:
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23a)' opacity='0.5'/%3E%3C/svg%3E"),
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='90' height='90'%3E%3Cfilter id='b'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='90' height='90' filter='url(%23b)' opacity='0.35'/%3E%3C/svg%3E");
    background-blend-mode: multiply;
    border: 1px solid var(--line);
    border-radius: var(--r-sm);
    box-shadow:
        0 1px 0 var(--sv-emboss-hi) inset,
        0 12px 28px -18px rgba(0,0,0,0.35);
}
/* 噪点用伪元素上色，避免 background-blend-mode 在暗色下把卡片压黑 */
.sv-paper::before {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: var(--sv-fiber);
    mix-blend-mode: overlay;
    pointer-events: none;
}

/* 骑缝装订孔：左侧一列打穿的圆孔，档案册的物理暗示。
   用 radial-gradient 画，不占 DOM。 */
.sv-paper--bound { padding-left: 46px; }
.sv-paper--bound::after {
    content: '';
    position: absolute;
    left: 18px; top: 26px; bottom: 26px;
    width: 10px;
    background-image: radial-gradient(circle at 5px 5px,
        var(--sv-punch) 0 4.2px,
        rgba(30,28,24,0.18) 4.2px 5px,
        transparent 5px);
    background-size: 10px 34px;
    background-repeat: repeat-y;
    pointer-events: none;
}

/* 档案册侧脊：右侧一条压深的书脊，用于媒体档案页 */
.sv-paper--spine::after {
    content: '';
    position: absolute;
    right: 0; top: 0; bottom: 0;
    width: 14px;
    border-radius: 0 var(--r-sm) var(--r-sm) 0;
    background: linear-gradient(90deg,
        rgba(30,28,24,0.10) 0%, rgba(30,28,24,0.02) 45%, rgba(30,28,24,0.14) 100%);
    pointer-events: none;
}

/* 媒体档案反事实开关（#624）：继续用编辑部黄纸/油墨体系，不另造一套仪表盘。 */
.sv-counterfactual {
  border-top: 4px solid var(--gold);
  overflow: hidden;
}

.sv-counterfactual h2 {
  margin: var(--sp-2) 0 var(--sp-3);
  font-family: var(--font-serif);
  font-size: var(--fs-xl);
}

.sv-cf-switch {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 54px minmax(0, 1fr);
  align-items: center;
  gap: var(--sp-3);
  max-width: 440px;
  margin: var(--sp-5) auto;
  font-weight: 800;
  text-align: center;
  cursor: pointer;
}

.sv-cf-switch input {
  appearance: none;
  width: 54px;
  height: 30px;
  margin: 0;
  border: 2px solid var(--ink-2);
  border-radius: 999px;
  background: var(--paper-2);
  cursor: pointer;
  transition: background .16s ease;
}

.sv-cf-switch input::after {
  content: '';
  display: block;
  width: 20px;
  height: 20px;
  margin: 3px;
  border-radius: 50%;
  background: var(--ink-2);
  transition: transform .16s ease, background .16s ease;
}

.sv-cf-switch input:checked {
  background: var(--gold);
}

.sv-cf-switch input:checked::after {
  transform: translateX(24px);
  background: var(--ink);
}

.sv-cf-switch input:focus-visible {
  outline: 3px solid var(--gold);
  outline-offset: 3px;
}

.sv-cf-panel {
  position: relative;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-4);
  padding: var(--sp-5);
  border: 1px solid var(--line);
  background: var(--gold-wash);
  text-align: center;
}

.sv-cf-panel[hidden],
.sv-cf-record [hidden] {
  display: none;
}

.sv-cf-panel .sv-far {
  font-size: clamp(30px, 5vw, 52px);
}

.sv-cf-excluded {
  grid-column: 1 / -1;
  padding-top: var(--sp-3);
  border-top: 1px dashed var(--line);
}

/* 「分涨了名次反而掉」的那句解释。跟剔除篇数同属一栏，接在它下面，
   不再画一条虚线——两句是同一段说明，不是两块。 */
.sv-cf-note {
  grid-column: 1 / -1;
  padding-top: var(--sp-2);
  line-height: 1.6;
}

.sv-cf-basis {
  margin-top: var(--sp-4);
  border-top: 1px solid var(--line);
  padding-top: var(--sp-4);
}

.sv-cf-basis summary {
  font-weight: 800;
  cursor: pointer;
}

.sv-cf-records {
  display: grid;
  gap: var(--sp-2);
  margin: var(--sp-3) 0 0;
  padding: 0;
  list-style: none;
}

.sv-cf-record {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-2) 0;
  border-bottom: 1px dotted var(--line);
  min-width: 0;
}

.sv-cf-record a {
  min-width: 0;
  color: inherit;
  overflow-wrap: anywhere;
}

@media (max-width: 520px) {
  /* 390px 下顶栏本身已到收缩极限；档案页保留汉堡入口，登录入口在抽屉内。 */
  body.page-media-dossier .auth-links {
    display: none;
  }

  .sv-cf-panel {
    grid-template-columns: 1fr;
    padding: var(--sp-4);
  }

  .sv-cf-excluded,
  .sv-cf-note {
    grid-column: auto;
  }

  .sv-cf-record {
    grid-template-columns: minmax(0, 1fr) auto;
  }

  .sv-cf-record .sv-verdict {
    grid-column: 1 / -1;
    justify-self: start;
  }
}

/* ============================================================
   2. 凸版排印 — .sv-letterpress
   两道 text-shadow（上高光 / 下投影）模拟活字压进纸里的凹陷。
   数字一律 tabular-nums：哈希、置信度、日期在列表里必须对齐成一根柱子，
   等宽是「这是账目不是文案」的第一眼信号。
   ============================================================ */
.sv-letterpress {
    color: var(--sv-ink);
    text-shadow:
        0 1px 0 var(--sv-emboss-hi),
        0 -1px 0 var(--sv-emboss-lo);
}
.sv-mono,
.sv-hash,
.sv-num {
    font-family: var(--font-display);
    font-variant-numeric: tabular-nums;
    font-feature-settings: 'tnum' 1, 'lnum' 1;
    letter-spacing: 0.02em;
}
.sv-hash {
    font-family: ui-monospace, 'SF Mono', 'Cascadia Mono', Menlo, Consolas, monospace;
    font-size: var(--fs-xs);
    word-break: break-all;
    color: var(--ink-2);
    letter-spacing: 0.04em;
}
/* 哈希前 8 位加重：扫一眼比对时人眼只看得动前 8 位 */
.sv-hash b { color: var(--sv-ink); font-weight: 700; }

/* 雕版登记证抬头 */
.sv-titleplate {
    text-align: center;
    padding: var(--sp-6) var(--sp-4) var(--sp-4);
    border-bottom: 3px double var(--sv-rule);
}
.sv-titleplate h1,
.sv-titleplate h2 {
    font-family: var(--font-serif);
    letter-spacing: 0.32em;
    text-indent: 0.32em;         /* 抵消末字右侧多出来的字距，视觉才真居中 */
    font-weight: 700;
}
.sv-titleplate .sv-sub {
    margin-top: var(--sp-2);
    font-size: var(--fs-xs);
    color: var(--ink-3);
    letter-spacing: 0.18em;
    text-indent: 0.18em;
}

/* 账本横线：给承诺账本/预测列表垫的横格 */
.sv-ruled > * { border-bottom: 1px solid var(--sv-rule); }
.sv-ruled > *:last-child { border-bottom: 0; }

/* ============================================================
   3. 双行制 — .sv-duo
   大字说人话（评委/用户 3 秒懂），小字给学术口径（懂行的人验得动）。
   这是「显得有难度」和「看得懂」唯一不打架的解法：不是二选一，是叠一起。
   ============================================================ */
.sv-duo { display: flex; flex-direction: column; gap: 2px; }
.sv-duo .sv-plain {
    font-size: var(--fs-lg);
    font-family: var(--font-serif);
    color: var(--sv-ink);
    line-height: 1.5;
}
.sv-duo .sv-acad {
    font-size: var(--fs-xs);
    color: var(--ink-3);
    line-height: 1.6;
}

/* ============================================================
   4. 判定芯片 — .sv-verdict  →  已移到 verdict-chip.css（文件顶部 @import 接回）
   非监督层页面（车型时间线的承诺兑现区）只拉那一个文件，不吃本文件的打印规则。
   ============================================================ */

/* ============================================================
   5. 火漆封缄 — .sv-wax
   SVG feDiffuseLighting + feSpecularLighting 实时打光（滤镜定义见
   templates/_supervision_defs.html）。降级链：滤镜 → 径向渐变假高光。
   ============================================================ */
.sv-wax {
    position: relative;
    width: 92px; height: 92px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    /* 兜底外观：即使 SVG 滤镜不支持，也是一枚有立体感的漆封 */
    background:
        radial-gradient(circle at 34% 30%, rgba(255,255,255,0.42) 0%, transparent 38%),
        radial-gradient(circle at 68% 76%, var(--sv-wax-dark) 0%, transparent 62%),
        var(--sv-wax);
    color: #F3E2C8;
    font-family: var(--font-serif);
    font-size: var(--fs-sm);
    font-weight: 700;
    letter-spacing: 0.1em;
    text-indent: 0.1em;
    text-shadow: 0 1px 2px rgba(0,0,0,0.5);
    /* 蜡边不规则：clip-path 做一圈微起伏，圆到毫米级反而假 */
    filter: drop-shadow(0 6px 10px rgba(0,0,0,0.35));
}
.sv-wax::after {
    content: '';
    position: absolute;
    inset: 7px;
    border-radius: 50%;
    border: 1px dashed rgba(0,0,0,0.28);
    pointer-events: none;
}
/* 高性能档才启用真滤镜（每帧重算光照，中低档直接吃掉帧率） */
html[data-perf="high"] .sv-wax--lit { filter: url(#sv-wax-light) drop-shadow(0 6px 10px rgba(0,0,0,0.35)); }

/* 已拆封：漆封裂开。用 clip-path 切两半 + 位移，比贴图省事且能动。 */
.sv-wax--broken { --sv-crack: 1; }
.sv-wax--broken::before {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: linear-gradient(100deg, transparent 48%, rgba(0,0,0,0.55) 49%, rgba(0,0,0,0.55) 51%, transparent 52%);
    pointer-events: none;
}

/* 防剧透封条 — .sv-spoiler
   火漆从「盖住正文」改成「盖住的是指纹已固定」：正文本来就公开，
   折叠只防剧透，读者亲手撕开。原生 <details>，零 JS。 */
.sv-spoiler > summary {
    list-style: none;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 10px;
    user-select: none;
    -webkit-user-select: none;
}
.sv-spoiler > summary::-webkit-details-marker { display: none; }
.sv-wax--mini {
    width: 44px; height: 44px;
    font-size: 12px;
    letter-spacing: 0;
    text-indent: 0;
    flex: none;
}
.sv-wax--mini::after { inset: 4px; }
.sv-spoiler-hint {
    font-size: var(--fs-xs, 12px);
    color: var(--ink-3, #6b6558);
    letter-spacing: 0.06em;
}
/* 撕开：蜡裂开（同 .sv-wax--broken 的裂纹），提示语换成开态那句 */
.sv-spoiler[open] > summary .sv-wax::before {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: linear-gradient(100deg, transparent 48%, rgba(0,0,0,0.55) 49%, rgba(0,0,0,0.55) 51%, transparent 52%);
    pointer-events: none;
}
.sv-spoiler-hint--open { display: none; }
.sv-spoiler[open] > summary .sv-spoiler-hint--closed { display: none; }
.sv-spoiler[open] > summary .sv-spoiler-hint--open { display: inline; }

/* ============================================================
   6. 盖章物理 — .sv-stamp
   砸下 → 过冲 → 回弹，落点带 ±2° 随机（--sv-tilt 由 JS 写入）。
   章不是渐显出来的，是**砸**上去的：这一下的重量感就是「已判定，不可改」。
   GSAP 在时走 GSAP，不在时这条 CSS 动画就是完整实现，不是降级品。
   ============================================================ */
.sv-stamp {
    display: inline-block;
    padding: 6px 14px;
    border: 3px solid var(--sv-wax);
    border-radius: 4px;
    color: var(--sv-wax);
    font-family: var(--font-serif);
    font-weight: 900;
    font-size: var(--fs-lg);
    letter-spacing: 0.22em;
    text-indent: 0.22em;
    opacity: 0.88;
    transform: rotate(var(--sv-tilt, -3deg));
    /* 油墨不匀：蒙一层噪点当作压不实的地方 */
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='60'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='4'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.6 1.05'/%3E%3C/filter%3E%3Crect width='120' height='60' filter='url(%23c)'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='60'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='4'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.6 1.05'/%3E%3C/filter%3E%3Crect width='120' height='60' filter='url(%23c)'/%3E%3C/svg%3E");
}
.sv-stamp--drop { animation: sv-stamp-drop 0.42s cubic-bezier(0.2,1.6,0.4,1) both; }
@keyframes sv-stamp-drop {
    0%   { opacity: 0; transform: rotate(var(--sv-tilt,-3deg)) scale(2.6) translateY(-24px); }
    62%  { opacity: 0.95; transform: rotate(var(--sv-tilt,-3deg)) scale(0.92) translateY(0); }
    100% { opacity: 0.88; transform: rotate(var(--sv-tilt,-3deg)) scale(1) translateY(0); }
}

/* ============================================================
   7. 翻牌钟 — .sv-flap
   纯 CSS 3D，**只进不退**：翻牌只有一个方向，因为里程表不可回拨。
   到期倒计时用它，一眼就知道这东西在跟时间较劲。
   ============================================================ */
.sv-flapclock { display: inline-flex; gap: 4px; align-items: flex-end; }
.sv-flapclock .sv-unit { font-size: var(--fs-xs); color: var(--ink-3); margin: 0 6px 4px 2px; }
.sv-flap {
    position: relative;
    width: 30px; height: 42px;
    perspective: 200px;
    background: var(--invert-bg);
    color: var(--on-invert);
    border-radius: 3px;
    font-family: var(--font-display);
    font-variant-numeric: tabular-nums;
    font-size: 26px;
    font-weight: 700;
    display: grid;
    place-items: center;
    box-shadow: inset 0 0 0 1px rgba(0,0,0,0.35);
    overflow: hidden;
}
/* 中缝：真翻牌钟的上下两半之间那条线 */
.sv-flap::after {
    content: '';
    position: absolute;
    left: 0; right: 0; top: 50%;
    height: 1px;
    background: rgba(0,0,0,0.55);
    z-index: 2;
}
.sv-flap .sv-leaf {
    position: absolute;
    inset: 0 0 50% 0;
    display: grid;
    place-items: end center;
    line-height: 42px;
    background: inherit;
    transform-origin: bottom center;
    backface-visibility: hidden;
    z-index: 3;
}
.sv-flap.flipping .sv-leaf { animation: sv-flip 0.34s ease-in both; }
@keyframes sv-flip {
    from { transform: rotateX(0deg); }
    to   { transform: rotateX(-90deg); }
}

/* ============================================================
   8. 感知分级 — 远 / 中 / 微距
   评委 3 米外看得到的只有「远层」；工艺细节全在微距层。
   远层必须自己撑得起画面，不能指望别人凑近。
   ============================================================ */
.sv-far   { font-size: clamp(40px, 7vw, 76px); font-family: var(--font-display); font-weight: 900;
            line-height: 1; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.sv-mid   { font-size: var(--fs-lg); font-family: var(--font-serif); }
.sv-micro { font-size: var(--fs-xs); color: var(--ink-3); }

/* 空态编年史：禁止出现「暂无数据」。没数据时讲这块地方将来会长出什么。 */
.sv-empty {
    padding: var(--sp-12) var(--sp-6);
    text-align: center;
    border: 1px dashed var(--line);
    border-radius: var(--r-sm);
    color: var(--ink-3);
}
.sv-empty .sv-empty-title {
    font-family: var(--font-serif);
    font-size: var(--fs-lg);
    color: var(--ink-2);
    margin-bottom: var(--sp-2);
}

/* ============================================================
   9. 性能降级三档 —— 降动不降质感
   low 档砍的是「每帧要算的东西」（滤镜光照、3D、模糊），
   噪点纸纹/凸版/等宽这些**静态**工艺一个都不砍——静止时的质感是白拿的。
   ============================================================ */
html[data-perf="low"] .sv-wax--lit { filter: drop-shadow(0 4px 8px rgba(0,0,0,0.3)); }
html[data-perf="low"] .sv-flap { perspective: none; }
html[data-perf="low"] .sv-flap.flipping .sv-leaf { animation: none; }
html[data-perf="low"] .sv-stamp--drop { animation-duration: 0.2s; }
html[data-perf="low"] .sv-paper { box-shadow: 0 1px 0 var(--sv-emboss-hi) inset; }

@media (prefers-reduced-motion: reduce) {
    .sv-stamp--drop,
    .sv-flap.flipping .sv-leaf { animation: none !important; }
    .sv-stamp--drop { opacity: 0.88; }
}

/* ============================================================
   10. 移动端 —— hover 全量映射到 tap
   工艺细节在手机上只会更近，所以不缩水；缩的是尺寸不是密度。
   ============================================================ */
@media (max-width: 768px) {
    .sv-wax { width: 72px; height: 72px; font-size: var(--fs-xs); }
    .sv-paper--bound { padding-left: 34px; }
    .sv-paper--bound::after { left: 12px; }
    .sv-flap { width: 26px; height: 36px; font-size: 22px; }
    .sv-flap .sv-leaf { line-height: 36px; }
    .sv-titleplate h1, .sv-titleplate h2 { letter-spacing: 0.18em; text-indent: 0.18em; }
}

/* ============================================================
   11. 打印 —— 封存件本来就该能打出来归档
   评委手上多一张纸质凭证，比屏幕上多一个动效有用。
   ============================================================ */
@page { size: A4; margin: 16mm 14mm 18mm; }

@media print {
    /* 屏幕上的动效/材质在纸上一律不成立，全部还原成墨与线 */
    .sv-paper { box-shadow: none; border: 1px solid #999; background-image: none; }
    .sv-paper::before { display: none; }
    .sv-wax { filter: none; }
    .sv-flap { background: #fff; color: #000; box-shadow: inset 0 0 0 1px #000; }
    .sv-hash { font-size: 9px; }
    .sv-noprint,
    .main-header, .mobile-tab-bar, .mobile-menu, .site-footer,
    .ticker-strip, .back-to-top { display: none !important; }
    .sv-scope { max-width: none !important; }
    /* 凸版压印在纸上会糊成灰边，印刷品本身就是压印，不用模拟 */
    .sv-letterpress { text-shadow: none !important; }
    /* 一条预测不许被分页切成两半——切开的封存件不能当凭证 */
    .sv-ruled > li, .sv-ruled > div { break-inside: avoid; page-break-inside: avoid; }

    /* 递到评委手里的实体道具：页眉档案编号、页脚回验地址。
       纸上没有超链接，所以 URL 必须**印出来**，否则「你可以自己验」在纸上是空话。 */
    .sv-titleplate::after {
        content: 'AutoNews · 媒体监督档案　' attr(data-archive-no);
        display: block; margin-top: 6px;
        font-family: ui-monospace, Menlo, Consolas, monospace;
        font-size: 9px; letter-spacing: .08em; color: #666;
    }
    .sv-scope::after {
        content: '本页可复算：' attr(data-verify-url)
                 '　口径与命令行脚本 scripts/seal_ledger.py 一致';
        display: block; margin-top: 10mm; padding-top: 3mm;
        border-top: 1px solid #999;
        font-family: ui-monospace, Menlo, Consolas, monospace;
        font-size: 9px; color: #444;
    }
    /* 打印时把链接的真实地址跟在文字后面——纸上点不动 */
    .sv-scope a[href^="http"]::after {
        content: ' <' attr(href) '>';
        font-size: 8px; color: #666; word-break: break-all;
    }
}

/* ------------ 图表的文字版表格（#127-3 三通道冗余的第三通道） ------------
   canvas 图读屏读不了、不加载就空白、打印时纸上没有。所以表格是本体不是附赠。
   屏幕上收在图下方当次要信息，打印时它才是唯一还在的那个。 */
.sv-datatable {
    width: 100%; margin-top: var(--sp-4);
    border-collapse: collapse;
    font-size: var(--fs-xs); color: var(--ink-2);
}
.sv-datatable caption { text-align: left; padding-bottom: var(--sp-2); }
.sv-datatable th, .sv-datatable td {
    padding: 6px 10px; text-align: left;
    border-bottom: 1px solid var(--sv-rule);
}
.sv-datatable th {
    font-weight: 700; color: var(--ink-3);
    letter-spacing: .06em; white-space: nowrap;
}
.sv-datatable td.sv-num { text-align: right; }

/* ============================================================
   12. 长辈模式接监督层（#127-4）
   main.css 的 html.elder 只放大了字号 token，但监督层有两处它管不到：
   学术小字行（.sv-acad）和噪点纸纹——一个是信息过载，一个是视觉噪音。
   老人家要的是「把话说清楚」，不是「把话说漂亮」。
   ============================================================ */
html.elder .sv-scope { --sv-fiber: transparent; }
html.elder .sv-paper { background-image: none; }
html.elder .sv-paper::before { display: none; }
/* 双行制在长辈模式下只留人话行：学术行是给评委看的第二层，不是必需信息 */
html.elder .sv-acad { display: none; }
html.elder .sv-plain {
    font-family: var(--font-serif);
    font-size: var(--fs-lg);
    line-height: 2.05;
    color: var(--ink);
}
/* 凸版压印靠的是 1px 明暗差，放大字号后会变成脏边；AAA 对比度优先于工艺 */
html.elder .sv-letterpress { text-shadow: none; }
html.elder .sv-micro { font-size: var(--fs-sm); color: var(--ink-3); }
/* 翻牌钟改静态大数字：翻页动画对老花眼是负担，数字本身才是信息 */
html.elder .sv-flap.flipping .sv-leaf { animation: none; }
html.elder .sv-flap .sv-leaf { display: none; }
html.elder .sv-flap { perspective: none; width: 44px; height: 62px; font-size: 40px; }
html.elder .sv-flap::after { display: none; }   /* 中缝线：不翻了就不该有折痕 */

/* ── 现场核验（#450）：五道检查 + 公开镜像二维码 ─────────────────────
   这一块要在投影上隔几米看得清，所以行高、字号都比页面其它地方大一档；
   状态颜色不单靠颜色区分（✓/✕/— 三个字形先把状态说清），色盲和黑白投影都不丢信息。 */
.sv-checks { border: 1px solid var(--line); border-radius: var(--r-sm); overflow: hidden; }
.sv-check { display: flex; gap: 14px; padding: 12px 16px; border-bottom: 1px solid var(--line); }
.sv-check:last-child { border-bottom: none; }
.sv-check-mark { flex: 0 0 22px; font-size: 20px; line-height: 1.4; text-align: center; font-weight: 700; }
.sv-check.is-ok .sv-check-mark { color: #1e6b45; }
.sv-check.is-bad .sv-check-mark { color: #a03024; }
.sv-check.is-wait .sv-check-mark { color: var(--ink-3, #8a8378); }
.sv-check.is-bad { background: rgba(192, 57, 43, .05); }
.sv-check.is-wait { background: var(--paper); }
.sv-check-body { flex: 1; min-width: 0; }
.sv-check-name { font-weight: 600; font-size: var(--fs-sm); margin-bottom: 3px; }
/* 哈希串会很长：让它自己换行，别把整页撑出横向滚动 */
.sv-check-detail { font-size: var(--fs-xs); color: var(--text-meta); line-height: 1.8; word-break: break-all; }

.sv-selfcheck-foot { display: flex; gap: var(--sp-5); align-items: center;
                     justify-content: space-between; flex-wrap: wrap; margin-top: var(--sp-4); }
.sv-qr { margin: 0; text-align: center; flex: 0 0 auto; }
.sv-qr svg { width: 132px; height: 132px; display: block; background: #fff; padding: 6px; border-radius: var(--r-sm); }
.sv-qr figcaption { font-size: var(--fs-xs); color: var(--text-meta); margin-top: 6px; }

@media (max-width: 480px) {
    .sv-selfcheck-foot { flex-direction: column; align-items: flex-start; }
    .sv-qr { align-self: center; }
}
