@sparknest/theme-contract-vue 0.0.0-stage → 1.1.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 +27 -2
- package/bin/theme-contract.mjs +31 -0
- package/contracts/legacy-denylist.json +184 -0
- package/contracts/theme-contract.json +3283 -0
- package/package.json +31 -3
- package/schema/theme-contract.schema.json +105 -0
- package/src/checker.mjs +257 -0
- package/src/index.mjs +25 -0
- package/src/normalize-value.mjs +14 -0
- package/src/normalize-value.test.mjs +24 -0
- package/src/platform-values.test.mjs +62 -0
package/README.md
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @sparknest/theme-contract-vue
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Cedar 与 Maple 的主题公共契约。`tokens.components` 是两端必须同时实现的公共 Token;`platformExtensions` 只登记确有不同 DOM/交互职责的组件,未登记组件不得增加单端公开 Token。
|
|
4
|
+
|
|
5
|
+
`pnpm check` 会验证系统 Token、受管 system 颜色与组件 Token 的标准值、公共组件 Token、平台扩展边界、主题覆盖引用、旧 Token denylist 与文档中的 Token 名称。新增主题变量时应先决定它属于公共语义还是平台结构,不得用未消费的兼容别名制造表面对齐。
|
|
6
|
+
|
|
7
|
+
Cedar 与 Maple 的中立主题契约事实来源。
|
|
8
|
+
|
|
9
|
+
- `contracts/theme-contract.json` 管理两端必须共同遵守的组件和规则。
|
|
10
|
+
- `systemTokenValues` 使用 `--PREFIX-` 作为中立占位符,登记跨端同义同值的颜色、间距、圆角、文字、动效与层级角色;其余显式平台默认共同覆盖所有 system 名称。
|
|
11
|
+
- `componentTokenValues` 分批登记完成治理的公开组件 Token 默认值;未登记不表示允许漂移,而是尚待迁移。
|
|
12
|
+
- `platformSystemTokenValues` 登记控件密度、浮层层级等有依据的平台差异;每个 system 名称必须在共享值或该端平台值中且只出现一次。
|
|
13
|
+
- `platformComponentTokenValues` 按 cedar/maple 登记几何、密度及明确的平台语义默认差异;与共享 componentTokenValues 不得重叠。它不豁免名称、消费路径或主题检查。Checkbox 的 `mark-color` 是共享公开名称,但保留现有默认语义:Cedar 为 `surface-default`,Maple 为 `content-on-bright`,不通过统一登记来改变任一主题的实际配色。
|
|
14
|
+
- `schema/theme-contract.schema.json` 约束契约文件结构。
|
|
15
|
+
- 两端检查器必须从本包读取契约,禁止各自维护组件白名单。
|
|
16
|
+
- 公共组件 token 使用相同逻辑名;`c` 与 `mp` 只作为平台前缀。
|
|
17
|
+
- Switch 的 `checked-text-color` 是公开选中态前景:Cedar 默认跟随 `switch-text-color`,Maple 默认使用 `content-on-bright`。主题通过公开 token 覆盖,不能直接覆盖 `internal` token;Maple 浅色主题迁移后仍使用原有 `content-on-dark`。
|
|
18
|
+
- 不允许兼容别名,品牌主题不得覆盖 `internal` token。
|
|
19
|
+
|
|
20
|
+
新增或修改公共主题能力时,先修改本包契约,再同时修改 Cedar 与 Maple。
|
|
21
|
+
|
|
22
|
+
CSS 变量的分层、公开边界和选用规则见 [Design Token 规范](../../standards/design-tokens.md)。
|
|
23
|
+
|
|
24
|
+
`pnpm sync` 仅用于经过评审的契约变更;日常开发和 CI 使用 `pnpm check`,源码与已登记 token 不一致时直接失败。
|
|
25
|
+
|
|
26
|
+
检查同时覆盖主题覆盖合法性、`internal` 隔离、旧变量 denylist,以及受管组件文档中的变量引用。
|
|
27
|
+
|
|
28
|
+
`node ../../bin/token-inventory.mjs --check-consumers --summary` 审计全部组件声明消费;`node ../../bin/token-catalog.mjs --check` 校验两端菜单参考页。二者与名称/值契约是独立门禁,不代替真实浏览器状态验收。默认值规范化仅消除前缀、Less var 引号和等价 rgb alpha 写法,不把不同的语义变量或单位归并成“同值”。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
4
|
+
import { dirname, resolve } from 'node:path'
|
|
5
|
+
import { fileURLToPath } from 'node:url'
|
|
6
|
+
import { checkThemeContract, collectThemeContract } from '../src/checker.mjs'
|
|
7
|
+
|
|
8
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
|
9
|
+
const workspace = resolve(packageRoot, '../../..')
|
|
10
|
+
const sources = {
|
|
11
|
+
cedarSource: resolve(workspace, 'cedar-design-web/packages/ui/src'),
|
|
12
|
+
mapleSource: resolve(workspace, 'maple-design-mobile/packages/ui/src'),
|
|
13
|
+
}
|
|
14
|
+
const command = process.argv[2] ?? 'check'
|
|
15
|
+
|
|
16
|
+
if (command === 'sync') {
|
|
17
|
+
const path = resolve(packageRoot, 'contracts/theme-contract.json')
|
|
18
|
+
const contract = JSON.parse(readFileSync(path, 'utf8'))
|
|
19
|
+
contract.tokens = collectThemeContract(sources)
|
|
20
|
+
writeFileSync(path, `${JSON.stringify(contract, null, 2)}\n`)
|
|
21
|
+
console.log(`Theme contract synchronized: ${contract.tokens.system.length} system tokens, ${contract.components.length} components.`)
|
|
22
|
+
} else if (command === 'check') {
|
|
23
|
+
const result = checkThemeContract(sources)
|
|
24
|
+
console.log(
|
|
25
|
+
`Theme contract passed: ${result.systemCount} system tokens, ` +
|
|
26
|
+
`${result.systemValueCount} governed system values, ${result.componentValueCount} governed component values, ` +
|
|
27
|
+
`${result.platformSystemValueCount} platform system values, ${result.platformComponentValueCount} platform component values, and ${result.componentCount} components.`,
|
|
28
|
+
)
|
|
29
|
+
} else {
|
|
30
|
+
throw new Error(`Unknown command: ${command}`)
|
|
31
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cedar": [
|
|
3
|
+
"verification-code-column-gap",
|
|
4
|
+
"rate-gap-size",
|
|
5
|
+
"rate-font-size",
|
|
6
|
+
"rate-scale-active",
|
|
7
|
+
"rate-bg-active",
|
|
8
|
+
"rate-bg",
|
|
9
|
+
"rate-transition-duration-scale",
|
|
10
|
+
"checkbox-mask-bg-checked",
|
|
11
|
+
"checkbox-mask-border-color",
|
|
12
|
+
"checkbox-text-color",
|
|
13
|
+
"radio-bg-checked",
|
|
14
|
+
"radio-border-color",
|
|
15
|
+
"radio-text-color",
|
|
16
|
+
"textarea-color-tip-text",
|
|
17
|
+
"textarea-font-tip-size",
|
|
18
|
+
"textarea-layout-tip-right",
|
|
19
|
+
"textarea-padding-x",
|
|
20
|
+
"textarea-padding-y",
|
|
21
|
+
"textarea-size-min-height",
|
|
22
|
+
"upload-trigger-gap",
|
|
23
|
+
"upload-trigger-border-radius",
|
|
24
|
+
"upload-icon-font-size",
|
|
25
|
+
"upload-list-gap",
|
|
26
|
+
"upload-picture-grid-gap",
|
|
27
|
+
"upload-item-gap",
|
|
28
|
+
"upload-item-border-radius",
|
|
29
|
+
"upload-item-padding-vertical",
|
|
30
|
+
"upload-item-padding-horizontal",
|
|
31
|
+
"upload-item-picture-min-height",
|
|
32
|
+
"upload-item-picture-padding",
|
|
33
|
+
"upload-thumb-border-radius",
|
|
34
|
+
"upload-meta-gap",
|
|
35
|
+
"upload-meta-picture-card-padding-vertical",
|
|
36
|
+
"upload-meta-picture-card-padding-horizontal",
|
|
37
|
+
"upload-meta-picture-card-color",
|
|
38
|
+
"upload-size-font-size",
|
|
39
|
+
"upload-status-icon-font-size",
|
|
40
|
+
"upload-actions-gap",
|
|
41
|
+
"upload-action-border-radius",
|
|
42
|
+
"upload-action-picture-card-color",
|
|
43
|
+
"upload-progress-border-radius",
|
|
44
|
+
"upload-picture-overlay-bg",
|
|
45
|
+
"upload-picture-card-overlay-bg",
|
|
46
|
+
"upload-picture-action-bg"
|
|
47
|
+
],
|
|
48
|
+
"maple": [
|
|
49
|
+
"rate-color",
|
|
50
|
+
"rate-primary-color",
|
|
51
|
+
"alert-action-margin",
|
|
52
|
+
"alert-close-icon-margin",
|
|
53
|
+
"alert-close-icon-size",
|
|
54
|
+
"alert-danger-background",
|
|
55
|
+
"alert-default-background",
|
|
56
|
+
"alert-default-border-color",
|
|
57
|
+
"alert-default-text-color",
|
|
58
|
+
"alert-icon-margin",
|
|
59
|
+
"alert-info-background",
|
|
60
|
+
"alert-message-font-size",
|
|
61
|
+
"alert-message-line-height",
|
|
62
|
+
"alert-message-margin-top",
|
|
63
|
+
"alert-padding",
|
|
64
|
+
"alert-standard-danger-text-color",
|
|
65
|
+
"alert-standard-info-text-color",
|
|
66
|
+
"alert-standard-success-text-color",
|
|
67
|
+
"alert-standard-warning-text-color",
|
|
68
|
+
"alert-success-background",
|
|
69
|
+
"alert-title-font-size",
|
|
70
|
+
"alert-title-font-weight",
|
|
71
|
+
"alert-tonal-danger-background",
|
|
72
|
+
"alert-tonal-danger-text-color",
|
|
73
|
+
"alert-tonal-info-background",
|
|
74
|
+
"alert-tonal-info-text-color",
|
|
75
|
+
"alert-tonal-success-background",
|
|
76
|
+
"alert-tonal-success-text-color",
|
|
77
|
+
"alert-tonal-warning-background",
|
|
78
|
+
"alert-tonal-warning-text-color",
|
|
79
|
+
"alert-warning-background",
|
|
80
|
+
"checkbox-checked-color",
|
|
81
|
+
"checkbox-disabled-color",
|
|
82
|
+
"checkbox-error-color",
|
|
83
|
+
"checkbox-icon-size",
|
|
84
|
+
"checkbox-text-color",
|
|
85
|
+
"checkbox-unchecked-color",
|
|
86
|
+
"radio-checked-color",
|
|
87
|
+
"radio-disabled-color",
|
|
88
|
+
"radio-error-color",
|
|
89
|
+
"radio-icon-size",
|
|
90
|
+
"radio-text-color",
|
|
91
|
+
"radio-unchecked-color",
|
|
92
|
+
"tag-font-weight",
|
|
93
|
+
"tag-icon-margin",
|
|
94
|
+
"tag-padding",
|
|
95
|
+
"tag-size-lg-height",
|
|
96
|
+
"tag-size-lg-icon-margin",
|
|
97
|
+
"tag-size-lg-padding",
|
|
98
|
+
"tag-size-md-height",
|
|
99
|
+
"tag-size-md-icon-margin",
|
|
100
|
+
"tag-size-md-padding",
|
|
101
|
+
"tag-size-sm-height",
|
|
102
|
+
"tag-size-sm-icon-margin",
|
|
103
|
+
"tag-size-sm-padding",
|
|
104
|
+
"tag-size-xl-height",
|
|
105
|
+
"tag-size-xl-icon-margin",
|
|
106
|
+
"tag-size-xl-padding",
|
|
107
|
+
"tag-size-xs-height",
|
|
108
|
+
"tag-size-xs-icon-margin",
|
|
109
|
+
"tag-size-xs-padding",
|
|
110
|
+
"tag-status-danger-border-color",
|
|
111
|
+
"tag-status-danger-color",
|
|
112
|
+
"tag-status-default-border-color",
|
|
113
|
+
"tag-status-default-color",
|
|
114
|
+
"tag-status-default-text-color",
|
|
115
|
+
"tag-status-info-border-color",
|
|
116
|
+
"tag-status-info-color",
|
|
117
|
+
"tag-status-primary-border-color",
|
|
118
|
+
"tag-status-primary-color",
|
|
119
|
+
"tag-status-secondary-border-color",
|
|
120
|
+
"tag-status-secondary-color",
|
|
121
|
+
"tag-status-success-border-color",
|
|
122
|
+
"tag-status-success-color",
|
|
123
|
+
"tag-status-tertiary-border-color",
|
|
124
|
+
"tag-status-tertiary-color",
|
|
125
|
+
"tag-status-warning-border-color",
|
|
126
|
+
"tag-status-warning-color",
|
|
127
|
+
"search-height",
|
|
128
|
+
"search-padding",
|
|
129
|
+
"search-background",
|
|
130
|
+
"search-field-height",
|
|
131
|
+
"search-field-padding",
|
|
132
|
+
"search-field-background",
|
|
133
|
+
"search-label-color",
|
|
134
|
+
"search-label-margin-right",
|
|
135
|
+
"search-action-color",
|
|
136
|
+
"search-action-margin-left",
|
|
137
|
+
"search-icon-color",
|
|
138
|
+
"search-history-padding",
|
|
139
|
+
"search-history-item-height",
|
|
140
|
+
"search-history-item-color",
|
|
141
|
+
"search-history-item-border-color",
|
|
142
|
+
"upload-action-background",
|
|
143
|
+
"upload-action-icon-color",
|
|
144
|
+
"upload-file-name-background",
|
|
145
|
+
"upload-file-name-color",
|
|
146
|
+
"upload-file-cover-background",
|
|
147
|
+
"upload-action-icon-size",
|
|
148
|
+
"upload-action-margin",
|
|
149
|
+
"upload-file-size",
|
|
150
|
+
"upload-file-margin",
|
|
151
|
+
"upload-file-name-font-size",
|
|
152
|
+
"upload-file-name-padding",
|
|
153
|
+
"upload-file-text-align",
|
|
154
|
+
"upload-file-border-radius",
|
|
155
|
+
"upload-file-close-background",
|
|
156
|
+
"upload-file-close-size",
|
|
157
|
+
"upload-file-close-icon-font-size",
|
|
158
|
+
"upload-file-close-icon-color",
|
|
159
|
+
"upload-file-cover-fit",
|
|
160
|
+
"upload-preview-video-width",
|
|
161
|
+
"upload-preview-video-height",
|
|
162
|
+
"upload-file-indicator-height",
|
|
163
|
+
"upload-file-indicator-normal-color",
|
|
164
|
+
"upload-file-indicator-success-color",
|
|
165
|
+
"upload-file-indicator-error-color",
|
|
166
|
+
"upload-file-progress-color",
|
|
167
|
+
"upload-disabled-color",
|
|
168
|
+
"upload-disabled-text-color",
|
|
169
|
+
"upload-loading-background",
|
|
170
|
+
"carousel-indicator-color",
|
|
171
|
+
"carousel-indicators-offset",
|
|
172
|
+
"carousel-indicator-offset",
|
|
173
|
+
"carousel-navigation-button-width",
|
|
174
|
+
"carousel-navigation-button-height",
|
|
175
|
+
"carousel-navigation-button-border-radius",
|
|
176
|
+
"carousel-navigation-button-background",
|
|
177
|
+
"carousel-navigation-button-color",
|
|
178
|
+
"carousel-navigation-icon-size",
|
|
179
|
+
"carousel-navigation-prev-left",
|
|
180
|
+
"carousel-navigation-next-right",
|
|
181
|
+
"carousel-navigation-prev-top",
|
|
182
|
+
"carousel-navigation-next-bottom"
|
|
183
|
+
]
|
|
184
|
+
}
|