@dataimago/tokens 0.1.0-alpha.30 → 0.1.0-alpha.32
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/dist/index.cjs +88 -0
- package/dist/index.mjs +88 -0
- package/dist/tokens.css +73 -0
- package/dist/tokens.dtcg.json +112 -0
- package/dist/tokens.scss +73 -0
- package/dist/tokens.studio.json +108 -0
- package/dist/tokens.w3c.dtcg.json +141 -0
- package/package.json +1 -1
- package/src/dataviz.json +7 -0
- package/src/effects.json +78 -0
- package/src/theme-colors-p3.json +91 -0
- package/src/theme-colors.json +35 -0
package/dist/index.cjs
CHANGED
|
@@ -41,6 +41,26 @@ const tokens = {
|
|
|
41
41
|
"light": "#f7f7f6",
|
|
42
42
|
"dark": "#1c1917",
|
|
43
43
|
"description": "Code block and inline code background: the card colour (surface.elevated) in both modes, so code reads as a card on the page (2026-11-02; light mode was the warm paper-200 #faf2e3)"
|
|
44
|
+
},
|
|
45
|
+
"scrim": {
|
|
46
|
+
"light": "rgba(20, 20, 16, 0.85)",
|
|
47
|
+
"dark": "rgba(20, 20, 16, 0.85)",
|
|
48
|
+
"description": "Figure viewer backdrop. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Ink-900-ish at 0.85, drawn under a 3px blur; measured composited over the page, on-scrim text is 11.5:1 on the light page and 17.2:1 on the dark (gated by tools/contrast-check.mjs, 2026-11-03)."
|
|
49
|
+
},
|
|
50
|
+
"scrim-solid": {
|
|
51
|
+
"light": "rgba(20, 20, 16, 0.92)",
|
|
52
|
+
"dark": "rgba(20, 20, 16, 0.92)",
|
|
53
|
+
"description": "Figure viewer backdrop where backdrop blur is unavailable (prefers-reduced-transparency, prefers-contrast: more and browsers without backdrop blur): the same ink at 0.92. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Gated by tools/contrast-check.mjs."
|
|
54
|
+
},
|
|
55
|
+
"print": {
|
|
56
|
+
"light": "#f7f7f6",
|
|
57
|
+
"dark": "#f7f7f6",
|
|
58
|
+
"description": "Printed paper: the paper-cover thumbnail, the light slide, the face of a video-play disc. It depicts a physical object (a printed page, a slide), so it is theme-invariant: light and dark carry the same value, and the paper does not darken with the page (the color.border.figure-frame precedent). stone-50, the card colour; the SGPc apps' own #f6f4ee is not a house colour and was mapped onto this step (maintainer decision 2026-11-03). Ink on it is content.on-print, held to 7:1 by tools/contrast-check.mjs."
|
|
59
|
+
},
|
|
60
|
+
"play-disc": {
|
|
61
|
+
"light": "rgba(247, 247, 246, 0.92)",
|
|
62
|
+
"dark": "rgba(247, 247, 246, 0.92)",
|
|
63
|
+
"description": "The video-play disc: surface.print at 0.92 alpha, over a poster frame or poster placeholder. It depicts a physical object, so it is theme-invariant: light and dark carry the same value. Its glyph is content.on-print (no separate token), held to 4.5:1 on the disc composited over each mode's page by tools/contrast-check.mjs, so the disc stays legible in dark mode."
|
|
44
64
|
}
|
|
45
65
|
},
|
|
46
66
|
"border": {
|
|
@@ -73,6 +93,11 @@ const tokens = {
|
|
|
73
93
|
"light": "#d6d3d1",
|
|
74
94
|
"dark": "#292524",
|
|
75
95
|
"description": "Code block border"
|
|
96
|
+
},
|
|
97
|
+
"on-scrim-focus": {
|
|
98
|
+
"light": "#3498DB",
|
|
99
|
+
"dark": "#3498DB",
|
|
100
|
+
"description": "Focus ring on the figure viewer scrim. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). The slate accent's dark-mode value in both modes, because the scrim is dark in both. Held to 3:1 (WCAG 1.4.11) over both scrims and both page modes by tools/contrast-check.mjs."
|
|
76
101
|
}
|
|
77
102
|
},
|
|
78
103
|
"content": {
|
|
@@ -95,6 +120,16 @@ const tokens = {
|
|
|
95
120
|
"light": "#fdf9f2",
|
|
96
121
|
"dark": "#0c0a09",
|
|
97
122
|
"description": "Inverse text — for contrasting backgrounds"
|
|
123
|
+
},
|
|
124
|
+
"on-scrim": {
|
|
125
|
+
"light": "#f7f7f6",
|
|
126
|
+
"dark": "#f7f7f6",
|
|
127
|
+
"description": "Text and controls on the figure viewer scrim (stone-50). Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Held to 7:1 over both scrims and both page modes by tools/contrast-check.mjs."
|
|
128
|
+
},
|
|
129
|
+
"on-print": {
|
|
130
|
+
"light": "#14140f",
|
|
131
|
+
"dark": "#14140f",
|
|
132
|
+
"description": "Ink on surface.print, and the glyph on surface.play-disc (the play triangle takes this token; it has no separate one). stone-900. It depicts printed ink, so it is theme-invariant: light and dark carry the same value (the color.border.figure-frame precedent). Held to 7:1 on surface.print, and 4.5:1 on the play disc composited over each mode's page, by tools/contrast-check.mjs."
|
|
98
133
|
}
|
|
99
134
|
},
|
|
100
135
|
"interactive": {
|
|
@@ -288,6 +323,13 @@ const tokens = {
|
|
|
288
323
|
"value": "#0072B2",
|
|
289
324
|
"description": "= okabe-ito.blue. SGPc growth bucket 5 of 5 (very high) on the ordered scale very low → very high. Colour is never the only channel: pair it with a marker and the bucket letter code. Author decision 2026-11-01, matching the LIwLD paper's figures."
|
|
290
325
|
}
|
|
326
|
+
},
|
|
327
|
+
"map": {
|
|
328
|
+
"ocean": {
|
|
329
|
+
"light": "#808fa7",
|
|
330
|
+
"dark": "#042438",
|
|
331
|
+
"description": "Map-surface ground: the sea on the SGPc globe, behind land, absent countries and bucket-filled shapes. A muted slate blue on light surfaces and a deep blue on dark (maintainer 2026-10-22); not a palette step. The light value moved from #c9e1ec on 2026-11-01, when the Okabe-Ito sky-blue bucket blended into it: #808fa7 sits mid-way in lightness between the two blue buckets and is grey enough to read as sea. Gated by tools/dataviz-check.mjs against the five sgpc-bucket colours and the land neutrals (ink-200 land and ink-100 absent in light; ink-600 land and ink-700 absent in dark) at ΔE2000 ≥ 11.1 under normal vision and deutan, protan and tritan simulation, and the country outline (ink-600 light, ink-300 dark) at ≥ 3:1. Draw country borders in this colour, as gaps between shapes. The dark value moved from the apps' #14232c to #042438 on 2026-11-03 (maintainer): a slightly deeper sea keeps the quiet 'no data' countries (ink-700) distinct from it for protan readers (#14232c was ΔE 6.61 from them). Raised from the SGPc apps (2026-11-03)."
|
|
332
|
+
}
|
|
291
333
|
}
|
|
292
334
|
}
|
|
293
335
|
},
|
|
@@ -402,6 +444,52 @@ const tokens = {
|
|
|
402
444
|
"description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
403
445
|
}
|
|
404
446
|
},
|
|
447
|
+
"gradient": {
|
|
448
|
+
"video-poster": {
|
|
449
|
+
"value": "linear-gradient(135deg, #2b3a4a, #1f2a1f 60%, #3b2f1c)",
|
|
450
|
+
"description": "Video-poster placeholder, shown until a real poster frame exists: a slate-to-green-to-umber diagonal. It depicts a video frame, so it is theme-invariant (the same in light and dark). Its three stops (#2b3a4a, #1f2a1f, #3b2f1c) are a one-off and are NOT palette colours: do not reach for them elsewhere. A CSS gradient string has no clean DTCG mapping, so this token is in tokens.css and the JS exports only and is left out of the W3C DTCG and Tokens Studio exports (the legacy dist/tokens.dtcg.json still carries it). Raised from the SGPc apps (2026-11-03)."
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
"motion": {
|
|
454
|
+
"enter": {
|
|
455
|
+
"value": "200ms",
|
|
456
|
+
"description": "Something arrives: a page fade, tooltip in, chip in, view switch, drawer open, chart marks. Pair with motion.ease-out. Raised from the SGPc apps (2026-11-03), which named it --motion-enter. Within the 300ms motion-dignity ceiling; gated by tools/motion-lint.mjs."
|
|
457
|
+
},
|
|
458
|
+
"exit": {
|
|
459
|
+
"value": "120ms",
|
|
460
|
+
"description": "Something leaves: tooltip out, chip out, drawer close. Shorter than motion.enter, because leaving should not hold the reader. Pair with motion.ease-in; a component that unmounts in script holds the unmount for this long. Raised from the SGPc apps (2026-11-03), which named it --motion-exit."
|
|
461
|
+
},
|
|
462
|
+
"ease-out": {
|
|
463
|
+
"value": "cubic-bezier(0.25, 0.46, 0.45, 0.94)",
|
|
464
|
+
"description": "easeOutQuad, the curve foundations/design/motion-dignity.md names, for entrances: fast at the start, settling gently. Raised from the SGPc apps (2026-11-03), which named it --motion-ease-out."
|
|
465
|
+
},
|
|
466
|
+
"ease-in": {
|
|
467
|
+
"value": "cubic-bezier(0.55, 0.085, 0.68, 0.53)",
|
|
468
|
+
"description": "easeInQuad, for exits: starts gently and leaves quickly. The counterpart of motion.ease-out. Raised from the SGPc apps (2026-11-03), which named it --motion-ease-in."
|
|
469
|
+
},
|
|
470
|
+
"duration": {
|
|
471
|
+
"120": {
|
|
472
|
+
"value": "120ms",
|
|
473
|
+
"description": "Duration scale step, 120ms. Equal to motion.exit."
|
|
474
|
+
},
|
|
475
|
+
"160": {
|
|
476
|
+
"value": "160ms",
|
|
477
|
+
"description": "Duration scale step, 160ms: a hover on a small control, a sheet leaving."
|
|
478
|
+
},
|
|
479
|
+
"200": {
|
|
480
|
+
"value": "200ms",
|
|
481
|
+
"description": "Duration scale step, 200ms. Equal to motion.enter."
|
|
482
|
+
},
|
|
483
|
+
"250": {
|
|
484
|
+
"value": "250ms",
|
|
485
|
+
"description": "Duration scale step, 250ms: a sheet arriving, a grid-column change."
|
|
486
|
+
},
|
|
487
|
+
"300": {
|
|
488
|
+
"value": "300ms",
|
|
489
|
+
"description": "Duration scale step, 300ms: the motion-dignity ceiling. Nothing in the scale is longer, and the motion gate holds every motion.* value to it. A slow ambient entrance is not a token: a wait before an animation is a delay, not motion, and the animation itself stays at or under this step."
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
},
|
|
405
493
|
"card": {
|
|
406
494
|
"background": "surface.elevated",
|
|
407
495
|
"padding": "spacing.component.padding",
|
package/dist/index.mjs
CHANGED
|
@@ -41,6 +41,26 @@ const tokens = {
|
|
|
41
41
|
"light": "#f7f7f6",
|
|
42
42
|
"dark": "#1c1917",
|
|
43
43
|
"description": "Code block and inline code background: the card colour (surface.elevated) in both modes, so code reads as a card on the page (2026-11-02; light mode was the warm paper-200 #faf2e3)"
|
|
44
|
+
},
|
|
45
|
+
"scrim": {
|
|
46
|
+
"light": "rgba(20, 20, 16, 0.85)",
|
|
47
|
+
"dark": "rgba(20, 20, 16, 0.85)",
|
|
48
|
+
"description": "Figure viewer backdrop. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Ink-900-ish at 0.85, drawn under a 3px blur; measured composited over the page, on-scrim text is 11.5:1 on the light page and 17.2:1 on the dark (gated by tools/contrast-check.mjs, 2026-11-03)."
|
|
49
|
+
},
|
|
50
|
+
"scrim-solid": {
|
|
51
|
+
"light": "rgba(20, 20, 16, 0.92)",
|
|
52
|
+
"dark": "rgba(20, 20, 16, 0.92)",
|
|
53
|
+
"description": "Figure viewer backdrop where backdrop blur is unavailable (prefers-reduced-transparency, prefers-contrast: more and browsers without backdrop blur): the same ink at 0.92. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Gated by tools/contrast-check.mjs."
|
|
54
|
+
},
|
|
55
|
+
"print": {
|
|
56
|
+
"light": "#f7f7f6",
|
|
57
|
+
"dark": "#f7f7f6",
|
|
58
|
+
"description": "Printed paper: the paper-cover thumbnail, the light slide, the face of a video-play disc. It depicts a physical object (a printed page, a slide), so it is theme-invariant: light and dark carry the same value, and the paper does not darken with the page (the color.border.figure-frame precedent). stone-50, the card colour; the SGPc apps' own #f6f4ee is not a house colour and was mapped onto this step (maintainer decision 2026-11-03). Ink on it is content.on-print, held to 7:1 by tools/contrast-check.mjs."
|
|
59
|
+
},
|
|
60
|
+
"play-disc": {
|
|
61
|
+
"light": "rgba(247, 247, 246, 0.92)",
|
|
62
|
+
"dark": "rgba(247, 247, 246, 0.92)",
|
|
63
|
+
"description": "The video-play disc: surface.print at 0.92 alpha, over a poster frame or poster placeholder. It depicts a physical object, so it is theme-invariant: light and dark carry the same value. Its glyph is content.on-print (no separate token), held to 4.5:1 on the disc composited over each mode's page by tools/contrast-check.mjs, so the disc stays legible in dark mode."
|
|
44
64
|
}
|
|
45
65
|
},
|
|
46
66
|
"border": {
|
|
@@ -73,6 +93,11 @@ const tokens = {
|
|
|
73
93
|
"light": "#d6d3d1",
|
|
74
94
|
"dark": "#292524",
|
|
75
95
|
"description": "Code block border"
|
|
96
|
+
},
|
|
97
|
+
"on-scrim-focus": {
|
|
98
|
+
"light": "#3498DB",
|
|
99
|
+
"dark": "#3498DB",
|
|
100
|
+
"description": "Focus ring on the figure viewer scrim. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). The slate accent's dark-mode value in both modes, because the scrim is dark in both. Held to 3:1 (WCAG 1.4.11) over both scrims and both page modes by tools/contrast-check.mjs."
|
|
76
101
|
}
|
|
77
102
|
},
|
|
78
103
|
"content": {
|
|
@@ -95,6 +120,16 @@ const tokens = {
|
|
|
95
120
|
"light": "#fdf9f2",
|
|
96
121
|
"dark": "#0c0a09",
|
|
97
122
|
"description": "Inverse text — for contrasting backgrounds"
|
|
123
|
+
},
|
|
124
|
+
"on-scrim": {
|
|
125
|
+
"light": "#f7f7f6",
|
|
126
|
+
"dark": "#f7f7f6",
|
|
127
|
+
"description": "Text and controls on the figure viewer scrim (stone-50). Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Held to 7:1 over both scrims and both page modes by tools/contrast-check.mjs."
|
|
128
|
+
},
|
|
129
|
+
"on-print": {
|
|
130
|
+
"light": "#14140f",
|
|
131
|
+
"dark": "#14140f",
|
|
132
|
+
"description": "Ink on surface.print, and the glyph on surface.play-disc (the play triangle takes this token; it has no separate one). stone-900. It depicts printed ink, so it is theme-invariant: light and dark carry the same value (the color.border.figure-frame precedent). Held to 7:1 on surface.print, and 4.5:1 on the play disc composited over each mode's page, by tools/contrast-check.mjs."
|
|
98
133
|
}
|
|
99
134
|
},
|
|
100
135
|
"interactive": {
|
|
@@ -288,6 +323,13 @@ const tokens = {
|
|
|
288
323
|
"value": "#0072B2",
|
|
289
324
|
"description": "= okabe-ito.blue. SGPc growth bucket 5 of 5 (very high) on the ordered scale very low → very high. Colour is never the only channel: pair it with a marker and the bucket letter code. Author decision 2026-11-01, matching the LIwLD paper's figures."
|
|
290
325
|
}
|
|
326
|
+
},
|
|
327
|
+
"map": {
|
|
328
|
+
"ocean": {
|
|
329
|
+
"light": "#808fa7",
|
|
330
|
+
"dark": "#042438",
|
|
331
|
+
"description": "Map-surface ground: the sea on the SGPc globe, behind land, absent countries and bucket-filled shapes. A muted slate blue on light surfaces and a deep blue on dark (maintainer 2026-10-22); not a palette step. The light value moved from #c9e1ec on 2026-11-01, when the Okabe-Ito sky-blue bucket blended into it: #808fa7 sits mid-way in lightness between the two blue buckets and is grey enough to read as sea. Gated by tools/dataviz-check.mjs against the five sgpc-bucket colours and the land neutrals (ink-200 land and ink-100 absent in light; ink-600 land and ink-700 absent in dark) at ΔE2000 ≥ 11.1 under normal vision and deutan, protan and tritan simulation, and the country outline (ink-600 light, ink-300 dark) at ≥ 3:1. Draw country borders in this colour, as gaps between shapes. The dark value moved from the apps' #14232c to #042438 on 2026-11-03 (maintainer): a slightly deeper sea keeps the quiet 'no data' countries (ink-700) distinct from it for protan readers (#14232c was ΔE 6.61 from them). Raised from the SGPc apps (2026-11-03)."
|
|
332
|
+
}
|
|
291
333
|
}
|
|
292
334
|
}
|
|
293
335
|
},
|
|
@@ -402,6 +444,52 @@ const tokens = {
|
|
|
402
444
|
"description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
403
445
|
}
|
|
404
446
|
},
|
|
447
|
+
"gradient": {
|
|
448
|
+
"video-poster": {
|
|
449
|
+
"value": "linear-gradient(135deg, #2b3a4a, #1f2a1f 60%, #3b2f1c)",
|
|
450
|
+
"description": "Video-poster placeholder, shown until a real poster frame exists: a slate-to-green-to-umber diagonal. It depicts a video frame, so it is theme-invariant (the same in light and dark). Its three stops (#2b3a4a, #1f2a1f, #3b2f1c) are a one-off and are NOT palette colours: do not reach for them elsewhere. A CSS gradient string has no clean DTCG mapping, so this token is in tokens.css and the JS exports only and is left out of the W3C DTCG and Tokens Studio exports (the legacy dist/tokens.dtcg.json still carries it). Raised from the SGPc apps (2026-11-03)."
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
"motion": {
|
|
454
|
+
"enter": {
|
|
455
|
+
"value": "200ms",
|
|
456
|
+
"description": "Something arrives: a page fade, tooltip in, chip in, view switch, drawer open, chart marks. Pair with motion.ease-out. Raised from the SGPc apps (2026-11-03), which named it --motion-enter. Within the 300ms motion-dignity ceiling; gated by tools/motion-lint.mjs."
|
|
457
|
+
},
|
|
458
|
+
"exit": {
|
|
459
|
+
"value": "120ms",
|
|
460
|
+
"description": "Something leaves: tooltip out, chip out, drawer close. Shorter than motion.enter, because leaving should not hold the reader. Pair with motion.ease-in; a component that unmounts in script holds the unmount for this long. Raised from the SGPc apps (2026-11-03), which named it --motion-exit."
|
|
461
|
+
},
|
|
462
|
+
"ease-out": {
|
|
463
|
+
"value": "cubic-bezier(0.25, 0.46, 0.45, 0.94)",
|
|
464
|
+
"description": "easeOutQuad, the curve foundations/design/motion-dignity.md names, for entrances: fast at the start, settling gently. Raised from the SGPc apps (2026-11-03), which named it --motion-ease-out."
|
|
465
|
+
},
|
|
466
|
+
"ease-in": {
|
|
467
|
+
"value": "cubic-bezier(0.55, 0.085, 0.68, 0.53)",
|
|
468
|
+
"description": "easeInQuad, for exits: starts gently and leaves quickly. The counterpart of motion.ease-out. Raised from the SGPc apps (2026-11-03), which named it --motion-ease-in."
|
|
469
|
+
},
|
|
470
|
+
"duration": {
|
|
471
|
+
"120": {
|
|
472
|
+
"value": "120ms",
|
|
473
|
+
"description": "Duration scale step, 120ms. Equal to motion.exit."
|
|
474
|
+
},
|
|
475
|
+
"160": {
|
|
476
|
+
"value": "160ms",
|
|
477
|
+
"description": "Duration scale step, 160ms: a hover on a small control, a sheet leaving."
|
|
478
|
+
},
|
|
479
|
+
"200": {
|
|
480
|
+
"value": "200ms",
|
|
481
|
+
"description": "Duration scale step, 200ms. Equal to motion.enter."
|
|
482
|
+
},
|
|
483
|
+
"250": {
|
|
484
|
+
"value": "250ms",
|
|
485
|
+
"description": "Duration scale step, 250ms: a sheet arriving, a grid-column change."
|
|
486
|
+
},
|
|
487
|
+
"300": {
|
|
488
|
+
"value": "300ms",
|
|
489
|
+
"description": "Duration scale step, 300ms: the motion-dignity ceiling. Nothing in the scale is longer, and the motion gate holds every motion.* value to it. A slow ambient entrance is not a token: a wait before an animation is a delay, not motion, and the animation itself stays at or under this step."
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
},
|
|
405
493
|
"card": {
|
|
406
494
|
"background": "surface.elevated",
|
|
407
495
|
"padding": "spacing.component.padding",
|
package/dist/tokens.css
CHANGED
|
@@ -63,6 +63,16 @@
|
|
|
63
63
|
--transition-standard: 0.25s ease-in-out;
|
|
64
64
|
--transition-smooth: 0.35s ease;
|
|
65
65
|
--transition-logo: 0.3s;
|
|
66
|
+
--gradient-video-poster: linear-gradient(135deg, #2b3a4a, #1f2a1f 60%, #3b2f1c);
|
|
67
|
+
--motion-enter: 200ms;
|
|
68
|
+
--motion-exit: 120ms;
|
|
69
|
+
--motion-ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
70
|
+
--motion-ease-in: cubic-bezier(0.55, 0.085, 0.68, 0.53);
|
|
71
|
+
--motion-duration-120: 120ms;
|
|
72
|
+
--motion-duration-160: 160ms;
|
|
73
|
+
--motion-duration-200: 200ms;
|
|
74
|
+
--motion-duration-250: 250ms;
|
|
75
|
+
--motion-duration-300: 300ms;
|
|
66
76
|
--font-family-sans: Noto Sans, Noto Sans Math, system-ui, sans-serif;
|
|
67
77
|
--font-family-mono: Noto Sans Mono, SF Mono, Monaco, Inconsolata, monospace;
|
|
68
78
|
--font-family-display: var(--font-family-display-editorial);
|
|
@@ -154,6 +164,14 @@
|
|
|
154
164
|
--color-surface-navbar-scrolled: color(display-p3 0.9294 0.9294 0.9223);
|
|
155
165
|
--color-surface-code: #f7f7f6;
|
|
156
166
|
--color-surface-code: color(display-p3 0.9686 0.9686 0.9651);
|
|
167
|
+
--color-surface-scrim: rgba(20, 20, 16, 0.85);
|
|
168
|
+
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
169
|
+
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
170
|
+
--color-surface-scrim-solid: color(display-p3 0.0784 0.0784 0.0643 / 0.92);
|
|
171
|
+
--color-surface-print: #f7f7f6;
|
|
172
|
+
--color-surface-print: color(display-p3 0.9686 0.9686 0.9651);
|
|
173
|
+
--color-surface-play-disc: rgba(247, 247, 246, 0.92);
|
|
174
|
+
--color-surface-play-disc: color(display-p3 0.9686 0.9686 0.9651 / 0.92);
|
|
157
175
|
--color-border-subtle: rgba(12, 10, 9, 0.45);
|
|
158
176
|
--color-border-subtle: color(display-p3 0.0457 0.0395 0.0358 / 0.45);
|
|
159
177
|
--color-border-moderate: rgba(12, 10, 9, 0.60);
|
|
@@ -166,6 +184,8 @@
|
|
|
166
184
|
--color-border-figure-frame: color(display-p3 0.4157 0.4157 0.4157);
|
|
167
185
|
--color-border-code: #d6d3d1;
|
|
168
186
|
--color-border-code: color(display-p3 0.8371 0.8278 0.8205);
|
|
187
|
+
--color-border-on-scrim-focus: #3498db;
|
|
188
|
+
--color-border-on-scrim-focus: color(display-p3 0.3208 0.588 0.8369);
|
|
169
189
|
--color-content-primary: #14140f;
|
|
170
190
|
--color-content-primary: color(display-p3 0.0784 0.0784 0.0608);
|
|
171
191
|
--color-content-secondary: #6a6a6a;
|
|
@@ -174,6 +194,10 @@
|
|
|
174
194
|
--color-content-muted: color(display-p3 0.4345 0.4127 0.3945);
|
|
175
195
|
--color-content-inverse: #fdf9f2;
|
|
176
196
|
--color-content-inverse: color(display-p3 0.9894 0.977 0.9518);
|
|
197
|
+
--color-content-on-scrim: #f7f7f6;
|
|
198
|
+
--color-content-on-scrim: color(display-p3 0.9686 0.9686 0.9651);
|
|
199
|
+
--color-content-on-print: #14140f;
|
|
200
|
+
--color-content-on-print: color(display-p3 0.0784 0.0784 0.0608);
|
|
177
201
|
--color-interactive-primary: #434739;
|
|
178
202
|
--color-interactive-primary: color(display-p3 0.2656 0.2779 0.2287);
|
|
179
203
|
--color-interactive-hover: #363a2e;
|
|
@@ -209,6 +233,12 @@
|
|
|
209
233
|
--shadow-subtle: 0 1px 2px 0 rgb(20 20 16 / 0.05);
|
|
210
234
|
--shadow-moderate: 0 4px 6px -1px rgb(20 20 16 / 0.1);
|
|
211
235
|
--shadow-prominent: 0 10px 15px -3px rgb(20 20 16 / 0.1);
|
|
236
|
+
--shadow-figure-plate-hover: 0 10px 15px -3px rgb(20 20 16 / 0.1);
|
|
237
|
+
--shadow-figure-plate-active: 0 4px 6px -1px rgb(20 20 16 / 0.1);
|
|
238
|
+
--shadow-lift: 0 -8px 24px rgb(20 20 16 / 0.07);
|
|
239
|
+
--shadow-sheet: 0 -8px 24px rgb(0 0 0 / 0.18);
|
|
240
|
+
--shadow-float: 0 1px 2px rgb(20 20 16 / 0.06), 0 4px 14px rgb(20 20 16 / 0.08);
|
|
241
|
+
--shadow-print: 0 1px 3px rgb(0 0 0 / 0.25);
|
|
212
242
|
--border-subtle: rgba(20, 20, 16, 0.47);
|
|
213
243
|
--border-moderate: rgba(20, 20, 16, 0.63);
|
|
214
244
|
--border-focus: #3498DB;
|
|
@@ -219,6 +249,7 @@
|
|
|
219
249
|
--color-dataviz-uncertainty-outer: #D6D6D6;
|
|
220
250
|
--color-dataviz-uncertainty-union: #9E9E9E;
|
|
221
251
|
--color-dataviz-uncertainty-inner: #333333;
|
|
252
|
+
--color-dataviz-map-ocean: #808fa7;
|
|
222
253
|
}
|
|
223
254
|
|
|
224
255
|
[data-bs-theme="dark"] {
|
|
@@ -238,6 +269,14 @@
|
|
|
238
269
|
--color-surface-navbar-scrolled: color(display-p3 0.0784 0.0784 0.0643);
|
|
239
270
|
--color-surface-code: #1c1917;
|
|
240
271
|
--color-surface-code: color(display-p3 0.1078 0.0985 0.0911);
|
|
272
|
+
--color-surface-scrim: rgba(20, 20, 16, 0.85);
|
|
273
|
+
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
274
|
+
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
275
|
+
--color-surface-scrim-solid: color(display-p3 0.0784 0.0784 0.0643 / 0.92);
|
|
276
|
+
--color-surface-print: #f7f7f6;
|
|
277
|
+
--color-surface-print: color(display-p3 0.9686 0.9686 0.9651);
|
|
278
|
+
--color-surface-play-disc: rgba(247, 247, 246, 0.92);
|
|
279
|
+
--color-surface-play-disc: color(display-p3 0.9686 0.9686 0.9651 / 0.92);
|
|
241
280
|
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
242
281
|
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
243
282
|
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
@@ -250,6 +289,8 @@
|
|
|
250
289
|
--color-border-figure-frame: color(display-p3 0.4157 0.4157 0.4157);
|
|
251
290
|
--color-border-code: #292524;
|
|
252
291
|
--color-border-code: color(display-p3 0.1581 0.1456 0.1418);
|
|
292
|
+
--color-border-on-scrim-focus: #3498db;
|
|
293
|
+
--color-border-on-scrim-focus: color(display-p3 0.3208 0.588 0.8369);
|
|
253
294
|
--color-content-primary: #fdf9f2;
|
|
254
295
|
--color-content-primary: color(display-p3 0.9894 0.977 0.9518);
|
|
255
296
|
--color-content-secondary: #a8a29e;
|
|
@@ -258,6 +299,10 @@
|
|
|
258
299
|
--color-content-muted: color(display-p3 0.5325 0.5107 0.4925);
|
|
259
300
|
--color-content-inverse: #0c0a09;
|
|
260
301
|
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
302
|
+
--color-content-on-scrim: #f7f7f6;
|
|
303
|
+
--color-content-on-scrim: color(display-p3 0.9686 0.9686 0.9651);
|
|
304
|
+
--color-content-on-print: #14140f;
|
|
305
|
+
--color-content-on-print: color(display-p3 0.0784 0.0784 0.0608);
|
|
261
306
|
--color-interactive-primary: #98a384;
|
|
262
307
|
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
263
308
|
--color-interactive-hover: #7e8a6b;
|
|
@@ -293,6 +338,12 @@
|
|
|
293
338
|
--shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
|
|
294
339
|
--shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
|
|
295
340
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
341
|
+
--shadow-figure-plate-hover: 0 4px 12px rgb(0 0 0 / 0.5);
|
|
342
|
+
--shadow-figure-plate-active: 0 2px 8px rgb(0 0 0 / 0.35);
|
|
343
|
+
--shadow-lift: 0 -8px 24px rgb(0 0 0 / 0.30);
|
|
344
|
+
--shadow-sheet: 0 -8px 24px rgb(0 0 0 / 0.18);
|
|
345
|
+
--shadow-float: 0 1px 2px rgb(0 0 0 / 0.40), 0 4px 14px rgb(0 0 0 / 0.35);
|
|
346
|
+
--shadow-print: 0 1px 3px rgb(0 0 0 / 0.25);
|
|
296
347
|
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
297
348
|
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
298
349
|
--border-focus: #4FC3F7;
|
|
@@ -303,6 +354,7 @@
|
|
|
303
354
|
--color-dataviz-uncertainty-outer: #333333;
|
|
304
355
|
--color-dataviz-uncertainty-union: #6B6B6B;
|
|
305
356
|
--color-dataviz-uncertainty-inner: #D6D6D6;
|
|
357
|
+
--color-dataviz-map-ocean: #042438;
|
|
306
358
|
}
|
|
307
359
|
|
|
308
360
|
@media (prefers-color-scheme: dark) {
|
|
@@ -323,6 +375,14 @@
|
|
|
323
375
|
--color-surface-navbar-scrolled: color(display-p3 0.0784 0.0784 0.0643);
|
|
324
376
|
--color-surface-code: #1c1917;
|
|
325
377
|
--color-surface-code: color(display-p3 0.1078 0.0985 0.0911);
|
|
378
|
+
--color-surface-scrim: rgba(20, 20, 16, 0.85);
|
|
379
|
+
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
380
|
+
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
381
|
+
--color-surface-scrim-solid: color(display-p3 0.0784 0.0784 0.0643 / 0.92);
|
|
382
|
+
--color-surface-print: #f7f7f6;
|
|
383
|
+
--color-surface-print: color(display-p3 0.9686 0.9686 0.9651);
|
|
384
|
+
--color-surface-play-disc: rgba(247, 247, 246, 0.92);
|
|
385
|
+
--color-surface-play-disc: color(display-p3 0.9686 0.9686 0.9651 / 0.92);
|
|
326
386
|
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
327
387
|
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
328
388
|
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
@@ -335,6 +395,8 @@
|
|
|
335
395
|
--color-border-figure-frame: color(display-p3 0.4157 0.4157 0.4157);
|
|
336
396
|
--color-border-code: #292524;
|
|
337
397
|
--color-border-code: color(display-p3 0.1581 0.1456 0.1418);
|
|
398
|
+
--color-border-on-scrim-focus: #3498db;
|
|
399
|
+
--color-border-on-scrim-focus: color(display-p3 0.3208 0.588 0.8369);
|
|
338
400
|
--color-content-primary: #fdf9f2;
|
|
339
401
|
--color-content-primary: color(display-p3 0.9894 0.977 0.9518);
|
|
340
402
|
--color-content-secondary: #a8a29e;
|
|
@@ -343,6 +405,10 @@
|
|
|
343
405
|
--color-content-muted: color(display-p3 0.5325 0.5107 0.4925);
|
|
344
406
|
--color-content-inverse: #0c0a09;
|
|
345
407
|
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
408
|
+
--color-content-on-scrim: #f7f7f6;
|
|
409
|
+
--color-content-on-scrim: color(display-p3 0.9686 0.9686 0.9651);
|
|
410
|
+
--color-content-on-print: #14140f;
|
|
411
|
+
--color-content-on-print: color(display-p3 0.0784 0.0784 0.0608);
|
|
346
412
|
--color-interactive-primary: #98a384;
|
|
347
413
|
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
348
414
|
--color-interactive-hover: #7e8a6b;
|
|
@@ -378,6 +444,12 @@
|
|
|
378
444
|
--shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
|
|
379
445
|
--shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
|
|
380
446
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
447
|
+
--shadow-figure-plate-hover: 0 4px 12px rgb(0 0 0 / 0.5);
|
|
448
|
+
--shadow-figure-plate-active: 0 2px 8px rgb(0 0 0 / 0.35);
|
|
449
|
+
--shadow-lift: 0 -8px 24px rgb(0 0 0 / 0.30);
|
|
450
|
+
--shadow-sheet: 0 -8px 24px rgb(0 0 0 / 0.18);
|
|
451
|
+
--shadow-float: 0 1px 2px rgb(0 0 0 / 0.40), 0 4px 14px rgb(0 0 0 / 0.35);
|
|
452
|
+
--shadow-print: 0 1px 3px rgb(0 0 0 / 0.25);
|
|
381
453
|
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
382
454
|
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
383
455
|
--border-focus: #4FC3F7;
|
|
@@ -388,5 +460,6 @@
|
|
|
388
460
|
--color-dataviz-uncertainty-outer: #333333;
|
|
389
461
|
--color-dataviz-uncertainty-union: #6B6B6B;
|
|
390
462
|
--color-dataviz-uncertainty-inner: #D6D6D6;
|
|
463
|
+
--color-dataviz-map-ocean: #042438;
|
|
391
464
|
}
|
|
392
465
|
}
|
package/dist/tokens.dtcg.json
CHANGED
|
@@ -64,6 +64,38 @@
|
|
|
64
64
|
},
|
|
65
65
|
"$type": "color",
|
|
66
66
|
"$description": "Code block and inline code background: the card colour (surface.elevated) in both modes, so code reads as a card on the page (2026-11-02; light mode was the warm paper-200 #faf2e3)"
|
|
67
|
+
},
|
|
68
|
+
"scrim": {
|
|
69
|
+
"$value": {
|
|
70
|
+
"light": "rgba(20, 20, 16, 0.85)",
|
|
71
|
+
"dark": "rgba(20, 20, 16, 0.85)"
|
|
72
|
+
},
|
|
73
|
+
"$type": "color",
|
|
74
|
+
"$description": "Figure viewer backdrop. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Ink-900-ish at 0.85, drawn under a 3px blur; measured composited over the page, on-scrim text is 11.5:1 on the light page and 17.2:1 on the dark (gated by tools/contrast-check.mjs, 2026-11-03)."
|
|
75
|
+
},
|
|
76
|
+
"scrim-solid": {
|
|
77
|
+
"$value": {
|
|
78
|
+
"light": "rgba(20, 20, 16, 0.92)",
|
|
79
|
+
"dark": "rgba(20, 20, 16, 0.92)"
|
|
80
|
+
},
|
|
81
|
+
"$type": "color",
|
|
82
|
+
"$description": "Figure viewer backdrop where backdrop blur is unavailable (prefers-reduced-transparency, prefers-contrast: more and browsers without backdrop blur): the same ink at 0.92. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Gated by tools/contrast-check.mjs."
|
|
83
|
+
},
|
|
84
|
+
"print": {
|
|
85
|
+
"$value": {
|
|
86
|
+
"light": "#f7f7f6",
|
|
87
|
+
"dark": "#f7f7f6"
|
|
88
|
+
},
|
|
89
|
+
"$type": "color",
|
|
90
|
+
"$description": "Printed paper: the paper-cover thumbnail, the light slide, the face of a video-play disc. It depicts a physical object (a printed page, a slide), so it is theme-invariant: light and dark carry the same value, and the paper does not darken with the page (the color.border.figure-frame precedent). stone-50, the card colour; the SGPc apps' own #f6f4ee is not a house colour and was mapped onto this step (maintainer decision 2026-11-03). Ink on it is content.on-print, held to 7:1 by tools/contrast-check.mjs."
|
|
91
|
+
},
|
|
92
|
+
"play-disc": {
|
|
93
|
+
"$value": {
|
|
94
|
+
"light": "rgba(247, 247, 246, 0.92)",
|
|
95
|
+
"dark": "rgba(247, 247, 246, 0.92)"
|
|
96
|
+
},
|
|
97
|
+
"$type": "color",
|
|
98
|
+
"$description": "The video-play disc: surface.print at 0.92 alpha, over a poster frame or poster placeholder. It depicts a physical object, so it is theme-invariant: light and dark carry the same value. Its glyph is content.on-print (no separate token), held to 4.5:1 on the disc composited over each mode's page by tools/contrast-check.mjs, so the disc stays legible in dark mode."
|
|
67
99
|
}
|
|
68
100
|
},
|
|
69
101
|
"border": {
|
|
@@ -114,6 +146,14 @@
|
|
|
114
146
|
},
|
|
115
147
|
"$type": "color",
|
|
116
148
|
"$description": "Code block border"
|
|
149
|
+
},
|
|
150
|
+
"on-scrim-focus": {
|
|
151
|
+
"$value": {
|
|
152
|
+
"light": "#3498DB",
|
|
153
|
+
"dark": "#3498DB"
|
|
154
|
+
},
|
|
155
|
+
"$type": "color",
|
|
156
|
+
"$description": "Focus ring on the figure viewer scrim. Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). The slate accent's dark-mode value in both modes, because the scrim is dark in both. Held to 3:1 (WCAG 1.4.11) over both scrims and both page modes by tools/contrast-check.mjs."
|
|
117
157
|
}
|
|
118
158
|
},
|
|
119
159
|
"content": {
|
|
@@ -148,6 +188,22 @@
|
|
|
148
188
|
},
|
|
149
189
|
"$type": "color",
|
|
150
190
|
"$description": "Inverse text — for contrasting backgrounds"
|
|
191
|
+
},
|
|
192
|
+
"on-scrim": {
|
|
193
|
+
"$value": {
|
|
194
|
+
"light": "#f7f7f6",
|
|
195
|
+
"dark": "#f7f7f6"
|
|
196
|
+
},
|
|
197
|
+
"$type": "color",
|
|
198
|
+
"$description": "Text and controls on the figure viewer scrim (stone-50). Mode-invariant: the scrim is dark in both modes, so light and dark carry the same value (the color.border.figure-frame precedent). Held to 7:1 over both scrims and both page modes by tools/contrast-check.mjs."
|
|
199
|
+
},
|
|
200
|
+
"on-print": {
|
|
201
|
+
"$value": {
|
|
202
|
+
"light": "#14140f",
|
|
203
|
+
"dark": "#14140f"
|
|
204
|
+
},
|
|
205
|
+
"$type": "color",
|
|
206
|
+
"$description": "Ink on surface.print, and the glyph on surface.play-disc (the play triangle takes this token; it has no separate one). stone-900. It depicts printed ink, so it is theme-invariant: light and dark carry the same value (the color.border.figure-frame precedent). Held to 7:1 on surface.print, and 4.5:1 on the play disc composited over each mode's page, by tools/contrast-check.mjs."
|
|
151
207
|
}
|
|
152
208
|
},
|
|
153
209
|
"interactive": {
|
|
@@ -433,6 +489,62 @@
|
|
|
433
489
|
"$description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
434
490
|
}
|
|
435
491
|
},
|
|
492
|
+
"gradient": {
|
|
493
|
+
"video-poster": {
|
|
494
|
+
"$value": "linear-gradient(135deg, #2b3a4a, #1f2a1f 60%, #3b2f1c)",
|
|
495
|
+
"$type": "other",
|
|
496
|
+
"$description": "Video-poster placeholder, shown until a real poster frame exists: a slate-to-green-to-umber diagonal. It depicts a video frame, so it is theme-invariant (the same in light and dark). Its three stops (#2b3a4a, #1f2a1f, #3b2f1c) are a one-off and are NOT palette colours: do not reach for them elsewhere. A CSS gradient string has no clean DTCG mapping, so this token is in tokens.css and the JS exports only and is left out of the W3C DTCG and Tokens Studio exports (the legacy dist/tokens.dtcg.json still carries it). Raised from the SGPc apps (2026-11-03)."
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
"motion": {
|
|
500
|
+
"enter": {
|
|
501
|
+
"$value": "200ms",
|
|
502
|
+
"$type": "duration",
|
|
503
|
+
"$description": "Something arrives: a page fade, tooltip in, chip in, view switch, drawer open, chart marks. Pair with motion.ease-out. Raised from the SGPc apps (2026-11-03), which named it --motion-enter. Within the 300ms motion-dignity ceiling; gated by tools/motion-lint.mjs."
|
|
504
|
+
},
|
|
505
|
+
"exit": {
|
|
506
|
+
"$value": "120ms",
|
|
507
|
+
"$type": "duration",
|
|
508
|
+
"$description": "Something leaves: tooltip out, chip out, drawer close. Shorter than motion.enter, because leaving should not hold the reader. Pair with motion.ease-in; a component that unmounts in script holds the unmount for this long. Raised from the SGPc apps (2026-11-03), which named it --motion-exit."
|
|
509
|
+
},
|
|
510
|
+
"ease-out": {
|
|
511
|
+
"$value": "cubic-bezier(0.25, 0.46, 0.45, 0.94)",
|
|
512
|
+
"$type": "other",
|
|
513
|
+
"$description": "easeOutQuad, the curve foundations/design/motion-dignity.md names, for entrances: fast at the start, settling gently. Raised from the SGPc apps (2026-11-03), which named it --motion-ease-out."
|
|
514
|
+
},
|
|
515
|
+
"ease-in": {
|
|
516
|
+
"$value": "cubic-bezier(0.55, 0.085, 0.68, 0.53)",
|
|
517
|
+
"$type": "other",
|
|
518
|
+
"$description": "easeInQuad, for exits: starts gently and leaves quickly. The counterpart of motion.ease-out. Raised from the SGPc apps (2026-11-03), which named it --motion-ease-in."
|
|
519
|
+
},
|
|
520
|
+
"duration": {
|
|
521
|
+
"120": {
|
|
522
|
+
"$value": "120ms",
|
|
523
|
+
"$type": "duration",
|
|
524
|
+
"$description": "Duration scale step, 120ms. Equal to motion.exit."
|
|
525
|
+
},
|
|
526
|
+
"160": {
|
|
527
|
+
"$value": "160ms",
|
|
528
|
+
"$type": "duration",
|
|
529
|
+
"$description": "Duration scale step, 160ms: a hover on a small control, a sheet leaving."
|
|
530
|
+
},
|
|
531
|
+
"200": {
|
|
532
|
+
"$value": "200ms",
|
|
533
|
+
"$type": "duration",
|
|
534
|
+
"$description": "Duration scale step, 200ms. Equal to motion.enter."
|
|
535
|
+
},
|
|
536
|
+
"250": {
|
|
537
|
+
"$value": "250ms",
|
|
538
|
+
"$type": "duration",
|
|
539
|
+
"$description": "Duration scale step, 250ms: a sheet arriving, a grid-column change."
|
|
540
|
+
},
|
|
541
|
+
"300": {
|
|
542
|
+
"$value": "300ms",
|
|
543
|
+
"$type": "duration",
|
|
544
|
+
"$description": "Duration scale step, 300ms: the motion-dignity ceiling. Nothing in the scale is longer, and the motion gate holds every motion.* value to it. A slow ambient entrance is not a token: a wait before an animation is a delay, not motion, and the animation itself stays at or under this step."
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
},
|
|
436
548
|
"card": {
|
|
437
549
|
"background": {
|
|
438
550
|
"$value": "surface.elevated",
|