From 743c32dcd56c51548a6e1acc0e67ae7d3d93fbca Mon Sep 17 00:00:00 2001 From: kirozeng Date: Mon, 7 Sep 2026 01:13:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?docs(design-system):=20DS-5=20=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=E6=89=A7=E8=A1=8C=E8=B7=AF=E7=BA=BF=E4=B8=8E=E5=8F=8C?= =?UTF-8?q?=E7=AB=AF=E8=AE=BE=E8=AE=A1=E5=90=88=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kirozeng --- docs/design-rules/cindy-design-system.md | 12 ++ docs/design-rules/design-governance.md | 121 +++++++++++++------- docs/design-rules/design-inventory.md | 74 ++++++------ docs/dev-rules/repo-map.md | 1 + packages/design-tokens/README.md | 80 ++++++++++--- scripts/__tests__/design-inventory.test.mjs | 2 +- scripts/shared/design-inventory.mjs | 8 +- 7 files changed, 198 insertions(+), 100 deletions(-) diff --git a/docs/design-rules/cindy-design-system.md b/docs/design-rules/cindy-design-system.md index e18ca62b2a0..0cdf9218f77 100644 --- a/docs/design-rules/cindy-design-system.md +++ b/docs/design-rules/cindy-design-system.md @@ -10,6 +10,7 @@ | [`DESIGN.md`](./DESIGN.md) | 权威视觉规范全文:视觉语言(§1)、颜色(§2)、排版(§3)、组件(§4)、布局(§5)、交互约定与 Motion token(§14)、主题系统与 Token 参考(§10)、CINDY 皮肤族(§15)、登录链路(§16) | **权威正本**(原仓库根文件,根目录 `DESIGN.md` 保留为跳转入口) | | [`design-governance.md`](./design-governance.md) | 设计系统治理合同:管道与记账(§1.1)、四种真相边界、Token 层级与现行 §10 三档的映射、兼容红线、工具单选、两级证据合同、PR 风险分类、治理接线纪律、待裁决登记、存量门禁处置表、实施路线图、已知边界(§13) | **治理正本**(管流程;视觉规则仍以 `DESIGN.md` 为准) | | [`design-inventory.md`](./design-inventory.md) | Cindy Desktop 生产可达 UI 台账:GENERATED 机器事实(稳定 ID / 入口 / 组件 / 样式来源 / Token 与裸值统计)+ 人工迁移状态 | **台账正本**(schema 见 [`design-governance.md`](./design-governance.md) §2.1;生成 `pnpm design:inventory`,校验 `pnpm check:design-inventory`) | +| [Token README](../../packages/design-tokens/README.md) | 当前影子层边界、DS-8 / DS-10 生产接管、双端真实语义样本与平台覆盖唯一来源 | **Token 合同入口**(当前无生产消费者,不是另一份数值表) | | [`figma-component-spec.md`](./figma-component-spec.md) | 登录链路 Figma 组件与色彩速查手册:全组件逐态参数、nodeId 溯源、wave1–wave6 读取记录 | 权威(登录域逐参数) | | [`token-decision-table.md`](./token-decision-table.md) | 登录链路色值 / 尺寸 → token 决策记录(新增 / 复用 / 豁免的判定理由 + 各 wave 增补台账) | 决策记录(现行 token 清单与值以 `DESIGN.md §16.1` + `colors.ts` 为准) | | [`design-decision-log.md`](./design-decision-log.md) | 全局设计决策史台账:被推翻的方案、勘误过程、backlog(已收录原 `DESIGN.md §13` G1–G4 归档与 §15 决策史全量) | 决策台账(只增不改;与 `DESIGN.md` 冲突时以 `DESIGN.md` 为准) | @@ -21,8 +22,19 @@ | [`gamepads/switch-joy-con/`](./gamepads/switch-joy-con/) | 设置页 Joy-Con 交稿包(SVG / PNG / 热区 / 键位表) | 交稿包 | | [`gamepads/ultimate-c1/`](./gamepads/ultimate-c1/) | 设置页 Ultimate C1 / 通用手柄交稿包(SVG / PNG / 热区 / 键位表) | 交稿包 | +## 新贡献者从这里开始 + +1. 先读 [DESIGN.md](./DESIGN.md) 的适用视觉/组件规则,再读 [治理合同](./design-governance.md) §4 兼容、§6 证据、§7/8 风险与门禁;当前顺序及目标验收见 §12。 +2. 在 [inventory](./design-inventory.md) 找实际入口、保护合同与人工下一动作;没认领的 owner 仍是 unassigned,按实际工作认领,不能把共享组件已被引用当成整页迁移完成。 +3. 复用现有 [Button](../../apps/desktop/src/renderer/components/ui/button.tsx)、[Input / Textarea](../../apps/desktop/src/renderer/components/ui/input.tsx);设置旧局部覆盖使用 [SettingsTextInput](../../apps/desktop/src/renderer/components/settings/SettingsTextInput.tsx)。FormField 与 Button loading API **尚未提供**,DS-6 随真实表单需求建立并补使用说明。 +4. 需要改设计值时读 [Token README](../../packages/design-tokens/README.md):当前影子层不被产品消费;双端语义样本与未来生成合同都在该处。Desktop / Mobile 分别在 DS-8 / DS-10 接管;新观感先查治理 §10 待决项,不因数值相同而删除局部主题覆盖。 + +以上仓内入口即可开始贡献;无需访问个人桌面记录。此阅读路径检查不代替 G2 的独立贡献者试用。 + ## 版本记录 +- **2026-09-07(DS-5 路线与双端设计合同)**:治理 §12 将未开始批次对齐为 DS-5—12(9=聊天、10=Mobile),以 G1—G4 分别验收;补 DS-4b / #4010 已合入及其局部兼容边界。Token README 登记当前数值权威、未来接管与两端真实消费样本;inventory 及生成器仅同步下一动作与静态说明,不改变迁移状态、发现能力或产品界面。此前日期记录中的旧编号保留为历史。 + - **2026-09-06(DS-4 旧设置输入主题兼容收口)**:`SettingsTextInput` 复用标准 Input 并保留既有局部主题 alias;AgentResource / Collaboration 的四个数字框走同一封装。通用 Input 的 Tier-1 默认、错误态、焦点环及主题磁盘文件保持原合同。新增真实主题加载到组件消费的回归验证;DS-4 主线回填 #3920。 - **2026-09-04(DS-4 Button 与 Input 标准组件)**:`components/ui/button.tsx` / `input.tsx` 落地;§4 回写高度 / hover 换色 / pressed / 字号字重 / secondary 绑 Tier-1 / ivory 登记债(拍板人 = 用户/设计师,2026-09-03)。影子包新建 component 层。路线图 DS-3 已是 #3798;DS-4 号待本张合入后回填。 同日 self-review 收口三处:hover / pressed 改为从本变体 rest 底色朝前景 color-mix 派生(初版 alias 到 `--surface-hover` 在四个暗色主题里状态不可区分,违反 §10 双模式门槛;字面量 pressed 不跟主题),新增守卫 `themes/__tests__/buttonStateContrast.test.ts` 锁 11 主题每档 ΔRGB ≥ 8;按钮 hover / active 加 `enabled:` 前缀,修禁用态仍会 hover 换色的行为回归;§4 单行输入 focus 环还原为 `--focus-ring-soft`,spec 与实现的偏差改为登记进 [`design-governance.md`](./design-governance.md) §10 待裁决表,不擅自统一。 diff --git a/docs/design-rules/design-governance.md b/docs/design-rules/design-governance.md index e861c42db89..0db59b23366 100644 --- a/docs/design-rules/design-governance.md +++ b/docs/design-rules/design-governance.md @@ -52,16 +52,16 @@ Process gates 要求)仍走 §11 登记的 `hardcoded-color-exemptions.json` | 真相 | 载体 | 负责 | 不负责 | | --- | --- | --- | --- | | 规则真相 | [`DESIGN.md`](./DESIGN.md) | 设计原则、MUST/SHOULD/NEVER、组件使用时机、豁免登记 | 不再人工维护精确数值总表(见 §11 处置表对 `DESIGN.md §10 Tier-1` 表与 `§16.1` 表的过渡安排) | -| 数值真相 | 现阶段:Desktop 颜色 → `apps/desktop/src/renderer/themes/colors.ts`;Desktop 非颜色(字号/行高/动效时长与曲线等)现行仍分散在 `apps/desktop/src/renderer/styles/globals.css`(`--text-*`、`--motion-*`)与 `apps/desktop/tailwind.config.ts`(`fontSize`/`borderRadius` 映射),尚未收拢;Mobile 颜色与非颜色数值统一在 `apps/mobile/src/theme/tokens.ts`。目标阶段:全部收拢进 `packages/design-tokens` 标准 DTCG JSON(见 §3) | 每个 Token 的唯一取值 | 不承载运行时派生值(见 §3.4) | -| 台账真相 | `docs/design-rules/design-inventory.md`(由后续 inventory PR 建立,schema 见 §2.1) | 生产可达 UI 范围、每个 surface 的迁移状态与保护标签 | 不保存截图与历史日志(证据外置,见 §6) | +| 数值真相 | 现阶段:Desktop 颜色默认值 → `apps/desktop/src/renderer/themes/colors.ts`,内置主题显式覆盖 → 同目录 `builtin/*.ts`,用户主题覆盖继续按原加载合同消费;Desktop 非颜色(字号/行高/动效时长与曲线等)现行仍分散在 `apps/desktop/src/renderer/styles/globals.css`(`--text-*`、`--motion-*`)与 `apps/desktop/tailwind.config.ts`(`fontSize`/`borderRadius` 映射),以及 `hooks/useFontSettings.ts` 的字号缩放和组件局部样式,尚未收拢;Mobile 共享颜色与非颜色数值在 `apps/mobile/src/theme/tokens.ts`,局部几何仍有消费者/平台适配中的静态常数。目标阶段:适用静态值在 DS-8(Desktop)/ DS-10(Mobile)收拢进 `packages/design-tokens` 标准 DTCG JSON;平台覆盖同源,保护 singleton 逐项登记,动态计算仍留代码(见 §3) | 每个 Token 的唯一取值 | 不承载运行时派生值(见 §3.4) | +| 台账真相 | `docs/design-rules/design-inventory.md`(DS-2a 已建立,schema 见 §2.1;Mobile 发现待 DS-7) | 生产可达 UI 范围、每个 surface 的迁移状态与保护标签 | 不保存截图与历史日志(证据外置,见 §6) | | 视觉真相 | 真实运行的 Desktop / Mobile 截图 | 视觉验收的唯一依据 | SSR / 静态渲染样张(含 UI 设计哨兵产物)不得充当 | 在 `packages/design-tokens` 建立并完成生产生成切换(路线图 DS-8)**之前**,`colors.ts` 仍是 Desktop **颜色**数值权威——这与 `DESIGN.md §10`「`colors.ts` itself is the only authoritative inventory」的现行表述一致(该句本身也限定在颜色 Token 登记范围内),本合同 -不提前改变它;Desktop 非颜色数值的现行来源见上表。 +不提前改变它;Desktop 非颜色数值的现行来源见上表。当前 Token 包从冻结 fixture 生成影子字典,尚无生产消费者。接管按族登记:DS-8 交付 Desktop 的颜色与非颜色生成消费链,DS-10 才接管 Mobile;未切换族继续沿用原权威,不可提前宣称已统一。完整转换与双端样本合同见 [Token README](../../packages/design-tokens/README.md)。 -### 2.1 台账 schema(约束未来的 inventory PR) +### 2.1 台账 schema(现行生成与人工维护合同) - 单一文件 `docs/design-rules/design-inventory.md`,不建立第二份迁移台账; - 机器事实与人工决策物理分开: @@ -86,7 +86,7 @@ protected 标签、目标道路、下一动作 ### 3.1 目标层级(DTCG) -`packages/design-tokens`(DS-3 已建影子层,零运行时接线;DS-8 才生产生成切换)采用标准 DTCG JSON,三层: +`packages/design-tokens`(DS-3 已建影子层,零运行时接线;DS-8 接管 Desktop,DS-10 接管 Mobile)采用标准 DTCG JSON,三层: ```text reference 原始值:色阶、字号、字重、间距、圆角、动效时长 @@ -97,6 +97,8 @@ component 组件值:button.*、input.* —— 只随消费组件建立,不 语义层描述**角色**而不是色相或当前样式。依赖方向单向:`component → semantic → reference`, 组件层不得反向成为基础 Token 的来源,机器守卫检查该方向。 +生产接管时改为 **DTCG → 同一生成流程 → 各端消费子集**;冻结 fixture 仅作独立回归预期,不能继续反向生成生产真相。Mobile 静态平台覆盖拟落 `src/platforms/mobile/`,单向引用共享用途角色,与共享源一起生成;不再在 Mobile 手写同义值。目标目录和角色尚未建立,具体来源与运行期例外见 [Token README](../../packages/design-tokens/README.md)。 + ### 3.2 与现行体系的映射 `DESIGN.md §10` 现行的三档(Tier-1 semantic slots / Tier-2 aliases / Tier-3 singletons) @@ -167,7 +169,7 @@ Primitive 与 Pattern 默认只绑定 semantic 角色。只有品牌表达、兼 - **为什么改**:本条原文给了「入仓 `docs/design-evidence/` 或 PR artifact」两个选项, DS-4(#3920)是第一张真正跑证据流程的 PR,选了入仓那条,实测代价 = 12 张 PNG / 944KB 永久进 Git 历史。栅格证据的效用是**一次性的**(供设计师 review 时看一眼),而 Git 历史 - 是永久的、每次 clone 都要下;后续 DS-5 / DS-6 / DS-9 三张同为「有意可见」,照此累积 + 是永久的、每次 clone 都要下;按当时编号,后续 DS-5 / DS-6 / DS-9 三张同为「有意可见」,照此累积 将达数 MB 量级。真正需要长期留存的是**数值与结论**,它们是文本、放 `design-evidence` 的 README 与 `design-decision-log.md` 里即可; - **既有入仓证据不追溯删除**(Git 历史重写代价大于收益);本条只约束新增。DS-4(#3920) @@ -227,13 +229,33 @@ ls apps/desktop/src/renderer/themes/builtin/*.ts | wc -l ## 10. 待裁决登记 -| 事项 | 现状 | 裁决人 | 规则 | -| --- | --- | --- | --- | -| PermissionPrompt 圆角 | **已关闭(2026-08-29 裁决,#3619 回写)**:按钮一律胶囊,8px 用于 textarea 与盒内非按钮;该行不决定键盘键帽。 | 设计师 | 原裁决保留;键盘键帽由 2026-09-06 的独立规则覆盖 | -| 键盘快捷键外框圆角 | **已关闭(2026-09-06,#4001)**:所有可见快捷键外框(`` 或承载快捷键的交互按钮)统一使用 4px 外圆角;边框、填充、内边距和文字颜色按所在表面处理。 | 用户 | 已回写 `DESIGN.md §5` 与 `design-decision-log.md`「09-06」条 | -| `radius` 主题覆盖 | 待裁决(随 DS-7 棘轮设计一并关):本地主题 JSON 可覆盖 `colors.radius`(`resolveThemeValue` 优先 `theme.colors[id]`),届时 `rounded-sm`/`rounded-md` 的 computed 值整体平移、不再等于 4px/6px。是否冻结 `radius` 为不可覆盖不变量(涉及 `local-themes-normalize` 白名单 + 既有本地主题兼容红线);裁决前 DS-7 按类名建基线、以默认主题 computed 值为准 | 设计师 | 未关闭前 DS-7 棘轮不得把覆盖了 `radius` 的本地主题报为违规;结论回写 `DESIGN.md` §5 与 decision-log | -| 单行输入 focus 环:spec 与实现不一致 | 待裁决(DS-4 2026-09-04 登记):`DESIGN.md §4` `input/text` 规定 focus 用 `--focus-ring-soft`(50% 蓝),而 `components/ui/input.tsx`(升格自 SettingsTextInput)实到的是 opaque `--focus-ring`——该偏差在收敛 SettingsTextInput 时即存在,理由是与相邻未迁移输入保持一致。DS-4 只登记不擅自统一:改 spec 会追认一个没人裁决过的值,改实现会动 6 个既有消费者的观感 | 设计师 | 未关闭前 `ui/input` 维持 opaque `--focus-ring`,§4 保留 ⚠ 标注;结论回写 `DESIGN.md §4` 并归档 decision-log | -| Permission 迁移余项 | 待裁决:允许/拒绝按钮的视觉主次、危险授权样式、Desktop 与 Mobile 权限弹窗几何是否一致 | 设计师 | 余项未关闭前,Permission 相关文件不得进入任何迁移 PR 的 diff(DS-6 前置);结论同样回写 `DESIGN.md` 并归档 | +事实采样:**2026-09-07,main `36638ff33ca8b28e259b247a47054a696d6c4ee4`**,仅源码核对,未做双端 Light/Dark 实机对照。下表的建议是工程建议,**不是设计批准**。设计决定人均为用户/设计师;DS-5 执行者 Codex 负责此次核对,相应后续批次的工程执行者开工认领准备与实施责任,不杜撰长期 owner。公开双端消费/来源只维护在 [Token README](../../packages/design-tokens/README.md);本节集中记录选择及后果,不另抄数值表。 + +### 已裁决:实施状态另记 + +| 事项 | 正式依据 / 结果 | 实施状态与下一动作 | +| --- | --- | --- | +| Permission 按钮 / 非按钮圆角 | 2026-08-29 用户裁决,#3619 回写:按钮胶囊,textarea 与盒内非按钮 8px;见 `DESIGN.md §5` 与 [decision-log](./design-decision-log.md) 对应日期;不决定外层卡片几何 | **已批准、尚未全部实现**:[PermissionPrompt](../../apps/desktop/src/renderer/components/new-chat/PermissionPrompt.tsx):209/241/267 按钮仍 8px,DS-11 随迁移落实;三项待决未关闭前不借此提前改文件。Mobile Permission 按钮已 pill;外层卡片差异见下表 | +| 快捷键键帽外框 | 2026-09-06 用户裁决 [#4001](https://github.com/makecindy/cindy/pull/4001):所有可见快捷键外框(含承载快捷键的交互按钮)4px;边框/填充/内边距/颜色按所在表面 | 已回写 `DESIGN.md §5` / decision-log;Desktop Permission 本样本键帽已 4px,不重开该决定,不把键帽按普通按钮胶囊改掉 | +| DS-4 基础控件 | `DESIGN.md §4` 与 decision-log 2026-09-04:按钮/输入尺寸、按钮字号字重、hover/pressed、通用 secondary Tier-1、ivory 暂留 | DS-4 已落地;DS-4b 设置封装恢复局部覆盖。暂留 ivory 不等于批准永久统一,完整表单/证据与第二消费者在 DS-6 | + +### 待决:只阻塞对应范围 + +| 问题 / 当前实际行为与依据 | 可选择的可见结果 / 推荐理由(未批准) | 影响、未决定时的保持方式 / 最晚阻塞 | +| --- | --- | --- | +| **Input 焦点环**:`DESIGN.md §4` 规定 soft/50%,[ui/input.tsx](../../apps/desktop/src/renderer/components/ui/input.tsx):85 实际 opaque `--focus-ring`。设置壳另保留 `settings-input-border-focus`;聊天输入的描边是另一用途 | A:焦点环变柔和,按现规范实现;B:保留当前鲜明环并正式修订规范。建议先用真实设置表单比较聚焦与错误态可辨识度,再选 A/B;源码不能替视觉判断 | 所有标准 Input 消费者及旧设置主题受影响。pending 时保持 opaque 和规范中的偏差标注;DS-6 如获决定同批实施,否则保留现状并登记,DS-8 可等值接管但不能写“已统一”;最终 G4 前需结论 | +| **ivory / elevated 长期关系**:[ui/input.tsx](../../apps/desktop/src/renderer/components/ui/input.tsx):39—41 默认 elevated,显式 ivory 走 `settings-input-bg` → `surface-card-ivory`;DS-4 已批准暂留 | A:长期保留可说明用途的 ivory 变体;B:默认统一 elevated,仍尊重用户显式局部覆盖。建议先在白色面板与嵌套卡片比较边界,避免统一后层次消失;不能把暂留当永久决定 | 设置表单、输入卡片与显式主题覆盖。pending 保持已有两变体,DS-6 按实际消费者准备;DS-8 保留等值路径,最终 G1/G4 前明确长期用途 | +| **用户 `colors.radius` 效果**:[theme-service.ts](../../apps/desktop/src/renderer/themes/theme-service.ts):11 优先主题显式值;[Tailwind](../../apps/desktop/tailwind.config.ts):85—87 用 `--radius` 派生 rounded-lg/md/sm;实际 computed 可偏离默认档 | A:保留用户覆盖,并区分默认基线与合法自定义;B:以后让标准控件固定几何,仅在明确兼容方案与用户裁决下讨论。**建议 A**,保留现有用户能力。B 不能通过删字段/白名单绕过旧主题红线,当前未授权 | 自定义圆角主题。pending 保留字段与实际效果;DS-7 棘轮不能把合法覆盖报违规,可按类名与默认主题建基线;DS-8 必须等值保留,不能保留就先关闭该部分决定,不得先切换 | +| **普通确认主次与局部色**:[confirm-dialog.tsx](../../apps/desktop/src/renderer/components/ui/confirm-dialog.tsx):349/391/416 使用独立 `confirm-btn-*`;普通主按钮反相中性,取消/第三按钮轮廓;危险动作已有 destructive 分支。主按钮 DOM 在取消前,`:215` 仅显式 `autoFocusConfirm` 改为主按钮焦点,不能当规范示例已实现 | A:复用标准组件但保留现有确认层级、排列与焦点;B:调整可见主次/排列/默认焦点。建议 A 先建立复用与局部覆盖合同,B 需针对真实危险/普通样本单独明确;不能盲套 CTA | 所有普通确认消费者及 `confirm-bg` / `confirm-shadow` / `confirm-title` / `confirm-desc` 容器与文案,以及 `confirm-btn-*` 按钮的主题覆盖。pending 保持现状;DS-6 迁移前确认所选结果,未明确的可见改动不实施,旧 alias 必须留原作用域 | +| **跨 surface 旧 alias**:DS-4b 仅设置输入;`msg-user-text/msg-assistant-text` 默认同指 `text-primary` 仍允许独立用户覆盖,设置同理。来源:`colors.ts`、theme-service 与 Token README 真实消费者 | A:以语义源供默认值,保留旧局部 ID 及覆盖优先级;B:强制局部跟随全局会改旧用户主题效果,不能在现兼容合同下执行。**建议 A**,按族核对,不能靠默认同值猜意图 | 设置、消息、确认/授权及其它主题用户。pending 原 ID、作用域、加载幂等和磁盘不变;DS-6/8/9/11 分别在相关消费者切换前核对,历史“49 文件”不当实时清单 | +| **Permission 允许/拒绝主次**:[PermissionPrompt](../../apps/desktop/src/renderer/components/new-chat/PermissionPrompt.tsx):209/241 为拒绝/整任务允许轮廓,:267 允许一次实底,CINDY 内置覆盖为反相中性;Mobile [InteractionPanel](../../apps/mobile/src/session/InteractionPanel.tsx):635—672 拒绝/始终允许 secondary、允许一次 primary(cta) | A:保留允许一次为视觉主动作、其它次级;B:降低允许强调或突出拒绝以增强审慎感。建议先比较普通/高风险真实样本;不以 Desktop 默认白底推断所有主题。选项仅指视觉,不改含义/顺序/默认/审批生命周期 | 所有授权用户,两端与主题。pending 原样保留;**DS-11 前必须关闭**,责任为用户/设计师决定,DS-11 执行者准备/落实 | +| **Permission 危险样式**:Desktop PermissionPrompt 没有危险视觉 variant;Mobile [interactionModel](../../apps/mobile/src/session/interactionModel.ts):64—82 判高风险,[InteractionPanel](../../apps/mobile/src/session/InteractionPanel.tsx):611—620 高风险允许要二次点击且不提供始终允许;风险提示为中性色,无 destructive 红 | A:保留中性风险信息与已有确认行为;B:危险授权加清晰的危险色/层级,普通授权保持中性。建议比较风险提示的辨识度再决定 B 的范围,不能因普通 ConfirmDialog 已有 destructive 就认为授权已裁决 | 高风险授权及信息色;pending 保留现有行为与配色,尤其不移除 Mobile 二次点击、不恢复高风险始终允许。**DS-11 前必须关闭**;若要求权限业务变化则退出设计迁移范围另议 | +| **Permission 双端几何**:Desktop PermissionPrompt:165 外卡 12px、按钮仍 8px(按钮已裁决待实施);Mobile InteractionPanel:1769 `radius.container` 卡片、pill 按钮/minHeight 44,另由 [interactionTouchLayout](../../apps/mobile/src/session/interactionTouchLayout.ts):35—58 按屏宽与动作数计算触控布局 | A:共享层级与角色,保留原生触控/窄屏自适应;B:使卡片密度/排列更接近 Desktop,仍保留必要触控区。**建议 A**,避免以像素统一损害触控;已定胶囊与键帽不重投票 | Desktop/Mobile 窄屏、长内容、键盘用户。pending 保留几何,**DS-11 前必须关闭外层与布局决定**;按钮已批准的结果随 DS-11 实施 | +| **Mobile 用途差异**:两条真实链与来源见 Token README;输入/正文排版不同,`radius.micro/control` 不等于 Desktop 档位;M 行内代码有意无底色([MessageRenderer](../../apps/mobile/src/session/MessageRenderer.tsx):7964—7974),输入 focus 字段只作 caret,触控和光学 padding 留平台适配 | A:共享用途与唯一数值上游,保留平台覆盖和已有原生差异;B:另设计更接近 Desktop 的可见效果。**建议 A**,先保证真实消费者等值,B 须真实双端对照并明确独立风险 | iOS/Android 可读性、输入与触控。pending 保留当前平台值/行为;DS-10 可按 A 的等值合同接管,新增外观在实施前须裁决,不能混进零视觉 PR | + +**Permission 三项(主次、危险样式、双端几何)未关闭前,Permission 相关文件不得进入任何迁移 PR 的 diff;前置批次是 DS-11。** 已批准但未实现的圆角不等于三项已关闭;本次只登记,不抢先迁移。其余待决只约束对应改动,不阻止 DS-5 文档交付。正式决定须写适用范围、决定人、依据与实施阶段,回写 `DESIGN.md` 并追加 `design-decision-log.md`,不修改历史记录来伪造批准。 + +DS-4/4b 尚有公开附件交接与完整设置页/部分状态证据缺口,DS-6 补齐并更新既有证据索引;已合入不能自动消除未验收项。影子层复查日仍为 **2026-11-01**,DS-8 负责结束影子阶段,到期按 §7 的真实消费者与维护情况处置,不为赶日期跳过兼容。 ## 11. 存量门禁与文档处置表 @@ -242,49 +264,60 @@ ls apps/desktop/src/renderer/themes/builtin/*.ts | wc -l | 资产 | 现定位 | 去向 | | --- | --- | --- | -| `scripts/hardcoded-color-audit.mjs` + `scripts/hardcoded-color-exemptions.json` | 现行硬编码颜色门禁与豁免 | 棘轮 PR 在其上扩展(新增裸圆角/间距检查、豁免补 owner/理由/复查日期);不另造平行系统 | -| `scripts/check-pr-design-basis.mjs` | UI PR 设计依据校验 | UI 路径定义未来抽成唯一来源供其共读;可见 PR 的证据锚点校验在其上扩展 | +| `scripts/hardcoded-color-audit.mjs` + `scripts/hardcoded-color-exemptions.json` | 现行硬编码颜色门禁与豁免 | DS-7 首批、DS-12 扩大成熟范围,在其上扩展(新增裸圆角/间距检查、豁免补 owner/理由/复查日期);不另造平行系统 | +| `scripts/check-pr-design-basis.mjs` | UI PR 设计依据校验 | DS-7 / DS-12 按成熟范围复用;UI 路径定义抽成唯一来源供其共读,证据锚点校验若确有需要在其上扩展;现有字段检查不代表视觉质量审核 | | `scripts/brand-terminology-guard.mjs` | 品牌术语门禁 | 保持现状,不受本计划影响 | -| `.github/PULL_REQUEST_TEMPLATE.md` | PR 模板(UI 变化 + 设计规范引用字段) | 证据合同生效后由单独 PR 增补证据锚点要求 | -| `apps/mobile/scripts/visual-baseline-check.mjs` + `apps/mobile/e2e/maestro/` | Mobile 视觉基线与流程 | Mobile 扩展 PR 复用并扩展;不建第二套 baseline 工具 | +| `.github/PULL_REQUEST_TEMPLATE.md` | PR 模板(UI 变化 + 设计规范引用字段) | DS-7 / DS-12 若需证据锚点检查,随对应门禁同步模板,不单为记账另拆 PR | +| `apps/mobile/scripts/visual-baseline-check.mjs` + `apps/mobile/e2e/maestro/` | Mobile 视觉基线与流程 | DS-10 Mobile 接管复用并扩展;不建第二套 baseline 工具 | | `docs/design-rules/token-decision-table.md` | 登录改版 token 决策记录(其自身已声明非现行清单) | 维持决策档案定位,非数值真相 | | `docs/design-rules/design-decision-log.md` | 全局设计决策史台账 | 维持只增不改;治理裁决(含 §10 待裁决项)关闭后在此归档 | -| `DESIGN.md §10` Tier-1 slot 表 | 现行 Tier-1 registry(人工维护) | 生产生成切换后由 `packages/design-tokens` 生成的机器摘要替代;此前维持人工维护现状 | +| `DESIGN.md §10` Tier-1 slot 表 | 现行 Tier-1 registry(人工维护) | DS-8 对应族生产接管时由 `packages/design-tokens` 同一流程生成的机器摘要替代;此前维持人工维护现状 | | `DESIGN.md §16.1` 登录 token 表 | 登录域现行 token 清单(人工维护) | 同上 | | UI 设计哨兵(插件仓) | SSR 抽取式扫描工具 | 仅用于发现组件、统计硬编码、定位代码与观察迁移进度;其样张不得充当视觉证据(§2 视觉真相行) | -## 12. 实施路线图(施工期条目,完成后归档) +## 12. 公开实施路线与目标验收 -十张主线 PR(DS-2 的台账与阻断守卫风险类别不同,按 §7 拆为 2a/2b);拆分依据是 §7 的 -风险类别。依赖:1 → 2a → 2b → 3 → 4 → 5/6(可并行)→ 7 → 8 → 9;DS-6 另需 §10 -「Permission 迁移余项」关闭(圆角裁决已于 2026-08-29 关闭,#3619 回写);DS-7 的棘轮 -基线另受 §10「`radius` 主题覆盖」裁决约束;DS-2b、DS-7 升阻断均需 §8 管理员审核。 +本节是开源贡献者可读的路线摘要与实际 PR 链接入口;逐 surface 的事实、owner、迁移状态与下一动作只维护在 [inventory](./design-inventory.md)。项目完整施工安排与过程记录由项目负责人持续维护,不作为贡献者必读依赖;仓内须足以定位规则、当前能力、未决项及下一批工作。不要在本节复制个人施工日志,也不另建逐 surface 台账。 + +**编号就是执行顺序**:已合入编号不改,未来按 DS-5 → DS-6 → DS-7 → DS-8 → DS-9 → DS-10 → DS-11 → DS-12。DS-9 为聊天,DS-10 为 Mobile。Permission 三项待决只阻塞 DS-11 相关迁移;DS-7 受用户 radius 兼容约束;所有门禁升级继续受 §8 管理员审核约束。 ### 系列命名规则 -- **PR / commit 标题**:`(design-system): DS-<序号> <中文短描述>`——scope 固定 - `design-system` 以便检索全系列;`type` 按各张实际性质选取(见下表);序号对应本表, - **不写总数**(拆分时用 `DS-5a` / `DS-5b` 子号,总数会变); -- **分支名**:`ds/<序号>-<英文短语>`,如 `ds/1-governance-contract`; -- **PR 正文第一行**固定为:`设计系统改造系列 DS-,路线图见 - docs/design-rules/design-governance.md §12`; -- 本表的「PR」列是系列进度的唯一台账,每张合入后回填实际 PR 号。 +- **PR / commit 标题**:`(design-system): DS-<序号> <中文短描述>`;type 按实际风险选择,**不写总数**。 +- **分支名**:`ds/<序号>-<英文短语>`。 +- **PR 正文第一行**:`设计系统改造系列 DS-,路线图见 docs/design-rules/design-governance.md §12`。 +- 合入后回填实际链接;工程合入、视觉验收、独立贡献者试用分别记录,不互相代替。 +- 按风险类别、批准前置、独立发布/回退或实际不可清楚验证的边界拆 PR;无固定行数上限。文档、使用说明、证据与台账通常随相关实现交付,不预拆成独立 PR;需要拆分时先调整尚未执行的顺序并说明真实原因,历史编号保留。 -| # | 标题 | 风险类别 | PR | +| # | 内容 / 可交付结果 | 风险类别 | PR / 状态 | | --- | --- | --- | --- | -| DS-1 | `docs(design-system): DS-1 建立治理合同与存量门禁处置表` | 零视觉(纯文档) | ✅ #3609(2026-08-30 合入) | -| DS-2a | `test(design-system): DS-2a 生产 UI 台账` | 零视觉 | ✅ #3648(2026-08-31 合入) | -| DS-2b | `ci(design-system): DS-2b 主题兼容冻结守卫`(新增阻断需 §8 管理员审核) | CI 门禁 | ✅ #3700(2026-09-02 合入) | -| DS-3 | `feat(design-system): DS-3 最小语义 Token 影子层` | 零视觉 | ✅ #3798(2026-09-03 合入) | -| DS-4 | `feat(design-system): DS-4 Button 与 Input 标准组件`(落入既有 `components/ui/`) | 有意可见 | ✅ [3920](https://github.com/makecindy/cindy/pull/3920)(2026-09-04 合入) | -| DS-5 | `refactor(design-system): DS-5 AI 对话区 Pattern 迁移`(Tool Call / Reasoning / Message / Attachment) | 有意可见 | — | -| DS-6 | `refactor(design-system): DS-6 Permission Pattern 迁移`(裁决关闭后) | 有意可见 | — | -| DS-7 | `ci(design-system): DS-7 新增裸设计值棘轮` | CI 门禁 | — | -| DS-8 | `refactor(design-system): DS-8 Terrazzo 生产生成切换` | 零视觉(大型基建) | — | -| DS-9 | `feat(design-system): DS-9 Mobile 扩展` | 有意可见 | — | - -本节随施工推进更新完成状态;十张全部合入后,本节归档进 -[`design-decision-log.md`](./design-decision-log.md),本文其余章节转入长期生效。 +| DS-1 | 建立治理合同与存量门禁处置表 | 零视觉(纯文档) | [#3609](https://github.com/makecindy/cindy/pull/3609),2026-08-30 合入 | +| DS-2a | 生产 UI 台账 | 零视觉 | [#3648](https://github.com/makecindy/cindy/pull/3648),2026-08-31 合入 | +| DS-2b | 主题兼容冻结守卫 | CI 门禁 | [#3700](https://github.com/makecindy/cindy/pull/3700),2026-09-02 合入 | +| DS-3 | 最小语义 Token 影子层 | 零视觉 | [#3798](https://github.com/makecindy/cindy/pull/3798),2026-09-03 合入 | +| DS-4 | Button 与 Input 标准组件(既有 `components/ui/`) | 有意可见 | [#3920](https://github.com/makecindy/cindy/pull/3920),2026-09-04 合入;完整表单 / 公开附件缺口由 DS-6 补齐 | +| DS-4b | 设置输入旧主题局部覆盖兼容收口 | 零视觉兼容修复 | [#4010](https://github.com/makecindy/cindy/pull/4010),2026-09-06 合入;只覆盖设置封装,未完成全仓 alias 收口 | +| DS-5 | 对齐执行路线、数值权威、双端语义与待决合同;仅文档及必要台账静态说明 | 零视觉 | 本批,PR 待创建 | +| DS-6 | 完整设置表单、第二消费者与普通确认复用;按真实需求补 FormField / loading,附使用说明、真实状态证据与独立贡献者首轮试用 | 有意可见 | 待 DS-5;FormField / loading 当前不存在;G2 未到场可待验收,不能冒称通过 | +| DS-7 | 复用守卫,成熟写法先报告/反例/历史回放后阻断;增量发现 Mobile 入口;未成熟范围继续报告 | CI 门禁 | 待 DS-6;§8 审核,用户 radius 合法覆盖不误报 | +| DS-8 | Desktop 颜色与排版、间距、圆角/尺寸、动效的 DTCG → 生成 → 生产消费链;旧主题与动态/保护边界逐族验证,结束影子阶段 | 零视觉接管 | 待 DS-7;有新观感须独立归类,不能混入等值接管 | +| DS-9 | 工具、推理、消息、代码、附件的完整聊天呈现;按台账核验 Orca、定时任务、文件、Bots、主布局、登录、浮层、宿主插件 UI、辅助/原生入口的继承与残余去向 | 有意可见 | 待 DS-8;不依赖 Mobile,Permission 仍隔离;延期须有理由、负责人和复查日期 | +| DS-10 | Mobile 接入同一数值源,保留平台静态覆盖与运行期适配,分别验证 iOS/Android | 零视觉接管 | 在 DS-9 后交付,数值接管依赖 DS-8;以实际 fingerprint 判断冷更(§4),新视觉单独归类 | +| DS-11 | Desktop / Mobile 授权确认呈现,按已关闭的三项设计决定实施,权限含义、默认、顺序与审批生命周期保持 | 有意可见 | 待 DS-10 且 §10 Permission 三项关闭;关闭前相关文件不得进入迁移 diff | +| DS-12 | 扩大成熟范围门禁,生成漂移/新入口/合法主题正反例、接线与 required 核对,补维护使用方法并交接 | CI 门禁 | 待 DS-11;§8 审核;复用现有守卫与证据入口 | + +### 完成条件:分别验收 G1—G4 + +不以 PR 数、Token 数、迁移百分比或固定张数合完判断成功。DS-12 后在既有证据索引与本节记录以下结果;验收和回填本身不预造另一张 PR,发现真实修复再按其风险安排。 + +| 目标 | 必须拿出的结果 | 当前结论 | +| --- | --- | --- | +| G1:整体改风格更集中 | 可撤销演练从共享源调整颜色、排版、间距、圆角/尺寸与动效代表项,作用于真实设置、聊天、Mobile;记录仍需逐页补丁处,每项静态值只有一个可编辑上游;显式主题覆盖保留 | 待 DS-8 / DS-10 生产接管与最终演练 | +| G2:非设计师可以独立做对 | 未参与改造的贡献者仅凭仓内文档和组件完成真实小界面,记录额外指导、手写样式、遗漏状态,修复后复试;Agent 自测不代替独立试用 | DS-6 首轮,最终复试,待验收 | +| G3:新贡献不会持续退化 | 有标准替代道路的范围能准确报违规文件、行号与改法;合法写法、键帽例外、用户主题不误报;历史回放与管理员审核后分段阻断 | DS-7 首批、DS-12 扩大,待验收 | +| G4:兼容与双端成立 | 保留旧主题文件、ID 与实际消费效果;两模式实现,双端同一语义源且保留平台差异;代表页面有真实运行证据,未验证项明示 | DS-4b 已补局部兼容;DS-6 / DS-8—11 继续验证,整体待验收 | + +最终遗留范围须有负责人、保留理由与复查日期;高频界面持续依赖逐页补丁、旧主题失效、无人接管的例外会阻止相关目标通过。G1—G4 分别填通过/未通过/待验证,经设计负责人验收、维护者接手后再归档施工内容,长期合同继续有效。 ## 13. 已知边界(如实登记,不夸大机器能力) diff --git a/docs/design-rules/design-inventory.md b/docs/design-rules/design-inventory.md index d1d9976c325..1a5ccdab993 100644 --- a/docs/design-rules/design-inventory.md +++ b/docs/design-rules/design-inventory.md @@ -32,7 +32,7 @@ | `desktop.overlay.confirm` | desktop | 确认弹窗 | ConfirmDialogProvider 及插件确认宿主 | ConfirmDialogProvider, ForgeOidcInstallConfirmHost, GhostConfirmDialogHost, PluginPublisherConfirmHost | apps/desktop/src/renderer/cindy-brain/ForgeOidcInstallConfirmHost.tsx, apps/desktop/src/renderer/cindy-brain/GhostConfirmDialogHost.tsx, apps/desktop/src/renderer/components/ui/confirm-dialog-provider.tsx, apps/desktop/src/renderer/components/ui/confirm-dialog.tsx, apps/desktop/src/renderer/features/plugin/PluginPublisherConfirmHost.tsx | 21 | 0 | 6 | | `desktop.overlay.find-in-page` | desktop | 页内查找条 | App → FindInPageBar | FindInPageBar | apps/desktop/src/renderer/components/find-in-page/FindInPageBar.tsx, apps/desktop/src/renderer/components/find-in-page/findInPageOwnership.ts | 2 | 0 | 4 | | `desktop.overlay.interaction-portal` | desktop | 交互提问卡片 | components/interaction-portal(AskUser / 权限类卡片出口) | InteractionPromptCardShell, InteractionPromptHost | apps/desktop/src/renderer/components/interaction-portal/InteractionPromptCardShell.tsx, apps/desktop/src/renderer/components/interaction-portal/InteractionPromptHost.tsx, apps/desktop/src/renderer/components/interaction-portal/InteractionPromptSlot.tsx, apps/desktop/src/renderer/components/interaction-portal/index.ts, apps/desktop/src/renderer/components/interaction-portal/store.ts | 10 | 0 | 4 | -| `desktop.overlay.permission-prompt` | desktop | 权限询问 | PermissionPrompt(会话内权限卡;DS-6 迁移前置) | AskUserQuestionPrompt, PermissionPrompt, PermissionSelector | apps/desktop/src/renderer/components/new-chat/AskUserQuestionPrompt.tsx, apps/desktop/src/renderer/components/new-chat/PermissionPrompt.tsx, apps/desktop/src/renderer/components/new-chat/PermissionSelector.tsx | 51 | 4 | 27 | +| `desktop.overlay.permission-prompt` | desktop | 权限询问 | PermissionPrompt(会话内权限卡;DS-11 迁移前置) | AskUserQuestionPrompt, PermissionPrompt, PermissionSelector | apps/desktop/src/renderer/components/new-chat/AskUserQuestionPrompt.tsx, apps/desktop/src/renderer/components/new-chat/PermissionPrompt.tsx, apps/desktop/src/renderer/components/new-chat/PermissionSelector.tsx | 51 | 4 | 27 | | `desktop.overlay.route-error` | desktop | 路由错误页 | router errorElement → RouteErrorFallback / TopLevelErrorBoundary | AppCrashScreen, RouteErrorFallback, TopLevelErrorBoundary | apps/desktop/src/renderer/components/error/AppCrashScreen.tsx, apps/desktop/src/renderer/components/error/LocalDbFatalScreen.tsx, apps/desktop/src/renderer/components/error/RouteErrorFallback.tsx, apps/desktop/src/renderer/components/error/TopLevelErrorBoundary.tsx, apps/desktop/src/renderer/components/error/localDbFatalView.ts | 11 | 0 | 6 | | `desktop.overlay.splash` | desktop | 启动遮罩 | App → SplashScreen;同源 gating 下并挂 LoginBrandStage(z-9980 品牌画布,启动期即可见、Splash(z-9999) 之下) | LoginBrandStage, SplashScreen | apps/desktop/src/renderer/components/login/LoginBrandStage.tsx, apps/desktop/src/renderer/components/splash/SplashScreen.tsx | 3 | 0 | 5 | | `desktop.overlay.toast` | desktop | Toast | App 常驻 ToastContainer(用户可见出口,不展开业务逻辑) | Toast, ToastContainer | apps/desktop/src/renderer/components/ui/toast/Toast.tsx, apps/desktop/src/renderer/components/ui/toast/ToastContainer.tsx, apps/desktop/src/renderer/components/ui/toast/index.ts | 7 | 4 | 3 | @@ -104,7 +104,7 @@ 生成器不得改本表。首轮(DS-2a):全部 `legacy`;暂无归属写 `unassigned`。`protected` 与迁移状态正交。 -Mobile 本轮不展开顶层 screen,**待 DS-9 增量**。 +Mobile 尚未展开顶层 screen,**待 DS-7 增量发现**;数值接管在 DS-10。 另册 / 排除(不进必做迁移清单): @@ -115,38 +115,38 @@ Mobile 本轮不展开顶层 screen,**待 DS-9 增量**。 | ID | owner | 迁移状态 | protected | 目标道路 | 下一动作 | | --- | --- | --- | --- | --- | --- | -| `desktop.auth.add-account` | unassigned | legacy | DESIGN.md §16 登录链路 | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.auth.legacy-migration` | unassigned | legacy | DESIGN.md §16 登录链路(消费 --login-callback-* 品牌豁免族 component token) | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.auth.login` | unassigned | legacy | DESIGN.md §16 登录链路 | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.bots` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.chat.files` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.chat.new-draft` | unassigned | legacy | DESIGN.md §15.15 创建页内容位 | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.chat.orca-workflow` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.chat.scheduled` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.chat.session` | unassigned | legacy | DESIGN.md §10 语义豁免色族消费者(status / diff / 消息卡);DESIGN.md §5 2px status micro-cells | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.dev.maker-experimental` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.issues.guide` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.native.app-menu` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.native.system-notification` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.native.tray` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.overlay.confirm` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.overlay.find-in-page` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.overlay.interaction-portal` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.overlay.permission-prompt` | unassigned | legacy | DESIGN.md §5 裸文字按钮豁免(相关);DS-6 Permission 迁移前置 | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.overlay.route-error` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.overlay.splash` | unassigned | legacy | DESIGN.md §16 登录链路 | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.overlay.toast` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.plugins.app-main` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.plugins.installed` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.settings` | unassigned | pilot | DESIGN.md §10 语义豁免色族消费者;外部主题导入保护 token(资源用量类别色在独立窗) | DS-4 Button / Input 已在 ProvidersSection 与设置输入落地;既有 SettingsTextInput 和四个数字框经同一标准组件的局部兼容封装消费,通用 Input 保持 Tier-1 | DS-4 兼容收口:旧 SettingsTextInput 与四个数字框经设置封装保留原局部主题覆盖,通用 Input 保持 Tier-1 默认;既有 alias 与 slot 并存时按作用域生效,不能仅为统一而删除用户局部配色。DS-5 的跨 surface alias 收敛仍需先明确兼容策略(历史范围见 decision-log 09-04,不沿用旧计数作当前清单);ivory/elevated 与 focus 环维持待裁决;confirm-dialog 按钮族另批迁移 | -| `desktop.shell.main-layout` | unassigned | legacy | DESIGN.md §15 CINDY 皮肤族(侧栏 vibrancy / 选中 pill);外部主题导入保护 token | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.skillhub.local` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.skillhub.market` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.computer-permission-guide` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.ghost-panel` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.resource-usage` | unassigned | legacy | 外部主题导入保护 token(进程类别色) | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.review-artifact-confirm` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.session-drag-preview` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.sidebar` | unassigned | legacy | DESIGN.md §15 CINDY 皮肤族 | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.voice-dictionary-toast` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | -| `desktop.window.voice-overlay` | unassigned | legacy | — | 待 DS-4 标准组件落地后按 Pattern 迁 | 保持现状;发现问题记下一动作,本张不修视觉 | +| `desktop.auth.add-account` | unassigned | legacy | DESIGN.md §16 登录链路 | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.auth.legacy-migration` | unassigned | legacy | DESIGN.md §16 登录链路(消费 --login-callback-* 品牌豁免族 component token) | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.auth.login` | unassigned | legacy | DESIGN.md §16 登录链路 | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.bots` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.chat.files` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.chat.new-draft` | unassigned | legacy | DESIGN.md §15.15 创建页内容位 | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.chat.orca-workflow` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.chat.scheduled` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.chat.session` | unassigned | legacy | DESIGN.md §10 语义豁免色族消费者(status / diff / 消息卡);DESIGN.md §5 2px status micro-cells | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 完整工具/推理/消息/代码/附件迁移,验证流式、长文与旧 msg 局部覆盖;保留现有保护族 | +| `desktop.dev.maker-experimental` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.issues.guide` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.native.app-menu` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对原生出口与平台限制;保留项登记理由、实际负责人及复查日期,不凭共享依赖记迁移完成 | +| `desktop.native.system-notification` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对原生出口与平台限制;保留项登记理由、实际负责人及复查日期,不凭共享依赖记迁移完成 | +| `desktop.native.tray` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对原生出口与平台限制;保留项登记理由、实际负责人及复查日期,不凭共享依赖记迁移完成 | +| `desktop.overlay.confirm` | unassigned | legacy | — | DS-6 普通确认与标准按钮复用 | 先核治理 §10 的普通/危险主次及 confirm-* / confirm-btn-* 局部覆盖合同,再随真实消费者实施与验证 | +| `desktop.overlay.find-in-page` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.overlay.interaction-portal` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.overlay.permission-prompt` | unassigned | legacy | DESIGN.md §5 裸文字按钮豁免(相关);DS-11 Permission 迁移前置 | DS-11 授权确认呈现(治理 §10 三项设计前置) | 余项关闭前相关文件不得进入迁移 diff;继承已裁决圆角与键帽规则,按 DS-11 补实施,权限行为不变 | +| `desktop.overlay.route-error` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.overlay.splash` | unassigned | legacy | DESIGN.md §16 登录链路 | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.overlay.toast` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.plugins.app-main` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.plugins.installed` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.settings` | unassigned | pilot | DESIGN.md §10 语义豁免色族消费者;外部主题导入保护 token(资源用量类别色在独立窗) | DS-4 / DS-4b 的 Button / Input 与 SettingsTextInput 局部兼容壳已落地;DS-6 完整表单和第二消费者,DS-8 数值同源 | DS-6 补全状态、说明与公开附件;focus、ivory/elevated 见治理 §10。旧 alias 与 slot 按作用域生效,禁止仅因同值删除局部配色;DS-6/8/9/11 按实际消费者分批核对跨 surface alias,confirm-dialog 归 DS-6 | +| `desktop.shell.main-layout` | unassigned | legacy | DESIGN.md §15 CINDY 皮肤族(侧栏 vibrancy / 选中 pill);外部主题导入保护 token | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.skillhub.local` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.skillhub.market` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.computer-permission-guide` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.ghost-panel` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.resource-usage` | unassigned | legacy | 外部主题导入保护 token(进程类别色) | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.review-artifact-confirm` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.session-drag-preview` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.sidebar` | unassigned | legacy | DESIGN.md §15 CINDY 皮肤族 | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.voice-dictionary-toast` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | +| `desktop.window.voice-overlay` | unassigned | legacy | — | DS-8 提供适用数值;DS-9 按入口核对标准组件与呈现继承 | DS-9 核对实际消费者、局部 alias 与跨入口影响;保留现有保护合同,残余项登记理由、实际负责人及复查日期 | diff --git a/docs/dev-rules/repo-map.md b/docs/dev-rules/repo-map.md index b413cf7d6f5..9f19ceeea53 100644 --- a/docs/dev-rules/repo-map.md +++ b/docs/dev-rules/repo-map.md @@ -35,6 +35,7 @@ | 包 | 一句话用途 | 主要使用方 | |---|---|---| | `maker-core` | Cindy 核心:agent 抽象(BaseAgent)、session 编排与事件流,零 Electron 依赖;改动前必读 [`maker-core-and-agent-behavior.md`](maker-core-and-agent-behavior.md) | desktop、lizi-mcps、orca-workflow | +| [`design-tokens`](../../packages/design-tokens/README.md) | DTCG reference / semantic / 薄 component 影子字典;当前与冻结快照一致,未来设计值生成合同见 README | 当前影子层,无生产消费者;后续按设计治理路线 DS-8(Desktop)/ DS-10(Mobile)接管 | | `maker-shared` | 桌面与手机共享的展示层契约模型,零 React/Electron/Expo 依赖 | desktop + mobile | | `maker-cc-manager` | cc-remote:跑在远程 SSH 机器上的 NDJSON RPC 守护进程,封装 Claude Agent SDK,向本地桌面暴露多会话/detach-reattach 能力 | desktop(remote-ssh) | | `maker-pi-manager` | pi-remote:跑在远程 SSH 机器上的 PI 单例 daemon(TS NDJSON RPC + unix socket bridge),持有 pi 会话、条件 restart、空闲回收 | desktop(remote-ssh) | diff --git a/packages/design-tokens/README.md b/packages/design-tokens/README.md index cf9feda68fc..448163c33be 100644 --- a/packages/design-tokens/README.md +++ b/packages/design-tokens/README.md @@ -2,19 +2,19 @@ Cindy 设计 token 的 **DTCG 影子层**(reference → semantic → component)。 -本包只是字典,**零运行时接线**:Desktop / Mobile / 任何产品 package 都不得依赖它。生产生成切换在路线图 **DS-8**;在那之前,Desktop 颜色数值权威仍是 `apps/desktop/src/renderer/themes/colors.ts`,本包的取值必须与 DS-2b 冻结快照逐值一致。 +本包只是字典,**零运行时接线**:Desktop / Mobile / 任何产品 package 都不得依赖它。Desktop 生产生成切换在路线图 **DS-8**,Mobile 在 **DS-10**;切换前各端仍从原生产源取值,本包的当前色值必须与 DS-2b 冻结快照逐值一致。标准组件已经存在不代表本包已被生产消费。 ## 弃坑条款 治理合同 §7:影子包在约定复查期内没有真实消费者时应删除。 - **复查日期:2026-11-01** -- DS-4 已开工:component 层随 Button 消费建立。零运行时接线红线仍到 DS-8。 +- DS-4 / [#3920](https://github.com/makecindy/cindy/pull/3920) 已合入,薄 component 层随 Button 建立;DS-4b / [#4010](https://github.com/makecindy/cindy/pull/4010) 已合入,仅恢复设置输入局部主题覆盖,不代表全仓 alias 已收口。零运行时接线红线仍到 DS-8。 - 届时若仍无生产生成切换且无人维护,按治理合同 §7 评估是否删除 -## 数据源 +## 当前数据源 -分类与建层的唯一数据源是 DS-2b 冻结快照: +影子字典分类与建层的唯一数据源是 DS-2b 冻结快照: `apps/desktop/src/renderer/themes/__tests__/fixtures/desktop-color-defaults.json` @@ -40,19 +40,71 @@ DS-8 接线时无法生成 CSS 变量;裸 triplet 字符串也会被解析成 语义豁免色(DESIGN.md §10 theme-invariant 族:`destructive` / `error-*` / `warning-*` / `focus-ring*`)与 protected 不同:**照常 semantic 建模**,但在 `classification.json` 携带 `exemption` 元数据(外部主题不可覆盖、跨主题恒定)。DS-8 生成主题入口时据此区分可覆写 semantic 与必须保留原值的豁免族;治理合同 §3.2 要求 Tier-3 豁免色按此迁移。DESIGN.md §10 豁免表其余未建模项(`diff-*` / `login-error-fg` 等)进 shadow 层时再登记。 -## 多入口投放合同(只写合同,DS-8 才接线) +## 生产接管合同(目标,尚未接线) -每个消费者届时只消费自己的子集,由同一份 DTCG 生成,不得再手写第二份数值: +当前生产数值权威与影子字典须分开理解: -| 消费者 | DS-8 起消费什么 | -| --- | --- | -| Desktop ColorRegistry | semantic + 后续 component;`registerColor` 的 id / 默认 light/dark 由生成物提供 | -| CSS Variables(`:root` / `theme-vars`) | 同一套 semantic id 的 kebab-case CSS 变量 | -| Tailwind 映射 | 现有 `tailwind.config.ts` 色名继续指向上述 CSS 变量,不另造色板 | -| Mobile TS Token | `apps/mobile/src/theme/tokens.ts` 改为引用生成子集;须另立高风险 PR(冷更边界) | -| DESIGN.md 机器摘要 | §10 Tier-1 表与 §16.1 登录表由本包生成摘要替换人工维护 | +| 范围 | 当前上游 | 接管边界 | +| --- | --- | --- | +| Desktop 颜色 | [colors.ts](../../apps/desktop/src/renderer/themes/colors.ts) 默认注册 + [builtin](../../apps/desktop/src/renderer/themes/builtin/) 内置主题覆盖;用户主题按 [theme-service.ts](../../apps/desktop/src/renderer/themes/theme-service.ts) 优先读取本地显式值 | DS-8 逐族接管默认值与需要集中维护的内置静态覆盖,保留旧 ID、默认 alias 与局部覆盖作用域;不覆盖用户主题或回写磁盘 | +| Desktop 非颜色 | [globals.css](../../apps/desktop/src/renderer/styles/globals.css)、[tailwind.config.ts](../../apps/desktop/tailwind.config.ts)、[useFontSettings.ts](../../apps/desktop/src/renderer/hooks/useFontSettings.ts) 及实际组件局部样式 | DS-8 将真实需要的排版、间距、圆角/尺寸、动效静态值纳入现有三层;字号缩放、compact、color-mix 等运行期计算留代码 | +| Mobile 颜色 / 非颜色 | [tokens.ts](../../apps/mobile/src/theme/tokens.ts),[ThemeProvider.tsx](../../apps/mobile/src/theme/ThemeProvider.tsx) 选模式;局部布局与平台字体/计算仍在消费者和适配文件 | DS-10 从同一 DTCG 生成共享语义 + Mobile 静态覆盖;`tokens.ts` 只留现有 API / 适配,不手写另一份同义数值 | +| 影子字典 | DS-2b `desktop-color-defaults.json` fixture → `src/generate.ts` → 当前三层 JSON | DS-8 接管族改为 DTCG 上游,fixture 退为独立回归预期,禁止继续从测试快照反向生成生产真相 | + +转换须在同一批的真实消费链完成:逐族记录旧源、DTCG 唯一可编辑源、输出、消费者和未切换项。已接管族的旧手写源改为适配/生成消费;未切换族继续保留原权威,保护 singleton 必须逐项说明保留原因,不宣称已全量集中。 + +- 当前零接线守卫继续运行,本批不删改。DS-8 按实际接管范围,将对应的“不得消费”断言转换为生成新鲜度、逐值/逐主题一致、真实加载至组件消费和旧 ID/局部覆盖/加载幂等/磁盘不变断言;未接管范围仍禁止提前接线。DS-10 同样只转换 Mobile 对应边界,不能一次删除所有零接线保护。 +- Terrazzo 继续锁 **2.7.1**,到 DS-8 有生产输出时才安装;同一 DTCG 解析/生成流程,不并装第二套 Token 工具。 +- 生成文件不可手改;DESIGN 中精确值摘要也由同一流程更新明确标记的区域,规则说明仍人工维护。下表仅说明落点,当前未新建这些目录。 + +| 消费者 | 拟定输出 / 职责 | 阶段 | +| --- | --- | --- | +| Desktop ColorRegistry | `apps/desktop/src/renderer/themes/generated/` 提供默认/内置静态数据,原注册与主题加载 API 保留;内置覆盖源拟放本包 `src/themes/` | DS-8 | +| CSS 非颜色变量 | `apps/desktop/src/renderer/styles/generated/tokens.css`;颜色仍由主题加载器注入,避免两处手写 | DS-8 | +| Tailwind / 字号缩放 | `styles/generated/token-mappings.ts` 提供数值子集;现有 Tailwind 色名继续映射主题 CSS 变量 | DS-8 | +| Mobile TS | `apps/mobile/src/theme/generated/tokens.ts`;本包 `src/platforms/mobile/` 维护必要静态平台覆盖,单向引用共享用途角色,不强加包依赖 | DS-10 | +| DESIGN 机器摘要 | §10 Tier-1 与 §16.1 登录表、需要展示的非颜色摘要由同一流程生成 | DS-8 对应族接管时 | + +Mobile 是否触发冷更,以实际 runtime fingerprint 输入变化为准,**不能仅因使用 TS 生成子集就宣称必然冷更,也不能预先宣称一定没有冷更**。若改变指纹,按 [Mobile 冷更边界](../../docs/dev-rules/mobile-development.md) 和治理 §4 单列高风险改动,经指定把关人针对冷更明确确认后才能合并。 + +## 双端语义样本(源码核对,角色拟定) + +采样:**2026-09-07,main `36638ff33ca8b28e259b247a47054a696d6c4ee4`**。本节是用途与消费链合同,不是精确值维护表;源码数值仍以上述现行上游为准。未启动 Desktop / iOS / Android,Light/Dark 实机均未验证;不将源码核对算作视觉验收。 + +生产链已穿透: + +- **D 输入**:[CCAgentSessionView:5101](../../apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx#L5101) → [ChatInput](../../apps/desktop/src/renderer/components/new-chat/ChatInput.tsx) → [SendButton:45](../../apps/desktop/src/renderer/components/new-chat/SendButton.tsx#L45)。 +- **M 输入**:[会话页:10443](../../apps/mobile/app/sessions/[sessionId].tsx#L10443) → [MobileComposerInputRow:318](../../apps/mobile/src/session/MobileComposerInputRow.tsx#L318) → [ComposerRichInput](../../apps/mobile/src/session/ComposerRichInput.tsx) → [composerRichInputHtml](../../apps/mobile/src/session/composerRichInputHtml.ts)。该页传 `inputElement`,实际走 WebView;InputRow 原生 TextInput 是 fallback。发送仍在会话页 `renderComposerSendSlot`(:6813)。 +- **D 正文**:[CCAgentSessionView:4391](../../apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx#L4391) → [MessageStream:5912](../../apps/desktop/src/renderer/components/chat/MessageStream.tsx#L5912) → [UserMessage:1546](../../apps/desktop/src/renderer/components/chat/UserMessage.tsx#L1546) / [AssistantMessage:323](../../apps/desktop/src/renderer/components/chat/AssistantMessage.tsx#L323)。助手正文继续进入 [MarkdownRenderer](../../apps/desktop/src/renderer/components/chat/MarkdownRenderer.tsx);用户正文为 `renderContent` 的文字/链接/引用/chip,不走该 Markdown 样式。 +- **M 正文**:[会话页:9076](../../apps/mobile/app/sessions/[sessionId].tsx#L9076) → [MessageRenderer:4823](../../apps/mobile/src/session/MessageRenderer.tsx#L4823),正文样式由该组件生成(:7698),页面另传外围样式。流式与完成态均走原生 Markdown;iOS 可选文字走 UITextView,其他情况走 RN Text(:499—547),不是 `selectableMarkdownHtml`。 + +下表 D 颜色上游统一指 `colors.ts` + 内置/用户覆盖,D 非颜色指 globals / Tailwind / 字号缩放及列出的局部代码;M 颜色指 `tokens.ts` palettes → ThemeProvider,M 非颜色指 tokens 与列出的平台适配。**共享候选仅表示用途可复用,不表示两端值等价**。`composer.*` / `message.*` 均为拟定 component 角色,`typography.*` 为拟定 semantic 角色;本批不创建 JSON、不替换已存在 ID。 + +| 用途 / 拟定角色 ID | Desktop 当前消费者 / 引用 | Mobile 当前消费者 / 引用 | 分类、理由与实施落点 | +| --- | --- | --- | --- | +| 输入文字 `composer.text` | ChatInput:2144—2145 → `chat-input-text`;colors:839 是独立默认,非 `text-primary` alias | 会话页:10490 → `colors.textPrimary` → HTML:93/59 的 `--text` | 共享用途候选,默认不等价;D 保留局部 ID,M 保留平台值;DS-8/10 分别生成,不能统一配色 | +| 占位 `composer.placeholder` | globals:397 / ChatInput:8451 → `chat-input-placeholder-subtle`;colors:835 从 `chat-input-placeholder`(默认 `text-placeholder`)color-mix 派生 | 会话页:10489 → `textTertiary` → HTML:68/95;原生 fallback 才用 `placeholderTextColor` | 共享用途 + D 运行期透明度派生;只将基础静态角色入源,混合逻辑留代码,DS-8/10 | +| 输入背景 `composer.surface` | ChatInput:8116/8163 → `chat-input-bg`,默认 `surface-elevated` | InputRow:542 → `chatCodeSurface`;WebView 背景透明 | 共享用途 + 平台覆盖;M `theme.background` 虽传入但 HTML 未消费,不能当生产证据;DS-8/10 保留现状 | +| 输入外边框 `composer.border` | ChatInput:8117/8164 → `chat-input-border`,默认 `border-default` | InputRow:543—545 → `sheetActionBorder` + 原生 hairline | 共享用途 + 静态平台色 / 运行期像素适配;HTML `theme.border=colors.border` 只画 chip 边框;DS-8/10 不混淆作用域 | +| 焦点描边 `composer.focusBorder` / 光标 `composer.caret` | ChatInput:8119/8166 → `chat-input-border-focus`(默认 `text-tertiary`,CINDY 有透明度覆盖);globals:127/414 → `caret-accent` | 会话页:10488 → `inputCaret` → HTML:59/98 caret-color;outline:none;原生 fallback 用 cursorColor/selectionColor | 光标用途共享,焦点边框保留平台差异;M 字段名 focus 不代表 focus ring。聊天描边也不是通用 Input 环;DS-8/10 等值保留,新增焦点观感须裁决 | +| 输入排版 `typography.composer` | ChatInput:2144 → `text-15 leading-[1.467]`;globals `--text-15` 与 compact 派生 | HTML:59—66 → [composerTextMetrics](../../apps/mobile/src/session/composerTextMetrics.ts):21—26 的 `typeScale.code` / `lineHeight.body` | 共享用途,平台排版/缩放保留;输入并非 M 正文 bodyLarge。DS-8/10 将静态基础纳源,缩放/compact 留代码 | +| 输入尺寸/间距 `composer.geometry` | ChatInput:8115 卡片圆角与 padding、输入高度在组件内 | InputRow:544 单行 pill、:558—559 multiline 专用圆角、:566—569 card `radius.control`;composerTextMetrics:45—55 的平台上下 padding | 平台静态覆盖 + 展开/屏幕/光学运行期计算;D/M 不强制同几何。DS-8/10 纳入被选静态值;动态规则保留,新增外观待裁决 | +| 发送可用 `composer.send.surface` / `.text` / `.hover` / `.pressed` | SendButton:55—57 → `send-btn-bg/icon/hover-bg/pressed-bg`;colors:1011 起 | 会话页:11646/6838 → `cta/ctaText`;:6826/11663 `sendButtonPressed` 由 RouteActionButton:10850—10852 在按下时叠 opacity 0.86;发送中 indicator 独立读 `textSecondary` | 共享动作用途,M 无对应 hover,pressed 通过透明度表达;保留旧局部覆盖,DS-8/10 | +| 发送禁用 `composer.send.disabledSurface` / `.disabledText` / `.disabledOpacity` | SendButton:59 在 `disabled && !isStreaming` 时仍读可用色,加 opacity-40;**不消费**注册的 `send-btn-disabled-bg/icon` | 会话页:11656/6838 读 `surfaceChip/border/textSecondary`,通用禁用样式:11664 再叠 opacity 0.45 | 共享状态用途,派生方式不等价;静态透明度候选与状态条件分开,DS-8/10 保留真实效果,不按 registry 猜接线 | +| 发送触控 `composer.send.geometry` | SendButton:54 会话 h-7/w-7,新建入口另有 30px;pill | 会话页:11646—11654 为 34×34 / `radius.pill`;:6823 引用 :639 的 `COMPOSER_CONTROL_HIT_SLOP` 扩点击区,仍受 InputRow 父布局边界限制 | 平台几何覆盖;DS-10 按触控与无障碍保持 M 命中区域,不能套用 D 图标按钮尺寸;不以相同圆形推断同尺寸 | +| 用户 / 助手正文 `message.user.text` / `message.assistant.text` | UserMessage:1551 → `msg-user-text`,AssistantMessage:324 → `msg-assistant-text`;colors:1255/1259 默认都 alias `text-primary` | MessageRenderer:7698 → `colors.textPrimary`(用户/助手共用正文样式) | 共享正文用途,D 两个局部覆盖必须各自保留,不能抬升为全局或删除;DS-8 接源、DS-9 核真实消费、DS-10 接 M | +| 正文排版 `typography.messageBody` | UserMessage:1550 / AssistantMessage:323 → `text-15 leading-[1.6]`,受用户字号和 compact(globals:330)影响 | MessageRenderer:7698 → `typeScale.bodyLarge/lineHeight.bodyLarge`(当前 17/26) | 共享用途 + 平台静态覆盖与缩放;用途一致不等于像素一致,DS-8/10 等值接管,DS-9 验证 D 长文与流式 | +| 行内代码 `message.inlineCode.text` / `.surface` / `typography.inlineCode` | 仅助手 MarkdownRenderer:285/1785 → 继承正文颜色,`msg-md-inline-code-bg`、`font-mono text-14`、局部圆角;上游 colors:1301 / Tailwind fontFamily | MessageRenderer:7964—7974 → `chatInlineCodeText`、`typeScale.code/lineHeight.code`、[monoFont](../../apps/mobile/src/theme/monoFont.ts),有意无底色 | 用途共享、外观/字体平台覆盖;M 原生嵌套 Text 圆角限制已有代码说明。DS-9 保留 D 局部色、DS-10 保留 M 无底色;改观感须先裁决,字体平台选择仍在代码 | + +### 平台覆盖的唯一来源与责任 + +上述每个需保持 Mobile 静态差异的候选角色,拟在同一 DTCG 的 `src/platforms/mobile/` 下以 `platform.mobile.<上述角色 ID>` 登记覆盖关系(例如 `platform.mobile.typography.messageBody`、`platform.mobile.composer.border`),单向引用共享用途角色,再生成 Mobile 子集;共享角色不反向依赖平台层。现有 DTCG key 风格/旧 ID 不改名,新角色最终命名与类型随 DS-8/10 建模核对。这些 **候选 ID 尚不存在**,表中当前代码是采样依据,不是第二份未来可编辑源。 + +DS-10 至少逐项登记:输入/正文/行内代码排版、输入框/发送几何与触控、输入背景/外边框/光标、可用与禁用发送色和透明度;各项记录引用的共享角色、覆盖理由、唯一源与输出。行内代码无底色、无独立焦点描边、鼠标态无对应原生态等“没有该效果”的平台行为留代码登记,不能为了填满 Token 表制造数值。`radius.micro/control` 的用途不能机械对应 Desktop 三档。 + +静态与动态须分开:composerTextMetrics:30/36 的基础 padding/offset、触控尺寸与断点等静态常数是平台覆盖候选,DS-10 纳入唯一上游;:45—55 的平台选择、加减计算,以及屏宽/展开状态的分支留代码,不能以“平台适配”为由永久手写第二份静态值。主题切换通过 ComposerRichInput:128—145/175—177 的 `setConfig` → HTML:92—98 更新 CSS 变量,不重建初始 HTML。 -本张不产出任何被产品消费的生成物。 +运行期适配仍留代码:主题选择/注入、color-mix、字号缩放/compact、iOS/Android 字体选择与输入光学 padding、hairline、展开与屏幕触控布局。工程责任由相应 DS-8/10 执行者在开工时认领,视觉决定由用户/设计师作出;本次核对人为 DS-5 执行者 Codex,未据此认领长期 surface owner。未决与最晚阻塞阶段集中见 [治理 §10](../../docs/design-rules/design-governance.md#10-待裁决登记),保留平台差异即可推进等值接管,新增外观不得静默批准。 ## 分类登记 diff --git a/scripts/__tests__/design-inventory.test.mjs b/scripts/__tests__/design-inventory.test.mjs index e5cd8aff9bd..30023050b0e 100644 --- a/scripts/__tests__/design-inventory.test.mjs +++ b/scripts/__tests__/design-inventory.test.mjs @@ -1094,7 +1094,7 @@ test('defaultHumanSeed: 全量 legacy + unassigned,protected 与迁移状态正 assert.equal(seed.includes('unassigned'), true); assert.equal(seed.includes('| legacy |'), true); assert.equal(seed.includes('| pilot |'), false); - assert.equal(seed.includes('待 DS-9 增量'), true); + assert.equal(seed.includes('待 DS-7 增量发现'), true); assert.equal(seed.includes('cindy-updater/ui'), true); assert.equal(seed.includes('DESIGN.md §16 登录链路'), true); assert.equal(seed.includes('DESIGN.md §15 CINDY 皮肤族'), true); diff --git a/scripts/shared/design-inventory.mjs b/scripts/shared/design-inventory.mjs index d7064bca328..31f30a7c0b8 100644 --- a/scripts/shared/design-inventory.mjs +++ b/scripts/shared/design-inventory.mjs @@ -891,7 +891,7 @@ export function catalogSurfaces() { id: 'desktop.overlay.permission-prompt', platform: 'desktop', title: '权限询问', - productionEntry: 'PermissionPrompt(会话内权限卡;DS-6 迁移前置)', + productionEntry: 'PermissionPrompt(会话内权限卡;DS-11 迁移前置)', reachableComponents: ['PermissionPrompt', 'PermissionSelector', 'AskUserQuestionPrompt'], styleRoots: [ 'apps/desktop/src/renderer/components/new-chat/PermissionPrompt.tsx', @@ -1205,7 +1205,7 @@ export function defaultHumanSeed(surfaces) { '', '生成器不得改本表。首轮(DS-2a):全部 `legacy`;暂无归属写 `unassigned`。`protected` 与迁移状态正交。', '', - 'Mobile 本轮不展开顶层 screen,**待 DS-9 增量**。', + 'Mobile 尚未展开顶层 screen,**待 DS-7 增量发现**;数值接管在 DS-10。', '', '另册 / 排除(不进必做迁移清单):', '', @@ -1247,7 +1247,7 @@ const PROTECTED_TAGS = { 'desktop.chat.new-draft': ['DESIGN.md §15.15 创建页内容位'], 'desktop.overlay.permission-prompt': [ 'DESIGN.md §5 裸文字按钮豁免(相关)', - 'DS-6 Permission 迁移前置', + 'DS-11 Permission 迁移前置', ], 'desktop.settings': [ 'DESIGN.md §10 语义豁免色族消费者', @@ -1261,7 +1261,7 @@ export function defaultHumanAnnotation(id) { owner: 'unassigned', status: 'legacy', protected: (PROTECTED_TAGS[id] ?? []).join(';') || '—', - target: '待 DS-4 标准组件落地后按 Pattern 迁', + target: '查现有标准组件与治理 §12 当前路线;按人工下一动作接管', next: '保持现状;发现问题记下一动作,本张不修视觉', }; } From 6e386a3555afc1028db9720412ca2053053f0cd6 Mon Sep 17 00:00:00 2001 From: kirozeng Date: Mon, 7 Sep 2026 10:01:49 +0800 Subject: [PATCH 2/2] fix-run ds5-anchor wave1 squash group g1 tip c2d89fd0cf4c90ab38fa63dd39b3fd50c3eba3de Signed-off-by: kirozeng --- docs/design-rules/design-governance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design-rules/design-governance.md b/docs/design-rules/design-governance.md index 0db59b23366..123aa38a425 100644 --- a/docs/design-rules/design-governance.md +++ b/docs/design-rules/design-governance.md @@ -246,7 +246,7 @@ ls apps/desktop/src/renderer/themes/builtin/*.ts | wc -l | **Input 焦点环**:`DESIGN.md §4` 规定 soft/50%,[ui/input.tsx](../../apps/desktop/src/renderer/components/ui/input.tsx):85 实际 opaque `--focus-ring`。设置壳另保留 `settings-input-border-focus`;聊天输入的描边是另一用途 | A:焦点环变柔和,按现规范实现;B:保留当前鲜明环并正式修订规范。建议先用真实设置表单比较聚焦与错误态可辨识度,再选 A/B;源码不能替视觉判断 | 所有标准 Input 消费者及旧设置主题受影响。pending 时保持 opaque 和规范中的偏差标注;DS-6 如获决定同批实施,否则保留现状并登记,DS-8 可等值接管但不能写“已统一”;最终 G4 前需结论 | | **ivory / elevated 长期关系**:[ui/input.tsx](../../apps/desktop/src/renderer/components/ui/input.tsx):39—41 默认 elevated,显式 ivory 走 `settings-input-bg` → `surface-card-ivory`;DS-4 已批准暂留 | A:长期保留可说明用途的 ivory 变体;B:默认统一 elevated,仍尊重用户显式局部覆盖。建议先在白色面板与嵌套卡片比较边界,避免统一后层次消失;不能把暂留当永久决定 | 设置表单、输入卡片与显式主题覆盖。pending 保持已有两变体,DS-6 按实际消费者准备;DS-8 保留等值路径,最终 G1/G4 前明确长期用途 | | **用户 `colors.radius` 效果**:[theme-service.ts](../../apps/desktop/src/renderer/themes/theme-service.ts):11 优先主题显式值;[Tailwind](../../apps/desktop/tailwind.config.ts):85—87 用 `--radius` 派生 rounded-lg/md/sm;实际 computed 可偏离默认档 | A:保留用户覆盖,并区分默认基线与合法自定义;B:以后让标准控件固定几何,仅在明确兼容方案与用户裁决下讨论。**建议 A**,保留现有用户能力。B 不能通过删字段/白名单绕过旧主题红线,当前未授权 | 自定义圆角主题。pending 保留字段与实际效果;DS-7 棘轮不能把合法覆盖报违规,可按类名与默认主题建基线;DS-8 必须等值保留,不能保留就先关闭该部分决定,不得先切换 | -| **普通确认主次与局部色**:[confirm-dialog.tsx](../../apps/desktop/src/renderer/components/ui/confirm-dialog.tsx):349/391/416 使用独立 `confirm-btn-*`;普通主按钮反相中性,取消/第三按钮轮廓;危险动作已有 destructive 分支。主按钮 DOM 在取消前,`:215` 仅显式 `autoFocusConfirm` 改为主按钮焦点,不能当规范示例已实现 | A:复用标准组件但保留现有确认层级、排列与焦点;B:调整可见主次/排列/默认焦点。建议 A 先建立复用与局部覆盖合同,B 需针对真实危险/普通样本单独明确;不能盲套 CTA | 所有普通确认消费者及 `confirm-bg` / `confirm-shadow` / `confirm-title` / `confirm-desc` 容器与文案,以及 `confirm-btn-*` 按钮的主题覆盖。pending 保持现状;DS-6 迁移前确认所选结果,未明确的可见改动不实施,旧 alias 必须留原作用域 | +| **普通确认主次与局部色**:[confirm-dialog.tsx](../../apps/desktop/src/renderer/components/ui/confirm-dialog.tsx):323/360/379 使用独立 `confirm-btn-*`;普通主按钮反相中性,取消/第三按钮轮廓;危险动作已有 destructive 分支。主按钮 DOM 在取消前,`:215` 仅显式 `autoFocusConfirm` 改为主按钮焦点,不能当规范示例已实现 | A:复用标准组件但保留现有确认层级、排列与焦点;B:调整可见主次/排列/默认焦点。建议 A 先建立复用与局部覆盖合同,B 需针对真实危险/普通样本单独明确;不能盲套 CTA | 所有普通确认消费者及 `confirm-bg` / `confirm-shadow` / `confirm-title` / `confirm-desc` 容器与文案,以及 `confirm-btn-*` 按钮的主题覆盖。pending 保持现状;DS-6 迁移前确认所选结果,未明确的可见改动不实施,旧 alias 必须留原作用域 | | **跨 surface 旧 alias**:DS-4b 仅设置输入;`msg-user-text/msg-assistant-text` 默认同指 `text-primary` 仍允许独立用户覆盖,设置同理。来源:`colors.ts`、theme-service 与 Token README 真实消费者 | A:以语义源供默认值,保留旧局部 ID 及覆盖优先级;B:强制局部跟随全局会改旧用户主题效果,不能在现兼容合同下执行。**建议 A**,按族核对,不能靠默认同值猜意图 | 设置、消息、确认/授权及其它主题用户。pending 原 ID、作用域、加载幂等和磁盘不变;DS-6/8/9/11 分别在相关消费者切换前核对,历史“49 文件”不当实时清单 | | **Permission 允许/拒绝主次**:[PermissionPrompt](../../apps/desktop/src/renderer/components/new-chat/PermissionPrompt.tsx):209/241 为拒绝/整任务允许轮廓,:267 允许一次实底,CINDY 内置覆盖为反相中性;Mobile [InteractionPanel](../../apps/mobile/src/session/InteractionPanel.tsx):635—672 拒绝/始终允许 secondary、允许一次 primary(cta) | A:保留允许一次为视觉主动作、其它次级;B:降低允许强调或突出拒绝以增强审慎感。建议先比较普通/高风险真实样本;不以 Desktop 默认白底推断所有主题。选项仅指视觉,不改含义/顺序/默认/审批生命周期 | 所有授权用户,两端与主题。pending 原样保留;**DS-11 前必须关闭**,责任为用户/设计师决定,DS-11 执行者准备/落实 | | **Permission 危险样式**:Desktop PermissionPrompt 没有危险视觉 variant;Mobile [interactionModel](../../apps/mobile/src/session/interactionModel.ts):64—82 判高风险,[InteractionPanel](../../apps/mobile/src/session/InteractionPanel.tsx):611—620 高风险允许要二次点击且不提供始终允许;风险提示为中性色,无 destructive 红 | A:保留中性风险信息与已有确认行为;B:危险授权加清晰的危险色/层级,普通授权保持中性。建议比较风险提示的辨识度再决定 B 的范围,不能因普通 ConfirmDialog 已有 destructive 就认为授权已裁决 | 高风险授权及信息色;pending 保留现有行为与配色,尤其不移除 Mobile 二次点击、不恢复高风险始终允许。**DS-11 前必须关闭**;若要求权限业务变化则退出设计迁移范围另议 |