@teamix-evo/skills 0.12.1 → 0.13.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 (82) hide show
  1. package/README.md +1 -1
  2. package/manifest.json +11 -28
  3. package/package.json +2 -2
  4. package/src/teamix-evo-code-opentrek/SKILL.md +13 -13
  5. package/src/teamix-evo-code-opentrek/api-layering.md +53 -44
  6. package/src/teamix-evo-code-opentrek/checklist.md +24 -24
  7. package/src/teamix-evo-code-opentrek/file-structure.md +55 -36
  8. package/src/teamix-evo-code-opentrek/forms-and-validation.md +17 -16
  9. package/src/teamix-evo-code-opentrek/reuse-first.md +6 -9
  10. package/src/teamix-evo-code-opentrek/testing.md +14 -14
  11. package/src/teamix-evo-code-uni-manager/SKILL.md +15 -15
  12. package/src/teamix-evo-code-uni-manager/api-layering.md +74 -58
  13. package/src/teamix-evo-code-uni-manager/checklist.md +28 -28
  14. package/src/teamix-evo-code-uni-manager/error-and-loading.md +2 -2
  15. package/src/teamix-evo-code-uni-manager/file-structure.md +77 -62
  16. package/src/teamix-evo-code-uni-manager/forms-and-validation.md +17 -15
  17. package/src/teamix-evo-code-uni-manager/reuse-first.md +7 -10
  18. package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +1 -1
  19. package/src/teamix-evo-code-uni-manager/testing.md +37 -37
  20. package/src/teamix-evo-design-opentrek/SKILL.md +17 -20
  21. package/src/teamix-evo-design-opentrek/boundaries.md +1 -1
  22. package/src/teamix-evo-design-opentrek/checklist.md +5 -5
  23. package/src/teamix-evo-design-opentrek/components.md +19 -19
  24. package/src/teamix-evo-design-opentrek/examples/standard-card-list.html +1 -1
  25. package/src/teamix-evo-design-opentrek/examples/standard-table-list.html +1 -1
  26. package/src/teamix-evo-design-opentrek/foundations.md +6 -6
  27. package/src/teamix-evo-design-opentrek/pages/dashboard-page/SKILL.md +18 -19
  28. package/src/teamix-evo-design-opentrek/pages/dashboard-page/patterns/dashboard-opentrek.md +6 -6
  29. package/src/teamix-evo-design-opentrek/pages/detail-page/SKILL.md +24 -25
  30. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/api-doc-detail.md +3 -7
  31. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/comparison-detail.md +3 -7
  32. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/monitor-detail.md +3 -7
  33. package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/resource-detail.md +10 -10
  34. package/src/teamix-evo-design-opentrek/pages/form-page/SKILL.md +26 -27
  35. package/src/teamix-evo-design-opentrek/pages/list-page/SKILL.md +35 -36
  36. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/item-card-spec.md +41 -32
  37. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list-opentrek.md +10 -10
  38. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list.md +23 -23
  39. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list-opentrek.md +8 -8
  40. package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list.md +8 -8
  41. package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +2 -2
  42. package/src/teamix-evo-design-opentrek/patterns/dashboard.md +1 -1
  43. package/src/teamix-evo-design-opentrek/patterns/detail-page.md +9 -9
  44. package/src/teamix-evo-design-opentrek/patterns/form-page.md +6 -6
  45. package/src/teamix-evo-design-opentrek/patterns/list-page.md +9 -9
  46. package/src/teamix-evo-design-opentrek/patterns/page-types.md +3 -3
  47. package/src/teamix-evo-design-opentrek/principles.md +541 -0
  48. package/src/teamix-evo-design-opentrek/rules/common-components.json +206 -76
  49. package/src/teamix-evo-design-opentrek/rules/component-specs.json +2 -2
  50. package/src/teamix-evo-design-opentrek/rules/page-frame.json +197 -193
  51. package/src/teamix-evo-design-opentrek/{generation-flow.md → workflow.md} +141 -22
  52. package/src/teamix-evo-design-uni-manager/SKILL.md +5 -5
  53. package/src/teamix-evo-design-uni-manager/boundaries.md +2 -2
  54. package/src/teamix-evo-design-uni-manager/brand.md +1 -1
  55. package/src/teamix-evo-design-uni-manager/checklist.md +2 -2
  56. package/src/teamix-evo-design-uni-manager/components.md +11 -11
  57. package/src/teamix-evo-design-uni-manager/foundations.md +7 -7
  58. package/src/teamix-evo-design-uni-manager/generation-flow.md +3 -3
  59. package/src/teamix-evo-manage/SKILL.md +111 -709
  60. package/src/teamix-evo-manage/init.md +98 -0
  61. package/src/teamix-evo-manage/migrate.md +100 -0
  62. package/src/teamix-evo-manage/rearchitect-capture-guide.md +174 -0
  63. package/src/teamix-evo-manage/rearchitect.md +373 -0
  64. package/src/teamix-evo-manage/update-component-staging.md +188 -0
  65. package/src/teamix-evo-manage/update-token-rename.md +126 -0
  66. package/src/teamix-evo-manage/update-token-treatment.md +116 -0
  67. package/src/teamix-evo-manage/update.md +213 -0
  68. package/src/teamix-evo-design-opentrek/brand.md +0 -154
  69. package/src/teamix-evo-design-opentrek/pages/list-page/_shared/search-combo-spec.md +0 -194
  70. package/src/teamix-evo-design-opentrek/philosophy.md +0 -98
  71. package/src/teamix-evo-design-opentrek/rules/README.md +0 -39
  72. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AGENT RUNTIME.svg +0 -1
  73. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI GATEWAY.svg +0 -1
  74. package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI STUDIO.svg +0 -1
  75. package/src/teamix-evo-design-opentrek/rules/_assets/OP_DEV-2.svg +0 -1
  76. package/src/teamix-evo-design-opentrek/rules/_assets/OP_LOGO.svg +0 -1
  77. package/src/teamix-evo-design-opentrek/rules/_assets/OP_OPS.svg +0 -1
  78. package/src/teamix-evo-design-opentrek/rules/layout-rules.json +0 -218
  79. package/src/teamix-evo-design-opentrek/rules/page-header-spec.md +0 -123
  80. package/src/teamix-evo-design-opentrek/rules/sidebar-spec.md +0 -217
  81. package/src/teamix-evo-upgrade/SKILL.md +0 -431
  82. /package/src/teamix-evo-design-opentrek/{rules/boundaries.rules.json → boundaries.json} +0 -0
@@ -1,47 +1,9 @@
1
1
  {
2
- "version": "4.0",
3
- "description": "页面通用业务组件注册表。以 name 为唯一标识,子技能通过组件名引用。v4.0: 移除 G-C 编号系统,合并双层架构,shadcn 实现层不再独立注册。",
2
+ "version": "6.0",
3
+ "description": "页面通用业务组件注册表。以 name 为唯一标识,子技能通过组件名引用。v6.0: 合并 page-header-spec.md(generationChecklist/commonErrors)和 sidebar-spec.md(OpSidebar 完整规格),两份独立 spec 文件已删除。",
4
4
  "shadcnComponents": "@teamix-evo/ui 组件通过 shadcnComponent 字段直接引用组件名(如 \"Button\"、\"Dialog\"),不再独立注册条目。完整 shadcn 组件列表见 src/atoms/*.md + src/composites/*.md。",
5
+ "bizComponents": "OpenTrek 业务整装件(OpSidebar / OpPageContainer / ListCard / OpDetailHeader)定义在 packages/biz-ui/variants/opentrek/*.meta.md,通过 @/components/business/* 导入。",
5
6
  "components": [
6
- {
7
- "name": "TopNavigation",
8
- "nameZh": "全局导航栏",
9
- "level": "ORGANISM",
10
- "universal": true,
11
- "description": "全局导航栏,所有页面必需。包含Logo+产品名称(12px/500)、搜索框(胶囊形152px/border-radius:16px)、用户图标按钮组。高度48px,固定顶部。背景色为固定值#141414(非设计系统token)。Logo区域177px宽。无环境选择器。",
12
- "layer": "business",
13
- "children": [
14
- "Logo",
15
- "ProductName",
16
- "SearchBar",
17
- "UserMenu"
18
- ],
19
- "props": {
20
- "fixed": "boolean, 默认true",
21
- "height": "number, 默认48",
22
- "backgroundColor": "string, 默认#141414(非设计系统token)"
23
- },
24
- "shadcnComponent": null
25
- },
26
- {
27
- "name": "Sidebar",
28
- "nameZh": "侧边导航",
29
- "level": "ORGANISM",
30
- "universal": true,
31
- "layer": "business",
32
- "description": "左侧导航,TWO_COL布局必需。包含品牌区(Logo+产品名)和导航分组菜单。展开宽度240px,收起宽度68px(详见 design-tokens.json sidebarRules)。768px响应式折叠为抽屉。色彩全部引用 --sidebar-* token。容器禁止任何外边框(右侧/底部分割线),品牌区与菜单区之间无分割线。",
33
- "children": [
34
- "NavGroup",
35
- "MenuItem"
36
- ],
37
- "props": {
38
- "collapsed": "boolean, 默认false",
39
- "mode": "\"inline\" | \"vertical\"",
40
- "width": "number, 默认240(收起态68,详见 design-tokens.json sidebarRules)"
41
- },
42
- "shadcnComponent": "Sidebar",
43
- "shadcnRef": "boundaries.md(I2)"
44
- },
45
7
  {
46
8
  "name": "Breadcrumb",
47
9
  "nameZh": "面包屑基础组件",
@@ -83,10 +45,10 @@
83
45
  "level": "ORGANISM",
84
46
  "universal": true,
85
47
  "layer": "business",
86
- "description": "页头业务组件,所有页面必需。统一封装标题基础组件和面包屑基础组件,根据页面级别自动选择展示形态。L1一级页面使用标题基础组件,L2二级页面使用面包屑基础组件。必须在白卡容器内顶部渲染。",
48
+ "description": "页头业务组件,所有页面必需。统一封装标题基础组件和面包屑基础组件,根据页面级别自动选择展示形态。L1一级页面使用标题基础组件,L2二级页面使用面包屑基础组件。在 OpPageContainer 内置白卡顶部渲染。",
87
49
  "visualSpec": {
88
50
  "height": "64px (h-16)",
89
- "padding": "0 (水平对齐由 Card.paddingX = var(--card-padding-x) = 20px 提供;禁止重复设置)",
51
+ "padding": "0 (水平对齐由 OpPageContainer 内置白卡 p-6 = 24px 提供;禁止重复设置)",
90
52
  "background": "transparent (默认态无底色)",
91
53
  "border": "无 (默认态无底边框)"
92
54
  },
@@ -109,7 +71,7 @@
109
71
  "scenario": "二级页面(详情页、独占式配置页)",
110
72
  "spec": {
111
73
  "containerHeight": "64px (h-16)",
112
- "containerPadding": "0(水平对齐由 Card.paddingX = var(--card-padding-x) = 20px 提供)",
74
+ "containerPadding": "0(水平对齐由 OpPageContainer 内置白卡 p-6 = 24px 提供)",
113
75
  "itemFontSize": "18px(与标题同字号)",
114
76
  "itemFontWeight": "500 (medium)",
115
77
  "parentItem": {
@@ -131,29 +93,6 @@
131
93
  }
132
94
  }
133
95
  },
134
- "breadcrumbVisualSpec": {
135
- "description": "面包屑导航视觉规范。引用 design-tokens.json typographyTokens 和 colorMapping。",
136
- "itemFontSize": "18px(与标题同字号)",
137
- "itemFontWeight": "500 (medium)",
138
- "parentItem": {
139
- "color": "hsl(var(--gray-secondary))",
140
- "hover": "hsl(var(--gray-primary))",
141
- "clickable": true,
142
- "note": "父级项本身即可点击返回"
143
- },
144
- "currentItem": {
145
- "color": "hsl(var(--gray-title))",
146
- "clickable": false,
147
- "note": "最后一项不可点击(cursor-default)"
148
- },
149
- "separator": {
150
- "icon": "ChevronRight",
151
- "size": "20px (w-5 h-5)",
152
- "color": "hsl(var(--muted-foreground))"
153
- },
154
- "itemGap": "4px (gap-1)",
155
- "constraint": "有面包屑时禁止同时显示 showBack 返回箭头。面包屑父级项本身即可点击返回。"
156
- },
157
96
  "stickyBehavior": {
158
97
  "description": "PageHeader 的 sticky 行为由白卡容器层包裹实现,不在 PageHeader 组件内部实现。",
159
98
  "position": "PageHeader 必须在 Card 白卡容器内顶部,由 Card 的滚动容器包裹 sticky 外壳",
@@ -186,7 +125,35 @@
186
125
  "description": "string, 页面描述(可选,默认不显示)",
187
126
  "actions": "node, 右侧操作按钮组"
188
127
  },
189
- "relatedSpec": "完整约束见 pages/detail-page/SKILL.md §4.0",
128
+ "dividerClarification": "PageHeader 容器自身不设置 border/background/box-shadow;与内容区之间可选 border-bottom: 1px solid hsl(var(--gray-line)) 实现功能性分割线(默认不加)。",
129
+ "generationChecklist": [
130
+ { "id": 1, "check": "容器高度", "correct": "height: 64px", "commonError": "56px / 48px / 72px" },
131
+ { "id": 2, "check": "容器 padding", "correct": "padding: 0", "commonError": "padding: 0 16px / 0 20px" },
132
+ { "id": 3, "check": "容器外框 border", "correct": "无(不设置 border-top/left/right)", "commonError": "border: 1px solid / 四边框" },
133
+ { "id": 4, "check": "容器 background", "correct": "transparent(不设置)", "commonError": "background: white / hsl(...)" },
134
+ { "id": 5, "check": "容器 box-shadow", "correct": "无", "commonError": "box-shadow: 0 1px ..." },
135
+ { "id": 6, "check": "面包屑字号", "correct": "font-size: var(--font-size-2xl) (18px)", "commonError": "--font-size-base / --font-size-lg / 12px / 14px" },
136
+ { "id": 7, "check": "面包屑字重", "correct": "font-weight: var(--font-weight-medium) (500)", "commonError": "400 / 600 / --font-weight-normal" },
137
+ { "id": 8, "check": "面包屑 gap", "correct": "gap: 4px", "commonError": "6px / 8px / 12px" },
138
+ { "id": 9, "check": "分隔符类型", "correct": "ChevronRight SVG <polyline points='9 18 15 12 9 6'/>", "commonError": "文本 / > ›" },
139
+ { "id": 10, "check": "分隔符尺寸", "correct": "width: 20px; height: 20px", "commonError": "14px / 16px / 24px" },
140
+ { "id": 11, "check": "分隔符颜色", "correct": "hsl(var(--muted-foreground))", "commonError": "--gray-line / --gray-primary / 硬编码色值" },
141
+ { "id": 12, "check": "父项颜色", "correct": "hsl(var(--gray-secondary))", "commonError": "--muted-foreground / --gray-primary" },
142
+ { "id": 13, "check": "当前项颜色", "correct": "hsl(var(--gray-title))", "commonError": "--gray-secondary / --muted-foreground" },
143
+ { "id": 14, "check": "PageHeader 位置", "correct": "OpPageContainer 内置白卡内部(第一个子元素)", "commonError": "白卡外部 / body 直接子元素" },
144
+ { "id": 15, "check": "标题与面包屑互斥", "correct": "L1/L2 必须二选一", "commonError": "两者同时出现" },
145
+ { "id": 16, "check": "L1 标题文本", "correct": "font-size:18px; font-weight:500; color:hsl(var(--gray-primary))", "commonError": "字号偏大 / 颜色用 secondary / 追加副标题" }
146
+ ],
147
+ "commonErrors": [
148
+ { "error": "separator 颜色用 --gray-tertiary 或硬编码", "correct": "hsl(var(--muted-foreground))", "cause": "legacy 别名未废弃" },
149
+ { "error": "容器四边框 border: 1px solid", "correct": "仅可选下方分割线 border-bottom,容器自身无 border", "cause": "与 ContentCard 边框规则混淆" },
150
+ { "error": "高度设为 48px / 56px", "correct": "必须 height: 64px", "cause": "与 Toolbar / AppBar 混淆" },
151
+ { "error": "字号用 --font-size-base / --font-size-lg", "correct": "var(--font-size-2xl) (18px)", "cause": "Token scale 理解不足" },
152
+ { "error": "gap 设为 6px / 8px / 12px", "correct": "gap: 4px", "cause": "与 button-gap 混淆" },
153
+ { "error": "分隔符用文本 / > ›", "correct": "SVG ChevronRight 20×20px", "cause": "旧版文本习惯" },
154
+ { "error": "PageHeader 放在白卡外部", "correct": "必须在 OpPageContainer 内置白卡内部(第一个子元素)", "cause": "布局层级误解" },
155
+ { "error": "padding 设为 0 16px / 0 20px", "correct": "padding: 0(水平由 OpPageContainer 内置白卡 p-6 提供)", "cause": "重复设置水平间距" }
156
+ ],
190
157
  "shadcnComponent": null
191
158
  },
192
159
  {
@@ -425,7 +392,7 @@
425
392
  "level": "ORGANISM",
426
393
  "universal": false,
427
394
  "layer": "business",
428
- "description": "下拉维度选择 + 文本输入的组合搜索控件,位于 ActionToolbar 右侧。容器式 border,内部 select + divider + input + button。",
395
+ "description": "下拉维度选择 + 文本输入的组合搜索控件,位于 ActionToolbar 中。容器式 border,内部 select + divider + input + button。v6.1: 从独立 search-combo-spec.md 合并至此。",
429
396
  "children": [
430
397
  "SearchDimension",
431
398
  "SearchDivider",
@@ -433,11 +400,174 @@
433
400
  "SearchButton"
434
401
  ],
435
402
  "props": {
436
- "dimensions": "array, 搜索维度选项",
403
+ "dimensions": "array, 搜索维度选项 [{label, value}]",
437
404
  "defaultDimension": "string, 默认维度",
438
405
  "placeholder": "string, 输入框占位符"
439
406
  },
440
- "specRef": "pages/list-page/_shared/search-combo-spec.md"
407
+ "placement": {
408
+ "parent": "ActionToolbar(直接子元素)",
409
+ "position": "位于 .left-actions 之后、.right-tools 之前",
410
+ "gap": "20px (var(--action-toolbar-search-combo-gap))",
411
+ "css": "margin-left: calc(var(--action-toolbar-search-combo-gap) - var(--button-gap))"
412
+ },
413
+ "visualSpec": {
414
+ "container": {
415
+ "border": "1px solid hsl(var(--gray-line))",
416
+ "borderRadius": "8px (--input-radius)",
417
+ "display": "flex",
418
+ "alignItems": "center",
419
+ "height": "32px",
420
+ "minWidth": "200px"
421
+ },
422
+ "innerElements": {
423
+ "select": "border:none; padding-left:8px; font-size:var(--font-size-base); color:hsl(var(--gray-primary)); outline:none; appearance:none; background:transparent",
424
+ "input": "border:none; padding:0 8px; font-size:var(--font-size-base); color:hsl(var(--gray-primary)); outline:none; flex:1; min-width:80px",
425
+ "divider": "width:1px; height:20px; background:hsl(var(--gray-line)); flex-shrink:0",
426
+ "button": "border:none; background:transparent; padding:0 8px; cursor:pointer; display:flex; align-items:center"
427
+ },
428
+ "states": {
429
+ "focus": "border-color: hsl(var(--primary)); box-shadow: 0 0 0 2px hsl(var(--ring) / 0.2)",
430
+ "hover": "border-color: hsl(var(--gray-tertiary))"
431
+ },
432
+ "filterTag": {
433
+ "height": "24px",
434
+ "padding": "0 8px",
435
+ "borderRadius": "4px",
436
+ "background": "hsl(var(--gray-fill))",
437
+ "border": "1px solid transparent",
438
+ "labelColor": "hsl(var(--gray-secondary))",
439
+ "valueColor": "hsl(var(--primary))",
440
+ "fontSize": "var(--font-size-base) (12px)",
441
+ "closeIconSize": "12px",
442
+ "closeHoverColor": "hsl(var(--gray-primary))",
443
+ "gap": "8px(多 Tag 横排间距)"
444
+ }
445
+ },
446
+ "interactions": {
447
+ "dimensionSwitch": "切换维度时清空输入框并重新聚焦",
448
+ "search": "点击搜索按钮或 Enter → 构建筛选条件 → 刷新列表 → 重置到第 1 页",
449
+ "clear": "点击 × 清空输入框 → 维度切回「全部」→ 刷新列表 → 重置分页",
450
+ "emptySearch": "输入为空时点击搜索 → 清除搜索条件 → 刷新列表 → 重置分页",
451
+ "filterTagClose": "点击 FilterTag × → 移除该条件 → 刷新列表 → 重置分页",
452
+ "filterTagClearAll": "多条件时提供「清空全部」链接"
453
+ },
454
+ "defaultDimensions": [
455
+ { "label": "全部", "value": "all" },
456
+ { "label": "名称", "value": "name" },
457
+ { "label": "ID", "value": "id" }
458
+ ],
459
+ "forbidden": [
460
+ "嵌套在 .right-tools 内(会被 margin-left:auto 推到最右)",
461
+ "嵌套在 .left-actions 内(间距被 gap=8px 控制,而非 20px)",
462
+ "与 .left-actions 间距为 8px / 12px / 16px / 24px 等非 20 值"
463
+ ],
464
+ "tokens": {
465
+ "--action-toolbar-search-combo-gap": "20px(与 left-actions 间距)",
466
+ "--font-size-base": "12px(输入/维度/FilterTag 字号)",
467
+ "--gray-line": "容器边框、分隔线",
468
+ "--gray-primary": "输入文字颜色",
469
+ "--gray-secondary": "FilterTag label 颜色",
470
+ "--gray-tertiary": "hover 态边框",
471
+ "--gray-fill": "FilterTag 背景",
472
+ "--primary": "focus 边框、FilterTag value 颜色",
473
+ "--ring": "focus 外发光"
474
+ }
475
+ },
476
+ {
477
+ "name": "OpSidebar",
478
+ "nameZh": "OpenTrek 侧边导航(整装件)",
479
+ "level": "ORGANISM",
480
+ "universal": true,
481
+ "layer": "business",
482
+ "description": "OpenTrek 全局侧边栏整装件,替代原始 Sidebar primitives。内置 SidebarProvider,TWO_COL 布局时显示,SINGLE_COL/fullscreen 时隐藏。所有 L1/L2 页面自动继承。",
483
+ "importPath": "@/components/business/op-sidebar",
484
+ "container": {
485
+ "position": "fixed",
486
+ "expandedWidth": "240px (var(--layout-sidebar-width))",
487
+ "collapsedWidth": "68px",
488
+ "background": "hsl(var(--sidebar))",
489
+ "zIndex": 100,
490
+ "display": "flex flex-col",
491
+ "transition": "width 0.2s ease",
492
+ "noBorderRight": true,
493
+ "responsive": "768px 断点折叠为抽屉(Sheet 模式)"
494
+ },
495
+ "header": {
496
+ "height": "由内容撑开(禁止硬编码固定高度)",
497
+ "padding": "16px 16px 0",
498
+ "display": "flex",
499
+ "alignItems": "center",
500
+ "gap": "var(--gap-xs) (4px)",
501
+ "collapsedPadding": "16px 0 0",
502
+ "collapsedFlexDirection": "column",
503
+ "collapsedAlignItems": "center"
504
+ },
505
+ "logo": {
506
+ "containerHeight": "32px",
507
+ "expandedLogo": { "file": "_assets/OP_DEV-2.svg", "width": "154px", "height": "32px", "viewBox": "0 0 404 84" },
508
+ "collapsedLogo": { "file": "_assets/OP_LOGO.svg", "width": "30px", "height": "30px", "viewBox": "0 0 84 84" },
509
+ "inlineSvgRequired": true,
510
+ "inlineSvgRules": [
511
+ "外层 <rect> 使用 fill='currentColor',内层图案使用 fill='white',容器通过 text-foreground 类控色",
512
+ "<clipPath> 的 id 必须全局唯一(如 opai-logo-clip-{page-name}),避免同 DOM 多个 SVG id 冲突",
513
+ "Logo 组件尺寸:size-8(32×32px)",
514
+ "path 数据必须来自 _assets/ 中对应 SVG 文件的真实内容,禁止简化或自绘近似图形"
515
+ ]
516
+ },
517
+ "brandAssets": [
518
+ { "product": "AI Gateway", "file": "_assets/OP_AI GATEWAY.svg" },
519
+ { "product": "AI Studio", "file": "_assets/OP_AI STUDIO.svg" },
520
+ { "product": "Agent Runtime", "file": "_assets/OP_AGENT RUNTIME.svg" },
521
+ { "product": "DEV", "file": "_assets/OP_DEV-2.svg" },
522
+ { "product": "OPS", "file": "_assets/OP_OPS.svg" },
523
+ { "product": "通用 Logo(产品线未明确)", "file": "_assets/OP_LOGO.svg" }
524
+ ],
525
+ "content": {
526
+ "flex": 1,
527
+ "paddingTop": "24px",
528
+ "paddingBottom": "12px",
529
+ "overflowY": "auto",
530
+ "menuItemHeight": "40px"
531
+ },
532
+ "collapseToggle": {
533
+ "collapseButton": { "icon": "Lucide PanelLeftClose(箭头朝左)", "visible": "展开态", "position": "sidebar-header 右侧 margin-left:auto" },
534
+ "expandButton": { "icon": "Lucide PanelLeftOpen(箭头朝右)", "visible": "收起态", "position": "Logo 下方居中 margin-top:8px" },
535
+ "size": "18px × 18px",
536
+ "color": "hsl(var(--muted-foreground))",
537
+ "hoverColor": "hsl(var(--gray-primary))"
538
+ },
539
+ "footer": {
540
+ "padding": "12px 12px 16px 24px",
541
+ "display": "flex",
542
+ "alignItems": "center",
543
+ "gap": "var(--button-gap) (8px)",
544
+ "avatar": { "size": "28px", "borderRadius": "50%", "background": "hsl(var(--sidebar-active))", "fontSize": "var(--font-size-base) (12px)", "fontWeight": 600, "content": "用户姓名最后一个字" },
545
+ "username": { "fontSize": "var(--font-size-lg) (14px)", "fontWeight": "500 (medium)", "color": "hsl(var(--sidebar-item))", "overflow": "hidden + text-overflow: ellipsis", "whiteSpace": "nowrap" },
546
+ "moreButton": { "size": "28px", "icon": "MoreVertical", "color": "hsl(var(--muted-foreground))", "hoverBg": "hsl(var(--sidebar-hover))" },
547
+ "collapsedState": { "padding": "12px 10px 16px", "justifyContent": "center", "usernameHidden": true, "moreButtonHidden": true }
548
+ },
549
+ "props": {
550
+ "brand": "ReactNode, 品牌区域(Logo + 产品名)",
551
+ "brandCollapsed": "ReactNode, 收起态品牌区域",
552
+ "headerAction": "ReactNode, 品牌区下方操作插槽(如 ContextSwitcher)",
553
+ "navSections": "SidebarSection[], 导航分组",
554
+ "bottomSections": "SidebarSection[], 贴底分组",
555
+ "footer": "ReactNode, 底部用户信息区域",
556
+ "collapsible": "'offcanvas' | 'icon' | 'none'",
557
+ "variant": "'sidebar' | 'floating' | 'inset'"
558
+ },
559
+ "forbidden": [
560
+ "使用纯文字模拟 Logo(如用 div + font-weight:bold 模拟品牌标识)",
561
+ "使用 Lucide/其他图标库图标占位 Logo(如 Layers、Diamond 等)",
562
+ "使用外部 URL 引用 Logo(<img src>)",
563
+ "使用非 _assets/ 目录的图片资源",
564
+ "自绘简化 SVG path 代替真实 Logo(即使视觉近似也不允许)",
565
+ "多个页面使用相同的 clipPath id(会导致渲染冲突)",
566
+ "容器右侧/底部添加 border 分割线",
567
+ "品牌区与菜单区之间添加分割线",
568
+ "硬编码 sidebar-header 高度(必须由内容撑开)"
569
+ ],
570
+ "shadcnComponent": "Sidebar"
441
571
  },
442
572
  {
443
573
  "name": "ContextSwitcher",
@@ -445,7 +575,7 @@
445
575
  "level": "ORGANISM",
446
576
  "universal": false,
447
577
  "layer": "business",
448
- "description": "全局上下文切换器(组织/资源集),位于 TopNavigation 右侧(用户菜单前)。切换后影响全局数据范围。",
578
+ "description": "全局上下文切换器(组织/资源集),位于 OpSidebar headerAction 插槽。切换后影响全局数据范围。",
449
579
  "children": [],
450
580
  "props": {
451
581
  "type": "\"organization\" | \"resourceSet\"",
@@ -454,7 +584,7 @@
454
584
  "loading": "boolean, 加载中状态",
455
585
  "onChange": "(value: string) => void"
456
586
  },
457
- "placement": "TopNavigation 右侧,用户图标前,与用户图标间距 16px"
587
+ "placement": "OpSidebar headerAction 插槽"
458
588
  },
459
589
  {
460
590
  "name": "Steps",
@@ -503,7 +633,7 @@
503
633
  "data": "object, 数据项(与 products/{产品}/cards.json slot 映射)",
504
634
  "actions": "Array<{ label, onClick, destructive? }>"
505
635
  },
506
- "specRef": "pages/list-page/patterns/card-list.md §9.1",
636
+ "specRef": "pages/list-page/_shared/item-card-spec.md §1",
507
637
  "relatedPageType": "ListPage(pure-card / standard-card / view-toggle), Dashboard, Workspace, Overview",
508
638
  "shadcnComponent": "Card",
509
639
  "shadcnRef": "boundaries.md(C3), rules/styling.json(S1)"
@@ -524,7 +654,7 @@
524
654
  "gap": "number, 卡片间距,默认 16",
525
655
  "alignContent": "'start',防止卡片拉伸"
526
656
  },
527
- "specRef": "pages/list-page/patterns/card-list.md §9.2",
657
+ "specRef": "pages/list-page/_shared/item-card-spec.md §2",
528
658
  "shadcnComponent": null
529
659
  },
530
660
  {
@@ -540,7 +670,7 @@
540
670
  "mode": "'hover-slidebar' | 'hover-fade' | 'always-visible'(v7.2 三态收敛)",
541
671
  "rows": "1 | 2,complex 模式可分行"
542
672
  },
543
- "specRef": "pages/list-page/patterns/card-list.md §9.3",
673
+ "specRef": "pages/list-page/_shared/item-card-spec.md §3",
544
674
  "shadcnComponent": null
545
675
  },
546
676
  {
@@ -194,8 +194,8 @@
194
194
  "tabSpacing": "40px",
195
195
  "containerBorder": "底贯穿 1px --gray-line",
196
196
  "trigger": "h-8 leading-[22px] pt-0 pb-2.5",
197
- "activeText": "--primary + medium + 2px 底部蓝色指示线",
198
- "normalText": "--gray-secondary + regular"
197
+ "activeText": "--foreground + semibold + 2px 底部 --tab-indicator 指示线",
198
+ "normalText": "--muted-foreground + regular"
199
199
  }
200
200
  ]
201
201
  },