@teamix-evo/skills 0.4.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 (97) hide show
  1. package/README.md +7 -3
  2. package/manifest.json +3 -2
  3. package/package.json +2 -2
  4. package/src/teamix-evo-code-opentrek/SKILL.md +12 -10
  5. package/src/teamix-evo-code-opentrek/api-layering.md +8 -5
  6. package/src/teamix-evo-code-opentrek/checklist.md +2 -0
  7. package/src/teamix-evo-code-opentrek/error-and-loading.md +38 -25
  8. package/src/teamix-evo-code-opentrek/file-structure.md +63 -54
  9. package/src/teamix-evo-code-opentrek/forms-and-validation.md +14 -12
  10. package/src/teamix-evo-code-opentrek/reuse-first.md +2 -0
  11. package/src/teamix-evo-code-opentrek/routing-and-codesplit.md +23 -21
  12. package/src/teamix-evo-code-opentrek/testing.md +32 -28
  13. package/src/teamix-evo-code-uni-manager/SKILL.md +12 -10
  14. package/src/teamix-evo-code-uni-manager/api-layering.md +2 -0
  15. package/src/teamix-evo-code-uni-manager/checklist.md +2 -0
  16. package/src/teamix-evo-code-uni-manager/error-and-loading.md +3 -1
  17. package/src/teamix-evo-code-uni-manager/file-structure.md +2 -0
  18. package/src/teamix-evo-code-uni-manager/forms-and-validation.md +2 -0
  19. package/src/teamix-evo-code-uni-manager/reuse-first.md +3 -1
  20. package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +3 -1
  21. package/src/teamix-evo-code-uni-manager/testing.md +2 -0
  22. package/src/teamix-evo-design-opentrek/SKILL.md +213 -52
  23. package/src/teamix-evo-design-opentrek/boundaries.md +25 -5
  24. package/src/teamix-evo-design-opentrek/brand.md +7 -7
  25. package/src/teamix-evo-design-opentrek/checklist.md +15 -13
  26. package/src/teamix-evo-design-opentrek/components.md +89 -39
  27. package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-1.html +1069 -0
  28. package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-instance.html +941 -0
  29. package/src/teamix-evo-design-opentrek/examples/detail-page-api-doc.html +906 -0
  30. package/src/teamix-evo-design-opentrek/examples/detail-page-config.html +993 -0
  31. package/src/teamix-evo-design-opentrek/examples/detail-page-monitor.html +1339 -0
  32. package/src/teamix-evo-design-opentrek/examples/detail-page.html +933 -0
  33. package/src/teamix-evo-design-opentrek/examples/settings-page.html +1119 -0
  34. package/src/teamix-evo-design-opentrek/examples/standard-card-list.html +1094 -0
  35. package/src/teamix-evo-design-opentrek/examples/standard-table-list.html +1361 -0
  36. package/src/teamix-evo-design-opentrek/examples/wizard-form-page.html +877 -0
  37. package/src/teamix-evo-design-opentrek/flows.md +85 -12
  38. package/src/teamix-evo-design-opentrek/foundations.md +12 -9
  39. package/src/teamix-evo-design-opentrek/generation-flow.md +84 -14
  40. package/src/teamix-evo-design-opentrek/pages/detail-page/SKILL.md +260 -0
  41. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/api-doc-detail.md +163 -0
  42. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/comparison-detail.md +100 -0
  43. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/monitor-detail.md +190 -0
  44. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/resource-detail.md +148 -0
  45. package/src/teamix-evo-design-opentrek/pages/form-page/SKILL.md +362 -0
  46. package/src/teamix-evo-design-opentrek/pages/list-page/SKILL.md +286 -0
  47. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/action-column-spec.md +60 -0
  48. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/column-meta-rules.md +117 -0
  49. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/search-combo-spec.md +194 -0
  50. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/state-action-pattern.md +51 -0
  51. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/advanced-filter-list.md +94 -0
  52. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list.md +558 -0
  53. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/drawer-list.md +76 -0
  54. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/expandable-list.md +70 -0
  55. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/l2-sidebar-list.md +73 -0
  56. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list.md +198 -0
  57. package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
  58. package/src/teamix-evo-design-opentrek/patterns/dashboard.md +2 -0
  59. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +218 -152
  60. package/src/teamix-evo-design-opentrek/patterns/form-page.md +437 -228
  61. package/src/teamix-evo-design-opentrek/patterns/list-page.md +221 -260
  62. package/src/teamix-evo-design-opentrek/patterns/page-types.md +40 -125
  63. package/src/teamix-evo-design-opentrek/philosophy.md +7 -5
  64. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AGENT RUNTIME.svg +1 -0
  65. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI GATEWAY.svg +1 -0
  66. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI STUDIO.svg +1 -0
  67. package/src/teamix-evo-design-opentrek/rules/_assets/OP_DEV-2.svg +1 -0
  68. package/src/teamix-evo-design-opentrek/rules/_assets/OP_LOGO.svg +1 -0
  69. package/src/teamix-evo-design-opentrek/rules/_assets/OP_OPS.svg +1 -0
  70. package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +3 -3
  71. package/src/teamix-evo-design-opentrek/rules/business-mapping.json +124 -0
  72. package/src/teamix-evo-design-opentrek/rules/common-components.json +924 -0
  73. package/src/teamix-evo-design-opentrek/rules/component-specs.json +1083 -0
  74. package/src/teamix-evo-design-opentrek/rules/design-tokens.css +433 -0
  75. package/src/teamix-evo-design-opentrek/rules/design-tokens.json +2798 -0
  76. package/src/teamix-evo-design-opentrek/rules/layout-rules.json +218 -0
  77. package/src/teamix-evo-design-opentrek/rules/page-flow.json +351 -0
  78. package/src/teamix-evo-design-opentrek/rules/page-frame.json +241 -0
  79. package/src/teamix-evo-design-opentrek/rules/page-header-spec.md +123 -0
  80. package/src/teamix-evo-design-opentrek/rules/page-types.json +206 -0
  81. package/src/teamix-evo-design-opentrek/rules/sidebar-spec.md +217 -0
  82. package/src/teamix-evo-design-opentrek/rules/styling.json +188 -0
  83. package/src/teamix-evo-design-opentrek/rules/token-mapping.md +284 -0
  84. package/src/teamix-evo-design-uni-manager/SKILL.md +18 -27
  85. package/src/teamix-evo-design-uni-manager/boundaries.md +7 -4
  86. package/src/teamix-evo-design-uni-manager/brand.md +1 -1
  87. package/src/teamix-evo-design-uni-manager/components.md +33 -28
  88. package/src/teamix-evo-design-uni-manager/foundations.md +24 -21
  89. package/src/teamix-evo-design-uni-manager/generation-flow.md +46 -8
  90. package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +3 -1
  91. package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +42 -13
  92. package/src/teamix-evo-design-uni-manager/patterns/form-page.md +67 -30
  93. package/src/teamix-evo-design-uni-manager/patterns/list-page.md +73 -40
  94. package/src/teamix-evo-design-uni-manager/patterns/page-types.md +14 -12
  95. package/src/teamix-evo-design-uni-manager/philosophy.md +4 -2
  96. package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +3 -3
  97. package/src/teamix-evo-manage/SKILL.md +74 -66
@@ -1,289 +1,498 @@
1
- # Form Page — 表单页模式
2
-
3
- > **触发**:用户描述含"新建/创建/编辑/修改/复制/填写"。
4
- > **核心特征**:用户输入数据 + 字段校验 + 提交。
5
- > **页面级别**:L2(面包屑模式 PageHeader,自动继承 Sidebar)。弹窗表单 = L0。
6
-
7
1
  ---
8
-
9
- ## 1. 子类型识别
10
-
11
- | 子类型 | 关键词 | 差异特征 |
12
- | ------------ | -------------------- | ---------------------------------------------------------- |
13
- | **新建表单** | "新建"/"创建"/"新增" | 字段为空,标题"新建 XX",保存返回列表 |
14
- | **编辑表单** | "编辑"/"修改" | 字段填充数据,标题"编辑 XX",保存返回原页 |
15
- | **复制新建** | "复制"/"克隆" | 字段预填源数据(ID 除外),标题"复制新建 XX",保存返回列表 |
16
-
17
- ### FormPage vs Wizard 区分
18
-
19
- | 场景 | 类型 | 判断依据 |
20
- | -------------------------- | ---------- | ------------------------ |
21
- | 字段无顺序依赖,一次填写 | FormPage | 单页表单 |
22
- | 步骤间有顺序依赖,逐步完成 | WizardPage | 多步流程,Steps |
23
-
24
- > Wizard 是独立页面类型,不是 FormPage 子类型。
25
-
2
+ name: page-rule-form
3
+ parent: page-rule-system
4
+ description: >
5
+ 表单页(PageType: FormPage)模版规则。包含表单页类型定义、子类型识别、属性模型、
6
+ 标准布局骨架、组件推荐规则及约束、页面交互补充。基于 @teamix-evo/ui 表单规范构建。
7
+ 触发:需要表单页规则、匹配表单页模板、生成表单页。
8
+ Version: 7.0
26
9
  ---
27
10
 
28
- ## 2. 布局模式(三选一)
29
-
30
- ### 2.1 SINGLE_COL(默认)
31
-
32
- ```text
33
- ┌────────────────────────────────────────┐
34
- │ PageHeader: 新建实例 │
35
- │ │
36
- │ FieldGroup │
37
- │ Field [实例名称 *] │
38
- │ Field [地域 ▼] │
39
- │ Field [可用区 ▼] │
40
- │ Field [实例规格 * ▼] │
41
- │ │
42
- │ ───────────────────────── │
43
- │ SubmitBar [取消] [确定] │ ← justify-end
44
- └────────────────────────────────────────┘
45
- ```
11
+ # 表单页技能
46
12
 
47
- ### 2.2 TWO_COL(多字段并排)
13
+ > ⚠️ **本文件是高阶路由索引 + 表单页高阶规则。** > **生成页面时必须读取**:
14
+ >
15
+ > - `../pages/form-page/SKILL.md` — 子技能入口(子类型列表 + 完整布局骨架 + 字段嵌套约束)
16
+ > - `../rules/component-specs.json` — 表单控件 / Steps 等组件精确尺寸约束
17
+ >
18
+ > 本文件仅用于:(1) 了解表单页子类型概览 (2) 快速判断 FormPage vs WizardPage
48
19
 
49
- ```text
50
- FieldGroup
51
- ┌─ 列 1 ──────┐ ┌─ 列 2 ──────┐
52
- │ 用户名 * │ │ 邮箱 * │
53
- │ 角色 * │ │ 状态 │
54
- │ 部门 │ │ 手机号 │
55
- └─────────────┘ └─────────────┘
56
- SubmitBar [取消] [保存]
57
- ```
20
+ ## 1. 页面类型定义
58
21
 
59
- ### 2.3 SECTION(分区表单)
22
+ **页面类型**: FormPage
23
+ **核心特征**: 用户输入数据 + 字段校验 + 提交
24
+ **识别条件**: 页面包含输入控件(Input/Select/Switch 等)+ 校验规则 + 提交/取消按钮
60
25
 
61
- ```text
62
- Card[FieldGroup ─ 基本信息]
63
- 实例名称 *
64
- 类型 * [自研 ○ MySQL ○ PostgreSQL]
26
+ ## 2. 页面子类型识别规则
65
27
 
66
- Card[FieldGroup 网络配置]
67
- 地域 * / VPC * / 交换机 *
28
+ | 子类型 | 识别关键词 | 差异特征 |
29
+ | -------- | -------------------- | ------------------------------------------------------------ |
30
+ | 新建表单 | "新建"/"创建"/"新增" | 所有字段为空,标题"新建 XX",保存成功返回列表 |
31
+ | 编辑表单 | "编辑"/"修改" | 所有字段填充数据,标题"编辑 XX",保存后返回原页面 |
32
+ | 复制新建 | "复制"/"克隆" | 字段预填源数据(ID 除外),标题"复制新建 XX",保存后返回列表 |
68
33
 
69
- Card[FieldGroup 存储配置]
70
- 存储空间 * / 备份策略
34
+ ### FormPage vs WizardPage 区分
71
35
 
72
- SubmitBar [取消] [创建]
73
- ```
36
+ | 场景 | 页面类型 | 核心组件 | 判断依据 |
37
+ | ---------------------------- | ---------- | ------------------------------------ | ------------------------------ |
38
+ | 单页表单(所有字段同时可见) | FormPage | Form, FieldGroup, SubmitBar | 字段无顺序依赖,一次性填写提交 |
39
+ | 分步流程(多个有序步骤) | WizardPage | Steps (C27), StepForm, NavigationBar | 步骤间有顺序依赖,需逐步完成 |
74
40
 
75
- **何时分区**:字段 > 10 / 业务概念分组明显 / 含可选高级配置。
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`
76
46
 
77
- ---
47
+ ## 3. 页面属性模型
78
48
 
79
- ## 3. 必需组件
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),按钮从左到右顺序:取消 → 上一步(如有)→ 下一步/提交 |
80
56
 
81
- | 组件 | 位置 | 说明 |
82
- | --------------------- | ------ | ------------------------------------- |
83
- | **PageHeader** | top | 面包屑模式(L2 页面) |
84
- | **Form / FieldGroup** | center | 表单容器,**禁止**用 div + space-y-\* |
85
- | **SubmitBar** | bottom | 提交操作栏,居右排列 |
57
+ > **框架组件自动继承**:Sidebar、Breadcrumb `rules/page-frame.json` 统一管理,L2 级页面自动包含。弹窗表单(Dialog/FormPage)为 L0 级,无框架组件。
86
58
 
87
- **框架级**(自动继承):Sidebar、Breadcrumb。
88
-
89
- ---
90
-
91
- ## 4. SubmitBar / Footer 规则
92
-
93
- ### 4.1 智能定位
94
-
95
- - Footer **从滚动区域移出**,作为 Card 的直接子元素
96
- - Card:`flex flex-col max-h-[calc(100vh-48px)]`
97
- - 内容区:`flex-1 overflow-y-auto min-h-0`
98
- - Footer:`flex-shrink-0 z-10 bg-card border-t`
99
-
100
- ### 4.2 行为
101
-
102
- | 场景 | Card 高度 | Footer |
103
- | ----------- | ------------------------ | ------------------------ |
104
- | 内容 < 视口 | 自适应 | 跟随内容自然展示 |
105
- | 内容 > 视口 | max-h:calc(100vh - 48px) | 固定底部,悬浮于表单上方 |
106
-
107
- ### 4.3 按钮顺序(从左到右)
108
-
109
- - `[取消]` → `[上一步]`(Wizard 中)→ `[下一步 / 提交 / 保存]`
110
- - 主按钮始终在最右侧(Primary)
111
- - 容器 `justify-end`
112
-
113
- ---
59
+ ## 4. 标准布局骨架
114
60
 
115
- ## 5. 字段控件选型
61
+ ### 模式:单列表单(SINGLE_COL)
116
62
 
117
- > **枚举数量阈值规则(≤7 RadioGroup / 8-30 Select / >30 Combobox)见 [components.md §3.5 输入控件](../components.md#35-输入控件--input-vs-select-vs-combobox)**。本节只列表单页专属补充字段。
118
-
119
- | 字段类型 | 组件 | 说明 |
120
- | ------------- | ---------------------------- | ------------------------ |
121
- | 布尔(设置) | Switch | "启用 X" 类开关 |
122
- | 布尔(表单) | Checkbox | 协议确认 |
123
- | 单选(2~5 项) | ToggleGroup | 类型选择(可视化优于下拉) |
124
- | 验证码 | InputOTP | 短信 / 邮箱 OTP |
125
- | 范围数值 | Slider | 资源配比 / 阈值 |
126
- | 输入 + 按钮 | InputGroup | 复制、单位切换 |
127
- | 文件上传 | FileUpload | 单 / 多文件 |
128
- | 日期 / 时间 | DatePicker / DateRangePicker | — |
129
-
130
- ---
131
-
132
- ## 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
+ ```
133
104
 
134
- ### 6.1 触发时机
105
+ ### 模式:两列表单(TWO_COL)
135
106
 
136
- | 场景 | 触发 |
137
- | ---------- | ---------------- |
138
- | 单字段格式 | blur(失焦) |
139
- | 必填检查 | submit(提交时) |
140
- | 跨字段联动 | change(实时) |
141
- | 后端校验 | 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
+ ```
142
127
 
143
- ### 6.2 视觉反馈
128
+ ### 模式:分区表单(SECTION)
144
129
 
145
- - 错误:`data-invalid` 在 Field 上、`aria-invalid` 在控件上 → 红色边框 + FormMessage 错误描述
146
- - 必填:label 后置 `*` 红色标记
147
- - 字段说明优先 Tooltip(避免行内增加阅读负担)
148
- - 提交失败:聚焦第一个错误字段
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
+ ```
149
164
 
150
- ### 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
+ ```
151
202
 
152
- - 单组字段 6
153
- - > 10 字段必须分区或分步
154
- - 分区用 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 分组)**:
155
354
 
156
- ---
355
+ ```
356
+ 模式A: PageContainer → ContentWrapper → Breadcrumb + PageHeader + FieldGroup + SubmitBar
357
+ 模式B: PageContainer → ContentWrapper → Breadcrumb + PageHeader + Card[FieldGroup] + SubmitBar
358
+ ```
157
359
 
158
- ## 7. 提交交互
360
+ 分区表单使用 **模式 B 扩展**:
159
361
 
160
- ### 7.1 操作流
362
+ ```
363
+ PageContainer → ContentWrapper → Breadcrumb + PageHeader + Card[FieldGroup] + Separator + Card[FieldGroup] + SubmitBar
364
+ ```
161
365
 
162
- | 操作 | 触发 | 前置 | 反馈 |
163
- | ---------------- | ------------ | ------------ | -------------------------------- |
164
- | 保存 | 点[确定] | 本地校验通过 | 校验 → 提交 → Toast「保存成功」 |
165
- | 保存失败 | 后端返回错误 | — | 字段标红 + Toast 错误 + 留在表单 |
166
- | 取消(无未保存) | 点[取消] | — | 直接离开 |
167
- | 取消(有未保存) | 点[取消] | — | Dialog 确认离开 |
168
- | 返回(面包屑) | 点击父级 | 有未保存内容 | Dialog 确认 |
366
+ ## 规范引用
169
367
 
170
- ### 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)
171
372
 
172
- | 类型 | UI | 反馈 |
173
- | ------------ | ----------------------- | ----------------------------------- |
174
- | 同步(快速) | 按钮 disabled + Spinner | Toast 结果 |
175
- | 异步(耗时) | 不阻塞 | Toast「提交成功,后台处理中」+ 轮询 |
373
+ > `rules/design-tokens.css` 是设计 Token 的唯一真相源(:root 变量定义):生成 HTML 原型时需将 :root 变量块嵌入页面 `<style>` 标签;生成 React/TSX 需确保项目已通过 `@import` 引入该 CSS 文件。
176
374
 
177
- ### 7.3 操作确认分级
375
+ ## 7. 验证清单 (Validation Checklist)
178
376
 
179
- | 级别 | 适用 |
180
- | ---------------- | ---------------- |
181
- | 一级(可逆) | 保存(校验通过) |
182
- | 二级(有未保存) | 取消/离开 |
377
+ > **通用检查项**(布局分区/颜色 Token/间距/字体/尺寸/禁用样式/异步操作/空数据/加载中)见根技能 `../../docs/validation-workflow.md` 验证清单。此处仅列出表单页特有检查项。
183
378
 
184
- ---
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 分隔 | 正确 |
185
391
 
186
- ## 8. shadcn 表单组合契约
392
+ ## 8. 表单布局精确规格
187
393
 
188
- > 表单**组合层面**的本地约定。视觉/全局规则参见 [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) 即可。
189
396
 
190
- - **FC1 表单布局**:`FieldGroup` + `Field`,**禁止** `<div>` + `space-y-*`(并见 S2)
191
- - **FC2 InputGroup 内子件**:`InputGroupInput` / `InputGroupTextarea`,不用原始 `Input`
192
- - **FC3 输入 + 按钮**:`InputGroup` + `InputGroupAddon`
193
- - **FC4 2~5 选项**:`ToggleGroup`,**禁止**循环 `Button` 手动 active
194
- - **FC5 相关选项组**:`FieldSet` + `FieldLegend`
195
- - **FC6 校验态**:`data-invalid` 在 `Field`、`aria-invalid` 在控件 (与 FF1 配合)
196
- - **反馈**:`import { toast } from "sonner"` (并见 [boundaries.md C9](../boundaries.md#warn-c9--toast-用-sonner))
397
+ ### 8.1 字段方向 fieldOrientation
197
398
 
198
- ---
399
+ | 取值 | 适用场景 | 描述 |
400
+ | ------------------ | -------------------- | ---------------------------------------------------- |
401
+ | `vertical`(默认) | 新建/编辑表单 | label 在控件上方,自上而下排列 |
402
+ | `horizontal` | 设置/详情类 settings | label 在控件左侧,`<Field orientation="horizontal">` |
199
403
 
200
- ## 9. 嵌套约束
404
+ ### 8.2 form-row 布局规格(horizontal)
201
405
 
202
- | 父子关系 | 状态 |
203
- | --------------------------------------------------------------------------------- | --------------------------- |
204
- | PageContainer → ContentWrapper → Card(白卡) → PageHeader / FieldGroup / SubmitBar | ALLOW |
205
- | ContentWrapper → 业务组件(无 Card) | **FORBID** |
206
- | Card → Card | **FORBID**(白卡单例) |
207
- | Card(白卡) → Card(分区) | ALLOW(分区表单内嵌) |
208
- | Card(分区) → FieldGroup | ALLOW |
209
- | FieldGroup → Field | ALLOW |
210
- | Field → Input / Select / Switch / ToggleGroup / Textarea | ALLOW |
211
- | Field → InputGroup | ALLOW |
212
- | Card → Form | **FORBID**(用 FieldGroup) |
406
+ 对应 [boundaries.md F7](../boundaries.md) 的精确数值规范。
213
407
 
214
- ---
408
+ | 属性 | 值 | CSS 变量 |
409
+ | ----------- | ------------------------------- | ---------------- |
410
+ | display | `flex` | — |
411
+ | align-items | `center` | — |
412
+ | gap | `24px` | `var(--gap-2xl)` |
413
+ | padding | `12px 0` | — |
414
+ | border-top | 无(仅 Section 之间保留分割线) | — |
215
415
 
216
- ## 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
+ ```
217
424
 
218
- | 禁项 | 原因 |
219
- | --------------------------- | ----------------------------- |
220
- | DataTable 在主内容区 | 关联数据用 Dialog + DataTable |
221
- | Chart 在表单页 | 图表属 Dashboard |
222
- | 内联 Input(不在 Field 内) | 必须 FieldGroup → Field 包装 |
223
- | 原始 div 表单布局 | 用 FieldGroup + Field |
224
- | 单页字段 > 15 不分组 | 分区或拆 Wizard |
425
+ ### 8.3 form-label 规格(horizontal)
225
426
 
226
- ---
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` 控制,与所有控件中线对齐 | — |
227
435
 
228
- ## 11. 表单页特有自检
436
+ ### 8.4 form-control 容器
229
437
 
230
- - [ ] PageHeader 用面包屑模式(L2 页面)
231
- - [ ] 所有 Input 在 Field → FieldGroup 内(FC1)
232
- - [ ] data-invalid + aria-invalid 双重声明(FC6)
233
- - [ ] 控件按字段类型选型正确(2~5 选用 ToggleGroup,不循环 Button)
234
- - [ ] SubmitBar 居右 + 按钮顺序:取消 → 上一步 → 主操作
235
- - [ ] 长表单(> 10)分组或分区
236
- - [ ] 异步提交:按钮 loading + Spinner
237
- - [ ] 取消时未保存内容 Dialog 确认
238
- - [ ] 编辑模式加载用 Skeleton
239
- - [ ] Toast 用 sonner(C9),不用自定义全局通知
438
+ | 属性 | 值 |
439
+ | --------- | ------- |
440
+ | flex | `1` |
441
+ | min-width | `0` |
442
+ | max-width | `400px` |
240
443
 
241
- ---
444
+ ### 8.5 form-description 辅助说明
242
445
 
243
- ## 12. 《Teamix UI 表单设计规范》对齐 Checklist
446
+ 字段下方的辅助说明文本(用法提示、格式说明):
244
447
 
245
- > 详细说明见 [`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` | — |
246
454
 
247
- ### 12.1 间距(11 条硬规则,§3.1)
455
+ > Switch 横排布局例外:当 Switch 与描述文本同行(`display: flex; align-items: center; gap: 8px`),description 的 `margin-top` 设为 `0`。
248
456
 
249
- - [ ] label → input 间距:垂直 4px / 水平 16px(由 `Field.orientation` 内置,**禁止**手写 `mt-*` / `gap-3` 覆盖)
250
- - [ ] error → input:**0px**(`FieldError` 内置 `-mt-1`,防止抖动)
251
- - [ ] description → input:4px(`FieldDescription` 默认)
252
- - [ ] 组内行距 20px / 组间距 32px / 详情页 12px(`FieldGroup` / `FieldSection` / `density="detail"`)
253
- - [ ] checkbox / radio / 文字链 横向:**16px**(`gap-4`,组件内置)
254
- - [ ] icon 与文字 横向:**4px**(label 内 `文字 ⓘ *`,Label 组件内置)
457
+ ### 8.6 form-footer SubmitBar 规格
255
458
 
256
- ### 12.2 必填与 a11y(§一 + §六)
459
+ 表单页底部操作栏(行动点容器):
257
460
 
258
- - [ ] `*` 后置:`<FormLabel required>` / `<FieldLabel required>`,**禁止**手写 `<span>* 邮箱</span>`
259
- - [ ] input 同步 `aria-required="true"`,纯视觉 `*` 不替代屏幕阅读
260
- - [ ] 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))` | — |
261
469
 
262
- ### 12.3 输入域宽度(5 档,§七)
470
+ > Dialog/Sheet Footer 的固定底部策略一致。CSS 模板见 §4 SubmitBar / Footer 定位规则。
263
471
 
264
- - [ ] 用 `Field.inputWidth="xs|s|m|l|xl"`(104/216/328/440/552px),**禁止**手写 `w-[328px]` 或 `style={{ width: 328 }}`
265
- - [ ] 子控件用 `style={{ width: 'var(--field-input-width)' }}` 消费
266
- - [ ] horizontal 模式 label 自动 `max-width = ⅓ 输入域宽`,超长 truncate(`FieldLabel` 内置)
472
+ ### 8.7 表单组件高度统一规范
267
473
 
268
- ### 12.4 响应式(5 档断点,§4.1-4.2)
474
+ 配置表单(单行排列)的主要输入类组件统一采用 **32px** 高度(`var(--input-height)`)以实现视觉对齐:
269
475
 
270
- - [ ] 多栏筛选用 `FilterBarPanel responsiveColumns={{ base, xs, s, m, l, xl }}`,**禁止**手写媒体查询 / `lg:grid-cols-*`
271
- - [ ] 单栏表单 < 432 自动改上下:`<Field orientation={{ base: 'vertical', xs: 'horizontal' }}>`
272
- - [ ] 断点用 `useBreakpoint` + `pickByBreakpoint`(`@/hooks/use-breakpoint`),**禁止**手写 `useMediaQuery`
476
+ **统一 32px 的组件**:`Input` / `Select` / `Combobox` / `ToggleGroup`(`h-8`) / `InputGroup` / `Stepper`
273
477
 
274
- ### 12.5 按钮容器感知(§六)
478
+ **例外组件**:
275
479
 
276
- - [ ] `FormActions container="page|page-stepper|modal|drawer"` 一次性配齐 position/align/alignWithInput
277
- - [ ] 决策口径:页面基础/分组 `page` / 页面分步 → `page-stepper` / 弹窗 → `modal` / 抽屉 → `drawer`
278
- - [ ] **禁止**裸 `<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 对齐 |
279
488
 
280
- ### 12.6 内容截断三件套(§八)
489
+ **验证**:表单行内同行排列的 Input、Select、Combobox、Stepper 应视觉对齐(相同基线),无明显高度差异。
281
490
 
282
- - [ ] 横向宽度受限的字段值 / 长 label / 表格单元格用 `<Ellipsis>`,**禁止**手写 `truncate` + 独立 `<Tooltip>`
283
- - [ ] 多行截断走 `<Ellipsis lines={2}>`,**禁止**手写 `-webkit-line-clamp`
491
+ ### 8.8 字段必填/选填标识
284
492
 
285
- ### 12.7 RHF vs Server Actions 流派(§6.1)
493
+ > 这是 [boundaries.md FF4](../boundaries.md) 的精确数值规范。
286
494
 
287
- - [ ] 用 RHF + zod → 走 `Form / FormField / FormItem / FormLabel / FormMessage`(form 包,FormItem 内部就是 Field)
288
- - [ ] Server Actions / 原生 form / 简单状态 → 走 `Field / FieldGroup / FieldLabel / FieldError`(field 包)
289
- - [ ] **禁止**两套混用(Section / Actions 是 re-export 别名,选哪边都行,**不要交叉**)
495
+ | 标识 | 实现 |
496
+ | ---- | ------------------------------------------------------------------------------------------------------------------ |
497
+ | 必填 | `<span className="required text-destructive">*</span>`,`font-size: 14px`,`margin-left: 2px`,紧跟 label 文字之后 |
498
+ | 选填 | **不展示标识**(已移除"选填"文案)— 仅通过必填星号区分,未标星号即为选填 |