@bongos/core 1.24.46 → 1.24.47
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 +23 -13
- package/config/design-tokens.neutral.json +10 -10
- package/docs/module-api-changelog.md +2 -0
- package/modules/ui-design/scripts/gen-design-tokens.js +102 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/module-api.js +1 -1
- package/tests/design_tokens_generated.mjs +56 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/bongos/package-core.js",
|
|
5
|
-
"core_version": "1.24.
|
|
6
|
-
"core_contract": "1.24.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.24.47",
|
|
6
|
+
"core_contract": "1.24.47",
|
|
7
|
+
"source_commit": "816b62ec33f75857ddfcfa52c46ce158bb97ca2d",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-11-
|
|
9
|
+
"built_at": "2026-11-07T08:16:53.782Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 637,
|
|
13
13
|
"agent_docs_stubbed": 32,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 3866,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 4536,
|
|
20
|
+
"tree_sha256": "e4985b2bf6f45f1ad5eb8044399df15f306f782c573cd8b5ee82407668324cef",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -372,7 +372,7 @@
|
|
|
372
372
|
{
|
|
373
373
|
"path": "config/design-tokens.neutral.json",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "e6a0956bf4d18316544a94a5dc60ce54efd6917d1c8d539bd0029fbd76034cdf"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "config/design-tokens.schema.json",
|
|
@@ -3002,7 +3002,7 @@
|
|
|
3002
3002
|
{
|
|
3003
3003
|
"path": "docs/module-api-changelog.md",
|
|
3004
3004
|
"mode": "0000644",
|
|
3005
|
-
"sha256": "
|
|
3005
|
+
"sha256": "7e0741cbd3de2eef3830cb9fc9d2320fa222e377cae25b9338ca35da03388c80"
|
|
3006
3006
|
},
|
|
3007
3007
|
{
|
|
3008
3008
|
"path": "docs/modules-contract.md",
|
|
@@ -11704,6 +11704,11 @@
|
|
|
11704
11704
|
"mode": "0000644",
|
|
11705
11705
|
"sha256": "5d38655b42d1f0e27607b2a026676d46253a869eae8fdccd1aa6e1bac0c288c7"
|
|
11706
11706
|
},
|
|
11707
|
+
{
|
|
11708
|
+
"path": "modules/ui-design/scripts/gen-design-tokens.js",
|
|
11709
|
+
"mode": "0000644",
|
|
11710
|
+
"sha256": "a644ec9e894a9e1f57e7e406b00ba3711cd2b35581c449ee91a311bb7432b9a7"
|
|
11711
|
+
},
|
|
11707
11712
|
{
|
|
11708
11713
|
"path": "modules/ui-design/scripts/validate-design.js",
|
|
11709
11714
|
"mode": "0000644",
|
|
@@ -11817,12 +11822,12 @@
|
|
|
11817
11822
|
{
|
|
11818
11823
|
"path": "package-lock.json",
|
|
11819
11824
|
"mode": "0000644",
|
|
11820
|
-
"sha256": "
|
|
11825
|
+
"sha256": "0c6db315913a8bb217d9d1471bdac4a9d5a60b4ce9b2084274bfc65d7c12d063"
|
|
11821
11826
|
},
|
|
11822
11827
|
{
|
|
11823
11828
|
"path": "package.json",
|
|
11824
11829
|
"mode": "0000644",
|
|
11825
|
-
"sha256": "
|
|
11830
|
+
"sha256": "68de6f15e7414272a1d127ab7fc2537f877d162cf8e6e5a18a1129bcdde95062"
|
|
11826
11831
|
},
|
|
11827
11832
|
{
|
|
11828
11833
|
"path": "public-docs/index.html",
|
|
@@ -11842,7 +11847,7 @@
|
|
|
11842
11847
|
{
|
|
11843
11848
|
"path": "release-notes.json",
|
|
11844
11849
|
"mode": "0000644",
|
|
11845
|
-
"sha256": "
|
|
11850
|
+
"sha256": "3de9500808c88490e2021024389877b315c754829e5f478cf17d6be43847da0d"
|
|
11846
11851
|
},
|
|
11847
11852
|
{
|
|
11848
11853
|
"path": "scripts/bongos/CLAUDE.md",
|
|
@@ -15752,7 +15757,7 @@
|
|
|
15752
15757
|
{
|
|
15753
15758
|
"path": "src/module-api.js",
|
|
15754
15759
|
"mode": "0000644",
|
|
15755
|
-
"sha256": "
|
|
15760
|
+
"sha256": "638af2a4f3e8dbec321dc394c74384ebb29acc8e2b214dae528e3e689d40c9db"
|
|
15756
15761
|
},
|
|
15757
15762
|
{
|
|
15758
15763
|
"path": "src/module-loader/catalog.js",
|
|
@@ -17269,6 +17274,11 @@
|
|
|
17269
17274
|
"mode": "0000644",
|
|
17270
17275
|
"sha256": "7a492f806c867e71e52a9d90b3c0b30d47327c83d95e989ad09377c958457dd5"
|
|
17271
17276
|
},
|
|
17277
|
+
{
|
|
17278
|
+
"path": "tests/design_tokens_generated.mjs",
|
|
17279
|
+
"mode": "0000644",
|
|
17280
|
+
"sha256": "b412e68c9efbbe4e27f0251af3840a6f456feec8491c9fd5c975681bac194651"
|
|
17281
|
+
},
|
|
17272
17282
|
{
|
|
17273
17283
|
"path": "tests/design_tokens_shared.mjs",
|
|
17274
17284
|
"mode": "0000644",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_note": "
|
|
2
|
+
"_note": "GENERATED by node modules/ui-design/scripts/gen-design-tokens.js; do not edit by hand. Colours, font stacks and font links are config/branding.neutral.json theme.ui; scale, radius and motion are the --ds-* steps of modules/ui-design/public/tokens.css (the mapping is in the generator). To override, copy values into config/design-tokens.json (the instance pack). See DESIGN.md \"The hall\" and modules/ui-design/docs/design-contract.md.",
|
|
3
3
|
"colors": {
|
|
4
4
|
"bg": "#edecee",
|
|
5
5
|
"bgCard": "#fbfafc",
|
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
]
|
|
25
25
|
},
|
|
26
26
|
"scale": {
|
|
27
|
-
"xs": "
|
|
28
|
-
"sm": "
|
|
29
|
-
"md": "
|
|
30
|
-
"lg": "
|
|
31
|
-
"xl": "
|
|
32
|
-
"2xl": "
|
|
27
|
+
"xs": "6px",
|
|
28
|
+
"sm": "10px",
|
|
29
|
+
"md": "14px",
|
|
30
|
+
"lg": "22px",
|
|
31
|
+
"xl": "34px",
|
|
32
|
+
"2xl": "52px"
|
|
33
33
|
},
|
|
34
34
|
"radius": {
|
|
35
35
|
"sm": "10px",
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"pill": "999px"
|
|
39
39
|
},
|
|
40
40
|
"motion": {
|
|
41
|
-
"fast": "
|
|
42
|
-
"normal": "
|
|
41
|
+
"fast": "150ms",
|
|
42
|
+
"normal": "200ms",
|
|
43
43
|
"slow": "700ms",
|
|
44
|
-
"easing": "cubic-bezier(
|
|
44
|
+
"easing": "cubic-bezier(.2, .7, .3, 1)"
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -3346,5 +3346,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3346
3346
|
landed since 1.24.44 with no explicit bump. run 42206962991. (task 1002620)
|
|
3347
3347
|
1.24.46 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3348
3348
|
landed since 1.24.45 with no explicit bump. run 42303836499. (task 1002620)
|
|
3349
|
+
1.24.47 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3350
|
+
landed since 1.24.46 with no explicit bump. run 42354688707. (task 1002620)
|
|
3349
3351
|
---------------------------------------------------------------------------
|
|
3350
3352
|
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
// modules/ui-design/scripts/gen-design-tokens.js — build config/design-tokens.neutral.json
|
|
4
|
+
// from the two files that already own its values (task 1005082, goal 1000138).
|
|
5
|
+
//
|
|
6
|
+
// WHY. The design-tool token file (read by the Claude Design and Figma adapters)
|
|
7
|
+
// was hand-written, and its spacing (4/8/16/24/40/64) and motion (200/250ms) had
|
|
8
|
+
// drifted from what every page actually uses (the 6/10/14/22/34/52 rhythm and the
|
|
9
|
+
// 150/200ms durations in the shared token sheet). A designer starting from it got
|
|
10
|
+
// a spacing scale no page has. Now nothing in that file is typed by hand:
|
|
11
|
+
//
|
|
12
|
+
// colours + font stacks + font links ← config/branding.neutral.json theme.ui
|
|
13
|
+
// spacing, corners, motion ← modules/ui-design/public/tokens.css (--ds-*)
|
|
14
|
+
//
|
|
15
|
+
// The file keeps its existing key names (config/design-tokens.schema.json closes
|
|
16
|
+
// them, and an instance's config/design-tokens.json overrides by those names); each
|
|
17
|
+
// key is mapped to the --ds-* step it means, below.
|
|
18
|
+
//
|
|
19
|
+
// node modules/ui-design/scripts/gen-design-tokens.js write the file
|
|
20
|
+
// node modules/ui-design/scripts/gen-design-tokens.js --check exit 1 if it is stale
|
|
21
|
+
//
|
|
22
|
+
// Guarded by tests/design_tokens_generated.mjs.
|
|
23
|
+
|
|
24
|
+
const fs = require('node:fs');
|
|
25
|
+
const path = require('node:path');
|
|
26
|
+
|
|
27
|
+
const ROOT = path.resolve(__dirname, '..', '..', '..');
|
|
28
|
+
const SHEET = path.join(ROOT, 'modules', 'ui-design', 'public', 'tokens.css');
|
|
29
|
+
const PACK = path.join(ROOT, 'config', 'branding.neutral.json');
|
|
30
|
+
const OUT = path.join(ROOT, 'config', 'design-tokens.neutral.json');
|
|
31
|
+
|
|
32
|
+
// The schema's key → the --ds-* custom property it is generated from.
|
|
33
|
+
const MAP = Object.freeze({
|
|
34
|
+
scale: { xs: '--ds-space-hair', sm: '--ds-space-xs', md: '--ds-space-sm', lg: '--ds-space-md', xl: '--ds-space-lg', '2xl': '--ds-space-xl' },
|
|
35
|
+
radius: { sm: '--ds-radius-tile', md: '--ds-radius-panel', lg: '--ds-radius-panel', pill: '--ds-radius-pill' },
|
|
36
|
+
motion: { fast: '--ds-dur-fast', normal: '--ds-dur-base', slow: '--ds-dur-arrive', easing: '--ds-ease' },
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// The pack carries no mono stack (it is not one of the fifteen), so the design
|
|
40
|
+
// side states the label/mono face DESIGN.md names (typography.label).
|
|
41
|
+
const MONO = '"JetBrains Mono", ui-monospace, "Cascadia Mono", Consolas, monospace';
|
|
42
|
+
|
|
43
|
+
const NOTE = 'GENERATED by node modules/ui-design/scripts/gen-design-tokens.js; do not edit by hand. '
|
|
44
|
+
+ 'Colours, font stacks and font links are config/branding.neutral.json theme.ui; scale, radius and motion are '
|
|
45
|
+
+ 'the --ds-* steps of modules/ui-design/public/tokens.css (the mapping is in the generator). To override, copy '
|
|
46
|
+
+ 'values into config/design-tokens.json (the instance pack). See DESIGN.md "The hall" and '
|
|
47
|
+
+ 'modules/ui-design/docs/design-contract.md.';
|
|
48
|
+
|
|
49
|
+
// The first :root { … } block of the sheet: the light/base values. The dark and
|
|
50
|
+
// reduced-motion blocks restate a few of them and are deliberately not read.
|
|
51
|
+
function readSheetVars(css) {
|
|
52
|
+
const noComments = css.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
53
|
+
const m = noComments.match(/:root\s*\{([^}]*)\}/);
|
|
54
|
+
if (!m) throw new Error('tokens.css: no :root block');
|
|
55
|
+
const vars = {};
|
|
56
|
+
for (const decl of m[1].split(';')) {
|
|
57
|
+
const d = decl.match(/^\s*(--[a-z0-9-]+)\s*:\s*([\s\S]+?)\s*$/i);
|
|
58
|
+
if (d) vars[d[1]] = d[2].replace(/\s+/g, ' ');
|
|
59
|
+
}
|
|
60
|
+
return vars;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function build({ sheet = fs.readFileSync(SHEET, 'utf8'), pack = JSON.parse(fs.readFileSync(PACK, 'utf8')) } = {}) {
|
|
64
|
+
const vars = readSheetVars(sheet);
|
|
65
|
+
const ui = (pack.theme && pack.theme.ui) || {};
|
|
66
|
+
const pick = (group) => {
|
|
67
|
+
const out = {};
|
|
68
|
+
for (const [key, prop] of Object.entries(MAP[group])) {
|
|
69
|
+
if (!(prop in vars)) throw new Error(`tokens.css: ${prop} (for ${group}.${key}) is not declared`);
|
|
70
|
+
out[key] = vars[prop];
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
};
|
|
74
|
+
const fonts = { display: ui.fonts.display, body: ui.fonts.body, mono: MONO };
|
|
75
|
+
if (Array.isArray(ui.fonts.links)) fonts.links = ui.fonts.links.slice();
|
|
76
|
+
const tokens = {
|
|
77
|
+
_note: NOTE,
|
|
78
|
+
colors: Object.assign({}, ui.colors),
|
|
79
|
+
fonts,
|
|
80
|
+
scale: pick('scale'),
|
|
81
|
+
radius: pick('radius'),
|
|
82
|
+
motion: pick('motion'),
|
|
83
|
+
};
|
|
84
|
+
return JSON.stringify(tokens, null, 2) + '\n';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
module.exports = { build, readSheetVars, MAP, OUT };
|
|
88
|
+
|
|
89
|
+
if (require.main === module) {
|
|
90
|
+
const next = build();
|
|
91
|
+
const current = fs.existsSync(OUT) ? fs.readFileSync(OUT, 'utf8') : '';
|
|
92
|
+
if (process.argv.includes('--check')) {
|
|
93
|
+
if (current === next) { process.stdout.write('design-tokens.neutral.json: current\n'); process.exitCode = 0; }
|
|
94
|
+
else {
|
|
95
|
+
process.stderr.write('design-tokens.neutral.json is STALE: run node modules/ui-design/scripts/gen-design-tokens.js\n');
|
|
96
|
+
process.exitCode = 1;
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
if (current !== next) fs.writeFileSync(OUT, next);
|
|
100
|
+
process.stdout.write((current === next ? 'design-tokens.neutral.json: unchanged' : 'design-tokens.neutral.json: written') + '\n');
|
|
101
|
+
}
|
|
102
|
+
}
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.47",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.24.
|
|
9
|
+
"version": "1.24.47",
|
|
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.24.
|
|
3
|
+
"version": "1.24.47",
|
|
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",
|
package/release-notes.json
CHANGED
|
@@ -11247,5 +11247,11 @@
|
|
|
11247
11247
|
"id": "1005080",
|
|
11248
11248
|
"text": "The screenshot checker builders use before shipping a design change shows the real hall pages again, instead of a pop-up covering every page. Two small accessibility fixes came with it: a few tiny links are now big enough to t"
|
|
11249
11249
|
}
|
|
11250
|
+
],
|
|
11251
|
+
"1.24.47": [
|
|
11252
|
+
{
|
|
11253
|
+
"id": "1005082",
|
|
11254
|
+
"text": "The design rulebook now describes the builders' hall as it really is, and spells out the name: 'cloud bongos' in the logo, 'Cloud Bongos' in sentences. The design-tool token file is now built automatically from the real styles"
|
|
11255
|
+
}
|
|
11250
11256
|
]
|
|
11251
11257
|
}
|
package/src/module-api.js
CHANGED
|
@@ -81,7 +81,7 @@ const { sleep } = require('./sleep');
|
|
|
81
81
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
82
82
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
83
83
|
|
|
84
|
-
const CORE_VERSION = '1.24.
|
|
84
|
+
const CORE_VERSION = '1.24.47'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
85
85
|
|
|
86
86
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
87
87
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// tests/design_tokens_generated.mjs — config/design-tokens.neutral.json is GENERATED
|
|
2
|
+
// from the branding pack and the shared token sheet, and regenerates byte-identical
|
|
3
|
+
// (task 1005082, goal 1000138).
|
|
4
|
+
//
|
|
5
|
+
// WHY. The hand-written file's spacing and motion had drifted from every page's
|
|
6
|
+
// (4/8/16px against the 6/10/14px rhythm). The generator removes the hand; this
|
|
7
|
+
// test is what notices a hand coming back, or a token-sheet edit nobody regenerated.
|
|
8
|
+
//
|
|
9
|
+
// Run: node --test tests/design_tokens_generated.mjs
|
|
10
|
+
|
|
11
|
+
import { strict as assert } from 'node:assert';
|
|
12
|
+
import { test } from 'node:test';
|
|
13
|
+
import fs from 'node:fs';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import { createRequire } from 'node:module';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
|
|
18
|
+
const require = createRequire(import.meta.url);
|
|
19
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
20
|
+
const gen = require(path.join(ROOT, 'modules', 'ui-design', 'scripts', 'gen-design-tokens.js'));
|
|
21
|
+
|
|
22
|
+
test('the committed token file is exactly what the generator writes', () => {
|
|
23
|
+
const committed = fs.readFileSync(path.join(ROOT, 'config', 'design-tokens.neutral.json'), 'utf8');
|
|
24
|
+
assert.equal(committed, gen.build(),
|
|
25
|
+
'config/design-tokens.neutral.json is stale or hand-edited: run node modules/ui-design/scripts/gen-design-tokens.js');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('every scale, radius and motion value is the shared sheet\'s --ds-* value', () => {
|
|
29
|
+
const vars = gen.readSheetVars(fs.readFileSync(path.join(ROOT, 'modules', 'ui-design', 'public', 'tokens.css'), 'utf8'));
|
|
30
|
+
const tokens = JSON.parse(gen.build());
|
|
31
|
+
for (const group of ['scale', 'radius', 'motion']) {
|
|
32
|
+
for (const [key, prop] of Object.entries(gen.MAP[group])) {
|
|
33
|
+
assert.equal(tokens[group][key], vars[prop], `${group}.${key} must be ${prop}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
assert.equal(tokens.scale.xs, '6px', 'the rhythm starts at the 6px hair step');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('a token-sheet change reaches the generated file (the generator reads the sheet, not a copy)', () => {
|
|
40
|
+
const sheet = ':root { --ds-space-hair: 7px; --ds-space-xs: 10px; --ds-space-sm: 14px; --ds-space-md: 22px;'
|
|
41
|
+
+ ' --ds-space-lg: 34px; --ds-space-xl: 52px; --ds-radius-tile: 10px; --ds-radius-panel: 16px;'
|
|
42
|
+
+ ' --ds-radius-pill: 999px; --ds-dur-fast: 150ms; --ds-dur-base: 200ms; --ds-dur-arrive: 700ms;'
|
|
43
|
+
+ ' --ds-ease: cubic-bezier(.2, .7, .3, 1); }';
|
|
44
|
+
const pack = JSON.parse(fs.readFileSync(path.join(ROOT, 'config', 'branding.neutral.json'), 'utf8'));
|
|
45
|
+
assert.equal(JSON.parse(gen.build({ sheet, pack })).scale.xs, '7px');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('a --ds-* step the mapping needs but the sheet lost is an error, not a silent gap', () => {
|
|
49
|
+
const pack = JSON.parse(fs.readFileSync(path.join(ROOT, 'config', 'branding.neutral.json'), 'utf8'));
|
|
50
|
+
assert.throws(() => gen.build({ sheet: ':root { --ds-space-hair: 6px; }', pack }), /is not declared/);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('only the base :root block is read: the dark and reduced-motion restatements do not leak in', () => {
|
|
54
|
+
const vars = gen.readSheetVars(':root { --ds-dur-fast: 150ms; } @media (prefers-reduced-motion: reduce) { :root { --ds-dur-fast: 0ms; } }');
|
|
55
|
+
assert.equal(vars['--ds-dur-fast'], '150ms');
|
|
56
|
+
});
|