@teamix-evo/skills 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +7 -3
  2. package/manifest.json +63 -46
  3. package/package.json +3 -3
  4. package/src/teamix-evo-code-opentrek/SKILL.md +94 -0
  5. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/api-layering.md +8 -5
  6. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/checklist.md +4 -2
  7. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/error-and-loading.md +38 -25
  8. package/src/teamix-evo-code-opentrek/file-structure.md +282 -0
  9. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/forms-and-validation.md +14 -12
  10. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/reuse-first.md +27 -17
  11. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/routing-and-codesplit.md +23 -21
  12. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/testing.md +32 -28
  13. package/src/teamix-evo-code-uni-manager/SKILL.md +97 -0
  14. package/src/teamix-evo-code-uni-manager/api-layering.md +372 -0
  15. package/src/teamix-evo-code-uni-manager/checklist.md +195 -0
  16. package/src/teamix-evo-code-uni-manager/error-and-loading.md +391 -0
  17. package/src/teamix-evo-code-uni-manager/file-structure.md +341 -0
  18. package/src/teamix-evo-code-uni-manager/forms-and-validation.md +461 -0
  19. package/src/teamix-evo-code-uni-manager/reuse-first.md +190 -0
  20. package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +452 -0
  21. package/src/teamix-evo-code-uni-manager/testing.md +398 -0
  22. package/src/teamix-evo-design-opentrek/SKILL.md +64 -0
  23. package/src/teamix-evo-design-opentrek/boundaries.md +533 -0
  24. package/src/teamix-evo-design-opentrek/brand.md +154 -0
  25. package/src/teamix-evo-design-opentrek/checklist.md +85 -0
  26. package/src/teamix-evo-design-opentrek/components.md +294 -0
  27. package/src/teamix-evo-design-opentrek/flows.md +51 -0
  28. package/src/teamix-evo-design-opentrek/foundations.md +274 -0
  29. package/src/teamix-evo-design-opentrek/generation-flow.md +243 -0
  30. package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
  31. package/src/teamix-evo-design-opentrek/patterns/dashboard.md +33 -0
  32. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +203 -0
  33. package/src/teamix-evo-design-opentrek/patterns/form-page.md +292 -0
  34. package/src/teamix-evo-design-opentrek/patterns/list-page.md +367 -0
  35. package/src/teamix-evo-design-opentrek/patterns/page-types.md +159 -0
  36. package/src/teamix-evo-design-opentrek/patterns/sidebar.md +122 -0
  37. package/src/teamix-evo-design-opentrek/philosophy.md +98 -0
  38. package/src/teamix-evo-design-opentrek/rules/README.md +39 -0
  39. package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +391 -0
  40. package/src/teamix-evo-design-uni-manager/SKILL.md +64 -0
  41. package/src/teamix-evo-design-uni-manager/boundaries.md +567 -0
  42. package/src/teamix-evo-design-uni-manager/brand.md +202 -0
  43. package/src/teamix-evo-design-uni-manager/checklist.md +115 -0
  44. package/src/teamix-evo-design-uni-manager/components.md +257 -0
  45. package/src/teamix-evo-design-uni-manager/flows.md +63 -0
  46. package/src/teamix-evo-design-uni-manager/foundations.md +261 -0
  47. package/src/teamix-evo-design-uni-manager/generation-flow.md +230 -0
  48. package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +97 -0
  49. package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +253 -0
  50. package/src/teamix-evo-design-uni-manager/patterns/form-page.md +366 -0
  51. package/src/teamix-evo-design-uni-manager/patterns/list-page.md +389 -0
  52. package/src/teamix-evo-design-uni-manager/patterns/page-types.md +167 -0
  53. package/src/teamix-evo-design-uni-manager/philosophy.md +108 -0
  54. package/src/teamix-evo-design-uni-manager/rules/README.md +49 -0
  55. package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +418 -0
  56. package/src/teamix-evo-manage/SKILL.md +289 -0
  57. package/skills/teamix-evo-coding-conventions/SKILL.md +0 -92
  58. package/skills/teamix-evo-coding-conventions/file-structure.md +0 -273
  59. package/skills/teamix-evo-design-rules/SKILL.md +0 -86
  60. package/skills/teamix-evo-design-rules/boundaries.md +0 -89
  61. package/skills/teamix-evo-design-rules/checklist.md +0 -108
  62. package/skills/teamix-evo-design-rules/generation-flow.md +0 -142
  63. package/skills/teamix-evo-design-rules/prompts/page-design.md +0 -148
  64. package/skills/teamix-evo-design-rules-opentrek/SKILL.md +0 -48
  65. package/skills/teamix-evo-design-rules-opentrek/brand-rules.md +0 -74
  66. package/skills/teamix-evo-design-rules-uni-manager/SKILL.md +0 -51
  67. package/skills/teamix-evo-design-rules-uni-manager/ai-scenarios.md +0 -51
  68. package/skills/teamix-evo-design-rules-uni-manager/command-center.md +0 -108
  69. package/skills/teamix-evo-design-rules-uni-manager/danger-ops.md +0 -87
  70. package/skills/teamix-evo-manage/SKILL.md +0 -178
  71. package/skills/teamix-evo-ui-upgrade/SKILL.md +0 -75
@@ -0,0 +1,203 @@
1
+ # Detail Page — 详情页模式
2
+
3
+ > ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **DetailPage**,并由 Step 3 引导到这里。
4
+
5
+ > **触发**:用户描述含"详情/查看/信息/概览"。
6
+ > **核心特征**:单条记录的只读展示 + DescriptionList + 操作按钮。
7
+ > **页面级别**:L2(面包屑模式 PageHeader,自动继承 Sidebar)。
8
+
9
+ ---
10
+
11
+ ## 1. 子类型识别
12
+
13
+ | 子类型 | 关键词 | 差异特征 |
14
+ | ------------ | ------------------------ | ------------------------------------------ |
15
+ | **标准详情** | "详情"/"基本信息" | PageHeader + DescriptionList + 操作按钮 |
16
+ | **资源详情** | "实例详情"/"资源"/"监控" | InfoCard + MonitorPanel + Tabs(关联资源) |
17
+ | **概览型** | "概览"/"总览" | StatCard + Chart + DescriptionList |
18
+ | **流程型** | "审批"/"流程"/"记录" | Steps + Timeline + DescriptionList |
19
+ | **对比型** | "对比"/"比较" | 双栏/多栏 DescriptionList 对照 |
20
+
21
+ ---
22
+
23
+ ## 2. 标准结构(资源详情)
24
+
25
+ ```
26
+ ┌─────────────────────────────────────────────┐
27
+ │ PageHeader(面包屑模式) │
28
+ │ 实例与镜像 > 实例列表 > 实例详情 [创建镜像]│ ← Header
29
+ │ │
30
+ │ InfoCard ─ 基本信息 │ ← 摘要区
31
+ │ 组织 | 资源集 | 创建人 | 创建时间 │
32
+ │ │
33
+ │ InfoCard ─ 监控 │
34
+ │ [CPU 使用率] [内存使用率](MonitorPanel) │
35
+ │ │
36
+ │ Tabs │ ← 分类
37
+ │ [基本信息] [监控] [云盘] [安全组] [快照] │
38
+ │ │
39
+ │ DescriptionList ─ 基本信息 │ ← 主区
40
+ │ 架构: X86 地域: cn-beijing │
41
+ │ 实例ID: i-xxx 状态: [Badge 运行中] │
42
+ │ │
43
+ │ DescriptionList ─ 配置信息 │
44
+ │ vCPU: 2 内存: 4 GiB │
45
+ └─────────────────────────────────────────────┘
46
+ ```
47
+
48
+ ## 简洁详情结构
49
+
50
+ ```
51
+ ┌─────────────────────────────────────────────┐
52
+ │ PageHeader(面包屑模式) │
53
+ │ 用户列表 > 用户详情 [编辑] [删除] │
54
+ │ │
55
+ │ DescriptionList (column: 2) │
56
+ │ 姓名: 张三 邮箱: zhangsan@example.com │
57
+ │ 角色: 管理员 状态: [Badge 启用] │
58
+ │ 创建时间: 2026-01-15 更新: 2026-04-20 │
59
+ └─────────────────────────────────────────────┘
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 3. 必需组件
65
+
66
+ | 组件 | 位置 | 说明 |
67
+ | ------------------- | ---- | ------------------------------- |
68
+ | **PageHeader** | top | 面包屑模式(L2 页面)+ 操作按钮组 |
69
+ | **DescriptionList** | main | 详情页核心展示组件 |
70
+ | **DescriptionItem** | main | 描述项最小展示单元 |
71
+
72
+ **框架级**(自动继承):Sidebar、PageHeader 由 page-frame 管控。
73
+
74
+ ### 可选组件
75
+
76
+ - **InfoCard** — 顶部摘要(组织/创建人/创建时间)
77
+ - **Tabs** — 信息分多类(基本/监控/关联资源)
78
+ - **MonitorPanel** — CPU/内存/网络监控(仅资源详情)
79
+ - **Badge** — 状态指示
80
+ - **Tooltip** — 长 ID / 截断字段悬浮
81
+
82
+ ---
83
+
84
+ ## 4. DescriptionItem 字段交互
85
+
86
+ | 类型 | 触发 | 反馈 |
87
+ | -------------- | ---------- | --------------------------------- |
88
+ | 默认展示 | — | 只读文本,空值 `-` 占位 |
89
+ | 可复制 | 点 📋 图标 | 图标高亮 + Toast "已复制" |
90
+ | 可编辑(行内) | 点 ✎ 图标 | 切换为 Input |
91
+ | 链接跳转 | 点字段值 | 链接样式(VPC、安全组等关联资源) |
92
+ | 状态展示 | — | Badge + 语义色 |
93
+ | 悬浮提示 | hover | Tooltip 完整内容(截断时) |
94
+
95
+ ---
96
+
97
+ ## 5. 操作按钮规则
98
+
99
+ ### 5.1 位置
100
+
101
+ - **位置 A**:PageHeader 右侧(主操作 + 更多 Dropdown)
102
+ - **位置 B**:DescriptionItem 内(行内编辑、复制)
103
+
104
+ ### 5.2 操作分级
105
+
106
+ | 级别 | 适用 | 确认 |
107
+ | ---------------- | --------------- | --------------------- |
108
+ | 一级(可逆) | 编辑、续费/降配 | 直接执行 |
109
+ | 二级(影响状态) | 释放、创建镜像 | Dialog 确认 |
110
+ | 三级(不可逆) | 删除 | Dialog + 输入确认文本 |
111
+
112
+ ### 5.3 异步反馈
113
+
114
+ | 操作 | Toast | 页面 |
115
+ | --------------- | ------------ | --------------------- |
116
+ | 释放 / 创建镜像 | "操作已提交" | 轮询状态 |
117
+ | 删除 | "删除已提交" | 返回 ListPage 并刷新 |
118
+ | 编辑保存 | "保存成功" | 停留详情页 + 局部刷新 |
119
+
120
+ ---
121
+
122
+ ## 6. Tab 切换交互
123
+
124
+ | 场景 | 行为 |
125
+ | ---------- | ----------------------------- |
126
+ | 首次加载 | 默认激活第一个 Tab |
127
+ | Tab 切换 | 懒加载数据 + Loading |
128
+ | 无数据 Tab | 展示 Empty |
129
+ | Tab 内列表 | 含独立 Pagination |
130
+ | URL 同步 | 切换同步 URL hash,刷新可保持 |
131
+
132
+ ---
133
+
134
+ ## 7. 信息分组
135
+
136
+ - DescriptionList 按 ListSection 分组(基本信息 / 配置信息 / 网络信息)
137
+ - 每组可独立展开/收起(可选)
138
+ - 分组间用 Divider 分隔
139
+ - 每组内 DescriptionList 默认 `column: 2`,宽屏可至 4,移动端降为 1
140
+
141
+ ---
142
+
143
+ ## 8. 嵌套约束
144
+
145
+ | 父子关系 | 状态 |
146
+ | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
147
+ | PageShell(background="muted", sidebar=OpSidebar) → OpPageContainer(header=PageHeader) → InfoCard / Tabs / DescriptionList | ALLOW |
148
+ | OpPageContainer 内大白卡 → 再嵌一层 `<Card>` 包业务组件 | **FORBID**(已内置大白卡,嵌套违反白卡单例) |
149
+ | InfoCard → DescriptionList / MonitorPanel | ALLOW(InfoCard 是局部信息卡 — 业务子区域级,非主区白卡) |
150
+ | Tabs → TabPane → DescriptionList / DataTable | ALLOW(关联资源用 DataTable) |
151
+ | Sidebar → DescriptionList | **FORBID** |
152
+ | PageHeader → Tabs | WARN(Tab 应在 PageHeader 下方) |
153
+
154
+ ---
155
+
156
+ ## 9. 禁止项
157
+
158
+ | 禁项 | 原因 |
159
+ | -------------------------- | ------------------------------------- |
160
+ | Form 直接在主内容区 | 编辑应通过 Drawer/Dialog/FormPage |
161
+ | DataTable 在主内容区 | 关联数据应用 Tabs 子面板 |
162
+ | Chart 替代 DescriptionList | 图表属 Dashboard,监控用 MonitorPanel |
163
+ | QueryFilter | 详情页无筛选需求 |
164
+ | `hr` 分割线 | 用 Divider |
165
+
166
+ ---
167
+
168
+ ## 10. 边界情况
169
+
170
+ | 场景 | 处理 |
171
+ | ---------- | ----------------------- |
172
+ | 无数据 | Empty + 返回列表引导 |
173
+ | 加载中 | Loading 骨架屏 |
174
+ | 加载失败 | ErrorState + 重试按钮 |
175
+ | 权限不足 | 操作按钮隐藏,只读展示 |
176
+ | 资源不存在 | 跳转 404 ExceptionPage |
177
+ | 字段为空 | 展示 "-" 占位 |
178
+ | 字段过长 | 截断 + Tooltip 完整内容 |
179
+
180
+ ---
181
+
182
+ ## 11. 详情 → 列表返回约定
183
+
184
+ - 面包屑父级项点击返回 ListPage
185
+ - PageHeader 右侧可选 × 关闭按钮
186
+ - 返回后 ListPage 保持原筛选 + 分页
187
+ - 详情页编辑成功后,按业务决策:
188
+ - 留在详情页(Toast「保存成功」+ 局部刷新)
189
+ - 或返回 ListPage(Toast「保存成功」+ 列表刷新)
190
+
191
+ ---
192
+
193
+ ## 12. 详情页特有自检
194
+
195
+ - [ ] PageHeader 用面包屑模式(L2 页面)
196
+ - [ ] DescriptionList 列数:默认 2,宽屏可 4,移动端 1
197
+ - [ ] 关联资源用 Tabs 子面板(不在主区直接放 DataTable)
198
+ - [ ] Badge 用语义色(不用原色)
199
+ - [ ] 空字段用 "-" 占位
200
+ - [ ] 长字段(ID/Hash)`font-mono` + 提供复制按钮
201
+ - [ ] 操作分级正确(删除 = 输入确认)
202
+ - [ ] Tab 切换 URL hash 同步
203
+ - [ ] 边界状态完整:Empty / Loading / ErrorState / 权限不足 / 404
@@ -0,0 +1,292 @@
1
+ # Form Page — 表单页模式
2
+
3
+ > ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **FormPage**,并由 Step 3 引导到这里。
4
+
5
+ > **触发**:用户描述含"新建/创建/编辑/修改/复制/填写"。
6
+ > **核心特征**:用户输入数据 + 字段校验 + 提交。
7
+ > **页面级别**:L2(面包屑模式 PageHeader,自动继承 Sidebar)。弹窗表单 = L0。
8
+
9
+ ---
10
+
11
+ ## 1. 子类型识别
12
+
13
+ | 子类型 | 关键词 | 差异特征 |
14
+ | ------------ | -------------------- | ---------------------------------------------------------- |
15
+ | **新建表单** | "新建"/"创建"/"新增" | 字段为空,标题"新建 XX",保存返回列表 |
16
+ | **编辑表单** | "编辑"/"修改" | 字段填充数据,标题"编辑 XX",保存返回原页 |
17
+ | **复制新建** | "复制"/"克隆" | 字段预填源数据(ID 除外),标题"复制新建 XX",保存返回列表 |
18
+
19
+ ### FormPage vs Wizard 区分
20
+
21
+ | 场景 | 类型 | 判断依据 |
22
+ | -------------------------- | ---------- | -------------- |
23
+ | 字段无顺序依赖,一次填写 | FormPage | 单页表单 |
24
+ | 步骤间有顺序依赖,逐步完成 | WizardPage | 多步流程,Steps |
25
+
26
+ > Wizard 是独立页面类型,不是 FormPage 子类型。
27
+
28
+ ---
29
+
30
+ ## 2. 布局模式(三选一)
31
+
32
+ ### 2.1 SINGLE_COL(默认)
33
+
34
+ ```text
35
+ ┌────────────────────────────────────────┐
36
+ │ PageHeader: 新建实例 │
37
+ │ │
38
+ │ FieldGroup │
39
+ │ Field [实例名称 *] │
40
+ │ Field [地域 ▼] │
41
+ │ Field [可用区 ▼] │
42
+ │ Field [实例规格 * ▼] │
43
+ │ │
44
+ │ ───────────────────────── │
45
+ │ SubmitBar [取消] [确定] │ ← justify-end
46
+ └────────────────────────────────────────┘
47
+ ```
48
+
49
+ ### 2.2 TWO_COL(多字段并排)
50
+
51
+ ```text
52
+ FieldGroup
53
+ ┌─ 列 1 ──────┐ ┌─ 列 2 ──────┐
54
+ │ 用户名 * │ │ 邮箱 * │
55
+ │ 角色 * │ │ 状态 │
56
+ │ 部门 │ │ 手机号 │
57
+ └─────────────┘ └─────────────┘
58
+ SubmitBar [取消] [保存]
59
+ ```
60
+
61
+ ### 2.3 SECTION(分区表单)
62
+
63
+ ```text
64
+ Card[FieldGroup ─ 基本信息]
65
+ 实例名称 *
66
+ 类型 * [自研 ○ MySQL ○ PostgreSQL]
67
+
68
+ Card[FieldGroup ─ 网络配置]
69
+ 地域 * / VPC * / 交换机 *
70
+
71
+ Card[FieldGroup ─ 存储配置]
72
+ 存储空间 * / 备份策略
73
+
74
+ SubmitBar [取消] [创建]
75
+ ```
76
+
77
+ **何时分区**:字段 > 10 / 业务概念分组明显 / 含可选高级配置。
78
+
79
+ ---
80
+
81
+ ## 3. 必需组件
82
+
83
+ | 组件 | 位置 | 说明 |
84
+ | --------------------- | ------ | ------------------------------------ |
85
+ | **PageHeader** | top | 面包屑模式(L2 页面) |
86
+ | **Form / FieldGroup** | center | 表单容器,**禁止**用 div + space-y-\* |
87
+ | **SubmitBar** | bottom | 提交操作栏,居右排列 |
88
+
89
+ **框架级**(自动继承):Sidebar、Breadcrumb。
90
+
91
+ ---
92
+
93
+ ## 4. SubmitBar / Footer 规则
94
+
95
+ ### 4.1 智能定位
96
+
97
+ - Footer **从滚动区域移出**,作为 Card 的直接子元素
98
+ - Card:`flex flex-col max-h-[calc(100vh-48px)]`
99
+ - 内容区:`flex-1 overflow-y-auto min-h-0`
100
+ - Footer:`flex-shrink-0 z-10 bg-card border-t`
101
+
102
+ ### 4.2 行为
103
+
104
+ | 场景 | Card 高度 | Footer |
105
+ | ----------- | ------------------------ | ------------------------ |
106
+ | 内容 < 视口 | 自适应 | 跟随内容自然展示 |
107
+ | 内容 > 视口 | max-h:calc(100vh - 48px) | 固定底部,悬浮于表单上方 |
108
+
109
+ ### 4.3 按钮顺序(从左到右)
110
+
111
+ - `[取消]` → `[上一步]`(Wizard 中)→ `[下一步 / 提交 / 保存]`
112
+ - 主按钮始终在最右侧(Primary)
113
+ - 容器 `justify-end`
114
+
115
+ ---
116
+
117
+ ## 5. 字段控件选型
118
+
119
+ > **枚举数量阈值规则(≤7 RadioGroup / 8-30 Select / >30 Combobox)见 [components.md §3.5 输入控件](../components.md#35-输入控件--input-vs-select-vs-combobox)**。本节只列表单页专属补充字段。
120
+
121
+ | 字段类型 | 组件 | 说明 |
122
+ | -------------- | ---------------------------- | --------------------------------- |
123
+ | 布尔(设置) | Switch | "启用 X" 类开关 |
124
+ | 布尔(表单) | Checkbox | 协议确认 |
125
+ | 单选(2~5 项) | RadioGroup variant="button" | 类型选择(按钮组可视化优于下拉) |
126
+ | 整数/数值 | InputNumber | 年龄/数量/价格等有范围约束的数 |
127
+ | 小数/金额 | InputNumber precision={n} | 保留 n 位小数(自动四舍五入) |
128
+ | 范围数值(可视) | Slider | 资源配比/阈值(需要拖拽式视觉反馈) |
129
+ | 验证码 | InputOTP | 短信 / 邮箱 OTP |
130
+ | 输入 + 按钮 | InputGroup | 复制、单位切换 |
131
+ | 文件上传 | FileUpload | 单 / 多文件 |
132
+ | 日期 / 时间 | DatePicker / DateRangePicker | — |
133
+
134
+ ---
135
+
136
+ ## 6. 字段校验规则
137
+
138
+ ### 6.1 触发时机
139
+
140
+ | 场景 | 触发 |
141
+ | ---------- | ---------------- |
142
+ | 单字段格式 | blur(失焦) |
143
+ | 必填检查 | submit(提交时) |
144
+ | 跨字段联动 | change(实时) |
145
+ | 后端校验 | submit 提交后 |
146
+
147
+ ### 6.2 视觉反馈
148
+
149
+ - 错误:`data-invalid` 在 Field 上、`aria-invalid` 在控件上 → 红色边框 + FormMessage 错误描述
150
+ - 必填:label 后置 `*` 红色标记
151
+ - 字段说明优先 Tooltip(避免行内增加阅读负担)
152
+ - 提交失败:聚焦第一个错误字段
153
+
154
+ ### 6.3 长表单分组
155
+
156
+ - 单组字段 ≤ 6
157
+ - > 10 字段必须分区或分步
158
+ - 分区用 Card 内嵌 FieldGroup
159
+
160
+ ---
161
+
162
+ ## 7. 提交交互
163
+
164
+ ### 7.1 操作流
165
+
166
+ | 操作 | 触发 | 前置 | 反馈 |
167
+ | ---------------- | ------------ | ------------ | -------------------------------- |
168
+ | 保存 | 点[确定] | 本地校验通过 | 校验 → 提交 → Toast「保存成功」 |
169
+ | 保存失败 | 后端返回错误 | — | 字段标红 + Toast 错误 + 留在表单 |
170
+ | 取消(无未保存) | 点[取消] | — | 直接离开 |
171
+ | 取消(有未保存) | 点[取消] | — | Dialog 确认离开 |
172
+ | 返回(面包屑) | 点击父级 | 有未保存内容 | Dialog 确认 |
173
+
174
+ ### 7.2 异步提交
175
+
176
+ | 类型 | UI | 反馈 |
177
+ | ------------ | ----------------------- | ----------------------------------- |
178
+ | 同步(快速) | 按钮 disabled + Spinner | Toast 结果 |
179
+ | 异步(耗时) | 不阻塞 | Toast「提交成功,后台处理中」+ 轮询 |
180
+
181
+ ### 7.3 操作确认分级
182
+
183
+ | 级别 | 适用 |
184
+ | ---------------- | ---------------- |
185
+ | 一级(可逆) | 保存(校验通过) |
186
+ | 二级(有未保存) | 取消/离开 |
187
+
188
+ ---
189
+
190
+ ## 8. shadcn 表单组合契约
191
+
192
+ > 表单**组合层面**的本地约定。视觉/全局规则参见 [boundaries.md FF1-FF4](../boundaries.md#ff1-ff4--表单专属硬约束)(色块、必填、Card 嵌套、错误文案) + [boundaries.md S2](../boundaries.md#error-s2--不用-space-x---space-y--改用-flex--gap-) (gap 替代 space-y) + [boundaries.md F8](../boundaries.md#error-f8--禁止在-dialogtitle-中加图标--scope-dialog) (DialogTitle 无图标) + [boundaries.md F9](../boundaries.md#error-f9--弹窗确定按钮禁止加-disabled-禁用态--scope-dialog) (提交按钮无 disabled)。
193
+
194
+ - **FC1 表单布局**:`FieldGroup` + `Field`,**禁止** `<div>` + `space-y-*`(并见 S2)
195
+ - **FC2 InputGroup 内子件**:`InputGroupInput` / `InputGroupTextarea`,不用原始 `Input`
196
+ - **FC3 输入 + 按钮**:`InputGroup` + `InputGroupAddon`
197
+ - **FC4 2~5 选项**:`RadioGroup variant="button"`,**禁止**循环 `Button` 手动 active
198
+ - **FC5 相关选项组**:`FieldSet` + `FieldLegend`
199
+ - **FC6 校验态**:`data-invalid` 在 `Field`、`aria-invalid` 在控件 (与 FF1 配合)
200
+ - **反馈**:`import { toast } from "sonner"` (并见 [boundaries.md C9](../boundaries.md#warn-c9--toast-用-sonner))
201
+
202
+ ---
203
+
204
+ ## 9. 嵌套约束
205
+
206
+ | 父子关系 | 状态 |
207
+ | -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
208
+ | PageShell(background="muted", sidebar=OpSidebar) → OpPageContainer(header=PageHeader) → FieldGroup / SubmitBar | ALLOW |
209
+ | OpPageContainer → Card(分区) | ALLOW(分区表单可在内置大白卡里再用 Card 划分若干小节) |
210
+ | Card(分区) → FieldGroup | ALLOW |
211
+ | Card(分区) → Card | **FORBID**(分区 Card 不可再嵌套) |
212
+ | FieldGroup → Field | ALLOW |
213
+ | Field → Input / Select / Switch / RadioGroup / InputNumber / Textarea | ALLOW |
214
+ | Field → InputGroup | ALLOW |
215
+ | Card → Form | **FORBID**(用 FieldGroup) |
216
+
217
+ ---
218
+
219
+ ## 10. 禁止项
220
+
221
+ | 禁项 | 原因 |
222
+ | --------------------------- | ----------------------------- |
223
+ | DataTable 在主内容区 | 关联数据用 Dialog + DataTable |
224
+ | Chart 在表单页 | 图表属 Dashboard |
225
+ | 内联 Input(不在 Field 内) | 必须 FieldGroup → Field 包装 |
226
+ | 原始 div 表单布局 | 用 FieldGroup + Field |
227
+ | 单页字段 > 15 不分组 | 分区或拆 Wizard |
228
+
229
+ ---
230
+
231
+ ## 11. 表单页特有自检
232
+
233
+ - [ ] PageHeader 用面包屑模式(L2 页面)
234
+ - [ ] 所有 Input 在 Field → FieldGroup 内(FC1)
235
+ - [ ] data-invalid + aria-invalid 双重声明(FC6)
236
+ - [ ] 控件按字段类型选型正确(2~5 选用 RadioGroup variant="button",不循环 Button;数值用 InputNumber,不用 Input[type=number])
237
+ - [ ] SubmitBar 居右 + 按钮顺序:取消 → 上一步 → 主操作
238
+ - [ ] 长表单(> 10)分组或分区
239
+ - [ ] 异步提交:按钮 loading + Spinner
240
+ - [ ] 取消时未保存内容 Dialog 确认
241
+ - [ ] 编辑模式加载用 Skeleton
242
+ - [ ] Toast 用 sonner(C9),不用自定义全局通知
243
+
244
+ ---
245
+
246
+ ## 12. 《Teamix UI 表单设计规范》对齐 Checklist
247
+
248
+ > 详细说明见 [`packages/ui/AGENTS.md` 第六节](../../../../ui/AGENTS.md#六表单族硬规则formfieldfilter-barlabelinput)。本节只列 AI 写表单时的 yes/no 自检项。
249
+
250
+ ### 12.1 间距(11 条硬规则,§3.1)
251
+
252
+ - [ ] label → input 间距:垂直 4px / 水平 16px(由 `Field.orientation` 内置,**禁止**手写 `mt-*` / `gap-3` 覆盖)
253
+ - [ ] error → input:**0px**(`FieldError` 内置 `-mt-1`,防止抖动)
254
+ - [ ] description → input:4px(`FieldDescription` 默认)
255
+ - [ ] 组内行距 20px / 组间距 32px / 详情页 12px(`FieldGroup` / `FieldSection` / `density="detail"`)
256
+ - [ ] checkbox / radio / 文字链 横向:**16px**(`gap-4`,组件内置)
257
+ - [ ] icon 与文字 横向:**4px**(label 内 `文字 ⓘ *`,Label 组件内置)
258
+
259
+ ### 12.2 必填与 a11y(§一 + §六)
260
+
261
+ - [ ] `*` 后置:`<FormLabel required>` / `<FieldLabel required>`,**禁止**手写 `<span>* 邮箱</span>`
262
+ - [ ] input 同步 `aria-required="true"`,纯视觉 `*` 不替代屏幕阅读
263
+ - [ ] invalid 单一真值在 `<Field invalid>`,自动驱动 label 着色 + FieldError 可见 + 控件 ring,**不要**重复给控件传 `aria-invalid`
264
+
265
+ ### 12.3 输入域宽度(5 档,§七)
266
+
267
+ - [ ] 用 `Field.inputWidth="xs|s|m|l|xl"`(104/216/328/440/552px),**禁止**手写 `w-[328px]` 或 `style={{ width: 328 }}`
268
+ - [ ] 子控件用 `style={{ width: 'var(--field-input-width)' }}` 消费
269
+ - [ ] horizontal 模式 label 自动 `max-width = ⅓ 输入域宽`,超长 truncate(`FieldLabel` 内置)
270
+
271
+ ### 12.4 响应式(5 档断点,§4.1-4.2)
272
+
273
+ - [ ] 多栏筛选用 `FilterBarPanel responsiveColumns={{ base, xs, s, m, l, xl }}`,**禁止**手写媒体查询 / `lg:grid-cols-*`
274
+ - [ ] 单栏表单 < 432 自动改上下:`<Field orientation={{ base: 'vertical', xs: 'horizontal' }}>`
275
+ - [ ] 断点用 `useBreakpoint` + `pickByBreakpoint`(`@/hooks/use-breakpoint`),**禁止**手写 `useMediaQuery`
276
+
277
+ ### 12.5 按钮容器感知(§六)
278
+
279
+ - [ ] 用 `FormActions container="page|page-stepper|modal|drawer"` 一次性配齐 position/align/alignWithInput
280
+ - [ ] 决策口径:页面基础/分组 → `page` / 页面分步 → `page-stepper` / 弹窗 → `modal` / 抽屉 → `drawer`
281
+ - [ ] **禁止**裸 `<div className="flex gap-2 justify-end">` 写底部按钮
282
+
283
+ ### 12.6 内容截断三件套(§八)
284
+
285
+ - [ ] 横向宽度受限的字段值 / 长 label / 表格单元格用 `<Ellipsis>`,**禁止**手写 `truncate` + 独立 `<Tooltip>`
286
+ - [ ] 多行截断走 `<Ellipsis lines={2}>`,**禁止**手写 `-webkit-line-clamp`
287
+
288
+ ### 12.7 RHF vs Server Actions 流派(§6.1)
289
+
290
+ - [ ] 用 RHF + zod → 走 `Form / FormField / FormItem / FormLabel / FormMessage`(form 包,FormItem 内部就是 Field)
291
+ - [ ] Server Actions / 原生 form / 简单状态 → 走 `Field / FieldGroup / FieldLabel / FieldError`(field 包)
292
+ - [ ] **禁止**两套混用(Section / Actions 是 re-export 别名,选哪边都行,**不要交叉**)