@qilitt-mickey/vue3-temp-skill 1.1.74 → 1.1.76

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.
Files changed (65) hide show
  1. package/SKILL.md +137 -137
  2. package/mapping/basic/color.json +35 -35
  3. package/mapping/basic/radius.json +17 -17
  4. package/mapping/basic/semantic-values.json +72 -72
  5. package/mapping/basic/spacing.json +21 -21
  6. package/mapping/basic/typography.json +21 -21
  7. package/mapping/component/button.json +90 -90
  8. package/mapping/component/card.json +31 -31
  9. package/mapping/component/input.json +42 -42
  10. package/mapping/component/overlay.json +79 -79
  11. package/mapping/component/pagination.json +34 -34
  12. package/mapping/component/table.json +42 -42
  13. package/mapping/component/tag.json +48 -48
  14. package/mapping/layout/breakpoint.json +20 -20
  15. package/mapping/scenes/admin/content.json +497 -494
  16. package/mapping/scenes/admin/layout.json +577 -574
  17. package/package.json +1 -1
  18. package/parser/fixtures/changeset-legacy.json +11 -11
  19. package/parser/fixtures/changeset-neg1.json +8 -8
  20. package/parser/fixtures/changeset-neg2.json +10 -10
  21. package/parser/fixtures/changeset-neg3.json +22 -22
  22. package/parser/fixtures/changeset-neg5-g8-stub.json +26 -26
  23. package/parser/fixtures/changeset-neg7-g10-dims.json +57 -57
  24. package/parser/fixtures/changeset-neg9-g6-token-chain.json +34 -0
  25. package/parser/fixtures/changeset-pos-g6-token-chain.json +35 -0
  26. package/parser/fixtures/changeset-pos-theme-nometa.json +260 -260
  27. package/parser/fixtures/changeset-registry-gap.json +29 -29
  28. package/parser/fixtures/fake-project/src/styles/app.scss +5 -5
  29. package/parser/fixtures/fake-project/src/views/list.vue +13 -13
  30. package/parser/fixtures/registry-bad.json +11 -11
  31. package/parser/fixtures/registry-g6-token-chain.json +10 -0
  32. package/parser/fixtures/verify/actual-clean.json +35 -35
  33. package/parser/fixtures/verify/actual.json +33 -33
  34. package/parser/fixtures/verify/mockup-g6-content.html +12 -0
  35. package/parser/fixtures/verify/mockup-neutral.html +26 -26
  36. package/parser/fixtures/verify/mockup-nometa.html +26 -26
  37. package/parser/fixtures/verify/snapshot-latest.json +102 -102
  38. package/parser/index.js +32 -1
  39. package/parser/loader.js +66 -66
  40. package/parser/validator.js +206 -206
  41. package/references/auth-pages.md +217 -217
  42. package/references/base-code-dict.md +56 -56
  43. package/references/data-compare.md +509 -509
  44. package/references/data-writeback.md +124 -124
  45. package/references/design-apply.md +167 -167
  46. package/references/detail-page.md +119 -119
  47. package/references/download-export.md +97 -97
  48. package/references/feedback-loading.md +104 -104
  49. package/references/feedback-ui.md +134 -134
  50. package/references/i18n-localization.md +230 -230
  51. package/references/layout-theme.md +2 -0
  52. package/references/project-inventory.md +438 -438
  53. package/references/rich-text.md +94 -94
  54. package/references/seamless-scroll.md +47 -47
  55. package/references/steps/step0-preflight.md +58 -58
  56. package/references/steps/step1-match.md +5 -2
  57. package/references/steps/step3-style.md +38 -33
  58. package/references/steps/step3b-shell.md +2 -0
  59. package/references/steps/step3c-priority.md +26 -26
  60. package/references/steps/step4-l3.md +14 -14
  61. package/references/steps/step5-gates.md +65 -63
  62. package/references/steps/step6-verify.md +77 -77
  63. package/references/verify-captcha.md +119 -119
  64. package/scripts/check.mjs +24 -0
  65. package/scripts/design-audit.mjs +208 -3
@@ -1,94 +1,94 @@
1
- ---
2
- name: rich-text
3
- description: '@wangeditor/editor + ReRichText 富文本使用方式、图片/视频上传'
4
- scope: project
5
- tags: [富文本, wangeditor, ReRichText, 编辑器, Markdown]
6
- ---
7
-
8
- # 富文本编辑器
9
-
10
- > 按本文件示例编写;富文本使用选型表中的 `@wangeditor/editor` + `ReRichText`,勿改用 Quill / TinyMCE 等;新依赖须待确认。
11
-
12
- 规范 wangEditor 富文本编辑器 ReRichText 的使用,含图片/视频上传与 v-model 同步。在需要富文本录入时参照。
13
-
14
- ## 依赖(缺则先装)
15
-
16
- | 包 | 版本 |
17
- |---|---|
18
- | `@wangeditor/editor` | `5.1.23` |
19
-
20
- ```bash
21
- pnpm add @wangeditor/editor@5.1.23
22
- ```
23
-
24
- 装包后按 **`addon-enable.md` 章节 C**:移除 `tsconfig exclude` 中 `ReRichText/**`,再引用组件。
25
-
26
- ## 组件
27
-
28
- 使用 `ReRichText` 封装 `@wangeditor/editor`。
29
-
30
- ```vue
31
- <script setup lang="ts">
32
- import ReRichText from "@/components/ReRichText";
33
-
34
- const content = ref("");
35
- const attachmentIds = ref<string[]>([]);
36
- </script>
37
-
38
- <template>
39
- <ReRichText
40
- v-model="content"
41
- v-model:attachment-ids="attachmentIds"
42
- :height="300"
43
- placeholder="请输入内容"
44
- :toolbar-config="{ excludeKeys: ['insertImage', 'insertVideo'] }"
45
- :upload-params="{ bizKey: 'news_001', projectStage: 'draft' }"
46
- />
47
- </template>
48
- ```
49
-
50
- ## Props
51
-
52
- | Prop | 类型 | 默认值 | 说明 |
53
- | ----------------- | ------------------ | ------------------------------------------------- | ---------------- |
54
- | `modelValue` | `string` | `''` | HTML 内容 |
55
- | `height` | `string \| number` | `300` | 编辑器高度 |
56
- | `placeholder` | `string` | `'请输入内容'` | 占位文案 |
57
- | `disabled` | `boolean` | `false` | 只读模式 |
58
- | `uploadImagePath` | `string` | `'/documentInfo/uploadFile'` | 图片上传接口路径 |
59
- | `uploadVideoPath` | `string` | `'/documentInfo/uploadFile'` | 视频上传接口路径 |
60
- | `bizKey` | `string` | `''` | 业务主键 |
61
- | `projectStage` | `string` | `''` | 附件阶段 |
62
- | `uploadParams` | `object` | `{}` | 上传额外参数 |
63
- | `toolbarConfig` | `object` | `{ excludeKeys: ['insertImage', 'insertVideo'] }` | 工具栏配置 |
64
-
65
- ## Events
66
-
67
- - `update:modelValue(html)`:内容同步。
68
- - `change(html)`:内容变化回调。
69
-
70
- ## 上传模式
71
-
72
- 当前启用 **自定义上传**(`customUpload`),通过项目统一 `getUploadUrl` 接口上传:
73
-
74
- ```typescript
75
- // 关键参数
76
- {
77
- multipartFile: file,
78
- ...uploadParams,
79
- bizKey,
80
- projectStage,
81
- attachmentType: 'news_image',
82
- fileType: getFileType(file.name),
83
- operatorCode: userStore.userCode || ''
84
- }
85
- ```
86
-
87
- 如需切换为 wangEditor 默认 server 模式,注释 `customUpload` 并开放 `server`、`customInsert` 等配置。
88
-
89
- ## 关键约定
90
-
91
- 1. 编辑器实例在 `onBeforeUnmount` 中销毁,避免内存泄漏。
92
- 2. 空内容使用 `editor.isEmpty()` 判断,图片/视频等非文本场景也能正确处理。
93
- 3. 上传成功后会将附件 ID 追加到 `attachmentIds`,用于业务关联。
94
- 4. 全屏编辑时自动启用编辑器,退出后恢复 `disabled` 状态。
1
+ ---
2
+ name: rich-text
3
+ description: '@wangeditor/editor + ReRichText 富文本使用方式、图片/视频上传'
4
+ scope: project
5
+ tags: [富文本, wangeditor, ReRichText, 编辑器, Markdown]
6
+ ---
7
+
8
+ # 富文本编辑器
9
+
10
+ > 按本文件示例编写;富文本使用选型表中的 `@wangeditor/editor` + `ReRichText`,勿改用 Quill / TinyMCE 等;新依赖须待确认。
11
+
12
+ 规范 wangEditor 富文本编辑器 ReRichText 的使用,含图片/视频上传与 v-model 同步。在需要富文本录入时参照。
13
+
14
+ ## 依赖(缺则先装)
15
+
16
+ | 包 | 版本 |
17
+ |---|---|
18
+ | `@wangeditor/editor` | `5.1.23` |
19
+
20
+ ```bash
21
+ pnpm add @wangeditor/editor@5.1.23
22
+ ```
23
+
24
+ 装包后按 **`addon-enable.md` 章节 C**:移除 `tsconfig exclude` 中 `ReRichText/**`,再引用组件。
25
+
26
+ ## 组件
27
+
28
+ 使用 `ReRichText` 封装 `@wangeditor/editor`。
29
+
30
+ ```vue
31
+ <script setup lang="ts">
32
+ import ReRichText from "@/components/ReRichText";
33
+
34
+ const content = ref("");
35
+ const attachmentIds = ref<string[]>([]);
36
+ </script>
37
+
38
+ <template>
39
+ <ReRichText
40
+ v-model="content"
41
+ v-model:attachment-ids="attachmentIds"
42
+ :height="300"
43
+ placeholder="请输入内容"
44
+ :toolbar-config="{ excludeKeys: ['insertImage', 'insertVideo'] }"
45
+ :upload-params="{ bizKey: 'news_001', projectStage: 'draft' }"
46
+ />
47
+ </template>
48
+ ```
49
+
50
+ ## Props
51
+
52
+ | Prop | 类型 | 默认值 | 说明 |
53
+ | ----------------- | ------------------ | ------------------------------------------------- | ---------------- |
54
+ | `modelValue` | `string` | `''` | HTML 内容 |
55
+ | `height` | `string \| number` | `300` | 编辑器高度 |
56
+ | `placeholder` | `string` | `'请输入内容'` | 占位文案 |
57
+ | `disabled` | `boolean` | `false` | 只读模式 |
58
+ | `uploadImagePath` | `string` | `'/documentInfo/uploadFile'` | 图片上传接口路径 |
59
+ | `uploadVideoPath` | `string` | `'/documentInfo/uploadFile'` | 视频上传接口路径 |
60
+ | `bizKey` | `string` | `''` | 业务主键 |
61
+ | `projectStage` | `string` | `''` | 附件阶段 |
62
+ | `uploadParams` | `object` | `{}` | 上传额外参数 |
63
+ | `toolbarConfig` | `object` | `{ excludeKeys: ['insertImage', 'insertVideo'] }` | 工具栏配置 |
64
+
65
+ ## Events
66
+
67
+ - `update:modelValue(html)`:内容同步。
68
+ - `change(html)`:内容变化回调。
69
+
70
+ ## 上传模式
71
+
72
+ 当前启用 **自定义上传**(`customUpload`),通过项目统一 `getUploadUrl` 接口上传:
73
+
74
+ ```typescript
75
+ // 关键参数
76
+ {
77
+ multipartFile: file,
78
+ ...uploadParams,
79
+ bizKey,
80
+ projectStage,
81
+ attachmentType: 'news_image',
82
+ fileType: getFileType(file.name),
83
+ operatorCode: userStore.userCode || ''
84
+ }
85
+ ```
86
+
87
+ 如需切换为 wangEditor 默认 server 模式,注释 `customUpload` 并开放 `server`、`customInsert` 等配置。
88
+
89
+ ## 关键约定
90
+
91
+ 1. 编辑器实例在 `onBeforeUnmount` 中销毁,避免内存泄漏。
92
+ 2. 空内容使用 `editor.isEmpty()` 判断,图片/视频等非文本场景也能正确处理。
93
+ 3. 上传成功后会将附件 ID 追加到 `attachmentIds`,用于业务关联。
94
+ 4. 全屏编辑时自动启用编辑器,退出后恢复 `disabled` 状态。
@@ -1,47 +1,47 @@
1
- ---
2
- name: seamless-scroll
3
- description: ReSeamlessScroll 无缝滚动、classOption、关键滚动约定
4
- scope: project
5
- tags: [无缝滚动, 跑马灯, marquee, 滚动公告, 滚动通知]
6
- ---
7
-
8
- # 无缝滚动
9
-
10
- > 按本文件示例编写,复用项目已有 `ReSeamlessScroll` 等封装,勿另起一套滚动实现。
11
-
12
- 规范无缝滚动、无限滚动列表与轮播滚动效果。在需要公告栏、排行榜、滚动列表时参照。
13
-
14
- ## 组件
15
-
16
- 使用 `ReSeamlessScroll` 实现无缝滚动:
17
-
18
- ```vue
19
- <ReSeamlessScroll :data="list" :class-option="classOption">
20
- <ul>
21
- <li v-for="item in list" :key="item.id">
22
- {{ item.title }}
23
- </li>
24
- </ul>
25
- </ReSeamlessScroll>
26
- ```
27
-
28
- ## 常用配置
29
-
30
- ```typescript
31
- const classOption = {
32
- step: 1, // 步长
33
- limitMoveNum: 5, // 启动滚动的最小数据量
34
- hoverStop: true, // 鼠标悬停停止
35
- direction: "top", // top | bottom | left | right
36
- singleHeight: 0, // 单步停顿高度
37
- singleWidth: 0,
38
- waitTime: 1000, // 单步停顿时间
39
- autoPlay: true,
40
- };
41
- ```
42
-
43
- ## 关键约定
44
-
45
- 1. 数据量小于 `limitMoveNum` 时不滚动。
46
- 2. 水平滚动时内容需要足够宽;垂直滚动时容器需要固定高度。
47
- 3. 组件内部会复制一份内容实现无缝效果,DOM 操作-heavy 场景避免数据频繁更新。
1
+ ---
2
+ name: seamless-scroll
3
+ description: ReSeamlessScroll 无缝滚动、classOption、关键滚动约定
4
+ scope: project
5
+ tags: [无缝滚动, 跑马灯, marquee, 滚动公告, 滚动通知]
6
+ ---
7
+
8
+ # 无缝滚动
9
+
10
+ > 按本文件示例编写,复用项目已有 `ReSeamlessScroll` 等封装,勿另起一套滚动实现。
11
+
12
+ 规范无缝滚动、无限滚动列表与轮播滚动效果。在需要公告栏、排行榜、滚动列表时参照。
13
+
14
+ ## 组件
15
+
16
+ 使用 `ReSeamlessScroll` 实现无缝滚动:
17
+
18
+ ```vue
19
+ <ReSeamlessScroll :data="list" :class-option="classOption">
20
+ <ul>
21
+ <li v-for="item in list" :key="item.id">
22
+ {{ item.title }}
23
+ </li>
24
+ </ul>
25
+ </ReSeamlessScroll>
26
+ ```
27
+
28
+ ## 常用配置
29
+
30
+ ```typescript
31
+ const classOption = {
32
+ step: 1, // 步长
33
+ limitMoveNum: 5, // 启动滚动的最小数据量
34
+ hoverStop: true, // 鼠标悬停停止
35
+ direction: "top", // top | bottom | left | right
36
+ singleHeight: 0, // 单步停顿高度
37
+ singleWidth: 0,
38
+ waitTime: 1000, // 单步停顿时间
39
+ autoPlay: true,
40
+ };
41
+ ```
42
+
43
+ ## 关键约定
44
+
45
+ 1. 数据量小于 `limitMoveNum` 时不滚动。
46
+ 2. 水平滚动时内容需要足够宽;垂直滚动时容器需要固定高度。
47
+ 3. 组件内部会复制一份内容实现无缝效果,DOM 操作-heavy 场景避免数据频繁更新。
@@ -1,58 +1,58 @@
1
- # design-apply · 第 0 步 · 版本与场景检查 · 对接匹配(适配前置)· 运行时清场
2
-
3
- > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:每次落地开工前(版本/场景/对接匹配/运行时清场三件套)。
4
-
5
- ---
6
-
7
- ### 第 0 步 · 版本与场景检查 · 对接匹配(适配前置)· 运行时清场
8
-
9
- **0.1 版本与场景检查**
10
-
11
- - 变更集 `schema` 版本不在支持范围 → 停止,向上游(用户/设计侧)报告版本不匹配,不降级猜测。
12
- - `scene` 在 `parser list` 场景清单中无对应域 → 报告并列出支持的场景,等待确认。
13
-
14
- **0.0 页面绑定检查(G13 页面绑定闸 · 先于一切施工)**
15
-
16
- - **默认口径(红线)**:效果图页面**默认映射到项目已有页面**——效果图页面(如「运单管理」)是设计侧为承载设计语言虚构的演示标题与角色坐标系(sid 标的是角色不是业务),**不是页面增量**。落地动作恒为「在已有页面上同步结构与样式」;**禁止因效果图新增页面 / 路由 / 菜单项**。
17
- - 变更集 `page_bindings` 显式声明 `target:"new"` 且 `notes` 申报的条目,才可在申报范围内走新增页面路径(L3 生成页面 + 路由 + 菜单);未声明或申报与动作不符 → 阻断并报告(不猜测、不默认放行)。
18
- - 对接动作:把效果图页面与项目已有页面的映射关系(mockup → target)写入交付说明;目标页面对不上、找不到合理已有页面承载时,先向用户确认映射,**不得以「图上有这个页面」为由新建**。
19
- - 判据一句话:换一张效果图不需要改项目的页面/路由/菜单清单 ⇒ 正确;效果图标题 ≠ 项目业务名,验收只比「结构与样式」不比「页面标题文字」。
20
-
21
- **0.2 对接匹配(适配前置)——把散落的匹配收拢为一个前置阶段**
22
-
23
- 在施工前,把「设计意图 ⇄ 模板能力」整体对一遍,输出匹配结论,供**生成前**决策(而不是落地时才发现对不上)。三步判定:
24
-
25
- | 级 | 判定 | 依据 |
26
- |---|---|---|
27
- | **布局级** | `layout_type` 命中标准枚举? | 命中 → 切布局模板池(§5.2);未命中 → 变体派生 / 定制生成骨架(§5.3 / §5.4) |
28
- | **点位级** | 逐 id 三级匹配 | 一级完整命中 / 二级父级命中 / 三级未命中(§4.1) |
29
- | **形态级** | `form` 在条目 `forms` 枚举内?`structure_ops` 所需 DOM 钩子是否存在? | 词典 `forms` / 模板源码 / `audit` |
30
-
31
- **输出三类结论,处置全在项目侧**:
32
-
33
- | 结论 | 判据 | 处置 |
34
- |---|---|---|
35
- | 完全匹配 | L1 ∧ form 在枚举 ∧ 无需结构 | 直接施工 |
36
- | 可派生 | L2 / 变体布局 / form 可映射 | 派生骨架或继承父级后施工 |
37
- | 需适配 | L3 / 定制布局 / 缺通道 / 需新 DOM | **先补通道 / 结构增量 / 生成骨架,再生成**;交付说明单列申报 |
38
-
39
- > **总原则(红线):设计为主,项目侧适配。** 设计效果是目标态,模板是待适配的一方。"设计 ↔ 模板对不上"的出口**永远在项目侧**——**不回流设计侧改设计**。只有「设计侧未给值 / 值非法」(**意图缺口**)才回流设计侧。严禁以「模板不支持」为由要求设计改图。
40
-
41
- **0.3 运行时主题清场(T 通道先于 D/S/C)**
42
-
43
- 主色 / 主题走的是**运行时通道**:`setEpThemeColor()` 把 `--el-color-primary` 写成 `documentElement` 的**内联样式**并持久化到 localStorage(读取优先级 = 浏览器持久化 ?? `platform-config.json`)。**内联样式 + 运行时持久化 ⇒ 设计层 CSS 与词典 selector 都赢不了。**
44
-
45
- - 落地前先读 localStorage(键 `responsive-layout`)的 `theme` / `epThemeColor`,与本变更集主题**不一致时清 key 或显式重设**;
46
- - 清场动作与结果写入交付说明(可回溯);
47
- - **不清场则颜色类差异全部失真**——归因前必须先确认起点已对齐,否则会把「环境残留」误判成「落地失败」。
48
- - **机检对账(G4)**:`parser audit` 会自动比对 `global.brand_primary` ↔ `platform-config.EpThemeColor`、页签 form ↔ `ShowModel`、`visible:false` ↔ 显隐开关,不一致即 `exit 1`——人工清场 + 机检对账双保险。
49
-
50
- **0.3b T 通道持久化三件套(页签形态 / 主题类字段施工必做)**
51
-
52
- 运行时配置读 localStorage,而 localStorage 只在 `platform-config.Version` 变化时经 `responsive.ts invalidateStorageIfConfigVersionChanged` 重灌。凡施工涉及 `ShowModel` / `Theme` / `EpThemeColor` 等 T 通道字段,**三件套缺一不可**:
53
-
54
- 1. 改 `platform-config.json` 实值(如 `ShowModel: "card"`);
55
- 2. **`Version` 自增一位**(如 0.0.6 → 0.0.7)——漏此步 = 代码对但运行时仍旧形态;
56
- 3. **渲染取证**:断言新形态类实际挂载(如 `.scroll-item.card-item` 出现在 DOM)——不许只看代码改没改。
57
-
58
- 词典 `admin.layout.tabs.preconditions` 有同款硬闸描述;本三件套对任意 T 通道字段通用。
1
+ # design-apply · 第 0 步 · 版本与场景检查 · 对接匹配(适配前置)· 运行时清场
2
+
3
+ > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:每次落地开工前(版本/场景/对接匹配/运行时清场三件套)。
4
+
5
+ ---
6
+
7
+ ### 第 0 步 · 版本与场景检查 · 对接匹配(适配前置)· 运行时清场
8
+
9
+ **0.1 版本与场景检查**
10
+
11
+ - 变更集 `schema` 版本不在支持范围 → 停止,向上游(用户/设计侧)报告版本不匹配,不降级猜测。
12
+ - `scene` 在 `parser list` 场景清单中无对应域 → 报告并列出支持的场景,等待确认。
13
+
14
+ **0.0 页面绑定检查(G13 页面绑定闸 · 先于一切施工)**
15
+
16
+ - **默认口径(红线)**:效果图页面**默认映射到项目已有页面**——效果图页面(如「运单管理」)是设计侧为承载设计语言虚构的演示标题与角色坐标系(sid 标的是角色不是业务),**不是页面增量**。落地动作恒为「在已有页面上同步结构与样式」;**禁止因效果图新增页面 / 路由 / 菜单项**。
17
+ - 变更集 `page_bindings` 显式声明 `target:"new"` 且 `notes` 申报的条目,才可在申报范围内走新增页面路径(L3 生成页面 + 路由 + 菜单);未声明或申报与动作不符 → 阻断并报告(不猜测、不默认放行)。
18
+ - 对接动作:把效果图页面与项目已有页面的映射关系(mockup → target)写入交付说明;目标页面对不上、找不到合理已有页面承载时,先向用户确认映射,**不得以「图上有这个页面」为由新建**。
19
+ - 判据一句话:换一张效果图不需要改项目的页面/路由/菜单清单 ⇒ 正确;效果图标题 ≠ 项目业务名,验收只比「结构与样式」不比「页面标题文字」。
20
+
21
+ **0.2 对接匹配(适配前置)——把散落的匹配收拢为一个前置阶段**
22
+
23
+ 在施工前,把「设计意图 ⇄ 模板能力」整体对一遍,输出匹配结论,供**生成前**决策(而不是落地时才发现对不上)。三步判定:
24
+
25
+ | 级 | 判定 | 依据 |
26
+ |---|---|---|
27
+ | **布局级** | `layout_type` 命中标准枚举? | 命中 → 切布局模板池(§5.2);未命中 → 变体派生 / 定制生成骨架(§5.3 / §5.4) |
28
+ | **点位级** | 逐 id 三级匹配 | 一级完整命中 / 二级父级命中 / 三级未命中(§4.1) |
29
+ | **形态级** | `form` 在条目 `forms` 枚举内?`structure_ops` 所需 DOM 钩子是否存在? | 词典 `forms` / 模板源码 / `audit` |
30
+
31
+ **输出三类结论,处置全在项目侧**:
32
+
33
+ | 结论 | 判据 | 处置 |
34
+ |---|---|---|
35
+ | 完全匹配 | L1 ∧ form 在枚举 ∧ 无需结构 | 直接施工 |
36
+ | 可派生 | L2 / 变体布局 / form 可映射 | 派生骨架或继承父级后施工 |
37
+ | 需适配 | L3 / 定制布局 / 缺通道 / 需新 DOM | **先补通道 / 结构增量 / 生成骨架,再生成**;交付说明单列申报 |
38
+
39
+ > **总原则(红线):设计为主,项目侧适配。** 设计效果是目标态,模板是待适配的一方。"设计 ↔ 模板对不上"的出口**永远在项目侧**——**不回流设计侧改设计**。只有「设计侧未给值 / 值非法」(**意图缺口**)才回流设计侧。严禁以「模板不支持」为由要求设计改图。
40
+
41
+ **0.3 运行时主题清场(T 通道先于 D/S/C)**
42
+
43
+ 主色 / 主题走的是**运行时通道**:`setEpThemeColor()` 把 `--el-color-primary` 写成 `documentElement` 的**内联样式**并持久化到 localStorage(读取优先级 = 浏览器持久化 ?? `platform-config.json`)。**内联样式 + 运行时持久化 ⇒ 设计层 CSS 与词典 selector 都赢不了。**
44
+
45
+ - 落地前先读 localStorage(键 `responsive-layout`)的 `theme` / `epThemeColor`,与本变更集主题**不一致时清 key 或显式重设**;
46
+ - 清场动作与结果写入交付说明(可回溯);
47
+ - **不清场则颜色类差异全部失真**——归因前必须先确认起点已对齐,否则会把「环境残留」误判成「落地失败」。
48
+ - **机检对账(G4)**:`parser audit` 会自动比对 `global.brand_primary` ↔ `platform-config.EpThemeColor`、页签 form ↔ `ShowModel`、`visible:false` ↔ 显隐开关,不一致即 `exit 1`——人工清场 + 机检对账双保险。
49
+
50
+ **0.3b T 通道持久化三件套(页签形态 / 主题类字段施工必做)**
51
+
52
+ 运行时配置读 localStorage,而 localStorage 只在 `platform-config.Version` 变化时经 `responsive.ts invalidateStorageIfConfigVersionChanged` 重灌。凡施工涉及 `ShowModel` / `Theme` / `EpThemeColor` 等 T 通道字段,**三件套缺一不可**:
53
+
54
+ 1. 改 `platform-config.json` 实值(如 `ShowModel: "card"`);
55
+ 2. **`Version` 自增一位**(如 0.0.6 → 0.0.7)——漏此步 = 代码对但运行时仍旧形态;
56
+ 3. **渲染取证**:断言新形态类实际挂载(如 `.scroll-item.card-item` 出现在 DOM)——不许只看代码改没改。
57
+
58
+ 词典 `admin.layout.tabs.preconditions` 有同款硬闸描述;本三件套对任意 T 通道字段通用。
@@ -1,4 +1,4 @@
1
- # design-apply · 第 1 步 · parser 确定性匹配(含词典硬闸 G8-G11/G1/G5)
1
+ # design-apply · 第 1 步 · parser 确定性匹配(含词典硬闸 G8-G11/G1/G5/G6)
2
2
 
3
3
  > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:match 执行与闸门判读。
4
4
 
@@ -57,8 +57,11 @@ node parser/index.js match --batch <changesets-dir>
57
57
  | **G13 页面绑定闸** | 落地动作涉及**新增页面 / 路由 / 菜单项**,但变更集 `page_bindings` 未把该效果图页面对应声明为 `target:"new"`(或整字段缺省)——效果图页面默认是设计角色坐标系(演示标题),不是项目页面增量;「图上有这个页面」不构成新增依据 | 变更集顶层 `page_bindings[].target` ↔ 本次 diff 是否出现新路由/菜单/页面文件 | `G13 页面绑定闸:效果图页面 … 未声明 target:"new",禁止新增页面/路由/菜单 → 映射已有页面落地` |
58
58
  | **G1 suppress 收口** | 条目声明某 `form`,词典 `suppress_rules[form]`(或 forms 描述「suppress 必含 x」内联标记)要求收口的出厂互斥通道未全部出现在该条目 `suppress[]` | 词典条目 `suppress_rules` | `suppress 缺口:…必须收口出厂互斥通道 [x],缺 [x]` |
59
59
  | **G5 几何语境** | 词典 preconditions 含「几何语境随值迁移」标记 ∧ `style` 含 padding/margin 族几何字段落宿主 ∧ 未声明 `suppress_inner` | 词典条目 preconditions 标记句 | `suppress_inner 缺口:…两层之和 ≠ 设计值` |
60
+ | **G6 层间令牌链对账** | 词典 preconditions 含「层间令牌链对账」标记 ∧ `style` 含 padding/margin 族几何字段 ∧ 未声明 `suppress_inner`——父子两层盒共享同一条间距令牌链(如 `.app-main` 与 `.main-content` 同链 `--layout-content-padding → --vts-margin`),同一间距只允许一个权威来源 | 词典条目 preconditions 标记句 | `suppress_inner 缺口:…父层设计值 + 子层同链令牌值物理叠加(24px + 8px = 32px/侧)` |
60
61
 
61
- 三闸与禁词校验同级阻断(`exit 1`)——「新旧形态叠加」「两层 padding 相加」「伪还原只换主题」都会导致实质错误(双竖条、28px 列挤压、「还原后布局细节零变化」),不允许靠观感兜底。G8 判据一句话:**「把系统 / 页面改成 X」默认是还原(restore),必须带齐 `scheme` + `oracle.mockup` + `coverage.registry`;只有「显式声明只改主题色、其它不动」才用 `design`**(还原项目若用无登记表、无基线的轻量变更集,会一路绿灯、落地后「只变了主题、布局细节零变化」;故须堵住 `oracle`/`coverage` 只给空壳、无 `mockup`/`registry` 芯的写法)。**降级不许静默发生**:变更集 `notes` 与交付说明都须显式写出本次 `mode` 与范围。restore 模式下 G9/G10/G11 同时生效(登记表身份、dims 维度兑现、oracle 基线三道复闸),三者判据细节见上表与「登记表覆盖率」小节。
62
+ > 施工侧配套:设计审计(design-audit)另有 **E18 激活态消费者成对落地** 断言——声明 `indicator_*` 形态时,「竖条消费者存在 + `--vts-theme-menu-active-before` 非透明 + 与出厂胶囊伪元素对决权重足够」三者缺一即报(详见 step5-gates.md 审计清单)。声明指示条形态时,交付说明须同时写明这两项施工约定。
63
+
64
+ 三闸与禁词校验同级阻断(`exit 1`)——「新旧形态叠加」「两层 padding 相加」「同链令牌双层叠加」「伪还原只换主题」都会导致实质错误(双竖条、28px 列挤压、内容区边距 32px/侧、「还原后布局细节零变化」),不允许靠观感兜底。G8 判据一句话:**「把系统 / 页面改成 X」默认是还原(restore),必须带齐 `scheme` + `oracle.mockup` + `coverage.registry`;只有「显式声明只改主题色、其它不动」才用 `design`**(还原项目若用无登记表、无基线的轻量变更集,会一路绿灯、落地后「只变了主题、布局细节零变化」;故须堵住 `oracle`/`coverage` 只给空壳、无 `mockup`/`registry` 芯的写法)。**降级不许静默发生**:变更集 `notes` 与交付说明都须显式写出本次 `mode` 与范围。restore 模式下 G9/G10/G11 同时生效(登记表身份、dims 维度兑现、oracle 基线三道复闸),三者判据细节见上表与「登记表覆盖率」小节。
62
65
 
63
66
  **验收基线输出**:转换计划末尾另打印 `=== 验收基线 oracle ===`(效果图路径 + 待比对点位)与 `=== 覆盖率 coverage ===`(登记项 R / 适用 A / 已兑现 C)。有 `oracle` → 落地后必须跑第 6 步 `verify`;缺 `oracle` / `coverage` → 输出提示,把「补基线 / 补登记覆盖率」回流设计侧(场景还原应给)。
64
67
  **覆盖率校验**:`coverage.covered` 必须等于 `coverage.applicable`、`gaps` 为空,否则打印缺口清单——`C < A` 即**欠声明**(有规范子项未落进 `changes[]`/`visible`/`pending`),属设计侧交付不完整,必须回流,不得在项目侧"猜着补"。
@@ -1,33 +1,38 @@
1
- # design-apply · 第 3 步 · 样式落地(两层转换 + 语义值译表)
2
-
3
- > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:结构完成后。
4
-
5
- ---
6
-
7
- ### 第 3 步 · 样式落地(两层转换 + 语义值译表)
8
-
9
- 对每个 `style` 字段,按 parser 转换指令执行(parser 已把语义值解析为精确值,如 `钴蓝-5` → `#245BFF`)。**冲突裁决规则(免问):凡变更集声明与项目出厂现状/模板既有口径冲突,一律按变更集执行——变更集是唯一施工依据,不反问、不逐次确认。**
10
-
11
- 0. **尺寸字段先定意图,再选属性(不照抄数值)**:尺寸值不是「拿到多少就写多少」——先判它是**硬约束**(盒子尺寸由设计定死,与内容无关 → `width` / `height`)、**下限**(由文案撑开,值只是最小值 → `min-width`,按钮 / 标签 / 页签 / 表头列宽 / 操作槽 / 状态牌一律走这条)、还是**上限**(图形盒 → `max-width`)。三条铁律:
12
- - **由文案撑开的盒子不许写 exact**:写死宽度后文案一变长就是换行 / 压缩 / 重叠渲染——「设计说 40px,代码就固定 40px」必然翻车。
13
- - **exact + 盒内有文案 = 必须同时收口**:形态收口(如 `icon_only`)、文案隐藏、或改下限,三选一,不许只落宽度。
14
- - **同一尺寸只认一个权威来源**:列宽只在列定义、槽宽只在组件参数。发现第二处来源(设计层 CSS / 业务配置 / 词典默认值)先收敛再施工。
15
- 落地后**按内容复核一次**:把文案换成更长的看是撑开还是畸形;装不下时按缺口回流设计侧,不得靠裁切 / 压缩 / 换行消化。
16
-
17
- 1. **css_vars 层(优先)**:在条目 `style_scope` 作用域内覆盖该 CSS 变量。
18
- ```scss
19
- // 例:admin.layout.sidebar.menu 的 menu_bg = 钴蓝-9(#0D2A7F)
20
- .sidebar-container {
21
- --vts-theme-menu-bg: #0D2A7F;
22
- }
23
- ```
24
- 2. **custom_style_map 层(兜底)**:无官方变量可用时,生成 `:deep()` 隔离样式。
25
- ```scss
26
- // 例:admin.layout.header.user_profile 的 avatar_width
27
- .navbar :deep(.el-dropdown-link img) { width: 36px; height: 36px; }
28
- ```
29
- `sub_selectors` 有定义的字段(如 `avatar_*` → img、`name_*` → p)按对应选择器路由。
30
- 3. **两层都未命中** → 值合法且选择器可定位时,当场生成作用域内自定义规则落设计层文件并在交付说明申报;仅「值非法 / 无法定位」才进缺口清单。
31
- 4. **值未命中译表且非 hex**(parser 会提示)→ 能按数值字面量 / hex / 上下文判定的当场落地并申报;仅完全无法判定时进缺口清单、回流设计侧补齐(**不向用户反问**)。
32
-
33
- 全局令牌(`global` 字段,**整套主题切换优先通道**)→ `design-tokens.scss` 对应变量(`basic/` 词典翻译,语义值走 `mapping/basic/semantic-values.json` 译表),主色走 `setEpThemeColor()` 链路。**壳层模块底色注意**:顶栏底色不走 global(无独立令牌),须以 `{"id": "admin.layout.header", "style": {"bg": "<值>"}}` 场景条目声明(scoped 覆盖 .navbar 底色);侧栏底色两者皆可——global 走 `sidebar_bg`(--sidebar-bg 令牌链),场景条目走 `admin.layout.sidebar` 的 `bg`(--vts-theme-menu-bg)。
1
+ # design-apply · 第 3 步 · 样式落地(两层转换 + 语义值译表)
2
+
3
+ > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:结构完成后。
4
+
5
+ ---
6
+
7
+ ### 第 3 步 · 样式落地(两层转换 + 语义值译表)
8
+
9
+ 对每个 `style` 字段,按 parser 转换指令执行(parser 已把语义值解析为精确值,如 `钴蓝-5` → `#245BFF`)。**冲突裁决规则(免问):凡变更集声明与项目出厂现状/模板既有口径冲突,一律按变更集执行——变更集是唯一施工依据,不反问、不逐次确认。**
10
+
11
+ 0. **尺寸字段先定意图,再选属性(不照抄数值)**:尺寸值不是「拿到多少就写多少」——先判它是**硬约束**(盒子尺寸由设计定死,与内容无关 → `width` / `height`)、**下限**(由文案撑开,值只是最小值 → `min-width`,按钮 / 标签 / 页签 / 表头列宽 / 操作槽 / 状态牌一律走这条)、还是**上限**(图形盒 → `max-width`)。三条铁律:
12
+ - **由文案撑开的盒子不许写 exact**:写死宽度后文案一变长就是换行 / 压缩 / 重叠渲染——「设计说 40px,代码就固定 40px」必然翻车。
13
+ - **exact + 盒内有文案 = 必须同时收口**:形态收口(如 `icon_only`)、文案隐藏、或改下限,三选一,不许只落宽度。
14
+ - **同一尺寸只认一个权威来源**:列宽只在列定义、槽宽只在组件参数。发现第二处来源(设计层 CSS / 业务配置 / 词典默认值)先收敛再施工。
15
+ 落地后**按内容复核一次**:把文案换成更长的看是撑开还是畸形;装不下时按缺口回流设计侧,不得靠裁切 / 压缩 / 换行消化。
16
+
17
+ 1. **css_vars 层(优先)**:在条目 `style_scope` 作用域内覆盖该 CSS 变量。
18
+ ```scss
19
+ // 例:admin.layout.sidebar.menu 的 menu_bg = 钴蓝-9(#0D2A7F)
20
+ .sidebar-container {
21
+ --vts-theme-menu-bg: #0D2A7F;
22
+ }
23
+ ```
24
+ 2. **custom_style_map 层(兜底)**:无官方变量可用时,生成 `:deep()` 隔离样式。
25
+ ```scss
26
+ // 例:admin.layout.header.user_profile 的 avatar_width
27
+ .navbar :deep(.el-dropdown-link img) { width: 36px; height: 36px; }
28
+ ```
29
+ `sub_selectors` 有定义的字段(如 `avatar_*` → img、`name_*` → p)按对应选择器路由。
30
+ 3. **两层都未命中** → 值合法且选择器可定位时,当场生成作用域内自定义规则落设计层文件并在交付说明申报;仅「值非法 / 无法定位」才进缺口清单。
31
+ 4. **值未命中译表且非 hex**(parser 会提示)→ 能按数值字面量 / hex / 上下文判定的当场落地并申报;仅完全无法判定时进缺口清单、回流设计侧补齐(**不向用户反问**)。
32
+
33
+ **同链令牌双层间距(G6 配套施工规则)**:词典 preconditions 标记「层间令牌链对账」的条目(父子两层盒共享同一条间距令牌链,如 `.app-main` ↔ `.main-content` 同链 `--layout-content-padding → --vts-margin`),落间距值时——
34
+
35
+ - **只允许一个权威来源**:间距由其中一层承载,另一层归零。声明 `suppress_inner` 写明接管/清零口径(如「间距由 .app-main 统一承载 24px,.main-content 的 --vts-margin 归零」)。
36
+ - **优先令牌通道,不抢物理属性**:在消费点作用域重映射同链令牌(`.app-main { --layout-content-padding: 24px; --vts-margin: 24px; }`),子层消费者自动跟随、两层同变;直接写 `.app-main { padding: 24px }` 而任由子层 `var(--vts-margin)` 保留出厂 8px = 物理叠加 32px/侧(「边距很大」的成因,design-audit E17 会拦截)。
37
+
38
+ 全局令牌(`global` 字段,**整套主题切换优先通道**)→ `design-tokens.scss` 对应变量(`basic/` 词典翻译,语义值走 `mapping/basic/semantic-values.json` 译表),主色走 `setEpThemeColor()` 链路。**壳层模块底色注意**:顶栏底色不走 global(无独立令牌),须以 `{"id": "admin.layout.header", "style": {"bg": "<值>"}}` 场景条目声明(scoped 覆盖 .navbar 底色);侧栏底色两者皆可——global 走 `sidebar_bg`(--sidebar-bg 令牌链),场景条目走 `admin.layout.sidebar` 的 `bg`(--vts-theme-menu-bg)。
@@ -43,6 +43,8 @@ html body .sidebar-container { /* 令牌宿主 = 该令牌被消费的
43
43
 
44
44
  **统一顺序:① 先找令牌通道 → ② 无通道才抢属性(逐位比特异度)→ ③ 都不行才 `!important` + 注释对手。**
45
45
 
46
+ > **间距类点位的补充纪律(G6/E17)**:出厂用**同链令牌间接**设置间距时(`padding: var(--vts-margin)`、`padding: var(--layout-content-padding)`),令牌通道不是「更优雅的选项」而是**唯一正确选项**——抢写物理 `padding` 会与邻层同链令牌值叠加(父层 24px + 子层出厂 8px = 32px/侧,「边距很大」)。在令牌宿主作用域重映射(`.app-main { --layout-content-padding: 24px; }`),全部消费者自动跟随。
47
+
46
48
  > 上例的正解就是①:在设计层把 `--vts-theme-menu-text/bg/hover/active-bg` 在 `.sidebar-container` 上重映射,出厂规则自己就画出白色的字与蓝色胶囊。
47
49
 
48
50
  写入纪律:
@@ -1,26 +1,26 @@
1
- # design-apply · 第 3 步附加(之二)· 覆写优先级消费(硬步骤)
2
-
3
- > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:与 step3b 配套,落规则前逐条判定。
4
-
5
- ---
6
-
7
- ### 第 3 步附加(之二)· 覆写优先级消费( 硬步骤)
8
-
9
- 第 1 步输出的 `▸ 覆写优先级 priority` **不是提示,是落地写法的硬要求**。每落一条规则前先按策略决定写法;写法错了,规则就是「写了不生效」——如面包屑 `visible:false` 写成 `display:none` 却照旧显示、页签关闭钮 `opacity` 写了却仍要 hover 才显。这类情形里两条规则本身都没写错,问题出在**赢了才是硬道理**这一步没做。
10
-
11
- | `priority.strategy` | 对手 | 必须的写法 | 自检判据 |
12
- |---|---|---|---|
13
- | `scope_qualified` | 无,或出厂**全局样式**(`sidebar.scss` / `element-plus.scss` / `theme.scss`,注意它们也在 `index.scss` 的 `@use` 链里、可能带 `!important` 且 `b` 位更高) | 按词典 selector 原样落;**逐位比过对手**(先 b 后 c);出厂用 `var(--vts-theme-*)` 时优先重映射令牌 | 若实测仍被覆盖 → 升格按 `deep_qualified` 处理 |
14
- | `deep_qualified` | 组件 `<style scoped>`(平手 + 后注入) | **禁止裸类名**。≥3 层作用域限定(如 `html .a .b`)或叠加属性/伪类;仍平手才对本条补 `!important` | 写前自问:这条与组件 scoped 谁特异度高?**平手即错** |
15
- | `self_plus_important` | 出厂规则带 `!important` | 本条必须 `!important` + 注释写明「对手带 `!important`」;能改走通道变量时优先改通道 | 只抬特异度无效,别白费 |
16
-
17
- 落地写法模板(每条规则标注来源 + 取胜依据):
18
-
19
- ```scss
20
- /* <语义 ID> · <变更条目> · 取胜依据:deep_qualified(对手 lay-*.vue scoped) */
21
- html .navbar .navbar-breadcrumb-wrap {
22
- display: none; /* visible:false · 存在性收口,不删出厂代码行 */
23
- }
24
- ```
25
-
26
- **`!important` 只允许出现在两种情形**:① `strategy = self_plus_important`(对手带 `!important`);② 对手是组件 scoped 且提权后**实测**仍平手。其余一律靠作用域限定解决——逐点堆 `!important` 会让点位互相耦合、副作用累积成漂移,也就是「越改越乱」的机理。
1
+ # design-apply · 第 3 步附加(之二)· 覆写优先级消费(硬步骤)
2
+
3
+ > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:与 step3b 配套,落规则前逐条判定。
4
+
5
+ ---
6
+
7
+ ### 第 3 步附加(之二)· 覆写优先级消费( 硬步骤)
8
+
9
+ 第 1 步输出的 `▸ 覆写优先级 priority` **不是提示,是落地写法的硬要求**。每落一条规则前先按策略决定写法;写法错了,规则就是「写了不生效」——如面包屑 `visible:false` 写成 `display:none` 却照旧显示、页签关闭钮 `opacity` 写了却仍要 hover 才显。这类情形里两条规则本身都没写错,问题出在**赢了才是硬道理**这一步没做。
10
+
11
+ | `priority.strategy` | 对手 | 必须的写法 | 自检判据 |
12
+ |---|---|---|---|
13
+ | `scope_qualified` | 无,或出厂**全局样式**(`sidebar.scss` / `element-plus.scss` / `theme.scss`,注意它们也在 `index.scss` 的 `@use` 链里、可能带 `!important` 且 `b` 位更高) | 按词典 selector 原样落;**逐位比过对手**(先 b 后 c);出厂用 `var(--vts-theme-*)` 时优先重映射令牌 | 若实测仍被覆盖 → 升格按 `deep_qualified` 处理 |
14
+ | `deep_qualified` | 组件 `<style scoped>`(平手 + 后注入) | **禁止裸类名**。≥3 层作用域限定(如 `html .a .b`)或叠加属性/伪类;仍平手才对本条补 `!important` | 写前自问:这条与组件 scoped 谁特异度高?**平手即错** |
15
+ | `self_plus_important` | 出厂规则带 `!important` | 本条必须 `!important` + 注释写明「对手带 `!important`」;能改走通道变量时优先改通道 | 只抬特异度无效,别白费 |
16
+
17
+ 落地写法模板(每条规则标注来源 + 取胜依据):
18
+
19
+ ```scss
20
+ /* <语义 ID> · <变更条目> · 取胜依据:deep_qualified(对手 lay-*.vue scoped) */
21
+ html .navbar .navbar-breadcrumb-wrap {
22
+ display: none; /* visible:false · 存在性收口,不删出厂代码行 */
23
+ }
24
+ ```
25
+
26
+ **`!important` 只允许出现在两种情形**:① `strategy = self_plus_important`(对手带 `!important`);② 对手是组件 scoped 且提权后**实测**仍平手。其余一律靠作用域限定解决——逐点堆 `!important` 会让点位互相耦合、副作用累积成漂移,也就是「越改越乱」的机理。
@@ -1,14 +1,14 @@
1
- # design-apply · 第 4 步 · L3 新模块处理(分级布局)
2
-
3
- > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:存在未命中点位 / 新页面生成时。
4
-
5
- ---
6
-
7
- ### 第 4 步 · L3 新模块处理(分级布局)
8
-
9
- - **验收对象闸(角色集合必须齐)**:验收页面的**角色集合**必须覆盖变更集声明的角色。缺角色的,按第 0.2 步「对接匹配 → 需适配」处置——**项目侧补齐该角色的骨架 / 结构**(走 `crud-pages` 样板 + L3 落地并申报),**不是要求设计侧换页面**。不得用出厂 demo 页充数:demo 页**结构上就没有**标题区 / 批量按钮 / 状态 Tag 这些角色 → 这类差异**无论怎么调 CSS 都消不掉**(不是样式问题,是角色集合不匹配)。
10
- - **页面映射闸(G13 · 角色集合 ≠ 页面增量)**:本步一切「生成骨架 / 新页面」的授权,**只指向变更集 `page_bindings` 显式声明 `target:"new"` 的条目**(且 `notes` 已申报);`page_bindings` 缺省或 target 指向已有页面时,角色补齐一律落在**已有页面的结构增量**上(在既有路由页面内补角色节点),**禁止新建页面 / 路由 / 菜单项来承载角色**——效果图页面是设计角色坐标系(演示标题),项目侧按它换肤,不按它扩清单。
11
- - **列宽口径(业务层 / 设计层边界)**:表格**业务列宽度属业务层**,设计侧不声明、项目侧不按效果图硬套——效果图里的列宽只是其示例数据下的参考值。**唯一例外是操作列**:宽度由组件公式推算(`resolveOperateColumnWidth`,已含分割线占位),业务页禁止写死。**固定列自查(落完后必做,防「符合规范但不合常规」)**:操作列按钮不被裁、不换行、分割线居中可见;状态列标签完整;表头/单元格标题不被省略号截断——任何一项不满足即返工,禁止用「设计值就是对的」搪塞。
12
-
13
- - **L3 是施工指令,不是待办**:词典未命中的点位一律当场落地、交付说明申报「补映射」,不留待确认。新模块按「定制布局」三步走:① 基于全局规范生成结构(继承命名/作用域/组件规范)② 原子层字段(色彩/圆角/组件级)从 `basic/` + `component/` 词典借力 ③ 场景专属点位生成后**立即写入 mapping/ 对应场景域**(临时映射),累计复用 ≥3 次建议升级标准(由人工评审)。
14
- - 生成的新页面必须带构图钩子(`vts-page-card` / `vts-filter-area` / `vts-table-area` 等),保证后续变更集可命中。**本条仅在 G13 申报范围内生效**(`page_bindings` 有 `target:"new"` 条目);无申报时本步不产出任何新页面文件。
1
+ # design-apply · 第 4 步 · L3 新模块处理(分级布局)
2
+
3
+ > **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:存在未命中点位 / 新页面生成时。
4
+
5
+ ---
6
+
7
+ ### 第 4 步 · L3 新模块处理(分级布局)
8
+
9
+ - **验收对象闸(角色集合必须齐)**:验收页面的**角色集合**必须覆盖变更集声明的角色。缺角色的,按第 0.2 步「对接匹配 → 需适配」处置——**项目侧补齐该角色的骨架 / 结构**(走 `crud-pages` 样板 + L3 落地并申报),**不是要求设计侧换页面**。不得用出厂 demo 页充数:demo 页**结构上就没有**标题区 / 批量按钮 / 状态 Tag 这些角色 → 这类差异**无论怎么调 CSS 都消不掉**(不是样式问题,是角色集合不匹配)。
10
+ - **页面映射闸(G13 · 角色集合 ≠ 页面增量)**:本步一切「生成骨架 / 新页面」的授权,**只指向变更集 `page_bindings` 显式声明 `target:"new"` 的条目**(且 `notes` 已申报);`page_bindings` 缺省或 target 指向已有页面时,角色补齐一律落在**已有页面的结构增量**上(在既有路由页面内补角色节点),**禁止新建页面 / 路由 / 菜单项来承载角色**——效果图页面是设计角色坐标系(演示标题),项目侧按它换肤,不按它扩清单。
11
+ - **列宽口径(业务层 / 设计层边界)**:表格**业务列宽度属业务层**,设计侧不声明、项目侧不按效果图硬套——效果图里的列宽只是其示例数据下的参考值。**唯一例外是操作列**:宽度由组件公式推算(`resolveOperateColumnWidth`,已含分割线占位),业务页禁止写死。**固定列自查(落完后必做,防「符合规范但不合常规」)**:操作列按钮不被裁、不换行、分割线居中可见;状态列标签完整;表头/单元格标题不被省略号截断——任何一项不满足即返工,禁止用「设计值就是对的」搪塞。
12
+
13
+ - **L3 是施工指令,不是待办**:词典未命中的点位一律当场落地、交付说明申报「补映射」,不留待确认。新模块按「定制布局」三步走:① 基于全局规范生成结构(继承命名/作用域/组件规范)② 原子层字段(色彩/圆角/组件级)从 `basic/` + `component/` 词典借力 ③ 场景专属点位生成后**立即写入 mapping/ 对应场景域**(临时映射),累计复用 ≥3 次建议升级标准(由人工评审)。
14
+ - 生成的新页面必须带构图钩子(`vts-page-card` / `vts-filter-area` / `vts-table-area` 等),保证后续变更集可命中。**本条仅在 G13 申报范围内生效**(`page_bindings` 有 `target:"new"` 条目);无申报时本步不产出任何新页面文件。