@teamix-evo/skills 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +7 -3
  2. package/manifest.json +3 -2
  3. package/package.json +2 -2
  4. package/src/teamix-evo-code-opentrek/SKILL.md +12 -10
  5. package/src/teamix-evo-code-opentrek/api-layering.md +8 -5
  6. package/src/teamix-evo-code-opentrek/checklist.md +2 -0
  7. package/src/teamix-evo-code-opentrek/error-and-loading.md +38 -25
  8. package/src/teamix-evo-code-opentrek/file-structure.md +63 -54
  9. package/src/teamix-evo-code-opentrek/forms-and-validation.md +14 -12
  10. package/src/teamix-evo-code-opentrek/reuse-first.md +2 -0
  11. package/src/teamix-evo-code-opentrek/routing-and-codesplit.md +23 -21
  12. package/src/teamix-evo-code-opentrek/testing.md +32 -28
  13. package/src/teamix-evo-code-uni-manager/SKILL.md +12 -10
  14. package/src/teamix-evo-code-uni-manager/api-layering.md +2 -0
  15. package/src/teamix-evo-code-uni-manager/checklist.md +2 -0
  16. package/src/teamix-evo-code-uni-manager/error-and-loading.md +3 -1
  17. package/src/teamix-evo-code-uni-manager/file-structure.md +2 -0
  18. package/src/teamix-evo-code-uni-manager/forms-and-validation.md +2 -0
  19. package/src/teamix-evo-code-uni-manager/reuse-first.md +3 -1
  20. package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +3 -1
  21. package/src/teamix-evo-code-uni-manager/testing.md +2 -0
  22. package/src/teamix-evo-design-opentrek/SKILL.md +213 -52
  23. package/src/teamix-evo-design-opentrek/boundaries.md +25 -5
  24. package/src/teamix-evo-design-opentrek/brand.md +7 -7
  25. package/src/teamix-evo-design-opentrek/checklist.md +15 -13
  26. package/src/teamix-evo-design-opentrek/components.md +89 -39
  27. package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-1.html +1069 -0
  28. package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-instance.html +941 -0
  29. package/src/teamix-evo-design-opentrek/examples/detail-page-api-doc.html +906 -0
  30. package/src/teamix-evo-design-opentrek/examples/detail-page-config.html +993 -0
  31. package/src/teamix-evo-design-opentrek/examples/detail-page-monitor.html +1339 -0
  32. package/src/teamix-evo-design-opentrek/examples/detail-page.html +933 -0
  33. package/src/teamix-evo-design-opentrek/examples/settings-page.html +1119 -0
  34. package/src/teamix-evo-design-opentrek/examples/standard-card-list.html +1094 -0
  35. package/src/teamix-evo-design-opentrek/examples/standard-table-list.html +1361 -0
  36. package/src/teamix-evo-design-opentrek/examples/wizard-form-page.html +877 -0
  37. package/src/teamix-evo-design-opentrek/flows.md +85 -12
  38. package/src/teamix-evo-design-opentrek/foundations.md +12 -9
  39. package/src/teamix-evo-design-opentrek/generation-flow.md +84 -14
  40. package/src/teamix-evo-design-opentrek/pages/detail-page/SKILL.md +260 -0
  41. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/api-doc-detail.md +163 -0
  42. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/comparison-detail.md +100 -0
  43. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/monitor-detail.md +190 -0
  44. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/resource-detail.md +148 -0
  45. package/src/teamix-evo-design-opentrek/pages/form-page/SKILL.md +362 -0
  46. package/src/teamix-evo-design-opentrek/pages/list-page/SKILL.md +286 -0
  47. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/action-column-spec.md +60 -0
  48. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/column-meta-rules.md +117 -0
  49. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/search-combo-spec.md +194 -0
  50. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/state-action-pattern.md +51 -0
  51. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/advanced-filter-list.md +94 -0
  52. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list.md +558 -0
  53. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/drawer-list.md +76 -0
  54. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/expandable-list.md +70 -0
  55. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/l2-sidebar-list.md +73 -0
  56. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list.md +198 -0
  57. package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
  58. package/src/teamix-evo-design-opentrek/patterns/dashboard.md +2 -0
  59. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +218 -152
  60. package/src/teamix-evo-design-opentrek/patterns/form-page.md +437 -228
  61. package/src/teamix-evo-design-opentrek/patterns/list-page.md +221 -260
  62. package/src/teamix-evo-design-opentrek/patterns/page-types.md +40 -125
  63. package/src/teamix-evo-design-opentrek/philosophy.md +7 -5
  64. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AGENT RUNTIME.svg +1 -0
  65. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI GATEWAY.svg +1 -0
  66. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI STUDIO.svg +1 -0
  67. package/src/teamix-evo-design-opentrek/rules/_assets/OP_DEV-2.svg +1 -0
  68. package/src/teamix-evo-design-opentrek/rules/_assets/OP_LOGO.svg +1 -0
  69. package/src/teamix-evo-design-opentrek/rules/_assets/OP_OPS.svg +1 -0
  70. package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +3 -3
  71. package/src/teamix-evo-design-opentrek/rules/business-mapping.json +124 -0
  72. package/src/teamix-evo-design-opentrek/rules/common-components.json +924 -0
  73. package/src/teamix-evo-design-opentrek/rules/component-specs.json +1083 -0
  74. package/src/teamix-evo-design-opentrek/rules/design-tokens.css +433 -0
  75. package/src/teamix-evo-design-opentrek/rules/design-tokens.json +2798 -0
  76. package/src/teamix-evo-design-opentrek/rules/layout-rules.json +218 -0
  77. package/src/teamix-evo-design-opentrek/rules/page-flow.json +351 -0
  78. package/src/teamix-evo-design-opentrek/rules/page-frame.json +241 -0
  79. package/src/teamix-evo-design-opentrek/rules/page-header-spec.md +123 -0
  80. package/src/teamix-evo-design-opentrek/rules/page-types.json +206 -0
  81. package/src/teamix-evo-design-opentrek/rules/sidebar-spec.md +217 -0
  82. package/src/teamix-evo-design-opentrek/rules/styling.json +188 -0
  83. package/src/teamix-evo-design-opentrek/rules/token-mapping.md +284 -0
  84. package/src/teamix-evo-design-uni-manager/SKILL.md +18 -27
  85. package/src/teamix-evo-design-uni-manager/boundaries.md +7 -4
  86. package/src/teamix-evo-design-uni-manager/brand.md +1 -1
  87. package/src/teamix-evo-design-uni-manager/components.md +33 -28
  88. package/src/teamix-evo-design-uni-manager/foundations.md +24 -21
  89. package/src/teamix-evo-design-uni-manager/generation-flow.md +46 -8
  90. package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +3 -1
  91. package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +42 -13
  92. package/src/teamix-evo-design-uni-manager/patterns/form-page.md +67 -30
  93. package/src/teamix-evo-design-uni-manager/patterns/list-page.md +73 -40
  94. package/src/teamix-evo-design-uni-manager/patterns/page-types.md +14 -12
  95. package/src/teamix-evo-design-uni-manager/philosophy.md +4 -2
  96. package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +3 -3
  97. package/src/teamix-evo-manage/SKILL.md +74 -66
@@ -0,0 +1,60 @@
1
+ # 操作列规范
2
+
3
+ > 适用于 standard-list, l2-sidebar-list, expandable-list, drawer-list 子类型。
4
+
5
+ ## 操作列结构
6
+
7
+ 操作列包含 3 个主要操作 + 1 个"更多"入口, 以分隔线区分:
8
+
9
+ | 元素 | 样式 | 条件 | 禁用样式 |
10
+ |------|------|------|---------|
11
+ | 主操作(管理/查看) | 链接样式 | 始终可用 | — |
12
+ | 分隔线 | \| | — | — |
13
+ | 次要操作(远程连接等) | 文字按钮 | 特定状态时 disabled | `opacity: 0.45; pointer-events: none` |
14
+ | 分隔线 | \| | — | — |
15
+ | 状态操作(实例状态▾) | 下拉按钮 | 特定状态时 disabled | `opacity: 0.45; pointer-events: none` |
16
+ | 分隔线 | \| | — | — |
17
+ | 更多操作 | "..."下拉菜单 | 始终可用 | — |
18
+
19
+ ## 操作列行为
20
+
21
+ | 操作 | 触发方式 | 前置条件 | 二次确认 | 目标页面/组件 | 返回行为 |
22
+ |------|----------|---------|---------|-------------|----------|
23
+ | 查看/管理 | 点击链接 | 无 | 否 | DetailPage (引用 pages/detail-page/) | 返回列表页, 保持筛选+分页状态 |
24
+ | 编辑 | 点击按钮 | 无 | 否 | FormPage (引用 pages/form-page/) 或 Sheet | 保存成功后返回列表页, Sonner "保存成功" |
25
+ | 删除 | 点击按钮 | 实例已停止 | 是 (Dialog确认) | Dialog确认弹窗 | 确认后刷新列表, Sonner "删除成功" |
26
+ | 更多 | Dropdown | 无 | 否 | 下拉菜单 | 选择操作 |
27
+
28
+ ## 禁用样式
29
+
30
+ 所有 disabled 元素统一样式:
31
+ ```css
32
+ opacity: 0.45;
33
+ pointer-events: none;
34
+ ```
35
+
36
+ ## 水平对齐【硬约束】
37
+
38
+ 操作列位于表格末列,**表头与表体均需显式 `text-align: left`**,使「操作」标题与操作列左侧第一个字段(如「详情」链接)左边缘对齐:
39
+
40
+ ```css
41
+ .data-table .col-action {
42
+ width: 140px;
43
+ text-align: left;
44
+ position: sticky; right: 0;
45
+ background: hsl(var(--card));
46
+ }
47
+ /* 显式兑底,避免浏览器默认样式覆盖 */
48
+ .data-table thead th.col-action { background: hsl(var(--gray-bg)); text-align: left; }
49
+ .data-table tbody td.col-action { text-align: left; }
50
+ ```
51
+
52
+ ### 禁止项
53
+
54
+ - ❌ 禁止只在 `.col-action` 上设 `text-align: left` 而不在 `thead th.col-action` / `tbody td.col-action` 重复声明(部分浏览器下会被覆盖)
55
+ - ❌ 禁止表头「操作」与表体操作内容对齐方式不一致
56
+ - ❌ 禁止操作列内容居中
57
+
58
+ ### 验证
59
+
60
+ 表头「操作」左边缘 X = 表体「详情」链接左边缘 X。
@@ -0,0 +1,117 @@
1
+ # 表格列元规则
2
+
3
+ > 适用于所有产品线的标准列表页(standard-list, l2-sidebar-list, expandable-list, drawer-list)。
4
+ > 本产品特有列定义见 `products/{产品}/columns.json`。
5
+
6
+ ## 元规则
7
+
8
+ | 规则 | 说明 | 违反后果 |
9
+ |------|------|---------|
10
+ | 每列必须有唯一 ID | 列的唯一标识,用于列配置持久化 | 列宽拖拽/显隐配置无法持久化 |
11
+ | 每列必须有显隐规则 | 标注"始终显示"或"条件显示",条件显示需说明触发条件 | 用户无法通过列配置切换显隐 |
12
+ | 每列必须有宽度定义 | 固定宽度(px) 或百分比(%) 或最小宽度(minmax) | 列宽不合理,影响可读性 |
13
+ | 每列必须有对齐方式 | 左对齐(默认) / 居中 / 右对齐 | 文字对齐不一致 |
14
+ | 可排序列需标注排序能力 | 标注是否支持服务端排序 | 排序无意义或触发客户端排序 |
15
+ | 固定列需标注固定方向 | 左固定 / 右固定 / 不固定 | 重要列滚动后不可见 |
16
+ | 机器可读列使用 font-mono | ID/IP/VPC ID 等使用等宽字体 | ID 难以辨认 |
17
+
18
+ ## 列定义结构(JSON Schema)
19
+
20
+ 产品配置 `columns.json` 必须遵循此结构:
21
+
22
+ ```json
23
+ {
24
+ "productId": "string",
25
+ "productName": "string",
26
+ "columns": [
27
+ {
28
+ "id": "string",
29
+ "name": "string",
30
+ "type": "Checkbox | Link+Text | StatusBadge | IconButton | TagList | Text | Icon+Text | Text+Tooltip | Action",
31
+ "width": "string (px 或 %)",
32
+ "minWidth": "number (px, 可选)",
33
+ "align": "left | center | right",
34
+ "sortable": "boolean",
35
+ "fixed": "left | right | none",
36
+ "visibility": "always | conditional",
37
+ "visibilityCondition": "string (conditional 时必填)",
38
+ "fontFamily": "mono (可选)",
39
+ "description": "string"
40
+ }
41
+ ]
42
+ }
43
+ ```
44
+
45
+ ## 列固定规范
46
+
47
+ - **左固定列**:选择框(48px) + ID/名称列(20%),使用 `position:sticky; left:0` + `z-index` 层级控制
48
+ - **右固定列**:操作列,使用 `position:sticky; right:0` + `z-index` 层级控制
49
+ - **滚动列**:中间数据列可水平滚动
50
+ - **固定列视觉**:固定列与滚动列交界处投射 1px 阴影(`box-shadow: 1px 0 0 var(--border)`),提示可滚动
51
+ - **层级**:固定列 `z-index: 10`,滚动列 `z-index: 1`
52
+
53
+ ## 列宽拖拽规范
54
+
55
+ ### UI 定义
56
+
57
+ - **拖拽手柄**:列头右边界放置 `<div class="col-resize-handle" data-col="{列ID}">`
58
+ - 手柄样式:`position:absolute; right:0; top:0; bottom:0; width:2px; cursor:col-resize; z-index:5`
59
+ - hover 反馈:`background: var(--primary)`(hover 时高亮提示可拖拽)
60
+ - 仅对 `visibility: always` 的列放置拖拽手柄,条件显示的列不放置
61
+
62
+ ### JS 实现约束
63
+
64
+ 拖拽逻辑属于通用交互行为,AI 生成列表页时**必须实现以下核心逻辑**:
65
+
66
+ 1. **事件绑定**:对每个 `.col-resize-handle` 监听 `mousedown`
67
+ 2. **拖拽过程**(`mousedown` → `mousemove` → `mouseup`):
68
+ - `mousedown` 时:记录 `startX = e.clientX`,获取当前 `th` 的 `offsetWidth` 作为 `startWidth`,获取该列的 `minWidth`(有定义则取定义值,否则默认 100px,状态/监控类窄列默认 80px)
69
+ - `mousemove` 时:`newWidth = startWidth + (e.clientX - startX)`,若 `newWidth < minWidth` 则取 `minWidth`,设置 `th.style.width = newWidth + 'px'`
70
+ - `mouseup` 时:将 `{列ID: 新宽度}` 写入 `localStorage`(key 命名:`columnWidths:{产品ID}`),移除全局事件监听
71
+ - 拖拽过程中对 `document.body` 添加 `cursor: col-resize` 和 `user-select: none`,防止鼠标离开手柄区域时光标丢失和文本被选中
72
+ 3. **恢复列宽**:页面初始化时从 `localStorage` 读取 `columnWidths:{产品ID}`,遍历 `<th>` 匹配 `data-col` 属性,恢复对应列宽
73
+ 4. **重置逻辑**:列配置弹窗中提供「恢复默认列宽」按钮,调用 `localStorage.removeItem('columnWidths:{产品ID}')` 后刷新页面
74
+
75
+ ### 约束边界
76
+
77
+ - 最小列宽不低于列定义中的 `minWidth` 值(若无定义,默认 100px)
78
+ - 最大列宽不超过表格宽度的 50%
79
+ - `table-layout: fixed` 下,JS 通过修改 `th.style.width` 即可生效,无需修改 `td`
80
+ - 固定列(`position:sticky`)的拖拽需同步更新相邻列的 sticky 偏移量
81
+
82
+ ## 行选择交互规范
83
+
84
+ - **Checkbox 点击**:点击选择框切换当前行选中状态,保持其他行不变
85
+ - **行点击**:点击行内非操作区域,跳转至详情页(同操作列「管理」)
86
+ - **Shift+点击**:从上次选中行到当前行的范围全部选中
87
+ - **Ctrl/Cmd+点击**:切换单行选中状态,不影响其他行
88
+ - **行选中样式**:背景色 `var(--sidebar-accent)`(参考 design-tokens.json colorMapping.selected),与 Checkbox 选中态一致
89
+
90
+ ## 行高度约定
91
+
92
+ - 单行内容行高:56px
93
+ - 多行内容行高:72px+(如规格列含3行信息)
94
+
95
+ ## 选择框三态规范
96
+
97
+ | 状态 | 视觉 | 含义 | 触发 |
98
+ |------|------|------|------|
99
+ | 未选 | ☐ 空框 | 当前行未选中 | 默认状态 |
100
+ | 半选 | ☐̲ 带下划线/半填充 | 当前页部分行选中 | 自动计算 |
101
+ | 全选 | ☑ 勾选 | 当前页全部选中 | 点击表头选择框 |
102
+
103
+ - 表头选择框控制当前页全选/取消全选
104
+ - 半选状态:当前页有 ≥1 行选中但非全部选中时自动显示
105
+
106
+ ## 列排序规范
107
+
108
+ - 表头右侧显示 `⇅` 图标(`text-tertiary` 色,12px)
109
+ - 升序:`↑`(primary 色),降序:`↓`(primary 色)
110
+ - 点击循环:默认 → 升序 → 降序 → 默认
111
+ - 排序状态持久化(`localStorage`)
112
+
113
+ ## 文字换行规范
114
+
115
+ - **ID/IP 列**:`font-mono` + `word-break: break-all`,超长截断(`truncate`)
116
+ - **规格列**:多行展示,不截断
117
+ - **标签列**:最多3个 + `+N`,不自动换行
@@ -0,0 +1,194 @@
1
+ # SearchCombo 搜索组合组件规范
2
+
3
+ > **组件名**: SearchCombo | **层级**: ORGANISM | **层**: business
4
+ > **版本**: 1.2(从 `rules/search-combo.json` v1.1 迁移 + token 命名对齐 + 位置矛盾修正)
5
+
6
+ 下拉维度选择 + 文本输入的组合搜索控件,位于 ActionToolbar 中。
7
+
8
+ ---
9
+
10
+ ## 1. 在 ActionToolbar 中的位置(硬约束)
11
+
12
+ > SearchCombo 是 `.action-toolbar` 的**直接子元素**,位于 `.left-actions` 之后、`.right-tools` 之前。
13
+ > 与 `.left-actions` 间距 = **20px**(`var(--action-toolbar-search-combo-gap)`)。
14
+
15
+ **DOM 结构**:
16
+ ```html
17
+ <div class="action-toolbar">
18
+ <div class="left-actions">...</div>
19
+ <div class="search-combo">...</div> <!-- 直接子元素 -->
20
+ <div class="right-tools">...</div>
21
+ </div>
22
+ ```
23
+
24
+ **CSS 实现**:
25
+ ```css
26
+ .action-toolbar > .search-combo {
27
+ margin-left: calc(var(--action-toolbar-search-combo-gap) - var(--button-gap));
28
+ /* 在 toolbar gap=8px 上叠加 12px,合计 20px */
29
+ }
30
+ ```
31
+
32
+ **禁止规则**:
33
+ - 禁止嵌套在 `.right-tools` 内(会被 `margin-left:auto` 推到最右,间距不可控)
34
+ - 禁止嵌套在 `.left-actions` 内(会被内部 `gap=8px` 控制,间距为 8px 而非 20px)
35
+ - 禁止 SearchCombo 与 `.left-actions` 间距为 8px / 12px / 16px / 24px 等非 20 值
36
+
37
+ **验证**:SearchCombo 左边缘 X = `.left-actions` 最后一个按钮右边缘 X + 20px
38
+
39
+ ---
40
+
41
+ ## 2. 组件结构
42
+
43
+ ```html
44
+ <div class="search-combo-wrapper">
45
+ <select class="search-dimension">...</select>
46
+ <span class="search-divider"></span>
47
+ <input class="search-input" />
48
+ <button class="search-button"><Icon /></button>
49
+ </div>
50
+ ```
51
+
52
+ | 子组件 | 说明 |
53
+ |--------|------|
54
+ | SearchDimension | 下拉选择搜索维度 |
55
+ | SearchDivider | 分隔线 |
56
+ | SearchInput | 文本输入 |
57
+ | SearchButton | 搜索按钮(含搜索图标) |
58
+
59
+ ---
60
+
61
+ ## 3. 容器样式(容器式 border)
62
+
63
+ > 容器统一 border,内部元素无边框。
64
+
65
+ ### Wrapper 容器
66
+
67
+ | 属性 | 值 | 说明 |
68
+ |------|-----|------|
69
+ | border | `1px solid hsl(var(--gray-line))` | 容器统一边框 |
70
+ | border-radius | `6px` | — |
71
+ | display | `flex` | — |
72
+ | align-items | `center` | — |
73
+ | height | `32px` | 与表单控件高度一致 |
74
+ | min-width | `200px` | — |
75
+
76
+ ### 内部元素(均无边框)
77
+
78
+ | 元素 | 关键样式 |
79
+ |------|---------|
80
+ | select | `border: none; padding-left: 8px; font-size: var(--font-size-base); color: hsl(var(--gray-primary)); outline: none; appearance: none; background: transparent` |
81
+ | input | `border: none; padding: 0 8px; font-size: var(--font-size-base); color: hsl(var(--gray-primary)); outline: none; flex: 1; min-width: 80px` |
82
+ | divider | `width: 1px; height: 20px; background: hsl(var(--gray-line)); flex-shrink: 0` |
83
+ | button | `border: none; background: transparent; padding: 0 8px; cursor: pointer; display: flex; align-items: center` |
84
+
85
+ ### 状态
86
+
87
+ | 状态 | 样式 |
88
+ |------|------|
89
+ | **Focus** | `border-color: hsl(var(--primary)); box-shadow: 0 0 0 2px hsl(var(--ring) / 0.2)` |
90
+ | **Hover** | `border-color: hsl(var(--gray-tertiary))` |
91
+
92
+ ---
93
+
94
+ ## 4. 交互行为
95
+
96
+ ### 4.1 维度切换
97
+
98
+ | 触发 | 行为 | 原因 |
99
+ |------|------|------|
100
+ | select change | `input.value = '' → input.focus()` | 不同维度对应不同搜索关键词,切换维度不清空会导致语义错误 |
101
+
102
+ ### 4.2 搜索执行
103
+
104
+ | 触发 | 行为 |
105
+ |------|------|
106
+ | 点击搜索按钮 / 输入框按 Enter | 读取 dimension + input.value → 构建筛选条件 → 刷新列表 → 重置到第 1 页 |
107
+
108
+ ### 4.3 清除搜索
109
+
110
+ | 触发 | 行为 |
111
+ |------|------|
112
+ | 输入框有内容时 hover 显示清除图标 × | 清空输入框 → 切换维度到「全部」→ 刷新列表 → 重置分页 |
113
+
114
+ ### 4.4 空搜索
115
+
116
+ | 触发 | 行为 |
117
+ |------|------|
118
+ | 输入框为空时点击搜索 | 清除当前搜索条件 → 刷新列表 → 重置分页 |
119
+
120
+ ---
121
+
122
+ ## 5. FilterTag 展示
123
+
124
+ > 搜索条件以 FilterTag 形式展示在 SearchCombo 下方或同行右侧。
125
+
126
+ **结构**:
127
+ ```html
128
+ <span class="filter-tag">
129
+ <span class="filter-tag-label">维度名:</span>
130
+ <span class="filter-tag-value">关键词</span>
131
+ <span class="filter-tag-close">×</span>
132
+ </span>
133
+ ```
134
+
135
+ **样式**:
136
+
137
+ | 属性 | 值 |
138
+ |------|-----|
139
+ | height | 24px |
140
+ | padding | 0 8px |
141
+ | border-radius | 4px |
142
+ | background | `hsl(var(--gray-fill))` |
143
+ | border | 1px solid transparent |
144
+ | label color | `hsl(var(--gray-secondary))` |
145
+ | label/value font-size | `var(--font-size-base)` (12px) |
146
+ | value color | `hsl(var(--primary))` |
147
+ | close icon size | 12px |
148
+ | close hover color | `hsl(var(--gray-primary))` |
149
+
150
+ **交互**:
151
+ - 点击 × 移除该条件 → 刷新列表 → 重置分页
152
+ - 多个 FilterTag 提供「清空全部」链接
153
+ - 多个搜索条件以多 Tag 横向排列,gap 8px
154
+
155
+ ---
156
+
157
+ ## 6. 搜索维度配置
158
+
159
+ > 标准搜索维度选项,根据页面类型动态配置。
160
+
161
+ **默认维度**:
162
+ ```json
163
+ [
164
+ { "label": "全部", "value": "all" },
165
+ { "label": "名称", "value": "name" },
166
+ { "label": "ID", "value": "id" }
167
+ ]
168
+ ```
169
+
170
+ **ECS 列表页示例**:
171
+ ```json
172
+ [
173
+ { "label": "全部", "value": "all" },
174
+ { "label": "实例 ID/名称", "value": "instance" },
175
+ { "label": "IP", "value": "ip" },
176
+ { "label": "标签", "value": "tag" }
177
+ ]
178
+ ```
179
+
180
+ ---
181
+
182
+ ## Token 引用索引
183
+
184
+ | Token | 值 | 用途 |
185
+ |-------|-----|------|
186
+ | `--action-toolbar-search-combo-gap` | 20px | SearchCombo 与 left-actions 的间距 |
187
+ | `--font-size-base` | 12px | 搜索输入/维度选择/FilterTag 字号 |
188
+ | `--gray-line` | — | 容器边框、分隔线背景 |
189
+ | `--gray-primary` | — | 输入文字颜色 |
190
+ | `--gray-secondary` | — | FilterTag label 颜色 |
191
+ | `--gray-tertiary` | — | hover 态边框颜色 |
192
+ | `--gray-fill` | — | FilterTag 背景 |
193
+ | `--primary` | — | focus 态边框、FilterTag value 颜色 |
194
+ | `--ring` | — | focus 态外发光 |
@@ -0,0 +1,51 @@
1
+ # 状态-操作模式规范
2
+
3
+ > 适用于所有产品线的列表页。
4
+ > 本产品特有状态机定义见 `products/{产品}/states.json`。
5
+
6
+ ## 元规则
7
+
8
+ | 规则 | 说明 |
9
+ |------|------|
10
+ | 每个状态必须定义操作可用性 | 明确标注每个操作在该状态下是否可用 |
11
+ | 禁用操作必须使用统一样式 | `opacity: 0.45; pointer-events: none` |
12
+ | 混合状态时批量操作按钮禁用 | 不同状态的行选中时,hover 提示不可用原因 |
13
+ | 异步操作必须提供反馈 | Sonner 提示 + 列表刷新机制 |
14
+ | 操作确认按影响级别分级 | 一级(可逆直接执行) / 二级(影响状态Dialog确认) / 三级(不可逆输入确认) |
15
+
16
+ ## 异步操作处理(通用)
17
+
18
+ | 操作类型 | 触发后行为 | 反馈方式 | 列表刷新 |
19
+ |---------|-----------|---------|---------|
20
+ | 状态变更操作 | 异步任务, 不阻塞 | Sonner "操作已提交" | 轮询状态或任务完成通知 |
21
+ | 删除操作 | 异步任务 | Sonner "删除已提交" | 移除对应行或刷新列表 |
22
+ | 批量操作 | 异步任务 | Sonner "批量操作已提交, 共N条" | 轮询状态 |
23
+ | 创建操作 | 同步跳转 | 跳转 FormPage | 创建成功后返回列表 |
24
+
25
+ ## 操作确认规范(通用)
26
+
27
+ | 确认级别 | 确认方式 | 适用操作 |
28
+ |---------|---------|---------|
29
+ | 一级 (可逆) | 无确认, 直接执行 | 查看、编辑、远程连接 |
30
+ | 二级 (影响状态) | Dialog确认弹窗 | 启动、停止、重启等状态变更 |
31
+ | 三级 (不可逆) | Dialog + 输入确认文本 | 删除 (需输入确认文本) |
32
+
33
+ ## 页面间导航交互(通用)
34
+
35
+ | 来源操作 | 目标页面 | 导航方式 | 返回/交互约定 |
36
+ |---------|---------|---------|-------------|
37
+ | 操作列"管理/查看" | 详情页 (DetailPage) | 页面跳转 | Breadcrumb+PageHeader提供返回入口; 返回后保持列表筛选+分页 |
38
+ | 操作列"编辑" | 表单页 (FormPage) 或 Sheet | 页面跳转/侧滑 | 保存后返回列表, Sonner 提示结果; 取消返回列表 |
39
+ | 创建操作 | 创建页 (FormPage) | 页面跳转 | 创建成功/取消后返回列表 |
40
+ | 搜索执行 | 当前列表页(刷新数据) | 数据刷新 | 保持分页在第1页 |
41
+ | 筛选条件变更 | 当前列表页(刷新数据) | 数据刷新 | 重置到第1页, 保持筛选条件 |
42
+
43
+ ## 反馈机制(通用)
44
+
45
+ | 场景 | 反馈类型 | 持续时间 | 说明 |
46
+ |------|---------|---------|------|
47
+ | 操作成功 | Sonner 成功提示 | 3s | "操作成功" |
48
+ | 操作失败 | Sonner 错误提示 | 5s | 含错误原因 |
49
+ | 异步任务 | 通知中心 + Sonner | 持久 | 任务完成时通知 |
50
+ | 加载中 | 表格行 Skeleton / Spinner | 至加载完成 | 首次加载/筛选加载 |
51
+ | 空数据 | Empty | 持久 | 含创建引导按钮 |
@@ -0,0 +1,94 @@
1
+ # 高级筛选列表页 (advanced-filter)
2
+
3
+ > 路由自 `../SKILL.md`
4
+ > 布局模式: 模式D+ (高级筛选)
5
+ > 核心差异: 可展开的高级筛选面板 + 多条件组合
6
+
7
+ ## 1. 布局骨架
8
+
9
+ ```
10
+ ┌──────────┬──────────────────────────────────────────────┤
11
+ │ Sidebar │ PageHeader: 标题(18px/medium) [描述*] │
12
+ │ │ ───────────────────────── │
13
+ │ │ ActionToolbar: [创建] + [全部▼][输入...]🔍 [高级筛选▾]│
14
+ │ │ ───────────────────────── │
15
+ │ │ ┌─── AdvancedFilterPanel ───────────────┐ │
16
+ │ │ │ 条件1: [Select] [Input] │ │
17
+ │ │ │ 条件2: [Select] [Input] │ │
18
+ │ │ │ 条件3: [Select] [Input] │ │
19
+ │ │ │ [确认] [清空] │ │
20
+ │ │ └───────────────────────────────────────┘ │
21
+ │ │ ───────────────────────── │
22
+ │ │ DataTable (固定列: 左选择框+ID, 右操作) │
23
+ │ │ ───────────────────────── │
24
+ │ │ BulkActionBar (选中时内嵌显示) │
25
+ │ │ ───────────────────────── │
26
+ │ │ Pagination │
27
+ └──────────┴──────────────────────────────────────────────┘
28
+ ```
29
+
30
+ ## 2. 核心差异
31
+
32
+ | 维度 | 标准列表 | 高级筛选列表 |
33
+ |------|----------|-------------|
34
+ | 筛选方式 | SearchCombo | **SearchCombo + AdvancedFilterPanel** |
35
+ | 筛选条件数 | 1个维度 | **多条件组合(通常2-5个)** |
36
+ | AdvancedFilterPanel | 无 | **必需** |
37
+ | FilterTag | 可选 | **必需**(展示已选条件) |
38
+
39
+ ## 3. AdvancedFilterPanel 交互规范
40
+
41
+ | 交互 | 行为 |
42
+ |------|------|
43
+ | 打开面板 | 点击"高级筛选"按钮,展开面板 |
44
+ | 关闭面板 | 收起面板,恢复基础 SearchCombo |
45
+ | 添加条件 | 点击"添加条件",新增一行筛选条件 |
46
+ | 删除条件 | 点击条件行右侧 ×,移除该条件 |
47
+ | 条件间关系 | **AND 关系**(所有条件同时生效) |
48
+ | 确认筛选 | 点击"确认",应用所有条件,刷新列表 |
49
+ | 清空筛选 | 点击"清空",清除所有条件 |
50
+ | 面板位置 | ActionToolbar 下方,DataTable 上方 |
51
+
52
+ ## 4. FilterTag 管理
53
+
54
+ - 已选筛选项以 **FilterTag** 形式展示在 ActionToolbar 区域
55
+ - 每个 FilterTag 可单独移除(点击 ×)
56
+ - 筛选条件清空后,FilterTag 区域隐藏(display: none)
57
+ - 高级筛选条件的 FilterTag 支持"清空全部"操作
58
+
59
+ ## 5. 引用共享规则
60
+
61
+ | 共享规则 | 路径 | 说明 |
62
+ |----------|------|------|
63
+ | 表格列元规则 | `../_shared/column-meta-rules.md` | 列元规则(显隐/拖拽/排序)
64
+ | 产品列定义 | `products/{产品}/columns.json` | 具体列名/宽度/类型 |
65
+ | 操作列规范 | `../_shared/action-column-spec.md` | 操作列结构、行为 |
66
+ | 状态-操作模式 | `../_shared/state-action-pattern.md` | 状态驱动操作元规则
67
+ | 产品状态机 | `products/{产品}/states.json` | 具体状态/操作可用性 |
68
+
69
+ > DataTable、BulkActionBar、Pagination、ActionToolbar(不含高级筛选按钮)等组件及交互行为与标准列表页一致,不再重复。
70
+
71
+ ## 6. 与 PageContainer 模式对照
72
+
73
+ > 布局模式定义见 `../../../rules/layout-rules.json`
74
+
75
+ 高级筛选列表使用 **模式D+**:
76
+ ```
77
+ PageContainer → ContentWrapper → PageHeader + ActionToolbar + AdvancedFilterPanel(可展开) + DataTable + BulkActionBar + Pagination
78
+ ```
79
+
80
+ - "高级筛选"按钮位于 ActionToolbar 右侧
81
+ - 展开后显示多条件组合面板(条件1/2/3 + 确认/清空)
82
+ - 收起后恢复基础 SearchCombo
83
+
84
+ ## 7. 验证清单
85
+
86
+ > 通用检查项见 `../../../docs/validation-workflow.md` 验证清单。此处仅列出本模式差异项。
87
+
88
+ | 验证项 | 检查点 | 目标 |
89
+ |--------|--------|------|
90
+ | AdvancedFilterPanel | 展开/收起正常 | 正确 |
91
+ | 多条件组合 | AND 关系 | 正确 |
92
+ | 条件添加/删除 | 增删条件行正常 | 正确 |
93
+ | 确认/清空 | 确认后刷新,清空后恢复 | 正确 |
94
+ | FilterTag | 展示已选条件,可单独移除 | 正确 |