@adia-ai/web-components 0.8.31 → 0.8.33

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 (164) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/MIGRATION.md +136 -0
  3. package/components/accordion/accordion-item.a2ui.json +8 -0
  4. package/components/accordion/accordion-item.yaml +6 -0
  5. package/components/accordion/accordion.css +3 -1
  6. package/components/accordion/accordion.d.ts +2 -2
  7. package/components/action-list/action-list.class.js +6 -2
  8. package/components/action-list/action-list.d.ts +1 -1
  9. package/components/agent-artifact/agent-artifact.d.ts +1 -1
  10. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +2 -2
  11. package/components/agent-questions/agent-questions.d.ts +1 -1
  12. package/components/agent-reasoning/agent-reasoning.d.ts +3 -3
  13. package/components/agent-suggestions/agent-suggestions.d.ts +1 -1
  14. package/components/agent-trace/agent-trace.d.ts +1 -1
  15. package/components/alert/alert.a2ui.json +3 -5
  16. package/components/alert/alert.class.js +3 -3
  17. package/components/alert/alert.css +5 -12
  18. package/components/alert/alert.d.ts +4 -4
  19. package/components/alert/alert.yaml +6 -5
  20. package/components/anchor-bar/anchor-bar.d.ts +2 -2
  21. package/components/avatar/avatar.class.js +0 -1
  22. package/components/avatar/avatar.css +16 -2
  23. package/components/badge/badge.a2ui.json +6 -9
  24. package/components/badge/badge.class.js +4 -4
  25. package/components/badge/badge.css +134 -74
  26. package/components/badge/badge.d.ts +34 -12
  27. package/components/badge/badge.examples.md +1 -1
  28. package/components/badge/badge.yaml +37 -16
  29. package/components/breadcrumb/breadcrumb.css +15 -3
  30. package/components/button/button.a2ui.json +1 -1
  31. package/components/button/button.css +4 -2
  32. package/components/button/button.d.ts +3 -3
  33. package/components/button/button.yaml +1 -1
  34. package/components/calendar-grid/calendar-grid.d.ts +2 -2
  35. package/components/card/card.css +21 -0
  36. package/components/card/card.yaml +10 -1
  37. package/components/chart/chart.class.js +8 -4
  38. package/components/chart/chart.d.ts +4 -4
  39. package/components/chart-legend/chart-legend.d.ts +1 -1
  40. package/components/chat-thread/chat-input.css +1 -1
  41. package/components/chat-thread/chat-thread.d.ts +2 -2
  42. package/components/check/check.css +3 -3
  43. package/components/command/command.d.ts +2 -2
  44. package/components/context-menu/context-menu.d.ts +3 -3
  45. package/components/datetime-picker/datetime-picker.d.ts +5 -5
  46. package/components/demo-toggle/demo-toggle.d.ts +1 -1
  47. package/components/drawer/drawer.d.ts +2 -2
  48. package/components/heatmap/heatmap.d.ts +5 -5
  49. package/components/index.js +1 -0
  50. package/components/inline-edit/inline-edit.d.ts +4 -4
  51. package/components/input/input.a2ui.json +4 -1
  52. package/components/input/input.css +18 -0
  53. package/components/input/input.yaml +11 -1
  54. package/components/integration-card/integration-card.class.js +11 -2
  55. package/components/integration-card/integration-card.d.ts +4 -4
  56. package/components/link/link.d.ts +1 -1
  57. package/components/list/list.class.js +22 -7
  58. package/components/list/list.d.ts +1 -1
  59. package/components/list-window/list-window.d.ts +5 -5
  60. package/components/mark/mark.a2ui.json +6 -7
  61. package/components/mark/mark.class.js +1 -1
  62. package/components/mark/mark.css +7 -4
  63. package/components/mark/mark.d.ts +2 -2
  64. package/components/mark/mark.examples.md +0 -4
  65. package/components/mark/mark.yaml +16 -6
  66. package/components/menu/menu.css +2 -2
  67. package/components/menu/menu.d.ts +1 -1
  68. package/components/modal/modal.d.ts +1 -1
  69. package/components/nav/nav.css +8 -0
  70. package/components/nav/nav.d.ts +1 -1
  71. package/components/nav-group/nav-group.css +58 -9
  72. package/components/nav-group/nav-group.d.ts +1 -1
  73. package/components/nav-item/nav-item.css +7 -4
  74. package/components/nav-item/nav-item.d.ts +1 -1
  75. package/components/noodles/noodles.d.ts +3 -3
  76. package/components/option-card/option-card.css +1 -1
  77. package/components/option-card/option-card.examples.md +1 -1
  78. package/components/pagination/pagination.d.ts +1 -1
  79. package/components/pane/pane.d.ts +1 -1
  80. package/components/password-strength/password-strength.d.ts +1 -1
  81. package/components/popover/popover.a2ui.json +5 -0
  82. package/components/popover/popover.class.js +9 -4
  83. package/components/popover/popover.css +5 -2
  84. package/components/popover/popover.yaml +8 -0
  85. package/components/preview/preview.examples.md +1 -1
  86. package/components/radio/radio.a2ui.json +4 -3
  87. package/components/radio/radio.css +2 -2
  88. package/components/radio/radio.yaml +7 -14
  89. package/components/radio-group/radio-group.a2ui.json +118 -0
  90. package/components/radio-group/radio-group.class.js +75 -0
  91. package/components/radio-group/radio-group.css +31 -0
  92. package/components/radio-group/radio-group.d.ts +20 -0
  93. package/components/radio-group/radio-group.examples.md +37 -0
  94. package/components/radio-group/radio-group.js +17 -0
  95. package/components/radio-group/radio-group.yaml +114 -0
  96. package/components/stat/stat.css +12 -8
  97. package/components/stat/stat.js +66 -1
  98. package/components/stat/stat.yaml +3 -0
  99. package/components/stepper/stepper-item.a2ui.json +5 -0
  100. package/components/stepper/stepper-item.yaml +11 -0
  101. package/components/stepper/stepper.a2ui.json +38 -3
  102. package/components/stepper/stepper.class.js +199 -2
  103. package/components/stepper/stepper.css +30 -0
  104. package/components/stepper/stepper.d.ts +28 -1
  105. package/components/stepper/stepper.yaml +76 -2
  106. package/components/stream/stream.d.ts +3 -3
  107. package/components/swatch/swatch.d.ts +1 -1
  108. package/components/swiper/swiper.d.ts +3 -3
  109. package/components/table/cell-types.js +12 -1
  110. package/components/table/table.a2ui.json +2 -2
  111. package/components/table/table.d.ts +7 -7
  112. package/components/table/table.yaml +9 -1
  113. package/components/table-toolbar/table-toolbar.class.js +1 -1
  114. package/components/table-toolbar/table-toolbar.d.ts +4 -4
  115. package/components/tabs/tabs.d.ts +1 -1
  116. package/components/tag/tag.a2ui.json +5 -5
  117. package/components/tag/tag.class.js +1 -1
  118. package/components/tag/tag.css +149 -71
  119. package/components/tag/tag.d.ts +21 -11
  120. package/components/tag/tag.examples.md +4 -4
  121. package/components/tag/tag.yaml +35 -13
  122. package/components/tags-input/tags-input.d.ts +4 -4
  123. package/components/timeline/timeline.d.ts +1 -1
  124. package/components/toast/toast.a2ui.json +2 -4
  125. package/components/toast/toast.css +0 -12
  126. package/components/toast/toast.yaml +3 -4
  127. package/components/toc/toc.d.ts +1 -1
  128. package/components/toggle-group/toggle-group.d.ts +1 -1
  129. package/components/toggle-scheme/toggle-scheme.d.ts +1 -1
  130. package/components/tour/tour.d.ts +4 -4
  131. package/components/tree/tree.d.ts +1 -1
  132. package/core/icons-phosphor.js +129 -71
  133. package/core/provider.js +84 -23
  134. package/dist/host.min.css +1 -1
  135. package/dist/host.sheet.js +1 -1
  136. package/dist/theme-provider.min.js +1 -1
  137. package/dist/web-components.min.css +1 -1
  138. package/dist/web-components.min.js +90 -88
  139. package/dist/web-components.sheet.js +1 -1
  140. package/package.json +1 -1
  141. package/patterns/admin-keys-and-export/admin-keys-and-export.examples.html +1 -1
  142. package/patterns/agent-memory/agent-memory.examples.html +5 -5
  143. package/patterns/agent-prompt-library/agent-prompt-library.examples.html +2 -2
  144. package/patterns/audit-log/audit-log.examples.js +12 -5
  145. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.js +4 -1
  146. package/patterns/changelog-feed/changelog-feed.examples.html +1 -1
  147. package/patterns/comments-and-collaboration/comments-and-collaboration.examples.html +1 -1
  148. package/patterns/conversion-funnel/conversion-funnel.examples.html +1 -1
  149. package/patterns/diff-review/diff-review.examples.html +9 -9
  150. package/patterns/filter-bar/filter-bar.examples.html +12 -8
  151. package/patterns/filter-bar/filter-bar.examples.js +4 -1
  152. package/patterns/marketing-engagement/marketing-engagement.examples.html +1 -1
  153. package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.examples.html +1 -1
  154. package/patterns/permissions-matrix/permissions-matrix.examples.html +1 -1
  155. package/patterns/permissions-sharing/permissions-sharing.examples.html +1 -1
  156. package/patterns/profile-public-and-verification/profile-public-and-verification.examples.html +2 -2
  157. package/patterns/record-detail-drawer/record-detail-drawer.examples.html +1 -1
  158. package/patterns/retention-cohort/retention-cohort.examples.html +1 -1
  159. package/patterns/retention-cohort/retention-cohort.examples.js +4 -1
  160. package/patterns/system-banners/system-banners.examples.html +3 -3
  161. package/styles/api/sizing-fallback.css +32 -0
  162. package/styles/api/sizing.css +7 -3
  163. package/styles/components.css +1 -0
  164. package/styles/tokens.css +1 -0
@@ -27,12 +27,12 @@ export class UIStream extends UIElement {
27
27
  /** Read-only reflected state, true while stream is active */
28
28
  streaming: boolean;
29
29
 
30
+ addEventListener(type: 'stream-end', listener: (ev: StreamEndEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
31
+ addEventListener(type: 'stream-error', listener: (ev: StreamErrorEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
32
+ addEventListener(type: 'stream-start', listener: (ev: StreamStartEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
30
33
  addEventListener<K extends keyof HTMLElementEventMap>(
31
34
  type: K,
32
35
  listener: (this: UIStream, ev: HTMLElementEventMap[K]) => unknown,
33
36
  options?: boolean | AddEventListenerOptions,
34
37
  ): void;
35
- addEventListener(type: 'stream-end', listener: (ev: StreamEndEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
36
- addEventListener(type: 'stream-error', listener: (ev: StreamErrorEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
37
- addEventListener(type: 'stream-start', listener: (ev: StreamStartEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
38
38
  }
@@ -73,10 +73,10 @@ pattern; blocked 3 cycles on this design call). */
73
73
  /** Size preset — sm / md / lg. Drives the swatch's intrinsic dimensions; lg is reserved for the token-scale demo (40 px tall). */
74
74
  size: 'sm' | 'md' | 'lg';
75
75
 
76
+ addEventListener(type: 'select', listener: (ev: SwatchSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
76
77
  addEventListener<K extends keyof HTMLElementEventMap>(
77
78
  type: K,
78
79
  listener: (this: UISwatch, ev: HTMLElementEventMap[K]) => unknown,
79
80
  options?: boolean | AddEventListenerOptions,
80
81
  ): void;
81
- addEventListener(type: 'select', listener: (ev: SwatchSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
82
82
  }
@@ -52,12 +52,12 @@ export class UISwiper extends UIElement {
52
52
  /** Scroll-snap alignment — start, center, end, or none. */
53
53
  snap: 'start' | 'center' | 'end' | 'none';
54
54
 
55
+ addEventListener(type: 'autoplay-pause', listener: (ev: SwiperAutoplayPauseEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
56
+ addEventListener(type: 'autoplay-resume', listener: (ev: SwiperAutoplayResumeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
57
+ addEventListener(type: 'change', listener: (ev: SwiperChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
55
58
  addEventListener<K extends keyof HTMLElementEventMap>(
56
59
  type: K,
57
60
  listener: (this: UISwiper, ev: HTMLElementEventMap[K]) => unknown,
58
61
  options?: boolean | AddEventListenerOptions,
59
62
  ): void;
60
- addEventListener(type: 'autoplay-pause', listener: (ev: SwiperAutoplayPauseEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
61
- addEventListener(type: 'autoplay-resume', listener: (ev: SwiperAutoplayResumeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
62
- addEventListener(type: 'change', listener: (ev: SwiperChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
63
63
  }
@@ -173,7 +173,18 @@ registerCellType('badge', {
173
173
  }
174
174
  el.setAttribute('text', String(value ?? ''));
175
175
  const variants = meta?.variants || {};
176
- el.setAttribute('variant', variants[value] || 'neutral');
176
+ const variant = variants[value];
177
+ // Unmapped value → family-less badge, tone="muted" (quiet chrome) —
178
+ // `variant="neutral"` retired (variant/color/tone convention cut,
179
+ // gh#873/874). Element is reused across renders, so both attributes
180
+ // are explicitly set/cleared rather than only ever added.
181
+ if (variant) {
182
+ el.setAttribute('variant', variant);
183
+ el.removeAttribute('tone');
184
+ } else {
185
+ el.removeAttribute('variant');
186
+ el.setAttribute('tone', 'muted');
187
+ }
177
188
  },
178
189
  format(value) {
179
190
  return String(value ?? '');
@@ -40,7 +40,7 @@
40
40
  "default": false
41
41
  },
42
42
  "frameless": {
43
- "description": "Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance.",
43
+ "description": "Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance. Note: `<card-ui><section bleed>` already drops a direct-child table-ui's chrome automatically (card.css, gh#796) — `frameless`/`raw` on the instance still applies and is honored, but is no longer required just to avoid the doubled-edge look in that composition.",
44
44
  "type": "boolean",
45
45
  "default": false
46
46
  },
@@ -55,7 +55,7 @@
55
55
  "default": 0
56
56
  },
57
57
  "raw": {
58
- "description": "Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom \"No data\" overlay. v0.6.33+ matches the documented contract.",
58
+ "description": "Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Note: a `<table-ui>` placed directly inside `<card-ui><section bleed>` drops the table's visual chrome automatically (card.css, gh#796) even without `raw` — `raw` is still required to also short-circuit the data lifecycle. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom \"No data\" overlay. v0.6.33+ matches the documented contract.",
59
59
  "type": "boolean",
60
60
  "default": false
61
61
  },
@@ -94,13 +94,13 @@ export class UITable extends UIElement {
94
94
  density: 'compact' | 'standard' | 'comfortable';
95
95
  /** Enable row expansion */
96
96
  expandable: boolean;
97
- /** Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance. */
97
+ /** Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance. Note: `<card-ui><section bleed>` already drops a direct-child table-ui's chrome automatically (card.css, gh#796) — `frameless`/`raw` on the instance still applies and is honored, but is no longer required just to avoid the doubled-edge look in that composition. */
98
98
  frameless: boolean;
99
99
  /** Renders N ghost skeleton rows in place of the body data (count derived from `paginate` if set, else 5). Header + columns stay intact so the table layout is preserved while data fetches. Sets aria-busy="true" on the host. Data updates are deferred until loading is set back to false. */
100
100
  loading: boolean;
101
101
  /** Rows per page. 0 = show all rows without pagination. When > 0, renders a pagination bar below the table. */
102
102
  paginate: number;
103
- /** Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom "No data" overlay. v0.6.33+ matches the documented contract. */
103
+ /** Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Note: a `<table-ui>` placed directly inside `<card-ui><section bleed>` drops the table's visual chrome automatically (card.css, gh#796) even without `raw` — `raw` is still required to also short-circuit the data lifecycle. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom "No data" overlay. v0.6.33+ matches the documented contract. */
104
104
  raw: boolean;
105
105
  /** Global search/filter string. Filters visible rows across all columns using case-insensitive substring matching. Resets to page 1 on change. */
106
106
  search: string;
@@ -115,11 +115,6 @@ export class UITable extends UIElement {
115
115
  /** Allow body-cell content to wrap onto multiple lines. Default is single-line with ellipsis truncation (matches the row convention shared by <select-ui> + <nav-item-ui>); long unbreakable strings clip gracefully rather than rewrapping the row. With [wrap], row height auto-grows to fit wrapped content. For surgical opt-in on a single column, set [data-wrap] on the cell / col-def instead. */
116
116
  wrap: boolean;
117
117
 
118
- addEventListener<K extends keyof HTMLElementEventMap>(
119
- type: K,
120
- listener: (this: UITable, ev: HTMLElementEventMap[K]) => unknown,
121
- options?: boolean | AddEventListenerOptions,
122
- ): void;
123
118
  addEventListener(type: 'cell-click', listener: (ev: TableCellClickEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
124
119
  addEventListener(type: 'filter-change', listener: (ev: TableFilterChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
125
120
  addEventListener(type: 'page', listener: (ev: TablePageEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
@@ -129,4 +124,9 @@ export class UITable extends UIElement {
129
124
  addEventListener(type: 'row-expand', listener: (ev: TableRowExpandEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
130
125
  addEventListener(type: 'select', listener: (ev: TableSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
131
126
  addEventListener(type: 'sort', listener: (ev: TableSortEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
127
+ addEventListener<K extends keyof HTMLElementEventMap>(
128
+ type: K,
129
+ listener: (this: UITable, ev: HTMLElementEventMap[K]) => unknown,
130
+ options?: boolean | AddEventListenerOptions,
131
+ ): void;
132
132
  }
@@ -74,6 +74,10 @@ props:
74
74
  surfaces that supply their own chrome (e.g. `<card-ui><section
75
75
  bleed>`), or when wrapping a consumer-authored native `<table>`
76
76
  for design-token styling without the framework's data semantics.
77
+ Note: a `<table-ui>` placed directly inside `<card-ui><section bleed>`
78
+ drops the table's visual chrome automatically (card.css, gh#796) even
79
+ without `raw` — `raw` is still required to also short-circuit the
80
+ data lifecycle.
77
81
  Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle
78
82
  still ran — wrapping a `.data`-unset native table produced a
79
83
  phantom "No data" overlay. v0.6.33+ matches the documented contract.
@@ -107,7 +111,11 @@ props:
107
111
  square perimeter otherwise renders a doubled edge (flush bleed) or
108
112
  a stray inner box (with content above). Standalone tables keep
109
113
  their chrome by default. Theming path without the attribute:
110
- set --table-perimeter to transparent per instance.
114
+ set --table-perimeter to transparent per instance. Note:
115
+ `<card-ui><section bleed>` already drops a direct-child table-ui's
116
+ chrome automatically (card.css, gh#796) — `frameless`/`raw` on the
117
+ instance still applies and is honored, but is no longer required
118
+ just to avoid the doubled-edge look in that composition.
111
119
  type: boolean
112
120
  default: false
113
121
  reflect: true
@@ -272,7 +272,7 @@ export class UITableToolbar extends UIElement {
272
272
  const badge = document.createElement('badge-ui');
273
273
  badge.setAttribute('data-count-badge', '');
274
274
  badge.setAttribute('size', 'sm');
275
- badge.setAttribute('variant', 'muted');
275
+ badge.setAttribute('tone', 'muted');
276
276
  badge.hidden = true;
277
277
  title.appendChild(badge);
278
278
 
@@ -37,13 +37,13 @@ export class UITableToolbar extends UIElement {
37
37
  /** Toolbar visual variant. `default` renders bare on parent surface; `card` adds the same chrome as a card-ui header. */
38
38
  variant: 'default' | 'card';
39
39
 
40
+ addEventListener(type: 'columns-change', listener: (ev: TableToolbarColumnsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
41
+ addEventListener(type: 'filter-change', listener: (ev: TableToolbarFilterChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
42
+ addEventListener(type: 'search', listener: (ev: TableToolbarSearchEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
43
+ addEventListener(type: 'sort-change', listener: (ev: TableToolbarSortChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
40
44
  addEventListener<K extends keyof HTMLElementEventMap>(
41
45
  type: K,
42
46
  listener: (this: UITableToolbar, ev: HTMLElementEventMap[K]) => unknown,
43
47
  options?: boolean | AddEventListenerOptions,
44
48
  ): void;
45
- addEventListener(type: 'columns-change', listener: (ev: TableToolbarColumnsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
46
- addEventListener(type: 'filter-change', listener: (ev: TableToolbarFilterChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
47
- addEventListener(type: 'search', listener: (ev: TableToolbarSearchEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
48
- addEventListener(type: 'sort-change', listener: (ev: TableToolbarSortChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
49
49
  }
@@ -27,12 +27,12 @@ export class UITabs extends UIElement {
27
27
  /** Visual variant — `default` (underline strip) or `bordered`. */
28
28
  variant: 'default' | 'bordered';
29
29
 
30
+ addEventListener(type: 'change', listener: (ev: TabsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
30
31
  addEventListener<K extends keyof HTMLElementEventMap>(
31
32
  type: K,
32
33
  listener: (this: UITabs, ev: HTMLElementEventMap[K]) => unknown,
33
34
  options?: boolean | AddEventListenerOptions,
34
35
  ): void;
35
- addEventListener(type: 'change', listener: (ev: TabsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
36
36
  }
37
37
 
38
38
  export class UITab extends UIElement {
@@ -46,25 +46,25 @@
46
46
  "$ref": "common_types.json#/$defs/DynamicString"
47
47
  },
48
48
  "tone": {
49
- "description": "Fill style — orthogonal to [variant]. Three values:\n - `solid` (default for family variants)saturated bg + on-strong\n (near-white) text. The chip IS the state.\n - `muted` — tinted bg with scheme-paired text. Matches <badge-ui>'s\n default look. Use on metadata chips in dense lists where the\n saturated default would compete for attention.\n - `outline` — transparent bg + family-colored border + family-colored\n text. The lightest visual weight; good in dense data tables or\n faceted filter rows where multiple chips would otherwise compete.\nThe `default` variant (no family) stays quiet chrome regardless of\ntone unless `tone=\"solid\"` is set explicitly (high-contrast neutral\ninverse), or `tone=\"outline\"` (fg-muted text + subtle border).\n",
49
+ "description": "Fill style — orthogonal to [variant]. Three values:\n - `muted` (default for the family variants — info/success/warning/\n danger/primary gh#864: tag and badge were swapped relative to\n their reported default formulas; this restores tag's own)\n — tinted bg with scheme-paired text. Matches <badge-ui>'s\n `[tone=\"muted\"]` look. Use on metadata / citation chips in dense\n lists or tables where a saturated fill would compete for\n attention (gh#778's oversized-pill concern). Does NOT apply to\n the family-less `default` variant, which stays solid\n unconditionally (gh#794, unaffected by gh#864) — a bare\n `<tag-ui text=\"…\">` still renders that solid look with no\n attributes at all.\n - `solid` — saturated bg + on-strong (near-white) text. The chip\n IS the state. Opt in explicitly for a family variant (gh#864),\n or it's already the unconditional look for the family-less\n `default` variant (gh#794).\n - `outline` — transparent bg + family-colored border + family-colored\n text. The lightest visual weight; good in dense data tables or\n faceted filter rows where multiple chips would otherwise compete.\n`tone` is a declarative presentational attribute (not a reactive\nprop see tag.class.js) so its schema `default` here is documentation\nof the rendered-by-default look, not a reflected attribute value.\n",
50
50
  "type": "string",
51
51
  "enum": [
52
52
  "solid",
53
53
  "muted",
54
54
  "outline"
55
55
  ],
56
- "default": "solid"
56
+ "default": "muted"
57
57
  },
58
58
  "variant": {
59
- "description": "Semantic variant — `default | accent | info | success | warning | danger`. `accent` is brand-primary emphasis for non-semantic labels — a filter chip or taxonomy tag that shouldn't imply a success/warning/danger state. Mirrors <badge-ui>'s `accent` variant token-for-token.",
59
+ "description": "Semantic variant — `default | info | success | warning | danger | primary`. `primary` is brand emphasis for non-semantic labels — a filter chip or taxonomy tag that shouldn't imply a success/warning/danger state. Mirrors <badge-ui>'s `primary` variant token-for-token (`accent` retired, gh#874 — the capability survives renamed, sibling parity with badge preserved).",
60
60
  "type": "string",
61
61
  "enum": [
62
62
  "default",
63
- "accent",
64
63
  "info",
65
64
  "success",
66
65
  "warning",
67
- "danger"
66
+ "danger",
67
+ "primary"
68
68
  ],
69
69
  "default": "default"
70
70
  }
@@ -17,7 +17,7 @@
17
17
  * Inline tag / chip. Pill-shaped, text rendered via CSS attr().
18
18
  * Optional dismiss button dispatches a 'remove' CustomEvent.
19
19
  *
20
- * Variants: default, info, success, warning, danger
20
+ * Variants: default, info, success, warning, danger, primary
21
21
  * Sizes: sm, md (default)
22
22
  *
23
23
  * Events:
@@ -6,15 +6,47 @@ tag-ui[removable]:not([disabled]):hover {
6
6
 
7
7
  @scope (tag-ui) {
8
8
  :where(:scope) {
9
- /* ── Tokens ── */
10
- --tag-bg: var(--a-bg-muted);
11
- --tag-fg: var(--md-sys-color-neutral-on-surface);
9
+ /* ── Tokens ──
10
+ gh#794: the real bare-tag default lives HERE, not in the
11
+ `:scope[variant="default"]` rule below — `variant` is a reflect:true
12
+ prop (tag.class.js), and `installProps()`'s reflect() only fires on
13
+ a property SET, never for a value that equals its declared class
14
+ default at construction time. A bare `<tag-ui text="…">` therefore
15
+ never gets a physical `variant="default"` attribute; these
16
+ `:where(:scope)` zero-specificity tokens are what it actually
17
+ renders. Solid neutral (was `--a-bg-muted` quiet chrome pre-#794)
18
+ — same pair the family variants and the redundant
19
+ `:scope[variant="default"]` rule below carry, for the rare case
20
+ `variant="default"` IS reflected explicitly (SSR/a2ui-producer
21
+ markup). Opt out via `[tone="muted"]`. Uses the real
22
+ `--md-sys-color-neutral`/`-on-neutral` pair (operator ruling,
23
+ 2026-08-10) — the true parallel to `-primary`/`-on-primary` etc.,
24
+ not the `-on-surface`/`-background` ink/page tokens this rule
25
+ borrowed pre-#794's cross-check. */
26
+ --tag-bg: var(--md-sys-color-neutral);
27
+ --tag-fg: var(--md-sys-color-neutral-on-neutral);
12
28
  --tag-border: transparent;
13
29
  --tag-radius: var(--a-radius-full);
14
30
  --tag-px: var(--a-space-1-5);
15
- --tag-py: 0.125rem;
31
+ --tag-py: var(--a-space-0-5);
16
32
  --tag-gap: var(--a-space-1);
17
33
  --tag-font: var(--a-ui-sm);
34
+
35
+ /* ── Size tiers (gh#779) — md (above) is the pixel-identical default;
36
+ [size="sm"|"lg"] below re-point the active tokens. Component-owned
37
+ ladder, NOT a direct alias of the universal --a-ui-px/--a-ui-size
38
+ tokens (styles/api/sizing.css) — tag-ui's own md baseline predates
39
+ and differs from that system's md (6px/12px here vs 8px/13px
40
+ there), so aliasing directly would shift every default tag's
41
+ geometry (gh#778 is exactly this failure mode — an inflated
42
+ default). Instead sm/lg step off tag's OWN md baseline by the
43
+ same rung spacing the space/type scales already use. */
44
+ --tag-px-sm: var(--a-space-1);
45
+ --tag-px-lg: var(--a-space-2);
46
+ --tag-py-sm: var(--a-space-px);
47
+ --tag-py-lg: var(--a-space-1);
48
+ --tag-font-sm: var(--a-ui-xs);
49
+ --tag-font-lg: var(--a-ui-md);
18
50
  --tag-font-family: var(--a-font-family-ui);
19
51
  --tag-dismiss-size: 1rem;
20
52
  --tag-bg-hover: var(--a-bg-hover);
@@ -94,93 +126,122 @@ tag-ui[removable]:not([disabled]):hover {
94
126
  }
95
127
 
96
128
  /* ── Variants ──
97
- Default tone is `solid` for the four family variants:
98
- `--a-{family}-bg` (saturated surface) + `--a-{family}-fg` (on-strong
99
- text, near-white in both schemes by design). Reads as a status pill
100
- where the chip IS the state. Opt out per-tag via [tone="muted"] for
101
- metadata-chip surfaces in dense lists. */
102
- /* `accent` is brand-primary emphasis for non-semantic labelsmirrors
103
- <badge-ui>'s `accent` variant token-for-token (--a-primary-bg /
104
- on-primary for the solid fill), applied to tag-ui's own solid-default
105
- tone shape. Not a status color no success/warning/danger implication. */
106
- :scope[variant="accent"] {
107
- --tag-bg: var(--a-primary-bg);
108
- --tag-fg: var(--md-sys-color-primary-on-primary);
129
+ Default tone is `muted` for the family variants (gh#864): the
130
+ tinted-container pair `--md-sys-color-{family}-container` (tinted
131
+ surface) + `-on-surface` (scheme-flipping text). Tag and badge had
132
+ been implementing each OTHER's reported default formula (gh#794
133
+ flipped tag's bare default to solid a day before gh#845 ratified
134
+ badge's register, with no cross-check between the two changes)this
135
+ restores tag's own. Opt into the saturated stamp per-tag via
136
+ [tone="solid"] below. This does NOT touch the family-less `default`
137
+ variant below, which stays solid unconditionally (gh#794, unrelated
138
+ to the gh#864 swap). */
139
+ /* `primary` is brand emphasis for non-semantic labels — mirrors
140
+ <badge-ui>'s `primary` variant token-for-token (--md-sys-color-primary-
141
+ container / -on-surface for the tinted fill; `accent` retired, gh#874).
142
+ Not a status color — no success/warning/danger implication. */
143
+ :scope[variant="primary"] {
144
+ --tag-bg: var(--md-sys-color-primary-container);
145
+ --tag-fg: var(--md-sys-color-primary-on-surface);
109
146
  }
110
147
 
111
148
  :scope[variant="info"] {
112
- --tag-bg: var(--a-info-bg);
113
- --tag-fg: var(--md-sys-color-info-on-info);
149
+ --tag-bg: var(--md-sys-color-info-container);
150
+ --tag-fg: var(--md-sys-color-info-on-surface);
114
151
  }
115
152
 
116
153
  :scope[variant="success"] {
154
+ --tag-bg: var(--md-sys-color-success-container);
155
+ --tag-fg: var(--md-sys-color-success-on-surface);
156
+ }
157
+
158
+ :scope[variant="warning"] {
159
+ --tag-bg: var(--md-sys-color-warning-container);
160
+ --tag-fg: var(--md-sys-color-warning-on-surface);
161
+ }
162
+
163
+ :scope[variant="danger"] {
164
+ --tag-bg: var(--md-sys-color-danger-container);
165
+ --tag-fg: var(--md-sys-color-danger-on-surface);
166
+ }
167
+
168
+ /* `default` (no family) is solid by default (gh#794) — the same
169
+ high-contrast neutral inverse it has always carried. A bare
170
+ `<tag-ui text="…">` is a stamped pill, not quiet chrome. Unaffected by
171
+ the gh#864 family-variant swap above. Opt OUT to the pre-#794 quiet-
172
+ chrome look via `[tone="muted"]` (below) on metadata/citation chips
173
+ in dense lists or tables where the saturated look competes for
174
+ attention (gh#778's oversized-pill complaint). */
175
+ :scope[variant="default"] {
176
+ --tag-bg: var(--md-sys-color-neutral);
177
+ --tag-fg: var(--md-sys-color-neutral-on-neutral);
178
+ }
179
+
180
+ /* ── Tone modifier — orthogonal to [variant] ──
181
+ `[tone="solid"]` opts each family variant INTO the saturated-fill pair
182
+ (gh#864 — this used to be the family variants' unconditional default;
183
+ see the Variants comment above): `--a-{family}-bg` (saturated surface)
184
+ + Material's on-color (`-on-{family}`, near-white by the fixed-light-
185
+ on-color law). Same shape <tag-ui>'s family-less `default` variant
186
+ still carries unconditionally. Use for a single hero tag that should
187
+ stamp its state.
188
+
189
+ Warning uses --a-warning-bg (semantics.css L3 redirect to the bright-
190
+ amber -20-tint) rather than the raw family token — see also
191
+ <badge-ui>'s identical workaround. */
192
+ :scope[tone="solid"][variant="info"] {
193
+ --tag-bg: var(--a-info-bg);
194
+ --tag-fg: var(--md-sys-color-info-on-info);
195
+ }
196
+ :scope[tone="solid"][variant="success"] {
117
197
  --tag-bg: var(--a-success-bg);
118
198
  --tag-fg: var(--md-sys-color-success-on-success);
119
199
  }
120
-
121
200
  /* Same shape as the sibling families since the Material static-token
122
201
  migration: amber fill + the palette's own fixed-light on-color
123
202
  (`on-warning`, white in both schemes per Material's on-color law).
124
203
  The pre-migration dark-brown-text override is gone — its
125
204
  lower-than-siblings contrast is a known, operator-accepted
126
205
  consequence (TKT-0018, wontfix pending palette adjustment). */
127
- :scope[variant="warning"] {
206
+ :scope[tone="solid"][variant="warning"] {
128
207
  --tag-bg: var(--a-warning-bg);
129
208
  --tag-fg: var(--md-sys-color-warning-on-warning);
130
209
  }
131
-
132
- :scope[variant="danger"] {
210
+ :scope[tone="solid"][variant="danger"] {
133
211
  --tag-bg: var(--a-danger-bg);
134
212
  --tag-fg: var(--md-sys-color-danger-on-danger);
135
213
  }
136
-
137
- /* `default` (no family) stays as quiet chrome — a stark fg/bg-inverse
138
- would be too loud for the no-variant case. Opt in to the inverse
139
- stamp via `[tone="solid"]` when you want a high-contrast neutral pill. */
140
- :scope[variant="default"] {
214
+ :scope[tone="solid"][variant="primary"] {
215
+ --tag-bg: var(--a-primary-bg);
216
+ --tag-fg: var(--md-sys-color-primary-on-primary);
217
+ }
218
+ /* gh#794: the pre-#794 quiet-chrome look for the variant-less default
219
+ same values the `:where(:scope)` base tokens carried before the
220
+ solid-default flip. This is the explicit opt-out for bare tags that
221
+ need the old quiet register (dense-list metadata/citation chips,
222
+ gh#778's oversized-pill concern) instead of the new stamped-pill
223
+ default. `:not([variant=…])` (not `[variant="default"]`) because
224
+ `variant` is a reflect:true prop whose class default ("default")
225
+ never gets a physical attribute reflected on a bare tag (the
226
+ `installProps()` reflect() path only fires on a property SET) —
227
+ the same reason the `[tone="solid"]` fallback below uses this same
228
+ `:not()` shape instead of `[variant="default"]`. */
229
+ :scope[tone="muted"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="primary"]) {
141
230
  --tag-bg: var(--a-bg-muted);
142
231
  --tag-fg: var(--md-sys-color-neutral-on-surface);
143
232
  }
144
233
 
145
- /* ── Tone modifierorthogonal to [variant] ──
146
- `[tone="muted"]` opts each family variant OUT of the solid default
147
- into the canonical muted pair: `--a-{family}-muted` (tinted surface)
148
- + `--a-{family}-text` (scheme-flipping text). Same shape <badge-ui>
149
- uses as its default. Use on metadata chips in dense lists where the
150
- saturated default would compete for attention. */
151
- :scope[tone="muted"][variant="info"] {
152
- --tag-bg: var(--md-sys-color-info-container);
153
- --tag-fg: var(--md-sys-color-info-on-surface);
154
- }
155
- :scope[tone="muted"][variant="success"] {
156
- --tag-bg: var(--md-sys-color-success-container);
157
- --tag-fg: var(--md-sys-color-success-on-surface);
158
- }
159
- :scope[tone="muted"][variant="warning"] {
160
- --tag-bg: var(--md-sys-color-warning-container);
161
- --tag-fg: var(--md-sys-color-warning-on-surface);
162
- }
163
- :scope[tone="muted"][variant="danger"] {
164
- --tag-bg: var(--md-sys-color-danger-container);
165
- --tag-fg: var(--md-sys-color-danger-on-surface);
166
- }
167
- /* Mirrors <badge-ui>'s default (muted) accent pair —
168
- --md-sys-color-primary-container / -on-surface. */
169
- :scope[tone="muted"][variant="accent"] {
170
- --tag-bg: var(--md-sys-color-primary-container);
171
- --tag-fg: var(--md-sys-color-primary-on-surface);
172
- }
173
-
174
- /* `[tone="solid"]` on the neutral default (or no variant) inverts the
175
- chrome — solid fg-color bg with bg-color text. High-contrast neutral
176
- stamp. Explicit opt-in; the variant-less default stays quiet chrome.
177
- [variant="accent"] is excluded — it already has an explicit solid
178
- pair above (the plain [variant="accent"] rule) that this higher-
179
- specificity fallback would otherwise clobber when tone="solid" is
180
- set explicitly alongside it. */
181
- :scope[tone="solid"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="accent"]) {
182
- --tag-bg: var(--md-sys-color-neutral-on-surface);
183
- --tag-fg: var(--md-sys-color-neutral-background);
234
+ /* `[tone="solid"]` explicit opt-inredundant with the bare default
235
+ since gh#794 (the variant-less default is solid unconditionally
236
+ above) but kept so `tone="solid"` stays a valid, harmless, explicit
237
+ statement of intent for consumers who set it directly.
238
+ [variant="primary"] is excluded its solid pair is the explicit
239
+ `[tone="solid"][variant="primary"]` rule above (gh#864: the bare
240
+ `[variant="primary"]` rule is container-tinted now, not solid) — this
241
+ `:not()` keeps the neutral-only fallback from ever matching primary. */
242
+ :scope[tone="solid"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="primary"]) {
243
+ --tag-bg: var(--md-sys-color-neutral);
244
+ --tag-fg: var(--md-sys-color-neutral-on-neutral);
184
245
  }
185
246
 
186
247
  /* ── `[tone="outline"]` — transparent bg + family-colored border + text ──
@@ -207,20 +268,37 @@ tag-ui[removable]:not([disabled]):hover {
207
268
  --tag-fg: var(--md-sys-color-danger-on-surface);
208
269
  --tag-border: var(--md-sys-color-danger-outline);
209
270
  }
210
- /* Mirrors <badge-ui>'s outline accent pair —
271
+ /* Mirrors <badge-ui>'s outline primary pair —
211
272
  --md-sys-color-primary-on-surface / -primary-outline. */
212
- :scope[tone="outline"][variant="accent"] {
273
+ :scope[tone="outline"][variant="primary"] {
213
274
  --tag-fg: var(--md-sys-color-primary-on-surface);
214
275
  --tag-border: var(--md-sys-color-primary-outline);
215
276
  }
216
277
  /* Outline on neutral (no family) — fg-muted text + subtle border.
217
- [variant="accent"] excluded — see the [tone="solid"] fallback note above. */
218
- :scope[tone="outline"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="accent"]) {
278
+ [variant="primary"] excluded — see the [tone="solid"] fallback note above. */
279
+ :scope[tone="outline"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="primary"]) {
219
280
  --tag-fg: var(--a-fg-muted);
220
281
  --tag-border: var(--md-sys-color-neutral-outline);
221
282
  }
222
283
 
223
- /* Size handled by universal [size] attribute system. */
284
+ /* ── Size tiers (gh#779) re-point the active tokens to the matching
285
+ tier; the token defaults at :where(:scope) above ARE the md tier, so
286
+ [size="md"] is declared only for explicitness (mirrors kbd.css). */
287
+ :scope[size="sm"] {
288
+ --tag-px: var(--tag-px-sm);
289
+ --tag-py: var(--tag-py-sm);
290
+ --tag-font: var(--tag-font-sm);
291
+ }
292
+ :scope[size="md"] {
293
+ --tag-px: var(--a-space-1-5);
294
+ --tag-py: var(--a-space-0-5);
295
+ --tag-font: var(--a-ui-sm);
296
+ }
297
+ :scope[size="lg"] {
298
+ --tag-px: var(--tag-px-lg);
299
+ --tag-py: var(--tag-py-lg);
300
+ --tag-font: var(--tag-font-lg);
301
+ }
224
302
 
225
303
  /* hover rule moved outside @scope — see Safari 17.x bug note at top. */
226
304
 
@@ -41,26 +41,36 @@ export class UITag extends UIElement {
41
41
  /** Tag label. Renderer routes this to the `text` attribute, rendered via CSS attr(text) on ::after. */
42
42
  textContent: string;
43
43
  /** Fill style — orthogonal to [variant]. Three values:
44
- - `solid` (default for family variants)saturated bg + on-strong
45
- (near-white) text. The chip IS the state.
46
- - `muted` tinted bg with scheme-paired text. Matches <badge-ui>'s
47
- default look. Use on metadata chips in dense lists where the
48
- saturated default would compete for attention.
44
+ - `muted` (default for the family variants — info/success/warning/
45
+ danger/primary gh#864: tag and badge were swapped relative to
46
+ their reported default formulas; this restores tag's own)
47
+ tinted bg with scheme-paired text. Matches <badge-ui>'s
48
+ `[tone="muted"]` look. Use on metadata / citation chips in dense
49
+ lists or tables where a saturated fill would compete for
50
+ attention (gh#778's oversized-pill concern). Does NOT apply to
51
+ the family-less `default` variant, which stays solid
52
+ unconditionally (gh#794, unaffected by gh#864) — a bare
53
+ `<tag-ui text="…">` still renders that solid look with no
54
+ attributes at all.
55
+ - `solid` — saturated bg + on-strong (near-white) text. The chip
56
+ IS the state. Opt in explicitly for a family variant (gh#864),
57
+ or it's already the unconditional look for the family-less
58
+ `default` variant (gh#794).
49
59
  - `outline` — transparent bg + family-colored border + family-colored
50
60
  text. The lightest visual weight; good in dense data tables or
51
61
  faceted filter rows where multiple chips would otherwise compete.
52
- The `default` variant (no family) stays quiet chrome regardless of
53
- tone unless `tone="solid"` is set explicitly (high-contrast neutral
54
- inverse), or `tone="outline"` (fg-muted text + subtle border).
62
+ `tone` is a declarative presentational attribute (not a reactive
63
+ prop see tag.class.js) so its schema `default` here is documentation
64
+ of the rendered-by-default look, not a reflected attribute value.
55
65
  */
56
66
  tone: 'solid' | 'muted' | 'outline';
57
- /** Semantic variant — `default | accent | info | success | warning | danger`. `accent` is brand-primary emphasis for non-semantic labels — a filter chip or taxonomy tag that shouldn't imply a success/warning/danger state. Mirrors <badge-ui>'s `accent` variant token-for-token. */
58
- variant: 'default' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
67
+ /** Semantic variant — `default | info | success | warning | danger | primary`. `primary` is brand emphasis for non-semantic labels — a filter chip or taxonomy tag that shouldn't imply a success/warning/danger state. Mirrors <badge-ui>'s `primary` variant token-for-token (`accent` retired, gh#874 — the capability survives renamed, sibling parity with badge preserved). */
68
+ variant: 'default' | 'info' | 'success' | 'warning' | 'danger' | 'primary';
59
69
 
70
+ addEventListener(type: 'remove', listener: (ev: TagRemoveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
60
71
  addEventListener<K extends keyof HTMLElementEventMap>(
61
72
  type: K,
62
73
  listener: (this: UITag, ev: HTMLElementEventMap[K]) => unknown,
63
74
  options?: boolean | AddEventListenerOptions,
64
75
  ): void;
65
- addEventListener(type: 'remove', listener: (ev: TagRemoveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
66
76
  }
@@ -6,14 +6,14 @@
6
6
  <tag-ui text="Default"></tag-ui>
7
7
  ```
8
8
 
9
- ## tone
9
+ ## size
10
10
 
11
11
  ```html
12
- <tag-ui text="Default" tone="solid"></tag-ui>
12
+ <tag-ui text="Small" size="sm"></tag-ui>
13
13
  ```
14
14
 
15
- ## size
15
+ ## removable
16
16
 
17
17
  ```html
18
- <tag-ui text="Small" size="sm"></tag-ui>
18
+ <tag-ui text="Removable" removable></tag-ui>
19
19
  ```