@dataimago/tokens 0.1.0-alpha.4 → 0.1.0-alpha.48
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/README.md +15 -4
- package/dist/index.cjs +318 -37
- package/dist/index.mjs +318 -37
- package/dist/tokens.css +289 -41
- package/dist/tokens.dtcg.json +884 -0
- package/dist/tokens.scss +289 -41
- package/dist/tokens.studio.json +889 -0
- package/dist/tokens.w3c.dtcg.json +1084 -0
- package/package.json +5 -2
- package/src/README.md +40 -156
- package/src/colors.json +8 -8
- package/src/dataviz.json +136 -0
- package/src/effects.json +85 -7
- package/src/theme-colors-p3.json +555 -0
- package/src/theme-colors.json +124 -21
- package/src/typography.json +10 -10
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
{
|
|
2
|
+
"color": {
|
|
3
|
+
"surface": {
|
|
4
|
+
"page": {
|
|
5
|
+
"light": {
|
|
6
|
+
"srgb": "#ededeb",
|
|
7
|
+
"oklch": "oklch(94.55% 0.0027 106.45)",
|
|
8
|
+
"p3": "color(display-p3 0.9294 0.9294 0.9223)"
|
|
9
|
+
},
|
|
10
|
+
"dark": {
|
|
11
|
+
"srgb": "#141410",
|
|
12
|
+
"oklch": "oklch(18.97% 0.0078 107.13)",
|
|
13
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643)"
|
|
14
|
+
},
|
|
15
|
+
"description": "Main page background — warm-grey (light) / ink-900 (dark)"
|
|
16
|
+
},
|
|
17
|
+
"page-scrolled": {
|
|
18
|
+
"light": {
|
|
19
|
+
"srgb": "#ededeb",
|
|
20
|
+
"oklch": "oklch(94.55% 0.0027 106.45)",
|
|
21
|
+
"p3": "color(display-p3 0.9294 0.9294 0.9223)"
|
|
22
|
+
},
|
|
23
|
+
"dark": {
|
|
24
|
+
"srgb": "#141410",
|
|
25
|
+
"oklch": "oklch(18.97% 0.0078 107.13)",
|
|
26
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643)"
|
|
27
|
+
},
|
|
28
|
+
"description": "Page background when navbar shrinks — matches page"
|
|
29
|
+
},
|
|
30
|
+
"elevated": {
|
|
31
|
+
"light": {
|
|
32
|
+
"srgb": "#f7f7f6",
|
|
33
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
34
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
35
|
+
},
|
|
36
|
+
"dark": {
|
|
37
|
+
"srgb": "#1c1917",
|
|
38
|
+
"oklch": "oklch(21.61% 0.0061 56.04)",
|
|
39
|
+
"p3": "color(display-p3 0.1078 0.0985 0.0911)"
|
|
40
|
+
},
|
|
41
|
+
"description": "Cards, modals, dropdowns — one step above page (stone-50 on stone-100 / ink-800 on stone-900-aligned dark)"
|
|
42
|
+
},
|
|
43
|
+
"figure-plate": {
|
|
44
|
+
"light": {
|
|
45
|
+
"srgb": "#f7f7f6",
|
|
46
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
47
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
48
|
+
},
|
|
49
|
+
"dark": {
|
|
50
|
+
"srgb": "#dcdcda",
|
|
51
|
+
"oklch": "oklch(89.39% 0.0027 106.45)",
|
|
52
|
+
"p3": "color(display-p3 0.8627 0.8627 0.8556)"
|
|
53
|
+
},
|
|
54
|
+
"description": "Figure plate: the ground a .box figure sits on, in HTML (figure img.box, the figure modal) and the PDF (di-figure-plate). Figures are dark ink and Okabe-Ito colours drawn for a light ground, so the plate stays light in dark mode, dimmed one step to cut glare: stone-50 (light) / stone-200 (dark). Dark-mode plate #dcdcda: dark ink 13.5:1, okabe-ito blue 3.8, vermillion 2.8, bluish-green 2.5, reddish-purple 2.2, sky-blue 1.7, orange 1.6 (the light plate's 4.8/3.6/3.2/2.9/2.2/2.1); the light content.secondary frame 3.9:1 on it. Hue separation is checked plate-independently by the data-viz colour-blind gate. Maintainer decision 2026-11-01 (dimmed light plate); a 42%-white mix over the dark page (#777774) was rejected (colours ~1.2:1)."
|
|
55
|
+
},
|
|
56
|
+
"sunken": {
|
|
57
|
+
"light": {
|
|
58
|
+
"srgb": "#f7f7f6",
|
|
59
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
60
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
61
|
+
},
|
|
62
|
+
"dark": {
|
|
63
|
+
"srgb": "#0c0a09",
|
|
64
|
+
"oklch": "oklch(14.69% 0.0041 49.25)",
|
|
65
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358)"
|
|
66
|
+
},
|
|
67
|
+
"description": "Input fields and insets. Light: the card colour, stone-50 (since 2026-11-02; it was the warm paper-200 #faf2e3). Dark: ink-900, below the page. Code blocks use surface.code."
|
|
68
|
+
},
|
|
69
|
+
"navbar": {
|
|
70
|
+
"light": {
|
|
71
|
+
"srgb": "#ededeb",
|
|
72
|
+
"oklch": "oklch(94.55% 0.0027 106.45)",
|
|
73
|
+
"p3": "color(display-p3 0.9294 0.9294 0.9223)"
|
|
74
|
+
},
|
|
75
|
+
"dark": {
|
|
76
|
+
"srgb": "#141410",
|
|
77
|
+
"oklch": "oklch(18.97% 0.0078 107.13)",
|
|
78
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643)"
|
|
79
|
+
},
|
|
80
|
+
"description": "Navbar background — matches page in both themes"
|
|
81
|
+
},
|
|
82
|
+
"navbar-scrolled": {
|
|
83
|
+
"light": {
|
|
84
|
+
"srgb": "#ededeb",
|
|
85
|
+
"oklch": "oklch(94.55% 0.0027 106.45)",
|
|
86
|
+
"p3": "color(display-p3 0.9294 0.9294 0.9223)"
|
|
87
|
+
},
|
|
88
|
+
"dark": {
|
|
89
|
+
"srgb": "#141410",
|
|
90
|
+
"oklch": "oklch(18.97% 0.0078 107.13)",
|
|
91
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643)"
|
|
92
|
+
},
|
|
93
|
+
"description": "Navbar when scrolled/shrunk — matches page-scrolled"
|
|
94
|
+
},
|
|
95
|
+
"code": {
|
|
96
|
+
"light": {
|
|
97
|
+
"srgb": "#f7f7f6",
|
|
98
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
99
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
100
|
+
},
|
|
101
|
+
"dark": {
|
|
102
|
+
"srgb": "#1c1917",
|
|
103
|
+
"oklch": "oklch(21.61% 0.0061 56.04)",
|
|
104
|
+
"p3": "color(display-p3 0.1078 0.0985 0.0911)"
|
|
105
|
+
},
|
|
106
|
+
"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)"
|
|
107
|
+
},
|
|
108
|
+
"scrim": {
|
|
109
|
+
"light": {
|
|
110
|
+
"srgb": "rgba(20, 20, 16, 0.85)",
|
|
111
|
+
"oklch": "oklch(18.97% 0.0078 107.13 / 0.85)",
|
|
112
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643 / 0.85)"
|
|
113
|
+
},
|
|
114
|
+
"dark": {
|
|
115
|
+
"srgb": "rgba(20, 20, 16, 0.85)",
|
|
116
|
+
"oklch": "oklch(18.97% 0.0078 107.13 / 0.85)",
|
|
117
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643 / 0.85)"
|
|
118
|
+
},
|
|
119
|
+
"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). Older browsers (Chrome < 122, Safari < 17.4, Firefox < 120) do not let ::backdrop inherit custom properties from :root, so a consumer painting the scrim on ::backdrop should write a fallback, e.g. var(--color-surface-scrim, rgba(20, 20, 16, 0.85)); the house figure viewer draws its scrim on a div (.di-figure-modal), so it is not affected."
|
|
120
|
+
},
|
|
121
|
+
"scrim-solid": {
|
|
122
|
+
"light": {
|
|
123
|
+
"srgb": "rgba(20, 20, 16, 0.92)",
|
|
124
|
+
"oklch": "oklch(18.97% 0.0078 107.13 / 0.92)",
|
|
125
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643 / 0.92)"
|
|
126
|
+
},
|
|
127
|
+
"dark": {
|
|
128
|
+
"srgb": "rgba(20, 20, 16, 0.92)",
|
|
129
|
+
"oklch": "oklch(18.97% 0.0078 107.13 / 0.92)",
|
|
130
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0643 / 0.92)"
|
|
131
|
+
},
|
|
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. Paper reads as paper by its edge, not its colour: a print surface always carries --shadow-print or a hairline in border.print (the edge rule, maintainer decision 2026-11-03)."
|
|
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."
|
|
159
|
+
},
|
|
160
|
+
"media": {
|
|
161
|
+
"light": {
|
|
162
|
+
"srgb": "#000000",
|
|
163
|
+
"oklch": "oklch(0% 0 0)",
|
|
164
|
+
"p3": "color(display-p3 0 0 0)"
|
|
165
|
+
},
|
|
166
|
+
"dark": {
|
|
167
|
+
"srgb": "#000000",
|
|
168
|
+
"oklch": "oklch(0% 0 0)",
|
|
169
|
+
"p3": "color(display-p3 0 0 0)"
|
|
170
|
+
},
|
|
171
|
+
"description": "The media letterbox: the ground behind a <video> and other media (an embedded player, a frame that does not fill its box). Pure black, not the house near-black (stone-900 #14140f, ink-900 #0c0a09): video frames carry true black, so a near-black ground shows the letterbox bars beside the frame's own black, and pure black hides them. It depicts the media frame, not the page, so it is theme-invariant: light and dark carry the same value (the color.surface.print precedent). Nothing is drawn on it, so it has no contrast floor; tools/contrast-check.mjs holds it to theme invariance (maintainer decision 2026-11-03)."
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
"border": {
|
|
175
|
+
"subtle": {
|
|
176
|
+
"light": {
|
|
177
|
+
"srgb": "rgba(12, 10, 9, 0.45)",
|
|
178
|
+
"oklch": "oklch(14.69% 0.0041 49.25 / 0.45)",
|
|
179
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358 / 0.45)"
|
|
180
|
+
},
|
|
181
|
+
"dark": {
|
|
182
|
+
"srgb": "rgba(253, 249, 242, 0.45)",
|
|
183
|
+
"oklch": "oklch(98.33% 0.0102 81.8 / 0.45)",
|
|
184
|
+
"p3": "color(display-p3 0.9894 0.977 0.9518 / 0.45)"
|
|
185
|
+
},
|
|
186
|
+
"description": "Subtle borders — element separation. THE ALPHA IS THE ROLE: border.subtle / moderate / strong / card share one base color and are distinguished by opacity alone, so a gamut conversion that drops the alpha channel collapses four semantic roles into one opaque value (this happened in 17995c3, #72, 2026-06-28). No number is quoted here on purpose: the scale is set by the founder decision recorded in wi-20260817-border-alpha-scale-retune and gated by tools/contrast-check.mjs at the WCAG 1.4.11 non-text threshold (3:1). Read the value, not this sentence."
|
|
187
|
+
},
|
|
188
|
+
"moderate": {
|
|
189
|
+
"light": {
|
|
190
|
+
"srgb": "rgba(12, 10, 9, 0.60)",
|
|
191
|
+
"oklch": "oklch(14.69% 0.0041 49.25 / 0.60)",
|
|
192
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358 / 0.60)"
|
|
193
|
+
},
|
|
194
|
+
"dark": {
|
|
195
|
+
"srgb": "rgba(253, 249, 242, 0.60)",
|
|
196
|
+
"oklch": "oklch(98.33% 0.0102 81.8 / 0.60)",
|
|
197
|
+
"p3": "color(display-p3 0.9894 0.977 0.9518 / 0.60)"
|
|
198
|
+
},
|
|
199
|
+
"description": "Moderate borders — defined boundaries. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
|
|
200
|
+
},
|
|
201
|
+
"strong": {
|
|
202
|
+
"light": {
|
|
203
|
+
"srgb": "rgba(12, 10, 9, 0.75)",
|
|
204
|
+
"oklch": "oklch(14.69% 0.0041 49.25 / 0.75)",
|
|
205
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358 / 0.75)"
|
|
206
|
+
},
|
|
207
|
+
"dark": {
|
|
208
|
+
"srgb": "rgba(253, 249, 242, 0.75)",
|
|
209
|
+
"oklch": "oklch(98.33% 0.0102 81.8 / 0.75)",
|
|
210
|
+
"p3": "color(display-p3 0.9894 0.977 0.9518 / 0.75)"
|
|
211
|
+
},
|
|
212
|
+
"description": "Strong borders — prominent separation. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
|
|
213
|
+
},
|
|
214
|
+
"card": {
|
|
215
|
+
"light": {
|
|
216
|
+
"srgb": "rgba(12, 10, 9, 0.60)",
|
|
217
|
+
"oklch": "oklch(14.69% 0.0041 49.25 / 0.60)",
|
|
218
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358 / 0.60)"
|
|
219
|
+
},
|
|
220
|
+
"dark": {
|
|
221
|
+
"srgb": "rgba(253, 249, 242, 0.60)",
|
|
222
|
+
"oklch": "oklch(98.33% 0.0102 81.8 / 0.60)",
|
|
223
|
+
"p3": "color(display-p3 0.9894 0.977 0.9518 / 0.60)"
|
|
224
|
+
},
|
|
225
|
+
"description": "Card border color with transparency for subtle definition. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
|
|
226
|
+
},
|
|
227
|
+
"figure-frame": {
|
|
228
|
+
"light": {
|
|
229
|
+
"srgb": "#6a6a6a",
|
|
230
|
+
"oklch": "oklch(52.43% 0 0)",
|
|
231
|
+
"p3": "color(display-p3 0.4157 0.4157 0.4157)"
|
|
232
|
+
},
|
|
233
|
+
"dark": {
|
|
234
|
+
"srgb": "#6a6a6a",
|
|
235
|
+
"oklch": "oklch(52.43% 0 0)",
|
|
236
|
+
"p3": "color(display-p3 0.4157 0.4157 0.4157)"
|
|
237
|
+
},
|
|
238
|
+
"description": "Figure frame: the 1px rule round a .box figure and the border of an enlarged figure in the figure modal. It sits on surface.figure-plate, which is light in both modes, so the frame keeps the light content.secondary value in both: 5.0:1 on the light plate #f7f7f6 and 3.9:1 on the dimmed dark-mode plate #dcdcda (WCAG 1.4.11 non-text, 3:1). The PDF's di-figure-frame is the same colour (2026-11-01)."
|
|
239
|
+
},
|
|
240
|
+
"code": {
|
|
241
|
+
"light": {
|
|
242
|
+
"srgb": "#d6d3d1",
|
|
243
|
+
"oklch": "oklch(86.87% 0.0043 56.37)",
|
|
244
|
+
"p3": "color(display-p3 0.8371 0.8278 0.8205)"
|
|
245
|
+
},
|
|
246
|
+
"dark": {
|
|
247
|
+
"srgb": "#292524",
|
|
248
|
+
"oklch": "oklch(26.85% 0.0063 34.3)",
|
|
249
|
+
"p3": "color(display-p3 0.1581 0.1456 0.1418)"
|
|
250
|
+
},
|
|
251
|
+
"description": "Code block border"
|
|
252
|
+
},
|
|
253
|
+
"on-scrim-focus": {
|
|
254
|
+
"light": {
|
|
255
|
+
"srgb": "#3498db",
|
|
256
|
+
"oklch": "oklch(65.31% 0.1347 242.69)",
|
|
257
|
+
"p3": "color(display-p3 0.3208 0.588 0.8369)"
|
|
258
|
+
},
|
|
259
|
+
"dark": {
|
|
260
|
+
"srgb": "#3498db",
|
|
261
|
+
"oklch": "oklch(65.31% 0.1347 242.69)",
|
|
262
|
+
"p3": "color(display-p3 0.3208 0.588 0.8369)"
|
|
263
|
+
},
|
|
264
|
+
"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."
|
|
265
|
+
},
|
|
266
|
+
"print": {
|
|
267
|
+
"light": {
|
|
268
|
+
"srgb": "rgba(12, 10, 9, 0.45)",
|
|
269
|
+
"oklch": "oklch(14.69% 0.0041 49.25 / 0.45)",
|
|
270
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358 / 0.45)"
|
|
271
|
+
},
|
|
272
|
+
"dark": {
|
|
273
|
+
"srgb": "rgba(12, 10, 9, 0.45)",
|
|
274
|
+
"oklch": "oklch(14.69% 0.0041 49.25 / 0.45)",
|
|
275
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358 / 0.45)"
|
|
276
|
+
},
|
|
277
|
+
"description": "The hairline edge of printed paper (surface.print): the paper-cover thumbnail, the light slide. THE EDGE RULE: paper reads as paper by its edge, not by its colour. surface.print is the card colour, so a print surface always carries either --shadow-print or a hairline in this token (maintainer decision 2026-11-03). It is drawn on the paper, which stays light in both modes, so it is theme-invariant: light and dark carry the same value (the color.border.figure-frame precedent). It starts from the light value of border.subtle, and as there the alpha is the role and no ratio is quoted on purpose: composited over surface.print it is held to the WCAG 1.4.11 non-text threshold (3:1) by tools/contrast-check.mjs. Read the value, not this sentence."
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
"content": {
|
|
281
|
+
"primary": {
|
|
282
|
+
"light": {
|
|
283
|
+
"srgb": "#14140f",
|
|
284
|
+
"oklch": "oklch(18.93% 0.0098 107.3)",
|
|
285
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0608)"
|
|
286
|
+
},
|
|
287
|
+
"dark": {
|
|
288
|
+
"srgb": "#fdf9f2",
|
|
289
|
+
"oklch": "oklch(98.33% 0.0102 81.8)",
|
|
290
|
+
"p3": "color(display-p3 0.9894 0.977 0.9518)"
|
|
291
|
+
},
|
|
292
|
+
"description": "Primary text — stone-900 on stone-100 (light, matches presentation-theme.scss exactly) / paper-100 on dark surface"
|
|
293
|
+
},
|
|
294
|
+
"secondary": {
|
|
295
|
+
"light": {
|
|
296
|
+
"srgb": "#6a6a6a",
|
|
297
|
+
"oklch": "oklch(52.43% 0 0)",
|
|
298
|
+
"p3": "color(display-p3 0.4157 0.4157 0.4157)"
|
|
299
|
+
},
|
|
300
|
+
"dark": {
|
|
301
|
+
"srgb": "#a8a29e",
|
|
302
|
+
"oklch": "oklch(71.61% 0.0091 56.26)",
|
|
303
|
+
"p3": "color(display-p3 0.6547 0.6361 0.6215)"
|
|
304
|
+
},
|
|
305
|
+
"description": "Secondary text — WCAG-AA on all light surfaces (≥4.6:1, darkened from stone-500 #7c7c7c which was 3.6:1) / ink-300 on dark"
|
|
306
|
+
},
|
|
307
|
+
"muted": {
|
|
308
|
+
"light": {
|
|
309
|
+
"srgb": "#706964",
|
|
310
|
+
"oklch": "oklch(52.57% 0.0118 58.05)",
|
|
311
|
+
"p3": "color(display-p3 0.4345 0.4127 0.3945)"
|
|
312
|
+
},
|
|
313
|
+
"dark": {
|
|
314
|
+
"srgb": "#89827d",
|
|
315
|
+
"oklch": "oklch(61.12% 0.0113 58.1)",
|
|
316
|
+
"p3": "color(display-p3 0.5325 0.5107 0.4925)"
|
|
317
|
+
},
|
|
318
|
+
"description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (darkened/lightened from #78716c which failed AA on page)"
|
|
319
|
+
},
|
|
320
|
+
"inverse": {
|
|
321
|
+
"light": {
|
|
322
|
+
"srgb": "#fdf9f2",
|
|
323
|
+
"oklch": "oklch(98.33% 0.0102 81.8)",
|
|
324
|
+
"p3": "color(display-p3 0.9894 0.977 0.9518)"
|
|
325
|
+
},
|
|
326
|
+
"dark": {
|
|
327
|
+
"srgb": "#0c0a09",
|
|
328
|
+
"oklch": "oklch(14.69% 0.0041 49.25)",
|
|
329
|
+
"p3": "color(display-p3 0.0457 0.0395 0.0358)"
|
|
330
|
+
},
|
|
331
|
+
"description": "Inverse text — for contrasting backgrounds"
|
|
332
|
+
},
|
|
333
|
+
"on-scrim": {
|
|
334
|
+
"light": {
|
|
335
|
+
"srgb": "#f7f7f6",
|
|
336
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
337
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
338
|
+
},
|
|
339
|
+
"dark": {
|
|
340
|
+
"srgb": "#f7f7f6",
|
|
341
|
+
"oklch": "oklch(97.59% 0.0013 106.42)",
|
|
342
|
+
"p3": "color(display-p3 0.9686 0.9686 0.9651)"
|
|
343
|
+
},
|
|
344
|
+
"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."
|
|
345
|
+
},
|
|
346
|
+
"on-print": {
|
|
347
|
+
"light": {
|
|
348
|
+
"srgb": "#14140f",
|
|
349
|
+
"oklch": "oklch(18.93% 0.0098 107.3)",
|
|
350
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0608)"
|
|
351
|
+
},
|
|
352
|
+
"dark": {
|
|
353
|
+
"srgb": "#14140f",
|
|
354
|
+
"oklch": "oklch(18.93% 0.0098 107.3)",
|
|
355
|
+
"p3": "color(display-p3 0.0784 0.0784 0.0608)"
|
|
356
|
+
},
|
|
357
|
+
"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."
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
"interactive": {
|
|
361
|
+
"primary": {
|
|
362
|
+
"light": {
|
|
363
|
+
"srgb": "#434739",
|
|
364
|
+
"oklch": "oklch(38.97% 0.0235 120.45)",
|
|
365
|
+
"p3": "color(display-p3 0.2656 0.2779 0.2287)"
|
|
366
|
+
},
|
|
367
|
+
"dark": {
|
|
368
|
+
"srgb": "#98a384",
|
|
369
|
+
"oklch": "oklch(69.82% 0.0456 123.46)",
|
|
370
|
+
"p3": "color(display-p3 0.604 0.6378 0.5291)"
|
|
371
|
+
},
|
|
372
|
+
"description": "Primary interactive — forest-700 on light (7.75:1 on stone-100, white text 9.0:1 — passes WCAG AAA) / forest-300 on dark"
|
|
373
|
+
},
|
|
374
|
+
"hover": {
|
|
375
|
+
"light": {
|
|
376
|
+
"srgb": "#363a2e",
|
|
377
|
+
"oklch": "oklch(34.07% 0.021 122.5)",
|
|
378
|
+
"p3": "color(display-p3 0.2146 0.2269 0.1848)"
|
|
379
|
+
},
|
|
380
|
+
"dark": {
|
|
381
|
+
"srgb": "#7e8a6b",
|
|
382
|
+
"oklch": "oklch(61.5% 0.0473 124.97)",
|
|
383
|
+
"p3": "color(display-p3 0.5029 0.5397 0.4313)"
|
|
384
|
+
},
|
|
385
|
+
"description": "Hover state — forest-800 on light (slightly darker than canonical) / forest-400 on dark"
|
|
386
|
+
},
|
|
387
|
+
"accent": {
|
|
388
|
+
"light": {
|
|
389
|
+
"srgb": "#1f618d",
|
|
390
|
+
"oklch": "oklch(47.31% 0.0963 242.42)",
|
|
391
|
+
"p3": "color(display-p3 0.198 0.375 0.5385)"
|
|
392
|
+
},
|
|
393
|
+
"dark": {
|
|
394
|
+
"srgb": "#3498db",
|
|
395
|
+
"oklch": "oklch(65.31% 0.1347 242.69)",
|
|
396
|
+
"p3": "color(display-p3 0.3208 0.588 0.8369)"
|
|
397
|
+
},
|
|
398
|
+
"description": "Accent — sky-blue moral-weight color (iteration-2). Light: accent-500 (5.68:1 on stone-100, AA with headroom; 6.66:1 white-on-color for backplates). Dark: accent-300 (5.41:1 on stone-900, AA with headroom — closes the iteration-1 dark-mode AA-large-only contrast gap). FIRST instance of mode-aware role mapping in the system: light and dark point to different palette stops rather than the same hex. The scale-name `accent` is preserved across iteration-1 → iteration-2 (consumer-side text-accent-500 keeps working). See wiki/decisions/iteration-2-blue-accent.md for the dialectical reframe of the iteration-1 emancipation-copper framing (sky/horizon/Enlightenment-blueprint/Reformation-Protestant traditions vs. Western-traffic-coding STOP-red)."
|
|
399
|
+
},
|
|
400
|
+
"focus": {
|
|
401
|
+
"light": {
|
|
402
|
+
"srgb": "#434739",
|
|
403
|
+
"oklch": "oklch(38.97% 0.0235 120.45)",
|
|
404
|
+
"p3": "color(display-p3 0.2656 0.2779 0.2287)"
|
|
405
|
+
},
|
|
406
|
+
"dark": {
|
|
407
|
+
"srgb": "#98a384",
|
|
408
|
+
"oklch": "oklch(69.82% 0.0456 123.46)",
|
|
409
|
+
"p3": "color(display-p3 0.604 0.6378 0.5291)"
|
|
410
|
+
},
|
|
411
|
+
"description": "Focus indicators — mirrors interactive.primary"
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
"state": {
|
|
415
|
+
"success": {
|
|
416
|
+
"light": {
|
|
417
|
+
"srgb": "#007a58",
|
|
418
|
+
"oklch": "oklch(51.36% 0.1073 165.46)",
|
|
419
|
+
"p3": "color(display-p3 0.2046 0.471 0.3541)"
|
|
420
|
+
},
|
|
421
|
+
"dark": {
|
|
422
|
+
"srgb": "#009e73",
|
|
423
|
+
"oklch": "oklch(61.98% 0.1295 165.46)",
|
|
424
|
+
"p3": "color(display-p3 0.2733 0.6102 0.4624)"
|
|
425
|
+
},
|
|
426
|
+
"description": "State: success. Okabe-Ito bluish-green, darkened in light mode for text: 4.56:1 on page and 4.99:1 on card (dark 5.40 / 5.11). 2026-11-02; replaces the Flat-UI functional colours as the semantic layer"
|
|
427
|
+
},
|
|
428
|
+
"warning": {
|
|
429
|
+
"light": {
|
|
430
|
+
"srgb": "#906306",
|
|
431
|
+
"oklch": "oklch(53.38% 0.1098 77.05)",
|
|
432
|
+
"p3": "color(display-p3 0.5386 0.3957 0.1307)"
|
|
433
|
+
},
|
|
434
|
+
"dark": {
|
|
435
|
+
"srgb": "#e69f00",
|
|
436
|
+
"oklch": "oklch(75.27% 0.1576 76.77)",
|
|
437
|
+
"p3": "color(display-p3 0.861 0.6354 0.2169)"
|
|
438
|
+
},
|
|
439
|
+
"description": "State: warning. Okabe-Ito orange, darkened in light mode to an amber that holds text contrast: 4.51:1 on page and 4.93:1 on card (dark 8.20 / 7.76). 2026-11-02; replaces the Flat-UI functional colours as the semantic layer"
|
|
440
|
+
},
|
|
441
|
+
"error": {
|
|
442
|
+
"light": {
|
|
443
|
+
"srgb": "#a4262c",
|
|
444
|
+
"oklch": "oklch(47.54% 0.1619 23.66)",
|
|
445
|
+
"p3": "color(display-p3 0.5915 0.1933 0.192)"
|
|
446
|
+
},
|
|
447
|
+
"dark": {
|
|
448
|
+
"srgb": "#ef5350",
|
|
449
|
+
"oklch": "oklch(65.39% 0.1926 25.14)",
|
|
450
|
+
"p3": "color(display-p3 0.8678 0.3692 0.339)"
|
|
451
|
+
},
|
|
452
|
+
"description": "State: error. Red rather than Okabe-Ito vermillion: darkened vermillion collapses into the amber warning under deuteranopia (ΔE 2.0). 6.2:1 on page in light mode (dark 5.30 / 5.02). 2026-11-02; replaces the Flat-UI functional colours as the semantic layer"
|
|
453
|
+
},
|
|
454
|
+
"info": {
|
|
455
|
+
"light": {
|
|
456
|
+
"srgb": "#1f618d",
|
|
457
|
+
"oklch": "oklch(47.31% 0.0963 242.42)",
|
|
458
|
+
"p3": "color(display-p3 0.198 0.375 0.5385)"
|
|
459
|
+
},
|
|
460
|
+
"dark": {
|
|
461
|
+
"srgb": "#3498db",
|
|
462
|
+
"oklch": "oklch(65.31% 0.1347 242.69)",
|
|
463
|
+
"p3": "color(display-p3 0.3208 0.588 0.8369)"
|
|
464
|
+
},
|
|
465
|
+
"description": "State: info. The house slate accent (interactive.accent), so notes and info read slate-blue against the stone surfaces: 5.68:1 on page in light mode (dark 5.86). 2026-11-02; replaces the Flat-UI functional colours as the semantic layer"
|
|
466
|
+
}
|
|
467
|
+
},
|
|
468
|
+
"presentation": {
|
|
469
|
+
"accent": {
|
|
470
|
+
"light": {
|
|
471
|
+
"srgb": "#3498db",
|
|
472
|
+
"oklch": "oklch(65.31% 0.1347 242.69)",
|
|
473
|
+
"p3": "color(display-p3 0.3208 0.588 0.8369)"
|
|
474
|
+
},
|
|
475
|
+
"dark": {
|
|
476
|
+
"srgb": "#3498db",
|
|
477
|
+
"oklch": "oklch(65.31% 0.1347 242.69)",
|
|
478
|
+
"p3": "color(display-p3 0.3208 0.588 0.8369)"
|
|
479
|
+
},
|
|
480
|
+
"description": "Presentation accent — Flat-UI peter-river; reserved for reveal.js 2030s-feel highlights. Not for body prose or interactive primary use. Pairs well with copper on dark slides."
|
|
481
|
+
},
|
|
482
|
+
"accent-hover": {
|
|
483
|
+
"light": {
|
|
484
|
+
"srgb": "#2980b9",
|
|
485
|
+
"oklch": "oklch(57.59% 0.119 242.28)",
|
|
486
|
+
"p3": "color(display-p3 0.2638 0.495 0.7068)"
|
|
487
|
+
},
|
|
488
|
+
"dark": {
|
|
489
|
+
"srgb": "#2980b9",
|
|
490
|
+
"oklch": "oklch(57.59% 0.119 242.28)",
|
|
491
|
+
"p3": "color(display-p3 0.2638 0.495 0.7068)"
|
|
492
|
+
},
|
|
493
|
+
"description": "Presentation accent hover/emphasized variant — Flat-UI belize-hole"
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
"vertical-accent": {
|
|
497
|
+
"$comment": "Per-vertical brand accents — each Level-2 property's identity color, distinct from the house interactive.accent (the L1 sky-blue hub color). Mode-aware (light/dark stops) like interactive.accent. Used for app icons, navbar-logo emphasis, and per-vertical theming. Contrast vs surface.page verified WCAG: light values are the on-light marks, dark values the on-dark marks. dataimago (L1 hub) intentionally has no vertical accent — it uses interactive.accent + ink.",
|
|
498
|
+
"dissertation": {
|
|
499
|
+
"light": {
|
|
500
|
+
"srgb": "#b87333",
|
|
501
|
+
"oklch": "oklch(61.8% 0.1171 60.4)",
|
|
502
|
+
"p3": "color(display-p3 0.7242 0.4389 0.1259)"
|
|
503
|
+
},
|
|
504
|
+
"dark": {
|
|
505
|
+
"srgb": "#ce8e5c",
|
|
506
|
+
"oklch": "oklch(69.98% 0.1021 58.08)",
|
|
507
|
+
"p3": "color(display-p3 0.8089 0.5486 0.3177)"
|
|
508
|
+
},
|
|
509
|
+
"description": "dissertation-ai — copper (manuscript / annotation / the human hand in the margin). Light: 3.23:1 on stone-100 (AA-large; large-mark use). Dark: #CE8E5C 6.72:1 on ink-900 (AA)."
|
|
510
|
+
},
|
|
511
|
+
"rpkg": {
|
|
512
|
+
"light": {
|
|
513
|
+
"srgb": "#3b82f6",
|
|
514
|
+
"oklch": "oklch(62.31% 0.188 259.81)",
|
|
515
|
+
"p3": "color(display-p3 0.3047 0.5035 0.9338)"
|
|
516
|
+
},
|
|
517
|
+
"dark": {
|
|
518
|
+
"srgb": "#60a5fa",
|
|
519
|
+
"oklch": "oklch(71.37% 0.1434 254.62)",
|
|
520
|
+
"p3": "color(display-p3 0.4405 0.6403 0.9545)"
|
|
521
|
+
},
|
|
522
|
+
"description": "rpkg-ai — engineering blue. Light: 3.14:1 on stone-100 (AA-large; large-mark use). Dark: #60A5FA 7.26:1 on ink-900 (AA)."
|
|
523
|
+
},
|
|
524
|
+
"SGPc": {
|
|
525
|
+
"light": {
|
|
526
|
+
"srgb": "#5a6310",
|
|
527
|
+
"oklch": "oklch(47.61% 0.1017 115.99)",
|
|
528
|
+
"p3": "color(display-p3 0.3595 0.3871 0.1309)"
|
|
529
|
+
},
|
|
530
|
+
"dark": {
|
|
531
|
+
"srgb": "#b2bf22",
|
|
532
|
+
"oklch": "oklch(76.9% 0.1655 114.7)",
|
|
533
|
+
"p3": "color(display-p3 0.7074 0.7474 0.2714)"
|
|
534
|
+
},
|
|
535
|
+
"description": "SGPc-ai — growth yellow-green (decided 2026-06-26). The brand value is the bright #B2BF22, but it fails contrast on light surfaces (1.73:1), so LIGHT mode uses the darkened companion #5A6310 (5.55:1 on stone-100 — full AA) and DARK mode uses the bright #B2BF22 (9.12:1 on ink-900). See wiki/decisions/sgpc-accent.md."
|
|
536
|
+
}
|
|
537
|
+
},
|
|
538
|
+
"brand-mark": {
|
|
539
|
+
"$comment": "Brand-MARK colors (the dataimago monogram / wordmark logo treatment) — distinct from the interactive.accent role. The signature monogram red is a wide-gamut PILOT (see wiki/decisions/p3-oklch-color.md). It is mode-aware for AA-normal headroom: a single red cannot clear 4.5:1 on BOTH the light page (#ededeb) and ink-900 — light needs a deep red, dark needs a bright one. LIGHT uses the deepened #cc0000 (faithful P3, contrast-first); DARK keeps the vivid display-P3 primary red (#ff0000 fallback → color(display-p3 1 0 0)), where #ff0000 already passes AA-normal. Vivid override authored in tools/color-converter.mjs (dark-only for the red), emitted as a `#hex → color(display-p3 …)` cascade in the -p3 build.",
|
|
540
|
+
"red": {
|
|
541
|
+
"light": {
|
|
542
|
+
"srgb": "#cc0000",
|
|
543
|
+
"oklch": "oklch(53.08% 0.2178 29.23)",
|
|
544
|
+
"p3": "color(display-p3 0.7331 0.1519 0.1019)"
|
|
545
|
+
},
|
|
546
|
+
"dark": {
|
|
547
|
+
"srgb": "#ff0000",
|
|
548
|
+
"oklch": "oklch(62.8% 0.2577 29.23)",
|
|
549
|
+
"p3": "color(display-p3 1 0 0)"
|
|
550
|
+
},
|
|
551
|
+
"description": "Signature monogram red — mode-aware for AA-normal. LIGHT: deepened #cc0000 (5.0:1 on stone-100 #ededeb / 5.5:1 on elevated — full AA-normal, safe at small sizes / as text). DARK: vivid #ff0000 fallback + display-P3 primary red (4.6:1 on ink-900 — AA-normal). Logo-mark color only — NOT the interactive accent (which is iteration-2 blue). Large navbar lift-wash marks keep the vivid display-P3 red (AA-large, large-mark use); this token is the AA-normal value for arbitrary/small mark reuse."
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|