dsh-theme-palette 1.8.3 → 1.9.9
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/CHANGELOG.md +699 -562
- package/README-es.md +52 -52
- package/README-hi.md +52 -52
- package/README-pt.md +52 -52
- package/README-zh.md +52 -53
- package/README.md +52 -52
- package/client.js +3620 -2729
- package/docs/DESIGN.md +457 -256
- package/package.json +114 -114
package/CHANGELOG.md
CHANGED
|
@@ -1,562 +1,699 @@
|
|
|
1
|
-
# 更新记录
|
|
2
|
-
|
|
3
|
-
本文件记录 **dsh-theme-palette** 每个版本改了什么;README 只讲当前版本的设计与用法。
|
|
4
|
-
|
|
5
|
-
## 版本一览
|
|
6
|
-
|
|
7
|
-
### 1.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
- **
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
-
|
|
131
|
-
|
|
132
|
-
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
-
|
|
148
|
-
|
|
149
|
-
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
- `
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
-
|
|
179
|
-
|
|
180
|
-
- **
|
|
181
|
-
|
|
182
|
-
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
-
|
|
208
|
-
|
|
209
|
-
-
|
|
210
|
-
-
|
|
211
|
-
-
|
|
212
|
-
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
- `
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
-
|
|
230
|
-
-
|
|
231
|
-
-
|
|
232
|
-
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
-
|
|
245
|
-
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
-
|
|
269
|
-
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
-
|
|
290
|
-
|
|
291
|
-
###
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
###
|
|
305
|
-
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
-
|
|
320
|
-
-
|
|
321
|
-
|
|
322
|
-
-
|
|
323
|
-
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
-
|
|
338
|
-
|
|
339
|
-
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
###
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
###
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
1
|
+
# 更新记录
|
|
2
|
+
|
|
3
|
+
本文件记录 **dsh-theme-palette** 每个版本改了什么;README 只讲当前版本的设计与用法。
|
|
4
|
+
|
|
5
|
+
## 版本一览
|
|
6
|
+
|
|
7
|
+
### 1.9.9
|
|
8
|
+
按一次独立审计(`_audit-theme-palette-20261025/`,针对 1.9.8,11 条问题)逐条核实后修订。**核实结论是:8 条成立并已修;3.5 成立但属于权衡(只补控件边界档,不把全部边框提到 3:1);1 条不成立(报告本身的口径错,已更正)。另有两项在三套预置的「对齐契约」上做了让步(浅画布分离、链接 Lc 门),由用户拍板后修改。**
|
|
9
|
+
|
|
10
|
+
- **深色侧单独一套文字下限**(审计 3.1)。WCAG 2.x 的相对亮度比在暗底上系统性高估可读性:同一个 4.62 在浅色模块面 `#f5eee3` 上相当于 APCA Lc≈71,在深色模块面 `#4a3f36` 上只有 Lc≈48 —— 所以旧下限在深色上是「纸面达标」。现在深色次级 **8.0**、三级 **6.4**(高对比 9.6 / 7.6),浅色侧不动(它的 6.2 / 4.62 换算成 Lc 是 79 / 71,本来够)。
|
|
11
|
+
实测:深色模块面对 APCA Lc,三级从 **44.7–47.7 → 61.9–68.5**;承诺面 48 组(4 套配色 × 正文/次级/三级/链接 × 深浅各两面)里
|
|
12
|
+
`Lc < 60` 的从 **11 组降到 2 组**,剩下的 2 组是**自定义配色的深色链接**(Lc 52.7 / 55.0)—— 链接下限当时仍是 6.4。
|
|
13
|
+
这两组已随下面的「链接按 APCA 收口」一并抹平:现在承诺面 **48 组全部 ≥60**。
|
|
14
|
+
- **链接按 APCA 收口**:链接的 WCAG 下限不动(4.62 / 高对比 7),另加一道 APCA 门 —— 深色侧 Lc **≥60**(高对比 ≥75),浅色侧靠比值已够。求解器新增 `raiseToLc()`:比值达标而 Lc 不够时,沿「远离背景」的方向按 Lc 目标反推、二分回色域,最多 12 步。
|
|
15
|
+
实测链接 Lc(深色 950/875/800):暖砂 73/72/64、靛蓝 66/65/60、苔绿 71/70/64、自定义 67/65/60;浅色 00/60 落在 61–81。自定义深色链接由 Lc 52.7 抬进同一档。
|
|
16
|
+
走过一段弯路必须记下:先把下限从 4.62 直接抬到 8.0,自定义深色链接被求解到 **`#ffffff`** —— 纯白链接等于丢掉品牌色。所以门开在 Lc 上,WCAG 下限保持原值。
|
|
17
|
+
- **对比度报表新增 APCA 列**:每个格子除 WCAG 比值外给出 Lc 与「APCA 参考档」(正文 ≥75 / 次级 ≥60 / 三级 ≥45)。这一列**不设门**,只把「过了 AA 但读起来费劲」变成看得见的数字。`palette-dev.mjs` 的表格新增 `Lc` 列;设置页矩阵的每格悬停提示也给出 Lc(表格本身仍以比值为主,Lc 不设门)。
|
|
18
|
+
- **色阶单调性**(审计 3.2)。`compressL` 原来是 `L ≥ 0.92 → L-0.044` 的硬阈值,跨越阈值的相邻两档会撞成同色(浅色 150/200 实测 ΔE 0.36);`tuneRamps` 逐个反解明度却从不排序,于是 `950` 被表面目标钉住、`1000` 为了过 12:1 被拉亮 —— 出现「编号越大反而越亮」。现在压缩是连续的(误差 <0.001),并在 `tuneRamps` 收尾加一次 `enforceRampOrder`:按档位序号排序后强制 `L[i+1] ≤ L[i] - 0.008`,越界时按比例回压而非硬截;深浅侧各自一套「墨色档」(浅 700/1000、深 50/300/400)不参与阶梯 —— 它们在深色里就是字色,天生要比面亮。实测 4 套配色 × 两档,**12 个面档全部单调**。
|
|
19
|
+
- **「文字着色」三档对预置配色恢复有效**(审计 3.3)。1.9.0 为了「参考实现精确对齐」给三套预置写了固定参考墨色,并在 `fit()` 里把色阶整体覆写 —— 三档算出的色度差在覆写那一刻就没了(实测静↔浓 ΔE 0)。现在参考墨色降级为**起点**:明度与色相仍对齐参考值,色度改由档位驱动(`TEXT_MODES` 新增 `inkC` / `inkDarkC`,静 −0.026 / 标准 0 / 浓 +0.022),`fit()` / `boost()` / `vivid()` 三条旧路合并成一个 `solveOn()`。实测静→浓:浅色正文 ΔE **3.2 / 4.7 / 4.1**、屏幕上渲染的次级 **5.1 / 5.6 / 6.4**、深色正文 0.5–1.6(近白处色度台阶被 sRGB 色域压住,暖砂/靛蓝/苔绿)。代价必须说清:**逐 token 的「精确对齐」只保住了正文**(1000 档 ΔE 0.0–2.1),次级与三级现在比 1.9.0 的参考墨色偏 4.6–11.4 —— 档位若要真有效,这两个 token 就不能继续钉死在参考墨色上。
|
|
20
|
+
- **高对比档的边框与滚动条真的提上去了**(审计 3.4)。旧实现里 HC 只改文字:`border-l*` 的 alpha 一个字没动(实测与普通档完全相同,1.23–1.39:1),滚动条压根不在 HC 分支里。现在 HC 下 `border-l2 / l3 / l4` 按 SC 1.4.11 对承载面**定量**求解到 **3.0 / 3.4 / 4.0:1**(实测 3.26–3.39),滚动手柄 **3.01–3.07:1**。
|
|
21
|
+
这里的「定量」是必须的:先按老路用 `solveForeground` 求解,从墨色起步时它一步都不用挪就「已达标」,直接返回墨色 —— 实测 16.9:1,发丝线变黑框,比不改还难看。新增 `mixToContrast()`:在 `面→墨` 的直线上二分混合比,命中目标值本身。
|
|
22
|
+
- **新增 `--dshtp-border-control`(组件边界 3:1)**(审计 3.5)。宿主的 `border-l1..l4` 是四层递进的「发丝线」,没有「装饰性分隔线」与「组件边界」的区分,而 SC 1.4.11 只管后者。插件自己的设置页输入框改用这一档实色。宿主控件边框仍由宿主负责 —— 插件不替它做这个决定,也不打算把全部边框一律提到 3:1(那会把界面弄成表格)。
|
|
23
|
+
- **三套预置的浅色画布:先拉开、再回归参考实现**(审计 3.7)。旧浅画布 `#fdfbf7 / #f8fafc / #f9fbf7` 两两 ΔE 只有 0.8–1.4 —— 1.9.0「surface token 对齐参考实现」的直接结果。1.9.9 期间先按审计建议拉开到 `#fff8ec / #eef7fd / #eff4e4`(ΔE 3.11 / 3.23 / 4.35),随后**用户对照参考实现否决了这版**:苔绿的纸面被染成黄绿,而参考实现的苔绿纸面是近中性白 `#f9fbf7`。
|
|
24
|
+
现在回到参考值:00 取参考 `surface`、60 取 `surface-subtle`、150 取 `surface-strong`(暖砂 `#fdfbf7 / #faf6ef / #e9dfd0`、靛蓝 `#f8fafc / #f3f6fb / #e0e7f0`、苔绿 `#f9fbf7 / #f4f8f0 / #dee8d8`)。**同套内部**层次照旧(00↔150 有 6–8 ΔE),**跨套的区分**挪到次层与强调色:00 两两 0.52–1.00(与参考实现一致),150 两两 **2.46 / 3.42 / 4.13**。深色侧不取参考的 `surface-dark(#0d1310)`:本插件侧栏在画布下方,画布压到那里「更深」档会掉到近黑 `#050a07`,四层仍按 subtle / muted / raised / strong 落位。
|
|
25
|
+
- **「更浅」档不再反向压暗,也不会「点了没反应」**(用户 1.9.9 预览实测)。参考实现的暖砂纸面 L 已经是 **0.9888**,而 `lift()` 的提亮上限是 0.985 —— clamp 一夹,「更浅」反而比画布更暗(实测 `#fdfbf8 → #fafaf9`)。现在上限抬到 0.995,并给 `lift()` 加单调保护(提亮不许把亮度压下去);近白纸面余量不足时改为「削色度 + 顶到上限」,读作更白的一张纸。悬停/选中另给 0.012 的步进地板,此前在靛蓝/苔绿的「更浅」档二者与底色**完全相同**(ΔE 0.00)。
|
|
26
|
+
地板与「不许穿回画布」在近白纸面上是相互冲突的(可用空间只有 0.005–0.012),口径定为**最多下穿画布 0.008**(实测 0.0026–0.0057,ΔE ≤ 1.4,读作「被按下去一点」)。实测三档:更浅 0.73–1.12(悬停 1.19 / 选中 2.39)、同色 0.00、更深 2.02–2.13。
|
|
27
|
+
- **「同色」侧栏现在真的与主栏同色**(用户 1.9.9 预览实测)。旧实现里三档侧栏底色都走一遍 `lift()`,随后再补一次色度,而补偿固定用 `scheme.hue` —— 苔绿的 `scheme.hue` 是 **162(青绿)**、画布 00 的色相却是 **121(橄榄)**,于是「同色」被染成薄荷绿 `#defaeb`(与画布 ΔE **2.49**,左栏和主栏明显不是一个色);靛蓝差 0.50、暖砂差 0.40。
|
|
28
|
+
现在同色档直接取画布本身(**ΔE 0.00**,逐字节相等),另两档的补偿只补「不足的」色度并**沿用画布自身色相**。
|
|
29
|
+
`tools/check-audit.mjs` 新增第 17 组断言(3 套 × 2 档 × 3 项 = 24 条)把这条锁死 —— 同色必须逐字节等于画布、另两档色相差 ≤12°。
|
|
30
|
+
- **新增「色觉无障碍」文档节**(审计 3.8):预置之间的差异主要靠强调色与深色档(强调色 vs 画布在四种视觉下 ΔE ≥ 37.8,是安全通道);暖砂与苔绿在 deutan 下几乎同色(深画布 ΔE 0.84),红/绿语义色在 protan 下只剩 5.7 —— 语义色由宿主提供、插件有意不染色,用图标或文字区分。
|
|
31
|
+
- **未知模式 id 不再静默**(审计 3.9)。`buildTokens` 入口对未知的 `sidebarMode / textMode / rightbarMode / scrollMode / controlMode / mdMode` 打一行 `console.warn`(带合法值清单,同值只报一次);`tools/check-audit.mjs` 新增第 16 组断言把这条锁死。
|
|
32
|
+
- **自定义配色的无彩色底不再派生错色相**(审计 3.10)。纯黑 / 纯白 / 正灰的画布色度≈0,色相是数值噪声(实测出现过粉色偏色)。`customScheme()` 现在按「底色 → 文字色 → 强调色」的顺序取第一个有色度(C ≥ 0.008)的色相;三者都无彩色时判定 `achromatic`,把整套色度归零并回落到中性。
|
|
33
|
+
- **工程与维护**(审计 3.11):`rampCache` 改成 96 条上限的 LRU(原来是无界 Map,长会话里配色/档位组合多起来只增不减);`buildTokens` 结果按设置签名 memo;自愈探针加上 `--dsw-specific-menu` 与 `--dsw-alias-label-tertiary`(菜单是唯一被宿主用更高特异性规则声明过的 token,它若失效,菜单会悄悄回到宿主的冷灰)。
|
|
34
|
+
- **更正审计报告里的一处错**:报告说「三处 `:focus-visible` 只设 `outline-offset`、轮廓颜色吃浏览器默认」——不成立。设置页 CSS 用一条组选择器统一给了 `outline:2px solid var(--dsw-alias-label-primary)`,那三处只是覆盖 offset;`prefers-contrast: more` 下还有 `ButtonBorder` 兜底。
|
|
35
|
+
- README 五种语言同步:文字下限改成「浅 / 深」两套口径,并说明深色为什么需要更高的比值。
|
|
36
|
+
|
|
37
|
+
### 1.9.8
|
|
38
|
+
把「承诺什么」「能不能做到」「健不健康」三件事分开说清,并修掉几个会骗自己的判据:
|
|
39
|
+
|
|
40
|
+
- **自愈判据改为「覆盖层标记 + 颜色比对」**:旧判据只看关键 token 的计算值是否非空 —— 覆盖层被宿主撤销后,宿主的基础 token 仍然有值,判据永远说「健康」,配色却早已跳回默认(假健康)。现在用两件事判断:本插件自己写入的标记属性 `--dshtp-layer` 是否还在,以及关键 token 的计算值是否等于本层期望值(明暗两色任一相符即可)。判据不成立才重放,退避与停用逻辑不变。
|
|
41
|
+
- **对比度报告改成单一模型:声明目标 / 物理上限 / 政策豁免 三者分开**。设置页 UI、报表 CLI(`palette-dev.mjs`)与审计断言(`tools/check-audit.mjs`)共用同一份数据,不再各算各的。
|
|
42
|
+
- 声明目标:正文浅色 **12:1**、深色 **10:1**(高对比档 15:1);次级 **6.2**(HC 9);三级 **4.62**(HC 7);链接 **4.62**(HC 7)。
|
|
43
|
+
- 承诺面:浅色 **00/60**,深色 **950/875**。
|
|
44
|
+
- 政策豁免:深色 **800**(模块面)与 **850**(次级深面)**不为正文兜底**(1.9.7 的产品策略保留),报表单列为「政策外」——单独统计,既不算达标也不算失败,也不再标成「物理上限不足」。
|
|
45
|
+
- 物理上限**只由计算得出**:该承载面上黑或白前景能达到的对比度。求解器里的 0.93 只是**求解余量**,仅用于判断「目标是否高于上限」,不再混进上限本身。
|
|
46
|
+
- 底线不变:AA **4.5**。政策外的面仍须过 4.5(暖砂 800 实测 6.20、850 实测 9.27,均过线)。
|
|
47
|
+
- **健康反馈不再含糊**:同色重放后「已恢复 N 次」会跟着刷新(判重时把重放次数算进去);「配置已保存」与「主题已应用」分开报,应用失败有明确提示(`配置已保存,但主题没有应用成功`)。
|
|
48
|
+
- **界面可用性**:对比度表放进**有名可聚焦的横向滚动区**(窄栏 / 移动端 / 200% 缩放都能用);HEX 草稿与外部改动冲突时不再覆盖新值,保留最新值并提示。
|
|
49
|
+
- **对比度报告量的是屏幕上真正渲染的 token**:次级 / 三级文字按插件覆盖后的 alias 值量,不再拿色阶步进代替。这一处口径错位修掉了两件事 —— 自定义配色下三级文字被报成 **4.21**(低于 AA 4.5 的假警报,实际渲染的覆盖值已被求解器兜到 ≥ 4.62),以及深色 800/850 上真实字色低于下限(暖砂三级 **3.79**、高对比档 **4.29**,均低于 AA 4.5)。
|
|
50
|
+
- **深色次级 / 三级文字的压暗面从 950/875 扩到 950/875/850/800**:在更亮的模块面(800)上同时守住下限,代价是深色次级 / 三级字色比 1.9.7 亮一档。
|
|
51
|
+
- 修正 1.9.7 记录里的自相矛盾:那一版既写「以 950/875/850 定标」,又写「800/850 标为政策外」。1.9.8 统一为「**850 政策外**」——深色 850 不为正文兜底,承诺面是 950/875。旧记法把深色模块面说成「物理不可达」同样不成立:800 的物理上限约 10.22:1、850 约 15.27:1,都高于 10:1 目标 —— 它们不是「做不到」,只是不在承诺范围内。
|
|
52
|
+
- README 五种语言与 [docs/DESIGN.md](docs/DESIGN.md) 同步到同一口径(Node 要求改为 `^22.19.0 || >=24.0.0`)。
|
|
53
|
+
|
|
54
|
+
### 1.9.7
|
|
55
|
+
暗色正文按策略 A 定标(用户反馈「白色文字太亮」):
|
|
56
|
+
|
|
57
|
+
- 非高对比模式正文目标从 12:1 降到约 **10:1**(950 上实测 10.1–11.5)
|
|
58
|
+
- 以侧栏/卡片面(950/875/850)定标;**模块面 800 不再为正文兜底**(约 5.6–6.5:1,仍过 AA)
|
|
59
|
+
- 报表口径同步:深色正文承诺 12→10,800/850 标为「政策外」而非违例
|
|
60
|
+
- README 的 12:1 表述待同步(发版前完成)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
### 1.9.6
|
|
64
|
+
深色菜单/说明文字压暗(用户反馈「左侧菜单明度太高」):
|
|
65
|
+
|
|
66
|
+
- 深色 `label-secondary` / `label-tertiary` 按导航实际承载面(950/875)压到 L0.78 / L0.70
|
|
67
|
+
- 暖砂 `#cdb295`/`#b7987a`、靛蓝 `#a3b9d7`/`#88a0c1`、苔绿 `#a0c1a9`/`#84a990`
|
|
68
|
+
- 侧栏对比度 8.9:1 / 6.7:1,仍高于下限;四套(含自定义)同步
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
### 1.9.5
|
|
72
|
+
自定义配色对齐新的标签规则(不再只有三套预置享受):
|
|
73
|
+
|
|
74
|
+
- 二级/三级/更弱文字(`label-secondary/tertiary/dimmed`)在自定义下也按主题色相给足色度
|
|
75
|
+
- `midC` 0.010→0.020;侧栏补色度设上限 0.010,不会过度染色
|
|
76
|
+
- **画布不强制推白**:自定义的页面色仍由用户选的底色派生(保留选择权)
|
|
77
|
+
- 对比度仍按真实承载面求解
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
### 1.9.4
|
|
81
|
+
侧栏色度显式补足(用户对比参考实现发现侧栏偏中性):
|
|
82
|
+
|
|
83
|
+
- 画布收敛到近中性后,侧栏继承不到暖色;现按方案 `lightC×0.75` 显式补色度(保持明度)
|
|
84
|
+
- 暖砂 `#f8f4ef`(C0.008,参考 `#faf6ef` C0.009)、靛蓝 `#f0f3f8`、苔绿 `#eff5f2`
|
|
85
|
+
- 只改浅色侧栏底色,悬停/选中随之推导;深色侧不变
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
### 1.9.3
|
|
89
|
+
二级/三级/更弱文字**明暗两套**都提高鲜艳度(用户反馈「只是希望字色鲜艳一点」):
|
|
90
|
+
|
|
91
|
+
- 显式覆盖 `label-secondary` / `label-tertiary`:色度 0.050–0.055(原来是 0.01–0.03 的灰),明暗各一套
|
|
92
|
+
- 暖砂 `#785c40`/`#c9a98b`、靛蓝 `#526685`/`#8ea6c7`、苔绿 `#4a6c54`/`#8bb097`
|
|
93
|
+
- `label-dimmed` / `document-preview` 同步提到 C0.030–0.040
|
|
94
|
+
- 仍对真实承载面求解对比度(二级 6.2、三级 4.62),不牺牲可读性
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
### 1.9.2
|
|
98
|
+
更弱的注释层也跟随主题(用量统计 / 时间戳这类):
|
|
99
|
+
|
|
100
|
+
- 显式覆盖 `label-dimmed`(200/750)与 `label-document-preview`(300/700),色度提到 0.018–0.023
|
|
101
|
+
- 对比度按 3:1(次要信息下限)对真实承载面求解:暖砂 `#887e72`/`#958a7e`、靛蓝 `#7b8592`、苔绿 `#7d8577`
|
|
102
|
+
- 说明:若界面里该处仍发灰,可能是宿主直接用了 Tailwind 字面色而非 token,需要具体元素定位
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
### 1.9.1
|
|
106
|
+
注释/时间戳类文字跟随主题(用户反馈「颜色发灰」):
|
|
107
|
+
|
|
108
|
+
- `midC` 0.010→0.020:label-caption / label-tertiary / 边框等中间层色度提高约一倍
|
|
109
|
+
- `label-caption` 浅色不再直接用 400 号色(只有 ~2.4:1),改为对 00/60 求解到 AA;
|
|
110
|
+
暖砂 `#776855`(C0.034,画布 5.22 / 卡片 4.68)、靛蓝 `#636d81`、苔绿 `#597165`
|
|
111
|
+
- 深色 caption 求解保持在 800/850 ≥4.6(暖砂 `#bbad9c` 4.66)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
### 1.9.0
|
|
115
|
+
按参考实现(web.yily.top)的设计 token 做**精确重标定**,不再凭截图猜:
|
|
116
|
+
|
|
117
|
+
- 取得其四套配色的 surface / ink / link / accent 全表;三套预置的表面层逐字对齐:
|
|
118
|
+
暖砂 、靛蓝 、苔绿 - 深色层对齐 (暖砂)等,四层与参考一致
|
|
119
|
+
- 正文/次级/三级/链接改用参考 ink 目标;**仍过对比度下限**——参考本身不达 AA 的三级文字会被最小幅度调深(唯一允许的偏离)
|
|
120
|
+
- 新增断言:三套 ink 与参考值 ΔE ≤4;深正文色相仍贴近 darkHue
|
|
121
|
+
- 删除旧的「三套正文色度比」断言:参考本身各套 ink 色度不同,等色度不是正确目标
|
|
122
|
+
- 中间层(75/100/200)按 60→150 的 OKLCH 插值,边框与悬浮态不跳变
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
### 1.8.4
|
|
126
|
+
三套预置统一「变轻」(依据参考实现的实际取色,不是凭感觉):
|
|
127
|
+
|
|
128
|
+
- 参考图实测:暖砂 页面 `#fcfbf7` / 卡片 `#f5efe3` / 控件 `#e8dfd0`;
|
|
129
|
+
靛蓝 页面 `#ffffff` / 侧栏 `#f2f6fc` / 控件 `#e1e8f1`——共同点是**页面近白、染色集中在侧栏与控件**
|
|
130
|
+
- 原文三套都把色度均匀铺在所有表面上:暖砂 `#feeedb`(C0.030)、靛蓝 `#eaf1ff`(C0.020)、
|
|
131
|
+
苔绿 `#e8f4ed`(C0.016),所以整体像「米黄/浅蓝/浅绿纸」
|
|
132
|
+
- 现在:`lightC` 暖砂 0.030→0.010、靛蓝 0.020→0.010、苔绿 0.016→0.009;
|
|
133
|
+
三套画布统一到 `L0.955 / C0.008–0.010`(`#f5efe9` / `#edf0f7` / `#ebf2ef`),卡片与侧栏保留层次
|
|
134
|
+
- **刻意没有把画布推到纯白**:那会让「左侧栏:更浅」失去空间(ΔE 掉到 JND 以下)。
|
|
135
|
+
三套实测三档 ΔE 均 ≥3.09 / 0 / 2.07,全部可辨
|
|
136
|
+
- 深色同步收敛:参考暗色页面 暖砂 `#1a1613` / 靛蓝 `#131723` / 苔绿 `#111b15`,
|
|
137
|
+
侧栏与卡片几乎同色(扁平),只有控件提亮;
|
|
138
|
+
原 `darkLift` 0.026/0.032/0.042 把画布抬到 L0.223–0.238 —— 现统一 `darkLift 0.006`,
|
|
139
|
+
画布降到 `#1a1612` / `#13171f` / `#131815`(L0.203),`darkC` 0.010 / 0.019 / 0.010
|
|
140
|
+
- 副作用是好的:深色模块面(800)变暗后可达上限提高,「表面受限」从 8 处降到 5 处
|
|
141
|
+
- 正文/次级/链接的对比度全部复验(暖砂正文/画布 14.69 ≥ 12)
|
|
142
|
+
- 四张 README 截图与字体对照图同步重建
|
|
143
|
+
|
|
144
|
+
### 1.8.3
|
|
145
|
+
补齐 token 覆盖缺口(按宿主 118 个 alias/specific 做传递闭包统计:76% 跟随;余下 28 个逐项判断该不该跟):
|
|
146
|
+
|
|
147
|
+
- **深色菜单**:`--dsw-specific-menu` 宿主带字面量兜底(深 `#303136f0`),只改 `menu-surface-fill` 不够,
|
|
148
|
+
深色菜单仍是冷灰 → 现在按配色给(浅 50/深 850,alpha 0.94)
|
|
149
|
+
- **品牌新色**:`--dsw-alias-brand-primary-new-…` 浅色写死 `#4176e6` 宿主蓝 → 两模式都归到强调色
|
|
150
|
+
- **文件 diff 温度调和**:6 个 `file-diff-*` 保留绿/红语义,色相往配色拉 16–22°、压低饱和;
|
|
151
|
+
断言「新增仍是绿色系、删除仍是红色系」+ 正文对 diff 底 ≥4.5
|
|
152
|
+
- **对比度矩阵加菜单面**:半透明面按画布合成后给出参考值,标 `※`(不计硬门),
|
|
153
|
+
UI 与 `palette-dev` 共用同一份 `CONTRAST_SURFACES`(含 token 面)
|
|
154
|
+
- **诊断导出**:矩阵区新增「复制诊断」,输出 settings + 对比度矩阵 JSON,便于提 issue
|
|
155
|
+
- **forced-colors**:核实我们改的都是 UA 强制色属性,系统高对比模式会自动接管,
|
|
156
|
+
因此**不加** `forced-color-adjust: none` 对抗(代码内已注明理由)
|
|
157
|
+
- 契约测试补 `--dsw-specific-menu` / `--dsw-alias-brand-primary-new-…` / `--dsw-alias-file-diff-added-bg`
|
|
158
|
+
- 明确不跟:`bg-mask-*`(遮罩)、`border-inverted*`(反色边框)、onboarding(一次性引导)——刻意保留宿主原值
|
|
159
|
+
|
|
160
|
+
### 1.8.2
|
|
161
|
+
**暖砂字体体系修正**(用户反馈“和其他两套不一样,尤其字体颜色”):
|
|
162
|
+
|
|
163
|
+
- **根因 1:深色正文字色度没有按色域归一**。`paperC` 是绝对值,×2.4 后暖砂请求 130%、靛蓝 166% 色域上限,
|
|
164
|
+
实际色度被裁成 0.0244 / 0.0115 / 0.0303——暖砂深正文几乎是靛蓝的两倍黄。现在三套统一 `paperC=0.0053`
|
|
165
|
+
(标准档实际 ≈0.0127),浅/深正文色度比降到 1.21 / 1.10
|
|
166
|
+
- **根因 2:暖砂是唯一「深色面 60°、正文 84°」的双色相预置**。深色面橙棕、正文黄绿,色相分裂 24°;
|
|
167
|
+
现在 `paper` 角色跟随 `darkHue`,并把暖砂 `hue` 84→72、`darkHue` 60→66,全套色相收敛到 12° 内
|
|
168
|
+
- 新增断言:深正文色相偏离 `darkHue` ≤12°、三套浅色正文色度比 ≤1.25、深色 ≤1.5
|
|
169
|
+
- 新增 `tools/preview-typography.mjs`:三套 × 明暗并排渲染同一段文字,发版前目检
|
|
170
|
+
|
|
171
|
+
语法高亮跟随配色(1.8.1 里“未做”的那条,前提已实测):
|
|
172
|
+
|
|
173
|
+
- **实测依据**:宿主渲染器用 Shiki 的 `css-variables` 模式(`class="shiki css-variables"`,
|
|
174
|
+
`style="background-color:var(--shiki-background)"`),token 颜色走 CSS 变量,
|
|
175
|
+
所以覆盖 `--shiki-token-*` 生效,不需要 `!important`
|
|
176
|
+
- **色相策略**:从强调色相取 3 个色族(强调 / +150° 冷族 / -60° 暖族),
|
|
177
|
+
同族靠明度分常/表达;每个 token 对代码块底求解到 **≥4.6:1**,四族最小 ΔE **≥10**
|
|
178
|
+
- 覆盖 9 类 token(keyword / function / constant / parameter / string / string-expression /
|
|
179
|
+
comment / punctuation / link)+ `--shiki-background` / `--shiki-foreground`
|
|
180
|
+
- **md=off 时不输出**任何 shiki token,交回宿主原色
|
|
181
|
+
- 新增 `tools/preview-code.mjs`:用生产 token 渲染一段真实代码,发版前肉眼确认
|
|
182
|
+
- 断言:9 类 token 对比度 ≥4.6、四族 ΔE ≥10、shiki 背景与代码块一致、md=off 无输出
|
|
183
|
+
|
|
184
|
+
### 1.8.1
|
|
185
|
+
Markdown 配色丰富化(非加色相,而是加层级 + 修代码块底):
|
|
186
|
+
|
|
187
|
+
- **标题三档**:h1/h2 → h3/h4 → h5/h6 由强到弱(`--dshtp-md-h1/h2/h3`),不再六级同色;
|
|
188
|
+
层级按**着色强度**区分,字号仍由宿主决定
|
|
189
|
+
- **引用 / 表格 / 分割线 / 列表**:引用淡底 + 左侧强调边、表头淡底、表格边框与分割线跟随语义 token、列表标记用三级文字色
|
|
190
|
+
- **修代码块双层底**:宿主 `<pre>` 背景来自 `--shiki-background → --dsw-alias-markdown-code-block`(bluish-50/900),
|
|
191
|
+
此前只染 `.md-code-block` 外层,内层仍是宿主中性色;现在直接覆盖该 token(含 banner),两层同色
|
|
192
|
+
- **新增断言**:标题三档互异、正文/代码块底 ≥4.5、正文/引用底 ≥4.5、次级/表头底 ≥5.5、
|
|
193
|
+
`<pre>` 底色与代码块一致、`md=off` 时全部继承;契约测试补 `--dsw-alias-markdown-code-block`
|
|
194
|
+
- **未做**:语法高亮(`--shiki-token-*`)跟随配色。宿主构建里这 9 个变量只定义、无消费者,
|
|
195
|
+
需先在 GUI 实测渲染器是吃变量还是内联色,再决定方案——不在未验证的情况下强改
|
|
196
|
+
|
|
197
|
+
### 1.8.0
|
|
198
|
+
依据 [竞品调研](../../_audit-theme-palette-20261023/竞品调研-2026-10-23.md) 的差距反哺:把工程严谨变成可见、可分享、可验证的东西(不改求解器)。
|
|
199
|
+
|
|
200
|
+
- **对比度矩阵**:设置页新增可折叠「对比度」区,4 个前景角色 × 7 个承载面的实测/目标/表面受限三态;
|
|
201
|
+
`CONTRAST_SURFACES` / `CONTRAST_ROLES` 成为唯一定义,`palette-dev.mjs` 改为消费同一份(消除两套口径)
|
|
202
|
+
- **「试试示例」**:导入区一键填入演示短码并触发预览;码由生产 `encodeConfig` 运行时生成,schema 演进自动跟随
|
|
203
|
+
- **五语 README 叙事**:新增 `## Pitfalls we hit`(1.7.0 的 5 条审计事故)与 `## Trade-offs`
|
|
204
|
+
(明确不做玻璃/壁纸/市场/AI 生色),标题逐字一致由脚本断言
|
|
205
|
+
- **五语 `## Sharing`**:放一条真实示例短码(生产编码器生成 + `decodeConfig` 往返自检),说明它包含三色
|
|
206
|
+
- **截图资产重建**:4 张(浅/深/自定义面板含解释性校正/高对比),`screenshots.json` 3→4
|
|
207
|
+
- **主题包导出(单向)**:`npm run packs` 导出 `dsh-dream-skin/pack` 格式 8 个包(4 配色 × 明暗,每包 90 tokens),
|
|
208
|
+
全部通过正文/画布对比度自检;**不实现导入**——导入会绕过对比度求解器
|
|
209
|
+
- 工具:`preview-settings` 支持 `--notice/--hc/--out`,透传 `id/scope/title/data-*`;
|
|
210
|
+
新增 `sample-code` / `insert-readme-sections` / `insert-readme-gallery` / `export-theme-pack`;
|
|
211
|
+
`check-ui` 扩到 69+ 断言(矩阵、示例码可解码、五语标题一致、单一 SURFACES 定义)
|
|
212
|
+
- 无存储键变更;无求解器行为变更
|
|
213
|
+
|
|
214
|
+
### 1.7.0
|
|
215
|
+
依据 2026-10-23 审计反哺(对 DSH 0.2.1-rc.2 实际 token 与承载面核实):
|
|
216
|
+
|
|
217
|
+
- **A01 极端强调色**:`accentL` 钳位到 0.30–0.64;链接求解器改为双向搜索并对 00/60/150 同时达标;
|
|
218
|
+
新增 `--dsw-alias-button-info-fill` 覆盖(与主按钮一样按白字 4.5 压暗),不再出现白底白链/白勾
|
|
219
|
+
- **A02 自定义色订阅**:`readCustom` 改为按存储内容缓存的冻结快照,新增 `subscribeCustom`;
|
|
220
|
+
取色/重置/导入会更换引用并触发重渲染,空闲时快照稳定(`useSyncExternalStore` 语义)
|
|
221
|
+
- **A03 分享完整**:`dshs1.` 短码新增 `x`(三色),旧码仍可导入并提示未含自定义色;
|
|
222
|
+
`applyConfigCode` 返回 `{ok,hasCustom}`,非法码不部分写入
|
|
223
|
+
- **A04 承载面求解**:深色正文(50)、次级(300)、caption(500)补上求解;目标按承载面可达上限
|
|
224
|
+
钳位(0.93 余量),`palette-dev` 打印「实际/目标/可达」并标注「表面上限」,不再虚报 12/15;
|
|
225
|
+
caption 注释里的 6.5:1 更正为实测值
|
|
226
|
+
- **A05 文字色相**:自定义文字色相进入 700/750/1000/50 档(此前只取色度)
|
|
227
|
+
- **A06 HEX 校验**:改为 draft + 提交,非法值显示 `aria-invalid` 与行内错误,Enter 提交、Esc 回滚
|
|
228
|
+
- **A07 键盘模型**:分段控件 roving tabindex + 方向键/Home/End
|
|
229
|
+
- **A08 标签结构**:自定义色改为 `role=group` + 色盘/HEX 两个独立 label
|
|
230
|
+
- **A09 健康检测**:探针比对期望值(支持 `#rgb/#rrggbb/rgb()/rgba()`),报 `mismatched`;mono 覆盖更多 token
|
|
231
|
+
- **A10 测试门**:`palette-dev.mjs` 改用生产 `floors()`,支持 `--hc`,硬失败退出码 1
|
|
232
|
+
- **A11 边界**:grid/swatches 改 `minmax(min(100%,N),1fr)`;说明 `_markdown_`/`.md-code-block`
|
|
233
|
+
在当前宿主构建 CSS 中仍存在(属契约风险而非失效);ramp 缓存上限 48
|
|
234
|
+
- **建议落地**:自定义面板新增**解释性校正**(强调色归一化 / 链接压暗,带实际对比度);
|
|
235
|
+
导入改为**先预览后确认**(预览不写存储);新增按版本一次的**升级提示**(`notice.v1`,不碰配色键;
|
|
236
|
+
仅升级前已有配置的用户可见);高对比从「更多选项」移到阅读区;新增 `tools/check-host-contract.mjs`
|
|
237
|
+
契约测试与 `tools/check-ui.mjs` 结构回归,并把它们接入 `npm run check` 与发版预检
|
|
238
|
+
- 新增 `tools/check-audit.mjs`:覆盖极端色、分享往返、文字色相、caption、深色正文可达上限、HC 卡层
|
|
239
|
+
|
|
240
|
+
### 未发版 · 发版预检补强
|
|
241
|
+
- `tools/release.mjs` 新增 **engines.dsh 兼容性预检**:按宿主 app-boot 的同一口径
|
|
242
|
+
(`semver.satisfies(v, range, { includePrerelease: true })`)计算,守住两条底线——
|
|
243
|
+
不得放行 0.1.x/0.2.0(那一代不是 `exports["./client"]` 加载器),也不得误拒
|
|
244
|
+
0.2.2-rc.x / 0.3.x-rc.x(预发布分支缺失的经典坑);`--host <版本>` 可断言具体宿主持有版本
|
|
245
|
+
- 起因:我一度用 node-semver 默认语义判断「0.3.0-rc.1 会被拒」,据此差点发一个给假 bug 打补丁的 1.4.4;
|
|
246
|
+
复核宿主源码发现它带 `includePrerelease`,结论相反。现在这条判断固化进脚本,不再靠手算
|
|
247
|
+
- 该改动只影响本地发版工具,**不进 npm 包**(`files` 不含 `tools/`),故不升版本号
|
|
248
|
+
|
|
249
|
+
### 1.6.0
|
|
250
|
+
视觉与可访问性整改(依据 2026-10-22 第三方 UI 视觉验收审计,60/100):
|
|
251
|
+
|
|
252
|
+
- **A2 配置块重做**:改用 `.dsh-tp-field` 容器(与普通行同节奏),导出/导入各占一行,
|
|
253
|
+
反馈文案就地显示(复制→复制按钮旁,导入→导入按钮旁),导出框加 `text-overflow:ellipsis`
|
|
254
|
+
- **A3 复制不再谎报**:`await navigator.clipboard.writeText()`,失败或无 API 时显示
|
|
255
|
+
「复制失败,请手选后 Ctrl+C」,不再无条件报成功
|
|
256
|
+
- **A4 布局从视口断点改容器驱动**:卡片 `repeat(auto-fit,minmax(196px,1fr))`、色块 `minmax(86px,1fr)`、
|
|
257
|
+
行与分段控件 `flex-wrap`;日语长标签改短(右栏「サイドバー / キャンバス」、滚动条「無彩 / 追従 / 強調」)。
|
|
258
|
+
实测 4 语 × 内容宽 564/336/216:**越界元素 0**(改前日语 216px 溢出 61px)
|
|
259
|
+
- **A5 语言属性**:`<section lang>` 跟随手选语言,`auto` 时回落宿主 `documentElement.lang`
|
|
260
|
+
- **A6 分段控件有名字**:`role="radiogroup"` + `aria-labelledby` 指向行标题,选项改
|
|
261
|
+
`role="radio" aria-checked`(8 组 22 个按钮)
|
|
262
|
+
- **A7 反馈可播报**:复制/导入/自愈状态挂 `role="status" aria-live="polite"`,错误用 `alert`;
|
|
263
|
+
导入框补 `aria-label`
|
|
264
|
+
- **A8 自定义面板层级**:面板底改 `bg-layer-1`(按钮不再与面板同底 1.00:1)、说明文字提到
|
|
265
|
+
`label-secondary` 12px;色值从只读 `<code>` 改为**可输入 hex**(回车/失焦生效,非法值忽略)
|
|
266
|
+
- **A9 缩略图跟随侧栏档位**:`cardColors()` 接收 `sidebarMode`,不再写死默认档
|
|
267
|
+
- **A11** 黑白配色下「滚动条」「开关」置灰禁用(点了也不会有变化)
|
|
268
|
+
- **A12** 卡片与分段按钮 `:focus-visible{outline-offset:2px}`,焦点环不再与选中边框贴死
|
|
269
|
+
- **A13** 加 `prefers-reduced-motion` 降级
|
|
270
|
+
- **A14** `docs/DESIGN.md` 补「当前标定值」表(旧推演内容保留,注明以 `client.js` 为准)
|
|
271
|
+
- **A15** 删掉 4 语共 36 条从未渲染的文案键与未被调用的 `swatches()`
|
|
272
|
+
- **A10 证据链**:README 首图换成当前版本(5 张卡)的**静态渲染**,按真机内容宽 564 px 出图
|
|
273
|
+
(浅色 / 深色 / 自定义面板三张,`--scale 2` 即 1240 px 宽),并在五语 README 里注明「静态渲染」;
|
|
274
|
+
`screenshots.json` 同步为这三张
|
|
275
|
+
- 工具:`tools/preview-settings.mjs` 新增 `--width`(默认按真机 564px 内容宽)与 `--adv`(默认折叠),
|
|
276
|
+
token 跟随 `--palette`;新增 `tools/measure-preview.mjs`(量越界/行高/关键计算色,非 0 越界退出 1)
|
|
277
|
+
|
|
278
|
+
### 1.5.3
|
|
279
|
+
修:选中「自定义」后滚动条不跟随取色。
|
|
280
|
+
|
|
281
|
+
- **根因**:`scrollbarTokens()` 收到的是 `SCHEMES` 里的**占位** scheme 对象
|
|
282
|
+
(`accentHue` 恒为 60),而真正按三色派生出的参数只在 `rampsFor()` 内部解引用。
|
|
283
|
+
于是画布/强调色都对,唯独滚动条永远停在暖橙。
|
|
284
|
+
- **修法**:`buildTokens()` 开头统一解引用一次(`params = scheme.custom ? customScheme(readCustom()) : scheme`),
|
|
285
|
+
之后所有读 `scheme.*` 的地方改用 `params`;`scrollbarTokens(ramps, params, mode)` 也改传解析后的对象。
|
|
286
|
+
- **防复发**:新增 `tools/check-custom.mjs` —— 断言三种强调色必须产出三种滚动条颜色,
|
|
287
|
+
且三组自选色的正文/次文/三级对比度仍在限内(现在输出
|
|
288
|
+
`#2f6fd0→#bfd6f9 #a9683e→#f2cbb3 #4f7a42→#c2ddbb`)。
|
|
289
|
+
- 顺带:`tools/preview-settings.mjs` 支持 `PREVIEW_ACCENT`,可预览任意强调色的自定义面板。
|
|
290
|
+
|
|
291
|
+
### 1.5.2
|
|
292
|
+
设置页交互重排(用户反馈:自定义不该埋在「更多选项」里、取色看不到即时效果):
|
|
293
|
+
|
|
294
|
+
- **自定义配色提为一级区块**:选中「自定义」卡片后,面板直接出现在卡片网格下方,
|
|
295
|
+
不再需要展开「更多选项」
|
|
296
|
+
- **取色实时生效**:同时接 `onInput`(拖动过程中)与 `onChange`(确认后),
|
|
297
|
+
一次 `buildTokens` 实测 **0.15 ms**,整页配色随取色实时变化,不需要"确认"动作
|
|
298
|
+
- **色块放大**:`input[type=color]` 变成 44px 高的圆角色块(隐藏原生 swatch 边框),
|
|
299
|
+
下方显示字段名与十六进制值;三个色块一排,窄屏自动堆叠
|
|
300
|
+
- **恢复默认**:面板右上角一键回到出厂三色
|
|
301
|
+
- 修:预览渲染器不输出 `value`/`placeholder`/`readonly`,导致静态预览里色块是黑的、
|
|
302
|
+
导出码框是空的(真实应用不受影响)
|
|
303
|
+
|
|
304
|
+
### 1.5.1
|
|
305
|
+
- `dsh.compatibility.profiles` 补 `web`:在 web profile 上实测 5 张卡片(含「自定义」)正常显示,
|
|
306
|
+
与 desktop 一致;`dshOperations` 的 install/start 保持 `passed`,uninstall/rollback 仍如实 `unknown`
|
|
307
|
+
- 只改声明,无运行时改动
|
|
308
|
+
|
|
309
|
+
### 1.5.0
|
|
310
|
+
反哺 A-2 / A-3 / A-4 / A-5 —— 把"能调"扩成"可迁移、可自定义、可无障碍、可回归":
|
|
311
|
+
|
|
312
|
+
- **A-3 自定义配色**:新增第 5 张卡片「自定义」,给 底色 / 文字 / 强调 三个颜色,
|
|
313
|
+
引擎只取它们的**色相与色度**,明度仍按明暗模式由引擎决定 —— 因此对比度下限照旧成立
|
|
314
|
+
(实测三组自选色:正文 14.6–15.0、三级 4.62–4.71)
|
|
315
|
+
- **A-2 配置导入/导出**:`dshs1.` 短码(base64url),导入逐项校验、任一不符整体拒绝;
|
|
316
|
+
「更多选项 → 配置」可复制 / 粘贴导入,覆盖全部 8 项
|
|
317
|
+
- **A-4 高对比档**:新开关把文字下限抬到 AAA(正文 ≥15 / 次文 ≥9 / 三级 ≥7 / 链接 ≥7),
|
|
318
|
+
只调求解目标,不换配色;实测 三级 4.65→7.06、次文 6.2→9.05、链接 4.62→7.03
|
|
319
|
+
- **A-5 真机回归可用**:dev 接口新增 `window.__DSH_THEME_PALETTE_DEV_REQUEST__` 入口,
|
|
320
|
+
`tools/shoot-desktop.mjs` 改用 CDP `Page.addScriptToEvaluateOnNewDocument` 注入 + 重载,
|
|
321
|
+
B 层截图回归不再依赖"无人创建的全局"
|
|
322
|
+
- 顺带修:求解器位移上限从写死的 0.13 改为可传参(高对比需要更大位移);迭代次数跟随上限
|
|
323
|
+
- `tools/preview-settings.mjs` 支持 `--palette <id>`,可预览任意配色(含自定义)的设置页
|
|
324
|
+
|
|
325
|
+
### 1.4.4
|
|
326
|
+
- 补 `dsh.compatibility` 兼容性履历(反哺 A-1):
|
|
327
|
+
|
|
328
|
+
```json
|
|
329
|
+
"compatibility": {
|
|
330
|
+
"dsh": ">=0.2.1-rc.1",
|
|
331
|
+
"dshReleases": { "0.2.1-rc.2": "compatible" },
|
|
332
|
+
"dshOperations": { "0.2.1-rc.2": { "install": "passed", "start": "passed", "uninstall": "unknown", "rollback": "unknown" } },
|
|
333
|
+
"profiles": ["desktop"]
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
说明:**宿主不读这个字段**(`client-modules`/`app-boot` 只读 `dsh.bundle`、`dsh.client`、`engines.dsh`),
|
|
338
|
+
它是给目录站/市场展示"哪些版本真的装过、启过、卸过"的。写入的都是**实测过的**事实:
|
|
339
|
+
0.2.1-rc.2 上装过、启动过;卸载/回滚没测,如实写 `unknown`;web profile 已安装但未重启验证,暂不列入。
|
|
340
|
+
|
|
341
|
+
### 1.4.3
|
|
342
|
+
安全审计后的整改(`@应用安全工程师` 审计,逐条复核后落地):
|
|
343
|
+
|
|
344
|
+
- **文档**:`tools/README.md` 删掉「把 `--remote-debugging-port` 长期写进快捷方式」的建议,改为「只在截图那一次开、抓完即关」,并说明该端口无鉴权等价于渲染进程任意代码执行,同时给出 `--remote-debugging-pipe` 替代
|
|
345
|
+
- **`tools/release.mjs` 去 shell 拼接**:name/version/tag 先过严格白名单,命令一律 `execFileSync(程序, 参数数组)`,npm 走 `node <npm-cli.js>`;registry 探测改用 `fetch`(不再 curl);`--dry` 无副作用
|
|
346
|
+
- **发布前校验**:`PLUGIN_VERSION` 必须等于 `package.json.version`;CI 下自动加 `--provenance`;配了 `user.signingkey` 时 tag 自动用 `-s`
|
|
347
|
+
- **dev 钩子收口**:默认不暴露,必须 URL 带 `?dshThemeDev=1`;`attach` 返回的清理函数在插件卸载时调用;`setTheme` 补 `light/dark/system` 白名单(此前是唯一不校验输入的 setter)
|
|
348
|
+
- **自愈定时器**:4s → 15s,且 `visibilityState === 'hidden'` 直接早退(不再后台空转样式回读)
|
|
349
|
+
- **token 前缀**:`--dsh-*` → `--dshtp-*`(与宿主 `--dsh-content-*` 等命名解耦,避免跨插件碰撞)
|
|
350
|
+
- **`tools/shoot-desktop.mjs`**:修收尾处引用未定义变量 `original` 的崩溃;还原动作移进 `try/finally`,中途失败也不会把用户明暗偏好留在被改写状态
|
|
351
|
+
- **声明补齐**:peer 补 `dsh-client-ui-theme` / `dsh-client-ui-settings`(optional),`engines.dsh >= 0.2.1-rc.1`;`files` 移出 `palette-dev.mjs` 与 `tools/*`(发布面从 24 个文件降到 14 个)
|
|
352
|
+
- **README 五语版本钉** 1.4.0 → 1.4.3
|
|
353
|
+
|
|
354
|
+
### 1.4.2
|
|
355
|
+
- **修复启动崩溃**:1.4.1 为了展示元数据加了 `exports`,但漏了 `"./client"` —— 宿主 `client-modules` 找不到 client bundle 时会让 **required 插件 `modules` 启动失败**,整个 profile 的插件全部不加载(重启后界面报错、插件消失)
|
|
356
|
+
- `exports` 现在显式列出 `./client`、`./client.js`、`./index.js`、`./cordis.patch.yml`、`./package.json`
|
|
357
|
+
- `tools/release.mjs` 增加守卫:声明了 `dsh.client` 就必须能解析 `exports["./client"]`,否则发版前直接失败
|
|
358
|
+
|
|
359
|
+
### 1.4.1
|
|
360
|
+
- README 按 DSH 插件标准拆成五语:`README.md`(英文源)/ `README-zh.md` / `README-es.md` / `README-pt.md` / `README-hi.md`,章节结构完全一致
|
|
361
|
+
- 补展示元数据:`locale/{en,zh}.json` 的 `meta.title`/`meta.description` + `exports` 暴露 `./locale/*.json` 与 `./icon`
|
|
362
|
+
- 对齐官方工程门禁:`engines.node` → `^22.19.0 || >=24.0.0`、`packageManager` 钉 `pnpm@11.7.0`
|
|
363
|
+
- `dsh-plugin-dev check`:**11 passed / 0 failed / 0 warned**
|
|
364
|
+
|
|
365
|
+
### 1.4.0
|
|
366
|
+
- 多语言:简体中文 / 繁體中文 / English / 日本語;「自动」跟随宿主的 `documentElement.lang`
|
|
367
|
+
- 配色名(黑白/暖砂/靛蓝/苔绿)、各档位文案、状态行都本地化,不是只翻标题
|
|
368
|
+
- 宿主切换界面语言时用 MutationObserver 立刻重渲染
|
|
369
|
+
- 自愈加重试退避(4s → 15s → 1m → 3m → 10m)并封顶:token 真被改名时不再每 4 秒重放
|
|
370
|
+
- `tools/preview-settings.mjs` 支持 `--lang`
|
|
371
|
+
|
|
372
|
+
### 1.3.3
|
|
373
|
+
- 文档拆分:README 只留用法与当前设计(759 → 210 行),版本记录移到 `CHANGELOG.md`,逐组件设计说明移到 `docs/DESIGN.md`
|
|
374
|
+
- 修正 README 里过期的「当前版本 0.8.2」
|
|
375
|
+
|
|
376
|
+
### 1.3.2
|
|
377
|
+
- README 安装说明改为 npm / Release tarball / 源码三条路径,去掉本机绝对路径
|
|
378
|
+
- 新增 `tools/release.mjs`:一键发版(检查 → 发布 → 等 registry → 校验 latest → 可选打 tag)
|
|
379
|
+
|
|
380
|
+
### 1.3.1
|
|
381
|
+
- 自愈:override 层被宿主丢掉时(插件 fiber 重载等)自动重放,设置页显示恢复次数
|
|
382
|
+
- 触发点:visibilitychange / focus / pageshow / theme/change / 4s 定时;健康时零写入
|
|
383
|
+
|
|
384
|
+
### 1.3.0
|
|
385
|
+
- 设置页重排:2×2 缩略图卡片(随明暗切换)+ 段落式设置行 + 分段控件 + 版本徽标
|
|
386
|
+
- 样式从内联改为独立注入的 `settings.css`(支持 hover / 窄屏 / `body[data-ds-dark-theme]`)
|
|
387
|
+
- 新增 `tools/preview-settings.mjs` + `tools/shoot-html.mjs`:不打开 App 也能截设置页
|
|
388
|
+
|
|
389
|
+
### 1.2.0
|
|
390
|
+
- 代码块底色独立成 `--dsh-code-fill`:与画布 ΔE 5.5(浅)/ 11.0(深),原来浅色下同色
|
|
391
|
+
- 行内代码用更浅的 `--dsh-code-inline`;两者都不需要 `!important`
|
|
392
|
+
|
|
393
|
+
### 1.1.0
|
|
394
|
+
- Markdown 标题 / 加粗用「正文色 + 强调色相」染色(标题 12.3、加粗 14.4,均远高于 AA)
|
|
395
|
+
- 「更多选项」加一档 Markdown 强调开关;黑白配色不染
|
|
396
|
+
|
|
397
|
+
### 1.0.0
|
|
398
|
+
- `fromOklch` 加色域钳位(二分收色度),修「通道顶满 255 → 色相被压歪」
|
|
399
|
+
- 浅色侧重标定:近白端 −0.044、`lightC` 上调、暖砂/苔绿色相收敛,套间最弱一对 ΔE 2.15 → 3.07
|
|
400
|
+
- 黑白配色接入引擎:三级 4.67、链接 4.63、主按钮 4.54(原 3.42 / 3.91 / 4.34)
|
|
401
|
+
- 主按钮 `button-primary-fill` 从宿主红色改为强调色(并压到按钮文字 ≥4.5)
|
|
402
|
+
- 设置页改为「配色 / 强度 / 面板表面 / 更多选项」,运行时 token 自检
|
|
403
|
+
|
|
404
|
+
### 0.18.0
|
|
405
|
+
- 主人气泡 `--dsw-specific-bubble` 改由「强调色 11%(深 13%)混画布」派生:暖砂 `#ffede0` → `#f2e5d1`,不再发粉
|
|
406
|
+
- 气泡与画布 ΔE 4.2–7.9、气泡内文字对比 9.99–13.53
|
|
407
|
+
|
|
408
|
+
### 0.17.0
|
|
409
|
+
- 文字着色第二版标定:跟随 3.0/+0.055(ΔE 2.77 → 5.5)、浓一些 4.6/+0.085(ΔE 8.5)
|
|
410
|
+
- 会话条目标题与正文共用 token,一并变深变暖
|
|
411
|
+
|
|
412
|
+
### 0.16.0
|
|
413
|
+
- 注释文字跟随文字着色:`mid` 角色乘 `1+(textScale-1)×2.0`,`midC` 0.006 → 0.010(注释 ΔE 1.76 / 3.61)
|
|
414
|
+
- 深色注释 `label-caption` 改用色阶 500:对比 3.0 → 6.0–6.3
|
|
415
|
+
|
|
416
|
+
### 0.15.0
|
|
417
|
+
- 修:深色模式下选中卡片是白底白字(内联色混错了浅色画布)→ 改由 `--dsh-card-picked` 按模式给值
|
|
418
|
+
- 设置页细项收进「更多选项」,默认折叠,只留配色卡片
|
|
419
|
+
|
|
420
|
+
### 0.14.0
|
|
421
|
+
- 新增 `darkHue`:暖砂深色层色相 88° → 60°(黄 → 橙棕),修掉暗部「发绿 / 橄榄」
|
|
422
|
+
- 深端 neutral(深色滚动条)跟同一夜色相;浅色侧与另两套未变
|
|
423
|
+
|
|
424
|
+
### 0.13.0
|
|
425
|
+
- 深色侧栏改用独立 `darkLift`(0.048 / 0 / −0.042):与画布 ΔE 从 1.9–2.3 提到 4.03–5.05
|
|
426
|
+
- 侧栏内正文对比 12.48–16.40(仍 AAA)
|
|
427
|
+
|
|
428
|
+
### 0.12.0
|
|
429
|
+
- 文字着色重新标定:加 `textLift`(正文抬 0.030 / 0.065),三档 ΔE 从 0.35–1.66 提到 2.77–6.79
|
|
430
|
+
- 左栏会话条目与正文共用 `label-*`,一并生效
|
|
431
|
+
- MIN_MAIN 15.5 → 12(给带色正文留空间,仍 ≥ 1.7 倍 AAA)
|
|
432
|
+
|
|
433
|
+
### 0.11.0
|
|
434
|
+
- 开关 / 复选框 / 单选 / 插件页主按钮改跟强调色(覆盖 `--dsw-alias-brand-primary`,13 处引用一个支点)
|
|
435
|
+
- 设置页现为六行:配色 · 文字着色 · 左侧栏 · 右侧栏 · 滚动条 · 开关勾选
|
|
436
|
+
|
|
437
|
+
### 0.10.0
|
|
438
|
+
- 滚动条三档着色(中性 / 跟随 / 强调),只抬色度不改明度;黑白配色下该行说明会自述无效
|
|
439
|
+
- 设置页现为五行:配色 · 文字着色 · 左侧栏 · 右侧栏 · 滚动条
|
|
440
|
+
|
|
441
|
+
### 0.9.0
|
|
442
|
+
- 右侧栏可单独上色(默认与左栏同色);注入一条命中 `data-rightbar-col` 的 CSS,颜色走 `--dsh-rightbar-fill`
|
|
443
|
+
- 全屏右栏退回画布色
|
|
444
|
+
|
|
445
|
+
### 0.8.2 (强调色改为设计稿标准值)
|
|
446
|
+
- 强调色新增 `accentL`:色阶中段 `500` 的明度定死成设计值,不再乘 `accentScale`
|
|
447
|
+
—— 乘性缩放会把选中态软底 `deepseek-50/100/200` 一起压暗 13%
|
|
448
|
+
- 暖砂 `#a9683e`(h 68→52.4,C 0.105→0.101)、靛蓝 `#3f66a3`(C 0.135→0.107,L 0.589→0.511)、
|
|
449
|
+
苔绿 `#4f7a42`(h 165→139),三档 8-bit 精确复现
|
|
450
|
+
- 链接与基准色**解耦**:`--dsw-alias-link` 从基准色派生(浅 `#915227 / #3c629f / #436d36`,
|
|
451
|
+
深 `#c8a28b / #95acd0 / #9cb695`)—— 基准色当正文只有 3.40–4.41,过不了 AA
|
|
452
|
+
- `tuneRamps` 不再改写 `deepseek-500`(品牌面保持标准值),只兜深色链接 `400`
|
|
453
|
+
- `palette-dev.mjs`:链接列改读 `--dsw-alias-link`;每套新增「品牌基准色 / 链接」一行
|
|
454
|
+
|
|
455
|
+
### 0.8.1 (深色专项审计后)
|
|
456
|
+
- `ROLE` 深色权重拉平(`800/850` 0.6/0.75 → 1.0,`875` 0.85 → 0.95)—— 卡片/模块不再比画布灰 30–45%,三套在深色层上的区分度从 ΔE 1.02 回到 2.05
|
|
457
|
+
- `darkC` 按色相归一化:暖砂 0.016→0.014、靛蓝 0.017→0.028、苔绿不动;三套占可用色域 30/19/24%(原 35/11/24%,暖砂发脏、靛蓝发灰)
|
|
458
|
+
- `darkLift` 三套错开 0.026 / 0.032 / 0.042(原统一 0.034)—— 暖砂↔苔绿 850 层 ΔE 1.15 → 2.05
|
|
459
|
+
- `paperC` 下调 0.014 / 0.009 / 0.0125 —— 靛蓝不再撞 8-bit 天花板(原「浓一些」请求 0.033 实得 0.0241)
|
|
460
|
+
- 深色交互 alpha 0.08/0.14/0.24 → 0.05/0.09/0.14 —— 深色悬停强度从浅色的 1.8–2.1 倍回到 1.2–1.3 倍
|
|
461
|
+
- 侧栏深色放开下沉阻尼 —— 深色导轨边界 ΔE 0.49 → 1.86–2.10,与浅色同档对齐
|
|
462
|
+
- 苔绿强调 `155°→165°` —— 与底色(h≈152)从 2° 拉开到 13°,链接不再只靠明度识别
|
|
463
|
+
- 深色对比度:正文 14.40–14.98、三级 4.79 起、链接 4.65 起(0 处低于下限)
|
|
464
|
+
|
|
465
|
+
### 0.8.0 (- 新增「文字着色」三档(中性 / 跟随 / 浓一些),默认「跟随」;只放大文字色度,不影响对比度)
|
|
466
|
+
- 配色重建缓存按(配色, 文字档)分键;设置页新增第三行控件
|
|
467
|
+
|
|
468
|
+
### 0.7.0 (UI 设计审计后全面修订)
|
|
469
|
+
- 求解靶点从画布改为真实承载面(`60` / `800` / `150`),上限 0.09 → 0.13 —— 修掉 12 处真实的 AA 违规
|
|
470
|
+
- `accentScale` 三套全部 1.0 —— 强调色浅端恢复四档层次
|
|
471
|
+
- 阈值 15.5 / 6.2 / 4.62;三级与次级重新拉开明度
|
|
472
|
+
- 近白端压缩改等量下移 —— 画布↔卡层 ΔL 从 0.0147 回到 0.026
|
|
473
|
+
- 深色:`darkC` 下调、`darkLift` 上调 —— 底色不再读成深咖,卡片不再脱色
|
|
474
|
+
- 暖砂强调 `55°→68°`(离橙棕脏区)、苔绿 `146°→155°`(绿字可读性)、靛蓝 `276°→262°`(回到品牌蓝)
|
|
475
|
+
- 暖砂/苔绿拉开色相与色度 —— 唯一低于 JND 的一对从 ΔE 1.30 提到 2.15
|
|
476
|
+
- 侧栏步进 0.012 → 0.024/0.030,默认档改「更深」,并给「更浅」加穿层护栏
|
|
477
|
+
- `palette-dev.mjs` 改为加载生产引擎
|
|
478
|
+
|
|
479
|
+
## 版本详解
|
|
480
|
+
|
|
481
|
+
### 为什么配色会自己跳回默认(v1.3.1)
|
|
482
|
+
|
|
483
|
+
现象:设了暖砂,用了一阵(跑模型操作、切窗口、长时间放着),**突然变成黑白**,但设置页里
|
|
484
|
+
「暖砂」还是选中的。原因在宿主的 override 生命周期:
|
|
485
|
+
|
|
486
|
+
```js
|
|
487
|
+
// ThemeRuntime(宿主)
|
|
488
|
+
overrideTokens(source, tokens) {
|
|
489
|
+
const layer = { seq: this.overrideSeq++, tokens: validateOverrides(source, tokens) }
|
|
490
|
+
this.overrides.set(source, layer)
|
|
491
|
+
this.publish()
|
|
492
|
+
return () => { if (this.overrides.get(source) !== layer) return; this.overrides.delete(source); this.publish() }
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
而插件侧拿到的是被 runner 包装过的版本 —— **每一层的 disposer 都被挂在调用方的 fiber 上**:
|
|
497
|
+
|
|
498
|
+
```js
|
|
499
|
+
const dispose = Reflect.apply(method, target, [id, tokens])
|
|
500
|
+
ctx.effect(() => dispose, 'cordis-client-runner: dynamic theme override layer')
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
也就是说:**这一层的生命周期 = 插件 fiber 的生命周期**。插件被卸载/重载、或 fiber 的
|
|
504
|
+
effect 被清理时,层就没了;`composeActive` 在 `overrides.size === 0` 时直接返回内置主题,
|
|
505
|
+
于是页面**静默**变回默认色 —— localStorage 里的选择还在,设置页自然还显示暖砂。
|
|
506
|
+
|
|
507
|
+
会触发 fiber 重载的典型情况:动态插件被宿主重载(改过插件文件/profile、宿主自我更新)、
|
|
508
|
+
渲染进程恢复、以及某些"模型操作"引起的插件重载。
|
|
509
|
+
|
|
510
|
+
**v1.3.1 的处理**:加了一个自愈环。窗口重新可见 / 获焦 / `pageshow` / `theme/change` /
|
|
511
|
+
每 4 秒,回读 `body` 上的 5 个关键 token;不在了就把最后一层重放:
|
|
512
|
+
|
|
513
|
+
```
|
|
514
|
+
[dsh-theme-palette] 配色层不见了(visibility),已重放第 1 次
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
设置页顶部会显示"配色层被宿主丢过一次,已自动恢复 N 次";健康时不产生任何写入。
|
|
518
|
+
|
|
519
|
+
**另一种可能**(值得先分辨):如果是 **localStorage 被清**(换 profile、清缓存),设置页会回到
|
|
520
|
+
「黑白」选中态 —— 那种情况自愈救不回来,因为连"你想用哪套"都丢了。判据就是**设置页里选中的
|
|
521
|
+
是不是你原来那套**。
|
|
522
|
+
|
|
523
|
+
### 设置页重排(v1.3.0)
|
|
524
|
+
|
|
525
|
+
原来的设置页是六行"工程参数"堆在一起、每行都是同一种小药丸。v1.3.0 重做成四段:
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
主题色 v1.3.0
|
|
529
|
+
配色与明暗模式独立;切换后立即生效并保存在 localStorage。
|
|
530
|
+
┌────────────┬────────────┐
|
|
531
|
+
│ 缩略图 │ 缩略图 ✓ │ 2×2 卡片:每张是「侧栏 + 画布 + 两行文字 + 强调色」的微缩图
|
|
532
|
+
│ 黑白 无色调 │ 暖砂 米白+棕 │
|
|
533
|
+
└────────────┴────────────┘
|
|
534
|
+
强度 正文与强调的着色程度 [静][标准][浓]
|
|
535
|
+
左侧栏底色 相对会话区的层次 [更浅][同色][更深]
|
|
536
|
+
右侧栏底色 面板底色 [同左栏][跟随画布]
|
|
537
|
+
▸ 更多选项
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
四个变化:
|
|
541
|
+
|
|
542
|
+
1. **卡片有缩略图**,而且**跟随明暗模式**(深色下缩略图自动用深色画布/侧栏/强调色 —— 靠
|
|
543
|
+
`body[data-ds-dark-theme]` 切换两组 CSS 变量,不是靠 JS 猜模式);
|
|
544
|
+
2. **段落式行**:左边标题 + 副标题,右边分段控件,中间一条 0.5px 分隔线;
|
|
545
|
+
3. **分段控件**(segmented)替代散落的药丸,选中项是"抬起"的白色/深色片;
|
|
546
|
+
4. 标题右侧有版本徽标;样式表是**独立注入的一条 CSS**(`data-plugin-css=.../settings.css`),
|
|
547
|
+
不再全是内联样式 —— 于是能写 `:hover`、媒体查询(窄屏单列)和 `body[data-ds-dark-theme]` 作用域。
|
|
548
|
+
|
|
549
|
+
### 怎么"看见"它
|
|
550
|
+
|
|
551
|
+
设置页在 App 里,外部浏览器进不去;但组件树可以脱离 React 渲染成静态 HTML:
|
|
552
|
+
|
|
553
|
+
```bash
|
|
554
|
+
node tools/preview-settings.mjs # → tools/preview-light.html / preview-dark.html
|
|
555
|
+
node tools/shoot-html.mjs --file preview-light.html --out tools/out/settings
|
|
556
|
+
node tools/shoot-html.mjs --file preview-dark.html --out tools/out/settings
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
`preview-settings.mjs` 用生产引擎算 token、用插件真正注入的 `SETTINGS_CSS`,
|
|
560
|
+
再用一个 20 行的树→HTML 渲染器把组件铺开 —— 所以截图就是"设置页长什么样",
|
|
561
|
+
不是另画一版。
|
|
562
|
+
|
|
563
|
+
### 代码块底色(v1.2.0)
|
|
564
|
+
|
|
565
|
+
宿主的代码块底色是 `--dsw-alias-bg-layer-1`,而**浅色模式下 layer-1 就是画布色(都指色阶 00)** ——
|
|
566
|
+
所以代码框和正文底是同一块,只剩一条发丝线。v1.2.0 给它一档独立的"内嵌面板"色:
|
|
567
|
+
|
|
568
|
+
| token | 暖砂 | 与画布 ΔE | 代码文字对比 |
|
|
569
|
+
|---|---|---|---|
|
|
570
|
+
| `--dsh-code-fill`(围栏代码块) | `#eadcc7` / `#3e342d` | **5.52 / 11.05** | 5.75 / 8.04 |
|
|
571
|
+
| `--dsh-code-inline`(行内 `code`) | 更浅一档(色阶 50 打底) | ~5.9 | — |
|
|
572
|
+
|
|
573
|
+
规则同样注入到 `<head>`:
|
|
574
|
+
|
|
575
|
+
```css
|
|
576
|
+
[class*="_markdown_"] .md-code-block{background:var(--dsh-code-fill,inherit)}
|
|
577
|
+
[class*="_markdown_"] :not(pre) > code{background:var(--dsh-code-inline,inherit)}
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
`.md-code-block` 是宿主自己的类(不是 CSS Modules 哈希),特异性 0,2,0 高于宿主的 `.block`(0,1,0),
|
|
581
|
+
**不需要 `!important`**。`:not(pre) > code` 把围栏块里的 `code` 排除掉,只染行内代码。
|
|
582
|
+
|
|
583
|
+
### Markdown 标题与加粗(v1.1.0)
|
|
584
|
+
|
|
585
|
+
宿主的 Markdown 里,标题和正文**同色**(都继承 `label-primary`),只靠字号/字重区分。
|
|
586
|
+
v1.1.0 起把「标题」和「加粗」各染一档配色:
|
|
587
|
+
|
|
588
|
+
| token | 暖砂 | 对比度(画布 / 卡层) |
|
|
589
|
+
|---|---|---|
|
|
590
|
+
| `--dsh-md-heading` | `#42250b`(浅)/ `#fed9bd`(深) | 12.3 / 11.3 |
|
|
591
|
+
| `--dsh-md-strong` | `#2f1b08` / `#ffe2cc` | 14.4 |
|
|
592
|
+
|
|
593
|
+
**加粗只加色度、不动明度** —— 一开始用"混到强调色",结果加粗比正文更亮(浅色下反而更弱);
|
|
594
|
+
改成只叠加色相后,加粗与正文同深、只是"更有色"。标题则再往中间推一点明度
|
|
595
|
+
(浅色提亮 0.065 / 深色压暗 0.030),配合更大的字号拉开层级。
|
|
596
|
+
|
|
597
|
+
规则注入到 `<head>`,用 CSS Modules 的局部名做钩子(`[class*="_markdown_"]`,比整串哈希耐版本):
|
|
598
|
+
|
|
599
|
+
```css
|
|
600
|
+
[class*="_markdown_"] :where(h1,h2,h3,h4,h5,h6){color:var(--dsh-md-heading,inherit)}
|
|
601
|
+
[class*="_markdown_"] strong{color:var(--dsh-md-strong,inherit)}
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
「更多选项 → Markdown 强调 > 同正文」可以关掉(token 置 `inherit`,回到宿主原样)。
|
|
605
|
+
黑白配色不染(它没有色相可跟)。
|
|
606
|
+
|
|
607
|
+
### 主人气泡(v0.18.0)
|
|
608
|
+
|
|
609
|
+
用户消息的底色是 `--dsw-specific-bubble`,宿主指向 `deepseek-50` —— 也就是「品牌色的极浅底」。
|
|
610
|
+
我的强调色色度比宿主的品牌蓝高得多,浅端直接算出 **`#ffede0`(R 顶满 255)**,在暖砂下看着发粉发红。
|
|
611
|
+
|
|
612
|
+
v0.18.0 改成「强调色按比例混进画布」,气泡是**有色味的浅底**而不是一块彩色:
|
|
613
|
+
|
|
614
|
+
| | 气泡 | 与画布 ΔE | 文字对比 |
|
|
615
|
+
|---|---|---|---|
|
|
616
|
+
| 暖砂 | `#f2e5d1`(浅)/ `#362c24`(深) | 4.2 / 7.9 | 13.53 / 11.89 |
|
|
617
|
+
| 靛蓝 | `#dce5f5` / `#272f40` | 4.9 / 7.8 | 13.29 / 11.62 |
|
|
618
|
+
| 苔绿 | `#dde9dd` / `#2b342b` | 4.6 / 7.5 | 13.39 / 11.37 |
|
|
619
|
+
|
|
620
|
+
混合比例:浅色 11%、深色 13%(`mix(强调色, 画布)`)。ΔE 4–8 足以让气泡读成一块面,
|
|
621
|
+
又不会盖过正文。
|
|
622
|
+
|
|
623
|
+
### 文字着色第二版标定(v0.17.0)
|
|
624
|
+
|
|
625
|
+
v0.12 把三档从“不可见”提到“可感知”,但**默认档 ΔE 只有 2.77** —— 在 14px 的会话标题上仍然读作黑字。
|
|
626
|
+
v0.17.0 再标定一次,让默认档真正看得出配色:
|
|
627
|
+
|
|
628
|
+
| 档位 | scale / lift | 暖砂标题 | ΔE | 正文对比 |
|
|
629
|
+
|---|---|---|---|---|
|
|
630
|
+
| 中性 | 1 / 0 | `#12110f` | 0 | 17.2 |
|
|
631
|
+
| **跟随(默认)** | 3.0 / +0.055 | **`#201d17`** | **5.5** | 15.3 |
|
|
632
|
+
| 浓一些 | 4.6 / +0.085 | `#28241a` | 8.5 | 14.1 |
|
|
633
|
+
|
|
634
|
+
靛蓝跟随是 `#1b1d23`(ΔE 5.4)、苔绿 `#191f1b`(ΔE 5.6)。
|
|
635
|
+
深色正文同步加深:暖砂 `#f3efe5` → `#f9efd6` → `#feeeca`(ΔE 2.1 / 3.6)。
|
|
636
|
+
|
|
637
|
+
会话条目标题与正文共用 `label-primary`,所以左栏列表跟着一起变 —— 侧栏内对比 14.41(跟随)/ 13.27(浓一些),
|
|
638
|
+
仍远高于 AAA 的 7。**如果想要纯黑**,切「中性」即可。
|
|
639
|
+
|
|
640
|
+
### 注释 / 说明文字(v0.16.0)
|
|
641
|
+
|
|
642
|
+
DSH 里“注释类”文字走的是 `--dsw-alias-label-caption`:宿主浅色指色阶 **400**、深色指 **600**。
|
|
643
|
+
它落在 `mid` 角色上,原来只给 0.006 的色度 —— 等于灰字。v0.16.0 两件事:
|
|
644
|
+
|
|
645
|
+
**① 跟着「文字着色」走(部分强度)**。`mid` 角色(注释 400/600、三级、`label-dimmed` 200)
|
|
646
|
+
乘 `1 + (textScale-1) × 2.0`,并且 `midC` 从 0.006 提到 0.010:
|
|
647
|
+
|
|
648
|
+
| 档位 | 暖砂注释 | ΔE | 靛蓝 / 苔绿注释 |
|
|
649
|
+
|---|---|---|---|
|
|
650
|
+
| 中性 | `#b3b1ad` | 0 | `#afb1b6` / `#aeb3af` |
|
|
651
|
+
| 跟随 | `#b8b1a1` | 1.76 | `#abb2c1` / `#a7b6aa` |
|
|
652
|
+
| 浓一些 | `#bdb194` | 3.61 | `#a5b2cd` / `#9ebaa5` |
|
|
653
|
+
|
|
654
|
+
注释刻意比正文弱一档(正文 跟随 ≈2.8、浓一些 ≈6.4),否则整页都会“彩色化”。
|
|
655
|
+
|
|
656
|
+
**② 修掉深色注释的对比度**。宿主深色注释用 600,而这个步为了「浅色三级文字达标」被求解压暗过,
|
|
657
|
+
在深底上只剩 **3.0:1**。深色这一侧改用 500 → **6.0–6.3:1**;浅色保持宿主原值
|
|
658
|
+
(宿主自己的浅色注释就是 1.95,那是它的低对比设计,要提亮我可以换 500)。
|
|
659
|
+
|
|
660
|
+
### 设置页的两条约定(v0.15.0)
|
|
661
|
+
|
|
662
|
+
**① 选中卡片用 token,不用内联色。** 之前选中项的淡底是「强调色 8% 混**浅色**画布」写成内联样式的,
|
|
663
|
+
深色模式下就变成一张近白卡片,而卡片文字是 `label-primary`(深色下近白)—— 白底白字。
|
|
664
|
+
现在由 token 层给 `--dsh-card-picked` 一对值:
|
|
665
|
+
|
|
666
|
+
| | 选中底色 | 卡片文字对比 |
|
|
667
|
+
|---|---|---|
|
|
668
|
+
| 暖砂 浅 / 深 | `#f3e6d3` / `#3b3028` | 14.55 / 11.17 |
|
|
669
|
+
| 靛蓝 浅 / 深 | `#dde7f6` / `#2a3345` | 14.25 / 11.00 |
|
|
670
|
+
| 苔绿 浅 / 深 | `#deebdf` / `#2f392f` | 14.42 / 10.55 |
|
|
671
|
+
|
|
672
|
+
**② 细项默认折叠。** 配色卡片下面是「▸ 更多选项」;文字着色 / 左侧栏 / 右侧栏 / 滚动条 /
|
|
673
|
+
开关勾选这五行只在展开后出现。所有档位都保留,默认值就是我推荐的那套,不展开也能正常用。
|
|
674
|
+
|
|
675
|
+
### 1.0.0:按设计审计重做的四件事
|
|
676
|
+
|
|
677
|
+
**① 色域安全钳位。** `fromOklch` 现在先判断是否超出 sRGB(线性通道必须落在 [0,1]),
|
|
678
|
+
超了就二分收色度,而不是把通道硬钳到 0/255。此前「暖砂气泡算出 `#ffede0`、R 恒为 255」
|
|
679
|
+
就是这个缺口的症状 —— 颜色会被压成另一个色相。
|
|
680
|
+
|
|
681
|
+
> 顺带更正审计里的一个数字:我第一次测「占色域 %」只判断了负通道(漏了超 1 的情况),
|
|
682
|
+
> 所以报成 3–12%。真实值是 暖砂 62% / 靛蓝 **99%** / 苔绿 26% —— 靛蓝不是"没上色",
|
|
683
|
+
> 而是**顶到高明度的蓝色上限还超了一点**(14.8‰ 请求 vs 14.1‰ 上限)。
|
|
684
|
+
|
|
685
|
+
**② 浅色侧重标定。** 近白端整段下移 0.044(画布 0.968 → 0.955),高明度处色域上限因此抬高
|
|
686
|
+
(蓝色在 L 0.97 只有 14‰、L 0.95 有 24‰);`lightC` 上调到 0.030 / 0.020 / 0.016;
|
|
687
|
+
暖砂浅底色相 88→84、强调 52→60(收敛到 ±20° 内);苔绿 152→162 与暖砂拉开。
|
|
688
|
+
|
|
689
|
+
套间区分度(浅画布 ΔE):暖砂↔苔绿 **2.15 → 3.07**、暖砂↔靛蓝 3.84 → 5.04、靛蓝↔苔绿 2.28 → 2.85。
|
|
690
|
+
|
|
691
|
+
**③ 黑白配色也过引擎。** 它色度全 0(保持宿主原貌),但走 `tuneRamps` 求解:
|
|
692
|
+
三级文字 3.42 → **4.67**、链接 3.91 → **4.63**(都到 AA 了),主按钮顺带压暗到 4.54。
|
|
693
|
+
|
|
694
|
+
**④ 信息架构从 6 行参数改成 3 段。**
|
|
695
|
+
配色卡片 → **强度**(静 / 标准 / 浓)→ **面板表面**(侧栏三档 + 右栏两档)→ **▸ 更多选项**(滚动条、控件)。
|
|
696
|
+
「文字着色」改名为「强度」并升为主控件;旧的「跟随 / 浓一些」是相对量,现在是一档风格。
|
|
697
|
+
|
|
698
|
+
**⑤ 运行时自检。** 应用后回读 `body` 上的 5 个关键 token,写不进去就在设置页显示
|
|
699
|
+
「⚠ 部分 token 未生效」并在控制台告警 —— 宿主改 token 名时不再静默失效。
|