@qilitt-mickey/vue3-temp-skill 1.1.23 → 1.1.24
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 -1
- package/package.json +1 -1
- package/references/code-quality.md +14 -0
- package/references/crud-pages.md +251 -2
- package/references/design-handoff.md +37 -3
- package/references/design-system.md +37 -13
package/SKILL.md
CHANGED
|
@@ -70,7 +70,8 @@ tags: [vue3, typescript, element-plus, vant, pinia, vite, unocss, crud, componen
|
|
|
70
70
|
| addon / 查 Re* 名 / 装依赖 | `references/project-inventory.md` |
|
|
71
71
|
| **启用精简模板已删的 addon(装包 + 改配置)** | `references/addon-enable.md`(与功能模块同读) |
|
|
72
72
|
| 写完代码后(闸门,非功能命中) | `references/code-quality.md` |
|
|
73
|
-
| 设计交接块 / **design-handoff/v1 JSON** / 上游令牌产出落地 | `references/design-handoff.md`(+ `design-system`) |
|
|
73
|
+
| 设计交接块 / **design-handoff/v1 JSON** / 上游令牌产出落地 | `references/design-handoff.md`(+ `design-system`) |
|
|
74
|
+
| **设计模式**(设计 Skill 产出存在时触发) | `crud-pages.md` 设计模式样板 + `design-system.md` Step 3.5 |
|
|
74
75
|
|
|
75
76
|
### 标准业务面
|
|
76
77
|
|
package/package.json
CHANGED
|
@@ -46,6 +46,20 @@ lint / type-check **过了也不能放过**下列项。发现即改代码,禁
|
|
|
46
46
|
| 新菜单路由 | 父级无 `icon` 或业务页二次挂 `Layout` | `icons` + `core-kernel` |
|
|
47
47
|
| 列表查询区 `el-form` / 查询按钮 | 写了 `size="small"`(紧凑主题用户未要求) | 不写 size,用 default=`--control-height` |
|
|
48
48
|
| 本轮新增 addon 并引用对应 `Re*` / Vant / 微信 | 已装包但 `tsconfig exclude` 仍含该路径,或 `addon-enable` 要求的 build/src 未改 | 按 **`addon-enable.md`** 对应章节恢复后重跑 type-check |
|
|
49
|
+
| `design-visual.scss` / `design-layout.scss` 存在 | `index.scss` 未 `@use` 加载,或加载顺序不在 `element-plus` 之前 | `design-tokens` → `design-visual` → `design-layout` → `element-plus` |
|
|
50
|
+
| `design-visual.scss` 规则体内出现硬编码值 | 非令牌引用的裸 hex / px / rgba 值 | 全部改为 `var()` 引用令牌 |
|
|
51
|
+
| 视觉层 / 构图层新增规则 | `dark.scss` 缺少对应暗色覆盖 | 每条新规则在 `html.dark` 内有对应覆盖 |
|
|
52
|
+
|
|
53
|
+
### 设计模式专项检查(设计 Skill 产出存在时)
|
|
54
|
+
|
|
55
|
+
| 检查项 | 失败条件 | 修复 |
|
|
56
|
+
|--------|---------|------|
|
|
57
|
+
| 列表页页面标题区 | 设计模式下列表页无 `.vts-page-header`(标题+描述+操作) | 按 `crud-pages.md` 设计模式样板 D2 补充 |
|
|
58
|
+
| 列表页筛选区 | 设计模式下仍用 `bg-bg_color p-5` 而非 `.vts-filter-area` | 升级为 `.vts-filter-area` |
|
|
59
|
+
| 列表页表格区 | 设计模式下表格区无 `.vts-table-area` 包裹 | 外包 `.vts-table-area` |
|
|
60
|
+
| 设计模式值引用 | 页面代码中 CSS 钩子类对应的值非令牌引用 | 值来自 `design-tokens.scss` 令牌变量 |
|
|
61
|
+
|
|
62
|
+
> **放松说明**:设计模式下,允许页面级结构 CSS(`.vts-page-header` 等布局类)。项目 Skill 的禁止项("禁止另建独立重写层文件"等)在**设计模式**下不适用于页面代码中的布局结构实现,仅对全局样式文件生效。
|
|
49
63
|
|
|
50
64
|
## 选型与硬约束
|
|
51
65
|
|
package/references/crud-pages.md
CHANGED
|
@@ -43,7 +43,7 @@ useTableSearch(formQuery, searchFn, url)
|
|
|
43
43
|
|---|------|
|
|
44
44
|
| L1 | `el-card` + `class="vts-page-card"` + `ref="content"`(禁止挂 `div`) |
|
|
45
45
|
| L2 | 不要写 `height: calc(100vh - …)` / 不要用 JS 测顶栏定高(壳层 + `.vts-page-card` 已填满) |
|
|
46
|
-
| L3 | 查询区 `bg-bg_color p-5
|
|
46
|
+
| L3 | 查询区 `class="vts-filter-area"`(含容器感+分隔线,等效旧 `bg-bg_color p-5`);展示区 `ReTableBar` 外包 `.vts-table-area` |
|
|
47
47
|
| L4 | `ReGrid` `:gap="[0,20]"` + cols;表单项 `w-[100%] !mr-0`;`@should-show-collapse` |
|
|
48
48
|
| L5 | 查询区 `<ReGridItem suffix>`(查询 / 重置 / 展开收起) |
|
|
49
49
|
| L6 | 表格绑 `ref="multipleTableRef"` + `tableHeight`;分页在 `ReTableBar` `#default` 内、表格下方 |
|
|
@@ -249,7 +249,256 @@ function handleSizeChange(size: number) {
|
|
|
249
249
|
</template>
|
|
250
250
|
```
|
|
251
251
|
|
|
252
|
-
补充:`ReTableOperate` 用 `:list`;`defineOptions.name` === 路由 `name`;`svgLoading` 来自 `useApp()`;列表定高走壳层令牌 + `vts-page-card`。
|
|
252
|
+
补充:`ReTableOperate` 用 `:list`;`defineOptions.name` === 路由 `name`;`svgLoading` 来自 `useApp()`;列表定高走壳层令牌 + `vts-page-card`。
|
|
253
|
+
|
|
254
|
+
## 列表设计模式样板(设计 Skill 产出存在时使用)
|
|
255
|
+
|
|
256
|
+
> **触发条件**:存在 `design-handoff/v1` JSON、用户指定设计规范、或命中 `design-system` 模块且设计 Skill 产出可用。
|
|
257
|
+
>
|
|
258
|
+
> **与出厂模式的区别**:出厂模式(上文 L1-L9)直接堆 `el-card` + 查询区 + 表格,无页面标题区。设计模式按设计 Skill 的 `list-page.md` 区域拆分,包含完整的页面标题区、筛选区容器、操作栏、表格区。
|
|
259
|
+
>
|
|
260
|
+
> **结构变化**:
|
|
261
|
+
> - 新增 `.vts-page-header`(标题 + 描述 + 标题区操作按钮)
|
|
262
|
+
> - 查询区从 `bg-bg_color p-5` 升级为 `.vts-filter-area`(有容器感 + 分隔线)
|
|
263
|
+
> - 表格区外包 `.vts-table-area`(有圆角边框包裹)
|
|
264
|
+
> - 主操作按钮(新增/导入)从 `ReTableBar #buttons` 移到 `.vts-page-header__actions`
|
|
265
|
+
|
|
266
|
+
| # | 必须 |
|
|
267
|
+
|---|------|
|
|
268
|
+
| D1 | `el-card` + `class="vts-page-card"` + `ref="content"`(同 L1) |
|
|
269
|
+
| D2 | `.vts-page-header`:标题 18px 加粗 + 描述 13px tertiary + 右侧操作按钮(新增/导入) |
|
|
270
|
+
| D3 | `.vts-filter-area`:筛选区容器(独立背景 + 圆角 + 底部分隔线) |
|
|
271
|
+
| D4 | `.vts-action-bar`:表格上方操作栏(批量删除等 + 右侧刷新/列设置) |
|
|
272
|
+
| D5 | `.vts-table-area`:表格区包裹(圆角 + 边框) |
|
|
273
|
+
| D6 | 表头:品牌色浅底 + 字重 600 + 底部强调线(由 `design-visual.scss` 全局提供) |
|
|
274
|
+
| D7 | 行 hover:品牌色极浅底 + 过渡(由 `design-visual.scss` 全局提供) |
|
|
275
|
+
| D8 | 其余同 L4-L9(ReGrid / ReTableBar / RePagination / ReTableOperate) |
|
|
276
|
+
|
|
277
|
+
```vue
|
|
278
|
+
<script setup lang="ts">
|
|
279
|
+
import type { OperateButton } from "@/components/ReTableOperate";
|
|
280
|
+
import type { Customer, CustomerQuery } from "@/api/customer";
|
|
281
|
+
import { getCustomerList } from "@/api/customer";
|
|
282
|
+
import { ReGrid } from "@/components/ReGrid";
|
|
283
|
+
import { ReGridItem } from "@/components/ReGridItem";
|
|
284
|
+
import { RePagination } from "@/components/RePagination";
|
|
285
|
+
import { ReTableBar } from "@/components/ReTableBar";
|
|
286
|
+
import { ReTableOperate, resolveOperateColumnWidth } from "@/components/ReTableOperate";
|
|
287
|
+
import { useApp } from "@/hooks/useApp";
|
|
288
|
+
import { useTableSearch } from "@/hooks/useTableSearch";
|
|
289
|
+
import { message } from "@/utils/message";
|
|
290
|
+
|
|
291
|
+
defineOptions({ name: "CustomerList" });
|
|
292
|
+
|
|
293
|
+
const { svgLoading } = useApp();
|
|
294
|
+
const formQuery = reactive<CustomerQuery>({ keyword: "", status: undefined });
|
|
295
|
+
|
|
296
|
+
const {
|
|
297
|
+
content,
|
|
298
|
+
otherRef,
|
|
299
|
+
tableHeight,
|
|
300
|
+
paginationRef,
|
|
301
|
+
loading,
|
|
302
|
+
formRef,
|
|
303
|
+
multipleTableRef,
|
|
304
|
+
pagination,
|
|
305
|
+
onSearch,
|
|
306
|
+
tableData,
|
|
307
|
+
gridRef,
|
|
308
|
+
showCollapse,
|
|
309
|
+
collapsed,
|
|
310
|
+
collapsedToggle,
|
|
311
|
+
upBold,
|
|
312
|
+
downBold,
|
|
313
|
+
reset,
|
|
314
|
+
} = useTableSearch(
|
|
315
|
+
formQuery,
|
|
316
|
+
getCustomerList,
|
|
317
|
+
`${import.meta.env.VITE_API_BASE_URL}/console/customer/list`,
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const tableList = computed(() => tableData.value.tableList as Customer[]);
|
|
321
|
+
|
|
322
|
+
const operateLimit = 3;
|
|
323
|
+
|
|
324
|
+
const operateButtons: OperateButton[] = [
|
|
325
|
+
{
|
|
326
|
+
label: $t("删除"),
|
|
327
|
+
type: "danger",
|
|
328
|
+
icon: "i-ep:delete",
|
|
329
|
+
onClick: (row) => handleDelete(row as Customer),
|
|
330
|
+
},
|
|
331
|
+
];
|
|
332
|
+
|
|
333
|
+
onMounted(() => onSearch());
|
|
334
|
+
|
|
335
|
+
function handleDelete(row: Customer) {
|
|
336
|
+
message($t("删除成功"), { type: "success" });
|
|
337
|
+
onSearch();
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function handleCurrentChange(cur: number) {
|
|
341
|
+
pagination.currentPage = cur;
|
|
342
|
+
onSearch();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
function handleSizeChange(size: number) {
|
|
346
|
+
pagination.pageSize = size;
|
|
347
|
+
onSearch();
|
|
348
|
+
}
|
|
349
|
+
</script>
|
|
350
|
+
|
|
351
|
+
<template>
|
|
352
|
+
<div>
|
|
353
|
+
<el-card
|
|
354
|
+
ref="content"
|
|
355
|
+
class="vts-page-card"
|
|
356
|
+
shadow="never"
|
|
357
|
+
>
|
|
358
|
+
<!-- D2: 页面标题区 -->
|
|
359
|
+
<div class="vts-page-header">
|
|
360
|
+
<div class="vts-page-header__info">
|
|
361
|
+
<span class="vts-page-header__title">{{ $t("客户列表") }}</span>
|
|
362
|
+
<span class="vts-page-header__desc">{{ $t("管理客户的售价、类型与库存信息") }}</span>
|
|
363
|
+
</div>
|
|
364
|
+
<div class="vts-page-header__actions">
|
|
365
|
+
<el-button
|
|
366
|
+
type="primary"
|
|
367
|
+
v-auth="['admin']"
|
|
368
|
+
@click="handleAdd"
|
|
369
|
+
>
|
|
370
|
+
{{ $t("新增") }}
|
|
371
|
+
</el-button>
|
|
372
|
+
<el-button v-auth="['admin']">{{ $t("导入") }}</el-button>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
|
|
376
|
+
<!-- D3: 筛选区容器 -->
|
|
377
|
+
<div class="vts-filter-area">
|
|
378
|
+
<el-form
|
|
379
|
+
ref="formRef"
|
|
380
|
+
:inline="true"
|
|
381
|
+
:model="formQuery"
|
|
382
|
+
>
|
|
383
|
+
<ReGrid
|
|
384
|
+
ref="gridRef"
|
|
385
|
+
:collapsed="collapsed"
|
|
386
|
+
:gap="[0, 20]"
|
|
387
|
+
:cols="{ xs: 1, sm: 2, md: 2, lg: 3, xl: 4 }"
|
|
388
|
+
style="max-height: 300px; overflow-y: auto;"
|
|
389
|
+
@should-show-collapse="(val) => (showCollapse = val)"
|
|
390
|
+
>
|
|
391
|
+
<ReGridItem index="0">
|
|
392
|
+
<el-form-item :label="$t('关键词')" prop="keyword" class="w-[100%] !mr-0">
|
|
393
|
+
<el-input v-model="formQuery.keyword" clearable :placeholder="$t('请输入')" />
|
|
394
|
+
</el-form-item>
|
|
395
|
+
</ReGridItem>
|
|
396
|
+
<ReGridItem index="1">
|
|
397
|
+
<el-form-item :label="$t('状态')" prop="status" class="w-[100%] !mr-0">
|
|
398
|
+
<el-select v-model="formQuery.status" clearable :placeholder="$t('请选择')">
|
|
399
|
+
<el-option :label="$t('启用')" :value="1" />
|
|
400
|
+
<el-option :label="$t('禁用')" :value="0" />
|
|
401
|
+
</el-select>
|
|
402
|
+
</el-form-item>
|
|
403
|
+
</ReGridItem>
|
|
404
|
+
<ReGridItem suffix>
|
|
405
|
+
<div class="flex flex-end">
|
|
406
|
+
<el-button
|
|
407
|
+
type="primary"
|
|
408
|
+
:loading="loading"
|
|
409
|
+
@click="pagination.currentPage = 1; pagination.pageSize = 10; onSearch()"
|
|
410
|
+
>
|
|
411
|
+
{{ $t("查询") }}
|
|
412
|
+
</el-button>
|
|
413
|
+
<el-button @click="reset">{{ $t("重置") }}</el-button>
|
|
414
|
+
<el-button
|
|
415
|
+
v-if="showCollapse"
|
|
416
|
+
type="primary"
|
|
417
|
+
link
|
|
418
|
+
class="!font-size-12"
|
|
419
|
+
@click="collapsedToggle"
|
|
420
|
+
>
|
|
421
|
+
{{ collapsed ? $t("展开") : $t("收起") }}
|
|
422
|
+
<el-icon class="el-icon--right">
|
|
423
|
+
<component :is="collapsed ? downBold : upBold" />
|
|
424
|
+
</el-icon>
|
|
425
|
+
</el-button>
|
|
426
|
+
</div>
|
|
427
|
+
</ReGridItem>
|
|
428
|
+
</ReGrid>
|
|
429
|
+
</el-form>
|
|
430
|
+
</div>
|
|
431
|
+
|
|
432
|
+
<div ref="otherRef">
|
|
433
|
+
<!-- 统计/页签等额外模块;无则删除整段 -->
|
|
434
|
+
</div>
|
|
435
|
+
|
|
436
|
+
<!-- D4+D5: 操作栏 + 表格区 -->
|
|
437
|
+
<div class="vts-table-area">
|
|
438
|
+
<ReTableBar :columns="[]" @refresh="onSearch">
|
|
439
|
+
<template #title>
|
|
440
|
+
<span class="truncate font-size-16 font-bold">{{ $t("展示列表") }}</span>
|
|
441
|
+
</template>
|
|
442
|
+
<template #buttons>
|
|
443
|
+
<el-button type="danger" v-auth="['admin']">{{ $t("批量删除") }}</el-button>
|
|
444
|
+
</template>
|
|
445
|
+
<template #default="{ size }">
|
|
446
|
+
<div class="vl-parent">
|
|
447
|
+
<el-table
|
|
448
|
+
ref="multipleTableRef"
|
|
449
|
+
v-loading.lock="loading"
|
|
450
|
+
:element-loading-text="$t('加载中')"
|
|
451
|
+
:element-loading-spinner="svgLoading"
|
|
452
|
+
element-loading-svg-view-box="0, 0, 20, 20"
|
|
453
|
+
:style="{ height: `${tableHeight}px` }"
|
|
454
|
+
:size="size"
|
|
455
|
+
:data="tableList"
|
|
456
|
+
row-key="id"
|
|
457
|
+
>
|
|
458
|
+
<el-table-column prop="code" :label="$t('编号')" min-width="120" />
|
|
459
|
+
<el-table-column prop="name" :label="$t('名称')" min-width="140" />
|
|
460
|
+
<el-table-column
|
|
461
|
+
:label="$t('操作')"
|
|
462
|
+
:width="resolveOperateColumnWidth({ list: operateButtons, limit: operateLimit, size })"
|
|
463
|
+
fixed="right"
|
|
464
|
+
>
|
|
465
|
+
<template #default="{ row, $index }">
|
|
466
|
+
<ReTableOperate
|
|
467
|
+
:list="operateButtons"
|
|
468
|
+
:row="row"
|
|
469
|
+
:index="$index"
|
|
470
|
+
:limit="operateLimit"
|
|
471
|
+
:size="size"
|
|
472
|
+
/>
|
|
473
|
+
</template>
|
|
474
|
+
</el-table-column>
|
|
475
|
+
</el-table>
|
|
476
|
+
<RePagination
|
|
477
|
+
ref="paginationRef"
|
|
478
|
+
:size="size"
|
|
479
|
+
:pagination="pagination"
|
|
480
|
+
@handle-current-change="handleCurrentChange"
|
|
481
|
+
@handle-size-change="handleSizeChange"
|
|
482
|
+
/>
|
|
483
|
+
</div>
|
|
484
|
+
</template>
|
|
485
|
+
</ReTableBar>
|
|
486
|
+
</div>
|
|
487
|
+
</el-card>
|
|
488
|
+
</div>
|
|
489
|
+
</template>
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
**设计模式与出厂模式的关键差异**:
|
|
493
|
+
|
|
494
|
+
| 差异点 | 出厂模式 | 设计模式 |
|
|
495
|
+
|--------|---------|---------|
|
|
496
|
+
| 页面标题 | 无 | `.vts-page-header` 含标题+描述+操作 |
|
|
497
|
+
| 筛选区 | `bg-bg_color p-5` | `.vts-filter-area`(容器感+分隔线) |
|
|
498
|
+
| 主操作按钮位置 | `ReTableBar #buttons` | `.vts-page-header__actions` |
|
|
499
|
+
| 表格区 | 无包裹 | `.vts-table-area`(圆角边框) |
|
|
500
|
+
| 表头底色 | EP 默认浅灰 | 由 `design-visual.scss` 全局提供品牌色浅底+强调线 |
|
|
501
|
+
| 行 hover | EP 默认灰色 | 由 `design-visual.scss` 全局提供品牌色极浅底 |
|
|
253
502
|
|
|
254
503
|
## 操作列按钮过多(ReTableOperate · 强制)
|
|
255
504
|
|
|
@@ -147,6 +147,40 @@ tags: [handoff, design-tokens, upstream, artifacts, json]
|
|
|
147
147
|
|
|
148
148
|
细则见 `design-system` 7.5.8。缺档 → 回退至 default(base),回执注明。
|
|
149
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
|
+
|
|
150
184
|
### 卡片页签关闭色(设计约束)
|
|
151
185
|
|
|
152
186
|
- 关闭 hover:圆形底 `--layout-bg`(=`tokens.layoutBg`)+ 图标 `--error-6` / `tokens.error`(`#F5222D`)
|
|
@@ -158,11 +192,11 @@ tags: [handoff, design-tokens, upstream, artifacts, json]
|
|
|
158
192
|
|
|
159
193
|
| # | 落点 | 写入 |
|
|
160
194
|
|---|------|------|
|
|
161
|
-
| A | `src/styles/design-tokens.scss` | 令牌 CSS;深色侧栏时追加 `--sidebar
|
|
195
|
+
| A | `src/styles/design-tokens.scss` | 令牌 CSS;深色侧栏时追加 `--sidebar-*`;`visual` / `layout` 段 |
|
|
162
196
|
| B | `theme.scss` 当前 `html[data-theme]` | `--vts-theme-*` → `--sidebar-*` |
|
|
163
197
|
| C | `public/platform-config.json` | `EpThemeColor` / `Theme` / `DarkMode` / **`ShowModel`**;`Version` 自增 |
|
|
164
|
-
| D | `index.scss` | `design-tokens`
|
|
165
|
-
| E | `dark.scss` / 语义色 | 跟 `--primary-*` / `--error
|
|
198
|
+
| D | `index.scss` | `design-tokens` → `design-visual` → `design-layout` 最先;按需 `--vts-margin` / `--vts-tag-card-*` |
|
|
199
|
+
| E | `dark.scss` / 语义色 | 跟 `--primary-*` / `--error-*`;视觉层+构图层暗色覆盖 |
|
|
166
200
|
| F | 冲突清单 | `design-system` 第四节 |
|
|
167
201
|
| G | 规范识别回执 | 动手改文件前输出 |
|
|
168
202
|
| H | (可选)`design/design-handoff.json` | 若用户要求落盘,写入校验后的 JSON 副本 |
|
|
@@ -355,20 +355,40 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
355
355
|
|
|
356
356
|
> 各规范差异项:`antd` 表头 `#fafafa` 不加边框分隔;`semi` 少阴影轻描边;`vuetify` 控件高度 Material 化(input 40px、button 36px);按第五节表微调样板中的数值来源即可,**结构不变**。差异值同样只改令牌数据,不另写选择器。
|
|
357
357
|
|
|
358
|
-
### Step
|
|
358
|
+
### Step 3.5 设计模式页面结构(设计 Skill 产出存在时触发)
|
|
359
359
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
360
|
+
> **职责边界**:项目 Skill 只做令牌数值桥接(Step 2)和 EP 几何重写(Step 3)。页面布局结构和视觉表现**不在全局 CSS 文件中注入**,而是在**页面代码中直接实现**,遵循设计 Skill 的布局规范。
|
|
361
|
+
|
|
362
|
+
触发条件:存在 `design-handoff/v1` JSON、用户指定设计规范、或命中 `design-system` 模块且设计 Skill 产出可用。
|
|
363
|
+
|
|
364
|
+
模版已出厂自带 `design-visual.scss`(视觉基线)和 `design-layout.scss`(构图基线),提供默认的 CSS 钩子类。设计模式下:
|
|
365
|
+
|
|
366
|
+
1. **令牌值桥接**(Step 2 已完成):颜色 / 阴影 / 圆角 / 间距 / 字号数值写入 `design-tokens.scss`
|
|
367
|
+
2. **页面结构按设计 Skill 布局规范生成**:
|
|
368
|
+
- 列表页 → 读设计 Skill 的 `list-page.md` 区域拆分,在页面代码中使用 `.vts-page-header` / `.vts-filter-area` / `.vts-action-bar` / `.vts-table-area` 结构类
|
|
369
|
+
- 详情页 → 读设计 Skill 的详情页规范,使用 `.vts-detail-container`
|
|
370
|
+
- 框架壳层 → 读设计 Skill 的 `unified-framework.md`,顶栏 / 侧栏 / 页签 / 内容区的几何和视觉按规范实现
|
|
371
|
+
3. **组件视觉表现**:`design-visual.scss` 提供全局基线(hover/阴影/过渡),页面内无需重复写
|
|
372
|
+
4. **设计 Skill 布局决策的直接实现**:如设计 Skill 规定顶部导航语言切换为内联文字(中/EN)而非下拉框,则在 `lay-navbar` 组件中直接实现该交互,不通过 CSS 覆盖
|
|
373
|
+
|
|
374
|
+
**关键原则**:设计 Skill 的布局和视觉决策在**页面代码**中实现,不通过全局 CSS 文件注入。项目 Skill 的职责是提供令牌数值和 CSS 钩子类,让页面代码有标准化的引用点。
|
|
375
|
+
|
|
376
|
+
### Step 4 接线 `src/styles/index.scss`
|
|
370
377
|
|
|
371
|
-
|
|
378
|
+
```scss
|
|
379
|
+
@use 'design-tokens'; // 唯一新增:纯数据令牌,必须最先
|
|
380
|
+
@use 'design-visual'; // 视觉表现层:shadow / hover / transition / 交互态
|
|
381
|
+
@use 'design-layout'; // 页面构图层:区域容器 / 间距节奏
|
|
382
|
+
@use 'theme';
|
|
383
|
+
@use 'transition';
|
|
384
|
+
@use 'button';
|
|
385
|
+
@use 'element-plus'; // 模版默认覆盖 + 规范几何重写(已并入)
|
|
386
|
+
@use 'sidebar';
|
|
387
|
+
@use 'dark';
|
|
388
|
+
@use 'vant';
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
唯一顺序要求:`design-tokens` 放最前(供后续文件引用);`design-visual` 和 `design-layout` 紧随其后,在 `element-plus` 之前,确保视觉层在 EP 几何层之前加载。几何重写已并入 `element-plus.scss`,**不再存在**"重写层必须排在覆盖层之后"的顺序陷阱;模版其余 `@use` 顺序保持不动。
|
|
372
392
|
|
|
373
393
|
**字体接管**:
|
|
374
394
|
- 新模版:`index.scss` 已是 `font-family: var(--font-family, ...) !important`,令牌层定义 `--font-family` 即自动生效,无需改动。
|
|
@@ -436,7 +456,11 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
436
456
|
- [ ] 弹窗:`--ds-dialog-bg` 为 **主题色轻渐变**(`primary-bg → component-bg`),非写死蓝渐变;`ElMessageBox` 内容区用 `--message-box-content-padding`(比 `el-dialog` body 更紧凑)
|
|
437
457
|
- [ ] 侧栏:深色主题下 DevTools 检查 `.sidebar-container` computed `background` 为 **`#001529`**(`var(--sidebar-bg)`,非旧版主色纵向渐变);激活项块色 = `--primary-color` / `brandPrimary`;Logo 区 = `--sidebar-logo-bg`
|
|
438
458
|
- [ ] 第四节冲突清单全部处理完毕(逐条回填)
|
|
439
|
-
- [ ] Step 7 存量扫描已执行且结果已输出
|
|
459
|
+
- [ ] Step 7 存量扫描已执行且结果已输出
|
|
460
|
+
- [ ] 设计模式页面结构(设计 Skill 产出存在时):列表页含 `.vts-page-header`(标题+描述+操作)、`.vts-filter-area`(筛选区容器)、`.vts-table-area`(表格区)
|
|
461
|
+
- [ ] 视觉基线:`design-visual.scss` 和 `design-layout.scss` 在 `index.scss` 中已加载且顺序在 `element-plus` 之前
|
|
462
|
+
- [ ] 暗色覆盖:视觉层和构图层在 `dark.scss` 中有对应暗色覆盖
|
|
463
|
+
- [ ] 令牌无硬编码:页面代码中引用的 CSS 钩子类值全部来自令牌变量
|
|
440
464
|
|
|
441
465
|
---
|
|
442
466
|
|