@teamix-evo/skills 0.3.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 (71) hide show
  1. package/README.md +7 -3
  2. package/manifest.json +63 -46
  3. package/package.json +3 -3
  4. package/src/teamix-evo-code-opentrek/SKILL.md +94 -0
  5. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/api-layering.md +8 -5
  6. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/checklist.md +4 -2
  7. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/error-and-loading.md +38 -25
  8. package/src/teamix-evo-code-opentrek/file-structure.md +282 -0
  9. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/forms-and-validation.md +14 -12
  10. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/reuse-first.md +27 -17
  11. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/routing-and-codesplit.md +23 -21
  12. package/{skills/teamix-evo-coding-conventions → src/teamix-evo-code-opentrek}/testing.md +32 -28
  13. package/src/teamix-evo-code-uni-manager/SKILL.md +97 -0
  14. package/src/teamix-evo-code-uni-manager/api-layering.md +372 -0
  15. package/src/teamix-evo-code-uni-manager/checklist.md +195 -0
  16. package/src/teamix-evo-code-uni-manager/error-and-loading.md +391 -0
  17. package/src/teamix-evo-code-uni-manager/file-structure.md +341 -0
  18. package/src/teamix-evo-code-uni-manager/forms-and-validation.md +461 -0
  19. package/src/teamix-evo-code-uni-manager/reuse-first.md +190 -0
  20. package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +452 -0
  21. package/src/teamix-evo-code-uni-manager/testing.md +398 -0
  22. package/src/teamix-evo-design-opentrek/SKILL.md +64 -0
  23. package/src/teamix-evo-design-opentrek/boundaries.md +533 -0
  24. package/src/teamix-evo-design-opentrek/brand.md +154 -0
  25. package/src/teamix-evo-design-opentrek/checklist.md +85 -0
  26. package/src/teamix-evo-design-opentrek/components.md +294 -0
  27. package/src/teamix-evo-design-opentrek/flows.md +51 -0
  28. package/src/teamix-evo-design-opentrek/foundations.md +274 -0
  29. package/src/teamix-evo-design-opentrek/generation-flow.md +243 -0
  30. package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
  31. package/src/teamix-evo-design-opentrek/patterns/dashboard.md +33 -0
  32. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +203 -0
  33. package/src/teamix-evo-design-opentrek/patterns/form-page.md +292 -0
  34. package/src/teamix-evo-design-opentrek/patterns/list-page.md +367 -0
  35. package/src/teamix-evo-design-opentrek/patterns/page-types.md +159 -0
  36. package/src/teamix-evo-design-opentrek/patterns/sidebar.md +122 -0
  37. package/src/teamix-evo-design-opentrek/philosophy.md +98 -0
  38. package/src/teamix-evo-design-opentrek/rules/README.md +39 -0
  39. package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +391 -0
  40. package/src/teamix-evo-design-uni-manager/SKILL.md +64 -0
  41. package/src/teamix-evo-design-uni-manager/boundaries.md +567 -0
  42. package/src/teamix-evo-design-uni-manager/brand.md +202 -0
  43. package/src/teamix-evo-design-uni-manager/checklist.md +115 -0
  44. package/src/teamix-evo-design-uni-manager/components.md +257 -0
  45. package/src/teamix-evo-design-uni-manager/flows.md +63 -0
  46. package/src/teamix-evo-design-uni-manager/foundations.md +261 -0
  47. package/src/teamix-evo-design-uni-manager/generation-flow.md +230 -0
  48. package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +97 -0
  49. package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +253 -0
  50. package/src/teamix-evo-design-uni-manager/patterns/form-page.md +366 -0
  51. package/src/teamix-evo-design-uni-manager/patterns/list-page.md +389 -0
  52. package/src/teamix-evo-design-uni-manager/patterns/page-types.md +167 -0
  53. package/src/teamix-evo-design-uni-manager/philosophy.md +108 -0
  54. package/src/teamix-evo-design-uni-manager/rules/README.md +49 -0
  55. package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +418 -0
  56. package/src/teamix-evo-manage/SKILL.md +289 -0
  57. package/skills/teamix-evo-coding-conventions/SKILL.md +0 -92
  58. package/skills/teamix-evo-coding-conventions/file-structure.md +0 -273
  59. package/skills/teamix-evo-design-rules/SKILL.md +0 -86
  60. package/skills/teamix-evo-design-rules/boundaries.md +0 -89
  61. package/skills/teamix-evo-design-rules/checklist.md +0 -108
  62. package/skills/teamix-evo-design-rules/generation-flow.md +0 -142
  63. package/skills/teamix-evo-design-rules/prompts/page-design.md +0 -148
  64. package/skills/teamix-evo-design-rules-opentrek/SKILL.md +0 -48
  65. package/skills/teamix-evo-design-rules-opentrek/brand-rules.md +0 -74
  66. package/skills/teamix-evo-design-rules-uni-manager/SKILL.md +0 -51
  67. package/skills/teamix-evo-design-rules-uni-manager/ai-scenarios.md +0 -51
  68. package/skills/teamix-evo-design-rules-uni-manager/command-center.md +0 -108
  69. package/skills/teamix-evo-design-rules-uni-manager/danger-ops.md +0 -87
  70. package/skills/teamix-evo-manage/SKILL.md +0 -178
  71. package/skills/teamix-evo-ui-upgrade/SKILL.md +0 -75
@@ -0,0 +1,367 @@
1
+ # List Page — 列表页模式
2
+
3
+ > ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 2 确认页面类型为 **ListPage**,并由 Step 3 引导到这里。
4
+
5
+ > **触发**:用户描述含"列表/表格/查询/检索/卡片管理"。
6
+ > **核心特征**:多条结构化数据 + 搜索/筛选 + 分页。
7
+ > **页面级别**:L1(标题模式 PageHeader,自动继承 Sidebar)。
8
+
9
+ ---
10
+
11
+ ## 1. 子类型路由
12
+
13
+ | 子类型 | 关键词 | 布局 | 核心组件 |
14
+ | ------------------- | -------------------------------- | ----------------------------- | ----------------------------------- |
15
+ | **standard** | "列表"/"表格"/"查询" | TWO_COL | DataTable + Pagination |
16
+ | **l2-sidebar** | "分类"/"分组"/"左侧树" | TWO_COL + 内部 Sidebar(240px) | Sidebar + DataTable |
17
+ | **expandable** | "展开"/"子项"/"详情行" | TWO_COL | DataTable(行内展开) |
18
+ | **drawer** | "弹窗列表"/"选择器" | Drawer 内 | DataTable ⊂ Drawer |
19
+ | **pure-card** | "纯卡片"/"卡片管理"/"智能体列表" | SINGLE_COL | CardGrid + ItemCard + CardActionBar |
20
+ | **standard-card** | "卡片列表"/"分类卡片"/"资源卡片" | TWO_COL | Sidebar + CardGrid + ItemCard |
21
+ | **view-toggle** | "视图切换"/"列表卡片切换" | TWO_COL + ViewToggle | ViewToggle + DataTable/CardGrid |
22
+ | **advanced-filter** | "高级筛选"/"更多条件" | TWO_COL | AdvancedFilterPanel + DataTable |
23
+
24
+ ### 路由优先级
25
+
26
+ 1. "纯卡片"/"卡片管理" → pure-card
27
+ 2. "卡片列表"/"分类卡片"/"资源卡片" → standard-card
28
+ 3. "视图切换"/"列表卡片" → view-toggle
29
+ 4. "高级筛选" → advanced-filter
30
+ 5. "展开"/"子项" → expandable
31
+ 6. "分类"/"分组"/"左侧树" → l2-sidebar
32
+ 7. "弹窗列表"/"选择器" → drawer
33
+ 8. 默认 → standard
34
+
35
+ ---
36
+
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. 标准结构(设计线框)
67
+
68
+ ```
69
+ ┌────────────────────────────────────────────┐
70
+ │ PageHeader: 标题模式 [新建] │ ← Header zone
71
+ ├────────────────────────────────────────────┤
72
+ │ ActionToolbar: 🔍 搜索 [筛选▼] [刷新] │ ← Toolbar zone
73
+ ├────────────────────────────────────────────┤
74
+ │ ▢ ID │ 状态 │ 创建时间 │ 操作 │ ← Main zone
75
+ │ ▢ ORD-001234 │ 进行中│ 2026-05-13│ ⋯ │
76
+ │ ▢ ORD-001235 │ 已完成│ 2026-05-12│ ⋯ │
77
+ ├────────────────────────────────────────────┤
78
+ │ [已选 2 项] 批量审批 / 批量导出 / 批量删除 │ ← BulkActionBar (按需)
79
+ ├────────────────────────────────────────────┤
80
+ │ ← 1 / 24 → [50/页 ▼] 共 1200条 │ ← Footer zone
81
+ └────────────────────────────────────────────┘
82
+ ```
83
+
84
+ ---
85
+
86
+ ## 4. 必需组件
87
+
88
+ | 组件 | 位置 | 说明 |
89
+ | ----------------------------- | ------- | -------------------------------------------------------- |
90
+ | **PageHeader** | top | 标题模式(L1 页面);右侧主操作(如「新建」) |
91
+ | **ActionToolbar** | toolbar | 单行 flex(nowrap);左 actions + 中 SearchCombo + 右 tools |
92
+ | **DataTable** 或 **CardGrid** | main | 二选一,按子类型 |
93
+ | **Pagination** | footer | 默认 10 条/页(标准列表) / 12 条/页(卡片) |
94
+
95
+ **框架级**(自动继承,不在 skill 内声明):Sidebar。
96
+
97
+ ---
98
+
99
+ ## 5. SearchCombo 规范
100
+
101
+ > ListPage 顶部搜索 + 筛选的标准复合组件。**禁止**用 Input + Select 散件拼装。
102
+
103
+ ### 4.1 在 ActionToolbar 中的位置(硬约束)
104
+
105
+ - SearchCombo 是 ActionToolbar 的**直接子元素**,位于 `.left-actions` 之后、`.right-tools` 之前
106
+ - 与 `.left-actions` 间距 = **20px**
107
+
108
+ ### 4.2 结构
109
+
110
+ ```
111
+ [ 维度Select | 分隔线 | 搜索Input | 搜索Button(图标) ]
112
+ ```
113
+
114
+ - 容器统一 border + radius 6px + height 32px + min-width 200px
115
+ - 内部元素无独立边框
116
+
117
+ ### 4.3 交互规则
118
+
119
+ | 触发 | 行为 |
120
+ | ------------------------- | -------------------------------- |
121
+ | 切换维度 | input.value 清空 → input.focus() |
122
+ | 输入框回车 / 点击搜索按钮 | 执行搜索 → 重置到第 1 页 |
123
+ | 输入框 hover 显示 × | 清空输入 → 维度切回"全部" |
124
+ | 输入框为空时点搜索 | 清除当前条件 → 重置分页 |
125
+
126
+ ### 4.4 FilterTag 展示
127
+
128
+ - 已应用的搜索条件以 FilterTag 形式展示
129
+ - 单条 Tag 含 `label: value ×`
130
+ - 多条提供「清空全部」链接
131
+
132
+ ### 4.5 搜索维度配置示例
133
+
134
+ > 维度按业务上下文动态配置;默认含「全部」。
135
+
136
+ ```json
137
+ // 默认维度
138
+ [
139
+ { "label": "全部", "value": "all" },
140
+ { "label": "名称", "value": "name" },
141
+ { "label": "ID", "value": "id" }
142
+ ]
143
+
144
+ // ECS 实例列表示例
145
+ [
146
+ { "label": "全部", "value": "all" },
147
+ { "label": "实例 ID/名称", "value": "instance" },
148
+ { "label": "IP", "value": "ip" },
149
+ { "label": "标签", "value": "tag" }
150
+ ]
151
+ ```
152
+
153
+ ---
154
+
155
+ ## 6. DataTable 规则(核心)
156
+
157
+ ### 5.1 列元规则(每列必备)
158
+
159
+ | 规则 | 说明 |
160
+ | -------- | ------------------------------------- |
161
+ | 唯一 ID | 用于列宽 / 显隐持久化 |
162
+ | 显隐规则 | "始终显示" 或 "条件显示" + 触发条件 |
163
+ | 宽度定义 | 固定 px / 百分比 / minmax |
164
+ | 对齐方式 | left(默认)/ center / right |
165
+ | 排序能力 | 是否支持服务端排序 |
166
+ | 固定方向 | left(前缀列)/ right(操作列)/ none |
167
+ | 字体 | ID/IP/Hash 等机器列用 `font-mono` |
168
+
169
+ ### 5.2 列固定
170
+
171
+ - 左固定:Checkbox(48px) + ID/名称(20%)
172
+ - 右固定:操作列(140px)
173
+ - 固定列与滚动列交界处 `box-shadow: 1px 0 0 var(--border)`
174
+ - 固定列 `z-index: 10`,滚动列 `z-index: 1`
175
+
176
+ ### 5.3 行高
177
+
178
+ - 单行内容:56px
179
+ - 多行内容(如规格列):72px+
180
+
181
+ ### 5.4 选择框三态
182
+
183
+ | 状态 | 视觉 | 触发 |
184
+ | ------ | ---------------- | --------------- |
185
+ | 未选 ☐ | 默认 | — |
186
+ | 半选 ☐̲ | 当前页有部分选中 | 自动计算 |
187
+ | 全选 ☑ | 当前页全选 | 点表头 checkbox |
188
+
189
+ ### 5.5 行选择交互
190
+
191
+ - Checkbox:切换当前行
192
+ - 行点击(非操作区):跳转 DetailPage
193
+ - Shift+点击:范围选中
194
+ - Ctrl/Cmd+点击:切换单行
195
+ - 选中样式:背景 `bg-accent`(与 Checkbox 选中态一致)
196
+
197
+ ### 5.6 列宽拖拽
198
+
199
+ - 拖拽手柄置于列头右边界,宽 2px,`cursor: col-resize`
200
+ - 仅对 `visibility: always` 的列允许拖拽
201
+ - 最小宽度取列定义的 `minWidth`(无定义时默认 100px,状态/监控类窄列 80px)
202
+ - 最大宽度不超过表格宽度的 50%
203
+ - 拖拽过程对 `document.body` 加 `cursor: col-resize` + `user-select: none`,防鼠标越界丢失光标
204
+ - 拖拽结束写入 `localStorage`(key 命名 `columnWidths:{产品ID}`);初始化时读取恢复
205
+ - 列配置弹窗提供「恢复默认列宽」按钮,清 localStorage 后刷新
206
+
207
+ ### 5.7 列排序
208
+
209
+ - 表头右侧 `⇅` 图标(`text-tertiary`、12px)
210
+ - 升序 `↑` / 降序 `↓` 用 `primary` 色
211
+ - 点击循环:默认 → 升序 → 降序 → 默认
212
+ - 排序状态持久化到 `localStorage`
213
+
214
+ ### 5.8 文字换行
215
+
216
+ | 列类型 | 处理 |
217
+ | ------- | -------------------------------------------------- |
218
+ | ID / IP | `font-mono` + `word-break: break-all` + `truncate` |
219
+ | 规格 | 多行展示,不截断 |
220
+ | 标签 | 最多 3 个 + `+N`,不自动换行 |
221
+
222
+ ---
223
+
224
+ ## 7. 操作列规范(硬约束)
225
+
226
+ ### 6.1 结构
227
+
228
+ 操作列 = 主操作 + 分隔线 + 次要操作 + 分隔线 + 状态操作 + 分隔线 + 更多
229
+
230
+ | 元素 | 样式 | 禁用 |
231
+ | ------------------- | -------- | -------------------------------- |
232
+ | 主操作(管理/查看) | 链接样式 | — |
233
+ | `\|` 分隔线 | — | — |
234
+ | 次要操作 | 文字按钮 | `opacity-45 pointer-events-none` |
235
+ | 状态操作 | 下拉按钮 | 同上 |
236
+ | "..." 更多 | Dropdown | — |
237
+
238
+ ### 6.2 水平对齐(硬约束)
239
+
240
+ - `text-align: left`,**表头与表体均需显式声明**
241
+ - 表头「操作」左边缘 X = 表体「详情」链接左边缘 X
242
+ - ❌ 禁止操作列内容居中
243
+ - ❌ 禁止只在 `.col-action` 上设 text-align(部分浏览器会被覆盖)
244
+
245
+ ### 6.3 操作列行为映射
246
+
247
+ | 操作 | 触发 | 前置 | 二次确认 | 目标 | 返回行为 |
248
+ | --------- | -------- | ---------- | --------------- | ----------------- | ------------------------------------ |
249
+ | 查看/管理 | 点链接 | — | 否 | DetailPage | 返回列表保持筛选+分页 |
250
+ | 编辑 | 点按钮 | — | 否 | FormPage / Drawer | 保存成功返回列表 + Toast「保存成功」 |
251
+ | 删除 | 点按钮 | 资源已停止 | 是(三级 Dialog) | Dialog 确认 | 确认后刷新 + Toast「删除成功」 |
252
+ | 更多 | Dropdown | — | 按操作分级 | Dropdown 菜单 | 选择子操作 |
253
+
254
+ ---
255
+
256
+ ## 8. 主区对齐规则(硬约束 — 最容易不稳定的点)
257
+
258
+ opentrek 主区由 `OpPageContainer` 提供 — 外层 `py-5 pr-5`(无左 padding,sidebar 自带 20px 间隙) + 内嵌**无边框白底大 Card**(`bg-card rounded-2xl p-6`)承载 PageHeader / ActionToolbar / DataTable / Pagination。水平 padding 分层模型:
259
+
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 与白卡内缘有呼吸)
264
+ - **Table 末列 padding-right = 20px**
265
+
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 |
274
+
275
+ ### 禁止项
276
+
277
+ - ❌ 在 OpPageContainer 主区再叠一层 `<Card>` — 容器已经内置大白卡,嵌套违反白卡单例
278
+ - ❌ 在 PageHeader / ActionToolbar / Pagination 上重复设 paddingX(会与 OpPageContainer 内白卡的 `p-6` 叠加为 48px)
279
+ - ❌ Table 中间列 padding 不为 12px
280
+ - ❌ Table 首/末列 padding 不为 20px
281
+ - ❌ 用 `px-4` `px-6` 字面量直接套子组件 — 用 `px-3 first:pl-5 last:pr-5` 让 Table 自己分配
282
+ - ❌ 在 OpPageContainer 内白卡与子组件间插入额外 paddingX 包裹层
283
+
284
+ ### 验证
285
+
286
+ 1. PageHeader / ActionToolbar / Pagination 起始 X = OpPageContainer 内白卡左内缘 + 24
287
+ 2. Table 首列(checkbox)内容 X = OpPageContainer 内白卡左内缘 + 44
288
+ 3. Table 相邻中间列内容间距 = 24
289
+
290
+ ---
291
+
292
+ ## 9. 状态-操作模式
293
+
294
+ ### 8.1 元规则
295
+
296
+ - 每个状态必须定义操作可用性矩阵
297
+ - 禁用样式统一 `opacity-45 pointer-events-none`
298
+ - 混合状态时批量按钮禁用,hover 提示原因
299
+ - 异步操作必须有 Toast + 列表刷新机制
300
+
301
+ ### 8.2 操作确认分级
302
+
303
+ | 级别 | 适用 | 确认方式 |
304
+ | -------------------- | -------------------- | --------------------- |
305
+ | **一级**(可逆) | 查看、编辑、远程连接 | 直接执行 |
306
+ | **二级**(影响状态) | 启动、停止、重启 | Dialog 确认 |
307
+ | **三级**(不可逆) | 删除 | Dialog + 输入确认文本 |
308
+
309
+ ### 8.3 异步反馈
310
+
311
+ | 操作 | Toast 文案 | 列表 |
312
+ | -------- | ------------------------- | ------------ |
313
+ | 状态变更 | "操作已提交" | 轮询状态 |
314
+ | 删除 | "删除已提交" | 移除行或刷新 |
315
+ | 批量 | "批量操作已提交,共 N 条" | 轮询 |
316
+
317
+ ### 8.4 页面间导航交互
318
+
319
+ - **操作列「查看/管理」** → DetailPage(页面跳转);面包屑返回,保持筛选+分页
320
+ - **操作列「编辑」** → FormPage 或 Drawer(跳转/侧滑);保存/取消返回列表,保存附 Toast
321
+ - **创建操作** → FormPage(页面跳转);创建成功/取消返回列表
322
+ - **搜索执行** → 当前列表(数据刷新);重置到第 1 页
323
+ - **筛选条件变更** → 当前列表(数据刷新);重置到第 1 页,保持筛选条件
324
+
325
+ ---
326
+
327
+ ## 10. 嵌套约束
328
+
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 触发) |
337
+
338
+ ---
339
+
340
+ ## 11. 禁止项
341
+
342
+ | 禁项 | 原因 |
343
+ | ---------------------- | ----------------------------------- |
344
+ | Form 直接出现在内容区 | 应通过 Dialog/Drawer/FormPage 触发 |
345
+ | Chart 出现在标准列表 | 图表归属 Dashboard |
346
+ | 内联编辑 | 编辑必须通过 Drawer/Dialog/FormPage |
347
+ | 拖拽排序 | 表格数据为服务端排序 |
348
+ | 无限滚动 | B2B 管理场景需精确分页 |
349
+ | 悬浮操作栏 | 遮挡数据,可发现性差 |
350
+ | 右键菜单 | 移动端不兼容 |
351
+ | `hr` / section-divider | 间距通过 padding/margin 控制 |
352
+
353
+ ---
354
+
355
+ ## 12. 列表页特有自检
356
+
357
+ - [ ] PageHeader / ActionToolbar / DataTable / Pagination 嵌套结构正确
358
+ - [ ] Card 内统一左右 padding 24px(除 Table 列)
359
+ - [ ] 子类型组件正确(standard 用 DataTable,pure-card 用 CardGrid)
360
+ - [ ] SearchCombo 位置正确(间距 20px)
361
+ - [ ] 操作列水平对齐左对齐
362
+ - [ ] 状态-操作矩阵在所有状态下正确
363
+ - [ ] 二次确认按级别正确(启动/停止 = Dialog;删除 = 输入确认)
364
+ - [ ] 批量操作按钮:选中 ≥1 行显示,混合状态禁用
365
+ - [ ] 搜索:回车执行、维度切换清空、FilterTag 展示
366
+ - [ ] 分页:保持筛选 + "共 N 条"
367
+ - [ ] 边界:空数据 Empty + 加载 Loading + 错误 ErrorState
@@ -0,0 +1,159 @@
1
+ # Page Types — 5 种标准页面类型
2
+
3
+ > ⚠️ **Prerequisites**: 你必须由 [generation-flow.md](../generation-flow.md) Step 2 引导到这里。若未完成 Step 1(需求确认),请先返回。
4
+
5
+ > AI 生成页面前**必须先识别页面类型**,再选择对应模式。本文档是 generation-flow.md Step 2 的核心输入。
6
+
7
+ ---
8
+
9
+ ## 1. 类型概览
10
+
11
+ | 类型 | 用途 | 核心组件 | 子文件 |
12
+ | ---------------- | ------------------------------ | ----------------------------------------------- | ------------------------- |
13
+ | **ListPage** | 资源集合的查询、筛选、批量操作 | DataTable / CardGrid + SearchCombo + Pagination | `list-page.md` |
14
+ | **DetailPage** | 单个资源的完整信息展示 | Tabs + DescriptionList + ActionToolbar | `detail-page.md` |
15
+ | **FormPage** | 资源的创建 / 编辑 | Form(FieldGroup + Field) + SubmitBar | `form-page.md` |
16
+ | **Dashboard** | 数据概览与监控 | StatCard + Chart + Timeline | `dashboard.md` |
17
+ | **Dialog/Sheet** | 二次确认、快速操作 | AlertDialog / Dialog / Sheet | (见 components.md §3.1) |
18
+
19
+ ---
20
+
21
+ ## 2. 识别决策树
22
+
23
+ ```text
24
+ 用户描述包含什么?
25
+ ├─ "列表"/"表格"/"查询"/"检索"/"卡片管理" → ListPage
26
+ ├─ "详情"/"查看"/"信息"/"概览" → DetailPage
27
+ ├─ "新建"/"创建"/"编辑"/"修改"/"复制" → FormPage
28
+ ├─ "仪表盘"/"概览大屏"/"监控"/"统计" → Dashboard
29
+ ├─ "确认"/"删除二次确认"/"快速重命名" → Dialog
30
+ └─ 不确定 → 优先 ListPage(最通用入口)
31
+ ```
32
+
33
+ **优先级裁决**:
34
+
35
+ - 出现"批量操作" → ListPage(即使页面看起来像 Dashboard)
36
+ - 出现"步骤"/"分步" → FormPage(Wizard 变体)
37
+ - 出现"对比" → DetailPage(对比型)
38
+
39
+ ---
40
+
41
+ ## 3. 页面级别 (L1 / L2 / L0)
42
+
43
+ | 级别 | 适用类型 | PageHeader 模式 | Sidebar |
44
+ | ------ | -------------------- | ------------------------- | -------- |
45
+ | **L0** | Dialog / Sheet 内部 | 无 PageHeader | 无 |
46
+ | **L1** | ListPage、Dashboard | title 模式(仅标题) | 自动继承 |
47
+ | **L2** | DetailPage、FormPage | breadcrumb 模式(含路径) | 自动继承 |
48
+
49
+ **框架自动继承**:L1 / L2 页面**不需要在 skill 中显式声明** Sidebar 与 PageHeader — 由 page-frame 统一管理。
50
+
51
+ ---
52
+
53
+ ## 4. Zone Map(区域命名约定)
54
+
55
+ | Zone | 位置 | 用途 |
56
+ | --------------- | ------------- | ------------------------------------------------ |
57
+ | **header** | 顶部 | PageHeader(标题或面包屑 + 主操作) |
58
+ | **toolbar** | header 下 | ActionToolbar(搜索 + 筛选 + 视图切换) |
59
+ | **main** | 中部主体 | 主要内容区(DataTable / Form / DescriptionList) |
60
+ | **bulk-action** | main 浮于底部 | BulkActionBar(仅 ListPage 选中行时) |
61
+ | **footer** | 底部固定 | Pagination 或 SubmitBar |
62
+ | **sidebar** | 左侧 | 全局导航(框架级,自动继承) |
63
+ | **aside** | 右侧 | 侧边详情 / AI 面板(按 variant 启用) |
64
+
65
+ **默认壳层结构**:`Sidebar(左) + Header(顶) + Main(中)` — 三栏布局是基线。
66
+
67
+ ---
68
+
69
+ ## 5. Dashboard
70
+
71
+ > **完整规范见 [`dashboard.md`](./dashboard.md)** — 标准结构 + 设计要点(关键指标字号、StatCard 数量、chart-\* 色彩消费顺序)。
72
+
73
+ ---
74
+
75
+ ## 6. 页间流转
76
+
77
+ > 单页内部规则在 §1-§5,本节是**跨页流转**视角。完整的"四条核心用户旅程"(A 资源查找 / B 创建 / C 异常 / D 批量)见 [`flows.md`](../flows.md)。
78
+
79
+ ### 6.1 后台主流转图
80
+
81
+ ```text
82
+ ┌─────────────────┐
83
+ │ 全局导航 / 首页 │
84
+ └────────┬────────┘
85
+ │ 选择模块
86
+
87
+ ┌──────────┐ 创建 ┌──────────┐ 查看 ┌────────────┐
88
+ │ FormPage │◄────│ ListPage │──────►│ DetailPage │
89
+ └────┬─────┘ └─────┬────┘ └─────┬──────┘
90
+ │ 成功 │ │
91
+ └────────────────►│◄──────────────────┘
92
+ │ 编辑 返回
93
+
94
+ ┌──────────────┐
95
+ │ FormPage │
96
+ └──────────────┘
97
+
98
+ Dashboard ──下钻──► ListPage(预筛选)
99
+ ```
100
+
101
+ > AI 副驾驶(命令面板 / 对话主面板 / 告警诊断 / 操作编排 / 知识问答 / 拓扑感知)属于**变体专属**流转,不在中性基线内。
102
+
103
+ ### 6.2 流转设计规则
104
+
105
+ 1. **导航深度 ≤ 4 层** — 超过即是信息架构问题
106
+ 2. **每层都有返回路径** — 面包屑 / 返回按钮 / Esc 快捷键
107
+ 3. **主导航始终可见** — 仅"全屏编辑 / 大屏展示"模式可隐藏
108
+ 4. **状态保持** — 列表筛选条件、表单未提交内容必须保留
109
+ 5. **快捷路径** — 高频操作建议提供 `Cmd+K` 入口
110
+ 6. **不创建死胡同** — 任何成功 / 失败页面都必须有"下一步"按钮
111
+
112
+ ### 6.3 资源生命周期
113
+
114
+ | 阶段 | 发现 | 创建 | 配置 | 监控 | 变更 | 删除 |
115
+ | ---- | -------- | -------- | ---------- | --------- | -------- | -------- |
116
+ | 页面 | ListPage | FormPage | DetailPage | Dashboard | FormPage | Dialog |
117
+ | 动作 | 搜索定位 | 填写表单 | 查看明细 | 处置异常 | 编辑提交 | 二次确认 |
118
+
119
+ > "资源" 泛指业务对象(订单 / 用户 / 商品 / 任务 / 工单 / 文档…)。
120
+
121
+ ### 6.4 CRUD 流转速查
122
+
123
+ | 意图 | 关键词 | 目标页 | 完成后 |
124
+ | -------- | -------------- | ----------------------- | -------------- |
125
+ | 查看列表 | 列表/查询/检索 | ListPage | — |
126
+ | 查看详情 | 详情/查看/信息 | DetailPage | 可返回列表 |
127
+ | 新建 | 新建/创建/新增 | FormPage(新建) | 保存后返回列表 |
128
+ | 编辑 | 编辑/修改 | FormPage(编辑)或 Drawer | 保存后返回原页 |
129
+ | 删除 | 删除/移除 | Dialog(输入确认) | 确认后刷新列表 |
130
+ | 复制 | 复制/克隆 | FormPage(复制新建) | 保存后返回列表 |
131
+
132
+ ---
133
+
134
+ ## 7. 通用结构铁律(所有页面类型共享)
135
+
136
+ 1. **`<PageShell background="muted" sidebar={<OpSidebar/>}> → <OpPageContainer header={<PageHeader/>}> → 业务组件`**
137
+ - PageShell 来自 `@/components/ui/page-shell`(三明治壳;opentrek 主区背景用 `muted` 灰底,无 header slot)
138
+ - OpPageContainer 来自 `@/components/business/op-page-container`(padding `py-5 pr-5`,**内置无边框大白卡** `bg-card rounded-2xl`)
139
+ - PageHeader 来自 `@/components/ui/page-header`(本身无 padding,由 OpPageContainer 内白卡统一管)
140
+ - 业务组件(ListCard 网格 / DataTable / Form 等)直接作为 OpPageContainer children,**不要再手动包 `<Card>`** — 容器已经是白卡
141
+ 2. **主区白卡单例** — OpPageContainer 已内置 `bg-card rounded-2xl` 大白卡,主区内**不要再手写 `<Card>`** 包整个 PageHeader / DataTable / Form / FieldGroup(嵌套违反白卡单例)。卡片网格内的 ItemCard / 表单分区的子 Card 是局部容器,不算"嵌套主区白卡"
142
+ 3. **页头不可重复** — 子页面禁止自建 header,PageHeader 由框架管控
143
+ 4. **不在内容区直接放 Form 整体** — 必须用 FieldGroup + Field(详见 boundaries.md C7)
144
+ 5. **不在 ListPage / DetailPage 内嵌 Chart 整体** — 图表归属 Dashboard
145
+ 6. **不在 FormPage / DetailPage 内嵌 DataTable 整体** — 关联数据通过 Tabs / Drawer 组织
146
+
147
+ ---
148
+
149
+ ## 8. 类型选择自检
150
+
151
+ 完成识别后必须能回答:
152
+
153
+ - [ ] 这是 L0 / L1 / L2 哪一级?
154
+ - [ ] PageHeader 用 title 还是 breadcrumb 模式?
155
+ - [ ] Main 区核心组件是什么?(DataTable / DescriptionList / FieldGroup)
156
+ - [ ] 是否需要 toolbar / bulk-action / footer Zone?
157
+ - [ ] 错位风险:是否在不该出现的页面类型里出现了 Form / DataTable / Chart?
158
+
159
+ 类型识别错误 = 后续所有约束都错位。**错则回到 Step 1 重判。**
@@ -0,0 +1,122 @@
1
+ # Sidebar Pattern — OpenTrek 侧边栏统一规范
2
+
3
+ > ⚠️ **Prerequisites**: 你必须已在 [generation-flow.md](../generation-flow.md) Step 3 确认布局包含侧边栏,或由翻新/验证路径引导到这里。
4
+
5
+ > AI 生成或翻新页面时必须引用本规则。所有色值与尺寸通过 token 引用,禁止硬编码。Token 真值见 `tokens/tokens.theme.css`。
6
+
7
+ ---
8
+
9
+ ## 1. 宽度与定位
10
+
11
+ | 状态 | Token | 业务含义 |
12
+ | ------ | --------------------------- | ------------------------------- |
13
+ | 展开态 | `--layout-sidebar-width` | 侧边栏展开宽度 |
14
+ | 收起态 | `--sidebar-collapsed-width` | 仅图标,居中对齐于中轴线 |
15
+ | 顶部条 | `--topbar-height` | 与 Sidebar 顶部对齐,区分品牌区 |
16
+
17
+ **布局规则**:
18
+
19
+ - Sidebar 走 `position: fixed; top: 0; left: 0; bottom: 0; z-index: 100`
20
+ - 主内容区通过 `margin-left: var(--layout-sidebar-width)` 补偿
21
+ - **禁止**:把 Sidebar + 主内容区放进一个 flex 容器(不可预期的滚动行为)
22
+
23
+ ---
24
+
25
+ ## 2. 结构变体(2 选 1,按信息架构层级)
26
+
27
+ ### 2.1 三级结构(默认)
28
+
29
+ 适用:信息架构需要 3 层归类(顶层业务域 / 中层主导航 / 底层细分)。
30
+
31
+ ```
32
+ aside.sidebar
33
+ ├─ div.sidebar-header ← 品牌区
34
+ ├─ div.sidebar-content ← 滚动容器
35
+ │ ├─ div.sidebar-group-label ← 分组标题(可重复)
36
+ │ ├─ ul.sidebar-menu
37
+ │ │ └─ li > a.sidebar-menu-item
38
+ │ └─ ul.sidebar-sub-menu ← 主菜单展开后显示
39
+ │ └─ li > a.sidebar-menu-item
40
+ ├─ div.sidebar-divider
41
+ └─ div.sidebar-footer
42
+ ```
43
+
44
+ ### 2.2 二级结构(v4.1 新增)
45
+
46
+ 适用:主菜单项语义对等,无需分组标题归类。
47
+
48
+ - **禁止** `div.sidebar-group-label`
49
+ - 所有主菜单项放进同一个 `ul.sidebar-menu`
50
+ - 子菜单项与主菜单项**文字 x 坐标对齐**(同列),层级关系由展开箭头 + 字号 + 背景色表现,**不**通过左缩进
51
+ - 子菜单项不带 `.item-icon`,只有文字
52
+
53
+ ### 2.3 选型决策
54
+
55
+ | 信息架构层级深度 | 选用 |
56
+ | ---------------- | ---------- |
57
+ | 3 层归类 | threeLevel |
58
+ | 2 层归类 | twoLevel |
59
+
60
+ > 与菜单项**个数无关**,只看信息架构。
61
+
62
+ ---
63
+
64
+ ## 3. 颜色映射(v4.1 品牌化)
65
+
66
+ | 槽位 | 用途 |
67
+ | ----------------------------------- | ------------------------------------------- |
68
+ | `--color-sidebar` | 侧边栏背景 |
69
+ | `--color-sidebar-foreground` | 默认文字 |
70
+ | `--color-sidebar-active` | 选中项背景(v4.1 走灰色,区别 hover) |
71
+ | `--color-sidebar-active-foreground` | 选中项文字(OpenTrek 蓝) |
72
+ | `--color-sidebar-hover` | hover 态背景 |
73
+ | `--color-sidebar-title` | sidebar-group-label 文字 |
74
+ | `--color-sidebar-item-muted` | 二级文字 / 次要项 |
75
+ | `--color-sidebar-primary` | 品牌强调(`#0055EE`)— 高亮 logo / 选中态等 |
76
+ | `--color-sidebar-border` | 分隔线 |
77
+ | `--color-sidebar-ring` | 焦点圈 |
78
+
79
+ **禁止**:
80
+
81
+ - 直接用 `bg-blue-600` / `text-gray-500` 这类原始 Tailwind 色
82
+ - 在 sidebar 内消费 `--color-primary` / `--color-foreground`(应走 sidebar 命名空间)
83
+
84
+ ---
85
+
86
+ ## 4. 收起态行为
87
+
88
+ - 宽度 `--sidebar-collapsed-width`,`overflow: visible`(支持 flyout 浮层溢出)
89
+ - 滚动能力下移到 `.sidebar-content`(`overflow-y: auto; overflow-x: hidden`)
90
+ - 仅显示图标,隐藏所有文字(label / group title / count / expand-icon)
91
+ - 选中态用 `--color-sidebar-active` 灰色背景,**不**显示左侧高亮条
92
+ - 过渡走 `width var(--duration-normal) var(--easing-ease)`
93
+ - 菜单项 40×40px,`border-radius: var(--radius-md)`,`li { display: flex; justify-content: center }` 保证居中于中轴线
94
+
95
+ ---
96
+
97
+ ## 5. Footer / Header 槽位
98
+
99
+ | 槽位 | 内容 |
100
+ | ---------------- | ----------------------------------------------------- |
101
+ | sidebar-header | 展开态:品牌 logo;收起态:方形 logo +hover 展开 icon |
102
+ | sidebar-avatar | 用户头像 |
103
+ | sidebar-username | 用户名(收起态隐藏) |
104
+ | sidebar-more | 更多操作触发器 |
105
+
106
+ ---
107
+
108
+ ## 6. 禁止清单(硬约束)
109
+
110
+ - [ERROR] 扁平化结构(直接 `<a>` 挂在 `nav`/`div` 下,无 `ul > li` 包裹)
111
+ - [ERROR] Sidebar 整体使用 flex 布局(必须 `fixed` 定位)
112
+ - [ERROR] 省略 `sidebar-content` 滚动容器
113
+ - [ERROR] twoLevel 变体出现 `sidebar-group-label`
114
+ - [ERROR] 无子菜单的菜单项出现 expand-icon 或 `data-toggle`(expand-icon 仅出现在有 `sidebar-sub-menu` 的主菜单项)
115
+ - [WARN] 在 sidebar 里直接消费 `--color-primary`(应走 `--color-sidebar-primary`)
116
+ - [WARN] 二级结构子菜单文字起点低于主菜单文字 x(隐藏层级关系)
117
+
118
+ ---
119
+
120
+ ## 7. 引用关系
121
+
122
+ 本规则是 OpenTrek sidebar 的 **single source of truth**。其他 skill 文件(page-frame / common-components / 子技能)须 `$ref` 本文件,禁止重复定义或冲突覆写。