Files
workutils/docs/superpowers/specs/2026-08-01-workutils-unified-ui-design.md
2026-08-01 12:18:15 +08:00

287 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WorkUtils 统一 UI 设计规范
日期:2026-08-01
## 1. 目标与视觉基准
本轮统一 WorkUtils 桌面端的应用外壳、排版、间距、图标、控件和异步状态,使所有功能插件具备一致的视觉语言和交互节奏。设计参考 macOS 与 Codex 桌面端的克制、清晰和高信息密度,但保留 Windows 原生标题栏及窗口按钮,不复制 macOS 红黄绿窗口控制。
最终视觉基准:
![WorkUtils 统一 UI 视觉基准](assets/2026-08-01-workutils-unified-ui-reference.png)
基准图用于确定视觉方向和信息层级,不是要求逐像素复制生成图中的系统装饰。实际实现必须服从 JavaFX、Windows 平台和现有业务能力。
## 2. 已确认的关键决策
1. 采用基准图中的明亮应用外壳、顶部应用栏和侧栏布局。
2. 侧栏支持展开与折叠;展开态显示图标和文本,折叠态仅显示图标。
3. “系统设置”只出现在顶部应用栏右侧,侧栏不再显示,避免重复入口。
4. 所有导航及功能图标使用同一套 16px 线性图标,禁止继续使用 Emoji 或混合字形。
5. API 接口文档导出采用基准图中的布局:紧凑模式选择、连续表单、独立进度操作区和可调整日志区。
6. 字体、字重、行高、字距和间距模拟 Codex/macOS 的阅读节奏,但使用 Windows 可稳定获得的字体。
7. 保持现有业务流程、导出格式、配置格式和插件路由不变。
## 3. 范围
### 3.1 本轮实施
- 重构 `MainWindow` 的顶部应用栏、侧栏、折叠状态和插件标题展示。
- 将系统设置入口移至顶部应用栏右侧,并从插件导航数据中排除。
- 建立统一设计令牌:字体、字号、色彩、间距、圆角、控件高度和图标尺寸。
- 引入单一 JavaFX 图标库并提供语义化图标注册表,替换应用外壳和插件描述中的 Emoji。
- 统一按钮、输入框、选择框、标签页、表格、树、日志区、卡片、空状态和焦点状态。
- 统一按钮 loading、进度、取消、成功、失败和禁用状态。
- 按统一页面骨架迁移 Git 同步、文本对比、MyBatis SQL 导出、MyBatis 逆向工程、扫描和 API 文档导出。
- 让 Git 分支评审、系统设置及手机 UI 自动化继承全局主题和应用外壳。
- 重点重排 API 文档导出的“导出配置”页,使其符合已确认基准。
### 3.2 明确不做
- 不重构 Git 分支评审的业务结构、评审流程或 Diff 引擎。
- 不拆分手机 UI 自动化窗口,也不重写运行/录制状态机。
- 不重构系统设置内部的信息架构;本轮只迁移入口并适配统一样式。
- 不改变导出、扫描、生成、同步等后台任务的业务语义。
- 不为了模拟 macOS 而创建自绘窗口按钮、无边框窗口或平台专属窗口行为。
- 不增加深色主题;本规范仅定义统一亮色主题。
## 4. 应用外壳
### 4.1 顶部应用栏
- 高度:48px。
- 左侧依次为:侧栏折叠按钮、WorkUtils 标识、当前插件标题或面包屑。
- 右侧依次为:系统设置入口、Windows 原生最小化/最大化/关闭区域之外的应用级操作。
- “系统设置”使用齿轮图标和文本;可通过鼠标及键盘激活。
- 插件切换后只更新当前插件标题和内容,不重建整个应用外壳。
- 顶部栏底部使用 1px 中性色分隔线,不使用阴影或渐变。
### 4.2 侧栏
- 展开宽度:214px;折叠宽度:56px。
- 折叠/展开状态在应用会话内保持;若现有设置存储可安全复用,可持久化到下次启动,否则不新增配置格式。
- 展开态显示图标与名称;图标和文本间距 12px。
- 折叠态仅显示图标,必须提供 Tooltip 和 accessible text。
- 选中项使用淡蓝背景、左侧 3px 蓝色指示条和蓝色图标/文字。
- Hover 使用中性浅灰背景;不得使用发光、涟漪或文字阴影。
- 底部提供“收起/展开”入口;顶部汉堡按钮与底部入口调用同一状态控制器。
- 侧栏不包含“系统设置”。
### 4.3 插件导航顺序
1. Git 仓库同步
2. Git 分支评审
3. 文本对比
4. MyBatis SQL 导出
5. MyBatis 逆向工程
6. 扫描功能
7. API 接口文档导出
现有插件启用/排序配置仍可影响可见性和顺序,但系统设置不得以普通插件项重新进入侧栏。
## 5. 图标系统
- 采用 Ikonli JavaFX 与 Feather 图标包作为唯一图标来源。若没有完全对应的图标,选择 Feather 包内语义最接近的图标;纯装饰图标可省略,不得混入第二套图标库或 Unicode 字形。
- 默认图标尺寸 16px;应用标识可使用 20px;空状态插图不在本轮创建。
- 所有图标使用统一视觉盒、笔画粗细、基线和颜色令牌。
- 建立 `AppIcon` 语义枚举和 `IconFactory`,业务代码引用 `SETTINGS`、`GIT_SYNC`、`EXPORT` 等语义,不直接引用图标库枚举或 Unicode 字符。
- 图标只辅助含义,关键操作不能只依赖图标;图标按钮必须有 Tooltip、accessible text 和清晰焦点环。
## 6. 排版规范
### 6.1 字体栈
UI 字体按以下顺序选择第一个可用字体:
1. `Segoe UI Variable Text`
2. `Segoe UI`
3. `Microsoft YaHei UI`
4. JavaFX 系统默认 Sans Serif
中文显示依赖系统字体回退,不打包或伪装 SF Pro/PingFang 字体。等宽内容使用 `JetBrains Mono`(若系统存在),否则回退 `Cascadia Mono`、`Consolas`、JavaFX Monospaced。
### 6.2 字号与行高
| 语义 | 字号 | 字重 | 行高/控件高度 |
| --- | ---: | --- | --- |
| 页面标题 | 20px | Semibold | 28px |
| 区块标题 | 15px | Semibold | 22px |
| 标签页/导航 | 14px | Medium | 20px |
| 正文/表单标签 | 14px | Regular | 20px |
| 辅助说明 | 12.5–13px | Regular | 19px |
| 表格/树正文 | 13px | Regular | 40px 行高 |
| 日志/路径 | 12.5–13px | Regular Mono | 19px |
不再允许插件自行传入任意标题字号。`Theme` 提供语义字体方法或 CSS 类,旧 `h1(int)`、`body(int)` 等自由尺寸方法在迁移后逐步废弃。
### 6.3 字距
- 中文正文保持 0 字距,避免人为拉开汉字。
- 拉丁正文保持 0–0.1px 的自然字距。
- 页面和区块标题可使用约 -0.2px 的轻微紧缩;JavaFX/CSS 无法稳定实现时保持 0,不通过插入空格模拟。
- 图标与文字的视觉间距由布局容器控制,不在标签文本中添加空格。
## 7. 色彩、间距与形状
### 7.1 色彩令牌
| 令牌 | 建议值 | 用途 |
| --- | --- | --- |
| `bg.app` | `#F7F7F8` | 应用背景 |
| `bg.surface` | `#FFFFFF` | 表单、表格、日志表面 |
| `bg.subtle` | `#F2F3F5` | Hover、次级区域 |
| `text.primary` | `#202123` | 主文本 |
| `text.secondary` | `#667085` | 辅助文本 |
| `text.muted` | `#98A2B3` | 禁用/弱提示 |
| `border.default` | `#E4E7EC` | 1px 分隔与边框 |
| `accent` | `#1677FF` | 选中、焦点、进度、主按钮 |
| `accent.hover` | `#0F6BE5` | 主按钮 Hover |
| `danger` | `#D92D20` | 错误和危险操作 |
| `success` | `#079455` | 成功状态 |
具体值可在实现时根据 AtlantaFX 实际渲染做小幅对比度校正,但不得重新引入深色侧栏、强阴影或大面积高饱和蓝色。
### 7.2 间距和尺寸
- 以 4px 为最小单位、8px 为主要节奏。
- 控件内部:8px;同组控件:8–12px;区块间:16px;主要区域间:24px。
- 主内容边距:上下 16px、左右 24px;窄窗口可降至 16px。
- 普通控件高度:34–36px;紧凑工具按钮 30–32px。
- 圆角:普通控件 6px;大面板 8px;不使用胶囊形按钮。
- 阴影默认关闭。只有真正浮层可使用轻量阴影。
## 8. 统一页面骨架
每个插件内容区按以下顺序组合:
1. 页面标题与可选的一句说明。
2. 可选标签页或主要上下文工具栏。
3. 主工作区。
4. 与任务直接相关的进度和操作区。
5. 可选的日志、历史或结果面板。
页面不再重复绘制应用级标题栏。内容分组优先使用间距、对齐和分隔线;只有需要独立边界或可折叠/调整大小的区域才使用面板边框,禁止卡片嵌套卡片。
## 9. API 接口文档导出布局
### 9.1 标签页
保留“导出配置 / 导出历史 / 基类配置”。标签页高度、字号、下划线和焦点状态由全局主题控制,不在 `ApiDocWindow` 内硬编码。
### 9.2 导出配置
- 将三张过大的模式卡片改为单行分段选择器。
- 每段包含统一图标、标题和一行说明;选择状态使用蓝色描边/单选指示,未选状态保持中性。
- 模式切换只改变与该模式相关的输入区域,保持现有请求构造和校验规则。
- 完整类名输入使用全宽字段;标签位于字段上方,说明位于字段下方。
- “启用接口调试(启动本地代理)”保留为显式复选项,默认状态继续服从既有业务约定;在其下方解释影响。
### 9.3 任务状态与操作
- 进度区与操作按钮位于同一视觉行:左侧为状态标题、进度条和说明,右侧为主操作与取消。
- 空闲时显示“导出文档”;运行时由 `LoadingButtonBinder` 显示 spinner 和“导出中…”。
- 可取消任务显示“取消”;不具备真实取消能力时不显示伪取消按钮。
- 进度同时使用进度条、百分比和文本,不只依靠颜色。
- 任务运行时只禁用会改变本次请求的控件,导航、历史查看和无关操作保持可用。
### 9.4 日志区
- 日志位于主表单下方,使用等宽字体、19px 行高和弱边框。
- 支持折叠和垂直调整大小;默认高度以 10–14 行为宜。
- 日志头部显示“执行日志”,底部显示行数或结果摘要。
- 日志不得显示密码、令牌或带凭据的远程 URL。
## 10. Loading 与异步状态
所有异步操作遵循同一状态模型:`IDLE -> RUNNING -> SUCCEEDED | FAILED | CANCELLED`。
- `IDLE`:按钮显示动词,spinner 不存在。
- `RUNNING`:主按钮保留宽度,显示 spinner 和进行中文案;禁止重复触发。
- `SUCCEEDED`:恢复按钮,状态区显示结果和可执行下一步。
- `FAILED`:恢复按钮,显示可读错误和重试入口;不把异常堆栈直接显示给普通用户。
- `CANCELLED`:恢复按钮,明确显示“已取消”;已生成的有效结果不得被误删。
`LoadingButtonBinder` 是按钮 loading 的唯一绑定入口。窗口不得再次直接拼装 spinner、替换图标或散落调用 `setDisable`。`OperationStatusPane` 负责进度、状态和可选取消;按钮 loading 与任务进度共享同一只读运行状态,避免不同步。
## 11. 可访问性与键盘
- 所有图标按钮必须有 accessible text 和 Tooltip。
- 侧栏展开/折叠后保持合理的 Tab 顺序和焦点位置。
- 焦点环必须清晰可见,不能通过全局 CSS 移除。
- 文本与背景、禁用状态、选中状态满足可辨识对比度;最终通过实际渲染和对比度工具复核。
- 任务状态变化同步更新 accessible text;成功、失败和运行状态不只依靠颜色或动画。
- 动画只用于 120–180ms 的侧栏宽度/透明度过渡和 spinner;若 JavaFX 动画造成布局抖动,则优先稳定布局并取消宽度动画。
## 12. 代码边界与可维护性
建议拆分为以下独立单元:
- `DesignTokens`:语义字体、颜色、间距、尺寸和圆角;不得包含业务状态。
- `AppIcon` / `IconFactory`:业务语义到图标库的唯一映射。
- `AppShell`:顶部栏、侧栏、折叠状态和内容插槽。
- `NavigationModel`:只描述可见插件、顺序、选择和打开动作。
- `PageHeader` / `SectionHeader`:统一标题结构。
- 现有 `LoadingButtonBinder` 和 `OperationStatusPane`:继续作为异步展示边界,不引入第二套 loading 组件。
插件窗口只组合公共组件和业务控件,不负责设置全局字体、应用背景、侧栏或系统设置入口。禁止新增大段 `setStyle(...)`;动态状态通过伪类或语义 CSS class 表达。
## 13. 实施优先级
### P0:应用外壳与设计令牌
- 字体栈、色彩、间距、控件尺寸和全局 CSS。
- 统一图标注册表。
- 新顶部栏、系统设置入口和可折叠侧栏。
- 基础控件和焦点/禁用/loading 状态。
### P1:API 文档导出
- 按基准图重排“导出配置”。
- 复用现有 Tab、请求、代理、历史和异步控制器。
- 添加可调整日志区及任务状态一致性测试。
### P2:其余核心插件迁移
- MyBatis 逆向工程、MyBatis SQL 导出、扫描、Git 同步、文本对比。
- 每个插件只迁移页面骨架与样式,不改变业务流程。
### P3:受限适配与收尾
- Git 分支评审、手机 UI 自动化、系统设置只做主题和外壳适配。
- 清理遗留 Emoji、任意字号和内联样式。
- 全量视觉回归、键盘与可访问性验收。
## 14. 测试与验收
### 14.1 自动化
- 设计令牌、字体回退和图标语义映射单元测试。
- 侧栏展开/折叠、选择保持、Tooltip 和 accessible text 组件测试。
- 系统设置只存在一个应用级入口的结构测试。
- `LoadingButtonBinder` 在五种状态下的文案、spinner、禁用和恢复测试。
- API 导出三种模式、代理开关、请求构造、运行/取消/失败恢复和历史刷新测试。
- 架构约束:插件窗口不得新增 Emoji 导航图标、直接 loading 拼装或应用级系统设置入口。
### 14.2 视觉验收
在相同窗口尺寸和相同业务状态下,将实现截图与视觉基准并排比较,逐项检查:
- 顶部栏与侧栏尺寸、折叠行为和唯一系统设置入口。
- 字体层级、行高、标签与输入字段对齐。
- 图标风格、尺寸、基线及图文间距。
- 内容留白、边框、圆角、颜色和无多余嵌套卡片。
- API 导出模式选择、进度操作行和日志区。
- loading 时按钮宽度稳定、spinner 不抖动、无关操作可用。
视觉稿中的 macOS 红黄绿窗口按钮不属于验收目标;Windows 原生标题栏显示正常即为通过。
### 14.3 完成标准
- Maven 全量测试和编译通过。
- `git diff --check` 通过。
- 主要插件在展开和折叠侧栏下均无裁切、重叠或跳动。
- 1024px 与 1440px 宽度下核心流程可用;低于最小支持宽度时允许滚动,不允许控件消失。
- 系统设置只在右上角出现,侧栏无重复项。
- 全局导航不再使用 Emoji,业务插件无新增任意字号或重复 loading 代码。
- Git 分支评审和手机 UI 自动化的业务结构保持不变。