@qilitt-mickey/vue3-temp-skill 1.2.6 → 1.2.7
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 +51 -115
- package/SKILL.md +41 -159
- package/bin/cli.js +297 -657
- package/package.json +5 -2
- package/references/adapters/_new-adapter.md +17 -82
- package/references/adapters/vue-antdv.md +21 -107
- package/references/adapters/vue-element-plus.md +36 -179
- package/references/code-quality.md +52 -168
- package/references/core-kernel.md +12 -3
- package/references/crud-pages.md +10 -11
- package/references/data-screen.md +8 -9
- package/references/design-apply.md +57 -358
- package/references/layout-theme.md +6 -4
- package/references/visual-verification.md +48 -0
- package/scripts/check-landing.mjs +234 -47
- package/scripts/generate-css.mjs +17 -397
- package/scripts/match.py +30 -11
- package/scripts/modules.json +3 -3
- package/scripts/verify-render.mjs +17 -524
- package/scripts/generate-page.mjs +0 -734
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qilitt-mickey/vue3-temp-skill",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.7",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "vue3-web-temp 项目工程技能:按需功能开发、保留业务的设计还原与视觉及功能双重验证",
|
|
6
6
|
"bin": {
|
|
7
7
|
"vue3-temp-skill": "./bin/cli.js"
|
|
8
8
|
},
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
"adapters/",
|
|
16
16
|
"references/",
|
|
17
17
|
"scripts/",
|
|
18
|
+
"!scripts/*.test.mjs",
|
|
19
|
+
"!scripts/__pycache__/",
|
|
18
20
|
"mapping/",
|
|
19
21
|
"SKILL.md",
|
|
20
22
|
"README.md"
|
|
@@ -23,6 +25,7 @@
|
|
|
23
25
|
"node": ">=22.12.0"
|
|
24
26
|
},
|
|
25
27
|
"scripts": {
|
|
28
|
+
"test": "node --test scripts/*.test.mjs",
|
|
26
29
|
"release": "node release.js",
|
|
27
30
|
"release:minor": "node release.js minor",
|
|
28
31
|
"release:major": "node release.js major",
|
|
@@ -1,88 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
adapter: _new-adapter
|
|
3
|
-
description: 新增 Vue 组件库适配的书写模板。照此填写即可接入一个未内置的 Vue 组件库,不接触契约。
|
|
4
|
-
---
|
|
1
|
+
# 新增 Vue 组件库适配
|
|
5
2
|
|
|
6
|
-
|
|
3
|
+
## 1. 核实项目
|
|
7
4
|
|
|
8
|
-
|
|
5
|
+
- 读取实际安装版本、主题配置、公开 API、自有封装和运行 DOM。
|
|
6
|
+
- 确定绘制盒、文字盒、图标、状态类及弹层挂载点;同一控件的不同形态分别记录。
|
|
7
|
+
- 完成条件:至少一个实际页面已渲染,候选落点与当前版本一致。
|
|
9
8
|
|
|
10
|
-
##
|
|
9
|
+
## 2. 编写按需适配文件
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
- 在本目录创建 `<标识>.md`,依次编写:适用依赖及版本、真实 DOM 检查表、主题与样式接入、状态及 Teleport、布局与自有封装约束、验收步骤。
|
|
12
|
+
- 区分 scoped `:deep(...)` 与全局后代选择器;逗号选择器每一项保留作用域。
|
|
13
|
+
- 按实际工程选择样式文件和加载顺序,不强制固定三份 CSS。
|
|
14
|
+
- 原稿控制颜色、间距、尺寸、结构和状态外观;适配只决定目标落点和实现方式,不写固定设计默认值。
|
|
15
|
+
- 允许修改项目自有组件表现层,保持公开 Props、Emits、Slots 和业务行为;不修改依赖包源码。
|
|
16
|
+
- 完成条件:每项映射有实际 DOM 依据,未知能力明确记录,交接仍不含框架或目标项目信息。
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
## 3. 验证与接入
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
adapter: <组件库标识>
|
|
25
|
-
description: <一句话说明>
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
# adapter · Vue 3 + <组件库名称>
|
|
29
|
-
|
|
30
|
-
## 深度选择器语法
|
|
31
|
-
| 场景 | 语法 |
|
|
32
|
-
|---|---|
|
|
33
|
-
| SFC `<style scoped>` | `:deep(.<前缀>-xxx)` |
|
|
34
|
-
| 全局样式文件 | `.<前缀>-xxx` 直接写 |
|
|
35
|
-
|
|
36
|
-
`ui-roles.css` 写成 <全局文件 / scoped>。
|
|
37
|
-
|
|
38
|
-
## 内层穿透语法
|
|
39
|
-
| 角色 | 穿透目标 |
|
|
40
|
-
|---|---|
|
|
41
|
-
| table.headerCell | <选择器> |
|
|
42
|
-
| table.cell | <选择器> |
|
|
43
|
-
|
|
44
|
-
规则:`host[]` 挂组件根元素;`inner[]` 定位内部文本盒。
|
|
45
|
-
|
|
46
|
-
## 组件库前缀速查
|
|
47
|
-
| 组件 | 前缀 | 角色类挂载位置 |
|
|
48
|
-
|---|---|---|
|
|
49
|
-
| <组件> | .<前缀> | <位置> |
|
|
50
|
-
|
|
51
|
-
## 提权通道(唯一允许处)
|
|
52
|
-
| 情况 | 处置 |
|
|
53
|
-
|---|---|
|
|
54
|
-
| 组件库行内 style 注入 | 该属性加 `!important`,仅此一处允许 |
|
|
55
|
-
|
|
56
|
-
## 三份 CSS 的落点
|
|
57
|
-
| 文件 | 落点 | 引入时机 |
|
|
58
|
-
|---|---|---|
|
|
59
|
-
| src/styles/ui-tokens.css | <目录> | <时机> |
|
|
60
|
-
| src/styles/ui-roles.css | <目录> | <时机> |
|
|
61
|
-
| src/styles/ui-layout.css | <目录> | <时机> |
|
|
62
|
-
|
|
63
|
-
## 布局占位容器
|
|
64
|
-
<如何让项目布局组件退化为插槽容器,给一段可粘贴的 Vue 模板>
|
|
65
|
-
|
|
66
|
-
## 与内置 adapter 的差异
|
|
67
|
-
<哪些角色的 inner 落点不同,为什么>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## adapter 的边界
|
|
71
|
-
|
|
72
|
-
| 承载 | 禁止 |
|
|
73
|
-
|---|---|
|
|
74
|
-
| 深度选择器语法 | 定义设计意图 |
|
|
75
|
-
| 组件库穿透前缀 | 定义风格 |
|
|
76
|
-
| 提权通道的唯一出口 | 改写契约值 |
|
|
77
|
-
| 三份 CSS 的落点与引入 | 修改契约结构 |
|
|
78
|
-
| 布局占位挂载点 | 增加新字段 |
|
|
79
|
-
|
|
80
|
-
**判据**:写完 adapter 后,同一份契约应能不改一行内容地落到用该组件库的项目。若需要改契约,说明 adapter 越界了。
|
|
81
|
-
|
|
82
|
-
## 登记
|
|
83
|
-
|
|
84
|
-
写完在 `design-apply.md` 的 adapter 选择表加一行:
|
|
85
|
-
|
|
86
|
-
| 项目依赖 | adapter |
|
|
87
|
-
|---|---|
|
|
88
|
-
| `<组件库名>` | `adapters/<标识>.md` |
|
|
20
|
+
- 使用同一份通用视觉交接完成一个真实组件区域,核对所有实例和交互状态。
|
|
21
|
+
- 验证滚动、尺寸、响应式、共享调用处及业务行为,按 `../visual-verification.md` 保存证据。
|
|
22
|
+
- 在 `../design-apply.md` 的适配读取步骤中登记新依赖与文件指针。
|
|
23
|
+
- 完成条件:适配不要求修改原稿或通用交接,视觉对照与受影响行为已验证,未决差异已记录。
|
|
@@ -1,110 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
adapter: vue-antdv
|
|
3
|
-
description: Vue 3 + Ant Design Vue 适配。提供深度选择器语法、组件库穿透前缀、三份 CSS 的落点与引入方式。
|
|
4
|
-
---
|
|
1
|
+
# Vue 3 + Ant Design Vue 适配
|
|
5
2
|
|
|
6
|
-
|
|
3
|
+
1. 仅在目标项目实际使用 Ant Design Vue 时读取本文件;核对安装版本、公开 API、自有封装及运行 DOM。保留项目当前组件库,不为还原视觉更换技术栈。
|
|
4
|
+
2. 从原稿及交接取得视觉值;从目标源码确定文件和组件映射。旧角色名和默认样式只作参考,不覆盖原稿或限制新区域。
|
|
5
|
+
3. 分开测量绘制层和文本层,核对下列候选落点;以当前版本实际 DOM 为准。
|
|
7
6
|
|
|
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
|
-
| 契约角色 | 挂载写法 |
|
|
7
|
+
| 控件 | 检查落点 |
|
|
52
8
|
|---|---|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
| `
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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 里区分的地方**——契约本身不变。
|
|
9
|
+
| Button | `.ant-btn` 的盒模型、文本和图标子节点 |
|
|
10
|
+
| Input | 原生 input 与 `.ant-input-affix-wrapper` 的边框、背景、间距 |
|
|
11
|
+
| Select | `.ant-select-selector`、选中文本、箭头和弹层 |
|
|
12
|
+
| Table | 实际 `th` / `td` 及其中的文本、操作控件;保留排序、选择和事件 |
|
|
13
|
+
| Card | `.ant-card` 与 `.ant-card-body` 分别测量 |
|
|
14
|
+
| Menu / Tabs | 真实条目、激活指示及内部文本;不假设 pane 的 class 会落到 tab 按钮 |
|
|
15
|
+
| Pagination | 总数、页码、页容量及跳转控件 |
|
|
16
|
+
| Modal / Popover | 实际 Teleport 挂载容器、遮罩和内容 |
|
|
17
|
+
|
|
18
|
+
4. 使用当前版本支持的单元格自定义属性或列配置定位真实 `th` / `td`;文本插槽的内部 div 不代替单元格盒模型。保留原有渲染函数、formatter、业务列及权限。
|
|
19
|
+
5. 在 scoped SFC 中使用有作用域的 `:deep(...)`;在全局样式中使用普通后代选择器。逗号分隔的每个选择器都保留目标作用域,弹层用组件支持的容器类名隔离。
|
|
20
|
+
6. 按实际工程选择主题变量、布局样式、页面 scoped 样式或组件公开定制 API。允许调整壳层及自有封装表现层;保持 Props、Emits、Slots 和项目行为,不要求固定三份 CSS。
|
|
21
|
+
7. 先核对主题变量、加载顺序和选择器权重;确有行内样式或库级 `!important` 冲突时,只对已证实的具体属性定向覆盖并记录原因。
|
|
22
|
+
8. 对所有受影响实例、状态、弹层、窄屏和共享调用处运行 `../visual-verification.md` 的验收。缺元素、隐藏或零尺寸记为失败,不用 class 命中数替代视觉对照。
|
|
23
|
+
|
|
24
|
+
完成条件:实际绘制层与原稿的对应区域已复核,组件行为与项目业务不变,差异和未验证项已记录。
|
|
@@ -1,183 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
adapter: vue-element-plus
|
|
3
|
-
description: Vue 3 + Element Plus 适配。提供深度选择器语法、组件库穿透前缀、三份 CSS 的落点与引入方式。
|
|
4
|
-
---
|
|
1
|
+
# Element Plus 视觉适配
|
|
5
2
|
|
|
6
|
-
|
|
3
|
+
## 1. 检查实际结构
|
|
7
4
|
|
|
8
|
-
|
|
5
|
+
- 从项目锁文件确认 Element Plus 版本,读取受影响 Re* 封装及其调用处,再检查运行 DOM。
|
|
6
|
+
- 为每个设计区域确定组件根、实际绘制层和文字层;将目标选择器记录在项目侧实施映射,不写回通用设计交接。
|
|
7
|
+
- 将下表作为定位起点,实测不一致时使用当前 DOM,不按固定选择器强行覆盖。
|
|
9
8
|
|
|
10
|
-
|
|
|
9
|
+
| 控件 | 核查落点 |
|
|
11
10
|
|---|---|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|---|---|---|
|
|
43
|
-
| Button | `.el-button` | 组件根元素 |
|
|
44
|
-
| Input | `.el-input` | `.el-input__wrapper` 或根元素 |
|
|
45
|
-
| Select | `.el-select` | `.el-select__wrapper` |
|
|
46
|
-
| Table | `.el-table` | 根元素 |
|
|
47
|
-
| Table Header Cell | `.el-table__cell` | `.th.el-table__cell`(`th` 上的 `.cell` 是内层) |
|
|
48
|
-
| Table Cell | `.el-table__cell` | `td.el-table__cell` |
|
|
49
|
-
| Tag | `.el-tag` | 根元素 |
|
|
50
|
-
| Pagination | `.el-pagination` | 根元素 |
|
|
51
|
-
| Card | `.el-card` | `.el-card__body`(内边距在 body 上) |
|
|
52
|
-
| Dialog | `.el-dialog` | `.el-dialog__body` |
|
|
53
|
-
| Menu | `.el-menu` | `.el-menu-item` |
|
|
54
|
-
| Tabs | `.el-tabs` | `.el-tabs__item` |
|
|
55
|
-
| DatePicker | `.el-date-editor` | `.el-range-input` |
|
|
56
|
-
|
|
57
|
-
## 角色类挂载方式(视觉不生效的头号原因)
|
|
58
|
-
|
|
59
|
-
**CSS 生成了不等于视觉会变**——必须把角色类挂到组件上。Element Plus 各组件的挂法不同:
|
|
60
|
-
|
|
61
|
-
| 契约角色 | 挂载写法 | 说明 |
|
|
62
|
-
|---|---|---|
|
|
63
|
-
| `shell.sidebar.item` / `.active` | `<el-menu-item :class="[...]">` | 直接作用在组件根元素 |
|
|
64
|
-
| `shell.header.icon` | `<el-button :class="[...]">` | 同上 |
|
|
65
|
-
| `button.primary` / `.secondary` / `.danger` | `<el-button :class="[...]">` | 同上 |
|
|
66
|
-
| `card.base` | `<el-card :class="[...]">` | 内边距在 `.el-card__body`:全局文件写后代规则 `.role-page-card > .el-card__body`;项目样式层对其 padding 带 `!important` 时同属性提权(实证坑 3) |
|
|
67
|
-
| `table.wrapper` | `<el-table :class="[...]">` | 表格**根元素**挂 wrapper |
|
|
68
|
-
| `table.headerCell` | `:header-cell-class-name="() => 'role-table-header-cell'"` | EP 的 `th` 不能直接加类;`<template #header><th class>` **无效**(加不进 EP 生成的 `th`) |
|
|
69
|
-
| `table.cell` | 列级 `class-name="role-table-cell"` 或 `:cell-class-name` 回调 | `<el-table-column :class>` **无效**(类落在列组件上,不落到 td) |
|
|
70
|
-
| `table.cell.amount` | `:cell-class-name` 回调按列派发 `.role-table-cell-amount` | 右对齐写在该角色类的 `.cell` 层(`text-align: right`) |
|
|
71
|
-
| `tag.status` | `<el-tag :class="[...]">` | 直接作用 |
|
|
72
|
-
| `input.base` / `filter.input` | `<el-input :class="[...]">` | `inner` 用后代规则 `.role-… .el-input__wrapper`(scoped 内才用 `:deep()`) |
|
|
73
|
-
| `select.base` | `<el-select :class="[...]">` | `inner` 用后代规则 `.role-… .el-select__wrapper` |
|
|
74
|
-
| `filter.dateRange` | `<el-date-picker :class="[...]">` | — |
|
|
75
|
-
| `pagination.bar` | `<el-pagination :class="[...]">` | 直接作用 |
|
|
76
|
-
| `shell.tabs.item` | 自绘或 `<el-tab-pane>` | 激活态另由 `item.active` 角色承载 |
|
|
77
|
-
|
|
78
|
-
**Table 的特殊性**:`el-table` 的 `th` / `td` 由组件内部生成,**不能在 `<el-table>` 或 `<el-table-column>` 上直接加类来影响单元格**。正确通道是 EP 提供的三个回调/属性:
|
|
79
|
-
|
|
80
|
-
```vue
|
|
81
|
-
<el-table
|
|
82
|
-
:data="rows"
|
|
83
|
-
class="role-table-wrapper"
|
|
84
|
-
:header-cell-class-name="() => 'role-table-header-cell'"
|
|
85
|
-
:cell-class-name="cellClassName"
|
|
86
|
-
>
|
|
87
|
-
<!-- 列级:能按列名静态指定的,直接用 class-name -->
|
|
88
|
-
<el-table-column type="selection" class-name="role-table-cell-selection" />
|
|
89
|
-
<el-table-column type="index" class-name="role-table-cell-index" />
|
|
90
|
-
<el-table-column prop="no" label="运单号" class-name="role-table-cell" />
|
|
91
|
-
<el-table-column prop="fee" label="运费" class-name="role-table-cell-amount" />
|
|
92
|
-
<el-table-column prop="ops" label="操作" class-name="role-table-cell-action" />
|
|
93
|
-
|
|
94
|
-
<!-- 单元格内部内容(状态标签)走 default 插槽 -->
|
|
95
|
-
<el-table-column prop="status" label="运单状态" class-name="role-table-cell-status">
|
|
96
|
-
<template #default="{ row }">
|
|
97
|
-
<el-tag class="role-tag-status">{{ row.status }}</el-tag>
|
|
98
|
-
</template>
|
|
99
|
-
</el-table-column>
|
|
100
|
-
</el-table>
|
|
101
|
-
|
|
102
|
-
<script setup lang="ts">
|
|
103
|
-
// 需要按行/列动态判断的,用回调按列派发
|
|
104
|
-
const cellClassName = ({ row, column, columnIndex }: any) => {
|
|
105
|
-
if (column.property === 'fee') return 'role-table-cell-amount';
|
|
106
|
-
if (column.property === 'status') return 'role-table-cell-status';
|
|
107
|
-
return 'role-table-cell';
|
|
108
|
-
};
|
|
109
|
-
</script>
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**三个无效写法(实测事故)**:`<template #header><th class="role-…">`(加不进 EP 生成的 th)、`<el-table-column :class>`(类不落到 td)、在 `<el-table>` 上加单元格类(只影响根元素)。
|
|
113
|
-
|
|
114
|
-
### 批量挂载的做法
|
|
115
|
-
|
|
116
|
-
一个页面有 20+ 角色时**逐个手写 class 会漏**。做法:把契约的角色名转成类名清单,交给页面统一挂载,并在第 0 步自检里确认覆盖率 100%。
|
|
117
|
-
|
|
118
|
-
**类名转换规则**:`table.headerCell` → `.role-table-header-cell`(点号与驼峰都转小写连字符)。
|
|
119
|
-
|
|
120
|
-
## 结构等价转换(契约值 → EP DOM 结构)
|
|
121
|
-
|
|
122
|
-
契约声明的是**设计意图值**;EP 的 DOM 结构有时要求把值**换一种 CSS 机制落到对应元素**——这是翻译的一部分,不是改契约。生成前逐条对照本表:
|
|
123
|
-
|
|
124
|
-
| 契约声明 | EP DOM 事实 | 生成规则 |
|
|
125
|
-
|---|---|---|
|
|
126
|
-
| `border: 1px solid X`(输入类控件) | EP 输入框边框是 `.el-input__wrapper` 的 `box-shadow: 0 0 0 1px #DCDFE6 inset` | 生成 `box-shadow: 0 0 0 1px X inset`(整条覆盖 EP 默认 box-shadow,勿只写 border-color) |
|
|
127
|
-
| 表头 `height: 48px` + `padding`(左右间距) | 表头双层:`th.el-table__cell > .cell` | **拆解**:th 的上下 padding 归零(高度才精确等于 48px),左右间距放内层 `.cell`(`padding: 0 16px`) |
|
|
128
|
-
| 单元格 `height: 55px` + `padding` | td 同为双层 | 同上拆解;density 变体只改 height 与竖向 padding |
|
|
129
|
-
| 分页激活页 `background` | EP 激活页 `.el-pager li.is-active` 默认只有字色 | 背景色落到 `.role-pagination-bar .el-pager li.is-active`(后代规则) |
|
|
130
|
-
| 侧栏激活项「左侧竖条」变体 | `.el-menu-item.is-active` 自带底色 | 竖条用 `::before` 伪元素(`position:absolute; left:-8px; width:3px`),菜单项保持 `position: relative` |
|
|
131
|
-
| 卡片 `padding: 0` | 内边距在 `.el-card__body`,项目样式层对其带 `!important` | 写 `.role-page-card > .el-card__body { padding: 0 !important; }`(实证坑 3 的唯一提权例) |
|
|
132
|
-
| 表格行 hover / 选中底色 | 行状态类由 EP 挂在 `tr` 上(`el-table__row-hover` 等) | 用 `.el-table` 状态类 + 角色类的后代规则实现(`when` 联动),不手写 JS 监听 |
|
|
133
|
-
|
|
134
|
-
**判断顺序**:先查本表 → 表里没有的结构差异,查「角色类挂对元素没」(上一节挂载表)→ 都不是,才回查契约值本身。
|
|
135
|
-
|
|
136
|
-
## 实证坑(踩过的事故,生成时必须规避)
|
|
137
|
-
|
|
138
|
-
1. **`:deep()` 在全局 CSS 文件中是非法语法**:浏览器会**静默丢弃整条规则**(不报错),导致 inner 层样式全部失效、只剩主题色生效。全局文件穿透一律用普通后代选择器(`.role-x .el-y__wrapper`)。
|
|
139
|
-
2. **角色类不得覆盖宿主容器的布局模式**:若角色类挂在项目既有 flex/grid 容器上(如 `.vts-table-area` 是 flex column),CSS 里只写视觉属性(padding/border/颜色),**禁止写 `display`/`flex-direction`/`justify-content`**,否则内部子元素被横向挤压裁切。
|
|
140
|
-
3. **Element Plus 对 `.el-card__body` 的 padding 带 `!important`**(项目 element-plus.scss):角色类要归零卡片内边距,必须同属性加 `!important` 提权,否则不生效。
|
|
141
|
-
4. **表格行高精确控制**:`th/td` 的上下 padding 必须归零、左右间距放到内部 `.cell` 上(`padding: 0 16px`),否则 height 会被 padding 撑大(48px 变 57px 事故)。
|
|
142
|
-
|
|
143
|
-
## 提权通道(唯一允许处)
|
|
144
|
-
|
|
145
|
-
角色类是独立命名空间(`role-` 前缀)+ 独立文件,**通常不需要提权**。仅两种情况需要:
|
|
146
|
-
|
|
147
|
-
| 情况 | 处置 |
|
|
148
|
-
|---|---|
|
|
149
|
-
| 组件库用行内 style 注入(如 `:header-cell-style`) | 在角色类上对该属性加 `!important`——**仅此一处允许** |
|
|
150
|
-
| 组件库 `!important` 覆盖了角色类 | 同上 |
|
|
151
|
-
|
|
152
|
-
**提权只加在具体属性上,不整条加**。整条加会让后续所有变体都带上高权重。
|
|
153
|
-
|
|
154
|
-
## 三份 CSS 的落点
|
|
155
|
-
|
|
156
|
-
| 文件 | 落点 | 引入时机 |
|
|
157
|
-
|---|---|---|
|
|
158
|
-
| `src/styles/ui-tokens.css` | 项目样式目录 | 样式入口全局引入一次 |
|
|
159
|
-
| `src/styles/ui-roles.css` | 项目样式目录 | 同上,**必须是不 scoped 的全局文件** |
|
|
160
|
-
| `src/styles/ui-layout.css` | 项目样式目录 | 同上 |
|
|
161
|
-
|
|
162
|
-
## 布局占位容器
|
|
163
|
-
|
|
164
|
-
项目的 `lay-admin` 等布局组件退化为占位容器:
|
|
165
|
-
|
|
166
|
-
```vue
|
|
167
|
-
<template>
|
|
168
|
-
<div class="ui-page">
|
|
169
|
-
<aside class="ui-region-sidebar"><slot name="sidebar" /></aside>
|
|
170
|
-
<header class="ui-region-header"><slot name="header" /></header>
|
|
171
|
-
<nav class="ui-region-tabs"><slot name="tabs" /></nav>
|
|
172
|
-
<main class="ui-region-content"><slot name="content" /></main>
|
|
173
|
-
</div>
|
|
174
|
-
</template>
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**布局组件只提供插槽,不参与布局决策**——网格由 `ui-layout.css` 决定。改造范围限定在布局组件的模板与样式层,不动业务代码。
|
|
178
|
-
|
|
179
|
-
## 不做
|
|
180
|
-
|
|
181
|
-
- 不改组件库源码
|
|
182
|
-
- 不在业务页面写角色类以外的设计样式
|
|
183
|
-
- 不把契约值硬编码进布局组件(布局取值来自 `ui-layout.css`)
|
|
11
|
+
| 输入框 | `.el-input` 的宽度与 `.el-input__wrapper` 的背景、box-shadow 边框;文字检查 input |
|
|
12
|
+
| 下拉框 | `.el-select__wrapper` 与输入文字;选项浮层另查 Teleport 后的实际宿主 |
|
|
13
|
+
| 表格 | th/td 外部盒与内部 `.cell` 分开;边框、padding、行高同时实测 |
|
|
14
|
+
| 表头/单元格类 | 使用 header-cell-class-name、cell-class-name 或列 class-name,并保留原回调行为 |
|
|
15
|
+
| 卡片 | 区分根节点和 `.el-card__body` 的 padding、填满链及滚动 |
|
|
16
|
+
| 菜单 | 区分 menu、item、sub-menu title 及激活/折叠/伪元素;数据仍来自项目路由 |
|
|
17
|
+
| 分页 | 检查激活页、前后页按钮、总数、选择器、跳转输入及 RePagination 的外层 |
|
|
18
|
+
| 弹窗 | 检查挂载到 body 的实际层、遮罩、标题、内容、页脚和原有关闭行为 |
|
|
19
|
+
| ReTableBar | 区分工具栏行与「工具栏+表格+分页」复合根;只对目标层调整排列 |
|
|
20
|
+
|
|
21
|
+
- 完成条件:每个区域的真实节点和组件通道已定位,已有回调/Slots/事件保持。
|
|
22
|
+
|
|
23
|
+
## 2. 落样式
|
|
24
|
+
|
|
25
|
+
- SFC scoped 使用 `:deep(...)`,全局 CSS/SCSS 使用普通后代选择器;每个逗号分支均带目标作用域。
|
|
26
|
+
- 优先映射已有 CSS 变量;设计提供的颜色、间距、高度与边框全部取原稿,不从 adapter 的旧默认值补成强制样式。
|
|
27
|
+
- 对输入边框等不同绘制机制做等效映射,使用原稿边框宽度、颜色和圆角;检查是否形成根与 wrapper 双边框。
|
|
28
|
+
- 对表格行高同时核对 th/td 与 `.cell` 的 padding、line-height 和 box-sizing;保留密度切换、列宽计算及固定列滚动反馈。
|
|
29
|
+
- 对同一视觉角色的不同实例使用独立作用域或变体;不以通用角色类将所有页面强制变成同一布局。
|
|
30
|
+
- 布局允许调整 display、方向和层次;调整前明确节点职责,调整后检查子节点、引用及高度链。不要把只应作用在工具栏的横向布局挂到复合根。
|
|
31
|
+
- 核查变量宿主、选择器特异性、组件 scoped 注入顺序和行内样式;后置 import 后仍需实测。必要时在最小范围对单属性提权并说明原因。
|
|
32
|
+
- 完成条件:每条新增视觉规则在真实页面命中预期节点,未污染其他页面或状态。
|
|
33
|
+
|
|
34
|
+
## 3. 保留项目结构与能力
|
|
35
|
+
|
|
36
|
+
- 复用现有 Layout、路由和 Store,不创建替代静态外壳;保留菜单权限、折叠、页签、缓存和响应式。
|
|
37
|
+
- 原有 fixed/margin/padding 布局与目标不符时调整相关模板和样式;改用 grid/flex 时同步移除被替代的偏移机制,避免双重几何。
|
|
38
|
+
- 项目自有 Re* 可调整表现层或增加兼容视觉参数;第三方包源码保持不变,公开事件和数据契约保持兼容。
|
|
39
|
+
- 原有 `adapters/vue-element-plus.json` 只供历史生成链排查,不将其中固定值或 skipGeometry 当成当前设计约束。
|
|
40
|
+
- 完成条件:执行 `../visual-verification.md` 并通过相关页面、主题、密度、交互及业务回归。
|