Files
mini-openclaw-v2/docs/project-process/04-ui-spec.md
T
qiaoqichaoandClaude Code d56c699ce6 chore(v2): 从兴邦预审v2白名单抽取独立可运行基座
按 docs/v2/05-implementation-plan.md §1 候选迁移表与 claude_use/T00 白名单,
从 55e2cdb 抽取 224 个文件(2.48 MB)到独立目录 F:/mini-OpenClaw-v2。

- 排除:凭据(.env/server-deploy.conf/旧DELIVERY.md)、运行数据(xingbang_data 等
  4 个 SQLite)、依赖(venv/node_modules 符号链接)、归档(_backup*/test-evidence/
  ori_file)、Office 临时文件
- 目标目录独立 git 仓库,初始恢复点;Gitea 远程与分支待 OQ-06 Q2 定案
- 未部署、未启动服务、未调用模型

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-29 12:58:26 +08:00

119 lines
7.7 KiB
Markdown
Raw 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.
# 阶段 ④ UI Spec — UI 规则定义与约束规范
> **定义**:定义每个交付面的 UI 行为与视觉约束,让 UI 实现者(人或 agent)不发明任何决策:页面骨架、组件粒度、状态机、动作权限由**表面规格(Surface Specification)** 规定;颜色/字号/间距/组件形态由**设计系统契约(DESIGN.md)** 规定。
> **输入**:① 规格 §3(Surface Specification)+ ②/③ 的接口契约(UI 消费的字段)。
> **输出**:表面规格 + DESIGN.md(含 token)+ i18n 约束。
> **进入下一阶段(⑤ 实现)**:状态机、动作权限、设计 token、i18n 全部定案。
> 适用判定:本阶段仅当改动拥有用户可见 UI(项目工作台、评审页面、材料与配置界面、证据/模拟面板)时强制;纯后端/网关/CLI 改动标记 `not applicable`。
---
## 1. 要求(Requirements)
### 1.1 进入条件
- 规格 §3 已定义交付面清单与每个面的消费字段(字段有类型、可空性、枚举值)。
- 项目已有或需要建立视觉事实源(`DESIGN.md` / 主题变量 / 组件库)。
### 1.2 完成条件(DoD)
- [ ] 每个交付面有:页面骨架 + 组件粒度边界 + 完整状态机 + 动作×权限表
- [ ] 每个 UI 提交/展示的字段能在规格 §2 找到(契约门)
- [ ] 视觉 token(颜色/字号/间距/圆角/组件)有语义化来源,不出现临时发明的 `blue500` 类裸色
- [ ] 新版文案有统一维护方式、错误码映射和语言范围;当前主要中文组件内文案,统一key化方案待建设,不声称已有双语语言包
- [ ] 可访问性约束写明:对比度(WCAG AA)、focus-visible、颜色不单独承载状态、reduced-motion
- [ ] 异常态(加载/空/错误/禁用/提交中)有明确视觉与文案定义(对应规格 `E-*`)
---
## 2. 规则(Rules)
### 2.1 表面规格规则(Surface Specification)
| 编号 | 规则 |
|---|---|
| R-4.1 | **骨架先行**:每个交付面先定页面骨架(区域划分),再定组件,禁止直接进入像素级布局。 |
| R-4.2 | **组件粒度即所有权边界**:明确"哪个组件拥有哪个状态"(如筛选条是查询条件的唯一事实源、表格不持有选择集)。组件不得越界:表格不能清空选择,只能向拥有者发请求。 |
| R-4.3 | **状态机完整**:`Idle/Loading/Ready/Empty/Error/Submitting` 等状态全列;`Loading`(骨架屏)与 `Submitting`(保留现有内容+禁用交互)是不同状态,不得合并。 |
| R-4.4 | **动作×权限表**:每个动作列角色与禁用条件(如"Auditor 看到页面但没有动作控件,而非禁用按钮")。 |
| R-4.5 | **交互约束显式**:URL 持有可分享状态、筛选变更清空选择、选择集不跨页、破坏性操作需确认且写明数量——写成条目,不留给实现。 |
| R-4.6 | **截图不是 spec**:图片可表达布局,但必须同时有规则、状态转换、权限(R-1.7 在 UI 层同样生效)。 |
### 2.2 设计系统规则(DESIGN.md / 视觉 token)
| 编号 | 规则 |
|---|---|
| R-4.7 | **视觉来源明确**:先检查src/app/globals.css、src/components/xingbang/navigation.css和当前页面CSS;v2视觉契约在docs/v2/DESIGN.md,统一token实现待建设。避免新增互相冲突的裸色/间距,不顺手重构无关旧页。 |
| R-4.8 | **语义 token 优先**:token 用语义角色(`primary`/`surface`/`danger`),不用调色板名(`teal-500`);组件 token 带状态(如 `button-primary-hover`、`text-input-focused`)。 |
| R-4.9 | **防漂移须执行**:新token统一来源需有实际消费和可运行检查。当前scripts/test_ui_readability.cjs是源码守卫,不是完整token导出检查;缺少机制列待办。 |
| R-4.10 | **可访问性硬约束**:正文与 focus 态满足 WCAG AA 对比度;错误/成功/选中状态不得只靠颜色表达;支持 reduced-motion;表单与错误态有明确指引。 |
| R-4.11 | **不强推框架外规范**:后端/CLI/纯数据项目标记 `not applicable`,不套用视觉契约。 |
### 2.3 i18n 规则
| 编号 | 规则 |
|---|---|
| R-4.12 | 新版文案按业务域规划key并绑定错误码;实际文件位置和调用方法在UI设计阶段明确。当前仅有中文文案,不能凭空引用语言包;旧页面修复遵循最小范围。 |
| R-4.13 | 已支持的语言与UI状态同步维护;增加语言需明确范围和验收,不因来源模板写有双语就扩充产品需求。 |
| R-4.14 | API返回稳定错误码,前端统一映射业务文案;同源代理转发错误语义,不自行生成另一套判断或吞错。 |
---
## 3. 输出规范
### 3.1 表面规格结构(每个交付面一份)
```text
Skeleton 页面骨架:区域划分与信息层级
Component 组件粒度:组件清单 + 各自拥有的状态 + 不允许越界的边界
Granularity
State Machine 状态全集 + 合法转换 + 每个状态的禁用手势(表格或图)
Actions & Guards 动作 × 角色 × 禁用条件(含"只读角色无控件而非禁用")
Interaction 交互约束:URL 状态、选择集规则、确认对话框、虚拟化/固定行高、截断策略
Constraints
```
> 兴邦表面规格示例见 [v2 UI Spec](../v2/04-ui-spec.md),需求编号仍回链至对应规格。
### 3.2 DESIGN.md 结构
```text
frontmatter(机器可读) colors / typography / rounded / spacing / components
(顶层组,语义角色 + 组件状态 token,支持 {colors.primary} 引用)
Markdown(人读) Overview / Colors / Typography / Layout / Elevation & Depth /
Shapes / Components / Do's and Don'ts
+ 可访问性(对比度、focus-visible、color-not-alone、reduced-motion)
+ 每个 token 的"何时用 / 何时不用 / 防止什么 agent 错误"
```
> 参考 [v2 DESIGN.md](../v2/DESIGN.md)。已观察值注明CSS来源,推断标“推断”,未定品牌决策标needs-design-decision;候选契约未被CSS消费不能宣称视觉系统已统一。
### 3.3 交付物清单
- 每个交付面的表面规格
- `DESIGN.md`或缺失清单;现有来源为src/app/globals.css和业务CSS。记录Present/Structured/Token-ready/Aligned/Backstopped证据等级,不能跳级。
- i18n key 清单(新增/变更)
- UI 验收映射:表面规格的每条交互约束 ↔ 规格 `AC-xx` ↔ [06-validation.md](06-validation.md) 的测试点(组件/E2E)
---
## 4. UI 验证约束(预置,详见阶段 ⑥)
- UI 验证分驱动平面(D0 进程内渲染树 → D1 浏览器自动化协议 → D2 附加运行中浏览器 → D3 OS 输入/无障碍 → D4 物理设备),选满足声明的最便宜平面,失败再升级。
- **驱动与观察分离**:同一模型既驱动 UI 又目测自己的截图 = 无独立裁判,不能算 pass(`Self-reported success` 反模式)。截图基线只追加不覆盖。
- 定位器禁止跨动作缓存(元素索引/坐标每次交互前重新读取);降级顺序:语义选择器 → 文本/aria → 原始坐标,并记录最终落到哪一级。
---
## 5. 轻量路径(小改动)
- 单组件样式调整:更新 DESIGN.md 对应 token + 表面规格的组件小节,不重写整份规格。
- 触碰多交付面、状态机重构、主题切换:必须完整走本阶段。
---
## 6. 相关文档
- 输入:阶段 ① [01-requirement.md](01-requirement.md) §3、阶段 ③ [03-detailed-design.md](03-detailed-design.md)
- 验证:阶段 ⑥ [06-validation.md](06-validation.md)(UI 驱动平面与裁判分离约束)
变更:XB-1.0 / 2026-09-28,按兴邦 Next.js + FastAPI 项目事实适配;稳定规则编号保留。