# YCode 设计系统提取与组件统一方案(2026-10-18) ## 结论 可以,而且当前代码已经具备做这件事的基础,但**不能直接从现有 CSS 里“提炼一套 token”后全局替换**。 原因是 YCode 现在不是一套设计系统,而是四套来源同时生效: 1. `--yc-*`:YCode 自有的根级语义 token,主要在 `src/renderer/src/styles/tokens.css`。 2. `--wb-*`:从 WorkBuddy 恢复的 token,但**没有全局根定义**,而是按组件作用域分别复制。 3. `--cb-*` / `--cr-*` / `--dc-*` / `--ec-*` / `--wb-kb-*`:会话、能力中心、项目页等恢复模块各自的主题闭包。 4. 少量本地 `.btn` / `.input` / `.dialog` 等旧类名,和恢复 UI 的 `wb-button`、`wb-input`、`wb-modal` 并存。 因此正确的路径不是“抽一套 token 全量替换”,而是: > 冻结恢复层,收敛本地层;把 `--wb-*` 明确降级为“原版兼容层”,把 `--yc-*` 提升为“YCode 自有界面的唯一语义层”;在语义层之上再抽通用组件。 ## 现状证据 ### 规模 统计范围:`src/renderer/src` 下的 `.css` / `.tsx` / `.ts`。 | 指标 | 数值 | | --- | ---: | | CSS 文件 | 109 | | TSX 文件 | 151 | | CSS 总行数 | 19,899 | | CSS 声明 | 63,042 | | 裸 `px` | 16,103 | | 十六进制颜色 | 13,008 | | `!important` | 925 | | `--yc-*` 定义 / 使用 | 246 / 1,372 | | `--wb-*` 定义 / 使用 | 2,129 / 22,756 | | 导出的大写组件名 | 350(其中大量是图标组件) | 构建产物 `out/renderer/assets/*.css` 中: - 规则数 14,082,`!important` 934。 - 声明 `--wb-*` 变量 21,935 次,`--yc-*` 仅 314 次。 - 大多数 `--wb-*` 来自按作用域复制的原版闭包,而不是一个全局主题。 ### 样式分层 | 层 | 文件 | 现状 | | --- | --- | --- | | 核心 token | `src/renderer/src/styles/tokens.css` | `--yc-*` 有完整的颜色、间距、字号、圆角、阴影、布局定义;根级生效 | | 排版 token | `src/renderer/src/workbuddy/typography/tokens.css` | REA 校验过的 `--wb-*` 排版 token,但不含颜色/圆角/控件 token | | 恢复 source | `src/renderer/src/**/source-*.css`、`*-source.css` | 50 个文件、约 2.14 MB,原版规则与局部 token 闭包 | | 恢复 recovered | `src/renderer/src/**/*-recovered.css` | 17 个文件、约 0.68 MB,生成的页面级投影 | | 本地适配 | `**/*-adapter.css`、`**/*-adapters.css` | 7 个文件、约 32 KB | | YCode 自有页面 | `styles/app.css`、`styles/sidebar.css`、`components/*.css`、`library/*.css`、`automations/*.css`、`projects/*.css` | 27 个本地文件、约 0.47 MB | ### 同名 token 在不同子树解析出不同来源 `--wb-palette-brand-8` 至少在这些作用域被分别重新声明: - `src/renderer/src/capabilities/capability-center-source.css:2`(`.yc-capability-center`) - `src/renderer/src/components/model-settings.css:146`(`.models-settings-panel`) - `src/renderer/src/components/source-home-recovered.css:2`(`.source-home`) - `src/renderer/src/components/source-workspace-picker-recovered.css:2`(`.source-workspace-picker`) - `src/renderer/src/workbuddy/conversation/source-styles.css`(`.chat-pane.cr-theme` 及其 dark/light 分支) 这意味着: - 全局根上并没有 `--wb-palette-*` / `--wb-color-*` 的单一权威来源。 - 页面在自己的 subtree 内看起来是对的,但一旦组件被移出原作用域,就会掉色、掉圆角或掉主题。 - 新组件如果引用 `--wb-*`,只能碰运气;引用 `--yc-*` 才有全局保证。 ### 根级 `--yc-*` 已在渲染态生效 对当前构建产物 `out/renderer/index.html` 做了只读渲染抽查: | 变量 | 计算值 | | --- | --- | | `--yc-text-primary` | `rgba(0, 0, 0, 0.9)` | | `--yc-bg-primary` | `#ffffff` | | `--yc-radius-lg` | `8px` | 当前 `scripts/verify-ui.mjs` 的假桥已落后于生产渲染树,缺少 `window.ycode.library`,因此首页/设置只能加载到 token,不能完整挂载页面。这是 P0 需要修的工具问题,不是产品 CSS 问题。 ### 组件重复度 TSX 中的原生控件数量: | 元素 | 数量 | | --- | ---: | | `