@dataimago/tokens 0.1.0-alpha.31 → 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 +68 -0
- package/dist/index.mjs +68 -0
- package/dist/tokens.css +43 -0
- package/dist/tokens.dtcg.json +80 -0
- package/dist/tokens.scss +43 -0
- package/dist/tokens.studio.json +76 -0
- package/dist/tokens.w3c.dtcg.json +101 -0
- package/package.json +1 -1
- package/src/dataviz.json +7 -0
- package/src/effects.json +66 -0
- package/src/theme-colors-p3.json +39 -0
- package/src/theme-colors.json +15 -0
package/dist/index.cjs
CHANGED
|
@@ -51,6 +51,16 @@ const tokens = {
|
|
|
51
51
|
"light": "rgba(20, 20, 16, 0.92)",
|
|
52
52
|
"dark": "rgba(20, 20, 16, 0.92)",
|
|
53
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."
|
|
54
64
|
}
|
|
55
65
|
},
|
|
56
66
|
"border": {
|
|
@@ -115,6 +125,11 @@ const tokens = {
|
|
|
115
125
|
"light": "#f7f7f6",
|
|
116
126
|
"dark": "#f7f7f6",
|
|
117
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."
|
|
118
133
|
}
|
|
119
134
|
},
|
|
120
135
|
"interactive": {
|
|
@@ -308,6 +323,13 @@ const tokens = {
|
|
|
308
323
|
"value": "#0072B2",
|
|
309
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."
|
|
310
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
|
+
}
|
|
311
333
|
}
|
|
312
334
|
}
|
|
313
335
|
},
|
|
@@ -422,6 +444,52 @@ const tokens = {
|
|
|
422
444
|
"description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
423
445
|
}
|
|
424
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
|
+
},
|
|
425
493
|
"card": {
|
|
426
494
|
"background": "surface.elevated",
|
|
427
495
|
"padding": "spacing.component.padding",
|
package/dist/index.mjs
CHANGED
|
@@ -51,6 +51,16 @@ const tokens = {
|
|
|
51
51
|
"light": "rgba(20, 20, 16, 0.92)",
|
|
52
52
|
"dark": "rgba(20, 20, 16, 0.92)",
|
|
53
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."
|
|
54
64
|
}
|
|
55
65
|
},
|
|
56
66
|
"border": {
|
|
@@ -115,6 +125,11 @@ const tokens = {
|
|
|
115
125
|
"light": "#f7f7f6",
|
|
116
126
|
"dark": "#f7f7f6",
|
|
117
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."
|
|
118
133
|
}
|
|
119
134
|
},
|
|
120
135
|
"interactive": {
|
|
@@ -308,6 +323,13 @@ const tokens = {
|
|
|
308
323
|
"value": "#0072B2",
|
|
309
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."
|
|
310
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
|
+
}
|
|
311
333
|
}
|
|
312
334
|
}
|
|
313
335
|
},
|
|
@@ -422,6 +444,52 @@ const tokens = {
|
|
|
422
444
|
"description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
423
445
|
}
|
|
424
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
|
+
},
|
|
425
493
|
"card": {
|
|
426
494
|
"background": "surface.elevated",
|
|
427
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);
|
|
@@ -158,6 +168,10 @@
|
|
|
158
168
|
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
159
169
|
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
160
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);
|
|
161
175
|
--color-border-subtle: rgba(12, 10, 9, 0.45);
|
|
162
176
|
--color-border-subtle: color(display-p3 0.0457 0.0395 0.0358 / 0.45);
|
|
163
177
|
--color-border-moderate: rgba(12, 10, 9, 0.60);
|
|
@@ -182,6 +196,8 @@
|
|
|
182
196
|
--color-content-inverse: color(display-p3 0.9894 0.977 0.9518);
|
|
183
197
|
--color-content-on-scrim: #f7f7f6;
|
|
184
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);
|
|
185
201
|
--color-interactive-primary: #434739;
|
|
186
202
|
--color-interactive-primary: color(display-p3 0.2656 0.2779 0.2287);
|
|
187
203
|
--color-interactive-hover: #363a2e;
|
|
@@ -219,6 +235,10 @@
|
|
|
219
235
|
--shadow-prominent: 0 10px 15px -3px rgb(20 20 16 / 0.1);
|
|
220
236
|
--shadow-figure-plate-hover: 0 10px 15px -3px rgb(20 20 16 / 0.1);
|
|
221
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);
|
|
222
242
|
--border-subtle: rgba(20, 20, 16, 0.47);
|
|
223
243
|
--border-moderate: rgba(20, 20, 16, 0.63);
|
|
224
244
|
--border-focus: #3498DB;
|
|
@@ -229,6 +249,7 @@
|
|
|
229
249
|
--color-dataviz-uncertainty-outer: #D6D6D6;
|
|
230
250
|
--color-dataviz-uncertainty-union: #9E9E9E;
|
|
231
251
|
--color-dataviz-uncertainty-inner: #333333;
|
|
252
|
+
--color-dataviz-map-ocean: #808fa7;
|
|
232
253
|
}
|
|
233
254
|
|
|
234
255
|
[data-bs-theme="dark"] {
|
|
@@ -252,6 +273,10 @@
|
|
|
252
273
|
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
253
274
|
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
254
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);
|
|
255
280
|
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
256
281
|
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
257
282
|
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
@@ -276,6 +301,8 @@
|
|
|
276
301
|
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
277
302
|
--color-content-on-scrim: #f7f7f6;
|
|
278
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);
|
|
279
306
|
--color-interactive-primary: #98a384;
|
|
280
307
|
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
281
308
|
--color-interactive-hover: #7e8a6b;
|
|
@@ -313,6 +340,10 @@
|
|
|
313
340
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
314
341
|
--shadow-figure-plate-hover: 0 4px 12px rgb(0 0 0 / 0.5);
|
|
315
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);
|
|
316
347
|
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
317
348
|
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
318
349
|
--border-focus: #4FC3F7;
|
|
@@ -323,6 +354,7 @@
|
|
|
323
354
|
--color-dataviz-uncertainty-outer: #333333;
|
|
324
355
|
--color-dataviz-uncertainty-union: #6B6B6B;
|
|
325
356
|
--color-dataviz-uncertainty-inner: #D6D6D6;
|
|
357
|
+
--color-dataviz-map-ocean: #042438;
|
|
326
358
|
}
|
|
327
359
|
|
|
328
360
|
@media (prefers-color-scheme: dark) {
|
|
@@ -347,6 +379,10 @@
|
|
|
347
379
|
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
348
380
|
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
349
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);
|
|
350
386
|
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
351
387
|
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
352
388
|
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
@@ -371,6 +407,8 @@
|
|
|
371
407
|
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
372
408
|
--color-content-on-scrim: #f7f7f6;
|
|
373
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);
|
|
374
412
|
--color-interactive-primary: #98a384;
|
|
375
413
|
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
376
414
|
--color-interactive-hover: #7e8a6b;
|
|
@@ -408,6 +446,10 @@
|
|
|
408
446
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
409
447
|
--shadow-figure-plate-hover: 0 4px 12px rgb(0 0 0 / 0.5);
|
|
410
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);
|
|
411
453
|
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
412
454
|
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
413
455
|
--border-focus: #4FC3F7;
|
|
@@ -418,5 +460,6 @@
|
|
|
418
460
|
--color-dataviz-uncertainty-outer: #333333;
|
|
419
461
|
--color-dataviz-uncertainty-union: #6B6B6B;
|
|
420
462
|
--color-dataviz-uncertainty-inner: #D6D6D6;
|
|
463
|
+
--color-dataviz-map-ocean: #042438;
|
|
421
464
|
}
|
|
422
465
|
}
|
package/dist/tokens.dtcg.json
CHANGED
|
@@ -80,6 +80,22 @@
|
|
|
80
80
|
},
|
|
81
81
|
"$type": "color",
|
|
82
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."
|
|
83
99
|
}
|
|
84
100
|
},
|
|
85
101
|
"border": {
|
|
@@ -180,6 +196,14 @@
|
|
|
180
196
|
},
|
|
181
197
|
"$type": "color",
|
|
182
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."
|
|
183
207
|
}
|
|
184
208
|
},
|
|
185
209
|
"interactive": {
|
|
@@ -465,6 +489,62 @@
|
|
|
465
489
|
"$description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
466
490
|
}
|
|
467
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
|
+
},
|
|
468
548
|
"card": {
|
|
469
549
|
"background": {
|
|
470
550
|
"$value": "surface.elevated",
|
package/dist/tokens.scss
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);
|
|
@@ -158,6 +168,10 @@
|
|
|
158
168
|
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
159
169
|
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
160
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);
|
|
161
175
|
--color-border-subtle: rgba(12, 10, 9, 0.45);
|
|
162
176
|
--color-border-subtle: color(display-p3 0.0457 0.0395 0.0358 / 0.45);
|
|
163
177
|
--color-border-moderate: rgba(12, 10, 9, 0.60);
|
|
@@ -182,6 +196,8 @@
|
|
|
182
196
|
--color-content-inverse: color(display-p3 0.9894 0.977 0.9518);
|
|
183
197
|
--color-content-on-scrim: #f7f7f6;
|
|
184
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);
|
|
185
201
|
--color-interactive-primary: #434739;
|
|
186
202
|
--color-interactive-primary: color(display-p3 0.2656 0.2779 0.2287);
|
|
187
203
|
--color-interactive-hover: #363a2e;
|
|
@@ -219,6 +235,10 @@
|
|
|
219
235
|
--shadow-prominent: 0 10px 15px -3px rgb(20 20 16 / 0.1);
|
|
220
236
|
--shadow-figure-plate-hover: 0 10px 15px -3px rgb(20 20 16 / 0.1);
|
|
221
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);
|
|
222
242
|
--border-subtle: rgba(20, 20, 16, 0.47);
|
|
223
243
|
--border-moderate: rgba(20, 20, 16, 0.63);
|
|
224
244
|
--border-focus: #3498DB;
|
|
@@ -229,6 +249,7 @@
|
|
|
229
249
|
--color-dataviz-uncertainty-outer: #D6D6D6;
|
|
230
250
|
--color-dataviz-uncertainty-union: #9E9E9E;
|
|
231
251
|
--color-dataviz-uncertainty-inner: #333333;
|
|
252
|
+
--color-dataviz-map-ocean: #808fa7;
|
|
232
253
|
}
|
|
233
254
|
|
|
234
255
|
[data-bs-theme="dark"] {
|
|
@@ -252,6 +273,10 @@
|
|
|
252
273
|
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
253
274
|
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
254
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);
|
|
255
280
|
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
256
281
|
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
257
282
|
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
@@ -276,6 +301,8 @@
|
|
|
276
301
|
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
277
302
|
--color-content-on-scrim: #f7f7f6;
|
|
278
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);
|
|
279
306
|
--color-interactive-primary: #98a384;
|
|
280
307
|
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
281
308
|
--color-interactive-hover: #7e8a6b;
|
|
@@ -313,6 +340,10 @@
|
|
|
313
340
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
314
341
|
--shadow-figure-plate-hover: 0 4px 12px rgb(0 0 0 / 0.5);
|
|
315
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);
|
|
316
347
|
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
317
348
|
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
318
349
|
--border-focus: #4FC3F7;
|
|
@@ -323,6 +354,7 @@
|
|
|
323
354
|
--color-dataviz-uncertainty-outer: #333333;
|
|
324
355
|
--color-dataviz-uncertainty-union: #6B6B6B;
|
|
325
356
|
--color-dataviz-uncertainty-inner: #D6D6D6;
|
|
357
|
+
--color-dataviz-map-ocean: #042438;
|
|
326
358
|
}
|
|
327
359
|
|
|
328
360
|
@media (prefers-color-scheme: dark) {
|
|
@@ -347,6 +379,10 @@
|
|
|
347
379
|
--color-surface-scrim: color(display-p3 0.0784 0.0784 0.0643 / 0.85);
|
|
348
380
|
--color-surface-scrim-solid: rgba(20, 20, 16, 0.92);
|
|
349
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);
|
|
350
386
|
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
351
387
|
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
352
388
|
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
@@ -371,6 +407,8 @@
|
|
|
371
407
|
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
372
408
|
--color-content-on-scrim: #f7f7f6;
|
|
373
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);
|
|
374
412
|
--color-interactive-primary: #98a384;
|
|
375
413
|
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
376
414
|
--color-interactive-hover: #7e8a6b;
|
|
@@ -408,6 +446,10 @@
|
|
|
408
446
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
409
447
|
--shadow-figure-plate-hover: 0 4px 12px rgb(0 0 0 / 0.5);
|
|
410
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);
|
|
411
453
|
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
412
454
|
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
413
455
|
--border-focus: #4FC3F7;
|
|
@@ -418,5 +460,6 @@
|
|
|
418
460
|
--color-dataviz-uncertainty-outer: #333333;
|
|
419
461
|
--color-dataviz-uncertainty-union: #6B6B6B;
|
|
420
462
|
--color-dataviz-uncertainty-inner: #D6D6D6;
|
|
463
|
+
--color-dataviz-map-ocean: #042438;
|
|
421
464
|
}
|
|
422
465
|
}
|
package/dist/tokens.studio.json
CHANGED
|
@@ -41,6 +41,14 @@
|
|
|
41
41
|
"scrim-solid": {
|
|
42
42
|
"value": "rgba(20, 20, 16, 0.92)",
|
|
43
43
|
"type": "color"
|
|
44
|
+
},
|
|
45
|
+
"print": {
|
|
46
|
+
"value": "#f7f7f6",
|
|
47
|
+
"type": "color"
|
|
48
|
+
},
|
|
49
|
+
"play-disc": {
|
|
50
|
+
"value": "rgba(247, 247, 246, 0.92)",
|
|
51
|
+
"type": "color"
|
|
44
52
|
}
|
|
45
53
|
},
|
|
46
54
|
"border": {
|
|
@@ -93,6 +101,10 @@
|
|
|
93
101
|
"on-scrim": {
|
|
94
102
|
"value": "#f7f7f6",
|
|
95
103
|
"type": "color"
|
|
104
|
+
},
|
|
105
|
+
"on-print": {
|
|
106
|
+
"value": "#14140f",
|
|
107
|
+
"type": "color"
|
|
96
108
|
}
|
|
97
109
|
},
|
|
98
110
|
"interactive": {
|
|
@@ -273,6 +285,12 @@
|
|
|
273
285
|
"value": "#0072B2",
|
|
274
286
|
"type": "color"
|
|
275
287
|
}
|
|
288
|
+
},
|
|
289
|
+
"map": {
|
|
290
|
+
"ocean": {
|
|
291
|
+
"value": "#808fa7",
|
|
292
|
+
"type": "color"
|
|
293
|
+
}
|
|
276
294
|
}
|
|
277
295
|
}
|
|
278
296
|
},
|
|
@@ -326,6 +344,46 @@
|
|
|
326
344
|
"type": "duration"
|
|
327
345
|
}
|
|
328
346
|
},
|
|
347
|
+
"motion": {
|
|
348
|
+
"enter": {
|
|
349
|
+
"value": "200ms",
|
|
350
|
+
"type": "duration"
|
|
351
|
+
},
|
|
352
|
+
"exit": {
|
|
353
|
+
"value": "120ms",
|
|
354
|
+
"type": "duration"
|
|
355
|
+
},
|
|
356
|
+
"ease-out": {
|
|
357
|
+
"value": "cubic-bezier(0.25, 0.46, 0.45, 0.94)",
|
|
358
|
+
"type": "other"
|
|
359
|
+
},
|
|
360
|
+
"ease-in": {
|
|
361
|
+
"value": "cubic-bezier(0.55, 0.085, 0.68, 0.53)",
|
|
362
|
+
"type": "other"
|
|
363
|
+
},
|
|
364
|
+
"duration": {
|
|
365
|
+
"120": {
|
|
366
|
+
"value": "120ms",
|
|
367
|
+
"type": "duration"
|
|
368
|
+
},
|
|
369
|
+
"160": {
|
|
370
|
+
"value": "160ms",
|
|
371
|
+
"type": "duration"
|
|
372
|
+
},
|
|
373
|
+
"200": {
|
|
374
|
+
"value": "200ms",
|
|
375
|
+
"type": "duration"
|
|
376
|
+
},
|
|
377
|
+
"250": {
|
|
378
|
+
"value": "250ms",
|
|
379
|
+
"type": "duration"
|
|
380
|
+
},
|
|
381
|
+
"300": {
|
|
382
|
+
"value": "300ms",
|
|
383
|
+
"type": "duration"
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
},
|
|
329
387
|
"font": {
|
|
330
388
|
"family": {
|
|
331
389
|
"sans": {
|
|
@@ -593,6 +651,14 @@
|
|
|
593
651
|
"scrim-solid": {
|
|
594
652
|
"value": "rgba(20, 20, 16, 0.92)",
|
|
595
653
|
"type": "color"
|
|
654
|
+
},
|
|
655
|
+
"print": {
|
|
656
|
+
"value": "#f7f7f6",
|
|
657
|
+
"type": "color"
|
|
658
|
+
},
|
|
659
|
+
"play-disc": {
|
|
660
|
+
"value": "rgba(247, 247, 246, 0.92)",
|
|
661
|
+
"type": "color"
|
|
596
662
|
}
|
|
597
663
|
},
|
|
598
664
|
"border": {
|
|
@@ -645,6 +711,10 @@
|
|
|
645
711
|
"on-scrim": {
|
|
646
712
|
"value": "#f7f7f6",
|
|
647
713
|
"type": "color"
|
|
714
|
+
},
|
|
715
|
+
"on-print": {
|
|
716
|
+
"value": "#14140f",
|
|
717
|
+
"type": "color"
|
|
648
718
|
}
|
|
649
719
|
},
|
|
650
720
|
"interactive": {
|
|
@@ -739,6 +809,12 @@
|
|
|
739
809
|
"value": "#D6D6D6",
|
|
740
810
|
"type": "color"
|
|
741
811
|
}
|
|
812
|
+
},
|
|
813
|
+
"map": {
|
|
814
|
+
"ocean": {
|
|
815
|
+
"value": "#042438",
|
|
816
|
+
"type": "color"
|
|
817
|
+
}
|
|
742
818
|
}
|
|
743
819
|
}
|
|
744
820
|
},
|
|
@@ -100,6 +100,26 @@
|
|
|
100
100
|
}
|
|
101
101
|
},
|
|
102
102
|
"$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."
|
|
103
|
+
},
|
|
104
|
+
"print": {
|
|
105
|
+
"$value": "#f7f7f6",
|
|
106
|
+
"$type": "color",
|
|
107
|
+
"$extensions": {
|
|
108
|
+
"com.dataimago.theme": {
|
|
109
|
+
"dark": "#f7f7f6"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"$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."
|
|
113
|
+
},
|
|
114
|
+
"play-disc": {
|
|
115
|
+
"$value": "rgba(247, 247, 246, 0.92)",
|
|
116
|
+
"$type": "color",
|
|
117
|
+
"$extensions": {
|
|
118
|
+
"com.dataimago.theme": {
|
|
119
|
+
"dark": "rgba(247, 247, 246, 0.92)"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"$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."
|
|
103
123
|
}
|
|
104
124
|
},
|
|
105
125
|
"border": {
|
|
@@ -224,6 +244,16 @@
|
|
|
224
244
|
}
|
|
225
245
|
},
|
|
226
246
|
"$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."
|
|
247
|
+
},
|
|
248
|
+
"on-print": {
|
|
249
|
+
"$value": "#14140f",
|
|
250
|
+
"$type": "color",
|
|
251
|
+
"$extensions": {
|
|
252
|
+
"com.dataimago.theme": {
|
|
253
|
+
"dark": "#14140f"
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
"$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."
|
|
227
257
|
}
|
|
228
258
|
},
|
|
229
259
|
"interactive": {
|
|
@@ -535,6 +565,18 @@
|
|
|
535
565
|
"$type": "color",
|
|
536
566
|
"$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."
|
|
537
567
|
}
|
|
568
|
+
},
|
|
569
|
+
"map": {
|
|
570
|
+
"ocean": {
|
|
571
|
+
"$value": "#808fa7",
|
|
572
|
+
"$type": "color",
|
|
573
|
+
"$extensions": {
|
|
574
|
+
"com.dataimago.theme": {
|
|
575
|
+
"dark": "#042438"
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
"$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)."
|
|
579
|
+
}
|
|
538
580
|
}
|
|
539
581
|
}
|
|
540
582
|
},
|
|
@@ -606,6 +648,65 @@
|
|
|
606
648
|
"$description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
607
649
|
}
|
|
608
650
|
},
|
|
651
|
+
"motion": {
|
|
652
|
+
"enter": {
|
|
653
|
+
"$value": "200ms",
|
|
654
|
+
"$type": "duration",
|
|
655
|
+
"$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."
|
|
656
|
+
},
|
|
657
|
+
"exit": {
|
|
658
|
+
"$value": "120ms",
|
|
659
|
+
"$type": "duration",
|
|
660
|
+
"$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."
|
|
661
|
+
},
|
|
662
|
+
"ease-out": {
|
|
663
|
+
"$value": [
|
|
664
|
+
0.25,
|
|
665
|
+
0.46,
|
|
666
|
+
0.45,
|
|
667
|
+
0.94
|
|
668
|
+
],
|
|
669
|
+
"$type": "cubicBezier",
|
|
670
|
+
"$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."
|
|
671
|
+
},
|
|
672
|
+
"ease-in": {
|
|
673
|
+
"$value": [
|
|
674
|
+
0.55,
|
|
675
|
+
0.085,
|
|
676
|
+
0.68,
|
|
677
|
+
0.53
|
|
678
|
+
],
|
|
679
|
+
"$type": "cubicBezier",
|
|
680
|
+
"$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."
|
|
681
|
+
},
|
|
682
|
+
"duration": {
|
|
683
|
+
"120": {
|
|
684
|
+
"$value": "120ms",
|
|
685
|
+
"$type": "duration",
|
|
686
|
+
"$description": "Duration scale step, 120ms. Equal to motion.exit."
|
|
687
|
+
},
|
|
688
|
+
"160": {
|
|
689
|
+
"$value": "160ms",
|
|
690
|
+
"$type": "duration",
|
|
691
|
+
"$description": "Duration scale step, 160ms: a hover on a small control, a sheet leaving."
|
|
692
|
+
},
|
|
693
|
+
"200": {
|
|
694
|
+
"$value": "200ms",
|
|
695
|
+
"$type": "duration",
|
|
696
|
+
"$description": "Duration scale step, 200ms. Equal to motion.enter."
|
|
697
|
+
},
|
|
698
|
+
"250": {
|
|
699
|
+
"$value": "250ms",
|
|
700
|
+
"$type": "duration",
|
|
701
|
+
"$description": "Duration scale step, 250ms: a sheet arriving, a grid-column change."
|
|
702
|
+
},
|
|
703
|
+
"300": {
|
|
704
|
+
"$value": "300ms",
|
|
705
|
+
"$type": "duration",
|
|
706
|
+
"$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."
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
},
|
|
609
710
|
"font": {
|
|
610
711
|
"family": {
|
|
611
712
|
"sans": {
|
package/package.json
CHANGED
package/src/dataviz.json
CHANGED
|
@@ -109,6 +109,13 @@
|
|
|
109
109
|
"value": "#0072B2",
|
|
110
110
|
"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."
|
|
111
111
|
}
|
|
112
|
+
},
|
|
113
|
+
"map": {
|
|
114
|
+
"ocean": {
|
|
115
|
+
"light": "#808fa7",
|
|
116
|
+
"dark": "#042438",
|
|
117
|
+
"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)."
|
|
118
|
+
}
|
|
112
119
|
}
|
|
113
120
|
}
|
|
114
121
|
}
|
package/src/effects.json
CHANGED
|
@@ -26,6 +26,26 @@
|
|
|
26
26
|
"dark": "0 2px 8px rgb(0 0 0 / 0.35)",
|
|
27
27
|
"description": "Figure plate while pressed. Light mode is the moderate shadow; dark mode is a plain black shadow for the same reason as figure-plate.hover. Not mode-invariant."
|
|
28
28
|
}
|
|
29
|
+
},
|
|
30
|
+
"lift": {
|
|
31
|
+
"light": "0 -8px 24px rgb(20 20 16 / 0.07)",
|
|
32
|
+
"dark": "0 -8px 24px rgb(0 0 0 / 0.30)",
|
|
33
|
+
"description": "Upward panel lift: a lower panel rising over the section above it, e.g. the landing's lower panel over the globe during the section wipe. Every other shadow here falls downward. Light is ink-900-ish at 0.07 (the apps wrote rgb(28 25 23), normalised to the house base rgb(20 20 16)); dark is plain black at 0.30 because a light-ink glow (as in shadow.prominent) would haze the dark page above the panel. The dark value is a controller call, not measured. Raised from the SGPc apps (2026-11-03)."
|
|
34
|
+
},
|
|
35
|
+
"sheet": {
|
|
36
|
+
"light": "0 -8px 24px rgb(0 0 0 / 0.18)",
|
|
37
|
+
"dark": "0 -8px 24px rgb(0 0 0 / 0.18)",
|
|
38
|
+
"description": "Upward shadow for a bottom sheet (the map details panel on a narrow screen). Plain black at 0.18 in both modes: a sheet is a physical layer over the page, so light and dark carry the same value. Raised from the SGPc apps (2026-11-03)."
|
|
39
|
+
},
|
|
40
|
+
"float": {
|
|
41
|
+
"light": "0 1px 2px rgb(20 20 16 / 0.06), 0 4px 14px rgb(20 20 16 / 0.08)",
|
|
42
|
+
"dark": "0 1px 2px rgb(0 0 0 / 0.40), 0 4px 14px rgb(0 0 0 / 0.35)",
|
|
43
|
+
"description": "Floating control: a small disc standing off the page, e.g. the landing's scroll chevron. Two layers, a tight contact shadow and a soft spread. Pair it with a hairline outline, because a shadow alone does not read in dark mode. Light is the apps' value normalised to rgb(20 20 16); dark is plain black, stronger (0.40 and 0.35) so the layers still read on a dark page, a controller call, not measured. Raised from the SGPc apps (2026-11-03)."
|
|
44
|
+
},
|
|
45
|
+
"print": {
|
|
46
|
+
"light": "0 1px 3px rgb(0 0 0 / 0.25)",
|
|
47
|
+
"dark": "0 1px 3px rgb(0 0 0 / 0.25)",
|
|
48
|
+
"description": "Paper drop shadow under a printed-paper object, e.g. the paper-cover thumbnail on color.surface.print. It depicts a physical object, so it is theme-invariant: the same in light and dark. Raised from the SGPc apps (2026-11-03)."
|
|
29
49
|
}
|
|
30
50
|
},
|
|
31
51
|
"border": {
|
|
@@ -62,5 +82,51 @@
|
|
|
62
82
|
"value": "0.3s",
|
|
63
83
|
"description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
|
|
64
84
|
}
|
|
85
|
+
},
|
|
86
|
+
"gradient": {
|
|
87
|
+
"video-poster": {
|
|
88
|
+
"value": "linear-gradient(135deg, #2b3a4a, #1f2a1f 60%, #3b2f1c)",
|
|
89
|
+
"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)."
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"motion": {
|
|
93
|
+
"enter": {
|
|
94
|
+
"value": "200ms",
|
|
95
|
+
"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."
|
|
96
|
+
},
|
|
97
|
+
"exit": {
|
|
98
|
+
"value": "120ms",
|
|
99
|
+
"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."
|
|
100
|
+
},
|
|
101
|
+
"ease-out": {
|
|
102
|
+
"value": "cubic-bezier(0.25, 0.46, 0.45, 0.94)",
|
|
103
|
+
"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."
|
|
104
|
+
},
|
|
105
|
+
"ease-in": {
|
|
106
|
+
"value": "cubic-bezier(0.55, 0.085, 0.68, 0.53)",
|
|
107
|
+
"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."
|
|
108
|
+
},
|
|
109
|
+
"duration": {
|
|
110
|
+
"120": {
|
|
111
|
+
"value": "120ms",
|
|
112
|
+
"description": "Duration scale step, 120ms. Equal to motion.exit."
|
|
113
|
+
},
|
|
114
|
+
"160": {
|
|
115
|
+
"value": "160ms",
|
|
116
|
+
"description": "Duration scale step, 160ms: a hover on a small control, a sheet leaving."
|
|
117
|
+
},
|
|
118
|
+
"200": {
|
|
119
|
+
"value": "200ms",
|
|
120
|
+
"description": "Duration scale step, 200ms. Equal to motion.enter."
|
|
121
|
+
},
|
|
122
|
+
"250": {
|
|
123
|
+
"value": "250ms",
|
|
124
|
+
"description": "Duration scale step, 250ms: a sheet arriving, a grid-column change."
|
|
125
|
+
},
|
|
126
|
+
"300": {
|
|
127
|
+
"value": "300ms",
|
|
128
|
+
"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."
|
|
129
|
+
}
|
|
130
|
+
}
|
|
65
131
|
}
|
|
66
132
|
}
|
package/src/theme-colors-p3.json
CHANGED
|
@@ -130,6 +130,32 @@
|
|
|
130
130
|
"p3": "color(display-p3 0.0784 0.0784 0.0643 / 0.92)"
|
|
131
131
|
},
|
|
132
132
|
"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."
|
|
133
|
+
},
|
|
134
|
+
"print": {
|
|
135
|
+
"light": {
|
|
136
|
+
"srgb": "#f7f7f6",
|
|
137
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
138
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
139
|
+
},
|
|
140
|
+
"dark": {
|
|
141
|
+
"srgb": "#f7f7f6",
|
|
142
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
143
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
144
|
+
},
|
|
145
|
+
"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."
|
|
146
|
+
},
|
|
147
|
+
"play-disc": {
|
|
148
|
+
"light": {
|
|
149
|
+
"srgb": "rgba(247, 247, 246, 0.92)",
|
|
150
|
+
"oklch": "oklch(97.59% 0.0013 106.42 / 0.92)",
|
|
151
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651 / 0.92)"
|
|
152
|
+
},
|
|
153
|
+
"dark": {
|
|
154
|
+
"srgb": "rgba(247, 247, 246, 0.92)",
|
|
155
|
+
"oklch": "oklch(97.59% 0.0013 106.42 / 0.92)",
|
|
156
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651 / 0.92)"
|
|
157
|
+
},
|
|
158
|
+
"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."
|
|
133
159
|
}
|
|
134
160
|
},
|
|
135
161
|
"border": {
|
|
@@ -290,6 +316,19 @@
|
|
|
290
316
|
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
291
317
|
},
|
|
292
318
|
"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."
|
|
319
|
+
},
|
|
320
|
+
"on-print": {
|
|
321
|
+
"light": {
|
|
322
|
+
"srgb": "#14140f",
|
|
323
|
+
"oklch": "oklch(18.93% 0.0098 107.3)",
|
|
324
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0608)"
|
|
325
|
+
},
|
|
326
|
+
"dark": {
|
|
327
|
+
"srgb": "#14140f",
|
|
328
|
+
"oklch": "oklch(18.93% 0.0098 107.3)",
|
|
329
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0608)"
|
|
330
|
+
},
|
|
331
|
+
"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."
|
|
293
332
|
}
|
|
294
333
|
},
|
|
295
334
|
"interactive": {
|
package/src/theme-colors.json
CHANGED
|
@@ -50,6 +50,16 @@
|
|
|
50
50
|
"light": "rgba(20, 20, 16, 0.92)",
|
|
51
51
|
"dark": "rgba(20, 20, 16, 0.92)",
|
|
52
52
|
"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."
|
|
53
|
+
},
|
|
54
|
+
"print": {
|
|
55
|
+
"light": "#f7f7f6",
|
|
56
|
+
"dark": "#f7f7f6",
|
|
57
|
+
"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."
|
|
58
|
+
},
|
|
59
|
+
"play-disc": {
|
|
60
|
+
"light": "rgba(247, 247, 246, 0.92)",
|
|
61
|
+
"dark": "rgba(247, 247, 246, 0.92)",
|
|
62
|
+
"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."
|
|
53
63
|
}
|
|
54
64
|
},
|
|
55
65
|
"border": {
|
|
@@ -114,6 +124,11 @@
|
|
|
114
124
|
"light": "#f7f7f6",
|
|
115
125
|
"dark": "#f7f7f6",
|
|
116
126
|
"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."
|
|
127
|
+
},
|
|
128
|
+
"on-print": {
|
|
129
|
+
"light": "#14140f",
|
|
130
|
+
"dark": "#14140f",
|
|
131
|
+
"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."
|
|
117
132
|
}
|
|
118
133
|
},
|
|
119
134
|
"interactive": {
|