@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.
Files changed (48) 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 +34 -41
  23. package/src/teamix-evo-design-opentrek/boundaries.md +22 -2
  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 +60 -11
  27. package/src/teamix-evo-design-opentrek/foundations.md +3 -0
  28. package/src/teamix-evo-design-opentrek/generation-flow.md +70 -12
  29. package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
  30. package/src/teamix-evo-design-opentrek/patterns/dashboard.md +2 -0
  31. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +10 -9
  32. package/src/teamix-evo-design-opentrek/patterns/form-page.md +35 -32
  33. package/src/teamix-evo-design-opentrek/patterns/list-page.md +80 -47
  34. package/src/teamix-evo-design-opentrek/patterns/page-types.md +17 -12
  35. package/src/teamix-evo-design-opentrek/patterns/sidebar.md +122 -0
  36. package/src/teamix-evo-design-opentrek/philosophy.md +7 -5
  37. package/src/teamix-evo-design-uni-manager/SKILL.md +17 -26
  38. package/src/teamix-evo-design-uni-manager/boundaries.md +4 -1
  39. package/src/teamix-evo-design-uni-manager/components.md +3 -0
  40. package/src/teamix-evo-design-uni-manager/foundations.md +3 -0
  41. package/src/teamix-evo-design-uni-manager/generation-flow.md +43 -7
  42. package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +3 -1
  43. package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +41 -12
  44. package/src/teamix-evo-design-uni-manager/patterns/form-page.md +49 -12
  45. package/src/teamix-evo-design-uni-manager/patterns/list-page.md +44 -11
  46. package/src/teamix-evo-design-uni-manager/patterns/page-types.md +3 -1
  47. package/src/teamix-evo-design-uni-manager/philosophy.md +3 -1
  48. 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 6 自检 ← Step 5 视觉填充 ← Step 4 组件挑选
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
- | 核心动作 | CRUD(增 / 删 / 改 / 查 + 列表) | 明确出现"批量 / 审批 / 导出"等关键词 |
31
- | 入口路径 | 从同名菜单进入,无外部跳转 | 明确说"从 X 跳到 Y" |
32
- | 子类型 | ListPage→standard / FormPage→single-page / 其余各 1 | 用户提到 wizard / drawer / tabbed 等 |
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 · 视觉填充(Token 绑定)
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 6 · 自检
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 6 自检全部通过 |
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
- | PageContainer ContentWrapper Card(白卡) → PageHeader / InfoCard / Tabs / DescriptionList | ALLOW |
146
- | ContentWrapper业务组件(无 Card| **FORBID** |
147
- | CardCard | **FORBID**(白卡单例) |
148
- | InfoCard → DescriptionList / MonitorPanel | ALLOW |
149
- | TabsTabPane → DescriptionList / DataTable | ALLOW(关联资源用 DataTable) |
150
- | SidebarDescriptionList | **FORBID** |
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
+ | InfoCardDescriptionList / MonitorPanel | ALLOW(InfoCard 是局部信息卡 — 业务子区域级,非主区白卡) |
150
+ | TabsTabPane → DescriptionList / DataTable | ALLOW(关联资源用 DataTable) |
151
+ | Sidebar → DescriptionList | **FORBID** |
152
+ | PageHeaderTabs | 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
- | 布尔(设置) | Switch | "启用 X" 类开关 |
122
- | 布尔(表单) | Checkbox | 协议确认 |
123
- | 单选(2~5 项) | ToggleGroup | 类型选择(可视化优于下拉) |
124
- | 验证码 | InputOTP | 短信 / 邮箱 OTP |
125
- | 范围数值 | Slider | 资源配比 / 阈值 |
126
- | 输入 + 按钮 | InputGroup | 复制、单位切换 |
127
- | 文件上传 | FileUpload | / 多文件 |
128
- | 日期 / 时间 | DatePicker / DateRangePicker | |
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 选项**:`ToggleGroup`,**禁止**循环 `Button` 手动 active
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
- | PageContainer ContentWrapper Card(白卡) → PageHeader / FieldGroup / SubmitBar | ALLOW |
205
- | ContentWrapper业务组件(无 Card| **FORBID** |
206
- | Card → Card | **FORBID**(白卡单例) |
207
- | Card(白卡) → Card(分区) | ALLOW(分区表单内嵌) |
208
- | Card(分区)FieldGroup | ALLOW |
209
- | FieldGroupField | ALLOW |
210
- | Field → Input / Select / Switch / ToggleGroup / Textarea | ALLOW |
211
- | FieldInputGroup | ALLOW |
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
+ | FieldGroupField | ALLOW |
213
+ | FieldInput / Select / Switch / RadioGroup / InputNumber / Textarea | ALLOW |
214
+ | Field → InputGroup | ALLOW |
215
+ | CardForm | **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 选用 ToggleGroup,不循环 Button)
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
- ## 3. 必需组件
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
- ## 4. SearchCombo 规范
99
+ ## 5. SearchCombo 规范
69
100
 
70
101
  > ListPage 顶部搜索 + 筛选的标准复合组件。**禁止**用 Input + Select 散件拼装。
71
102
 
@@ -121,7 +152,7 @@
121
152
 
122
153
  ---
123
154
 
124
- ## 5. DataTable 规则(核心)
155
+ ## 6. DataTable 规则(核心)
125
156
 
126
157
  ### 5.1 列元规则(每列必备)
127
158
 
@@ -190,7 +221,7 @@
190
221
 
191
222
  ---
192
223
 
193
- ## 6. 操作列规范(硬约束)
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
- | 查看/管理 | 点链接 | — | 否 | DetailPage | 返回列表保持筛选+分页 |
219
- | 编辑 | 点按钮 | — | 否 | FormPage / Drawer | 保存成功返回列表 + Toast「保存成功」 |
220
- | 删除 | 点按钮 | 资源已停止 | 是(三级 Dialog) | Dialog 确认 | 确认后刷新 + Toast「删除成功」 |
221
- | 更多 | Dropdown | — | 按操作分级 | Dropdown 菜单 | 选择子操作 |
247
+ | 操作 | 触发 | 前置 | 二次确认 | 目标 | 返回行为 |
248
+ | --------- | -------- | ---------- | --------------- | ----------------- | ------------------------------------ |
249
+ | 查看/管理 | 点链接 | — | 否 | DetailPage | 返回列表保持筛选+分页 |
250
+ | 编辑 | 点按钮 | — | 否 | FormPage / Drawer | 保存成功返回列表 + Toast「保存成功」 |
251
+ | 删除 | 点按钮 | 资源已停止 | 是(三级 Dialog) | Dialog 确认 | 确认后刷新 + Toast「删除成功」 |
252
+ | 更多 | Dropdown | — | 按操作分级 | Dropdown 菜单 | 选择子操作 |
222
253
 
223
254
  ---
224
255
 
225
- ## 7. Card 内对齐规则(硬约束 最容易不稳定的点)
256
+ ## 8. 主区对齐规则(硬约束最容易不稳定的点)
226
257
 
227
- 水平 padding 分层模型:
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
- - **Card.paddingX = 24px**:提供 Card 外缘 Table 子组件的呼吸
230
- - **Table 中间列 padding = 12px**(左右 12+12=24,列间 24px)
231
- - **Table 首列 padding-left = 20px**(额外缩进)
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
- | Card 白卡容器 | **24px** | Card 外缘 |
237
- | PageHeader / ActionToolbar / BulkActionBar / Pagination | **0** | Card 外缘 + 24 |
238
- | Table 中间列 td | 12px | |
239
- | Table 首列 td | padding-left: 20px | Card 外缘 + 44 |
240
- | Table 末列 td | padding-right: 20px | Card 右缘 - 44 |
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
- - ❌ 在 PageHeader / ActionToolbar / Pagination 上重复设 paddingX(会与 Card.paddingX 叠加为 48px)
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` 字面量 — 用 `px-3 first:pl-5 last:pr-5`
248
- - ❌ 在 Card 与子组件间插入额外 paddingX 包裹层
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 = Card 左缘 + 24
253
- 2. Table 首列 (checkbox) 内容 X = Card 左缘 + 44
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
- ## 8. 状态-操作模式
292
+ ## 9. 状态-操作模式
259
293
 
260
294
  ### 8.1 元规则
261
295
 
@@ -290,21 +324,20 @@
290
324
 
291
325
  ---
292
326
 
293
- ## 9. 嵌套约束
327
+ ## 10. 嵌套约束
294
328
 
295
- | 父子关系 | 状态 |
296
- | ----------------------------------------------------------------------------------------------- | ---------------------------- |
297
- | PageContainer ContentWrapper Card(白卡容器) → PageHeader/ActionToolbar/DataTable/Pagination | ALLOW |
298
- | ContentWrapper业务组件(无 Card 包裹) | **FORBID** |
299
- | CardCard | **FORBID**(白卡单例) |
300
- | ActionToolbarSearchCombo | ALLOW |
301
- | CardGridItemCard → CardActionBar | ALLOW |
302
- | DataTable → Pagination | ALLOW |
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
+ | ActionToolbarSearchCombo | ALLOW |
334
+ | CardGridItemCard → CardActionBar | ALLOW(卡片网格内每个 ItemCard 是局部小卡 — 业务子区域级,非主区白卡嵌套) |
335
+ | DataTablePagination | ALLOW |
336
+ | DataTable → Form | **FORBID**(用 Drawer 触发) |
304
337
 
305
338
  ---
306
339
 
307
- ## 10. 禁止项
340
+ ## 11. 禁止项
308
341
 
309
342
  | 禁项 | 原因 |
310
343
  | ---------------------- | ----------------------------------- |
@@ -319,7 +352,7 @@
319
352
 
320
353
  ---
321
354
 
322
- ## 11. 列表页特有自检
355
+ ## 12. 列表页特有自检
323
356
 
324
357
  - [ ] PageHeader / ActionToolbar / DataTable / Pagination 嵌套结构正确
325
358
  - [ ] Card 内统一左右 padding 24px(除 Table 列)