/* ============================================================
   Master Visual Spec — Yeezeon Li Portfolio 2026
   技术栈：纯 HTML + Tailwind CDN + Print CSS
   设计基因：ima Solarpunk（有机曲线 / 低饱和 / 4/8 网格）
            + 苔光 v1.0 母品牌基因（中医草木绿 / off-white light · 见 美学系统_苔光_v1.md）
            + 校招双11 KV（通透渐变 / 放射发散）
   ============================================================ */

/* ── 0. CSS Custom Properties ────────────────────────────── */
:root {
  /* ─ 色板：苔光 v1.1 — ima Solarpunk 低饱和 + 中医草木绿基因（见 美学系统_苔光_v1.md §1）· v1.1 暖中性 + 亮 lime pop ─ */
  --c-bg:          #FAF8F2;       /* 页面底色（v1.1 暖纸 · 原冷 #FAFAFA · 近黑字 16.39）*/
  --c-bg-alt:      #F1EDE2;       /* 卡片/模块底色（v1.1 暖 · 原 #F2F2F2）*/
  --c-surface:     #FFFFFF;       /* 内容面（保白 · 暖底上提亮）*/
  --c-lane-base:   #F8F5EE;       /* 泳道/面板极淡暖基底（v1.1 · 原 #F9F9F9 · 介于 surface 与 bg）*/
  --c-border:      var(--c-warm-200); /* 细线 = 暖灰 ramp warm-200（v1.2 乙·#E1DED6 S15 均匀·原 #E6DFD2 S29）*/
  --c-text:        #1A1A1A;       /* 正文 */
  --c-text-secondary: #666666;    /* 辅助文字 */
  --c-text-tertiary:  #999999;    /* 标注 / caption */
  /* ─ 暖中性 ramp（v1.2 提案B·选乙 · H44 S15 均匀 · 表面/描边/分区 + 信息图装饰微标签 · 非正文主文本 · 收编 inline 暖灰）─ */
  --c-warm-200:    #E1DED6;       /* L86 — 描边/线（= --c-border）*/
  --c-warm-300:    #D1CDC1;       /* L79 — 分区底 / 禁用边 */
  --c-warm-400:    #C2BDAD;       /* L72 — 浅分隔 */
  --c-warm-500:    #B1AA95;       /* L64 — 中性填充 */
  --c-warm-600:    #A29981;       /* L57 — 深分隔 / icon 弱 */
  --c-warm-700:    #93886C;       /* L50 — 暗中性块 */
  --c-warm-800:    #7E755D;       /* L43 — 最深暖灰 / 强分隔 */
  --c-accent:      #7BA82E;       /* 苔光绿 — 主强调色（mid accent / 图标 / 大字 / 描边 · 非正文小字）*/
  --c-accent-soft: #EFF4E1;       /* 苔光浅底 — 强调色浅底 */
  --c-accent-deep: #16453A;       /* 深森林绿（青绿支）— 可作文字/标题/白字按钮的绿锚（vs底 10.16 / 白字 10.79 · AAA · v1.1 S68i）*/
  --c-accent-pop:  #DDF498;       /* 亮 lime 高光（v1.1 · 高彩度点睛 chip/选中底 · 非文字 · 深绿字 on it 8.97 · 参 profounders）*/
  /* ─ 苔光绿 Primary 状态色阶中段（v1.2 提案A · 补全 §1.4.2 8 档 · 固定 H82 S57 变 L · 非文字）─ */
  --c-accent-tint:     #C2E08F;   /* Tint L72 — 浅色块 / hover 浅底 */
  --c-accent-light:    #97CA3F;   /* Light L52 — 大色块装饰 */
  --c-accent-hover:    #648825;   /* Hover L34 — 白字按钮 hover（白字 AA 大字）*/
  --c-accent-strong:   #4C681D;   /* Strong L26 — 深绿块 / 黄绿支 */
  --c-accent-disabled: #BCC7A8;   /* Disabled S22 — 禁用态 */
  --c-tai-clay:    #C28B5E;       /* 蜜陶土 — 暖端叙事色（渐变终点 / 阳光照射）*/
  --c-tai-teal:    #4A9B85;       /* 苔光绿青 — 冷端 valence 色（情绪曲线负区）*/
  --c-tai-mist:    #5C5C8C;       /* 紫雾 — 中性过渡 / hero 提亮辅助 */
  --c-tai-sprout:  #9FBF3B;       /* 手写绿 — 手写注 / 草图注记（B89 同族）*/
  --c-hero-a:      #3A3A5C;       /* 共振之靈主色（深紫灰）*/
  --c-hero-b:      #1B6B5A;       /* 眾生鏡主色（深青绿）*/
  --c-hero-c:      #8B5E3C;       /* 愿境主色（温暖棕）*/
  --c-hero-d:      #1E3A5F;       /* PolyU AI Photobooth 主色（钢蓝）*/
  --c-gradient-start: #7BA82E;    /* 苔光绿（植物生长）*/
  --c-gradient-end:   #C28B5E;    /* 蜜陶土（阳光照射）*/
  --c-tag-bg:      #F0F0F0;
  --c-tag-text:    #444444;
  --c-danger:      #B4524A;       /* 暖红 light 档（S100-r6 补既有 gap·对齐 design-system .card--danger 字面值·深色档在 .page--dark 覆盖）*/
  --c-warning:     #B8860B;       /* 琥珀 light 档（同上）*/

  /* ─ 字号阶梯（基于 4px 增量 / 1.25 modular scale）─ */
  --fs-giga:       7.5rem;   /* 120px — Kartik 式极端 KPI hero */
  --fs-mega:       5rem;     /* 80px — 大号 KPI 数字 */
  --fs-display:    2.5rem;   /* 40px — 封面项目标题 */
  --fs-h1:         2rem;     /* 32px — 章节大标题 */
  --fs-h2:         1.5rem;   /* 24px — 子标题 */
  --fs-h3:         1.25rem;  /* 20px — 卡片标题 */
  --fs-h4:         1.125rem; /* 18px — 卡内标题/领读断言（S129b R5.1 微档 → S133d user 裁转正：标题层非正文层·原 .p05w-ctitle 与 p13/p23/p33 领读共 12 实例归此档） */
  --fs-body:       1rem;     /* 16px — 正文 */
  --fs-small:      0.875rem; /* 14px — caption / 标注 */
  --fs-caption:    0.875rem; /* 14px — 同 --fs-small；index.html 287 处图注/eyebrow 引用此别名 */
  --fs-xs:         0.75rem;  /* 12px — 脚注 */

  /* ─ 行高 ─ */
  --lh-tight:      1.3;
  --lh-normal:     1.6;
  --lh-loose:      1.8;

  /* ─ 间距（8px 倍数系统 — ima 4/8 网格）─ */
  --sp-1:  0.25rem;  /*  4px */
  --sp-2:  0.5rem;   /*  8px */
  --sp-3:  0.75rem;  /* 12px */
  --sp-4:  1rem;     /* 16px */
  --sp-5:  1.5rem;   /* 24px */
  --sp-6:  2rem;     /* 32px */
  --sp-8:  3rem;     /* 48px */
  --sp-10: 4rem;     /* 64px */
  --sp-12: 5rem;     /* 80px */

  /* ─ 圆角（ima 有机曲线）─ */
  --r-sm:  4px;
  --r-md:  8px;
  --r-lg:  16px;
  --r-xl:  24px;

  /* ─ 阴影 ─（v1.2：去纯黑·暖向基色 · 屏幕设计禁直接 #000 · user S 反馈）*/
  --c-shadow-rgb: 41, 37, 30;       /* #29251E 暖近黑 H40 S15 L14 · D-1 改 S15（续接暖灰 ramp 乙 S15 全程·中性脊一气到黑·原 S22 #252118 发棕破纪律）*/
  --c-shadow:     #29251E;          /* 同上·整值 hex 形式（供 SVG flood-color 等需色彩字面量处·v0.13 inline 阴影迁移）*/
  --shadow-sm: 0 1px 3px rgba(var(--c-shadow-rgb),0.06);
  --shadow-md: 0 4px 12px rgba(var(--c-shadow-rgb),0.08);
  --shadow-lg: 0 8px 24px rgba(var(--c-shadow-rgb),0.10);

  /* ─ 字体角色 token（S81·design.md §3 字体配对·design-system.css 引用）─ */
  --font-sans:  'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
  --font-serif: 'Source Serif 4', 'Noto Serif SC', Georgia, serif;   /* display/标题重音·roman+italic 混排·中文 Noto Serif SC */
  --font-mono:  'Paper Mono', 'Noto Sans SC', monospace;          /* 眉标/节标/stat/caption */

  /* ─ 页面尺寸（A4 横版，210×297mm → 按 16:9 宽屏适配）─ */
  --page-w: 1440px;
  --page-h: 810px;   /* 16:9 */
  --page-padding: var(--sp-8);
}

/* ── 1. 字体引入 ──────────────────────────────────────── */
/*
   字体已改为自托管：index.html 里 <link href="styles/fonts.css">（排在本文件之前）。
   构建脚本 _pdf_check/build_fonts.py —— 改文案后重跑，否则新字可能不在子集里。

   这里原本有一条 Google Fonts @import。它排在 §0 的 :root{} 之后，
   而 CSS 规范要求 @import 必须位于所有规则之前 → 浏览器从来没执行过它。
   后果（S150 实测）：Inter / Noto Sans SC 靠本机安装才正常，
   当时的 JetBrains Mono 两处都没有，全册 mono 层实际渲染的是 Menlo 兜底。
   （mono 后来 S152 换 TT Norms Pro Mono、S161 因公开部署的授权问题再换 Paper Mono。）
   删掉而不是挪到顶部：CDN 依赖本身就不该留（大陆评审访问不到）。
*/

/* ── 2. Reset & Base ─────────────────────────────────── */
*, *::before, *::after {
  margin: 0; padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 16px;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* S176：关掉 iOS 的自动字号放大（Text Autosizer）。
     公开站的 viewport 是 width=1600，在 390pt 的手机上缩放比 ≈0.24 —— 正落在
     WebKit 认为「文字太小、我帮你放大」的区间。它只放大 HTML 文本、不动 SVG 内的文字，
     且不同文本块的放大系数还不一样，于是：左栏文字撑高 → 右栏 SVG 尺寸没变 →
     space-between 把两张图拉开成大片空腔（p06/p10/p39），洞察卡间距变宽（p16/p26），
     列表序号相对正文变大（看着像序号渲染错了）。
     Chrome on iOS 同样是 WebKit 内核，所以两个浏览器都中。
     用 100% 而不是 none：none 在部分引擎会连带禁掉用户双指缩放，那是可访问性倒退。
     本册是固定 1440px 画布整体缩放的版式，文字不该被单独放大。 */
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

body {
  font-family: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
  font-weight: 400;
  line-height: var(--lh-normal);
  color: var(--c-text);
  background: var(--c-bg);
}

/* ── 3. 页面容器（每个 .page = PDF 一页）─────────────── */
.page {
  width: var(--page-w);
  min-height: var(--page-h);
  margin: 0 auto var(--sp-6);
  padding: var(--page-padding);
  background: var(--c-surface);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-md);
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.page--full {
  padding: 0;  /* 全出血页（封面等）*/
}

.page--tall {
  min-height: 900px;  /* 16:10 — 给信息密度高的 task / P.7 等页用 */
}

.page--xtall {
  min-height: 1200px;  /* 6:5 — S48b 临时护栏；S48a P-C v4 拆 P.9/P.10 后已撤销共振 p10 应用；class 保留供 Phase 4 sprint 1 决策 */
}

/* D 补丁追加：让 .page--full 内 .hero-cover 跟随 .page (含 .page--xtall) 撑满
   避免 .page--xtall 1200px 时 .hero-cover 因自身 min-height: var(--page-h) 810px 留底部空白；
   .hero-cover 自身 justify-content: flex-end 已存在，撑满后 content 自然靠底部对齐 */
.page--full > .hero-cover {
  flex: 1;
  min-height: 0;
}

/* D 补丁追加 v2：3 hero cover (.page--xtall) 内容居中分布，避免 justify-end + 1200px 高度导致顶部留白 200-300px
   仅覆盖 .page--xtall 下的 hero-cover (= 3 hero cover)；P01 封面 (.page--full 无 .page--xtall) 保持原 flex-end 不变 */
.page--xtall > .hero-cover,
.page--full.page--tall > .hero-cover {
  justify-content: center;  /* S94 封面降 tall(900) 后保持内容垂直居中（原选择器只覆盖 xtall） */
}

.page__number {
  position: absolute;
  bottom: var(--sp-4);
  right: var(--sp-5);
  font-size: var(--fs-xs);
  color: var(--c-text-tertiary);
  font-family: 'Paper Mono', 'Noto Sans SC', monospace;
  /* S155：四个项目封面的页码被 hero 图层盖住，实测最亮像素只有 38（底 26）——
     同页 alpha=255/158 的白字都渲染正常，证明不是合成问题而是压在图下面。
     提 z-index 让它回到最上层；内页无图层竞争，加了也无影响。 */
  z-index: 12;
}

/* ── 4. 排版 ─────────────────────────────────────────── */
h1 { font-size: var(--fs-h1); font-weight: 700; line-height: var(--lh-tight); letter-spacing: -0.02em; }
h2 { font-size: var(--fs-h2); font-weight: 600; line-height: var(--lh-tight); letter-spacing: -0.01em; }
h3 { font-size: var(--fs-h3); font-weight: 500; line-height: var(--lh-tight); }
p  { font-size: var(--fs-body); line-height: var(--lh-normal); margin-bottom: var(--sp-4); }

.display-title {
  font-size: var(--fs-display);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.03em;
}

.subtitle {
  font-size: var(--fs-h3);
  font-weight: 400;
  color: var(--c-text-secondary);
  line-height: var(--lh-normal);
}

.caption {
  font-size: var(--fs-small);
  color: var(--c-text-tertiary);
  line-height: var(--lh-normal);
}

.mono {
  font-family: 'Paper Mono', 'Noto Sans SC', monospace;
  font-size: var(--fs-small);
}

/* 双语标题 */
.title-bilingual {
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
}
.title-bilingual .zh {
  font-size: var(--fs-h1);
  font-weight: 700;
}
.title-bilingual .en {
  font-size: var(--fs-h3);
  font-weight: 400;
  color: var(--c-text-secondary);
  font-family: 'Inter', sans-serif;
}

/* ── 5. 布局工具 ─────────────────────────────────────── */
.flex        { display: flex; }
.flex-col    { flex-direction: column; }
.flex-wrap   { flex-wrap: wrap; }
.items-center { align-items: center; }
.items-start  { align-items: flex-start; }
.justify-between { justify-content: space-between; }
.justify-center  { justify-content: center; }
.gap-2  { gap: var(--sp-2); }
.gap-4  { gap: var(--sp-4); }
.gap-5  { gap: var(--sp-5); }
.gap-6  { gap: var(--sp-6); }
.gap-8  { gap: var(--sp-8); }
.lh-compact { line-height: 1.45; }
.lh-compact p { line-height: 1.45; }

.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-5); }
.grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--sp-5); }
.grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-4); }

.col-span-2 { grid-column: span 2; }
.w-full     { width: 100%; }
.flex-1     { flex: 1; }

/* 视觉隐藏但保留在无障碍树 + PDF 文本层（S150 · p01 字标为纯矢量路径，选不中/搜不到）。
   用「透明墨」而非常见的 1px 裁剪法 —— S150 实测四种写法进 PDF 文本层的结果：
     overflow:hidden 1px 裁剪 ✗ / opacity:0 ✗ / clip-path:inset(50%) ✗ / color:transparent ✓
   前三种 Chrome 直接不绘制，文字连同可见性一起从 PDF 里消失（= 白做）。
   代价：probe_wcag 会把 rgba(0,0,0,0) 算成 1.0 对比度 → 该脚本已显式跳过 .sr-only。 */
.sr-only {
  position: absolute;
  color: transparent;
  white-space: nowrap;
  pointer-events: none;
  user-select: text;
}

/* ── 6. 组件 ─────────────────────────────────────────── */

/* 标签 */
.tag {
  display: inline-flex;
  align-items: center;
  padding: var(--sp-1) var(--sp-3);
  background: var(--c-tag-bg);
  color: var(--c-tag-text);
  font-size: var(--fs-xs);
  font-weight: 500;
  border-radius: 999px;
  white-space: nowrap;
}
.tag--accent {
  background: var(--c-accent-soft);
  color: var(--c-accent-deep);   /* v1.1 S69: 深森林绿 #16453A on accent-soft = 9.61 AAA（旧 #7BA82E on accent-soft = 2.50 ⛔ 违苔光 §1.4.5 铁律 #1/#2）· 项目页仍由 .project-X 覆盖为 --c-project */
}

/* 卡片 */
.card {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--r-md);
  padding: var(--sp-5);
}
.card--elevated {
  border: none;
  box-shadow: var(--shadow-sm);
}

/* 分隔线 */
.divider {
  width: 100%;
  height: 1px;
  background: var(--c-border);
  margin: var(--sp-5) 0;
}

/* 图片占位 */
.img-placeholder {
  width: 100%;
  aspect-ratio: 16/9;
  background: var(--c-bg-alt);
  border-radius: var(--r-md);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--c-text-tertiary);
  font-size: var(--fs-small);
  border: 2px dashed var(--c-border);
}

/* S48b Step 3: 显式 height / min-height 时关闭 aspect-ratio，防 grid/flex 容器内尺寸冲突
   触发场景：p11 等页 img-placeholder 内联 height 但仍被 aspect-ratio 16/9 拉宽导致右栏溢出 */
.img-placeholder[style*="height"] {
  aspect-ratio: auto;
}

/* 高亮引用 */
.highlight-quote {
  border-left: 3px solid var(--c-accent);
  padding: var(--sp-4) var(--sp-5);
  background: var(--c-accent-soft);
  border-radius: 0 var(--r-md) var(--r-md) 0;
  font-size: var(--fs-body);
  line-height: var(--lh-loose);
}

/* 数据卡 */
.stat-card {
  text-align: center;
  padding: var(--sp-5);
}
.stat-card__number {
  font-size: var(--fs-display);
  font-weight: 700;
  color: var(--c-accent);
  font-family: 'Paper Mono', 'Noto Sans SC', monospace;
  line-height: 1;
}
.stat-card__label {
  font-size: var(--fs-small);
  color: var(--c-text-secondary);
  margin-top: var(--sp-2);
}
.stat-card--lg .stat-card__number {
  font-size: 60px;   /* S147 W10：fs-mega 80px→60px·系统统一档——与 p21 第三卡/p31 四卡既有 inline 60px 对齐·收回 p11/p21 超高（仅命中 p11 三连+p21 前两卡·余皆 inline 覆盖不受影响） */
  letter-spacing: -0.03em;
}
.stat-card--lg .stat-card__label {
  font-size: var(--fs-xs);
}

/* KPI Hero — Kartik 式极端字号反差（mega 数字 + xs caption） */
.kpi-hero {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--sp-2);
}
.kpi-hero__number {
  font-size: var(--fs-mega);
  font-weight: 700;
  font-family: 'Paper Mono', 'Noto Sans SC', monospace;
  line-height: 0.9;
  letter-spacing: -0.03em;
  color: var(--c-accent);
}
.kpi-hero__label {
  font-size: var(--fs-xs);
  font-family: 'Paper Mono', 'Noto Sans SC', monospace;
  color: var(--c-text-tertiary);
  letter-spacing: 0.02em;
}
.kpi-hero--giga .kpi-hero__number {
  font-size: var(--fs-giga);
}
.kpi-hero--center {
  align-items: center;
  text-align: center;
}

/* 项目封面 hero 区域 */
.hero-cover {
  width: 100%;
  min-height: var(--page-h);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: var(--sp-10);
  position: relative;
  color: white;
}
.hero-cover__bg {
  position: absolute;
  inset: 0;
  object-fit: cover;
  z-index: 0;
}
.hero-cover__overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.1) 60%, transparent 100%);
  z-index: 1;
}
/* S94 P4: 封面白字压亮图区 — 各项目主题色深调 scrim（左上文字区强压暗 → 右下渐弱保照片；叠于黑色底部渐变之上） */
.project-a .hero-cover__overlay { background: linear-gradient(115deg, rgba(22,22,43,0.97) 0%, rgba(22,22,43,0.76) 45%, rgba(22,22,43,0.40) 70%, rgba(22,22,43,0.12) 100%), linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.1) 60%, transparent 100%); }
.project-b .hero-cover__overlay { background: linear-gradient(115deg, rgba(10,43,36,0.97) 0%, rgba(10,43,36,0.76) 45%, rgba(10,43,36,0.40) 70%, rgba(10,43,36,0.12) 100%), linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.1) 60%, transparent 100%); }
.project-c .hero-cover__overlay { background: linear-gradient(115deg, rgba(58,36,22,0.97) 0%, rgba(58,36,22,0.76) 45%, rgba(58,36,22,0.40) 70%, rgba(58,36,22,0.12) 100%), linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.1) 60%, transparent 100%); }
.project-d .hero-cover__overlay { background: linear-gradient(115deg, rgba(11,24,38,0.97) 0%, rgba(11,24,38,0.76) 45%, rgba(11,24,38,0.40) 70%, rgba(11,24,38,0.12) 100%), linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.1) 60%, transparent 100%); }
.hero-cover__content {
  position: relative;
  z-index: 2;
}

/* 项目元信息条 */
.meta-bar {
  display: flex;
  gap: var(--sp-6);
  padding: var(--sp-4) 0;
  border-top: 1px solid var(--c-border);
  border-bottom: 1px solid var(--c-border);
  margin: var(--sp-5) 0;
}
.meta-bar__item {
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
}
.meta-bar__label {
  font-size: var(--fs-xs);
  color: var(--c-text-tertiary);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.meta-bar__value {
  font-size: var(--fs-body);
  font-weight: 500;
}

/* ── 6.5 P.9/P.10 复盘双层占位 class（Framework v4 S48a P-C）─────── */
/* P.9 = 五环叙事 narrative climax / P.10 = 验证矩阵 + 方法论
   占位 class，主样式留 Phase 4 sprint 1 视觉精修；当前结构层走 inline + .page--tall */
.result-narrative {}
.result-matrix    {}

/* ── 7. 项目主色覆盖 ─────────────────────────────────── */
.project-a { --c-project: var(--c-hero-a); }
.project-b { --c-project: var(--c-hero-b); }
.project-c { --c-project: var(--c-hero-c); }
.project-d { --c-project: var(--c-hero-d); }

.project-a .tag--accent,
.project-b .tag--accent,
.project-c .tag--accent,
.project-d .tag--accent {
  background: color-mix(in srgb, var(--c-project) 12%, white);
  color: var(--c-project);
}

.project-a .highlight-quote,
.project-b .highlight-quote,
.project-c .highlight-quote,
.project-d .highlight-quote {
  border-left-color: var(--c-project);
  background: color-mix(in srgb, var(--c-project) 6%, white);
}

.project-a .stat-card__number,
.project-b .stat-card__number,
.project-c .stat-card__number,
.project-d .stat-card__number,
.project-a .kpi-hero__number,
.project-b .kpi-hero__number,
.project-c .kpi-hero__number,
.project-d .kpi-hero__number {
  color: var(--c-project);
}

/* ── 8. Print CSS ─────────────────────────────────────── */
@media print {
  @page {
    size: 1440px 810px;   /* 匹配 16:9 横屏 */
    margin: 0;
  }

  body {
    background: white;
  }

  .page {
    width: 1440px;
    height: 810px;
    min-height: 810px;
    max-height: 810px;
    margin: 0;
    border-radius: 0;
    box-shadow: none;
    page-break-after: always;
    page-break-inside: avoid;
    overflow: hidden;
    /* S150 物理保险：强制打印背景。不设时 printBackground:false / 浏览器未勾「背景图形」
       → 33 页深色底全丢 = 浅色文字白底白字（实证 S148）。该属性可继承 → 覆盖全部子元素。 */
    print-color-adjust: exact;
    -webkit-print-color-adjust: exact;
  }

  .page--tall {
    height: 900px;
    min-height: 900px;
    max-height: 900px;
  }

  .page--xtall {
    height: 1200px;
    min-height: 1200px;
    max-height: 1200px;
  }

  .page:last-child {
    page-break-after: auto;
  }

  /* 隐藏 web-only 元素 */
  .web-only,
  .no-print {
    display: none !important;
  }
}

/* ── 9. 响应式（浏览器预览用，非投递必须）─────────────── */
@media screen and (max-width: 1500px) {
  .page {
    width: 100%;
    max-width: var(--page-w);
    min-height: auto;
    aspect-ratio: 16/9;
  }

  .page--tall {
    aspect-ratio: 16/10;
  }

  .page--xtall {
    aspect-ratio: 6/5;
  }
}

/* ── 10. 深色系统 scope（B-0 dark-pilot · S98 甲样张 token 集 + 全页化增补）──
   用法：.page 上叠 .page--dark → 该页整体换深色 token。
   B-0 试点 = p04-p13；B-1 全册展开后此 scope 或升为 :root 换届（届时记 design.md changelog）。
   纪律（对标报告 §3.3）：单一亮 accent + 深面板 + 1px 亮 keyline · 影稀缺 · 0 光效 0 glass 0 glow。 */
.page--dark {
  --c-bg:          #161613;   /* 暖近黑底 */
  --c-bg-alt:      #1F211C;
  --c-surface:     #242720;   /* 深面板 */
  --c-lane-base:   #1C1E19;   /* 泳道暗基底（甲未涉·同族推档）*/
  --c-border:      #3A3E35;
  --c-warm-200:    #3A3E35;   /* = border ramp 对齐 */
  --c-warm-300:    #454A3F;
  --c-warm-400:    #565B4E;
  /* warm 上半 ramp（B-1 补档 · light 层「越大越深」→ 深色档「越大越亮」保持强度语义序）*/
  --c-warm-500:    #96937F;   /* 中性标注 · on surface 4.89 */
  --c-warm-600:    #A19E8B;
  --c-warm-700:    #ABA795;
  --c-warm-800:    #BEBAAB;   /* 最强分隔/强标注 = secondary 明度 */
  --c-accent-strong: #C9E06B; /* light 深绿块 #4C681D 深底不可读 → 与 accent-deep 同档（B-1 补档）*/
  --c-text:        #F0EDE3;
  --c-text-secondary: #BEBAAB;
  --c-text-tertiary:  #96937F;   /* WCAG 修档：#8D8A7A on surface 4.36 微欠 → 4.89（on bg 5.85）*/
  --c-accent:      #9FBF3B;   /* USAGE Dark 行 · on #161613 = 8.42:1 */
  --c-accent-deep: #C9E06B;   /* 深底提亮档（light 层 #16453A 深绿在深底不可读）*/
  --c-accent-soft: #2A2F22;
  --c-hero-a:      #A8A8D8;   /* 共振紫灰提亮档（--c-project 经 .project-a 间接跟随）*/
  --c-hero-b:      #7BC1B2;   /* 眾生青绿提亮档（B-1 定档 · 原 #1B6B5A 同色相 · on bg 8.73 / on surface 7.30）*/
  --c-hero-c:      #C2A58E;   /* 愿境暖棕提亮档（B-1 定档 · 原 #8B5E3C 同色相 · on bg 7.83 / on surface 6.54）*/
  --c-hero-d:      #95AED0;   /* PolyU 钢蓝提亮档（B-1 定档 · 原 #1E3A5F 同色相 · on bg 7.98 / on surface 6.67）*/
  --c-shadow-rgb:  0,0,0;
  --c-shadow:      #000000;
  --c-tag-bg:      #2A2D26;
  --c-tag-text:    #BEBAAB;
  --c-danger:      #D07B72;   /* 深底提亮档（注：light 层此 token 缺定义·既有 gap 待 user 裁）*/
  --c-warning:     #D9A441;
  background: var(--c-bg);
  color: var(--c-text);       /* 必须显式：body color 是计算值继承·scope 重定义 var 不会自动翻转继承色 */
}
/* 深色卡语言 = 深面板 + 1px 亮 keyline · 零投影（L5 容器一影翻转版）*/
.page--dark .card--elevated { border: 1px solid var(--c-border); box-shadow: none; }
/* 项目色 chip：light 层 color-mix 白基在深底发光 → 换深底基 */
.page--dark .tag--accent { background: color-mix(in srgb, var(--c-project) 16%, var(--c-bg)); }
/* 行内 code 取舍 pill：暗底描边退灰（甲 C3）*/
.page--dark code { background: rgba(255,255,255,0.08); color: var(--c-text-secondary); }
/* 引述块：light 层 color-mix 白基（L461）在深底发光 → 换深底基（specificity 0,2,0 与 .project-X 同·载入序后者之后此规则胜出）*/
.page--dark .highlight-quote,
.page--dark .quote { background: color-mix(in srgb, var(--c-project, var(--c-accent)) 12%, var(--c-bg)); }
/* display 级 serif 重音：light 层硬编码 #648825（design-system L177）深底不可读 → 亮 lime 档 */
.page--dark .display-serif .em { color: var(--c-accent); }
/* 封面（甲 C4）：overlay 落近黑实底带 · tag 玻璃 chip → lime 描边 chip（inline 玻璃样式需 !important 压制·甲式）*/
.page--dark .hero-cover__overlay { background: linear-gradient(115deg, rgba(22,22,19,0.82) 0%, rgba(22,22,19,0.50) 46%, rgba(22,22,19,0.10) 78%, transparent 100%), linear-gradient(180deg, rgba(22,22,19,0.18) 0%, rgba(22,22,19,0.50) 52%, rgba(22,22,19,0.93) 100%); } /* 甲 C4 竖 ramp + 左对角文字保护（kicker 在亮照片顶落灰的修正）*/
.page--dark .hero-cover .tag { background: transparent !important; backdrop-filter: none !important; border: 1px solid var(--c-accent); color: var(--c-accent-deep) !important; }
/* S146b 封面文字层苔光化：双语标题入衬线声部（对齐 p01 hero + 内页 display-serif·zh→Noto Serif SC 回退 / en→Plex Italic）*/
.page--dark .hero-cover .title-bilingual .zh { font-family: var(--font-serif); font-weight: 600; }
.page--dark .hero-cover .title-bilingual .en { font-family: var(--font-serif); font-style: italic; }
/* L2 · 字阶：h2 24→32（inline font-size 页自保留·plain h2 升档）*/
.page--dark h2 { font-size: var(--fs-h1); }
/* S101 user 冷判：全册 h2 统一 sans·fs-h1（原 9 页 serif display 节头「报告体分节」意图扫读不可达·读作系统混乱）。
   eyebrow 节头结构保留（user 认可）；.em 关键词重音由 lime 色承载（下方既有规则）·撤斜体。*/
.page--dark h2.display-serif {
  font-family: 'Inter', 'Noto Sans SC', sans-serif;
  font-size: var(--fs-h1) !important;   /* 压 inline fs-display */
  font-weight: 700;
  letter-spacing: -0.01em;
}
.page--dark h2.display-serif .em { font-style: normal; }
/* L4 · KPI 数字降重：700 → 600（深底粗 mono 数字发晕·500/600 两档对比后取 600·见 B-0 验收包）*/
.page--dark .stat-card__number, .page--dark .kpi-hero__number, .page--dark .stat__num { font-weight: 600; }
/* ── A2 方案 B · 降权层（S99 已拍·与深色 value-ramp 同一手术·0 内容改动）──
   层3 推导正文：满墨 → 次级明度 + 字阶降档（16→14）；strong 回主明度 = 卡内双层（主读线索亮·推导垫底退）。
   层1 恢复：quote/highlight-quote（thesis/h2/KPI 不经 p 通道·caption 类自带 inline 色）。*/
.page--dark p { color: var(--c-text-secondary); font-size: var(--fs-small); }
.page--dark p.subtitle { font-size: var(--fs-h3); }  /* 封面 subtitle = 层1·防 (0,1,1) 压过 .subtitle */
.page--dark p strong { color: var(--c-text); }
.page--dark .quote, .page--dark .quote p,
.page--dark .highlight-quote, .page--dark .highlight-quote p { color: var(--c-text); font-size: var(--fs-body); }
.page--dark .highlight-quote[style*="font-size"] { font-size: var(--fs-small); } /* p09 CrashAutoSave 小号引据保留原档 */
/* 语义 tag（失败/触发重构/部分验证）：inline color:white 深底档不达标（on #D9A441 = 2.25）→ 深字压制 */
.page--dark .tag[style*="c-danger"], .page--dark .tag[style*="c-warning"] { color: #161613 !important; }
/* SVG 手术式1 系统修：`fill="var(--c-surface)"` 的 text = light 层「白字」语义（surface 当白用）→ 深色档 surface 变深面板色·字沉底。属性选择器整批还原实义近白（S100-r3·p07×6/p08×5 实测）*/
.page--dark svg text[fill="var(--c-surface)"] { fill: #f2efe6; }
