@qilitt-mickey/vue3-temp-skill 1.1.6 → 1.1.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.
- package/SKILL.md +4 -2
- package/package.json +1 -1
- package/references/code-quality.md +7 -3
- package/references/core-kernel.md +81 -0
- package/references/data-mapping.md +14 -10
- package/references/data-screen.md +1 -0
- package/references/design-system.md +59 -25
- package/references/feedback-ui.md +2 -2
- package/references/flowchart-g6.md +11 -6
- package/references/graph-relation.md +13 -6
- package/references/layout-theme.md +4 -4
- package/references/qrcode-barcode.md +1 -0
- package/references/workflow-bpmn.md +6 -6
package/SKILL.md
CHANGED
|
@@ -126,7 +126,7 @@ tags: [vue3, typescript, element-plus, vant, pinia, vite, unocss, crud, componen
|
|
|
126
126
|
- 「导出 Excel / 下载文件」→ `download-export`
|
|
127
127
|
- 「菜单加图标 / 换图标 / 图标选择器 / 本地 SVG 图标」→ `icons`
|
|
128
128
|
- 「粒子背景 / 登录粒子 / 粒子特效」→ `particles`
|
|
129
|
-
- 「按 Ant Design / Semi / Arco / Vuetify / 京东 等设计规范适配」「套 UI 规范」「让项目符合 XX 规范」→ `design-system`(+ `layout-theme
|
|
129
|
+
- 「按 Ant Design / Semi / Arco / Vuetify / 京东 等设计规范适配」「套 UI 规范」「让项目符合 XX 规范」→ `design-system`(+ `layout-theme`):必须完整执行其适配工作流(识别回执 + 令牌层(唯一新增文件)+ 几何重写并入 element-plus.scss + 硬编码冲突逐条回填 + 公共区域适配 + 存量裸值扫描);适配新增文件只允许 `design-tokens.scss`;组件层永远是 Element Plus,适配只换令牌数据不换组件;禁止只改 `--el-color-primary` 就宣称已适配,禁止识别漂移
|
|
130
130
|
- 只说「自定义指令」未说明效果 → 先追问,禁止默认塞模块
|
|
131
131
|
6. **HTTP**:方法跟后端文档,**允许 GET/POST**;POST→`data`,GET→`params`;真实 URL 用 `VITE_API_BASE_URL`;`/mock` 仅本地 Fake Server;无单请求 `crypto: true`。
|
|
132
132
|
|
|
@@ -208,6 +208,7 @@ reset(); // 重置(配合 formRef.resetFields)
|
|
|
208
208
|
- `<script setup lang="ts">` + `defineOptions({ name })`
|
|
209
209
|
- Re*:`type.ts` + 显式 import
|
|
210
210
|
- `$t('中文key')`;`import.meta.env.VITE_*`;禁止不可信 `v-html`
|
|
211
|
+
- **样式契约**:UnoCSS 连字符类名(`p-5`/`w-full`,禁 `p5`/`w100%`)+ 语义色变量(`bg-bg_color`,禁 `bg-[#fff] dark:bg-[#303030]`)+ 尺寸档位(查询/工具栏 `small`、表格 `:size="size"`、弹窗表单 default、整屏 `large`);详见 `core-kernel`「四之二、样式契约」
|
|
211
212
|
|
|
212
213
|
---
|
|
213
214
|
|
|
@@ -289,7 +290,8 @@ reset(); // 重置(配合 formRef.resetFields)
|
|
|
289
290
|
**4. 安全** — 无危险 v-html;无硬编码密钥
|
|
290
291
|
**5. 业务** — `onSearch`/`reset`;提交 loading;权限;未二次 Layout
|
|
291
292
|
**5b. 列表布局** — `el-card`+`content`+固定 height;查询/展示分区;`tableHeight`;分页在 ReTableBar 内
|
|
292
|
-
**5c. 设计规范遵从(命中 design-system 时必查)** —
|
|
293
|
+
**5c. 设计规范遵从(命中 design-system 时必查)** — 已输出识别回执且三点一致;令牌层(唯一新增)已建立、几何重写并入 element-plus.scss、文件名未漂移;第四节硬编码冲突清单逐条处理并回填;公共区域(侧栏/导航/壳变量)已适配;存量裸值扫描已执行;业务代码无裸控件高度/内边距/字号;验证清单全过
|
|
294
|
+
**5d. 样式契约(每次生成必查)** — UnoCSS 连字符形态(`p-5`/`w-full`;无 `p5`/`w100%`);颜色语义变量(无 `bg-[#fff] dark:bg-[#303030]`);组件尺寸档位(查询/工具栏 `small`、表格 `:size="size"`、弹窗表单 default、整屏 `large`);间距 4px 基数;细则见 `core-kernel`「四之二」
|
|
293
295
|
**6. 风格** — 无多余 console;`$t('中文')`;`--vts-*` / UnoCSS;图标走 `svg-icon` / `icons` 约定
|
|
294
296
|
|
|
295
297
|
完整项见 `references/code-quality.md`。
|
package/package.json
CHANGED
|
@@ -228,6 +228,9 @@ const fullName = computed(() => `${user.firstName} ${user.lastName}`);
|
|
|
228
228
|
- [ ] 样式使用 `scoped`,不会污染全局。
|
|
229
229
|
- [ ] 颜色使用 CSS 变量(`var(--el-color-primary)`),不硬编码。
|
|
230
230
|
- [ ] 优先使用 UnoCSS 原子类(`flex-center`、`mb-4`)。
|
|
231
|
+
- [ ] UnoCSS 类名为连字符形态:`p-5` / `w-full` / `px-5` / `gap-10`;禁止 `p5` / `w100%` / `px5` / `gap10`(无 CSS 产出,样式静默失效)。
|
|
232
|
+
- [ ] 背景/文字色按语义取变量:`bg-bg_color` / `var(--el-text-color-*)`;禁止 `bg-[#fff]` + `dark:bg-[#303030]` 成对硬编码。
|
|
233
|
+
- [ ] 组件尺寸按场景档位:查询区与 `ReTableBar` 工具栏按钮 `size="small"`;表格 `:size="size"`(禁写死);弹窗表单 default;整屏主表单 `large`(细则见 `core-kernel`「四之二、样式契约」)。
|
|
231
234
|
- [ ] 业务图标优先 `<svg-icon name="..." />`(本地无冒号 / Iconify 含 `:`);菜单 `meta.icon` 为 string;细则见 `icons`。
|
|
232
235
|
- [ ] 不使用 `!important`,除非覆盖第三方组件样式且有注释说明。
|
|
233
236
|
- [ ] 不使用深层嵌套选择器(不超过 3 层)。
|
|
@@ -241,11 +244,12 @@ const fullName = computed(() => `${user.firstName} ${user.lastName}`);
|
|
|
241
244
|
### 设计规范遵从(命中 design-system 时必查,细则见 `design-system.md`)
|
|
242
245
|
|
|
243
246
|
- [ ] 已输出「规范识别回执」,且规范 ID / 主色在令牌层、`platform-config.json`、侧栏主题三处一致(防识别漂移)。
|
|
244
|
-
- [ ] 已建立令牌层 `design-tokens.scss
|
|
245
|
-
- [ ] `index.scss` 中
|
|
247
|
+
- [ ] 已建立令牌层 `design-tokens.scss`(**唯一新增文件**,纯 `:root` 数据无选择器;含用户可自定义区块 + 模版桥接令牌 + `--el-*` 映射);组件几何重写已并入 `element-plus.scss`(令牌引用 + 规范注释);文件名不得漂移成 `tokens.scss` 等变体,无独立重写层文件残留。
|
|
248
|
+
- [ ] `index.scss` 中 `design-tokens` 位于 `@use` 最前;模版其余顺序未动。
|
|
246
249
|
- [ ] `design-system.md` 第四节「模版硬编码冲突清单」逐条处理并在回复中逐条回填(重点:通配符 font-family、reset.scss body 字体与 `label { font-weight: 700 }`、`.el-card__body` padding 5px、弹窗渐变蓝底、表头硬编码色)。
|
|
247
250
|
- [ ] 主色三态(hover/active)、字体、控件高度、圆角、卡片内边距、表单标签字重、表头视觉均符合目标规范(按第二节验证清单核验)。
|
|
248
|
-
- [ ] 业务代码无裸控件高度/内边距/字号/圆角;组件几何覆盖只集中在 `
|
|
251
|
+
- [ ] 业务代码无裸控件高度/内边距/字号/圆角;组件几何覆盖只集中在 `element-plus.scss`;存量裸值扫描已执行。
|
|
252
|
+
- [ ] 公共区域已按规范落地:`theme.scss` 侧栏配色(激活条 = 规范主色)、`index.scss` 壳变量(导航高/内容边距/弹窗底)、`HeaderHeight` 一致。
|
|
249
253
|
- [ ] `platform-config.json` 的 `EpThemeColor` 与规范主色一致,已提醒清理 localStorage 缓存;新增令牌已在 `dark.scss` 补暗色覆盖。
|
|
250
254
|
|
|
251
255
|
## 七、业务逻辑检查
|
|
@@ -30,6 +30,7 @@ tags: [vue3, kernel, conventions, layout, router, http, crud, inventory]
|
|
|
30
30
|
| 10 | 新三方依赖必须用户确认;已有封装须复用,选型表指定库勿擅自替换 |
|
|
31
31
|
| 11 | **查询列表页布局硬约束**(见下方黄金样板):`el-card` + `ref="content"` + **固定 `height`**(非 `minHeight`);查询区与表格区分区;表格用 `tableHeight`;分页放在 `ReTableBar` 内 |
|
|
32
32
|
| 11 | addon 缺失时按 `project-inventory` 第九节**精确版本**安装;禁止 `@latest` / 无版本号;Vite 插件与 `build/plugins/*` 成套核对 |
|
|
33
|
+
| 12 | **样式契约**(见「四之二」):UnoCSS 类名必须连字符形态(`p-5`/`w-full`,禁止 `p5`/`w100%`);颜色按语义取 `--el-*`/`--vts-*` 变量(禁止 `bg-[#fff] dark:bg-[#303030]` 成对硬编码);组件尺寸按场景档位(查询/工具栏 `small`、表格 `:size="size"`、弹窗表单 default、整屏主表单 `large`);`design-tokens.scss` 存在时零新增硬编码裸值 |
|
|
33
34
|
|
|
34
35
|
---
|
|
35
36
|
|
|
@@ -336,6 +337,85 @@ function handleSizeChange(size: number) {
|
|
|
336
337
|
|
|
337
338
|
---
|
|
338
339
|
|
|
340
|
+
## 四之二、样式契约(所有生成代码必须遵循)
|
|
341
|
+
|
|
342
|
+
> 本节是**生成任何页面/组件代码时的样式真相源**:尺寸、间距、边距、颜色、组件档位全部按此执行。后期设计类 Skill(如 ui-ux-pro-max / project-style-design)产出设计规范后,规范经 `design-system` 模块落到 `design-tokens.scss`;此后生成代码只准引用令牌,本节约束依然生效。
|
|
343
|
+
|
|
344
|
+
### 1. UnoCSS 类名形态(写错 = 样式静默失效)
|
|
345
|
+
|
|
346
|
+
项目 `presetRemToPx({ baseFontSize: 4 })`:**间距数字即像素**(`p-5` = 5px)。类名**必须带连字符**,无连字符写法不会产出任何 CSS(已用 dist 产物实证):
|
|
347
|
+
|
|
348
|
+
| ❌ 无效(无 CSS 产出) | ✅ 有效 | 说明 |
|
|
349
|
+
|---|---|---|
|
|
350
|
+
| `p5` / `p10` / `p20` / `m10` / `mt20` / `px5` / `gap10` | `p-5` / `p-10` / `p-20` / `m-10` / `mt-20` / `px-5` / `gap-10` | 间距类必须带连字符 |
|
|
351
|
+
| `w100%` / `h100%` / `w-100%` / `h-[100%]` | `w-full` / `h-full` | 满宽满高统一 `full` |
|
|
352
|
+
| `p-b-16` | `pb-16` | 方向前缀连写 |
|
|
353
|
+
| `bg-[#fff]` + `dark:bg-[#303030]` | `bg-bg_color` | 背景按语义取变量,自动适配暗黑 |
|
|
354
|
+
|
|
355
|
+
- 间距取 **4px 基数**(4/8/12/16/20);`p-5`(查询区内边距)等模版既有值保持原样。
|
|
356
|
+
- shortcuts 白名单:`flex-center` / `flex-end` / `flex-middle` / `flex-between` / `flex-col-center` / `break-word` / `ellipsis`,布局优先用它们。
|
|
357
|
+
- 字号用显式 px 档位:`text-xs`=12 / `text-sm`=14 / `text-base`=16 / `text-lg`=18 / `text-xl`=20 / `text-2xl`=24 / `text-3xl`=30。
|
|
358
|
+
|
|
359
|
+
### 2. 颜色纪律(按语义取变量,禁止成对硬编码)
|
|
360
|
+
|
|
361
|
+
| 语义 | 用法 |
|
|
362
|
+
|---|---|
|
|
363
|
+
| 页面/卡片背景 | `bg-bg_color`(桥接 `--el-bg-color`);布局底 `--el-bg-color-page`;浮层 `--el-bg-color-overlay` |
|
|
364
|
+
| 文字 | `--el-text-color-primary` / `regular` / `secondary` / `placeholder` |
|
|
365
|
+
| 边框 | `--el-border-color`(及 `-light` / `-lighter` / `-dark`) |
|
|
366
|
+
| 浅填充(表头/hover 底) | `--el-fill-color-light` |
|
|
367
|
+
| 主色与梯度 | `--el-color-primary`(及 `-light-3/5/7/9`、`-dark-2`) |
|
|
368
|
+
| 状态色 | `--el-color-success` / `warning` / `danger` / `info` |
|
|
369
|
+
| 表格表头 | `--vts-table-header-bg` / `--vts-table-header-text`(el-table 与 vxe 共用) |
|
|
370
|
+
| 弹窗背景 | `--vts-dialog-bg`(支持 `--ds-dialog-bg` 覆写) |
|
|
371
|
+
|
|
372
|
+
Canvas / 图谱 / 连线库等**必须传具体色值字符串**的场景,用统一工具从运行时读取变量,禁止把十六进制写死在业务代码里:
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
/** 读取 CSS 变量(canvas/G6/jsPlumb 等需要具体色值时使用) */
|
|
376
|
+
const getCssVar = (name: string, fallback = "") =>
|
|
377
|
+
getComputedStyle(document.documentElement).getPropertyValue(name).trim() || fallback;
|
|
378
|
+
|
|
379
|
+
// 示例:G6 边样式
|
|
380
|
+
edge: { type: "line", style: { stroke: getCssVar("--el-color-primary-light-5", "#9DC5EA") } }
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### 3. 组件尺寸纪律(small / default / large 按场景定档)
|
|
384
|
+
|
|
385
|
+
| 场景 | 档位 | 说明 |
|
|
386
|
+
|---|---|---|
|
|
387
|
+
| 查询区按钮(查询/重置/展开收起) | `size="small"` | 与 inline 查询区配套 |
|
|
388
|
+
| `ReTableBar` 工具栏按钮(新增/导入/导出/删除) | `size="small"` | 列表页工具栏统一 small |
|
|
389
|
+
| 表格 | `:size="size"`(`ReTableBar` 插槽透出) | **禁止写死**,密度切换由用户控制 |
|
|
390
|
+
| 分页 | `RePagination :size="size"` | 跟随表格密度 |
|
|
391
|
+
| 弹窗内表单 | default(不写 size)+ `label-width="96px"` | `ReDialog` / `ReDialogResize` 内表单 |
|
|
392
|
+
| 登录页 / 整屏主表单 | `size="large"` | 低频全屏操作放大档位 |
|
|
393
|
+
| 移动端 Vant | 独立尺寸体系 | 不与 EP 档位混用,见 `mobile-h5` |
|
|
394
|
+
|
|
395
|
+
设计规范生效期(`design-tokens.scss` 存在):档位高度由令牌驱动——`small ↔ --ds-control-height-sm`、`default ↔ --ds-control-height`、`large ↔ --ds-control-height-lg`(经 `--el-component-size*` 映射)。**禁止**在业务代码里写裸控件高度(如 `.el-input { height: 36px }`)绕过档位。
|
|
396
|
+
|
|
397
|
+
### 4. 页面容器黄金形态
|
|
398
|
+
|
|
399
|
+
```vue
|
|
400
|
+
<!-- 独立功能页(图谱/流程图等常规页) -->
|
|
401
|
+
<div
|
|
402
|
+
:style="{ height: `calc(100vh - 2 * var(--vts-margin) - ${headerHeight}px)` }"
|
|
403
|
+
class="pos-relative bg-bg_color p-5 overflow-hidden"
|
|
404
|
+
>
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
- 高度公式固定:`calc(100vh - 2 * var(--vts-margin) - ${headerHeight}px)`(`headerHeight` 来自 `useApp()`)。
|
|
408
|
+
- 容器内边距默认 `p-5`;区块之间用 `mb-10` / `gap-10` 等 4 基数间距。
|
|
409
|
+
|
|
410
|
+
### 5. 设计规范生效期(design-tokens.scss 存在时)
|
|
411
|
+
|
|
412
|
+
1. 生成代码前先确认 `src/styles/design-tokens.scss` 是否存在;存在则进入「规范期」。
|
|
413
|
+
2. 规范期**零新增硬编码**:颜色/控件高度/内边距/圆角/字号一律引用令牌或语义变量;设计稿与令牌冲突时回填令牌层,不在页面里写裸值。
|
|
414
|
+
3. 间距/边距仍按 4px 基数,优先对齐令牌 `--space-unit` 的倍数。
|
|
415
|
+
4. 命中 `design-system` 时按其工作流执行适配与存量扫描,本节约束与其一致不冲突。
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
339
419
|
## 五、资产分层(核心 vs 附加)
|
|
340
420
|
|
|
341
421
|
### 附加 Hook(按功能模块加载,勿塞进每个 CRUD)
|
|
@@ -383,4 +463,5 @@ function handleSizeChange(size: number) {
|
|
|
383
463
|
- 完整 CRUD 变体、表单页 → `crud-pages`
|
|
384
464
|
- 详情跳转 → `detail-page`
|
|
385
465
|
- 主题布局深挖 → `layout-theme`
|
|
466
|
+
- 设计规范适配 / 项目存在 `design-tokens.scss` → `design-system`(样式契约随之进入「规范期」,见四之二第 5 节)
|
|
386
467
|
- 选型对照与全量组件表 → `project-inventory.md`
|
|
@@ -49,15 +49,19 @@ let jsPlumbInstance: any = null
|
|
|
49
49
|
## 初始化 jsPlumb
|
|
50
50
|
|
|
51
51
|
```typescript
|
|
52
|
+
/** 读取 CSS 变量(jsPlumb 需要具体色值;设计规范生效期自动跟随令牌,见 core-kernel「四之二」) */
|
|
53
|
+
const getCssVar = (name: string, fallback = '') =>
|
|
54
|
+
getComputedStyle(document.documentElement).getPropertyValue(name).trim() || fallback
|
|
55
|
+
|
|
52
56
|
const initJsPlumb = () => {
|
|
53
57
|
jsPlumbInstance = jsPlumb.getInstance({
|
|
54
58
|
// 连接线:Straight(直线) / Bezier(贝塞尔) / Flowchart(折线) / StateMachine(状态机)
|
|
55
59
|
Connector: ['Straight', { stub: 0, gap: 1 }],
|
|
56
|
-
PaintStyle: { stroke: '#409eff', strokeWidth: 2 },
|
|
57
|
-
HoverPaintStyle: { stroke: '#66b1ff', strokeWidth: 3 },
|
|
60
|
+
PaintStyle: { stroke: getCssVar('--el-color-primary', '#409eff'), strokeWidth: 2 },
|
|
61
|
+
HoverPaintStyle: { stroke: getCssVar('--el-color-primary-light-3', '#66b1ff'), strokeWidth: 3 },
|
|
58
62
|
Endpoint: ['Dot', { radius: 6 }],
|
|
59
63
|
EndpointStyle: { fill: 'transparent', stroke: 'transparent' },
|
|
60
|
-
EndpointHoverStyle: { fill: '#fff', stroke: '#66b1ff' },
|
|
64
|
+
EndpointHoverStyle: { fill: getCssVar('--el-bg-color', '#fff'), stroke: getCssVar('--el-color-primary-light-3', '#66b1ff') },
|
|
61
65
|
Container: 'mapping-container', // 必须指定容器 ID
|
|
62
66
|
ConnectionOverlays: [
|
|
63
67
|
['Arrow', {
|
|
@@ -141,11 +145,11 @@ const getMappingResult = () => {
|
|
|
141
145
|
</el-card>
|
|
142
146
|
|
|
143
147
|
<!-- 映射区域 -->
|
|
144
|
-
<div id="mapping-container" class="flex-1 relative flex justify-between bg-
|
|
148
|
+
<div id="mapping-container" class="flex-1 relative flex justify-between bg-bg_color p-8">
|
|
145
149
|
<!-- 左侧源字段 -->
|
|
146
150
|
<div class="w-[40%] flex flex-col border rounded">
|
|
147
151
|
<div v-for="item in sourceFields" :id="item.id" :key="item.id"
|
|
148
|
-
class="field-item flex border-b hover:bg-
|
|
152
|
+
class="field-item flex border-b hover:bg-[var(--el-fill-color-light)] cursor-pointer relative">
|
|
149
153
|
<div class="flex-1 p-2">{{ item.name }}</div>
|
|
150
154
|
<div class="w-[80px] p-2 text-center">{{ item.type }}</div>
|
|
151
155
|
<!-- 连接点 -->
|
|
@@ -160,7 +164,7 @@ const getMappingResult = () => {
|
|
|
160
164
|
<!-- 右侧目标字段 -->
|
|
161
165
|
<div class="w-[40%] flex flex-col border rounded">
|
|
162
166
|
<div v-for="item in targetFields" :id="item.id" :key="item.id"
|
|
163
|
-
class="field-item flex border-b hover:bg-
|
|
167
|
+
class="field-item flex border-b hover:bg-[var(--el-fill-color-light)] cursor-pointer relative">
|
|
164
168
|
<div :id="`handle-${item.id}`"
|
|
165
169
|
class="connector-handle-left absolute left-0 top-1/2 -mt-[6px] -translate-x-1/2" />
|
|
166
170
|
<div class="flex-1 p-2">{{ item.name }}</div>
|
|
@@ -180,14 +184,14 @@ const getMappingResult = () => {
|
|
|
180
184
|
z-index: 10;
|
|
181
185
|
width: 12px;
|
|
182
186
|
height: 12px;
|
|
183
|
-
background-color:
|
|
184
|
-
border: 1px solid
|
|
187
|
+
background-color: var(--el-bg-color);
|
|
188
|
+
border: 1px solid var(--el-color-primary);
|
|
185
189
|
border-radius: 50%;
|
|
186
190
|
}
|
|
187
191
|
.connector-handle-right:hover,
|
|
188
192
|
.connector-handle-left:hover {
|
|
189
|
-
background-color:
|
|
190
|
-
border-color:
|
|
193
|
+
background-color: var(--el-color-primary-light-9);
|
|
194
|
+
border-color: var(--el-color-primary-light-3);
|
|
191
195
|
}
|
|
192
196
|
:deep(.jtk-endpoint) { z-index: 20; }
|
|
193
197
|
:deep(.jtk-connector) { z-index: 10; }
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
---
|
|
2
2
|
skill: design-system
|
|
3
|
-
description: 设计规范识别与全量落地机制。当用户指定设计系统(内置预设:Ant Design / Semi Design / Arco Design / Vuetify / FindDesign 京东UDC;非封闭集,支持任意自定义规范)或要求"按 XX 规范 / 设计规范 / UI 规范适配项目"时,强制执行为「识别回执 +
|
|
3
|
+
description: 设计规范识别与全量落地机制。当用户指定设计系统(内置预设:Ant Design / Semi Design / Arco Design / Vuetify / FindDesign 京东UDC;非封闭集,支持任意自定义规范)或要求"按 XX 规范 / 设计规范 / UI 规范适配项目"时,强制执行为「识别回执 + 令牌层(唯一新增文件)+ 几何重写并入 element-plus.scss + 模版硬编码冲突处理 + 公共区域适配 + 存量回归扫描」的完整适配流程,并在 code-quality 闸门中校验规范遵从。按通用协议自动识别并衔接任意上游 UI/UX 设计技能的令牌产出(不绑定具体技能名)。
|
|
4
4
|
scope: project
|
|
5
5
|
tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, element-plus, theme, css-variables]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# 设计规范识别与全量适配机制
|
|
9
9
|
|
|
10
|
-
>
|
|
10
|
+
> **本模块的职责**:识别规范后,在**业务项目**内一次性完成「令牌层(数据)+ 模版样式文件改写(执行)+ 硬编码冲突清理」的适配,之后所有生成代码只准引用令牌,禁止裸值。
|
|
11
11
|
>
|
|
12
|
+
> **核心理念(始终明确)**:组件层永远是 **Element Plus**——代码照旧写 `<el-button>` / `<el-table>` / `<el-dialog>`,规范适配**不换组件**,只替换驱动组件样式的**“数据”**(令牌:高度/内边距/字号/圆角/颜色)。所有样式文件只是“按令牌数据执行”,换规范 = 换一套数据。
|
|
13
|
+
>
|
|
14
|
+
> **架构决策(单文件)**:适配只**新增一个文件** `design-tokens.scss`(纯数据层,无选择器);组件几何与视觉重写**直接并入模版既有的 `element-plus.scss` 等文件**(引用令牌 + 标注规范注释)。禁止另建并存的“重写层”文件——两个文件同时改 EP 组件样式会让后续开发者不知道改哪里、靠加载顺序压盖易失效。
|
|
15
|
+
|
|
16
|
+
### 职责分工(适配文件 vs 模版既有文件)
|
|
17
|
+
|
|
18
|
+
| 文件 | 职责 | 内容形态 |
|
|
19
|
+
|------|------|---------|
|
|
20
|
+
| `design-tokens.scss`(**唯一新增**) | 规范**数据源**:主色/字体/字号/圆角/控件高度/间距 + 模版桥接令牌 + `--el-*` 映射 | 纯 `:root` 变量,**禁止选择器与组件类** |
|
|
21
|
+
| `element-plus.scss`(模版既有) | EP 组件几何与视觉覆盖的**唯一出口**:模版默认 + 规范重写都在这里,全部引用令牌 | 选择器 + `var()`,每段标注规范注释 |
|
|
22
|
+
| `reset.scss` / `index.scss`(模版既有) | 基础样式与全局壳变量(导航高/内容边距/弹窗底) | 引用令牌 |
|
|
23
|
+
| `theme.scss` / `sidebar.scss`(模版既有) | 侧边栏/导航配色与几何 | 按规范换色,引用令牌 |
|
|
24
|
+
|
|
25
|
+
> 关系一句话:`design-tokens.scss` 是数据层,模版样式文件是执行层;不存在第三个“重写层”文件。
|
|
26
|
+
|
|
12
27
|
---
|
|
13
28
|
|
|
14
29
|
## 一、触发与规范识别
|
|
@@ -67,9 +82,10 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
67
82
|
### Step 1 探查现状(含命名锁定与模版版本判定)
|
|
68
83
|
|
|
69
84
|
1. 读业务项目 `src/styles/index.scss` 的 `@use` 列表与 `src/styles/` 目录。
|
|
70
|
-
2.
|
|
71
|
-
-
|
|
72
|
-
- 发现旧命名变体(`tokens.scss
|
|
85
|
+
2. **命名锁定(单文件架构)**:适配**新增文件只允许**叫 `design-tokens.scss`(纯数据层)。
|
|
86
|
+
- 已存在 → 只更新令牌值,不重复建层。
|
|
87
|
+
- 发现旧命名变体(`tokens.scss` 等)→ 必须先重命名为规范名。
|
|
88
|
+
- 发现旧版并存的几何重写层文件(`design-controls.scss` / `semi-controls.scss` / `*-controls.scss`)→ **必须把其内容合并进 `element-plus.scss`(改为令牌引用 + 规范注释)后删除原文件**;禁止重写层与 `element-plus.scss` 并存。
|
|
73
89
|
3. **模版版本判定**(决定 Step 5 走哪条清单):
|
|
74
90
|
```
|
|
75
91
|
grep 目标:src/styles/element-plus.scss
|
|
@@ -146,6 +162,7 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
146
162
|
--vts-scrollbar-thumb-hover: var(--el-text-color-secondary);
|
|
147
163
|
--vts-autofill-bg: var(--el-bg-color);
|
|
148
164
|
--vts-autofill-text: var(--el-text-color-primary);
|
|
165
|
+
--ds-dialog-bg: var(--el-bg-color-overlay); /* 接管 --vts-dialog-bg:弹窗背景按规范走浮层色 */
|
|
149
166
|
|
|
150
167
|
/* —— Element Plus 变量映射(必配,含主色兜底) —— */
|
|
151
168
|
--el-color-primary: var(--brand-primary); /* 兜底:JS 运行时 setEpThemeColor 生效前的首屏主色 */
|
|
@@ -181,14 +198,22 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
181
198
|
```
|
|
182
199
|
|
|
183
200
|
> 上面是 **Ant Design 预设**。其他规范按第五节令牌速查表替换「用户可自定义」区块与语义色。
|
|
201
|
+
>
|
|
202
|
+
> ⚠️ `design-tokens.scss` **只允许 `:root` 变量块**:业务组件类(如 `.vts-status`、`.vts-op`)不得写入本文件,应放 `element-plus.scss` 或业务组件内。
|
|
184
203
|
|
|
185
|
-
### Step 3
|
|
204
|
+
### Step 3 组件几何重写并入 `src/styles/element-plus.scss`(不另建重写层文件)
|
|
186
205
|
|
|
187
|
-
|
|
206
|
+
几何规格(高度 / 内边距 / 字号 / 圆角)**直接追加/修改在模版既有的 `element-plus.scss` 内**,三条纪律:
|
|
207
|
+
|
|
208
|
+
1. 全部引用令牌,**禁止裸值**(`var(--x, 回退)` 的回退值除外)。
|
|
209
|
+
2. 每段追加规范注释:`/* —— <规范名> 几何:<组件> —— */`,让后续开发者一眼看出取值来源。
|
|
210
|
+
3. 模版里同一选择器已有裸值规则(如 `.el-card__body { padding: 5px }`)→ **就地改为令牌引用**,禁止另起一条规则去压盖,避免“同属性两处定义”。
|
|
211
|
+
|
|
212
|
+
黄金样板(按需追加/修改,只改数据值,结构不变):
|
|
188
213
|
|
|
189
214
|
```scss
|
|
190
215
|
/**
|
|
191
|
-
* <规范名> → Element Plus
|
|
216
|
+
* <规范名> → Element Plus 几何规格(追加在 element-plus.scss 内)
|
|
192
217
|
* 全部引用 design-tokens.scss 令牌;业务页禁止再写裸高度/内边距。
|
|
193
218
|
*/
|
|
194
219
|
|
|
@@ -303,29 +328,30 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
303
328
|
.el-breadcrumb { font-size: var(--font-size-base); line-height: var(--line-height); }
|
|
304
329
|
```
|
|
305
330
|
|
|
306
|
-
> 各规范差异项:`antd` 表头 `#fafafa` 不加边框分隔;`semi` 少阴影轻描边;`vuetify` 控件高度 Material 化(input 40px、button 36px
|
|
331
|
+
> 各规范差异项:`antd` 表头 `#fafafa` 不加边框分隔;`semi` 少阴影轻描边;`vuetify` 控件高度 Material 化(input 40px、button 36px);按第五节表微调样板中的数值来源即可,**结构不变**。差异值同样只改令牌数据,不另写选择器。
|
|
307
332
|
|
|
308
|
-
### Step 4 接线 `src/styles/index.scss
|
|
333
|
+
### Step 4 接线 `src/styles/index.scss`
|
|
309
334
|
|
|
310
335
|
```scss
|
|
311
|
-
@use 'design-tokens'; //
|
|
336
|
+
@use 'design-tokens'; // 唯一新增:纯数据令牌,必须最先
|
|
312
337
|
@use 'theme';
|
|
313
338
|
@use 'transition';
|
|
314
339
|
@use 'button';
|
|
315
|
-
@use 'element-plus'; //
|
|
316
|
-
@use 'design-controls'; // ③ 规范重写必须在其后,同选择器后者优先
|
|
340
|
+
@use 'element-plus'; // 模版默认覆盖 + 规范几何重写(已并入)
|
|
317
341
|
@use 'sidebar';
|
|
318
342
|
@use 'dark';
|
|
319
343
|
@use 'vant';
|
|
320
344
|
```
|
|
321
345
|
|
|
346
|
+
唯一顺序要求:`design-tokens` 放最前(供后续文件引用)。几何重写已并入 `element-plus.scss`,**不再存在**“重写层必须排在覆盖层之后”的顺序陷阱;模版其余 `@use` 顺序保持不动。
|
|
347
|
+
|
|
322
348
|
**字体接管**:
|
|
323
349
|
- 新模版:`index.scss` 已是 `font-family: var(--font-family, ...) !important`,令牌层定义 `--font-family` 即自动生效,无需改动。
|
|
324
350
|
- 旧模版:把 `* { font-family: 'Alibaba PuHuiTi 3.0' ... !important }` 改为 `font-family: var(--font-family) !important`(见 4.B 第 1 条)。
|
|
325
351
|
|
|
326
352
|
### Step 5 模版硬编码冲突处理(按模版版本二选一,逐条回填)
|
|
327
353
|
|
|
328
|
-
- **4.A(新模版,已变量化)**:模版样式均为 `var(--x, 默认值)` 形式,Step 2
|
|
354
|
+
- **4.A(新模版,已变量化)**:模版样式均为 `var(--x, 默认值)` 形式,Step 2 的「模版桥接令牌」段已自动接管。**逐条确认**桥接令牌齐全即可,`--vts-dialog-bg` 已变量化为 `var(--ds-dialog-bg, 原值)`,确认桥接段含 `--ds-dialog-bg: var(--el-bg-color-overlay)` 即完成接管。
|
|
329
355
|
- **4.B(旧模版)**:按第四节冲突清单**逐条手工处理**。
|
|
330
356
|
|
|
331
357
|
**无论走哪条路**,处理完必须:
|
|
@@ -339,13 +365,21 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
339
365
|
background: white !important、#000000d9
|
|
340
366
|
```
|
|
341
367
|
|
|
342
|
-
2. 在最终回复中**逐条回填**冲突清单处理结果(格式见
|
|
368
|
+
2. 在最终回复中**逐条回填**冲突清单处理结果(格式见 Step 8 验证输出),禁止笼统写「已全部处理」。
|
|
343
369
|
|
|
344
370
|
### Step 6 运行时主色与主题联动
|
|
345
371
|
|
|
346
372
|
1. `public/platform-config.json` 的 `EpThemeColor` 改为规范主色(如 `#1677FF`)——这是 `useApp.ts` 的初始 `--el-color-primary` 来源。
|
|
347
373
|
2. **localStorage 缓存陷阱(必告)**:`epThemeColor` 优先读 `localStorage` 的 `responsive-layout`,改完 `platform-config.json` 后**老访客不会自动生效**。必须在回复中提醒:清除浏览器 `responsive-layout` 缓存,或提升 `platform-config.json` 的 `Version` 触发重置。
|
|
348
|
-
3.
|
|
374
|
+
3. **公共区域(侧边栏 / 导航栏 / 内容壳)同样要按规范落地**——这些不在 EP 组件范围内,靠模版壳层变量与主题文件执行:
|
|
375
|
+
|
|
376
|
+
| 位置 | 项目 | 规范落地动作 |
|
|
377
|
+
|---|---|---|
|
|
378
|
+
| `theme.scss` | 侧栏配色 | 追加/覆盖与规范匹配的 `html[data-theme]` 块:`--vts-theme-menu-active-before` → 规范主色;菜单底/悬浮按规范形态(AntD Pro 浅色用 `light`,深色用 `default` `#001529`) |
|
|
379
|
+
| `index.scss` | 壳变量 | `--vts-bar-height`(导航高,AntD Pro 56px)、`--vts-margin`(内容边距)、`--vts-dialog-bg`(已变量化,由桥接令牌 `--ds-dialog-bg` 接管);改后回归验证列表页 `calc(100vh - ...)` |
|
|
380
|
+
| `platform-config.json` | 顶栏高度 | `HeaderHeight` 与规范一致(如 AntD Pro 56) |
|
|
381
|
+
| `sidebar.scss` | 侧栏几何 | 宽度走 `--sidebar-width`;菜单项高度走令牌层 EP 映射(`--el-menu-item-height`) |
|
|
382
|
+
|
|
349
383
|
4. 暗黑模式:在 `dark.scss` 内为新增令牌补暗色覆盖(`--vts-table-header-bg`、`--vts-message-bg`、`--vts-dialog-bg` 等),遵守 `layout-theme` 第三节规则。
|
|
350
384
|
|
|
351
385
|
### Step 7 存量代码回归扫描(防"令牌层建好了但页面没跟上")
|
|
@@ -357,7 +391,7 @@ grep 目标(*.vue 的 <style> 与行内 style):
|
|
|
357
391
|
height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
358
392
|
```
|
|
359
393
|
|
|
360
|
-
- 命中的 EP 控件裸几何 → 删除,交给 `
|
|
394
|
+
- 命中的 EP 控件裸几何 → 删除,交给 `element-plus.scss` 统一管。
|
|
361
395
|
- 布局类间距(容器 padding/margin)→ 允许保留 UnoCSS `p-*`/`m-*`,但颜色 hex 必须换成令牌。
|
|
362
396
|
- 扫描结果与处理数量写入最终回复。
|
|
363
397
|
|
|
@@ -380,11 +414,11 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
380
414
|
## 三、业务代码编写规则(规范生效期全程有效)
|
|
381
415
|
|
|
382
416
|
1. **禁止裸值**:业务页面/组件中不得对 EP 控件写裸 `height` / `padding` / `font-size` / `border-radius`,一律引用 `--control-*` / `--font-size-*` / `--radius-*` 令牌;布局间距用 UnoCSS `p-*` / `m-*`(4px 基数)。
|
|
383
|
-
2. **禁止重复重写**:组件几何只在 `
|
|
417
|
+
2. **禁止重复重写**:组件几何只在 `element-plus.scss` 统一改(引用令牌),业务页不得再写 `.el-input__wrapper { height: ... }` 之类的覆盖。
|
|
384
418
|
3. **颜色只走变量**:`--brand-*` / `--vts-*` / `--el-*`,禁止硬编码 hex(与 `layout-theme` 规则一致)。
|
|
385
|
-
4. **换规范 = 只换令牌层**:切换设计系统时只重写 `design-tokens.scss
|
|
419
|
+
4. **换规范 = 只换令牌层**:切换设计系统时只重写 `design-tokens.scss`(`element-plus.scss` 几何段已令牌化,原则上无需改动),业务代码零改动;做不到的写法说明违反了规则 1~3,必须修正。
|
|
386
420
|
5. 主色运行时切换仍走 `setEpThemeColor()`(保证 chroma 色阶同步),令牌层只负责初始值与非主色令牌。
|
|
387
|
-
6.
|
|
421
|
+
6. **命名纪律**:适配新增文件永远只有一个 `design-tokens.scss`;禁止按规范名派生文件(如 `semi-controls.scss`、`antd-tokens.scss`),禁止再新建独立的几何重写层文件。
|
|
388
422
|
|
|
389
423
|
---
|
|
390
424
|
|
|
@@ -404,7 +438,7 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
404
438
|
| 8 | `element-plus.scss` | `.el-table__header th` 色 `#8c8f90` + 底 `#f2f9fc` | 表头不跟随规范 | 已变量化 `--vts-table-header-*` | 改 `--vts-table-header-text/bg` |
|
|
405
439
|
| 9 | `element-plus.scss` | `.row-added/#e6f4ff`、`.row-modified/#fff7e6`、`.row-deleted/#f5f5f5` | 行变更色脱离规范且无暗色适配 | 已变量化 `--vts-row-*-bg` | 改 `--vts-row-*-bg` 令牌 |
|
|
406
440
|
| 10 | `element-plus.scss` | `.vts-message` 背景 `white`、文字 `#000000d9` | 暗黑/规范底失效 | 已变量化 `--vts-message-bg/text` | 改 `var(--vts-message-bg/text)` |
|
|
407
|
-
| 11 | `index.scss` | `--vts-dialog-bg: linear-gradient(to bottom, #e5f3fe, #fefefe)` | **所有弹窗强制渐变蓝底** |
|
|
441
|
+
| 11 | `index.scss` / `dark.scss` | `--vts-dialog-bg: linear-gradient(to bottom, #e5f3fe, #fefefe)`(dark: `rgb(36 37 37)`) | **所有弹窗强制渐变蓝底** | 已变量化 `var(--ds-dialog-bg, 原值)`,桥接令牌 `--ds-dialog-bg` 自动接管 | 旧项目把亮/暗两处定义改为 `var(--ds-dialog-bg, 原值)` |
|
|
408
442
|
| 12 | `theme.scss` | 8 套侧栏配色(激活条 `#4091f7` 等) | 激活指示条非规范主色 | 主题库保留 | 追加规范匹配的 `html[data-theme]` 块覆盖 `--vts-theme-menu-active-before` |
|
|
409
443
|
| 13 | `useApp.ts` | `epThemeColor` 缺省 `#409EFF` | EP 出厂蓝 ≠ 规范主色 | 不改代码 | 改 `platform-config.json` 的 `EpThemeColor`(Step 6) |
|
|
410
444
|
| 14 | `index.scss` | `--vts-bar-height: 38px`、`--vts-margin: 8px` | 与规范导航高度(AntD Pro 56px)不一致 | 令牌可覆盖 | 令牌层覆盖并回归验证列表页 `calc(100vh - ...)`;默认保持不变标注差异 |
|
|
@@ -443,7 +477,7 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
443
477
|
|
|
444
478
|
1. 输出识别回执,「项目现状」标注为已适配的旧规范。
|
|
445
479
|
2. **只重写** `design-tokens.scss` 的「用户可自定义」区块 + 语义别名 + EP 映射(按新规范速查表),桥接令牌段结构不变。
|
|
446
|
-
3. `
|
|
480
|
+
3. `element-plus.scss` 的几何段已全部令牌化,**原则上不动**;仅当两规范存在无法令牌化的结构差异时才微调(极罕见),结构不动。
|
|
447
481
|
4. 更新 `platform-config.json` 的 `EpThemeColor`,并**提醒清 localStorage**(Step 6 第 2 条)。
|
|
448
482
|
5. 重跑 Step 5 grep 验证、Step 7 存量扫描、Step 8 验证清单。
|
|
449
483
|
6. 业务代码应当零改动;若有改动,说明存在裸值,先修裸值再切换。
|
|
@@ -486,7 +520,7 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
486
520
|
|
|
487
521
|
1. 先输出识别回执(规范 = 稿子所用系统;不在预设内则标 `custom`,按 1.3)。
|
|
488
522
|
2. 按 7.2 归一化后,把「用户可自定义」区块的令牌值写入 `design-tokens.scss`。
|
|
489
|
-
3. 若上游产出含组件视觉(HTML 原型/设计稿)→ 以其为基准微调 `
|
|
523
|
+
3. 若上游产出含组件视觉(HTML 原型/设计稿)→ 以其为基准微调 `element-plus.scss` 几何段的差异项。
|
|
490
524
|
4. 上游产出里的业务配色(状态色、图表系列)按 `layout-theme` 第八节映射为 `--vts-*` 语义变量。
|
|
491
525
|
5. 原型与项目出现视觉差异时:先对比两侧令牌值是否一致(含命名映射是否漏项),再查第四节冲突清单是否漏处理,最后查 Step 7 存量裸值。
|
|
492
526
|
|
|
@@ -502,9 +536,9 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
502
536
|
|
|
503
537
|
- 只把 `--el-color-primary` 改成规范主色就宣称"已适配 Ant Design"(字号/圆角/高度/内边距全未动)。
|
|
504
538
|
- **识别漂移风险**:用户口述的规范与真正写入令牌层的规范不一致(如说要 AntD 却写了 `#0077fa`、`--semi-*` 别名的 Semi 令牌)——回执块与三点一致性校验就是防这个。
|
|
505
|
-
-
|
|
539
|
+
- **命名漂移/重复建层**:适配文件建成 `tokens.scss`,或另起 `semi-controls.scss` 之类的几何重写层与 `element-plus.scss` 并存——新增文件只允许 `design-tokens.scss`,几何重写一律并入 `element-plus.scss`。
|
|
506
540
|
- **冲突清单假完成**:声称「已全部处理」,实际 `reset.scss` 的 body 字体(不带 !important 的那条)与 `label { font-weight: 700 }` 原封未动——grep 时漏掉了不带 !important 的关键词。
|
|
507
|
-
-
|
|
541
|
+
- **靠加载顺序压盖**:几何重写独立成文件、指望 `@use` 顺序盖过模版覆盖层,顺序一错样式静默失效——已改为并入 `element-plus.scss`,从根上消除顺序问题。
|
|
508
542
|
- 弹窗仍是渐变蓝底(忘改 `--vts-dialog-bg`)。
|
|
509
543
|
- 改了 `platform-config.json` 主色但没提醒清 localStorage → 老访客看到的还是旧色。
|
|
510
544
|
- 业务页面里又写 `.el-input { height: 36px }` 之类的裸值覆盖 → 换规范时需要逐页改,违反规则 1~2。
|
|
@@ -32,8 +32,8 @@ const NoticeBar = defineAsyncComponent(
|
|
|
32
32
|
text="系统将于今晚 22:00 进行维护"
|
|
33
33
|
left-icon="notice"
|
|
34
34
|
right-icon="arrowRight"
|
|
35
|
-
background="
|
|
36
|
-
color="
|
|
35
|
+
background="var(--el-color-primary-light-9)"
|
|
36
|
+
color="var(--el-color-primary)"
|
|
37
37
|
/>
|
|
38
38
|
</template>
|
|
39
39
|
```
|
|
@@ -62,6 +62,10 @@ const initGraph = async () => {
|
|
|
62
62
|
const { Graph } = await import('@antv/g6')
|
|
63
63
|
register(ExtensionCategory.NODE, 'vue-node', VueNode)
|
|
64
64
|
|
|
65
|
+
/** 读取 CSS 变量(canvas 需要具体色值;设计规范生效期自动跟随令牌,见 core-kernel「四之二」) */
|
|
66
|
+
const getCssVar = (name: string, fallback = '') =>
|
|
67
|
+
getComputedStyle(document.documentElement).getPropertyValue(name).trim() || fallback
|
|
68
|
+
|
|
65
69
|
// 定义 Vue 节点组件
|
|
66
70
|
const FlowNodeComp = defineComponent({
|
|
67
71
|
name: 'FlowNodeComp',
|
|
@@ -96,16 +100,17 @@ const initGraph = async () => {
|
|
|
96
100
|
return () => (
|
|
97
101
|
<div style={{
|
|
98
102
|
width: `${props.nodeWidth}px`, height: `${props.nodeHeight}px`,
|
|
99
|
-
border: '2px solid',
|
|
100
|
-
|
|
103
|
+
border: '2px solid',
|
|
104
|
+
borderColor: isSelected.value ? getCssVar('--el-color-danger', 'red') : getCssVar('--el-color-primary-light-5', '#9DC5EA'),
|
|
105
|
+
borderRadius: '8px', background: getCssVar('--el-color-primary-light-9', '#EAF4FF'), cursor: 'pointer',
|
|
101
106
|
}} onClick={handleNodeClick}>
|
|
102
|
-
<div style={{ background: '#CFE7FF', padding: '8px', fontWeight: 600 }}>
|
|
107
|
+
<div style={{ background: getCssVar('--el-color-primary-light-8', '#CFE7FF'), padding: '8px', fontWeight: 600 }}>
|
|
103
108
|
{nodeData.value?.title ?? ''}
|
|
104
109
|
</div>
|
|
105
110
|
<div style={{ padding: '8px' }}>
|
|
106
111
|
<div>业务号:{nodeData.value?.caseNo ?? ''}</div>
|
|
107
112
|
<div>{nodeData.value?.handler ?? ''}</div>
|
|
108
|
-
<div style={{ color: '#409eff' }}>状态:{nodeData.value?.status ?? ''}</div>
|
|
113
|
+
<div style={{ color: getCssVar('--el-color-primary', '#409eff') }}>状态:{nodeData.value?.status ?? ''}</div>
|
|
109
114
|
</div>
|
|
110
115
|
</div>
|
|
111
116
|
)
|
|
@@ -131,7 +136,7 @@ const initGraph = async () => {
|
|
|
131
136
|
},
|
|
132
137
|
animation: { enter: false },
|
|
133
138
|
},
|
|
134
|
-
edge: { type: 'line', style: { stroke: '#9DC5EA' }, animation: { enter: false } },
|
|
139
|
+
edge: { type: 'line', style: { stroke: getCssVar('--el-color-primary-light-5', '#9DC5EA') }, animation: { enter: false } },
|
|
135
140
|
layout: {
|
|
136
141
|
type: 'compact-box',
|
|
137
142
|
direction: 'TB',
|
|
@@ -227,7 +232,7 @@ defineExpose({ getInstance: () => graph })
|
|
|
227
232
|
<!-- g6 页面示例 -->
|
|
228
233
|
<template>
|
|
229
234
|
<div :style="{ height: `calc(100vh - 2 * var(--vts-margin) - ${headerHeight}px)` }"
|
|
230
|
-
class="pos-relative bg-
|
|
235
|
+
class="pos-relative bg-bg_color p-5 overflow-hidden">
|
|
231
236
|
<div class="toolbar">
|
|
232
237
|
<el-alert title="antv/g6流程图展示" type="info" :closable="false" />
|
|
233
238
|
</div>
|
|
@@ -113,13 +113,20 @@ const transformNodes = (nodesData): GraphNode[] => {
|
|
|
113
113
|
}))
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
// 图谱业务色板(集中声明、全篇引用;设计规范生效期改为从设计令牌读取的值,见 core-kernel「四之二」)
|
|
117
|
+
const GRAPH_PALETTE = {
|
|
118
|
+
enterprise: '#4F9DF8', // 企业客户
|
|
119
|
+
personal: '#FF8234', // 个人客户
|
|
120
|
+
self: '#675bf6', // 当前客户
|
|
121
|
+
}
|
|
122
|
+
|
|
116
123
|
// 连线转换 — 可根据目标节点类型设置颜色
|
|
117
124
|
const transformLines = (linesData): GraphLine[] => {
|
|
118
125
|
return linesData.map((line) => {
|
|
119
126
|
const targetNode = nodes.value.find(n => n.id === line.source)
|
|
120
127
|
let color = ''
|
|
121
|
-
if (targetNode?.data.customerType === '2') color =
|
|
122
|
-
else if (targetNode?.data.customerType === '1') color =
|
|
128
|
+
if (targetNode?.data.customerType === '2') color = GRAPH_PALETTE.enterprise
|
|
129
|
+
else if (targetNode?.data.customerType === '1') color = GRAPH_PALETTE.personal
|
|
123
130
|
return { from: line.source, to: line.target, text: line.category, opacity: 1, color, textOffset_y: 15 }
|
|
124
131
|
})
|
|
125
132
|
}
|
|
@@ -190,7 +197,7 @@ const onCanvasClick = ($event) => {
|
|
|
190
197
|
@canvas-click="onCanvasClick" @node-click="onNodeClick" @line-click="onLineClick">
|
|
191
198
|
<template #node="{ node }">
|
|
192
199
|
<div :data-node-id="node.id" class="my-node-style"
|
|
193
|
-
:
|
|
200
|
+
:style="{ background: node.data.customerType === '2' ? GRAPH_PALETTE.enterprise : '' }"
|
|
194
201
|
@mouseenter="showNodeTips(node)" @mouseleave="hideNodeTips">
|
|
195
202
|
<div class="c-node-name">{{ node.text }}</div>
|
|
196
203
|
</div>
|
|
@@ -243,9 +250,9 @@ onMounted(async () => {
|
|
|
243
250
|
|
|
244
251
|
```typescript
|
|
245
252
|
const legendConfig = ref([
|
|
246
|
-
{ type: 'self', label: '当前客户', color:
|
|
247
|
-
{ type: 'personal', label: '个人客户', color:
|
|
248
|
-
{ type: 'enterprise', label: '企业客户', color:
|
|
253
|
+
{ type: 'self', label: '当前客户', color: GRAPH_PALETTE.self, borderColor: '#9f93da', borderStyle: 'dashed' },
|
|
254
|
+
{ type: 'personal', label: '个人客户', color: GRAPH_PALETTE.personal, borderColor: GRAPH_PALETTE.personal },
|
|
255
|
+
{ type: 'enterprise', label: '企业客户', color: GRAPH_PALETTE.enterprise, borderColor: GRAPH_PALETTE.enterprise },
|
|
249
256
|
])
|
|
250
257
|
```
|
|
251
258
|
|
|
@@ -125,7 +125,7 @@ html.dark {
|
|
|
125
125
|
// === 必须覆盖的全局变量 ===
|
|
126
126
|
--vts-border-color: rgb(253 253 253 / 12%); // 亮色: rgb(5 5 5 / 6%)
|
|
127
127
|
--vts-switch-off-color: #ffffff3f; // 亮色: #a6a6a6
|
|
128
|
-
--vts-dialog-bg: rgb(36 37 37);
|
|
128
|
+
--vts-dialog-bg: var(--ds-dialog-bg, rgb(36 37 37)); // 亮色: var(--ds-dialog-bg, linear-gradient(...))
|
|
129
129
|
|
|
130
130
|
// === 布局区域背景 ===
|
|
131
131
|
.navbar, .tags-view, .sidebar-container,
|
|
@@ -158,13 +158,13 @@ html.dark {
|
|
|
158
158
|
|
|
159
159
|
| 位置 | 硬编码值 | 用途 | 建议 |
|
|
160
160
|
|------|---------|------|------|
|
|
161
|
-
| `.el-table__header th` | `#f2f9fc` | 表头背景 |
|
|
162
|
-
| `.el-table__header th` | `#8c8f90` | 表头文字 |
|
|
161
|
+
| `.el-table__header th` | `#f2f9fc` | 表头背景 | 已变量化 `var(--vts-table-header-bg, #f2f9fc)`,设计系统可覆写 |
|
|
162
|
+
| `.el-table__header th` | `#8c8f90` | 表头文字 | 已变量化 `var(--vts-table-header-text, #8c8f90)`,设计系统可覆写 |
|
|
163
163
|
| `.row-added` | `#e6f4ff` | 新增行背景 | 需添加暗黑覆盖 |
|
|
164
164
|
| `.row-modified` | `#fff7e6` | 修改行背景 | 需添加暗黑覆盖 |
|
|
165
165
|
| `.row-deleted` | `#f5f5f5` | 删除行背景 | 需添加暗黑覆盖 |
|
|
166
166
|
| `.el-collapse-item__header` | `#34394d` | 折叠面板文字 | 应使用 `var(--el-text-color-primary)` |
|
|
167
|
-
| `.vxe-header--row` | `#f2f9fc` / `#8c8f90` | VXE 表头 |
|
|
167
|
+
| `.vxe-header--row` | `#f2f9fc` / `#8c8f90` | VXE 表头 | 已变量化,与 el-table 表头共用 `--vts-table-header-*` |
|
|
168
168
|
| 滚动条 | `#f9fafb` / `#e5e5e5` | 滚动条样式 | 需添加暗黑覆盖 |
|
|
169
169
|
| autofill | `white` / `#333` | 输入框自动填充 | 需添加暗黑覆盖 |
|
|
170
170
|
|
|
@@ -104,4 +104,5 @@ const options = reactive({
|
|
|
104
104
|
|
|
105
105
|
1. 二维码内容为空时不渲染,需配合 `v-if` 或默认值处理。
|
|
106
106
|
2. logo 图片需考虑跨域;本地图片建议通过 `import` 引入。
|
|
107
|
+
3. 码色值(`color.dark/light`、JsBarcode `lineColor`)在库层需要具体色值:设计规范生效期用 `getComputedStyle` 从令牌读取(写法见 `core-kernel`「四之二」getCssVar),勿把品牌色写死在业务代码。
|
|
107
108
|
3. 条形码 `type` 与 `options.format` 同时存在时,`type` 优先级更高。
|
|
@@ -148,17 +148,17 @@ onBeforeUnmount(() => {
|
|
|
148
148
|
</template>
|
|
149
149
|
|
|
150
150
|
<style>
|
|
151
|
-
/* BPMN 高亮样式(全局,不加 scoped
|
|
151
|
+
/* BPMN 高亮样式(全局,不加 scoped);色值走语义变量,设计规范生效期由令牌自动覆写 */
|
|
152
152
|
:deep(.bpmn-active) .djs-visual > :nth-child(1) {
|
|
153
|
-
fill:
|
|
154
|
-
stroke:
|
|
153
|
+
fill: var(--el-color-primary) !important;
|
|
154
|
+
stroke: var(--el-color-primary) !important;
|
|
155
155
|
}
|
|
156
156
|
:deep(.bpmn-finished) .djs-visual > :nth-child(1) {
|
|
157
|
-
fill:
|
|
158
|
-
stroke:
|
|
157
|
+
fill: var(--el-color-success) !important;
|
|
158
|
+
stroke: var(--el-color-success) !important;
|
|
159
159
|
}
|
|
160
160
|
:deep(.bpmn-flow-finished) .djs-visual > :nth-child(1) {
|
|
161
|
-
stroke:
|
|
161
|
+
stroke: var(--el-color-success) !important;
|
|
162
162
|
}
|
|
163
163
|
</style>
|
|
164
164
|
```
|