@adia-ai/web-components 0.6.21 → 0.6.22

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 (247) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/components/accordion/accordion-item.a2ui.json +20 -3
  3. package/components/accordion/accordion-item.yaml +24 -0
  4. package/components/accordion/accordion.a2ui.json +1 -1
  5. package/components/accordion/accordion.d.ts +8 -1
  6. package/components/accordion/accordion.yaml +15 -2
  7. package/components/action-list/action-item.a2ui.json +19 -3
  8. package/components/action-list/action-item.yaml +24 -0
  9. package/components/action-list/action-list.a2ui.json +12 -2
  10. package/components/action-list/action-list.yaml +13 -3
  11. package/components/agent-artifact/agent-artifact.a2ui.json +9 -2
  12. package/components/agent-artifact/agent-artifact.d.ts +1 -1
  13. package/components/agent-artifact/agent-artifact.yaml +17 -3
  14. package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +9 -2
  15. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +8 -1
  16. package/components/agent-feedback-bar/agent-feedback-bar.yaml +19 -3
  17. package/components/agent-questions/agent-questions.a2ui.json +8 -2
  18. package/components/agent-questions/agent-questions.d.ts +8 -1
  19. package/components/agent-questions/agent-questions.yaml +19 -3
  20. package/components/agent-reasoning/agent-reasoning.yaml +9 -1
  21. package/components/agent-suggestions/agent-suggestions.a2ui.json +9 -2
  22. package/components/agent-suggestions/agent-suggestions.d.ts +7 -1
  23. package/components/agent-suggestions/agent-suggestions.yaml +18 -3
  24. package/components/agent-trace/agent-trace.a2ui.json +9 -2
  25. package/components/agent-trace/agent-trace.d.ts +1 -1
  26. package/components/agent-trace/agent-trace.yaml +16 -3
  27. package/components/alert/alert.a2ui.json +1 -1
  28. package/components/alert/alert.css +8 -0
  29. package/components/alert/alert.d.ts +9 -1
  30. package/components/alert/alert.yaml +16 -2
  31. package/components/aside/aside.a2ui.json +7 -1
  32. package/components/aside/aside.yaml +33 -2
  33. package/components/avatar/avatar-group.a2ui.json +20 -3
  34. package/components/avatar/avatar-group.yaml +24 -0
  35. package/components/avatar/avatar.a2ui.json +1 -1
  36. package/components/avatar/avatar.d.ts +7 -1
  37. package/components/avatar/avatar.yaml +14 -2
  38. package/components/badge/badge.a2ui.json +1 -1
  39. package/components/badge/badge.d.ts +7 -1
  40. package/components/badge/badge.yaml +14 -2
  41. package/components/block/block.a2ui.json +9 -4
  42. package/components/block/block.d.ts +9 -3
  43. package/components/block/block.yaml +25 -5
  44. package/components/block/class.js +23 -0
  45. package/components/breadcrumb/breadcrumb.a2ui.json +5 -1
  46. package/components/breadcrumb/breadcrumb.yaml +33 -2
  47. package/components/button/button.a2ui.json +22 -2
  48. package/components/button/button.yaml +21 -3
  49. package/components/calendar-picker/calendar-picker.a2ui.json +1 -1
  50. package/components/calendar-picker/calendar-picker.yaml +13 -2
  51. package/components/canvas/canvas.a2ui.json +6 -2
  52. package/components/canvas/canvas.yaml +20 -3
  53. package/components/card/card.css +23 -2
  54. package/components/card/card.yaml +12 -0
  55. package/components/chart/chart.css +4 -2
  56. package/components/chart/chart.yaml +9 -1
  57. package/components/chart-legend/chart-legend.yaml +7 -1
  58. package/components/chat-thread/chat-thread.a2ui.json +6 -2
  59. package/components/chat-thread/chat-thread.d.ts +8 -1
  60. package/components/chat-thread/chat-thread.yaml +21 -3
  61. package/components/check/check.a2ui.json +13 -3
  62. package/components/check/check.yaml +18 -3
  63. package/components/code/code.a2ui.json +1 -1
  64. package/components/code/code.yaml +13 -2
  65. package/components/col/class.js +39 -0
  66. package/components/col/col.a2ui.json +12 -5
  67. package/components/col/col.d.ts +12 -4
  68. package/components/col/col.yaml +27 -7
  69. package/components/color-input/color-input.yaml +27 -1
  70. package/components/color-picker/color-picker.a2ui.json +8 -2
  71. package/components/color-picker/color-picker.yaml +15 -3
  72. package/components/command/command.a2ui.json +7 -2
  73. package/components/command/command.d.ts +9 -1
  74. package/components/command/command.yaml +39 -3
  75. package/components/demo-toggle/demo-toggle.yaml +7 -1
  76. package/components/description-list/description-list.a2ui.json +5 -1
  77. package/components/description-list/description-list.yaml +11 -2
  78. package/components/divider/divider.a2ui.json +1 -1
  79. package/components/divider/divider.d.ts +8 -1
  80. package/components/divider/divider.yaml +15 -2
  81. package/components/drawer/drawer.yaml +32 -1
  82. package/components/embed/embed.a2ui.json +1 -1
  83. package/components/embed/embed.d.ts +8 -1
  84. package/components/embed/embed.yaml +17 -2
  85. package/components/empty-state/empty-state.a2ui.json +19 -2
  86. package/components/empty-state/empty-state.css +14 -0
  87. package/components/empty-state/empty-state.d.ts +3 -1
  88. package/components/empty-state/empty-state.yaml +50 -3
  89. package/components/feed/feed-item.a2ui.json +21 -3
  90. package/components/feed/feed-item.yaml +25 -0
  91. package/components/feed/feed.a2ui.json +23 -3
  92. package/components/feed/feed.yaml +26 -0
  93. package/components/fields/fields.yaml +7 -1
  94. package/components/footer/footer.a2ui.json +7 -1
  95. package/components/footer/footer.yaml +27 -2
  96. package/components/grid/class.js +57 -0
  97. package/components/grid/grid.a2ui.json +3 -3
  98. package/components/grid/grid.d.ts +3 -3
  99. package/components/grid/grid.yaml +22 -8
  100. package/components/header/header.a2ui.json +8 -1
  101. package/components/header/header.yaml +30 -2
  102. package/components/heatmap/heatmap.yaml +7 -1
  103. package/components/icon/icon.a2ui.json +9 -2
  104. package/components/icon/icon.d.ts +1 -1
  105. package/components/icon/icon.yaml +32 -3
  106. package/components/image/image.yaml +7 -1
  107. package/components/input/input.yaml +29 -1
  108. package/components/inspector/inspector.a2ui.json +7 -2
  109. package/components/inspector/inspector.d.ts +9 -1
  110. package/components/inspector/inspector.yaml +23 -3
  111. package/components/kbd/kbd.a2ui.json +1 -1
  112. package/components/kbd/kbd.d.ts +1 -1
  113. package/components/kbd/kbd.yaml +11 -2
  114. package/components/list/list-item.a2ui.json +21 -3
  115. package/components/list/list-item.yaml +25 -0
  116. package/components/list/list.a2ui.json +7 -2
  117. package/components/list/list.d.ts +9 -1
  118. package/components/list/list.yaml +21 -3
  119. package/components/menu/menu-divider.a2ui.json +17 -3
  120. package/components/menu/menu-divider.yaml +35 -0
  121. package/components/menu/menu-item.a2ui.json +19 -3
  122. package/components/menu/menu-item.yaml +42 -0
  123. package/components/menu/menu.a2ui.json +7 -1
  124. package/components/menu/menu.yaml +33 -2
  125. package/components/modal/modal.a2ui.json +7 -2
  126. package/components/modal/modal.d.ts +10 -1
  127. package/components/modal/modal.yaml +48 -3
  128. package/components/nav/nav.a2ui.json +16 -2
  129. package/components/nav/nav.yaml +40 -3
  130. package/components/nav-group/nav-group.a2ui.json +12 -2
  131. package/components/nav-group/nav-group.yaml +37 -3
  132. package/components/nav-item/nav-item.a2ui.json +13 -2
  133. package/components/nav-item/nav-item.yaml +40 -3
  134. package/components/noodles/noodles.a2ui.json +12 -2
  135. package/components/noodles/noodles.yaml +14 -3
  136. package/components/option-card/option-card.yaml +27 -1
  137. package/components/otp-input/otp-input.yaml +24 -1
  138. package/components/page/page.a2ui.json +7 -1
  139. package/components/page/page.yaml +9 -2
  140. package/components/pagination/pagination.a2ui.json +1 -1
  141. package/components/pagination/pagination.d.ts +1 -1
  142. package/components/pagination/pagination.yaml +13 -2
  143. package/components/pane/pane.a2ui.json +1 -1
  144. package/components/pane/pane.d.ts +7 -1
  145. package/components/pane/pane.yaml +33 -2
  146. package/components/pipeline-status/pipeline-status.a2ui.json +6 -2
  147. package/components/pipeline-status/pipeline-status.d.ts +1 -1
  148. package/components/pipeline-status/pipeline-status.yaml +18 -3
  149. package/components/popover/popover.yaml +30 -1
  150. package/components/progress/progress.a2ui.json +1 -1
  151. package/components/progress/progress.d.ts +1 -1
  152. package/components/progress/progress.yaml +13 -2
  153. package/components/progress-row/progress-row.a2ui.json +12 -2
  154. package/components/progress-row/progress-row.yaml +13 -3
  155. package/components/radio/radio.a2ui.json +1 -1
  156. package/components/radio/radio.yaml +9 -1
  157. package/components/range/range.yaml +7 -1
  158. package/components/rating/rating.a2ui.json +4 -1
  159. package/components/rating/rating.yaml +10 -2
  160. package/components/richtext/richtext.a2ui.json +6 -2
  161. package/components/richtext/richtext.d.ts +9 -1
  162. package/components/richtext/richtext.yaml +20 -3
  163. package/components/row/class.js +34 -0
  164. package/components/row/row.a2ui.json +11 -5
  165. package/components/row/row.d.ts +11 -4
  166. package/components/row/row.yaml +25 -7
  167. package/components/search/search.a2ui.json +5 -1
  168. package/components/search/search.yaml +11 -2
  169. package/components/section/section.a2ui.json +7 -1
  170. package/components/section/section.yaml +36 -2
  171. package/components/segment/segment.a2ui.json +8 -2
  172. package/components/segment/segment.d.ts +7 -1
  173. package/components/segment/segment.yaml +16 -3
  174. package/components/segmented/segmented.a2ui.json +6 -1
  175. package/components/segmented/segmented.css +5 -0
  176. package/components/segmented/segmented.yaml +12 -2
  177. package/components/select/select.a2ui.json +1 -1
  178. package/components/select/select.yaml +34 -2
  179. package/components/skeleton/skeleton.a2ui.json +7 -2
  180. package/components/skeleton/skeleton.d.ts +1 -1
  181. package/components/skeleton/skeleton.yaml +17 -3
  182. package/components/slider/slider.yaml +7 -1
  183. package/components/stack/stack.a2ui.json +14 -3
  184. package/components/stack/stack.d.ts +9 -1
  185. package/components/stack/stack.yaml +22 -4
  186. package/components/stat/stat.a2ui.json +6 -2
  187. package/components/stat/stat.css +5 -2
  188. package/components/stat/stat.d.ts +1 -1
  189. package/components/stat/stat.yaml +16 -3
  190. package/components/step-progress/step-progress.yaml +7 -1
  191. package/components/stepper/stepper-item.a2ui.json +20 -3
  192. package/components/stepper/stepper-item.yaml +24 -0
  193. package/components/stepper/stepper.a2ui.json +1 -1
  194. package/components/stepper/stepper.d.ts +1 -1
  195. package/components/stepper/stepper.yaml +13 -2
  196. package/components/stream/stream.a2ui.json +12 -2
  197. package/components/stream/stream.yaml +15 -3
  198. package/components/swatch/swatch.yaml +7 -1
  199. package/components/swiper/swiper.yaml +7 -1
  200. package/components/switch/switch.a2ui.json +6 -2
  201. package/components/switch/switch.yaml +16 -2
  202. package/components/table/cell-types.js +23 -10
  203. package/components/table/class.js +6 -2
  204. package/components/table/table.css +49 -1
  205. package/components/table/table.yaml +27 -1
  206. package/components/table-toolbar/table-toolbar.yaml +27 -1
  207. package/components/tabs/tab.a2ui.json +17 -3
  208. package/components/tabs/tab.yaml +39 -0
  209. package/components/tabs/tabs.a2ui.json +1 -1
  210. package/components/tabs/tabs.d.ts +1 -1
  211. package/components/tabs/tabs.yaml +36 -2
  212. package/components/tag/tag.a2ui.json +6 -2
  213. package/components/tag/tag.d.ts +9 -1
  214. package/components/tag/tag.yaml +38 -3
  215. package/components/text/class.js +13 -0
  216. package/components/text/text.a2ui.json +9 -2
  217. package/components/text/text.d.ts +1 -1
  218. package/components/text/text.yaml +12 -5
  219. package/components/textarea/textarea.a2ui.json +15 -3
  220. package/components/textarea/textarea.yaml +41 -4
  221. package/components/timeline/timeline-item.a2ui.json +20 -3
  222. package/components/timeline/timeline-item.yaml +24 -0
  223. package/components/timeline/timeline.a2ui.json +8 -1
  224. package/components/timeline/timeline.yaml +9 -2
  225. package/components/toast/toast.a2ui.json +6 -2
  226. package/components/toast/toast.yaml +19 -3
  227. package/components/toggle-group/toggle-group.a2ui.json +13 -3
  228. package/components/toggle-group/toggle-group.d.ts +1 -1
  229. package/components/toggle-group/toggle-group.yaml +19 -4
  230. package/components/toggle-group/toggle-option.a2ui.json +18 -3
  231. package/components/toggle-group/toggle-option.yaml +23 -0
  232. package/components/toggle-scheme/toggle-scheme.yaml +4 -0
  233. package/components/toolbar/toolbar-group.a2ui.json +18 -3
  234. package/components/toolbar/toolbar-group.yaml +23 -0
  235. package/components/toolbar/toolbar.yaml +7 -1
  236. package/components/tooltip/tooltip.yaml +24 -1
  237. package/components/tree/tree-item.a2ui.json +19 -3
  238. package/components/tree/tree-item.yaml +42 -0
  239. package/components/tree/tree.a2ui.json +6 -1
  240. package/components/tree/tree.yaml +31 -2
  241. package/components/upload/upload.yaml +7 -1
  242. package/core/index.js +1 -0
  243. package/core/responsive.d.ts +29 -0
  244. package/core/responsive.js +120 -0
  245. package/core/responsive.test.js +121 -0
  246. package/package.json +1 -1
  247. package/styles/tokens.css +6 -6
@@ -2,7 +2,7 @@
2
2
  :where(:scope) {
3
3
  /* ── Tokens ── */
4
4
  --table-font-size: var(--a-ui-size);
5
- --table-heading-size: var(--a-ui-sm);
5
+ --table-heading-size: var(--a-ui-xs);
6
6
  --table-heading-weight: var(--a-weight-medium);
7
7
  --table-heading-tracking: 0.06em;
8
8
  --table-heading-fg: var(--a-fg-muted);
@@ -165,6 +165,19 @@
165
165
  letter-spacing: var(--table-heading-tracking);
166
166
  white-space: nowrap;
167
167
  position: relative;
168
+ display: flex;
169
+ align-items: center;
170
+ }
171
+
172
+ /* Label span truncates; sort icon + filter button remain visible.
173
+ Cannot put overflow:hidden on the columnheader itself — it would
174
+ clip the position:absolute filter dropdown. */
175
+ [role="columnheader"] > span {
176
+ flex: 1;
177
+ min-width: 0;
178
+ overflow: hidden;
179
+ text-overflow: ellipsis;
180
+ white-space: nowrap;
168
181
  }
169
182
 
170
183
  /* ═══════ Sortable headers ═══════ */
@@ -226,6 +239,31 @@
226
239
  text-overflow: ellipsis;
227
240
  }
228
241
 
242
+ /* text-overflow on a flex container doesn't reach text nodes (anonymous
243
+ flex items). Built-in cell types now wrap text in <span>; link type
244
+ creates <a>; avatar/progress composite types use row-ui > span. */
245
+ [data-body] [role="gridcell"] > span,
246
+ [data-body] [role="gridcell"] > a {
247
+ min-width: 0;
248
+ flex: 1;
249
+ overflow: hidden;
250
+ text-overflow: ellipsis;
251
+ white-space: nowrap;
252
+ }
253
+
254
+ [data-body] [role="gridcell"] > row-ui {
255
+ min-width: 0;
256
+ overflow: hidden;
257
+ }
258
+
259
+ [data-body] [role="gridcell"] > row-ui > span {
260
+ flex: 1;
261
+ min-width: 0;
262
+ overflow: hidden;
263
+ text-overflow: ellipsis;
264
+ white-space: nowrap;
265
+ }
266
+
229
267
  /* Wrap opt-in: per-table (all body cells) or per-cell (one column).
230
268
  Restores the legacy `overflow-wrap: anywhere` behavior so wrapped
231
269
  content can break inside long unbroken tokens (URLs, IDs). Row
@@ -238,6 +276,16 @@
238
276
  overflow-wrap: anywhere;
239
277
  }
240
278
 
279
+ :scope[wrap] [data-body] [role="gridcell"] > span,
280
+ :scope[wrap] [data-body] [role="gridcell"] > a,
281
+ [data-body] [role="gridcell"][data-wrap] > span,
282
+ [data-body] [role="gridcell"][data-wrap] > a {
283
+ white-space: normal;
284
+ overflow: visible;
285
+ text-overflow: clip;
286
+ overflow-wrap: anywhere;
287
+ }
288
+
241
289
  [data-align="right"] {
242
290
  text-align: right;
243
291
  justify-content: flex-end;
@@ -229,7 +229,33 @@ requiredIcons:
229
229
  - funnel-simple
230
230
  - funnel-simple-fill
231
231
  a2ui:
232
- rules: []
232
+ rules:
233
+ - >-
234
+ Canonical composition: wrap <table-ui> in <card-ui><section bleed>
235
+ for edge-to-edge tables. The [bleed] removes section padding so
236
+ columns span the full card width (see apps/saas/members,
237
+ billing, admin-dashboard).
238
+ - >-
239
+ Pair with <table-toolbar-ui for="<table-id>"> for any table that
240
+ needs search / filter / sort / columns visibility. Do NOT
241
+ re-implement those affordances in the card header — the toolbar
242
+ auto-wires search/filter/sort/columns changes into the bound
243
+ table.
244
+ - >-
245
+ Cells truncate single-line by default (v0.6.21 §403
246
+ truncate-default). Opt out per-table with [wrap] for whole-table
247
+ multiline, or per-cell with [data-wrap] on a single column /
248
+ cell.
249
+ - >-
250
+ Use [raw] in production app consumers — it disables the demo
251
+ seed data so the table renders only consumer-provided rows /
252
+ columns / data props.
253
+ - >-
254
+ Listen for the `sort` event with detail.key + detail.dir (NOT
255
+ .column / .direction). `cell-click` detail carries {key, row,
256
+ value, dataIndex}. Per ADR-0027, table-ui composes check-ui,
257
+ icon-ui, progress-ui, pagination-ui, skeleton-ui, badge-ui —
258
+ consumer pages must explicitly import the ones they use.
233
259
  anti_patterns: []
234
260
  examples:
235
261
  - name: api-key-table
@@ -118,7 +118,33 @@ requiredIcons:
118
118
  - arrow-down
119
119
  - caret-up-down
120
120
  a2ui:
121
- rules: []
121
+ rules:
122
+ - >-
123
+ Pair <table-toolbar-ui> with <table-ui> via [for="<table-id>"]
124
+ (or rely on first-sibling fallback when both are inside the
125
+ same parent). One toolbar per table. Do NOT also use
126
+ <card-ui>'s <header> on the same card — that produces a doubled
127
+ chrome row.
128
+ - >-
129
+ All four affordances (search, filter, sort, columns) default ON.
130
+ Opt out individually via [no-search] / [no-filter] / [no-sort]
131
+ / [no-columns]. The previous [searchable] / [filterable]
132
+ attributes are deprecated — do NOT emit them.
133
+ - >-
134
+ Place the toolbar ABOVE the <card-ui> containing the table-ui,
135
+ or use [variant="card"] when standing alone outside a card-ui
136
+ parent (the variant wraps the toolbar in card-style chrome).
137
+ - >-
138
+ Use slot="action" (or [slot="actions"]) for trailing primary
139
+ buttons (Invite, Export, +New). Use [text] / [count] props for
140
+ the left cluster, or slotted [slot="title"] / [slot="count"]
141
+ when content is markup (a <span> + <badge-ui>, etc.).
142
+ - >-
143
+ Listen for toolbar events (`search`, `filter-change`,
144
+ `sort-change`, `columns-change`) only to mirror state to URL /
145
+ persistence / analytics. The toolbar already wires its changes
146
+ into the bound table — you don't need to manually update the
147
+ table.
122
148
  anti_patterns: []
123
149
  examples:
124
150
  - name: members-toolbar
@@ -44,12 +44,26 @@
44
44
  "composes": [],
45
45
  "events": {},
46
46
  "examples": [],
47
- "keywords": [],
47
+ "keywords": [
48
+ "tab",
49
+ "tab-panel",
50
+ "view-switcher-child",
51
+ "tabs-child"
52
+ ],
48
53
  "name": "UITab",
49
- "related": [],
54
+ "related": [
55
+ "Tabs",
56
+ "Nav",
57
+ "Segmented"
58
+ ],
50
59
  "slots": {},
51
60
  "states": [],
52
- "synonyms": {},
61
+ "synonyms": {
62
+ "tab": [
63
+ "view-tab",
64
+ "switcher-tab"
65
+ ]
66
+ },
53
67
  "tag": "tab-ui",
54
68
  "tokens": {},
55
69
  "traits": [],
@@ -31,3 +31,42 @@ props:
31
31
  description: Whether the tab is selectable.
32
32
  type: boolean
33
33
  default: false
34
+
35
+ a2ui:
36
+ rules:
37
+ - >-
38
+ <tab-ui> only renders inside <tabs-ui>. Never use it standalone.
39
+ The parent reads each tab's [text] + [icon] + [value] to render
40
+ the button strip; the tab's default slot is the panel content
41
+ that the parent auto-hides when inactive.
42
+ - >-
43
+ [value] is required and must be unique among siblings — the
44
+ parent <tabs-ui> matches its own [value] against each
45
+ <tab-ui>[value] to decide which is active. [text] is the visible
46
+ button label; optional [icon] is a Phosphor icon name shown
47
+ leading the label.
48
+ - >-
49
+ Use the default slot for panel content. Inactive <tab-ui>
50
+ children are auto-hidden by the parent's [hidden] toggling; do
51
+ NOT set [hidden] yourself unless you want to remove the button
52
+ from the strip entirely (i.e. a temporarily-disabled tab whose
53
+ strip button shouldn't render at all).
54
+ - >-
55
+ Use [disabled] to keep a tab visible in the strip but
56
+ non-selectable. Do not pair <tab-ui> with <button-ui> wrappers —
57
+ the strip button is parent-rendered. Do not nest <tab-ui> inside
58
+ another <tab-ui>.
59
+
60
+ keywords:
61
+ - tab
62
+ - tab-panel
63
+ - view-switcher-child
64
+ - tabs-child
65
+
66
+ related:
67
+ - Tabs
68
+ - Nav
69
+ - Segmented
70
+
71
+ synonyms:
72
+ tab: [view-tab, switcher-tab]
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/Tabs.json",
4
4
  "title": "Tabs",
5
- "description": "Tabbed panel switcher. Renders button strip from child tab-ui elements.",
5
+ "description": "Tabbed panel switcher. Renders a button strip from child <tab-ui> elements and toggles their associated panel via the active attribute. Use for switching between equivalent peer views in one region; for navigation between routes use <nav-ui> instead.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `<tabs-ui>` — Tabbed panel switcher. Renders button strip from child tab-ui elements.
2
+ * `<tabs-ui>` — Tabbed panel switcher. Renders a button strip from child <tab-ui> elements and toggles their associated panel via the active attribute. Use for switching between equivalent peer views in one region; for navigation between routes use <nav-ui> instead.
3
3
  *
4
4
  * @see https://ui-kit.exe.xyz/site/components/tabs
5
5
  *
@@ -6,7 +6,11 @@ tag: tabs-ui
6
6
  component: Tabs
7
7
  category: container
8
8
  version: 1
9
- description: Tabbed panel switcher. Renders button strip from child tab-ui elements.
9
+ description: >-
10
+ Tabbed panel switcher. Renders a button strip from child <tab-ui>
11
+ elements and toggles their associated panel via the active attribute.
12
+ Use for switching between equivalent peer views in one region; for
13
+ navigation between routes use <nav-ui> instead.
10
14
  # Per ADR-0027 — primitives that programmatically create other primitives
11
15
  # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
12
16
  composes:
@@ -76,7 +80,37 @@ tokens:
76
80
  --tabs-radius:
77
81
  description: Override base border radius
78
82
  a2ui:
79
- rules: []
83
+ rules:
84
+ - >-
85
+ Decision rule: use <tabs-ui> when switching VIEWS within the same
86
+ logical page (no route change, no URL change). For navigating
87
+ AWAY (different page / route / anchor), use <nav-ui> instead. For
88
+ a form-control segmented selector that returns a value, use
89
+ <segmented-ui>.
90
+ - >-
91
+ Children of <tabs-ui> MUST be <tab-ui> elements. The button strip
92
+ is rendered from each child's [text] + optional [icon]; the
93
+ parent auto-toggles [hidden] on inactive <tab-ui> children. Do
94
+ not place arbitrary markup directly inside <tabs-ui> — wrap it
95
+ in <tab-ui>.
96
+ - >-
97
+ Canonical placements: inside <card-ui>'s <header> for in-card
98
+ section switching; inside <editor-canvas-toolbar> for editor
99
+ sub-views (see the editor sub-views recipe in patterns-recipes.md);
100
+ or standalone as an in-page switcher. When standalone, wire
101
+ sibling <div data-view="…"> panels via the `change` event
102
+ (detail.value); for tabs whose content lives inside the <tab-ui>
103
+ child, the auto-hide handles visibility.
104
+ - >-
105
+ Set [value] to the initially active tab. If omitted, the first
106
+ non-disabled <tab-ui> becomes active on connect. Set
107
+ [orientation="vertical"] for left-rail tab strips.
108
+ - >-
109
+ Variant caveat: only [variant="bordered"] is implemented (adds a
110
+ subtle divider). [variant="underline"] is widely used in source
111
+ but is equivalent to default (no-op). [variant="pills"] and
112
+ [variant="segmented"] are declared in the enum but NOT styled —
113
+ do NOT emit them; for a form-style selector use <segmented-ui>.
80
114
  anti_patterns: []
81
115
  examples:
82
116
  - name: tabs-panels
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/Tag.json",
4
4
  "title": "Tag",
5
- "description": "Inline tag/chip with optional dismiss button.",
5
+ "description": "Inline INTERACTIVE chip / pill with optional dismiss affordance.\nText rendered via CSS `attr(text)`. Use for filter chips\n(removable=true + `remove` event), autocomplete tokens, and\nuser-managed labels. Distinct from <badge-ui>, which is READ-ONLY\nand includes the [status] shorthand for Beta / New / Deprecated\nmarkers — badge-ui has no remove event. For navigation grouping\nuse <nav-group-ui>; for inline command actions use\n<action-list-ui>.\n",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -97,7 +97,11 @@
97
97
  "pill"
98
98
  ],
99
99
  "name": "UITag",
100
- "related": [],
100
+ "related": [
101
+ "Badge",
102
+ "NavGroup",
103
+ "ActionList"
104
+ ],
101
105
  "slots": {},
102
106
  "states": [
103
107
  {
@@ -1,5 +1,13 @@
1
1
  /**
2
- * `<tag-ui>` — Inline tag/chip with optional dismiss button.
2
+ * `<tag-ui>` — Inline INTERACTIVE chip / pill with optional dismiss affordance.
3
+ Text rendered via CSS `attr(text)`. Use for filter chips
4
+ (removable=true + `remove` event), autocomplete tokens, and
5
+ user-managed labels. Distinct from <badge-ui>, which is READ-ONLY
6
+ and includes the [status] shorthand for Beta / New / Deprecated
7
+ markers — badge-ui has no remove event. For navigation grouping
8
+ use <nav-group-ui>; for inline command actions use
9
+ <action-list-ui>.
10
+
3
11
  *
4
12
  * @see https://ui-kit.exe.xyz/site/components/tag
5
13
  *
@@ -6,7 +6,15 @@ tag: tag-ui
6
6
  component: Tag
7
7
  category: display
8
8
  version: 1
9
- description: Inline tag/chip with optional dismiss button.
9
+ description: |
10
+ Inline INTERACTIVE chip / pill with optional dismiss affordance.
11
+ Text rendered via CSS `attr(text)`. Use for filter chips
12
+ (removable=true + `remove` event), autocomplete tokens, and
13
+ user-managed labels. Distinct from <badge-ui>, which is READ-ONLY
14
+ and includes the [status] shorthand for Beta / New / Deprecated
15
+ markers — badge-ui has no remove event. For navigation grouping
16
+ use <nav-group-ui>; for inline command actions use
17
+ <action-list-ui>.
10
18
  props:
11
19
  disabled:
12
20
  description: Disables interaction and dims the tag.
@@ -64,7 +72,31 @@ tokens: {}
64
72
  requiredIcons:
65
73
  - x
66
74
  a2ui:
67
- rules: []
75
+ rules:
76
+ - >-
77
+ Use <tag-ui> for INTERACTIVE / DISMISSABLE labels — filter chips,
78
+ autocomplete tokens, user-managed labels. Tag-ui fires a `remove`
79
+ event when [removable] is set. For READ-ONLY status flags
80
+ (counts, Beta / New / Deprecated markers, notification dots) use
81
+ <badge-ui> instead — badge has no remove event and includes the
82
+ [status] shorthand.
83
+ - >-
84
+ Set [removable] and listen for the `remove` event (detail:
85
+ {text, value}) when the tag represents a user-applied filter or
86
+ selection that can be cleared.
87
+ - >-
88
+ [variant] maps to semantic state of the underlying record:
89
+ success = active / approved, warning = pending,
90
+ danger = blocked / error, info = neutral-emphasis. Default
91
+ (no variant) for unlabeled categories.
92
+ - >-
93
+ Use [size="sm"] for inline-with-text contexts (doc page headers,
94
+ table cells, badges next to titles); [size="md"] (default) for
95
+ filter-bar chips and standalone tag rows.
96
+ - >-
97
+ Group multiple tags inside a <row-ui gap="2"> — never stack them
98
+ vertically; vertical lists of dismissable items are an
99
+ <action-list-ui> use case, not <tag-ui>.
68
100
  anti_patterns: []
69
101
  examples:
70
102
  - name: basic-tag
@@ -131,4 +163,7 @@ synonyms:
131
163
  pill:
132
164
  - badge
133
165
  - tag
134
- related: []
166
+ related:
167
+ - Badge
168
+ - NavGroup
169
+ - ActionList
@@ -25,6 +25,10 @@
25
25
  */
26
26
 
27
27
  import { UIElement } from '../../core/element.js';
28
+ import { parseResponsive, breakpoint } from '../../core/responsive.js';
29
+
30
+ const _SIZE = { sm: 'var(--a-body-sm)', md: 'var(--a-body-md)', lg: 'var(--a-body-lg)' };
31
+ function _sizeToCss(v) { return _SIZE[v] ?? v; }
28
32
 
29
33
  export class UIText extends UIElement {
30
34
  static properties = {
@@ -52,5 +56,14 @@ export class UIText extends UIElement {
52
56
  } else {
53
57
  this.style.removeProperty('--_text-lines');
54
58
  }
59
+
60
+ // Responsive size — e.g. size="sm sm@md lg@lg"
61
+ const size = this.size;
62
+ if (size?.includes('@')) {
63
+ const bp = breakpoint.value; // subscribe only when needed
64
+ this.style.setProperty('--text-size', _sizeToCss(parseResponsive(size, bp)));
65
+ } else {
66
+ this.style.removeProperty('--text-size');
67
+ }
55
68
  }
56
69
  }
@@ -36,7 +36,7 @@
36
36
  "default": 0
37
37
  },
38
38
  "size": {
39
- "description": "Override the variant's font-size on the body ladder. Maps to --a-body-sm / --a-body-md / --a-body-lg. Permissive: unknown values are no-ops (variant size wins). Added v0.6.18 (FB-10).",
39
+ "description": "Override the variant's font-size on the body ladder (sm/md/lg --a-body-sm/md/lg). Accepts `@bp` notation: size=\"sm md@lg\" = sm below lg, md from lg up. Added v0.6.18 (FB-10).",
40
40
  "type": "string",
41
41
  "enum": [
42
42
  "sm",
@@ -154,7 +154,14 @@
154
154
  "name": "idle"
155
155
  }
156
156
  ],
157
- "synonyms": {},
157
+ "synonyms": {
158
+ "text": [
159
+ "typography",
160
+ "prose",
161
+ "label-text",
162
+ "paragraph"
163
+ ]
164
+ },
158
165
  "tag": "text-ui",
159
166
  "tokens": {},
160
167
  "traits": [],
@@ -43,7 +43,7 @@ export class UIText extends UIElement {
43
43
  color: 'default' | 'subtle' | 'strong' | 'accent' | 'danger' | 'success' | 'warning';
44
44
  /** Multi-line clamp count (0 = no clamp) */
45
45
  lines: number;
46
- /** Override the variant's font-size on the body ladder. Maps to --a-body-sm / --a-body-md / --a-body-lg. Permissive: unknown values are no-ops (variant size wins). Added v0.6.18 (FB-10). */
46
+ /** Override the variant's font-size on the body ladder (sm/md/lg --a-body-sm/md/lg). Accepts `@bp` notation: size="sm md@lg" = sm below lg, md from lg up. Added v0.6.18 (FB-10). */
47
47
  size: 'sm' | 'md' | 'lg';
48
48
  /** When true, applies stronger emphasis (heavier weight + accent color). Styled via :scope[strong] in text.css. Use instead of variant=heading when you want a single emphasized word inline in body copy. */
49
49
  strong: boolean;
@@ -22,9 +22,9 @@ props:
22
22
  default: 0
23
23
  size:
24
24
  description: >-
25
- Override the variant's font-size on the body ladder. Maps to
26
- --a-body-sm / --a-body-md / --a-body-lg. Permissive: unknown values
27
- are no-ops (variant size wins). Added v0.6.18 (FB-10).
25
+ Override the variant's font-size on the body ladder (sm/md/lg → --a-body-sm/md/lg).
26
+ Accepts `@bp` notation: size="sm md@lg" = sm below lg, md from lg up.
27
+ Added v0.6.18 (FB-10).
28
28
  type: string
29
29
  enum: ["sm", "md", "lg"]
30
30
  default: ""
@@ -112,7 +112,13 @@ states:
112
112
  traits: []
113
113
  tokens: {}
114
114
  a2ui:
115
- rules: []
115
+ rules:
116
+ - rule: 'Use for typographic content with semantic role (heading, body, label, caption). Variant attribute sets the role.'
117
+ reason: 'Token-driven font/size/weight per variant — better than raw <p>/<h*> with overrides.'
118
+ - rule: 'For inline-flow rich content with multiple paragraphs, use <richtext-ui> instead.'
119
+ reason: 'Richtext handles paragraph rhythm + rich formatting.'
120
+ - rule: 'Heading variants (h1, h2, ...) are not auto-tagged — set the role explicitly via variant.'
121
+ reason: 'Visual variant decoupled from DOM tag.'
116
122
  anti_patterns: []
117
123
  examples:
118
124
  - name: chat-interface
@@ -414,7 +420,8 @@ examples:
414
420
  ]
415
421
  keywords:
416
422
  - text
417
- synonyms: {}
423
+ synonyms:
424
+ text: [typography, prose, label-text, paragraph]
418
425
  related:
419
426
  - avatar
420
427
  - input
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/Textarea.json",
4
4
  "title": "Textarea",
5
- "description": "Multiline text input. The host IS the interactive surface.",
5
+ "description": "Multi-line text input primitive — the host IS the contenteditable\nsurface (per ADR-0025, no native <textarea> wrapped underneath).\nForm-bearing via UIFormElement: [name], [value], [required],\n[disabled], [readonly], fires `change` on blur and `input` per\nkeystroke. Enter inserts a newline — does NOT fire `submit` (for\nEnter-to-send composers use <chat-input-ui submit-on-enter> inside\n<chat-composer>). Wrap in <field-ui label=\"…\"> for the canonical\nlabeled stack.\n",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -110,7 +110,12 @@
110
110
  "textarea"
111
111
  ],
112
112
  "name": "UITextarea",
113
- "related": [],
113
+ "related": [
114
+ "Input",
115
+ "Field",
116
+ "ChatInput",
117
+ "Code"
118
+ ],
114
119
  "slots": {},
115
120
  "states": [
116
121
  {
@@ -118,7 +123,14 @@
118
123
  "name": "idle"
119
124
  }
120
125
  ],
121
- "synonyms": {},
126
+ "synonyms": {
127
+ "textarea": [
128
+ "multiline-input",
129
+ "text-area",
130
+ "comment-input",
131
+ "long-text-input"
132
+ ]
133
+ },
122
134
  "tag": "textarea-ui",
123
135
  "tokens": {},
124
136
  "traits": [],
@@ -6,7 +6,15 @@ tag: textarea-ui
6
6
  component: Textarea
7
7
  category: layout
8
8
  version: 1
9
- description: Multiline text input. The host IS the interactive surface.
9
+ description: |
10
+ Multi-line text input primitive — the host IS the contenteditable
11
+ surface (per ADR-0025, no native <textarea> wrapped underneath).
12
+ Form-bearing via UIFormElement: [name], [value], [required],
13
+ [disabled], [readonly], fires `change` on blur and `input` per
14
+ keystroke. Enter inserts a newline — does NOT fire `submit` (for
15
+ Enter-to-send composers use <chat-input-ui submit-on-enter> inside
16
+ <chat-composer>). Wrap in <field-ui label="…"> for the canonical
17
+ labeled stack.
10
18
  props:
11
19
  disabled:
12
20
  description: Disables interaction, removes contenteditable, and dims the control. Inherited from UIFormElement.
@@ -86,7 +94,31 @@ states:
86
94
  traits: []
87
95
  tokens: {}
88
96
  a2ui:
89
- rules: []
97
+ rules:
98
+ - >-
99
+ <textarea-ui> is the canonical multi-line text input. The host
100
+ IS the contenteditable surface — NEVER use a native <textarea>
101
+ (banned by ADR-0025).
102
+ - >-
103
+ Wrap <textarea-ui> in <field-ui label="…" hint="…" error="…"> for
104
+ the canonical labeled stack. The inline [label] / [hint] /
105
+ [error] props are also supported on the primitive for compact
106
+ use.
107
+ - >-
108
+ Form participation is implicit via UIFormElement. Set [name] for
109
+ FormData submission; [required] / [disabled] / [readonly]
110
+ reflect; listen for `change` (on blur after value change) and
111
+ `input` (per keystroke).
112
+ - >-
113
+ Use [rows] to set initial height (default 3) and [resize]
114
+ (vertical | horizontal | both | none; default vertical) to
115
+ control user resize. Never substitute a native <textarea> just
116
+ to get rows / resize.
117
+ - >-
118
+ Enter inserts a newline — <textarea-ui> does NOT emit a `submit`
119
+ event. For Enter-to-send multi-line composers, use
120
+ <chat-input-ui submit-on-enter> inside <chat-composer>, not
121
+ textarea-ui.
90
122
  anti_patterns: []
91
123
  examples:
92
124
  - name: basic-textarea
@@ -116,5 +148,10 @@ examples:
116
148
  ]
117
149
  keywords:
118
150
  - textarea
119
- synonyms: {}
120
- related: []
151
+ synonyms:
152
+ textarea: [multiline-input, text-area, comment-input, long-text-input]
153
+ related:
154
+ - Input
155
+ - Field
156
+ - ChatInput
157
+ - Code
@@ -62,12 +62,29 @@
62
62
  "composes": [],
63
63
  "events": {},
64
64
  "examples": [],
65
- "keywords": [],
65
+ "keywords": [
66
+ "timeline-item",
67
+ "timeline-row",
68
+ "activity-entry",
69
+ "event-entry",
70
+ "history-row"
71
+ ],
66
72
  "name": "UITimelineItem",
67
- "related": [],
73
+ "related": [
74
+ "Timeline",
75
+ "FeedItem",
76
+ "Stepper"
77
+ ],
68
78
  "slots": {},
69
79
  "states": [],
70
- "synonyms": {},
80
+ "synonyms": {
81
+ "timeline-item": [
82
+ "timeline-row",
83
+ "activity-row",
84
+ "event-row",
85
+ "history-entry"
86
+ ]
87
+ },
71
88
  "tag": "timeline-item-ui",
72
89
  "tokens": {},
73
90
  "traits": [],
@@ -45,3 +45,27 @@ props:
45
45
  description: Show a spinner instead of the icon while status=pending.
46
46
  type: boolean
47
47
  default: false
48
+
49
+ keywords:
50
+ - timeline-item
51
+ - timeline-row
52
+ - activity-entry
53
+ - event-entry
54
+ - history-row
55
+
56
+ synonyms:
57
+ timeline-item: [timeline-row, activity-row, event-row, history-entry]
58
+
59
+ related:
60
+ - Timeline
61
+ - FeedItem
62
+ - Stepper
63
+
64
+ a2ui:
65
+ rules:
66
+ - rule: 'Child of <timeline-ui> — one chronological event with timestamp + content + optional icon dot.'
67
+ reason: 'Timeline cluster contract.'
68
+ - rule: 'Different from <stepper-item-ui> (process steps with completion state) — timeline-item is event history.'
69
+ reason: 'Process vs history.'
70
+ - rule: 'Order is DOM-order — no auto-sort by timestamp.'
71
+ reason: 'Author-controlled order.'
@@ -81,7 +81,14 @@
81
81
  "name": "idle"
82
82
  }
83
83
  ],
84
- "synonyms": {},
84
+ "synonyms": {
85
+ "timeline": [
86
+ "activity-log",
87
+ "event-log",
88
+ "history",
89
+ "audit-trail"
90
+ ]
91
+ },
85
92
  "tag": "timeline-ui",
86
93
  "tokens": {},
87
94
  "traits": [],