@qilitt-mickey/vue3-temp-skill 1.0.8

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 (37) hide show
  1. package/README.md +229 -0
  2. package/SKILL.md +621 -0
  3. package/bin/cli.js +579 -0
  4. package/package.json +46 -0
  5. package/references/advanced-ui.md +302 -0
  6. package/references/api-check.md +272 -0
  7. package/references/base-code-dict.md +48 -0
  8. package/references/build-optim.md +282 -0
  9. package/references/code-quality.md +235 -0
  10. package/references/crud-pages.md +316 -0
  11. package/references/data-compare.md +501 -0
  12. package/references/data-mapping.md +213 -0
  13. package/references/data-screen.md +79 -0
  14. package/references/data-writeback.md +104 -0
  15. package/references/detail-page.md +99 -0
  16. package/references/directives-advanced.md +93 -0
  17. package/references/download-export.md +68 -0
  18. package/references/feedback-loading.md +60 -0
  19. package/references/feedback-ui.md +111 -0
  20. package/references/file-management.md +132 -0
  21. package/references/flowchart-g6.md +244 -0
  22. package/references/form-advanced.md +137 -0
  23. package/references/graph-relation.md +253 -0
  24. package/references/http-api.md +188 -0
  25. package/references/layout-theme.md +540 -0
  26. package/references/mobile-h5.md +271 -0
  27. package/references/permission-auth.md +235 -0
  28. package/references/project-inventory.md +326 -0
  29. package/references/qrcode-barcode.md +92 -0
  30. package/references/rich-text.md +73 -0
  31. package/references/seamless-scroll.md +38 -0
  32. package/references/tree-table.md +111 -0
  33. package/references/ui-components.md +161 -0
  34. package/references/verify-captcha.md +96 -0
  35. package/references/vue-core.md +209 -0
  36. package/references/websocket-realtime.md +176 -0
  37. package/references/workflow-bpmn.md +206 -0
@@ -0,0 +1,540 @@
1
+ ---
2
+ skill: layout-theme
3
+ description: 规范设计系统(CSS 变量体系、主题色、暗黑模式、侧边栏配色、Design Tokens)、布局系统、UnoCSS 桥接、响应式适配和 PC/移动端双端 UI 适配方案。在修改布局、主题、颜色、暗黑模式、样式或使用 ui-ux-pro-max 设计输出时调用。
4
+ scope: project
5
+ tags: [vue3, layout, theme, dark-mode, css-variables, design-tokens, element-plus, vant, dual-ui, unocss, chroma-js, ui-ux-pro-max]
6
+ ---
7
+
8
+ # 设计系统、布局与主题适配
9
+
10
+ ## 一、CSS 变量体系
11
+
12
+ ### 命名规范
13
+
14
+ 项目使用三层 CSS 变量体系,命名前缀 `--vts-*`(Vue3 Template Standard):
15
+
16
+ ```
17
+ ┌─────────────────────────────────────────────────────────┐
18
+ │ 第一层:全局基础变量(:root) │
19
+ │ --vts-transition-duration 动画时长 │
20
+ │ --vts-border-color 通用边框色 │
21
+ │ --vts-switch-off-color Switch 关闭态颜色 │
22
+ │ --vts-bar-height 导航条高度 │
23
+ │ --vts-margin 内容区边距 │
24
+ │ --vts-dialog-bg 弹窗背景(支持渐变) │
25
+ ├─────────────────────────────────────────────────────────┤
26
+ │ 第二层:侧边栏主题变量(html[data-theme]) │
27
+ │ --vts-theme-menu-bg 菜单背景色 │
28
+ │ --vts-theme-menu-text 菜单文字色 │
29
+ │ --vts-theme-menu-hover 菜单悬停背景 │
30
+ │ --vts-theme-sub-menu-bg 子菜单背景色 │
31
+ │ --vts-theme-sub-menu-active-text 子菜单激活文字色 │
32
+ │ --vts-theme-sidebar-logo Logo 区域背景 │
33
+ │ --vts-theme-menu-title-hover 菜单标题悬停色 │
34
+ │ --vts-theme-menu-active-before 激活指示条颜色 │
35
+ ├─────────────────────────────────────────────────────────┤
36
+ │ 第三层:Element Plus 变量(由 JS 动态设置) │
37
+ │ --el-color-primary 主题主色 │
38
+ │ --el-color-primary-light-1~9 主色亮色梯度(brighten) │
39
+ │ --el-color-primary-dark-1~2 主色暗色梯度(darken) │
40
+ │ --el-bg-color 全局背景色 │
41
+ │ --el-text-color-primary 主文字色 │
42
+ │ --el-fill-color-light 填充色(表头等) │
43
+ │ --el-text-color-placeholder 占位文字色 │
44
+ └─────────────────────────────────────────────────────────┘
45
+ ```
46
+
47
+ ### 变量使用规则
48
+
49
+ 1. **业务组件中禁止硬编码颜色值**。所有颜色必须引用 CSS 变量。
50
+ 2. `--vts-*` 变量用于全局布局相关样式,`--el-*` 变量用于 Element Plus 组件相关样式。
51
+ 3. 新增全局变量必须遵循 `--vts-` 前缀,按语义命名(如 `--vts-card-bg`、`--vts-shadow-base`)。
52
+ 4. 侧边栏相关变量必须通过 `html[data-theme='xxx']` 选择器设置,不要直接写在 `:root`。
53
+
54
+ ---
55
+
56
+ ## 二、主题色系统
57
+
58
+ ### 2.1 侧边栏 8 套配色预设
59
+
60
+ 通过 `html[data-theme='<name>']` 切换,定义在 `src/styles/theme.scss`:
61
+
62
+ | 主题名 | 中文名 | 菜单背景 | 激活指示色 | 对应主色 |
63
+ |--------|--------|---------|-----------|---------|
64
+ | `light` | 亮白色 | `#fff` | `#4091f7` | 默认蓝 |
65
+ | `default` | 道奇蓝 | `#001529` | `#4091f7` | `#1b2a47` |
66
+ | `saucePurple` | 深紫罗兰 | `#130824` | `#693ac9` | `#722ed1` |
67
+ | `pink` | 深粉色 | `#28081a` | `#d84493` | `#eb2f96` |
68
+ | `dusk` | 猩红色 | `#2a0608` | `#e13c39` | `#f5222d` |
69
+ | `volcano` | 橙红色 | `#2b0e05` | `#e85f33` | `#fa541c` |
70
+ | `mingQing` | 绿宝石 | `#032121` | `#59bfc1` | `#13c2c2` |
71
+ | `auroraGreen` | 酸橙绿 | `#0b1e15` | `#60ac80` | `#52c41a` |
72
+
73
+ ### 2.2 Element Plus 主色动态生成(chroma-js)
74
+
75
+ `useTheme.ts` 中的 `setEpThemeColor(color)` 使用 `chroma-js` 自动生成色阶:
76
+
77
+ ```typescript
78
+ // 亮色模式:brighten 变亮
79
+ --el-color-primary-light-{1~9} = chroma(color).brighten(i * 0.32).hex()
80
+
81
+ // 暗黑模式:darken 变暗
82
+ --el-color-primary-dark-{1~2} = chroma(color).darken(i * 0.2).hex()
83
+ ```
84
+
85
+ **关键逻辑**:
86
+ - 主色通过 `document.documentElement.style.setProperty('--el-color-primary', color)` 直接设置。
87
+ - `light` 和 `default` 主题使用配置文件中的 `EpThemeColor`,其他主题使用预设色卡中的颜色。
88
+ - 切换暗黑模式时,如果当前主题是 `light`,会自动切到 `default`(因为亮白色在暗黑下不协调)。
89
+
90
+ ### 2.3 自定义主题色配置
91
+
92
+ 如果需要新增主题色,需要同时修改以下文件:
93
+
94
+ 1. `src/styles/theme.scss` — 添加 `html[data-theme='newTheme']` 的 8 个 `--vts-theme-*` 变量
95
+ 2. `src/hooks/useTheme.ts` — 在 `themeColors` 数组中添加 `{ color, themeColor, tip }` 条目
96
+ 3. 如果新主题色需要特殊的 EP 主色,还需在 `setLayoutThemeColor()` 中处理分支
97
+
98
+ ---
99
+
100
+ ## 三、暗黑模式
101
+
102
+ ### 3.1 切换机制
103
+
104
+ - 通过 `html.dark` 类名控制,由 `useTheme.ts` 的 `dataThemeChange()` 管理。
105
+ - 使用 **View Transitions API** 实现圆形扩散动画(不支持的浏览器降级为无动画切换)。
106
+ - 动画以主题切换按钮为中心,计算到最远角点的距离作为 `clipPath` 半径。
107
+
108
+ ```typescript
109
+ // 核心动画逻辑(只在不支持 View Transitions 的浏览器中跳过)
110
+ const transition = document.startViewTransition(() => {
111
+ document.documentElement.classList.add('dark') // 或 remove
112
+ })
113
+ transition.ready.then(() => {
114
+ // 从按钮位置向外扩散的 clipPath 动画
115
+ document.documentElement.animate({ clipPath }, { duration: 400, easing: 'ease-in' })
116
+ })
117
+ ```
118
+
119
+ ### 3.2 暗黑模式变量覆盖
120
+
121
+ 定义在 `src/styles/dark.scss` 的 `html.dark {}` 块内:
122
+
123
+ ```scss
124
+ html.dark {
125
+ // === 必须覆盖的全局变量 ===
126
+ --vts-border-color: rgb(253 253 253 / 12%); // 亮色: rgb(5 5 5 / 6%)
127
+ --vts-switch-off-color: #ffffff3f; // 亮色: #a6a6a6
128
+ --vts-dialog-bg: rgb(36 37 37); // 亮色: linear-gradient(...)
129
+
130
+ // === 布局区域背景 ===
131
+ .navbar, .tags-view, .sidebar-container,
132
+ .horizontal-header, ... {
133
+ background-color: var(--el-bg-color) !important;
134
+ }
135
+ .app-main, .app-main-nofixed-header {
136
+ background: #020409 !important;
137
+ }
138
+
139
+ // === 组件暗色适配 ===
140
+ // TagsView 标签页、关闭图标、弹窗关闭按钮
141
+ // ReSegmented 分段控制器
142
+ // .vts-message 自定义消息(暗色背景 + 白色文字)
143
+ }
144
+ ```
145
+
146
+ ### 3.3 暗黑模式编写规则
147
+
148
+ 1. **新增全局样式时,必须同步在 `dark.scss` 中添加暗色覆盖**。
149
+ 2. 暗色背景优先使用 `var(--el-bg-color)` 或 `var(--el-bg-color-overlay)`,不要硬编码。
150
+ 3. 暗色文字使用 `rgb(255 255 255 / 85%)`(主文字)、`rgb(255 255 255 / 65%)`(次文字)。
151
+ 4. 暗色边框使用 `rgb(253 253 253 / 12%)` 或 `#303030`。
152
+ 5. 暗色 hover 背景使用 `rgb(255 255 255 / 12%)`。
153
+ 6. **SCSS 局部变量**(如 `dark.scss` 中的 `$border-style`、`$color-white`)只在该文件内使用,不要与 CSS 自定义属性混淆。
154
+
155
+ ### 3.4 已知硬编码颜色(需暗色适配)
156
+
157
+ 以下 `element-plus.scss` 中的硬编码颜色在暗黑模式下未做适配,新增相关样式时需要注意:
158
+
159
+ | 位置 | 硬编码值 | 用途 | 建议 |
160
+ |------|---------|------|------|
161
+ | `.el-table__header th` | `#f2f9fc` | 表头背景 | 应使用 `var(--el-fill-color-light)` |
162
+ | `.el-table__header th` | `#8c8f90` | 表头文字 | 应使用 `var(--el-text-color-secondary)` |
163
+ | `.row-added` | `#e6f4ff` | 新增行背景 | 需添加暗黑覆盖 |
164
+ | `.row-modified` | `#fff7e6` | 修改行背景 | 需添加暗黑覆盖 |
165
+ | `.row-deleted` | `#f5f5f5` | 删除行背景 | 需添加暗黑覆盖 |
166
+ | `.el-collapse-item__header` | `#34394d` | 折叠面板文字 | 应使用 `var(--el-text-color-primary)` |
167
+ | `.vxe-header--row` | `#f2f9fc` / `#8c8f90` | VXE 表头 | 同上 |
168
+ | 滚动条 | `#f9fafb` / `#e5e5e5` | 滚动条样式 | 需添加暗黑覆盖 |
169
+ | autofill | `white` / `#333` | 输入框自动填充 | 需添加暗黑覆盖 |
170
+
171
+ **规则**:新增涉及颜色的全局样式时,优先使用 CSS 变量。如果必须硬编码,必须同步在 `dark.scss` 中添加暗色覆盖。
172
+
173
+ ---
174
+
175
+ ## 四、Design Tokens(设计令牌)
176
+
177
+ ### 4.1 间距
178
+
179
+ 项目使用 `--vts-margin: 8px` 作为基础间距单元。UnoCSS 配置了 `presetRemToPx({ baseFontSize: 4 })`,因此 UnoCSS 中的间距类直接对应像素值:
180
+
181
+ | UnoCSS 类 | 实际值 | 用途 |
182
+ |-----------|--------|------|
183
+ | `p-1` / `m-1` | 1px | 微调 |
184
+ | `p-2` / `m-2` | 2px | 紧凑间距 |
185
+ | `p-4` / `m-4` | 4px | 小间距 |
186
+ | `p-8` / `m-8` | 8px | 基础间距(= --vts-margin) |
187
+ | `p-12` / `m-12` | 12px | 中等间距 |
188
+ | `p-16` / `m-16` | 16px | 大间距 |
189
+ | `p-20` / `m-20` | 20px | 区块间距 |
190
+
191
+ ### 4.2 字号
192
+
193
+ UnoCSS `theme.fontSize` 已显式定义为 px 值(避免被 `presetRemToPx` 转换):
194
+
195
+ | Token | 大小 | 行高 | 用途 |
196
+ |-------|------|------|------|
197
+ | `text-xs` | 12px | 16px | 辅助文字、标签 |
198
+ | `text-sm` | 14px | 20px | 次要文字、表格 |
199
+ | `text-base` | 16px | 24px | 正文默认 |
200
+ | `text-lg` | 18px | 28px | 小标题 |
201
+ | `text-xl` | 20px | 28px | 标题 |
202
+ | `text-2xl` | 24px | 32px | 页面标题 |
203
+ | `text-3xl` | 30px | 36px | 大标题 |
204
+
205
+ ### 4.3 字体
206
+
207
+ 全局字体在 `index.scss` 中定义:
208
+
209
+ ```css
210
+ font-family: 'Alibaba PuHuiTi 3.0', 'Microsoft YaHei', Arial, sans-serif;
211
+ ```
212
+
213
+ ### 4.4 动画时长
214
+
215
+ - 全局过渡时长:`--vts-transition-duration: 0.3s`
216
+ - 侧边栏展开/收起动画使用此变量
217
+ - 暗黑模式切换动画固定 400ms
218
+ - 弹窗动画:打开 0.3s、关闭 0.2s(自定义 cubic-bezier)
219
+
220
+ ### 4.5 层级(z-index)
221
+
222
+ | 层级 | 值 | 用途 |
223
+ |------|-----|------|
224
+ | 基础内容 | auto | 页面正常内容 |
225
+ | 固定头部/侧边栏 | 999~1000 | layout 组件 |
226
+ | 图片预览 | 110000 | `.el-image-viewer__wrapper`(覆盖富文本) |
227
+
228
+ ### 4.6 边框圆角
229
+
230
+ 项目未定义全局圆角 token,遵循 Element Plus 默认值:
231
+ - 按钮/输入框:`4px`
232
+ - 卡片:`8px`(`rounded-lg`)
233
+ - 弹窗:`8px`
234
+
235
+ ---
236
+
237
+ ## 五、布局系统
238
+
239
+ ### 布局模式
240
+
241
+ 项目支持三种布局模式,通过布局配置切换:
242
+
243
+ 1. **垂直布局(Vertical)** — 侧边栏 210px + 顶部导航,后台管理默认布局。
244
+ 2. **水平布局(Horizontal)** — 顶部导航栏,侧边栏宽度为 0。
245
+ 3. **混合布局(Mix)** — 侧边栏 210px(一级菜单)+ 顶部导航(二级菜单)。
246
+
247
+ ### 布局文件结构
248
+
249
+ ```
250
+ src/layout/
251
+ ├── index.vue # 布局入口
252
+ ├── components/
253
+ │ ├── sidebar/ # 侧边栏
254
+ │ ├── navbar/ # 顶部导航
255
+ │ ├── tagsview/ # 标签页
256
+ │ └── settings/ # 设置面板
257
+ └── hooks/
258
+ └── useLayout.ts # 布局状态管理
259
+ ```
260
+
261
+ ### 侧边栏样式架构
262
+
263
+ `src/styles/sidebar.scss` 使用 SCSS mixin `merge-style($sideBarWidth)` 定义侧边栏样式,通过传入不同宽度被调用 3 次(对应 3 种布局):
264
+
265
+ ```scss
266
+ // sidebar.scss 核心结构
267
+ @mixin merge-style($sideBarWidth) {
268
+ // 侧边栏容器、菜单项、子菜单、Logo 等样式
269
+ // $sideBarWidth 控制展开宽度
270
+ }
271
+
272
+ // 垂直布局
273
+ .layout-vertical .sidebar-container { @include merge-style(210px); }
274
+ // 水平布局
275
+ .layout-horizontal .horizontal-header { @include merge-style(0); }
276
+ // 混合布局
277
+ .layout-mix .sidebar-container { @include merge-style(210px); }
278
+ ```
279
+
280
+ **修改侧边栏样式时**,必须检查 3 种布局模式下是否都需要调整。
281
+
282
+ ### 布局约定
283
+
284
+ 1. 页面组件通过 `<router-view>` 嵌套在布局内渲染。
285
+ 2. 布局切换通过 store 中的 `layout` 字段控制。
286
+ 3. 侧边栏菜单数据来源于路由配置中的 `meta` 信息。
287
+ 4. 标签页(TagsView)支持关闭、刷新、关闭其他等操作。
288
+
289
+ ---
290
+
291
+ ## 六、UnoCSS 桥接配置
292
+
293
+ ### 预设
294
+
295
+ ```typescript
296
+ // uno.config.ts
297
+ presetRemToPx({ baseFontSize: 4 }) // 所有 rem 值 × 4 = px(mt-1 → 1px)
298
+ presetWind3() // Tailwind Wind 兼容
299
+ presetAttributify() // 属性化模式
300
+ presetIcons({ scale: 1.2 }) // 图标自动引入
301
+ ```
302
+
303
+ ### 主题色桥接
304
+
305
+ UnoCSS `theme.colors` 将工具类名映射到 Element Plus CSS 变量:
306
+
307
+ ```typescript
308
+ theme: {
309
+ colors: {
310
+ bg_color: 'var(--el-bg-color)', // bg-bg_color → background: var(--el-bg-color)
311
+ primary: 'var(--el-color-primary)', // text-primary → color: var(--el-color-primary)
312
+ text_color_primary: 'var(--el-text-color-primary)',
313
+ }
314
+ }
315
+ ```
316
+
317
+ ### 快捷方式
318
+
319
+ ```typescript
320
+ shortcuts: {
321
+ "flex-center": "flex items-center justify-center",
322
+ "flex-end": "flex items-center justify-end",
323
+ "flex-middle": "flex items-center",
324
+ "flex-between": "flex items-center justify-between",
325
+ "flex-col-center": "flex flex-col justify-center",
326
+ "break-word": "break-words break-all",
327
+ "ellipsis": "!whitespace-nowrap !overflow-hidden text-ellipsis",
328
+ }
329
+ ```
330
+
331
+ ### UnoCSS 使用约定
332
+
333
+ 1. 模板中优先使用 UnoCSS 原子类,复杂样式写在 `<style scoped>` 中。
334
+ 2. 由于 `presetRemToPx` 的存在,`mt-4` = 4px(不是 1rem),注意数值换算。
335
+ 3. 字号使用 `text-sm`(14px)、`text-base`(16px)等,已被显式定义为 px。
336
+ 4. 自定义快捷方式定义在 `uno.config.ts` 的 `shortcuts` 中,命名必须语义化。
337
+ 5. `safelist` 中的类名确保不会被 PurgeCSS 清除,动态类名需要添加到 safelist。
338
+
339
+ ---
340
+
341
+ ## 七、样式文件架构
342
+
343
+ ### 全局样式入口
344
+
345
+ ```
346
+ src/styles/
347
+ ├── index.scss # 入口:@use 引入所有子模块 + :root 全局变量 + 通用样式
348
+ ├── theme.scss # 8 套侧边栏配色(html[data-theme])
349
+ ├── dark.scss # 暗黑模式覆盖(html.dark)
350
+ ├── sidebar.scss # 侧边栏样式(mixin × 3 布局)
351
+ ├── element-plus.scss # Element Plus 组件全局覆盖
352
+ ├── transition.scss # 过渡动画
353
+ ├── button.scss # 按钮样式
354
+ └── vant.scss # Vant 移动端覆盖
355
+ ```
356
+
357
+ ### 样式编写约定
358
+
359
+ 1. **组件样式必须使用 `<style scoped lang="scss">`**。
360
+ 2. 需要覆盖子组件/第三方组件样式时使用 `:deep()`,不超过 3 层嵌套。
361
+ 3. 全局样式覆盖放在 `src/styles/` 对应文件中,不要在组件内写全局样式。
362
+ 4. `!important` 仅允许在覆盖第三方组件样式时使用,必须添加注释说明原因。
363
+ 5. 新增全局 SCSS 变量(如颜色常量)必须使用 `$vts-` 前缀,与 Element Plus 的 `$--` 前缀区分。
364
+
365
+ ---
366
+
367
+ ## 八、ui-ux-pro-max 设计输出衔接
368
+
369
+ ### 背景
370
+
371
+ ui-ux-pro-max 是一个设计系统 Skill,通过 CSV 驱动的风格匹配引擎生成 UI 风格方案。生成的输出通常包含颜色方案、字体搭配、间距规则、组件样式建议等。
372
+
373
+ ### 衔接规则
374
+
375
+ 当用户使用 ui-ux-pro-max 生成设计方案后,需要将设计输出映射到本项目的代码体系中:
376
+
377
+ **1. 颜色映射**
378
+
379
+ ui-ux-pro-max 输出的颜色方案需要映射到项目的 CSS 变量体系:
380
+
381
+ ```
382
+ 设计输出中的主色 → --el-color-primary(由 chroma-js 自动生成色阶)
383
+ 设计输出中的背景色 → --el-bg-color 或 --vts-dialog-bg
384
+ 设计输出中的边框色 → --vts-border-color
385
+ 设计输出中的文字色 → --el-text-color-primary / --el-text-color-regular
386
+ ```
387
+
388
+ **禁止**直接将设计稿的硬编码颜色写入组件样式,必须转换为对应的 CSS 变量。
389
+
390
+ **2. 暗黑模式适配**
391
+
392
+ ui-ux-pro-max 生成的风格如果是"亮色模式专用",必须同步考虑暗黑模式下的表现:
393
+ - 检查每个硬编码颜色是否在 `dark.scss` 中有对应覆盖
394
+ - 背景色不能直接使用白色/浅色硬编码,必须使用 CSS 变量
395
+ - 图表配色需要在 ECharts 的 `setOption` 中根据 `dataTheme` 值切换配色方案
396
+
397
+ **3. 间距与字号**
398
+
399
+ ui-ux-pro-max 输出的间距/字号建议需要适配项目的 token 体系:
400
+ - 间距使用 UnoCSS 的 `p-*` / `m-*` 类(baseFontSize: 4,所以 p-4 = 4px)
401
+ - 字号使用 `text-xs`~`text-9xl`(已定义为 px 值)
402
+ - 不要引入设计稿中的 rem/em 值,统一使用 px 或 UnoCSS 类
403
+
404
+ **4. 组件样式**
405
+
406
+ ui-ux-pro-max 建议的组件样式(如卡片阴影、按钮圆角等)需要通过以下方式实现:
407
+ - 优先使用 UnoCSS 原子类(`shadow-sm`、`rounded-lg` 等)
408
+ - 复杂样式写在 `<style scoped>` 中,使用 CSS 变量引用主题色
409
+ - 需要覆盖 Element Plus 组件样式的,放在 `src/styles/element-plus.scss` 中
410
+
411
+ **5. 风格一致性检查**
412
+
413
+ 设计方案应用到代码后,必须检查:
414
+ - [ ] 所有颜色是否通过 CSS 变量引用?
415
+ - [ ] 暗黑模式下是否显示正常?(切换 `html.dark` 验证)
416
+ - [ ] 侧边栏 8 套配色下是否协调?(至少检查 `light` 和 `default`)
417
+ - [ ] 字号是否使用了项目定义的 token?
418
+ - [ ] 间距是否遵循 4px 基数?
419
+
420
+ ---
421
+
422
+ ## 九、PC 端与移动端双端适配
423
+
424
+ ### 组件映射关系
425
+
426
+ 项目同时集成 Element Plus(PC)和 Vant(移动端),同一业务逻辑使用不同 UI 组件:
427
+
428
+ | 功能 | PC 端 (Element Plus) | 移动端 (Vant) |
429
+ |------|---------------------|---------------|
430
+ | 弹窗 | `el-dialog` | `van-popup` + `van-dialog` |
431
+ | 表格 | `ReGrid` / `el-table` | `van-list` + 卡片布局 |
432
+ | 表单 | `el-form` | `van-form` + `van-field` |
433
+ | 下拉选择 | `el-select` | `van-picker` + `van-popup` |
434
+ | 级联选择 | `el-cascader` | `van-cascader` |
435
+ | 日期选择 | `el-date-picker` | `van-date-picker` + `van-popup` |
436
+ | 上传 | `el-upload` | `van-uploader` |
437
+ | 分页 | `RePagination` | `van-pagination` 或触底加载 |
438
+ | 搜索 | `el-input` + 搜索按钮 | `van-search` |
439
+ | 消息提示 | `ElMessage` / `ElMessageBox` | `van-toast` / `van-dialog` |
440
+ | 导航 | 侧边栏菜单 | 底部 TabBar |
441
+ | 下拉刷新 | 无 | `van-pull-refresh` |
442
+
443
+ ### 双端适配策略
444
+
445
+ ```vue
446
+ <!-- PC 端表格 -->
447
+ <template v-if="!isMobile">
448
+ <ReGrid :data="list" :pagination="pagination">
449
+ <el-table-column prop="name" label="名称" />
450
+ </ReGrid>
451
+ </template>
452
+
453
+ <!-- 移动端卡片列表 -->
454
+ <template v-else>
455
+ <van-list v-model:loading="loading" :finished="finished" @load="onLoad">
456
+ <div v-for="item in list" :key="item.id" class="card-base mb-3">
457
+ <!-- 卡片内容 -->
458
+ </div>
459
+ </van-list>
460
+ </template>
461
+ ```
462
+
463
+ ### 响应式判断
464
+
465
+ ```typescript
466
+ import { useApp } from "@/hooks/useApp";
467
+ const { isMobile } = useApp();
468
+ // isMobile 基于断点判断:< 768px 为移动端
469
+ ```
470
+
471
+ ### 双端适配约定
472
+
473
+ 1. 新页面必须同时考虑 PC 和移动端展示,使用 `isMobile` 条件渲染。
474
+ 2. 移动端表格数据改用卡片列表 + 触底加载,不要直接复用 PC 端表格。
475
+ 3. 移动端弹窗使用 `van-popup` 包裹选择器组件。
476
+ 4. 移动端导航使用底部 TabBar,不使用侧边栏。
477
+ 5. 搜索框在移动端使用 `van-search`,支持展开/收起。
478
+
479
+ ---
480
+
481
+ ## 十、数据大屏布局
482
+
483
+ ### 标准尺寸
484
+
485
+ 数据大屏基于 1920x1080 设计稿,使用 `scale` 方案适配不同分辨率:
486
+
487
+ ```vue
488
+ <script setup lang="ts">
489
+ const scaleRef = ref({ x: 1, y: 1 });
490
+ const screenRef = ref<HTMLDivElement>();
491
+
492
+ function updateScale() {
493
+ const width = window.innerWidth / 1920;
494
+ const height = window.innerHeight / 1080;
495
+ scaleRef.value = { x: width, y: height };
496
+ }
497
+
498
+ onMounted(() => {
499
+ updateScale();
500
+ window.addEventListener("resize", updateScale);
501
+ });
502
+ onUnmounted(() => {
503
+ window.removeEventListener("resize", updateScale);
504
+ });
505
+ </script>
506
+
507
+ <template>
508
+ <div ref="screenRef" :style="{
509
+ transform: `scale(${scaleRef.x}, ${scaleRef.y})`,
510
+ transformOrigin: 'left top',
511
+ width: '1920px', height: '1080px',
512
+ }">
513
+ <!-- 大屏内容 -->
514
+ </div>
515
+ </template>
516
+ ```
517
+
518
+ ### 大屏约定
519
+
520
+ 1. 设计稿固定 1920x1080,使用 `scale` 等比缩放。
521
+ 2. 图表使用 ECharts,配合 `ReFlicker` 实现数据闪烁效果。
522
+ 3. 布局使用绝对定位 + 百分比,不使用 flex/grid 流式布局。
523
+ 4. 字体使用 `rem` 或 `vw/vh` 单位,确保缩放后比例正确。
524
+ 5. 大屏使用独立布局,不显示菜单/页头。
525
+
526
+ ---
527
+
528
+ ## 十一、常见反例
529
+
530
+ - 硬编码颜色值而不使用 CSS 变量(暗色模式不生效)。
531
+ - 只写了亮色样式,没有在 `dark.scss` 中添加暗色覆盖。
532
+ - 在 `element-plus.scss` 中新增硬编码颜色但不做暗黑适配。
533
+ - 移动端直接复用 PC 端表格(体验差、性能差)。
534
+ - 大屏使用 `vw/vh` 百分比布局而不是 `scale` 方案。
535
+ - 不通过 `isMobile` 判断而使用 CSS `@media` 做逻辑分支。
536
+ - UnoCSS 快捷方式命名不语义化(如 `f-c` 而非 `flex-center`)。
537
+ - 使用 `chroma-js` 以外的库处理颜色(如 `color`、`polished`)。
538
+ - 直接修改 `--el-color-primary` 而不通过 `setEpThemeColor()`(导致色阶不更新)。
539
+ - 在组件 scoped 样式中写 `:root` 或 `html.dark` 选择器(无效)。
540
+ - 新增侧边栏样式不检查 3 种布局模式的兼容性。