refactor(design-system): DS-8 统一 Desktop 设计数值的生产来源 - #4268
Conversation
Signed-off-by: kirozeng <kirozeng@gmail.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
| Filename | Overview |
|---|---|
| packages/design-tokens/src/generate.ts | 新增生产生成编排及 18 个输出;基础数值映射对 symbolic alias 缺少安全转换或拒绝。 |
| packages/design-tokens/src/production.ts | 新增绑定、类型、alias、格式及生成区域校验,整体防护完整,但像素映射校验未覆盖 token 自身的 cssAlias。 |
| packages/design-tokens/src/desktop-bindings.json | 集中声明 Desktop 默认色、主题覆盖、基础值、文档和窗口背板的生产绑定。 |
| apps/desktop/src/renderer/themes/colors.ts | 将已建模颜色默认值切换到生成常量,同时保留注册顺序和明确保留项。 |
| apps/desktop/src/renderer/styles/generated/tokens.css | 在 base layer 中提供字体、字号、动效、间距、圆角、Input 和额度条的静态默认值。 |
| apps/desktop/tailwind.config.ts | Tailwind 字号、间距、圆角、字重和动效映射改由生成区域维护。 |
| apps/desktop/src/renderer/hooks/useFontSettings.ts | 运行时字体缩放改为消费生成映射,现有缩放和覆盖行为保持不变。 |
| pnpm-lock.yaml | 锁定 Terrazzo 2.7.1 及其构建期依赖,Node 要求与仓库支持基线一致。 |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[DTCG reference tokens] --> D[Terrazzo 2.7.1]
B[Semantic/component/theme tokens] --> D
C[desktop-bindings.json] --> D
D --> E[colors.ts 与内置主题]
D --> F[tokens.css 与 token-mappings.ts]
D --> G[tailwind.config.ts]
D --> H[共享 appearance 与窗口背板]
D --> I[DESIGN.md 规范区域]
F --> J[Desktop renderer]
E --> J
G --> J
Prompt To Fix All With AI
### Issue 1
packages/design-tokens/src/generate.ts:66
**符号别名会生成 NaN**
当 `numeric`、`text`、`lineHeight` 或 `defaults` 中的基础 token 增加合法的 `cssAlias` 时,`formatToken()` 会返回 `var(--...)`,而这里会继续对它执行 `Number.parseFloat`。结果是生成器把 `NaN` 静默写入 `token-mappings.ts` 或 `appearance-tokens.ts`,后续字体与行高计算可能失效。建议在生成数值前拒绝这类符号别名,或直接从解析后的 px dimension 读取数值,并补充对应的负例测试。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Reviews (1): Last reviewed commit: "refactor(design-system): DS-8 统一 Desktop..." | Re-trigger Greptile
- validateProduction 对 numeric/text/lineHeight/defaults 四族运行期像素 绑定新增校验:绑定 token 自身携带合法 cssAlias 时直接拒绝。此前 formatToken() 会输出 var(--…),generate.ts 的 Number.parseFloat 把它 静默变成 NaN 写入 token-mappings.ts / appearance-tokens.ts(JSON 序列化后成 null),字体与行高的运行期缩放随之失效。补 numeric 与 defaults 两条负例,分别钉住 token-mappings 与 appearance-tokens 两条输出链。 - 修复 Windows unit tests 红:两处测试断言用 '/themes/colors.ts' 后缀 匹配 buildProductionFiles 的输出路径,Windows 上 path.join 返回 '\' 分隔符导致匹配失败。按跨平台路径宪法改为 path.join 构造期望路径后 全等比较。 Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
跟进本轮反馈,commit 1. 符号别名生成 NaN(review P2)——已修,改为生成前拒绝 反馈属实。 修法:在 证据:
2. Windows unit tests 红——已修 根因是本 PR 自己的两条测试:用 另外说明: 本地验证: dispatch:03ebedd0b69bef62 |
|
已核实本轮 CI 信号,无需代码改动。 触发的是「required context 在当前 head 上缺席: Windows unit tests」——当时 Windows 两个分片还在跑(汇总 check 要等两个分片结束才出现),不是真红灯,本轮没有可修的东西。 现在
dispatch:e068e2a063aacc59 |
解决 docs/design-rules/design-inventory.md 的合并冲突:该文件 GENERATED 区块由生成器维护,冲突行(desktop.settings 行组件计数)取合并树重新生成 ——main 侧 makecindy#4246 新增组件已计入(732 → 733),人工区保留。其余 70 个 文件自动合并无冲突。 Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
跟进本轮 conflict 信号:main 前进导致 PR 冲突,已用 merge 解决,commit 冲突面核实:PR 与 main 的改动交集只有 docs/design-rules/design-inventory.md 一个文件,其余 70 个文件全部自动合并。main 侧对该文件的改动只是 解法:该文件的 GENERATED 区块由 scripts/design-inventory.mjs 维护,冲突行取合并树重新生成(pnpm design:inventory)——settings 行计数为 733,与 main 侧意图一致;人工区原样保留。未用 force-push(merge commit,不改写已有提交)。 验证:
dispatch:e068e2a063aacc59 |
|
已核实本轮 CI 信号,无需代码改动。 信号是「required context 在当前 head 上缺席: Windows unit tests」——触发时(约 23:40)merge commit 现在
PR 保持 mergeable: MERGEABLE(上一轮 merge 解决冲突后无回归)。 dispatch:6b12f6402c9667fc |
这次改了什么
摘要
把 Desktop 已接管的静态设计数值集中到
packages/design-tokens/src的 DTCG 源,由锁定的 Terrazzo 2.7.1 生成到真实消费者。以后改源并生成即可同步颜色、内置主题和通用基础样式;本次保留现有界面数值与运行行为。522/541 个注册项、11 个内置主题覆盖、通用字号/行高/字体/字重、间距、圆角、Input 尺寸、动效、shared 默认字号和窗口背板已接管。旧手写第二来源同批退出,19 个原位保留项及运行期边界逐项见
packages/design-tokens/README.md和desktop-bindings.json。变更类型
refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
88632bdda96d8531aa854114cfc6731df439b45c。UI 变化
docs/design-rules/DESIGN.md§3 排版与缩放、§5 圆角、§10 主题/alias 与双模式、§14.4 动效、§15 保护皮肤、§16.1 登录色;docs/design-rules/design-governance.md§2/§4/§6 单源、兼容和证据合同。附件/DS-8/submit-e2e/;GitHub 图片附件仍待人工上传,不将本地路径冒充公开附件。怎么验证的
自动验证
以上命令全部退出0。
生产生成不读取 fixture;18 输出新鲜度和 LF、独立冻结预期、真实源改动与生成物劣化负例均有保护。库存 49 surface,生成 CSS 进入原 5 个 globals 消费 surface;颜色门禁不扩豁免。Device Link 真实 loopback WebSocket 集成 9/9 通过。
真实 Electron E2E:
submit-e2e/run-e2e.cjs退出 0,5 组场景全过、20 格控件矩阵通过、4 窗口原始 hash/主题/root/body 样式逐项恢复。覆盖当前 Providers/Storage/Tools/Usage、两表单与普通确认、9 类媒体菜单、订阅/价格、图表/滑杆、1600 行真实 Worker Diff、完整复制、Light/Dark/主题覆盖并存、字号放大/compact/状态。之前的 Diff 采证脚本只等待 250ms,本轮等待虚拟列表行高测量并仍断言真实末尾标记,四格均通过;生产 Diff 未改。手工验证
Codex 已自审完整候选 diff,并核对真实测试版 source MATCH / ready;可撤销改风格演练已完成且恢复,交付无演练值。E2E 使用真实客户端生产组件和受控内存样本,未执行真实账号保存/解绑/删除或存储清理。系统剪贴板写入仅在测试中拦截并恢复。
未执行的验证
最终用户/设计师人工验收、真实多账号登录/切换与订阅远端联调、Windows/Linux 实机、原生 IME/200% 缩放/拖窗、字典浮窗与插件独立宿主完整操作仍未测。未单独运行
pnpm test:all或完整 CI 平台矩阵;本地全量 unit 不等于这些验收。交付 commitdbeb18d280b169a1d813460fa7b59e5b430826ac,云端 CI 结果待 PR 运行。旧轮 Opus 隔离树缺原生产物导致的全量失败不计为通过,以本轮完整主工作树结果为准。风险
风险分类
影响与回滚
提交前检查
git commit -s)