@qilitt-mickey/vue3-temp-skill 1.1.59 → 1.1.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -1
- package/mapping/scenes/admin/content.json +20 -1
- package/mapping/scenes/admin/layout.json +15 -0
- package/package.json +1 -1
- package/parser/fixtures/verify/snapshot-latest.json +1 -1
- package/parser/index.js +45 -1
- package/references/steps/maintenance.md +1 -1
- package/references/steps/regression.md +1 -1
- package/references/steps/step0-preflight.md +1 -1
- package/references/steps/step1-match.md +1 -1
- package/references/steps/step1b-audit.md +1 -1
- package/references/steps/step1c-registry.md +1 -1
- package/references/steps/step2-structure.md +6 -1
- package/references/steps/step3-style.md +1 -1
- package/references/steps/step3b-shell.md +1 -1
- package/references/steps/step3c-priority.md +1 -1
- package/references/steps/step4-l3.md +1 -1
- package/references/steps/step5-gates.md +1 -1
- package/references/steps/step6-verify.md +1 -1
package/SKILL.md
CHANGED
|
@@ -101,7 +101,8 @@ tags: [vue3, typescript, element-plus, pinia, vite, unocss, crud, demo, code-qua
|
|
|
101
101
|
目标项目源码 = **中性初始化**,只提供能力通道(CSS 变量的消费者挂载点、form 枚举、DOM/属性钩子、正确的层叠优先级),**不预置任何具体设计的结论**(某个颜色、某句问候语、某个方位的指示条、某个硬编码尺寸)。
|
|
102
102
|
|
|
103
103
|
- 一切设计决策由设计变更集驱动,经 `design-apply` 动态落到「设计层文件 `src/styles/design-shell.scss` / 页面级 scoped 样式 / DOM 属性与配置」,不落到出厂样式文件与出厂组件里。
|
|
104
|
-
- **效果图页面 = 设计角色坐标系,不是页面增量(G13 页面绑定闸)**:效果图页面(如「运单管理」)是设计侧为承载设计语言虚构的演示标题,**默认映射到项目已有页面**——落地动作恒为「在已有页面上同步结构与样式」,**禁止因效果图新增页面 / 路由 / 菜单项**;唯一例外是变更集 `page_bindings` 显式声明 `target:"new"` 且在 `notes` 申报。判据:换一张效果图不需要改项目的页面/路由/菜单清单 ⇒ 架构正确;需要新增页面才能换 ⇒ 设计演示页被误当业务增量,必须回退。
|
|
104
|
+
- **效果图页面 = 设计角色坐标系,不是页面增量(G13 页面绑定闸)**:效果图页面(如「运单管理」)是设计侧为承载设计语言虚构的演示标题,**默认映射到项目已有页面**——落地动作恒为「在已有页面上同步结构与样式」,**禁止因效果图新增页面 / 路由 / 菜单项**;唯一例外是变更集 `page_bindings` 显式声明 `target:"new"` 且在 `notes` 申报。判据:换一张效果图不需要改项目的页面/路由/菜单清单 ⇒ 架构正确;需要新增页面才能换 ⇒ 设计演示页被误当业务增量,必须回退。
|
|
105
|
+
- **演示占位内容 = 效果的角色承载,不是还原目标(演示内容等价)**:项目演示页上为展示"此处可放控件"而写的占位说明文字 / 演示按钮,既不是效果图的角色、也不是设计意图。落地时必须把落在效果图对应角色上的演示占位**替换为设计对应内容**,或对效果图没有该位置的点位**收口隐藏**——**还原后的页面不得残留模板演示说明性文字与占位按钮**。判据:残留演示文案说明「效果 vs 内容」混淆——把模板演示内容当成设计还原,必须回退(详见 design-apply 第 2 步「出厂演示占位内容等价」)。
|
|
105
106
|
- 判据:换一张效果图只需换变更集、不必改源码 ⇒ 架构正确;需要改源码才能换 ⇒ 设计结论被烧进源码,必须回退为通道。
|
|
106
107
|
- 出厂文件仅在「通道缺失」时可动(补变量消费者 / 补 form 枚举 / 修层叠优先级),且必须在交付说明中单列「补通道」条目写明缺失点。
|
|
107
108
|
|
|
@@ -245,6 +245,7 @@
|
|
|
245
245
|
"font_weight": "font-weight",
|
|
246
246
|
"text_color": "color",
|
|
247
247
|
"border_bottom": "border-bottom",
|
|
248
|
+
"nowrap": "white-space",
|
|
248
249
|
"vertical_align": "vertical-align"
|
|
249
250
|
},
|
|
250
251
|
"anchors": [
|
|
@@ -254,7 +255,8 @@
|
|
|
254
255
|
"preconditions": [
|
|
255
256
|
"出厂 element-plus.scss 已给 .el-table .el-table__cell 设了 padding(var(--vts-space-xs) 0),本条目字段必须落 host 层才能覆盖它;写在 inner 层只改内层文本盒,观感上「改了没反应」。",
|
|
256
257
|
"几何语境随值迁移:padding/padding_x/padding_y 落宿主 td 时必须同步声明 suppress_inner(内层 .cell padding 清零口径)——出厂内层 .cell 自带 padding 0 12px,不清零则两层之和 ≠ 设计值(28px/侧 → 列挤坏)。",
|
|
257
|
-
"行高由「单元格 padding + 内容行高」共同决定;声明行高档位时必须同时给出 padding 取值,只改其一会得到非预期行高。"
|
|
258
|
+
"行高由「单元格 padding + 内容行高」共同决定;声明行高档位时必须同时给出 padding 取值,只改其一会得到非预期行高。",
|
|
259
|
+
"white-space:nowrap 为强制维度(登记表 §11.43 always:true,与表头一致):数据单元格禁止换行。nowrap 属内层盒属性族,解析器自动路由到 inner 锚点(.cell),无需显式声明 layer;落 host 会被 EP 内层 .cell{white-space:normal} 覆盖,导致「牛奶乳品」类竖排换行。"
|
|
258
260
|
],
|
|
259
261
|
"priority": {
|
|
260
262
|
"strategy": "scope_qualified",
|
|
@@ -262,6 +264,23 @@
|
|
|
262
264
|
},
|
|
263
265
|
"$note": "设计意图(list-page §11.43):padding 16px、字号 14px、字重 400、文字色 #000000E0、底边框 1px solid #F0F0F0、垂直居中。⚠ 数据单元格此前无承载点位(历史缺口:只覆盖了表头,单元格 padding 改不动),本条目即为补建的通道。不声明时项目侧保留出厂值,效果图要求的 16px 必须显式给出。"
|
|
264
266
|
},
|
|
267
|
+
"admin.content.table.index_column": {
|
|
268
|
+
"type": "element",
|
|
269
|
+
"selector": ".vts-table-area .el-table__cell.col-index",
|
|
270
|
+
"file": "业务 views(序号列 el-table-column type=\"index\" 需绑定 class-name=\"col-index\")",
|
|
271
|
+
"style_scope": ".vts-page-card",
|
|
272
|
+
"data_channels": {
|
|
273
|
+
"column_width": "序号列宽度通道(结构通道:列定义绑定 class-name=col-index + 设 width prop;设计只声明列宽意图,禁 CSS 仿冒)"
|
|
274
|
+
},
|
|
275
|
+
"custom_style_map": {
|
|
276
|
+
"align": "text-align"
|
|
277
|
+
},
|
|
278
|
+
"anchors": [
|
|
279
|
+
{ "kind": "class", "layer": "host", "target": ".vts-table-area .el-table__cell.col-index" },
|
|
280
|
+
{ "kind": "class", "layer": "inner", "target": ".vts-table-area .el-table__cell.col-index > .cell" }
|
|
281
|
+
],
|
|
282
|
+
"$note": "序号列宽度属业务层(与选择列/操作列同为列宽业务归属):本条目仅当设计明确固定序号列宽时,经 structure_ops 在列定义绑定 class-name=col-index 并设 width prop 落地(禁 CSS 收口 width)。默认宽度由业务列定义控制,避免「序号列过宽挤压内容列 / 类型列被压窄」这类列宽失衡。设计侧不声明列宽时项目侧保留出厂值。"
|
|
283
|
+
},
|
|
265
284
|
"admin.content.table.cell_status": {
|
|
266
285
|
"type": "element",
|
|
267
286
|
"selector": ".vts-table-area .el-table__cell .el-tag",
|
|
@@ -114,6 +114,21 @@
|
|
|
114
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 却带竖条字段 = 字段被静默丢弃(历史事故:孔雀绿变更集声明 pill + active_indicator_*,设计层按 pill 施工把竖条令牌置透明,效果图要求的左竖条消失)。"
|
|
116
116
|
},
|
|
117
|
+
"admin.layout.sidebar.menu_item_icon": {
|
|
118
|
+
"type": "element",
|
|
119
|
+
"selector": ".sidebar-container .el-menu-item .el-icon, .sidebar-container .el-menu-item .el-menu-item__icon",
|
|
120
|
+
"file": "src/layout/components/lay-sidebar/NavVertical.vue(菜单图标,el-menu-item 内 svg-icon)",
|
|
121
|
+
"style_scope": ".sidebar-container",
|
|
122
|
+
"css_vars": {},
|
|
123
|
+
"custom_style_map": {
|
|
124
|
+
"icon_size": "font-size",
|
|
125
|
+
"icon_color": "color"
|
|
126
|
+
},
|
|
127
|
+
"anchors": [
|
|
128
|
+
{ "kind": "class", "layer": "inner", "target": ".sidebar-container .el-menu-item .el-icon" }
|
|
129
|
+
],
|
|
130
|
+
"$note": "菜单图标 16×16px(unified-framework §6.17 / §1 导航栏「图标 16×16px」)。图标为 font-icon,尺寸经 font-size 承载、颜色经 color 承载,落 inner 层(图标元素本身)。此前进出厂中性基线:菜单图标尺寸由图标组件默认决定,设计侧无承载点位 = 图标大小/颜色不可控,本条目即为补建通道(unified-framework §6.17 此前缺 registry 收口,属登记表真空缺口)。"
|
|
131
|
+
},
|
|
117
132
|
"admin.layout.sidebar.collapse_trigger": {
|
|
118
133
|
"type": "element",
|
|
119
134
|
"selector": ".left-collapse / .center-collapse",
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generated_at": "2026-09-
|
|
2
|
+
"generated_at": "2026-09-22T11:31:14.934Z",
|
|
3
3
|
"oracle": "E:\\work\\Project\\Template\\skills\\vue3-temp-skill\\parser\\fixtures\\verify\\oracle.json",
|
|
4
4
|
"actual": "E:\\work\\Project\\Template\\skills\\vue3-temp-skill\\parser\\fixtures\\verify\\actual-clean.json",
|
|
5
5
|
"points": {
|
package/parser/index.js
CHANGED
|
@@ -45,7 +45,15 @@ const COMPOSITE_VALUE_RE = /\s/;
|
|
|
45
45
|
const LAYER_VALUES = ["host", "inner"];
|
|
46
46
|
/** 语义 ID 严格格式(apply_via 锚点名须符合) */
|
|
47
47
|
const ID_RE_STRICT = /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*){1,3}$/;
|
|
48
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* 内层盒属性族(changeset-schema §layer):这些文本控制/行高/对齐类属性必须落在 inner 层
|
|
50
|
+
* 才生效。根因:Element Plus 给内层文本盒 .cell 写了 white-space:normal / text-align 等出厂
|
|
51
|
+
* 样式,写在宿主盒(th/td)上会被内层覆盖 —— 这是「表头/内容竖排换行」的复发根因。
|
|
52
|
+
* 本集合作两处消费:
|
|
53
|
+
* ① resolveAnchorTarget —— 命中即把该字段自动路由到 inner 锚点(保底落点,杜绝静默落 host);
|
|
54
|
+
* ② checkInnerOnlyProps 闸门 —— 条目缺 inner 锚点却声明了此类字段时,报词典完整性缺口。
|
|
55
|
+
* (此前为死常量,从未被任何闸引用,导致 nowrap/text_align 可裸声明落 host 被覆盖。)
|
|
56
|
+
*/
|
|
49
57
|
const INNER_ONLY_PROPS = new Set(["white_space", "text_overflow", "overflow", "word_break", "text_align", "line_height", "vertical_align", "nowrap", "text_align_last"]);
|
|
50
58
|
/** 几何字段(宿主内边距/外边距族):落 host 时与出厂内层盒自带 padding 叠加,必须同步清零内层(G5) */
|
|
51
59
|
const GEOMETRY_PAD_RE = /^(padding|padding_x|padding_y|padding_inline|padding_block|margin|margin_x|margin_y|margin_inline|margin_block)$/;
|
|
@@ -464,6 +472,7 @@ function matchOne(file, dataset, batchSummary, opts = {}) {
|
|
|
464
472
|
checkFormEnum(p.entry, p.change);
|
|
465
473
|
checkSuppress(p.change, p.entry, p.id, gateViolations);
|
|
466
474
|
checkGeometryContext(p.change, p.entry, p.id, gateViolations);
|
|
475
|
+
checkInnerOnlyProps(p.change, p.entry, p.id, gateViolations);
|
|
467
476
|
checkFieldForms(p.change, p.entry, p.id, gateViolations);
|
|
468
477
|
printApplyPlan(p.entry, p.change, p.id, index);
|
|
469
478
|
printStyleTranslation(p.entry, p.change, p.id, fieldPending, valueDict);
|
|
@@ -473,6 +482,7 @@ function matchOne(file, dataset, batchSummary, opts = {}) {
|
|
|
473
482
|
console.log(` 结构:定位父容器按相对位置增量插入;样式:复用父模块映射 + 全局组件映射`);
|
|
474
483
|
checkSuppress(p.change, p.entry, p.id, gateViolations);
|
|
475
484
|
checkGeometryContext(p.change, p.entry, p.id, gateViolations);
|
|
485
|
+
checkInnerOnlyProps(p.change, p.entry, p.id, gateViolations);
|
|
476
486
|
checkFieldForms(p.change, p.entry, p.id, gateViolations);
|
|
477
487
|
printApplyPlan(p.entry, p.change, `${p.id}(继承 ${p.parent})`, index);
|
|
478
488
|
printStyleTranslation(p.entry, p.change, `${p.id}(继承 ${p.parent})`, fieldPending, valueDict);
|
|
@@ -704,6 +714,13 @@ function layerOf(change, field) {
|
|
|
704
714
|
function resolveAnchorTarget(entry, field, layer) {
|
|
705
715
|
const anchors = Array.isArray(entry.anchors) ? entry.anchors : [];
|
|
706
716
|
const classAnchors = anchors.filter(a => a && a.kind === "class" && typeof a.target === "string");
|
|
717
|
+
// 内层盒属性族保底路由:nowrap / text_align / line_height 等即使未显式声明 layer,
|
|
718
|
+
// 也强制落到 inner 锚点(EP 内层 .cell 出厂样式会覆盖 host 层声明,裸落 host = 竖排换行)。
|
|
719
|
+
if (INNER_ONLY_PROPS.has(field)) {
|
|
720
|
+
const innerHit = classAnchors.find(a => a.layer === "inner");
|
|
721
|
+
if (innerHit)
|
|
722
|
+
return { target: innerHit.target, layer: "inner" };
|
|
723
|
+
}
|
|
707
724
|
if (layer) {
|
|
708
725
|
const hit = classAnchors.find(a => a.layer === layer);
|
|
709
726
|
if (hit)
|
|
@@ -1466,6 +1483,33 @@ function checkGeometryContext(change, entry, idLabel, violations) {
|
|
|
1466
1483
|
}
|
|
1467
1484
|
}
|
|
1468
1485
|
|
|
1486
|
+
/**
|
|
1487
|
+
* G5b:内层盒属性族 · 词典完整性闸 —— INNER_ONLY_PROPS 字段(nowrap/text_align/line_height 等)
|
|
1488
|
+
* 必须能落到 inner 层,否则这些文本控制属性无处可落、必然被 EP 内层 .cell 出厂样式吞掉。
|
|
1489
|
+
* 触发条件(零误报):仅当条目本身「声明了 INNER_ONLY_PROPS 字段」却「没有 inner 锚点」时报警
|
|
1490
|
+
* —— 这是词典侧的能力缺口(缺 inner 锚点),须补 anchors 里的 inner 条目,而非设计侧能补救。
|
|
1491
|
+
* 条目带 inner 锚点时由 resolveAnchorTarget 自动路由兜底,本闸不重复拦截(避免噪音)。
|
|
1492
|
+
*/
|
|
1493
|
+
function checkInnerOnlyProps(change, entry, idLabel, violations) {
|
|
1494
|
+
if (!entry || !Array.isArray(entry.anchors))
|
|
1495
|
+
return;
|
|
1496
|
+
const hasInner = entry.anchors.some(a => a && a.kind === "class" && a.layer === "inner");
|
|
1497
|
+
if (hasInner)
|
|
1498
|
+
return;
|
|
1499
|
+
const style = change.style && typeof change.style === "object" ? change.style : null;
|
|
1500
|
+
if (!style)
|
|
1501
|
+
return;
|
|
1502
|
+
const offenders = Object.keys(style).filter(f => INNER_ONLY_PROPS.has(f));
|
|
1503
|
+
if (offenders.length === 0)
|
|
1504
|
+
return;
|
|
1505
|
+
violations.push(
|
|
1506
|
+
`${idLabel}.anchors 完整性缺口:条目 style 声明了内层盒属性族 [${offenders.join("、")}]`
|
|
1507
|
+
+ `(文本控制/行高/对齐类,必须落 inner 层才不被 EP 内层 .cell 出厂样式覆盖),`
|
|
1508
|
+
+ `但本条目 anchors 无 inner 锚点 —— 这些字段无处可落,必然复发「竖排换行 / 对齐失效」。`
|
|
1509
|
+
+ `修复:在 anchors 补 { kind:"class", layer:"inner", target:"… > .cell" } 承载选择器。`,
|
|
1510
|
+
);
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1469
1513
|
/**
|
|
1470
1514
|
* G7:field_forms 声明-消费闭合 —— style 字段必须被当前 form 消费。
|
|
1471
1515
|
* 词典条目声明 field_forms(字段 → 合法 form 枚举)后:变更集 style 里的字段若不在
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 词典维护纪律与出厂状态漂移
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:改 mapping / 出厂状态存疑 / 排查词典假前提时。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 端到端回归与配套工具(作者/维护侧)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:改 parser/mapping 后必跑;日常落地不需要加载。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 第 0 步 · 版本与场景检查 · 对接匹配(适配前置)· 运行时清场
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:每次落地开工前(版本/场景/对接匹配/运行时清场三件套)。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 第 1 步 · parser 确定性匹配(含词典硬闸 G8-G11/G1/G5)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:match 执行与闸门判读。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 第 1 步附加(之二)· 登记表覆盖率(子项级细闸)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:变更集带 coverage.registry / --registry 时。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 第 2 步 · 结构先行(visible / position / form · structure_ops · layer · suppress · priority 消费)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:进入施工时(先于一切样式)。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
|
|
18
18
|
**存在性收口(通用机制,第 2 步随结构处理)**:变更集未声明的**出厂多余元素**(设计效果图上不存在的按钮/图标/入口,如顶栏设置按钮)→ 按各条目口径处理:有条目者在对应点位上以 `visible:false` 收口(代码保留,`v-if`/`display:none`);无条目者列入缺口清单申报「设计侧未声明,按无此元素收口」,同样以隐藏通道落地。禁止既不声明也不收口、让出厂元素顶替设计效果(顶栏设置按钮漏收口已实证:效果图无此按钮,落地后仍显示)。反向同理:**设计声明了而出厂没有的元素**(如欢迎区问候语)必须按条目 `$note`/设计规范补齐结构(结构通道豁免底线二),缺失 = 未交付。
|
|
19
19
|
|
|
20
|
+
**出厂演示占位内容等价(通用机制,第 2 步随存在性收口一并处理)**:模板演示页常带有**占位说明性文案与演示按钮**(用于演示"此处可放控件"的说明文字、占位操作列)。这类内容**不是设计效果**——凡落在设计效果图对应角色上的演示占位内容,必须按「效果」等价逻辑处理:
|
|
21
|
+
- 有设计对应操作(设计声明了按钮/操作列的形态与语义)→ **替换为设计对应内容**(如把占位操作列替换为"查看/编辑/更多"及其形态),不得保留演示文案;
|
|
22
|
+
- 设计未声明该点位(效果图上没有这个位置的操作)→ 收口隐藏(`visible:false` 或隐藏通道),不显示演示文字;
|
|
23
|
+
- **判据一句话:还原后的页面不得残留模板的演示说明性文字与占位按钮——它们既不是设计效果,也不是交付目标。** 残留 = 把演示噪音当成了还原结果,即「效果 vs 内容」混淆的实景表现。
|
|
24
|
+
|
|
20
25
|
**结构/样式图层分工**:`form`(高度模式、形态枚举)是**结构意图**,必须落到 DOM 属性/组件开关/配置字段(如 `data-content-mode`、`ShowModel`);**禁止把结构意图降级翻译成 SCSS 变量写进样式文件**(form=scroll 只写 `--vts-margin` = 未施工,已实证)。样式文件(如 design-shell.scss)只承载 css_vars/custom_style_map 翻译产物;壳层通用文件禁止代打页面级结构属性(lay-content 硬编码 `data-content-mode="scroll"` 曾压掉 `:has()` 自动定高探测,useTableSearch 高度链断裂致列表区整体崩坏——已回退,禁止复活)。
|
|
21
26
|
|
|
22
27
|
**结构链不可侵(高度链保命红线)**:内容区高度链是**结构层**,已与视觉解耦,两侧各有边界——
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 第 3 步附加 · 设计层落点文件 design-shell.scss(强制 · 覆写定律 · 自举)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:写任何新 CSS 规则前。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# design-apply · 第 6 步 · 渲染态验收(oracle 逐点 diff · 快照回归 · 残差豁免)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **主入口与执行顺序见 [../design-apply.md](../design-apply.md)**;加载时机:变更集含 oracle 时强制。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|