dsh-theme-palette 1.9.9 → 1.10.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/CHANGELOG.md +23 -0
- package/README-es.md +5 -5
- package/README-hi.md +5 -5
- package/README-pt.md +5 -5
- package/README-zh.md +5 -5
- package/README.md +5 -5
- package/client.js +3749 -3620
- package/docs/DESIGN.md +108 -22
- package/package.json +115 -114
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,29 @@
|
|
|
4
4
|
|
|
5
5
|
## 版本一览
|
|
6
6
|
|
|
7
|
+
### 1.10.0
|
|
8
|
+
按审计报告的改进清单做了六件事:色彩数学单测、高对比跟随系统、运行时覆盖报告、色觉缺陷守门、单色派生,另外把 display-P3 的可行性量清楚后决定**本期不做**。其中「色觉缺陷守门」第一次跑就抓到一处真问题(浅色链接在模拟下低于 AA),下限因此微调。
|
|
9
|
+
|
|
10
|
+
- **色彩数学单测**(新增 `tools/check-colormath.mjs`,约 40 条断言,并入 `npm run check` 与发版回归清单):锚点(OKLab 里的白 / 黑 / 中灰)、OKLCH↔hex 往返、色域裁切「保明度保色相」、WCAG 样例值(`#777` on `#fff` = 4.48、黑白 21)、`flatten()` 的 α 合成交换性、`harmonize()` 的三条不变量(保 L、色度按比例、色相朝目标按 `pull` 走)。以前这些函数只靠「界面上看着对」,现在挪一个常数就会红。
|
|
11
|
+
写单测时踩了一次:`harmonize` 的色相断言最初写成「移动量 = pull」,实际是「按剩下的角度比例移动」(`dh1 ≈ pull × dh0`)—— 是断言错了,不是代码错。
|
|
12
|
+
- **高对比档新增「跟随系统」并设为默认**:系统开「提高对比度」(`prefers-contrast: more`)就自动用高对比档,关掉回标准档;监听 `change` 事件即时重算。手动选过「关 / 开」的用户读回自己的选择,升级不会被改成别的档位。
|
|
13
|
+
- **色觉缺陷守门**(`tools/check-audit.mjs` 第 20 组):四套配色 × 明暗 × 正文/次级/三级/链接 × 三个承载面 × deutan / protan / tritan(Machado 2009),断言最低对比度 ≥ 4.5。**这条断言一开始没过**:三级与链接的浅色下限原本压在 4.62(刚过 AA),模拟把比值推动 5–9% 后链接跌到 **4.22–4.34**。修法是把浅色下限抬到三级 **4.85**、链接 **4.95**,抬完三种模拟下最低 **4.61**。代价:浅色链接与三级文字比 1.9.x 略深一档。
|
|
14
|
+
- **自定义配色新增「由主色派生」**:只给一个主色,按它的色相与色度推出纸面与墨色(明度按当前明暗模式取引擎已验证的区间),派生结果直接过全部下限(实测正文 14.6–15.0 / 次级 6.8 / 三级 5.3 / 链接 5.4)。主色无彩时派生中性纸面。**它是一次性的填写动作,不是一种模式**:写进去的就是普通的三色,之后照常手改、导出分享码也只带这三个值;但正因为它会填这两格,面板里加了一行可见说明 ——「会覆盖你手动设置的底色与文字,派生之后仍可逐项手改」(四语种,`tools/check-custom.mjs` 断言这句必须是可见文本,不能只挂在 tooltip 上)。
|
|
15
|
+
- **自定义配色新增色觉提示**:把三个色按 deutan / protan / tritan 模拟后,若强调色与文字或底色的 ΔE 塌到 **12** 以下(典型是红 / 绿搭配),面板里给一行说明 —— 只提示,不阻止保存,也不改用户的颜色。
|
|
16
|
+
- **诊断导出新增运行时覆盖报告** `coverage`:枚举宿主样式表里所有 `--dsw-*`,分成「本插件接管 / var 引用 / 字面彩色 / 字面灰」四类,回答「宿主还有多少 token 没跟上配色」。只读、拿不到样式表就返回 `ok: false`。
|
|
17
|
+
- **display-P3:量完决定不做**。同一 L/h 下 P3 比 sRGB 能多给的色度:纸面层(00/60)只多 ΔC 0.0008–0.0053(ΔE 0.08–0.53,JND 以下,看不出来);能看出差别的是强调色(indigo ΔE 5.29、moss 2.96)。但强调色同时是链接 / info 填充 / 勾选支点的来源,按 P3 抬色度就要为 sRGB 回退再标定一套。数据与取舍写在 `docs/DESIGN.md`,将来若做,只值得给强调色加一层 `color(display-p3 …)`。
|
|
18
|
+
- 复核:`npm run check` 全绿(含新增单测与第 20 组);`palette-dev.mjs` 两档 exit 0,1080 组配置「未达标 0 / 低于 AA 4.5 = 0 / 硬失败 0」。
|
|
19
|
+
|
|
20
|
+
### 1.9.10
|
|
21
|
+
撤除「右侧栏底色」这一档,并把它的技术债一起清干净(用户拍板)。**这不是修 bug,是承认做不到**:宿主右栏没有可染的落点,留着这个开关只会一直看起来像坏的。
|
|
22
|
+
|
|
23
|
+
- **两条路都走不通**。只染网格列(`data-rightbar-col`,0.9.0 起的做法):宿主真正的右栏面板是 `position:absolute; right:0; top:0; bottom:0` 的**整高透明覆盖层**,它盖在列上、自己不上底色(透明才露出主栏画布)—— 染列几乎看不出差别,这就是用户说的「设了像没设」。连面板本体一起染(本版第一版试过):那个覆盖层的覆盖范围大于右栏列宽,一上色**直接盖住主栏一大块**,右栏开关按钮也被压在它下面(用户实测「按钮根本看不到,主栏被遮盖了一半」)。给那条 1px 分隔线上色也不成立 —— 用户明确不要对右栏做任何设置,该尝试已回退。
|
|
24
|
+
- **整条链路一并删除,不留半截**:设置页那一行、`TEXT` 里 4 个语种的文案(`rightbarTitle/rightbarSub/rightbarSame/rightbar`)、`rightbarMode` 状态与 `getRightbarMode` / `setRightbarMode` / `subscribeRightbar` / `emitRightbar` / `rightbarListeners`、`readRightbarStored` / `writeRightbarStored` 与那个 `localStorage` 键、分享码的 `r` 字段(encode + decode)、`DEFAULT_RIGHTBAR`、`RIGHTBAR_MODES` 表、四条右栏染色规则、`--dshtp-rightbar-fill` / `--dshtp-canvas-fill` / `--dshtp-rightbar-divider` 三个 token、`buildTokens` 的第九个参数、`unknown xxx id` 告警里的 rightbar 项、palette-dev 的右栏循环(扫描从 2160 组降到 **1080 组**)、dev 钩子导出的 `RIGHTBAR_MODES` / `setRightbarMode`、`tools/check-host-contract.mjs` 里针对 `data-rightbar-col` / `data-sidebar-right-panel` 的契约断言。改名留下的壳:`RIGHTBAR_CSS` → `MARKDOWN_CSS`(这张表从 1.9.10 起只装 Markdown 与代码块样式)。
|
|
25
|
+
- **唯一保留的是兼容读取**:旧分享码里的 `r` 字段、旧 `localStorage` 里那个键,读到只是忽略、不报错(`decodeConfig` 不认识它就跳过)。`tools/check-audit.mjs` 第 18 组改成反向断言:样式表不碰右栏任何元素、不产出右栏 token、**旧码仍可解析且不复活该字段**、新码不再带 `r`。
|
|
26
|
+
- **高对比边框不再比浅色侧还硬**(同版本内的调整)。深色有四层面(`950` 侧栏 / `875` / `850` / `800` 模块面),对比度在暗面上单调 —— 面越暗读数越高,所以 1.9.9 按最亮的 `800` 定标后,同一根线在 `950` 上是 **5.3 / 6.1 / 7.1:1**,用户实测反馈「一开高对比边框全变了、扎眼」。改为对中间两层 `875` / `850` 定标、目标抬到 **3.2 / 3.6 / 4.1**:`950` 落到 **3.81 / 4.27 / 4.88**,`800` 从 3.0 降到 2.2–2.8(仍看得见分界,但不再满足 1.4.11 的 3:1 —— 取舍是「用户盯着看的是侧栏与画布,不是模块面」)。浅色侧不动。`tools/check-audit.mjs` 新增第 19 组钉住这条(浅色对 00/60、深色对 875/850、`950 ≤ 5.0`、`800 ≥ 2.0`,以及「标准档必须是墨色 alpha、`l1` 两档都不变」)。
|
|
27
|
+
- 「左侧栏底色」三档不受影响:它有自己的宿主 token(`--dsw-specific-sidebar-fill`),一直可靠。
|
|
28
|
+
- 复核:`npm run check` 全绿(结构 / 契约 / 自愈 / 审计 19 组);`palette-dev.mjs` 两档均 exit 0,1080 组配置 × 承诺面「低于 AA 4.5 = 0、硬失败 = 0」。
|
|
29
|
+
|
|
7
30
|
### 1.9.9
|
|
8
31
|
按一次独立审计(`_audit-theme-palette-20261025/`,针对 1.9.8,11 条问题)逐条核实后修订。**核实结论是:8 条成立并已修;3.5 成立但属于权衡(只补控件边界档,不把全部边框提到 3:1);1 条不成立(报告本身的口径错,已更正)。另有两项在三套预置的「对齐契约」上做了让步(浅画布分离、链接 Lc 门),由用户拍板后修改。**
|
|
9
32
|
|
package/README-es.md
CHANGED
|
@@ -29,9 +29,9 @@ El plugin solo apila tokens de color mediante `ctx.theme.overrideTokens`; no reg
|
|
|
29
29
|
- **4 paletas** — Mono, Arena cálida, Índigo, Musgo — cada una adaptada de forma independiente a claro y oscuro;
|
|
30
30
|
- la escala se **recalcula** completa: reconstrucción OKLCH → croma por rol → **ajuste al gamut sRGB** → contraste resuelto sobre superficies reales;
|
|
31
31
|
- más de 27.000 referencias de token: texto, secundario, terciario, notas, enlaces, barras laterales, tarjetas, burbuja del usuario, botón primario, barras de desplazamiento, interruptores, títulos/negritas de Markdown, bloques de código;
|
|
32
|
-
- ajustable: intensidad del texto (3), profundidad de la barra lateral (3),
|
|
32
|
+
- ajustable: intensidad del texto (3), profundidad de la barra lateral (3), énfasis de Markdown, barras de desplazamiento, color de interruptores;
|
|
33
33
|
- **autorreparable**: si el host descarta la capa de override, la paleta se vuelve a aplicar;
|
|
34
|
-
- **promesas de contraste**: el cuerpo tiene la promesa de 12:1 en claro y 10:1 en oscuro (15:1 en alto contraste), el secundario ≥ 6.2 en claro y 8.0 en oscuro, y el terciario y los enlaces ≥ 4.
|
|
34
|
+
- **promesas de contraste**: el cuerpo tiene la promesa de 12:1 en claro y 10:1 en oscuro (15:1 en alto contraste), el secundario ≥ 6.2 en claro y 8.0 en oscuro, y el terciario ≥ 4.85 y los enlaces ≥ 4.95 en claro, y 6.4 en oscuro (los mínimos claros llevan un margen para déficits de visión cromática; los enlaces además pasan una puerta APCA Lc ≥ 60 en oscuro / 75 en HC), medidos sobre las superficies donde el texto realmente cae (el lado oscuro necesita más: un cociente WCAG sobreestima la legibilidad sobre fondo oscuro);
|
|
35
35
|
- las superficies prometidas son 00/60 en claro y 950/875 en oscuro; las oscuras 800 (superficie de módulo) y 850 (sub-superficie) **no** respaldan el texto del cuerpo: el informe las cuenta aparte como «fuera de política» (ni cuentan como aprobado ni como fallo);
|
|
36
36
|
- interfaz en 简体中文 / 繁體中文 / English / 日本語 (sigue el idioma del host y se puede fijar).
|
|
37
37
|
|
|
@@ -54,7 +54,7 @@ Después **reinicia la interfaz**: un proceso en marcha conserva el módulo anti
|
|
|
54
54
|
|---|---|
|
|
55
55
|
| Paleta | Mono · Arena cálida · Índigo · Musgo (las miniaturas siguen claro/oscuro) |
|
|
56
56
|
| Intensidad | Suave / Estándar / Fuerte — cuánto sigue el texto a la paleta |
|
|
57
|
-
| Superficies | Barra lateral (Más clara / Igual / Más oscura)
|
|
57
|
+
| Superficies | Barra lateral (Más clara / Igual / Más oscura). El panel derecho nunca se tiñe: es una capa transparente de altura completa, teñirlo taparía la conversación (ajuste retirado en 1.9.10) |
|
|
58
58
|
| Más opciones | Idioma, énfasis de Markdown, barras de desplazamiento, interruptores |
|
|
59
59
|
|
|
60
60
|
Cada elección se aplica al instante y se guarda en `localStorage`. Claro/oscuro sigue en el control «Apariencia» del host.
|
|
@@ -69,7 +69,7 @@ OKLCH(L, C, tono) ──► ajuste al gamut (búsqueda binaria en C) ──► h
|
|
|
69
69
|
|
|
70
70
|
- los alias semánticos mantienen cadenas `var(--dsw-static-neutral-bluish-NN)`, así que todo lo que sigue a un token sigue a la paleta;
|
|
71
71
|
- superficies claras usan los pasos 00–300, las oscuras 800–950;
|
|
72
|
-
- los mínimos de texto se exigen en tiempo de construcción: cuerpo ≥ 12:1 en claro y ≥ 10:1 en oscuro (alto contraste: 15:1), secundario ≥ 6.2 claro / 8.0 oscuro (HC 9 / 9.6), terciario/enlace ≥ 4.
|
|
72
|
+
- los mínimos de texto se exigen en tiempo de construcción: cuerpo ≥ 12:1 en claro y ≥ 10:1 en oscuro (alto contraste: 15:1), secundario ≥ 6.2 claro / 8.0 oscuro (HC 9 / 9.6), terciario/enlace ≥ 4.85 / 4.95 claro / 6.4 oscuro (HC 7 / 7.6), enlace con APCA Lc ≥ 60 oscuro (HC 75), texto en barra lateral ≥ 7, texto en burbuja ≥ 7;
|
|
73
73
|
- las superficies prometidas son 00/60 en claro y 950/875 en oscuro; las oscuras 800 (superficie de módulo) y 850 (sub-superficie) **no** respaldan el texto del cuerpo: el informe las cuenta aparte como «fuera de política» (ni cuentan como aprobado ni como fallo), y toda superficie sigue teniendo que superar el suelo AA de 4.5;
|
|
74
74
|
- el informe separa tres cosas: el objetivo declarado, el techo físico (lo que el blanco o el negro alcanzan en esa superficie) y la exención de política; 0.93 es solo margen del solucionador, para decidir si un objetivo queda por encima del techo;
|
|
75
75
|
- `node palette-dev.mjs` comprueba 2160 combinaciones (5 paletas × 216 ajustes × los dos niveles de contraste).
|
|
@@ -111,7 +111,7 @@ dshs1.eyJ2IjoxLCJwIjoiY3VzdG9tIiwicyI6ImRlZXAiLCJ0IjoidGludGVkIiwiciI6InNpZGViYX
|
|
|
111
111
|
|
|
112
112
|
Este ejemplo real decodifica a:
|
|
113
113
|
|
|
114
|
-
- paleta: custom · barra lateral: deep · texto: tinted
|
|
114
|
+
- paleta: custom · barra lateral: deep · texto: tinted
|
|
115
115
|
- scrollbar: tinted · controles: accent · Markdown: on · alto contraste: off · idioma: zh-CN
|
|
116
116
|
- tres colores: `#f5efe6` (fondo) · `#1d1a17` (texto) · `#3f66a3` (acento)
|
|
117
117
|
|
package/README-hi.md
CHANGED
|
@@ -29,9 +29,9 @@ DeepSeek Harness (वेब और डेस्कटॉप) के लिए
|
|
|
29
29
|
- **4 पैलेट** — मोनो, वार्म सैंड, इंडिगो, मॉस — हर एक लाइट और डार्क दोनों के लिए अलग से अनुकूलित;
|
|
30
30
|
- पूरी रैंप **दोबारा गणना** होती है, बदली नहीं जाती: OKLCH पुनर्निर्माण → भूमिका-आधारित क्रोमा → **sRGB गैमट क्लैंप** → वास्तविक सतहों पर कंट्रास्ट हल;
|
|
31
31
|
- 27,000+ टोकन संदर्भ शामिल: मुख्य टेक्स्ट, द्वितीयक, तृतीयक, कैप्शन, लिंक, साइडबार, कार्ड, उपयोगकर्ता बबल, प्राइमरी बटन, स्क्रॉलबार, स्विच, Markdown शीर्षक/बोल्ड, कोड ब्लॉक;
|
|
32
|
-
- समायोज्य: टेक्स्ट की तीव्रता (3), साइडबार की गहराई (3),
|
|
32
|
+
- समायोज्य: टेक्स्ट की तीव्रता (3), साइडबार की गहराई (3), Markdown ज़ोर, स्क्रॉलबार, स्विच का रंग;
|
|
33
33
|
- **स्व-उपचार**: यदि होस्ट ओवरराइड परत हटा दे, पैलेट फिर से लगा दी जाती है;
|
|
34
|
-
- **कंट्रास्ट के वादे**: मुख्य टेक्स्ट के लिए लाइट में 12:1 और डार्क में 10:1 (उच्च-कंट्रास्ट में 15:1), द्वितीयक ≥ 6.2 (लाइट) / 8.0 (डार्क), तृतीयक और लिंक ≥ 4.
|
|
34
|
+
- **कंट्रास्ट के वादे**: मुख्य टेक्स्ट के लिए लाइट में 12:1 और डार्क में 10:1 (उच्च-कंट्रास्ट में 15:1), द्वितीयक ≥ 6.2 (लाइट) / 8.0 (डार्क), तृतीयक ≥ 4.85 और लिंक ≥ 4.95 (लाइट) / 6.4 (डार्क) — लाइट की सीमाओं में रंग-दृष्टि दोष के लिए गुंजाइश रखी गई है; लिंक अतिरिक्त APCA Lc ≥ 60 (डार्क) / 75 (HC) — उन्हीं सतहों पर मापे गए जहाँ टेक्स्ट वास्तव में बैठता है (डार्क में ज़्यादा चाहिए: गहरे बैकग्राउंड पर WCAG अनुपात पढ़ने की सुविधा को बढ़ा-चढ़ा कर दिखाता है);
|
|
35
35
|
- वादे की गई सतहें लाइट में 00/60 और डार्क में 950/875 हैं; डार्क 800 (मॉड्यूल सतह) और 850 (उप-सतह) मुख्य टेक्स्ट को नहीं सहनाते — रिपोर्ट उन्हें अलग «नीति से बाहर» के रूप में गिनती है (न तो पास, न ही फेल);
|
|
36
36
|
- इंटरफ़ेस 简体中文 / 繁體中文 / English / 日本語 में (होस्ट की भाषा का पालन करता है, हाथ से भी चुना जा सकता है)।
|
|
37
37
|
|
|
@@ -54,7 +54,7 @@ GitHub रिलीज़ के tarball से: [releases पेज](https://gi
|
|
|
54
54
|
|---|---|
|
|
55
55
|
| पैलेट | मोनो · वार्म सैंड · इंडिगो · मॉस (थंबनेल लाइट/डार्क का पालन करते हैं) |
|
|
56
56
|
| तीव्रता | शांत / मानक / गहरा — टेक्स्ट पैलेट का कितना पालन करे |
|
|
57
|
-
| सतहें | साइडबार (हल्का / समान / गहरा)
|
|
57
|
+
| सतहें | साइडबार (हल्का / समान / गहरा)। दायाँ पैनल कभी रंगा नहीं जाता: वह पूरी ऊँचाई की पारदर्शी परत है, रंगने पर बातचीत ढक जाएगी (1.9.10 में यह सेटिंग हटा दी गई) |
|
|
58
58
|
| और विकल्प | भाषा, Markdown ज़ोर, स्क्रॉलबार, स्विच/चेक |
|
|
59
59
|
|
|
60
60
|
हर चुनाव तुरंत लागू होता है और `localStorage` में सहेजा जाता है। लाइट/डार्क होस्ट की «अपीयरेंस» सेटिंग में ही रहता है।
|
|
@@ -69,7 +69,7 @@ OKLCH(L, C, ह्यू) ──► गैमट क्लैंप (C पर
|
|
|
69
69
|
|
|
70
70
|
- सेमांटिक एलियस `var(--dsw-static-neutral-bluish-NN)` श्रृंखलाएँ बनाए रखते हैं, इसलिए जो भी टोकन का पालन करता है वह पैलेट का भी करता है;
|
|
71
71
|
- लाइट सतहें स्टेप 00–300, डार्क सतहें 800–950;
|
|
72
|
-
- टेक्स्ट की न्यूनतम सीमा बनाते समय लागू: मुख्य लाइट में ≥ 12:1 और डार्क में ≥ 10:1 (उच्च-कंट्रास्ट: 15:1), द्वितीयक ≥ 6.2 लाइट / 8.0 डार्क (HC 9 / 9.6), तृतीयक/लिंक ≥ 4.
|
|
72
|
+
- टेक्स्ट की न्यूनतम सीमा बनाते समय लागू: मुख्य लाइट में ≥ 12:1 और डार्क में ≥ 10:1 (उच्च-कंट्रास्ट: 15:1), द्वितीयक ≥ 6.2 लाइट / 8.0 डार्क (HC 9 / 9.6), तृतीयक/लिंक ≥ 4.85 / 4.95 लाइट / 6.4 डार्क (HC 7 / 7.6), लिंक APCA Lc ≥ 60 डार्क (HC 75), साइडबार में ≥ 7, बबल में ≥ 7;
|
|
73
73
|
- वादे की गई सतहें लाइट में 00/60 और डार्क में 950/875 हैं; डार्क 800 (मॉड्यूल सतह) और 850 (उप-सतह) मुख्य टेक्स्ट को नहीं सहनाते — रिपोर्ट उन्हें अलग «नीति से बाहर» के रूप में गिनती है (न तो पास, न ही फेल), और हर सतह को AA की न्यूनतम सीमा 4.5 से गुज़रना ही होता है;
|
|
74
74
|
- रिपोर्ट तीन बातें अलग रखती है: घोषित लक्ष्य, भौतिक सीमा (उस सतह पर सफ़ेद या काला कितना हासिल कर सकता है) और नीति छूट; 0.93 केवल सॉल्वर का मार्जिन है, इससे तय होता है कि लक्ष्य सीमा से ऊपर है या नहीं;
|
|
75
75
|
- `node palette-dev.mjs` 2160 संयोजन जाँचता है (5 पैलेट × 216 सेटिंग × दोनों कंट्रास्ट स्तर)।
|
|
@@ -111,7 +111,7 @@ dshs1.eyJ2IjoxLCJwIjoiY3VzdG9tIiwicyI6ImRlZXAiLCJ0IjoidGludGVkIiwiciI6InNpZGViYX
|
|
|
111
111
|
|
|
112
112
|
यह वास्तविक उदाहरण इसमें डिकोड होता है:
|
|
113
113
|
|
|
114
|
-
- पैलेट: custom · साइडबार: deep · टेक्स्ट: tinted
|
|
114
|
+
- पैलेट: custom · साइडबार: deep · टेक्स्ट: tinted
|
|
115
115
|
- स्क्रॉलबार: tinted · नियंत्रण: accent · Markdown: on · उच्च-कंट्रास्ट: off · भाषा: zh-CN
|
|
116
116
|
- तीन रंग: `#f5efe6` (फ़ॉन्ड) · `#1d1a17` (टेक्स्ट) · `#3f66a3` (एक्सेंट)
|
|
117
117
|
|
package/README-pt.md
CHANGED
|
@@ -29,9 +29,9 @@ O plugin apenas empilha tokens de cor via `ctx.theme.overrideTokens`; não regis
|
|
|
29
29
|
- **4 paletas** — Mono, Areia quente, Índigo, Musgo — cada uma adaptada de forma independente ao claro e ao escuro;
|
|
30
30
|
- a escala é **recalculada** por completo: reconstrução OKLCH → croma por papel → **limite de gamut sRGB** → contraste resolvido sobre superfícies reais;
|
|
31
31
|
- mais de 27.000 referências de token: texto, secundário, terciário, legendas, links, barras laterais, cartões, balão do usuário, botão primário, barras de rolagem, interruptores, títulos/negrito de Markdown, blocos de código;
|
|
32
|
-
- ajustável: intensidade do texto (3), profundidade da barra lateral (3),
|
|
32
|
+
- ajustável: intensidade do texto (3), profundidade da barra lateral (3), ênfase de Markdown, barras de rolagem, cor dos interruptores;
|
|
33
33
|
- **autorrecuperação**: se o host descartar a camada de override, a paleta é reaplicada;
|
|
34
|
-
- **promessas de contraste**: o corpo tem a promessa de 12:1 no claro e 10:1 no escuro (15:1 em alto contraste), o secundário ≥ 6.2 no claro e 8.0 no escuro, e o terciário e os links ≥ 4.
|
|
34
|
+
- **promessas de contraste**: o corpo tem a promessa de 12:1 no claro e 10:1 no escuro (15:1 em alto contraste), o secundário ≥ 6.2 no claro e 8.0 no escuro, e o terciário ≥ 4.85 e os links ≥ 4.95 no claro, e 6.4 no escuro (os pisos do lado claro têm margem para deficiências de visão cromática; os links ainda passam por um portão APCA Lc ≥ 60 no escuro / 75 em HC), medidos nas superfícies onde o texto realmente cai (o lado escuro precisa de mais: uma razão WCAG superestima a legibilidade sobre fundo escuro);
|
|
35
35
|
- as superfícies prometidas são 00/60 no claro e 950/875 no escuro; as escuras 800 (superfície de módulo) e 850 (sub-superfície) **não** sustentam o texto do corpo: o relatório as conta à parte como «fora de política» (nem contam como aprovado nem como falha);
|
|
36
36
|
- interface em 简体中文 / 繁體中文 / English / 日本語 (segue o idioma do host e pode ser fixada).
|
|
37
37
|
|
|
@@ -54,7 +54,7 @@ Depois **reinicie a interface**: um processo em execução mantém o módulo ant
|
|
|
54
54
|
|---|---|
|
|
55
55
|
| Paleta | Mono · Areia quente · Índigo · Musgo (as miniaturas seguem claro/escuro) |
|
|
56
56
|
| Intensidade | Suave / Padrão / Forte — quanto o texto segue a paleta |
|
|
57
|
-
| Superfícies | Barra lateral (Mais clara / Igual / Mais escura)
|
|
57
|
+
| Superfícies | Barra lateral (Mais clara / Igual / Mais escura). O painel direito nunca é tingido: é uma camada transparente de altura total, tingi-lo cobriria a conversa (ajuste removido em 1.9.10) |
|
|
58
58
|
| Mais opções | Idioma, ênfase de Markdown, barras de rolagem, interruptores |
|
|
59
59
|
|
|
60
60
|
Cada escolha aplica na hora e fica em `localStorage`. Claro/escuro continua no controle «Aparência» do host.
|
|
@@ -69,7 +69,7 @@ OKLCH(L, C, matiz) ──► limite de gamut (busca binária em C) ──► hex
|
|
|
69
69
|
|
|
70
70
|
- os aliases semânticos mantêm cadeias `var(--dsw-static-neutral-bluish-NN)`, então tudo que segue um token segue a paleta;
|
|
71
71
|
- superfícies claras usam os passos 00–300, as escuras 800–950;
|
|
72
|
-
- os pisos de texto são exigidos na construção: corpo ≥ 12:1 no claro e ≥ 10:1 no escuro (alto contraste: 15:1), secundário ≥ 6.2 claro / 8.0 escuro (HC 9 / 9.6), terciário/link ≥ 4.
|
|
72
|
+
- os pisos de texto são exigidos na construção: corpo ≥ 12:1 no claro e ≥ 10:1 no escuro (alto contraste: 15:1), secundário ≥ 6.2 claro / 8.0 escuro (HC 9 / 9.6), terciário/link ≥ 4.85 / 4.95 claro / 6.4 escuro (HC 7 / 7.6), link com APCA Lc ≥ 60 escuro (HC 75), texto na barra lateral ≥ 7, texto no balão ≥ 7;
|
|
73
73
|
- as superfícies prometidas são 00/60 no claro e 950/875 no escuro; as escuras 800 (superfície de módulo) e 850 (sub-superfície) **não** sustentam o texto do corpo: o relatório as conta à parte como «fora de política» (nem contam como aprovado nem como falha), e toda superfície ainda precisa passar pelo piso AA de 4.5;
|
|
74
74
|
- o relatório separa três coisas: a meta declarada, o teto físico (o que o branco ou o preto alcançam nessa superfície) e a isenção de política; 0.93 é apenas margem do solucionador, usada para decidir se uma meta fica acima do teto;
|
|
75
75
|
- `node palette-dev.mjs` verifica 2160 combinações (5 paletas × 216 ajustes × os dois níveis de contraste).
|
|
@@ -111,7 +111,7 @@ dshs1.eyJ2IjoxLCJwIjoiY3VzdG9tIiwicyI6ImRlZXAiLCJ0IjoidGludGVkIiwiciI6InNpZGViYX
|
|
|
111
111
|
|
|
112
112
|
Este exemplo real decodifica para:
|
|
113
113
|
|
|
114
|
-
- paleta: custom · barra lateral: deep · texto: tinted
|
|
114
|
+
- paleta: custom · barra lateral: deep · texto: tinted
|
|
115
115
|
- scrollbar: tinted · controles: accent · Markdown: on · alto contraste: off · idioma: zh-CN
|
|
116
116
|
- três cores: `#f5efe6` (fundo) · `#1d1a17` (texto) · `#3f66a3` (acento)
|
|
117
117
|
|
package/README-zh.md
CHANGED
|
@@ -29,10 +29,10 @@ package.json 的 `engines` 字段写的是 `^22.19.0 || >=24.0.0`——与上表
|
|
|
29
29
|
- **4 套配色** —— 黑白 / 暖砂 / 靛蓝 / 苔绿,各自独立适配明暗两侧;
|
|
30
30
|
- 色阶**整体重算**而不是替换:OKLCH 重建 → 角色化色度 → **sRGB 色域钳位** → 在真实承载面上求解对比度;
|
|
31
31
|
- 覆盖 27,000+ 处 token 引用:正文、次级、三级、注释、链接、侧栏、卡片、主人气泡、主按钮、滚动条、开关、Markdown 标题/加粗、代码块;
|
|
32
|
-
-
|
|
32
|
+
- 可调:文字着色三档、侧栏三档、Markdown 强调、滚动条、开关配色;
|
|
33
33
|
- **自定义配色**(给 底色/文字/强调 三色,文字色相也参与派生;过亮/过暗的强调色会归一化)、**配置导入导出**(`dshs1.` 短码含三色)、**高对比**档、4 种界面语言;
|
|
34
34
|
- **自愈**:宿主丢弃 override 层时自动重放;
|
|
35
|
-
- **对比度承诺**:正文浅色 12:1、深色 10:1(高对比 15:1),次级 ≥ 6.2(深色 8.0
|
|
35
|
+
- **对比度承诺**:正文浅色 12:1、深色 10:1(高对比 15:1),次级 ≥ 6.2(深色 8.0),三级 ≥ 4.85、链接 ≥ 4.95(深色 6.4;浅色留了色觉缺陷余量),链接另过 APCA Lc ≥ 60(高对比 75)—— 都在文字真实落到的承载面上实测(深色要高一些:WCAG 比值在暗底上会高估可读性);
|
|
36
36
|
- 承诺面是浅色 00/60 与深色 950/875;深色 800(模块面)与 850(次级深面)**不为正文兜底**,报表单列为「政策外」(既不算达标也不算失败);
|
|
37
37
|
- 界面支持 简体中文 / 繁體中文 / English / 日本語(跟随宿主,也可手选)。
|
|
38
38
|
|
|
@@ -55,7 +55,7 @@ pnpm add dsh-theme-palette
|
|
|
55
55
|
|---|---|
|
|
56
56
|
| 配色 | 黑白 · 暖砂 · 靛蓝 · 苔绿(卡片缩略图跟随明暗) |
|
|
57
57
|
| 强度 | 静 / 标准 / 浓 —— 正文与强调的着色程度 |
|
|
58
|
-
| 面板表面 | 左侧栏(更浅 / 同色 /
|
|
58
|
+
| 面板表面 | 左侧栏(更浅 / 同色 / 更深)。右侧栏完全不染色:宿主那块面板是整高透明覆盖层,上色会盖住主栏(1.9.10 起整条链路已撤除) |
|
|
59
59
|
| 更多选项 | 语言、Markdown 强调、滚动条、开关 / 勾选 |
|
|
60
60
|
|
|
61
61
|
选择即时生效并存在 `localStorage`;明暗仍由宿主「外观」控制。
|
|
@@ -70,7 +70,7 @@ OKLCH(L, C, hue) ──► 色域钳位(对 C 二分) ──► sRGB hex
|
|
|
70
70
|
|
|
71
71
|
- 语义别名保留 `var(--dsw-static-neutral-bluish-NN)` 引用链,跟 token 的元素就跟着配色走;
|
|
72
72
|
- 浅色面用色阶 00–300,深色面用 800–950;
|
|
73
|
-
- 文字下限在构建期强制:正文浅色 ≥ 12:1、深色 ≥ 10:1(高对比 15:1),次级 ≥ 6.2 浅 / 8.0 深(HC 9 / 9.6),三级/链接 ≥ 4.
|
|
73
|
+
- 文字下限在构建期强制:正文浅色 ≥ 12:1、深色 ≥ 10:1(高对比 15:1),次级 ≥ 6.2 浅 / 8.0 深(HC 9 / 9.6),三级/链接 ≥ 4.85 / 4.95 浅 / 6.4 深(HC 7 / 7.6),链接另过 APCA Lc ≥ 60 深 / 75 HC,侧栏内 ≥ 7,气泡内 ≥ 7;
|
|
74
74
|
- 承诺面是浅色 00/60 与深色 950/875;深色 800(模块面)与 850(次级深面)**不为正文兜底**,报表单列为「政策外」(既不算达标也不算失败),且每一档承载面仍须过 AA 底线 4.5;
|
|
75
75
|
- 报表把三件事分开:声明目标、物理上限(该承载面上黑或白前景能达到的对比度)、政策豁免;0.93 只是求解余量,仅用于判断目标是否高于上限;
|
|
76
76
|
- `node palette-dev.mjs` 扫全部 2160 组配置(5 套配色 × 216 组设置 × 标准/高对比两档)并打印承载面报表,`--hc` 把主报表切到高对比档;硬失败时退出码 1。
|
|
@@ -112,7 +112,7 @@ dshs1.eyJ2IjoxLCJwIjoiY3VzdG9tIiwicyI6ImRlZXAiLCJ0IjoidGludGVkIiwiciI6InNpZGViYX
|
|
|
112
112
|
|
|
113
113
|
这条真实示例解码后是:
|
|
114
114
|
|
|
115
|
-
- 配色:自定义 · 侧栏:更深 · 文字:标准
|
|
115
|
+
- 配色:自定义 · 侧栏:更深 · 文字:标准
|
|
116
116
|
- 滚动条:跟随 · 控件:主题色 · Markdown 强调:开 · 高对比:关 · 语言:zh-CN
|
|
117
117
|
- 三色:`#f5efe6`(底色)· `#1d1a17`(文字)· `#3f66a3`(强调)
|
|
118
118
|
|
package/README.md
CHANGED
|
@@ -29,10 +29,10 @@ The plugin only stacks colour tokens through `ctx.theme.overrideTokens`; it does
|
|
|
29
29
|
- **4 palettes** — Mono, Warm sand, Indigo, Moss — each adapting to light *and* dark independently;
|
|
30
30
|
- the whole ramp is **recomputed**, not swapped: OKLCH rebuild → role-based chroma → **sRGB gamut clamp** → contrast solved on real surfaces;
|
|
31
31
|
- 27,000+ token references covered: body, secondary, tertiary, captions, links, sidebars, cards, user bubble, primary button, scrollbars, switches, Markdown headings/bold, code blocks;
|
|
32
|
-
- adjustable: text tint (3), sidebar depth (3),
|
|
32
|
+
- adjustable: text tint (3), sidebar depth (3), Markdown emphasis, scrollbars, switch colour;
|
|
33
33
|
- **custom palette** (pick surface / text / accent — the engine keeps its contrast guarantees), **config export/import** via a `dshs1.` code, **high-contrast** mode, and 4 UI languages;
|
|
34
34
|
- **self-healing**: if the host drops the override layer, the palette is re-applied;
|
|
35
|
-
- **contrast promises**: body text is promised 12:1 in light and 10:1 in dark (15:1 in high contrast), secondary ≥ 6.2 in light / 8.0 in dark, tertiary and links ≥ 4.
|
|
35
|
+
- **contrast promises**: body text is promised 12:1 in light and 10:1 in dark (15:1 in high contrast), secondary ≥ 6.2 in light / 8.0 in dark, tertiary ≥ 4.85 and links ≥ 4.95 in light / 6.4 in dark (the light floors carry a colour-vision headroom; links also clear an APCA Lc ≥ 60 gate in dark / 75 in HC) — measured on the surfaces the text actually lands on (the dark side needs more, because a WCAG ratio overstates readability on a dark background);
|
|
36
36
|
- the promised surfaces are light 00/60 and dark 950/875; dark 800 (module surface) and 850 (sub-surface) do **not** back body text — the report counts them apart as "out of policy" (neither pass nor fail);
|
|
37
37
|
- UI in 简体中文 / 繁體中文 / English / 日本語 (follows the host language, can be pinned).
|
|
38
38
|
|
|
@@ -55,7 +55,7 @@ Then **restart the GUI** — a running process keeps the old module. Open it fro
|
|
|
55
55
|
|---|---|
|
|
56
56
|
| Palette | Mono · Warm sand · Indigo · Moss (thumbnails follow light/dark) |
|
|
57
57
|
| Strength | Quiet / Standard / Strong — how much body text follows the palette |
|
|
58
|
-
| Panel surfaces | Sidebar (Lighter / Same / Deeper)
|
|
58
|
+
| Panel surfaces | Sidebar (Lighter / Same / Deeper). The right panel is never tinted — it is a full-height transparent overlay, so painting it would cover the conversation (the setting was removed in 1.9.10) |
|
|
59
59
|
| More options | Language, Markdown emphasis, scrollbars, switches/checks |
|
|
60
60
|
|
|
61
61
|
Every choice applies immediately and is stored in `localStorage`. Light/dark stays under the host’s Appearance control.
|
|
@@ -70,7 +70,7 @@ OKLCH(L, C, hue) ──► gamut clamp (binary search on C) ──► sRGB hex
|
|
|
70
70
|
|
|
71
71
|
- semantic aliases keep `var(--dsw-static-neutral-bluish-NN)` chains, so anything following a token follows the palette;
|
|
72
72
|
- light surfaces use steps 00–300, dark surfaces 800–950;
|
|
73
|
-
- text floors are enforced at build time: body ≥ 12:1 in light and ≥ 10:1 in dark (high contrast: 15:1), secondary ≥ 6.2 in light / 8.0 in dark (HC 9 / 9.6), tertiary/link ≥ 4.
|
|
73
|
+
- text floors are enforced at build time: body ≥ 12:1 in light and ≥ 10:1 in dark (high contrast: 15:1), secondary ≥ 6.2 in light / 8.0 in dark (HC 9 / 9.6), tertiary/link ≥ 4.85 / 4.95 in light / 6.4 in dark (HC 7 / 7.6), link APCA Lc ≥ 60 in dark (HC 75), sidebar text ≥ 7, bubble text ≥ 7;
|
|
74
74
|
- the promised surfaces are light 00/60 and dark 950/875; dark 800 (module surface) and 850 (sub-surface) do **not** back body text — the report counts them apart as "out of policy" (neither pass nor fail), and every surface still has to clear the AA floor of 4.5;
|
|
75
75
|
- the report separates three things: the declared target, the physical ceiling (what black or white can reach on that surface) and the policy exemption; 0.93 is only a solver margin, used to decide whether a target sits above the ceiling;
|
|
76
76
|
- 2160 configuration combos (5 palettes × 216 settings × both contrast tiers) are checked by `node palette-dev.mjs`.
|
|
@@ -112,7 +112,7 @@ dshs1.eyJ2IjoxLCJwIjoiY3VzdG9tIiwicyI6ImRlZXAiLCJ0IjoidGludGVkIiwiciI6InNpZGViYX
|
|
|
112
112
|
|
|
113
113
|
This real example decodes to:
|
|
114
114
|
|
|
115
|
-
- palette: custom · sidebar: deep · text: tinted
|
|
115
|
+
- palette: custom · sidebar: deep · text: tinted
|
|
116
116
|
- scrollbar: tinted · controls: accent · Markdown emphasis: on · high contrast: off · language: zh-CN
|
|
117
117
|
- three colours: `#f5efe6` (canvas) · `#1d1a17` (text) · `#3f66a3` (accent)
|
|
118
118
|
|