@adia-ai/web-components 0.6.46 → 0.6.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.
Files changed (62) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/components/badge/badge.d.ts +14 -0
  3. package/components/button/button.a2ui.json +1 -4
  4. package/components/button/button.d.ts +1 -1
  5. package/components/button/button.yaml +0 -3
  6. package/components/calendar-grid/calendar-grid.css +20 -11
  7. package/components/calendar-picker/calendar-picker.css +19 -10
  8. package/components/card/card.a2ui.json +2 -5
  9. package/components/card/card.css +25 -7
  10. package/components/card/card.d.ts +2 -2
  11. package/components/card/card.yaml +7 -5
  12. package/components/date-range-picker/date-range-picker.css +10 -1
  13. package/components/heatmap/heatmap.a2ui.json +2 -0
  14. package/components/heatmap/heatmap.d.ts +1 -1
  15. package/components/heatmap/heatmap.yaml +2 -0
  16. package/components/index.js +1 -0
  17. package/components/preview/preview.a2ui.json +93 -0
  18. package/components/preview/preview.class.js +178 -0
  19. package/components/preview/preview.css +176 -0
  20. package/components/preview/preview.d.ts +24 -0
  21. package/components/preview/preview.js +22 -0
  22. package/components/preview/preview.yaml +100 -0
  23. package/components/progress/progress.a2ui.json +2 -7
  24. package/components/progress/progress.d.ts +2 -2
  25. package/components/progress/progress.yaml +3 -8
  26. package/components/progress-row/progress-row.a2ui.json +1 -3
  27. package/components/progress-row/progress-row.d.ts +1 -1
  28. package/components/progress-row/progress-row.yaml +0 -2
  29. package/components/select/select.a2ui.json +2 -4
  30. package/components/select/select.yaml +2 -2
  31. package/components/tabs/tabs.a2ui.json +1 -4
  32. package/components/tabs/tabs.d.ts +2 -2
  33. package/components/tabs/tabs.yaml +2 -2
  34. package/core/anchor.js +5 -1
  35. package/dist/web-components.min.css +1 -1
  36. package/dist/web-components.min.js +75 -73
  37. package/index.css +6 -6
  38. package/package.json +1 -1
  39. package/styles/README.md +71 -36
  40. package/styles/api/layout.css +19 -0
  41. package/styles/api/sizing.css +225 -0
  42. package/styles/api/text.css +106 -0
  43. package/styles/colors/semantics/aliases.css +32 -0
  44. package/styles/colors/semantics/buckets.css +64 -0
  45. package/styles/colors/semantics/core.css +317 -0
  46. package/styles/colors/semantics/data-viz.css +129 -0
  47. package/styles/colors/semantics/features.css +114 -0
  48. package/styles/colors/semantics.css +10 -619
  49. package/styles/components.css +1 -0
  50. package/styles/foundation/elevation.css +29 -0
  51. package/styles/foundation/index.css +11 -0
  52. package/styles/foundation/motion.css +10 -0
  53. package/styles/foundation/radius.css +27 -0
  54. package/styles/foundation/size.css +33 -0
  55. package/styles/foundation/space.css +47 -0
  56. package/styles/index.css +14 -0
  57. package/styles/resets.css +17 -25
  58. package/styles/tokens.css +16 -384
  59. package/styles/type/elements.css +225 -0
  60. package/styles/type/roles.css +419 -0
  61. package/styles/type/scale.css +89 -0
  62. package/styles/typography.css +11 -809
@@ -0,0 +1,317 @@
1
+ /* adia:semantic/color — core semantic color aliases (L2 + L3).
2
+ The consumable API: canvas (neutral fg/bg/border), accent, brand, and
3
+ the four status families (info/success/warning/danger). Split out of
4
+ the 636-line semantics.css (v0.6.48 reorg, ADR-0035); imported FIRST by
5
+ the semantics.css barrel so the status-compat overrides in aliases.css
6
+ (imported last) still win, exactly as in the original source order. */
7
+
8
+ :root, theme-ui, [data-theme] {
9
+
10
+ /* ══════════════════════════════════════════════════════════════
11
+ CANVAS — Neutral text, borders, surfaces
12
+ ══════════════════════════════════════════════════════════════ */
13
+
14
+ /* L2 — family tokens */
15
+ --a-canvas-strong: light-dark(var(--a-neutral-50-tint), var(--a-neutral-60-shade));
16
+ --a-canvas: var(--a-neutral-50);
17
+ --a-canvas-subtle: light-dark(var(--a-neutral-20-tint), var(--a-neutral-30-shade));
18
+ --a-canvas-muted: light-dark(var(--a-neutral-10-tint), var(--a-neutral-15-shade));
19
+ --a-canvas-hover: light-dark(var(--a-neutral-60-tint), var(--a-neutral-60-shade));
20
+ --a-canvas-active: light-dark(var(--a-neutral-60-tint), var(--a-neutral-65-shade));
21
+ --a-canvas-selected: light-dark(var(--a-neutral-45-tint), var(--a-neutral-50-shade));
22
+
23
+ /* Text on neutral surfaces — low shade steps = dark text for light mode.
24
+ Dark-mode tint spread widened: text→subtle gap 25→35 steps,
25
+ subtle→disabled gap 10→15 steps, for clearer visual hierarchy. */
26
+ /* Subtle + muted lifted one fine-step shade-side to clear WCAG AA
27
+ 4.5:1 on canvas-0/1/2 in both schemes. Subtle ↔ muted gap
28
+ compresses from 10 to 5 step-fractions — visual hierarchy
29
+ leans more on font-weight + size and less on shade contrast. */
30
+ --a-canvas-text-strong: light-dark(var(--a-neutral-05-shade), var(--a-neutral-05-tint));
31
+ --a-canvas-text: light-dark(var(--a-neutral-20-shade), var(--a-neutral-20-tint));
32
+ --a-canvas-text-subtle: light-dark(var(--a-neutral-35-shade), var(--a-neutral-35-tint));
33
+ --a-canvas-text-muted: light-dark(var(--a-neutral-50-shade), var(--a-neutral-50-tint));
34
+ --a-canvas-text-disabled: light-dark(var(--a-neutral-65-shade), var(--a-neutral-65-tint));
35
+ --a-canvas-text-inverse: var(--a-neutral-10);
36
+
37
+ /* Luminance-direction surfaces (always darken relative to canvas-0) */
38
+ --a-canvas-well: var(--a-canvas-1); /* sunken panels, code blocks */
39
+ --a-canvas-inset: var(--a-canvas-0); /* recessed inputs, wells */
40
+ --a-canvas-pressed: var(--a-canvas-2); /* pressed/active button states */
41
+
42
+ /* Borders on neutral surfaces — adaptive scrims flip polarity per mode. */
43
+ --a-canvas-border-subtle: var(--a-neutral-0-scrim);
44
+ --a-canvas-border: var(--a-neutral-2-scrim);
45
+ --a-canvas-border-strong: var(--a-neutral-4-scrim);
46
+
47
+ /* L3 — short-alias matrix (the consumable API for neutral surfaces) */
48
+ --a-bg: var(--a-canvas-0);
49
+ --a-bg-scrim: var(--a-canvas-0-scrim);
50
+ --a-bg-subtle: var(--a-canvas-1);
51
+ --a-bg-muted: var(--a-canvas-0-scrim);
52
+ --a-bg-strong: var(--a-canvas-3);
53
+ --a-bg-hover: var(--a-canvas-2);
54
+ --a-bg-active: var(--a-canvas-pressed);
55
+ --a-bg-selected: var(--a-canvas-0-scrim);
56
+ --a-bg-disabled: var(--a-canvas-muted);
57
+ --a-bg-invalid: var(--a-danger-muted);
58
+
59
+ --a-fg: var(--a-canvas-text);
60
+ --a-fg-subtle: var(--a-canvas-text-subtle);
61
+ --a-fg-muted: var(--a-canvas-text-muted);
62
+ --a-fg-strong: var(--a-canvas-text-strong);
63
+ --a-fg-hover: var(--a-canvas-text-strong);
64
+ /* ADR-0028: --a-fg-{active,invalid} retired (zero consumers). Use
65
+ `--a-ui-text-active` / `--a-ui-text-invalid` for form-control state,
66
+ or define a per-primitive `--<comp>-fg-{active,invalid}` token. */
67
+ --a-fg-selected: var(--a-canvas-text-strong);
68
+ --a-fg-disabled: var(--a-canvas-text-disabled);
69
+ --a-fg-inverse: var(--a-canvas-text-inverse);
70
+
71
+ --a-border: var(--a-canvas-border);
72
+ --a-border-subtle: var(--a-canvas-border-subtle);
73
+ --a-border-strong: var(--a-canvas-border-strong);
74
+ --a-border-hover: var(--a-canvas-border-strong);
75
+ /* ADR-0028: --a-border-{active,selected,disabled,invalid} retired (zero
76
+ consumers). Per-primitive `--<comp>-border-{state}` is the override
77
+ surface; `--a-focus-ring` carries focus-active borders for form
78
+ controls. */
79
+
80
+ /* ══════════════════════════════════════════════════════════════
81
+ ACCENT — Interactive, links, focus (source for --a-primary-*)
82
+ ══════════════════════════════════════════════════════════════ */
83
+
84
+ /* L2 — family tokens */
85
+ --a-accent-strong: var(--a-accent-50);
86
+ --a-accent: var(--a-accent-50);
87
+ --a-accent-subtle: var(--a-accent-20);
88
+ --a-accent-muted: var(--a-accent-10);
89
+ --a-accent-hover: var(--a-accent-40);
90
+ --a-accent-active: var(--a-accent-60);
91
+ --a-accent-selected: var(--a-accent-50);
92
+
93
+ /* Link family — derived from accent steps deeper than --a-accent-strong
94
+ (step-50) so links clear WCAG AA 4.5:1 on canvas-0/1/2 in both
95
+ schemes. Anchor color in `typography.css` reads --a-link rather
96
+ than --a-accent-strong; emphasis on hover comes from a tighter
97
+ chroma + darker step rather than full saturation jump. */
98
+ /* Polarity matches `--a-accent-N` family wrappers: at fine steps >50,
99
+ `tint` is the lower-L (deeper) primitive and `shade` is the higher-L
100
+ primitive — the naming inverts past the convergence point. Light
101
+ mode wants dark-on-light, so we pick `tint` (deep accent); dark
102
+ mode wants light-on-dark, so we pick `shade` (lifted accent). */
103
+ --a-link: light-dark(var(--a-accent-55-tint), var(--a-accent-55-shade));
104
+ --a-link-hover: light-dark(var(--a-accent-70-tint), var(--a-accent-70-shade));
105
+ --a-link-visited: light-dark(var(--a-accent-65-tint), var(--a-accent-65-shade));
106
+
107
+ /* Accent text on accent solid bg — needs light text on dark-ish accent */
108
+ --a-accent-text-strong: light-dark(var(--a-accent-05-shade), var(--a-accent-05-tint));
109
+ --a-accent-text: light-dark(var(--a-accent-10-shade), var(--a-accent-10-tint));
110
+ --a-accent-text-subtle: light-dark(var(--a-accent-30-shade), var(--a-accent-30-tint));
111
+ --a-accent-text-disabled: light-dark(var(--a-accent-60-shade), var(--a-accent-60-tint));
112
+
113
+ --a-accent-border-subtle: var(--a-accent-30);
114
+ --a-accent-border: var(--a-accent-45);
115
+ --a-accent-border-strong: var(--a-accent-60);
116
+
117
+ /* L3 — Primary (accent-filled — CTA buttons, checked controls) */
118
+ --a-primary-bg: var(--a-accent-strong);
119
+ --a-primary-bg-hover: var(--a-accent-hover);
120
+ --a-primary-bg-active: var(--a-accent-active);
121
+
122
+ --a-primary-fg: var(--a-accent-05-tint);
123
+ --a-primary-fg-hover: var(--a-accent-text-strong);
124
+
125
+ --a-primary-border: var(--a-accent-border);
126
+ --a-primary-border-hover: var(--a-accent-border-strong);
127
+
128
+ /* Legacy shorthand — keep until all components migrate to --a-primary-* */
129
+ --a-primary: var(--a-primary-bg);
130
+ --a-primary-hover: var(--a-primary-bg-hover);
131
+
132
+ /* L3 — Accent surface role matrix (parallel to --a-primary-*, keeps the
133
+ accent family addressable under its own name for components that want
134
+ accent-hued surfaces without the "primary action" connotation). */
135
+ --a-accent-bg: var(--a-primary-bg);
136
+ --a-accent-bg-hover: var(--a-primary-bg-hover);
137
+ --a-accent-bg-active: var(--a-primary-bg-active);
138
+
139
+ --a-accent-fg: var(--a-primary-fg);
140
+ --a-accent-fg-hover: var(--a-primary-fg-hover);
141
+
142
+ /* accent border is already defined at L2 (--a-accent-border*);
143
+ L3 matches L2 since both resolve to the same scheme-aware value. */
144
+
145
+ /* ══════════════════════════════════════════════════════════════
146
+ BRAND — Non-interactive identity color
147
+ ══════════════════════════════════════════════════════════════ */
148
+
149
+ /* L2 — family tokens */
150
+ --a-brand-strong: var(--a-brand-70);
151
+ --a-brand: var(--a-brand-50);
152
+ --a-brand-subtle: var(--a-brand-40);
153
+ --a-brand-muted: var(--a-brand-30);
154
+ --a-brand-hover: var(--a-brand-60);
155
+ --a-brand-active: var(--a-brand-60);
156
+ --a-brand-selected: var(--a-brand-40);
157
+
158
+ --a-brand-text-strong: light-dark(var(--a-brand-05-tint), var(--a-brand-05-tint));
159
+ --a-brand-text: light-dark(var(--a-brand-10-tint), var(--a-brand-10-tint));
160
+ --a-brand-text-subtle: light-dark(var(--a-brand-30-tint), var(--a-brand-30-tint));
161
+ --a-brand-text-disabled: light-dark(var(--a-brand-60-shade), var(--a-brand-60-tint));
162
+
163
+ --a-brand-border-subtle: var(--a-brand-30);
164
+ --a-brand-border: var(--a-brand-45);
165
+ --a-brand-border-strong: var(--a-brand-60);
166
+
167
+ /* L3 — Brand surface role matrix */
168
+ --a-brand-bg: var(--a-brand-strong);
169
+ --a-brand-bg-hover: var(--a-brand-hover);
170
+
171
+ --a-brand-fg: var(--a-brand-text-strong);
172
+ --a-brand-fg-hover: var(--a-brand-text-strong);
173
+
174
+ /* L3 border state matrix — rest state is --a-brand-border (L2 above). */
175
+ --a-brand-border-hover: var(--a-brand-border-strong);
176
+
177
+ /* ══════════════════════════════════════════════════════════════
178
+ INFO
179
+ ══════════════════════════════════════════════════════════════ */
180
+
181
+ /* L2 — family tokens */
182
+ --a-info-strong: var(--a-info-50);
183
+ --a-info: var(--a-info-50);
184
+ --a-info-subtle: var(--a-info-20);
185
+ --a-info-muted: var(--a-info-10);
186
+ --a-info-hover: var(--a-info-40);
187
+ --a-info-active: var(--a-info-60);
188
+ --a-info-selected: var(--a-info-50);
189
+
190
+ --a-info-text-strong: light-dark(var(--a-info-05-tint), var(--a-info-05-tint));
191
+ --a-info-text: light-dark(var(--a-info-20-shade), var(--a-info-20-tint));
192
+ --a-info-text-subtle: light-dark(var(--a-info-45-shade), var(--a-info-45-tint));
193
+ --a-info-text-disabled: light-dark(var(--a-info-60-shade), var(--a-info-60-tint));
194
+
195
+ --a-info-border-subtle: var(--a-info-30);
196
+ --a-info-border: var(--a-info-40);
197
+ --a-info-border-strong: var(--a-info-60);
198
+
199
+ /* L3 — Info surface role matrix */
200
+ --a-info-bg: var(--a-info-strong);
201
+ --a-info-bg-hover: var(--a-info-hover);
202
+
203
+ --a-info-fg: var(--a-info-text-strong);
204
+ --a-info-fg-hover: var(--a-info-text-strong);
205
+
206
+ /* L3 border state matrix — rest state is --a-info-border (L2 above). */
207
+ --a-info-border-hover: var(--a-info-border-strong);
208
+
209
+ /* ══════════════════════════════════════════════════════════════
210
+ SUCCESS
211
+ ══════════════════════════════════════════════════════════════ */
212
+
213
+ /* L2 — family tokens */
214
+ --a-success-strong: var(--a-success-50);
215
+ --a-success: var(--a-success-50);
216
+ --a-success-subtle: var(--a-success-20);
217
+ --a-success-muted: var(--a-success-10);
218
+ --a-success-hover: var(--a-success-40);
219
+ --a-success-active: var(--a-success-60);
220
+ --a-success-selected: var(--a-success-50);
221
+
222
+ --a-success-text-strong: light-dark(var(--a-success-05-tint), var(--a-success-05-tint));
223
+ --a-success-text: light-dark(var(--a-success-20-shade), var(--a-success-20-tint));
224
+ --a-success-text-subtle: light-dark(var(--a-success-45-shade), var(--a-success-45-tint));
225
+ --a-success-text-disabled: light-dark(var(--a-success-60-shade), var(--a-success-60-tint));
226
+
227
+ --a-success-border-subtle: var(--a-success-30);
228
+ --a-success-border: var(--a-success-40);
229
+ --a-success-border-strong: var(--a-success-60);
230
+
231
+ /* L3 — Success surface role matrix */
232
+ --a-success-bg: var(--a-success-strong);
233
+ --a-success-bg-hover: var(--a-success-hover);
234
+
235
+ --a-success-fg: var(--a-success-text-strong);
236
+ --a-success-fg-hover: var(--a-success-text-strong);
237
+
238
+ /* L3 border state matrix — rest state is --a-success-border (L2 above). */
239
+ --a-success-border-hover: var(--a-success-border-strong);
240
+
241
+ /* ══════════════════════════════════════════════════════════════
242
+ WARNING
243
+ ══════════════════════════════════════════════════════════════ */
244
+
245
+ /* L2 — family tokens */
246
+ --a-warning-strong: var(--a-warning-50);
247
+ --a-warning: var(--a-warning-50);
248
+ --a-warning-subtle: var(--a-warning-20);
249
+ --a-warning-muted: var(--a-warning-10);
250
+ --a-warning-hover: var(--a-warning-40);
251
+ --a-warning-active: var(--a-warning-60);
252
+ --a-warning-selected: var(--a-warning-50);
253
+
254
+ /* warning is light-colored — text on warning fills should be dark */
255
+ --a-warning-text-strong: light-dark(var(--a-warning-10-shade), var(--a-warning-10-shade));
256
+ --a-warning-text: light-dark(var(--a-warning-20-shade), var(--a-warning-20-tint));
257
+ --a-warning-text-subtle: light-dark(var(--a-warning-45-shade), var(--a-warning-45-tint));
258
+ --a-warning-text-disabled: light-dark(var(--a-warning-60-shade), var(--a-warning-60-tint));
259
+
260
+ --a-warning-border-subtle: var(--a-warning-30);
261
+ --a-warning-border: var(--a-warning-40);
262
+ --a-warning-border-strong: var(--a-warning-60);
263
+
264
+ /* L3 — Warning surface role matrix.
265
+ `--a-warning-bg` deliberately diverges from `--a-warning-strong`
266
+ (still the L2 saturated mid-tone, used as a fg/icon color by
267
+ alert / chart / code / empty-state / agent-trace). Surfaces using
268
+ `-bg` pair it with the dark `--a-warning-fg` (= -text-strong =
269
+ -10-shade); `-strong` + `-fg` gave muddy brown-on-brown chips
270
+ (pre-v0.6.36 user report on <tag-ui variant="warning">).
271
+ `--a-warning-20-tint` is bright in both schemes (lightness math
272
+ is scheme-independent) so warning surfaces keep the same
273
+ caution-tape look in light + dark mode. */
274
+ --a-warning-bg: var(--a-warning-20-tint);
275
+ --a-warning-bg-hover: var(--a-warning-hover);
276
+
277
+ --a-warning-fg: var(--a-warning-text-strong);
278
+ --a-warning-fg-hover: var(--a-warning-text-strong);
279
+
280
+ /* L3 border state matrix — rest state is --a-warning-border (L2 above). */
281
+ --a-warning-border-hover: var(--a-warning-border-strong);
282
+
283
+ /* ══════════════════════════════════════════════════════════════
284
+ DANGER
285
+ ══════════════════════════════════════════════════════════════ */
286
+
287
+ /* L2 — family tokens */
288
+ --a-danger-strong: var(--a-danger-50);
289
+ --a-danger: var(--a-danger-50);
290
+ --a-danger-subtle: var(--a-danger-20);
291
+ --a-danger-muted: var(--a-danger-10);
292
+ --a-danger-hover: var(--a-danger-40);
293
+ --a-danger-active: var(--a-danger-60);
294
+ --a-danger-selected: var(--a-danger-50);
295
+
296
+ /* text-strong: light text for use ON danger solid fills (both modes)
297
+ text-default/subtle: dark text for use on neutral surfaces ABOUT danger */
298
+ --a-danger-text-strong: light-dark(var(--a-danger-05-tint), var(--a-danger-05-tint));
299
+ --a-danger-text: light-dark(var(--a-danger-20-shade), var(--a-danger-20-tint));
300
+ --a-danger-text-subtle: light-dark(var(--a-danger-45-shade), var(--a-danger-45-tint));
301
+ --a-danger-text-disabled: light-dark(var(--a-danger-60-shade), var(--a-danger-60-tint));
302
+
303
+ --a-danger-border-subtle: var(--a-danger-30);
304
+ --a-danger-border: var(--a-danger-40);
305
+ --a-danger-border-strong: var(--a-danger-60);
306
+
307
+ /* L3 — Danger surface role matrix */
308
+ --a-danger-bg: var(--a-danger-strong);
309
+ --a-danger-bg-hover: var(--a-danger-hover);
310
+
311
+ --a-danger-fg: var(--a-danger-text-strong);
312
+ --a-danger-fg-hover: var(--a-danger-text-strong);
313
+
314
+ /* L3 border state matrix — rest state is --a-danger-border (L2 above). */
315
+ --a-danger-border-hover: var(--a-danger-border-strong);
316
+
317
+ }
@@ -0,0 +1,129 @@
1
+ /* adia:semantic/color — categorical data-visualization palette.
2
+ The 10 --a-data-0..9 series colors + their @property tuning knobs.
3
+ Split out of semantics.css (v0.6.48 reorg, ADR-0035). The @property
4
+ registrations are global, so relocating them here is cascade-inert. */
5
+
6
+ /* ─── Data palette parameterization ───
7
+ All 10 slots live in an analogous arc centered on --a-accent-hue,
8
+ fanning out in alternating cool/warm pairs with a uniform step
9
+ (--a-data-delta). Slot 0 is the anchor (accent hue). Slots 1-8 are
10
+ symmetric pairs at ±1, ±2, ±3, ±4 × delta; slot 9 extends one more
11
+ step on the warm side (+5 × delta).
12
+
13
+ Offsets from --a-accent-hue:
14
+ 0: 0 1: −1Δ 2: +1Δ 3: −2Δ 4: +2Δ
15
+ 5: −3Δ 6: +3Δ 7: −4Δ 8: +4Δ 9: +5Δ
16
+
17
+ Two axes of differentiation — hue (via delta) AND lightness (via a
18
+ 3-phase rotation keyed on N mod 3). Under CVD (deuteranopia/protanopia)
19
+ the red-green axis collapses and same-L neighbors in the green-teal
20
+ zone would converge; the L rotation rescues them by ensuring any three
21
+ consecutive slots have three different L values.
22
+
23
+ Tuning knobs:
24
+ --a-data-delta : hue step between consecutive pairs (default 22)
25
+ --a-data-l-spread : ±L offset for phases 1 and 2 (default 0.07)
26
+ --a-data-l-light : base L for phase-0 slots in light mode
27
+ --a-data-l-dark : base L for phase-0 slots in dark mode
28
+ --a-data-c : uniform chroma across all slots
29
+ --a-data-N-hue : pin an individual slot's hue absolutely
30
+
31
+ At default accent=225, delta=22: slot 7 lands at 137 (8° from success
32
+ hue 145) and slot 2 at 247 (3° from info hue 250). The L rotation
33
+ places slot 2 in phase 2 (deeper) and slot 7 in phase 1 (lighter),
34
+ so neither reads as its respective status token. */
35
+ @property --a-data-l-light { syntax: "<number>"; inherits: true; initial-value: 0.55; }
36
+ @property --a-data-l-dark { syntax: "<number>"; inherits: true; initial-value: 0.72; }
37
+ @property --a-data-l-spread { syntax: "<number>"; inherits: true; initial-value: 0.10; }
38
+ @property --a-data-c { syntax: "<number>"; inherits: true; initial-value: 0.16; }
39
+ @property --a-data-delta { syntax: "<number>"; inherits: true; initial-value: 22; }
40
+ @property --a-data-0-hue { syntax: "<number>"; inherits: true; initial-value: 225; }
41
+ @property --a-data-1-hue { syntax: "<number>"; inherits: true; initial-value: 203; }
42
+ @property --a-data-2-hue { syntax: "<number>"; inherits: true; initial-value: 247; }
43
+ @property --a-data-3-hue { syntax: "<number>"; inherits: true; initial-value: 181; }
44
+ @property --a-data-4-hue { syntax: "<number>"; inherits: true; initial-value: 269; }
45
+ @property --a-data-5-hue { syntax: "<number>"; inherits: true; initial-value: 159; }
46
+ @property --a-data-6-hue { syntax: "<number>"; inherits: true; initial-value: 291; }
47
+ @property --a-data-7-hue { syntax: "<number>"; inherits: true; initial-value: 137; }
48
+ @property --a-data-8-hue { syntax: "<number>"; inherits: true; initial-value: 313; }
49
+ @property --a-data-9-hue { syntax: "<number>"; inherits: true; initial-value: 335; }
50
+
51
+ :root, theme-ui, [data-theme] {
52
+ /* ══════════════════════════════════════════════════════════════
53
+ DATA PALETTE — 10 categorical series colors for charts
54
+
55
+ All 10 slots are computed as offsets from --a-accent-hue via a
56
+ single --a-data-delta step, so retuning accent or delta shifts the
57
+ whole palette coherently. Slot 0 is the anchor (accent hue); slots
58
+ 1-8 alternate cool/warm at ±1..±4 × delta; slot 9 extends to +5Δ.
59
+
60
+ Override --a-data-l-light / --a-data-l-dark / --a-data-c to retune
61
+ the palette's tone, --a-data-delta to squeeze or spread the arc,
62
+ or any --a-data-N-hue to pin an individual slot.
63
+ ══════════════════════════════════════════════════════════════ */
64
+
65
+ --a-data-0-hue: var(--a-accent-hue);
66
+ --a-data-1-hue: calc(var(--a-accent-hue) - var(--a-data-delta) * 1);
67
+ --a-data-2-hue: calc(var(--a-accent-hue) + var(--a-data-delta) * 1);
68
+ --a-data-3-hue: calc(var(--a-accent-hue) - var(--a-data-delta) * 2);
69
+ --a-data-4-hue: calc(var(--a-accent-hue) + var(--a-data-delta) * 2);
70
+ --a-data-5-hue: calc(var(--a-accent-hue) - var(--a-data-delta) * 3);
71
+ --a-data-6-hue: calc(var(--a-accent-hue) + var(--a-data-delta) * 3);
72
+ --a-data-7-hue: calc(var(--a-accent-hue) - var(--a-data-delta) * 4);
73
+ --a-data-8-hue: calc(var(--a-accent-hue) + var(--a-data-delta) * 4);
74
+ --a-data-9-hue: calc(var(--a-accent-hue) + var(--a-data-delta) * 5);
75
+
76
+ /* Three L phases — each slot's phase is (N mod 3). Two consecutive
77
+ slots always differ in both hue AND lightness, and any three
78
+ consecutive slots span all three L values, so no CVD-collapse
79
+ pocket of same-L slots exists in the green-teal confusion zone. */
80
+ --_data-l-light-0: var(--a-data-l-light);
81
+ --_data-l-light-1: calc(var(--a-data-l-light) + var(--a-data-l-spread));
82
+ --_data-l-light-2: calc(var(--a-data-l-light) - var(--a-data-l-spread));
83
+ --_data-l-dark-0: var(--a-data-l-dark);
84
+ --_data-l-dark-1: calc(var(--a-data-l-dark) + var(--a-data-l-spread));
85
+ --_data-l-dark-2: calc(var(--a-data-l-dark) - var(--a-data-l-spread));
86
+
87
+ /* slot N uses L-phase (N mod 3): 0/3/6/9 → phase 0; 1/4/7 → phase 1; 2/5/8 → phase 2 */
88
+ --a-data-0: light-dark(
89
+ oklch(var(--_data-l-light-0) var(--a-data-c) var(--a-data-0-hue)),
90
+ oklch(var(--_data-l-dark-0) var(--a-data-c) var(--a-data-0-hue))
91
+ );
92
+ --a-data-1: light-dark(
93
+ oklch(var(--_data-l-light-1) var(--a-data-c) var(--a-data-1-hue)),
94
+ oklch(var(--_data-l-dark-1) var(--a-data-c) var(--a-data-1-hue))
95
+ );
96
+ --a-data-2: light-dark(
97
+ oklch(var(--_data-l-light-2) var(--a-data-c) var(--a-data-2-hue)),
98
+ oklch(var(--_data-l-dark-2) var(--a-data-c) var(--a-data-2-hue))
99
+ );
100
+ --a-data-3: light-dark(
101
+ oklch(var(--_data-l-light-0) var(--a-data-c) var(--a-data-3-hue)),
102
+ oklch(var(--_data-l-dark-0) var(--a-data-c) var(--a-data-3-hue))
103
+ );
104
+ --a-data-4: light-dark(
105
+ oklch(var(--_data-l-light-1) var(--a-data-c) var(--a-data-4-hue)),
106
+ oklch(var(--_data-l-dark-1) var(--a-data-c) var(--a-data-4-hue))
107
+ );
108
+ --a-data-5: light-dark(
109
+ oklch(var(--_data-l-light-2) var(--a-data-c) var(--a-data-5-hue)),
110
+ oklch(var(--_data-l-dark-2) var(--a-data-c) var(--a-data-5-hue))
111
+ );
112
+ --a-data-6: light-dark(
113
+ oklch(var(--_data-l-light-0) var(--a-data-c) var(--a-data-6-hue)),
114
+ oklch(var(--_data-l-dark-0) var(--a-data-c) var(--a-data-6-hue))
115
+ );
116
+ --a-data-7: light-dark(
117
+ oklch(var(--_data-l-light-1) var(--a-data-c) var(--a-data-7-hue)),
118
+ oklch(var(--_data-l-dark-1) var(--a-data-c) var(--a-data-7-hue))
119
+ );
120
+ --a-data-8: light-dark(
121
+ oklch(var(--_data-l-light-2) var(--a-data-c) var(--a-data-8-hue)),
122
+ oklch(var(--_data-l-dark-2) var(--a-data-c) var(--a-data-8-hue))
123
+ );
124
+ --a-data-9: light-dark(
125
+ oklch(var(--_data-l-light-0) var(--a-data-c) var(--a-data-9-hue)),
126
+ oklch(var(--_data-l-dark-0) var(--a-data-c) var(--a-data-9-hue))
127
+ );
128
+
129
+ }
@@ -0,0 +1,114 @@
1
+ /* adia:semantic/color — semantic feature surfaces.
2
+ FOCUS (canonical ring recipe), UI/FIELD (form input surfaces),
3
+ HIGHLIGHT & SELECTION, and CHROME (neutral overlays on arbitrary
4
+ backgrounds). Contiguous in the original source; split out of
5
+ semantics.css (v0.6.48 reorg, ADR-0035). */
6
+
7
+ :root, theme-ui, [data-theme] {
8
+ /* ══════════════════════════════════════════════════════════════
9
+ FOCUS — canonical ring recipe shared by all form controls
10
+ ══════════════════════════════════════════════════════════════
11
+
12
+ The ring is a dual-layer box-shadow: an inner "gap" the canvas
13
+ color wide, then an outer ring the accent color wide. Tuning any
14
+ of the scalar tokens below cascades to every component that
15
+ consumes `--a-focus-ring`:
16
+
17
+ --a-focus-width — outer ring thickness
18
+ --a-focus-offset — inner gap thickness (distance from element
19
+ edge to ring)
20
+ --a-focus-color — ring color (default: accent-strong)
21
+ --a-focus-bg — gap color (default: the surface under the
22
+ control; normally matches --a-canvas-0)
23
+
24
+ Invalid / error state uses the same geometry but a danger color
25
+ via `--a-focus-ring-invalid`.
26
+
27
+ Components must NOT hardcode 2px / 4px / accent hex in their CSS;
28
+ consume either `--a-focus-ring` directly or an L3 alias like
29
+ `--{component}-focus-ring: var(--a-focus-ring)` (the more common
30
+ pattern — gives per-component override headroom without breaking
31
+ the canonical default). */
32
+
33
+ --a-focus-color: var(--a-accent-strong);
34
+ --a-focus-color-invalid: var(--a-danger);
35
+ --a-focus-width: 2px;
36
+ --a-focus-offset: 2px;
37
+ --a-focus-bg: var(--a-canvas-0);
38
+
39
+ --a-focus-ring-shadow: 0 0 0 var(--a-focus-offset) var(--a-focus-bg),
40
+ 0 0 0 calc(var(--a-focus-offset) + var(--a-focus-width)) var(--a-focus-color);
41
+ --a-focus-ring-shadow-invalid: 0 0 0 var(--a-focus-offset) var(--a-focus-bg),
42
+ 0 0 0 calc(var(--a-focus-offset) + var(--a-focus-width)) var(--a-focus-color-invalid);
43
+
44
+ /* L3 — what components consume. */
45
+ --a-ring: var(--a-focus-color);
46
+ --a-ring-invalid: var(--a-focus-color-invalid);
47
+ --a-focus-ring: var(--a-focus-ring-shadow);
48
+ --a-focus-ring-invalid: var(--a-focus-ring-shadow-invalid);
49
+
50
+ /* ══════════════════════════════════════════════════════════════
51
+ UI (FIELD) — Form input surfaces
52
+ ══════════════════════════════════════════════════════════════ */
53
+
54
+ --a-ui-bg: var(--a-canvas-0-scrim);
55
+ --a-ui-bg-hover: var(--a-canvas-0-scrim);
56
+ --a-ui-bg-active: var(--a-canvas-0);
57
+ --a-ui-bg-selected: var(--a-canvas-0-scrim);
58
+ --a-ui-bg-disabled: var(--a-canvas-1);
59
+ --a-ui-bg-invalid: var(--a-danger-muted);
60
+
61
+ --a-ui-text: var(--a-fg-strong);
62
+ --a-ui-text-hover: var(--a-fg-strong);
63
+ --a-ui-text-active: var(--a-fg-strong);
64
+ --a-ui-text-selected: var(--a-fg-strong);
65
+ --a-ui-text-placeholder: var(--a-fg-muted);
66
+ --a-ui-text-subtle: var(--a-fg-subtle);
67
+ --a-ui-text-muted: var(--a-fg-muted);
68
+ --a-ui-text-disabled: var(--a-fg-disabled);
69
+ --a-ui-text-invalid: var(--a-danger-text);
70
+
71
+ --a-ui-border: light-dark(var(--a-neutral-85-shade), var(--a-neutral-85-tint));
72
+ --a-ui-border-hover: light-dark(var(--a-neutral-75-shade), var(--a-neutral-75-tint));
73
+ --a-ui-border-active: var(--a-accent-50);
74
+ --a-ui-border-selected: var(--a-accent-50);
75
+ --a-ui-border-disabled: var(--a-neutral-30);
76
+ --a-ui-border-invalid: var(--a-danger-50);
77
+
78
+ --a-ui-caret: var(--a-accent-50);
79
+
80
+ /* ══════════════════════════════════════════════════════════════
81
+ HIGHLIGHT & SELECTION — Text-level emphasis
82
+ ══════════════════════════════════════════════════════════════ */
83
+
84
+ --a-highlight-strong: var(--a-warning-30);
85
+ --a-highlight: var(--a-warning-20);
86
+ --a-highlight-subtle: var(--a-warning-10);
87
+ --a-highlight-text: var(--a-fg-strong);
88
+
89
+ --a-selection-bg: var(--a-accent-20);
90
+ --a-selection-text: var(--a-fg-strong);
91
+ --a-selection-radius: var(--a-space-1);
92
+
93
+ /* ══════════════════════════════════════════════════════════════
94
+ CHROME — Neutral overlays on arbitrary-color surfaces
95
+ Theme-stable near-opaque white/black for UI chrome drawn on
96
+ top of unpredictable content (color-picker thumbs, video
97
+ controls, modal scrims). Do NOT theme-tint — chrome must read
98
+ equally against red / blue / dark / light underlays.
99
+ ══════════════════════════════════════════════════════════════ */
100
+
101
+ --a-chrome-light: var(--a-neutral-0-tint);
102
+ --a-chrome-dark: var(--a-neutral-0-shade);
103
+ --a-chrome-border: var(--a-chrome-light);
104
+ --a-chrome-ring-subtle: oklch(0 0 0 / 0.3);
105
+ --a-chrome-shadow-soft: oklch(0 0 0 / 0.2);
106
+ --a-chrome-backdrop: oklch(0 0 0 / 0.5);
107
+ /* §230-bundle (v0.5.9): canonical badge-on-chrome pair — light text +
108
+ dark semi-transparent surface. Used by primitives that overlay text
109
+ on unpredictable backgrounds (swatch badges, video controls, color
110
+ readouts). Must read against red / blue / dark / light underlays. */
111
+ --a-chrome-fg: var(--a-chrome-light);
112
+ --a-chrome-bg: oklch(0 0 0 / 0.4);
113
+
114
+ }