@qilitt-mickey/vue3-temp-skill 1.1.7 → 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 +2 -0
- package/package.json +1 -1
- package/references/code-quality.md +3 -0
- 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 +4 -3
- 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
|
@@ -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
|
|
|
@@ -290,6 +291,7 @@ reset(); // 重置(配合 formRef.resetFields)
|
|
|
290
291
|
**5. 业务** — `onSearch`/`reset`;提交 loading;权限;未二次 Layout
|
|
291
292
|
**5b. 列表布局** — `el-card`+`content`+固定 height;查询/展示分区;`tableHeight`;分页在 ReTableBar 内
|
|
292
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 层)。
|
|
@@ -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; }
|
|
@@ -162,6 +162,7 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
162
162
|
--vts-scrollbar-thumb-hover: var(--el-text-color-secondary);
|
|
163
163
|
--vts-autofill-bg: var(--el-bg-color);
|
|
164
164
|
--vts-autofill-text: var(--el-text-color-primary);
|
|
165
|
+
--ds-dialog-bg: var(--el-bg-color-overlay); /* 接管 --vts-dialog-bg:弹窗背景按规范走浮层色 */
|
|
165
166
|
|
|
166
167
|
/* —— Element Plus 变量映射(必配,含主色兜底) —— */
|
|
167
168
|
--el-color-primary: var(--brand-primary); /* 兜底:JS 运行时 setEpThemeColor 生效前的首屏主色 */
|
|
@@ -350,7 +351,7 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
350
351
|
|
|
351
352
|
### Step 5 模版硬编码冲突处理(按模版版本二选一,逐条回填)
|
|
352
353
|
|
|
353
|
-
- **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)` 即完成接管。
|
|
354
355
|
- **4.B(旧模版)**:按第四节冲突清单**逐条手工处理**。
|
|
355
356
|
|
|
356
357
|
**无论走哪条路**,处理完必须:
|
|
@@ -375,7 +376,7 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
375
376
|
| 位置 | 项目 | 规范落地动作 |
|
|
376
377
|
|---|---|---|
|
|
377
378
|
| `theme.scss` | 侧栏配色 | 追加/覆盖与规范匹配的 `html[data-theme]` 块:`--vts-theme-menu-active-before` → 规范主色;菜单底/悬浮按规范形态(AntD Pro 浅色用 `light`,深色用 `default` `#001529`) |
|
|
378
|
-
| `index.scss` | 壳变量 | `--vts-bar-height`(导航高,AntD Pro 56px)、`--vts-margin`(内容边距)、`--vts-dialog-bg
|
|
379
|
+
| `index.scss` | 壳变量 | `--vts-bar-height`(导航高,AntD Pro 56px)、`--vts-margin`(内容边距)、`--vts-dialog-bg`(已变量化,由桥接令牌 `--ds-dialog-bg` 接管);改后回归验证列表页 `calc(100vh - ...)` |
|
|
379
380
|
| `platform-config.json` | 顶栏高度 | `HeaderHeight` 与规范一致(如 AntD Pro 56) |
|
|
380
381
|
| `sidebar.scss` | 侧栏几何 | 宽度走 `--sidebar-width`;菜单项高度走令牌层 EP 映射(`--el-menu-item-height`) |
|
|
381
382
|
|
|
@@ -437,7 +438,7 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
437
438
|
| 8 | `element-plus.scss` | `.el-table__header th` 色 `#8c8f90` + 底 `#f2f9fc` | 表头不跟随规范 | 已变量化 `--vts-table-header-*` | 改 `--vts-table-header-text/bg` |
|
|
438
439
|
| 9 | `element-plus.scss` | `.row-added/#e6f4ff`、`.row-modified/#fff7e6`、`.row-deleted/#f5f5f5` | 行变更色脱离规范且无暗色适配 | 已变量化 `--vts-row-*-bg` | 改 `--vts-row-*-bg` 令牌 |
|
|
439
440
|
| 10 | `element-plus.scss` | `.vts-message` 背景 `white`、文字 `#000000d9` | 暗黑/规范底失效 | 已变量化 `--vts-message-bg/text` | 改 `var(--vts-message-bg/text)` |
|
|
440
|
-
| 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, 原值)` |
|
|
441
442
|
| 12 | `theme.scss` | 8 套侧栏配色(激活条 `#4091f7` 等) | 激活指示条非规范主色 | 主题库保留 | 追加规范匹配的 `html[data-theme]` 块覆盖 `--vts-theme-menu-active-before` |
|
|
442
443
|
| 13 | `useApp.ts` | `epThemeColor` 缺省 `#409EFF` | EP 出厂蓝 ≠ 规范主色 | 不改代码 | 改 `platform-config.json` 的 `EpThemeColor`(Step 6) |
|
|
443
444
|
| 14 | `index.scss` | `--vts-bar-height: 38px`、`--vts-margin: 8px` | 与规范导航高度(AntD Pro 56px)不一致 | 令牌可覆盖 | 令牌层覆盖并回归验证列表页 `calc(100vh - ...)`;默认保持不变标注差异 |
|
|
@@ -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
|
```
|