@adia-ai/web-components 0.7.28 → 0.8.0

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 (156) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/components/accordion/accordion.css +13 -4
  3. package/components/action-list/action-list.css +3 -3
  4. package/components/agent-artifact/agent-artifact.css +4 -4
  5. package/components/agent-questions/agent-questions.css +8 -8
  6. package/components/agent-reasoning/agent-reasoning.css +6 -6
  7. package/components/agent-trace/agent-trace.css +4 -4
  8. package/components/agent-trace/agent-trace.js +1 -1
  9. package/components/alert/alert.css +16 -16
  10. package/components/avatar/avatar.css +3 -3
  11. package/components/badge/badge.css +32 -32
  12. package/components/blockquote/blockquote.css +1 -1
  13. package/components/breadcrumb/breadcrumb.css +2 -2
  14. package/components/button/button.css +14 -14
  15. package/components/calendar-grid/calendar-grid.a2ui.json +3 -3
  16. package/components/calendar-grid/calendar-grid.css +10 -10
  17. package/components/calendar-grid/calendar-grid.yaml +3 -3
  18. package/components/calendar-picker/calendar-picker.css +11 -11
  19. package/components/canvas/canvas.css +2 -2
  20. package/components/card/card.css +15 -15
  21. package/components/chart/chart.css +23 -23
  22. package/components/chart-legend/chart-legend.css +2 -2
  23. package/components/chat-thread/chat-input.css +6 -6
  24. package/components/chat-thread/chat-thread.css +7 -7
  25. package/components/check/check.css +4 -4
  26. package/components/code/code-editor.js +1 -1
  27. package/components/code/code.css +45 -22
  28. package/components/color-picker/color-picker.css +4 -4
  29. package/components/combobox/combobox.css +6 -6
  30. package/components/command/command.class.js +14 -3
  31. package/components/command/command.css +4 -4
  32. package/components/context-menu/context-menu.css +2 -2
  33. package/components/date-range-picker/date-range-picker.a2ui.json +3 -3
  34. package/components/date-range-picker/date-range-picker.css +8 -8
  35. package/components/date-range-picker/date-range-picker.yaml +3 -3
  36. package/components/datetime-picker/datetime-picker.css +6 -6
  37. package/components/demo-toggle/demo-toggle.css +4 -4
  38. package/components/description-list/description-list.css +1 -1
  39. package/components/display-field/display-field.css +2 -2
  40. package/components/divider/divider.css +1 -1
  41. package/components/drawer/drawer.css +7 -7
  42. package/components/embed/embed.css +1 -1
  43. package/components/empty-state/empty-state.css +5 -5
  44. package/components/feed/feed.css +7 -7
  45. package/components/field/field.css +2 -2
  46. package/components/heatmap/heatmap.css +8 -8
  47. package/components/inline-edit/inline-edit.a2ui.json +1 -1
  48. package/components/inline-edit/inline-edit.css +3 -3
  49. package/components/inline-edit/inline-edit.yaml +1 -1
  50. package/components/inline-message/inline-message.css +4 -4
  51. package/components/input/input.css +1 -1
  52. package/components/inspector/inspector.css +1 -1
  53. package/components/integration-card/integration-card.css +3 -3
  54. package/components/kbd/kbd.css +2 -2
  55. package/components/link/link.css +2 -2
  56. package/components/list/list.css +10 -10
  57. package/components/list-window/list-window.css +2 -2
  58. package/components/mark/mark.css +9 -9
  59. package/components/menu/menu.css +9 -9
  60. package/components/modal/modal.css +4 -4
  61. package/components/nav/nav.css +1 -1
  62. package/components/nav-group/nav-group.css +7 -16
  63. package/components/nav-item/nav-item.css +1 -1
  64. package/components/noodles/noodles.a2ui.json +1 -1
  65. package/components/noodles/noodles.css +3 -3
  66. package/components/noodles/noodles.d.ts +1 -1
  67. package/components/noodles/noodles.yaml +1 -1
  68. package/components/option-card/option-card.css +11 -11
  69. package/components/otp-input/otp-input.css +1 -1
  70. package/components/page/page.css +2 -2
  71. package/components/pane/pane.css +5 -5
  72. package/components/password-strength/password-strength.css +1 -1
  73. package/components/pipeline-status/pipeline-status.css +9 -9
  74. package/components/popover/popover.css +2 -2
  75. package/components/preview/preview.css +14 -3
  76. package/components/progress/progress.a2ui.json +1 -1
  77. package/components/progress/progress.css +1 -1
  78. package/components/progress/progress.d.ts +1 -1
  79. package/components/progress/progress.yaml +1 -1
  80. package/components/progress-row/progress-row.css +2 -2
  81. package/components/radio/radio.css +4 -4
  82. package/components/range/range.css +2 -2
  83. package/components/rating/rating.css +2 -2
  84. package/components/richtext/richtext.class.js +4 -0
  85. package/components/richtext/richtext.css +5 -5
  86. package/components/richtext/richtext.yaml +1 -0
  87. package/components/row/row.css +1 -1
  88. package/components/select/select.css +8 -8
  89. package/components/skip-nav/skip-nav.a2ui.json +2 -2
  90. package/components/skip-nav/skip-nav.css +3 -3
  91. package/components/skip-nav/skip-nav.yaml +2 -2
  92. package/components/slider/slider.css +5 -5
  93. package/components/spinner/spinner.css +2 -2
  94. package/components/spinner/spinner.test.js +4 -2
  95. package/components/stat/stat.css +1 -1
  96. package/components/step-progress/step-progress.a2ui.json +1 -1
  97. package/components/step-progress/step-progress.class.js +1 -1
  98. package/components/step-progress/step-progress.css +2 -2
  99. package/components/step-progress/step-progress.d.ts +1 -1
  100. package/components/step-progress/step-progress.yaml +1 -1
  101. package/components/stepper/stepper.css +22 -22
  102. package/components/stream/stream.css +2 -2
  103. package/components/swatch/swatch.class.js +1 -1
  104. package/components/swatch/swatch.css +11 -11
  105. package/components/swiper/swiper.css +5 -5
  106. package/components/switch/switch.css +5 -5
  107. package/components/table/cell-types.js +1 -1
  108. package/components/table/table.css +16 -11
  109. package/components/table-toolbar/table-toolbar.css +8 -8
  110. package/components/tabs/tabs.css +5 -5
  111. package/components/tag/tag.css +41 -29
  112. package/components/tag/tag.test.js +22 -29
  113. package/components/tags-input/tags-input.a2ui.json +1 -1
  114. package/components/tags-input/tags-input.css +3 -3
  115. package/components/tags-input/tags-input.yaml +5 -3
  116. package/components/text/text.css +4 -4
  117. package/components/textarea/textarea.css +1 -1
  118. package/components/time-picker/time-picker.css +2 -2
  119. package/components/timeline/timeline.css +31 -31
  120. package/components/toast/toast.css +19 -19
  121. package/components/toc/toc.a2ui.json +1 -1
  122. package/components/toc/toc.css +3 -3
  123. package/components/toc/toc.yaml +1 -1
  124. package/components/toggle-group/toggle-group.css +3 -3
  125. package/components/toolbar/toolbar.css +3 -3
  126. package/components/tooltip/tooltip.css +9 -9
  127. package/components/tour/tour.css +3 -3
  128. package/components/tree/tree.css +2 -2
  129. package/components/upload/upload.css +7 -7
  130. package/dist/host.min.css +1 -1
  131. package/dist/host.sheet.js +1 -1
  132. package/dist/theme-provider.min.js +7 -7
  133. package/dist/themes.min.css +1 -1
  134. package/dist/themes.sheet.js +1 -1
  135. package/dist/web-components.min.css +1 -1
  136. package/dist/web-components.min.js +34 -34
  137. package/dist/web-components.sheet.js +1 -1
  138. package/package.json +3 -3
  139. package/styles/api/text.css +1 -1
  140. package/styles/colors/bridges/material-bridge.css +30 -0
  141. package/styles/colors/index.css +19 -1
  142. package/styles/colors/material-static.css +771 -0
  143. package/styles/colors/parameters.css +40 -4
  144. package/styles/colors/primitives-primary.css +89 -0
  145. package/styles/colors/primitives-secondary.css +89 -0
  146. package/styles/colors/primitives-tertiary.css +89 -0
  147. package/styles/colors/primitives.css +3 -1
  148. package/styles/colors/scrims.css +19 -180
  149. package/styles/colors/semantics/aliases.css +25 -11
  150. package/styles/colors/semantics/buckets.css +28 -12
  151. package/styles/colors/semantics/core.css +323 -202
  152. package/styles/colors/semantics/data-viz.css +13 -13
  153. package/styles/colors/semantics/features.css +31 -13
  154. package/styles/colors/surfaces.css +41 -31
  155. package/styles/themes.css +15 -15
  156. package/styles/colors/primitives-accent.css +0 -89
@@ -1,9 +1,43 @@
1
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. */
2
+
3
+ INTERNAL as of the Material adoption (2026-07-14,
4
+ .claude/docs/specs/material-color-bridge-contract.md "replace the
5
+ computational layer" phase): these `--a-*` tokens are now a thin
6
+ ALIAS layer over the static `--md-sys-color-*` export
7
+ (colors/material-static.css, copied verbatim from the
8
+ nonoun-color-tokens-adia reference file and loaded earlier in
9
+ colors/index.css) — not the computed OKLCH engine they used to be.
10
+ Every family block below (CANVAS + PRIMARY/SECONDARY/TERTIARY/INFO/
11
+ SUCCESS/WARNING/DANGER) reads `var(--md-sys-color-*)` directly
12
+ instead of the old `--a-{fam}-{NN}` computed primitives. `--a-*`
13
+ stays fully functional as a consumption surface — this is
14
+ "re-source the alias", not "delete the old name". Consume
15
+ `--md-sys-color-*` directly in new code; every real component/app/
16
+ site CSS file was already swept onto it
17
+ (`scripts/refactor/adopt-material-tokens.mjs`). The `--a-accent-*`
18
+ back-compat block was removed in Phase 5 (2026-07-14) once its own
19
+ stated removal condition — zero remaining real consumers — was met.
20
+
21
+ Accepted tradeoff (operator-confirmed 2026-07-14): the 8-theme
22
+ live-retheming system in `styles/themes.css` degrades to 1 theme —
23
+ `--md-sys-color-*`'s values are static OKLCH literals, not
24
+ calc()-computed from `--a-{family}-hue/-c-min/-c-max`, so a
25
+ `[theme="ocean"]` override of those parametric knobs no longer
26
+ reaches anything downstream. Only `--a-brand-*` (no Material
27
+ equivalent, stays computed) and the non-color theme knobs
28
+ (`--a-radius-k`, `--a-density`, `--a-shadow-intensity`) still
29
+ respond to a theme attribute. The raw fine/coarse `--a-{fam}-{NN}`
30
+ primitive ramps (primitives-*.css) are untouched and still function
31
+ — only unused by this semantic layer now, kept for the swatch
32
+ display page (colors.examples.html) and for `--a-brand-*`, which
33
+ still sources from them.
34
+
35
+ Was: "The consumable API: canvas (neutral fg/bg/border), accent,
36
+ brand, and the four status families (info/success/warning/danger)."
37
+ Split out of the 636-line semantics.css (v0.6.48 reorg, ADR-0035);
38
+ imported FIRST by the semantics.css barrel so the status-compat
39
+ overrides in aliases.css (imported last) still win, exactly as in
40
+ the original source order. */
7
41
 
8
42
  :root, theme-ui, [theme], theme-provider {
9
43
 
@@ -11,136 +45,152 @@
11
45
  CANVAS — Neutral text, borders, surfaces
12
46
  ══════════════════════════════════════════════════════════════ */
13
47
 
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);
48
+ /* L2 — family tokens (re-sourced from --md-sys-color-neutral-*
49
+ static export, 2026-07-14 — see file header) */
50
+ --a-canvas-strong: var(--md-sys-color-neutral-surface-high);
51
+ --a-canvas: var(--md-sys-color-neutral-surface);
52
+ --a-canvas-subtle: var(--md-sys-color-neutral-surface-dim);
53
+ --a-canvas-muted: var(--md-sys-color-neutral-surface-dimmer);
54
+ --a-canvas-hover: var(--md-sys-color-neutral-hover);
55
+ --a-canvas-active: var(--md-sys-color-neutral-active);
56
+ --a-canvas-selected: var(--md-sys-color-neutral-container-active);
57
+
58
+ /* Text on neutral surfaces Material's on-surface family has 3 tiers
59
+ (on-surface / on-surface-variant / on-surface-disabled), compressing
60
+ the old 4-step hierarchy (strong/default/subtle/muted/disabled):
61
+ strong + default both collapse to on-surface; subtle + muted both
62
+ collapse to on-surface-variant. Visual hierarchy leans more on
63
+ font-weight + size where the old finer steps used to carry it. */
64
+ --a-canvas-text-strong: var(--md-sys-color-neutral-on-surface);
65
+ --a-canvas-text: var(--md-sys-color-neutral-on-surface);
66
+ --a-canvas-text-subtle: var(--md-sys-color-neutral-on-surface-variant);
67
+ --a-canvas-text-muted: var(--md-sys-color-neutral-on-surface-variant);
68
+ --a-canvas-text-disabled: var(--md-sys-color-neutral-on-surface-disabled);
69
+ --a-canvas-text-inverse: var(--md-sys-color-neutral-inverse-on-surface);
70
+
71
+ /* Inverse surface Material ships this role directly now (was a
72
+ mechanical light-dark() swap of neutral-0 before). */
73
+ --a-canvas-surface-inverse: var(--md-sys-color-neutral-inverse-surface);
74
+
75
+ /* Luminance-direction surfaces (always darken relative to canvas background) */
76
+ --a-canvas-well: var(--md-sys-color-neutral-surface-low); /* sunken panels, code blocks */
77
+ --a-canvas-inset: var(--md-sys-color-neutral-background); /* recessed inputs, wells */
78
+ --a-canvas-pressed: var(--md-sys-color-neutral-surface-high); /* pressed/active button states */
79
+ /* well-strong: for a chip/inline surface that must read as its OWN
80
+ distinct object (not just a subtly-sunken panel) — e.g. inline code.
81
+ `-container` is the nearest static role carrying that same "own
82
+ object" contrast intent. */
83
+ --a-canvas-well-strong: var(--md-sys-color-neutral-container);
84
+
85
+ /* Borders on neutral surfaces */
86
+ --a-canvas-border-subtle: var(--md-sys-color-neutral-outline-variant);
87
+ --a-canvas-border: var(--md-sys-color-neutral-outline);
88
+ --a-canvas-border-strong: var(--md-sys-color-neutral-outline-active);
46
89
 
47
90
  /* 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);
91
+ --a-bg: var(--md-sys-color-neutral-background);
92
+ --a-bg-scrim: var(--md-sys-color-neutral-scrim-weakest);
93
+ --a-bg-subtle: var(--md-sys-color-neutral-surface);
94
+ --a-bg-muted: var(--md-sys-color-neutral-container);
95
+ --a-bg-strong: var(--md-sys-color-neutral-surface-high);
96
+ --a-bg-hover: var(--md-sys-color-neutral-hover);
97
+ --a-bg-active: var(--md-sys-color-neutral-active);
98
+ --a-bg-selected: var(--md-sys-color-neutral-container-active);
99
+ --a-bg-disabled: var(--md-sys-color-neutral-container-disabled);
57
100
  --a-bg-invalid: var(--a-danger-muted);
58
101
 
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);
102
+ --a-fg: var(--md-sys-color-neutral-on-surface);
103
+ --a-fg-subtle: var(--md-sys-color-neutral-on-surface-variant);
104
+ --a-fg-muted: var(--md-sys-color-neutral-on-surface-variant);
105
+ --a-fg-strong: var(--md-sys-color-neutral-on-surface);
106
+ --a-fg-hover: var(--md-sys-color-neutral-on-surface-hover);
64
107
  /* ADR-0028: --a-fg-{active,invalid} retired (zero consumers). Use
65
108
  `--a-ui-text-active` / `--a-ui-text-invalid` for form-control state,
66
109
  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);
110
+ --a-fg-selected: var(--md-sys-color-neutral-on-surface-active);
111
+ --a-fg-disabled: var(--md-sys-color-neutral-on-surface-disabled);
112
+ --a-fg-inverse: var(--md-sys-color-neutral-inverse-on-surface);
113
+
114
+ --a-border: var(--md-sys-color-neutral-outline);
115
+ --a-border-subtle: var(--md-sys-color-neutral-outline-variant);
116
+ --a-border-strong: var(--md-sys-color-neutral-outline-active);
117
+ --a-border-hover: var(--md-sys-color-neutral-outline-hover);
75
118
  /* ADR-0028: --a-border-{active,selected,disabled,invalid} retired (zero
76
119
  consumers). Per-primitive `--<comp>-border-{state}` is the override
77
120
  surface; `--a-focus-ring` carries focus-active borders for form
78
121
  controls. */
79
122
 
80
123
  /* ══════════════════════════════════════════════════════════════
81
- ACCENT — Interactive, links, focus (source for --a-primary-*)
124
+ PRIMARY — Interactive, links, focus (renamed from `accent`,
125
+ 2026-07-14 — consolidates with the L3 CTA role names below, which
126
+ already used `primary`, and matches Material's single `primary`
127
+ family. See .claude/docs/specs/material-color-bridge-contract.md.
128
+ The `--a-accent-*` back-compat block that used to live further
129
+ down this file was removed in Phase 5 — see the file header. )
82
130
  ══════════════════════════════════════════════════════════════ */
83
131
 
84
- /* L2 — family tokens */
85
- --a-accent-strong: var(--a-accent-60);
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
- /* L3Primary (accent-filled CTA buttons, checked controls) */
118
- --a-primary-bg: var(--a-accent);
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. */
132
+ /* L2 — family tokens (re-sourced from --md-sys-color-primary-* static
133
+ export, 2026-07-14 — see file header) */
134
+ --a-primary-strong: var(--md-sys-color-primary-active);
135
+ --a-primary: var(--md-sys-color-primary);
136
+ --a-primary-subtle: var(--md-sys-color-primary-container-high);
137
+ --a-primary-muted: var(--md-sys-color-primary-container);
138
+ --a-primary-hover: var(--md-sys-color-primary-hover);
139
+ --a-primary-active: var(--md-sys-color-primary-active);
140
+ --a-primary-selected: var(--md-sys-color-primary);
141
+
142
+ /* Link family Material's static export has no dedicated "link" role,
143
+ so this reuses the primary interactive triad directly: link = the
144
+ bare accent, link-hover = its hover state, link-visited = its active
145
+ state (reads as "already-visited, deeper" without a bespoke ramp). */
146
+ --a-link: var(--md-sys-color-primary);
147
+ --a-link-hover: var(--md-sys-color-primary-hover);
148
+ --a-link-visited: var(--md-sys-color-primary-active);
149
+
150
+ /* Primary text on primary solid bg needs light text on dark-ish primary */
151
+ --a-primary-text-strong: var(--md-sys-color-primary-on-primary);
152
+ --a-primary-text: var(--md-sys-color-primary-on-surface);
153
+ --a-primary-text-subtle: var(--md-sys-color-primary-on-surface-variant);
154
+ --a-primary-text-disabled: var(--md-sys-color-primary-on-surface-disabled);
155
+
156
+ --a-primary-border-subtle: var(--md-sys-color-primary-outline-variant);
157
+ --a-primary-border: var(--md-sys-color-primary-outline);
158
+ --a-primary-border-strong: var(--md-sys-color-primary-outline-active);
159
+
160
+ /* L3 — CTA role matrix (filled buttons, checked controls). Sources
161
+ the renamed L2 family directly — no `accent` intermediate. The
162
+ `--a-accent-bg`/`-fg`/`-border*` L3 aliases that used to sit
163
+ parallel to this (for "primary-hued but not obviously the CTA")
164
+ are retired: Material's own role model expresses that need via
165
+ role choice`-muted`/`-border` (soft/tinted) vs. this filled
166
+ `-bg`/`-fg` — not a second family name. */
167
+ --a-primary-bg: var(--a-primary);
168
+ --a-primary-bg-hover: var(--a-primary-hover);
169
+ --a-primary-bg-active: var(--a-primary-active);
170
+
171
+ --a-primary-fg: var(--a-primary-text-strong);
172
+ --a-primary-fg-hover: var(--a-primary-text-strong);
173
+
174
+ --a-primary-border-hover: var(--a-primary-border-strong);
175
+ --a-primary-container-disabled: var(--md-sys-color-primary-container-disabled);
176
+
177
+ /* `--a-accent-*` back-compat block REMOVED (2026-07-14, Phase 5): its
178
+ own stated removal condition — `grep -rn '\-\-a-accent-'` (excluding
179
+ this block) returns zero hits — is now met. The last 2 real
180
+ consumers (qa/gap-analysis/styles.css, .claude/docs/qa/component-
181
+ isolation.html both QA tooling, not product code) were swept to
182
+ `--a-primary` directly. See
183
+ .claude/docs/specs/material-color-bridge-contract.md. */
184
+
185
+ /* Legacy shorthand `--a-primary`/`--a-primary-hover` ("keep until all
186
+ components migrate to --a-primary-bg/-hover") is no longer a
187
+ separate declaration: the renamed L2 family base above (line ~97,
188
+ 100) already IS `--a-primary`/`--a-primary-hover` — both were
189
+ always value-identical to `--a-primary-bg`/`-bg-hover` (accent-50/
190
+ accent-40 transitively), so redeclaring them here would be a
191
+ same-name duplicate, last-wins, pure redundancy. Nothing for any
192
+ consumer changes: `var(--a-primary)` / `var(--a-primary-hover)`
193
+ resolve to the exact same value they always did. */
144
194
 
145
195
  /* ══════════════════════════════════════════════════════════════
146
196
  BRAND — Non-interactive identity color
@@ -178,23 +228,24 @@
178
228
  INFO
179
229
  ══════════════════════════════════════════════════════════════ */
180
230
 
181
- /* L2 — family tokens */
182
- --a-info-strong: var(--a-info-60);
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);
231
+ /* L2 — family tokens (re-sourced from --md-sys-color-info-* static
232
+ export, 2026-07-14 — see file header) */
233
+ --a-info-strong: var(--md-sys-color-info-active);
234
+ --a-info: var(--md-sys-color-info);
235
+ --a-info-subtle: var(--md-sys-color-info-container-high);
236
+ --a-info-muted: var(--md-sys-color-info-container);
237
+ --a-info-hover: var(--md-sys-color-info-hover);
238
+ --a-info-active: var(--md-sys-color-info-active);
239
+ --a-info-selected: var(--md-sys-color-info);
240
+
241
+ --a-info-text-strong: var(--md-sys-color-info-on-info);
242
+ --a-info-text: var(--md-sys-color-info-on-surface);
243
+ --a-info-text-subtle: var(--md-sys-color-info-on-surface-variant);
244
+ --a-info-text-disabled: var(--md-sys-color-info-on-surface-disabled);
245
+
246
+ --a-info-border-subtle: var(--md-sys-color-info-outline-variant);
247
+ --a-info-border: var(--md-sys-color-info-outline);
248
+ --a-info-border-strong: var(--md-sys-color-info-outline-active);
198
249
 
199
250
  /* L3 — Info surface role matrix */
200
251
  --a-info-bg: var(--a-info);
@@ -205,28 +256,30 @@
205
256
 
206
257
  /* L3 border state matrix — rest state is --a-info-border (L2 above). */
207
258
  --a-info-border-hover: var(--a-info-border-strong);
259
+ --a-info-container-disabled: var(--md-sys-color-info-container-disabled);
208
260
 
209
261
  /* ══════════════════════════════════════════════════════════════
210
262
  SUCCESS
211
263
  ══════════════════════════════════════════════════════════════ */
212
264
 
213
- /* L2 — family tokens */
214
- --a-success-strong: var(--a-success-60);
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);
265
+ /* L2 — family tokens (re-sourced from --md-sys-color-success-* static
266
+ export, 2026-07-14 — see file header) */
267
+ --a-success-strong: var(--md-sys-color-success-active);
268
+ --a-success: var(--md-sys-color-success);
269
+ --a-success-subtle: var(--md-sys-color-success-container-high);
270
+ --a-success-muted: var(--md-sys-color-success-container);
271
+ --a-success-hover: var(--md-sys-color-success-hover);
272
+ --a-success-active: var(--md-sys-color-success-active);
273
+ --a-success-selected: var(--md-sys-color-success);
274
+
275
+ --a-success-text-strong: var(--md-sys-color-success-on-success);
276
+ --a-success-text: var(--md-sys-color-success-on-surface);
277
+ --a-success-text-subtle: var(--md-sys-color-success-on-surface-variant);
278
+ --a-success-text-disabled: var(--md-sys-color-success-on-surface-disabled);
279
+
280
+ --a-success-border-subtle: var(--md-sys-color-success-outline-variant);
281
+ --a-success-border: var(--md-sys-color-success-outline);
282
+ --a-success-border-strong: var(--md-sys-color-success-outline-active);
230
283
 
231
284
  /* L3 — Success surface role matrix */
232
285
  --a-success-bg: var(--a-success);
@@ -237,40 +290,40 @@
237
290
 
238
291
  /* L3 border state matrix — rest state is --a-success-border (L2 above). */
239
292
  --a-success-border-hover: var(--a-success-border-strong);
293
+ --a-success-container-disabled: var(--md-sys-color-success-container-disabled);
240
294
 
241
295
  /* ══════════════════════════════════════════════════════════════
242
296
  WARNING
243
297
  ══════════════════════════════════════════════════════════════ */
244
298
 
245
- /* L2 — family tokens */
246
- --a-warning-strong: var(--a-warning-60);
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. */
299
+ /* L2 — family tokens (re-sourced from --md-sys-color-warning-* static
300
+ export, 2026-07-14 — see file header) */
301
+ --a-warning-strong: var(--md-sys-color-warning-active);
302
+ --a-warning: var(--md-sys-color-warning);
303
+ --a-warning-subtle: var(--md-sys-color-warning-container-high);
304
+ --a-warning-muted: var(--md-sys-color-warning-container);
305
+ --a-warning-hover: var(--md-sys-color-warning-hover);
306
+ --a-warning-active: var(--md-sys-color-warning-active);
307
+ --a-warning-selected: var(--md-sys-color-warning);
308
+
309
+ /* NOTE (2026-07-14): the old dark-text-on-light-warning override
310
+ (this file used to force `-text-strong` dark in both schemes,
311
+ because warning's yellow is light-colored) no longer applies —
312
+ `--md-sys-color-warning-on-warning` is the static export's own
313
+ role and, per Material's fixed-light-on-color rule, resolves
314
+ light in both schemes like every other family's on-color. This is
315
+ the reference file's own accepted design law, not a bug in this
316
+ mapping — verify visually if a warning chip reads low-contrast. */
317
+ --a-warning-text-strong: var(--md-sys-color-warning-on-warning);
318
+ --a-warning-text: var(--md-sys-color-warning-on-surface);
319
+ --a-warning-text-subtle: var(--md-sys-color-warning-on-surface-variant);
320
+ --a-warning-text-disabled: var(--md-sys-color-warning-on-surface-disabled);
321
+
322
+ --a-warning-border-subtle: var(--md-sys-color-warning-outline-variant);
323
+ --a-warning-border: var(--md-sys-color-warning-outline);
324
+ --a-warning-border-strong: var(--md-sys-color-warning-outline-active);
325
+
326
+ /* L3 Warning surface role matrix */
274
327
  --a-warning-bg: var(--a-warning);
275
328
  --a-warning-bg-hover: var(--a-warning-hover);
276
329
 
@@ -279,30 +332,30 @@
279
332
 
280
333
  /* L3 border state matrix — rest state is --a-warning-border (L2 above). */
281
334
  --a-warning-border-hover: var(--a-warning-border-strong);
335
+ --a-warning-container-disabled: var(--md-sys-color-warning-container-disabled);
282
336
 
283
337
  /* ══════════════════════════════════════════════════════════════
284
338
  DANGER
285
339
  ══════════════════════════════════════════════════════════════ */
286
340
 
287
- /* L2 — family tokens */
288
- --a-danger-strong: var(--a-danger-60);
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);
341
+ /* L2 — family tokens (re-sourced from --md-sys-color-danger-* static
342
+ export, 2026-07-14 — see file header) */
343
+ --a-danger-strong: var(--md-sys-color-danger-active);
344
+ --a-danger: var(--md-sys-color-danger);
345
+ --a-danger-subtle: var(--md-sys-color-danger-container-high);
346
+ --a-danger-muted: var(--md-sys-color-danger-container);
347
+ --a-danger-hover: var(--md-sys-color-danger-hover);
348
+ --a-danger-active: var(--md-sys-color-danger-active);
349
+ --a-danger-selected: var(--md-sys-color-danger);
350
+
351
+ --a-danger-text-strong: var(--md-sys-color-danger-on-danger);
352
+ --a-danger-text: var(--md-sys-color-danger-on-surface);
353
+ --a-danger-text-subtle: var(--md-sys-color-danger-on-surface-variant);
354
+ --a-danger-text-disabled: var(--md-sys-color-danger-on-surface-disabled);
355
+
356
+ --a-danger-border-subtle: var(--md-sys-color-danger-outline-variant);
357
+ --a-danger-border: var(--md-sys-color-danger-outline);
358
+ --a-danger-border-strong: var(--md-sys-color-danger-outline-active);
306
359
 
307
360
  /* L3 — Danger surface role matrix */
308
361
  --a-danger-bg: var(--a-danger);
@@ -313,5 +366,73 @@
313
366
 
314
367
  /* L3 border state matrix — rest state is --a-danger-border (L2 above). */
315
368
  --a-danger-border-hover: var(--a-danger-border-strong);
369
+ --a-danger-container-disabled: var(--md-sys-color-danger-container-disabled);
370
+
371
+ /* ══════════════════════════════════════════════════════════════
372
+ SECONDARY
373
+ ══════════════════════════════════════════════════════════════ */
374
+
375
+ /* L2 — family tokens (re-sourced from --md-sys-color-secondary-* static
376
+ export, 2026-07-14 — see file header) */
377
+ --a-secondary-strong: var(--md-sys-color-secondary-active);
378
+ --a-secondary: var(--md-sys-color-secondary);
379
+ --a-secondary-subtle: var(--md-sys-color-secondary-container-high);
380
+ --a-secondary-muted: var(--md-sys-color-secondary-container);
381
+ --a-secondary-hover: var(--md-sys-color-secondary-hover);
382
+ --a-secondary-active: var(--md-sys-color-secondary-active);
383
+ --a-secondary-selected: var(--md-sys-color-secondary);
384
+
385
+ --a-secondary-text-strong: var(--md-sys-color-secondary-on-secondary);
386
+ --a-secondary-text: var(--md-sys-color-secondary-on-surface);
387
+ --a-secondary-text-subtle: var(--md-sys-color-secondary-on-surface-variant);
388
+ --a-secondary-text-disabled: var(--md-sys-color-secondary-on-surface-disabled);
389
+
390
+ --a-secondary-border-subtle: var(--md-sys-color-secondary-outline-variant);
391
+ --a-secondary-border: var(--md-sys-color-secondary-outline);
392
+ --a-secondary-border-strong: var(--md-sys-color-secondary-outline-active);
393
+
394
+ /* L3 — Secondary surface role matrix */
395
+ --a-secondary-bg: var(--a-secondary);
396
+ --a-secondary-bg-hover: var(--a-secondary-hover);
397
+
398
+ --a-secondary-fg: var(--a-secondary-text-strong);
399
+ --a-secondary-fg-hover: var(--a-secondary-text-strong);
400
+
401
+ /* L3 border state matrix — rest state is --a-secondary-border (L2 above). */
402
+ --a-secondary-border-hover: var(--a-secondary-border-strong);
403
+ --a-secondary-container-disabled: var(--md-sys-color-secondary-container-disabled);
404
+
405
+ /* ══════════════════════════════════════════════════════════════
406
+ TERTIARY
407
+ ══════════════════════════════════════════════════════════════ */
316
408
 
409
+ /* L2 — family tokens (re-sourced from --md-sys-color-tertiary-* static
410
+ export, 2026-07-14 — see file header) */
411
+ --a-tertiary-strong: var(--md-sys-color-tertiary-active);
412
+ --a-tertiary: var(--md-sys-color-tertiary);
413
+ --a-tertiary-subtle: var(--md-sys-color-tertiary-container-high);
414
+ --a-tertiary-muted: var(--md-sys-color-tertiary-container);
415
+ --a-tertiary-hover: var(--md-sys-color-tertiary-hover);
416
+ --a-tertiary-active: var(--md-sys-color-tertiary-active);
417
+ --a-tertiary-selected: var(--md-sys-color-tertiary);
418
+
419
+ --a-tertiary-text-strong: var(--md-sys-color-tertiary-on-tertiary);
420
+ --a-tertiary-text: var(--md-sys-color-tertiary-on-surface);
421
+ --a-tertiary-text-subtle: var(--md-sys-color-tertiary-on-surface-variant);
422
+ --a-tertiary-text-disabled: var(--md-sys-color-tertiary-on-surface-disabled);
423
+
424
+ --a-tertiary-border-subtle: var(--md-sys-color-tertiary-outline-variant);
425
+ --a-tertiary-border: var(--md-sys-color-tertiary-outline);
426
+ --a-tertiary-border-strong: var(--md-sys-color-tertiary-outline-active);
427
+
428
+ /* L3 — Tertiary surface role matrix */
429
+ --a-tertiary-bg: var(--a-tertiary);
430
+ --a-tertiary-bg-hover: var(--a-tertiary-hover);
431
+
432
+ --a-tertiary-fg: var(--a-tertiary-text-strong);
433
+ --a-tertiary-fg-hover: var(--a-tertiary-text-strong);
434
+
435
+ /* L3 border state matrix — rest state is --a-tertiary-border (L2 above). */
436
+ --a-tertiary-border-hover: var(--a-tertiary-border-strong);
437
+ --a-tertiary-container-disabled: var(--md-sys-color-tertiary-container-disabled);
317
438
  }