@qilitt-mickey/vue3-temp-skill 1.1.24 → 1.1.26

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 (45) hide show
  1. package/SKILL.md +83 -43
  2. package/package.json +15 -1
  3. package/references/auth-pages.md +217 -0
  4. package/references/base-code-dict.md +7 -0
  5. package/references/chart-echarts.md +1 -1
  6. package/references/code-quality.md +13 -14
  7. package/references/crud-pages.md +21 -17
  8. package/references/data-compare.md +7 -0
  9. package/references/data-mapping.md +7 -0
  10. package/references/data-screen.md +7 -0
  11. package/references/data-writeback.md +7 -0
  12. package/references/design-handoff.md +210 -403
  13. package/references/design-system.md +111 -709
  14. package/references/directives-advanced.md +7 -0
  15. package/references/download-export.md +7 -0
  16. package/references/feedback-loading.md +7 -0
  17. package/references/feedback-ui.md +7 -0
  18. package/references/file-management.md +7 -0
  19. package/references/flowchart-g6.md +7 -0
  20. package/references/form-advanced.md +1 -1
  21. package/references/graph-relation.md +7 -0
  22. package/references/i18n-localization.md +230 -0
  23. package/references/layout-theme.md +1 -1
  24. package/references/particles.md +7 -0
  25. package/references/project-inventory.md +7 -0
  26. package/references/qrcode-barcode.md +7 -0
  27. package/references/rich-text.md +7 -0
  28. package/references/seamless-scroll.md +7 -0
  29. package/references/table-vxe.md +1 -1
  30. package/references/tree-table.md +7 -0
  31. package/references/verify-captcha.md +7 -0
  32. package/references/websocket-realtime.md +7 -0
  33. package/references/workflow-bpmn.md +7 -0
  34. package/scripts/ai-content-audit.mjs +244 -0
  35. package/scripts/ai-match-audit.mjs +348 -0
  36. package/scripts/ai-workflow-sim.mjs +393 -0
  37. package/scripts/analyze-deps.mjs +278 -0
  38. package/scripts/check.cmd +7 -0
  39. package/scripts/check.mjs +95 -0
  40. package/scripts/cli.mjs +153 -0
  41. package/scripts/generate-index.mjs +214 -0
  42. package/scripts/match.py +323 -0
  43. package/scripts/modules.json +348 -0
  44. package/scripts/scaffold-module.mjs +232 -0
  45. package/scripts/validate.mjs +256 -0
@@ -1,403 +1,210 @@
1
- ---
2
- skill: design-handoff
3
- description: 设计产出物 → 业务项目样式落地。优先认 design-handoff/v1 JSON;兼容旧交接块与令牌 CSS。
4
- scope: project
5
- tags: [handoff, design-tokens, upstream, artifacts, json]
6
- ---
7
-
8
- # 设计产出 → 模板落地
9
-
10
- ## 双轨(必读)
11
-
12
- | 场景 | 行为 |
13
- |------|------|
14
- | **未调用设计 / 无 handoff** | 保持模版出厂(主色 `#409EFF`、`Theme: light`=**白侧栏**、`ShowModel: chrome`、margin 8 等)。**禁止**为贴合视觉印象而擅自修改出厂值 |
15
- | **有 design-handoff/v1 或用户要求按设计落地** | 按下文「落地原子步骤」**整组**回填;只改主色/令牌、不改 `Theme`/`Version` = **落地失败** |
16
-
17
- 跨编辑器一致:设计侧 `handoff-output.md`(JSON 形状)+ 本文件(→ 模版映射)+ 模版令牌。
18
- **分工**:设计师改视觉正文;本文件规定 Agent 如何落到模版。禁止只改文档不改令牌。
19
-
20
- ### 出厂 vs 设计:侧栏两套开关(高频错误)
21
-
22
- | 概念 | 出厂 | 设计 page-templates「浅色模式」 |
23
- |------|------|--------------------------------|
24
- | 内容区 | OverallStyle=light | OverallStyle=light / contentMode=light |
25
- | 侧栏 | **`Theme=light` → 白菜单** | **`Theme=default` + `--sidebar-bg:#001529`** |
26
- | 主色 | EpThemeColor `#409EFF` | `tokens.brandPrimary`(如钴蓝 `#1B4FE0`) |
27
-
28
- **禁止**:把设计「浅色」写成 `Theme=light`。`contentMode/OverallStyle=light` 与 `Theme=light` 不是一回事。
29
-
30
- ### `Version` 必须生效(落地核心)
31
-
32
- 模版 `layout` / `configure` **优先读 localStorage**。只改 `platform-config.json` 而浏览器仍缓存 `Theme=light` → 侧栏一直白。
33
-
34
- 模版已在 `injectResponsiveStorage`:当 **`Version` 与上次不同** 时删除 `layout`+`configure` 并按新配置重灌。
35
-
36
- 因此设计落地时:**`Version` 必须自增**(如 `0.0.5` → `0.0.6`),否则 handoff 写了 `Theme=default` 也不会进页面。
37
-
38
- ## 触发
39
-
40
- 出现以下任一情况时执行本协议(与业务开发的先后跟用户需求:可先定风格再写业务,也可在已有业务上全量重构样式):
41
-
42
- - 会话 / 附件 / 仓库中有 **`design-handoff/v1` JSON**(优先)
43
- - 会话有「前端落地交接」块 / `【主题色系】` / `:root` 令牌 CSS(兼容)
44
- - 用户要求按设计稿 / 规范适配或重构整站风格
45
- - 用户附带色板、规范或 HTML 原型
46
-
47
- 动手改文件前先输出**规范识别回执**(见下文)。
48
-
49
- ## 收集产出(优先级)
50
-
51
- | 优先 | 形态 | 用途 |
52
- |------|------|------|
53
- | **1** | **`design-handoff/v1` JSON** | 结构化写入 tokens / 几何 / `ShowModel`(**首选**) |
54
- | 2 | 前端落地交接块 | `data-theme` / 侧栏 / DarkMode / 主色 |
55
- | 3 | 令牌 CSS(`--brand-*` / `--primary-*` 等) | 写入 `design-tokens.scss` |
56
- | 4 | 几何/间距数值 | 覆盖桥接令牌;缺则保留模版默认 |
57
- | 5 | HTML/CSS 原型 | 微调 `element-plus.scss` |
58
- | 6 | 项目已有 `design-tokens.scss` | 读现状 |
59
-
60
- 定位 JSON:
61
-
62
- 1. 会话中的 ` ```json ` 且含 `"$schema": "design-handoff/v1"`
63
- 2. 仓库 `design/design-handoff.json`(或用户指定路径)
64
- 3. 附件同名文件
65
-
66
- 有 JSON 时:**以 JSON 为准**;交接块 / 零散 CSS 仅补 JSON 未覆盖字段。
67
- 无 JSON 时:回退优先 2~5(旧协议),并在回执中注明「建议补齐 design-handoff/v1」。
68
-
69
- 缺主色阶 →「待确认」;有 `brandPrimary` 则可先落主色与壳桥接,禁止虚构 `primaryScale`。
70
-
71
- ---
72
-
73
- ## JSON → 模版映射(`design-handoff/v1`)
74
-
75
- 设计侧 schema 见上游 `handoff-output.md`(字段名以下表为准)。
76
-
77
- ### `meta` / `shell` → 配置
78
-
79
- | JSON 字段 | 落点 | 写入 |
80
- |-----------|------|------|
81
- | `tokens.brandPrimary` | `platform-config.json` → `EpThemeColor` | HEX;并 bump `Version` |
82
- | `shell.darkMode` | `platform-config.json` → `DarkMode` | boolean |
83
- | `shell.sidebar` | `platform-config.json` → **`Theme`** + `--sidebar-*` | **`dark-gradient`(设计默认)→ `Theme: "default"`**(深色侧栏);仅当设计明确要白菜单才 `"light"`。**禁止**因 contentMode=light 写成 Theme=light |
84
- | `shell.contentMode` / `darkMode` | `OverallStyle` / `DarkMode` | 设计浅色内容:`OverallStyle: "light"` + `DarkMode: false` |
85
- | `shell.dataTheme` | 可选;缺省时 `dark-gradient` → 运行时 `data-theme=default` | 与 Theme 一致 |
86
- | `shell.showModel` | `ShowModel` | 以 JSON 为准(设计常 `line`) |
87
- | `shell.contentMargin` | `--layout-content-padding` / `--vts-margin` | 如 `24`;有 handoff 才覆盖出厂 8 |
88
- | (整次落地) | **`Version` 自增** | **必做**;否则 localStorage 不重灌,Theme/ShowModel 不生效 |
89
-
90
- 写入后:硬刷新或等 Version 失效逻辑清掉旧 `layout`/`configure`。
91
-
92
- ### `geometry` → 令牌
93
-
94
- | JSON 字段 | CSS 变量(`design-tokens.scss` / 桥接) |
95
- |-----------|----------------------------------------|
96
- | `headerHeight`(JSON geometry) | `--header-height` / `--layout-header-height` |
97
- | `tabsHeight` | `--tabs-height`(壳层多标签栏;**不是** `--tabs-item-height`) |
98
- | `siderWidth` | `--sidebar-width` / `--layout-sider-width` |
99
- | `siderCollapsedWidth` | `--sidebar-collapsed-width` / `--layout-sider-collapsed-width` |
100
- | `contentPadding` / `shell.contentMargin` | `--layout-content-padding` → `--vts-margin`(不一致时以 `contentMargin` 为准并回执) |
101
- | `tagCardHeight` | `--vts-tag-card-height`(`showModel=card`) |
102
- | `tagCardRadius` | `--vts-tag-card-radius`(`showModel=card`) |
103
- | `tagCardGap` | `--vts-tag-card-gap`(`showModel=card`) |
104
- | `homeTabSize` | 首页纯图标页签边长(`showModel=line`,常见 40) |
105
- | `tagDividerWidth` | 页签间竖分割线宽(`showModel=line`,常见 1) |
106
-
107
- 可选(设计组件规范提及或 handoff.notes 给出时写入):
108
-
109
- | 语义 | CSS 变量 | 出厂参考 |
110
- |------|----------|----------|
111
- | EP 内容 Tabs 项高 | `--tabs-item-height` | 46 |
112
- | 弹窗头/底高 | `--dialog-header-height` / `--dialog-footer-height` | 38 |
113
- | 弹窗 body 内边距 | `--dialog-body-padding` | 15 |
114
- | 弹窗圆角 | `--dialog-border-radius` | 10(设计落地可改 `--radius-lg`) |
115
- | 按钮水平 padding | `--button-padding-x` | 15 |
116
- | Switch | `--switch-min-width` / `--switch-height` / `--switch-border-radius` | 36 / 20 / 10 |
117
- | 页脚高 | `--layout-footer-height` | 48 |
118
-
119
- 改几何后:**不要**让业务页重写 `100vh`;定高列表走 `%` / flex(`vts-page-card`)。
120
-
121
- **硬要求**:落地前 grep `src/layout`、`ReDialog`、`element-plus.scss` 壳层几何,确认消费的是 `var(--…)`;若仍有不可覆盖裸 px,**先改代码再写令牌**。
122
-
123
- ### `tokens` → `design-tokens.scss`
124
-
125
- | JSON 字段 | CSS 变量 |
126
- |-----------|----------|
127
- | `brandPrimary` | `--brand-primary`;`--primary-5` / `--primary-color`;`--el-color-primary` 桥接保持 `var(--brand-primary)` |
128
- | `brandHover` | `--brand-hover` |
129
- | `brandActive` | `--brand-active` |
130
- | `primaryScale[0..9]` | `--primary-0` … `--primary-9`;并设 `--primary-hover` = scale[6],`--primary-active` = scale[7],`--primary-bg` = scale[0](或设计指定),`--primary-bg-hover` = scale[1] |
131
- | `success` | `--success-color` |
132
- | `warning` | `--warning-color` |
133
- | `error` | `--error-color` 与 **`--error-6`**(同值) |
134
- | `errorBg` | `--error-bg`(有则写) |
135
- | `layoutBg` | `--layout-bg` |
136
- | `componentBg` | `--component-bg` |
137
-
138
- 校验:`primaryScale.length === 10` 且 `primaryScale[5] === brandPrimary`;否则回执「待确认」并先写 brand,禁止补造色阶。
139
-
140
- ### `componentSize` → 控件高度
141
-
142
- | JSON | 令牌 |
143
- |------|------|
144
- | `sm` | `--control-height-sm` / `--component-size-sm` / `--el-component-size-small` |
145
- | `base` | `--control-height` / `--component-size-base` / `--el-component-size` |
146
- | `lg` | `--control-height-lg` / `--component-size-lg` / `--el-component-size-large` |
147
-
148
- 细则见 `design-system` 7.5.8。缺档 → 回退至 default(base),回执注明。
149
-
150
- ### `visual` → 视觉表现令牌(`design-tokens.scss` 视觉段 + `design-visual.scss`)
151
-
152
- 有 `visual` 字段时写入 `design-tokens.scss` 的「视觉表现令牌」段;`design-visual.scss` 规则结构不动,只通过令牌值变化生效。
153
-
154
- | JSON 字段 | CSS 变量 | 用途 |
155
- |-----------|----------|------|
156
- | `visual.shadowCardRest` | `--shadow-card-rest` | 卡片静态阴影 |
157
- | `visual.shadowCardHover` | `--shadow-card-hover` | 卡片悬停阴影 |
158
- | `visual.shadowButtonHover` | `--shadow-button-hover` | 按钮悬停阴影 |
159
- | `visual.shadowInputFocus` | `--shadow-input-focus` | 输入框聚焦光环 |
160
- | `visual.shadowDialog` | `--shadow-dialog` | 弹窗阴影 |
161
- | `visual.transitionBase` | `--transition-base` | 基础过渡曲线 |
162
- | `visual.buttonHoverTransform` | `--transform-button-hover` | 按钮 hover 变换 |
163
- | `visual.tableHeaderBorderBottom` | `--table-header-border-bottom` | 表头强调底线 |
164
- | `visual.menuActiveBorderRight` | `--menu-active-border-right` | 菜单激活强调条 |
165
-
166
- 缺项 → 保留出厂默认值,回执标明。
167
-
168
- ### `layout` → 页面构图令牌(`design-tokens.scss` 构图段 + `design-layout.scss`)
169
-
170
- 有 `layout` 字段时写入 `design-tokens.scss` 的「页面构图令牌」段;`design-layout.scss` 规则结构不动。
171
-
172
- | JSON 字段 | CSS 变量 | 用途 |
173
- |-----------|----------|------|
174
- | `layout.pageHeaderMargin` | `--page-header-margin` | 标题区下边距 |
175
- | `layout.filterAreaRadius` | `--filter-area-radius` | 筛选区圆角 |
176
- | `layout.filterAreaPaddingY` | `--filter-area-padding-y` | 筛选区上下内边距 |
177
- | `layout.filterAreaPaddingX` | `--filter-area-padding-x` | 筛选区左右内边距 |
178
- | `layout.actionBarGap` | `--action-bar-gap` | 操作栏按钮间距 |
179
- | `layout.tableAreaBorderRadius` | `--table-area-border-radius` | 表格区圆角 |
180
- | `layout.emptyStatePadding` | `--empty-state-padding` | 空状态间距 |
181
-
182
- 缺项 → 保留出厂默认值,回执标明。
183
-
184
- ### 卡片页签关闭色(设计约束)
185
-
186
- - 关闭 hover:圆形底 `--layout-bg`(=`tokens.layoutBg`)+ 图标 `--error-6` / `tokens.error`(`#F5222D`)
187
- - **禁止**用 Element Plus 默认 danger `#F56C6C` 冒充错误色
188
-
189
- ---
190
-
191
- ## 覆盖清单
192
-
193
- | # | 落点 | 写入 |
194
- |---|------|------|
195
- | A | `src/styles/design-tokens.scss` | 令牌 CSS;深色侧栏时追加 `--sidebar-*`;`visual` / `layout` 段 |
196
- | B | `theme.scss` 当前 `html[data-theme]` | `--vts-theme-*` → `--sidebar-*` |
197
- | C | `public/platform-config.json` | `EpThemeColor` / `Theme` / `DarkMode` / **`ShowModel`**;`Version` 自增 |
198
- | D | `index.scss` | `design-tokens` → `design-visual` → `design-layout` 最先;按需 `--vts-margin` / `--vts-tag-card-*` |
199
- | E | `dark.scss` / 语义色 | 跟 `--primary-*` / `--error-*`;视觉层+构图层暗色覆盖 |
200
- | F | 冲突清单 | `design-system` 第四节 |
201
- | G | 规范识别回执 | 动手改文件前输出 |
202
- | H | (可选)`design/design-handoff.json` | 若用户要求落盘,写入校验后的 JSON 副本 |
203
-
204
- ### 页签风格(ShowModel)
205
-
206
- 模版出厂常见:`smart` / `chrome` / `card`。设计 handoff 当前默认 **`line`**(无容器文字页签,见上游 `handoff-output.md`)。
207
-
208
- | 场景 | `ShowModel` |
209
- |------|-------------|
210
- | 模版出厂、未落地设计 | 保持项目现有值,**勿强行改** |
211
- | 设计 handoff 落地 | **写入 JSON 的 `shell.showModel`**(默认 `line`;旧 JSON 可能为 `card`) |
212
- | JSON=`line` 且模版无实现 | 回执待实现;勿改写成 `card` |
213
- | 用户在设置面板手动切换 | 以用户选择为准 |
214
-
215
- 侧栏派生(`shell.sidebar === "dark-gradient"` 时 **整组必写**):
216
-
217
- > 设计「浅色模式」= 内容浅 + 侧栏 `#001529`。落地时:
218
-
219
- ```json
220
- // platform-config.json(示例片段)
221
- {
222
- "Version": "<原值+1>",
223
- "Theme": "default",
224
- "OverallStyle": "light",
225
- "DarkMode": false,
226
- "EpThemeColor": "<brandPrimary>"
227
- }
228
- ```
229
-
230
- ```scss
231
- /* design-tokens.scss */
232
- --sidebar-bg: #001529;
233
- --sidebar-logo-bg: #002140;
234
- --sidebar-border-color: transparent;
235
- --sidebar-menu-text: rgb(255 255 255 / 65%);
236
- --sidebar-menu-text-hover: #fff;
237
- --sidebar-menu-active-text: #fff;
238
- --sidebar-menu-hover-bg: rgb(255 255 255 / 8%);
239
- --sidebar-menu-active-bg: var(--primary-color);
240
- --sidebar-submenu-bg: color-mix(in srgb, #001529 82%, #000);
241
- --sidebar-active-indicator: var(--primary-color);
242
- ```
243
-
244
- `theme.scss` 中 `html[data-theme='default']` 已桥接 `--sidebar-*`。
245
- 自检:DevTools 中 `html` 的 `data-theme="default"`,`.sidebar-container` 背景为 `#001529`(非 `#fff`)。
246
-
247
- ---
248
-
249
- ## 落地原子步骤(Agent 必按序;缺一步=失败)
250
-
251
- 有 `design-handoff/v1` 时,**同一轮**完成:
252
-
253
- 1. 回执(规范识别)
254
- 2. 写 `design-tokens.scss`:`brand*` / `primaryScale` / 几何 / **`--sidebar-*`(dark-gradient)** / contentMargin
255
- 3. 写 `platform-config.json`(**整组**):
256
- - `EpThemeColor` = brandPrimary
257
- - `Theme` = **`default`**(若 `shell.sidebar=dark-gradient`)
258
- - `OverallStyle` = `light`(若 contentMode=light)
259
- - `DarkMode` = shell.darkMode
260
- - `ShowModel` = shell.showModel
261
- - **`Version` 自增**(字符串或数字均可,须与上次不同)
262
- 4. 核对表 A~E;硬失败项见下
263
- 5. 回执「已覆盖 / 保留出厂」;提醒用户**硬刷新**一次(Version 会清 layout 缓存)
264
-
265
- **反例(禁止)**:只改 `EpThemeColor` / `:root` 主色 → 侧栏仍白、未达完整落地效果。
266
-
267
- ## 规范识别回执(动手前必出)
268
-
269
- ```markdown
270
- ## 规范识别回执
271
- - 来源形态:design-handoff/v1 JSON | 交接块 | 令牌 CSS | 混合
272
- - 主题:{themeName} / {themeId} / 主色 {brandPrimary}
273
- - ShowModel:{json.showModel,如 line/card}(将写入)| 保持现有 | line 待实现
274
- - 几何:header {n} / tabs {n} / margin {n}
275
- - 主色阶:完整 10 级 | 仅 brand(待确认色阶)
276
- - 侧栏:dark-gradient | light
277
- - 将改文件:design-tokens.scss / platform-config.json / index.scss / …
278
- ```
279
-
280
- ---
281
-
282
- ## 顺序
283
-
284
- 1. 收集产出(JSON 优先)
285
- 2. 规范识别回执
286
- 3. A→E(按映射表写)
287
- 4. F 冲突核对
288
- 5. 验证侧栏 / 主色 / 页签(按 JSON `showModel`)/ 内容边距
289
- 6. 提醒清 `localStorage`(改了 `EpThemeColor` / `ShowModel` / `Version` 时)
290
- 7. 若同轮还有业务需求 → 再写/改 views(仅样式任务则到此结束)
291
-
292
- ---
293
-
294
- ## 兼容:旧交接块字段
295
-
296
- 无 JSON 时仍可认(可整块粘贴到会话):
297
-
298
- - 设计来源:上游产出
299
- - 主题色系:`<主题中文名>`
300
- - data-theme:`<模版 html[data-theme] 值>`
301
- - 侧栏:深色渐变 | 浅色
302
- - 内容区默认:亮色 | 暗黑
303
- - 主色:`#HEX`
304
- - ShowModel:以设计为准(当前规范默认 `line`;旧稿 `card`)| `smart` | `chrome`(未落地设计时保留模版默认)
305
-
306
- 设计令牌 CSS 须含主色阶,并**建议含组件尺寸三档**:
307
-
308
- ```css
309
- :root {
310
- --brand-primary: #...;
311
- --brand-hover: #...;
312
- --brand-active: #...;
313
- --primary-0: #...;
314
- /* --primary-1 … --primary-9 */
315
- --component-size-sm: 24px;
316
- --component-size-base: 32px;
317
- --component-size-lg: 40px;
318
- }
319
- ```
320
-
321
- | 档位 | 像素 | EP / 通用 API | 模版令牌 |
322
- |------|------|---------------|----------|
323
- | small | 24px | `size="small"` | `--control-height-sm` / `--el-component-size-small` |
324
- | default | 32px | 不写 size | `--control-height` / `--el-component-size`【全站默认】 |
325
- | large | 40px | `size="large"` | `--control-height-lg` / `--el-component-size-large` |
326
-
327
- 仅有交接块无令牌 CSS:写 `--brand-primary` + `EpThemeColor`,待确认注明缺色阶。
328
-
329
- ---
330
-
331
- ## 设计落地 · 全量令牌核对表(强制)
332
-
333
- > **出厂默认保留**;仅在有设计 handoff /「按设计规范适配」时执行。设计未给出的项勾「保留出厂」。漏项 = 硬失败风险。
334
-
335
- ### A. 壳层与页签
336
-
337
- | 设计语义 | 写入令牌 | 缺省 |
338
- |----------|----------|------|
339
- | 顶栏高 | `--header-height` / `--layout-header-height` | 出厂 64 |
340
- | 多标签栏高 | `--tabs-height` | 40 |
341
- | 侧栏宽 / 收起 | `--sidebar-width` / `--sidebar-collapsed-width` | 208 / 64 |
342
- | 内容区内边距 | `--layout-content-padding` → `--vts-margin` | 出厂 8;设计常 24 |
343
- | 页脚高 | `--layout-footer-height` | 48 |
344
- | 页签风格 | `ShowModel` = JSON `shell.showModel` | 未落地勿改 |
345
- | 侧栏(设计浅色页) | `Theme=default` + `--sidebar-bg:#001529` + **Version++** | 出厂 `Theme=light` 白侧栏;落地勿漏 |
346
- | 页签关闭/错误色 | `--error-color` / `--error-6` | `#F5222D` |
347
-
348
- ### B. 色板与文字
349
-
350
- | 设计语义 | 写入令牌 | 缺省 |
351
- |----------|----------|------|
352
- | 主色 / hover / active | `--brand-*` + `EpThemeColor` | 出厂 `#409EFF` |
353
- | 主色 10 阶 | `--primary-0`…`--primary-9`、`--primary-5` | 无阶则待确认,至少 `--primary-5=brand` |
354
- | 成功/警告/错误 | `--success-color` / `--warning-color` / `--error-color` | 设计功能色 |
355
- | 中性文字/边框/底 | `--text-*` / `--border-*` / `--layout-bg` / `--component-bg` | 出厂 |
356
- | 弹窗渐变顶色 | `--primary-bg`、`--ds-dialog-bg` | 随 brand 浅混 |
357
-
358
- ### C. 控件与反馈几何
359
-
360
- | 设计语义 | 写入令牌 | 缺省 |
361
- |----------|----------|------|
362
- | 控件三档 | `--control-height*` / `--component-size-*` / `--el-component-size*` | 24/32/40 |
363
- | 按钮水平 padding | `--button-padding-x` | 15 |
364
- | 圆角 | `--radius-sm/base/lg` | 4/6/8 |
365
- | Card 内边距 | `--card-padding` / `--vts-card-padding` | 24 |
366
- | Switch | `--switch-min-width/height/border-radius` | 出厂 36/20/10;设计若写 44×22 则覆盖 |
367
- | Tag | `--tag-height` / `--tag-line-height` | 22/20 |
368
- | EP 内容 Tabs 项高 | `--tabs-item-height` | 46(≠ 壳层 tabs) |
369
- | 菜单项高 | `--el-menu-item-height` | 40 |
370
-
371
- ### D. 弹窗(出厂可保留;设计 Modal 规范出现则必须回填)
372
-
373
- | 设计语义(component-spec Modal 等) | 写入令牌 | 出厂(未设计时) |
374
- |----------|----------|------------------|
375
- | 弹窗圆角(设计常 8) | `--dialog-border-radius` | 10 |
376
- | 头/底高度或 padding | `--dialog-header-height` / `--dialog-footer-height` / padding 令牌 | 38 / 38 |
377
- | 内容区内边距 | `--dialog-body-padding` | 15 |
378
- | MessageBox 更紧凑 padding | `--message-box-*-padding` | 8×16 |
379
-
380
- 回填后确认 `ReDialog` / MessageBox 已 `var(--…)` 消费(改令牌即变,无需改业务页)。
381
-
382
- ### E. 落地后自检
383
-
384
- - [ ] `platform-config`:`EpThemeColor` + **`Theme=default`(深色侧栏)** + `OverallStyle` + `ShowModel` + **`Version++`**
385
- - [ ] `--sidebar-bg` 为 `#001529`;运行时 `data-theme=default`(不是 light)
386
- - [ ] 硬刷新后侧栏仍深色(证明 Version 已清缓存)
387
- - [ ] grep 壳层与 ReDialog:无不可覆盖裸 px
388
- - [ ] 回执列出「已覆盖 / 保留出厂」
389
-
390
- ---
391
-
392
- ## 硬失败(code-quality 可引用)
393
-
394
- | 条件 | 处理 |
395
- |------|------|
396
- | 设计 `sidebar=dark-gradient` 但 `Theme` 仍为 `light`(或未改) | **硬失败**:改为 `default` 并 Version++ |
397
- | 设计落地只改了主色/tokens,未改 Theme / Version | **硬失败**:补全原子步骤 |
398
- | 用户要求按设计落地,但未写入 JSON 中的 `shell.showModel` | 硬失败:按 JSON 补写 |
399
- | JSON 有 `primaryScale` 但未写入 `--primary-0..9` | 硬失败 |
400
- | 用 `#F56C6C` 或未映射的 EP danger 代替 `tokens.error` | 硬失败:改为 `#F5222D` |
401
- | 改了 margin 后列表仍用 `100vh` 减顶栏 | 硬失败:迁 flex/`vts-page-card` |
402
- | 设计落地后壳层/弹窗写死 px | 硬失败:改 `var(--…)` |
403
- | 核对表有漏项且未标「保留出厂」 | 硬失败 |
1
+ ---
2
+ skill: design-handoff
3
+ description: 收到 design-handoff/v1 JSON 后,按逐文件修改清单执行。配置→令牌→框架组件→样式→页面代码,5 步 51 项。
4
+ scope: project
5
+ tags: [handoff, design-tokens, upstream, artifacts, json, modification-checklist]
6
+ ---
7
+
8
+ # 设计落地修改清单
9
+
10
+ > 收到 `design-handoff/v1` JSON 后,AI 按本清单逐项执行修改。
11
+ > 每一项标注:JSON 来源 → 项目文件 → 修改内容 → 验证点。
12
+ > 模板源码保持出厂状态,所有修改在 AI 生成/修改代码时完成。
13
+ >
14
+ > 1:1 还原要求见设计 Skill 的 `project-implementation-protocol.md`。
15
+
16
+ ## 双轨
17
+
18
+ | 场景 | 行为 |
19
+ |------|------|
20
+ | **未调用设计 / 无 handoff** | 保持模板出厂(主色 `#409EFF`、`Theme: light`=白侧栏、`ShowModel: chrome`、margin 8) |
21
+ | **有 design-handoff/v1 JSON** | 按本清单 5 步 51 项逐项执行;只改主色不改 Theme/Version = **落地失败** |
22
+
23
+ ## 触发
24
+
25
+ - 会话 / 附件 / 仓库中有 `design-handoff/v1` JSON(`$schema` 字段识别)
26
+ - 用户要求按设计稿 / 规范适配或重构整站风格
27
+ - 命中 `design-system` 模块且设计 Skill 产出可用
28
+
29
+ ## 规范识别回执(动手前必出)
30
+
31
+ ```markdown
32
+ ## 规范识别回执
33
+ - 来源形态:design-handoff/v1 JSON
34
+ - 主题:{themeName} / {themeId} / 主色 {brandPrimary}
35
+ - ShowModel:{shell.showModel}
36
+ - 几何:header {n} / tabs {n} / margin {n}
37
+ - 主色阶:完整 10 级
38
+ - 侧栏:{shell.sidebar}
39
+ - 结构要求:{structureRequirements.frameworkShell.header.length} 项
40
+ - 交互要求:{Object.keys(interactionSpecs).length} 类
41
+ - 将改文件:platform-config.json / design-tokens.scss / navbar / sidebar / tabs / app-main / element-plus.scss / dark.scss / 业务页面
42
+ ```
43
+
44
+ ---
45
+
46
+ ## 一、配置文件修改(C1-C8)
47
+
48
+ | # | JSON 来源 | 项目文件 | 修改内容 | 验证 |
49
+ |---|---------|---------|---------|------|
50
+ | C1 | `shell.sidebar` | `platform-config.json` → `Theme` | `dark-gradient` → `default`(深色侧栏);仅明确要白菜单时 `light` | 侧栏背景为 `#001529` |
51
+ | C2 | `shell.showModel` | `platform-config.json` → `ShowModel` | 设为 JSON 值(`line`/`card`/`chrome`/`smart`) | 页签风格与设计一致 |
52
+ | C3 | `shell.darkMode` | `platform-config.json` → `DarkMode` | `true`/`false` | 暗色模式开关 |
53
+ | C4 | `shell.contentMode` | `platform-config.json` → `OverallStyle` | `vertical`/`horizontal`/`mix` | 布局模式 |
54
+ | C5 | `shell.contentMargin` | `platform-config.json` → `contentMargin` | 数值(如 24) | 内容区间距 |
55
+ | C6 | `tokens.brandPrimary` | `platform-config.json` → `EpThemeColor` | HEX 值 | 主色全局生效 |
56
+ | C7 | `shell.dataTheme` | `platform-config.json` → `dataTheme` | 主题标识(如 `default`) | 侧栏主题色 |
57
+ | C8 | — | `platform-config.json` → `Version` | **必须自增**(如 `0.0.5` → `0.0.6`) | 否则 localStorage 缓存不刷新 |
58
+
59
+ **禁止**:把设计「浅色内容」写成 `Theme=light`。`contentMode=light` 与 `Theme=light` 不是一回事。深色侧栏 = `Theme=default`。
60
+
61
+ ---
62
+
63
+ ## 二、令牌文件修改(T1-T12)
64
+
65
+ 写入 `src/styles/design-tokens.scss`,只改值,不改结构。
66
+
67
+ | # | JSON 段 | 令牌段 | 修改内容 | 验证 |
68
+ |---|---------|--------|---------|------|
69
+ | T1 | `tokens` | 颜色段 | `--brand-primary` / `--primary-0..9` / `--success-color` / `--warning-color` / `--error-color` / `--layout-bg` / `--component-bg` | 值与 JSON 一致;`primaryScale[5] === brandPrimary` |
70
+ | T2 | `typography` | 字体段 | `--font-family` / `--font-size-*` / `--font-weight-*` / `--line-height-*` | 值与 JSON 一致 |
71
+ | T3 | `spacing` | 间距段 | `--spacing-base` / `--spacing-xs..2xl` | 值与 JSON 一致 |
72
+ | T4 | `radius` | 圆角段 | `--radius-none..full` | 值与 JSON 一致 |
73
+ | T5 | `border` | 边框段 | `--border-width` / `--border-color` / `--border-color-light` / `--border-color-dark` / `--split-color` | 值与 JSON 一致 |
74
+ | T6 | `zIndex` | 层级段 | `--z-content` / `--z-header` / `--z-sider` / `--z-tabs` / `--z-dropdown` / `--z-modal` 等 | 值与 JSON 一致 |
75
+ | T7 | `responsive` | 响应式段 | `--breakpoint-xs..2xl` | 值与 JSON 一致 |
76
+ | T8 | `visual` | 视觉段 | `--shadow-card-rest` / `--shadow-card-hover` / `--shadow-button-hover` / `--shadow-input-focus` / `--shadow-dialog` / `--transition-base` / `--transform-button-hover` / `--table-header-border-bottom` / `--menu-active-border-right` | 值与 JSON 一致 |
77
+ | T9 | `layout` | 构图段 | `--page-header-margin` / `--filter-area-radius` / `--filter-area-padding-y/x` / `--action-bar-gap` / `--table-area-border-radius` / `--empty-state-padding` | 值与 JSON 一致 |
78
+ | T10 | `geometry` | 框架段 | `--header-height` / `--tabs-height` / `--sidebar-width` / `--sidebar-collapsed-width` / `--layout-content-padding` | 值与 JSON 一致 |
79
+ | T11 | `componentSize` | 控件段 | `--control-height-sm` / `--control-height` / `--control-height-lg` | 值与 JSON 一致 |
80
+ | T12 | `dataViz` | 可视化段 | `--chart-categorical-*` / `--chart-success` / `--chart-warning` 等 | 值与 JSON 一致 |
81
+
82
+ 侧栏深色(`shell.sidebar === "dark-gradient"`)时追加写入 `design-tokens.scss`:
83
+
84
+ ```scss
85
+ --sidebar-bg: #001529;
86
+ --sidebar-logo-bg: #002140;
87
+ --sidebar-border-color: transparent;
88
+ --sidebar-menu-text: rgb(255 255 255 / 65%);
89
+ --sidebar-menu-text-hover: #fff;
90
+ --sidebar-menu-active-text: #fff;
91
+ --sidebar-menu-hover-bg: rgb(255 255 255 / 8%);
92
+ --sidebar-menu-active-bg: var(--primary-color);
93
+ --sidebar-submenu-bg: color-mix(in srgb, #001529 82%, #000);
94
+ --sidebar-active-indicator: var(--primary-color);
95
+ ```
96
+
97
+ ---
98
+
99
+ ## 三、框架组件修改(F1-F14 · 1:1 还原核心)
100
+
101
+ > 此节实现 `structureRequirements` 和 `interactionSpecs` 的要求。
102
+ > 模板源码保持出厂,AI 获取 JSON 后逐项修改组件代码。
103
+
104
+ ### 3.1 顶栏 navbar
105
+
106
+ | # | JSON 来源 | 项目文件 | 修改内容 | 验证 |
107
+ |---|---------|---------|---------|------|
108
+ | F1 | `structureRequirements.frameworkShell.header` | `src/layout/components/navbar/index.vue` | 顶栏组成:折叠按钮(左)+ 语言切换 + 功能图标组 + 分割线 + 欢迎区 + 头像(右) | 元素完整 |
109
+ | F2 | `interactionSpecs.languageSwitch` | navbar/ 语言切换组件 | **改为内联文字**(中 / EN),竖线分隔。激活态品牌色文字,非激活次要色。**禁止下拉框** | 语言切换为内联文字 |
110
+ | F3 | `structureRequirements.frameworkShell.headerLayout` | navbar/index.vue | flex 两端对齐:左侧折叠按钮,右侧功能组 | 布局与设计一致 |
111
+ | F4 | `interactionSpecs.menuActive` → 头像区 | navbar/ 欢迎区 | 悬停态:头像微浮起 + 欢迎文字变品牌色 | hover 效果与设计一致 |
112
+
113
+ ### 3.2 侧栏 sidebar
114
+
115
+ | # | JSON 来源 | 项目文件 | 修改内容 | 验证 |
116
+ |---|---------|---------|---------|------|
117
+ | F5 | `structureRequirements.frameworkShell.sidebar.logoArea` | `src/layout/components/sidebar/` | Logo 区:品牌色方块 + 白字(按设计),非默认彩色图标 | Logo 风格统一 |
118
+ | F6 | `structureRequirements.frameworkShell.sidebar.menuItemHeight` | sidebar/ + `element-plus.scss` | 菜单项高度设为设计值(如 40px) | 间距有呼吸感 |
119
+ | F7 | `interactionSpecs.menuActive` | sidebar/ + `element-plus.scss` | **菜单激活态**:品牌色极浅底 + 右侧 3px 强调条 + 品牌色文字 | 激活态视觉锚点清晰 |
120
+ | F8 | `structureRequirements.frameworkShell.sidebar.collapsed` | sidebar/ 折叠态 | 仅图标,宽度按 `geometry.siderCollapsedWidth` | 折叠宽度与设计一致 |
121
+ | F9 | `shell.sidebar` → 深色侧栏 | `theme.scss` / `sidebar.scss` | 侧栏背景色 `#001529`(深色),非出厂白色 | 侧栏深色 |
122
+
123
+ ### 3.3 页签 tabs
124
+
125
+ | # | JSON 来源 | 项目文件 | 修改内容 | 验证 |
126
+ |---|---------|---------|---------|------|
127
+ | F10 | `shell.showModel` | `src/layout/components/tabs/` + `element-plus.scss` | 页签风格按设计值实现(line: 底部强调线;card: 卡片式;chrome: 谷歌式) | 风格与设计一致 |
128
+ | F11 | `structureRequirements.frameworkShell.tabs.homeTab` | tabs/ | 首页页签固定左侧,不可关闭 | 首页页签行为正确 |
129
+ | F12 | `interactionSpecs.tabsActive` | `element-plus.scss` | 激活页签:品牌色文字 + 底部强调线(line 风格) | 激活态视觉与设计一致 |
130
+
131
+ ### 3.4 内容区 app-main
132
+
133
+ | # | JSON 来源 | 项目文件 | 修改内容 | 验证 |
134
+ |---|---------|---------|---------|------|
135
+ | F13 | `geometry.contentPadding` | `src/layout/components/app-main/` + `design-tokens.scss` | 内容区内边距设为设计值(如 24px),非出厂 8px | 间距有呼吸感 |
136
+ | F14 | `tokens.layoutBg` | app-main/ + `design-tokens.scss` | 内容区背景色设为设计值(如 `#F5F5F5`) | 背景层次分明 |
137
+
138
+ ---
139
+
140
+ ## 四、样式文件修改(S1-S10)
141
+
142
+ 写入 `src/styles/element-plus.scss`(在既有规则基础上追加视觉规则段,引用令牌变量)。
143
+
144
+ | # | JSON 来源 | 项目文件 | 修改内容 | 验证 |
145
+ |---|---------|---------|---------|------|
146
+ | S1 | `visual.shadowCardRest` | `element-plus.scss` → `.el-card` | 静态阴影值 | 卡片有微妙投影 |
147
+ | S2 | `visual.shadowCardHover` + `interactionSpecs.cardHover` | `element-plus.scss` → `.el-card:hover` | 浮起阴影 + 边框变品牌色 + 过渡 | 卡片 hover 有浮起感 |
148
+ | S3 | `interactionSpecs.buttonHover` | `element-plus.scss` → `.el-button:hover` | `translateY(-1px)` + 品牌色阴影 + 过渡 | 按钮 hover 有上浮感 |
149
+ | S4 | `interactionSpecs.inputFocus` | `element-plus.scss` → `.el-input__wrapper:focus` | 品牌色边框 + 3px 外光环 + 过渡 | 输入框聚焦有光环 |
150
+ | S5 | `interactionSpecs.tableRowHover` | `element-plus.scss` → `.el-table tbody tr:hover` | 品牌色极浅底 + 过渡 | 行 hover 有品牌色感 |
151
+ | S6 | `visual.tableHeaderBorderBottom` | `element-plus.scss` → `.el-table thead th` | 表头底色 + 字重 + 底部强调线 | 表头有层次感 |
152
+ | S7 | `visual.menuActiveBorderRight` | `element-plus.scss` → `.el-menu-item.is-active` | 右侧 3px 强调条 | 菜单激活有锚点 |
153
+ | S8 | `interactionSpecs.paginationActive` | `element-plus.scss` → `.el-pagination .is-active` | 品牌色底 + 白字 + 圆角 | 分页激活页有品牌色 |
154
+ | S9 | `visual.transitionBase` | `element-plus.scss` → 全局过渡 | 过渡时长 + 缓动曲线 | 交互有平滑感 |
155
+ | S10 | — | `src/styles/dark.scss` | 以上所有视觉规则在暗色模式下有覆盖 | 暗色模式完整 |
156
+
157
+ > 视觉规则直接写入 `element-plus.scss`,引用令牌变量。设计落地时令牌值变化即生效,规则结构不动。
158
+
159
+ ---
160
+
161
+ ## 五、页面代码修改(P1-P7)
162
+
163
+ | # | JSON 来源 | 项目文件 | 修改内容 | 验证 |
164
+ |---|---------|---------|---------|------|
165
+ | P1 | `pageStructure.regions` | 页面 .vue 文件 | 按 JSON 的 regions 列表实现页面区域,**不照抄 crud-pages 样板**,以 JSON 结构为准 | 区域完整且顺序正确 |
166
+ | P2 | `structureRequirements.moduleComposition.pageHeader` | 页面 .vue → `.vts-page-header` | 标题 + 描述 + 操作按钮,flex 两端对齐 | 有页面标题区 |
167
+ | P3 | `structureRequirements.moduleComposition.filterArea` | 页面 .vue → `.vts-filter-area` | 独立容器:背景 + 圆角 + 底部分隔线 | 筛选区有容器感 |
168
+ | P4 | `structureRequirements.moduleComposition.tableArea` | 页面 .vue → `.vts-table-area` | 圆角 + 边框包裹 | 表格区有包裹感 |
169
+ | P5 | `structureRequirements.moduleComposition.actionBar` | 页面 .vue → `.vts-action-bar` | 左侧批量操作 + 右侧工具按钮 | 操作栏布局正确 |
170
+ | P6 | `interactionSpecs.*` | 页面 .vue | 页面内交互行为按 interactionSpecs 实现 | 交互完整 |
171
+ | P7 | `tokens.*` | 页面 .vue | 所有值引用 CSS 变量,无硬编码 | 无裸值 |
172
+
173
+ ### crud-pages.md 设计模式样板的使用方式
174
+
175
+ `crud-pages.md` 的设计模式样板是**起始模板**,不是最终代码。AI 使用时必须:
176
+
177
+ 1. 以样板为基础结构
178
+ 2. 读 JSON 的 `pageStructure.regions`,按实际区域调整(增/减/改顺序)
179
+ 3. 读 JSON 的 `structureRequirements.moduleComposition`,按实际布局调整区域内部结构
180
+ 4. 读 JSON 的 `interactionSpecs`,在页面代码中实现交互行为
181
+ 5. Re* 组件(ReTableBar / RePagination / ReTableOperate / ReGrid)的使用方式不变
182
+ 6. CSS 钩子类(`.vts-page-header` / `.vts-filter-area` / `.vts-table-area`)按 JSON `structureRequirements` 调整
183
+
184
+ ---
185
+
186
+ ## 六、执行顺序
187
+
188
+ 1. **配置修改**(C1-C8)→ `platform-config.json`
189
+ 2. **令牌写入**(T1-T12)→ `design-tokens.scss`
190
+ 3. **框架组件修改**(F1-F14)→ navbar / sidebar / tabs / app-main
191
+ 4. **样式修改**(S1-S10)→ `element-plus.scss` + `dark.scss`
192
+ 5. **页面代码生成**(P1-P7)→ 业务页面 .vue
193
+
194
+ ---
195
+
196
+ ## 硬失败
197
+
198
+ | 条件 | 处理 |
199
+ |------|------|
200
+ | 设计 `sidebar=dark-gradient` 但 `Theme` 仍为 `light` | **硬失败**:改为 `default` 并 `Version++` |
201
+ | 只改主色/tokens,未改 Theme / Version | **硬失败**:补全 C1-C8 |
202
+ | 未写入 `shell.showModel` | 硬失败:按 JSON 补写 |
203
+ | `primaryScale` 未写入 `--primary-0..9` | 硬失败 |
204
+ | 用 `#F56C6C` 代替 `tokens.error` | 硬失败:改为 `#F5222D` |
205
+ | 改了 margin 后列表仍用 `100vh` 减顶栏 | 硬失败:迁 flex / `vts-page-card` |
206
+ | 壳层/弹窗写死 px | 硬失败:改 `var(--…)` |
207
+ | 语言切换为下拉框(非内联文字) | 硬失败:改为内联文字 |
208
+ | 菜单激活态无品牌色底+强调条 | 硬失败:按 `interactionSpecs.menuActive` 补充 |
209
+ | 页面无标题区 / 筛选区无容器感 | 硬失败:按 `structureRequirements.moduleComposition` 补充 |
210
+ | `structureRequirements` 或 `interactionSpecs` 段未实现 | 硬失败:按 `project-implementation-protocol.md` 补充 |