@teamix-evo/skills 0.5.0 → 0.6.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 (72) hide show
  1. package/package.json +2 -2
  2. package/src/teamix-evo-design-opentrek/SKILL.md +210 -42
  3. package/src/teamix-evo-design-opentrek/boundaries.md +3 -3
  4. package/src/teamix-evo-design-opentrek/components.md +41 -40
  5. package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-1.html +1069 -0
  6. package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-instance.html +941 -0
  7. package/src/teamix-evo-design-opentrek/examples/detail-page-api-doc.html +906 -0
  8. package/src/teamix-evo-design-opentrek/examples/detail-page-config.html +993 -0
  9. package/src/teamix-evo-design-opentrek/examples/detail-page-monitor.html +1339 -0
  10. package/src/teamix-evo-design-opentrek/examples/detail-page.html +933 -0
  11. package/src/teamix-evo-design-opentrek/examples/settings-page.html +1119 -0
  12. package/src/teamix-evo-design-opentrek/examples/standard-card-list.html +1094 -0
  13. package/src/teamix-evo-design-opentrek/examples/standard-table-list.html +1361 -0
  14. package/src/teamix-evo-design-opentrek/examples/wizard-form-page.html +877 -0
  15. package/src/teamix-evo-design-opentrek/flows.md +85 -12
  16. package/src/teamix-evo-design-opentrek/foundations.md +9 -9
  17. package/src/teamix-evo-design-opentrek/generation-flow.md +15 -3
  18. package/src/teamix-evo-design-opentrek/pages/detail-page/SKILL.md +260 -0
  19. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/api-doc-detail.md +163 -0
  20. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/comparison-detail.md +100 -0
  21. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/monitor-detail.md +190 -0
  22. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/resource-detail.md +148 -0
  23. package/src/teamix-evo-design-opentrek/pages/form-page/SKILL.md +362 -0
  24. package/src/teamix-evo-design-opentrek/pages/list-page/SKILL.md +286 -0
  25. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/action-column-spec.md +60 -0
  26. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/column-meta-rules.md +117 -0
  27. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/search-combo-spec.md +194 -0
  28. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/state-action-pattern.md +51 -0
  29. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/advanced-filter-list.md +94 -0
  30. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list.md +558 -0
  31. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/drawer-list.md +76 -0
  32. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/expandable-list.md +70 -0
  33. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/l2-sidebar-list.md +73 -0
  34. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list.md +198 -0
  35. package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +1 -1
  36. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +217 -152
  37. package/src/teamix-evo-design-opentrek/patterns/form-page.md +437 -231
  38. package/src/teamix-evo-design-opentrek/patterns/list-page.md +220 -292
  39. package/src/teamix-evo-design-opentrek/patterns/page-types.md +40 -130
  40. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AGENT RUNTIME.svg +1 -0
  41. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI GATEWAY.svg +1 -0
  42. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI STUDIO.svg +1 -0
  43. package/src/teamix-evo-design-opentrek/rules/_assets/OP_DEV-2.svg +1 -0
  44. package/src/teamix-evo-design-opentrek/rules/_assets/OP_LOGO.svg +1 -0
  45. package/src/teamix-evo-design-opentrek/rules/_assets/OP_OPS.svg +1 -0
  46. package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +3 -3
  47. package/src/teamix-evo-design-opentrek/rules/business-mapping.json +124 -0
  48. package/src/teamix-evo-design-opentrek/rules/common-components.json +924 -0
  49. package/src/teamix-evo-design-opentrek/rules/component-specs.json +1083 -0
  50. package/src/teamix-evo-design-opentrek/rules/design-tokens.css +433 -0
  51. package/src/teamix-evo-design-opentrek/rules/design-tokens.json +2798 -0
  52. package/src/teamix-evo-design-opentrek/rules/layout-rules.json +218 -0
  53. package/src/teamix-evo-design-opentrek/rules/page-flow.json +351 -0
  54. package/src/teamix-evo-design-opentrek/rules/page-frame.json +241 -0
  55. package/src/teamix-evo-design-opentrek/rules/page-header-spec.md +123 -0
  56. package/src/teamix-evo-design-opentrek/rules/page-types.json +206 -0
  57. package/src/teamix-evo-design-opentrek/rules/sidebar-spec.md +217 -0
  58. package/src/teamix-evo-design-opentrek/rules/styling.json +188 -0
  59. package/src/teamix-evo-design-opentrek/rules/token-mapping.md +284 -0
  60. package/src/teamix-evo-design-uni-manager/SKILL.md +1 -1
  61. package/src/teamix-evo-design-uni-manager/boundaries.md +3 -3
  62. package/src/teamix-evo-design-uni-manager/brand.md +1 -1
  63. package/src/teamix-evo-design-uni-manager/components.md +30 -28
  64. package/src/teamix-evo-design-uni-manager/foundations.md +21 -21
  65. package/src/teamix-evo-design-uni-manager/generation-flow.md +3 -1
  66. package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +1 -1
  67. package/src/teamix-evo-design-uni-manager/patterns/form-page.md +18 -18
  68. package/src/teamix-evo-design-uni-manager/patterns/list-page.md +29 -29
  69. package/src/teamix-evo-design-uni-manager/patterns/page-types.md +11 -11
  70. package/src/teamix-evo-design-uni-manager/philosophy.md +1 -1
  71. package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +3 -3
  72. package/src/teamix-evo-design-opentrek/patterns/sidebar.md +0 -122
@@ -1,292 +1,498 @@
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
1
  ---
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
-
2
+ name: page-rule-form
3
+ parent: page-rule-system
4
+ description: >
5
+ 表单页(PageType: FormPage)模版规则。包含表单页类型定义、子类型识别、属性模型、
6
+ 标准布局骨架、组件推荐规则及约束、页面交互补充。基于 @teamix-evo/ui 表单规范构建。
7
+ 触发:需要表单页规则、匹配表单页模板、生成表单页。
8
+ Version: 7.0
79
9
  ---
80
10
 
81
- ## 3. 必需组件
11
+ # 表单页技能
82
12
 
83
- | 组件 | 位置 | 说明 |
84
- | --------------------- | ------ | ------------------------------------ |
85
- | **PageHeader** | top | 面包屑模式(L2 页面) |
86
- | **Form / FieldGroup** | center | 表单容器,**禁止**用 div + space-y-\* |
87
- | **SubmitBar** | bottom | 提交操作栏,居右排列 |
13
+ > ⚠️ **本文件是高阶路由索引 + 表单页高阶规则。** > **生成页面时必须读取**:
14
+ >
15
+ > - `../pages/form-page/SKILL.md` 子技能入口(子类型列表 + 完整布局骨架 + 字段嵌套约束)
16
+ > - `../rules/component-specs.json` 表单控件 / Steps 等组件精确尺寸约束
17
+ >
18
+ > 本文件仅用于:(1) 了解表单页子类型概览 (2) 快速判断 FormPage vs WizardPage
88
19
 
89
- **框架级**(自动继承):Sidebar、Breadcrumb。
20
+ ## 1. 页面类型定义
90
21
 
91
- ---
92
-
93
- ## 4. SubmitBar / Footer 规则
94
-
95
- ### 4.1 智能定位
22
+ **页面类型**: FormPage
23
+ **核心特征**: 用户输入数据 + 字段校验 + 提交
24
+ **识别条件**: 页面包含输入控件(Input/Select/Switch 等)+ 校验规则 + 提交/取消按钮
96
25
 
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`
26
+ ## 2. 页面子类型识别规则
101
27
 
102
- ### 4.2 行为
28
+ | 子类型 | 识别关键词 | 差异特征 |
29
+ | -------- | -------------------- | ------------------------------------------------------------ |
30
+ | 新建表单 | "新建"/"创建"/"新增" | 所有字段为空,标题"新建 XX",保存成功返回列表 |
31
+ | 编辑表单 | "编辑"/"修改" | 所有字段填充数据,标题"编辑 XX",保存后返回原页面 |
32
+ | 复制新建 | "复制"/"克隆" | 字段预填源数据(ID 除外),标题"复制新建 XX",保存后返回列表 |
103
33
 
104
- | 场景 | Card 高度 | Footer |
105
- | ----------- | ------------------------ | ------------------------ |
106
- | 内容 < 视口 | 自适应 | 跟随内容自然展示 |
107
- | 内容 > 视口 | max-h:calc(100vh - 48px) | 固定底部,悬浮于表单上方 |
34
+ ### FormPage vs WizardPage 区分
108
35
 
109
- ### 4.3 按钮顺序(从左到右)
36
+ | 场景 | 页面类型 | 核心组件 | 判断依据 |
37
+ | ---------------------------- | ---------- | ------------------------------------ | ------------------------------ |
38
+ | 单页表单(所有字段同时可见) | FormPage | Form, FieldGroup, SubmitBar | 字段无顺序依赖,一次性填写提交 |
39
+ | 分步流程(多个有序步骤) | WizardPage | Steps (C27), StepForm, NavigationBar | 步骤间有顺序依赖,需逐步完成 |
110
40
 
111
- - `[取消]` `[上一步]`(Wizard 中)→ `[下一步 / 提交 / 保存]`
112
- - 主按钮始终在最右侧(Primary)
113
- - 容器 `justify-end`
41
+ > **注意**:WizardPage 是独立的页面类型,不是 FormPage 的子类型。如需设计分步表单,请参考:
42
+ >
43
+ > - 页面类型定义:`rules/page-types.json` → WizardPage
44
+ > - 组件规范:`rules/component-specs.json` → C27-Steps
45
+ > - 示例实现:`page-rule-examples/wizard-form-page.html`
114
46
 
115
- ---
47
+ ## 3. 页面属性模型
116
48
 
117
- ## 5. 字段控件选型
49
+ | 属性 | 值 | 说明 |
50
+ | --------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
51
+ | layout.type | SINGLE_COL / GRID | 简单表单 SINGLE_COL,多列表单 GRID |
52
+ | layout.frame | L2 | 表单页为 L2 级页面,自动继承 Sidebar(含 Logo+产品名),PageHeader 使用面包屑基础组件模式 |
53
+ | responsive | Desktop: 单列/多列, Tablet: 单列, Mobile: 不推荐 |
54
+ | form.layout | SINGLE_COL(默认), TWO_COL(多字段), SECTION(分区) |
55
+ | submit.position | bottom | flex 布局,所有行动点居右排列(justify-content: flex-end),按钮从左到右顺序:取消 → 上一步(如有)→ 下一步/提交 |
118
56
 
119
- > **枚举数量阈值规则(≤7 RadioGroup / 8-30 Select / >30 Combobox)见 [components.md §3.5 输入控件](../components.md#35-输入控件--input-vs-select-vs-combobox)**。本节只列表单页专属补充字段。
57
+ > **框架组件自动继承**:Sidebar、Breadcrumb `rules/page-frame.json` 统一管理,L2 级页面自动包含。弹窗表单(Dialog/FormPage)为 L0 级,无框架组件。
120
58
 
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 | — |
59
+ ## 4. 标准布局骨架
133
60
 
134
- ---
61
+ ### 模式:单列表单(SINGLE_COL)
135
62
 
136
- ## 6. 字段校验规则
63
+ ```
64
+ ┌─────────────────────────────────────────────────────────┐
65
+ │ ┌─ Card(白卡容器) ──────────────────────────────────┐ │
66
+ │ │ PageHeader (面包屑模式)
67
+ │ │ 新建实例 │ │
68
+ │ │ Form (SINGLE_COL) │ │
69
+ │ │ ┌─────────────────────────────────────────────┐ │ │
70
+ │ │ │ 实例名称 * │ │ │
71
+ │ │ │ ┌───────────────────────────────────────┐ │ │ │
72
+ │ │ │ │ 请输入实例名称 │ │ │ │
73
+ │ │ │ └───────────────────────────────────────┘ │ │ │
74
+ │ │ └─────────────────────────────────────────────┘ │ │
75
+ │ │ ┌─────────────────────────────────────────────┐ │ │
76
+ │ │ │ 地域 │ │ │
77
+ │ │ │ ┌───────────────────────────────────────┐ │ │ │
78
+ │ │ │ │ 华东 1(杭州) ▼ │ │ │ │
79
+ │ │ │ └───────────────────────────────────────┘ │ │ │
80
+ │ │ └─────────────────────────────────────────────┘ │ │
81
+ │ │ ┌─────────────────────────────────────────────┐ │ │
82
+ │ │ │ 可用区 │ │ │
83
+ │ │ │ ┌───────────────────────────────────────┐ │ │ │
84
+ │ │ │ │ 杭州 可用区 G ▼ │ │ │ │
85
+ │ │ │ └───────────────────────────────────────┘ │ │ │
86
+ │ │ ┌─────────────────────────────────────────────┐ │ │
87
+ │ │ 实例规格 * │ │ │
88
+ │ │ ┌─────────────────────────────────────────┐ │ │ │
89
+ │ │ │ ecs.c6.large ▼ │ │ │ │
90
+ │ │ └─────────────────────────────────────────┘ │ │ │
91
+ │ │ └─────────────────────────────────────────────┘ │ │
92
+ │ │ ┌─────────────────────────────────────────────┐ │ │
93
+ │ │ 监控 * │ │ │
94
+ │ │ ┌─────────────────────────────────────────┐ │ │ │
95
+ │ │ │ ○ 开通 │ │ │ │
96
+ │ │ └─────────────────────────────────────────┘ │ │ │
97
+ │ │ └─────────────────────────────────────────────┘ │ │
98
+ │ │ ───────────────────────── │ │
99
+ │ │ SubmitBar (底部操作栏, 居右) │ │
100
+ │ │ [取消] [确定] │ │
101
+ │ └─────────────────────────────────────────────────────┘ │
102
+ └─────────────────────────────────────────────────────────┘
103
+ ```
137
104
 
138
- ### 6.1 触发时机
105
+ ### 模式:两列表单(TWO_COL)
139
106
 
140
- | 场景 | 触发 |
141
- | ---------- | ---------------- |
142
- | 单字段格式 | blur(失焦) |
143
- | 必填检查 | submit(提交时) |
144
- | 跨字段联动 | change(实时) |
145
- | 后端校验 | submit 提交后 |
107
+ ```
108
+ ┌─────────────────────────────────────────────────────────┐
109
+ │ ┌─ Card(白卡容器) ──────────────────────────────────┐ │
110
+ │ │ PageHeader (面包屑模式)
111
+ │ │ 编辑用户 │ │
112
+ │ │ Form (TWO_COL) │ │
113
+ │ │ ┌────── 列 1 ──────┐ ┌────── 列 2 ──────┐ │ │
114
+ │ │ │ 用户名 * │ │ 邮箱 * │ │ │
115
+ │ │ │ [_______________]│ │ [_______________] │ │ │
116
+ │ │ │ 角色 * │ │ 状态 │ │ │
117
+ │ │ │ [选择 ▼] │ │ [● 启用 ○ 禁用] │ │ │
118
+ │ │ │ 部门 │ │ 手机号码 │ │ │
119
+ │ │ │ [选择 ▼] │ │ [_______________] │ │ │
120
+ │ │ └──────────────────┘ └──────────────────┘ │ │
121
+ │ │ ───────────────────────── │ │
122
+ │ │ SubmitBar (居右) │ │
123
+ │ │ [取消] [保存] │ │
124
+ │ └─────────────────────────────────────────────────────┘ │
125
+ └─────────────────────────────────────────────────────────┘
126
+ ```
146
127
 
147
- ### 6.2 视觉反馈
128
+ ### 模式:分区表单(SECTION)
148
129
 
149
- - 错误:`data-invalid` 在 Field 上、`aria-invalid` 在控件上 → 红色边框 + FormMessage 错误描述
150
- - 必填:label 后置 `*` 红色标记
151
- - 字段说明优先 Tooltip(避免行内增加阅读负担)
152
- - 提交失败:聚焦第一个错误字段
130
+ ```
131
+ ┌─────────────────────────────────────────────────────────┐
132
+ │ ┌─ Card(白卡容器) ──────────────────────────────────┐ │
133
+ │ │ PageHeader (面包屑模式)
134
+ │ │ 创建数据库 │ │
135
+ │ │ Form (SECTION) │ │
136
+ │ │ ┌─── 基本信息 ───────────────────────────────┐ │ │
137
+ │ │ │ 实例名称 * │ │ │
138
+ │ │ │ ┌──────────────────────────────────────┐ │ │ │
139
+ │ │ │ │ 请输入实例名称 │ │ │ │
140
+ │ │ │ └──────────────────────────────────────┘ │ │ │
141
+ │ │ │ 类型 * │ │ │
142
+ │ │ │ [自研 ○ MySQL ○ PostgreSQL ○ Redis] │ │ │
143
+ │ │ └───────────────────────────────────────────┘ │ │
144
+ │ │ ┌─── 网络配置 ───────────────────────────────┐ │ │
145
+ │ │ │ 地域 * │ │ │
146
+ │ │ │ [选择 ▼] │ │ │
147
+ │ │ │ VPC * │ │ │
148
+ │ │ │ [选择 ▼] │ │ │
149
+ │ │ │ 交换机 * │ │ │
150
+ │ │ │ [选择 ▼] │ │ │
151
+ │ │ └───────────────────────────────────────────┘ │ │
152
+ │ │ ┌─── 存储配置 ───────────────────────────────┐ │ │
153
+ │ │ │ 存储空间 * │ │ │
154
+ │ │ │ [ 100 ] GB │ │ │
155
+ │ │ │ 备份策略 │ │ │
156
+ │ │ │ [● 自动 ○ 手动] │ │ │
157
+ │ │ └───────────────────────────────────────────┘ │ │
158
+ │ │ ───────────────────────── │ │
159
+ │ │ SubmitBar (居右) │ │
160
+ │ │ [取消] [创建] │ │
161
+ │ └───────────────────────────────────────────────────┘ │
162
+ └─────────────────────────────────────────────────────────┘
163
+ ```
153
164
 
154
- ### 6.3 长表单分组
165
+ ### SubmitBar / Footer 定位规则
166
+
167
+ 表单页(FormPage)的 SubmitBar 采用 **智能定位** 策略:
168
+
169
+ **布局结构**:
170
+
171
+ - Footer(SubmitBar)从滚动区域(card-scrollable)中 **移出**,作为 Card 的 **直接子元素**
172
+ - Card 使用 `display: flex; flex-direction: column`
173
+ - card-scrollable 使用 `flex: 1 1 auto; overflow-y: auto; min-height: 0`
174
+ - Footer 使用 `flex-shrink: 0` 固定高度
175
+
176
+ **行为定义**:
177
+ | 场景 | Card 高度 | Footer 位置 | 内容区 |
178
+ |------|----------|------------|--------|
179
+ | 浏览器高度 ≥ 内容总高度 | 内容自适应(不拉伸) | 跟随表单内容自然展示 | 无滚动 |
180
+ | 浏览器高度 < 内容总高度 | `max-height: calc(100vh - 2 × page-container-padding)` | 固定在 Card 底部,悬浮于表单上方 | 内容区滚动 |
181
+
182
+ **CSS 模板**:
183
+
184
+ ```css
185
+ .card {
186
+ display: flex;
187
+ flex-direction: column;
188
+ max-height: calc(100vh - 48px);
189
+ }
190
+ .card-scrollable {
191
+ flex: 1 1 auto;
192
+ overflow-y: auto;
193
+ min-height: 0;
194
+ }
195
+ .settings-footer {
196
+ flex-shrink: 0;
197
+ z-index: 10;
198
+ background: hsl(var(--card));
199
+ border-top: 1px solid hsl(var(--gray-line));
200
+ }
201
+ ```
155
202
 
156
- - 单组字段 6
157
- - > 10 字段必须分区或分步
158
- - 分区用 Card 内嵌 FieldGroup
203
+ **参考**:与 Dialog/Sheet Footer 的固定底部策略一致(component-specs.json C18/C19)。
204
+
205
+ ### Settings Section 样式规范
206
+
207
+ | 属性 | 值 | 说明 |
208
+ | ------------------ | --------------------------------------------- | -------------------------------- |
209
+ | Section padding | `var(--card-gap) 0` (16px 0) | 上下内边距 |
210
+ | Section 间分割线 | `border-top: 1px solid hsl(var(--gray-line))` | 仅 Section 之间有分割线 |
211
+ | Section 标题字号 | 16px | — |
212
+ | Section 标题字重 | 600 (semibold) | — |
213
+ | Section 标题颜色 | `hsl(var(--gray-title))` | — |
214
+ | Section 标题下间距 | 12px (--gap-lg) | margin-bottom |
215
+ | Section 描述字号 | 13px (--font-size-sm) | — |
216
+ | Section 描述颜色 | `hsl(var(--gray-secondary))` | — |
217
+ | Section 描述下间距 | 20px (--gap-xl) | margin-bottom,距第一个 form-row |
218
+
219
+ ## 5. 组件推荐规则及约束
220
+
221
+ ### 必需组件
222
+
223
+ | 组件 | 引用 | 层级 | 位置 | 说明 |
224
+ | ---------- | ---------- | -------- | ------ | ------------------------------- |
225
+ | PageHeader | — | ORGANISM | top | 页面标题(如"新建实例") |
226
+ | Form | FieldGroup | ORGANISM | center | 表单容器,替代 div + space-y-\* |
227
+ | SubmitBar | — | ORGANISM | bottom | 提交操作栏,底部固定 |
228
+
229
+ > **框架级组件**(自动继承,无需在此声明):Sidebar、Breadcrumb 由 `rules/page-frame.json` 统一管理,L2 级页面自动包含。弹窗表单(Dialog 内)为 L0 级,无框架组件。
230
+
231
+ ### 可选组件
232
+
233
+ | 组件 | 引用 | 条件 | 说明 |
234
+ | ----------- | ----------- | -------------- | ---------------------- |
235
+ | Select | Select | 下拉选择字段 | 地域、类型等预定义选项 |
236
+ | Combobox | Combobox | 可搜索下拉 | 数据量大的选项 |
237
+ | Switch | Switch | 布尔字段(设置) | 监控、备份等开关 |
238
+ | Checkbox | Checkbox | 布尔字段(表单) | 协议确认等 |
239
+ | RadioGroup | RadioGroup | 单选(少量) | 类型选择 |
240
+ | ToggleGroup | ToggleGroup | 2-5 选项切换 | 替代 Button 循环 |
241
+ | InputOTP | InputOTP | 验证码输入 | 短信/邮箱验证 |
242
+ | Textarea | Textarea | 多行文本 | 描述、备注 |
243
+ | Slider | Slider | 范围选择 | 数值范围调节 |
244
+ | Dialog | Dialog | 删除/二次确认 | 取消时弹窗确认 |
245
+ | Badge | Badge | 状态标识 | 字段状态标记 |
246
+ | Tooltip | Tooltip | 字段说明 | 复杂字段悬浮提示 |
247
+ | Alert | Alert | 操作提示 | 危险操作预警 |
248
+ | Sonner | Sonner | 操作反馈 | 保存成功/失败 |
249
+ | Separator | Separator | 分区之间 | 替代 hr |
250
+ | Skeleton | Skeleton | 加载时 | 编辑模式加载数据时 |
251
+
252
+ ### 禁止组件
253
+
254
+ > **枚举数量阈值规则(≤7 RadioGroup / 8-30 Select / >30 补搜索候选)见 [components.md §3.5 输入控件](../components.md#35-输入控件--input-vs-select-vs-autocomplete)**。
255
+
256
+ | 组件 | 约束 | 原因 |
257
+ | ----------------- | ------------------------ | ------------------------------------------- |
258
+ | DataTable | 禁止出现在表单页主内容区 | 如需选择关联数据,用 Dialog + DataTable |
259
+ | Chart | 禁止出现在表单页 | 图表属于 Dashboard |
260
+ | PageContainer | 禁止嵌套 | 见 `rules/layout-rules.json` |
261
+ | ListPage | 禁止嵌套 | 表单页是页面级组件 |
262
+ | 内联 Input | 禁止不在 Field 内 | 所有 Input 必须在 FieldGroup → Field 内(F1) |
263
+ | 原始 div 表单布局 | 禁止 | 用 FieldGroup + Field 替代(F1) |
264
+
265
+ ### 嵌套约束
266
+
267
+ | 父子关系 | 状态 | 说明 |
268
+ | ----------------------------------------------------------------- | ------ | -------------------------------------- |
269
+ | PageContainer → ContentWrapper | ALLOW | 右侧内容大容器(必需) |
270
+ | ContentWrapper → Card(白卡容器) | ALLOW | 白色卡片容器,包裹所有业务内容(必需) |
271
+ | Card(白卡容器) → Breadcrumb | ALLOW | 标准结构 |
272
+ | Card(白卡容器) → PageHeader | ALLOW | 标准结构 |
273
+ | Card(白卡容器) → FieldGroup | ALLOW | 表单容器 |
274
+ | Card(白卡容器) → SubmitBar | ALLOW | 底部提交栏 |
275
+ | ContentWrapper → PageHeader / Breadcrumb / FieldGroup / SubmitBar | FORBID | 业务组件必须经过白卡容器包裹 |
276
+ | Card(白卡容器) → Card(白卡容器) | FORBID | 白卡容器为单例,禁止嵌套 |
277
+ | FieldGroup → Field | ALLOW | 表单字段 |
278
+ | Field → Input/Select/Switch | ALLOW | 表单控件 |
279
+ | Field → ToggleGroup | ALLOW | 选项组控件 |
280
+ | Field → Textarea | ALLOW | 多行文本 |
281
+ | Card(白卡容器) → Card(分区) | ALLOW | 分区表单(内部卡片) |
282
+ | Card(分区) → FieldGroup | ALLOW | 分区内表单 |
283
+ | Card(白卡容器) → Dialog | WARN | 取消确认弹窗由全局状态管理 |
284
+ | Card(白卡容器) → Form | FORBID | Form 应在 FieldGroup 层级 |
285
+ | Field → InputGroup | ALLOW | 输入框组(验证码等场景) |
286
+
287
+ ## 6. 页面交互补充
288
+
289
+ ### 6.1 字段校验
290
+
291
+ | 场景 | 触发 | 视觉反馈 | @teamix-evo/ui 规范 |
292
+ | ------------ | --------- | ------------------- | ------------------------------------------------ |
293
+ | 必填字段为空 | 失焦/提交 | 红色边框 + 错误提示 | data-invalid on Field, aria-invalid on Input(F6) |
294
+ | 格式错误 | 失焦/提交 | 红色边框 + 错误描述 | data-invalid + FieldDescription 展示错误(F6) |
295
+ | 后端校验失败 | 提交后 | 字段标红 + 错误提示 | data-invalid on Field(F6) |
296
+
297
+ ### 6.2 控件选型
298
+
299
+ | 字段场景 | @teamix-evo/ui 组件 | 规范引用 |
300
+ | -------------- | ------------------- | -------------- |
301
+ | 文本输入 | Input | F1 |
302
+ | 下拉选择 | Select | C1(Group 嵌套) |
303
+ | 可搜索下拉 | Combobox | — |
304
+ | 布尔开关(设置) | Switch | F1 |
305
+ | 复选框(表单) | Checkbox | F1,F5 |
306
+ | 单选(2-5 项) | ToggleGroup | F4 |
307
+ | 单选(>7 项) | RadioGroup | F1,F5 |
308
+ | 验证码 | InputOTP | — |
309
+ | 多行文本 | Textarea | F2 |
310
+ | 范围选择 | Slider | — |
311
+ | 输入框+按钮 | InputGroup | F2,F3 |
312
+
313
+ ### 6.3 提交交互
314
+
315
+ | 操作 | 触发 | 前置条件 | 二次确认 | 目标页面/组件 | 返回行为 |
316
+ | --------- | -------------------- | ------------ | ---------------- | ------------------------- | -------------------------------------------------------------- |
317
+ | 保存/提交 | 点击"确定"按钮 | 本地校验通过 | 否 | 校验 → 提交 → 成功 | 新建返回列表, 编辑返回原页, Sonner "保存成功"(C9) |
318
+ | 保存失败 | 提交返回错误 | — | — | — | 字段标红(F6) + Sonner 错误(C9), 留在表单页,聚焦第一个错误字段 |
319
+ | 取消 | 点击"取消"按钮 | 有未保存内容 | 是 (Dialog 确认) | Dialog 确认(有未保存内容) | 确认后离开, 无未保存内容直接离开 |
320
+ | 返回 | 点击 Breadcrumb 返回 | 有未保存内容 | 是 (Dialog 确认) | 返回 ListPage | 保持筛选+分页状态 |
321
+
322
+ ### 异步提交处理
323
+
324
+ | 场景 | 提交后行为 | 反馈方式 |
325
+ | -------------- | --------------------- | ---------------------------------------------------------------- |
326
+ | 同步提交(快速) | 阻塞 UI, 显示 Spinner | SubmitBar 按钮 disabled + `<Spinner data-icon="inline-start" />` |
327
+ | 异步提交(耗时) | 不阻塞 UI, 后台处理 | Sonner "提交成功, 后台处理中" + 轮询状态 |
328
+
329
+ ### 操作确认规范
330
+
331
+ > 三级确认定义见 `rules/page-flow.json` operationConfirmationLevels。
332
+
333
+ | 确认级别 | 适用操作 |
334
+ | ------------------- | ------------------------- |
335
+ | 一级 (可逆) | 保存/提交(本地校验通过时) |
336
+ | 二级 (有未保存内容) | 取消/离开 |
337
+
338
+ ### 6.4 @teamix-evo/ui 关键交互约定
339
+
340
+ - **表单布局**: 用 `FieldGroup` + `Field`,不用 `div` + `space-y-*`(F1)
341
+ - **字段校验**: `data-invalid` 在 `Field` 上,`aria-invalid` 在控件上(F6)
342
+ - **禁用状态**: `data-disabled` 在 `Field` 上,`disabled` 在控件上(F6)
343
+ - **2-5 选项**: 用 `ToggleGroup`,不用循环 `Button` 手动 active 状态(F4)
344
+ - **相关选项组**: 用 `FieldSet` + `FieldLegend`(F5)
345
+ - **InputGroup**: 内部用 `InputGroupInput`/`InputGroupTextarea`,不用原始 `Input`(F2)
346
+ - **按钮在 input 内**: 用 `InputGroup` + `InputGroupAddon`(F3)
347
+ - **Sonner 反馈**: `import { toast } from "sonner"`(C9)
348
+
349
+ ### 6.5 与 PageContainer 模式对照
350
+
351
+ > 布局模式定义见 `rules/layout-rules.json`
352
+
353
+ 表单页使用 **模式 A(直接内容)或模式 B(Card 分组)**:
159
354
 
160
- ---
355
+ ```
356
+ 模式A: PageContainer → ContentWrapper → Breadcrumb + PageHeader + FieldGroup + SubmitBar
357
+ 模式B: PageContainer → ContentWrapper → Breadcrumb + PageHeader + Card[FieldGroup] + SubmitBar
358
+ ```
161
359
 
162
- ## 7. 提交交互
360
+ 分区表单使用 **模式 B 扩展**:
163
361
 
164
- ### 7.1 操作流
362
+ ```
363
+ PageContainer → ContentWrapper → Breadcrumb + PageHeader + Card[FieldGroup] + Separator + Card[FieldGroup] + SubmitBar
364
+ ```
165
365
 
166
- | 操作 | 触发 | 前置 | 反馈 |
167
- | ---------------- | ------------ | ------------ | -------------------------------- |
168
- | 保存 | 点[确定] | 本地校验通过 | 校验 → 提交 → Toast「保存成功」 |
169
- | 保存失败 | 后端返回错误 | — | 字段标红 + Toast 错误 + 留在表单 |
170
- | 取消(无未保存) | 点[取消] | — | 直接离开 |
171
- | 取消(有未保存) | 点[取消] | — | Dialog 确认离开 |
172
- | 返回(面包屑) | 点击父级 | 有未保存内容 | Dialog 确认 |
366
+ ## 规范引用
173
367
 
174
- ### 7.2 异步提交
368
+ - **读取路径**:见根技能 `../../SKILL.md` §4.5 三阶段读取决策树
369
+ - 阶段 ①:`page-types.json` + `business-mapping.json`
370
+ - 阶段 ②:`page-frame.json` + `layout-rules.json` + `page-flow.json`
371
+ - 阶段 ③(生成 HTML 时):`design-tokens.json` + `design-tokens.css` + `styling.json` + `../boundaries.md` + `../foundations.md`(表单布局精确规格见本文 §8)
175
372
 
176
- | 类型 | UI | 反馈 |
177
- | ------------ | ----------------------- | ----------------------------------- |
178
- | 同步(快速) | 按钮 disabled + Spinner | Toast 结果 |
179
- | 异步(耗时) | 不阻塞 | Toast「提交成功,后台处理中」+ 轮询 |
373
+ > `rules/design-tokens.css` 是设计 Token 的唯一真相源(:root 变量定义):生成 HTML 原型时需将 :root 变量块嵌入页面 `<style>` 标签;生成 React/TSX 需确保项目已通过 `@import` 引入该 CSS 文件。
180
374
 
181
- ### 7.3 操作确认分级
375
+ ## 7. 验证清单 (Validation Checklist)
182
376
 
183
- | 级别 | 适用 |
184
- | ---------------- | ---------------- |
185
- | 一级(可逆) | 保存(校验通过) |
186
- | 二级(有未保存) | 取消/离开 |
377
+ > **通用检查项**(布局分区/颜色 Token/间距/字体/尺寸/禁用样式/异步操作/空数据/加载中)见根技能 `../../docs/validation-workflow.md` 验证清单。此处仅列出表单页特有检查项。
187
378
 
188
- ---
379
+ | 检查项 | 检查点 | 目标 |
380
+ | ------------ | --------------------------------------------------------------------------------- | ---------- |
381
+ | 必需组件 | PageHeader、Form(FieldGroup)、SubmitBar | 100% |
382
+ | 嵌套约束 | PageContainer → ContentWrapper → Breadcrumb + PageHeader + FieldGroup + SubmitBar | 无违规嵌套 |
383
+ | 禁止组件 | 无 DataTable、Chart、内联 Input(不在 Field 内)、原始 div 布局 | 0 个 |
384
+ | 表单布局 | 所有 Input 在 Field → FieldGroup 内(F1) | 正确 |
385
+ | 字段校验 | 必填为空/格式错误/后端校验, data-invalid 正确 | 全部正确 |
386
+ | 控件选型 | 每种字段场景使用正确 @teamix-evo/ui 组件 | 正确 |
387
+ | 提交交互 | 前置条件、确认方式、异步处理 | 正确 |
388
+ | 取消确认 | 未保存内容时 Dialog 确认 | 正确 |
389
+ | 按钮 loading | SubmitBar 按钮 disabled + Spinner(C4) | 正确 |
390
+ | 分区表单 | Card 分组、Separator 分隔 | 正确 |
189
391
 
190
- ## 8. shadcn 表单组合契约
392
+ ## 8. 表单布局精确规格
191
393
 
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)
394
+ > 来源:合并自原 `rules/forms.json` formLayoutSpecs / formComponentHeights / fieldOrientation
395
+ > 这是 horizontal 表单(左 label + 右控件,常见于设置页)的精确数值规范。Vertical 默认布局(label 在控件上方)使用 [foundations.md §3.5 表单专用三档间距](../foundations.md) 即可。
193
396
 
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))
397
+ ### 8.1 字段方向 fieldOrientation
201
398
 
202
- ---
399
+ | 取值 | 适用场景 | 描述 |
400
+ | ------------------ | -------------------- | ---------------------------------------------------- |
401
+ | `vertical`(默认) | 新建/编辑表单 | label 在控件上方,自上而下排列 |
402
+ | `horizontal` | 设置/详情类 settings | label 在控件左侧,`<Field orientation="horizontal">` |
203
403
 
204
- ## 9. 嵌套约束
404
+ ### 8.2 form-row 布局规格(horizontal)
205
405
 
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) |
406
+ 对应 [boundaries.md F7](../boundaries.md) 的精确数值规范。
216
407
 
217
- ---
408
+ | 属性 | 值 | CSS 变量 |
409
+ | ----------- | ------------------------------- | ---------------- |
410
+ | display | `flex` | — |
411
+ | align-items | `center` | — |
412
+ | gap | `24px` | `var(--gap-2xl)` |
413
+ | padding | `12px 0` | — |
414
+ | border-top | 无(仅 Section 之间保留分割线) | — |
218
415
 
219
- ## 10. 禁止项
416
+ ```tsx
417
+ <div className="form-row">
418
+ <FormLabel className="w-[140px] shrink-0">实例名称</FormLabel>
419
+ <div className="flex-1 min-w-0 max-w-[400px]">
420
+ <Input />
421
+ </div>
422
+ </div>
423
+ ```
220
424
 
221
- | 禁项 | 原因 |
222
- | --------------------------- | ----------------------------- |
223
- | DataTable 在主内容区 | 关联数据用 Dialog + DataTable |
224
- | Chart 在表单页 | 图表属 Dashboard |
225
- | 内联 Input(不在 Field 内) | 必须 FieldGroup → Field 包装 |
226
- | 原始 div 表单布局 | 用 FieldGroup + Field |
227
- | 单页字段 > 15 不分组 | 分区或拆 Wizard |
425
+ ### 8.3 form-label 规格(horizontal)
228
426
 
229
- ---
427
+ | 属性 | 值 | CSS 变量 |
428
+ | ----------- | ---------------------------------------------------------- | --------------------------- |
429
+ | width | `140px` | `var(--form-label-width)` |
430
+ | flex-shrink | `0` | — |
431
+ | font-size | `14px` | `var(--font-size-lg)` |
432
+ | font-weight | `500` | `var(--font-weight-medium)` |
433
+ | color | `hsl(var(--gray-primary))` | — |
434
+ | 垂直对齐 | 由 form-row `align-items: center` 控制,与所有控件中线对齐 | — |
230
435
 
231
- ## 11. 表单页特有自检
436
+ ### 8.4 form-control 容器
232
437
 
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),不用自定义全局通知
438
+ | 属性 | 值 |
439
+ | --------- | ------- |
440
+ | flex | `1` |
441
+ | min-width | `0` |
442
+ | max-width | `400px` |
243
443
 
244
- ---
444
+ ### 8.5 form-description 辅助说明
245
445
 
246
- ## 12. 《Teamix UI 表单设计规范》对齐 Checklist
446
+ 字段下方的辅助说明文本(用法提示、格式说明):
247
447
 
248
- > 详细说明见 [`packages/ui/AGENTS.md` 第六节](../../../../ui/AGENTS.md#六表单族硬规则formfieldfilter-barlabelinput)。本节只列 AI 写表单时的 yes/no 自检项。
448
+ | 属性 | 值 | CSS 变量 |
449
+ | ----------- | ---------------------------- | --------------------- |
450
+ | font-size | `13px` | `var(--font-size-sm)` |
451
+ | color | `hsl(var(--gray-secondary))` | — |
452
+ | margin-top | `4px` | — |
453
+ | line-height | `1.5` | — |
249
454
 
250
- ### 12.1 间距(11 条硬规则,§3.1)
455
+ > Switch 横排布局例外:当 Switch 与描述文本同行(`display: flex; align-items: center; gap: 8px`),description 的 `margin-top` 设为 `0`。
251
456
 
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 组件内置)
457
+ ### 8.6 form-footer SubmitBar 规格
258
458
 
259
- ### 12.2 必填与 a11y(§一 + §六)
459
+ 表单页底部操作栏(行动点容器):
260
460
 
261
- - [ ] `*` 后置:`<FormLabel required>` / `<FieldLabel required>`,**禁止**手写 `<span>* 邮箱</span>`
262
- - [ ] input 同步 `aria-required="true"`,纯视觉 `*` 不替代屏幕阅读
263
- - [ ] invalid 单一真值在 `<Field invalid>`,自动驱动 label 着色 + FieldError 可见 + 控件 ring,**不要**重复给控件传 `aria-invalid`
461
+ | 属性 | 值 | CSS 变量 |
462
+ | ---------- | ------------------------------------------------------------------- | --------------- |
463
+ | 对齐 | `justify-content: flex-end`(所有行动点居右排列,禁止左右两端分布) | — |
464
+ | 按钮顺序 | 取消 → 上一步(如有)→ 下一步/提交 | — |
465
+ | height | `72px` | — |
466
+ | gap | — | `var(--gap-sm)` |
467
+ | border-top | `1px solid hsl(var(--gray-line))` | — |
468
+ | background | `hsl(var(--card))` | — |
264
469
 
265
- ### 12.3 输入域宽度(5 档,§七)
470
+ > Dialog/Sheet Footer 的固定底部策略一致。CSS 模板见 §4 SubmitBar / Footer 定位规则。
266
471
 
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` 内置)
472
+ ### 8.7 表单组件高度统一规范
270
473
 
271
- ### 12.4 响应式(5 档断点,§4.1-4.2)
474
+ 配置表单(单行排列)的主要输入类组件统一采用 **32px** 高度(`var(--input-height)`)以实现视觉对齐:
272
475
 
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`
476
+ **统一 32px 的组件**:`Input` / `Select` / `Combobox` / `ToggleGroup`(`h-8`) / `InputGroup` / `Stepper`
276
477
 
277
- ### 12.5 按钮容器感知(§六)
478
+ **例外组件**:
278
479
 
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">` 写底部按钮
480
+ | 组件 | 尺寸 | 对齐方式 | 用途 |
481
+ | ---------------- | ---------------- | --------------------------- | ---------------------------------- |
482
+ | Switch | 28×16px | flex `align-items: center` | 设置类场景开关 |
483
+ | Checkbox | 16×16px | flex `align-items: center` | 表单复选框 |
484
+ | RadioGroup | 16×16px | flex `align-items: center` | 单选组(相关选项用 FieldSet 包裹) |
485
+ | Slider | 4px(轨道) | flex `align-items: center` | 范围滑块 |
486
+ | Textarea | auto(min 80px) | 独占一行 | 多行输入,不与其他控件同行 |
487
+ | SubmitBar Button | 36px | 独立 Footer 容器(72px 高) | 不参与表单行 32px 对齐 |
282
488
 
283
- ### 12.6 内容截断三件套(§八)
489
+ **验证**:表单行内同行排列的 Input、Select、Combobox、Stepper 应视觉对齐(相同基线),无明显高度差异。
284
490
 
285
- - [ ] 横向宽度受限的字段值 / 长 label / 表格单元格用 `<Ellipsis>`,**禁止**手写 `truncate` + 独立 `<Tooltip>`
286
- - [ ] 多行截断走 `<Ellipsis lines={2}>`,**禁止**手写 `-webkit-line-clamp`
491
+ ### 8.8 字段必填/选填标识
287
492
 
288
- ### 12.7 RHF vs Server Actions 流派(§6.1)
493
+ > 这是 [boundaries.md FF4](../boundaries.md) 的精确数值规范。
289
494
 
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 别名,选哪边都行,**不要交叉**)
495
+ | 标识 | 实现 |
496
+ | ---- | ------------------------------------------------------------------------------------------------------------------ |
497
+ | 必填 | `<span className="required text-destructive">*</span>`,`font-size: 14px`,`margin-left: 2px`,紧跟 label 文字之后 |
498
+ | 选填 | **不展示标识**(已移除"选填"文案)— 仅通过必填星号区分,未标星号即为选填 |