@bongos/core 1.19.124 → 1.19.125
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/.bongos-core.json +10 -10
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/cosmos.css +0 -26
- package/src/module-api.js +3 -1
- package/tests/cosmos_token_contrast.mjs +50 -8
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.125",
|
|
6
|
+
"core_contract": "1.19.125",
|
|
7
|
+
"source_commit": "669cdd43ff95a6612999a3456ff5b68cdf8ccfd0",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-14T23:11:49.244Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 303,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 1569,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "5310661ece545602d2be2b0c77f859959a02816dded3aeb8c6da211aaef421e9",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -4167,12 +4167,12 @@
|
|
|
4167
4167
|
{
|
|
4168
4168
|
"path": "package-lock.json",
|
|
4169
4169
|
"mode": "0000644",
|
|
4170
|
-
"sha256": "
|
|
4170
|
+
"sha256": "9d8c84867fb0a2470c1597ff6932dd8099f69ecbdaeddf1a8a2761d7e7e14cbd"
|
|
4171
4171
|
},
|
|
4172
4172
|
{
|
|
4173
4173
|
"path": "package.json",
|
|
4174
4174
|
"mode": "0000644",
|
|
4175
|
-
"sha256": "
|
|
4175
|
+
"sha256": "d9d1ace99af356b2d7c958b93d94d14bb144eafdf8c75a0b7dd42ca50727a5a1"
|
|
4176
4176
|
},
|
|
4177
4177
|
{
|
|
4178
4178
|
"path": "public-docs/index.html",
|
|
@@ -4412,7 +4412,7 @@
|
|
|
4412
4412
|
{
|
|
4413
4413
|
"path": "public-landing/assets/cosmos.css",
|
|
4414
4414
|
"mode": "0000644",
|
|
4415
|
-
"sha256": "
|
|
4415
|
+
"sha256": "368015cca5170dffd39e3fae55c8feca512df12fbb0e8f4daf3758e2aa5cf5f4"
|
|
4416
4416
|
},
|
|
4417
4417
|
{
|
|
4418
4418
|
"path": "public-landing/buddha.png",
|
|
@@ -5757,7 +5757,7 @@
|
|
|
5757
5757
|
{
|
|
5758
5758
|
"path": "src/module-api.js",
|
|
5759
5759
|
"mode": "0000644",
|
|
5760
|
-
"sha256": "
|
|
5760
|
+
"sha256": "7319962aeeada78ddc037f8b3eb24c6ecf42e1edd295ee4edb6cd4e0b3247e66"
|
|
5761
5761
|
},
|
|
5762
5762
|
{
|
|
5763
5763
|
"path": "src/module-loader/catalog.js",
|
|
@@ -6267,7 +6267,7 @@
|
|
|
6267
6267
|
{
|
|
6268
6268
|
"path": "tests/cosmos_token_contrast.mjs",
|
|
6269
6269
|
"mode": "0000644",
|
|
6270
|
-
"sha256": "
|
|
6270
|
+
"sha256": "3a727fd6bf78aa8e61643fea0a9418cd67f97dee8ffc3f620673d715da2fcc38"
|
|
6271
6271
|
},
|
|
6272
6272
|
{
|
|
6273
6273
|
"path": "tests/cost.mjs",
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.125",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.125",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.125",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
|
@@ -207,8 +207,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
207
207
|
.lede{font-size:15.5px;color:var(--ink-soft);font-weight:500;line-height:1.55;margin-bottom:24px;max-width:62ch;}
|
|
208
208
|
.lede a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
|
|
209
209
|
.lede a:hover{text-decoration:underline;}
|
|
210
|
-
:root[data-mode="dark"] .lede a{color:var(--sun-lit);}
|
|
211
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .lede a{color:var(--sun-lit);}}
|
|
212
210
|
|
|
213
211
|
/* ── buttons ── */
|
|
214
212
|
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;cursor:pointer;font-family:var(--font-display);font-weight:700;font-size:15px;color:#fff;background:var(--accent);border:none;border-radius:999px;padding:11px 22px;text-decoration:none;box-shadow:0 10px 22px -8px color-mix(in srgb,var(--accent) 70%,transparent);transition:transform .15s ease, box-shadow .15s ease, background .15s ease;}
|
|
@@ -217,15 +215,11 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
217
215
|
.btn:disabled{background:color-mix(in srgb,var(--ink) 12%,var(--bg-deep));color:color-mix(in srgb,var(--ink) 40%,var(--bg-deep));box-shadow:none;cursor:not-allowed;transform:none;}
|
|
218
216
|
.btn.ghost{background:transparent;color:var(--ink-soft);box-shadow:none;border:2px solid var(--line);}
|
|
219
217
|
.btn.ghost:hover{border-color:var(--accent);color:var(--accent-deep);}
|
|
220
|
-
:root[data-mode="dark"] .btn.ghost:hover{color:var(--sun-lit);}
|
|
221
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .btn.ghost:hover{color:var(--sun-lit);}}
|
|
222
218
|
.btn.small{font-size:13.5px;padding:8px 16px;}
|
|
223
219
|
.btn.danger{background:transparent;color:var(--err);box-shadow:none;border:2px solid color-mix(in srgb,var(--err) 35%,transparent);}
|
|
224
220
|
.btn.danger:hover{background:var(--err-soft);border-color:var(--err);}
|
|
225
221
|
.btn .gh{width:17px;height:17px;fill:currentColor;}
|
|
226
222
|
.linklike{background:none;border:none;cursor:pointer;font-family:var(--font-body);font-weight:700;font-size:13.5px;color:var(--accent-deep);text-decoration:underline;padding:6px 4px;}
|
|
227
|
-
:root[data-mode="dark"] .linklike{color:var(--sun-lit);}
|
|
228
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .linklike{color:var(--sun-lit);}}
|
|
229
223
|
|
|
230
224
|
/* ── chips: the one status vocabulary (direction §4). Recency rides inside
|
|
231
225
|
(.rec) — "live" always says when it was last verified. ── */
|
|
@@ -233,8 +227,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
233
227
|
.chip .cdot{width:7px;height:7px;border-radius:50%;background:var(--ink-faint);flex:0 0 auto;}
|
|
234
228
|
.chip .rec{font-weight:600;opacity:0.72;font-size:11.5px;}
|
|
235
229
|
.chip.busy{background:var(--accent-soft);color:var(--accent-deep);}
|
|
236
|
-
:root[data-mode="dark"] .chip.busy{color:var(--sun-lit);}
|
|
237
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .chip.busy{color:var(--sun-lit);}}
|
|
238
230
|
.chip.busy .cdot{background:var(--accent);animation:chipPulse 1.4s ease-in-out infinite;}
|
|
239
231
|
.chip.live{background:var(--ok-soft);color:var(--ok);}
|
|
240
232
|
.chip.live .cdot{background:var(--ok);}
|
|
@@ -272,17 +264,11 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
272
264
|
.projName{font-family:var(--font-display);font-weight:700;font-size:19px;letter-spacing:-0.3px;}
|
|
273
265
|
.projMeta{font-size:13px;font-weight:600;color:var(--ink-faint);margin-top:6px;display:flex;gap:14px;flex-wrap:wrap;}
|
|
274
266
|
.projMeta code{font-family:var(--font-mono);font-size:12.5px;background:var(--bg-deep);border-radius:6px;padding:1px 6px;color:var(--accent-deep);}
|
|
275
|
-
:root[data-mode="dark"] .projMeta code{color:var(--sun-lit);}
|
|
276
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projMeta code{color:var(--sun-lit);}}
|
|
277
267
|
.addr{margin-top:12px;font-size:14.5px;font-weight:600;color:var(--ink-soft);}
|
|
278
268
|
.addr a{color:var(--accent-deep);font-weight:700;text-decoration:none;font-family:var(--font-mono);font-size:13.5px;}
|
|
279
|
-
:root[data-mode="dark"] .addr a{color:var(--sun-lit);}
|
|
280
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .addr a{color:var(--sun-lit);}}
|
|
281
269
|
.addr a:hover{text-decoration:underline;}
|
|
282
270
|
.addr .none{color:var(--ink-faint);font-style:italic;}
|
|
283
271
|
.addr code{font-family:var(--font-mono);font-size:13px;background:var(--bg-deep);border-radius:6px;padding:1px 7px;color:var(--accent-deep);}
|
|
284
|
-
:root[data-mode="dark"] .addr code{color:var(--sun-lit);}
|
|
285
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .addr code{color:var(--sun-lit);}}
|
|
286
272
|
.attach{display:flex;gap:10px;margin-top:10px;flex-wrap:wrap;}
|
|
287
273
|
.attach input[type=text]{flex:1;min-width:220px;font-family:var(--font-body);font-size:15px;font-weight:600;color:var(--ink);background:var(--bg-card);border:2px solid var(--line);border-radius:12px;padding:9px 14px;outline:none;transition:border-color .15s ease, box-shadow .15s ease;}
|
|
288
274
|
.attach input[type=text]::placeholder{color:var(--ink-faint);font-weight:500;}
|
|
@@ -291,8 +277,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
291
277
|
.projMsg.ok{color:var(--ok);}
|
|
292
278
|
.projMsg.err{color:var(--err);}
|
|
293
279
|
.projMsg a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
|
|
294
|
-
:root[data-mode="dark"] .projMsg a{color:var(--sun-lit);}
|
|
295
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projMsg a{color:var(--sun-lit);}}
|
|
296
280
|
.projMsg a:hover{text-decoration:underline;}
|
|
297
281
|
.projMsg details{margin-top:8px;}
|
|
298
282
|
.projMsg summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--ink-faint);}
|
|
@@ -305,8 +289,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
305
289
|
the browser's default blue, the one colour in the page that is not ours */
|
|
306
290
|
.finePrint a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
|
|
307
291
|
.finePrint a:hover{text-decoration:underline;}
|
|
308
|
-
:root[data-mode="dark"] .finePrint a{color:var(--sun-lit);}
|
|
309
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .finePrint a{color:var(--sun-lit);}}
|
|
310
292
|
|
|
311
293
|
/* ── progress strips: one visual, per-flow vocabularies (direction §4).
|
|
312
294
|
Default = the sea-blue "working" look; .isLive = verified-landed green;
|
|
@@ -525,8 +507,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
525
507
|
0 0 0 2px color-mix(in srgb,var(--accent) 55%,transparent);}
|
|
526
508
|
.worldOrb[data-rel="builder"] .badge{background:var(--accent-soft);color:var(--accent-deep);
|
|
527
509
|
border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);}
|
|
528
|
-
:root[data-mode="dark"] .worldOrb[data-rel="builder"] .badge{color:var(--sun-lit);}
|
|
529
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .worldOrb[data-rel="builder"] .badge{color:var(--sun-lit);}}
|
|
530
510
|
.worldOrb .chip{transform:scale(.88);white-space:nowrap;}
|
|
531
511
|
|
|
532
512
|
/* what the only-mine filter shows when you are connected to nothing. Not a
|
|
@@ -570,8 +550,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
570
550
|
border:1px solid var(--line);color:var(--ink-faint);white-space:nowrap;}
|
|
571
551
|
.tbl .pill{display:inline-block;font-family:var(--font-mono);font-size:11px;padding:3px 10px;
|
|
572
552
|
border-radius:999px;background:var(--accent-soft);color:var(--accent-deep);}
|
|
573
|
-
:root[data-mode="dark"] .tbl .pill{color:var(--sun-lit);}
|
|
574
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .tbl .pill{color:var(--sun-lit);}}
|
|
575
553
|
.tbl td.right{text-align:right;}
|
|
576
554
|
/* Nothing in an action or status cell may wrap: "Manage →" breaking after the
|
|
577
555
|
space and the chip's recency dropping to a second line both read as a broken
|
|
@@ -627,8 +605,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
627
605
|
.projCard .cardTag{font-size:14px;color:var(--ink-faint);font-weight:600;line-height:1.5;margin-bottom:14px;}
|
|
628
606
|
.projCard .cardRel{display:inline-block;font-family:var(--font-mono);font-size:11px;padding:3px 10px;
|
|
629
607
|
border-radius:999px;background:var(--accent-soft);color:var(--accent-deep);margin-bottom:18px;}
|
|
630
|
-
:root[data-mode="dark"] .projCard .cardRel{color:var(--sun-lit);}
|
|
631
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projCard .cardRel{color:var(--sun-lit);}}
|
|
632
608
|
/* the facts strip (task 1002778): a label/value grid, centered as a block but
|
|
633
609
|
read left-aligned. A hidden pair leaves no gap — the grid row collapses. */
|
|
634
610
|
.projCard .cardMeta{display:grid;grid-template-columns:auto auto;justify-content:center;
|
|
@@ -679,8 +655,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
679
655
|
font-size:14px;color:var(--ink-faint);position:relative;z-index:1;}
|
|
680
656
|
.steps li.done .snum{border-color:var(--accent);background:var(--accent);color:#fff;}
|
|
681
657
|
.steps li.now .snum{border-color:var(--accent);color:var(--accent-deep);}
|
|
682
|
-
:root[data-mode="dark"] .steps li.now .snum{color:var(--sun-lit);}
|
|
683
|
-
@media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .steps li.now .snum{color:var(--sun-lit);}}
|
|
684
658
|
.steps .slbl{font-size:12.5px;font-weight:700;color:var(--ink-faint);}
|
|
685
659
|
.steps li.now .slbl,.steps li.done .slbl{color:var(--ink-soft);}
|
|
686
660
|
.createSplit{display:grid;grid-template-columns:1fr 300px;gap:var(--pad-md);align-items:center;}
|
package/src/module-api.js
CHANGED
|
@@ -675,8 +675,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
675
675
|
// landed since 1.19.122 with no explicit bump. run 31842559470. (task 1002620)
|
|
676
676
|
// 1.19.124 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
677
677
|
// landed since 1.19.123 with no explicit bump. run 31844281033. (task 1002620)
|
|
678
|
+
// 1.19.125 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
679
|
+
// landed since 1.19.124 with no explicit bump. run 31849445746. (task 1002620)
|
|
678
680
|
// ---------------------------------------------------------------------------
|
|
679
|
-
const CORE_VERSION = '1.19.
|
|
681
|
+
const CORE_VERSION = '1.19.125'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
680
682
|
|
|
681
683
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
682
684
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -143,14 +143,14 @@ const PAIRS = [
|
|
|
143
143
|
['.btn label on its fill', '#ffffff', 'var(--accent)', 4.5],
|
|
144
144
|
['.btn.ghost:hover label', 'var(--accent-deep)', CARD, 4.5],
|
|
145
145
|
['.btn.danger label', 'var(--err)', CARD, 4.5],
|
|
146
|
-
// Inline links
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
146
|
+
// Inline links, code chips, pills, the now-step number: every accent-colored
|
|
147
|
+
// text consumer paints --accent-deep in BOTH modes (task 1002750 deleted the
|
|
148
|
+
// dark --sun-lit recolors — they pinned the locked space palette over the
|
|
149
|
+
// branding pack, so a re-themed instance got Cloud Bongos orange links).
|
|
150
|
+
// The dark blocks derive --accent-deep from the pack-settable --accent.
|
|
150
151
|
['inline link on a card', 'var(--accent-deep)', CARD, 4.5],
|
|
151
152
|
['inline link on the page ground', 'var(--accent-deep)', 'var(--bg)', 4.5],
|
|
152
153
|
['code chip on --bg-deep', 'var(--accent-deep)', 'var(--bg-deep)', 4.5],
|
|
153
|
-
['cosmos.css dark link (--sun-lit)', 'var(--sun-lit)', CARD, 4.5, 'dark'],
|
|
154
154
|
// body copy
|
|
155
155
|
['--ink body copy', 'var(--ink)', CARD, 4.5],
|
|
156
156
|
['--ink-soft secondary copy', 'var(--ink-soft)', CARD, 4.5],
|
|
@@ -162,9 +162,9 @@ const PAIRS = [
|
|
|
162
162
|
['.chip.live label', 'var(--ok)', 'var(--ok-soft)', 4.5],
|
|
163
163
|
['.chip.maybe label', 'var(--warn)', 'var(--warn-soft)', 4.5],
|
|
164
164
|
['.chip.down/.bad label', 'var(--err)', 'var(--err-soft)', 4.5],
|
|
165
|
-
// .chip.busy
|
|
166
|
-
|
|
167
|
-
['.chip.busy label', 'var(--
|
|
165
|
+
// .chip.busy + the .tbl .pill / .cardRel / builder-badge family: accent-deep
|
|
166
|
+
// ink on the accent-soft tint, both modes
|
|
167
|
+
['.chip.busy label', 'var(--accent-deep)', 'var(--accent-soft)', 4.5],
|
|
168
168
|
// lifecycle strip: 12px/700
|
|
169
169
|
['.strip .slbl idle', 'var(--ink-faint)', CARD, 4.5],
|
|
170
170
|
['.strip .slbl now/done', 'color-mix(in srgb,var(--sea) 40%,var(--ink))', CARD, 4.5],
|
|
@@ -212,6 +212,48 @@ for (const mode of ['light', 'dark']) {
|
|
|
212
212
|
});
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
+
// The gate's LOCKED sky palette — deliberately absent from COLOR_VARS, so a
|
|
216
|
+
// branding pack can never re-theme these. Dark GROUNDS are allowed (dark mode IS
|
|
217
|
+
// the gate's space, by design); text painted with one shows Cloud Bongos orange
|
|
218
|
+
// on every re-themed instance, beside its own brand color (task 1002750; same
|
|
219
|
+
// class as the --chrome-accent leak in 1002749).
|
|
220
|
+
const LOCKED = ['sun-lit', 'gold', 'gold-soft', 'nebula', 'space-deep', 'space-mid', 'space-high'];
|
|
221
|
+
const LOCKED_REF = new RegExp(`var\\(\\s*--(?:${LOCKED.join('|')})\\s*[,)]`);
|
|
222
|
+
|
|
223
|
+
test('no rule paints text with the locked space palette', () => {
|
|
224
|
+
// The 2026-08-13 state: thirteen dark-mode pairs pinning links/chips/pills to
|
|
225
|
+
// --sun-lit. Property-anchored (background-color:/border-color: fills with
|
|
226
|
+
// their own fixed ink are fine) and value-wide, so color-mix()/fallback/padded
|
|
227
|
+
// spellings are caught too. Comments are stripped first — quoting the old rule
|
|
228
|
+
// in prose must not fail the build.
|
|
229
|
+
const stripped = src.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
230
|
+
const leaks = [];
|
|
231
|
+
for (const m of stripped.matchAll(/(?:^|[;{\s])(color|fill|stroke)\s*:\s*([^;}]*)/g)) {
|
|
232
|
+
if (LOCKED_REF.test(m[2])) leaks.push(`${m[1]}:${m[2].trim()}`);
|
|
233
|
+
}
|
|
234
|
+
assert.deepEqual(leaks, [], `space-palette tokens used as text color:\n ${leaks.join('\n ')}\n`);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('dark blocks never re-point a token at the locked space palette', () => {
|
|
238
|
+
// The seam the literal guard can't see: a dark block re-pointing a token the
|
|
239
|
+
// text consumers use (--accent-deep:var(--sun-lit)) paints every link orange
|
|
240
|
+
// while no color: declaration names a locked token — and at (0,2,0) no pack
|
|
241
|
+
// can ever win it back. Dark grounds that want the space look use literals.
|
|
242
|
+
// (The typeCard's 40%-gold-soft heading mix is fine: a per-TYPE tint in the
|
|
243
|
+
// light tier, where the pack still owns every brand token.)
|
|
244
|
+
for (const [where, block] of [
|
|
245
|
+
[':root[data-mode="dark"]', darkExplicit],
|
|
246
|
+
['the prefers-color-scheme twin', darkMedia],
|
|
247
|
+
]) {
|
|
248
|
+
for (const [name, value] of Object.entries(block)) {
|
|
249
|
+
assert.ok(
|
|
250
|
+
!LOCKED_REF.test(value),
|
|
251
|
+
`${where}: ${name}:${value} references a locked space-palette token`
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
215
257
|
test('the two dark blocks stay in lockstep', () => {
|
|
216
258
|
// cosmos.css carries dark twice — an explicit data-mode hook and a
|
|
217
259
|
// prefers-color-scheme twin. A change to one and not the other is the
|