@adia-ai/web-components 0.7.28 → 0.8.1

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 (158) hide show
  1. package/CHANGELOG.md +29 -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 +2 -2
  114. package/components/tags-input/tags-input.class.js +93 -20
  115. package/components/tags-input/tags-input.css +3 -3
  116. package/components/tags-input/tags-input.test.js +109 -0
  117. package/components/tags-input/tags-input.yaml +18 -4
  118. package/components/text/text.css +4 -4
  119. package/components/textarea/textarea.css +1 -1
  120. package/components/time-picker/time-picker.css +2 -2
  121. package/components/timeline/timeline.css +31 -31
  122. package/components/toast/toast.css +19 -19
  123. package/components/toc/toc.a2ui.json +1 -1
  124. package/components/toc/toc.css +3 -3
  125. package/components/toc/toc.yaml +1 -1
  126. package/components/toggle-group/toggle-group.css +3 -3
  127. package/components/toolbar/toolbar.css +3 -3
  128. package/components/tooltip/tooltip.css +9 -9
  129. package/components/tour/tour.css +3 -3
  130. package/components/tree/tree.css +2 -2
  131. package/components/upload/upload.css +7 -7
  132. package/dist/host.min.css +1 -1
  133. package/dist/host.sheet.js +1 -1
  134. package/dist/theme-provider.min.js +7 -7
  135. package/dist/themes.min.css +1 -1
  136. package/dist/themes.sheet.js +1 -1
  137. package/dist/web-components.min.css +1 -1
  138. package/dist/web-components.min.js +41 -41
  139. package/dist/web-components.sheet.js +1 -1
  140. package/package.json +3 -3
  141. package/styles/api/text.css +1 -1
  142. package/styles/colors/bridges/material-bridge.css +30 -0
  143. package/styles/colors/index.css +19 -1
  144. package/styles/colors/material-static.css +771 -0
  145. package/styles/colors/parameters.css +40 -4
  146. package/styles/colors/primitives-primary.css +89 -0
  147. package/styles/colors/primitives-secondary.css +89 -0
  148. package/styles/colors/primitives-tertiary.css +89 -0
  149. package/styles/colors/primitives.css +3 -1
  150. package/styles/colors/scrims.css +19 -180
  151. package/styles/colors/semantics/aliases.css +25 -11
  152. package/styles/colors/semantics/buckets.css +28 -12
  153. package/styles/colors/semantics/core.css +330 -202
  154. package/styles/colors/semantics/data-viz.css +13 -13
  155. package/styles/colors/semantics/features.css +31 -13
  156. package/styles/colors/surfaces.css +41 -31
  157. package/styles/themes.css +15 -15
  158. 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,159 @@
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
- /* L3 — Primary (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 fixed 2026-07-15 (contract step 11, `verify:contrast`
143
+ rewrite surfaced a real regression, not a near-miss: bare
144
+ `--md-sys-color-primary` is the vivid CTA/button fill, tuned for a
145
+ large filled surface, not small text on the page background — it
146
+ measured as low as 2.23:1 in light mode, badly failing AA 4.5:1).
147
+ Material ships a role built for exactly this ("colored text on a
148
+ neutral surface"): `-on-surface` + its own `-hover`/`-active` state
149
+ family, already used by `--a-primary-text` below for the identical
150
+ purpose. Re-pointed link to the same family instead of inventing a
151
+ workaround — verified via `verify:contrast`, clears AA in both
152
+ schemes with wide margin (primary-950/-050 are near-black/near-white). */
153
+ --a-link: var(--md-sys-color-primary-on-surface);
154
+ --a-link-hover: var(--md-sys-color-primary-on-surface-hover);
155
+ --a-link-visited: var(--md-sys-color-primary-on-surface-active);
156
+
157
+ /* Primary text on primary solid bg — needs light text on dark-ish primary */
158
+ --a-primary-text-strong: var(--md-sys-color-primary-on-primary);
159
+ --a-primary-text: var(--md-sys-color-primary-on-surface);
160
+ --a-primary-text-subtle: var(--md-sys-color-primary-on-surface-variant);
161
+ --a-primary-text-disabled: var(--md-sys-color-primary-on-surface-disabled);
162
+
163
+ --a-primary-border-subtle: var(--md-sys-color-primary-outline-variant);
164
+ --a-primary-border: var(--md-sys-color-primary-outline);
165
+ --a-primary-border-strong: var(--md-sys-color-primary-outline-active);
166
+
167
+ /* L3 — CTA role matrix (filled buttons, checked controls). Sources
168
+ the renamed L2 family directly — no `accent` intermediate. The
169
+ `--a-accent-bg`/`-fg`/`-border*` L3 aliases that used to sit
170
+ parallel to this (for "primary-hued but not obviously the CTA")
171
+ are retired: Material's own role model expresses that need via
172
+ role choice — `-muted`/`-border` (soft/tinted) vs. this filled
173
+ `-bg`/`-fg` — not a second family name. */
174
+ --a-primary-bg: var(--a-primary);
175
+ --a-primary-bg-hover: var(--a-primary-hover);
176
+ --a-primary-bg-active: var(--a-primary-active);
177
+
178
+ --a-primary-fg: var(--a-primary-text-strong);
179
+ --a-primary-fg-hover: var(--a-primary-text-strong);
180
+
181
+ --a-primary-border-hover: var(--a-primary-border-strong);
182
+ --a-primary-container-disabled: var(--md-sys-color-primary-container-disabled);
183
+
184
+ /* `--a-accent-*` back-compat block REMOVED (2026-07-14, Phase 5): its
185
+ own stated removal condition — `grep -rn '\-\-a-accent-'` (excluding
186
+ this block) returns zero hits — is now met. The last 2 real
187
+ consumers (qa/gap-analysis/styles.css, .claude/docs/qa/component-
188
+ isolation.html — both QA tooling, not product code) were swept to
189
+ `--a-primary` directly. See
190
+ .claude/docs/specs/material-color-bridge-contract.md. */
191
+
192
+ /* Legacy shorthand `--a-primary`/`--a-primary-hover` ("keep until all
193
+ components migrate to --a-primary-bg/-hover") is no longer a
194
+ separate declaration: the renamed L2 family base above (line ~97,
195
+ 100) already IS `--a-primary`/`--a-primary-hover` — both were
196
+ always value-identical to `--a-primary-bg`/`-bg-hover` (accent-50/
197
+ accent-40 transitively), so redeclaring them here would be a
198
+ same-name duplicate, last-wins, pure redundancy. Nothing for any
199
+ consumer changes: `var(--a-primary)` / `var(--a-primary-hover)`
200
+ resolve to the exact same value they always did. */
144
201
 
145
202
  /* ══════════════════════════════════════════════════════════════
146
203
  BRAND — Non-interactive identity color
@@ -178,23 +235,24 @@
178
235
  INFO
179
236
  ══════════════════════════════════════════════════════════════ */
180
237
 
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);
238
+ /* L2 — family tokens (re-sourced from --md-sys-color-info-* static
239
+ export, 2026-07-14 — see file header) */
240
+ --a-info-strong: var(--md-sys-color-info-active);
241
+ --a-info: var(--md-sys-color-info);
242
+ --a-info-subtle: var(--md-sys-color-info-container-high);
243
+ --a-info-muted: var(--md-sys-color-info-container);
244
+ --a-info-hover: var(--md-sys-color-info-hover);
245
+ --a-info-active: var(--md-sys-color-info-active);
246
+ --a-info-selected: var(--md-sys-color-info);
247
+
248
+ --a-info-text-strong: var(--md-sys-color-info-on-info);
249
+ --a-info-text: var(--md-sys-color-info-on-surface);
250
+ --a-info-text-subtle: var(--md-sys-color-info-on-surface-variant);
251
+ --a-info-text-disabled: var(--md-sys-color-info-on-surface-disabled);
252
+
253
+ --a-info-border-subtle: var(--md-sys-color-info-outline-variant);
254
+ --a-info-border: var(--md-sys-color-info-outline);
255
+ --a-info-border-strong: var(--md-sys-color-info-outline-active);
198
256
 
199
257
  /* L3 — Info surface role matrix */
200
258
  --a-info-bg: var(--a-info);
@@ -205,28 +263,30 @@
205
263
 
206
264
  /* L3 border state matrix — rest state is --a-info-border (L2 above). */
207
265
  --a-info-border-hover: var(--a-info-border-strong);
266
+ --a-info-container-disabled: var(--md-sys-color-info-container-disabled);
208
267
 
209
268
  /* ══════════════════════════════════════════════════════════════
210
269
  SUCCESS
211
270
  ══════════════════════════════════════════════════════════════ */
212
271
 
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);
272
+ /* L2 — family tokens (re-sourced from --md-sys-color-success-* static
273
+ export, 2026-07-14 — see file header) */
274
+ --a-success-strong: var(--md-sys-color-success-active);
275
+ --a-success: var(--md-sys-color-success);
276
+ --a-success-subtle: var(--md-sys-color-success-container-high);
277
+ --a-success-muted: var(--md-sys-color-success-container);
278
+ --a-success-hover: var(--md-sys-color-success-hover);
279
+ --a-success-active: var(--md-sys-color-success-active);
280
+ --a-success-selected: var(--md-sys-color-success);
281
+
282
+ --a-success-text-strong: var(--md-sys-color-success-on-success);
283
+ --a-success-text: var(--md-sys-color-success-on-surface);
284
+ --a-success-text-subtle: var(--md-sys-color-success-on-surface-variant);
285
+ --a-success-text-disabled: var(--md-sys-color-success-on-surface-disabled);
286
+
287
+ --a-success-border-subtle: var(--md-sys-color-success-outline-variant);
288
+ --a-success-border: var(--md-sys-color-success-outline);
289
+ --a-success-border-strong: var(--md-sys-color-success-outline-active);
230
290
 
231
291
  /* L3 — Success surface role matrix */
232
292
  --a-success-bg: var(--a-success);
@@ -237,40 +297,40 @@
237
297
 
238
298
  /* L3 border state matrix — rest state is --a-success-border (L2 above). */
239
299
  --a-success-border-hover: var(--a-success-border-strong);
300
+ --a-success-container-disabled: var(--md-sys-color-success-container-disabled);
240
301
 
241
302
  /* ══════════════════════════════════════════════════════════════
242
303
  WARNING
243
304
  ══════════════════════════════════════════════════════════════ */
244
305
 
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. */
306
+ /* L2 — family tokens (re-sourced from --md-sys-color-warning-* static
307
+ export, 2026-07-14 — see file header) */
308
+ --a-warning-strong: var(--md-sys-color-warning-active);
309
+ --a-warning: var(--md-sys-color-warning);
310
+ --a-warning-subtle: var(--md-sys-color-warning-container-high);
311
+ --a-warning-muted: var(--md-sys-color-warning-container);
312
+ --a-warning-hover: var(--md-sys-color-warning-hover);
313
+ --a-warning-active: var(--md-sys-color-warning-active);
314
+ --a-warning-selected: var(--md-sys-color-warning);
315
+
316
+ /* NOTE (2026-07-14): the old dark-text-on-light-warning override
317
+ (this file used to force `-text-strong` dark in both schemes,
318
+ because warning's yellow is light-colored) no longer applies —
319
+ `--md-sys-color-warning-on-warning` is the static export's own
320
+ role and, per Material's fixed-light-on-color rule, resolves
321
+ light in both schemes like every other family's on-color. This is
322
+ the reference file's own accepted design law, not a bug in this
323
+ mapping — verify visually if a warning chip reads low-contrast. */
324
+ --a-warning-text-strong: var(--md-sys-color-warning-on-warning);
325
+ --a-warning-text: var(--md-sys-color-warning-on-surface);
326
+ --a-warning-text-subtle: var(--md-sys-color-warning-on-surface-variant);
327
+ --a-warning-text-disabled: var(--md-sys-color-warning-on-surface-disabled);
328
+
329
+ --a-warning-border-subtle: var(--md-sys-color-warning-outline-variant);
330
+ --a-warning-border: var(--md-sys-color-warning-outline);
331
+ --a-warning-border-strong: var(--md-sys-color-warning-outline-active);
332
+
333
+ /* L3 Warning surface role matrix */
274
334
  --a-warning-bg: var(--a-warning);
275
335
  --a-warning-bg-hover: var(--a-warning-hover);
276
336
 
@@ -279,30 +339,30 @@
279
339
 
280
340
  /* L3 border state matrix — rest state is --a-warning-border (L2 above). */
281
341
  --a-warning-border-hover: var(--a-warning-border-strong);
342
+ --a-warning-container-disabled: var(--md-sys-color-warning-container-disabled);
282
343
 
283
344
  /* ══════════════════════════════════════════════════════════════
284
345
  DANGER
285
346
  ══════════════════════════════════════════════════════════════ */
286
347
 
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);
348
+ /* L2 — family tokens (re-sourced from --md-sys-color-danger-* static
349
+ export, 2026-07-14 — see file header) */
350
+ --a-danger-strong: var(--md-sys-color-danger-active);
351
+ --a-danger: var(--md-sys-color-danger);
352
+ --a-danger-subtle: var(--md-sys-color-danger-container-high);
353
+ --a-danger-muted: var(--md-sys-color-danger-container);
354
+ --a-danger-hover: var(--md-sys-color-danger-hover);
355
+ --a-danger-active: var(--md-sys-color-danger-active);
356
+ --a-danger-selected: var(--md-sys-color-danger);
357
+
358
+ --a-danger-text-strong: var(--md-sys-color-danger-on-danger);
359
+ --a-danger-text: var(--md-sys-color-danger-on-surface);
360
+ --a-danger-text-subtle: var(--md-sys-color-danger-on-surface-variant);
361
+ --a-danger-text-disabled: var(--md-sys-color-danger-on-surface-disabled);
362
+
363
+ --a-danger-border-subtle: var(--md-sys-color-danger-outline-variant);
364
+ --a-danger-border: var(--md-sys-color-danger-outline);
365
+ --a-danger-border-strong: var(--md-sys-color-danger-outline-active);
306
366
 
307
367
  /* L3 — Danger surface role matrix */
308
368
  --a-danger-bg: var(--a-danger);
@@ -313,5 +373,73 @@
313
373
 
314
374
  /* L3 border state matrix — rest state is --a-danger-border (L2 above). */
315
375
  --a-danger-border-hover: var(--a-danger-border-strong);
376
+ --a-danger-container-disabled: var(--md-sys-color-danger-container-disabled);
377
+
378
+ /* ══════════════════════════════════════════════════════════════
379
+ SECONDARY
380
+ ══════════════════════════════════════════════════════════════ */
381
+
382
+ /* L2 — family tokens (re-sourced from --md-sys-color-secondary-* static
383
+ export, 2026-07-14 — see file header) */
384
+ --a-secondary-strong: var(--md-sys-color-secondary-active);
385
+ --a-secondary: var(--md-sys-color-secondary);
386
+ --a-secondary-subtle: var(--md-sys-color-secondary-container-high);
387
+ --a-secondary-muted: var(--md-sys-color-secondary-container);
388
+ --a-secondary-hover: var(--md-sys-color-secondary-hover);
389
+ --a-secondary-active: var(--md-sys-color-secondary-active);
390
+ --a-secondary-selected: var(--md-sys-color-secondary);
391
+
392
+ --a-secondary-text-strong: var(--md-sys-color-secondary-on-secondary);
393
+ --a-secondary-text: var(--md-sys-color-secondary-on-surface);
394
+ --a-secondary-text-subtle: var(--md-sys-color-secondary-on-surface-variant);
395
+ --a-secondary-text-disabled: var(--md-sys-color-secondary-on-surface-disabled);
396
+
397
+ --a-secondary-border-subtle: var(--md-sys-color-secondary-outline-variant);
398
+ --a-secondary-border: var(--md-sys-color-secondary-outline);
399
+ --a-secondary-border-strong: var(--md-sys-color-secondary-outline-active);
400
+
401
+ /* L3 — Secondary surface role matrix */
402
+ --a-secondary-bg: var(--a-secondary);
403
+ --a-secondary-bg-hover: var(--a-secondary-hover);
404
+
405
+ --a-secondary-fg: var(--a-secondary-text-strong);
406
+ --a-secondary-fg-hover: var(--a-secondary-text-strong);
407
+
408
+ /* L3 border state matrix — rest state is --a-secondary-border (L2 above). */
409
+ --a-secondary-border-hover: var(--a-secondary-border-strong);
410
+ --a-secondary-container-disabled: var(--md-sys-color-secondary-container-disabled);
411
+
412
+ /* ══════════════════════════════════════════════════════════════
413
+ TERTIARY
414
+ ══════════════════════════════════════════════════════════════ */
316
415
 
416
+ /* L2 — family tokens (re-sourced from --md-sys-color-tertiary-* static
417
+ export, 2026-07-14 — see file header) */
418
+ --a-tertiary-strong: var(--md-sys-color-tertiary-active);
419
+ --a-tertiary: var(--md-sys-color-tertiary);
420
+ --a-tertiary-subtle: var(--md-sys-color-tertiary-container-high);
421
+ --a-tertiary-muted: var(--md-sys-color-tertiary-container);
422
+ --a-tertiary-hover: var(--md-sys-color-tertiary-hover);
423
+ --a-tertiary-active: var(--md-sys-color-tertiary-active);
424
+ --a-tertiary-selected: var(--md-sys-color-tertiary);
425
+
426
+ --a-tertiary-text-strong: var(--md-sys-color-tertiary-on-tertiary);
427
+ --a-tertiary-text: var(--md-sys-color-tertiary-on-surface);
428
+ --a-tertiary-text-subtle: var(--md-sys-color-tertiary-on-surface-variant);
429
+ --a-tertiary-text-disabled: var(--md-sys-color-tertiary-on-surface-disabled);
430
+
431
+ --a-tertiary-border-subtle: var(--md-sys-color-tertiary-outline-variant);
432
+ --a-tertiary-border: var(--md-sys-color-tertiary-outline);
433
+ --a-tertiary-border-strong: var(--md-sys-color-tertiary-outline-active);
434
+
435
+ /* L3 — Tertiary surface role matrix */
436
+ --a-tertiary-bg: var(--a-tertiary);
437
+ --a-tertiary-bg-hover: var(--a-tertiary-hover);
438
+
439
+ --a-tertiary-fg: var(--a-tertiary-text-strong);
440
+ --a-tertiary-fg-hover: var(--a-tertiary-text-strong);
441
+
442
+ /* L3 border state matrix — rest state is --a-tertiary-border (L2 above). */
443
+ --a-tertiary-border-hover: var(--a-tertiary-border-strong);
444
+ --a-tertiary-container-disabled: var(--md-sys-color-tertiary-container-disabled);
317
445
  }