/* ═══════════════════════════════════════════════════════════════════════════
   Case G — the transfer win: nine memory-clean ECB meetings

   跟 case-c.css / case-e.css 一样，这个文件**只装这一页自己的图示与版式**。
   共享的排版、节奏、导航、readout、calibration、页脚都留在 case.css 里，
   五个公开页共用一套视觉系统。

   自有构件一律使用 `g-` 前缀；解释卡、Calibration Lab、Honesty Box、
   审计收据、重来按钮与滚入动效已提升到 case.css，由公开案例共同使用，
   不在此处重复定义。

   ⚠️ 轨道、投影条、recall 网格里没有任何「猜出来的」宽度数字。
      位置全部由 CSS 变量（--bare / --packed / --out / --v）驱动，
      变量由 tools/gen 从 ecb_case_rows.csv 直接算出来写进 style 属性。
      换字号、换语言、换字体都不影响对位。
   ═════════════════════════════════════════════════════════════════════════ */

/* ⚠️ 这三条的取值一律跟 case-c.css 对齐，不许另发明一套。
   案例页的 hero 标题与配图宽度是**定好的规格**：C 用 clamp(34px,3.9vw,56px) /
   clamp(260px,32vw,500px)，G 照抄。case.css 的 :root 值（64px / 620px）是给
   没有覆盖的页面用的，E 就没覆盖。max-width:none 是因为标题自己用 <br> 断行。 */
.caseg{--hero-art-w:clamp(260px,32vw,500px);}
.caseg .case-hero h1{max-width:none;font-size:clamp(34px,3.9vw,56px);}
.caseg .block-head h2{max-width:none;}

/* 所有数据网格都允许子项收缩；解决真实的 min-content 撑宽问题，不通过
   裁切页面隐藏横向溢出。 */
.g-panel-summary,.g-rows,.g-row,.g-resolution,.g-res-block,.g-recall,
.g-grid-head,.g-grid-row,.g-grid-models,.g-grid-cells,.g-honesty{min-width:0;}
.g-panel-summary > div,.g-row > span,.g-grid-head > span,.g-grid-row > span,
.g-evidence .ev-line > *{min-width:0;}

/* ── 01 时间轨 ────────────────────────────────────────────────────────────
   列数不用在这里写：case.css 的 .rail 已经读 `--steps`，HTML 里写了 --steps:4。 */
.g-rail .rail-step p{max-width:34ch;}
.g-rail-note{margin-top:20px;border-top:1px solid var(--rule);}

/* ── 02 证据 ─────────────────────────────────────────────────────────────
   G 只拿到一条节选（C 有两条），所以这一格要自己撑起版面：
   引文 + 把引文里那四个投影数字画出来。画的是**引文本身**，不是新数据源。 */
.g-evidence .ev-line{grid-template-columns:138px minmax(0,1fr);}
.g-evidence .ev-kind{grid-row:1 / span 4;}
.g-evidence-meta{grid-column:2;grid-row:1;display:flex;justify-content:space-between;gap:24px;
  padding:18px 26px 12px;font-size:8px;line-height:1.4;letter-spacing:.12em;text-transform:uppercase;color:var(--fill);}
.g-evidence-meta a{display:inline-flex;align-items:center;gap:7px;color:inherit;text-decoration:none;border-bottom:1px solid var(--rule);}
.g-evidence-meta a:hover{color:var(--case-accent);border-bottom-color:var(--case-accent);}
/* 外链前的主题图标。规格逐字照 case-c.css 的 .c-source-ico（C 的 meta 同样是
   8px 字号）；图形用 case-e.css 那枚立柱建筑 —— ECB 与 Fed 同属央行声明，
   同一类来源就该是同一枚图标，不另画。 */
.g-source-ico{width:17px;height:17px;flex:0 0 auto;fill:none;stroke:currentColor;
  stroke-width:1.35;stroke-linecap:square;stroke-linejoin:miter;}
.g-quote{max-width:88ch;font-size:14px;font-weight:300;line-height:1.75;}
.g-evidence .g-quote{grid-column:2;grid-row:2;padding:0 26px;}
.g-proj{grid-column:2;grid-row:3;margin:22px 26px 0;padding:16px 0 0;border-top:1px solid var(--hair);}
.g-proj > span{display:block;margin-bottom:16px;font-size:8px;letter-spacing:.13em;text-transform:uppercase;color:var(--fill);}
/* 投影条。⚠️ 之前这里踩过一次：目标线的 bottom 写成 `calc(2/3*74px + 22px)`，
   那个 +22px 是猜「数字标签有多高」，结果线正好穿过 2.1 / 1.9 那几个数字。
   现在的写法根治了它 —— 柱子区 `.g-proj-plot` 是唯一的参照盒，
   柱高与目标线都用**同一个盒子的百分比**：
       柱高     = var(--v) / 3 * 100%
       目标线    = bottom: 2 / 3 * 100%
   于是「2.0 的目标线」与「--v:2.0 的柱顶」在数学上必然同高，
   换盒高、换字号、换字体都不会错位。数字标签移到柱子下面，线不可能碰到它。
   3.0 是刻度上限（引文里最大值 2.1 之上留一档），不是拍出来的数。 */
.g-proj-plot{position:relative;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  align-items:end;height:88px;}
.g-proj-plot > span{justify-self:center;display:flex;align-items:flex-end;height:100%;}
.g-proj-plot i{display:block;width:26px;height:calc(var(--v) / 3 * 100%);background:var(--fill);}
.g-proj-plot > span:last-of-type i{background:var(--case-accent);}
.g-proj-target{position:absolute;left:0;right:0;bottom:calc(2 / 3 * 100%);
  display:flex;align-items:center;gap:10px;font-size:8px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--fill);font-style:normal;pointer-events:none;
  /* ⚠️ 第二次踩这里：虚线画在这个 flex 盒的**垂直中心**（::before），
     而 bottom 定的是盒子**下边**，于是线心比目标高出「盒高的一半」（实测 6.4px）。
     translateY(50%) 相对的是自身高度，把线心正好拉回 bottom 处 ——
     换字号盒高会变，这个修正自动跟着变，不是又一个魔法数。
     校验：线心必须等于 --v:2.0 那根柱子的顶（verify_render 里有断言）。 */
  transform:translateY(50%);}
.g-proj-target::before{content:"";flex:1;height:0;border-top:1px dashed var(--fill);}
.g-proj-target span{flex:none;}
.g-proj-labels{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:10px;
  padding-top:10px;border-top:1px solid var(--hair);}
.g-proj-labels > span{display:flex;flex-direction:column;align-items:center;gap:5px;}
.g-proj-labels b{font-family:var(--font-display);font-size:15px;font-weight:300;font-variant-numeric:tabular-nums;}
.g-proj-labels small{font-size:8px;letter-spacing:.1em;color:var(--fill);}
.g-evidence .ev-line > p{grid-column:2;grid-row:4;padding:22px 26px 22px;}
/* 规格与 .c-redaction 逐字一致，一个属性都没多加。
   我曾以为长文案会把 ■■■ 压扁而加了 `flex:none` —— 实测 320–1440px 标记恒为
   22.9px，根本不需要。又一次「先量再改」的教训。 */
.g-redaction{display:flex;align-items:center;gap:12px;margin-top:12px;
  font-size:8px;line-height:1.4;letter-spacing:.12em;text-transform:uppercase;color:var(--fill);}
.g-redaction span{letter-spacing:.35em;color:var(--case-accent);}

/* ── 03 面板 ─────────────────────────────────────────────────────────────── */
.g-panel-summary{display:grid;grid-template-columns:minmax(0,1fr) 118px minmax(0,1fr);
  border:1px solid var(--edge);background:var(--paper);}
.g-panel-summary > div{min-height:150px;padding:24px 28px;}
.g-panel-summary > div:not(.is-arrow){display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto 1fr;align-items:end;gap:8px 24px;}
.g-panel-summary span{font-size:8px;line-height:1.3;letter-spacing:.14em;text-transform:uppercase;color:var(--fill);}
.g-panel-summary strong{grid-column:2;grid-row:1/3;font-family:var(--font-display);
  font-size:clamp(54px,6vw,78px);font-weight:220;line-height:.9;
  letter-spacing:var(--disp-tracking-md);font-variant-numeric:tabular-nums;}
.g-panel-summary p{align-self:start;max-width:28ch;font-size:11px;font-weight:300;line-height:1.5;color:var(--fill);}
.g-panel-summary .is-arrow{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  border-left:1px solid var(--rule);border-right:1px solid var(--rule);text-align:center;color:var(--fill);}
.g-panel-summary .is-arrow span{font-family:var(--font-display);font-size:32px;font-weight:200;color:var(--case-accent);}
.g-panel-summary .is-arrow b{font-size:7px;line-height:1.5;letter-spacing:.12em;text-transform:uppercase;}
.g-panel-summary .is-packed strong{color:var(--case-accent);}

.g-legend{display:flex;flex-wrap:wrap;align-items:center;gap:10px 26px;margin:30px 0 12px;
  font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--fill);}
.g-legend > span{display:inline-flex;align-items:center;gap:9px;}
.g-key{flex:none;width:10px;height:10px;border:1px solid var(--fill);background:var(--paper);}
.g-key.is-packed{border-color:var(--case-accent);background:var(--case-accent);}
.g-key.is-out{width:2px;height:15px;border:0;background:var(--on);}
.g-legend-note{text-transform:none;letter-spacing:.02em;font-size:10.5px;color:var(--fill);}

.g-rows{border:1px solid var(--edge);background:var(--paper);}
.g-row{display:grid;
  grid-template-columns:minmax(150px,.9fr) minmax(180px,1.5fr) minmax(96px,.62fr) minmax(96px,.62fr) minmax(112px,.72fr);
  align-items:stretch;border-bottom:1px solid var(--hair);}
.g-row:last-child{border-bottom:0;}
.g-row.is-head{min-height:42px;border-bottom:1px solid var(--rule);align-items:center;
  font-size:8px;letter-spacing:.13em;text-transform:uppercase;color:var(--fill);}
.g-row > span{display:flex;flex-direction:column;justify-content:center;gap:6px;
  padding:18px 20px;border-right:1px solid var(--hair);}
.g-row > span:last-child{border-right:0;}
.g-row.is-head > span{padding-top:0;padding-bottom:0;}
.g-cell-meeting b{font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;}
.g-cell-meeting small{font-size:7px;letter-spacing:.14em;text-transform:uppercase;color:var(--fill);}
.g-row.is-yes .g-cell-meeting small{color:var(--case-accent);}

/* 轨道。0 → 1，结果落在 --out（hold 行是 0%，加息行是 100%）。
   左右各留 12px，所以落在两端的标记不会被裁掉（点宽 13px，半宽 6.5 < 12）。 */
.g-cell-track{justify-content:center;}
.g-track{position:relative;height:26px;margin:0 12px;}
.g-track::before{content:"";position:absolute;left:0;right:0;top:50%;height:0;border-top:1px solid var(--hair);}
.g-seg{position:absolute;left:var(--seg-l);width:var(--seg-w);top:50%;height:0;
  border-top:2px solid var(--case-accent);transform:translateY(-50%);}
.g-row.is-lost .g-seg{border-top-style:dotted;border-top-color:var(--fill);}
.g-out{position:absolute;left:var(--out);top:50%;width:2px;height:20px;
  background:var(--on);transform:translate(-50%,-50%);}
.g-dot{position:absolute;top:50%;width:11px;height:11px;transform:translate(-50%,-50%);}
.g-dot.is-bare{left:var(--bare);border:1px solid var(--fill);background:var(--paper);}
.g-dot.is-packed{left:var(--packed);border:1px solid var(--case-accent);background:var(--case-accent);
  box-shadow:0 0 10px color-mix(in srgb,var(--case-accent) 50%,transparent);}
.g-row.is-lost .g-dot.is-packed{box-shadow:none;background:var(--paper);border-width:2px;}

.g-cell-num b{font-family:var(--font-display);font-size:21px;font-weight:300;
  font-variant-numeric:tabular-nums;line-height:1;}
.g-cell-num small{font-size:8.5px;letter-spacing:.06em;color:var(--fill);font-variant-numeric:tabular-nums;}
.g-cell-num.is-packed b{color:var(--case-accent);}
.g-row.is-lost .g-cell-num.is-packed b{color:var(--text);}
.g-cell-verdict b{font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--case-accent);}
.g-cell-verdict small{font-size:9px;letter-spacing:.04em;color:var(--fill);font-variant-numeric:tabular-nums;}
.g-row.is-lost .g-cell-verdict b{color:var(--fill);}
/* 输掉的行整行铺一层极淡的点阵 —— 不是变灰、不是划掉，只是标出来。
   ⚠️ 故意不用「单边彩色竖条」那套。 */
.g-row.is-lost{background-color:transparent;
  background-image:radial-gradient(circle at center,color-mix(in srgb,var(--on) 7%,transparent) 1px,transparent 1.2px);
  background-size:6px 6px;}

/* ── 04 为什么难 ─────────────────────────────────────────────────────────── */
.g-rare-grid article{display:flex;flex-direction:column;min-height:300px;}
.g-rare-grid .hard-copy{min-height:132px;}
.g-rare-grid .hard-visual{margin-top:auto;padding-top:22px;border-top:1px solid var(--hair);}
.g-transfer,.g-commits{display:flex;align-items:center;gap:12px;min-height:56px;padding:0 14px;
  background:color-mix(in srgb,var(--on) 3%,transparent);
  font-size:9px;letter-spacing:.11em;text-transform:uppercase;color:var(--fill);}
.g-transfer > i{flex:1;height:0;border-top:1px solid var(--fill);}
.g-transfer b{flex:none;font-size:8px;letter-spacing:.1em;}
.g-transfer .is-hot{color:var(--case-accent);}
.g-mini-grid{display:grid;grid-template-columns:repeat(6,10px);gap:5px 6px;align-content:center;
  min-height:56px;padding:10px 14px;background:color-mix(in srgb,var(--on) 3%,transparent);}
.g-mini-grid i{width:10px;height:10px;border:1px solid var(--fill);}
.g-mini-grid b{grid-column:1/-1;margin-top:4px;font-size:8px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--case-accent);white-space:nowrap;}
.g-commits > span{display:flex;flex-direction:column;gap:5px;}
.g-commits b{font-size:11px;letter-spacing:.06em;color:var(--text);text-transform:none;}
.g-commits small{font-size:7.5px;letter-spacing:.12em;}
.g-commits > i{font-family:var(--font-display);font-size:18px;font-style:normal;color:var(--case-accent);}

/* ── 05 结算 ─────────────────────────────────────────────────────────────── */
.g-resolution{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:20px;}
.g-res-block{padding:28px 30px;border:1px solid var(--edge);background:var(--paper);}
.g-res-block.is-change{border-color:var(--case-accent);
  background:color-mix(in srgb,var(--case-accent) 5%,var(--paper));}
.g-res-head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;
  padding-bottom:18px;margin-bottom:20px;border-bottom:1px solid var(--hair);}
.g-res-head p{font-size:8px;letter-spacing:.14em;text-transform:uppercase;color:var(--fill);}
.g-res-head strong{font-family:var(--font-display);font-size:clamp(26px,2.6vw,38px);font-weight:230;
  line-height:.95;letter-spacing:var(--disp-tracking-md);font-variant-numeric:tabular-nums;white-space:nowrap;}
.g-res-head sup{font-size:.45em;letter-spacing:0;vertical-align:baseline;color:var(--fill);}
.g-res-block.is-change .g-res-head strong{color:var(--case-accent);}
.g-res-note{margin-top:18px;max-width:62ch;font-size:11.5px;font-weight:300;line-height:1.7;color:var(--fill);}
.g-res-links{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:1px;
  margin-top:20px;background:var(--hair);border:1px solid var(--hair);}
.g-res-links li{background:var(--paper);}
.g-res-links a{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:12px 14px;font-size:9.5px;letter-spacing:.06em;color:var(--text);text-decoration:none;}
.g-res-links a:hover{color:var(--case-accent);background:color-mix(in srgb,var(--case-accent) 7%,transparent);}
/* 结算链接是按钮式外链：日期前放一枚文档图标，↗ 放大。
   · 图形不新画 —— 就是 §02 ev-kind 里那枚「官方声明」文档（同一个意思用同一枚图形）。
   · 15px / 1.35 描边与本页 §02 的来源图标同一档；与文字 7px 间距也与那里一致。
   · ↗ 的 14px 也不是拍的：case.css 的 .audit-request-btn 就是「9px 标签 + 14px 箭头」，
     这里标签 9.5px，沿用同一档。原来 ↗ 跟着标签只有 9.5px，实测字形盒宽 6.3px，
     落在 38px 高的按钮右下角几乎看不见。 */
.g-res-when{display:inline-flex;align-items:center;gap:7px;min-width:0;}
.g-res-ico{width:15px;height:15px;flex:0 0 auto;fill:none;stroke:currentColor;
  stroke-width:1.35;stroke-linecap:square;stroke-linejoin:miter;}
/* ↗ 从字体字形换成描边图形。原来用的是 Unicode &#8599;，它是**字体里的字**：
   头部是实心三角、线重跟着字重走，跟本页所有图标（fill:none + 1px 描边 +
   square 端头 + miter 拐角）根本不是一套语言，并排就看得出是外来物。
   现在这枚是同一套画法：一根 45° 轴 + 一个直角头，端头 square、拐角 miter。 */
.g-out-ico{flex:none;width:14px;height:14px;fill:none;stroke:currentColor;
  stroke-width:1.714;stroke-linecap:square;stroke-linejoin:miter;}
/* 行内位置（§02 来源行、§05 底部来源、worked example / 边界展品）用小一号。
   ⚠️ stroke-width 是按「最终线重 1 CSS px」反算的，不是随手填的：
      viewBox 24 ÷ 盒宽，14px → 24/14 = 1.714，11px → 24/11 = 2.182。
      两处都落在 1px，与 .g-source-ico 实际的 0.96px 同一档，
      不会出现「按钮里的箭头粗、行内的箭头发虚」。 */
.g-evidence-meta .g-out-ico,.g-res-source .g-out-ico{width:11px;height:11px;stroke-width:2.182;}
.g-res-source{margin-top:22px;padding-top:18px;border-top:1px solid var(--hair);}
.g-res-source a{display:inline-flex;align-items:center;gap:8px;font-size:9.5px;letter-spacing:.08em;
  color:var(--text);text-decoration:none;border-bottom:1px solid var(--case-accent);padding-bottom:3px;}

/* Calibration Lab 的终端和交互完全复用 case.css；这里只保留本页标题节奏。 */
.caseg .calib-copy h2{margin-top:18px;}

/* ── 诚实层 ─────────────────────────────────────────────────────────────── */
/* ⚠️ 这一节**不用**四张等重的 safeguards 卡（C / E / H 还是那样，G 原来也是）。
   2026-08-18 按设计意见重排了主次，规格与 case-f.css 的 .f-verdict / .f-credentials
   **逐字一致**，只换前缀 —— 三页并排必须是同一套字号，不许各写一版。
   G 的凭证是三条（多一条「没有丢任何一行」），所以只有列数不同。 */
/* 主结论。数字规格逐字照 .g-panel-summary strong，不另发明一套；
   /72 用的是 case.css 里 .tile-val sup 的既定写法（hero 的 9/9 就是它）。 */
.g-verdict{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  border:1px solid var(--rule);background:var(--paper);}
.g-verdict-card{min-width:0;padding:30px 28px 32px;border-right:1px solid var(--hair);}
.g-verdict-card:last-child{border-right:0;}
.g-verdict-card > span{display:block;max-width:44ch;
  font-size:8px;line-height:1.4;letter-spacing:.15em;text-transform:uppercase;color:var(--fill);}
/* ⚠️ 数字用的是 case.css 里 .tile-val 那一档 clamp(30px,3.1vw,46px) / 250，
   不是 .g-panel-summary 的 clamp(54px,6vw,78px)。理由是量出来的：
   右边那格要放「0.208 → 0.131」十三个字符，78px 下实测把卡片撑满、
   0.207 几乎贴到右边框。而 hero 的 readout 里这两个数本来就是 .tile-val 这一档，
   读者在页首已经见过同一套字号，这里沿用最自然，也不用另发明第三套。 */
.g-verdict-card strong{display:block;margin-top:22px;font-family:var(--font-display);
  font-size:clamp(30px,3.1vw,46px);font-weight:250;line-height:1;
  letter-spacing:var(--disp-tracking-md);font-variant-numeric:tabular-nums;color:var(--case-accent);}
.g-verdict-card strong sup{font-size:.4em;letter-spacing:0;margin-left:3px;vertical-align:baseline;
  color:var(--fill);}
/* 「0.208 → 0.131」：两个数一个箭头，箭头与「之后」那个数退回中性色 ——
   这一页的语言一直是「实心强调色 = 带证据，空心/中性 = 抽掉证据」。 */
.g-verdict-pair{display:flex;flex-wrap:wrap;align-items:baseline;gap:0 .32em;}
.g-verdict-pair em{font-style:normal;}
/* 箭头单独居中：容器是 baseline 对齐，而 → 这个字形的基线在很低的位置，
   跟着基线走就会挂在数字脚下。align-self:center 只影响它自己。 */
.g-verdict-pair i{align-self:center;font-size:.6em;font-style:normal;color:var(--fill);}
.g-verdict-pair .is-bare{color:var(--text);}
/* 一句大白话结论，规格照 case.css 的 .hard-grid h3（本页「小标题」那一档）。 */
.g-verdict-card b{display:block;margin-top:20px;max-width:24ch;font-family:var(--font-display);
  font-size:17px;font-weight:350;letter-spacing:var(--disp-tracking-md);line-height:1.3;color:var(--text);}
.g-verdict-card p{max-width:44ch;margin-top:14px;font-size:11.5px;font-weight:300;line-height:1.65;color:var(--fill);}

/* 次级凭证：只有标签 + 一句人话，没有大数字 —— 它们是凭证，不是结论。
   说明文字的规格与原 safeguards 的 p 逐字一致。 */
.g-credentials{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;
  margin-top:20px;background:var(--hair);border:1px solid var(--rule);}
.g-credentials > div{min-width:0;padding:20px 24px 22px;background:var(--paper);}
.g-credentials span{display:block;font-size:8px;line-height:1.3;letter-spacing:.15em;
  text-transform:uppercase;color:var(--case-accent);}
.g-credentials p{max-width:52ch;margin-top:12px;font-size:11.5px;font-weight:300;line-height:1.65;color:var(--fill);}
.g-credentials code{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.02em;color:var(--text);}
/* G 有三条凭证，列数与 F 不同；其余取值一致。 */
.g-credentials{grid-template-columns:repeat(3,minmax(0,1fr));}

/* 72 格 recall 网格。行 = 会议，列 = 家族 × 两遍。 */
.g-recall{margin-top:20px;padding:24px 26px 22px;border:1px solid var(--rule);background:var(--paper);}
.g-recall figcaption{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:10px 20px;
  padding-bottom:18px;border-bottom:1px solid var(--hair);
  font-size:8px;letter-spacing:.13em;text-transform:uppercase;color:var(--fill);}
/* ⚠️ 故意不是强调色：这一节重排后强调色只留给两个主结论的数字，
   矩阵已经降为证明材料（跟 case-f.css 里同一个理由）。 */
.g-recall figcaption b{color:var(--fill);}
/* 图例。⚠️ G 的 72 格**只有一种**（全部 unknown，没有 unparseable），
   所以只有一枚样本格，不像 F 需要两型对照。格子的边框/底色/短横规格与网格里
   **逐字一致**，否则图例和实物对不上就等于没有图例。
   外框排布规格照 §03 的 .g-legend，不另发明。 */
.g-recall-legend{display:flex;flex-wrap:wrap;align-items:center;gap:10px 26px;margin-top:16px;
  font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--fill);}
.g-recall-legend > span{display:inline-flex;align-items:center;gap:9px;}
.g-key-cell{flex:none;display:grid;place-items:center;width:38px;height:15px;
  border:1px solid color-mix(in srgb,var(--on) 22%,transparent);
  background:color-mix(in srgb,var(--on) 4%,transparent);}
.g-key-cell em{font-style:normal;font-family:var(--font-mono);font-size:9px;line-height:1;color:var(--fill);}
.g-grid-head,.g-grid-row{display:grid;grid-template-columns:minmax(88px,132px) minmax(0,1fr);
  align-items:center;gap:16px;}
.g-grid-head{padding:16px 0 10px;}
.g-grid-models{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;
  font-size:7.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--fill);}
.g-grid-models span{text-align:center;}
.g-grid-row{min-height:30px;}
.g-grid-row > b{font-size:8.5px;letter-spacing:.08em;color:var(--fill);white-space:nowrap;}
/* 格子按家族分成 4 组，跟 .g-grid-models 的 4 列同构 —— 表头与格子的对齐
   是结构保证的，不靠「居中刚好对上」。每格里一道短横 = 这一遍没有可解析的回忆。 */
.g-grid-cells{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;}
.g-grid-fam{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px;}
.g-grid-cells i{display:grid;place-items:center;height:16px;
  border:1px solid color-mix(in srgb,var(--on) 22%,transparent);
  background:color-mix(in srgb,var(--on) 4%,transparent);}
.g-grid-cells em{font-style:normal;font-family:var(--font-mono);font-size:9px;line-height:1;color:var(--fill);}
.g-recall-note{margin-top:20px;padding-top:16px;border-top:1px solid var(--hair);
  max-width:96ch;font-size:11.5px;font-weight:300;line-height:1.7;color:var(--fill);}

.g-honesty{margin-top:20px;}


/* ── 断点 ────────────────────────────────────────────────────────────────
   阈值是量出来的，不是抄的：1180 是九行表五列开始挤的点，
   980 是结算两栏放不下的点，820 是行表必须换成两行布局的点。 */
@media (max-width:1180px){
  .g-row{grid-template-columns:minmax(128px,.85fr) minmax(140px,1.3fr) minmax(84px,.6fr) minmax(84px,.6fr) minmax(96px,.68fr);}
  .g-row > span{padding-left:14px;padding-right:14px;}
  .g-credentials{grid-template-columns:repeat(2,minmax(0,1fr));}

}

@media (max-width:980px){
  .g-resolution{grid-template-columns:1fr;}
  .g-panel-summary{grid-template-columns:1fr;}
  .g-panel-summary > div{min-height:122px;}
  .g-panel-summary .is-arrow{min-height:64px;flex-direction:row;border:0;
    border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);}
  .g-proj-plot{height:74px;}
}

@media (max-width:820px){
  /* 五列换成「两行 × 三列」：会议+两个数字一行，轨道+判定一行。
     表头在窄屏没有意义，直接隐藏，改用每格自己的前缀标签。 */
  .g-row.is-head{display:none;}
  .g-row{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr) minmax(0,1fr);}
  .g-cell-meeting{grid-column:1;grid-row:1;}
  .g-cell-num.is-bare{grid-column:2;grid-row:1;}
  .g-cell-num.is-packed{grid-column:3;grid-row:1;border-right:0;}
  .g-cell-track{grid-column:1 / span 2;grid-row:2;border-top:1px solid var(--hair);border-right:1px solid var(--hair);}
  .g-cell-verdict{grid-column:3;grid-row:2;border-top:1px solid var(--hair);border-right:0;}
  .g-cell-num::before{content:attr(data-lbl);font-size:7px;letter-spacing:.12em;text-transform:uppercase;color:var(--fill);}
  .g-cell-num.is-bare::before{content:"BARE";}
  .g-cell-num.is-packed::before{content:"PACKED";}
  .g-grid-head,.g-grid-row{grid-template-columns:minmax(74px,96px) minmax(0,1fr);gap:10px;}
  .g-grid-cells{gap:9px;}
  .g-grid-fam{gap:4px;}
  .g-grid-cells i{height:14px;}
}

@media (max-width:720px){
  .g-evidence .ev-line{grid-template-columns:1fr;}
  .g-evidence .ev-kind,.g-evidence-meta,.g-evidence .g-quote,.g-proj,.g-evidence .ev-line > p{
    grid-column:1;grid-row:auto;}
  .g-evidence-meta{flex-direction:column;gap:5px;padding:16px 20px 10px;}
  .g-evidence .g-quote{padding:0 20px;}
  .g-proj{margin:20px 20px 0;}
  .g-evidence .ev-line > p{padding:20px;}
  .g-verdict,.g-credentials{grid-template-columns:1fr;}
  .g-verdict-card{border-right:0;border-bottom:1px solid var(--hair);}
  .g-verdict-card:last-child{border-bottom:0;}
  .g-recall{padding:20px 18px;}
  .g-rare-grid{grid-template-columns:1fr;}
  .g-rare-grid article{min-height:0;border-right:0;border-bottom:1px solid var(--hair);}
  .g-rare-grid article:last-child{border-bottom:0;}
  .g-rare-grid .hard-copy{min-height:0;}
  .g-rare-grid .hard-visual{margin-top:28px;}
}

@media (max-width:520px){
  .g-row{grid-template-columns:minmax(0,1fr) minmax(0,1fr);}
  .g-cell-meeting{grid-column:1 / span 2;border-right:0;border-bottom:1px solid var(--hair);}
  .g-cell-num.is-bare{grid-column:1;grid-row:2;}
  .g-cell-num.is-packed{grid-column:2;grid-row:2;}
  .g-cell-track{grid-column:1 / span 2;grid-row:3;border-right:0;}
  .g-cell-verdict{grid-column:1 / span 2;grid-row:4;border-top:1px solid var(--hair);}
  .g-grid-head{display:none;}
  .g-grid-row{grid-template-columns:1fr;gap:6px;padding:8px 0;}
  .g-grid-cells{gap:7px;}
}

@media (prefers-reduced-motion:reduce){
  .g-dot.is-packed{box-shadow:none;}
}
