|
| 1 | +# PC 端样式精修 Phase 3 · 设计文档 |
| 2 | + |
| 3 | +> **版本:** 1.0 |
| 4 | +> **日期:** 2026-05-15 |
| 5 | +> **状态:** Draft(待评审) |
| 6 | +> **作者:** Codex |
| 7 | +
|
| 8 | +--- |
| 9 | + |
| 10 | +## 0. 文档说明 |
| 11 | + |
| 12 | +### 0.1 目标 |
| 13 | + |
| 14 | +在 phase 1 / phase 2 已完成桌面主壳、settings header、editor / diff review scenes 的基础上,再做一轮面向 PC 端的细部精修,重点处理仍然明显的样式割裂点,并把尚未闭环的桌面规范补完整。 |
| 15 | + |
| 16 | +本轮只做桌面端视觉与审图能力增强,不调整核心业务逻辑,不重做主题体系,也不改移动端主路径。 |
| 17 | + |
| 18 | +### 0.2 本轮范围 |
| 19 | + |
| 20 | +本轮聚焦四个互相关联但可以局部收敛的方向: |
| 21 | + |
| 22 | +- `workspace` 左侧 `file tree` |
| 23 | +- `workspace` 左侧 `git panel` |
| 24 | +- desktop `command palette` |
| 25 | +- 全局 desktop chrome 与 review scenes |
| 26 | + |
| 27 | +这四项共同决定了用户在桌面主工作流里对“是否像一套产品”的第一感受,因此优先级高于继续扩展次要页面。 |
| 28 | + |
| 29 | +### 0.3 现有基础 |
| 30 | + |
| 31 | +当前代码已经具备可直接精修的前提: |
| 32 | + |
| 33 | +- `packages/web/src/features/workspace/views/shared/file-tree-panel.tsx` |
| 34 | + - 结构已稳定,具备搜索、空态、树节点、创建/删除弹层,不需要先拆组件。 |
| 35 | +- `packages/web/src/features/workspace/views/shared/git-panel.tsx` |
| 36 | + - 已具备提交区、worktree 区、变更分组、history 区,问题主要是密度和视觉节奏,不是信息架构缺失。 |
| 37 | +- `packages/web/src/features/command-palette/components/command-palette.tsx` |
| 38 | + - desktop / mobile 已分流,desktop 现在更像基础弹层,还没有完全进入桌面产品语言。 |
| 39 | +- `packages/web/src/ui-preview/scenes/desktop-review-scenes.tsx` |
| 40 | + - 已有 topbar / sidebar / terminal / settings / editor / diff / overlay / statusbar review scene,可继续扩展审图矩阵。 |
| 41 | + |
| 42 | +换句话说,本轮适合做“收边”和“统一语言”,不适合做大规模重构。 |
| 43 | + |
| 44 | +--- |
| 45 | + |
| 46 | +## 1. 问题定义 |
| 47 | + |
| 48 | +### 1.1 File Tree 的割裂点 |
| 49 | + |
| 50 | +`file tree` 当前能用,但桌面感不够完整,主要表现为: |
| 51 | + |
| 52 | +- 搜索区、树节点区、空态区的密度关系偏散 |
| 53 | +- 行高、缩进、hover、selected 态之间缺少统一节奏 |
| 54 | +- 文件/目录层级主要靠缩进和图标区分,缺少更稳定的 active / hover / muted 语义 |
| 55 | +- 与 phase 1 已经收紧过的 workspace shell 相比,panel 内部仍偏“局部组件样式” |
| 56 | + |
| 57 | +### 1.2 Git Panel 的割裂点 |
| 58 | + |
| 59 | +`git panel` 是当前桌面端最复杂的侧边栏之一,但其视觉语言还不够统一: |
| 60 | + |
| 61 | +- commit 区、worktree 区、changes 区、history 区像四块并排功能,而不是同一块 panel 内的连续层级 |
| 62 | +- section header、count、row action、status tone 的强弱关系不稳定 |
| 63 | +- 文件变化列表和 diff/editor chrome 的关系开始收敛,但 git panel 自身密度仍偏旧 |
| 64 | +- 空态、错误态、工作树状态与变更列表没有形成一致的“辅助信息层” |
| 65 | + |
| 66 | +### 1.3 Command Palette 的割裂点 |
| 67 | + |
| 68 | +desktop `command palette` 现在具备功能完整性,但视觉上更接近基础 modal: |
| 69 | + |
| 70 | +- overlay、header、search、hint、result list 的层级过于平均 |
| 71 | +- 宽度、输入区高度、结果项留白与快捷键标签缺少桌面产品的“工具面板感” |
| 72 | +- 与 workspace 顶部 chrome、settings desktop header 相比,还没有形成同一套桌面工具语言 |
| 73 | + |
| 74 | +### 1.4 Desktop Chrome 仍有不一致 |
| 75 | + |
| 76 | +phase 1 / phase 2 已经补齐了不少 surface 语义,但以下问题还在: |
| 77 | + |
| 78 | +- topbar / sidebar / main stage / statusbar / overlay 的圆角、边框、阴影强度还存在局部差异 |
| 79 | +- 某些容器仍然混用 `bg-surface`、`bg-panel`、`bg-elevated`,导致 light theme 下对比不够稳定 |
| 80 | +- 审图 coverage 已覆盖主要壳层,但对“高密度 panel 内部状态”的回归保护仍偏弱 |
| 81 | + |
| 82 | +--- |
| 83 | + |
| 84 | +## 2. 设计目标与非目标 |
| 85 | + |
| 86 | +### 2.1 设计目标 |
| 87 | + |
| 88 | +- 让 `file tree`、`git panel`、`command palette` 进入统一的 desktop panel 语言 |
| 89 | +- 补齐 panel 内部的间距、hover、selected、meta、empty state 规范 |
| 90 | +- 把全局 desktop chrome 中最明显的 surface / border / radius 裂缝收紧 |
| 91 | +- 为后续样式回归新增更有针对性的 desktop review scenes |
| 92 | + |
| 93 | +### 2.2 非目标 |
| 94 | + |
| 95 | +- 不改变 `file tree`、`git panel`、`command palette` 的业务能力与交互流程 |
| 96 | +- 不重做 workspace 布局结构,不改 panel 宽高逻辑 |
| 97 | +- 不新增主题 family,也不改移动端样式方向 |
| 98 | +- 不在本轮拆分 `components.css` |
| 99 | + |
| 100 | +--- |
| 101 | + |
| 102 | +## 3. 方案选择 |
| 103 | + |
| 104 | +### 3.1 方案 A:只做 CSS 收边 |
| 105 | + |
| 106 | +只改 `components.css` 和少量 theme 测试,不增 preview scenes。 |
| 107 | + |
| 108 | +优点: |
| 109 | + |
| 110 | +- 实施快 |
| 111 | +- 风险低 |
| 112 | + |
| 113 | +缺点: |
| 114 | + |
| 115 | +- 很难长期防止回归 |
| 116 | +- 对 `command palette`、`git panel` 这类复杂面板,只改样式容易遗漏状态覆盖面 |
| 117 | + |
| 118 | +### 3.2 方案 B:CSS 精修 + review scenes 补齐 |
| 119 | + |
| 120 | +在局部 CSS 精修基础上,补桌面审图场景和对应测试。 |
| 121 | + |
| 122 | +优点: |
| 123 | + |
| 124 | +- 既解决当前观感问题,又补后续回归护栏 |
| 125 | +- 可以把“桌面端规范”从口头标准变成稳定产物 |
| 126 | + |
| 127 | +缺点: |
| 128 | + |
| 129 | +- 改动面比纯 CSS 收边略大 |
| 130 | +- 需要同步维护 metadata / catalog / capture |
| 131 | + |
| 132 | +### 3.3 方案 C:顺带做 panel 组件抽象 |
| 133 | + |
| 134 | +把三类 panel 的 header / body / empty state 再抽一层共享组件。 |
| 135 | + |
| 136 | +优点: |
| 137 | + |
| 138 | +- 长期潜力更大 |
| 139 | + |
| 140 | +缺点: |
| 141 | + |
| 142 | +- 本轮会从精修演变成结构重构 |
| 143 | +- 风险与验证成本明显上升 |
| 144 | + |
| 145 | +### 3.4 结论 |
| 146 | + |
| 147 | +本轮采用 **方案 B**。 |
| 148 | + |
| 149 | +原因: |
| 150 | + |
| 151 | +- 当前最缺的是“桌面语言统一 + 审图护栏”,不是新的抽象层。 |
| 152 | +- `file tree` / `git panel` / `command palette` 的结构已经可用,局部精修收益高。 |
| 153 | +- 先通过 review scenes 把问题显性化,后续如果仍有重复结构,再决定是否抽象共享 panel chrome。 |
| 154 | + |
| 155 | +--- |
| 156 | + |
| 157 | +## 4. 详细设计 |
| 158 | + |
| 159 | +### 4.1 File Tree 精修 |
| 160 | + |
| 161 | +涉及文件: |
| 162 | + |
| 163 | +- `packages/web/src/features/workspace/views/shared/file-tree-panel.tsx` |
| 164 | +- `packages/web/src/features/workspace/views/shared/file-tree-panel.test.tsx` |
| 165 | +- `packages/web/src/styles/components.css` |
| 166 | + |
| 167 | +设计要点: |
| 168 | + |
| 169 | +- 搜索区作为 panel 顶部固定起始面,强化与树内容区的分层关系 |
| 170 | +- 收紧 desktop 节点行高、左右 padding、图标列宽和层级缩进 |
| 171 | +- 明确区分 `hover`、`selected`、`muted meta`、`empty/loading` 的视觉语义 |
| 172 | +- 让空态、搜索无结果态和普通节点列表共享同一套 panel 内部留白基线 |
| 173 | + |
| 174 | +约束: |
| 175 | + |
| 176 | +- 不改变现有树结构、搜索逻辑、create/delete 行为 |
| 177 | +- 不引入新的节点交互 |
| 178 | + |
| 179 | +### 4.2 Git Panel 精修 |
| 180 | + |
| 181 | +涉及文件: |
| 182 | + |
| 183 | +- `packages/web/src/features/workspace/views/shared/git-panel.tsx` |
| 184 | +- `packages/web/src/features/workspace/views/shared/git-panel.test.tsx` |
| 185 | +- `packages/web/src/styles/components.css` |
| 186 | + |
| 187 | +设计要点: |
| 188 | + |
| 189 | +- commit block 与 section block 统一成更明确的 desktop panel 节奏 |
| 190 | +- 调整 section header、count、action link、change row 的信息权重 |
| 191 | +- 收紧 status badge、row action、history row、worktree row 的密度 |
| 192 | +- 强化 active diff row 与普通 hover row 的区别,避免只靠轻微底色变化 |
| 193 | +- 让空态/错误态保留存在感,但退回辅助层,不抢 commit 与 change list 的注意力 |
| 194 | + |
| 195 | +约束: |
| 196 | + |
| 197 | +- 不改 git action 行为,不动 `useGitPanelActions` |
| 198 | +- 不增加新的 git 操作入口 |
| 199 | + |
| 200 | +### 4.3 Command Palette 精修 |
| 201 | + |
| 202 | +涉及文件: |
| 203 | + |
| 204 | +- `packages/web/src/features/command-palette/components/command-palette.tsx` |
| 205 | +- `packages/web/src/features/command-palette/components/command-palette.test.tsx` |
| 206 | +- `packages/web/src/styles/components.css` |
| 207 | +- `packages/web/src/styles/components.theme.test.ts` |
| 208 | + |
| 209 | +设计要点: |
| 210 | + |
| 211 | +- desktop palette 进一步向“桌面工具面板”靠拢,而不是通用弹窗 |
| 212 | +- 调整 overlay 氛围、palette 宽度、header 间距、search 区高度和结果项密度 |
| 213 | +- 强化结果项 active / hover / keyboard selection 的可辨识度 |
| 214 | +- 统一 shortcut chip、meta 文案、empty state 与 desktop shell 语气 |
| 215 | + |
| 216 | +约束: |
| 217 | + |
| 218 | +- 不改变 keyboard navigation、command 过滤与 workspace launch 流程 |
| 219 | +- mobile sheet 只做必要兼容,不作为本轮重点 |
| 220 | + |
| 221 | +### 4.4 Desktop Chrome 收边 |
| 222 | + |
| 223 | +涉及文件: |
| 224 | + |
| 225 | +- `packages/web/src/styles/components.css` |
| 226 | +- `packages/web/src/styles/base.theme.test.ts` |
| 227 | +- `packages/web/src/styles/components.theme.test.ts` |
| 228 | + |
| 229 | +设计要点: |
| 230 | + |
| 231 | +- 统一 topbar、sidebar panel、statusbar、overlay card 的 border / radius / shadow 语义 |
| 232 | +- 减少 desktop 容器在 `bg-surface`、`bg-panel`、`bg-elevated` 之间的随意漂移 |
| 233 | +- 仅在必要处补 desktop-specific token 或语义类,避免增加新的主题分叉 |
| 234 | + |
| 235 | +约束: |
| 236 | + |
| 237 | +- 不改 token 体系的大方向 |
| 238 | +- 不重写 phase 1 / phase 2 已通过的结构规则 |
| 239 | + |
| 240 | +### 4.5 Review Scenes 补齐 |
| 241 | + |
| 242 | +涉及文件: |
| 243 | + |
| 244 | +- `packages/web/src/ui-preview/scenes/desktop-review-scenes.tsx` |
| 245 | +- `packages/web/src/ui-preview/scene-metadata.ts` |
| 246 | +- `packages/web/src/ui-preview/scene-metadata.test.ts` |
| 247 | +- `packages/web/src/ui-preview/catalog.test.tsx` |
| 248 | + |
| 249 | +优先策略: |
| 250 | + |
| 251 | +- 优先强化已有 scene,而不是为了命名整洁新造一组近义 id |
| 252 | +- 只有当现有 scene 无法承载目标状态时,才新增 dedicated desktop review scene |
| 253 | + |
| 254 | +本轮优先覆盖: |
| 255 | + |
| 256 | +- 已有 `workspace-sidebar-files-review` |
| 257 | + - 聚焦搜索区、深层目录、selected row、empty/search state |
| 258 | +- 已有 `workspace-sidebar-git-review` |
| 259 | + - 聚焦 commit block、worktree 区、changes/history 区、active diff row |
| 260 | +- 已有 `command-palette` |
| 261 | + - 聚焦 desktop palette header、search、selected item、shortcut chips、empty state |
| 262 | +- 如现有 scene 仍不足以承载高密度 workspace 状态,再新增 `workspace-split-density-review` |
| 263 | + |
| 264 | +要求: |
| 265 | + |
| 266 | +- scene 必须使用静态、可预测的 seed 数据 |
| 267 | +- capture selector 必须稳定,避免把外层无关区域带入截图 |
| 268 | +- catalog 测试需要验证关键 chrome 是否真实渲染,不只校验 scene id 存在 |
| 269 | + |
| 270 | +--- |
| 271 | + |
| 272 | +## 5. 验证策略 |
| 273 | + |
| 274 | +### 5.1 单元与主题测试 |
| 275 | + |
| 276 | +最小验证集合: |
| 277 | + |
| 278 | +- `src/features/workspace/views/shared/file-tree-panel.test.tsx` |
| 279 | +- `src/features/workspace/views/shared/git-panel.test.tsx` |
| 280 | +- `src/features/command-palette/components/command-palette.test.tsx` |
| 281 | +- `src/styles/base.theme.test.ts` |
| 282 | +- `src/styles/components.theme.test.ts` |
| 283 | +- `src/ui-preview/scene-metadata.test.ts` |
| 284 | +- `src/ui-preview/catalog.test.tsx` |
| 285 | + |
| 286 | +关注点: |
| 287 | + |
| 288 | +- desktop 专属 class / chrome 是否存在 |
| 289 | +- 主题测试能否覆盖新增 desktop panel 规则 |
| 290 | +- review scenes 是否被正确注册并渲染关键节点 |
| 291 | + |
| 292 | +### 5.2 定向 desktop capture |
| 293 | + |
| 294 | +需要补跑 desktop 定向 capture,至少覆盖: |
| 295 | + |
| 296 | +- `workspace-sidebar-files-review` |
| 297 | +- `workspace-sidebar-git-review` |
| 298 | +- `command-palette` |
| 299 | +- 新增的 desktop review scenes |
| 300 | +- `workspace-topbar-review` |
| 301 | +- `desktop-overlay-review` |
| 302 | +- `desktop-statusbar-review` |
| 303 | + |
| 304 | +验收标准: |
| 305 | + |
| 306 | +- 本轮修改涉及的 desktop scene capture 全部通过 |
| 307 | +- 抽查至少 3 张关键截图,确认没有新的桌面端视觉裂缝 |
| 308 | + |
| 309 | +--- |
| 310 | + |
| 311 | +## 6. 实施顺序 |
| 312 | + |
| 313 | +建议按以下顺序执行: |
| 314 | + |
| 315 | +1. `file tree` |
| 316 | +2. `git panel` |
| 317 | +3. `command palette` |
| 318 | +4. desktop chrome 收边 |
| 319 | +5. review scenes 与回归验证 |
| 320 | + |
| 321 | +原因: |
| 322 | + |
| 323 | +- `file tree` 和 `git panel` 直接决定 workspace 侧边栏是否统一,应先形成 panel 基线 |
| 324 | +- `command palette` 依赖同一套桌面工具语言,放在 panel 基线之后更容易收敛 |
| 325 | +- review scenes 放在最后补齐,可以直接覆盖最终落地视觉 |
| 326 | + |
| 327 | +--- |
| 328 | + |
| 329 | +## 7. 风险与控制 |
| 330 | + |
| 331 | +- 风险 1:`components.css` 里已有多段历史规则,新增收边可能被后段覆盖 |
| 332 | + - 控制:同步补主题测试和 scene capture,不只靠肉眼 |
| 333 | +- 风险 2:`git panel` 和 `file tree` 状态多,容易只修默认态 |
| 334 | + - 控制:scene seed 必须显式包含 selected / empty / history / search 等关键状态 |
| 335 | +- 风险 3:desktop palette 与 overlay 变动后,mobile sheet 意外受影响 |
| 336 | + - 控制:保持 desktop / mobile selector 分流,并保留现有 mobile 测试 |
| 337 | + |
| 338 | +--- |
| 339 | + |
| 340 | +## 8. 结论 |
| 341 | + |
| 342 | +本轮不做结构重写,而是围绕 `file tree`、`git panel`、`command palette` 和 desktop chrome 做一次可验证、可回归的精修。 |
| 343 | + |
| 344 | +核心原则只有两个: |
| 345 | + |
| 346 | +- 先把桌面端最常被看到的 panel 语言统一 |
| 347 | +- 每修一块,就把它纳入 `ui-preview` 和 desktop capture 的护栏 |
| 348 | + |
| 349 | +如果这份设计确认无误,下一步进入 implementation plan,并按 TDD 顺序逐块落地。 |
0 commit comments