@teamix-evo/skills 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/manifest.json +3 -2
- package/package.json +2 -2
- package/src/teamix-evo-code-opentrek/SKILL.md +12 -10
- package/src/teamix-evo-code-opentrek/api-layering.md +8 -5
- package/src/teamix-evo-code-opentrek/checklist.md +2 -0
- package/src/teamix-evo-code-opentrek/error-and-loading.md +38 -25
- package/src/teamix-evo-code-opentrek/file-structure.md +63 -54
- package/src/teamix-evo-code-opentrek/forms-and-validation.md +14 -12
- package/src/teamix-evo-code-opentrek/reuse-first.md +2 -0
- package/src/teamix-evo-code-opentrek/routing-and-codesplit.md +23 -21
- package/src/teamix-evo-code-opentrek/testing.md +32 -28
- package/src/teamix-evo-code-uni-manager/SKILL.md +12 -10
- package/src/teamix-evo-code-uni-manager/api-layering.md +2 -0
- package/src/teamix-evo-code-uni-manager/checklist.md +2 -0
- package/src/teamix-evo-code-uni-manager/error-and-loading.md +3 -1
- package/src/teamix-evo-code-uni-manager/file-structure.md +2 -0
- package/src/teamix-evo-code-uni-manager/forms-and-validation.md +2 -0
- package/src/teamix-evo-code-uni-manager/reuse-first.md +3 -1
- package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +3 -1
- package/src/teamix-evo-code-uni-manager/testing.md +2 -0
- package/src/teamix-evo-design-opentrek/SKILL.md +34 -41
- package/src/teamix-evo-design-opentrek/boundaries.md +22 -2
- package/src/teamix-evo-design-opentrek/brand.md +7 -7
- package/src/teamix-evo-design-opentrek/checklist.md +15 -13
- package/src/teamix-evo-design-opentrek/components.md +60 -11
- package/src/teamix-evo-design-opentrek/foundations.md +3 -0
- package/src/teamix-evo-design-opentrek/generation-flow.md +70 -12
- package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
- package/src/teamix-evo-design-opentrek/patterns/dashboard.md +2 -0
- package/src/teamix-evo-design-opentrek/patterns/detail-page.md +10 -9
- package/src/teamix-evo-design-opentrek/patterns/form-page.md +35 -32
- package/src/teamix-evo-design-opentrek/patterns/list-page.md +80 -47
- package/src/teamix-evo-design-opentrek/patterns/page-types.md +17 -12
- package/src/teamix-evo-design-opentrek/patterns/sidebar.md +122 -0
- package/src/teamix-evo-design-opentrek/philosophy.md +7 -5
- package/src/teamix-evo-design-uni-manager/SKILL.md +17 -26
- package/src/teamix-evo-design-uni-manager/boundaries.md +4 -1
- package/src/teamix-evo-design-uni-manager/components.md +3 -0
- package/src/teamix-evo-design-uni-manager/foundations.md +3 -0
- package/src/teamix-evo-design-uni-manager/generation-flow.md +43 -7
- package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +3 -1
- package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +41 -12
- package/src/teamix-evo-design-uni-manager/patterns/form-page.md +49 -12
- package/src/teamix-evo-design-uni-manager/patterns/list-page.md +44 -11
- package/src/teamix-evo-design-uni-manager/patterns/page-types.md +3 -1
- package/src/teamix-evo-design-uni-manager/philosophy.md +3 -1
- package/src/teamix-evo-manage/SKILL.md +74 -66
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 生成 / 翻新 / 验证流程
|
|
2
2
|
|
|
3
|
-
> AI
|
|
3
|
+
> ⚠️ **本文件是页面级任务的唯一执行路径。每一步都有 GATE 门禁和 MUST READ 文件清单。** > **跳步 = 产出不合规。AI 不得凭"已有知识"省略任何文件读取。**
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -11,11 +11,13 @@
|
|
|
11
11
|
```
|
|
12
12
|
Step 1 需求确认 → Step 2 类型识别 → Step 3 子类型 + 布局
|
|
13
13
|
↓
|
|
14
|
-
Step
|
|
14
|
+
Step 7 自检 ← Step 6 视觉填充 ← Step 5 可用性校验 ← Step 4 组件挑选
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
### Step 1 · 最小 quorum + 默认值
|
|
18
18
|
|
|
19
|
+
📖 **MUST READ**: [philosophy.md](./philosophy.md)(理解"为什么这么做" — 四大原则优先级)+ [brand.md](./brand.md)(视觉调性 + 文案语气基调)
|
|
20
|
+
|
|
19
21
|
**只有两个信息缺一不可**(最小 quorum,缺则反问):
|
|
20
22
|
|
|
21
23
|
- [ ] **页面类型**:ListPage / DetailPage / FormPage / Dashboard / Dialog(缺则按 Step 2 决策树推断)
|
|
@@ -23,13 +25,13 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
23
25
|
|
|
24
26
|
**其他信息全部走默认值,先生成再细化**(避免连环反问让用户失去耐心):
|
|
25
27
|
|
|
26
|
-
| 维度
|
|
27
|
-
|
|
|
28
|
-
| 业务领域
|
|
29
|
-
| 用户角色
|
|
30
|
-
| 核心动作
|
|
31
|
-
| 入口路径
|
|
32
|
-
| 子类型
|
|
28
|
+
| 维度 | 默认 | 何时升级 |
|
|
29
|
+
| -------- | --------------------------------------------------- | ------------------------------------ |
|
|
30
|
+
| 业务领域 | 资源管理 | 用户明确说"工作流 / 报表"等 |
|
|
31
|
+
| 用户角色 | 业务管理员 | 涉及审计 / 审批 / 平台运维等敏感角色 |
|
|
32
|
+
| 核心动作 | CRUD(增 / 删 / 改 / 查 + 列表) | 明确出现"批量 / 审批 / 导出"等关键词 |
|
|
33
|
+
| 入口路径 | 从同名菜单进入,无外部跳转 | 明确说"从 X 跳到 Y" |
|
|
34
|
+
| 子类型 | ListPage→standard / FormPage→single-page / 其余各 1 | 用户提到 wizard / drawer / tabbed 等 |
|
|
33
35
|
|
|
34
36
|
**反问触发条件**(只有以下情况反问,否则直接出方案):
|
|
35
37
|
|
|
@@ -40,6 +42,10 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
40
42
|
|
|
41
43
|
### Step 2 · 页面类型识别
|
|
42
44
|
|
|
45
|
+
🚧 **GATE**: Step 1 必须已产出"页面类型 + 资源实体 + 场景假设"
|
|
46
|
+
|
|
47
|
+
📖 **MUST READ**: [patterns/page-types.md](./patterns/page-types.md) §决策树 + §Zone Map
|
|
48
|
+
|
|
43
49
|
根据 [patterns/page-types.md](./patterns/page-types.md) §决策树匹配类型:
|
|
44
50
|
|
|
45
51
|
```
|
|
@@ -55,6 +61,10 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
55
61
|
|
|
56
62
|
### Step 3 · 子类型识别 + 布局选择
|
|
57
63
|
|
|
64
|
+
🚧 **GATE**: Step 2 必须已产出"页面类型 ID"
|
|
65
|
+
|
|
66
|
+
📖 **MUST READ**: 对应的 `patterns/{type}-page.md` + [flows.md](./flows.md)(涉及用户旅程时)
|
|
67
|
+
|
|
58
68
|
根据页面类型读取对应 `patterns/{type}-page.md`:
|
|
59
69
|
|
|
60
70
|
- 列表页 6 种子类型:`standard / pure-card / standard-card / drawer / expandable / l2-sidebar / advanced-filter`
|
|
@@ -65,6 +75,10 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
65
75
|
|
|
66
76
|
### Step 4 · 组件挑选
|
|
67
77
|
|
|
78
|
+
🚧 **GATE**: Step 3 必须已产出"子类型 ID + 区域骨架"
|
|
79
|
+
|
|
80
|
+
📖 **MUST READ**: [components.md](./components.md) §0 兗底铁律 + §1 双层架构 + §3 决策树 + §5 拼装配方
|
|
81
|
+
|
|
68
82
|
读 [components.md](./components.md) §选型决策树确定组件集:
|
|
69
83
|
|
|
70
84
|
1. 优先使用 `@teamix-evo/ui` 注册表中的稳定组件
|
|
@@ -74,7 +88,35 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
74
88
|
|
|
75
89
|
**输出**:组件清单 + 每个组件的关键 Props。
|
|
76
90
|
|
|
77
|
-
### Step 5 ·
|
|
91
|
+
### Step 5 · 组件可用性校验(新增 gate)
|
|
92
|
+
|
|
93
|
+
🚧 **GATE**: Step 4 必须已产出"组件清单 + 每个组件的关键 Props"
|
|
94
|
+
|
|
95
|
+
> ❗ **此步是 Step 4 → Step 6 的强制闸门**。跳过会导致生成代码引用未安装组件而报错。
|
|
96
|
+
|
|
97
|
+
对 Step 4 选定的每个组件,执行以下校验:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
① MCP find_components(id) 查询注册表
|
|
101
|
+
├─ 命中 entries(活跃) → ②
|
|
102
|
+
├─ 命中 deprecatedEntries 且有 replacedBy → 自动替换为 replacedBy 组件,回到 ①
|
|
103
|
+
├─ 命中 deprecatedEntries 且无 replacedBy → 走 components.md §0 兔底铁律
|
|
104
|
+
└─ 未命中 → 走 components.md §0 兔底铁律(原子件拼装)
|
|
105
|
+
|
|
106
|
+
② 检查目标项目是否已装机
|
|
107
|
+
├─ 已装(grep src/components/ui/<id> 或查 manifest.lock.json)→ ✅ 继续
|
|
108
|
+
└─ 未装 → 输出安装指令:
|
|
109
|
+
「teamix-evo ui add <id>」
|
|
110
|
+
等待装机完成后再进入 Step 6
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**输出**:校验后的最终组件清单(含替换记录)+ 待安装组件列表(若有)。
|
|
114
|
+
|
|
115
|
+
### Step 6 · 视觉填充(Token 绑定)
|
|
116
|
+
|
|
117
|
+
🚧 **GATE**: Step 5 必须已产出"校验后的最终组件清单"
|
|
118
|
+
|
|
119
|
+
📖 **MUST READ**: [foundations.md](./foundations.md) 全文 + [brand.md](./brand.md) §1 视觉五维(圆角/配色/密度/阴影/焦点风格对齐)+ [patterns/color-mapping.md](./patterns/color-mapping.md)(语义色映射表)
|
|
78
120
|
|
|
79
121
|
读 [foundations.md](./foundations.md),所有色彩、间距、字号、圆角、阴影、动效**必须**使用 Token:
|
|
80
122
|
|
|
@@ -91,7 +133,11 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
91
133
|
|
|
92
134
|
**输出**:含 Token 引用的可执行代码 / HTML。
|
|
93
135
|
|
|
94
|
-
### Step
|
|
136
|
+
### Step 7 · 自检
|
|
137
|
+
|
|
138
|
+
🚧 **GATE**: Step 6 必须已产出"含 Token 引用的可执行代码"
|
|
139
|
+
|
|
140
|
+
📖 **MUST READ**: [boundaries.md](./boundaries.md) 全文(38 条硬规则)+ [checklist.md](./checklist.md) 全文
|
|
95
141
|
|
|
96
142
|
对照 [checklist.md](./checklist.md) 10 项逐项验证:
|
|
97
143
|
|
|
@@ -106,6 +152,12 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
106
152
|
|
|
107
153
|
适用关键词:**"改造 / 升级 / 翻新 / 对齐规范 / 重新生成"**。
|
|
108
154
|
|
|
155
|
+
📖 **MUST READ** (全部必读,不得省略):
|
|
156
|
+
|
|
157
|
+
1. [boundaries.md](./boundaries.md) — 硬规则真值
|
|
158
|
+
2. [foundations.md](./foundations.md) — Token 真值
|
|
159
|
+
3. [components.md](./components.md) — 组件选型
|
|
160
|
+
|
|
109
161
|
```
|
|
110
162
|
1. 读取目标页面源码
|
|
111
163
|
2. 扫描违规项(按 boundaries.md F1-F10 + S1-S8)
|
|
@@ -126,6 +178,12 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
126
178
|
|
|
127
179
|
适用关键词:**"检查 / 验证 / 评估 / 是否符合规范"**。
|
|
128
180
|
|
|
181
|
+
📖 **MUST READ** (全部必读,不得省略):
|
|
182
|
+
|
|
183
|
+
1. [boundaries.md](./boundaries.md) — 38 条硬规则
|
|
184
|
+
2. [checklist.md](./checklist.md) — 10 项自检
|
|
185
|
+
3. [foundations.md](./foundations.md) — Token 真值(用于校验是否符合)
|
|
186
|
+
|
|
129
187
|
```
|
|
130
188
|
1. 读取目标页面源码
|
|
131
189
|
2. 逐条对照 boundaries.md
|
|
@@ -162,7 +220,7 @@ Step 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
|
|
|
162
220
|
|
|
163
221
|
| 任务类型 | 何时停止生成 |
|
|
164
222
|
| -------- | --------------------------------- |
|
|
165
|
-
| 生成 | Step
|
|
223
|
+
| 生成 | Step 7 自检全部通过 |
|
|
166
224
|
| 翻新 | 替换清单为空 + 重新对照无违规 |
|
|
167
225
|
| 验证 | 报告完整列出所有违规项 + 修复建议 |
|
|
168
226
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Color Mapping — OpenTrek v4.1 语义色映射表
|
|
2
|
+
|
|
3
|
+
> ⚠️ **Prerequisites**: 你必须由 [generation-flow.md](../generation-flow.md) Step 6(视觉填充)引导到这里,或在翻新路径中处理色彩替换时使用。
|
|
4
|
+
|
|
5
|
+
> AI 在写组件代码时**只**消费下表中的 CSS 变量名,**不**直接写色值。Token 真值见 `tokens/tokens.theme.css`,本文件仅做语义到 token 名的映射。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 主色系(OpenTrek 品牌蓝)
|
|
10
|
+
|
|
11
|
+
| 用途 | 变量 | 备注 |
|
|
12
|
+
| ----------------- | ---------------------------- | --------------------------------- |
|
|
13
|
+
| 主行动 / CTA 按钮 | `--color-primary` | `#0055EE` (hsl(218.6 100% 46.7%)) |
|
|
14
|
+
| primary hover | `--color-primary-hover` | 加深 5% |
|
|
15
|
+
| primary pressed | `--color-primary-pressed` | 加深 10% |
|
|
16
|
+
| primary 高亮辉光 | `--color-primary-glow` | 焦点环 / 强调动效 |
|
|
17
|
+
| primary 文字色 | `--color-primary-foreground` | 主色背景上的文字(白) |
|
|
18
|
+
|
|
19
|
+
**消费规则**:
|
|
20
|
+
|
|
21
|
+
- 仅用于 CTA、当前选中项、品牌标识、Switch/Checkbox 选中态
|
|
22
|
+
- **禁止**用于错误态(错误用 `--color-destructive`)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 2. 状态色(5 档体系)
|
|
27
|
+
|
|
28
|
+
每种状态色提供 5 档:`--color-{X}` / `-foreground` / `-hover` / `-bg` / `-border`。
|
|
29
|
+
|
|
30
|
+
| 状态 | 含义 | 主变量 |
|
|
31
|
+
| ------------- | ----------------------- | --------------------- |
|
|
32
|
+
| `success` | 成功 / 正常 | `--color-success` |
|
|
33
|
+
| `warning` | 警告 / 待办(色相 40°) | `--color-warning` |
|
|
34
|
+
| `destructive` | 错误 / 删除 / 危险 | `--color-destructive` |
|
|
35
|
+
| `info` | 中性提示 / 引导 | `--color-info` |
|
|
36
|
+
|
|
37
|
+
**消费场景对照**:
|
|
38
|
+
|
|
39
|
+
- Alert / Banner → 用 `bg-{X}-bg border-{X}-border text-{X}` 三件套
|
|
40
|
+
- Status Tag / Badge → 用 `bg-{X}/10 text-{X}` 浅底深字
|
|
41
|
+
- 错误输入框 → `aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive`
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 3. 灰阶语义层(gray-\* 8 级)
|
|
46
|
+
|
|
47
|
+
| 用途 | 变量 |
|
|
48
|
+
| ---------------------- | ----------------------------------- |
|
|
49
|
+
| 主要灰底(卡片背景等) | `--color-gray-primary` |
|
|
50
|
+
| 主要灰底文字 | `--color-gray-primary-foreground` |
|
|
51
|
+
| 次要文字 | `--color-gray-secondary-foreground` |
|
|
52
|
+
| 禁用态 | `--color-gray-disabled` |
|
|
53
|
+
| 分隔线 / 边框 | `--color-gray-line` |
|
|
54
|
+
| sidebar 选中底色 | `--color-gray-sidebar-accent` |
|
|
55
|
+
| 弱提示底色 | `--color-gray-muted` |
|
|
56
|
+
| 反白纯白 | `--color-gray-white` |
|
|
57
|
+
|
|
58
|
+
> 与 shadcn 标准槽(`--color-foreground` / `--color-muted` / `--color-border`)并存,提供更细粒度的引用入口。
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 4. 扩展色(accent-10)
|
|
63
|
+
|
|
64
|
+
10 色调色板,用于 Tag 分类、用户头像底色、状态点等区分性场景:
|
|
65
|
+
|
|
66
|
+
`--color-accent-{blue,violet,apricot,indigo,green,magenta,turquoise,orange,berry,olive}`
|
|
67
|
+
|
|
68
|
+
> 选色顺序:blue → violet → apricot → indigo → green → magenta → turquoise → orange → berry → olive
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 5. 数据可视化色(chart-1..10)
|
|
73
|
+
|
|
74
|
+
| 场景 | 推荐范围 |
|
|
75
|
+
| ----------------------- | ---------------------- |
|
|
76
|
+
| 单系列 | `--color-chart-1` |
|
|
77
|
+
| 2-5 系列对比 | `chart-1` … `chart-5` |
|
|
78
|
+
| 6-10 系列(异色高对比) | `chart-1` … `chart-10` |
|
|
79
|
+
|
|
80
|
+
> chart-1 与 primary 同色相,确保单图表场景下视觉延续。
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 6. Sidebar / Topbar 命名空间
|
|
85
|
+
|
|
86
|
+
详见 [sidebar.md §3](./sidebar.md#3-颜色映射v41-品牌化)。**不**使用主色槽(`--color-primary` 等),全部走 `--color-sidebar-*` / `--color-topbar-*`。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 7. AI 生成自检
|
|
91
|
+
|
|
92
|
+
- [ ] 没有出现 `bg-blue-{n}` / `text-red-{n}` / `text-gray-{n}` 等原始 Tailwind 色
|
|
93
|
+
- [ ] 没有出现 `#xxxxxx` 十六进制硬编码
|
|
94
|
+
- [ ] 没有出现 `hsl(...)` 内联值
|
|
95
|
+
- [ ] sidebar 内未消费 `--color-primary`(用 `--color-sidebar-primary`)
|
|
96
|
+
- [ ] 状态语义与变量对应(删除按钮用 `destructive` 而非 `warning`)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Dashboard — 数据概览与监控页
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **Dashboard**,并由 Step 3 引导到这里。
|
|
4
|
+
|
|
3
5
|
> AI 实操路径:Step 2(页面类型识别)判定为 Dashboard 后,本文档接管。生成频次低于 ListPage / FormPage / DetailPage,当前为最小规范,后续按 list-page.md / form-page.md 体例扩充。
|
|
4
6
|
|
|
5
7
|
---
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Detail Page — 详情页模式
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **DetailPage**,并由 Step 3 引导到这里。
|
|
4
|
+
|
|
3
5
|
> **触发**:用户描述含"详情/查看/信息/概览"。
|
|
4
6
|
> **核心特征**:单条记录的只读展示 + DescriptionList + 操作按钮。
|
|
5
7
|
> **页面级别**:L2(面包屑模式 PageHeader,自动继承 Sidebar)。
|
|
@@ -140,15 +142,14 @@
|
|
|
140
142
|
|
|
141
143
|
## 8. 嵌套约束
|
|
142
144
|
|
|
143
|
-
| 父子关系
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
149
|
-
|
|
|
150
|
-
|
|
|
151
|
-
| PageHeader → Tabs | WARN(Tab 应在 PageHeader 下方) |
|
|
145
|
+
| 父子关系 | 状态 |
|
|
146
|
+
| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
|
|
147
|
+
| PageShell(background="muted", sidebar=OpSidebar) → OpPageContainer(header=PageHeader) → InfoCard / Tabs / DescriptionList | ALLOW |
|
|
148
|
+
| OpPageContainer 内大白卡 → 再嵌一层 `<Card>` 包业务组件 | **FORBID**(已内置大白卡,嵌套违反白卡单例) |
|
|
149
|
+
| InfoCard → DescriptionList / MonitorPanel | ALLOW(InfoCard 是局部信息卡 — 业务子区域级,非主区白卡) |
|
|
150
|
+
| Tabs → TabPane → DescriptionList / DataTable | ALLOW(关联资源用 DataTable) |
|
|
151
|
+
| Sidebar → DescriptionList | **FORBID** |
|
|
152
|
+
| PageHeader → Tabs | WARN(Tab 应在 PageHeader 下方) |
|
|
152
153
|
|
|
153
154
|
---
|
|
154
155
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Form Page — 表单页模式
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **FormPage**,并由 Step 3 引导到这里。
|
|
4
|
+
|
|
3
5
|
> **触发**:用户描述含"新建/创建/编辑/修改/复制/填写"。
|
|
4
6
|
> **核心特征**:用户输入数据 + 字段校验 + 提交。
|
|
5
7
|
> **页面级别**:L2(面包屑模式 PageHeader,自动继承 Sidebar)。弹窗表单 = L0。
|
|
@@ -16,10 +18,10 @@
|
|
|
16
18
|
|
|
17
19
|
### FormPage vs Wizard 区分
|
|
18
20
|
|
|
19
|
-
| 场景 | 类型 | 判断依据
|
|
20
|
-
| -------------------------- | ---------- |
|
|
21
|
-
| 字段无顺序依赖,一次填写 | FormPage | 单页表单
|
|
22
|
-
| 步骤间有顺序依赖,逐步完成 | WizardPage | 多步流程,Steps
|
|
21
|
+
| 场景 | 类型 | 判断依据 |
|
|
22
|
+
| -------------------------- | ---------- | -------------- |
|
|
23
|
+
| 字段无顺序依赖,一次填写 | FormPage | 单页表单 |
|
|
24
|
+
| 步骤间有顺序依赖,逐步完成 | WizardPage | 多步流程,Steps |
|
|
23
25
|
|
|
24
26
|
> Wizard 是独立页面类型,不是 FormPage 子类型。
|
|
25
27
|
|
|
@@ -78,11 +80,11 @@ SubmitBar [取消] [创建]
|
|
|
78
80
|
|
|
79
81
|
## 3. 必需组件
|
|
80
82
|
|
|
81
|
-
| 组件 | 位置 | 说明
|
|
82
|
-
| --------------------- | ------ |
|
|
83
|
-
| **PageHeader** | top | 面包屑模式(L2 页面)
|
|
84
|
-
| **Form / FieldGroup** | center | 表单容器,**禁止**用 div + space-y-\*
|
|
85
|
-
| **SubmitBar** | bottom | 提交操作栏,居右排列
|
|
83
|
+
| 组件 | 位置 | 说明 |
|
|
84
|
+
| --------------------- | ------ | ------------------------------------ |
|
|
85
|
+
| **PageHeader** | top | 面包屑模式(L2 页面) |
|
|
86
|
+
| **Form / FieldGroup** | center | 表单容器,**禁止**用 div + space-y-\* |
|
|
87
|
+
| **SubmitBar** | bottom | 提交操作栏,居右排列 |
|
|
86
88
|
|
|
87
89
|
**框架级**(自动继承):Sidebar、Breadcrumb。
|
|
88
90
|
|
|
@@ -116,16 +118,18 @@ SubmitBar [取消] [创建]
|
|
|
116
118
|
|
|
117
119
|
> **枚举数量阈值规则(≤7 RadioGroup / 8-30 Select / >30 Combobox)见 [components.md §3.5 输入控件](../components.md#35-输入控件--input-vs-select-vs-combobox)**。本节只列表单页专属补充字段。
|
|
118
120
|
|
|
119
|
-
| 字段类型
|
|
120
|
-
|
|
|
121
|
-
| 布尔(设置)
|
|
122
|
-
| 布尔(表单)
|
|
123
|
-
| 单选(2~5 项)
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
|
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 | — |
|
|
129
133
|
|
|
130
134
|
---
|
|
131
135
|
|
|
@@ -190,7 +194,7 @@ SubmitBar [取消] [创建]
|
|
|
190
194
|
- **FC1 表单布局**:`FieldGroup` + `Field`,**禁止** `<div>` + `space-y-*`(并见 S2)
|
|
191
195
|
- **FC2 InputGroup 内子件**:`InputGroupInput` / `InputGroupTextarea`,不用原始 `Input`
|
|
192
196
|
- **FC3 输入 + 按钮**:`InputGroup` + `InputGroupAddon`
|
|
193
|
-
- **FC4 2~5 选项**:`
|
|
197
|
+
- **FC4 2~5 选项**:`RadioGroup variant="button"`,**禁止**循环 `Button` 手动 active
|
|
194
198
|
- **FC5 相关选项组**:`FieldSet` + `FieldLegend`
|
|
195
199
|
- **FC6 校验态**:`data-invalid` 在 `Field`、`aria-invalid` 在控件 (与 FF1 配合)
|
|
196
200
|
- **反馈**:`import { toast } from "sonner"` (并见 [boundaries.md C9](../boundaries.md#warn-c9--toast-用-sonner))
|
|
@@ -199,17 +203,16 @@ SubmitBar [取消] [创建]
|
|
|
199
203
|
|
|
200
204
|
## 9. 嵌套约束
|
|
201
205
|
|
|
202
|
-
| 父子关系
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
| Card →
|
|
207
|
-
| Card(
|
|
208
|
-
|
|
|
209
|
-
|
|
|
210
|
-
| Field →
|
|
211
|
-
|
|
|
212
|
-
| Card → Form | **FORBID**(用 FieldGroup) |
|
|
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) |
|
|
213
216
|
|
|
214
217
|
---
|
|
215
218
|
|
|
@@ -230,7 +233,7 @@ SubmitBar [取消] [创建]
|
|
|
230
233
|
- [ ] PageHeader 用面包屑模式(L2 页面)
|
|
231
234
|
- [ ] 所有 Input 在 Field → FieldGroup 内(FC1)
|
|
232
235
|
- [ ] data-invalid + aria-invalid 双重声明(FC6)
|
|
233
|
-
- [ ] 控件按字段类型选型正确(2~5 选用
|
|
236
|
+
- [ ] 控件按字段类型选型正确(2~5 选用 RadioGroup variant="button",不循环 Button;数值用 InputNumber,不用 Input[type=number])
|
|
234
237
|
- [ ] SubmitBar 居右 + 按钮顺序:取消 → 上一步 → 主操作
|
|
235
238
|
- [ ] 长表单(> 10)分组或分区
|
|
236
239
|
- [ ] 异步提交:按钮 loading + Spinner
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# List Page — 列表页模式
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **ListPage**,并由 Step 3 引导到这里。
|
|
4
|
+
|
|
3
5
|
> **触发**:用户描述含"列表/表格/查询/检索/卡片管理"。
|
|
4
6
|
> **核心特征**:多条结构化数据 + 搜索/筛选 + 分页。
|
|
5
7
|
> **页面级别**:L1(标题模式 PageHeader,自动继承 Sidebar)。
|
|
@@ -32,7 +34,36 @@
|
|
|
32
34
|
|
|
33
35
|
---
|
|
34
36
|
|
|
35
|
-
## 2.
|
|
37
|
+
## 2. Template 组件拼装
|
|
38
|
+
|
|
39
|
+
> 源自 `packages/create/variants/opentrek/src/templates/list-page.tsx`
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
<PageShell background="muted" sidebar={<OpSidebar />}>
|
|
43
|
+
<OpPageContainer header={<PageHeader title="..." actions={...} />}>
|
|
44
|
+
{/* children: 以下组件由消费方自由组合 */}
|
|
45
|
+
<ActionToolbar ... />
|
|
46
|
+
<DataTable ... /> {/* 或 CardGrid */}
|
|
47
|
+
<Pagination ... />
|
|
48
|
+
</OpPageContainer>
|
|
49
|
+
</PageShell>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
| Slot | 注入内容 | 来源 |
|
|
53
|
+
| ------------ | ------------------------------------------------- | ---------------------------------- |
|
|
54
|
+
| `sidebar` | OpSidebar(左导) | `@/components/business/op-sidebar` |
|
|
55
|
+
| `pageHeader` | PageHeader 整块(title + Tabs + Toolbar 组合) | `@/components/ui/page-header` |
|
|
56
|
+
| `children` | ActionToolbar + DataTable / CardGrid + Pagination | 消费方自组合 |
|
|
57
|
+
|
|
58
|
+
**壳层特征**:
|
|
59
|
+
|
|
60
|
+
- PageShell `background="muted"` → 灰底主区
|
|
61
|
+
- OpPageContainer → 内嵌**无边框大白卡**(`bg-card rounded-2xl p-6`)
|
|
62
|
+
- 业务组件直接作为 children,**不要再包 `<Card>`**(白卡单例)
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 3. 标准结构(设计线框)
|
|
36
67
|
|
|
37
68
|
```
|
|
38
69
|
┌────────────────────────────────────────────┐
|
|
@@ -52,20 +83,20 @@
|
|
|
52
83
|
|
|
53
84
|
---
|
|
54
85
|
|
|
55
|
-
##
|
|
86
|
+
## 4. 必需组件
|
|
56
87
|
|
|
57
|
-
| 组件 | 位置 | 说明
|
|
58
|
-
| ----------------------------- | ------- |
|
|
59
|
-
| **PageHeader** | top | 标题模式(L1 页面);右侧主操作(如「新建」)
|
|
60
|
-
| **ActionToolbar** | toolbar | 单行 flex(nowrap);左 actions + 中 SearchCombo + 右 tools
|
|
61
|
-
| **DataTable** 或 **CardGrid** | main | 二选一,按子类型
|
|
62
|
-
| **Pagination** | footer | 默认 10 条/页(标准列表) / 12 条/页(卡片)
|
|
88
|
+
| 组件 | 位置 | 说明 |
|
|
89
|
+
| ----------------------------- | ------- | -------------------------------------------------------- |
|
|
90
|
+
| **PageHeader** | top | 标题模式(L1 页面);右侧主操作(如「新建」) |
|
|
91
|
+
| **ActionToolbar** | toolbar | 单行 flex(nowrap);左 actions + 中 SearchCombo + 右 tools |
|
|
92
|
+
| **DataTable** 或 **CardGrid** | main | 二选一,按子类型 |
|
|
93
|
+
| **Pagination** | footer | 默认 10 条/页(标准列表) / 12 条/页(卡片) |
|
|
63
94
|
|
|
64
95
|
**框架级**(自动继承,不在 skill 内声明):Sidebar。
|
|
65
96
|
|
|
66
97
|
---
|
|
67
98
|
|
|
68
|
-
##
|
|
99
|
+
## 5. SearchCombo 规范
|
|
69
100
|
|
|
70
101
|
> ListPage 顶部搜索 + 筛选的标准复合组件。**禁止**用 Input + Select 散件拼装。
|
|
71
102
|
|
|
@@ -121,7 +152,7 @@
|
|
|
121
152
|
|
|
122
153
|
---
|
|
123
154
|
|
|
124
|
-
##
|
|
155
|
+
## 6. DataTable 规则(核心)
|
|
125
156
|
|
|
126
157
|
### 5.1 列元规则(每列必备)
|
|
127
158
|
|
|
@@ -190,7 +221,7 @@
|
|
|
190
221
|
|
|
191
222
|
---
|
|
192
223
|
|
|
193
|
-
##
|
|
224
|
+
## 7. 操作列规范(硬约束)
|
|
194
225
|
|
|
195
226
|
### 6.1 结构
|
|
196
227
|
|
|
@@ -213,49 +244,52 @@
|
|
|
213
244
|
|
|
214
245
|
### 6.3 操作列行为映射
|
|
215
246
|
|
|
216
|
-
| 操作 | 触发 | 前置
|
|
217
|
-
| --------- | -------- |
|
|
218
|
-
| 查看/管理 | 点链接 | —
|
|
219
|
-
| 编辑 | 点按钮 | —
|
|
220
|
-
| 删除 | 点按钮 | 资源已停止
|
|
221
|
-
| 更多 | Dropdown | —
|
|
247
|
+
| 操作 | 触发 | 前置 | 二次确认 | 目标 | 返回行为 |
|
|
248
|
+
| --------- | -------- | ---------- | --------------- | ----------------- | ------------------------------------ |
|
|
249
|
+
| 查看/管理 | 点链接 | — | 否 | DetailPage | 返回列表保持筛选+分页 |
|
|
250
|
+
| 编辑 | 点按钮 | — | 否 | FormPage / Drawer | 保存成功返回列表 + Toast「保存成功」 |
|
|
251
|
+
| 删除 | 点按钮 | 资源已停止 | 是(三级 Dialog) | Dialog 确认 | 确认后刷新 + Toast「删除成功」 |
|
|
252
|
+
| 更多 | Dropdown | — | 按操作分级 | Dropdown 菜单 | 选择子操作 |
|
|
222
253
|
|
|
223
254
|
---
|
|
224
255
|
|
|
225
|
-
##
|
|
256
|
+
## 8. 主区对齐规则(硬约束 — 最容易不稳定的点)
|
|
226
257
|
|
|
227
|
-
|
|
258
|
+
opentrek 主区由 `OpPageContainer` 提供 — 外层 `py-5 pr-5`(无左 padding,sidebar 自带 20px 间隙) + 内嵌**无边框白底大 Card**(`bg-card rounded-2xl p-6`)承载 PageHeader / ActionToolbar / DataTable / Pagination。水平 padding 分层模型:
|
|
228
259
|
|
|
229
|
-
- **
|
|
230
|
-
- **
|
|
231
|
-
- **Table
|
|
260
|
+
- **OpPageContainer 外层**:`py-5 pr-5`(灰底主区 ↔ 白卡的间隙;左侧贴 sidebar 不留 padding)
|
|
261
|
+
- **OpPageContainer 内白卡 padding = 24px**(`p-6`):提供白卡内缘 ↔ 非 Table 子组件的呼吸 — **由容器统一管,不要在 PageHeader / Toolbar 上再加 paddingX**
|
|
262
|
+
- **Table 中间列 padding = 12px**(左右 12+12=24,列间 24px)
|
|
263
|
+
- **Table 首列 padding-left = 20px**(额外缩进让 checkbox 与白卡内缘有呼吸)
|
|
232
264
|
- **Table 末列 padding-right = 20px**
|
|
233
265
|
|
|
234
|
-
| 组件 | 水平 padding | 起始 X
|
|
235
|
-
| ------------------------------------------------------- | ------------------- |
|
|
236
|
-
|
|
|
237
|
-
|
|
|
238
|
-
|
|
|
239
|
-
| Table
|
|
240
|
-
| Table
|
|
266
|
+
| 组件 | 水平 padding | 起始 X |
|
|
267
|
+
| ------------------------------------------------------- | ------------------- | ------------------- |
|
|
268
|
+
| OpPageContainer 外层 | `pr-5`(右 20,左 0) | PageShell main 外缘 |
|
|
269
|
+
| OpPageContainer 内白卡 | **24px**(`p-6`) | 白卡内缘 |
|
|
270
|
+
| PageHeader / ActionToolbar / BulkActionBar / Pagination | **0** | 白卡内缘 + 24 |
|
|
271
|
+
| Table 中间列 td | 12px | — |
|
|
272
|
+
| Table 首列 td | padding-left: 20px | 白卡内缘 + 44 |
|
|
273
|
+
| Table 末列 td | padding-right: 20px | 白卡右内缘 - 44 |
|
|
241
274
|
|
|
242
275
|
### 禁止项
|
|
243
276
|
|
|
244
|
-
- ❌ 在
|
|
277
|
+
- ❌ 在 OpPageContainer 主区再叠一层 `<Card>` — 容器已经内置大白卡,嵌套违反白卡单例
|
|
278
|
+
- ❌ 在 PageHeader / ActionToolbar / Pagination 上重复设 paddingX(会与 OpPageContainer 内白卡的 `p-6` 叠加为 48px)
|
|
245
279
|
- ❌ Table 中间列 padding 不为 12px
|
|
246
280
|
- ❌ Table 首/末列 padding 不为 20px
|
|
247
|
-
- ❌ 用 `px-4` `px-6`
|
|
248
|
-
- ❌ 在
|
|
281
|
+
- ❌ 用 `px-4` `px-6` 字面量直接套子组件 — 用 `px-3 first:pl-5 last:pr-5` 让 Table 自己分配
|
|
282
|
+
- ❌ 在 OpPageContainer 内白卡与子组件间插入额外 paddingX 包裹层
|
|
249
283
|
|
|
250
284
|
### 验证
|
|
251
285
|
|
|
252
|
-
1. PageHeader / ActionToolbar / Pagination 起始 X =
|
|
253
|
-
2. Table 首列
|
|
286
|
+
1. PageHeader / ActionToolbar / Pagination 起始 X = OpPageContainer 内白卡左内缘 + 24
|
|
287
|
+
2. Table 首列(checkbox)内容 X = OpPageContainer 内白卡左内缘 + 44
|
|
254
288
|
3. Table 相邻中间列内容间距 = 24
|
|
255
289
|
|
|
256
290
|
---
|
|
257
291
|
|
|
258
|
-
##
|
|
292
|
+
## 9. 状态-操作模式
|
|
259
293
|
|
|
260
294
|
### 8.1 元规则
|
|
261
295
|
|
|
@@ -290,21 +324,20 @@
|
|
|
290
324
|
|
|
291
325
|
---
|
|
292
326
|
|
|
293
|
-
##
|
|
327
|
+
## 10. 嵌套约束
|
|
294
328
|
|
|
295
|
-
| 父子关系
|
|
296
|
-
|
|
|
297
|
-
|
|
|
298
|
-
|
|
|
299
|
-
|
|
|
300
|
-
|
|
|
301
|
-
|
|
|
302
|
-
| DataTable →
|
|
303
|
-
| DataTable → Form | **FORBID**(用 Drawer 触发) |
|
|
329
|
+
| 父子关系 | 状态 |
|
|
330
|
+
| ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
|
|
331
|
+
| PageShell(background="muted", sidebar=OpSidebar) → OpPageContainer(header=PageHeader) → ActionToolbar / DataTable / Pagination | ALLOW |
|
|
332
|
+
| OpPageContainer 内大白卡 → 再嵌一层 `<Card>` 包业务组件 | **FORBID**(OpPageContainer 已内置大白卡,嵌套违反白卡单例) |
|
|
333
|
+
| ActionToolbar → SearchCombo | ALLOW |
|
|
334
|
+
| CardGrid → ItemCard → CardActionBar | ALLOW(卡片网格内每个 ItemCard 是局部小卡 — 业务子区域级,非主区白卡嵌套) |
|
|
335
|
+
| DataTable → Pagination | ALLOW |
|
|
336
|
+
| DataTable → Form | **FORBID**(用 Drawer 触发) |
|
|
304
337
|
|
|
305
338
|
---
|
|
306
339
|
|
|
307
|
-
##
|
|
340
|
+
## 11. 禁止项
|
|
308
341
|
|
|
309
342
|
| 禁项 | 原因 |
|
|
310
343
|
| ---------------------- | ----------------------------------- |
|
|
@@ -319,7 +352,7 @@
|
|
|
319
352
|
|
|
320
353
|
---
|
|
321
354
|
|
|
322
|
-
##
|
|
355
|
+
## 12. 列表页特有自检
|
|
323
356
|
|
|
324
357
|
- [ ] PageHeader / ActionToolbar / DataTable / Pagination 嵌套结构正确
|
|
325
358
|
- [ ] Card 内统一左右 padding 24px(除 Table 列)
|