@qilitt-mickey/vue3-temp-skill 1.1.62 → 1.1.64
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 +135 -135
- package/mapping/component/overlay.json +1 -1
- package/mapping/scenes/admin/content.json +33 -13
- package/mapping/scenes/admin/layout.json +26 -13
- package/package.json +2 -1
- package/parser/index.js +2 -3
- package/references/design-apply.md +2 -2
- package/references/steps/step0-preflight.md +1 -1
- package/references/steps/step1-match.md +1 -1
- package/references/steps/step1b-audit.md +3 -3
- package/references/steps/step2-structure.md +4 -4
- package/references/steps/step3c-priority.md +1 -1
- package/references/steps/step5-gates.md +17 -5
- package/references/steps/step6-verify.md +6 -4
- package/scripts/check.mjs +23 -0
- package/scripts/design-audit.mjs +878 -0
package/SKILL.md
CHANGED
|
@@ -1,136 +1,136 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "vue3-temp-skill"
|
|
3
|
-
description: "Vue 3 企业级项目开发技能。面向 vue3-web-temp 及其派生项目,帮助产品经理和前端快速把点子做成可演示、可验证、可继续演进的 Demo;同时约束真实模板复用和代码质量。"
|
|
4
|
-
scope: project
|
|
5
|
-
agent_created: true
|
|
6
|
-
tags: [vue3, typescript, element-plus, pinia, vite, unocss, crud, demo, code-quality]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Vue 3 项目开发技能
|
|
10
|
-
|
|
11
|
-
> **体系版本:1.0.0**(双 Skill 唯一版本声明点之一;设计侧 project-ui-design 同版)。版本恒定策略:双侧始终同版,不随内容修改递增,仅协议破坏性变更时双侧同步升版。mapping/*.json 的 `meta.version` 与变更集校验均恒为 `1.0.0`,不单独演进。
|
|
12
|
-
|
|
13
|
-
## 目标
|
|
14
|
-
|
|
15
|
-
把产品点子快速落到真实 Vue 3 项目中,先形成客户可看的完整 Demo,再保留后续正式开发所需的代码边界。页面可以使用 mock 和最小数据,但不得使用模板演示噪音、虚构项目能力或堆叠无法维护的代码。
|
|
16
|
-
|
|
17
|
-
## 触发方式
|
|
18
|
-
|
|
19
|
-
```text
|
|
20
|
-
/vue3-temp-skill <自然语言需求>
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
典型需求:
|
|
24
|
-
|
|
25
|
-
- 开发客户管理列表,支持搜索、分页、编辑和详情
|
|
26
|
-
- 做一个订单仪表盘,含统计卡片和趋势图
|
|
27
|
-
- 给现有 Demo 增加附件上传、导出或审批流
|
|
28
|
-
- 把一个页面从 mock 改成真实 API
|
|
29
|
-
- 「按这份设计方案改造全系统」/ 落地设计技能产出的设计文件(用户可能是小白,只会给文件路径或拖入文件;见 §3b)
|
|
30
|
-
|
|
31
|
-
## 运行时只保留三件事
|
|
32
|
-
|
|
33
|
-
1. **项目探查**:读取目标项目的 `package.json`、路由、页面、`Re*` 组件、Hooks、API 和样式;以源码事实为准。
|
|
34
|
-
2. **能力路由**:运行 `scripts/match.py "需求" --json`,**仅**按输出中的 `load_files` 阅读 reference;禁止自行展开全部 `references/`。无 Python 时按下方能力组表手动匹配。
|
|
35
|
-
3. **质量闸门**:代码完成后读取 `references/code-quality.md
|
|
36
|
-
|
|
37
|
-
## 能力组路由
|
|
38
|
-
|
|
39
|
-
| 能力组 | 覆盖内容 | 主要参考文件 |
|
|
40
|
-
|---|---|---|
|
|
41
|
-
| `page-crud` | 常规列表、筛选、分页、表格操作 | `crud-pages.md` |
|
|
42
|
-
| `page-detail` | 独立详情/编辑页、顶部标签、路由 meta | `detail-page.md` |
|
|
43
|
-
| `data-service` | HTTP、API、类型、mock、联调 | `http-api.md`、`api-check.md` |
|
|
44
|
-
| `forms` | 表单、弹窗、远程选择、回显、字典、反馈 | `form-advanced.md`、`data-writeback.md`、`base-code-dict.md`、`feedback-loading.md` |
|
|
45
|
-
| `access` | 权限、认证页面 | `permission-auth.md`、`auth-pages.md` |
|
|
46
|
-
| `theme-layout` | 布局、主题色、暗黑模式、侧栏配色、令牌 | `layout-theme.md` |
|
|
47
|
-
| `shared-ui` | Re*、图标、通用展示和指令 | `ui-components.md`、`icons.md`、`feedback-ui.md`、`directives-advanced.md` |
|
|
48
|
-
| `table-advanced` | 树表、VXE 表格 | `tree-table.md`、`table-vxe.md` |
|
|
49
|
-
| `visualization` | 图表、大屏、关系图谱 | `chart-echarts.md`、`data-screen.md`、`graph-relation.md` |
|
|
50
|
-
| `workflow` | BPMN、G6 流程图、字段映射 | `workflow-bpmn.md`、`flowchart-g6.md`、`data-mapping.md` |
|
|
51
|
-
| `files-and-editors` | 附件、预览、下载、富文本、二维码 | `file-management.md`、`download-export.md`、`rich-text.md`、`qrcode-barcode.md` |
|
|
52
|
-
| `realtime-and-mobile` | WebSocket、移动端、微信、验证码、动效 | 对应专项 reference |
|
|
53
|
-
| `data-compare` | 编辑页变更对比和汇总 | `data-compare.md` |
|
|
54
|
-
| `design-apply` | 设计变更集落地:语义 ID 三级匹配、结构/形态/两层样式转换、锚点与结构施工、覆写提权、渲染态验收、合规闸门。**主入口 `design-apply.md
|
|
55
|
-
|
|
56
|
-
## 工作流
|
|
57
|
-
|
|
58
|
-
### 1. 识别目标和范围
|
|
59
|
-
|
|
60
|
-
- 确认目标项目根目录;没有明确目标时先询问,不在技能仓库里写业务代码。
|
|
61
|
-
- 判断是 Demo 验证、功能增量还是正式业务开发。
|
|
62
|
-
- 保留目标项目当前初始化视觉,不让开发技能自行设计。
|
|
63
|
-
|
|
64
|
-
### 2. 读取事实
|
|
65
|
-
|
|
66
|
-
- 先读 `references/core-kernel.md`。
|
|
67
|
-
- 运行 `scripts/match.py "需求" --json`,按 `load_files` 阅读。
|
|
68
|
-
- 读取目标项目当前 `package.json` 和锁文件;不要根据“core/addon”标签猜依赖是否存在。
|
|
69
|
-
- 扫描已有 `Re*`、Hooks、`src/api`、路由和相关页面;已有封装优先于技能示例。
|
|
70
|
-
|
|
71
|
-
### 3. 实现闭环
|
|
72
|
-
|
|
73
|
-
- 页面、路由、API、类型、mock 和共享组件按一个业务闭环实现。
|
|
74
|
-
- 列表使用 `useTableSearch`、`ReTableBar`、`RePagination`;有独立详情时同步完成 `useDetail` 与路由 meta。
|
|
75
|
-
- HTTP 只经过 `@/utils/http`,响应按项目实际 `Result<T>` 约定处理。
|
|
76
|
-
- Demo 可以最小化数据和接口,但目录、类型、命名和组件边界要能承接后续开发。
|
|
77
|
-
- 新依赖先检查目标项目;缺失时说明精确版本、原因和构建接线,确认后再安装。
|
|
78
|
-
- 只有目标项目确实存在排除项、占位插件或缺失接线时,才读取 `addon-enable.md` 恢复配置。
|
|
79
|
-
- **输入为设计文件时**:用户给出设计技能(project-ui-design)产出的 JSON 文件(无论叫"设计方案/设计文件/变更集")→ 不走常规闭环,改走 `design-apply.md` 协议——先跑 `node parser/index.js audit` 复核锚点(挂载点/死通道),再按「结构先行(`structure_ops`)、样式两层转换、必要时覆写提权(`priority`)」落地,最后过变更集合规闸门。变更集新增三类声明维度:`apply_via`(落点通道)/ `layer`(`host` 宿主盒 / `inner` 内层文本盒)/ `structure_ops`(数据·结构驱动点位的结构操作);词典条目对应新增 `anchors` / `preconditions` / `priority`。
|
|
80
|
-
|
|
81
|
-
### 3b. 小白用户执行纪律(design-apply 场景)
|
|
82
|
-
|
|
83
|
-
使用者默认**不懂设计也不懂代码**,交互遵守四条:
|
|
84
|
-
|
|
85
|
-
1. **全自动默认**:识别为设计文件落地后**直接开始执行 parser match → 结构 → 样式 → 闸门全流程**,不等用户逐步确认,不询问"是否继续";唯一停顿点是文件缺失/版本不匹配/parser 报错——此时用大白话报告并给选择题。
|
|
86
|
-
**禁止以「待确认」搁置可落地项**:词典缺 ID / 缺字段枚举 / 缺 form 属**能力缺口**,当场补临时映射并落地(出厂文件仅在补通道时可动,交付说明单列申报);只有「设计侧没给值」才是**意图缺口**,去向是回流设计侧补齐,不是问用户要不要做。
|
|
87
|
-
2. **术语不对用户出现**:对用户不说"变更集/语义 ID/三级匹配/pending/令牌"——说"设计方案/设计点位/自动适配/新增点位/全局样式"。这些词只出现在内部文档与交付说明里。
|
|
88
|
-
3. **无文件时的引导**:用户说"全系统改成 XX 风格"但没给设计文件 → 提示一句话:"请先在设计助手(project-ui-design 技能)里说『我要 XX 风格的全系统设计』拿到设计文件,再回来发给我"。如果本机同时装有设计技能,可直接引导用户回到设计会话完成设计,再回本项目落地。
|
|
89
|
-
4. **交付话术**:完成后用大白话总结(改了哪些页面/哪些地方变了/怎么验收),不输出施工坐标等技术细节;验收引导统一为"运行 `pnpm dev` 打开页面对照看效果,哪里不满意直接说"。
|
|
90
|
-
|
|
91
|
-
### 4. 验证与交付
|
|
92
|
-
|
|
93
|
-
- 对照 `references/code-quality.md` 检查类型、组件复用、API、路由、权限、安全、异常反馈、响应式和可演进性。
|
|
94
|
-
- 在目标项目执行 `pnpm lint:fix`、`pnpm type-check`;改动构建配置时再执行 `pnpm build`。
|
|
95
|
-
- **设计文件落地时追加渲染态验收**:变更集含 `oracle`(或效果图带 `data-sid`)时,跑 `node parser/index.js verify`——抽取项目同名 `data-sid` 元素的 computed style,与效果图期望值逐点 diff;缺口按四类归因(选择器落空 / 权重被压 / 语境错位 / **存在性缺口 G12**:`oracle.absent` 点位仍可见)修正,禁止用 `!important` 掩盖。多轮迭代场景每轮动工前先 `--snapshot` 导快照、交付前 `--baseline` 比对——上轮命中本轮退步 = 基线漂移,先回归上轮修法。申报过的固有残差(`oracle.residual_accepted`)不计缺口。
|
|
96
|
-
- **设计文件落地时核对登记表覆盖率**:变更集带登记表(`coverage.registry` 或 `--registry`)时,跑 `node parser/index.js match <cs.json> --registry <restore-registry.json>`——`C = A` 且无缺口才可交付;parser **当场以登记表为权威重算**,设计侧自报的 `coverage` 数字不参与。单独核验登记表对词典的通道就绪度用 `node parser/index.js registry <restore-registry.json>`(硬缺口 exit 1、通道缺口列出待补字段)。
|
|
97
|
-
- 最终说明:命中能力组、修改文件、功能验证、命令结果、未解决问题和下一步。
|
|
98
|
-
|
|
99
|
-
## 出厂中性 · 变更集驱动(design-apply 架构红线)
|
|
100
|
-
|
|
101
|
-
目标项目源码 = **中性初始化**,只提供能力通道(CSS 变量的消费者挂载点、form 枚举、DOM/属性钩子、正确的层叠优先级),**不预置任何具体设计的结论**(某个颜色、某句问候语、某个方位的指示条、某个硬编码尺寸)。
|
|
102
|
-
|
|
103
|
-
- 一切设计决策由设计变更集驱动,经 `design-apply` 动态落到「设计层文件 `src/styles/design-shell.scss` / 页面级 scoped 样式 / DOM 属性与配置」,不落到出厂样式文件与出厂组件里。
|
|
1
|
+
---
|
|
2
|
+
name: "vue3-temp-skill"
|
|
3
|
+
description: "Vue 3 企业级项目开发技能。面向 vue3-web-temp 及其派生项目,帮助产品经理和前端快速把点子做成可演示、可验证、可继续演进的 Demo;同时约束真实模板复用和代码质量。"
|
|
4
|
+
scope: project
|
|
5
|
+
agent_created: true
|
|
6
|
+
tags: [vue3, typescript, element-plus, pinia, vite, unocss, crud, demo, code-quality]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Vue 3 项目开发技能
|
|
10
|
+
|
|
11
|
+
> **体系版本:1.0.0**(双 Skill 唯一版本声明点之一;设计侧 project-ui-design 同版)。版本恒定策略:双侧始终同版,不随内容修改递增,仅协议破坏性变更时双侧同步升版。mapping/*.json 的 `meta.version` 与变更集校验均恒为 `1.0.0`,不单独演进。
|
|
12
|
+
|
|
13
|
+
## 目标
|
|
14
|
+
|
|
15
|
+
把产品点子快速落到真实 Vue 3 项目中,先形成客户可看的完整 Demo,再保留后续正式开发所需的代码边界。页面可以使用 mock 和最小数据,但不得使用模板演示噪音、虚构项目能力或堆叠无法维护的代码。
|
|
16
|
+
|
|
17
|
+
## 触发方式
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
/vue3-temp-skill <自然语言需求>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
典型需求:
|
|
24
|
+
|
|
25
|
+
- 开发客户管理列表,支持搜索、分页、编辑和详情
|
|
26
|
+
- 做一个订单仪表盘,含统计卡片和趋势图
|
|
27
|
+
- 给现有 Demo 增加附件上传、导出或审批流
|
|
28
|
+
- 把一个页面从 mock 改成真实 API
|
|
29
|
+
- 「按这份设计方案改造全系统」/ 落地设计技能产出的设计文件(用户可能是小白,只会给文件路径或拖入文件;见 §3b)
|
|
30
|
+
|
|
31
|
+
## 运行时只保留三件事
|
|
32
|
+
|
|
33
|
+
1. **项目探查**:读取目标项目的 `package.json`、路由、页面、`Re*` 组件、Hooks、API 和样式;以源码事实为准。
|
|
34
|
+
2. **能力路由**:运行 `scripts/match.py "需求" --json`,**仅**按输出中的 `load_files` 阅读 reference;禁止自行展开全部 `references/`。无 Python 时按下方能力组表手动匹配。
|
|
35
|
+
3. **质量闸门**:代码完成后读取 `references/code-quality.md`,执行清单和项目命令。设计变更集落地后追加**设计层闭环审计**:`node scripts/design-audit.mjs --project <落地项目> --container-width <内容区实际宽>`(ERROR 必须清零;无落地项目时自动跳过)。
|
|
36
|
+
|
|
37
|
+
## 能力组路由
|
|
38
|
+
|
|
39
|
+
| 能力组 | 覆盖内容 | 主要参考文件 |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `page-crud` | 常规列表、筛选、分页、表格操作 | `crud-pages.md` |
|
|
42
|
+
| `page-detail` | 独立详情/编辑页、顶部标签、路由 meta | `detail-page.md` |
|
|
43
|
+
| `data-service` | HTTP、API、类型、mock、联调 | `http-api.md`、`api-check.md` |
|
|
44
|
+
| `forms` | 表单、弹窗、远程选择、回显、字典、反馈 | `form-advanced.md`、`data-writeback.md`、`base-code-dict.md`、`feedback-loading.md` |
|
|
45
|
+
| `access` | 权限、认证页面 | `permission-auth.md`、`auth-pages.md` |
|
|
46
|
+
| `theme-layout` | 布局、主题色、暗黑模式、侧栏配色、令牌 | `layout-theme.md` |
|
|
47
|
+
| `shared-ui` | Re*、图标、通用展示和指令 | `ui-components.md`、`icons.md`、`feedback-ui.md`、`directives-advanced.md` |
|
|
48
|
+
| `table-advanced` | 树表、VXE 表格 | `tree-table.md`、`table-vxe.md` |
|
|
49
|
+
| `visualization` | 图表、大屏、关系图谱 | `chart-echarts.md`、`data-screen.md`、`graph-relation.md` |
|
|
50
|
+
| `workflow` | BPMN、G6 流程图、字段映射 | `workflow-bpmn.md`、`flowchart-g6.md`、`data-mapping.md` |
|
|
51
|
+
| `files-and-editors` | 附件、预览、下载、富文本、二维码 | `file-management.md`、`download-export.md`、`rich-text.md`、`qrcode-barcode.md` |
|
|
52
|
+
| `realtime-and-mobile` | WebSocket、移动端、微信、验证码、动效 | 对应专项 reference |
|
|
53
|
+
| `data-compare` | 编辑页变更对比和汇总 | `data-compare.md` |
|
|
54
|
+
| `design-apply` | 设计变更集落地:语义 ID 三级匹配、结构/形态/两层样式转换、锚点与结构施工、覆写提权、渲染态验收、合规闸门。**主入口 `design-apply.md`(红线+契约+步骤索引),各步骤明细见 `references/steps/`——做到哪一步读哪一份** | `design-apply.md`、`steps/`、`mapping/`、`parser/`、`scripts/design-audit.mjs` |
|
|
55
|
+
|
|
56
|
+
## 工作流
|
|
57
|
+
|
|
58
|
+
### 1. 识别目标和范围
|
|
59
|
+
|
|
60
|
+
- 确认目标项目根目录;没有明确目标时先询问,不在技能仓库里写业务代码。
|
|
61
|
+
- 判断是 Demo 验证、功能增量还是正式业务开发。
|
|
62
|
+
- 保留目标项目当前初始化视觉,不让开发技能自行设计。
|
|
63
|
+
|
|
64
|
+
### 2. 读取事实
|
|
65
|
+
|
|
66
|
+
- 先读 `references/core-kernel.md`。
|
|
67
|
+
- 运行 `scripts/match.py "需求" --json`,按 `load_files` 阅读。
|
|
68
|
+
- 读取目标项目当前 `package.json` 和锁文件;不要根据“core/addon”标签猜依赖是否存在。
|
|
69
|
+
- 扫描已有 `Re*`、Hooks、`src/api`、路由和相关页面;已有封装优先于技能示例。
|
|
70
|
+
|
|
71
|
+
### 3. 实现闭环
|
|
72
|
+
|
|
73
|
+
- 页面、路由、API、类型、mock 和共享组件按一个业务闭环实现。
|
|
74
|
+
- 列表使用 `useTableSearch`、`ReTableBar`、`RePagination`;有独立详情时同步完成 `useDetail` 与路由 meta。
|
|
75
|
+
- HTTP 只经过 `@/utils/http`,响应按项目实际 `Result<T>` 约定处理。
|
|
76
|
+
- Demo 可以最小化数据和接口,但目录、类型、命名和组件边界要能承接后续开发。
|
|
77
|
+
- 新依赖先检查目标项目;缺失时说明精确版本、原因和构建接线,确认后再安装。
|
|
78
|
+
- 只有目标项目确实存在排除项、占位插件或缺失接线时,才读取 `addon-enable.md` 恢复配置。
|
|
79
|
+
- **输入为设计文件时**:用户给出设计技能(project-ui-design)产出的 JSON 文件(无论叫"设计方案/设计文件/变更集")→ 不走常规闭环,改走 `design-apply.md` 协议——先跑 `node parser/index.js audit` 复核锚点(挂载点/死通道),再按「结构先行(`structure_ops`)、样式两层转换、必要时覆写提权(`priority`)」落地,最后过变更集合规闸门。变更集新增三类声明维度:`apply_via`(落点通道)/ `layer`(`host` 宿主盒 / `inner` 内层文本盒)/ `structure_ops`(数据·结构驱动点位的结构操作);词典条目对应新增 `anchors` / `preconditions` / `priority`。
|
|
80
|
+
|
|
81
|
+
### 3b. 小白用户执行纪律(design-apply 场景)
|
|
82
|
+
|
|
83
|
+
使用者默认**不懂设计也不懂代码**,交互遵守四条:
|
|
84
|
+
|
|
85
|
+
1. **全自动默认**:识别为设计文件落地后**直接开始执行 parser match → 结构 → 样式 → 闸门全流程**,不等用户逐步确认,不询问"是否继续";唯一停顿点是文件缺失/版本不匹配/parser 报错——此时用大白话报告并给选择题。
|
|
86
|
+
**禁止以「待确认」搁置可落地项**:词典缺 ID / 缺字段枚举 / 缺 form 属**能力缺口**,当场补临时映射并落地(出厂文件仅在补通道时可动,交付说明单列申报);只有「设计侧没给值」才是**意图缺口**,去向是回流设计侧补齐,不是问用户要不要做。
|
|
87
|
+
2. **术语不对用户出现**:对用户不说"变更集/语义 ID/三级匹配/pending/令牌"——说"设计方案/设计点位/自动适配/新增点位/全局样式"。这些词只出现在内部文档与交付说明里。
|
|
88
|
+
3. **无文件时的引导**:用户说"全系统改成 XX 风格"但没给设计文件 → 提示一句话:"请先在设计助手(project-ui-design 技能)里说『我要 XX 风格的全系统设计』拿到设计文件,再回来发给我"。如果本机同时装有设计技能,可直接引导用户回到设计会话完成设计,再回本项目落地。
|
|
89
|
+
4. **交付话术**:完成后用大白话总结(改了哪些页面/哪些地方变了/怎么验收),不输出施工坐标等技术细节;验收引导统一为"运行 `pnpm dev` 打开页面对照看效果,哪里不满意直接说"。
|
|
90
|
+
|
|
91
|
+
### 4. 验证与交付
|
|
92
|
+
|
|
93
|
+
- 对照 `references/code-quality.md` 检查类型、组件复用、API、路由、权限、安全、异常反馈、响应式和可演进性。
|
|
94
|
+
- 在目标项目执行 `pnpm lint:fix`、`pnpm type-check`;改动构建配置时再执行 `pnpm build`。
|
|
95
|
+
- **设计文件落地时追加渲染态验收**:变更集含 `oracle`(或效果图带 `data-sid`)时,跑 `node parser/index.js verify`——抽取项目同名 `data-sid` 元素的 computed style,与效果图期望值逐点 diff;缺口按四类归因(选择器落空 / 权重被压 / 语境错位 / **存在性缺口 G12**:`oracle.absent` 点位仍可见)修正,禁止用 `!important` 掩盖。多轮迭代场景每轮动工前先 `--snapshot` 导快照、交付前 `--baseline` 比对——上轮命中本轮退步 = 基线漂移,先回归上轮修法。申报过的固有残差(`oracle.residual_accepted`)不计缺口。
|
|
96
|
+
- **设计文件落地时核对登记表覆盖率**:变更集带登记表(`coverage.registry` 或 `--registry`)时,跑 `node parser/index.js match <cs.json> --registry <restore-registry.json>`——`C = A` 且无缺口才可交付;parser **当场以登记表为权威重算**,设计侧自报的 `coverage` 数字不参与。单独核验登记表对词典的通道就绪度用 `node parser/index.js registry <restore-registry.json>`(硬缺口 exit 1、通道缺口列出待补字段)。
|
|
97
|
+
- 最终说明:命中能力组、修改文件、功能验证、命令结果、未解决问题和下一步。
|
|
98
|
+
|
|
99
|
+
## 出厂中性 · 变更集驱动(design-apply 架构红线)
|
|
100
|
+
|
|
101
|
+
目标项目源码 = **中性初始化**,只提供能力通道(CSS 变量的消费者挂载点、form 枚举、DOM/属性钩子、正确的层叠优先级),**不预置任何具体设计的结论**(某个颜色、某句问候语、某个方位的指示条、某个硬编码尺寸)。
|
|
102
|
+
|
|
103
|
+
- 一切设计决策由设计变更集驱动,经 `design-apply` 动态落到「设计层文件 `src/styles/design-shell.scss` / 页面级 scoped 样式 / DOM 属性与配置」,不落到出厂样式文件与出厂组件里。
|
|
104
104
|
- **效果图页面 = 设计角色坐标系,不是页面增量(G13 页面绑定闸)**:效果图页面(如「运单管理」)是设计侧为承载设计语言虚构的演示标题,**默认映射到项目已有页面**——落地动作恒为「在已有页面上同步结构与样式」,**禁止因效果图新增页面 / 路由 / 菜单项**;唯一例外是变更集 `page_bindings` 显式声明 `target:"new"` 且在 `notes` 申报。判据:换一张效果图不需要改项目的页面/路由/菜单清单 ⇒ 架构正确;需要新增页面才能换 ⇒ 设计演示页被误当业务增量,必须回退。
|
|
105
|
-
- **演示占位内容 = 效果的角色承载,不是还原目标(演示内容等价)**:项目演示页上为展示"此处可放控件"而写的占位说明文字 / 演示按钮,既不是效果图的角色、也不是设计意图。落地时必须把落在效果图对应角色上的演示占位**替换为设计对应内容**,或对效果图没有该位置的点位**收口隐藏**——**还原后的页面不得残留模板演示说明性文字与占位按钮**。判据:残留演示文案说明「效果 vs 内容」混淆——把模板演示内容当成设计还原,必须回退(详见 design-apply 第 2 步「出厂演示占位内容等价」)。
|
|
106
|
-
- 判据:换一张效果图只需换变更集、不必改源码 ⇒ 架构正确;需要改源码才能换 ⇒ 设计结论被烧进源码,必须回退为通道。
|
|
107
|
-
- 出厂文件仅在「通道缺失」时可动(补变量消费者 / 补 form 枚举 / 修层叠优先级),且必须在交付说明中单列「补通道」条目写明缺失点。
|
|
108
|
-
|
|
109
|
-
## 项目事实优先级
|
|
110
|
-
|
|
111
|
-
`目标项目当前源码` > `目标项目 package.json / 锁文件` > `本 Skill reference` > `通用 Vue 习惯`。
|
|
112
|
-
|
|
113
|
-
## 默认禁止
|
|
114
|
-
|
|
115
|
-
- 不在页面内直接使用 `axios` / `fetch`,不虚构 API 前缀。
|
|
116
|
-
- 不二次挂载 `Layout`,不把模板演示页原样当业务页面。
|
|
117
|
-
- 不使用裸 `v-if` 代替权限指令,不使用不可信 `v-html`。
|
|
118
|
-
- 不为了视觉效果引入未经确认的新 UI 框架或图表库。
|
|
119
|
-
- 不把 lint 通过当成业务闭环完成。
|
|
120
|
-
|
|
121
|
-
## 最终回复格式
|
|
122
|
-
|
|
123
|
-
```markdown
|
|
124
|
-
## 命中能力组
|
|
125
|
-
- page-crud / data-service / ...
|
|
126
|
-
|
|
127
|
-
## 变更说明
|
|
128
|
-
- `src/...`:...
|
|
129
|
-
|
|
130
|
-
## 验证结果
|
|
131
|
-
- 功能:...
|
|
132
|
-
- `pnpm lint:fix`:通过 | 失败(原因)
|
|
133
|
-
- `pnpm type-check`:通过 | 失败(原因)
|
|
134
|
-
- 设计验收:无 oracle 时 N/A | 逐点 diff 结果(命中 N / 缺口 M,归因与修正)
|
|
135
|
-
- 缺口回流:无 | 仅限「设计侧未给值」的维度(列出维度名,注明已回流设计侧补齐)
|
|
136
|
-
```
|
|
105
|
+
- **演示占位内容 = 效果的角色承载,不是还原目标(演示内容等价)**:项目演示页上为展示"此处可放控件"而写的占位说明文字 / 演示按钮,既不是效果图的角色、也不是设计意图。落地时必须把落在效果图对应角色上的演示占位**替换为设计对应内容**,或对效果图没有该位置的点位**收口隐藏**——**还原后的页面不得残留模板演示说明性文字与占位按钮**。判据:残留演示文案说明「效果 vs 内容」混淆——把模板演示内容当成设计还原,必须回退(详见 design-apply 第 2 步「出厂演示占位内容等价」)。
|
|
106
|
+
- 判据:换一张效果图只需换变更集、不必改源码 ⇒ 架构正确;需要改源码才能换 ⇒ 设计结论被烧进源码,必须回退为通道。
|
|
107
|
+
- 出厂文件仅在「通道缺失」时可动(补变量消费者 / 补 form 枚举 / 修层叠优先级),且必须在交付说明中单列「补通道」条目写明缺失点。
|
|
108
|
+
|
|
109
|
+
## 项目事实优先级
|
|
110
|
+
|
|
111
|
+
`目标项目当前源码` > `目标项目 package.json / 锁文件` > `本 Skill reference` > `通用 Vue 习惯`。
|
|
112
|
+
|
|
113
|
+
## 默认禁止
|
|
114
|
+
|
|
115
|
+
- 不在页面内直接使用 `axios` / `fetch`,不虚构 API 前缀。
|
|
116
|
+
- 不二次挂载 `Layout`,不把模板演示页原样当业务页面。
|
|
117
|
+
- 不使用裸 `v-if` 代替权限指令,不使用不可信 `v-html`。
|
|
118
|
+
- 不为了视觉效果引入未经确认的新 UI 框架或图表库。
|
|
119
|
+
- 不把 lint 通过当成业务闭环完成。
|
|
120
|
+
|
|
121
|
+
## 最终回复格式
|
|
122
|
+
|
|
123
|
+
```markdown
|
|
124
|
+
## 命中能力组
|
|
125
|
+
- page-crud / data-service / ...
|
|
126
|
+
|
|
127
|
+
## 变更说明
|
|
128
|
+
- `src/...`:...
|
|
129
|
+
|
|
130
|
+
## 验证结果
|
|
131
|
+
- 功能:...
|
|
132
|
+
- `pnpm lint:fix`:通过 | 失败(原因)
|
|
133
|
+
- `pnpm type-check`:通过 | 失败(原因)
|
|
134
|
+
- 设计验收:无 oracle 时 N/A | 逐点 diff 结果(命中 N / 缺口 M,归因与修正)
|
|
135
|
+
- 缺口回流:无 | 仅限「设计侧未给值」的维度(列出维度名,注明已回流设计侧补齐)
|
|
136
|
+
```
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"font_size": "font-size",
|
|
74
74
|
"max_width": "max-width"
|
|
75
75
|
},
|
|
76
|
-
"$note": "全局提示气泡。项目内提示有**两条来路**——Element Plus 原生 ElTooltip(继承 --el-tooltip-* 令牌,如 ReAvatars 的 el-tooltip)与 v-tippy 指令(ReTableBar / ReCollapsible / ReAnchor / lay-tag 等处使用,走 tippy 主题,**不自动继承 --el-* 令牌**)。本条目面向 ElTooltip;若设计要求覆盖 v-tippy 气泡,须先确认 tippy
|
|
76
|
+
"$note": "全局提示气泡。项目内提示有**两条来路**——Element Plus 原生 ElTooltip(继承 --el-tooltip-* 令牌,如 ReAvatars 的 el-tooltip)与 v-tippy 指令(ReTableBar / ReCollapsible / ReAnchor / lay-tag 等处使用,走 tippy 主题,**不自动继承 --el-* 令牌**)。本条目面向 ElTooltip;若设计要求覆盖 v-tippy 气泡,须先确认 tippy 主题变量与本节令牌的对应关系,未映射时按「补通道」补主题变量并在交付说明单列申报(**不得假设自动生效**)。"
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
}
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"scroll": "data-content-mode='scroll':flex:0 0 auto; min-height:100%; overflow:visible(整页滚动)",
|
|
29
29
|
"auto": ":has(.vts-page-card|.vts-page-fill) 自动定高;未标记且无钩子类 → 滚动页(向后兼容)。自动分支带 :not([data-content-mode]) 守卫,与显式声明互斥"
|
|
30
30
|
},
|
|
31
|
-
"$note": "⚠列表区保命通道(**结构层**,设计还原禁止改写):**滚动归属** = 页面根节点 data-content-mode(fixed/scroll 优先;未声明走 :has() 自动探测兜底,自动分支带 :not([data-content-mode]) 守卫与显式声明互斥——显式 scroll 的页面内含 .vts-page-card 时定高分支不得反压,否则整页滚动断裂)。**填满剩余高度** = 中性属性 data-fill(element-plus.scss 已实现:display:flex; flex:1 1 auto; min-height:0; overflow:hidden;data-fill=\"row\" 横向分栏),从页面根到表格/画布容器之间**每个需填满的层级节点**都要挂。⚠**结构/视觉解耦(本通道存在的意义)**:定高链只认属性不认类名 ⇒ 视觉容器可被设计层整体替换(el-card.vts-page-card → 通栏 div / 自绘容器),换容器时把 data-fill 平移到新容器及其「体」层即可,高度链不断、useTableSearch 几何实测照常、表格自滚动正常。双向禁止:① 改写壳层结构层规则(lay-content 的 .main-content[data-content-mode]、element-plus.scss 的 [data-fill])来换还原效果;② 以「保高度」为由拒绝设计改容器/内边距/去卡片。⚠壳层 lay-content 禁止硬编码 data-content-mode
|
|
31
|
+
"$note": "⚠列表区保命通道(**结构层**,设计还原禁止改写):**滚动归属** = 页面根节点 data-content-mode(fixed/scroll 优先;未声明走 :has() 自动探测兜底,自动分支带 :not([data-content-mode]) 守卫与显式声明互斥——显式 scroll 的页面内含 .vts-page-card 时定高分支不得反压,否则整页滚动断裂)。**填满剩余高度** = 中性属性 data-fill(element-plus.scss 已实现:display:flex; flex:1 1 auto; min-height:0; overflow:hidden;data-fill=\"row\" 横向分栏),从页面根到表格/画布容器之间**每个需填满的层级节点**都要挂。⚠**结构/视觉解耦(本通道存在的意义)**:定高链只认属性不认类名 ⇒ 视觉容器可被设计层整体替换(el-card.vts-page-card → 通栏 div / 自绘容器),换容器时把 data-fill 平移到新容器及其「体」层即可,高度链不断、useTableSearch 几何实测照常、表格自滚动正常。双向禁止:① 改写壳层结构层规则(lay-content 的 .main-content[data-content-mode]、element-plus.scss 的 [data-fill])来换还原效果;② 以「保高度」为由拒绝设计改容器/内边距/去卡片。⚠壳层 lay-content 禁止硬编码 data-content-mode(若壳层代打 scroll 会压掉自动探测,导致 vts-page-card 列表页定高链断裂、useTableSearch 高度失准、列表区整体崩坏)。出厂 DOM 不带模式属性(中性),换设计只换页面根节点的声明值与 data-fill 挂载点。"
|
|
32
32
|
},
|
|
33
33
|
"admin.content.page_header": {
|
|
34
34
|
"type": "element",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"admin.content.table.operation_bar": {
|
|
75
75
|
"type": "element",
|
|
76
76
|
"selector": ".vts-page-card .flex-between > .flex-end(ReTableBar 内部工具栏行右侧容器,bar.vue JSX 实证 div.flex-end)",
|
|
77
|
-
"file": "
|
|
77
|
+
"file": "条件通道实证:.vts-action-bar 类**全项目无模板挂载**(仅 element-plus.scss 有样式定义、无消费者)——若 selector 锚定 .vts-action-bar,属锚定「应该在」而非「实际在」的 DOM,会导致设计层规则全部落空。本 selector 锚定真实出厂 DOM;.vts-action-bar 作为可选增强通道保留在 element-plus.scss,页面按需自行挂载后设计层规则自动命中。右侧工具三件套源码实证:刷新 svg-icon + el-dropdown 密度(宽松/默认/紧凑)+ el-popover 列设置",
|
|
78
78
|
"style_scope": ".vts-page-card",
|
|
79
79
|
"forms": {
|
|
80
80
|
"with_tools": "工具三件套(刷新/密度/列设置)齐全——设计规范 list-page §4 要求三件套缺一不可(ReTableBar 出厂已具备,此为默认形态)",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"tool_btn": ".vts-page-card .flex-end .vts-tool-btn"
|
|
122
122
|
},
|
|
123
123
|
"preconditions": [
|
|
124
|
-
"
|
|
124
|
+
"挂载点实证:出厂右侧容器是 .flex-between > .flex-end(真实存在),而 .vts-action-bar 全项目无模板挂载(仅样式定义、零消费者)——设计层规则写到 .vts-action-bar 上会全部落空。词典 selector 必须锚定源码实证存在的 DOM;「应该在」的点位未经 structure_ops 补挂 = 不存在。",
|
|
125
125
|
"本条目样式落点是 ReTableBar 内部工具栏行内容器——禁止把容器级样式(flex-direction 等)写到 ReTableBar 根节点:根节点是「工具栏行 + 表格 + 分页」的纵向复合容器,写根节点会让工具栏与表格并排、表格被挤压、tableHeight 实测失准(已发生的事故,勿复发)。",
|
|
126
126
|
"gap / padding 的 CSS 变量必须在项目样式中存在消费者(var() 引用),只定义不消费 = 死通道。--action-bar-padding-y 供 padding-block,最多两个值(如 20px 8px),给三个值整条声明即失效。"
|
|
127
127
|
],
|
|
@@ -150,9 +150,9 @@
|
|
|
150
150
|
"slot_width": ["text_link", "icon_text"]
|
|
151
151
|
},
|
|
152
152
|
"data_channels": {
|
|
153
|
-
"slot_width": "
|
|
153
|
+
"slot_width": "等宽槽宽度通道(动态优先):**槽宽默认由组件按按钮文案动态自适应**(ReTableOperate 的 --re-op-slot-w 在 slotMinWidth 省略时走 resolveOperateSlotWidthPx 自动推算),变更集**不声明 slot_width、业务页不传 slot-min-width** ——设计只声明 divider 几何(width/height/margin_x),槽宽随内容走、divider_margin_x 对称由槽内居中兑现(若声明 60px 钉死槽宽则违反动态优先;若槽内用 flex-start,短文案按钮的残白会全堆到分割线前侧 → 线前 40px/线后 8px 视觉不等距)。仅当设计效果图确实要求**统一槽宽**(如所有操作列等宽对齐网格)时例外:变更集显式声明 slot_width → 施工落业务页 prop(结构通道),禁 CSS 仿冒;无此明确设计意图 = 保持动态。等宽槽本体是对齐机制(槽边界保证行间第 N 项对齐),机制本身禁 CSS 收口 width:auto"
|
|
154
154
|
},
|
|
155
|
-
"$note": "操作列分割线为**条件通道**:出厂组件当前**没有**分割线元素——声明 divider_color / divider_gap 时,必须先按 structure_ops 在 ReTableOperate 模板按钮间 add_node `<span class=\"re-table-operate__divider\">`(中性元素,几何与颜色全走令牌:width/height/gap/color 分别挂 --re-op-divider-width/height/gap/color,出厂缺省 0 不可见),并同步给 resolveOperateColumnWidth 公式补分割线占位((limit-1)×(width+2×gap)),否则最后按钮被裁——元素与公式缺一即申报补通道失败。列宽由组件公式推算,业务页禁止写死 width
|
|
155
|
+
"$note": "操作列分割线为**条件通道**:出厂组件当前**没有**分割线元素——声明 divider_color / divider_gap 时,必须先按 structure_ops 在 ReTableOperate 模板按钮间 add_node `<span class=\"re-table-operate__divider\">`(中性元素,几何与颜色全走令牌:width/height/gap/color 分别挂 --re-op-divider-width/height/gap/color,出厂缺省 0 不可见),并同步给 resolveOperateColumnWidth 公式补分割线占位((limit-1)×(width+2×gap)),否则最后按钮被裁——元素与公式缺一即申报补通道失败。列宽由组件公式推算,业务页禁止写死 width;其余业务列(含选择列、序号列)逐列声明 width 或 min_width,见 admin.content.table.column_width(§11.132)。",
|
|
156
156
|
"custom_style_map": {
|
|
157
157
|
"align": "text-align",
|
|
158
158
|
"min_width": "min-width",
|
|
@@ -182,10 +182,10 @@
|
|
|
182
182
|
"preconditions": [
|
|
183
183
|
"按钮之间的间距由分割线元素的左右 margin 承载,不是按钮自身 gap:必须先存在分割线元素(ReTableOperate 默认不渲染 divider,需按 structure_ops 补槽位),divider_width / divider_height / divider_margin_x 才有落点——这是「操作列按钮间距没还原」的根因。",
|
|
184
184
|
"「纯文字无图标」是数据侧结论:图标来自业务页列定义的 operateButtons[].icon,只写 form=text_link 而不移除数据里的 icon = 未落地(改 CSS 不算)。",
|
|
185
|
-
"「更多」折叠槽前必须有分割线:组件出厂模板只在平铺按钮之间渲染 divider(v-if=\"i > 0\"),平铺末位与「更多」槽之间无分割线元素——效果图口径是每个按钮之间都要有且等距,施工时须按 structure_ops 给「更多」槽前补 divider(或把「更多」并入 v-for 让 i 计数覆盖),缺线 =
|
|
186
|
-
"等宽槽(--re-op-slot-w)是行间纵向对齐的唯一机制:设计层禁止覆写 .re-table-operate__slot 宽度为 auto,CSS 收口 auto =
|
|
187
|
-
"
|
|
188
|
-
"
|
|
185
|
+
"「更多」折叠槽前必须有分割线:组件出厂模板只在平铺按钮之间渲染 divider(v-if=\"i > 0\"),平铺末位与「更多」槽之间无分割线元素——效果图口径是每个按钮之间都要有且等距,施工时须按 structure_ops 给「更多」槽前补 divider(或把「更多」并入 v-for 让 i 计数覆盖),缺线 = 最后一段间距失真。",
|
|
186
|
+
"等宽槽(--re-op-slot-w)是行间纵向对齐的唯一机制:设计层禁止覆写 .re-table-operate__slot 宽度为 auto,CSS 收口 auto = 各行按钮漂移、竖线间距不一致。",
|
|
187
|
+
"⚠槽宽三态判定(与 data_channels.slot_width 配套):①**默认=动态自适应**——组件按最长文案自动推算槽宽,变更集不声明 slot_width、业务页不传 slot-min-width(设计只管 divider 几何;钉死固定值 = 短文案按钮残白堆到分割线前侧、线距视觉不等);②**例外=统一槽宽**——设计效果图明确所有操作列等宽网格时才声明 slot_width,施工落业务页 prop 禁 CSS 仿冒;③**机制不可 CSS 化**——无论哪态,禁在设计层覆写 __slot 宽度。判据一句话:**槽宽是内容推算的机制值,不是设计声明值;设计声明divider,不声明槽宽**。",
|
|
188
|
+
"⚠对齐语义两级契约:**容器级 flex-start + 槽内 center**。①容器级(.re-table-operate)必须 justify-content: flex-start——按钮数不同的行(2 项 vs 3 项)整组从左起点排布,行组不漂移;容器级 center 会导致槽边界漂移、竖线竖向错位,禁用。②槽内级(.re-table-operate__slot 与槽内 .el-button)必须 justify-content: center——等宽槽宽按最长文案推算(如「更多」3 字=60px),2 字按钮(28px)靠左会把 32px 残白全堆到分割线前侧 → 线前 40px/线后 8px 视觉不等距(竖线贴右按钮);居中后 divider_margin_x 两侧对称才成立。行间第 N 项对齐由**等宽槽边界**保证(槽宽全行统一),不受槽内对齐影响——槽内对齐不可沿用容器级的 flex-start。"
|
|
189
189
|
],
|
|
190
190
|
"priority": {
|
|
191
191
|
"strategy": "scope_qualified",
|
|
@@ -279,7 +279,27 @@
|
|
|
279
279
|
{ "kind": "class", "layer": "host", "target": ".vts-table-area .el-table__cell.col-index" },
|
|
280
280
|
{ "kind": "class", "layer": "inner", "target": ".vts-table-area .el-table__cell.col-index > .cell" }
|
|
281
281
|
],
|
|
282
|
-
"$note": "
|
|
282
|
+
"$note": "序号列宽度由设计侧给出意图(§11.131):固定 → structure_ops 在列定义绑定 class-name=col-index 并设 width prop;自适应 → 设 min-width prop。两种都必须显式声明,禁 CSS 收口 width(对表格列无效)。不声明 = 该列被相邻固定宽列挤压。"
|
|
283
|
+
},
|
|
284
|
+
"admin.content.table.column_width": {
|
|
285
|
+
"type": "element",
|
|
286
|
+
"selector": ".vts-table-area .el-table__cell",
|
|
287
|
+
"file": "业务 views(el-table-column 的 width / min-width prop;禁止写 CSS)",
|
|
288
|
+
"style_scope": ".vts-page-card",
|
|
289
|
+
"data_channels": {
|
|
290
|
+
"column_width": "固定宽通道:逐列映射到 el-table-column 的 width prop(该列不参与剩余空间分配)",
|
|
291
|
+
"min_width": "伸缩下限通道:逐列映射到 min-width prop(按比例吃剩余空间,容器不足时保住下限并触发横向滚动)",
|
|
292
|
+
"budget": "容器预算通道:Σ(width) + Σ(min-width) 与容器可用宽的比对结论(设计侧先算,项目侧据此决定是否启用横向滚动)"
|
|
293
|
+
},
|
|
294
|
+
"anchors": [
|
|
295
|
+
{ "kind": "class", "layer": "host", "target": ".vts-table-area .el-table__cell" }
|
|
296
|
+
],
|
|
297
|
+
"preconditions": [
|
|
298
|
+
"列宽必须落列定义(width / min-width prop),落 CSS 无效 —— 表格布局由列定义驱动,样式层写 width 对该列不产生效果。",
|
|
299
|
+
"每一列都必须给出宽度意图:既无 width 又无 min-width 的列,表格布局只能按出厂默认下限兜底,并被相邻固定宽列挤压。",
|
|
300
|
+
"伸缩列下限不得低于「表头文案宽 + 左右内边距」,否则表头文案会被压到换行或省略号截断。"
|
|
301
|
+
],
|
|
302
|
+
"$note": "列宽契约(list-page §11.132):逐列声明 width(固定)或 min_width(伸缩),二者必居其一;设计侧同时给出容器预算结论(Σ 列宽 vs 容器可用宽),预算不足时以横向滚动为唯一出口,禁止留给项目侧隐形压缩。"
|
|
283
303
|
},
|
|
284
304
|
"admin.content.table.cell_status": {
|
|
285
305
|
"type": "element",
|
|
@@ -387,13 +407,13 @@
|
|
|
387
407
|
],
|
|
388
408
|
"preconditions": [
|
|
389
409
|
"选择列由 el-table-column type=\"selection\" 渲染,Element Plus 自动在表头与单元格上加 el-table-column--selection 类——列未声明 type=selection 时本条目永不命中(项目源码实证:views/table/base/index.vue 已用 <el-table-column type=\"selection\" reserve-selection />)。",
|
|
390
|
-
"
|
|
410
|
+
"列宽经 admin.content.table.column_width 逐列声明(§11.132,width 或 min_width 必居其一);本条目只承载对齐与勾选态配色。"
|
|
391
411
|
],
|
|
392
412
|
"priority": {
|
|
393
413
|
"strategy": "scope_qualified",
|
|
394
414
|
"reason": "选择列无行内样式竞争,作用域限定到 .vts-page-card 即可覆盖。"
|
|
395
415
|
},
|
|
396
|
-
"$note": "设计意图(list-page §11.44
|
|
416
|
+
"$note": "设计意图(list-page §11.44 选择列):窄列、居中、勾选态用主题主色。勾选色走 EP 原生 --el-checkbox-* 令牌,随主题切换。"
|
|
397
417
|
},
|
|
398
418
|
"admin.content.table.row_density": {
|
|
399
419
|
"type": "element",
|
|
@@ -421,7 +441,7 @@
|
|
|
421
441
|
"strategy": "scope_qualified",
|
|
422
442
|
"reason": "单元格 padding 属全局样式,作用域限定到 .vts-page-card 即可覆盖。"
|
|
423
443
|
},
|
|
424
|
-
"$note": "设计意图(list-page §11.40
|
|
444
|
+
"$note": "设计意图(list-page §11.40 行密度):表格行高三档取一(宽松/默认/紧凑)。语义档位 loose/default/compact ↔ 出厂 size large/default/small,项目侧负责映射。"
|
|
425
445
|
},
|
|
426
446
|
"admin.content.table.area": {
|
|
427
447
|
"type": "component",
|
|
@@ -106,13 +106,14 @@
|
|
|
106
106
|
],
|
|
107
107
|
"preconditions": [
|
|
108
108
|
"出厂菜单项盒模型是「无横向 margin(margin: 4px 0)+ 胶囊用 inset 内缩」;指示条几何必须以这个宿主盒为基准计算偏移。照搬外部效果图上「依赖菜单项横向 margin」的负偏移量会落进容器外并被 overflow 裁掉(这是指示条「映射了却没效果」的根因:值搬了、让该值成立的宿主盒模型没搬)。",
|
|
109
|
-
"--vts-theme-menu-active-before 出厂为透明且全项目无消费者;声明 indicator_* 形态必须成对落地「关胶囊令牌 + 新建消费者」,只改色值不建消费者 = 未施工。"
|
|
109
|
+
"--vts-theme-menu-active-before 出厂为透明且全项目无消费者;声明 indicator_* 形态必须成对落地「关胶囊令牌 + 新建消费者」,只改色值不建消费者 = 未施工。",
|
|
110
|
+
"激活态作用层级(active_scope,默认 leaf):胶囊与指示条**只作用于叶子菜单项**(.el-menu-item.is-active)。可展开分组的标题(.el-sub-menu__title)在「其下有激活子项」时会被 EP 打上 is-active,**不得**继承胶囊与指示条——否则分组标题同时长出胶囊、竖条并与右侧展开箭头叠压。设计层写激活态时必须把选择器锚定叶子项,禁止把 .el-sub-menu.is-active > .el-sub-menu__title 与 .el-menu-item.is-active 并列写成同一组激活声明。"
|
|
110
111
|
],
|
|
111
112
|
"priority": {
|
|
112
113
|
"strategy": "deep_qualified",
|
|
113
114
|
"reason": "出厂 sidebar.scss 的胶囊规则用 !important,设计层需以同等或更高权重覆盖。"
|
|
114
115
|
},
|
|
115
|
-
"$note": "侧栏配色挂载点为 html[data-theme='xxx'](theme.scss 8 套预设);设计输出深色侧栏 → Theme=default + Version++(useTheme 规则),浅色 → Theme=light。⚠文本完整性红线:菜单项名称必须完整显示(el-menu 自带 ellipsis 折叠溢出菜单),禁止改 menu 文本截断/隐藏策略;item_height 加大时确认行高不挤压文字。宽度类改动(--sidebar-width)后必须目视验证长菜单名显示。⚠激活态出厂中性基线(禁止把某张图的结论写进源码):出厂形态 = pill 胶囊高亮;--vts-theme-menu-active-before 出厂默认 transparent 且**全项目无消费者**(死通道)。因此 form=indicator_* / pill_indicator_left 时必须在本条目 style_scope 内成对落地两件事才算施工完成——① 竖条消费者(form 不含 pill 时另需覆写 --vts-theme-menu-active-bg: transparent 关胶囊);② 在设计层文件(不可写出厂 sidebar.scss)新建 ::after/::before 消费者引用 var(--vts-theme-menu-active-before)。缺任一项 = 「映射了却没效果」。所有几何参数(方位/粗细/长度/圆角/内缩)取自变更集 style 字段,禁止写死 left:0 / 3px 等常量。⚠field_forms 硬闸(parser G7 机检):style 声明的字段必须被当前 form 消费——如 active_indicator_* 只在 indicator_* / pill_indicator_left 形态下有消费者,声明 pill 却带竖条字段 =
|
|
116
|
+
"$note": "侧栏配色挂载点为 html[data-theme='xxx'](theme.scss 8 套预设);设计输出深色侧栏 → Theme=default + Version++(useTheme 规则),浅色 → Theme=light。⚠文本完整性红线:菜单项名称必须完整显示(el-menu 自带 ellipsis 折叠溢出菜单),禁止改 menu 文本截断/隐藏策略;item_height 加大时确认行高不挤压文字。宽度类改动(--sidebar-width)后必须目视验证长菜单名显示。⚠激活态出厂中性基线(禁止把某张图的结论写进源码):出厂形态 = pill 胶囊高亮;--vts-theme-menu-active-before 出厂默认 transparent 且**全项目无消费者**(死通道)。因此 form=indicator_* / pill_indicator_left 时必须在本条目 style_scope 内成对落地两件事才算施工完成——① 竖条消费者(form 不含 pill 时另需覆写 --vts-theme-menu-active-bg: transparent 关胶囊);② 在设计层文件(不可写出厂 sidebar.scss)新建 ::after/::before 消费者引用 var(--vts-theme-menu-active-before)。缺任一项 = 「映射了却没效果」。所有几何参数(方位/粗细/长度/圆角/内缩)取自变更集 style 字段,禁止写死 left:0 / 3px 等常量。⚠field_forms 硬闸(parser G7 机检):style 声明的字段必须被当前 form 消费——如 active_indicator_* 只在 indicator_* / pill_indicator_left 形态下有消费者,声明 pill 却带竖条字段 = 字段被静默丢弃(如声明 pill 却带 active_indicator_* 竖条字段,竖条令牌会被设计层置透明 → 效果图要求的左竖条消失)。"
|
|
116
117
|
},
|
|
117
118
|
"admin.layout.sidebar.menu_item_icon": {
|
|
118
119
|
"type": "element",
|
|
@@ -178,7 +179,7 @@
|
|
|
178
179
|
"align_items": "align-items"
|
|
179
180
|
},
|
|
180
181
|
"preconditions": [
|
|
181
|
-
"顶栏内容垂直居中:--header-height 变更(如 54px)后,宿主 .navbar 必须显式 align-items: center——出厂顶栏内元素高度不一(折叠钮 40px / 文字行 /
|
|
182
|
+
"顶栏内容垂直居中:--header-height 变更(如 54px)后,宿主 .navbar 必须显式 align-items: center——出厂顶栏内元素高度不一(折叠钮 40px / 文字行 / 头像),不显式声明会整体偏上。"
|
|
182
183
|
]
|
|
183
184
|
},
|
|
184
185
|
"admin.layout.header.logo_area": {
|
|
@@ -211,7 +212,7 @@
|
|
|
211
212
|
],
|
|
212
213
|
"priority": {
|
|
213
214
|
"strategy": "deep_qualified",
|
|
214
|
-
"reason": "出厂组件自身 scoped
|
|
215
|
+
"reason": "出厂组件自身 scoped 规则与设计层同权重,仅靠后置加载顺序不可靠;显隐收口与样式覆盖都必须显式提权(面包屑 display:none 被同权重 scoped 规则反压即属此类)。"
|
|
215
216
|
},
|
|
216
217
|
"$note": "分隔符为结构属性(breadcrumb separator 字符),不在样式映射范围"
|
|
217
218
|
},
|
|
@@ -223,11 +224,18 @@
|
|
|
223
224
|
"style_scope": ".navbar",
|
|
224
225
|
"forms": {
|
|
225
226
|
"icon_only": "出厂现状:纯图标触发器(.language-trigger > .language-icon),下拉菜单选语言",
|
|
226
|
-
"inline_switch": "
|
|
227
|
+
"inline_switch": "并排切换形态:中 / EN 平铺在触发器内,点击即切换。**落地必须成套三件事**——① 显并排文字(.language-text 由隐藏改可见);② 收口图标(suppress icon_only);③ **收口下拉浮层**(suppress dropdown_popper:出厂 ElDropdown 的 popper 必须不再弹出,否则点触发器会从下方展开 English/中文 浮层遮挡页签栏)。缺③ = 形态未落地(只加了文字、交互仍是下拉)"
|
|
227
228
|
},
|
|
228
229
|
"suppress_rules": {
|
|
229
|
-
"inline_switch": ["icon_only"]
|
|
230
|
+
"inline_switch": ["icon_only", "dropdown_popper"]
|
|
230
231
|
},
|
|
232
|
+
"structure_ops_required": {
|
|
233
|
+
"inline_switch": ["收口 ElDropdown 触发(改 trigger 为不可弹出 / 移除 dropdown 插槽消费 / 用保形 v-if 切换为直选按钮任一),使点击不再产生浮层"]
|
|
234
|
+
},
|
|
235
|
+
"preconditions": [
|
|
236
|
+
"语言切换的形态由 form 决定,且 form 是「加法 + 减法」成对语义:inline_switch 不仅要新增并排文字,还必须收口出厂的下拉浮层与图标形态。只加不减时,浮层仍会弹出(触发器与浮层二者并存),视觉上从触发器下方展开的浮层会压住页签栏。",
|
|
237
|
+
"浮层属 teleport 到 body 的 popper,样式层无法收口(.language-trigger 上的规则管不到 popper);必须从结构层收口 ElDropdown 的触发行为。"
|
|
238
|
+
],
|
|
231
239
|
"css_vars": {
|
|
232
240
|
"icon_color": "--el-text-color-regular",
|
|
233
241
|
"hover_bg": "--el-fill-color-light"
|
|
@@ -242,7 +250,7 @@
|
|
|
242
250
|
"text_font_size": "font-size",
|
|
243
251
|
"text_color": "color"
|
|
244
252
|
},
|
|
245
|
-
"$note": "inline_switch 并排切换形态:下拉项平铺为触发器旁切换组,按 v-if
|
|
253
|
+
"$note": "inline_switch 并排切换形态:下拉项平铺为触发器旁切换组,按 v-if 保形切换增量插入,不删原代码;同时收口图标形态与下拉浮层(浮层属 teleport popper,样式层管不到,必须结构收口)。"
|
|
246
254
|
},
|
|
247
255
|
"admin.layout.header.collapse_trigger": {
|
|
248
256
|
"type": "element",
|
|
@@ -399,8 +407,8 @@
|
|
|
399
407
|
"preconditions": [
|
|
400
408
|
"容器内边距出厂由组件样式给出(非 0),设计要求「内边距归零、首页页签与折叠按钮左对齐」时必须显式声明 padding_inline,不声明即保留出厂值(这是「首页页签不贴左缘」的根因)。",
|
|
401
409
|
"⚠ShowModel 运行时缓存坑:showModel 经 responsive-storage 持久化于 localStorage(命名空间 responsive-),platform-config.json 改 ShowModel 后**旧缓存仍生效**——项目侧施工 ShowModel 时必须同步清 localStorage(或 Version++ 触发响应式存储失效),否则模板代码已换、运行时仍渲染旧形态,页签「样式完全不对」多半是缓存残留而非映射失败。施工后验证口径:浏览器 DevTools Application→Local Storage 清 responsive-* 键后刷新再比对。",
|
|
402
|
-
"⚠ShowModel
|
|
403
|
-
"⚠ShowModel 三件套硬闸(
|
|
410
|
+
"⚠ShowModel 三分支运行时兜底:useTags.ts 实证 showModel 读取链 = localStorage → fallback **'smart'**(platform-config 的 ShowModel 只在 storage 初始化时生效);而模板 DOM 只实现 chrome / card 两分支(v-if / v-else-if),smart 落入 v-else 裸分支——**无 .card-item / .card-tab 类**,锚定 card 结构的设计层规则全部不命中,仅锚定 .scroll-item 的规则(分割线等)命中 → 同一页签栏「半新半旧」混合观感(如底色块残留 + 分割线在)。因此 form=flat 施工必须**三分支全覆盖**:① 锚定 .card-item / .card-tab 的规则之外,同步给出锚定 .scroll-item 直系(不限形态类)的兜底规则(盒几何/底色透明/激活态),或在词典 preconditions 声明「ShowModel 须确保运行时为 card」(清缓存 + platform-config 双写)——二选一必须做,只写 card 锚点 = smart 残余分支裸奔。",
|
|
411
|
+
"⚠ShowModel 三件套硬闸(G4 T 通道施工必须项):仅改 platform-config.ShowModel **不生效**——showModel 读 localStorage,而 localStorage 只在 platform-config.Version 变化时经 responsive.ts invalidateStorageIfConfigVersionChanged 重灌(只改 ShowModel=card 而 Version 未变,浏览器会残留 chrome 形态缓存 → card/smart 兜底规则双双不命中、页签零变化)。form 涉及页签形态时施工三件套缺一不可:① platform-config.ShowModel = form 对应值(flat→card);② platform-config.Version 自增一位(0.0.5→0.0.6,触发缓存失效重灌);③ 渲染取证断言 .scroll-item.card-item 实际挂载(DevTools 或 DOM 断言),不许只看代码改没改。漏②=代码对但运行时仍旧形态;漏③=无渲染证据自嗨绿。"
|
|
404
412
|
],
|
|
405
413
|
"priority": {
|
|
406
414
|
"strategy": "deep_qualified",
|
|
@@ -414,7 +422,7 @@
|
|
|
414
422
|
"file": "src/layout/components/lay-tag/index.vue(首页页签 = multiTags 首项;真实 DOM 无 .home-item 类)",
|
|
415
423
|
"style_scope": ".tags-view",
|
|
416
424
|
"forms": {
|
|
417
|
-
"icon_only": "出厂默认:首位渲染 home 图标(meta.icon 缺省回退 'home'
|
|
425
|
+
"icon_only": "出厂默认:首位渲染 home 图标(meta.icon 缺省回退 'home'),无标题文字。**落地必须成对:显图标 + 隐标题**——项宽固定 40px,图标与标题共存时标题会被挤成截断(如「工作台」→「工…」)。隐标题经 text_visible 字段(display)落 .card-tab 标题元素;只显图标不收标题 = 形态未落地",
|
|
418
426
|
"text": "纯文字首位页签(隐藏图标且不占位)"
|
|
419
427
|
},
|
|
420
428
|
"$comment": "真实 DOM:.scroll-item(首项)> .card-tab,图标经 resolveCardTabIcon 渲染 svg-icon.card-tab-icon。出厂解析规则是数据驱动的:index===0 回退 'home',其余按 meta.icon 有无渲染(空则不渲染不占位)——因此「有无图标」是-menu 数据/变更集可动态决定的,不是源码常量。尺寸类意图(如 40×40)由变更集 style 字段给出,词典不预设具体设计值。",
|
|
@@ -422,12 +430,17 @@
|
|
|
422
430
|
"width": "--vts-tag-card-height",
|
|
423
431
|
"height": "--vts-tag-card-height"
|
|
424
432
|
},
|
|
433
|
+
"sub_selectors": {
|
|
434
|
+
"icon": ".card-tab .card-tab-icon",
|
|
435
|
+
"title": ".card-tab .tag-title"
|
|
436
|
+
},
|
|
425
437
|
"custom_style_map": {
|
|
426
438
|
"icon_size": "font-size",
|
|
427
439
|
"icon_color": "color",
|
|
428
|
-
"divider_color": "border-left-color"
|
|
440
|
+
"divider_color": "border-left-color",
|
|
441
|
+
"text_visible": "display"
|
|
429
442
|
},
|
|
430
|
-
"$note": "divider(首页页签与首个业务页签间的 1px 竖线分割)属子元素结构样式,设计侧通过 divider_color 表达视觉意图。落地口径:首页页签项宽=高=--vts-tag-card-height(40px) 居中,经 .tags-view .scroll-item:nth-child(1) 覆写 padding
|
|
443
|
+
"$note": "divider(首页页签与首个业务页签间的 1px 竖线分割)属子元素结构样式,设计侧通过 divider_color 表达视觉意图。落地口径:首页页签项宽=高=--vts-tag-card-height(40px) 居中,经 .tags-view .scroll-item:nth-child(1) 覆写 padding 实现正方形图标钮;icon_only 形态必须同时把标题收口(text_visible=none),否则 40px 内图标+标题并存、标题被截断。"
|
|
431
444
|
},
|
|
432
445
|
"admin.layout.tabs.item": {
|
|
433
446
|
"type": "element",
|
|
@@ -464,7 +477,7 @@
|
|
|
464
477
|
],
|
|
465
478
|
"priority": {
|
|
466
479
|
"strategy": "deep_qualified",
|
|
467
|
-
"reason": "关闭钮透明度等出厂规则写在组件 scoped
|
|
480
|
+
"reason": "关闭钮透明度等出厂规则写在组件 scoped 内且权重与设计层相当,仅靠后置加载顺序不可靠(声明 0.45 常显会被 scoped 的 opacity:0 反压、只在 hover 才显),必须显式提权。"
|
|
468
481
|
},
|
|
469
482
|
"$note": "card 形态专属令牌挂在父级 admin.layout.tabs 的 css_vars(整组切换);本条目为页签项级字段补充。chrome 形态梯形样式为模板结构样式,不走样式映射"
|
|
470
483
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qilitt-mickey/vue3-temp-skill",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.64",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vue 3 企业级中后台项目开发规范技能包 — core-kernel 架构、按需功能模块",
|
|
6
6
|
"bin": {
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"check": "node scripts/check.mjs",
|
|
31
31
|
"prepack": "node scripts/check.mjs",
|
|
32
32
|
"validate": "node scripts/validate.mjs",
|
|
33
|
+
"audit": "node scripts/design-audit.mjs",
|
|
33
34
|
"match": "python scripts/match.py",
|
|
34
35
|
"match:batch": "python scripts/match.py --batch",
|
|
35
36
|
"mapping:build": "node parser/index.js build",
|
package/parser/index.js
CHANGED
|
@@ -48,11 +48,10 @@ const ID_RE_STRICT = /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*){1,3}$/;
|
|
|
48
48
|
/**
|
|
49
49
|
* 内层盒属性族(changeset-schema §layer):这些文本控制/行高/对齐类属性必须落在 inner 层
|
|
50
50
|
* 才生效。根因:Element Plus 给内层文本盒 .cell 写了 white-space:normal / text-align 等出厂
|
|
51
|
-
* 样式,写在宿主盒(th/td)上会被内层覆盖 ——
|
|
51
|
+
* 样式,写在宿主盒(th/td)上会被内层覆盖 —— 这是「表头/内容竖排换行」的根因。
|
|
52
52
|
* 本集合作两处消费:
|
|
53
53
|
* ① resolveAnchorTarget —— 命中即把该字段自动路由到 inner 锚点(保底落点,杜绝静默落 host);
|
|
54
54
|
* ② checkInnerOnlyProps 闸门 —— 条目缺 inner 锚点却声明了此类字段时,报词典完整性缺口。
|
|
55
|
-
* (此前为死常量,从未被任何闸引用,导致 nowrap/text_align 可裸声明落 host 被覆盖。)
|
|
56
55
|
*/
|
|
57
56
|
const INNER_ONLY_PROPS = new Set(["white_space", "text_overflow", "overflow", "word_break", "text_align", "line_height", "vertical_align", "nowrap", "text_align_last"]);
|
|
58
57
|
/** 几何字段(宿主内边距/外边距族):落 host 时与出厂内层盒自带 padding 叠加,必须同步清零内层(G5) */
|
|
@@ -1505,7 +1504,7 @@ function checkInnerOnlyProps(change, entry, idLabel, violations) {
|
|
|
1505
1504
|
violations.push(
|
|
1506
1505
|
`${idLabel}.anchors 完整性缺口:条目 style 声明了内层盒属性族 [${offenders.join("、")}]`
|
|
1507
1506
|
+ `(文本控制/行高/对齐类,必须落 inner 层才不被 EP 内层 .cell 出厂样式覆盖),`
|
|
1508
|
-
+ `但本条目 anchors 无 inner 锚点 ——
|
|
1507
|
+
+ `但本条目 anchors 无 inner 锚点 —— 这些字段无处可落,将出现「竖排换行 / 对齐失效」。`
|
|
1509
1508
|
+ `修复:在 anchors 补 { kind:"class", layer:"inner", target:"… > .cell" } 承载选择器。`,
|
|
1510
1509
|
);
|
|
1511
1510
|
}
|