/* tokens.css — 基础库 canonical 令牌 v2 · HTML 实验室/动效库用（自动生成，勿手改） */
:root {
  --rpx: 1px;   /* HTML 侧 rpx 换算基准（小程序内由框架处理） */
  /* ── L0 原始值 primitive（只此一处放裸值 · themeTier=locked） ── */
  --ink-900: #2B2620;  /* [locked] app --color-text-primary / lab --ink */
  --ink-700: #5A5248;  /* [locked] lab --ink-2 */
  --ink-600: #6B6259;  /* [locked] app --color-text-secondary */
  --ink-550: #756B60;  /* [locked] app --color-text-tertiary */
  --ink-500: #8A8078;  /* [locked] lab --ink-3 */
  --ink-450: #948A7E;  /* [locked] lab --ink-4（禁用态，已从#B4ACA2提亮至3.11:1） */
  --ink-200: #C4BBAF;  /* [locked] app --color-text-disabled */
  --gray-50: #FBF7EE;  /* [locked] vi */
  --gray-100: #E4DDD0;  /* [locked] vi */
  --gray-200: #D8D0C0;  /* [locked] vi */
  --gray-300: #96918A;  /* [locked] vi */
  --gray-400: #7A7268;  /* [locked] vi */
  --gray-450: #6B6B6B;  /* [locked] vi */
  --gray-500: #71685E;  /* [locked] vi */
  --gray-700: #403B34;  /* [locked] vi */
  --gray-800: #1C1713;  /* [locked] vi */
  --paper-50: #FFFDF8;  /* [locked] lab --paper-raised */
  --paper-100: #F7F5EF;  /* [locked] lab --paper */
  --paper-200: #EFEBE2;  /* [locked] lab --paper-sunken */
  --paper-300: #EBE6DA;  /* [locked] lab --paper-page */
  --paper-400: #E5E0D5;  /* [locked] lab --paper-deep */
  --neutral-bg: #F5F1E8;  /* [locked] app --color-bg */
  --neutral-fill: #F5F0E6;  /* [locked] app --color-fill */
  --neutral-border: #E8E2D6;  /* [locked] app --color-border */
  --neutral-surface: #FFFFFF;  /* [locked] app --color-surface */
  --gold-500: #C9A96E;  /* [locked] app --color-gold / lab --seal */
  --gold-600: #A8854E;  /* [locked] app gold-deep / lab seal-deep */
  --gold-700: #8A6D35;  /* [locked] vi --color-gold-tint */
  --gold-800: #7A5E28;  /* [locked] vi --color-gold-text */
  --gold-850: #80612D;  /* [locked] vi --color-gold-ink */
  --red-500: #9B2915;  /* [locked] vi --color-accent / lab --accent（VI 母规范定稿） */
  --red-700: #7A2010;  /* [locked] vi --color-accent-deep【裁决：vi 值为准；lab 旧值 #7A1F10 视觉不可辨】 */
  --red-600: #B3261E;  /* [locked] app --color-danger */
  --red-800: #7E2112;  /* [locked] vi --color-danger-tint */
  --lake-500: #2E5E73;  /* [locked] vi --color-lake 旧值 #416F82 → 刘总 2026-09-26 17:1x 终裁（复议10.1：B→A）：圣湖蓝以 #2E5E73 为准（=玩法页实际落地色，呼应 v1.2「玩法页语言全站拉齐」）；lake-500 改值 #416F82→#2E5E73，brand-blue-* 维持废弃但归名零渲染变化；旧 #416F82 作废：圣湖蓝主档（全站内容辅助色 lake + 玩法页品牌蓝）。对比度：白字压底 7.08:1 ✅、米白底作文字 6.62:1 ✅（较旧值 5.5/5.14 双升） */
  --lake-700: #1F4454;  /* [locked] 刘总 2026-09-26 16:1x 拍板决策10：10.1=B（圣湖蓝以库 --color-lake #416F82 为准）/ 10.2=A（图底遮罩统一走 scrim 暖墨）；小齐执行库侧补档+标废弃，v3 改名交小冈二期：圣湖蓝深档（渐变收尾/吸底行动条）。归一自小冈 brand-blue-700 同值 #1F4454；与 lake-500(#2E5E73) 深浅搭配已天然成立（同色族加深） */
  --snow-50: #F7FAFA;  /* [locked] vi --color-snow（底色用；VI 裁定禁作标记色） */
  --snow-mist: #8FA3AE;  /* [locked] lab --snow 旧值（仅实验室装饰渐变用，不入 VI 辅助色系） */
  --onsen-500: #926B53;  /* [locked] vi --color-onsen【裁决：lab 旧值 #A8674A 归一】 */
  --moss-500: #5E7355;  /* [locked] lab --moss（vi 未定义，收编为原始值） */
  --stone-500: #716B62;  /* [locked] vi --color-stone */
  --success-500: #4A7C59;  /* [locked] app */
  --warning-600: #8F5F00;  /* [locked] app */
  --info-500: #5B7A99;  /* [locked] app */
  --info-wash: #E8EEF3;  /* [locked] vi --color-info-wash */
  --alpha-10: rgba(43,38,32,.10);  /* [locked] lab --line */
  --alpha-18: rgba(43,38,32,.18);  /* [locked] lab --line-2 */
  --alpha-30: rgba(43,38,32,.30);  /* [locked] lab 强光档 --line */
  --alpha-42: rgba(43,38,32,.42);  /* [locked] lab 强光档 --line-2 */
  --alpha-52: rgba(43,38,32,.52);  /* [locked] lab --line-ui */
  --alpha-62: rgba(43,38,32,.62);  /* [locked] lab --line-strong */
  --alpha-72: rgba(43,38,32,.72);  /* [locked] lab 强光档 --line-ui */
  --alpha-84: rgba(43,38,32,.84);  /* [locked] lab 强光档 --line-strong */
  --invert-22: rgba(255,253,248,.22);  /* [locked] lab --line-invert */
  --invert-42: rgba(255,253,248,.42);  /* [locked] lab 强光档 --line-invert */
  --red-wash-08: rgba(155,41,21,.08);  /* [locked] vi --color-accent-wash */
  --red-wash-14: rgba(155,41,21,.14);  /* [locked] vi wash-strong */
  --red-soft-10: rgba(155,41,21,.10);  /* [locked] lab --accent-soft */
  --red-line-28: rgba(155,41,21,.28);  /* [locked] lab --accent-line */
  --gold-soft-18: rgba(201,169,110,.18);  /* [locked] lab --seal-soft */
  --gold-edge-55: rgba(201,169,110,.55);  /* [locked] lab --seal-edge */
  --stone-wash-10: rgba(113,107,98,.10);  /* [locked] vi */
  --lake-wash-10: rgba(46,94,115,.10);  /* [locked] vi --color-lake-wash（随 lake-500 终裁同步换底色相 65,111,130→46,94,115）｜刘总 2026-09-26 17:1x 终裁（复议10.1：B→A）：圣湖蓝以 #2E5E73 为准（=玩法页实际落地色，呼应 v1.2「玩法页语言全站拉齐」）；lake-500 改值 #416F82→#2E5E73，brand-blue-* 维持废弃但归名零渲染变化；旧 #416F82 作废 */
  --snow-wash-55: rgba(247,250,250,.55);  /* [locked] vi */
  --onsen-wash-10: rgba(146,107,83,.10);  /* [locked] vi */
  --scrim-28: rgba(24,19,15,.28);  /* [locked] lab --scrim-1 */
  --scrim-48: rgba(24,19,15,.48);  /* [locked] lab --scrim-2 */
  --scrim-66: rgba(24,19,15,.66);  /* [locked] lab --scrim-3 */
  --scrim-78: rgba(24,19,15,.78);  /* [locked] 刘总 2026-09-26 16:1x 拍板决策10：10.1 初裁=B→17:1x 终裁=A（圣湖蓝以 #2E5E73 为准）/ 10.2=A（图底遮罩统一走 scrim 暖墨）；小齐执行库侧补档+标废弃，v3 改名交小冈二期：图底遮罩最深档（归一自小冈 shade-deep .78，底色由冷墨11,17,26改暖墨24,19,15与scrim家族同源） */
  --scrim-55: rgba(24,19,15,.55);  /* [locked] 刘总 2026-09-26 16:1x 拍板决策10：10.1 初裁=B→17:1x 终裁=A（圣湖蓝以 #2E5E73 为准）/ 10.2=A（图底遮罩统一走 scrim 暖墨）；小齐执行库侧补档+标废弃，v3 改名交小冈二期：图底遮罩中档（归一自 shade-mid .55，暖墨） */
  --scrim-0: rgba(24,19,15,0);  /* [locked] 刘总 2026-09-26 16:1x 拍板决策10：10.1 初裁=B→17:1x 终裁=A（圣湖蓝以 #2E5E73 为准）/ 10.2=A（图底遮罩统一走 scrim 暖墨）；小齐执行库侧补档+标废弃，v3 改名交小冈二期：图底遮罩透明起点（归一自 shade-none，渐变 none→mid→deep 的 0% 端） */
  --t-100: 100ms;  /* [locked] lab instant */
  --t-140: 140ms;  /* [locked] mo btn/exit-fast */
  --t-160: 160ms;  /* [locked] lab fast */
  --t-200: 200ms;  /* [locked] mo exit */
  --t-240: 240ms;  /* [locked] lab base */
  --t-260: 260ms;  /* [locked] mo light */
  --t-320: 320ms;  /* [locked] lab slow */
  --t-340: 340ms;  /* [locked] mo sheet */
  --t-360: 360ms;  /* [locked] mo card */
  --t-480: 480ms;  /* [locked] lab xslow */
  --t-560: 560ms;  /* [locked] mo page */
  --ease-exit: cubic-bezier(0.4, 0, 1, 1);  /* [locked] mo */
  --ease-paper: cubic-bezier(0.22, 0.61, 0.36, 1);  /* [locked] mo */
  --ease-soft: cubic-bezier(0.33, 1, 0.68, 1);  /* [locked] mo */
  --ease-page: cubic-bezier(0.65, 0, 0.35, 1);  /* [locked] mo */
  --ease-out: cubic-bezier(.2, .8, .2, 1);  /* [locked] lab */
  --ease-in-out: cubic-bezier(.4, 0, .2, 1);  /* [locked] lab */
  --ease-spring: cubic-bezier(.34, 1.36, .64, 1);  /* [locked] lab/动效库★（既有4条曲线无回弹，动效库新增） */
  --s-2: 2rpx;  /* [locked] app：刘总决策7（2026-09-25 22:0x）.2：4pt 系统半档保留（发丝线 2rpx/图标微调 4rpx）；**禁用作外边距/行高**（8倍数原则管辖范围），V12 豁免仅覆盖其尺寸用途 */
  --s-4: 4rpx;  /* [locked] app：刘总决策7（2026-09-25 22:0x）.2：4pt 系统半档保留（发丝线 2rpx/图标微调 4rpx）；**禁用作外边距/行高**（8倍数原则管辖范围），V12 豁免仅覆盖其尺寸用途 */
  --s-8: 8rpx;  /* [locked] app */
  --s-12: 12rpx;  /* [locked] app：死令牌（决策8 执行后引用面归零）：sp-3 改指 s-16 后无引用；到期删除 */
  --s-16: 16rpx;  /* [locked] app */
  --s-20: 20rpx;  /* [locked] app：刘总决策8（2026-09-25 22:3x）.2 选项B：圆角档永久豁免（card.radius=20rpx 唯一活引用；圆角非间距，不入 V12 管辖） */
  --s-24: 24rpx;  /* [locked] app */
  --s-28: 28rpx;  /* [locked] app：死令牌（引用面实测 0）：决策7.3 收敛后零引用（spacing 残档）；到期=P2 完成+1 版本删除 */
  --s-32: 32rpx;  /* [locked] app */
  --s-36: 36rpx;  /* [locked] app：死令牌（引用面实测 0）：决策7.3 收敛后零引用（spacing 残档）；到期=P2 完成+1 版本删除 */
  --s-40: 40rpx;  /* [locked] app */
  --s-44: 44rpx;  /* [locked] app：死令牌（引用面实测 0）：决策7.3 收敛后零引用（spacing 残档）；到期=P2 完成+1 版本删除 */
  --s-48: 48rpx;  /* [locked] app */
  --s-56: 56rpx;  /* [locked] app */
  --s-64: 64rpx;  /* [locked] app；⚠️ 高度/尺寸用途已迁 h-*（决策7.5），本档仅剩间距语义 */
  --s-80: 80rpx;  /* [locked] lab sp-10 */
  --s-96: 96rpx;  /* [locked] vi block-xl；⚠️ 高度/尺寸用途已迁 h-*（决策7.5），本档仅剩间距语义 */
  --s-100: 100rpx;  /* [locked] app hero：死令牌（决策8 执行后引用面归零）：hero 收敛 96rpx 后无引用；到期删除 */
  --s-200: 200rpx;  /* [locked] app shell */
  --f-22: 22rpx;  /* [locked] app minor */
  --f-24: 24rpx;  /* [locked] app caption/vi xs */
  --f-26: 26rpx;  /* [locked] app body-sm */
  --f-28: 28rpx;  /* [locked] app body/vi sm */
  --f-30: 30rpx;  /* [locked] app subtitle */
  --f-32: 32rpx;  /* [locked] app title/vi md */
  --f-36: 36rpx;  /* [locked] app title-lg/vi lg */
  --f-40: 40rpx;  /* [locked] app display/vi xl */
  --f-48: 48rpx;  /* [locked] lab fs-xl */
  --f-56: 56rpx;  /* [locked] vi hero/lab fs-2xl */
  --f-64: 64rpx;  /* [locked] lab fs-hero */
  --r-8: 8rpx;  /* [locked] app sm/control */
  --r-12: 12rpx;  /* [locked] app md/lab r-sm */
  --r-16: 16rpx;  /* [locked] app lg/credential */
  --r-20: 20rpx;  /* [locked] vi card */
  --r-24: 24rpx;  /* [locked] app xl/lab r-lg */
  --r-40: 40rpx;  /* [locked] app pill */
  --r-999: 999rpx;  /* [locked] app full/lab r-pill */
  --r-leaf: 24rpx 8rpx 24rpx 8rpx;  /* [locked] vi --radius-leaf（叶形不对称圆角） */
  --bw-2: 2rpx;  /* [locked] vi --border-w */
  --s-88: 88rpx;  /* [locked] vi --btn-h（触控区 ≥88rpx 红线值，按钮高度专用档）；⚠️ 高度/尺寸用途已迁 h-*（决策7.5），本档仅剩间距语义 */
  --f-72: 72rpx;  /* [locked] vi --font-hero-lh（Hero 标题行高档） */
  --s-116: 116rpx;  /* [locked] gpt6 二轮评审 Q2 裁决：吸顶栏内容高度 canonical=116rpx（132rpx 为旧实现例外，不升为正典；safe-area 走 env() 结构增量不进静态令牌）；⚠️ 高度/尺寸用途已迁 h-*（决策7.5），本档仅剩间距语义：死令牌（引用面实测 0）：决策7.5 拆分后已迁 h-116，零引用；到期=P2 完成+1 版本删除 */
  --cols-4: 4;  /* [locked] 刘总决策1.1（2026-09-25）：grid 默认列数=4（m-module-grid 实现 config.columns||4；A端可配 2-5） */
  --s-92: 92rpx;  /* [locked] 刘总决策1.4（2026-09-25）：grid 图标盒 92rpx（m-module-grid .mg-box 实测；>88 触控红线✅）；尺寸档豁免 8 倍数（决策7.5 原则只管外边距行高）：死令牌（引用面实测 0）：决策7.5 拆分后已迁 h-92，零引用；到期=P2 完成+1 版本删除 */
  --blur-20: 20px;  /* [locked] 刘总决策5（2026-09-25 22:0x）.4：底栏高斯模糊半径（iOS 系统级毛玻璃惯用 20-30px；仅限底栏矩形，禁全屏毛玻璃） */
  --paper-72: rgba(255,253,248,.72);  /* [locked] 刘总决策5（2026-09-25 22:0x）.4：毛玻璃透底底色=paper-50(#FFFDF8) 72% 不透明（内容从后透出且保 VI 纸感） */
  --paper-96: rgba(255,253,248,.96);  /* [locked] 刘总决策5（2026-09-25 22:0x）.5：@supports 不支持 backdrop-filter 时的降级底色（升到 96% 防透明裸奔） */
  --z-10: 10;  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠档：吸底栏 bar（最底层，实测 merchant-store .bottom-bar z=10） */
  --z-20: 20;  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠档：fab 悬浮钮（必须 > bar，压在操作栏上） */
  --z-60: 60;  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠档：弹出面板 sheet（实测 selection .plan-sheet z=61 归整到 60 档） */
  --z-62: 62;  /* [locked] 小齐 2026-09-26 15:5x · P2 复验小冈 1f593943 抓出 bug-2（.lib-sheet 60 被同页 search-panel 70 / plan-result 62 / plan-sheet 61 反超）根因=库 z 阶梯仅 6 档而 v3 实测用 24 种值，粒度不足迫使开发者用 +1 技巧：半屏面板之上的结果层（v3 实测 .plan-result 用 62） */
  --z-70: 70;  /* [locked] 小齐 2026-09-26 15:5x · P2 复验小冈 1f593943 抓出 bug-2（.lib-sheet 60 被同页 search-panel 70 / plan-result 62 / plan-sheet 61 反超）根因=库 z 阶梯仅 6 档而 v3 实测用 24 种值，粒度不足迫使开发者用 +1 技巧：全屏浮层面板（v3 实测 .search-panel 用 70） */
  --z-80: 80;  /* [locked] 小齐 2026-09-26 15:5x · P2 复验小冈 1f593943 抓出 bug-2（.lib-sheet 60 被同页 search-panel 70 / plan-result 62 / plan-sheet 61 反超）根因=库 z 阶梯仅 6 档而 v3 实测用 24 种值，粒度不足迫使开发者用 +1 技巧：全屏抽屉（离开当前页语义，压住 sheet/panel；v3 .lib-sheet 迁移前=100 即此层） */
  --z-99: 99;  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠档：toast 轻提示（实测全站 4 页 z=99） */
  --z-900: 900;  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠档：modal 遮罩（实测 drawer .mo-confirm-mask z=900） */
  --z-999: 999;  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠档：modal 主体（实测 .mo-confirm-sheet z=901 归整到 999 档；全站最高） */
  --h-64: 64rpx;  /* [locked] 刘总决策7（2026-09-25 22:0x）.5 h-*/s-* 命名空间机械执法：高度/尺寸档从 s-* 杂物抽屉拆出（s-*=纯间距，8倍数管辖；h-*=高度尺寸，触控红线管辖，豁免间距规则） */
  --h-88: 88rpx;  /* [locked] 刘总决策7（2026-09-25 22:0x）.5 h-*/s-* 命名空间机械执法：高度/尺寸档从 s-* 杂物抽屉拆出（s-*=纯间距，8倍数管辖；h-*=高度尺寸，触控红线管辖，豁免间距规则） */
  --h-92: 92rpx;  /* [locked] 刘总决策7（2026-09-25 22:0x）.5 h-*/s-* 命名空间机械执法：高度/尺寸档从 s-* 杂物抽屉拆出（s-*=纯间距，8倍数管辖；h-*=高度尺寸，触控红线管辖，豁免间距规则） */
  --h-96: 96rpx;  /* [locked] 刘总决策7（2026-09-25 22:0x）.5 h-*/s-* 命名空间机械执法：高度/尺寸档从 s-* 杂物抽屉拆出（s-*=纯间距，8倍数管辖；h-*=高度尺寸，触控红线管辖，豁免间距规则） */
  --h-104: 104rpx;  /* [locked] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 18 voicebar 底栏高需求（8 倍数档）：高度档 104rpx */
  --h-116: 116rpx;  /* [locked] 刘总决策7（2026-09-25 22:0x）.5 h-*/s-* 命名空间机械执法：高度/尺寸档从 s-* 杂物抽屉拆出（s-*=纯间距，8倍数管辖；h-*=高度尺寸，触控红线管辖，豁免间距规则） */
  --t-20: 20ms;  /* [locked] 动效库 08 式多选整页：勾选圈 stagger 递增延迟档（此前只在式内声明未落盘，2026-09-25 补齐） */
  --t-45: 45ms;  /* [locked] 动效库 09 式多选聚成一摞：飞聚 stagger 递增延迟档（刘总令 2026-09-25 入库时补立） */
  --deg-6: 6deg;  /* [locked] INTAKE 第二批·动态图标两库（2026-09-25 23:2x 评审通过）：空态轻晃角度档（Loading Icon 范式"轻轻晃动"，±6° 两下；>10° 变摇头） */
  --shift-160: 160rpx;  /* [locked] INTAKE 第二批·动态图标两库（2026-09-25 23:2x 评审通过）：发送飞出位移档（一次性离场，forwards 停终态） */
  --h-112: 112rpx;  /* [locked] INTAKE 六式余项入库（2026-09-25 23:4x，刘总令"先把之前的都入库"）：锚点滚动偏移补偿档（吸顶分类条高度，12 式 scroll-into-view 防标题被遮；h-* 尺寸命名空间） */
  --t-900: 900ms;  /* [locked] INTAKE 第四批·十式高级交互（2026-09-26 00:1x 评审通过，九式入库 16-24，⑦判定 07 式已覆盖不另立）：动效库 17 式按住蓄力默认档——太短防不住误触、太长折磨人，900ms 是"确定要按"和"别烦我"的平衡点 */
  --blur-8: 8px;  /* [locked] INTAKE 第五批·五式质感动效（2026-09-26 00:5x 评审通过，五式全入库 25-29）：27 式景深中层模糊档（mo-blur-mid）；blur 按档位切换禁逐帧连续（性能契约） */
  --blur-40: 40px;  /* [locked] INTAKE 第五批·五式质感动效（2026-09-26 00:5x 评审通过，五式全入库 25-29）：27 式景深远背景档（mo-blur-far）；整页最多 3 层，层数×blur=性能平方级恶化 */
  --persp-900: 900px;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：透视距离档（06 式 tilt persp 默认；越小透视越强） */
  --deg-9: 9deg;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：交互式倾斜最大角档（06 式 max 默认；区别于按压微倾 mo-tilt-max=3deg） */
  --num-135: 1.35;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：视差倍率档（06 式 parallax 默认；=1 无厚度，差的就是这一点点） */
  --px-34: 34px;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：前景 translateZ 档（06 式 z 默认） */
  --px-6: 6px;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：滚动容差档（07 式 slop 默认；超过即判滚动意图取消长按） */
  --t-400: 400ms;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：长按触发档（07 式 ms 默认；系统级惯例 400-500ms） */
  --t-420: 420ms;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：吸附档（03/24 式 snapMs 默认） */
  --t-120: 120ms;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：手势跟手档（拖拽中 transition≈0，松手判定用） */
  --t-22: 22ms;  /* [locked] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：FLIP 逐项交错档（04 式 stagger 默认） */
  --font-serif: 'Songti SC','STSong','Noto Serif SC',serif;  /* [locked] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：衬线族：标题/品牌/数字（VI 视觉主体，刘总静态稿基调）：衬线族：标题/品牌/数字（VI 视觉主体，刘总静态稿基调） */
  --font-sans: -apple-system,BlinkMacSystemFont,'PingFang SC','Helvetica Neue',sans-serif;  /* [locked] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：无衬线族：正文/UI 文案：无衬线族：正文/UI 文案 */
  --font-mono: ui-monospace,Menlo,Consolas,monospace;  /* [locked] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：等宽族：码号/数值/时间（格式化输入与码表必须等宽防跳动）：等宽族：码号/数值/时间（格式化输入与码表必须等宽防跳动） */
  --brand-blue-500: #2E5E73;  /* [locked] 小冈 2026-09-26 15:26 (1f593943) 玩法页 P2 迁移新增；小齐复验后按实际值补入真源（原只写在 vi-tokens.wxss，未入库 → build 零破坏断言红）｜刘总 2026-09-26 17:1x 终裁（复议10.1：B→A）：圣湖蓝以 #2E5E73 为准（=玩法页实际落地色，呼应 v1.2「玩法页语言全站拉齐」）；lake-500 改值 #416F82→#2E5E73，brand-blue-* 维持废弃但归名零渲染变化；旧 #416F82 作废：圣湖蓝（玩法页主按钮/选中态/吸底行动条）。✅ 决策10 终裁落定：lake-500 已改值 #2E5E73 与本令牌同值——废弃归名（消费方改 var(--color-lake)）为零渲染变化；值暂留至小冈二期改名完成后删除 */
  --brand-blue-700: #1F4454;  /* [locked] 小冈 2026-09-26 15:26 (1f593943) 玩法页 P2 迁移新增；小齐复验后按实际值补入真源（原只写在 vi-tokens.wxss，未入库 → build 零破坏断言红）：圣湖蓝深（渐变收尾）。🔴 待决(决策10)：与库既有 --color-lake(#416F82)/scrim-* 语义重复，是否合并须刘总+小冈确认；此处先按实际值登记保渲染不变｜themeTier=locked 依 V10（primitive 原始值不开放配置，改值须走决策单）｜🔴 决策10 废弃：归一到 lake-700（同值 #1F4454，归名零渲染变化；二期玩法页改名后删） */
  --shade-deep: rgba(11,17,26,.78);  /* [locked] 小冈 2026-09-26 15:26 (1f593943) 玩法页 P2 迁移新增；小齐复验后按实际值补入真源（原只写在 vi-tokens.wxss，未入库 → build 零破坏断言红）：图底遮罩收尾档（大图卡文字保护）。🔴 待决(决策10)：与库既有 --color-lake(#416F82)/scrim-* 语义重复，是否合并须刘总+小冈确认；此处先按实际值登记保渲染不变｜themeTier=locked 依 V10（primitive 原始值不开放配置，改值须走决策单）｜🔴 决策10 废弃：归一到 scrim-78（值暂留保 v3 渲染不变，二期玩法页改名后删） */
  --shade-mid: rgba(11,17,26,.55);  /* [locked] 小冈 2026-09-26 15:26 (1f593943) 玩法页 P2 迁移新增；小齐复验后按实际值补入真源（原只写在 vi-tokens.wxss，未入库 → build 零破坏断言红）：图底遮罩中段。🔴 待决(决策10)：与库既有 --color-lake(#416F82)/scrim-* 语义重复，是否合并须刘总+小冈确认；此处先按实际值登记保渲染不变｜themeTier=locked 依 V10（primitive 原始值不开放配置，改值须走决策单）｜🔴 决策10 废弃：归一到 scrim-55（值暂留保 v3 渲染不变，二期玩法页改名后删） */
  --shade-none: rgba(11,17,26,0);  /* [locked] 小冈 2026-09-26 15:26 (1f593943) 玩法页 P2 迁移新增；小齐复验后按实际值补入真源（原只写在 vi-tokens.wxss，未入库 → build 零破坏断言红）：图底遮罩起点（透明）。🔴 待决(决策10)：与库既有 --color-lake(#416F82)/scrim-* 语义重复，是否合并须刘总+小冈确认；此处先按实际值登记保渲染不变｜themeTier=locked 依 V10（primitive 原始值不开放配置，改值须走决策单）｜🔴 决策10 废弃：归一到 scrim-0（值暂留保 v3 渲染不变，二期玩法页改名后删） */
  --bleed-16: -16rpx;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：出血最小档（轻出血，卡内图越过内边距） */
  --bleed-32: -32rpx;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：出血标准档＝页面左右安全边 space-page-x(32rpx) 取负 ⇒ margin:0 var(--bleed-32) 正好撑满屏宽 */
  --bleed-48: -48rpx;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：出血加强档（越过安全边再外扩 16rpx，用于首屏沉浸大图） */
  --overlap-24: -24rpx;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：卡片压图浅叠（卡顶轻搭在下层图上） */
  --overlap-40: -40rpx;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：卡片压 hero 标准叠（hero 底部内容卡上移 40rpx 压住图，破「图/卡两段式」断裂感） */
  --overlap-64: -64rpx;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：卡片深叠（层叠卡/贴纸压角，配 z-index 使用） */
  --deg-2: 2deg;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：贴纸倾斜档（徽标/角标/便签）。查重：既有 deg-6/deg-9 是 mo-tilt 交互倾斜（动效域），本档是静态版面倾斜，语义不同不重复 */
  --fr-1: 1fr;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：bento 栅格份数基准档（带 fr 单位：裸数字会使 grid-template-columns 合成非法 CSS） */
  --fr-1-65: 1.65fr;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：bento 不等分主档（1fr:1.65fr ≈ 38%:62%） */
  --fr-2: 2fr;  /* [locked] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：bento 跨列档（featured 卡跨 2 份） */

  /* ── L1 语义 semantic（全站消费名 · 含 page-context 子域） ── */
  --color-gold: var(--gold-500);  /* [open] app.wxss */
  --color-gold-deep: var(--gold-600);  /* [open] app.wxss */
  --color-bg: var(--neutral-bg);  /* [open] app.wxss */
  --color-text-primary: var(--ink-900);  /* [open] app.wxss */
  --color-text-secondary: var(--ink-600);  /* [open] app.wxss */
  --color-text-tertiary: var(--ink-550);  /* [open] app.wxss */
  --color-text-disabled: var(--ink-200);  /* [locked] app.wxss */
  --color-border: var(--neutral-border);  /* [open] app.wxss */
  --color-fill: var(--neutral-fill);  /* [open] app.wxss */
  --color-surface: var(--neutral-surface);  /* [open] app.wxss */
  --color-success: var(--success-500);  /* [locked] app.wxss */
  --color-warning: var(--warning-600);  /* [locked] app.wxss */
  --color-danger: var(--red-600);  /* [locked] app.wxss */
  --color-info: var(--info-500);  /* [locked] app.wxss */
  --radius-sm: var(--r-8);  /* [review] app.wxss */
  --radius-md: var(--r-12);  /* [review] app.wxss */
  --radius-lg: var(--r-16);  /* [review] app.wxss */
  --radius-xl: var(--r-24);  /* [review] app.wxss */
  --radius-pill: var(--r-40);  /* [review] app.wxss */
  --radius-full: var(--r-999);  /* [review] app.wxss */
  --space-2: var(--s-2);  /* [review] app.wxss：刘总决策7（2026-09-25 22:0x）.2：仅限边框/微距场景，禁作外边距 */
  --space-4: var(--s-4);  /* [review] app.wxss：刘总决策7（2026-09-25 22:0x）.2：仅限边框/微距场景，禁作外边距 */
  --space-8: var(--s-8);  /* [review] app.wxss */
  --space-16: var(--s-16);  /* [review] app.wxss */
  --space-24: var(--s-24);  /* [review] app.wxss */
  --space-32: var(--s-32);  /* [review] app.wxss */
  --space-40: var(--s-40);  /* [review] app.wxss */
  --space-48: var(--s-48);  /* [review] app.wxss */
  --space-56: var(--s-56);  /* [review] app.wxss */
  --space-64: var(--s-64);  /* [review] app.wxss */
  --space-shell: var(--s-200);  /* [review] app.wxss */
  --shadow-sm: 0 2rpx 10rpx rgba(43,38,32,.05);  /* [review] app.wxss */
  --shadow-md: 0 4rpx 20rpx rgba(43,38,32,.08);  /* [review] app.wxss */
  --shadow-lg: 0 8rpx 32rpx rgba(43,38,32,.12);  /* [review] app.wxss */
  --color-accent: var(--red-500);  /* [open] styles/vi-tokens.wxss */
  --color-accent-deep: var(--red-700);  /* [open] styles/vi-tokens.wxss */
  --color-accent-wash: rgba(155, 41, 21, 0.08);  /* [open] styles/vi-tokens.wxss */
  --color-accent-wash-strong: rgba(155, 41, 21, 0.14);  /* [open] styles/vi-tokens.wxss */
  --shadow-l1: 0 4rpx 16rpx rgba(43, 38, 32, 0.06);  /* [review] styles/vi-tokens.wxss */
  --shadow-l2: 0 12rpx 32rpx rgba(43, 38, 32, 0.10);  /* [review] styles/vi-tokens.wxss */
  --shadow-l3: 0 24rpx 56rpx rgba(43, 38, 32, 0.14);  /* [review] styles/vi-tokens.wxss */
  --space-page-x: var(--space-32);  /* [review] styles/vi-tokens.wxss */
  --space-block: var(--space-48);  /* [review] styles/vi-tokens.wxss */
  --color-gray-50: var(--gray-50);  /* [open] styles/vi-tokens.wxss */
  --color-gray-100: var(--gray-100);  /* [open] styles/vi-tokens.wxss */
  --color-gray-200: var(--gray-200);  /* [open] styles/vi-tokens.wxss */
  --color-gray-300: var(--gray-300);  /* [open] styles/vi-tokens.wxss */
  --color-gray-400: var(--gray-400);  /* [open] styles/vi-tokens.wxss */
  --color-gray-450: var(--gray-450);  /* [open] styles/vi-tokens.wxss */
  --color-gray-500: var(--gray-500);  /* [open] styles/vi-tokens.wxss */
  --color-gray-700: var(--gray-700);  /* [open] styles/vi-tokens.wxss */
  --color-gray-800: var(--gray-800);  /* [open] styles/vi-tokens.wxss */
  --color-gold-tint: var(--gold-700);  /* [open] styles/vi-tokens.wxss */
  --color-danger-tint: var(--red-800);  /* [locked] styles/vi-tokens.wxss */
  --color-info-wash: var(--info-wash);  /* [locked] styles/vi-tokens.wxss */
  --font-xs: var(--f-24);  /* [review] styles/vi-tokens.wxss；刘总决策6（2026-09-25 22:0x）.1 六档制 canonical（4rpx 级差；48rpx 档预留暂不立） */
  --font-xs-lh: var(--f-40);  /* [review] styles/vi-tokens.wxss；刘总决策7.4（2026-09-25）：行高收敛 8 倍数 {f-36}→40rpx，按页视觉回归（MIGRATIONS M-004） */
  --font-sm: var(--f-28);  /* [review] styles/vi-tokens.wxss；刘总决策6（2026-09-25 22:0x）.1 六档制 canonical（4rpx 级差；48rpx 档预留暂不立） */
  --font-sm-lh: var(--f-48);  /* [review] styles/vi-tokens.wxss；刘总决策7.4（2026-09-25）：行高收敛 8 倍数 {s-44}→48rpx，按页视觉回归（MIGRATIONS M-004） */
  --font-md: var(--f-32);  /* [review] styles/vi-tokens.wxss；刘总决策6（2026-09-25 22:0x）.1 六档制 canonical（4rpx 级差；48rpx 档预留暂不立） */
  --font-md-lh: var(--f-48);  /* [review] styles/vi-tokens.wxss */
  --font-lg: var(--f-36);  /* [review] styles/vi-tokens.wxss；刘总决策6（2026-09-25 22:0x）.1 六档制 canonical（4rpx 级差；48rpx 档预留暂不立） */
  --font-lg-lh: var(--f-56);  /* [review] styles/vi-tokens.wxss；刘总决策7.4（2026-09-25）：行高收敛 8 倍数 52rpx→56rpx，按页视觉回归（MIGRATIONS M-004） */
  --font-xl: var(--f-40);  /* [review] styles/vi-tokens.wxss；刘总决策6（2026-09-25 22:0x）.1 六档制 canonical（4rpx 级差；48rpx 档预留暂不立） */
  --font-xl-lh: var(--f-56);  /* [review] styles/vi-tokens.wxss */
  --space-block-lg: var(--s-64);  /* [review] styles/vi-tokens.wxss */
  --space-block-xl: var(--s-96);  /* [review] styles/vi-tokens.wxss */
  --radius-leaf: var(--r-leaf);  /* [review] styles/vi-tokens.wxss */
  --radius-control: var(--r-8);  /* [review] styles/vi-tokens.wxss */
  --border-w: 2rpx;  /* [review] styles/vi-tokens.wxss */
  --color-gold-text: var(--gold-800);  /* [open] styles/vi-tokens.wxss */
  --color-gold-ink: var(--gold-850);  /* [open] styles/vi-tokens.wxss */
  --color-stone: var(--stone-500);  /* [open] styles/vi-tokens.wxss */
  --color-lake: var(--lake-500);  /* [open] styles/vi-tokens.wxss */
  --color-lake-deep: var(--lake-700);  /* [open] 刘总 2026-09-26 16:1x 拍板决策10 归一；小齐补 semantic 消费名：圣湖蓝深档消费名（渐变收尾/吸底行动条）。决策10：brand-blue-deep 归一到此 */
  --color-snow: var(--snow-50);  /* [open] styles/vi-tokens.wxss */
  --color-onsen: var(--onsen-500);  /* [open] styles/vi-tokens.wxss */
  --color-error: var(--color-danger);  /* [locked] styles/vi-tokens.wxss */
  --color-stone-wash: rgba(113, 107, 98, 0.10);  /* [open] styles/vi-tokens.wxss */
  --color-lake-wash: rgba(46, 94, 115, 0.10);  /* [open] styles/vi-tokens.wxss（2026-09-26 17:1x 随 lake-500 终裁同步换底色相） */
  --color-snow-wash: rgba(247, 250, 250, 0.55);  /* [open] styles/vi-tokens.wxss */
  --color-onsen-wash: rgba(146, 107, 83, 0.10);  /* [open] styles/vi-tokens.wxss */
  --page-accent: var(--color-stone);  /* [open] styles/vi-tokens.wxss：页面上下文语义（gpt6 §2.2：非第四层，semantic 子域；覆写顺序 global→tenant→page） */
  --page-accent-wash: var(--color-stone-wash);  /* [open] styles/vi-tokens.wxss：页面上下文语义（gpt6 §2.2：非第四层，semantic 子域；覆写顺序 global→tenant→page） */
  --mo-dur-page: var(--t-560);  /* [review] styles/motion.wxss */
  --mo-dur-light: var(--t-260);  /* [review] styles/motion.wxss */
  --mo-dur-exit: var(--t-200);  /* [review] styles/motion.wxss */
  --mo-dur-exit-fast: var(--t-140);  /* [review] styles/motion.wxss */
  --mo-ease-exit: var(--ease-exit);  /* [review] styles/motion.wxss */
  --mo-ease-paper: var(--ease-paper);  /* [review] styles/motion.wxss */
  --mo-ease-soft: var(--ease-soft);  /* [review] styles/motion.wxss */
  --mo-ease-page: var(--ease-page);  /* [review] styles/motion.wxss */
  --mo-shift-sm: 16rpx;  /* [review] styles/motion.wxss */
  --mo-shift-md: 40rpx;  /* [review] styles/motion.wxss */
  --mo-tilt-max: 3deg;  /* [review] styles/motion.wxss */
  --z-bar: var(--z-10);  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠顺序（实测归纳全站 21 个 z 值→6 档语义）：吸底操作栏：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal */
  --z-fab: var(--z-20);  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠顺序（实测归纳全站 21 个 z 值→6 档语义）：fab 悬浮主操作（压栏，必 > z-bar）：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal */
  --z-sheet: var(--z-60);  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠顺序（实测归纳全站 21 个 z 值→6 档语义）：弹出面板/抽屉：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal */
  --z-sheet-result: var(--z-62);  /* [open] 小齐 2026-09-26 15:5x · P2 复验小冈 1f593943 抓出 bug-2（.lib-sheet 60 被同页 search-panel 70 / plan-result 62 / plan-sheet 61 反超）根因=库 z 阶梯仅 6 档而 v3 实测用 24 种值，粒度不足迫使开发者用 +1 技巧：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal｜用途：半屏面板内提交后显示的结果层 */
  --z-panel: var(--z-70);  /* [open] 小齐 2026-09-26 15:5x · P2 复验小冈 1f593943 抓出 bug-2（.lib-sheet 60 被同页 search-panel 70 / plan-result 62 / plan-sheet 61 反超）根因=库 z 阶梯仅 6 档而 v3 实测用 24 种值，粒度不足迫使开发者用 +1 技巧：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal｜用途：全屏浮层面板（搜索/筛选/联想） */
  --z-drawer: var(--z-80);  /* [open] 小齐 2026-09-26 15:5x · P2 复验小冈 1f593943 抓出 bug-2（.lib-sheet 60 被同页 search-panel 70 / plan-result 62 / plan-sheet 61 反超）根因=库 z 阶梯仅 6 档而 v3 实测用 24 种值，粒度不足迫使开发者用 +1 技巧：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal｜用途：全屏抽屉（文库/导航/大内容层），必须压住 sheet 与 panel */
  --z-toast: var(--z-99);  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠顺序（实测归纳全站 21 个 z 值→6 档语义）：轻提示：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal */
  --z-modal-mask: var(--z-900);  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠顺序（实测归纳全站 21 个 z 值→6 档语义）：模态遮罩：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal */
  --z-modal: var(--z-999);  /* [locked] 刘总决策5（2026-09-25 22:0x）.2 层叠顺序（实测归纳全站 21 个 z 值→6 档语义）：模态主体（最高层）：层叠语义档（补细）：bar<fab<sheet<sheet-result<panel<drawer<toast<modal-mask<modal */
  --font-title-weight: 600;  /* [locked] 刘总决策6（2026-09-25 22:0x）.3 选项a：维持标题 32rpx / 正文 28rpx 一档差现状，**以字重拉开层级**（信息层级原则：主次靠字号和颜色分开，不靠往上堆）：标题字重下限 ≥600（semibold）；正文 400。若刘总坚持"标题正文至少两档差"再议选项b（标题升 36rpx） */
  --mo-stagger-check: var(--t-20);  /* [review] 动效库 08 式多选整页：勾选圈逐个让位的递增延迟（2026-09-25 落盘，与式内 tokens 字段对齐）：08 式多选整页：勾选圈逐个让位的递增延迟 */
  --mo-stagger-fly: var(--t-45);  /* [review] 动效库 09 式多选聚成一摞：多张飞聚到摞的递增延迟（2026-09-25 落盘，与式内 tokens 字段对齐）：09 式多选聚成一摞：多张飞聚到摞的递增延迟 */
  --mo-dur-icon: var(--t-240);  /* [review] INTAKE 第二批·动态图标两库（2026-09-25 23:2x 评审通过）：图标 morph 时长档：比卡片级(360)快、比微交互慢——小元素慢动作显迟钝（动效库 10/11 式共用）：图标 morph 时长档：比卡片级(360)快、比微交互慢——小元素慢动作显迟钝（动效库 10/11 式共用） */
  --mo-wiggle-deg: var(--deg-6);  /* [review] INTAKE 第二批·动态图标两库（2026-09-25 23:2x 评审通过）：空态轻晃角度（动效库 11 式；pattern.empty motion 槽升级用）：空态轻晃角度（动效库 11 式；pattern.empty motion 槽升级用） */
  --mo-fly-dist: var(--shift-160);  /* [review] INTAKE 第二批·动态图标两库（2026-09-25 23:2x 评审通过）：发送图标飞出位移（动效库 11 式；一次性动画禁循环）：发送图标飞出位移（动效库 11 式；一次性动画禁循环） */
  --mo-dur-charge: var(--t-900);  /* [review] INTAKE 第四批·十式高级交互（2026-09-26 00:1x 评审通过，九式入库 16-24，⑦判定 07 式已覆盖不另立）：蓄力确认时长档（17 式 holdcharge）；review 档=动效时长类 A 端改动须设计审核（gpt6 §2.3）：按住蓄力走满时长；退回=该值×backRatio(0.6)，退比进快 */
  --mo-blur-mid: var(--blur-8);  /* [review] INTAKE 第五批·五式质感动效（2026-09-26 00:5x 评审通过，五式全入库 25-29）：景深中层模糊（27 式；档位切换非逐帧）：景深中层模糊（27 式；档位切换非逐帧） */
  --mo-blur-far: var(--blur-40);  /* [review] INTAKE 第五批·五式质感动效（2026-09-26 00:5x 评审通过，五式全入库 25-29）：景深远背景模糊（27 式）：景深远背景模糊（27 式） */
  --mo-dur-ambient: var(--t-560);  /* [review] INTAKE 第五批·五式质感动效（2026-09-26 00:5x 评审通过，五式全入库 25-29）：氛围光换色过渡档（26 式；比页面级 360 慢——光晕突变=闪屏感，宁慢勿跳）：氛围光换色过渡档（26 式；比页面级 360 慢——光晕突变=闪屏感，宁慢勿跳） */
  --mo-perspective: var(--persp-900);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：3D 透视距离（06 式）：3D 透视距离（06 式） */
  --mo-tilt-interactive: var(--deg-9);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：交互式倾斜最大角（06 式；按压微倾是 mo-tilt-max=3deg，两者语义不同禁混用）：交互式倾斜最大角（06 式；按压微倾是 mo-tilt-max=3deg，两者语义不同禁混用） */
  --mo-parallax: var(--num-135);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：图案视差倍率（06 式厚度来源）：图案视差倍率（06 式厚度来源） */
  --mo-z-fg: var(--px-34);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：前景抬升 translateZ（06 式）：前景抬升 translateZ（06 式） */
  --mo-longpress: var(--t-400);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：长按触发阈值（07 式；09/14/20 式共用同一契约禁各写各的）：长按触发阈值（07 式；09/14/20 式共用同一契约禁各写各的） */
  --mo-slop: var(--px-6);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：滚动容差（07 式；17/09 式复用——超此位移判为滚动意图）：滚动容差（07 式；17/09 式复用——超此位移判为滚动意图） */
  --mo-dur-snap: var(--t-420);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：吸附时长（03/24/28 式）：吸附时长（03/24/28 式） */
  --mo-dur-gesture: var(--t-120);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：手势跟手档（13/22/29 式拖拽态；拖拽中 transition≈0 才算跟手）：手势跟手档（13/22/29 式拖拽态；拖拽中 transition≈0 才算跟手） */
  --mo-stagger-flip: var(--t-22);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：FLIP 逐项交错（04 式）：FLIP 逐项交错（04 式） */
  --mo-ease-spring: var(--ease-spring);  /* [review] INTAKE 第六批核查时发现的历史欠账补落盘（2026-09-26 01:1x）：动效库 v1.0 建库时 06/07/04/03/13 式 tokens 字段声明的 ★ 令牌从未写入 tokens/（与上批 mo-stagger-* 同类账，本次量更大 10 条）；值全部取自各式 demo params 默认值，保证文档-数据一致：spring 过冲曲线的小程序系别名（实验室系已有 --ease-spring，此条补 --mo-ease-spring 使两套词汇都能解析——高频被 30 式引用）：spring 过冲曲线的小程序系别名（实验室系已有 --ease-spring，此条补 --mo-ease-spring 使两套词汇都能解析——高频被 30 式引用） */
  --color-surface-sunken: var(--paper-200);  /* [open] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：凹陷面/次级底（分段控件轨道、步进器按键、输入框禁用底）——组件层高频需要，此前只有实验室系别名 --paper-sunken：凹陷面/次级底（分段控件轨道、步进器按键、输入框禁用底）——组件层高频需要，此前只有实验室系别名 --paper-sunken */
  --color-text-invert: var(--paper-50);  /* [review] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：反白文字（实底按钮/选中胶囊/深色栏上的字）——此前只有别名 --ink-invert，小程序系缺 canonical：反白文字（实底按钮/选中胶囊/深色栏上的字）——此前只有别名 --ink-invert，小程序系缺 canonical */
  --color-border-strong: var(--alpha-62);  /* [review] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：强描边（时间线未开始节点、分隔强调）——区别于 --color-border 的浅描边：强描边（时间线未开始节点、分隔强调）——区别于 --color-border 的浅描边 */
  --color-accent-line: var(--red-line-28);  /* [review] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：强调色描边/透明线（当前节点连接线、卡片强调边）：强调色描边/透明线（当前节点连接线、卡片强调边） */
  --color-gold-edge: var(--gold-edge-55);  /* [review] INTAKE 第七批（九个基础组件）核查发现的语义层缺口补立（2026-09-26 02:0x）：金印描边（吸底栏上边框、凭证卡边）：金印描边（吸底栏上边框、凭证卡边） */
  --mo-tilt-press-scale: 0.97;  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 动效库 06 式 tilt 的 press 分支：按压倾斜的缩放档（<1=压下去）；与浮起档 scale 1.02 语义相反禁混用——浮起=可拖拽/可拾取，压下=可按压/就地生效 */
  --mo-scale-lift: 1.02;  /* [review] 刘总 2026-09-27 令「--mo-scale-*/--mo-rot-* 令牌增补」· 小齐执行 · 用量普查自 miniprogram-v3 wxss scale()：1.02×2 为 hover/可拾取浮起档（对应 mo-tilt-press-scale 注释里的浮起档 scale 1.02）：浮起/可拾取缩放档（>1 抬起）；与按压档 mo-scale-press(0.98)/mo-tilt-press-scale(0.97) 语义相反禁混用 */
  --mo-scale-press: 0.98;  /* [review] 刘总 2026-09-27 令「--mo-scale-*/--mo-rot-* 令牌增补」· 小齐执行 · 用量普查：.98×12 为按压反馈主簇；既存 mo-tilt-press-scale=0.97 为 tilt 按压分支专用，值差 1% 容差不另立别名：按压/就地生效缩放档（<1 压下）；覆盖 .98/.97/.96/.94 簇回落到 0.98 主值；与浮起档 mo-scale-lift(1.02) 相反 */
  --mo-scale-shrink: 0.66;  /* [review] 刘总 2026-09-27 令「--mo-scale-*/--mo-rot-* 令牌增补」· 小齐执行 · 用量普查：.66×2/.68×2 为折叠/缩略收起态：折叠/缩略收起缩放档；覆盖 .66/.68 簇，近邻 .62 亦可回落此档 */
  --mo-scale-mini: 0.6;  /* [review] 刘总 2026-09-27 令「--mo-scale-*/--mo-rot-* 令牌增补」· 小齐执行 · 用量普查：scale(0.6)×3 为迷你收起态：迷你收起缩放档；覆盖 .6 簇，近邻 .5/.48 亦可回落此档；区别于 mo-scale-shrink(0.66) 的中度收起 */
  --mo-scale-collapse: 0;  /* [review] 刘总 2026-09-27 令「--mo-scale-*/--mo-rot-* 令牌增补」· 小齐执行 · 用量普查：scale(0) 为完全收起/消失过渡终点：完全收起缩放档（0 缩没）；用于收起/消失过渡终点，与 mo-scale-mini(0.6) 之间为中间态 */
  --mo-rot-flip: 180deg;  /* [review] 刘总 2026-09-27 令「--mo-scale-*/--mo-rot-* 令牌增补」· 小齐执行 · 用量普查：health-check 折叠箭头 rotate(180deg)、redemption-code chevron 45→225deg 旋转跨度：功能态翻转旋转（状态切换：折叠箭头展开 / chevron 开合）；区别于版面静态倾斜 tilt-sticker(2deg)——本档是动效域状态旋转，非版面装饰 */
  --mo-rot-chevron: 45deg;  /* [review] 刘总 2026-09-27 令「--mo-scale-*/--mo-rot-* 令牌增补」· 小齐执行 · 用量普查：redemption-code 收起态 chevron rotate(45deg)，展开 rotate(225deg)=45+mo-rot-flip(180)：chevron/箭头基础角；展开态 = calc(var(--mo-rot-chevron) + var(--mo-rot-flip)) = 225deg，与 mo-rot-flip 配合消除 45/225 双字面量 */
  --color-brand-blue: var(--brand-blue-500);  /* [review] 小冈 2026-09-26 15:26 (1f593943) 玩法页 P2 迁移新增；小齐复验后按实际值补入真源（原只写在 vi-tokens.wxss，未入库 → build 零破坏断言红）：消费名。🔴 待决(决策10)：与库既有 --color-lake(#416F82)/scrim-* 语义重复，是否合并须刘总+小冈确认；此处先按实际值登记保渲染不变｜🔴 决策10 废弃：圣湖蓝归一到 --color-lake（值暂留，二期改名后删） */
  --color-brand-blue-deep: var(--brand-blue-700);  /* [review] 小冈 2026-09-26 15:26 (1f593943) 玩法页 P2 迁移新增；小齐复验后按实际值补入真源（原只写在 vi-tokens.wxss，未入库 → build 零破坏断言红）：消费名。🔴 待决(决策10)：与库既有 --color-lake(#416F82)/scrim-* 语义重复，是否合并须刘总+小冈确认；此处先按实际值登记保渲染不变｜🔴 决策10 废弃：圣湖蓝深档归一到 --color-lake-deep（值暂留，二期改名后删） */
  --bleed-page-x: var(--bleed-32);  /* [open] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：页面级出血消费名。用法：margin-left/right: var(--bleed-page-x) ⇒ 内容越过 32rpx 安全边撑满屏宽。破「通栏满宽单行」的第一手法 */
  --overlap-hero: var(--overlap-40);  /* [open] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：内容卡压 hero 的标准上移量。配 z-index:var(--z-panel) 或 mo-z-fg 使用；破「hero 图 + 下方卡片」两段式断裂 */
  --tilt-sticker: var(--deg-2);  /* [open] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：静态贴纸倾斜（transform: rotate(var(--tilt-sticker))）。与 mo-tilt-*（交互倾斜，动效域）分工：本令牌=版面常态倾斜，mo-tilt=按压/拖拽时的动态倾斜 */
  --grid-bento-main: var(--fr-1) var(--fr-1-65);  /* [open] 刘总 2026-09-26 18:2x 令「先补上」——破方正八手法落库（principle.layout-composition）；小齐执行：bento 不等分双列（grid-template-columns: var(--grid-bento-main) ≈ 38%:62%）。查重：v3 实测 grid-template-columns 13 处全等分（1fr 1fr / repeat(3,1fr) / repeat(4,minmax(0,1fr))）+ 3 处「固定宽+流式」图文模式，不等分 0 处 ⇒ 本令牌填补真空 */

  /* ── L2 组件 component（视觉部件 button./card./… + DSL 模块 module.*） ── */
  /* · button · */
  --component-button-height: var(--h-88);  /* [open] 归位自 semantic.btn-h（gpt6 评审 §2.1，2026-09-25）：按钮高度；触控区 ≥88rpx 红线（locked 下限由 V11 数值域校验兜底） */
  --component-button-padding-inline: var(--s-32);  /* [open] 归位自 semantic.btn-pad-x（gpt6 评审 §2.1，2026-09-25）：按钮水平内边距 */
  --component-button-font-size: var(--font-md);  /* [review] 归位自 semantic.btn-font（gpt6 评审 §2.1，2026-09-25）：按钮字号；改动影响全按钮族，需设计审核 */
  /* · card · */
  --component-card-radius: var(--s-20);  /* [open] 归位自 semantic.radius-card（gpt6 评审 §2.1，2026-09-25）；刘总决策8（2026-09-25 22:3x）.2 选项B：**圆角属视觉曲率不属间距，永久豁免 8 倍数管辖**（spacing-8 原则原文管"外边距和行高"）；20rpx 系 VI 母规范卡片圆角，v3 硬编码 11 处/6 文件同值，维持不动：通用卡片圆角（泛指；业务卡片特化走 module.*） */
  --component-card-padding: var(--space-24);  /* [open] 归位自 semantic.space-card-pad（gpt6 评审 §2.1，2026-09-25）：通用卡片内边距 */
  --component-card-gap: var(--space-16);  /* [open] 归位自 semantic.space-card-gap（gpt6 评审 §2.1，2026-09-25）：卡片内元素间距 */
  --component-card-motion-duration: var(--t-360);  /* [review] 归位自 semantic.mo-dur-card（gpt6 评审 §2.1，2026-09-25）：卡片动效时长（部件专属，gpt6 §2.3） */
  /* · credential · */
  --component-credential-radius: var(--s-16);  /* [open] 归位自 semantic.radius-credential（gpt6 评审 §2.1，2026-09-25）：凭证/核销码块圆角（领域部件，不并入通用 card） */
  /* · module.hero-banner · */
  --module-hero-banner-padding-block: var(--s-96);  /* [open] 刘总决策8（2026-09-25 22:3x）.1 选项A：100rpx→96rpx 收敛 8 倍数（spacing-8 原则优先于 VI 存量值；v3 消费面实测 0 处，零页面破坏）；原 100rpx 系 VI 母规范 hero 留白：hero 区上下留白（已收敛 96rpx，V12 通过无需豁免） */
  --module-hero-banner-title-size: var(--f-56);  /* [review] 归位自 semantic.font-hero（gpt6 评审 §2.1，2026-09-25）：Hero 标题字号 */
  --module-hero-banner-title-lh: var(--f-72);  /* [review] 归位自 semantic.font-hero-lh（gpt6 评审 §2.1，2026-09-25）：Hero 标题行高 */
  /* · button · */
  --component-button-motion-duration: var(--t-140);  /* [review] 归位自 semantic.mo-dur-btn（gpt6 评审 §2.1，2026-09-25）：按钮交互动效时长（部件专属） */
  /* · sheet · */
  --component-sheet-motion-duration: var(--t-340);  /* [review] 归位自 semantic.mo-dur-sheet（gpt6 评审 §2.1，2026-09-25）：底部操作单进出时长（部件专属） */
  /* · button · */
  --component-button-radius: var(--radius-control);  /* [open] 扫描 border-radius:8rpx×1；与 radius-control 控件圆角语义一致：按钮圆角 */
  /* · input · */
  --component-input-height: var(--h-88);  /* [open] 控件触控红线 88rpx 档（同 button.height，VI 红线延伸）；v3 input 未显式定高，此为体系标准档：输入控件高度 */
  --component-input-padding: var(--space-24);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：padding:24rpx×1：输入控件内边距 */
  --component-input-font-size: var(--font-xs);  /* [review] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：font-size:var(--font-xs)×1（24rpx）——按 v3 部署现实收录；若防 iOS 缩放需 ≥28rpx 属 P2 迁移时再议：输入文字字号 */
  --component-input-radius: var(--radius-control);  /* [open] radius-control 语义即"控件圆角"（8rpx），input 与 button 同档：输入控件圆角 */
  /* · nav · */
  --component-nav-pill-height: var(--h-64);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：height:64rpx×10（胶囊分段导航）；⚠️ 低于 88rpx 触控红线——v3 部署现实如此，触控区靠 padding 扩展，P2 迁移时复核：导航胶囊高度 */
  --component-nav-pill-radius: var(--radius-full);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：border-radius:999rpx×10：导航胶囊圆角 */
  --component-nav-item-gap: var(--space-24);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：gap:24rpx×1：导航项间距 */
  /* · tag · */
  --component-tag-font-size: var(--font-xs);  /* [review] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：font-size:var(--font-xs)×4：标签文字字号 */
  /* · dialog · */
  --component-dialog-padding: var(--space-36);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：padding:36rpx×1：对话框内边距 */
  --component-dialog-button-min-height: var(--h-96);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：min-height:96rpx×1（对话框操作按钮，高于通用红线 88）：对话框按钮最小高 */
  --component-dialog-gap: var(--space-24);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：gap:24rpx×2（最高频）：对话框元素间距 */
  --component-dialog-title-size: var(--font-lg);  /* [review] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：font-size:var(--font-lg)×1：对话框标题字号 */
  /* · toast · */
  --component-toast-radius: var(--radius-lg);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：border-radius:16rpx×4：toast 圆角 */
  --component-toast-font-size: var(--font-xs);  /* [review] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：font-size:24rpx×4 + var(--font-xs)×5：toast 文字字号 */
  /* · sheet · */
  --component-sheet-padding: var(--space-40);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：padding:40rpx×1：底部单内边距 */
  --component-sheet-item-min-height: var(--h-88);  /* [open] v3 wxss 部件扫描 2026-09-25（build-catalog 同源数据）：min-height:88rpx×1（触控红线档）：底部单选项最小高 */
  /* · list · */
  --component-list-item-padding-block: var(--space-20);  /* [open] v3 m-list-view/index.wxss 扫描 2026-09-25：.lv-item padding:20rpx 0：列表项纵向内边距 */
  --component-list-title-size: var(--font-body);  /* [review] v3 m-list-view/index.wxss 扫描 2026-09-25：.lv-title font-size:28rpx：列表项标题字号 */
  --component-list-meta-size: var(--font-minor);  /* [review] v3 m-list-view/index.wxss 扫描 2026-09-25：.lv-meta font-size:22rpx：列表项元信息字号 */
  --component-list-state-padding-block: var(--space-24);  /* [open] v3 m-list-view/index.wxss 扫描 2026-09-25：.lv-state padding:24rpx 0：列表态块纵向内边距 */
  /* · bar · */
  --component-bar-top-min-height: var(--h-116);  /* [open] v3 wxss bar 复核扫描 2026-09-25 21:1x（topbar 规则块 14 个：sticky×5/absolute×1/static×8；此前"46处"掺入 static 的 footer×20/action×8 内容区块，非 bar 域，已剔除）+ gpt6 二轮评审 Q2 裁决：.topbar min-height:116rpx×2 主值 vs 132rpx×1 例外页（主值覆盖 67%，P2 迁移收敛补至 100%）；顶栏=视觉高度，触控红线由内部命中区保障（gpt6 Q5）：吸顶栏最小高度 */
  --component-bar-top-padding-block: var(--space-24);  /* [open] v3 wxss bar 复核扫描 2026-09-25 21:1x（topbar 规则块 14 个：sticky×5/absolute×1/static×8；此前"46处"掺入 static 的 footer×20/action×8 内容区块，非 bar 域，已剔除）+ gpt6 二轮评审 Q2 裁决：.topbar padding:24rpx 36rpx×2 主值拆分（block 分量）：吸顶栏纵向内边距 */
  --component-bar-top-padding-inline: var(--space-36);  /* [open] v3 wxss bar 复核扫描 2026-09-25 21:1x（topbar 规则块 14 个：sticky×5/absolute×1/static×8；此前"46处"掺入 static 的 footer×20/action×8 内容区块，非 bar 域，已剔除）+ gpt6 二轮评审 Q2 裁决：.topbar padding:24rpx 36rpx×2 主值拆分（inline 分量）：吸顶栏横向内边距 */
  /* · grid · */
  --component-grid-columns: var(--cols-4);  /* [review] 刘总拍板 2026-09-25 21:4x（决策单1.1）：默认 4 列；m-module-grid 实现 config.columns||4；A端可配 2-5 走 DSL props 不走主题覆盖：宫格默认列数 */
  --component-grid-gap: var(--space-24);  /* [open] 刘总拍板 2026-09-25 21:4x（决策单1.2）：20rpx=m-module-grid .mg 实测；与 card.gap 同档；⚠️ 决策7.3 若拍 20→24 收敛，本令牌改指 space-24；刘总决策7（2026-09-25 22:0x）.3 拍板 20→24 收敛，本令牌改指 space-24：宫格间距 */
  --component-grid-icon-size: var(--h-92);  /* [open] 刘总拍板 2026-09-25 21:4x（决策单1.4）：92rpx=.mg-box 实测，>88 触控红线（V11 扩项管控）：宫格图标盒尺寸 */
  --component-grid-label-size: var(--font-xs);  /* [review] 刘总拍板 2026-09-25 21:4x（决策单1.5）：24rpx=.mg-label 实测：宫格标签字号 */
  --component-grid-label-color: var(--color-gray-700);  /* [locked] 刘总拍板 2026-09-25 21:4x（决策单1附加③）：#403B34 vs surface 11.09:1 / vs bg 9.84:1（实测≥4.5 红线）；无障碍色 locked（gpt6 §5）；禁改浅（disabled 1.68:1 为反例）：宫格标签色 */
  /* · bar · */
  --component-bar-bottom-content-height: var(--h-116);  /* [open] 刘总拍板 2026-09-25 21:4x（决策单2.1）：116rpx canonical（gpt6 Q2：与 topbar 同值统一 bar 高度语言；132 例外页已登记 MIGRATIONS M-001）：吸底条内容高度 */
  --component-bar-bottom-padding: calc(var(--space-40) + env(safe-area-inset-bottom));  /* [open] 刘总拍板 2026-09-25 21:4x（决策单2.2）：safe-area 走 env() 结构增量禁硬编码进高度；X=40rpx 取 orders .sheet-panel 实测 calc(40rpx + env(...))；键盘避让不入令牌（决策2.4，页面 viewport 逻辑处理）：吸底条底边距（含安全区） */
  /* · nav · */
  --component-nav-hit-area-min-height: var(--h-88);  /* [locked] 刘总拍板 2026-09-25 21:4x（决策单3.2）：触控红线档；可视 pill 64rpx 维持（决策3.1），命中区独立 ≥88rpx；实现法=负 margin/伪元素扩展（禁侵入相邻元素布局，见 REGISTRATION §四）；V11 扩项机器管控：导航命中区最小高 */
  /* · input · */
  --component-input-error-color: var(--color-danger);  /* [locked] 刘总拍板 2026-09-25 21:4x（决策单4附加②）：#B3261E vs surface 6.54:1（实测≥4.5）；表单校验错误态文字/图标/边框统一映射 color-danger，禁各页自配红：输入错误态色 */
  /* · fab · */
  --component-fab-height: var(--h-96);  /* [open] 刘总决策5（2026-09-25 22:0x）.2：96rpx 胶囊形全宽主按钮（≥88 触控红线✅；带文案承载力>圆钮；V11 扩项管控）：悬浮主操作高度 */
  --component-fab-radius: var(--radius-pill);  /* [open] 刘总决策5（2026-09-25 22:0x）.1：胶囊形（radius-pill=40rpx）：胶囊形 */
  --component-fab-margin-inline: var(--space-32);  /* [open] 刘总决策5（2026-09-25 22:0x）.1：左右边距 32rpx（8 倍数✅）：左右边距 */
  --component-fab-bottom-offset: calc(var(--space-24) + env(safe-area-inset-bottom));  /* [open] 刘总决策5（2026-09-25 22:0x）.3：悬浮于操作栏上方 24rpx + safe-area 结构增量（禁硬编码安全区）：悬浮偏移（含安全区） */
  /* · bar · */
  --component-bar-backdrop-blur: var(--blur-20);  /* [locked] 刘总决策5（2026-09-25 22:0x）.4：blur(20px)，**仅限底栏矩形范围**（禁全屏/整页毛玻璃）：毛玻璃模糊半径 */
  --component-bar-backdrop-bg: var(--paper-72);  /* [locked] 刘总决策5（2026-09-25 22:0x）.4：透底底色 paper-50 72%：毛玻璃透底色 */
  --component-bar-backdrop-fallback-bg: var(--paper-96);  /* [locked] 刘总决策5（2026-09-25 22:0x）.5：@supports not (backdrop-filter:blur(1px)) 时降级底色 96% + shadow-md（禁透明裸奔）：不支持时降级底色 */
  /* · nav · */
  --component-nav-anchor-offset: var(--h-112);  /* [open] INTAKE 六式余项入库（2026-09-25 23:4x，刘总令"先把之前的都入库"）：分类联动锚点偏移（动效库 12 式 tokens 字段兑现；scroll-into-view 落点减吸顶条高，禁标题被遮）：锚点滚动偏移补偿 */
  /* · badge · */
  --component-badge-stack-overlap: -32rpx;  /* [review] INTAKE 第八批（六个组件细节）2026-09-26 03:0x 刘总提供参考稿，评估全收：5 新件 + 01 accordion 横向变体 · 组件 10 重叠排列：叠放项负 margin（≈头像 96rpx 的 1/3）；正值=散开态间距由各件自定 */
  /* · list · */
  --component-list-progress-flash: var(--t-560);  /* [review] INTAKE 第八批（六个组件细节）2026-09-26 03:0x 刘总提供参考稿，评估全收：5 新件 + 01 accordion 横向变体 · 组件 11 进度底色项：完成时整体提亮一次的时长（brightness 脉冲，只一次禁循环） */
  /* · sheet · */
  --component-sheet-tray-peek: 72rpx;  /* [review] INTAKE 第八批（六个组件细节）2026-09-26 03:0x 刘总提供参考稿，评估全收：5 新件 + 01 accordion 横向变体 · 组件 12 组件托盘：托盘常露拉手行高（整行可点；<88rpx 触控红线，命中区靠 padding 外扩，同 nav.pill-height 处置） */
  /* · grid · */
  --component-grid-dock-magnify: 1.8;  /* [review] INTAKE 第八批（六个组件细节）2026-09-26 03:0x 刘总提供参考稿，评估全收：5 新件 + 01 accordion 横向变体 · 组件 13 跟手图标坞：焦点项最大缩放倍数；>2.2 开始遮挡邻项 */
  --component-grid-dock-falloff: 1.5;  /* [review] INTAKE 第八批（六个组件细节）2026-09-26 03:0x 刘总提供参考稿，评估全收：5 新件 + 01 accordion 横向变体 · 组件 13 跟手图标坞：高斯衰减分母 exp(-d²/falloff)；小=尖峰只放一个，大=宽波一片都大 */
  /* · bar · */
  --component-bar-summary-collapsed-h: var(--h-88);  /* [review] INTAKE 第八批（六个组件细节）2026-09-26 03:0x 刘总提供参考稿，评估全收：5 新件 + 01 accordion 横向变体 · 组件 14 下拉摘要：胶囊行高=触控红线 88rpx（整行是下拉手势命中区） */
  --component-bar-summary-dim: 0.45;  /* [review] INTAKE 第八批（六个组件细节）2026-09-26 03:0x 刘总提供参考稿，评估全收：5 新件 + 01 accordion 横向变体 · 组件 14 下拉摘要：展开时下方内容压暗透明度；必须配 pointer-events:none（压暗但能点=状态欺骗） */
  /* · tag · */
  --component-tag-remove-scale: 0.18;  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 15 可删除标签组：两段式退场第一段的目标 scale（缩成圆点）；顺序禁反=先收形状再淡出 */
  --component-tag-height: var(--h-64);  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 15：标签本体高 64rpx（<88rpx 触控红线，× 命中区靠伪元素外扩补齐，同 nav.pill-height 处置） */
  --component-tag-gap: var(--s-16);  /* [open] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 15：标签间距 16rpx（8 倍数，V12 spacing-8） */
  /* · input · */
  --component-input-mention-float-radius: var(--r-24);  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 16 输入联想浮层：联想浮层圆角 */
  --component-input-mention-float-max-h: 344rpx;  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 16：浮层最大高（8 倍数）；候选 ≤8 条——浮层不能比正文大 */
  --component-input-ruler-tick-h: var(--h-112);  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 17 波动字号刻度：刻度排高 112rpx（含触控余量） */
  --component-input-ruler-fade: 22%;  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 17：两侧 mask 渐隐起点（百分比）；用 mask 不用逐项 opacity=合成层一次成型 */
  --component-input-ruler-snap: var(--t-320);  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 17：松手吸附时长（spring 回正带过冲=卡进格位手感） */
  --component-input-ruler-cur-scale: 1.35;  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 17：中间读数窗当前档的放大倍数 */
  /* · bar · */
  --component-bar-voice-h: var(--h-104);  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 18 长按录音条：底栏高（8 倍数，≥88rpx 触控红线） */
  --component-bar-voice-expand-w: 660rpx;  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 18：录音态横向拉长宽度 */
  --component-bar-voice-wave-bars: 28;  /* [review] INTAKE 第九批（六个反馈细节）2026-09-26 03:4x 刘总提供参考稿；评估=4 新件（15-18）+ 2 变体（06 filterpills.checkmark / 动效库 06 式 tilt.press 分支） · 组件 18：波形柱数（固定；禁按帧增删节点） */
  /* · card · */
  --component-card-accordion-collapsed-grow: 1;  /* [review] INTAKE 第十批（组件库 v1.4 盘点补漏 · 2026-09-27 02:0x）+ 第十一批（扫工程消费面 · 02:3x）；刘总 02:4x「落库」令 · 组件 19 横向手风琴：收起条 flex-grow 基准（恒 1）——展开条吃增量，其余条是被挤窄而非各自动画（禁逐条 delay） */
  --component-card-accordion-expanded-grow: 5;  /* [review] INTAKE 第十批（组件库 v1.4 盘点补漏 · 2026-09-27 02:0x）+ 第十一批（扫工程消费面 · 02:3x）；刘总 02:4x「落库」令 · 组件 19 横向手风琴：展开条 flex-grow（相对收起条宽度倍数；可调=面板占比，默认对齐组件库件 19 demo 的 openFlex=5）。与 collapsed 同用 flex-grow 过渡，禁 width:0→auto / max-width / JS 量宽 */
  --component-card-accordion-content-delay: var(--t-120);  /* [review] INTAKE 第十批（组件库 v1.4 盘点补漏 · 2026-09-27 02:0x）+ 第十一批（扫工程消费面 · 02:3x）；刘总 02:4x「落库」令 · 组件 19 横向手风琴：内容淡入延迟（≈展开时长 ×0.35：320×0.35=112ms 收敛到既有 t-120 档，禁新增档位）——先开条后出字 */
  /* · nav · */
  --component-nav-tabs-underline-h: var(--s-4);  /* [review] INTAKE 第十批（组件库 v1.4 盘点补漏 · 2026-09-27 02:0x）+ 第十一批（扫工程消费面 · 02:3x）；刘总 02:4x「落库」令 · 组件 20 顶部标签页：指示线厚度（细线）——值收敛到既有 {s-4} 档（原提案 6rpx 无对应档位，禁为单件新增档位）。同 01「三者同时」原则：translateX+width 双过渡，禁点一下只换色、禁宽度跳变、禁 left/right 过渡 */
  --component-nav-tabs-center-delay: var(--t-100);  /* [review] INTAKE 第十批（组件库 v1.4 盘点补漏 · 2026-09-27 02:0x）+ 第十一批（扫工程消费面 · 02:3x）；刘总 02:4x「落库」令 · 组件 20 顶部标签页：落定后自动居中的等待（原提案 80ms 收敛到既有 t-100 档）；scroll-into-view 目标=offsetLeft-(容器宽-自身宽)/2 */
  /* · card · */
  --component-card-skeleton-delay: var(--t-200);  /* [review] INTAKE 第十一批（扫工程消费面 · 2026-09-27 02:3x）；刘总 02:4x「落库」令 · 组件 23 骨架屏：延迟出现阈值：200ms 内返回则不显示骨架（防闪第一律）；与 state-loading 边界=有结构预期用骨架、无结构用 loading */
  --component-card-skeleton-shimmer-duration: var(--t-900);  /* [review] INTAKE 第十一批（扫工程消费面 · 2026-09-27 02:3x）；刘总 02:4x「落库」令 · 组件 23 骨架屏：微光扫过一轮时长——值收敛到既有 {t-900} 档（原提案 1200ms 无对应档位，禁新增）；纯 CSS 位移扫光，禁 opacity 呼吸。头号翻车点=骨架尺寸必须与真实内容同令牌，否则加载完必跳 */

  /* ── 兼容别名 ── */
  --btn-h: var(--component-button-height);  /* → button.height 旧名兼容 → {button.height}（命名升级 gpt6 §4.2，2026-09-25） */
  --btn-pad-x: var(--component-button-padding-inline);  /* → button.padding-inline 旧名兼容 → {button.padding-inline}（命名升级 gpt6 §4.2，2026-09-25） */
  --btn-font: var(--component-button-font-size);  /* → button.font-size 旧名兼容 → {button.font-size}（命名升级 gpt6 §4.2，2026-09-25） */
  --radius-card: var(--component-card-radius);  /* → card.radius 旧名兼容 → {card.radius}（命名升级 gpt6 §4.2，2026-09-25） */
  --space-card-pad: var(--component-card-padding);  /* → card.padding 旧名兼容 → {card.padding}（命名升级 gpt6 §4.2，2026-09-25） */
  --space-card-gap: var(--component-card-gap);  /* → card.gap 旧名兼容 → {card.gap}（命名升级 gpt6 §4.2，2026-09-25） */
  --mo-dur-card: var(--component-card-motion-duration);  /* → card.motion.duration 旧名兼容 → {card.motion.duration}（命名升级 gpt6 §4.2，2026-09-25） */
  --radius-credential: var(--component-credential-radius);  /* → credential.radius 旧名兼容 → {credential.radius}（命名升级 gpt6 §4.2，2026-09-25） */
  --space-hero: var(--module-hero-banner-padding-block);  /* → module.hero-banner.padding-block 旧名兼容 → {module.hero-banner.padding-block}（命名升级 gpt6 §4.2，2026-09-25） */
  --font-hero: var(--module-hero-banner-title-size);  /* → module.hero-banner.title-size 旧名兼容 → {module.hero-banner.title-size}（命名升级 gpt6 §4.2，2026-09-25） */
  --font-hero-lh: var(--module-hero-banner-title-lh);  /* → module.hero-banner.title-lh 旧名兼容 → {module.hero-banner.title-lh}（命名升级 gpt6 §4.2，2026-09-25） */
  --mo-dur-btn: var(--component-button-motion-duration);  /* → button.motion.duration 旧名兼容 → {button.motion.duration}（命名升级 gpt6 §4.2，2026-09-25） */
  --mo-dur-sheet: var(--component-sheet-motion-duration);  /* → sheet.motion.duration 旧名兼容 → {sheet.motion.duration}（命名升级 gpt6 §4.2，2026-09-25） */
  --rpx: 1px;  /* → HTML 实验室旧词汇 */
  --paper-page: var(--paper-300);  /* → paper-300 HTML 实验室旧词汇 */
  --paper: var(--paper-100);  /* → paper-100 HTML 实验室旧词汇 */
  --paper-raised: var(--paper-50);  /* → paper-50 HTML 实验室旧词汇 */
  --paper-sunken: var(--paper-200);  /* → paper-200 HTML 实验室旧词汇 */
  --paper-deep: var(--paper-400);  /* → paper-400 HTML 实验室旧词汇 */
  --ink: var(--ink-900);  /* → ink-900 HTML 实验室旧词汇 */
  --ink-2: var(--ink-700);  /* → ink-700 HTML 实验室旧词汇 */
  --ink-3: var(--ink-500);  /* → ink-500 HTML 实验室旧词汇 */
  --ink-4: var(--ink-450);  /* → ink-450 HTML 实验室旧词汇 */
  --ink-invert: var(--paper-50);  /* → paper-50 HTML 实验室旧词汇 */
  --accent: var(--red-500);  /* → red-500 HTML 实验室旧词汇 */
  --accent-deep: var(--red-700);  /* → red-700 lab 旧值 #7A1F10 → canonical #7A2010（vi 定稿，视觉不可辨） */
  --accent-soft: var(--red-soft-10);  /* → red-soft-10 HTML 实验室旧词汇 */
  --accent-line: var(--red-line-28);  /* → red-line-28 HTML 实验室旧词汇 */
  --seal: var(--gold-500);  /* → gold-500 lab「印章金」= app「主色金」同值归一 */
  --seal-deep: var(--gold-600);  /* → gold-600 HTML 实验室旧词汇 */
  --seal-soft: var(--gold-soft-18);  /* → gold-soft-18 HTML 实验室旧词汇 */
  --seal-edge: var(--gold-edge-55);  /* → gold-edge-55 HTML 实验室旧词汇 */
  --lake: var(--lake-500);  /* → lake-500 lab 旧值 #3E6B78 → vi 定稿 #416F82 → 2026-09-26 17:1x 刘总终裁 #2E5E73（canonical 随 lake-500） */
  --snow: var(--snow-mist);  /* → snow-mist 保留 lab 装饰用蓝灰 #8FA3AE；VI 的 --color-snow=#F7FAFA 是底色用、禁作标记色，两者语义不同故分立 */
  --onsen: var(--onsen-500);  /* → onsen-500 lab 旧值 #A8674A → canonical #926B53（vi 定稿归一） */
  --moss: var(--moss-500);  /* → moss-500 HTML 实验室旧词汇 */
  --line: var(--alpha-10);  /* → alpha-10 HTML 实验室旧词汇 */
  --line-2: var(--alpha-18);  /* → alpha-18 HTML 实验室旧词汇 */
  --line-ui: var(--alpha-52);  /* → alpha-52 HTML 实验室旧词汇 */
  --line-strong: var(--alpha-62);  /* → alpha-62 HTML 实验室旧词汇 */
  --line-invert: var(--invert-22);  /* → invert-22 HTML 实验室旧词汇 */
  --card-edge: var(--line-2);  /* → HTML 实验室旧词汇 */
  --card-edge-strong: var(--line-ui);  /* → HTML 实验室旧词汇 */
  --fs-xs: var(--f-24);  /* → s-24 HTML 实验室旧词汇 */
  --fs-sm: var(--f-28);  /* → s-28 HTML 实验室旧词汇 */
  --fs-md: var(--f-32);  /* → s-32 HTML 实验室旧词汇 */
  --fs-lg: var(--f-36);  /* → s-40 HTML 实验室旧词汇 */
  --fs-xl: var(--f-40);  /* → s-48 HTML 实验室旧词汇 */
  --fs-2xl: var(--f-48);  /* → s-56 HTML 实验室旧词汇 */
  --fs-hero: var(--f-64);  /* → s-64 HTML 实验室旧词汇 */
  --lh-tight: 1.22;  /* → HTML 实验室旧词汇 */
  --lh-normal: 1.5;  /* → HTML 实验室旧词汇 */
  --lh-loose: 1.72;  /* → HTML 实验室旧词汇 */
  --sp-1: var(--s-4);  /* → s-4 HTML 实验室旧词汇 */
  --sp-2: var(--s-8);  /* → s-8 HTML 实验室旧词汇 */
  --sp-3: var(--s-16);  /* → s-16 HTML 实验室旧词汇 → s-16（原 s-12，决策7.3 映射 12→16，决策8 连带执行） */
  --sp-4: var(--s-16);  /* → s-16 HTML 实验室旧词汇 */
  --sp-5: var(--s-24);  /* → s-24 HTML 实验室旧词汇 */
  --sp-6: var(--s-32);  /* → s-32 HTML 实验室旧词汇 */
  --sp-7: var(--s-40);  /* → s-40 HTML 实验室旧词汇 */
  --sp-8: var(--s-48);  /* → s-48 HTML 实验室旧词汇 */
  --sp-9: var(--s-64);  /* → s-64 HTML 实验室旧词汇 */
  --sp-10: var(--s-80);  /* → s-80 HTML 实验室旧词汇 */
  --r-sm: var(--r-8);  /* → s-12 HTML 实验室旧词汇 */
  --r-md: var(--r-12);  /* → s-16 HTML 实验室旧词汇 */
  --r-lg: var(--r-16);  /* → s-24 HTML 实验室旧词汇 */
  --r-pill: var(--r-999);  /* → r-999 HTML 实验室旧词汇 */
  --sh-1: 0 2rpx 12rpx rgba(43, 38, 32, .06);  /* → HTML 实验室旧词汇 */
  --sh-2: 0 8rpx 28rpx rgba(43, 38, 32, .10);  /* → HTML 实验室旧词汇 */
  --sh-3: 0 16rpx 48rpx rgba(43, 38, 32, .16);  /* → HTML 实验室旧词汇 */
  --sh-accent: 0 8rpx 24rpx rgba(155, 41, 21, .22);  /* → HTML 实验室旧词汇 */
  --dur-instant: var(--t-100);  /* → t-100 HTML 实验室旧词汇 */
  --dur-fast: var(--t-160);  /* → t-160 HTML 实验室旧词汇 */
  --dur-base: var(--t-240);  /* → t-240 HTML 实验室旧词汇 */
  --dur-slow: var(--t-320);  /* → t-320 HTML 实验室旧词汇 */
  --dur-xslow: var(--t-480);  /* → t-480 HTML 实验室旧词汇 */
  --safe-top: 0px;  /* → HTML 实验室旧词汇 */
  --safe-bottom: 0px;  /* → HTML 实验室旧词汇 */
  --nav-h: var(--btn-h);  /* → btn-h HTML 实验室旧词汇 */
  --amb-1: var(--paper-sunken);  /* → HTML 实验室旧词汇 */
  --amb-2: var(--paper-deep);  /* → HTML 实验室旧词汇 */
  --amb-3: var(--paper);  /* → HTML 实验室旧词汇 */
  --amb-a1: 0;  /* → HTML 实验室旧词汇 */
  --amb-a2: 0;  /* → HTML 实验室旧词汇 */
  --amb-scale: 1;  /* → HTML 实验室旧词汇 */
  --scrim-1: var(--scrim-28);  /* → scrim-28 HTML 实验室旧词汇 */
  --scrim-2: var(--scrim-48);  /* → scrim-48 HTML 实验室旧词汇 */
  --scrim-3: var(--scrim-66);  /* → scrim-66 HTML 实验室旧词汇 */
  --font-caption: var(--font-xs);  /* → font-xs 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-xs（24rpx 档，消费 2 处）。**单向标注：仅允许 font-caption→font-xs，禁反向引用**；P2 迁移后按废弃流程删除 */
  --font-body: var(--font-sm);  /* → font-sm 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-sm（28rpx 档，消费 11 处）。**单向标注：仅允许 font-body→font-sm，禁反向引用**；P2 迁移后按废弃流程删除 */
  --font-title: var(--font-md);  /* → font-md 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-md（32rpx 档，消费 2 处）。**单向标注：仅允许 font-title→font-md，禁反向引用**；P2 迁移后按废弃流程删除 */
  --font-title-lg: var(--font-lg);  /* → font-lg 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-lg（36rpx 档，消费 0 处）。**单向标注：仅允许 font-title-lg→font-lg，禁反向引用**；P2 迁移后按废弃流程删除 */
  --font-display: var(--font-xl);  /* → font-xl 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-xl（40rpx 档，消费 0 处）。**单向标注：仅允许 font-display→font-xl，禁反向引用**；P2 迁移后按废弃流程删除 */
  --font-subtitle: var(--font-sm);  /* → font-sm 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-sm（30→28rpx（决策6②：30 档并入 28，配 6.3 选项a），消费 1 处）。**单向标注：仅允许 font-subtitle→font-sm，禁反向引用**；P2 迁移后按废弃流程删除 */
  --font-minor: var(--font-xs);  /* → font-xs 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-xs（22→24rpx（决策6②：22 档并入 24），消费 0 处）。**单向标注：仅允许 font-minor→font-xs，禁反向引用**；P2 迁移后按废弃流程删除 */
  --font-body-sm: var(--font-sm);  /* → font-sm 刘总决策6（2026-09-25 22:0x）：字阶收敛 → font-sm（26→28rpx（决策6②：26 档并入 28），消费 6 处）。**单向标注：仅允许 font-body-sm→font-sm，禁反向引用**；P2 迁移后按废弃流程删除 */
  --space-12: var(--space-16);  /* → space-16 刘总决策7（2026-09-25 22:0x）.3 间距收敛 8 倍数：space-12()→space-16；v3 消费面实测 0 处（页面用硬编码未用令牌），P2 迁移直接写新档 */
  --space-20: var(--space-24);  /* → space-24 刘总决策7（2026-09-25 22:0x）.3 间距收敛 8 倍数：space-20()→space-24；v3 消费面实测 0 处（页面用硬编码未用令牌），P2 迁移直接写新档 */
  --space-28: var(--space-32);  /* → space-32 刘总决策7（2026-09-25 22:0x）.3 间距收敛 8 倍数：space-28()→space-32；v3 消费面实测 0 处（页面用硬编码未用令牌），P2 迁移直接写新档 */
  --space-36: var(--space-32);  /* → space-32 刘总决策7（2026-09-25 22:0x）.3 间距收敛 8 倍数：space-36()→space-32；v3 消费面实测 0 处（页面用硬编码未用令牌），P2 迁移直接写新档 */
  --space-44: var(--space-48);  /* → space-48 刘总决策7（2026-09-25 22:0x）.3 间距收敛 8 倍数：space-44()→space-48；v3 消费面实测 0 处（页面用硬编码未用令牌），P2 迁移直接写新档 */
}

/* ── 主题覆盖：demo-rebrand（themes.json preset）── */
[data-theme="demo-rebrand"] {
  --color-gold: #2E7DD1;
  --color-accent: #2E7DD1;
  --color-accent-deep: #1B5FA8;
  --color-bg: #F4F7FA;
}
