@qilitt-mickey/vue3-temp-skill 1.1.75 → 1.2.1
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 +85 -84
- package/SKILL.md +55 -27
- package/bin/cli.js +5 -6
- package/mapping/admin.json +60 -0
- package/package.json +4 -13
- package/references/adapters/_new-adapter.md +88 -0
- package/references/adapters/vue-antdv.md +70 -0
- package/references/adapters/vue-element-plus.md +90 -0
- package/references/design-apply.md +238 -122
- package/scripts/modules.json +2 -2
- package/dist/mapping-type.d.ts +0 -33
- package/dist/theme-vars.js +0 -62
- package/dist/theme-vars.ts +0 -113
- package/dist/theme.css +0 -73
- package/mapping/basic/color.json +0 -35
- package/mapping/basic/radius.json +0 -17
- package/mapping/basic/semantic-values.json +0 -72
- package/mapping/basic/spacing.json +0 -21
- package/mapping/basic/typography.json +0 -21
- package/mapping/component/button.json +0 -90
- package/mapping/component/card.json +0 -31
- package/mapping/component/input.json +0 -42
- package/mapping/component/overlay.json +0 -79
- package/mapping/component/pagination.json +0 -34
- package/mapping/component/table.json +0 -42
- package/mapping/component/tag.json +0 -48
- package/mapping/layout/breakpoint.json +0 -20
- package/mapping/layout/shell-geometry.json +0 -26
- package/mapping/scenes/admin/content.json +0 -497
- package/mapping/scenes/admin/layout.json +0 -577
- package/parser/fixtures/changeset-fullpage-restore.json +0 -259
- package/parser/fixtures/changeset-gap-block.json +0 -24
- package/parser/fixtures/changeset-legacy.json +0 -11
- package/parser/fixtures/changeset-neg1.json +0 -8
- package/parser/fixtures/changeset-neg2.json +0 -10
- package/parser/fixtures/changeset-neg3.json +0 -22
- package/parser/fixtures/changeset-neg4-g8.json +0 -15
- package/parser/fixtures/changeset-neg5-g8-stub.json +0 -26
- package/parser/fixtures/changeset-neg6-g9-identity.json +0 -39
- package/parser/fixtures/changeset-neg7-g10-dims.json +0 -57
- package/parser/fixtures/changeset-neg8-g11-oracle.json +0 -57
- package/parser/fixtures/changeset-neg9-g6-token-chain.json +0 -34
- package/parser/fixtures/changeset-pos-g6-token-chain.json +0 -35
- package/parser/fixtures/changeset-pos-theme-neutral.json +0 -264
- package/parser/fixtures/changeset-pos-theme-nometa.json +0 -260
- package/parser/fixtures/changeset-pos.json +0 -50
- package/parser/fixtures/changeset-registry-gap.json +0 -29
- package/parser/fixtures/changeset-v32-fields.json +0 -71
- package/parser/fixtures/fake-project/src/styles/app.scss +0 -5
- package/parser/fixtures/fake-project/src/views/list.vue +0 -13
- package/parser/fixtures/registry-bad.json +0 -11
- package/parser/fixtures/registry-g6-token-chain.json +0 -10
- package/parser/fixtures/registry-sample.json +0 -15
- package/parser/fixtures/verify/actual-clean.json +0 -35
- package/parser/fixtures/verify/actual.json +0 -33
- package/parser/fixtures/verify/mockup-baseline-admin-list.html +0 -27
- package/parser/fixtures/verify/mockup-g6-content.html +0 -12
- package/parser/fixtures/verify/mockup-neutral.html +0 -26
- package/parser/fixtures/verify/mockup-nometa.html +0 -26
- package/parser/fixtures/verify/oracle.json +0 -37
- package/parser/fixtures/verify/snapshot-latest.json +0 -103
- package/parser/generator.js +0 -178
- package/parser/index.js +0 -2706
- package/parser/loader.js +0 -66
- package/parser/override.js +0 -119
- package/parser/regression.js +0 -301
- package/parser/validator.js +0 -206
- package/parser/watch.js +0 -103
- package/references/steps/maintenance.md +0 -31
- package/references/steps/regression.md +0 -49
- package/references/steps/step0-preflight.md +0 -58
- package/references/steps/step1-match.md +0 -65
- package/references/steps/step1b-audit.md +0 -23
- package/references/steps/step1c-registry.md +0 -29
- package/references/steps/step2-structure.md +0 -73
- package/references/steps/step3-style.md +0 -38
- package/references/steps/step3b-shell.md +0 -63
- package/references/steps/step3c-priority.md +0 -26
- package/references/steps/step4-l3.md +0 -14
- package/references/steps/step5-gates.md +0 -64
- package/references/steps/step6-verify.md +0 -77
- package/scripts/apply-final-gate.mjs +0 -170
- package/scripts/check.mjs +0 -207
- package/scripts/design-audit.mjs +0 -1575
- package/scripts/validate.mjs +0 -106
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "回归夹具 · 登记表硬缺口负例。registry-sample.json 的姊妹负例:引用了一个词典不存在、又没标 pending 的点位 → 预期 registry 子命令 exit 1,输出含「硬缺口」。",
|
|
3
|
-
"schema": "design.restore-registry/1.0",
|
|
4
|
-
"design_scheme": "default",
|
|
5
|
-
"scene": "admin",
|
|
6
|
-
"counts": { "total": 2 },
|
|
7
|
-
"items": [
|
|
8
|
-
{ "rule": "bad#1", "group": "样例·表格区", "sid": "admin.content.table.header_cell", "dims": ["padding"], "channel": ["style"], "source": "both", "always": true },
|
|
9
|
-
{ "rule": "bad#2", "group": "样例·不存在的点位", "sid": "admin.layout.nonexistent_zone", "dims": ["bg"], "channel": ["style"], "source": "spec", "always": true }
|
|
10
|
-
]
|
|
11
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "G6 层间令牌链对账闸回归专用迷你登记表:只含 admin.layout.content 一条 always 子项,配合 changeset-neg9-g6-token-chain.json 隔离出唯一拦截点 = G6(不入其他回归步)。",
|
|
3
|
-
"schema": "design.restore-registry/1.0",
|
|
4
|
-
"design_scheme": "default",
|
|
5
|
-
"scene": "admin",
|
|
6
|
-
"counts": { "total": 1 },
|
|
7
|
-
"items": [
|
|
8
|
-
{ "rule": "g6#1", "group": "样例·内容区", "sid": "admin.layout.content", "dims": ["padding", "bg"], "channel": ["style"], "source": "spec", "always": true }
|
|
9
|
-
]
|
|
10
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "回归夹具 · 登记表样例(不是真实交付件)。6 条登记项示范粒度与字段口径:4 条 always(恒存在,必登)、2 条条件项。用于 M/N/H/R/S/T 步:M 校验覆盖率重算能报出欠声明并 exit 1,N 校验通道核验能跑通,H 为 G8/G9/G10 正例,R/S/T 分别负例 G9 身份错配 / G10 dims 缺维度 / G11 主题错配。sample#1 的 dims 含 text_align/nowrap(表头竖排失效模式的 G10 机检锚点:S 步夹具故意漏给这两维)。⚠ selection_column / cell 等点位词典已补建通道,本夹具不再示范 pending 标注(pending 演示见 registry-bad.json 的硬缺口反例)。",
|
|
3
|
-
"schema": "design.restore-registry/1.0",
|
|
4
|
-
"design_scheme": "default",
|
|
5
|
-
"scene": "admin",
|
|
6
|
-
"counts": { "total": 6 },
|
|
7
|
-
"items": [
|
|
8
|
-
{ "rule": "sample#1", "group": "样例·表格区", "sid": "admin.content.table.header_cell", "dims": ["height", "padding", "text_align", "nowrap"], "channel": ["style", "layer"], "source": "both", "always": true },
|
|
9
|
-
{ "rule": "sample#2", "group": "样例·表格区", "sid": "admin.content.table.cell", "dims": ["padding", "padding_y"], "channel": ["style", "layer"], "source": "both", "always": true },
|
|
10
|
-
{ "rule": "sample#3", "group": "样例·金额列", "sid": "admin.content.table.cell_amount", "dims": ["align"], "channel": ["style", "structure_ops"], "source": "spec", "always": true },
|
|
11
|
-
{ "rule": "sample#4", "group": "样例·状态列", "sid": "admin.content.table.cell_status", "dims": ["form", "bg"], "channel": ["form", "structure_ops"], "source": "spec", "always": true },
|
|
12
|
-
{ "rule": "sample#5", "group": "样例·选择列", "sid": "admin.content.table.selection_column", "dims": ["text_align", "padding"], "channel": ["style"], "source": "spec", "always": false },
|
|
13
|
-
{ "rule": "sample#6", "group": "样例·状态列", "sid": "component.tag.status", "dims": ["bg_color"], "channel": ["style"], "source": "spec", "always": false }
|
|
14
|
-
]
|
|
15
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "verify 夹具 · 项目实测(clean 全绿对照,与 oracle.json + actual.json 三件配套):全部属性命中、absent 点位已收口(display:none)、states 状态期望命中(disabled 态 opacity 0.4 由浏览器脚本触发后抽取)、无孤儿点位(G15 对账通过)、申报残差点位允许与效果图不同。供 U 步正例(exit 0)与 V 步快照基线段使用。",
|
|
3
|
-
"sids": {
|
|
4
|
-
"admin.content.table.header_cell": {
|
|
5
|
-
"padding": "16px",
|
|
6
|
-
"font-weight": "500",
|
|
7
|
-
"text-align": "left",
|
|
8
|
-
"background-color": "#fafafa",
|
|
9
|
-
"white-space": "nowrap"
|
|
10
|
-
},
|
|
11
|
-
"admin.content.table.cell_amount": {
|
|
12
|
-
"text-align": "right"
|
|
13
|
-
},
|
|
14
|
-
"admin.layout.tabs.item_active": {
|
|
15
|
-
"font-weight": "500",
|
|
16
|
-
"color": "#245bff"
|
|
17
|
-
},
|
|
18
|
-
"admin.layout.header.user_profile": {
|
|
19
|
-
"gap": "12px"
|
|
20
|
-
},
|
|
21
|
-
"admin.layout.header.breadcrumb": {
|
|
22
|
-
"display": "none"
|
|
23
|
-
},
|
|
24
|
-
"admin.layout.sidebar.logo_area": {
|
|
25
|
-
"background-color": "#10214d"
|
|
26
|
-
},
|
|
27
|
-
"$note": "logo_area 背景与效果图期望 #0B1A3C 不同 = 已申报固有残差(oracle.residual_accepted 命中后不计缺口,U 步正例演示)"
|
|
28
|
-
},
|
|
29
|
-
"states": {
|
|
30
|
-
"admin.content.list.batch_delete@disabled": {
|
|
31
|
-
"opacity": "0.4",
|
|
32
|
-
"cursor": "not-allowed"
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "verify 夹具 · 项目实测(故意缺口全家桶,用于 L 步回归):header_cell 字重被压 + 对齐语境错位 + white-space 未取到;cell_amount 选择器落空;user_profile gap 语境错位;breadcrumb 仍渲染可见(G12 存在性缺口);batch_delete@disabled 状态值与期望不符(G14 状态缺口——静态快照取的是激活态 opacity 1,证明状态断言闸必要性);extra_banner 为 oracle 全集未申报的孤儿点位(G15 孤儿缺口——效果图没有、验收范围外、页面却渲染)。logo_area 命中 = L 夹具不制造残差缺口、保持归因计数稳定。",
|
|
3
|
-
"sids": {
|
|
4
|
-
"admin.content.table.header_cell": {
|
|
5
|
-
"padding": "16px",
|
|
6
|
-
"font-weight": "400",
|
|
7
|
-
"text-align": "center",
|
|
8
|
-
"background-color": "#fafafa"
|
|
9
|
-
},
|
|
10
|
-
"admin.layout.tabs.item_active": {
|
|
11
|
-
"font-weight": "500",
|
|
12
|
-
"color": "#245bff"
|
|
13
|
-
},
|
|
14
|
-
"admin.layout.header.user_profile": {
|
|
15
|
-
"gap": "8px"
|
|
16
|
-
},
|
|
17
|
-
"admin.layout.header.breadcrumb": {
|
|
18
|
-
"display": "flex"
|
|
19
|
-
},
|
|
20
|
-
"admin.layout.sidebar.logo_area": {
|
|
21
|
-
"background-color": "#0b1a3c"
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"states": {
|
|
25
|
-
"admin.content.list.batch_delete@disabled": {
|
|
26
|
-
"opacity": "1",
|
|
27
|
-
"cursor": "default"
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
"extra_banner": {
|
|
31
|
-
"display": "flex"
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<!-- 回归夹具基线图:仅为 match 实物闭合提供 data-sid 标注集合,与业务页面无关;不含主题身份元数据(身份缺失仅提示不阻断)。 -->
|
|
4
|
-
<head><meta charset="utf-8"><title>回归夹具基线</title></head>
|
|
5
|
-
<body>
|
|
6
|
-
<div data-sid="admin.layout.sidebar"></div>
|
|
7
|
-
<div data-sid="admin.layout.sidebar.logo_area"></div>
|
|
8
|
-
<div data-sid="admin.layout.sidebar.menu"></div>
|
|
9
|
-
<div data-sid="admin.layout.header"></div>
|
|
10
|
-
<div data-sid="admin.layout.header.lang_switch"></div>
|
|
11
|
-
<div data-sid="admin.layout.header.user_profile"></div>
|
|
12
|
-
<div data-sid="admin.layout.tabs"></div>
|
|
13
|
-
<div data-sid="admin.content.page_header"></div>
|
|
14
|
-
<div data-sid="admin.content.filter_area"></div>
|
|
15
|
-
<div data-sid="admin.content.table.operation_bar"></div>
|
|
16
|
-
<div data-sid="admin.content.table.operation_column"></div>
|
|
17
|
-
<div data-sid="admin.content.table.area"></div>
|
|
18
|
-
<div data-sid="admin.content.table.header_cell"></div>
|
|
19
|
-
<div data-sid="admin.content.table.cell"></div>
|
|
20
|
-
<div data-sid="admin.content.table.cell_status"></div>
|
|
21
|
-
<div data-sid="admin.content.table.cell_amount"></div>
|
|
22
|
-
<div data-sid="admin.content.table.cell_thumb"></div>
|
|
23
|
-
<div data-sid="component.tag.status"></div>
|
|
24
|
-
<div data-sid="component.button.danger"></div>
|
|
25
|
-
<div data-sid="admin.content.pagination"></div>
|
|
26
|
-
</body>
|
|
27
|
-
</html>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<!-- G6 层间令牌链对账闸回归专用迷你效果图:只为 changeset-neg9/pos-g6-token-chain.json 提供
|
|
3
|
-
可读、可标注的基线实物(data-sid=admin.layout.content),隔离出唯一闸点。不是真实设计交付件。 -->
|
|
4
|
-
<html lang="zh-CN" data-mockup-theme="钴蓝">
|
|
5
|
-
<head>
|
|
6
|
-
<meta charset="UTF-8">
|
|
7
|
-
<title>G6 回归夹具 · 内容区</title>
|
|
8
|
-
</head>
|
|
9
|
-
<body>
|
|
10
|
-
<div class="app-content" data-sid="admin.layout.content" style="padding: 24px; background: #F5F5F5;"></div>
|
|
11
|
-
</body>
|
|
12
|
-
</html>
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN" data-mockup-theme="钴蓝" data-mockup-scene="admin" data-mockup-page-type="list">
|
|
3
|
-
<head><meta charset="UTF-8"><title>回归夹具·列表页基线图(中性命名)</title></head>
|
|
4
|
-
<body>
|
|
5
|
-
<div data-sid="admin.layout.sidebar"></div>
|
|
6
|
-
<div data-sid="admin.layout.sidebar.logo_area"></div>
|
|
7
|
-
<div data-sid="admin.layout.sidebar.menu"></div>
|
|
8
|
-
<div data-sid="admin.layout.header"></div>
|
|
9
|
-
<div data-sid="admin.layout.header.lang_switch"></div>
|
|
10
|
-
<div data-sid="admin.layout.header.user_profile"></div>
|
|
11
|
-
<div data-sid="admin.layout.tabs"></div>
|
|
12
|
-
<div data-sid="admin.content.page_header"></div>
|
|
13
|
-
<div data-sid="admin.content.filter_area"></div>
|
|
14
|
-
<div data-sid="admin.content.table.operation_bar"></div>
|
|
15
|
-
<div data-sid="admin.content.table.operation_column"></div>
|
|
16
|
-
<div data-sid="admin.content.table.area"></div>
|
|
17
|
-
<div data-sid="admin.content.table.header_cell"></div>
|
|
18
|
-
<div data-sid="admin.content.table.cell"></div>
|
|
19
|
-
<div data-sid="admin.content.table.cell_status"></div>
|
|
20
|
-
<div data-sid="admin.content.table.cell_amount"></div>
|
|
21
|
-
<div data-sid="admin.content.table.cell_thumb"></div>
|
|
22
|
-
<div data-sid="component.tag.status"></div>
|
|
23
|
-
<div data-sid="component.button.danger"></div>
|
|
24
|
-
<div data-sid="admin.content.pagination"></div>
|
|
25
|
-
</body>
|
|
26
|
-
</html>
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head><meta charset="UTF-8"><title>回归夹具·列表页基线图(中性命名 · 无身份元数据)</title></head>
|
|
4
|
-
<body>
|
|
5
|
-
<div data-sid="admin.layout.sidebar"></div>
|
|
6
|
-
<div data-sid="admin.layout.sidebar.logo_area"></div>
|
|
7
|
-
<div data-sid="admin.layout.sidebar.menu"></div>
|
|
8
|
-
<div data-sid="admin.layout.header"></div>
|
|
9
|
-
<div data-sid="admin.layout.header.lang_switch"></div>
|
|
10
|
-
<div data-sid="admin.layout.header.user_profile"></div>
|
|
11
|
-
<div data-sid="admin.layout.tabs"></div>
|
|
12
|
-
<div data-sid="admin.content.page_header"></div>
|
|
13
|
-
<div data-sid="admin.content.filter_area"></div>
|
|
14
|
-
<div data-sid="admin.content.table.operation_bar"></div>
|
|
15
|
-
<div data-sid="admin.content.table.operation_column"></div>
|
|
16
|
-
<div data-sid="admin.content.table.area"></div>
|
|
17
|
-
<div data-sid="admin.content.table.header_cell"></div>
|
|
18
|
-
<div data-sid="admin.content.table.cell"></div>
|
|
19
|
-
<div data-sid="admin.content.table.cell_status"></div>
|
|
20
|
-
<div data-sid="admin.content.table.cell_amount"></div>
|
|
21
|
-
<div data-sid="admin.content.table.cell_thumb"></div>
|
|
22
|
-
<div data-sid="component.tag.status"></div>
|
|
23
|
-
<div data-sid="component.button.danger"></div>
|
|
24
|
-
<div data-sid="admin.content.pagination"></div>
|
|
25
|
-
</body>
|
|
26
|
-
</html>
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "verify 夹具 · 效果图期望(computed style 转储外形)。真实抽取由浏览器链路完成,本文件仅用于回归。顶层扩展字段:absent=效果图上不存在的出厂点位(G12 存在性闸断言目标,如出厂面包屑点位未收口的失效模式);residual_accepted=申报过的固有残差(命中豁免不计缺口,reason 必填);states=交互态期望(G14 状态断言闸,键 <sid>@<state>——静态快照取不到交互态,逐点 diff 永远验不到,交互态必须由浏览器触发后抽取)。header_cell 增补 white-space 期望 = 列头截断防线的期望值加密(oracle 无期望值的属性验了等于没验)。",
|
|
3
|
-
"sids": {
|
|
4
|
-
"admin.layout.sidebar.logo_area": {
|
|
5
|
-
"background-color": "#0B1A3C"
|
|
6
|
-
},
|
|
7
|
-
"admin.content.table.header_cell": {
|
|
8
|
-
"padding": "16px",
|
|
9
|
-
"font-weight": "500",
|
|
10
|
-
"text-align": "left",
|
|
11
|
-
"background-color": "#FAFAFA",
|
|
12
|
-
"white-space": "nowrap"
|
|
13
|
-
},
|
|
14
|
-
"admin.content.table.cell_amount": {
|
|
15
|
-
"text-align": "right"
|
|
16
|
-
},
|
|
17
|
-
"admin.layout.tabs.item_active": {
|
|
18
|
-
"font-weight": "500",
|
|
19
|
-
"color": "#245BFF"
|
|
20
|
-
},
|
|
21
|
-
"admin.layout.header.user_profile": {
|
|
22
|
-
"gap": "12px"
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
"absent": [
|
|
26
|
-
"admin.layout.header.breadcrumb"
|
|
27
|
-
],
|
|
28
|
-
"states": {
|
|
29
|
-
"admin.content.list.batch_delete@disabled": {
|
|
30
|
-
"opacity": "0.4",
|
|
31
|
-
"cursor": "not-allowed"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"residual_accepted": [
|
|
35
|
-
{ "sid": "admin.layout.sidebar.logo_area", "reason": "出厂 logo 图形属业务资产,效果图占位图形与实际 logo 不逐像素比对(restore-checklist §三:只还原载体模块)" }
|
|
36
|
-
]
|
|
37
|
-
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"generated_at": "2026-09-24T07:14:25.807Z",
|
|
3
|
-
"oracle": "E:\\work\\Project\\Template\\skills\\vue3-temp-skill\\parser\\fixtures\\verify\\oracle.json",
|
|
4
|
-
"actual": "E:\\work\\Project\\Template\\skills\\vue3-temp-skill\\parser\\fixtures\\verify\\actual-clean.json",
|
|
5
|
-
"points": {
|
|
6
|
-
"admin.layout.sidebar.logo_area": {
|
|
7
|
-
"verdict": "miss",
|
|
8
|
-
"props": {
|
|
9
|
-
"background-color": {
|
|
10
|
-
"expected": "#0B1A3C",
|
|
11
|
-
"actual": "#10214d",
|
|
12
|
-
"verdict": "residual",
|
|
13
|
-
"kind": "权重被压"
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"admin.content.table.header_cell": {
|
|
18
|
-
"verdict": "hit",
|
|
19
|
-
"props": {
|
|
20
|
-
"padding": {
|
|
21
|
-
"expected": "16px",
|
|
22
|
-
"actual": "16px",
|
|
23
|
-
"verdict": "hit"
|
|
24
|
-
},
|
|
25
|
-
"font-weight": {
|
|
26
|
-
"expected": "500",
|
|
27
|
-
"actual": "500",
|
|
28
|
-
"verdict": "hit"
|
|
29
|
-
},
|
|
30
|
-
"text-align": {
|
|
31
|
-
"expected": "left",
|
|
32
|
-
"actual": "left",
|
|
33
|
-
"verdict": "hit"
|
|
34
|
-
},
|
|
35
|
-
"background-color": {
|
|
36
|
-
"expected": "#FAFAFA",
|
|
37
|
-
"actual": "#fafafa",
|
|
38
|
-
"verdict": "hit"
|
|
39
|
-
},
|
|
40
|
-
"white-space": {
|
|
41
|
-
"expected": "nowrap",
|
|
42
|
-
"actual": "nowrap",
|
|
43
|
-
"verdict": "hit"
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
"admin.content.table.cell_amount": {
|
|
48
|
-
"verdict": "hit",
|
|
49
|
-
"props": {
|
|
50
|
-
"text-align": {
|
|
51
|
-
"expected": "right",
|
|
52
|
-
"actual": "right",
|
|
53
|
-
"verdict": "hit"
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
"admin.layout.tabs.item_active": {
|
|
58
|
-
"verdict": "hit",
|
|
59
|
-
"props": {
|
|
60
|
-
"font-weight": {
|
|
61
|
-
"expected": "500",
|
|
62
|
-
"actual": "500",
|
|
63
|
-
"verdict": "hit"
|
|
64
|
-
},
|
|
65
|
-
"color": {
|
|
66
|
-
"expected": "#245BFF",
|
|
67
|
-
"actual": "#245bff",
|
|
68
|
-
"verdict": "hit"
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
"admin.layout.header.user_profile": {
|
|
73
|
-
"verdict": "hit",
|
|
74
|
-
"props": {
|
|
75
|
-
"gap": {
|
|
76
|
-
"expected": "12px",
|
|
77
|
-
"actual": "12px",
|
|
78
|
-
"verdict": "hit"
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
"admin.layout.header.breadcrumb": {
|
|
83
|
-
"verdict": "absent-hit",
|
|
84
|
-
"evidence": "display=none visibility=-"
|
|
85
|
-
},
|
|
86
|
-
"admin.content.list.batch_delete@disabled": {
|
|
87
|
-
"verdict": "hit",
|
|
88
|
-
"state": "disabled",
|
|
89
|
-
"props": {
|
|
90
|
-
"opacity": {
|
|
91
|
-
"expected": "0.4",
|
|
92
|
-
"actual": "0.4",
|
|
93
|
-
"verdict": "hit"
|
|
94
|
-
},
|
|
95
|
-
"cursor": {
|
|
96
|
-
"expected": "not-allowed",
|
|
97
|
-
"actual": "not-allowed",
|
|
98
|
-
"verdict": "hit"
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
package/parser/generator.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* generator.js — 多格式产物生成器
|
|
3
|
-
*
|
|
4
|
-
* 校验通过后,从 mapping/ 数据集生成 dist/ 下四种可交付产物:
|
|
5
|
-
* 1. dist/theme.css CSS 变量全局基线(:root 层,链路 A 空白项目按需引入)
|
|
6
|
-
* 2. dist/theme-vars.ts TypeScript 类型化主题变量对象
|
|
7
|
-
* 3. dist/theme-vars.js ESM 运行时入口(themeVars + overrideMapping,§3.4.4.3)
|
|
8
|
-
* 4. dist/mapping-type.d.ts 映射类型声明
|
|
9
|
-
*
|
|
10
|
-
* 链路 A(业务项目直接消费产物):产物随 NPM 包发布但不被
|
|
11
|
-
* vue3-web-temp 引入(其自有 design-tokens.scss 为权威令牌源,避免双令牌源冲突)。
|
|
12
|
-
*
|
|
13
|
-
* 用法:node parser/generator.js [--out <dir>] [--dry]
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { mkdirSync, writeFileSync, existsSync } from "node:fs";
|
|
17
|
-
import path from "node:path";
|
|
18
|
-
import { fileURLToPath } from "node:url";
|
|
19
|
-
import { buildMappingDataset } from "./loader.js";
|
|
20
|
-
import { buildMergedIndex } from "./validator.js";
|
|
21
|
-
|
|
22
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
23
|
-
const ROOT = path.resolve(__dirname, "..");
|
|
24
|
-
|
|
25
|
-
// ---- CLI ----
|
|
26
|
-
if (process.argv[1] && process.argv[1].endsWith("generator.js")) {
|
|
27
|
-
const outIdx = process.argv.indexOf("--out");
|
|
28
|
-
const outDir = outIdx > -1 ? path.resolve(process.argv[outIdx + 1]) : path.join(ROOT, "dist");
|
|
29
|
-
const dry = process.argv.includes("--dry");
|
|
30
|
-
const result = generateAll(outDir, dry);
|
|
31
|
-
if (!dry) {
|
|
32
|
-
console.log(`✔ 产物生成完成 → ${outDir}`);
|
|
33
|
-
for (const f of result.written)
|
|
34
|
-
console.log(` · ${f}`);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
console.log(`[dry-run] 将生成 ${result.written.length} 个文件 → ${outDir}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** 汇总所有 tokens(basic/layout 域的令牌定义),返回 { abstractField, token, default } 数组 */
|
|
42
|
-
export function collectTokens(dataset) {
|
|
43
|
-
const rows = [];
|
|
44
|
-
for (const [file, data] of Object.entries(dataset.files)) {
|
|
45
|
-
if (!data.tokens)
|
|
46
|
-
continue;
|
|
47
|
-
for (const [field, def] of Object.entries(data.tokens)) {
|
|
48
|
-
if (field.startsWith("$"))
|
|
49
|
-
continue;
|
|
50
|
-
// token 链("A → B")拆为数组:链上每个实现令牌都要生成
|
|
51
|
-
const tokenChain = typeof def.token === "string" && def.token.includes(" → ")
|
|
52
|
-
? def.token.split(" → ").map(s => s.trim()).filter(Boolean)
|
|
53
|
-
: [def.token || ""];
|
|
54
|
-
rows.push({
|
|
55
|
-
abstract: field,
|
|
56
|
-
token: tokenChain[0],
|
|
57
|
-
tokenChain,
|
|
58
|
-
default: def.default ?? "",
|
|
59
|
-
file,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return rows;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export function generateAll(outDir, dry = false) {
|
|
67
|
-
const dataset = buildMappingDataset();
|
|
68
|
-
const tokens = collectTokens(dataset);
|
|
69
|
-
const written = [];
|
|
70
|
-
|
|
71
|
-
// ---- 1. theme.css:链路 A 变量基线 ----
|
|
72
|
-
// 有出厂值的令牌生成真实 CSS 自定义属性(空白项目引入即得完整基线);
|
|
73
|
-
// 无出厂值的仅生成注释索引(需项目侧自行定值)。
|
|
74
|
-
const cssBody = [];
|
|
75
|
-
for (const t of tokens) {
|
|
76
|
-
if (!t.default) {
|
|
77
|
-
cssBody.push(` /* ${t.abstract} → ${t.token || "(value token)"}(无出厂值,需项目侧定值) */`);
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
for (const token of t.tokenChain) {
|
|
81
|
-
if (!token)
|
|
82
|
-
continue;
|
|
83
|
-
cssBody.push(` ${token}: ${t.default}; /* ← ${t.abstract} */`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
const cssLines = [
|
|
87
|
-
"/* AUTO-GENERATED by vue3-temp-skill parser/generator.js — DO NOT EDIT */",
|
|
88
|
-
"/* 链路 A(基线注入)产物:全局令牌变量基线。",
|
|
89
|
-
" * 仅空白新项目从零接入 Skill 主题体系时在样式入口引入一次;",
|
|
90
|
-
" * 成熟模板项目(自有 design-tokens.scss 权威令牌源)不得引入,避免双令牌源冲突。 */",
|
|
91
|
-
":root {",
|
|
92
|
-
...cssBody,
|
|
93
|
-
"}",
|
|
94
|
-
"",
|
|
95
|
-
];
|
|
96
|
-
|
|
97
|
-
// ---- 2. theme-vars.ts:类型化变量对象 ----
|
|
98
|
-
const tsLines = [
|
|
99
|
-
"// AUTO-GENERATED by vue3-temp-skill parser/generator.js — DO NOT EDIT",
|
|
100
|
-
"export const themeVars = {",
|
|
101
|
-
...tokens.map(t => ` /** ${t.tokenChain.join(" → ") || "value token"}${t.default ? ` 出厂 ${t.default}` : ""} */`),
|
|
102
|
-
...tokens.map(t => ` ${toCamel(t.abstract)}: '${t.default}' as string,`),
|
|
103
|
-
"} as const;",
|
|
104
|
-
"",
|
|
105
|
-
"export type ThemeVarKey = keyof typeof themeVars;",
|
|
106
|
-
"",
|
|
107
|
-
];
|
|
108
|
-
|
|
109
|
-
// ---- 2.5 theme-vars.js:ESM 运行时入口(链路 A 配套,业务级覆写 API 挂载点 §3.4.4.3)----
|
|
110
|
-
const jsLines = [
|
|
111
|
-
"// AUTO-GENERATED by vue3-temp-skill parser/generator.js — DO NOT EDIT",
|
|
112
|
-
"// 链路 A 运行时入口:themeVars + overrideMapping(业务级覆写)",
|
|
113
|
-
"// 用法:import { themeVars, overrideMapping } from '@qilitt-mickey/vue3-temp-skill/dist/theme-vars.js';",
|
|
114
|
-
"// const custom = overrideMapping(themeVars, { color: { brandPrimary: '#ff6600' } });",
|
|
115
|
-
"export const themeVars = {",
|
|
116
|
-
...tokens.map(t => ` ${toCamel(t.abstract)}: '${t.default}',`),
|
|
117
|
-
"};",
|
|
118
|
-
"",
|
|
119
|
-
"export { overrideMapping, overrideMappings } from '../parser/override.js';",
|
|
120
|
-
"",
|
|
121
|
-
];
|
|
122
|
-
|
|
123
|
-
// ---- 3. mapping-type.d.ts:映射条目类型声明 ----
|
|
124
|
-
const dtsLines = [
|
|
125
|
-
"// AUTO-GENERATED by vue3-temp-skill parser/generator.js — DO NOT EDIT",
|
|
126
|
-
"",
|
|
127
|
-
"/** 语义 ID 映射条目(结构与 mapping/scenes/**.json 条目一致) */",
|
|
128
|
-
"export interface SemanticMappingEntry {",
|
|
129
|
-
" type: 'module' | 'component' | 'element' | 'global_component' | 'global_token';",
|
|
130
|
-
" selector?: string;",
|
|
131
|
-
" component?: string;",
|
|
132
|
-
" file?: string;",
|
|
133
|
-
" style_scope: string;",
|
|
134
|
-
" default_props?: Record<string, unknown>;",
|
|
135
|
-
" children?: string[];",
|
|
136
|
-
" forms?: Record<string, string>;",
|
|
137
|
-
" visible_prop?: string;",
|
|
138
|
-
" css_vars?: Record<string, string>;",
|
|
139
|
-
" custom_style_map?: Record<string, string>;",
|
|
140
|
-
" [key: string]: unknown;",
|
|
141
|
-
"}",
|
|
142
|
-
"",
|
|
143
|
-
"/** 设计变更集(design.changeset/1.0 输入,兼容历史值 design-changeset/v1) */",
|
|
144
|
-
"export interface DesignChangeset {",
|
|
145
|
-
" schema: 'design.changeset/1.0' | 'design-changeset/v1';",
|
|
146
|
-
" mapping_version?: string;",
|
|
147
|
-
" scene: string;",
|
|
148
|
-
" layout_type?: string;",
|
|
149
|
-
" global?: Record<string, Record<string, string | number>>;",
|
|
150
|
-
" changes: Array<{",
|
|
151
|
-
" id: string;",
|
|
152
|
-
" visible?: boolean;",
|
|
153
|
-
" position?: Record<string, string>;",
|
|
154
|
-
" form?: string;",
|
|
155
|
-
" style?: Record<string, string | number>;",
|
|
156
|
-
" }>;",
|
|
157
|
-
"}",
|
|
158
|
-
"",
|
|
159
|
-
];
|
|
160
|
-
|
|
161
|
-
if (!dry) {
|
|
162
|
-
mkdirSync(outDir, { recursive: true });
|
|
163
|
-
writeFileSync(path.join(outDir, "theme.css"), cssLines.join("\n"), "utf-8");
|
|
164
|
-
writeFileSync(path.join(outDir, "theme-vars.ts"), tsLines.join("\n"), "utf-8");
|
|
165
|
-
writeFileSync(path.join(outDir, "theme-vars.js"), jsLines.join("\n"), "utf-8");
|
|
166
|
-
writeFileSync(path.join(outDir, "mapping-type.d.ts"), dtsLines.join("\n"), "utf-8");
|
|
167
|
-
written.push("theme.css", "theme-vars.ts", "theme-vars.js", "mapping-type.d.ts");
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
written.push("theme.css", "theme-vars.ts", "theme-vars.js", "mapping-type.d.ts");
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return { written, tokenCount: tokens.length };
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function toCamel(s) {
|
|
177
|
-
return s.replaceAll(/[_-](\w)/g, (_, c) => c.toUpperCase());
|
|
178
|
-
}
|