@dataimago/tokens 0.1.0-alpha.13 → 0.1.0-alpha.15

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 CHANGED
@@ -42,22 +42,22 @@ const tokens = {
42
42
  "subtle": {
43
43
  "light": "rgba(12, 10, 9, 0.45)",
44
44
  "dark": "rgba(253, 249, 242, 0.45)",
45
- "description": "Subtle borders — element separation"
45
+ "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."
46
46
  },
47
47
  "moderate": {
48
48
  "light": "rgba(12, 10, 9, 0.60)",
49
49
  "dark": "rgba(253, 249, 242, 0.60)",
50
- "description": "Moderate borders — defined boundaries"
50
+ "description": "Moderate borders — defined boundaries. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
51
51
  },
52
52
  "strong": {
53
53
  "light": "rgba(12, 10, 9, 0.75)",
54
54
  "dark": "rgba(253, 249, 242, 0.75)",
55
- "description": "Strong borders — prominent separation"
55
+ "description": "Strong borders — prominent separation. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
56
56
  },
57
57
  "card": {
58
58
  "light": "rgba(12, 10, 9, 0.60)",
59
59
  "dark": "rgba(253, 249, 242, 0.60)",
60
- "description": "Card border color with transparency for subtle definition"
60
+ "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."
61
61
  },
62
62
  "code": {
63
63
  "light": "#d6d3d1",
@@ -79,7 +79,7 @@ const tokens = {
79
79
  "muted": {
80
80
  "light": "#706964",
81
81
  "dark": "#89827d",
82
- "description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (light ≥4.6:1, dark ≥4.6:1; darkened/lightened from #78716c which failed AA on page)"
82
+ "description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (darkened/lightened from #78716c which failed AA on page)"
83
83
  },
84
84
  "inverse": {
85
85
  "light": "#fdf9f2",
@@ -126,7 +126,7 @@ const tokens = {
126
126
  "dissertation": {
127
127
  "light": "#B87333",
128
128
  "dark": "#CE8E5C",
129
- "description": "dissertation-ai — copper (manuscript / annotation / the human hand in the margin). Re-authored at higher P3 chroma (~+28% light / +27% dark) for a vivid wide-gamut pop; sRGB fallback unchanged so contrast is preserved. Light: 3.23:1 on stone-100 (AA-large; large-mark use). Dark: #CE8E5C 6.72:1 on ink-900 (AA)."
129
+ "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)."
130
130
  },
131
131
  "rpkg": {
132
132
  "light": "#3B82F6",
@@ -226,14 +226,14 @@ const tokens = {
226
226
  },
227
227
  "border": {
228
228
  "subtle": {
229
- "light": "rgba(20, 20, 16, 0.1)",
230
- "dark": "rgba(237, 237, 235, 0.1)",
231
- "description": "Subtle borders - element separation"
229
+ "light": "rgba(20, 20, 16, 0.47)",
230
+ "dark": "rgba(237, 237, 235, 0.47)",
231
+ "description": "Subtle borders - element separation. THE ALPHA IS THE ROLE. Distinct from color.border.subtle: this family has its own base (20,20,16 / 237,237,235), so it needs a DIFFERENT alpha to render the same. 0.47 here matches 0.45 there at 3.07:1 on the worst surface; copying 0.45 would land at 2.90:1 and fail WCAG 1.4.11. Gated by tools/contrast-check.mjs."
232
232
  },
233
233
  "moderate": {
234
- "light": "rgba(20, 20, 16, 0.15)",
235
- "dark": "rgba(237, 237, 235, 0.15)",
236
- "description": "Moderate borders - defined boundaries"
234
+ "light": "rgba(20, 20, 16, 0.63)",
235
+ "dark": "rgba(237, 237, 235, 0.63)",
236
+ "description": "Moderate borders - defined boundaries. 0.63 here matches color.border.moderate 0.60 in rendered contrast; see border.subtle on why the numbers differ between the two families."
237
237
  },
238
238
  "focus": {
239
239
  "light": "#3498DB",
package/dist/index.mjs CHANGED
@@ -42,22 +42,22 @@ const tokens = {
42
42
  "subtle": {
43
43
  "light": "rgba(12, 10, 9, 0.45)",
44
44
  "dark": "rgba(253, 249, 242, 0.45)",
45
- "description": "Subtle borders — element separation"
45
+ "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."
46
46
  },
47
47
  "moderate": {
48
48
  "light": "rgba(12, 10, 9, 0.60)",
49
49
  "dark": "rgba(253, 249, 242, 0.60)",
50
- "description": "Moderate borders — defined boundaries"
50
+ "description": "Moderate borders — defined boundaries. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
51
51
  },
52
52
  "strong": {
53
53
  "light": "rgba(12, 10, 9, 0.75)",
54
54
  "dark": "rgba(253, 249, 242, 0.75)",
55
- "description": "Strong borders — prominent separation"
55
+ "description": "Strong borders — prominent separation. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
56
56
  },
57
57
  "card": {
58
58
  "light": "rgba(12, 10, 9, 0.60)",
59
59
  "dark": "rgba(253, 249, 242, 0.60)",
60
- "description": "Card border color with transparency for subtle definition"
60
+ "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."
61
61
  },
62
62
  "code": {
63
63
  "light": "#d6d3d1",
@@ -79,7 +79,7 @@ const tokens = {
79
79
  "muted": {
80
80
  "light": "#706964",
81
81
  "dark": "#89827d",
82
- "description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (light ≥4.6:1, dark ≥4.6:1; darkened/lightened from #78716c which failed AA on page)"
82
+ "description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (darkened/lightened from #78716c which failed AA on page)"
83
83
  },
84
84
  "inverse": {
85
85
  "light": "#fdf9f2",
@@ -126,7 +126,7 @@ const tokens = {
126
126
  "dissertation": {
127
127
  "light": "#B87333",
128
128
  "dark": "#CE8E5C",
129
- "description": "dissertation-ai — copper (manuscript / annotation / the human hand in the margin). Re-authored at higher P3 chroma (~+28% light / +27% dark) for a vivid wide-gamut pop; sRGB fallback unchanged so contrast is preserved. Light: 3.23:1 on stone-100 (AA-large; large-mark use). Dark: #CE8E5C 6.72:1 on ink-900 (AA)."
129
+ "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)."
130
130
  },
131
131
  "rpkg": {
132
132
  "light": "#3B82F6",
@@ -226,14 +226,14 @@ const tokens = {
226
226
  },
227
227
  "border": {
228
228
  "subtle": {
229
- "light": "rgba(20, 20, 16, 0.1)",
230
- "dark": "rgba(237, 237, 235, 0.1)",
231
- "description": "Subtle borders - element separation"
229
+ "light": "rgba(20, 20, 16, 0.47)",
230
+ "dark": "rgba(237, 237, 235, 0.47)",
231
+ "description": "Subtle borders - element separation. THE ALPHA IS THE ROLE. Distinct from color.border.subtle: this family has its own base (20,20,16 / 237,237,235), so it needs a DIFFERENT alpha to render the same. 0.47 here matches 0.45 there at 3.07:1 on the worst surface; copying 0.45 would land at 2.90:1 and fail WCAG 1.4.11. Gated by tools/contrast-check.mjs."
232
232
  },
233
233
  "moderate": {
234
- "light": "rgba(20, 20, 16, 0.15)",
235
- "dark": "rgba(237, 237, 235, 0.15)",
236
- "description": "Moderate borders - defined boundaries"
234
+ "light": "rgba(20, 20, 16, 0.63)",
235
+ "dark": "rgba(237, 237, 235, 0.63)",
236
+ "description": "Moderate borders - defined boundaries. 0.63 here matches color.border.moderate 0.60 in rendered contrast; see border.subtle on why the numbers differ between the two families."
237
237
  },
238
238
  "focus": {
239
239
  "light": "#3498DB",
package/dist/tokens.css CHANGED
@@ -178,8 +178,8 @@
178
178
  --shadow-subtle: 0 1px 2px 0 rgb(20 20 16 / 0.05);
179
179
  --shadow-moderate: 0 4px 6px -1px rgb(20 20 16 / 0.1);
180
180
  --shadow-prominent: 0 10px 15px -3px rgb(20 20 16 / 0.1);
181
- --border-subtle: rgba(20, 20, 16, 0.1);
182
- --border-moderate: rgba(20, 20, 16, 0.15);
181
+ --border-subtle: rgba(20, 20, 16, 0.47);
182
+ --border-moderate: rgba(20, 20, 16, 0.63);
183
183
  --border-focus: #3498DB;
184
184
  --navigation-hover-background: rgba(20, 20, 16, 0.05);
185
185
  --navigation-active-background: rgba(20, 20, 16, 0.1);
@@ -245,8 +245,8 @@
245
245
  --shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
246
246
  --shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
247
247
  --shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
248
- --border-subtle: rgba(237, 237, 235, 0.1);
249
- --border-moderate: rgba(237, 237, 235, 0.15);
248
+ --border-subtle: rgba(237, 237, 235, 0.47);
249
+ --border-moderate: rgba(237, 237, 235, 0.63);
250
250
  --border-focus: #4FC3F7;
251
251
  --navigation-hover-background: rgba(237, 237, 235, 0.05);
252
252
  --navigation-active-background: rgba(237, 237, 235, 0.1);
@@ -313,8 +313,8 @@
313
313
  --shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
314
314
  --shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
315
315
  --shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
316
- --border-subtle: rgba(237, 237, 235, 0.1);
317
- --border-moderate: rgba(237, 237, 235, 0.15);
316
+ --border-subtle: rgba(237, 237, 235, 0.47);
317
+ --border-moderate: rgba(237, 237, 235, 0.63);
318
318
  --border-focus: #4FC3F7;
319
319
  --navigation-hover-background: rgba(237, 237, 235, 0.05);
320
320
  --navigation-active-background: rgba(237, 237, 235, 0.1);
@@ -65,7 +65,7 @@
65
65
  "dark": "rgba(253, 249, 242, 0.45)"
66
66
  },
67
67
  "$type": "color",
68
- "$description": "Subtle borders — element separation"
68
+ "$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."
69
69
  },
70
70
  "moderate": {
71
71
  "$value": {
@@ -73,7 +73,7 @@
73
73
  "dark": "rgba(253, 249, 242, 0.60)"
74
74
  },
75
75
  "$type": "color",
76
- "$description": "Moderate borders — defined boundaries"
76
+ "$description": "Moderate borders — defined boundaries. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
77
77
  },
78
78
  "strong": {
79
79
  "$value": {
@@ -81,7 +81,7 @@
81
81
  "dark": "rgba(253, 249, 242, 0.75)"
82
82
  },
83
83
  "$type": "color",
84
- "$description": "Strong borders — prominent separation"
84
+ "$description": "Strong borders — prominent separation. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
85
85
  },
86
86
  "card": {
87
87
  "$value": {
@@ -89,7 +89,7 @@
89
89
  "dark": "rgba(253, 249, 242, 0.60)"
90
90
  },
91
91
  "$type": "color",
92
- "$description": "Card border color with transparency for subtle definition"
92
+ "$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."
93
93
  },
94
94
  "code": {
95
95
  "$value": {
@@ -123,7 +123,7 @@
123
123
  "dark": "#89827d"
124
124
  },
125
125
  "$type": "color",
126
- "$description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (light ≥4.6:1, dark ≥4.6:1; darkened/lightened from #78716c which failed AA on page)"
126
+ "$description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (darkened/lightened from #78716c which failed AA on page)"
127
127
  },
128
128
  "inverse": {
129
129
  "$value": {
@@ -197,7 +197,7 @@
197
197
  "dark": "#CE8E5C"
198
198
  },
199
199
  "$type": "color",
200
- "$description": "dissertation-ai — copper (manuscript / annotation / the human hand in the margin). Re-authored at higher P3 chroma (~+28% light / +27% dark) for a vivid wide-gamut pop; sRGB fallback unchanged so contrast is preserved. Light: 3.23:1 on stone-100 (AA-large; large-mark use). Dark: #CE8E5C 6.72:1 on ink-900 (AA)."
200
+ "$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)."
201
201
  },
202
202
  "rpkg": {
203
203
  "$value": {
@@ -338,19 +338,19 @@
338
338
  "border": {
339
339
  "subtle": {
340
340
  "$value": {
341
- "light": "rgba(20, 20, 16, 0.1)",
342
- "dark": "rgba(237, 237, 235, 0.1)"
341
+ "light": "rgba(20, 20, 16, 0.47)",
342
+ "dark": "rgba(237, 237, 235, 0.47)"
343
343
  },
344
344
  "$type": "color",
345
- "$description": "Subtle borders - element separation"
345
+ "$description": "Subtle borders - element separation. THE ALPHA IS THE ROLE. Distinct from color.border.subtle: this family has its own base (20,20,16 / 237,237,235), so it needs a DIFFERENT alpha to render the same. 0.47 here matches 0.45 there at 3.07:1 on the worst surface; copying 0.45 would land at 2.90:1 and fail WCAG 1.4.11. Gated by tools/contrast-check.mjs."
346
346
  },
347
347
  "moderate": {
348
348
  "$value": {
349
- "light": "rgba(20, 20, 16, 0.15)",
350
- "dark": "rgba(237, 237, 235, 0.15)"
349
+ "light": "rgba(20, 20, 16, 0.63)",
350
+ "dark": "rgba(237, 237, 235, 0.63)"
351
351
  },
352
352
  "$type": "color",
353
- "$description": "Moderate borders - defined boundaries"
353
+ "$description": "Moderate borders - defined boundaries. 0.63 here matches color.border.moderate 0.60 in rendered contrast; see border.subtle on why the numbers differ between the two families."
354
354
  },
355
355
  "focus": {
356
356
  "$value": {
package/dist/tokens.scss CHANGED
@@ -178,8 +178,8 @@
178
178
  --shadow-subtle: 0 1px 2px 0 rgb(20 20 16 / 0.05);
179
179
  --shadow-moderate: 0 4px 6px -1px rgb(20 20 16 / 0.1);
180
180
  --shadow-prominent: 0 10px 15px -3px rgb(20 20 16 / 0.1);
181
- --border-subtle: rgba(20, 20, 16, 0.1);
182
- --border-moderate: rgba(20, 20, 16, 0.15);
181
+ --border-subtle: rgba(20, 20, 16, 0.47);
182
+ --border-moderate: rgba(20, 20, 16, 0.63);
183
183
  --border-focus: #3498DB;
184
184
  --navigation-hover-background: rgba(20, 20, 16, 0.05);
185
185
  --navigation-active-background: rgba(20, 20, 16, 0.1);
@@ -245,8 +245,8 @@
245
245
  --shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
246
246
  --shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
247
247
  --shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
248
- --border-subtle: rgba(237, 237, 235, 0.1);
249
- --border-moderate: rgba(237, 237, 235, 0.15);
248
+ --border-subtle: rgba(237, 237, 235, 0.47);
249
+ --border-moderate: rgba(237, 237, 235, 0.63);
250
250
  --border-focus: #4FC3F7;
251
251
  --navigation-hover-background: rgba(237, 237, 235, 0.05);
252
252
  --navigation-active-background: rgba(237, 237, 235, 0.1);
@@ -313,8 +313,8 @@
313
313
  --shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
314
314
  --shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
315
315
  --shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
316
- --border-subtle: rgba(237, 237, 235, 0.1);
317
- --border-moderate: rgba(237, 237, 235, 0.15);
316
+ --border-subtle: rgba(237, 237, 235, 0.47);
317
+ --border-moderate: rgba(237, 237, 235, 0.63);
318
318
  --border-focus: #4FC3F7;
319
319
  --navigation-hover-background: rgba(237, 237, 235, 0.05);
320
320
  --navigation-active-background: rgba(237, 237, 235, 0.1);
@@ -148,11 +148,11 @@
148
148
  },
149
149
  "border": {
150
150
  "subtle": {
151
- "value": "rgba(20, 20, 16, 0.1)",
151
+ "value": "rgba(20, 20, 16, 0.47)",
152
152
  "type": "color"
153
153
  },
154
154
  "moderate": {
155
- "value": "rgba(20, 20, 16, 0.15)",
155
+ "value": "rgba(20, 20, 16, 0.63)",
156
156
  "type": "color"
157
157
  },
158
158
  "focus": {
@@ -526,11 +526,11 @@
526
526
  },
527
527
  "border": {
528
528
  "subtle": {
529
- "value": "rgba(237, 237, 235, 0.1)",
529
+ "value": "rgba(237, 237, 235, 0.47)",
530
530
  "type": "color"
531
531
  },
532
532
  "moderate": {
533
- "value": "rgba(237, 237, 235, 0.15)",
533
+ "value": "rgba(237, 237, 235, 0.63)",
534
534
  "type": "color"
535
535
  },
536
536
  "focus": {
@@ -81,7 +81,7 @@
81
81
  "dark": "rgba(253, 249, 242, 0.45)"
82
82
  }
83
83
  },
84
- "$description": "Subtle borders — element separation"
84
+ "$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."
85
85
  },
86
86
  "moderate": {
87
87
  "$value": "rgba(12, 10, 9, 0.60)",
@@ -91,7 +91,7 @@
91
91
  "dark": "rgba(253, 249, 242, 0.60)"
92
92
  }
93
93
  },
94
- "$description": "Moderate borders — defined boundaries"
94
+ "$description": "Moderate borders — defined boundaries. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
95
95
  },
96
96
  "strong": {
97
97
  "$value": "rgba(12, 10, 9, 0.75)",
@@ -101,7 +101,7 @@
101
101
  "dark": "rgba(253, 249, 242, 0.75)"
102
102
  }
103
103
  },
104
- "$description": "Strong borders — prominent separation"
104
+ "$description": "Strong borders — prominent separation. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
105
105
  },
106
106
  "card": {
107
107
  "$value": "rgba(12, 10, 9, 0.60)",
@@ -111,7 +111,7 @@
111
111
  "dark": "rgba(253, 249, 242, 0.60)"
112
112
  }
113
113
  },
114
- "$description": "Card border color with transparency for subtle definition"
114
+ "$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."
115
115
  },
116
116
  "code": {
117
117
  "$value": "#d6d3d1",
@@ -153,7 +153,7 @@
153
153
  "dark": "#89827d"
154
154
  }
155
155
  },
156
- "$description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (light ≥4.6:1, dark ≥4.6:1; darkened/lightened from #78716c which failed AA on page)"
156
+ "$description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (darkened/lightened from #78716c which failed AA on page)"
157
157
  },
158
158
  "inverse": {
159
159
  "$value": "#fdf9f2",
@@ -242,7 +242,7 @@
242
242
  "dark": "#CE8E5C"
243
243
  }
244
244
  },
245
- "$description": "dissertation-ai — copper (manuscript / annotation / the human hand in the margin). Re-authored at higher P3 chroma (~+28% light / +27% dark) for a vivid wide-gamut pop; sRGB fallback unchanged so contrast is preserved. Light: 3.23:1 on stone-100 (AA-large; large-mark use). Dark: #CE8E5C 6.72:1 on ink-900 (AA)."
245
+ "$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)."
246
246
  },
247
247
  "rpkg": {
248
248
  "$value": "#3B82F6",
@@ -297,24 +297,24 @@
297
297
  },
298
298
  "border": {
299
299
  "subtle": {
300
- "$value": "rgba(20, 20, 16, 0.1)",
300
+ "$value": "rgba(20, 20, 16, 0.47)",
301
301
  "$type": "color",
302
302
  "$extensions": {
303
303
  "com.dataimago.theme": {
304
- "dark": "rgba(237, 237, 235, 0.1)"
304
+ "dark": "rgba(237, 237, 235, 0.47)"
305
305
  }
306
306
  },
307
- "$description": "Subtle borders - element separation"
307
+ "$description": "Subtle borders - element separation. THE ALPHA IS THE ROLE. Distinct from color.border.subtle: this family has its own base (20,20,16 / 237,237,235), so it needs a DIFFERENT alpha to render the same. 0.47 here matches 0.45 there at 3.07:1 on the worst surface; copying 0.45 would land at 2.90:1 and fail WCAG 1.4.11. Gated by tools/contrast-check.mjs."
308
308
  },
309
309
  "moderate": {
310
- "$value": "rgba(20, 20, 16, 0.15)",
310
+ "$value": "rgba(20, 20, 16, 0.63)",
311
311
  "$type": "color",
312
312
  "$extensions": {
313
313
  "com.dataimago.theme": {
314
- "dark": "rgba(237, 237, 235, 0.15)"
314
+ "dark": "rgba(237, 237, 235, 0.63)"
315
315
  }
316
316
  },
317
- "$description": "Moderate borders - defined boundaries"
317
+ "$description": "Moderate borders - defined boundaries. 0.63 here matches color.border.moderate 0.60 in rendered contrast; see border.subtle on why the numbers differ between the two families."
318
318
  },
319
319
  "focus": {
320
320
  "$value": "#3498DB",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataimago/tokens",
3
- "version": "0.1.0-alpha.13",
3
+ "version": "0.1.0-alpha.15",
4
4
  "description": "dataimago design tokens — canonical JSON sources plus generated TS/CSS artifacts",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/effects.json CHANGED
@@ -18,14 +18,14 @@
18
18
  },
19
19
  "border": {
20
20
  "subtle": {
21
- "light": "rgba(20, 20, 16, 0.1)",
22
- "dark": "rgba(237, 237, 235, 0.1)",
23
- "description": "Subtle borders - element separation"
21
+ "light": "rgba(20, 20, 16, 0.47)",
22
+ "dark": "rgba(237, 237, 235, 0.47)",
23
+ "description": "Subtle borders - element separation. THE ALPHA IS THE ROLE. Distinct from color.border.subtle: this family has its own base (20,20,16 / 237,237,235), so it needs a DIFFERENT alpha to render the same. 0.47 here matches 0.45 there at 3.07:1 on the worst surface; copying 0.45 would land at 2.90:1 and fail WCAG 1.4.11. Gated by tools/contrast-check.mjs."
24
24
  },
25
25
  "moderate": {
26
- "light": "rgba(20, 20, 16, 0.15)",
27
- "dark": "rgba(237, 237, 235, 0.15)",
28
- "description": "Moderate borders - defined boundaries"
26
+ "light": "rgba(20, 20, 16, 0.63)",
27
+ "dark": "rgba(237, 237, 235, 0.63)",
28
+ "description": "Moderate borders - defined boundaries. 0.63 here matches color.border.moderate 0.60 in rendered contrast; see border.subtle on why the numbers differ between the two families."
29
29
  },
30
30
  "focus": {
31
31
  "light": "#3498DB",
@@ -51,4 +51,4 @@
51
51
  "description": "Reserved for the dataimago wordmark / brand-mark transitions; do not borrow for general UI"
52
52
  }
53
53
  }
54
- }
54
+ }
@@ -105,7 +105,7 @@
105
105
  "oklch": "oklch(98.33% 0.0102 81.8 / 0.45)",
106
106
  "p3": "color(display-p3 0.9894 0.977 0.9518 / 0.45)"
107
107
  },
108
- "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."
108
+ "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."
109
109
  },
110
110
  "moderate": {
111
111
  "light": {
@@ -195,7 +195,7 @@
195
195
  },
196
196
  "dark": {
197
197
  "srgb": "#89827d",
198
- "oklch": "oklch(61.12% 0.0113 58.10)",
198
+ "oklch": "oklch(61.12% 0.0113 58.1)",
199
199
  "p3": "color(display-p3 0.5325 0.5107 0.4925)"
200
200
  },
201
201
  "description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (darkened/lightened from #78716c which failed AA on page)"
@@ -41,22 +41,22 @@
41
41
  "subtle": {
42
42
  "light": "rgba(12, 10, 9, 0.45)",
43
43
  "dark": "rgba(253, 249, 242, 0.45)",
44
- "description": "Subtle borders — element separation"
44
+ "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."
45
45
  },
46
46
  "moderate": {
47
47
  "light": "rgba(12, 10, 9, 0.60)",
48
48
  "dark": "rgba(253, 249, 242, 0.60)",
49
- "description": "Moderate borders — defined boundaries"
49
+ "description": "Moderate borders — defined boundaries. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
50
50
  },
51
51
  "strong": {
52
52
  "light": "rgba(12, 10, 9, 0.75)",
53
53
  "dark": "rgba(253, 249, 242, 0.75)",
54
- "description": "Strong borders — prominent separation"
54
+ "description": "Strong borders — prominent separation. See border.subtle on why the alpha is load-bearing and why no number is quoted here."
55
55
  },
56
56
  "card": {
57
57
  "light": "rgba(12, 10, 9, 0.60)",
58
58
  "dark": "rgba(253, 249, 242, 0.60)",
59
- "description": "Card border color with transparency for subtle definition"
59
+ "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."
60
60
  },
61
61
  "code": {
62
62
  "light": "#d6d3d1",
@@ -78,7 +78,7 @@
78
78
  "muted": {
79
79
  "light": "#706964",
80
80
  "dark": "#89827d",
81
- "description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (light ≥4.6:1, dark ≥4.6:1; darkened/lightened from #78716c which failed AA on page)"
81
+ "description": "Muted text — captions, meta info. WCAG-AA on all surfaces in both modes (darkened/lightened from #78716c which failed AA on page)"
82
82
  },
83
83
  "inverse": {
84
84
  "light": "#fdf9f2",
@@ -125,7 +125,7 @@
125
125
  "dissertation": {
126
126
  "light": "#B87333",
127
127
  "dark": "#CE8E5C",
128
- "description": "dissertation-ai — copper (manuscript / annotation / the human hand in the margin). Re-authored at higher P3 chroma (~+28% light / +27% dark) for a vivid wide-gamut pop; sRGB fallback unchanged so contrast is preserved. Light: 3.23:1 on stone-100 (AA-large; large-mark use). Dark: #CE8E5C 6.72:1 on ink-900 (AA)."
128
+ "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)."
129
129
  },
130
130
  "rpkg": {
131
131
  "light": "#3B82F6",