@qilitt-mickey/vue3-temp-skill 1.1.76 → 1.2.2
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/README.md +99 -82
- package/SKILL.md +65 -28
- package/bin/cli.js +5 -6
- package/mapping/admin.json +60 -0
- package/package.json +5 -13
- package/references/adapters/_new-adapter.md +88 -0
- package/references/adapters/vue-antdv.md +110 -0
- package/references/adapters/vue-element-plus.md +132 -0
- package/references/design-apply.md +259 -122
- package/scripts/check-landing.mjs +419 -0
- package/scripts/modules.json +2 -2
- package/dist/mapping-type.d.ts +0 -33
- package/dist/theme-vars.js +0 -62
- package/dist/theme-vars.ts +0 -113
- package/dist/theme.css +0 -73
- package/mapping/basic/color.json +0 -35
- package/mapping/basic/radius.json +0 -17
- package/mapping/basic/semantic-values.json +0 -72
- package/mapping/basic/spacing.json +0 -21
- package/mapping/basic/typography.json +0 -21
- package/mapping/component/button.json +0 -90
- package/mapping/component/card.json +0 -31
- package/mapping/component/input.json +0 -42
- package/mapping/component/overlay.json +0 -79
- package/mapping/component/pagination.json +0 -34
- package/mapping/component/table.json +0 -42
- package/mapping/component/tag.json +0 -48
- package/mapping/layout/breakpoint.json +0 -20
- package/mapping/layout/shell-geometry.json +0 -26
- package/mapping/scenes/admin/content.json +0 -497
- package/mapping/scenes/admin/layout.json +0 -577
- package/parser/fixtures/changeset-fullpage-restore.json +0 -259
- package/parser/fixtures/changeset-gap-block.json +0 -24
- package/parser/fixtures/changeset-legacy.json +0 -11
- package/parser/fixtures/changeset-neg1.json +0 -8
- package/parser/fixtures/changeset-neg2.json +0 -10
- package/parser/fixtures/changeset-neg3.json +0 -22
- package/parser/fixtures/changeset-neg4-g8.json +0 -15
- package/parser/fixtures/changeset-neg5-g8-stub.json +0 -26
- package/parser/fixtures/changeset-neg6-g9-identity.json +0 -39
- package/parser/fixtures/changeset-neg7-g10-dims.json +0 -57
- package/parser/fixtures/changeset-neg8-g11-oracle.json +0 -57
- package/parser/fixtures/changeset-neg9-g6-token-chain.json +0 -34
- package/parser/fixtures/changeset-pos-g6-token-chain.json +0 -35
- package/parser/fixtures/changeset-pos-theme-neutral.json +0 -264
- package/parser/fixtures/changeset-pos-theme-nometa.json +0 -260
- package/parser/fixtures/changeset-pos.json +0 -50
- package/parser/fixtures/changeset-registry-gap.json +0 -29
- package/parser/fixtures/changeset-v32-fields.json +0 -71
- package/parser/fixtures/fake-project/src/styles/app.scss +0 -5
- package/parser/fixtures/fake-project/src/views/list.vue +0 -13
- package/parser/fixtures/registry-bad.json +0 -11
- package/parser/fixtures/registry-g6-token-chain.json +0 -10
- package/parser/fixtures/registry-sample.json +0 -15
- package/parser/fixtures/verify/actual-clean.json +0 -35
- package/parser/fixtures/verify/actual.json +0 -33
- package/parser/fixtures/verify/mockup-baseline-admin-list.html +0 -27
- package/parser/fixtures/verify/mockup-g6-content.html +0 -12
- package/parser/fixtures/verify/mockup-neutral.html +0 -26
- package/parser/fixtures/verify/mockup-nometa.html +0 -26
- package/parser/fixtures/verify/oracle.json +0 -37
- package/parser/fixtures/verify/snapshot-latest.json +0 -103
- package/parser/generator.js +0 -178
- package/parser/index.js +0 -2706
- package/parser/loader.js +0 -66
- package/parser/override.js +0 -119
- package/parser/regression.js +0 -301
- package/parser/validator.js +0 -206
- package/parser/watch.js +0 -103
- package/references/steps/maintenance.md +0 -31
- package/references/steps/regression.md +0 -49
- package/references/steps/step0-preflight.md +0 -58
- package/references/steps/step1-match.md +0 -67
- package/references/steps/step1b-audit.md +0 -23
- package/references/steps/step1c-registry.md +0 -29
- package/references/steps/step2-structure.md +0 -73
- package/references/steps/step3-style.md +0 -38
- package/references/steps/step3b-shell.md +0 -63
- package/references/steps/step3c-priority.md +0 -26
- package/references/steps/step4-l3.md +0 -14
- package/references/steps/step5-gates.md +0 -65
- package/references/steps/step6-verify.md +0 -77
- package/scripts/apply-final-gate.mjs +0 -170
- package/scripts/check.mjs +0 -207
- package/scripts/design-audit.mjs +0 -1707
- package/scripts/validate.mjs +0 -106
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
adapter: vue-antdv
|
|
3
|
+
description: Vue 3 + Ant Design Vue 适配。提供深度选择器语法、组件库穿透前缀、三份 CSS 的落点与引入方式。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# adapter · Vue 3 + Ant Design Vue
|
|
7
|
+
|
|
8
|
+
## 深度选择器语法
|
|
9
|
+
|
|
10
|
+
| 场景 | 语法 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| SFC `<style scoped>` | `:deep(.ant-xxx)` |
|
|
13
|
+
| 全局样式文件(非 scoped) | `.ant-xxx` 直接写 |
|
|
14
|
+
|
|
15
|
+
`ui-roles.css` 写成**全局样式文件**(不 scoped)。
|
|
16
|
+
|
|
17
|
+
## 内层穿透语法
|
|
18
|
+
|
|
19
|
+
| 角色 | 穿透目标 |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `table.headerCell` | `:deep(.ant-table-cell)` |
|
|
22
|
+
| `table.cell` | `:deep(.ant-table-cell)` |
|
|
23
|
+
| `filter.input` | `:deep(.ant-input)` / `:deep(input)` |
|
|
24
|
+
| `shell.sidebar.item` | `:deep(.ant-menu-title-content)` |
|
|
25
|
+
| `tag.status` | 根元素即可 |
|
|
26
|
+
|
|
27
|
+
**规则**:`host[]` 挂组件根元素;`inner[]` 穿透到内部文本盒——目标由组件库 DOM 结构决定。
|
|
28
|
+
|
|
29
|
+
## 组件库前缀速查
|
|
30
|
+
|
|
31
|
+
| 组件 | 前缀 | 角色类挂载位置 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Button | `.ant-btn` | 根元素 |
|
|
34
|
+
| Input | `.ant-input` / `.ant-input-affix-wrapper` | 根元素 / wrapper |
|
|
35
|
+
| Select | `.ant-select` | `.ant-select-selector` |
|
|
36
|
+
| Table | `.ant-table` | 根元素 |
|
|
37
|
+
| Table Cell | `.ant-table-cell` | `th` / `td` |
|
|
38
|
+
| Tag | `.ant-tag` | 根元素 |
|
|
39
|
+
| Pagination | `.ant-pagination` | 根元素 |
|
|
40
|
+
| Card | `.ant-card` | `.ant-card-body`(内边距在 body) |
|
|
41
|
+
| Modal | `.ant-modal` | `.ant-modal-content` |
|
|
42
|
+
| Menu | `.ant-menu` | `.ant-menu-item` |
|
|
43
|
+
| Tabs | `.ant-tabs` | `.ant-tabs-tab` |
|
|
44
|
+
| DatePicker | `.ant-picker` | `.ant-picker-input input` |
|
|
45
|
+
| Form | `.ant-form` | `.ant-form-item` |
|
|
46
|
+
|
|
47
|
+
## 角色类挂载方式(视觉不生效的头号原因)
|
|
48
|
+
|
|
49
|
+
**CSS 生成了不等于视觉会变**——必须把角色类挂到组件上。
|
|
50
|
+
|
|
51
|
+
| 契约角色 | 挂载写法 |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `button.*` | `<a-button :class="[...]">` |
|
|
54
|
+
| `shell.sidebar.item` | `<a-menu-item :class="[...]">` |
|
|
55
|
+
| `shell.tabs.item` | `<a-tab-pane :class="[...]">` |
|
|
56
|
+
| `input.base` / `filter.input` | `<a-input :class="[...]">`,`inner` 用 `:deep(.ant-input)` |
|
|
57
|
+
| `select.base` | `<a-select :class="[...]">`,`inner` 用 `:deep(.ant-select-selector)` |
|
|
58
|
+
| `filter.dateRange` | `<a-range-picker :class="[...]">` |
|
|
59
|
+
| `tag.status` | `<a-tag :class="[...]">` |
|
|
60
|
+
| `card.base` | `<a-card :class="[...]">`,`inner` 用 `:deep(.ant-card-body)` |
|
|
61
|
+
| `table.wrapper` | `<a-table :class="[...]">` |
|
|
62
|
+
| `table.headerCell` / `table.cell` | **用 `#headerCell` / `#bodyCell` 插槽**:`#bodyCell="{ column, record }"` 内给单元格外层元素加类 |
|
|
63
|
+
| `table.cell.amount` | 同上 + `align: 'right'` |
|
|
64
|
+
| `pagination.bar` | `<a-pagination :class="[...]">` |
|
|
65
|
+
|
|
66
|
+
**Table 的特殊性**:`a-table` 的单元格同样由组件内部生成。推荐用 `#bodyCell` 插槽批量挂载:
|
|
67
|
+
|
|
68
|
+
```vue
|
|
69
|
+
<a-table :data-source="rows" :columns="columns" class="role-table-wrapper">
|
|
70
|
+
<template #headerCell="{ column }">
|
|
71
|
+
<div :class="column.dataIndex === 'name' ? 'role-table-header-cell' : 'role-table-header-cell'">
|
|
72
|
+
{{ column.title }}
|
|
73
|
+
</div>
|
|
74
|
+
</template>
|
|
75
|
+
<template #bodyCell="{ column, record }">
|
|
76
|
+
<div :class="cellRole(column, record)">{{ record[column.dataIndex] }}</div>
|
|
77
|
+
</template>
|
|
78
|
+
</a-table>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 批量挂载的做法
|
|
82
|
+
|
|
83
|
+
一个页面有 20+ 角色时**逐个手写 class 会漏**。做法:把契约角色名转成类名清单,交给页面统一挂载,并在第 0 步自检里确认覆盖率 100%。
|
|
84
|
+
|
|
85
|
+
**类名转换规则**:`table.headerCell` → `.role-table-header-cell`(点号与驼峰都转小写连字符)。
|
|
86
|
+
|
|
87
|
+
## 提权通道(唯一允许处)
|
|
88
|
+
|
|
89
|
+
| 情况 | 处置 |
|
|
90
|
+
|---|---|
|
|
91
|
+
| 组件库用行内 style 注入 | 该属性上加 `!important`——**仅此一处允许** |
|
|
92
|
+
| 组件库 `!important` 覆盖角色类 | 同上 |
|
|
93
|
+
|
|
94
|
+
**只加在具体属性上,不整条加。**
|
|
95
|
+
|
|
96
|
+
## 三份 CSS 的落点
|
|
97
|
+
|
|
98
|
+
| 文件 | 落点 | 引入时机 |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| `src/styles/ui-tokens.css` | 项目样式目录 | 样式入口全局引入一次 |
|
|
101
|
+
| `src/styles/ui-roles.css` | 项目样式目录 | 同上,必须是全局文件 |
|
|
102
|
+
| `src/styles/ui-layout.css` | 项目样式目录 | 同上 |
|
|
103
|
+
|
|
104
|
+
## 布局占位容器
|
|
105
|
+
|
|
106
|
+
布局组件退化为占位容器(只提供插槽,不参与布局决策),结构同 Element Plus 的写法。
|
|
107
|
+
|
|
108
|
+
## 与 Element Plus 的差异
|
|
109
|
+
|
|
110
|
+
Ant Design Vue 的 `card` 内边距在 `.ant-card-body`(Element Plus 在根元素),`table` 单元格文本盒是 `.ant-table-cell` 本身(Element Plus 有额外 `.cell` 层)。**这是唯一需要在 adapter 里区分的地方**——契约本身不变。
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
adapter: vue-element-plus
|
|
3
|
+
description: Vue 3 + Element Plus 适配。提供深度选择器语法、组件库穿透前缀、三份 CSS 的落点与引入方式。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# adapter · Vue 3 + Element Plus
|
|
7
|
+
|
|
8
|
+
## 深度选择器语法
|
|
9
|
+
|
|
10
|
+
| 场景 | 语法 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| SFC `<style scoped>` | `:deep(.el-xxx)` |
|
|
13
|
+
| 全局样式文件(非 scoped) | `.el-xxx` 直接写,不需要穿透 |
|
|
14
|
+
| SCSS | 同上 |
|
|
15
|
+
|
|
16
|
+
**本项目建议**:`ui-roles.css` 写成**全局样式文件**(不 scoped),避免每个页面重复引入。
|
|
17
|
+
|
|
18
|
+
## 内层穿透语法
|
|
19
|
+
|
|
20
|
+
契约的 `inner[]` 落到组件内部文本盒时,需要穿透到组件库内部元素:
|
|
21
|
+
|
|
22
|
+
| 角色 | 穿透目标 |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `table.headerCell` | `:deep(.cell)` |
|
|
25
|
+
| `table.cell` | `:deep(.cell)` |
|
|
26
|
+
| `shell.sidebar.item` | `:deep(span)` |
|
|
27
|
+
| `filter.input` | `:deep(input)` |
|
|
28
|
+
| `shell.tabs.item` | 直接作用在文本节点(无需穿透) |
|
|
29
|
+
|
|
30
|
+
**规则**:`host[]` 作用在组件根元素(加角色类即可);`inner[]` 作用在根元素内部——**用 adapter 给出的穿透目标定位**。目标选择器由组件库 DOM 结构决定,不由契约决定。
|
|
31
|
+
|
|
32
|
+
## 组件库前缀速查
|
|
33
|
+
|
|
34
|
+
| 组件 | 前缀 | 角色类挂载位置 |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Button | `.el-button` | 组件根元素 |
|
|
37
|
+
| Input | `.el-input` | `.el-input__wrapper` 或根元素 |
|
|
38
|
+
| Select | `.el-select` | `.el-select__wrapper` |
|
|
39
|
+
| Table | `.el-table` | 根元素 |
|
|
40
|
+
| Table Header Cell | `.el-table__cell` | `.th.el-table__cell`(`th` 上的 `.cell` 是内层) |
|
|
41
|
+
| Table Cell | `.el-table__cell` | `td.el-table__cell` |
|
|
42
|
+
| Tag | `.el-tag` | 根元素 |
|
|
43
|
+
| Pagination | `.el-pagination` | 根元素 |
|
|
44
|
+
| Card | `.el-card` | `.el-card__body`(内边距在 body 上) |
|
|
45
|
+
| Dialog | `.el-dialog` | `.el-dialog__body` |
|
|
46
|
+
| Menu | `.el-menu` | `.el-menu-item` |
|
|
47
|
+
| Tabs | `.el-tabs` | `.el-tabs__item` |
|
|
48
|
+
| DatePicker | `.el-date-editor` | `.el-range-input` |
|
|
49
|
+
|
|
50
|
+
## 角色类挂载方式(视觉不生效的头号原因)
|
|
51
|
+
|
|
52
|
+
**CSS 生成了不等于视觉会变**——必须把角色类挂到组件上。Element Plus 各组件的挂法不同:
|
|
53
|
+
|
|
54
|
+
| 契约角色 | 挂载写法 | 说明 |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| `shell.sidebar.item` / `.active` | `<el-menu-item :class="[...]">` | 直接作用在组件根元素 |
|
|
57
|
+
| `shell.header.icon` | `<el-button :class="[...]">` | 同上 |
|
|
58
|
+
| `button.primary` / `.secondary` / `.danger` | `<el-button :class="[...]">` | 同上 |
|
|
59
|
+
| `card.base` | `<el-card :class="[...]">` | 内边距在 `.el-card__body`,`host` 作用在根、`inner` 用 `:deep(.el-card__body)` |
|
|
60
|
+
| `table.wrapper` | `<el-table :class="[...]">` | 表格**根元素**挂 wrapper |
|
|
61
|
+
| `table.headerCell` | **需走插槽**:`<template #header><th class="role-table-header-cell">` | Element Plus 的 `th` 不能直接加类 |
|
|
62
|
+
| `table.cell` | `<el-table-column :class="[...]">` 或插槽内 `td` | 列组件加类 |
|
|
63
|
+
| `table.cell.amount` | 同上 + `:deep(.cell)` 承接 `inner` | 右对齐靠 `text-align` |
|
|
64
|
+
| `tag.status` | `<el-tag :class="[...]">` | 直接作用 |
|
|
65
|
+
| `input.base` / `filter.input` | `<el-input :class="[...]">` | `inner` 用 `:deep(.el-input__wrapper)` 或 `:deep(input)` |
|
|
66
|
+
| `select.base` | `<el-select :class="[...]">` | `inner` 用 `:deep(.el-select__wrapper)` |
|
|
67
|
+
| `filter.dateRange` | `<el-date-picker :class="[...]">` | — |
|
|
68
|
+
| `pagination.bar` | `<el-pagination :class="[...]">` | 直接作用 |
|
|
69
|
+
| `shell.tabs.item` | 自绘或 `<el-tab-pane>` | 激活态另由 `item.active` 角色承载 |
|
|
70
|
+
|
|
71
|
+
**Table 的特殊性**:`el-table` 的 `th` / `td` 由组件内部生成,**不能直接在 `<el-table>` 上加类来影响单元格**。表头必须用 `#header` 插槽自绘:
|
|
72
|
+
|
|
73
|
+
```vue
|
|
74
|
+
<el-table :data="rows" class="role-table-wrapper">
|
|
75
|
+
<template #header>
|
|
76
|
+
<div class="role-table-header-cell">运单号</div>
|
|
77
|
+
</template>
|
|
78
|
+
<el-table-column prop="name" label="名称" class="role-table-cell" />
|
|
79
|
+
<el-table-column prop="fee" label="运费" class="role-table-cell-amount" />
|
|
80
|
+
<template #default="{ row }">
|
|
81
|
+
<el-tag class="role-tag-status">{{ row.status }}</el-tag>
|
|
82
|
+
</template>
|
|
83
|
+
</el-table>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 批量挂载的做法
|
|
87
|
+
|
|
88
|
+
一个页面有 20+ 角色时**逐个手写 class 会漏**。做法:把契约的角色名转成类名清单,交给页面统一挂载,并在第 0 步自检里确认覆盖率 100%。
|
|
89
|
+
|
|
90
|
+
**类名转换规则**:`table.headerCell` → `.role-table-header-cell`(点号与驼峰都转小写连字符)。
|
|
91
|
+
|
|
92
|
+
## 提权通道(唯一允许处)
|
|
93
|
+
|
|
94
|
+
角色类是独立命名空间(`role-` 前缀)+ 独立文件,**通常不需要提权**。仅两种情况需要:
|
|
95
|
+
|
|
96
|
+
| 情况 | 处置 |
|
|
97
|
+
|---|---|
|
|
98
|
+
| 组件库用行内 style 注入(如 `:header-cell-style`) | 在角色类上对该属性加 `!important`——**仅此一处允许** |
|
|
99
|
+
| 组件库 `!important` 覆盖了角色类 | 同上 |
|
|
100
|
+
|
|
101
|
+
**提权只加在具体属性上,不整条加**。整条加会让后续所有变体都带上高权重。
|
|
102
|
+
|
|
103
|
+
## 三份 CSS 的落点
|
|
104
|
+
|
|
105
|
+
| 文件 | 落点 | 引入时机 |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| `src/styles/ui-tokens.css` | 项目样式目录 | 样式入口全局引入一次 |
|
|
108
|
+
| `src/styles/ui-roles.css` | 项目样式目录 | 同上,**必须是不 scoped 的全局文件** |
|
|
109
|
+
| `src/styles/ui-layout.css` | 项目样式目录 | 同上 |
|
|
110
|
+
|
|
111
|
+
## 布局占位容器
|
|
112
|
+
|
|
113
|
+
项目的 `lay-admin` 等布局组件退化为占位容器:
|
|
114
|
+
|
|
115
|
+
```vue
|
|
116
|
+
<template>
|
|
117
|
+
<div class="ui-page">
|
|
118
|
+
<aside class="ui-region-sidebar"><slot name="sidebar" /></aside>
|
|
119
|
+
<header class="ui-region-header"><slot name="header" /></header>
|
|
120
|
+
<nav class="ui-region-tabs"><slot name="tabs" /></nav>
|
|
121
|
+
<main class="ui-region-content"><slot name="content" /></main>
|
|
122
|
+
</div>
|
|
123
|
+
</template>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**布局组件只提供插槽,不参与布局决策**——网格由 `ui-layout.css` 决定。改造范围限定在布局组件的模板与样式层,不动业务代码。
|
|
127
|
+
|
|
128
|
+
## 不做
|
|
129
|
+
|
|
130
|
+
- 不改组件库源码
|
|
131
|
+
- 不在业务页面写角色类以外的设计样式
|
|
132
|
+
- 不把契约值硬编码进布局组件(布局取值来自 `ui-layout.css`)
|