dsh-theme-gallery 0.1.2
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 +657 -0
- package/cordis.patch.yml +48 -0
- package/lib/client.d.ts +29 -0
- package/lib/client.js +4229 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.js +178 -0
- package/lib/themes/meng-hai-you-yu.json +292 -0
- package/lib/themes/shan-qing-ting-cai.json +290 -0
- package/package.json +118 -0
- package/schema/theme.schema.json +159 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "shan-qing-ting-cai",
|
|
4
|
+
"label": "山青婷彩",
|
|
5
|
+
"description": "青山叠翠,蜓舞生姿 —— 复刻自电商新零售系统管理后台同名主题",
|
|
6
|
+
"colorScheme": "light",
|
|
7
|
+
"tokens": {
|
|
8
|
+
"--dsw-alias-bg-base": {
|
|
9
|
+
"light": "linear-gradient(to bottom,#F7FCF9 0%,#EDF7F1 55%,#E4F2EA 100%)",
|
|
10
|
+
"dark": "linear-gradient(to bottom,#F7FCF9 0%,#EDF7F1 55%,#E4F2EA 100%)"
|
|
11
|
+
},
|
|
12
|
+
"--dsw-alias-bg-layer-1": {
|
|
13
|
+
"light": "#FBFEFC",
|
|
14
|
+
"dark": "#FBFEFC"
|
|
15
|
+
},
|
|
16
|
+
"--dsw-alias-bg-layer-2": {
|
|
17
|
+
"light": "#FFFFFF",
|
|
18
|
+
"dark": "#FFFFFF"
|
|
19
|
+
},
|
|
20
|
+
"--dsw-alias-bg-layer-3": {
|
|
21
|
+
"light": "#FFFFFF",
|
|
22
|
+
"dark": "#FFFFFF"
|
|
23
|
+
},
|
|
24
|
+
"--dsw-alias-bg-overlay": {
|
|
25
|
+
"light": "#E3F1E8",
|
|
26
|
+
"dark": "#E3F1E8"
|
|
27
|
+
},
|
|
28
|
+
"--dsw-alias-bg-skeleton": {
|
|
29
|
+
"light": "#2F7D5E14",
|
|
30
|
+
"dark": "#2F7D5E14"
|
|
31
|
+
},
|
|
32
|
+
"--dsw-alias-bg-module-platform": {
|
|
33
|
+
"light": "#E4F3EA",
|
|
34
|
+
"dark": "#E4F3EA"
|
|
35
|
+
},
|
|
36
|
+
"--dsw-alias-bg-multi-select": {
|
|
37
|
+
"light": "#E4F3EA",
|
|
38
|
+
"dark": "#E4F3EA"
|
|
39
|
+
},
|
|
40
|
+
"--dsw-alias-border-l1": {
|
|
41
|
+
"light": "#2F7D5E0F",
|
|
42
|
+
"dark": "#2F7D5E0F"
|
|
43
|
+
},
|
|
44
|
+
"--dsw-alias-border-l2": {
|
|
45
|
+
"light": "#2F7D5E21",
|
|
46
|
+
"dark": "#2F7D5E21"
|
|
47
|
+
},
|
|
48
|
+
"--dsw-alias-border-l3": {
|
|
49
|
+
"light": "#2F7D5E2E",
|
|
50
|
+
"dark": "#2F7D5E2E"
|
|
51
|
+
},
|
|
52
|
+
"--dsw-alias-border-l4": {
|
|
53
|
+
"light": "#2F7D5E3D",
|
|
54
|
+
"dark": "#2F7D5E3D"
|
|
55
|
+
},
|
|
56
|
+
"--dsw-alias-brand-primary": {
|
|
57
|
+
"light": "#2F7D5E",
|
|
58
|
+
"dark": "#2F7D5E"
|
|
59
|
+
},
|
|
60
|
+
"--dsw-alias-brand-primary-invert": {
|
|
61
|
+
"light": "#FFFFFF",
|
|
62
|
+
"dark": "#FFFFFF"
|
|
63
|
+
},
|
|
64
|
+
"--dsw-alias-brand-text": {
|
|
65
|
+
"light": "#2F7D5E",
|
|
66
|
+
"dark": "#2F7D5E"
|
|
67
|
+
},
|
|
68
|
+
"--dsw-alias-label-primary": {
|
|
69
|
+
"light": "#1F4638",
|
|
70
|
+
"dark": "#1F4638"
|
|
71
|
+
},
|
|
72
|
+
"--dsw-alias-label-primary-bluish": {
|
|
73
|
+
"light": "#1F4638",
|
|
74
|
+
"dark": "#1F4638"
|
|
75
|
+
},
|
|
76
|
+
"--dsw-alias-label-secondary": {
|
|
77
|
+
"light": "#3C6B57",
|
|
78
|
+
"dark": "#3C6B57"
|
|
79
|
+
},
|
|
80
|
+
"--dsw-alias-label-tertiary": {
|
|
81
|
+
"light": "#5C8474",
|
|
82
|
+
"dark": "#5C8474"
|
|
83
|
+
},
|
|
84
|
+
"--dsw-alias-label-caption": {
|
|
85
|
+
"light": "#5C8474",
|
|
86
|
+
"dark": "#5C8474"
|
|
87
|
+
},
|
|
88
|
+
"--dsw-alias-label-dimmed": {
|
|
89
|
+
"light": "#8AA79B",
|
|
90
|
+
"dark": "#8AA79B"
|
|
91
|
+
},
|
|
92
|
+
"--dsw-alias-label-primary-dimmed": {
|
|
93
|
+
"light": "#3C6B57",
|
|
94
|
+
"dark": "#3C6B57"
|
|
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": "#D97BA4",
|
|
106
|
+
"dark": "#D97BA4"
|
|
107
|
+
},
|
|
108
|
+
"--dsw-alias-interactive-bg-hover": {
|
|
109
|
+
"light": "#3E9B7A14",
|
|
110
|
+
"dark": "#3E9B7A14"
|
|
111
|
+
},
|
|
112
|
+
"--dsw-alias-interactive-bg-active": {
|
|
113
|
+
"light": "#E88BB02E",
|
|
114
|
+
"dark": "#E88BB02E"
|
|
115
|
+
},
|
|
116
|
+
"--dsw-alias-interactive-bg-hover-solid": {
|
|
117
|
+
"light": "#E4F3EA",
|
|
118
|
+
"dark": "#E4F3EA"
|
|
119
|
+
},
|
|
120
|
+
"--dsw-alias-interactive-bg-hover-accent": {
|
|
121
|
+
"light": "#E88BB03D",
|
|
122
|
+
"dark": "#E88BB03D"
|
|
123
|
+
},
|
|
124
|
+
"--dsw-alias-button-primary-fill": {
|
|
125
|
+
"light": "#2F7D5E",
|
|
126
|
+
"dark": "#2F7D5E"
|
|
127
|
+
},
|
|
128
|
+
"--dsw-alias-button-primary-hover": {
|
|
129
|
+
"light": "#3E9B7A",
|
|
130
|
+
"dark": "#3E9B7A"
|
|
131
|
+
},
|
|
132
|
+
"--dsw-alias-button-primary-dimmed": {
|
|
133
|
+
"light": "#2F7D5E47",
|
|
134
|
+
"dark": "#2F7D5E47"
|
|
135
|
+
},
|
|
136
|
+
"--dsw-alias-button-ghost-active-fill": {
|
|
137
|
+
"light": "#E88BB029",
|
|
138
|
+
"dark": "#E88BB029"
|
|
139
|
+
},
|
|
140
|
+
"--dsw-alias-button-ghost-active-border": {
|
|
141
|
+
"light": "#E88BB0",
|
|
142
|
+
"dark": "#E88BB0"
|
|
143
|
+
},
|
|
144
|
+
"--dsw-alias-button-ghost-active-hover": {
|
|
145
|
+
"light": "#E88BB047",
|
|
146
|
+
"dark": "#E88BB047"
|
|
147
|
+
},
|
|
148
|
+
"--dsw-alias-button-info-fill": {
|
|
149
|
+
"light": "#4C9B78",
|
|
150
|
+
"dark": "#4C9B78"
|
|
151
|
+
},
|
|
152
|
+
"--dsw-alias-button-info-hover": {
|
|
153
|
+
"light": "#3E9B7A",
|
|
154
|
+
"dark": "#3E9B7A"
|
|
155
|
+
},
|
|
156
|
+
"--dsw-alias-button-elevated-fill": {
|
|
157
|
+
"light": "#FFFFFF",
|
|
158
|
+
"dark": "#FFFFFF"
|
|
159
|
+
},
|
|
160
|
+
"--dsw-alias-button-floating-fill": {
|
|
161
|
+
"light": "#FFFFFF",
|
|
162
|
+
"dark": "#FFFFFF"
|
|
163
|
+
},
|
|
164
|
+
"--dsw-alias-button-floating-hover": {
|
|
165
|
+
"light": "#F4FBF7",
|
|
166
|
+
"dark": "#F4FBF7"
|
|
167
|
+
},
|
|
168
|
+
"--dsw-alias-button-contrast-fill": {
|
|
169
|
+
"light": "#1F4638",
|
|
170
|
+
"dark": "#1F4638"
|
|
171
|
+
},
|
|
172
|
+
"--dsw-alias-markdown-code-block": {
|
|
173
|
+
"light": "#EAF7F0",
|
|
174
|
+
"dark": "#EAF7F0"
|
|
175
|
+
},
|
|
176
|
+
"--dsw-alias-markdown-code-block-banner": {
|
|
177
|
+
"light": "#DCEEE2",
|
|
178
|
+
"dark": "#DCEEE2"
|
|
179
|
+
},
|
|
180
|
+
"--dsw-alias-markdown-inline-code": {
|
|
181
|
+
"light": "#E4F3EA",
|
|
182
|
+
"dark": "#E4F3EA"
|
|
183
|
+
},
|
|
184
|
+
"--dsw-alias-markdown-citation": {
|
|
185
|
+
"light": "#E4F3EA",
|
|
186
|
+
"dark": "#E4F3EA"
|
|
187
|
+
},
|
|
188
|
+
"--dsw-alias-markdown-tag": {
|
|
189
|
+
"light": "#E4F3EA",
|
|
190
|
+
"dark": "#E4F3EA"
|
|
191
|
+
},
|
|
192
|
+
"--dsw-alias-markdown-placeholder": {
|
|
193
|
+
"light": "#DCEEE2",
|
|
194
|
+
"dark": "#DCEEE2"
|
|
195
|
+
},
|
|
196
|
+
"--dsw-alias-markdown-code-segment-selected": {
|
|
197
|
+
"light": "#E88BB029",
|
|
198
|
+
"dark": "#E88BB029"
|
|
199
|
+
},
|
|
200
|
+
"--dsw-alias-markdown-code-segment-unselected": {
|
|
201
|
+
"light": "#EAF7F0",
|
|
202
|
+
"dark": "#EAF7F0"
|
|
203
|
+
},
|
|
204
|
+
"--dsw-alias-scrollbar-bg-l1": {
|
|
205
|
+
"light": "#2F7D5E29",
|
|
206
|
+
"dark": "#2F7D5E29"
|
|
207
|
+
},
|
|
208
|
+
"--dsw-alias-scrollbar-bg-l2": {
|
|
209
|
+
"light": "#2F7D5E38",
|
|
210
|
+
"dark": "#2F7D5E38"
|
|
211
|
+
},
|
|
212
|
+
"--dsw-alias-scrollbar-hover-l1": {
|
|
213
|
+
"light": "#2F7D5E52",
|
|
214
|
+
"dark": "#2F7D5E52"
|
|
215
|
+
},
|
|
216
|
+
"--dsw-alias-scrollbar-hover-l2": {
|
|
217
|
+
"light": "#2F7D5E66",
|
|
218
|
+
"dark": "#2F7D5E66"
|
|
219
|
+
},
|
|
220
|
+
"--dsw-alias-tooltip-bg": {
|
|
221
|
+
"light": "#1F4638",
|
|
222
|
+
"dark": "#1F4638"
|
|
223
|
+
},
|
|
224
|
+
"--dsw-alias-toast-bg": {
|
|
225
|
+
"light": "#FFFFFF",
|
|
226
|
+
"dark": "#FFFFFF"
|
|
227
|
+
},
|
|
228
|
+
"--dsw-alias-state-error-primary": {
|
|
229
|
+
"light": "#C65B6A",
|
|
230
|
+
"dark": "#C65B6A"
|
|
231
|
+
},
|
|
232
|
+
"--dsw-alias-state-error-secondary": {
|
|
233
|
+
"light": "#DB5A6B",
|
|
234
|
+
"dark": "#DB5A6B"
|
|
235
|
+
},
|
|
236
|
+
"--dsw-alias-state-success-primary": {
|
|
237
|
+
"light": "#21A675",
|
|
238
|
+
"dark": "#21A675"
|
|
239
|
+
},
|
|
240
|
+
"--dsw-alias-state-success-secondary": {
|
|
241
|
+
"light": "#2F7D5E",
|
|
242
|
+
"dark": "#2F7D5E"
|
|
243
|
+
},
|
|
244
|
+
"--dsw-alias-state-success-tertiary": {
|
|
245
|
+
"light": "#9DCDBA",
|
|
246
|
+
"dark": "#9DCDBA"
|
|
247
|
+
},
|
|
248
|
+
"--dsw-alias-state-warn-primary": {
|
|
249
|
+
"light": "#B97F3A",
|
|
250
|
+
"dark": "#B97F3A"
|
|
251
|
+
},
|
|
252
|
+
"--dsw-alias-state-warn-secondary": {
|
|
253
|
+
"light": "#D9A45E",
|
|
254
|
+
"dark": "#D9A45E"
|
|
255
|
+
},
|
|
256
|
+
"--dsw-alias-state-warn-tertiary": {
|
|
257
|
+
"light": "#EFDCC0",
|
|
258
|
+
"dark": "#EFDCC0"
|
|
259
|
+
},
|
|
260
|
+
"--dsw-alias-state-warn-label": {
|
|
261
|
+
"light": "#8A5A22",
|
|
262
|
+
"dark": "#8A5A22"
|
|
263
|
+
},
|
|
264
|
+
"--dsw-alias-state-business-primary": {
|
|
265
|
+
"light": "#E88BB0",
|
|
266
|
+
"dark": "#E88BB0"
|
|
267
|
+
},
|
|
268
|
+
"--dsw-alias-state-business-tertiary": {
|
|
269
|
+
"light": "#F8A8C2",
|
|
270
|
+
"dark": "#F8A8C2"
|
|
271
|
+
},
|
|
272
|
+
"--dsw-specific-sidebar-fill": {
|
|
273
|
+
"light": "linear-gradient(to bottom,#EAF7F0 0%,#D8EFE4 20%,#C9E8DA 36%,#BFE2D2 50%,#B4DCCA 62%,#A8D2BE 74%,#9CC9B2 86%,#90C0A8 100%)",
|
|
274
|
+
"dark": "linear-gradient(to bottom,#EAF7F0 0%,#D8EFE4 20%,#C9E8DA 36%,#BFE2D2 50%,#B4DCCA 62%,#A8D2BE 74%,#9CC9B2 86%,#90C0A8 100%)"
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"reading": {
|
|
278
|
+
"colorScheme": "light",
|
|
279
|
+
"bg": "#FFFFFF",
|
|
280
|
+
"alpha": 0.62,
|
|
281
|
+
"blur": 3,
|
|
282
|
+
"maxWidth": 640
|
|
283
|
+
},
|
|
284
|
+
"accent": "#E88BB0",
|
|
285
|
+
"ambient": {
|
|
286
|
+
"kind": "shan",
|
|
287
|
+
"petals": 7
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
]
|
package/package.json
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-theme-gallery",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "A community theme gallery for DeepSeek Harness (DSH): JSON-defined skins with full-screen coverage and ported sidebar scenery, switched from the plugin's own sidebar panel — adding skins needs no code change",
|
|
5
|
+
"author": "renjie2026 <renjie330@163.com> (https://github.com/renjie2026)",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/renjie2026/dsh-theme-gallery.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/renjie2026/dsh-theme-gallery#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/renjie2026/dsh-theme-gallery/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "lib/index.js",
|
|
17
|
+
"types": "lib/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./lib/index.d.ts",
|
|
21
|
+
"default": "./lib/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./client": {
|
|
24
|
+
"types": "./lib/client.d.ts",
|
|
25
|
+
"default": "./lib/client.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"lib",
|
|
31
|
+
"schema",
|
|
32
|
+
"cordis.patch.yml"
|
|
33
|
+
],
|
|
34
|
+
"dsh": {
|
|
35
|
+
"bundle": {
|
|
36
|
+
"patch": "./cordis.patch.yml"
|
|
37
|
+
},
|
|
38
|
+
"client": {
|
|
39
|
+
"platform": "web",
|
|
40
|
+
"inject": [
|
|
41
|
+
"@deepseek-ai/dsh-client-locale",
|
|
42
|
+
"@deepseek-ai/dsh-client-ui-theme"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
48
|
+
"test:schema": "node tests/check-schema.mjs",
|
|
49
|
+
"test:host": "node tests/smoke-host.mjs",
|
|
50
|
+
"test:store": "node tests/check-store-contract.mjs",
|
|
51
|
+
"test:order": "node tests/check-declaration-order.mjs",
|
|
52
|
+
"test:tdz": "node tests/check-tdz-order.mjs && node tests/check-tdz-logic.mjs",
|
|
53
|
+
"test:theme": "node tests/check-theme-contribution.mjs",
|
|
54
|
+
"test:ambient": "node tests/check-ambient-render.mjs",
|
|
55
|
+
"test:boot": "node tests/check-boot-timing.mjs",
|
|
56
|
+
"test:safety": "node tests/check-boot-safety.mjs",
|
|
57
|
+
"test:module": "node tests/check-client-module.mjs",
|
|
58
|
+
"test:bounded": "node tests/check-bounded-work.mjs",
|
|
59
|
+
"test:bootpath": "node tests/check-boot-path.mjs",
|
|
60
|
+
"test:scope": "node tests/check-scope-reach.mjs",
|
|
61
|
+
"test:scopelogic": "node tests/check-scope-reach-logic.mjs",
|
|
62
|
+
"test:preview": "node scripts/build-ambient-preview.mjs",
|
|
63
|
+
"test:calls": "node tests/check-undefined-calls.mjs",
|
|
64
|
+
"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",
|
|
65
|
+
"prepack": "node scripts/embed-themes.mjs",
|
|
66
|
+
"publish:check": "node scripts/publish-check.mjs",
|
|
67
|
+
"embed-themes": "node scripts/embed-themes.mjs",
|
|
68
|
+
"preview:ambient": "node scripts/build-ambient-preview.mjs",
|
|
69
|
+
"bench": "node scripts/serve-bench.mjs",
|
|
70
|
+
"skin:status": "node tools/profile-skin.mjs status",
|
|
71
|
+
"skin:disable": "node tools/profile-skin.mjs disable",
|
|
72
|
+
"skin:enable": "node tools/profile-skin.mjs enable",
|
|
73
|
+
"skin:rollback": "node tools/profile-skin.mjs rollback",
|
|
74
|
+
"watch:renderer": "node tools/watch-renderer.mjs",
|
|
75
|
+
"check": "npm run typecheck && npm run test && npm run embed-themes && npm run preview:ambient",
|
|
76
|
+
"prepublishOnly": "npm run publish:check"
|
|
77
|
+
},
|
|
78
|
+
"keywords": [
|
|
79
|
+
"dsh",
|
|
80
|
+
"dsh-plugin",
|
|
81
|
+
"deepseek",
|
|
82
|
+
"deepseek-harness",
|
|
83
|
+
"theme",
|
|
84
|
+
"themes",
|
|
85
|
+
"skin",
|
|
86
|
+
"skins",
|
|
87
|
+
"plugin",
|
|
88
|
+
"cordis",
|
|
89
|
+
"desktop"
|
|
90
|
+
],
|
|
91
|
+
"peerDependencies": {
|
|
92
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
93
|
+
"@deepseek-ai/dsh-client-store": "*",
|
|
94
|
+
"@deepseek-ai/dsh-client-ui-slots": "*",
|
|
95
|
+
"@deepseek-ai/dsh-client-ui-theme": "*"
|
|
96
|
+
},
|
|
97
|
+
"devDependencies": {
|
|
98
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
99
|
+
"@deepseek-ai/dsh-client-locale": "0.1.6-alpha.2",
|
|
100
|
+
"@deepseek-ai/dsh-client-store": "0.1.6-alpha.2",
|
|
101
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.1.6-alpha.2",
|
|
102
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.1.6-alpha.2",
|
|
103
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.6-alpha.2",
|
|
104
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.1.6-alpha.2",
|
|
105
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.6-alpha.2",
|
|
106
|
+
"@deepseek-ai/dsh-client-ui-theme": "0.1.6-alpha.2",
|
|
107
|
+
"@deepseek-ai/dsh-settings": "0.1.6-alpha.2",
|
|
108
|
+
"@deepseek-ai/schemastery": "^3.18.4",
|
|
109
|
+
"@types/react": "~18.3.1",
|
|
110
|
+
"immer": "^11.1.18",
|
|
111
|
+
"js-yaml": "^5.4.2",
|
|
112
|
+
"react": "^19.3.0",
|
|
113
|
+
"react-dom": "^19.3.0",
|
|
114
|
+
"typescript": "^5.6.0",
|
|
115
|
+
"zustand": "^5.0.15"
|
|
116
|
+
},
|
|
117
|
+
"license": "MIT"
|
|
118
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/dsh-community/dsh-theme-gallery/schema/theme.schema.json",
|
|
4
|
+
"title": "DSH theme gallery",
|
|
5
|
+
"description": "A list of selectable DeepSeek Harness themes. Each theme is a per-scheme override layer over the official base palettes: 'light' and 'dark' are built in, and every third-party theme overrides same-named --dsw-alias-* semantic variables, plus --dsw-specific-* for the surfaces the alias layer cannot express.",
|
|
6
|
+
"type": "array",
|
|
7
|
+
"minItems": 1,
|
|
8
|
+
"items": { "$ref": "#/$defs/theme" },
|
|
9
|
+
"$defs": {
|
|
10
|
+
"theme": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"required": ["id", "label", "description", "colorScheme", "tokens"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"id": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
18
|
+
"minLength": 2,
|
|
19
|
+
"maxLength": 40,
|
|
20
|
+
"description": "Stable theme id, also the string passed to ctx.theme.setTheme. Lowercase, digits and dashes only. 'system' is reserved (it is a preference, not a theme) and must not be used."
|
|
21
|
+
},
|
|
22
|
+
"label": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"minLength": 1,
|
|
25
|
+
"maxLength": 60,
|
|
26
|
+
"description": "Human-readable name shown on the theme button in Settings."
|
|
27
|
+
},
|
|
28
|
+
"description": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"minLength": 1,
|
|
31
|
+
"maxLength": 200,
|
|
32
|
+
"description": "One-line description shown as the button's tooltip."
|
|
33
|
+
},
|
|
34
|
+
"colorScheme": {
|
|
35
|
+
"enum": ["light", "dark"],
|
|
36
|
+
"description": "Which base palette the overrides sit on top of. This field — never the id — decides whether body[data-ds-dark-theme] is set. Pick the scheme your tokens were designed for; tokens still need values for both schemes so the theme stays legible if the user's OS flips."
|
|
37
|
+
},
|
|
38
|
+
"tokens": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"minProperties": 1,
|
|
41
|
+
"propertyNames": { "pattern": "^--dsw-(alias|specific)-[a-z0-9-]+$" },
|
|
42
|
+
"additionalProperties": { "$ref": "#/$defs/modes" },
|
|
43
|
+
"description": "Token overrides. --dsw-alias-* is the semantic alias layer; --dsw-specific-* is the companion layer the shell reads for surfaces the alias layer cannot express. Notably --dsw-specific-sidebar-fill paints the sidebar column AND the Windows caption row, so setting it to a gradient is how a theme covers the whole screen with no injected CSS. Any token you omit keeps the base palette's value, so a partial set is safe — but see x-required-tokens for the ones that decide whether a theme reads as deliberate."
|
|
44
|
+
},
|
|
45
|
+
"reading": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"required": ["colorScheme", "bg", "alpha", "blur", "maxWidth"],
|
|
49
|
+
"description": "How the theme recedes once a conversation has messages: the transcript sits on a card built from `bg` lightened toward white at `alpha`, so the skin stops competing with the text. Omit it and the theme never lightens.",
|
|
50
|
+
"properties": {
|
|
51
|
+
"colorScheme": {
|
|
52
|
+
"enum": ["light", "dark"],
|
|
53
|
+
"description": "Color scheme the transcript card is rendered in."
|
|
54
|
+
},
|
|
55
|
+
"bg": { "$ref": "#/$defs/cssValue", "description": "Card base color; lightened toward white at `alpha`." },
|
|
56
|
+
"alpha": {
|
|
57
|
+
"type": "number",
|
|
58
|
+
"minimum": 0,
|
|
59
|
+
"maximum": 1,
|
|
60
|
+
"description": "How opaque the card is over the theme fill. Higher reads better; lower keeps the skin visible. 0.6 is a good starting point."
|
|
61
|
+
},
|
|
62
|
+
"blur": { "type": "number", "minimum": 0, "maximum": 40, "description": "Backdrop blur in px behind the card." },
|
|
63
|
+
"maxWidth": { "type": "number", "minimum": 320, "maximum": 1600, "description": "Transcript column width in px while reading. 640 keeps a comfortable measure." }
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"accent": {
|
|
67
|
+
"$ref": "#/$defs/cssValue",
|
|
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
|
+
},
|
|
70
|
+
"ambient": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"additionalProperties": false,
|
|
73
|
+
"required": ["kind"],
|
|
74
|
+
"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 two kinds this plugin ships artwork for are accepted; a theme without this field gets no scenery.",
|
|
75
|
+
"properties": {
|
|
76
|
+
"kind": {
|
|
77
|
+
"enum": ["shan", "dream"],
|
|
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)."
|
|
79
|
+
},
|
|
80
|
+
"petals": {
|
|
81
|
+
"type": "integer",
|
|
82
|
+
"minimum": 0,
|
|
83
|
+
"maximum": 20,
|
|
84
|
+
"description": "'shan' only: how many petals to seed. Each gets its own size, duration and phase from a deterministic formula, so the count is the only knob."
|
|
85
|
+
},
|
|
86
|
+
"bubbles": {
|
|
87
|
+
"type": "integer",
|
|
88
|
+
"minimum": 0,
|
|
89
|
+
"maximum": 24,
|
|
90
|
+
"description": "'dream' only: how many pale outlined bubbles to seed."
|
|
91
|
+
},
|
|
92
|
+
"motes": {
|
|
93
|
+
"type": "integer",
|
|
94
|
+
"minimum": 0,
|
|
95
|
+
"maximum": 24,
|
|
96
|
+
"description": "'dream' only: how many light-blue glowing motes to seed. A SEPARATE effect from the bubbles — both are drawn at once, so the two counts are independent."
|
|
97
|
+
},
|
|
98
|
+
"fish": {
|
|
99
|
+
"type": "integer",
|
|
100
|
+
"minimum": 0,
|
|
101
|
+
"maximum": 6,
|
|
102
|
+
"description": "'dream' only: how many cartoon fish to swim across the water. A third independent effect, ported from the source system's FishAnimation component."
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"modes": {
|
|
109
|
+
"type": "object",
|
|
110
|
+
"additionalProperties": false,
|
|
111
|
+
"required": ["light", "dark"],
|
|
112
|
+
"properties": {
|
|
113
|
+
"light": { "$ref": "#/$defs/cssValue" },
|
|
114
|
+
"dark": { "$ref": "#/$defs/cssValue" }
|
|
115
|
+
},
|
|
116
|
+
"description": "The AUTHORING format for one token, and it applies to this JSON only. At registration time the loader flattens each pair to the theme's own `colorScheme`, because `register()` consumes `Record<string, string>` and stores the definition by reference - handing it a pair writes the literal string '[object Object]' into the CSS variable. The pair shape is what the runtime's `overrideTokens()` layers require, which is why the two must not be confused."
|
|
117
|
+
},
|
|
118
|
+
"cssValue": {
|
|
119
|
+
"type": "string",
|
|
120
|
+
"minLength": 1,
|
|
121
|
+
"maxLength": 160,
|
|
122
|
+
"description": "Any CSS value: a literal (#f7f3ea, rgba(...)), or a reference to a shipped palette token such as var(--dsw-static-neutral-bluish-900). Prefer the var() form for anything that should follow the product palette."
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"$comment": "Required token set, sourced from @deepseek-ai/dsh-client-ui-theme's BUILTIN_INSPECT_TOKENS entries that declare requiresLightAndDark: true. The runtime does not validate completeness — an incomplete override set is accepted and silently looks wrong — so this schema, not the runtime, is where that check lives.",
|
|
126
|
+
"x-required-tokens": [
|
|
127
|
+
"--dsw-alias-bg-base",
|
|
128
|
+
"--dsw-alias-bg-layer-1",
|
|
129
|
+
"--dsw-alias-bg-layer-2",
|
|
130
|
+
"--dsw-alias-bg-overlay",
|
|
131
|
+
"--dsw-alias-border-l1",
|
|
132
|
+
"--dsw-alias-border-l2",
|
|
133
|
+
"--dsw-alias-brand-primary",
|
|
134
|
+
"--dsw-alias-label-primary",
|
|
135
|
+
"--dsw-alias-label-secondary",
|
|
136
|
+
"--dsw-alias-state-error-primary",
|
|
137
|
+
"--dsw-alias-state-success-primary",
|
|
138
|
+
"--dsw-alias-state-warn-primary"
|
|
139
|
+
],
|
|
140
|
+
"x-recommended-tokens": [
|
|
141
|
+
"--dsw-alias-bg-layer-3",
|
|
142
|
+
"--dsw-alias-border-l3",
|
|
143
|
+
"--dsw-alias-border-l4",
|
|
144
|
+
"--dsw-alias-label-tertiary",
|
|
145
|
+
"--dsw-alias-label-caption",
|
|
146
|
+
"--dsw-alias-link",
|
|
147
|
+
"--dsw-alias-interactive-bg-hover",
|
|
148
|
+
"--dsw-alias-interactive-bg-active",
|
|
149
|
+
"--dsw-alias-button-primary-fill",
|
|
150
|
+
"--dsw-alias-button-primary-hover",
|
|
151
|
+
"--dsw-alias-markdown-code-block",
|
|
152
|
+
"--dsw-alias-markdown-inline-code",
|
|
153
|
+
"--dsw-alias-scrollbar-bg-l1",
|
|
154
|
+
"--dsw-alias-scrollbar-bg-l2",
|
|
155
|
+
"--dsw-alias-scrollbar-hover-l1",
|
|
156
|
+
"--dsw-alias-scrollbar-hover-l2"
|
|
157
|
+
],
|
|
158
|
+
"x-all-tokens-note": "The full alias surface is 81 variables; the authoritative list lives in packages/client/ui-theme/src/styles/design-platform.css in the official repository."
|
|
159
|
+
}
|