@teamix-evo/skills 0.5.0 → 0.7.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.
- package/manifest.json +23 -37
- package/package.json +2 -2
- package/src/teamix-evo-design-opentrek/SKILL.md +210 -42
- package/src/teamix-evo-design-opentrek/boundaries.md +3 -3
- package/src/teamix-evo-design-opentrek/components.md +41 -40
- package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-1.html +1069 -0
- package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-instance.html +941 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page-api-doc.html +906 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page-config.html +993 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page-monitor.html +1339 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page.html +933 -0
- package/src/teamix-evo-design-opentrek/examples/settings-page.html +1119 -0
- package/src/teamix-evo-design-opentrek/examples/standard-card-list.html +1094 -0
- package/src/teamix-evo-design-opentrek/examples/standard-table-list.html +1361 -0
- package/src/teamix-evo-design-opentrek/examples/wizard-form-page.html +877 -0
- package/src/teamix-evo-design-opentrek/flows.md +85 -12
- package/src/teamix-evo-design-opentrek/foundations.md +9 -9
- package/src/teamix-evo-design-opentrek/generation-flow.md +15 -3
- package/src/teamix-evo-design-opentrek/pages/detail-page/SKILL.md +260 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/api-doc-detail.md +163 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/comparison-detail.md +100 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/monitor-detail.md +190 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/resource-detail.md +148 -0
- package/src/teamix-evo-design-opentrek/pages/form-page/SKILL.md +362 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/SKILL.md +286 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/action-column-spec.md +60 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/column-meta-rules.md +117 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/search-combo-spec.md +194 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/state-action-pattern.md +51 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/advanced-filter-list.md +94 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list.md +558 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/drawer-list.md +76 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/expandable-list.md +70 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/l2-sidebar-list.md +73 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list.md +198 -0
- package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +1 -1
- package/src/teamix-evo-design-opentrek/patterns/detail-page.md +217 -152
- package/src/teamix-evo-design-opentrek/patterns/form-page.md +437 -231
- package/src/teamix-evo-design-opentrek/patterns/list-page.md +220 -292
- package/src/teamix-evo-design-opentrek/patterns/page-types.md +40 -130
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AGENT RUNTIME.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI GATEWAY.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI STUDIO.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_DEV-2.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_LOGO.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_OPS.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +3 -3
- package/src/teamix-evo-design-opentrek/rules/business-mapping.json +124 -0
- package/src/teamix-evo-design-opentrek/rules/common-components.json +924 -0
- package/src/teamix-evo-design-opentrek/rules/component-specs.json +1083 -0
- package/src/teamix-evo-design-opentrek/rules/design-tokens.css +433 -0
- package/src/teamix-evo-design-opentrek/rules/design-tokens.json +2798 -0
- package/src/teamix-evo-design-opentrek/rules/layout-rules.json +218 -0
- package/src/teamix-evo-design-opentrek/rules/page-flow.json +351 -0
- package/src/teamix-evo-design-opentrek/rules/page-frame.json +241 -0
- package/src/teamix-evo-design-opentrek/rules/page-header-spec.md +123 -0
- package/src/teamix-evo-design-opentrek/rules/page-types.json +206 -0
- package/src/teamix-evo-design-opentrek/rules/sidebar-spec.md +217 -0
- package/src/teamix-evo-design-opentrek/rules/styling.json +188 -0
- package/src/teamix-evo-design-opentrek/rules/token-mapping.md +284 -0
- package/src/teamix-evo-design-uni-manager/SKILL.md +1 -1
- package/src/teamix-evo-design-uni-manager/boundaries.md +3 -3
- package/src/teamix-evo-design-uni-manager/brand.md +1 -1
- package/src/teamix-evo-design-uni-manager/components.md +30 -28
- package/src/teamix-evo-design-uni-manager/foundations.md +21 -21
- package/src/teamix-evo-design-uni-manager/generation-flow.md +3 -1
- package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +1 -1
- package/src/teamix-evo-design-uni-manager/patterns/form-page.md +18 -18
- package/src/teamix-evo-design-uni-manager/patterns/list-page.md +29 -29
- package/src/teamix-evo-design-uni-manager/patterns/page-types.md +11 -11
- package/src/teamix-evo-design-uni-manager/philosophy.md +1 -1
- package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +3 -3
- package/src/teamix-evo-manage/SKILL.md +288 -121
- package/src/teamix-evo-upgrade/SKILL.md +298 -0
- 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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
11
|
+
# 表单页技能
|
|
82
12
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
13
|
+
> ⚠️ **本文件是高阶路由索引 + 表单页高阶规则。** > **生成页面时必须读取**:
|
|
14
|
+
>
|
|
15
|
+
> - `../pages/form-page/SKILL.md` — 子技能入口(子类型列表 + 完整布局骨架 + 字段嵌套约束)
|
|
16
|
+
> - `../rules/component-specs.json` — 表单控件 / Steps 等组件精确尺寸约束
|
|
17
|
+
>
|
|
18
|
+
> 本文件仅用于:(1) 了解表单页子类型概览 (2) 快速判断 FormPage vs WizardPage
|
|
88
19
|
|
|
89
|
-
|
|
20
|
+
## 1. 页面类型定义
|
|
90
21
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
### 4.1 智能定位
|
|
22
|
+
**页面类型**: FormPage
|
|
23
|
+
**核心特征**: 用户输入数据 + 字段校验 + 提交
|
|
24
|
+
**识别条件**: 页面包含输入控件(Input/Select/Switch 等)+ 校验规则 + 提交/取消按钮
|
|
96
25
|
|
|
97
|
-
|
|
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
|
-
|
|
28
|
+
| 子类型 | 识别关键词 | 差异特征 |
|
|
29
|
+
| -------- | -------------------- | ------------------------------------------------------------ |
|
|
30
|
+
| 新建表单 | "新建"/"创建"/"新增" | 所有字段为空,标题"新建 XX",保存成功返回列表 |
|
|
31
|
+
| 编辑表单 | "编辑"/"修改" | 所有字段填充数据,标题"编辑 XX",保存后返回原页面 |
|
|
32
|
+
| 复制新建 | "复制"/"克隆" | 字段预填源数据(ID 除外),标题"复制新建 XX",保存后返回列表 |
|
|
103
33
|
|
|
104
|
-
|
|
105
|
-
| ----------- | ------------------------ | ------------------------ |
|
|
106
|
-
| 内容 < 视口 | 自适应 | 跟随内容自然展示 |
|
|
107
|
-
| 内容 > 视口 | max-h:calc(100vh - 48px) | 固定底部,悬浮于表单上方 |
|
|
34
|
+
### FormPage vs WizardPage 区分
|
|
108
35
|
|
|
109
|
-
|
|
36
|
+
| 场景 | 页面类型 | 核心组件 | 判断依据 |
|
|
37
|
+
| ---------------------------- | ---------- | ------------------------------------ | ------------------------------ |
|
|
38
|
+
| 单页表单(所有字段同时可见) | FormPage | Form, FieldGroup, SubmitBar | 字段无顺序依赖,一次性填写提交 |
|
|
39
|
+
| 分步流程(多个有序步骤) | WizardPage | Steps (C27), StepForm, NavigationBar | 步骤间有顺序依赖,需逐步完成 |
|
|
110
40
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
-
|
|
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
|
-
|
|
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
|
-
>
|
|
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
|
-
|
|
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
|
-
###
|
|
105
|
+
### 模式:两列表单(TWO_COL)
|
|
139
106
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
###
|
|
128
|
+
### 模式:分区表单(SECTION)
|
|
148
129
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
360
|
+
分区表单使用 **模式 B 扩展**:
|
|
163
361
|
|
|
164
|
-
|
|
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
|
-
|
|
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
|
-
|
|
177
|
-
| ------------ | ----------------------- | ----------------------------------- |
|
|
178
|
-
| 同步(快速) | 按钮 disabled + Spinner | Toast 结果 |
|
|
179
|
-
| 异步(耗时) | 不阻塞 | Toast「提交成功,后台处理中」+ 轮询 |
|
|
373
|
+
> `rules/design-tokens.css` 是设计 Token 的唯一真相源(:root 变量定义):生成 HTML 原型时需将 :root 变量块嵌入页面 `<style>` 标签;生成 React/TSX 需确保项目已通过 `@import` 引入该 CSS 文件。
|
|
180
374
|
|
|
181
|
-
|
|
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.
|
|
392
|
+
## 8. 表单布局精确规格
|
|
191
393
|
|
|
192
|
-
>
|
|
394
|
+
> 来源:合并自原 `rules/forms.json` formLayoutSpecs / formComponentHeights / fieldOrientation。
|
|
395
|
+
> 这是 horizontal 表单(左 label + 右控件,常见于设置页)的精确数值规范。Vertical 默认布局(label 在控件上方)使用 [foundations.md §3.5 表单专用三档间距](../foundations.md) 即可。
|
|
193
396
|
|
|
194
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
436
|
+
### 8.4 form-control 容器
|
|
232
437
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
-
|
|
237
|
-
-
|
|
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
|
-
|
|
446
|
+
字段下方的辅助说明文本(用法提示、格式说明):
|
|
247
447
|
|
|
248
|
-
|
|
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
|
-
|
|
455
|
+
> Switch 横排布局例外:当 Switch 与描述文本同行(`display: flex; align-items: center; gap: 8px`),description 的 `margin-top` 设为 `0`。
|
|
251
456
|
|
|
252
|
-
|
|
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
|
-
|
|
459
|
+
表单页底部操作栏(行动点容器):
|
|
260
460
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
470
|
+
> 与 Dialog/Sheet Footer 的固定底部策略一致。CSS 模板见 §4 SubmitBar / Footer 定位规则。
|
|
266
471
|
|
|
267
|
-
|
|
268
|
-
- [ ] 子控件用 `style={{ width: 'var(--field-input-width)' }}` 消费
|
|
269
|
-
- [ ] horizontal 模式 label 自动 `max-width = ⅓ 输入域宽`,超长 truncate(`FieldLabel` 内置)
|
|
472
|
+
### 8.7 表单组件高度统一规范
|
|
270
473
|
|
|
271
|
-
|
|
474
|
+
配置表单(单行排列)的主要输入类组件统一采用 **32px** 高度(`var(--input-height)`)以实现视觉对齐:
|
|
272
475
|
|
|
273
|
-
|
|
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
|
-
|
|
478
|
+
**例外组件**:
|
|
278
479
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
489
|
+
**验证**:表单行内同行排列的 Input、Select、Combobox、Stepper 应视觉对齐(相同基线),无明显高度差异。
|
|
284
490
|
|
|
285
|
-
|
|
286
|
-
- [ ] 多行截断走 `<Ellipsis lines={2}>`,**禁止**手写 `-webkit-line-clamp`
|
|
491
|
+
### 8.8 字段必填/选填标识
|
|
287
492
|
|
|
288
|
-
|
|
493
|
+
> 这是 [boundaries.md FF4](../boundaries.md) 的精确数值规范。
|
|
289
494
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
495
|
+
| 标识 | 实现 |
|
|
496
|
+
| ---- | ------------------------------------------------------------------------------------------------------------------ |
|
|
497
|
+
| 必填 | `<span className="required text-destructive">*</span>`,`font-size: 14px`,`margin-left: 2px`,紧跟 label 文字之后 |
|
|
498
|
+
| 选填 | **不展示标识**(已移除"选填"文案)— 仅通过必填星号区分,未标星号即为选填 |
|