Skip to content

主题引擎发出的 9 组 CSS 变量零消费方(--font-size-* / --z-* / --duration-* …):ADR-0049 该判去留 #5021

Description

@xuyushun441-sys

#4001 批 15 的门测量中分离出来,未指派。批 15 收紧了 ui/theme.zod.ts 的全部 14 个站点(授权门是真的:defineStack({ themes }) + defineTheme()),但收紧解决的是「键被静默丢弃」,解决不了「键被完整接收然后没人读」 —— 后者是 ADR-0049 的题目,单独归档。

测量(2026-08-03,objectui main)

objectui 的 ThemeEngine.generateThemeVars() 把主题降成 CSS 自定义属性。逐组数消费方(packages/**,排除 node_modules/dist/ThemeEngine 自身):

发出的变量 来源 schema 块 objectui 内消费方
--primary / --background / --card / --foreground / --muted* / --border colors ✅ 全部被 components/src/index.css 等读取
--radius* borderRadius ✅ 11 处
--shadow* shadows ✅ 3 处
--font-sans typography.fontFamily.base ✅ 2 处
--font-heading typography.fontFamily.heading 0
--font-mono typography.fontFamily.mono 0
--font-size-* typography.fontSize(8 个 stop) 0
--font-weight-* typography.fontWeight(5 个) 0
--line-height-* typography.lineHeight(4 个) 0
--letter-spacing-* typography.letterSpacing(5 个) 0
--duration-* animation.duration(3 个) 0
--timing-* animation.timing(5 个) 0
--z-* zIndex(8 个) 0

即:ThemeSchematypography(除 fontFamily.base 外)、animationzIndex 三个顶层块,作者写进去、引擎老老实实发出去、平台自己没有任何一个组件或样式表读它们

为什么这不是「和 #4001 一起顺手办了」

两件事必须分开,否则会得出错误结论:

一条重要的反驳,必须先回答

CSS 自定义属性和普通 spec 键不同:它发到文档上之后,租户自己的样式表可以读。所以「仓库内零消费方」对 CSS 变量而言是比对 spec 键更弱的证据 —— 不能照搬 #1878/#1893 那轮的判法直接删。

需要判的是:这些变量是对外承诺的公共 token 面(那就该有文档、有稳定性保证,而不是靠九个巧合的命名),还是没人接的半成品(那就 ADR-0049 退役,或补上消费方)。

#3494 已经用同样的理由删过八个 prop(spacing/breakpoints/density/wcagContrast …),留下的正是这批 —— 当时的判据是「引擎从不发出」,而这批引擎确实发出,所以上一轮的判据够不着它们,这是它们活到今天的原因。

可选处置

  1. 补消费方 —— 让 shadcn/Tailwind 层真正读 --font-size-* / --z-*,主题就名副其实。工作量在 objectui。
  2. 退役 —— 按 ADR-0049 删掉 typography.fontSize/fontWeight/lineHeight/letterSpacinganimationzIndex,作者改用已声明的 customVars(它本来就是发任意 CSS 变量的正门,而且有真实消费者:发什么就是什么)。
  3. 明确承诺为公共 token 面 —— 保留,但补文档与稳定性说明,并加一条测试钉死变量名。

倾向 3 或 1:2 会拿掉一个语义化的 token 词表,而 customVars 是无结构的字符串对,AI 作者在它上面更容易出错(正是 #4001 关心的方向)。但这需要维护者定,不该由一次 strictness 批次顺手决定。

参考

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions