dsh-theme-gallery 0.2.0 → 0.4.0
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 +176 -30
- package/lib/client.js +2388 -70
- package/lib/index.js +3 -3
- package/lib/palette-schemes.json +20 -0
- package/lib/themes/hu-po-mao-mi.json +290 -0
- package/lib/themes/hu-zi-a-huang.json +290 -0
- package/lib/themes/meng-hai-you-yu.json +1 -1
- package/lib/themes/pei-an-jie-xin.json +1 -1
- package/lib/themes/shan-qing-ting-cai.json +1 -1
- package/lib/themes/shi-liu-jin.json +293 -0
- package/lib/themes/ying-mu-cai-yun.json +1 -1
- package/package.json +7 -4
- package/schema/theme.schema.json +39 -3
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "shi-liu-jin",
|
|
4
|
+
"label": "纯色/拼色",
|
|
5
|
+
"description": "石榴红撞赤金与翡翠 —— 纯色排 × 拼色排的配色卡:15 个色块铺满卡面,不含侧栏素材",
|
|
6
|
+
"colorScheme": "light",
|
|
7
|
+
"tokens": {
|
|
8
|
+
"--dsw-alias-bg-base": {
|
|
9
|
+
"light": "linear-gradient(to bottom,#FBF7EC 0%,#F2ECDE 55%,#EADFC4 100%)",
|
|
10
|
+
"dark": "linear-gradient(to bottom,#FBF7EC 0%,#F2ECDE 55%,#EADFC4 100%)"
|
|
11
|
+
},
|
|
12
|
+
"--dsw-alias-bg-layer-1": {
|
|
13
|
+
"light": "#F0F0F4",
|
|
14
|
+
"dark": "#F0F0F4"
|
|
15
|
+
},
|
|
16
|
+
"--dsw-alias-bg-layer-2": {
|
|
17
|
+
"light": "#FFFBF0",
|
|
18
|
+
"dark": "#FFFBF0"
|
|
19
|
+
},
|
|
20
|
+
"--dsw-alias-bg-layer-3": {
|
|
21
|
+
"light": "#FFFBF0",
|
|
22
|
+
"dark": "#FFFBF0"
|
|
23
|
+
},
|
|
24
|
+
"--dsw-alias-bg-overlay": {
|
|
25
|
+
"light": "#EEDEB0",
|
|
26
|
+
"dark": "#EEDEB0"
|
|
27
|
+
},
|
|
28
|
+
"--dsw-alias-bg-skeleton": {
|
|
29
|
+
"light": "#D1D9E0",
|
|
30
|
+
"dark": "#D1D9E0"
|
|
31
|
+
},
|
|
32
|
+
"--dsw-alias-bg-module-platform": {
|
|
33
|
+
"light": "#EEDEB0",
|
|
34
|
+
"dark": "#EEDEB0"
|
|
35
|
+
},
|
|
36
|
+
"--dsw-alias-bg-multi-select": {
|
|
37
|
+
"light": "#EEDEB0",
|
|
38
|
+
"dark": "#EEDEB0"
|
|
39
|
+
},
|
|
40
|
+
"--dsw-alias-border-l1": {
|
|
41
|
+
"light": "#9D29330F",
|
|
42
|
+
"dark": "#9D29330F"
|
|
43
|
+
},
|
|
44
|
+
"--dsw-alias-border-l2": {
|
|
45
|
+
"light": "#9D293321",
|
|
46
|
+
"dark": "#9D293321"
|
|
47
|
+
},
|
|
48
|
+
"--dsw-alias-border-l3": {
|
|
49
|
+
"light": "#9D29332E",
|
|
50
|
+
"dark": "#9D29332E"
|
|
51
|
+
},
|
|
52
|
+
"--dsw-alias-border-l4": {
|
|
53
|
+
"light": "#D1D9E080",
|
|
54
|
+
"dark": "#D1D9E080"
|
|
55
|
+
},
|
|
56
|
+
"--dsw-alias-brand-primary": {
|
|
57
|
+
"light": "#9D2933",
|
|
58
|
+
"dark": "#9D2933"
|
|
59
|
+
},
|
|
60
|
+
"--dsw-alias-brand-primary-invert": {
|
|
61
|
+
"light": "#FFFFFF",
|
|
62
|
+
"dark": "#FFFFFF"
|
|
63
|
+
},
|
|
64
|
+
"--dsw-alias-brand-text": {
|
|
65
|
+
"light": "#9D2933",
|
|
66
|
+
"dark": "#9D2933"
|
|
67
|
+
},
|
|
68
|
+
"--dsw-alias-label-primary": {
|
|
69
|
+
"light": "#312520",
|
|
70
|
+
"dark": "#312520"
|
|
71
|
+
},
|
|
72
|
+
"--dsw-alias-label-primary-bluish": {
|
|
73
|
+
"light": "#312520",
|
|
74
|
+
"dark": "#312520"
|
|
75
|
+
},
|
|
76
|
+
"--dsw-alias-label-secondary": {
|
|
77
|
+
"light": "#574266",
|
|
78
|
+
"dark": "#574266"
|
|
79
|
+
},
|
|
80
|
+
"--dsw-alias-label-tertiary": {
|
|
81
|
+
"light": "#75664D",
|
|
82
|
+
"dark": "#75664D"
|
|
83
|
+
},
|
|
84
|
+
"--dsw-alias-label-caption": {
|
|
85
|
+
"light": "#75664D",
|
|
86
|
+
"dark": "#75664D"
|
|
87
|
+
},
|
|
88
|
+
"--dsw-alias-label-dimmed": {
|
|
89
|
+
"light": "#9A8C76",
|
|
90
|
+
"dark": "#9A8C76"
|
|
91
|
+
},
|
|
92
|
+
"--dsw-alias-label-primary-dimmed": {
|
|
93
|
+
"light": "#574266",
|
|
94
|
+
"dark": "#574266"
|
|
95
|
+
},
|
|
96
|
+
"--dsw-alias-label-primary-foreground": {
|
|
97
|
+
"light": "#FFFFFF",
|
|
98
|
+
"dark": "#FFFFFF"
|
|
99
|
+
},
|
|
100
|
+
"--dsw-alias-label-primary-inverted": {
|
|
101
|
+
"light": "#FFFFFF",
|
|
102
|
+
"dark": "#FFFFFF"
|
|
103
|
+
},
|
|
104
|
+
"--dsw-alias-link": {
|
|
105
|
+
"light": "#9D2933",
|
|
106
|
+
"dark": "#9D2933"
|
|
107
|
+
},
|
|
108
|
+
"--dsw-alias-interactive-bg-hover": {
|
|
109
|
+
"light": "#9D293314",
|
|
110
|
+
"dark": "#9D293314"
|
|
111
|
+
},
|
|
112
|
+
"--dsw-alias-interactive-bg-active": {
|
|
113
|
+
"light": "#F20C002E",
|
|
114
|
+
"dark": "#F20C002E"
|
|
115
|
+
},
|
|
116
|
+
"--dsw-alias-interactive-bg-hover-solid": {
|
|
117
|
+
"light": "#EEDEB0",
|
|
118
|
+
"dark": "#EEDEB0"
|
|
119
|
+
},
|
|
120
|
+
"--dsw-alias-interactive-bg-hover-accent": {
|
|
121
|
+
"light": "#F20C003D",
|
|
122
|
+
"dark": "#F20C003D"
|
|
123
|
+
},
|
|
124
|
+
"--dsw-alias-button-primary-fill": {
|
|
125
|
+
"light": "#9D2933",
|
|
126
|
+
"dark": "#9D2933"
|
|
127
|
+
},
|
|
128
|
+
"--dsw-alias-button-primary-hover": {
|
|
129
|
+
"light": "#B33A45",
|
|
130
|
+
"dark": "#B33A45"
|
|
131
|
+
},
|
|
132
|
+
"--dsw-alias-button-primary-dimmed": {
|
|
133
|
+
"light": "#9D293347",
|
|
134
|
+
"dark": "#9D293347"
|
|
135
|
+
},
|
|
136
|
+
"--dsw-alias-button-ghost-active-fill": {
|
|
137
|
+
"light": "#F20C0029",
|
|
138
|
+
"dark": "#F20C0029"
|
|
139
|
+
},
|
|
140
|
+
"--dsw-alias-button-ghost-active-border": {
|
|
141
|
+
"light": "#F20C00",
|
|
142
|
+
"dark": "#F20C00"
|
|
143
|
+
},
|
|
144
|
+
"--dsw-alias-button-ghost-active-hover": {
|
|
145
|
+
"light": "#F20C0047",
|
|
146
|
+
"dark": "#F20C0047"
|
|
147
|
+
},
|
|
148
|
+
"--dsw-alias-button-info-fill": {
|
|
149
|
+
"light": "#574266",
|
|
150
|
+
"dark": "#574266"
|
|
151
|
+
},
|
|
152
|
+
"--dsw-alias-button-info-hover": {
|
|
153
|
+
"light": "#75664D",
|
|
154
|
+
"dark": "#75664D"
|
|
155
|
+
},
|
|
156
|
+
"--dsw-alias-button-elevated-fill": {
|
|
157
|
+
"light": "#FFFBF0",
|
|
158
|
+
"dark": "#FFFBF0"
|
|
159
|
+
},
|
|
160
|
+
"--dsw-alias-button-floating-fill": {
|
|
161
|
+
"light": "#FFFBF0",
|
|
162
|
+
"dark": "#FFFBF0"
|
|
163
|
+
},
|
|
164
|
+
"--dsw-alias-button-floating-hover": {
|
|
165
|
+
"light": "#F7F0E0",
|
|
166
|
+
"dark": "#F7F0E0"
|
|
167
|
+
},
|
|
168
|
+
"--dsw-alias-button-contrast-fill": {
|
|
169
|
+
"light": "#312520",
|
|
170
|
+
"dark": "#312520"
|
|
171
|
+
},
|
|
172
|
+
"--dsw-alias-markdown-code-block": {
|
|
173
|
+
"light": "#F0F0F4",
|
|
174
|
+
"dark": "#F0F0F4"
|
|
175
|
+
},
|
|
176
|
+
"--dsw-alias-markdown-code-block-banner": {
|
|
177
|
+
"light": "#E4E6EC",
|
|
178
|
+
"dark": "#E4E6EC"
|
|
179
|
+
},
|
|
180
|
+
"--dsw-alias-markdown-inline-code": {
|
|
181
|
+
"light": "#EEDEB0",
|
|
182
|
+
"dark": "#EEDEB0"
|
|
183
|
+
},
|
|
184
|
+
"--dsw-alias-markdown-citation": {
|
|
185
|
+
"light": "#EEDEB0",
|
|
186
|
+
"dark": "#EEDEB0"
|
|
187
|
+
},
|
|
188
|
+
"--dsw-alias-markdown-tag": {
|
|
189
|
+
"light": "#EEDEB0",
|
|
190
|
+
"dark": "#EEDEB0"
|
|
191
|
+
},
|
|
192
|
+
"--dsw-alias-markdown-placeholder": {
|
|
193
|
+
"light": "#D1D9E0",
|
|
194
|
+
"dark": "#D1D9E0"
|
|
195
|
+
},
|
|
196
|
+
"--dsw-alias-markdown-code-segment-selected": {
|
|
197
|
+
"light": "#F20C0029",
|
|
198
|
+
"dark": "#F20C0029"
|
|
199
|
+
},
|
|
200
|
+
"--dsw-alias-markdown-code-segment-unselected": {
|
|
201
|
+
"light": "#F0F0F4",
|
|
202
|
+
"dark": "#F0F0F4"
|
|
203
|
+
},
|
|
204
|
+
"--dsw-alias-scrollbar-bg-l1": {
|
|
205
|
+
"light": "#9D293329",
|
|
206
|
+
"dark": "#9D293329"
|
|
207
|
+
},
|
|
208
|
+
"--dsw-alias-scrollbar-bg-l2": {
|
|
209
|
+
"light": "#9D293338",
|
|
210
|
+
"dark": "#9D293338"
|
|
211
|
+
},
|
|
212
|
+
"--dsw-alias-scrollbar-hover-l1": {
|
|
213
|
+
"light": "#9D293352",
|
|
214
|
+
"dark": "#9D293352"
|
|
215
|
+
},
|
|
216
|
+
"--dsw-alias-scrollbar-hover-l2": {
|
|
217
|
+
"light": "#9D293366",
|
|
218
|
+
"dark": "#9D293366"
|
|
219
|
+
},
|
|
220
|
+
"--dsw-alias-tooltip-bg": {
|
|
221
|
+
"light": "#312520",
|
|
222
|
+
"dark": "#312520"
|
|
223
|
+
},
|
|
224
|
+
"--dsw-alias-toast-bg": {
|
|
225
|
+
"light": "#FFFBF0",
|
|
226
|
+
"dark": "#FFFBF0"
|
|
227
|
+
},
|
|
228
|
+
"--dsw-alias-state-error-primary": {
|
|
229
|
+
"light": "#C2352B",
|
|
230
|
+
"dark": "#C2352B"
|
|
231
|
+
},
|
|
232
|
+
"--dsw-alias-state-error-secondary": {
|
|
233
|
+
"light": "#DB5A6B",
|
|
234
|
+
"dark": "#DB5A6B"
|
|
235
|
+
},
|
|
236
|
+
"--dsw-alias-state-success-primary": {
|
|
237
|
+
"light": "#1DA981",
|
|
238
|
+
"dark": "#1DA981"
|
|
239
|
+
},
|
|
240
|
+
"--dsw-alias-state-success-secondary": {
|
|
241
|
+
"light": "#7FE3C0",
|
|
242
|
+
"dark": "#7FE3C0"
|
|
243
|
+
},
|
|
244
|
+
"--dsw-alias-state-success-tertiary": {
|
|
245
|
+
"light": "#D8F5E8",
|
|
246
|
+
"dark": "#D8F5E8"
|
|
247
|
+
},
|
|
248
|
+
"--dsw-alias-state-warn-primary": {
|
|
249
|
+
"light": "#C89B40",
|
|
250
|
+
"dark": "#C89B40"
|
|
251
|
+
},
|
|
252
|
+
"--dsw-alias-state-warn-secondary": {
|
|
253
|
+
"light": "#EACD76",
|
|
254
|
+
"dark": "#EACD76"
|
|
255
|
+
},
|
|
256
|
+
"--dsw-alias-state-warn-tertiary": {
|
|
257
|
+
"light": "#F7EBC8",
|
|
258
|
+
"dark": "#F7EBC8"
|
|
259
|
+
},
|
|
260
|
+
"--dsw-alias-state-warn-label": {
|
|
261
|
+
"light": "#7A5A0E",
|
|
262
|
+
"dark": "#7A5A0E"
|
|
263
|
+
},
|
|
264
|
+
"--dsw-alias-state-business-primary": {
|
|
265
|
+
"light": "#3DE1AD",
|
|
266
|
+
"dark": "#3DE1AD"
|
|
267
|
+
},
|
|
268
|
+
"--dsw-alias-state-business-tertiary": {
|
|
269
|
+
"light": "#A8F0D8",
|
|
270
|
+
"dark": "#A8F0D8"
|
|
271
|
+
},
|
|
272
|
+
"--dsw-specific-sidebar-fill": {
|
|
273
|
+
"light": "linear-gradient(to bottom,#D6ECF0 0%,#E4E6E4 8%,#F2ECDE 18%,#F5E7CE 30%,#EFD6AE 44%,#E5BE86 58%,#D6A45C 72%,#C48F3C 86%,#BA8330 100%)",
|
|
274
|
+
"dark": "linear-gradient(to bottom,#D6ECF0 0%,#E4E6E4 8%,#F2ECDE 18%,#F5E7CE 30%,#EFD6AE 44%,#E5BE86 58%,#D6A45C 72%,#C48F3C 86%,#BA8330 100%)"
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"reading": {
|
|
278
|
+
"colorScheme": "light",
|
|
279
|
+
"bg": "#FFFBF0",
|
|
280
|
+
"alpha": 0.62,
|
|
281
|
+
"blur": 3,
|
|
282
|
+
"maxWidth": 640
|
|
283
|
+
},
|
|
284
|
+
"card": {
|
|
285
|
+
"rows": [
|
|
286
|
+
{ "kind": "solid", "schemes": ["p-xiang-se", "p-ju-huang", "p-tao-hong", "p-hai-tang-hong", "p-jiang-zi"] },
|
|
287
|
+
{ "kind": "solid", "schemes": ["p-song-bai-lu", "p-zhu-qing", "p-cang-qing", "p-dai-zi", "p-xuan-qing"] },
|
|
288
|
+
{ "kind": "clash", "schemes": ["p-shi-liu-jin", "p-bao-lan-jin", "p-qing-lian-jin", "p-song-hua-tao", "p-wu-jin"] }
|
|
289
|
+
]
|
|
290
|
+
},
|
|
291
|
+
"accent": "#F20C00"
|
|
292
|
+
}
|
|
293
|
+
]
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-theme-gallery",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "A theme gallery for DeepSeek Harness (DSH): six JSON-defined skins with full-screen coverage and sidebar scenery, plus built-in light/dark cards, switched from the panel under the sidebar's Plugins icon — adding skins needs no code change",
|
|
5
5
|
"author": "renjie2026 (https://github.com/renjie2026)",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -51,6 +51,8 @@
|
|
|
51
51
|
"test:order": "node tests/check-declaration-order.mjs",
|
|
52
52
|
"test:tdz": "node tests/check-tdz-order.mjs && node tests/check-tdz-logic.mjs",
|
|
53
53
|
"test:theme": "node tests/check-theme-contribution.mjs",
|
|
54
|
+
"test:cards": "node tests/check-card-order.mjs",
|
|
55
|
+
"test:copy": "node tests/check-copy-consistency-logic.mjs",
|
|
54
56
|
"test:ambient": "node tests/check-ambient-render.mjs",
|
|
55
57
|
"test:boot": "node tests/check-boot-timing.mjs",
|
|
56
58
|
"test:safety": "node tests/check-boot-safety.mjs",
|
|
@@ -60,9 +62,10 @@
|
|
|
60
62
|
"test:scope": "node tests/check-scope-reach.mjs",
|
|
61
63
|
"test:scopelogic": "node tests/check-scope-reach-logic.mjs",
|
|
62
64
|
"test:preview": "node scripts/build-ambient-preview.mjs",
|
|
65
|
+
"preview:panel": "node scripts/build-panel-preview.mjs",
|
|
63
66
|
"test:calls": "node tests/check-undefined-calls.mjs",
|
|
64
67
|
"test:emitguard": "node tests/check-self-emit-guard.mjs && node tests/check-self-emit-guard-logic.mjs",
|
|
65
|
-
"test": "npm run test:schema && npm run test:host && npm run test:store && npm run test:order && npm run test:tdz && npm run test:theme && npm run test:ambient && npm run test:boot && npm run test:safety && npm run test:module && npm run test:bounded && npm run test:bootpath && npm run test:scope && npm run test:scopelogic && npm run test:calls && npm run test:emitguard",
|
|
68
|
+
"test": "npm run test:schema && npm run test:host && npm run test:store && npm run test:order && npm run test:tdz && npm run test:theme && npm run test:cards && npm run test:copy && npm run test:ambient && npm run test:boot && npm run test:safety && npm run test:module && npm run test:bounded && npm run test:bootpath && npm run test:scope && npm run test:scopelogic && npm run test:calls && npm run test:emitguard",
|
|
66
69
|
"prepack": "node scripts/embed-themes.mjs",
|
|
67
70
|
"publish:check": "node scripts/publish-check.mjs",
|
|
68
71
|
"embed-themes": "node scripts/embed-themes.mjs",
|
|
@@ -73,7 +76,7 @@
|
|
|
73
76
|
"skin:enable": "node tools/profile-skin.mjs enable",
|
|
74
77
|
"skin:rollback": "node tools/profile-skin.mjs rollback",
|
|
75
78
|
"watch:renderer": "node tools/watch-renderer.mjs",
|
|
76
|
-
"check": "npm run typecheck && npm run test && npm run embed-themes && npm run preview:ambient",
|
|
79
|
+
"check": "npm run typecheck && npm run test && npm run embed-themes && npm run preview:ambient && npm run preview:panel",
|
|
77
80
|
"prepublishOnly": "npm run publish:check"
|
|
78
81
|
},
|
|
79
82
|
"keywords": [
|
package/schema/theme.schema.json
CHANGED
|
@@ -67,6 +67,21 @@
|
|
|
67
67
|
"$ref": "#/$defs/cssValue",
|
|
68
68
|
"description": "The theme's marker colour, used for the states that say WHICH workspace or conversation is active. Taken from the theme's own characteristic colour - the source admin system's design rules forbid introducing a hue that does not already exist in the skin. It is stacked as an overrideTokens layer over --dsw-alias-button-ghost-active-fill/-border/-hover, the family the sidebar entry and the selected conversation row read. Omit it and the theme keeps the base palette's selection colour."
|
|
69
69
|
},
|
|
70
|
+
"card": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"additionalProperties": false,
|
|
73
|
+
"required": ["rows"],
|
|
74
|
+
"description": "How this theme's card is drawn in the gallery, for a theme whose card is a PALETTE PICKER rather than one look (the 纯色/撞色 class). Omit it and the card keeps the default single 3-colour strip derived from the theme's own tokens, which is what every scene-carrying skin does. When present, the card draws a grid of CLICKABLE colour-value buttons — each slot names a scheme from lib/palette-schemes.json, and clicking it recolours the whole UI (the schemes are NOT registered themes, so they never appear in the official Appearance list). Such a card prints no `description` body: the slots already fill it, so the field stays a tooltip (asserted by tests/check-card-order.mjs).",
|
|
75
|
+
"properties": {
|
|
76
|
+
"rows": {
|
|
77
|
+
"type": "array",
|
|
78
|
+
"minItems": 2,
|
|
79
|
+
"maxItems": 3,
|
|
80
|
+
"description": "Two or three rows, drawn top to bottom. The LAST row must hold clash schemes and every earlier row must hold solid ones — the user's layout is 5+5+5: two rows of solid options, then the row of clash options. Each row's slots are equal width.",
|
|
81
|
+
"items": { "$ref": "#/$defs/cardRow" }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
70
85
|
"ambient": {
|
|
71
86
|
"type": "object",
|
|
72
87
|
"additionalProperties": false,
|
|
@@ -74,8 +89,8 @@
|
|
|
74
89
|
"description": "Scenery drawn inside the sidebar column, ported from the source admin system where each theme mounted its own animation component behind the left menu. Only the kinds this plugin ships artwork for are accepted; a theme without this field gets no scenery.",
|
|
75
90
|
"properties": {
|
|
76
91
|
"kind": {
|
|
77
|
-
"enum": ["shan", "dream", "caiyun", "dongyun", "junyue", "jiexin", "fengchen"],
|
|
78
|
-
"description": "Which ported scene to draw: 'shan' is 山青婷彩 (mountains, mist, water, ripples, dragonflies, falling petals); 'dream' is 梦海游鱼 (corner glow, light washes, rising bubbles, glowing motes, swimming cartoon fish, swaying seaweed); 'caiyun' is 营慕彩云 (dusk glow, warm stars, drifting clouds, two marquee cloud-seas, hot-air balloons); 'dongyun' is 江畔冬云 (winter moon, drifting clouds, snow, river with moonlight, ripples, glints, a sampan, reeds); 'junyue' is 徐山军月 (brass stars, full moon, night clouds, meteor, mountain ridges, pines); 'jiexin' is 佩安杰心 (misty hills, zen enso and meditator, incense smoke, dust motes); 'fengchen' is 光彩凤晨 (dawn rays, falling feathers, a flying brush-stroke phoenix, dew)."
|
|
92
|
+
"enum": ["shan", "dream", "caiyun", "dongyun", "junyue", "jiexin", "fengchen", "humao", "ahuang"],
|
|
93
|
+
"description": "Which ported scene to draw: 'shan' is 山青婷彩 (mountains, mist, water, ripples, dragonflies, falling petals); 'dream' is 梦海游鱼 (corner glow, light washes, rising bubbles, glowing motes, swimming cartoon fish, swaying seaweed); 'caiyun' is 营慕彩云 (dusk glow, warm stars, drifting clouds, two marquee cloud-seas, hot-air balloons); 'dongyun' is 江畔冬云 (winter moon, drifting clouds, snow, river with moonlight, ripples, glints, a sampan, reeds); 'junyue' is 徐山军月 (brass stars, full moon, night clouds, meteor, mountain ridges, pines); 'jiexin' is 佩安杰心 (misty hills, zen enso and meditator, incense smoke, dust motes); 'fengchen' is 光彩凤晨 (dawn rays, falling feathers, a flying brush-stroke phoenix, dew); 'humao' is 琥珀猫咪, an original pet scene (warm haze, sunlit sill, a sitting tabby with a swaying tail, a curled sleeping cat breathing, amber dust motes); 'ahuang' is 虎子阿黄, an original pet scene (golden haze, field-path bank, a yellow pastoral dog with a wagging sickle tail and a head tilt, dry grass tufts, a ball, dandelion fluff)."
|
|
79
94
|
},
|
|
80
95
|
"petals": {
|
|
81
96
|
"type": "integer",
|
|
@@ -117,7 +132,7 @@
|
|
|
117
132
|
"type": "integer",
|
|
118
133
|
"minimum": 0,
|
|
119
134
|
"maximum": 20,
|
|
120
|
-
"description": "'jiexin' only: how many drifting incense dust motes
|
|
135
|
+
"description": "'jiexin' / 'humao' / 'ahuang' only: how many drifting motes to seed — incense dust for jiexin, amber sun motes for humao, dandelion fluff for ahuang."
|
|
121
136
|
},
|
|
122
137
|
"feathers": {
|
|
123
138
|
"type": "integer",
|
|
@@ -135,6 +150,27 @@
|
|
|
135
150
|
}
|
|
136
151
|
}
|
|
137
152
|
},
|
|
153
|
+
"cardRow": {
|
|
154
|
+
"type": "object",
|
|
155
|
+
"additionalProperties": false,
|
|
156
|
+
"required": ["kind", "schemes"],
|
|
157
|
+
"description": "One row of the palette picker: equal-width colour-value buttons. `kind` says what each button in THIS row looks like (a flat block, or a band with dots) and must match the kind every referenced scheme declares — drawing a clash scheme as one flat block reads as a colour that is merely off.",
|
|
158
|
+
"properties": {
|
|
159
|
+
"kind": { "enum": ["solid", "clash"] },
|
|
160
|
+
"schemes": {
|
|
161
|
+
"type": "array",
|
|
162
|
+
"minItems": 1,
|
|
163
|
+
"maxItems": 5,
|
|
164
|
+
"description": "Scheme ids from lib/palette-schemes.json. Five is the ceiling the card can still show as five distinct buttons (at the card's 200px minimum width each is ~34px); a sixth would read as a texture. A slot naming a scheme that does not exist draws nothing, and the whole card silently falls back to the default strip — scripts/lib/card-rows.mjs fails the build for that.",
|
|
165
|
+
"items": { "$ref": "#/$defs/schemeId" }
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
"schemeId": {
|
|
170
|
+
"type": "string",
|
|
171
|
+
"pattern": "^p-[a-z0-9-]+$",
|
|
172
|
+
"description": "A palette-scheme id, `p-` prefixed so it can never be confused with a registered theme id (the picker's anchor theme is `shi-liu-jin`). The scheme itself lives in lib/palette-schemes.json, which is inlined into the bundle but NOT registered with the theme service — these 15 are colour options, not themes, so they stay out of the official Appearance list and out of the skin count."
|
|
173
|
+
},
|
|
138
174
|
"modes": {
|
|
139
175
|
"type": "object",
|
|
140
176
|
"additionalProperties": false,
|