@adia-ai/web-components 0.8.31 → 0.8.32

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 (108) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/components/accordion/accordion.d.ts +2 -2
  3. package/components/action-list/action-list.class.js +6 -2
  4. package/components/action-list/action-list.d.ts +1 -1
  5. package/components/agent-artifact/agent-artifact.d.ts +1 -1
  6. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +2 -2
  7. package/components/agent-questions/agent-questions.d.ts +1 -1
  8. package/components/agent-reasoning/agent-reasoning.d.ts +3 -3
  9. package/components/agent-suggestions/agent-suggestions.d.ts +1 -1
  10. package/components/agent-trace/agent-trace.d.ts +1 -1
  11. package/components/alert/alert.d.ts +2 -2
  12. package/components/anchor-bar/anchor-bar.d.ts +2 -2
  13. package/components/avatar/avatar.class.js +0 -1
  14. package/components/avatar/avatar.css +16 -2
  15. package/components/badge/badge.css +30 -2
  16. package/components/breadcrumb/breadcrumb.css +15 -3
  17. package/components/button/button.d.ts +1 -1
  18. package/components/calendar-grid/calendar-grid.d.ts +2 -2
  19. package/components/card/card.css +21 -0
  20. package/components/card/card.yaml +9 -0
  21. package/components/chart/chart.d.ts +4 -4
  22. package/components/chart-legend/chart-legend.d.ts +1 -1
  23. package/components/chat-thread/chat-input.css +1 -1
  24. package/components/chat-thread/chat-thread.d.ts +2 -2
  25. package/components/check/check.css +3 -3
  26. package/components/command/command.d.ts +2 -2
  27. package/components/context-menu/context-menu.d.ts +3 -3
  28. package/components/datetime-picker/datetime-picker.d.ts +5 -5
  29. package/components/demo-toggle/demo-toggle.d.ts +1 -1
  30. package/components/drawer/drawer.d.ts +2 -2
  31. package/components/heatmap/heatmap.d.ts +5 -5
  32. package/components/index.js +1 -0
  33. package/components/inline-edit/inline-edit.d.ts +4 -4
  34. package/components/input/input.a2ui.json +4 -1
  35. package/components/input/input.css +18 -0
  36. package/components/input/input.yaml +11 -1
  37. package/components/integration-card/integration-card.d.ts +4 -4
  38. package/components/link/link.d.ts +1 -1
  39. package/components/list/list.class.js +22 -7
  40. package/components/list/list.d.ts +1 -1
  41. package/components/list-window/list-window.d.ts +5 -5
  42. package/components/menu/menu.css +2 -2
  43. package/components/menu/menu.d.ts +1 -1
  44. package/components/modal/modal.d.ts +1 -1
  45. package/components/nav/nav.css +8 -0
  46. package/components/nav/nav.d.ts +1 -1
  47. package/components/nav-group/nav-group.css +58 -9
  48. package/components/nav-group/nav-group.d.ts +1 -1
  49. package/components/nav-item/nav-item.css +7 -4
  50. package/components/nav-item/nav-item.d.ts +1 -1
  51. package/components/noodles/noodles.d.ts +3 -3
  52. package/components/option-card/option-card.css +1 -1
  53. package/components/pagination/pagination.d.ts +1 -1
  54. package/components/pane/pane.d.ts +1 -1
  55. package/components/password-strength/password-strength.d.ts +1 -1
  56. package/components/radio/radio.a2ui.json +4 -3
  57. package/components/radio/radio.css +2 -2
  58. package/components/radio/radio.yaml +7 -14
  59. package/components/radio-group/radio-group.a2ui.json +118 -0
  60. package/components/radio-group/radio-group.class.js +75 -0
  61. package/components/radio-group/radio-group.css +31 -0
  62. package/components/radio-group/radio-group.d.ts +20 -0
  63. package/components/radio-group/radio-group.examples.md +37 -0
  64. package/components/radio-group/radio-group.js +17 -0
  65. package/components/radio-group/radio-group.yaml +114 -0
  66. package/components/stat/stat.css +12 -8
  67. package/components/stat/stat.js +66 -1
  68. package/components/stat/stat.yaml +3 -0
  69. package/components/stepper/stepper-item.a2ui.json +5 -0
  70. package/components/stepper/stepper-item.yaml +11 -0
  71. package/components/stepper/stepper.a2ui.json +38 -3
  72. package/components/stepper/stepper.class.js +199 -2
  73. package/components/stepper/stepper.css +30 -0
  74. package/components/stepper/stepper.d.ts +28 -1
  75. package/components/stepper/stepper.yaml +76 -2
  76. package/components/stream/stream.d.ts +3 -3
  77. package/components/swatch/swatch.d.ts +1 -1
  78. package/components/swiper/swiper.d.ts +3 -3
  79. package/components/table/table.a2ui.json +2 -2
  80. package/components/table/table.d.ts +7 -7
  81. package/components/table/table.yaml +9 -1
  82. package/components/table-toolbar/table-toolbar.d.ts +4 -4
  83. package/components/tabs/tabs.d.ts +1 -1
  84. package/components/tag/tag.a2ui.json +1 -1
  85. package/components/tag/tag.css +78 -13
  86. package/components/tag/tag.d.ts +12 -8
  87. package/components/tag/tag.examples.md +4 -4
  88. package/components/tag/tag.yaml +18 -7
  89. package/components/tags-input/tags-input.d.ts +4 -4
  90. package/components/timeline/timeline.d.ts +1 -1
  91. package/components/toc/toc.d.ts +1 -1
  92. package/components/toggle-group/toggle-group.d.ts +1 -1
  93. package/components/toggle-scheme/toggle-scheme.d.ts +1 -1
  94. package/components/tour/tour.d.ts +4 -4
  95. package/components/tree/tree.d.ts +1 -1
  96. package/core/icons-phosphor.js +129 -71
  97. package/core/provider.js +84 -23
  98. package/dist/host.min.css +1 -1
  99. package/dist/host.sheet.js +1 -1
  100. package/dist/theme-provider.min.js +1 -1
  101. package/dist/web-components.min.css +1 -1
  102. package/dist/web-components.min.js +89 -87
  103. package/dist/web-components.sheet.js +1 -1
  104. package/package.json +1 -1
  105. package/styles/api/sizing-fallback.css +32 -0
  106. package/styles/api/sizing.css +7 -3
  107. package/styles/components.css +1 -0
  108. 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
  }
@@ -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
@@ -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,7 +46,7 @@
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 - `solid` (default for EVERY variant, including the family-less\n `default`, since gh#794) — saturated bg + on-strong (near-white)\n text. The chip IS the state. A bare `<tag-ui text=\"…\">` renders\n this look with no attributes at all.\n - `muted` — tinted bg with scheme-paired text. Matches <badge-ui>'s\n default look, and is the pre-gh#794 look for the family-less\n `default` variant. Use on metadata / citation chips in dense\n lists or tables where the saturated default would compete for\n attention (gh#778's oversized-pill concern).\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",
@@ -6,15 +6,43 @@ 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 inverse (was `--a-bg-muted` quiet chrome
18
+ pre-#794) — 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"]`. */
22
+ --tag-bg: var(--md-sys-color-neutral-on-surface);
23
+ --tag-fg: var(--md-sys-color-neutral-background);
12
24
  --tag-border: transparent;
13
25
  --tag-radius: var(--a-radius-full);
14
26
  --tag-px: var(--a-space-1-5);
15
- --tag-py: 0.125rem;
27
+ --tag-py: var(--a-space-0-5);
16
28
  --tag-gap: var(--a-space-1);
17
29
  --tag-font: var(--a-ui-sm);
30
+
31
+ /* ── Size tiers (gh#779) — md (above) is the pixel-identical default;
32
+ [size="sm"|"lg"] below re-point the active tokens. Component-owned
33
+ ladder, NOT a direct alias of the universal --a-ui-px/--a-ui-size
34
+ tokens (styles/api/sizing.css) — tag-ui's own md baseline predates
35
+ and differs from that system's md (6px/12px here vs 8px/13px
36
+ there), so aliasing directly would shift every default tag's
37
+ geometry (gh#778 is exactly this failure mode — an inflated
38
+ default). Instead sm/lg step off tag's OWN md baseline by the
39
+ same rung spacing the space/type scales already use. */
40
+ --tag-px-sm: var(--a-space-1);
41
+ --tag-px-lg: var(--a-space-2);
42
+ --tag-py-sm: var(--a-space-px);
43
+ --tag-py-lg: var(--a-space-1);
44
+ --tag-font-sm: var(--a-ui-xs);
45
+ --tag-font-lg: var(--a-ui-md);
18
46
  --tag-font-family: var(--a-font-family-ui);
19
47
  --tag-dismiss-size: 1rem;
20
48
  --tag-bg-hover: var(--a-bg-hover);
@@ -134,12 +162,16 @@ tag-ui[removable]:not([disabled]):hover {
134
162
  --tag-fg: var(--md-sys-color-danger-on-danger);
135
163
  }
136
164
 
137
- /* `default` (no family) stays as quiet chromea 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. */
165
+ /* `default` (no family) is solid by default (gh#794) the same
166
+ high-contrast neutral inverse the family variants already carry.
167
+ A bare `<tag-ui text="">` is now a stamped pill, not quiet chrome.
168
+ Opt OUT to the pre-#794 quiet-chrome look via `[tone="muted"]`
169
+ (below) on metadata/citation chips in dense lists or tables where
170
+ the saturated look competes for attention (gh#778's oversized-pill
171
+ complaint) — same escape hatch the family variants already use. */
140
172
  :scope[variant="default"] {
141
- --tag-bg: var(--a-bg-muted);
142
- --tag-fg: var(--md-sys-color-neutral-on-surface);
173
+ --tag-bg: var(--md-sys-color-neutral-on-surface);
174
+ --tag-fg: var(--md-sys-color-neutral-background);
143
175
  }
144
176
 
145
177
  /* ── Tone modifier — orthogonal to [variant] ──
@@ -170,10 +202,26 @@ tag-ui[removable]:not([disabled]):hover {
170
202
  --tag-bg: var(--md-sys-color-primary-container);
171
203
  --tag-fg: var(--md-sys-color-primary-on-surface);
172
204
  }
205
+ /* gh#794: the pre-#794 quiet-chrome look for the variant-less default —
206
+ same values the `:where(:scope)` base tokens carried before the
207
+ solid-default flip. This is the explicit opt-out for bare tags that
208
+ need the old quiet register (dense-list metadata/citation chips,
209
+ gh#778's oversized-pill concern) instead of the new stamped-pill
210
+ default. `:not([variant=…])` (not `[variant="default"]`) because
211
+ `variant` is a reflect:true prop whose class default ("default")
212
+ never gets a physical attribute reflected on a bare tag (the
213
+ `installProps()` reflect() path only fires on a property SET) —
214
+ the same reason the `[tone="solid"]` fallback below uses this same
215
+ `:not()` shape instead of `[variant="default"]`. */
216
+ :scope[tone="muted"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="accent"]) {
217
+ --tag-bg: var(--a-bg-muted);
218
+ --tag-fg: var(--md-sys-color-neutral-on-surface);
219
+ }
173
220
 
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.
221
+ /* `[tone="solid"]` explicit opt-in redundant with the bare default
222
+ since gh#794 (the variant-less default is solid unconditionally
223
+ above) but kept so `tone="solid"` stays a valid, harmless, explicit
224
+ statement of intent for consumers who set it directly.
177
225
  [variant="accent"] is excluded — it already has an explicit solid
178
226
  pair above (the plain [variant="accent"] rule) that this higher-
179
227
  specificity fallback would otherwise clobber when tone="solid" is
@@ -220,7 +268,24 @@ tag-ui[removable]:not([disabled]):hover {
220
268
  --tag-border: var(--md-sys-color-neutral-outline);
221
269
  }
222
270
 
223
- /* Size handled by universal [size] attribute system. */
271
+ /* ── Size tiers (gh#779) re-point the active tokens to the matching
272
+ tier; the token defaults at :where(:scope) above ARE the md tier, so
273
+ [size="md"] is declared only for explicitness (mirrors kbd.css). */
274
+ :scope[size="sm"] {
275
+ --tag-px: var(--tag-px-sm);
276
+ --tag-py: var(--tag-py-sm);
277
+ --tag-font: var(--tag-font-sm);
278
+ }
279
+ :scope[size="md"] {
280
+ --tag-px: var(--a-space-1-5);
281
+ --tag-py: var(--a-space-0-5);
282
+ --tag-font: var(--a-ui-sm);
283
+ }
284
+ :scope[size="lg"] {
285
+ --tag-px: var(--tag-px-lg);
286
+ --tag-py: var(--tag-py-lg);
287
+ --tag-font: var(--tag-font-lg);
288
+ }
224
289
 
225
290
  /* hover rule moved outside @scope — see Safari 17.x bug note at top. */
226
291
 
@@ -41,26 +41,30 @@ 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.
44
+ - `solid` (default for EVERY variant, including the family-less
45
+ `default`, since gh#794) saturated bg + on-strong (near-white)
46
+ text. The chip IS the state. A bare `<tag-ui text="…">` renders
47
+ this look with no attributes at all.
46
48
  - `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.
49
+ default look, and is the pre-gh#794 look for the family-less
50
+ `default` variant. Use on metadata / citation chips in dense
51
+ lists or tables where the saturated default would compete for
52
+ attention (gh#778's oversized-pill concern).
49
53
  - `outline` — transparent bg + family-colored border + family-colored
50
54
  text. The lightest visual weight; good in dense data tables or
51
55
  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).
56
+ `tone` is a declarative presentational attribute (not a reactive
57
+ prop see tag.class.js) so its schema `default` here is documentation
58
+ of the rendered-by-default look, not a reflected attribute value.
55
59
  */
56
60
  tone: 'solid' | 'muted' | 'outline';
57
61
  /** 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
62
  variant: 'default' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
59
63
 
64
+ addEventListener(type: 'remove', listener: (ev: TagRemoveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
60
65
  addEventListener<K extends keyof HTMLElementEventMap>(
61
66
  type: K,
62
67
  listener: (this: UITag, ev: HTMLElementEventMap[K]) => unknown,
63
68
  options?: boolean | AddEventListenerOptions,
64
69
  ): void;
65
- addEventListener(type: 'remove', listener: (ev: TagRemoveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
66
70
  }
@@ -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
  ```
@@ -62,17 +62,21 @@ props:
62
62
  tone:
63
63
  description: |
64
64
  Fill style — orthogonal to [variant]. Three values:
65
- - `solid` (default for family variants) saturated bg + on-strong
66
- (near-white) text. The chip IS the state.
65
+ - `solid` (default for EVERY variant, including the family-less
66
+ `default`, since gh#794) saturated bg + on-strong (near-white)
67
+ text. The chip IS the state. A bare `<tag-ui text="…">` renders
68
+ this look with no attributes at all.
67
69
  - `muted` — tinted bg with scheme-paired text. Matches <badge-ui>'s
68
- default look. Use on metadata chips in dense lists where the
69
- saturated default would compete for attention.
70
+ default look, and is the pre-gh#794 look for the family-less
71
+ `default` variant. Use on metadata / citation chips in dense
72
+ lists or tables where the saturated default would compete for
73
+ attention (gh#778's oversized-pill concern).
70
74
  - `outline` — transparent bg + family-colored border + family-colored
71
75
  text. The lightest visual weight; good in dense data tables or
72
76
  faceted filter rows where multiple chips would otherwise compete.
73
- The `default` variant (no family) stays quiet chrome regardless of
74
- tone unless `tone="solid"` is set explicitly (high-contrast neutral
75
- inverse), or `tone="outline"` (fg-muted text + subtle border).
77
+ `tone` is a declarative presentational attribute (not a reactive
78
+ prop see tag.class.js) so its schema `default` here is documentation
79
+ of the rendered-by-default look, not a reflected attribute value.
76
80
  type: string
77
81
  default: solid
78
82
  enum:
@@ -127,6 +131,13 @@ a2ui:
127
131
  Group multiple tags inside a <row-ui gap="2"> — never stack them
128
132
  vertically; vertical lists of dismissable items are an
129
133
  <action-list-ui> use case, not <tag-ui>.
134
+ - >-
135
+ Bare <tag-ui text="…"> (no [tone]) renders the high-contrast
136
+ solid pill by default (gh#794). In dense tables, tight metadata
137
+ rows, or citation/footnote strips where many tags sit close
138
+ together, set [tone="muted"] to keep the quieter tinted look
139
+ instead — a wall of solid pills reads as visual noise there
140
+ (gh#778).
130
141
  anti_patterns: []
131
142
  examples:
132
143
  - name: basic-tag
@@ -108,13 +108,13 @@ replaces the rendered chips. Reflection skipped — array values
108
108
  do not round-trip through attribute strings. */
109
109
  value: string;
110
110
 
111
+ addEventListener(type: 'change', listener: (ev: TagsInputChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
112
+ addEventListener(type: 'commit', listener: (ev: TagsInputCommitEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
113
+ addEventListener(type: 'input', listener: (ev: TagsInputInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
114
+ addEventListener(type: 'invalid', listener: (ev: TagsInputInvalidEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
111
115
  addEventListener<K extends keyof HTMLElementEventMap>(
112
116
  type: K,
113
117
  listener: (this: UITagsInput, ev: HTMLElementEventMap[K]) => unknown,
114
118
  options?: boolean | AddEventListenerOptions,
115
119
  ): void;
116
- addEventListener(type: 'change', listener: (ev: TagsInputChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
117
- addEventListener(type: 'commit', listener: (ev: TagsInputCommitEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
118
- addEventListener(type: 'input', listener: (ev: TagsInputInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
119
- addEventListener(type: 'invalid', listener: (ev: TagsInputInvalidEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
120
120
  }
@@ -25,12 +25,12 @@ export class UITimeline extends UIElement {
25
25
  /** Rail size preset — use `sm` for agent-reasoning/pipeline views; `md` is the default. */
26
26
  size: 'sm' | 'md';
27
27
 
28
+ addEventListener(type: 'timeline-toggle', listener: (ev: TimelineToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
28
29
  addEventListener<K extends keyof HTMLElementEventMap>(
29
30
  type: K,
30
31
  listener: (this: UITimeline, ev: HTMLElementEventMap[K]) => unknown,
31
32
  options?: boolean | AddEventListenerOptions,
32
33
  ): void;
33
- addEventListener(type: 'timeline-toggle', listener: (ev: TimelineToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
34
34
  }
35
35
 
36
36
  export class UITimelineItem extends UIElement {
@@ -52,10 +52,10 @@ scans the toc-ui's parent element. Set to `#article` /
52
52
  */
53
53
  target: string;
54
54
 
55
+ addEventListener(type: 'section-change', listener: (ev: TableOfContentsSectionChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
55
56
  addEventListener<K extends keyof HTMLElementEventMap>(
56
57
  type: K,
57
58
  listener: (this: UITableOfContents, ev: HTMLElementEventMap[K]) => unknown,
58
59
  options?: boolean | AddEventListenerOptions,
59
60
  ): void;
60
- addEventListener(type: 'section-change', listener: (ev: TableOfContentsSectionChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
61
61
  }
@@ -25,12 +25,12 @@ export class UIToggleGroup extends UIElement {
25
25
  /** Comma-separated selected values */
26
26
  value: string;
27
27
 
28
+ addEventListener(type: 'change', listener: (ev: ToggleGroupChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
28
29
  addEventListener<K extends keyof HTMLElementEventMap>(
29
30
  type: K,
30
31
  listener: (this: UIToggleGroup, ev: HTMLElementEventMap[K]) => unknown,
31
32
  options?: boolean | AddEventListenerOptions,
32
33
  ): void;
33
- addEventListener(type: 'change', listener: (ev: ToggleGroupChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
34
34
  }
35
35
 
36
36
  export class UIToggleOption extends UIElement {
@@ -49,10 +49,10 @@ export class UIToggleScheme extends UIElement {
49
49
  /** Visual style forwarded to the internal <button-ui>. Defaults to "ghost" (matches app practice). */
50
50
  variant: 'default' | 'solid' | 'outline' | 'ghost' | 'primary' | 'secondary' | 'soft';
51
51
 
52
+ addEventListener(type: 'scheme-change', listener: (ev: ToggleSchemeSchemeChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
52
53
  addEventListener<K extends keyof HTMLElementEventMap>(
53
54
  type: K,
54
55
  listener: (this: UIToggleScheme, ev: HTMLElementEventMap[K]) => unknown,
55
56
  options?: boolean | AddEventListenerOptions,
56
57
  ): void;
57
- addEventListener(type: 'scheme-change', listener: (ev: ToggleSchemeSchemeChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
58
58
  }
@@ -48,15 +48,15 @@ tour to that step (updating spotlight + popover position).
48
48
  */
49
49
  step: number;
50
50
 
51
+ addEventListener(type: 'tour-finish', listener: (ev: TourFinishEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
52
+ addEventListener(type: 'tour-skip', listener: (ev: TourSkipEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
53
+ addEventListener(type: 'tour-start', listener: (ev: TourStartEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
54
+ addEventListener(type: 'tour-step-change', listener: (ev: TourStepChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
51
55
  addEventListener<K extends keyof HTMLElementEventMap>(
52
56
  type: K,
53
57
  listener: (this: UITour, ev: HTMLElementEventMap[K]) => unknown,
54
58
  options?: boolean | AddEventListenerOptions,
55
59
  ): void;
56
- addEventListener(type: 'tour-finish', listener: (ev: TourFinishEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
57
- addEventListener(type: 'tour-skip', listener: (ev: TourSkipEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
58
- addEventListener(type: 'tour-start', listener: (ev: TourStartEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
59
- addEventListener(type: 'tour-step-change', listener: (ev: TourStepChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
60
60
  }
61
61
 
62
62
  export class UITourStep extends UIElement {
@@ -31,12 +31,12 @@ export type TreeSelectEvent = CustomEvent<TreeSelectEventDetail>;
31
31
 
32
32
  export class UITree extends UIElement {
33
33
 
34
+ addEventListener(type: 'tree-select', listener: (ev: TreeSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
34
35
  addEventListener<K extends keyof HTMLElementEventMap>(
35
36
  type: K,
36
37
  listener: (this: UITree, ev: HTMLElementEventMap[K]) => unknown,
37
38
  options?: boolean | AddEventListenerOptions,
38
39
  ): void;
39
- addEventListener(type: 'tree-select', listener: (ev: TreeSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
40
40
  }
41
41
 
42
42
  export class UITreeItem extends UIElement {