状态:已接受(2026-09-11) 关联:前端重设计规格 · theme.md · ui-ux-system.md
前端 131 个非测试组件全部使用内联 style:实测 2,256 处 style={{、仅 3 处 className、0 个 CSS 变量、88 个不同 hex。
后果是不逐文件改组件代码就无法调整任何样式 —— 布局重排与动效落地都被这一条前置阻塞。
同时 docs/product/theme.md 规定的「颜色值只出现在 token 定义处」全库 0 处遵守。
- 建立 token 变量层,前缀统一
--ed-,单一真源为app/scripts/gen-tokens.mjs,产物app/src/ui/tokens.css与app/src/ui/tokens.gen.ts均为生成物,手改由漂移测试判失败。 - 色阶采用「纸 + 墨」双档体系(视觉方向 C 活页):亮为主档、暗为「夜读」第二档,两档各给一值 —— 因同一颜色两档对比度差可达 4 倍。
- 四档墨度编码确定度(材质语言 D 显影):
ink-4未确认 /ink-3已重打分 /ink-2已确认 /ink-1已改写。 - 可及性裁决:以阅读面
--ed-bg-surface为基准 ——ink-2≥11:1、ink-3≥4.5:1、ink-4允许 3:1(实测:亮 11.42/5.13/3.22,暗 11.41/5.82/3.22)。ink-4的例外仅限过渡态,且必须满足:不得承载唯一关键信息、任何交互即升到ink-2、进入审校模式时全体升到 ≥4.5:1。 - z-index 六档标尺(t1=10 吸顶 / t2=100 常驻面板 / t3=200 锚定弹层 / t4=300 Modal+遮罩 / t5=400 Modal 内嵌 / t6=500 Toast),替代现状 32 文件 45 处硬编码的 17 个不同值。
- 图标语言为自绘线性 SVG(24 网格 / 描边 1.75 / 小圆角 /
currentColor),替代 310 个 emoji(跨平台字形不一致、无法语义着色、基线抖动)。
- 正面:样式首次可集中调校;对比度可被测试守护;图标可语义着色;后续批次不必逐文件改内联对象。
- 负面:存量 2,256 处内联 style 需按域逐步迁移(批 4),迁移期两套写法并存。
- 风险:
ink-4的 3:1 例外可能被误用 —— 由本 ADR 第 4 条三条约束 + review 检查兜底。 - 实证:色阶初稿中
--due亮档取#B26A12,实测对纸底仅 4.06:1、对面 4.23:1,低于正文 4.5:1 线,而它要承载「记忆语义」文字(如「3 天后」)。已修正为#A05F10(4.86 / 5.07)。该错误由本 ADR 要求的对比度测试在写测试阶段捕获 —— 这正是把纪律机器化的价值。
- 继续用内联 style + 约定色板:否决。约定无法被测试守护,且 88 个 hex 已证明约定会漂移。
- 引入 Tailwind 或 CSS-in-JS:否决。需要新依赖与构建改造,而本项目已有「脚本生成 CSS」的既有模式(
gen-mark-css.mjs)可直接复用,成本更低。 - 只建 CSS 变量、不做生成器:否决。无漂移守卫时 CSS 与 TS 两份数据必然分叉(现状 md/TS 双写已有先例问题)。