/* ============================================================================
   Workbench Design Tokens — Micro 落地版（v2 候选，尚未接线）
   规范真源：design/DESIGN.md v2
   视觉基准：design/reference/micro-style-reference.md（用户 2026-08-15 拍板）

   本文件与 design/tokens.css（v1，仍是当前生产真源）并存。切换由后续 dev 轮
   执行（见 DESIGN.md v2 §11 落地检查单），本轮不改 tokens.css、不改 apps/web。

   ── 记法约定（重要，别改成 hex） ───────────────────────────────────────────
   颜色一律写 rgb() / rgba() 十进制或 oklch()，绝不写 hex。原因：
   scripts/cc-test-design-tokens.mjs:336 对 apps/web/index.html 的 <style> 全段
   （含注释）扫 /#[0-9a-fA-F]{3,8}\b/ 并要求 0 命中。dev 轮会把本文件逐字内联进
   index.html，任何 hex 字面量（哪怕写在注释里）都会当场挂测试。因此下方注释
   引用 Micro 原稿色值时一律写成「原稿 hex 221f1c」这种不带井号的形式。
   rgb() 必须用逗号分隔（cc-test-design-tokens.mjs:153 的正则只认逗号形式）。

   ── 对比度标注约定 ─────────────────────────────────────────────────────────
   每个承载文字的组合都标了 WCAG 2.x 相对亮度实算值（算法与
   scripts/cc-test-design-tokens.mjs:31-213 一致，逐通道 sRGB→linear 后
   0.2126/0.7152/0.0722 加权）。可用 `node design/tools/micro-contrast.mjs`
   一键复算全表（该脚本即本文件全部数字的验算留证）。
   标注含义：✓正文 = ≥4.5；△徽章/图形 = 3.0–4.5；✗ = <3.0 禁止承载信息。

   结构（对齐 design/tokens.css）：
     :root                                亮色默认值 + 全部尺寸/字体/层级常量
     @media (prefers-color-scheme: dark)  跟随系统的暗色镜像（仅颜色与阴影）
     :root[data-theme="dark"]             手动锁定暗色
     :root[data-theme="light"]            手动锁定亮色
     §9                                   wb-ui 重映射（轮2 启用，默认注释说明）
   ========================================================================== */

:root {
  color-scheme: light;

  /* ==== §1 表面阶梯 ======================================================
     Micro 只定义两层（Canvas 原稿 hex f5f5f5 / Card 原稿 hex ffffff）。
     监督控制台需要四层，故 shell/surface 取 Micro 原值，canvas 与 hover 是
     本项目新造的桥接档（DESIGN.md v2 §5.1 偏离表 D-1/D-2）。 */
  --shell: rgb(245, 245, 245);   /* 外框：body/header/侧栏 = Micro Paper White（原稿 hex f5f5f5，原稿称 page canvas） */
  --canvas: rgb(250, 249, 248);  /* 画布：会话主区/抽屉 body。新造暖白桥接档，介于 Paper White 与 Pure White */
  --surface: rgb(255, 255, 255); /* 卡片：回答卡、结果面板、composer 盒 = Micro Pure White（原稿 hex ffffff） */
  --raised: rgb(255, 255, 255);  /* 浮层：popover/菜单/sheet。与 surface 同值，靠 --sh-2 区分（同 v1 策略） */
  --hover: rgb(237, 236, 233);   /* 悬停底/inline code 底/进度轨。新造：Micro 的 active fill f5f5f5 已被 --shell 占用，故下沉一档 */

  /* ==== §2 边框两级 ======================================================
     Micro Slate Edge（原稿 hex 27272a）「at low opacity」；Product Card 原稿
     给的是 rgba(0,0,0,0.065)。此处统一用 Slate Edge 承载，保住暖中性调。 */
  --border: rgba(39, 39, 42, 0.14);       /* 强边框：输入框、按钮、次按钮描边（Micro Search Input 的 1px 边） */
  --border-soft: rgba(39, 39, 42, 0.065); /* 弱边框：卡片、分区线。0.065 = Micro Product Card 原稿 alpha */

  /* ==== §3 文字三级 ======================================================
     Micro 三级原值直取。注意 Stone Gray / Pebble 在非白底上会跌破 AA，
     可用底见每行标注，纪律见 DESIGN.md v2 §3.3。 */
  --ink: rgb(34, 31, 28);        /* 主文字 = Micro Ink Black（原稿 hex 221f1c）。对 surface 16.40 ✓ / canvas 15.59 ✓ / shell 15.04 ✓ / hover 13.88 ✓ */
  --ink-2: rgb(121, 114, 103);   /* 次文字 = Micro Stone Gray（原稿 hex 797267）。对 surface 4.76 ✓ / canvas 4.52 ✓ / shell 4.36 △ / hover 4.03 △ / pastel wash 4.22 △ */
  --ink-2-deep: rgb(108, 101, 90); /* 次文字加深版（本项目新增）：Stone Gray 同色相压暗 ~11%，供 shell/hover/wash 底使用。对 surface 5.76 ✓ / shell 5.28 ✓ / hover 4.87 ✓ / mint wash 5.10 ✓ */
  --ink-3: rgb(134, 132, 130);   /* 辅助文字：Micro Pebble（原稿 hex 8c8a88）沿同色相压暗 4.3%。对 surface 3.73 △ / canvas 3.54 △ / shell 3.42 △ / hover 3.15 △。仅时间戳/占位符。
                                    为何不用 Pebble 原值：原值在 --hover 底上实算 2.91，低于图形级 3.0 门槛（GM 2026-08-15 复跑 micro-contrast 判定）。
                                    加深只动亮色态——暗色下 Pebble 原值本就达 4.77，压暗反而会跌破正文级，故暗色段保留原值。 */

  /* ==== §4 品牌 =========================================================
     Micro 的 Azure Action 在白底上只有 3.46:1，作正文/小字按钮文字不达 AA。
     故拆两枚：--brand 承担填充/图形/焦点环（原值不动），--brand-ink 承担
     文字与链接（沿用 v1 已实测的加深蓝）。裁决见 DESIGN.md v2 §3.2。 */
  --brand: rgb(81, 139, 219);         /* Micro Azure Action（原稿 hex 518bdb）。作图形/边框/焦点环对 surface 3.46 △（≥3 满足 WCAG 非文字对比） */
  --brand-ink: oklch(0.545 0.155 255); /* 蓝色文字/链接（沿用 v1 --brand 实测值）。对 surface 5.00 ✓ / canvas 4.76 ✓ / shell 4.59 ✓ */
  --brand-soft: rgba(81, 139, 219, 0.12); /* 品牌弱底：选中背景、用户气泡、running 徽章底 */

  /* ==== §5 语义状态色 ====================================================
     Micro 明确把 Signal Green / Live Lime 定义为「supporting accent, not a
     status color」（参考稿 line 37-38），marker 调色板是分类语义而非状态语义。
     因此 Workbench 的状态色系统独立于 Micro，整套沿用 v1 已过 AA 的值不动，
     实测值继承 design/tokens.css:266-296。裁决见 DESIGN.md v2 §3.4。 */
  --ok: oklch(0.56 0.14 150);             /* 成功绿。对 surface 4.37 △（徽章/大字）；正文级绿用 --diff-add */
  --ok-soft: oklch(0.56 0.14 150 / 11%);
  --warn: oklch(0.66 0.14 80);            /* 警示黄。对 surface 3.16 △ / canvas 3.01 △ / shell 2.90 ✗（shell 底禁用，改配 -soft 底） */
  --warn-soft: oklch(0.66 0.14 80 / 12%);
  --danger: oklch(0.56 0.20 25);          /* 危险红。对 surface 5.15 ✓ / canvas 4.90 ✓ / shell 4.72 ✓ */
  --danger-soft: oklch(0.56 0.20 25 / 10%);
  --info: oklch(0.55 0.13 235);           /* 信息青蓝。对 surface 4.80 ✓ / canvas 4.57 ✓ / shell 4.40 △ */
  --info-soft: oklch(0.55 0.13 235 / 10%);

  /* ==== §6 Micro marker 分类色板（新增层） ================================
     参考稿 line 226「never monochrome the icon set」+ line 233「the multicolor
     icon system is closed」。用途严格限定：图标/标签的分类语义 + 对外页面
     context graph 节点边框。禁作状态、禁作装饰、禁作正文。
     亮底上全部 <4.5（见标注），所以亮色下只做图形/边框/pill 底；需要写字时
     用配套的 -ink 加深版。纪律与配额见 DESIGN.md v2 §3.5。 */
  --marker-teal: rgb(54, 186, 184);    /* Micro Teal Pulse（原稿 hex 36bab8）。对 surface 2.37 ✗ 仅图形/底色 */
  --marker-coral: rgb(237, 109, 104);  /* Micro Coral Marker（原稿 hex ed6d68）。对 surface 3.01 △ 仅图形 */
  --marker-amber: rgb(229, 160, 87);   /* Micro Amber Marker（原稿 hex e5a057）。对 surface 2.21 ✗ 仅图形/底色 */
  --marker-orchid: rgb(191, 137, 205); /* Micro Orchid Marker（原稿 hex bf89cd）。对 surface 2.74 ✗ 仅图形/底色 */
  --marker-azure: var(--brand);        /* Micro Azure 也是 marker 之一；复用 --brand，不另立值 */
  --marker-teal-soft: rgba(54, 186, 184, 0.15);    /* Micro Badge 规范：marker 色 0.15 alpha 作底 */
  --marker-coral-soft: rgba(237, 109, 104, 0.15);
  --marker-amber-soft: rgba(229, 160, 87, 0.15);
  --marker-orchid-soft: rgba(191, 137, 205, 0.15);

  /* ==== §7 对外页面专属色（产品 console 与对话区禁用） ====================
     参考稿的 marketing 专属件用色。DESIGN.md v2 §7 规定这些 token 只允许
     出现在对外页面的 CSS 作用域内。 */
  --wash-mint: rgb(203, 251, 241);     /* Micro Mint Wash（原稿 hex cbfbf1）。--ink 在其上 14.53 ✓，--ink-2 仅 4.22 △ → wash 上正文用 --ink */
  --wash-peach: rgb(248, 235, 216);    /* Micro Peach Wash（原稿 hex f8ebd8）。--ink 13.95 ✓ */
  --wash-lavender: rgb(237, 233, 254); /* Micro Lavender Wash（原稿 hex ede9fe）。--ink 13.81 ✓ */
  --wash-teal: rgb(207, 242, 239);     /* Micro Teal Mist（原稿 hex cff2ef）。--ink 13.74 ✓ */
  --forest-edge: rgb(26, 58, 18);      /* Micro Forest Edge（原稿 hex 1a3a12）。产品截图框线；作文字对白 12.67 ✓ */
  --decor-green: rgb(58, 107, 42);     /* Micro Signal Green（原稿 hex 3a6b2a）。装饰绿，对白 6.33 ✓，但原稿禁止用作状态色 */
  --decor-lime: rgb(126, 250, 85);     /* Micro Live Lime（原稿 hex 7efa55）。仅作大色块底；--ink 在其上 12.25 ✓，自身作文字 1.34 ✗ */
  --gradient-sky: linear-gradient(to right in oklab, rgb(81, 139, 219) 0%, rgb(54, 186, 184) 100%); /* Micro 招牌渐变。全站唯一允许位置：对外页面 hero 顶部，每页 ≤1 次（DESIGN.md v2 §3.1） */

  /* ==== §8 角色 accent（沿用 v1，刻意不并入 marker 板） ==================
     v1 的 5 个角色色相是为了避开语义色相而选的；Micro marker 的 coral 与
     --danger 撞色（都在 25° 附近）、teal 与 --info 相邻，直接换会破坏
     「状态 vs 身份」的可辨性。裁决：角色色保持 v1 不动，marker 板另立门户。
     实测值继承 design/tokens.css:47-61（徽章/monogram 级 ≥3:1）。 */
  --role-techlead: oklch(0.53 0.13 305);
  --role-techlead-soft: oklch(0.53 0.13 305 / 14%);
  --role-dev: oklch(0.53 0.10 200);
  --role-dev-soft: oklch(0.53 0.10 200 / 15%);
  --role-design: oklch(0.55 0.14 345);
  --role-design-soft: oklch(0.55 0.14 345 / 13%);
  --role-research: oklch(0.58 0.12 55);
  --role-research-soft: oklch(0.58 0.12 55 / 15%);
  --role-qa: oklch(0.54 0.12 140);
  --role-qa-soft: oklch(0.54 0.12 140 / 14%);

  /* ==== §9 diff 色（Micro 无对应规范，沿用 v1 实测） ====================== */
  --diff-add: oklch(0.50 0.13 150);          /* 对 --diff-add-bg 5.11 ✓ */
  --diff-add-bg: oklch(0.56 0.14 150 / 8%);
  --diff-del: oklch(0.52 0.17 25);           /* 对 --diff-del-bg 5.32 ✓ */
  --diff-del-bg: oklch(0.56 0.20 25 / 8%);

  /* ==== §10 阴影（Micro Elevation 四档 → 本项目三档 + 两枚专用） ==========
     参考稿 line 248-251 原值照录。注意 Micro「卡片 = 1px 边框 + 两层柔和阴影」
     只适用于被识别为卡片的表面；过程时间线依然无卡无影（DESIGN.md v2 §5.2）。 */
  --sh-1: 0px 1px 3px rgba(0, 0, 0, 0.1), 0px 1px 2px -1px rgba(0, 0, 0, 0.1);   /* 一档 = Micro Default card：回答卡、composer 盒、任务卡 */
  --sh-2: 0px 10px 15px -3px rgba(0, 0, 0, 0.1), 0px 4px 6px -4px rgba(0, 0, 0, 0.1); /* 二档 = Micro Elevated：popover、下拉、浮动面板 */
  --sh-3: 0px 20px 25px -5px rgba(0, 0, 0, 0.1), 0px 8px 10px -6px rgba(0, 0, 0, 0.1); /* 三档 = Micro shadow-xl：抽屉、底部 sheet、对话框 */
  --sh-ring: 0px 0px 0px 1px rgba(39, 39, 42, 0.065);  /* Micro Bordered card 的 hairline 环层，可与 --sh-1 叠加 */
  --sh-press: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.2); /* Micro Pressed button：主按钮 :active 用，非常驻 */

  /* ==== §11 焦点环 ======================================================
     Micro Search Input 规范「Focus state: 2px ring in azure」。2px 实色环对
     surface 3.46:1，满足 WCAG 非文字对比 3:1。禁止裸 outline:none。 */
  --focus-ring: 0 0 0 2px var(--brand);

  /* ==== §12 实底上的字 =================================================
     v2.2 修正：--on-brand 原本被归进「固定色」，那是错的。主按钮按 §7.1 是
     --ink 实底，而 --ink 在暗色下是 Paper White —— 若 --on-brand 恒为白，
     暗色主按钮就是白底白字（实测 1.08:1，等于不可见）。它必须跟 --ink 一起
     翻转，因此在下方三个主题块里都有对应值。 */
  --on-brand: rgb(255, 255, 255);   /* 亮色：--ink 实底上的白字，16.40 ✓。注意白字对 --brand 填充仅 3.46 △ → azure 填充上的文字必须 ≥14px/600，故主按钮不用 azure 底 */

  /* ==== §12b 真·固定色（不随主题变化） =================================== */
  --scrim: oklch(0.10 0.01 286 / 32%); /* 抽屉/sheet 遮罩（沿用 v1） */
  --code-bg: oklch(0.21 0.03 262);  /* Markdown 代码块固定暗底（亮暗一致，沿用 v1） */
  --code-ink: oklch(0.93 0.01 262); /* 代码块文字，对 --code-bg ≈13:1 ✓（沿用 v1） */

  /* ==== §13 字体三栈 =====================================================
     零外链硬规定：三个字族全部自托管 woff2，禁 CDN / Google Fonts link。
     --mono 逐字沿用 v1：cc-test-design-tokens.mjs:401-414 要求全站
     「ui-monospace」字面量只出现一次且只在 --mono 定义里，不得新增 mono 栈。 */
  --sans: "Inter", -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", system-ui, sans-serif; /* 正文/UI（Micro haffer 的免费替代：Inter）。用可变字体单文件，@font-face 声明 font-weight: 100 900，故 425/550/650 等非标准档可用；中文回退不变 */
  --display: "Playfair Display", Georgia, "Songti SC", "SimSun", serif; /* 编辑体大标题（Micro perfectlyNineties 的免费替代）。仅对外页面可用，产品 console 与对话区禁用 */
  --mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace; /* 等宽栈（Micro 本身就是系统栈方案，逐字沿用 v1） */

  /* ==== §14 type scale ===================================================
     产品 console 与对话区保留 v1 六档（Micro 的 scale 跳档为 marketing 设计，
     控制台需要 13px 这一档承载时间线密度）；对外页面用 Micro 全量档。 */
  --fs-12: 12px;      /* Label/徽章/section header（= Micro caption） */
  --fs-mono: 12.5px;  /* 等宽专用：时间线目标、diff、代码块 */
  --fs-13: 13px;      /* 次级信息：时间线、说明文字、次按钮（本项目档，Micro 无） */
  --fs-14: 14px;      /* 桌面正文（= Micro body-sm，也是 Micro 产品 UI 的主字号） */
  --fs-15: 15px;      /* 区块标题 / 移动端正文（本项目档） */
  --fs-17: 17px;      /* 页面标题（本项目档，最高层级，每屏一个） */
  --fs-10: 10px;      /* eyebrow（= Micro eyebrow，配 --ls-eyebrow） */
  --fs-16: 16px;      /* 对外页面正文（= Micro body） */
  --fs-18: 18px;      /* 对外页面副标题（= Micro subheading） */
  --fs-24: 24px;      /* 对外页面 H3（= Micro heading-sm） */
  --fs-30: 30px;      /* 对外页面 H2（= Micro heading） */
  --fs-48: 48px;      /* 对外页面 H1（= Micro heading-lg） */
  --fs-72: 72px;      /* 对外页面 hero display（= Micro display） */
  --fs-96: 96px;      /* 对外页面品牌字（= Micro hero-mark） */

  /* ==== §15 行高与字距 ===================================================
     --lh-body 必须留在 1.6：cc-test-design-tokens.mjs:395 硬断言该值，且中文
     混排呼吸感是 v1 的硬规则。Micro 的 1.5 只用于对外页面英文段落。 */
  --lh-body: 1.6;         /* 正文行高（中文混排底线，不得调低） */
  --lh-en: 1.5;           /* 对外页面英文段落行高（= Micro body/subheading） */
  --lh-mono: 1.55;        /* 等宽行高 */
  --lh-tight: 1.3;        /* 紧凑行高：标题、单行标签 */
  --lh-display: 1.0;      /* 对外页面 display/hero-mark 行高（= Micro） */
  --ls-caps: 0.1em;       /* 全大写字距 = Micro eyebrow 的 1px@10px。高于 v1 的 0.06em 下限，craft 硬规则仍满足 */
  --ls-title: -0.015em;   /* 17–18px 标题字距（Micro 的 -0.025em 在 17px 上过紧，取半档） */
  --ls-display: -0.025em; /* 24px+ 无衬线大标题（= Micro haffer「tight -0.025em at 24px+」） */
  --ls-editorial: 0.02em; /* 对外页面编辑体大标题的正字距（= Micro perfectlyNineties 招牌 0.02em，反潮流的开放字距） */

  /* ==== §16 字重 =========================================================
     Inter 走可变字体单文件（DESIGN.md v2 §13 Q2 已定 = B），任意档位可用，
     所以 v1 的 550/650 原样保留，不必迁就静态字重档。
     Micro 的 400/500/600/700/900 是它自己的档位表，不构成对我们的约束。 */
  --fw-body: 400;     /* 阅读：正文 */
  --fw-ui: 550;       /* 强调：按钮、session 名、任务标题（v1 值保留） */
  --fw-title: 650;    /* 宣告：页面/区块标题（v1 值保留） */
  --fw-label: 600;    /* 小字补充档：≤12px 的 label/徽章 */
  --fw-display: 700;  /* 对外页面 display 标题 */
  --fw-black: 900;    /* 对外页面 hero 品牌字（Playfair Display 900） */

  /* ==== §17 间距（4px 基数，= Micro base unit） ========================== */
  --sp-1: 4px;        /* 徽章内距、行间微距 */
  --sp-2: 8px;        /* 元素间隙（= Micro element gap） */
  --sp-3: 12px;       /* 组件内距：紧凑卡、抽屉行距 */
  --sp-4: 16px;       /* 标准内距（= Micro card padding） */
  --sp-5: 20px;       /* 区块间距：消息之间 */
  --sp-6: 24px;       /* 大区块间距 */
  --sp-8: 32px;       /* 章节间距：主区左右留白（= Micro pastel block padding） */
  --sp-40: 40px;      /* 以下五档为对外页面节奏尺（= Micro spacing 40/48/64/80/96） */
  --sp-48: 48px;
  --sp-64: 64px;      /* = Micro section gap */
  --sp-80: 80px;
  --sp-96: 96px;

  /* ==== §18 组件专属间距（沿用 v1，webchat 结构保真） ==================== */
  --bubble-pad: 12px 14px;
  --turn-gap: var(--sp-6);

  /* ==== §19 圆角（Micro 尺；迁移对照见 DESIGN.md v2 §10） ================ */
  --r-xs: 4px;        /* Micro radius-md：小 chrome 与图标专用。禁用于卡片（参考稿 line 232） */
  --r-sm: 8px;        /* Micro buttons / inputs / nav-pills（v1 6px → 8px） */
  --r: 14px;          /* Micro small-cards：产品行、消息气泡、回答卡（v1 10px → 14px） */
  --r-lg: 18px;       /* Micro large-cards / feature-blocks：桌面外框、大浮层、context graph 节点（v1 14px → 18px） */
  --r-2xl: 28px;      /* composer 胶囊感（沿用 wb-ui --wbui-r-xl 原值，结构保真，不属 Micro 卡片尺） */
  --r-full: 9999px;   /* Micro pills（v1 999px → 9999px） */

  /* ==== §20 布局（对外页面） ============================================= */
  --page-max: 1200px; /* = Micro page max-width。产品 console 不受此限（超宽屏另有规则） */

  /* ==== §21 触控 / 层级 / 动效（Micro 未涉及，全部沿用 v1） ============== */
  --tap-min: 44px;
  --tap-aa: 24px;
  --z-popover: 20;
  --z-scrim: 30;
  --z-drawer: 40;
  --z-toast: 50;
  --dur-1: 100ms;
  --dur-2: 150ms;
  --dur-3: 250ms;
  --ease-standard: cubic-bezier(0.2, 0, 0, 1);
}

/* ============================================================================
   暗色镜像（跟随系统）。Micro 原稿只有 light，本段由 Micro 色相推导：
   中性阶梯沿用 Ink Black 的暖比例（R:G:B ≈ 1 : 0.912 : 0.824），
   主文字用 Paper White 原值（不纯白），卡面用 Ink Black 原值（不纯黑）。
   每行标注均为实算值，复算见 design/tools/micro-contrast.mjs。
   ========================================================================== */
@media (prefers-color-scheme: dark) {
  :root {
    color-scheme: dark;
    --shell: rgb(24, 22, 20);     /* 外框：Ink Black 家族压暗两档，非纯黑 */
    --canvas: rgb(29, 27, 24);    /* 画布：略浅于外框 */
    --surface: rgb(34, 31, 28);   /* 卡片 = Micro Ink Black 原值（原稿 hex 221f1c）——暗色即「反转的 ink-on-paper」 */
    --raised: rgb(42, 39, 35);    /* 浮层：比卡片再亮一档 */
    --hover: rgb(52, 48, 44);     /* 悬停：最亮的中性层 */
    --border: rgba(245, 245, 245, 0.10); /* 强边框：暗色用半透明 Paper White */
    --border-soft: rgba(245, 245, 245, 0.06);
    --ink: rgb(245, 245, 245);    /* 主文字 = Micro Paper White 原值（不纯白 ✓）。对 surface 15.04 ✓ / canvas 15.76 ✓ / shell 16.55 ✓ / raised 13.64 ✓ / hover 12.00 ✓ */
    --ink-2: rgb(176, 168, 156);  /* 次文字：Stone Gray 沿同一暖色相提亮至暗色可读区。对 surface 6.97 ✓ / canvas 7.30 ✓ / shell 7.67 ✓ / raised 6.32 ✓ / hover 5.56 ✓ */
    --ink-2-deep: rgb(176, 168, 156); /* 暗色下无需加深版（--ink-2 已全底达标），与 --ink-2 同值以保持 API 一致 */
    --ink-3: rgb(140, 138, 136);  /* 辅助文字 = Micro Pebble 原值（暗色保留原值，不跟亮色一起加深）。对 surface 4.77 ✓ / canvas 5.00 ✓ / shell 5.25 ✓ / raised 4.32 △ / hover 3.80 △ */
    --brand: rgb(81, 139, 219);   /* Micro Azure 原值在暗底上自然达标。对 surface 4.74 ✓ / canvas 4.96 ✓ / raised 4.29 △ / hover 3.78 △ */
    --brand-ink: rgb(122, 173, 235); /* 蓝色文字/链接的暗色提亮版。对 surface 7.03 ✓ / hover 5.61 ✓ */
    --brand-soft: rgba(81, 139, 219, 0.20);
    --ok: oklch(0.68 0.13 150);   /* 语义色沿用 v1 暗色值；实测按新 surface 亮度换算：6.10 ✓ */
    --ok-soft: oklch(0.68 0.13 150 / 16%);
    --warn: oklch(0.72 0.13 80);  /* 6.61 ✓（暗色下 warn 可作文字） */
    --warn-soft: oklch(0.72 0.13 80 / 16%);
    --danger: oklch(0.68 0.17 25); /* 5.35 ✓ */
    --danger-soft: oklch(0.68 0.17 25 / 16%);
    --info: oklch(0.68 0.12 235);  /* 5.84 ✓ */
    --info-soft: oklch(0.68 0.12 235 / 16%);
    --marker-teal: rgb(54, 186, 184);    /* marker 板在暗底上全部达正文级，原值不动：6.93 ✓ */
    --marker-coral: rgb(237, 109, 104);  /* 5.46 ✓ */
    --marker-amber: rgb(229, 160, 87);   /* 7.42 ✓ */
    --marker-orchid: rgb(191, 137, 205); /* 5.99 ✓ */
    --marker-teal-soft: rgba(54, 186, 184, 0.20);
    --marker-coral-soft: rgba(237, 109, 104, 0.20);
    --marker-amber-soft: rgba(229, 160, 87, 0.20);
    --marker-orchid-soft: rgba(191, 137, 205, 0.20);
    --wash-mint: rgba(54, 186, 184, 0.12);    /* 暗色下 pastel 实色会刺眼，改为同色相低透明底（对外页面暗色态） */
    --wash-peach: rgba(229, 160, 87, 0.12);
    --wash-lavender: rgba(191, 137, 205, 0.12);
    --wash-teal: rgba(54, 186, 184, 0.09);
    --forest-edge: rgb(58, 107, 42);  /* 暗底上 Forest Edge 原值几乎不可见，提到 Signal Green 一档 */
    --decor-green: rgb(58, 107, 42);
    --decor-lime: rgb(126, 250, 85);
    --gradient-sky: linear-gradient(to right in oklab, rgb(45, 82, 133) 0%, rgb(31, 110, 109) 100%); /* 暗色 hero：同色相降亮度约 45%，避免暗色下的荧光屏效果 */
    --role-techlead: oklch(0.70 0.13 305); --role-techlead-soft: oklch(0.70 0.13 305 / 20%);
    --role-dev: oklch(0.70 0.10 200); --role-dev-soft: oklch(0.70 0.10 200 / 20%);
    --role-design: oklch(0.72 0.13 345); --role-design-soft: oklch(0.72 0.13 345 / 18%);
    --role-research: oklch(0.74 0.12 55); --role-research-soft: oklch(0.74 0.12 55 / 20%);
    --role-qa: oklch(0.70 0.12 140); --role-qa-soft: oklch(0.70 0.12 140 / 18%);
    --diff-add: oklch(0.72 0.13 150);          /* 对暗 add-bg 4.63 ✓ */
    --diff-add-bg: oklch(0.68 0.13 150 / 12%);
    --diff-del: oklch(0.72 0.15 25);           /* 对暗 del-bg 4.34 △：12.5px mono 且始终配 +/− 符号双通道（沿用 v1 已接受的边界） */
    --diff-del-bg: oklch(0.68 0.17 25 / 12%);
    --sh-1: 0 1px 2px rgba(0, 0, 0, 0.5);      /* 暗色阴影加重才可见（Micro 未提供暗色阴影，沿用 v1 策略） */
    --sh-2: 0 10px 15px -3px rgba(0, 0, 0, 0.55), 0 4px 6px -4px rgba(0, 0, 0, 0.4);
    --sh-3: 0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 8px 10px -6px rgba(0, 0, 0, 0.45);
    --sh-ring: 0px 0px 0px 1px rgba(245, 245, 245, 0.08);
    --sh-press: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.35);
    --focus-ring: 0 0 0 2px var(--brand-ink);  /* 暗色焦点环用提亮蓝，保证对 raised/hover 也 ≥3 */
    --on-brand: rgb(34, 31, 28);  /* 暗色实底上的深字 = Micro Ink Black。对 --ink 填充（Paper White）15.04 ✓；对暗色 --brand 4.31 ✓、--danger 6.4 ✓，都优于白字 */
  }
}

/* ============================================================================
   手动锁定暗色（值与上方 @media 段完全一致）
   ========================================================================== */
:root[data-theme="dark"] {
  color-scheme: dark;
  --shell: rgb(24, 22, 20);
  --canvas: rgb(29, 27, 24);
  --surface: rgb(34, 31, 28);
  --raised: rgb(42, 39, 35);
  --hover: rgb(52, 48, 44);
  --border: rgba(245, 245, 245, 0.10);
  --border-soft: rgba(245, 245, 245, 0.06);
  --ink: rgb(245, 245, 245);
  --ink-2: rgb(176, 168, 156);
  --ink-2-deep: rgb(176, 168, 156);
  --ink-3: rgb(140, 138, 136);
  --brand: rgb(81, 139, 219);
  --brand-ink: rgb(122, 173, 235);
  --brand-soft: rgba(81, 139, 219, 0.20);
  --ok: oklch(0.68 0.13 150);
  --ok-soft: oklch(0.68 0.13 150 / 16%);
  --warn: oklch(0.72 0.13 80);
  --warn-soft: oklch(0.72 0.13 80 / 16%);
  --danger: oklch(0.68 0.17 25);
  --danger-soft: oklch(0.68 0.17 25 / 16%);
  --info: oklch(0.68 0.12 235);
  --info-soft: oklch(0.68 0.12 235 / 16%);
  --marker-teal: rgb(54, 186, 184);
  --marker-coral: rgb(237, 109, 104);
  --marker-amber: rgb(229, 160, 87);
  --marker-orchid: rgb(191, 137, 205);
  --marker-teal-soft: rgba(54, 186, 184, 0.20);
  --marker-coral-soft: rgba(237, 109, 104, 0.20);
  --marker-amber-soft: rgba(229, 160, 87, 0.20);
  --marker-orchid-soft: rgba(191, 137, 205, 0.20);
  --wash-mint: rgba(54, 186, 184, 0.12);
  --wash-peach: rgba(229, 160, 87, 0.12);
  --wash-lavender: rgba(191, 137, 205, 0.12);
  --wash-teal: rgba(54, 186, 184, 0.09);
  --forest-edge: rgb(58, 107, 42);
  --decor-green: rgb(58, 107, 42);
  --decor-lime: rgb(126, 250, 85);
  --gradient-sky: linear-gradient(to right in oklab, rgb(45, 82, 133) 0%, rgb(31, 110, 109) 100%);
  --role-techlead: oklch(0.70 0.13 305); --role-techlead-soft: oklch(0.70 0.13 305 / 20%);
  --role-dev: oklch(0.70 0.10 200); --role-dev-soft: oklch(0.70 0.10 200 / 20%);
  --role-design: oklch(0.72 0.13 345); --role-design-soft: oklch(0.72 0.13 345 / 18%);
  --role-research: oklch(0.74 0.12 55); --role-research-soft: oklch(0.74 0.12 55 / 20%);
  --role-qa: oklch(0.70 0.12 140); --role-qa-soft: oklch(0.70 0.12 140 / 18%);
  --diff-add: oklch(0.72 0.13 150);
  --diff-add-bg: oklch(0.68 0.13 150 / 12%);
  --diff-del: oklch(0.72 0.15 25);
  --diff-del-bg: oklch(0.68 0.17 25 / 12%);
  --sh-1: 0 1px 2px rgba(0, 0, 0, 0.5);
  --sh-2: 0 10px 15px -3px rgba(0, 0, 0, 0.55), 0 4px 6px -4px rgba(0, 0, 0, 0.4);
  --sh-3: 0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 8px 10px -6px rgba(0, 0, 0, 0.45);
  --sh-ring: 0px 0px 0px 1px rgba(245, 245, 245, 0.08);
  --sh-press: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.35);
  --focus-ring: 0 0 0 2px var(--brand-ink);
  --on-brand: rgb(34, 31, 28);
}

/* ============================================================================
   手动锁定亮色（值与 :root 默认段完全一致）
   ========================================================================== */
:root[data-theme="light"] {
  color-scheme: light;
  --shell: rgb(245, 245, 245);
  --canvas: rgb(250, 249, 248);
  --surface: rgb(255, 255, 255);
  --raised: rgb(255, 255, 255);
  --hover: rgb(237, 236, 233);
  --border: rgba(39, 39, 42, 0.14);
  --border-soft: rgba(39, 39, 42, 0.065);
  --ink: rgb(34, 31, 28);
  --ink-2: rgb(121, 114, 103);
  --ink-2-deep: rgb(108, 101, 90);
  --ink-3: rgb(134, 132, 130);
  --brand: rgb(81, 139, 219);
  --brand-ink: oklch(0.545 0.155 255);
  --brand-soft: rgba(81, 139, 219, 0.12);
  --ok: oklch(0.56 0.14 150);
  --ok-soft: oklch(0.56 0.14 150 / 11%);
  --warn: oklch(0.66 0.14 80);
  --warn-soft: oklch(0.66 0.14 80 / 12%);
  --danger: oklch(0.56 0.20 25);
  --danger-soft: oklch(0.56 0.20 25 / 10%);
  --info: oklch(0.55 0.13 235);
  --info-soft: oklch(0.55 0.13 235 / 10%);
  --marker-teal: rgb(54, 186, 184);
  --marker-coral: rgb(237, 109, 104);
  --marker-amber: rgb(229, 160, 87);
  --marker-orchid: rgb(191, 137, 205);
  --marker-teal-soft: rgba(54, 186, 184, 0.15);
  --marker-coral-soft: rgba(237, 109, 104, 0.15);
  --marker-amber-soft: rgba(229, 160, 87, 0.15);
  --marker-orchid-soft: rgba(191, 137, 205, 0.15);
  --wash-mint: rgb(203, 251, 241);
  --wash-peach: rgb(248, 235, 216);
  --wash-lavender: rgb(237, 233, 254);
  --wash-teal: rgb(207, 242, 239);
  --forest-edge: rgb(26, 58, 18);
  --decor-green: rgb(58, 107, 42);
  --decor-lime: rgb(126, 250, 85);
  --gradient-sky: linear-gradient(to right in oklab, rgb(81, 139, 219) 0%, rgb(54, 186, 184) 100%);
  --role-techlead: oklch(0.53 0.13 305); --role-techlead-soft: oklch(0.53 0.13 305 / 14%);
  --role-dev: oklch(0.53 0.10 200); --role-dev-soft: oklch(0.53 0.10 200 / 15%);
  --role-design: oklch(0.55 0.14 345); --role-design-soft: oklch(0.55 0.14 345 / 13%);
  --role-research: oklch(0.58 0.12 55); --role-research-soft: oklch(0.58 0.12 55 / 15%);
  --role-qa: oklch(0.54 0.12 140); --role-qa-soft: oklch(0.54 0.12 140 / 14%);
  --diff-add: oklch(0.50 0.13 150);
  --diff-add-bg: oklch(0.56 0.14 150 / 8%);
  --diff-del: oklch(0.52 0.17 25);
  --diff-del-bg: oklch(0.56 0.20 25 / 8%);
  --sh-1: 0px 1px 3px rgba(0, 0, 0, 0.1), 0px 1px 2px -1px rgba(0, 0, 0, 0.1);
  --sh-2: 0px 10px 15px -3px rgba(0, 0, 0, 0.1), 0px 4px 6px -4px rgba(0, 0, 0, 0.1);
  --sh-3: 0px 20px 25px -5px rgba(0, 0, 0, 0.1), 0px 8px 10px -6px rgba(0, 0, 0, 0.1);
  --sh-ring: 0px 0px 0px 1px rgba(39, 39, 42, 0.065);
  --sh-press: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.2);
  --focus-ring: 0 0 0 2px var(--brand);
  --on-brand: rgb(255, 255, 255);
}

/* ============================================================================
   §22 wb-ui 重映射（对话区 Micro 化；由 dev 轮2 启用）
   -----------------------------------------------------------------------
   用户 2026-08-15 拍板：wb-ui 组件的「颜色 / 字体 / 圆角」重新映射到 Micro
   token，「结构与动效保留」。因此本段只重定义颜色·字体·圆角三类
   --wbui-* ，而 --wbui-ease-* / --wbui-dur-* / --wbui-header-h / 各组件的
   几何常量一律不出现在这里 —— 它们继续由 design/wb-ui/lib/tokens.css 供给，
   CLI 单行拉平、嵌套 ≤4、diff 结构化卡等 R3 成果不受影响。

   启用方式（轮2）：在 apps/web/index.html 的 <style id="wbui-skin"> 之后加载
   本段，让它覆盖 wb-ui 自带的同名变量；不要删除 design/wb-ui/lib/tokens.css，
   展示站仍需要原值做 1:1 对照。
   ========================================================================== */
:root {
  /* 背景与表面 */
  --wbui-bg: var(--shell);
  --wbui-bg-subtle: var(--shell);
  --wbui-stage: var(--canvas);
  --wbui-surface: var(--surface);
  --wbui-surface-2: var(--hover);
  --wbui-code-bg: var(--hover);
  /* 边框 */
  --wbui-border: var(--border-soft);
  --wbui-border-strong: var(--border);
  /* 文字 */
  --wbui-ink: var(--ink);
  --wbui-ink-2: var(--ink-2);
  --wbui-ink-3: var(--ink-3);
  /* 强调：wb-ui 的 accent 原本是近黑实底，正好等同 Micro Dark Filled Button */
  --wbui-accent: var(--ink);
  --wbui-accent-hover: var(--ink-2-deep);
  --wbui-accent-soft: var(--hover);
  --wbui-on-accent: var(--on-brand);
  --wbui-ok: var(--ok);
  --wbui-warn: var(--warn);
  --wbui-danger: var(--danger);
  /* 骨架 / 流光 */
  --wbui-shimmer-base: var(--hover);
  --wbui-shimmer-hi: var(--canvas);
  --wbui-label-shimmer-ink: var(--ink-3);
  --wbui-label-shimmer-fade: rgba(134, 132, 130, 0.45);
  /* 阴影 */
  --wbui-sh-sm: var(--sh-1);
  --wbui-sh-md: var(--sh-2);
  --wbui-sh-lg: var(--sh-3);
  --wbui-sh-card: var(--sh-ring), var(--sh-1);
  --wbui-sh-elevated: var(--sh-ring), var(--sh-1);
  /* 圆角：8/14/18 三档，28 保留为 composer 胶囊 */
  --wbui-r-sm: var(--r-sm);
  --wbui-r: var(--r);
  --wbui-r-lg: var(--r);
  --wbui-r-xl: var(--r-2xl);
  /* 字体：wb-ui 原本回退系统栈，这里统一到自托管 Inter */
  --wbui-sans: var(--sans);
  --wbui-mono: var(--mono);
  /* 字重：保持 wb-ui/aicss 原值，不转发到 --fw-*。Inter 走可变字体后 425 这个
     非标准档也能渲染，所以对话区的字重可以 1:1 保真；而产品侧的 550/650 是另一
     套节奏，转发过来只会让对话区无谓变重。 */
  --wbui-fw-regular: 425;
  --wbui-fw-medium: 500;
  --wbui-fw-semibold: 600;
  /* 组件专属色（只映射颜色，几何与动效保持原值） */
  --wbui-ws-text: var(--ink);
  --wbui-ws-muted: var(--ink-2);
  --wbui-ws-subtle: var(--ink-3);
  --wbui-ws-border: var(--border-soft);
  --wbui-ws-success: var(--ok);
  --wbui-diff-add: var(--diff-add);
  --wbui-diff-add-bg: var(--diff-add-bg);
  --wbui-diff-del: var(--diff-del);
  --wbui-diff-del-bg: var(--diff-del-bg);
  --wbui-diff-gutter: var(--border-soft);
  --wbui-diff-shadow: var(--sh-ring), var(--sh-1);
  --wbui-tr-label: var(--ink-3);
  --wbui-tr-verb: var(--ink-2);
  --wbui-tr-sentence: var(--ink-2);
  --wbui-cb-ring: var(--sh-ring);
  --wbui-todo-shimmer-ink: var(--ink);
  --wbui-todo-shimmer-fade: rgba(34, 31, 28, 0.45);
  --wbui-pi-ring: var(--sh-ring), var(--sh-1);
  --wbui-pi-menu-shadow: var(--sh-2);
  /* PromptInput 的 enhancing conic 环：aicss 原用四色霓虹，改为 Micro marker 板
     （参考稿 line 233「the multicolor icon system is closed」，不引入新色相） */
  --wbui-pi-conic-1: var(--marker-azure);
  --wbui-pi-conic-2: var(--marker-orchid);
  --wbui-pi-conic-3: var(--marker-coral);
  --wbui-pi-conic-4: var(--marker-teal);
  --wbui-pi-pill-bg: var(--brand-soft);
  --wbui-pi-pill-bg-hover: rgba(81, 139, 219, 0.18);
  --wbui-pi-pill-ink: var(--brand-ink);
  --wbui-pi-btn-fill: rgba(34, 31, 28, 0.06);
  --wbui-pi-btn-fill-hover: rgba(34, 31, 28, 0.10);
  --wbui-pi-btn-fill-open: rgba(34, 31, 28, 0.12);
  --wbui-pi-chip-x-hover: rgba(34, 31, 28, 0.08);
  --wbui-pi-shimmer-ink: var(--ink);
  --wbui-pi-shimmer-fade: rgba(34, 31, 28, 0.45);
  --wbui-cite-mark-bg: var(--hover);
  --wbui-cite-mark-bg-hover: var(--border);
  --wbui-tbl-head-bg: var(--shell);
  --wbui-tbl-outer-border: var(--border-soft);
  --wbui-tbl-icon-ring: inset 0 0 0 0.5px rgba(39, 39, 42, 0.18);
  --wbui-ig-canvas: var(--shell);
  --wbui-ig-res-bg: rgba(255, 255, 255, 0.72);
}

/* wb-ui 重映射的暗色补丁：只有「随主题变化且不是 var() 转发」的少数项需要重写。 */
@media (prefers-color-scheme: dark) {
  :root {
    --wbui-label-shimmer-fade: rgba(176, 168, 156, 0.45);
    --wbui-todo-shimmer-fade: rgba(245, 245, 245, 0.45);
    --wbui-pi-shimmer-fade: rgba(245, 245, 245, 0.45);
    --wbui-pi-pill-bg-hover: rgba(81, 139, 219, 0.26);
    --wbui-pi-btn-fill: rgba(245, 245, 245, 0.06);
    --wbui-pi-btn-fill-hover: rgba(245, 245, 245, 0.10);
    --wbui-pi-btn-fill-open: rgba(245, 245, 245, 0.12);
    --wbui-pi-chip-x-hover: rgba(245, 245, 245, 0.08);
    --wbui-tbl-icon-ring: inset 0 0 0 0.5px rgba(245, 245, 245, 0.18);
    --wbui-ig-res-bg: rgba(34, 31, 28, 0.72);
  }
}

:root[data-theme="dark"] {
  --wbui-label-shimmer-fade: rgba(176, 168, 156, 0.45);
  --wbui-todo-shimmer-fade: rgba(245, 245, 245, 0.45);
  --wbui-pi-shimmer-fade: rgba(245, 245, 245, 0.45);
  --wbui-pi-pill-bg-hover: rgba(81, 139, 219, 0.26);
  --wbui-pi-btn-fill: rgba(245, 245, 245, 0.06);
  --wbui-pi-btn-fill-hover: rgba(245, 245, 245, 0.10);
  --wbui-pi-btn-fill-open: rgba(245, 245, 245, 0.12);
  --wbui-pi-chip-x-hover: rgba(245, 245, 245, 0.08);
  --wbui-tbl-icon-ring: inset 0 0 0 0.5px rgba(245, 245, 245, 0.18);
  --wbui-ig-res-bg: rgba(34, 31, 28, 0.72);
}

/* ============================================================================
   §23 对比度验算总表（WCAG 2.x 相对亮度法，逐通道 sRGB→linear 手工换算）
   复算命令：node design/tools/micro-contrast.mjs
   门槛：正文 ≥4.5；次级/大字/图形 ≥3.0。

   ── 亮色（文字 / 背景） ─────────────────────────  比值   结论
   --ink / --surface                                 16.40  正文 ✓
   --ink / --canvas                                  15.59  正文 ✓
   --ink / --shell                                   15.04  正文 ✓
   --ink / --hover                                   13.88  正文 ✓
   --ink / --wash-mint                               14.53  正文 ✓
   --ink / --wash-peach                              13.95  正文 ✓
   --ink / --wash-lavender                           13.81  正文 ✓
   --ink / --wash-teal                               13.74  正文 ✓
   --ink / --decor-lime                              12.25  正文 ✓
   --ink-2 / --surface                                4.76  正文 ✓
   --ink-2 / --canvas                                 4.52  正文 ✓（贴线）
   --ink-2 / --shell                                  4.36  仅次级 △ → 用 --ink-2-deep
   --ink-2 / --hover                                  4.03  仅次级 △ → 用 --ink-2-deep
   --ink-2 / --wash-mint                              4.22  仅次级 △ → 用 --ink-2-deep
   --ink-2-deep / --surface                           5.76  正文 ✓
   --ink-2-deep / --shell                             5.28  正文 ✓
   --ink-2-deep / --hover                             4.87  正文 ✓
   --ink-2-deep / --wash-mint                         5.10  正文 ✓
   --ink-3 / --surface                                3.73  仅辅助 △
   --ink-3 / --canvas                                 3.54  仅辅助 △
   --ink-3 / --shell                                  3.42  仅辅助 △
   --ink-3 / --hover                                  3.15  仅辅助 △
   --brand（Azure 原值）/ --surface                   3.46  仅图形/边框 △
   --on-brand 白字 / --brand 填充                     3.46  仅 ≥14px/600 △
   --on-brand 白字 / --ink 填充（亮色主按钮）         16.40  正文 ✓
   --on-brand 深字 / --ink 填充（暗色主按钮）         15.04  正文 ✓（v2.2 修正前此处是白底白字 1.08 ✗）
   --brand-ink / --surface                            5.00  正文 ✓（继承 tokens.css:277）
   --brand-ink / --canvas                             4.76  正文 ✓
   --brand-ink / --shell                              4.59  正文 ✓
   --marker-teal / --surface                          2.37  仅底色/图标填充 ✗ 禁作文字
   --marker-coral / --surface                         3.01  仅图形 △
   --marker-amber / --surface                         2.21  仅底色/图标填充 ✗ 禁作文字
   --marker-orchid / --surface                        2.74  仅底色/图标填充 ✗ 禁作文字
   --decor-green / --surface                          6.33  正文 ✓（但禁作状态色）
   --forest-edge / --surface                         12.67  正文 ✓
   --danger / --surface                               5.15  正文 ✓（继承 tokens.css:279）
   --ok / --surface                                   4.37  仅徽章 △（继承）
   --warn / --surface                                 3.16  仅图形 △（继承）
   --warn / --shell                                   2.90  ✗ shell 底禁用，改配 --warn-soft
   --info / --surface                                 4.67  正文 ✓（实算；v1 注释写的是「≈4.8」，那是带约等号的估计）
   --diff-add / --diff-add-bg                         5.11  ✓（继承 tokens.css:280）
   --diff-del / --diff-del-bg                         5.32  ✓（继承 tokens.css:281）

   ── 暗色（文字 / 背景） ─────────────────────────  比值   结论
   --ink / --surface                                 15.04  正文 ✓
   --ink / --canvas                                  15.76  正文 ✓
   --ink / --shell                                   16.55  正文 ✓
   --ink / --raised                                  13.64  正文 ✓
   --ink / --hover                                   12.00  正文 ✓
   --ink-2 / --surface                                6.97  正文 ✓
   --ink-2 / --canvas                                 7.30  正文 ✓
   --ink-2 / --shell                                  7.67  正文 ✓
   --ink-2 / --raised                                 6.32  正文 ✓
   --ink-2 / --hover                                  5.56  正文 ✓
   --ink-3 / --surface                                4.77  正文 ✓
   --ink-3 / --canvas                                 5.00  正文 ✓
   --ink-3 / --shell                                  5.25  正文 ✓
   --ink-3 / --raised                                 4.32  仅辅助 △
   --ink-3 / --hover                                  3.80  仅辅助 △
   --brand / --surface                                4.74  正文 ✓
   --brand / --canvas                                 4.96  正文 ✓
   --brand / --raised                                 4.29  仅大字 △ → 用 --brand-ink
   --brand / --hover                                  3.78  仅大字 △ → 用 --brand-ink
   --brand-ink / --surface                            7.03  正文 ✓
   --brand-ink / --hover                              5.61  正文 ✓
   --marker-teal / --surface                          6.93  正文 ✓
   --marker-coral / --surface                         5.46  正文 ✓
   --marker-amber / --surface                         7.42  正文 ✓
   --marker-orchid / --surface                        5.99  正文 ✓
   --ok / --surface                                   6.01  正文 ✓（实算）
   --warn / --surface                                 6.52  正文 ✓（实算）
   --danger / --surface                               5.27  正文 ✓（实算）
   --info / --surface                                 5.84  正文 ✓（同源于 v1 估计值，但复跑未判漂移，落在容差内；--emit 回填时以脚本输出为准）
   --diff-add / --diff-add-bg                         4.63  ✓（脚本只打印不断言，见下方注 2）
   --diff-del / --diff-del-bg                         4.34  △ 12.5px mono + 必配 +/− 符号双通道（沿用 v1 已接受边界）

   注 1（v2.1 更正）：本表初版的四个暗色语义色行与亮色 --info 行是「取 v1 注释
   数字再按 surface 亮度比 1.028 换算」得来的，实算后偏高 1.3–2.7%。根因是 v1
   注释里的比值本身就是手工近似（--info 那条原文还带「≈」号），估计值再做二次
   换算会把误差放大。现已全部改用 micro-contrast.mjs 的实算值，并取消换算法：
   凡本表数字，一律以脚本输出为准，任何人都不得手工推算后回填。
   注 2：diff 两行的底是半透明色叠在 surface 上，脚本会合成后打印实算值但不做
   断言（它没有声明 verdict），所以这两行不参与 drift 计数。
   注 3：`node design/tools/micro-contrast.mjs --emit` 会直接打印本表格式的
   文本，改 token 后照抄输出即可，不要手抄数字。
   ========================================================================== */
