@adia-ai/web-components 0.6.21 → 0.6.23

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 (248) hide show
  1. package/CHANGELOG.md +72 -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 +50 -0
  164. package/components/row/row.a2ui.json +17 -6
  165. package/components/row/row.d.ts +14 -5
  166. package/components/row/row.yaml +36 -8
  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
  248. package/styles/typography.css +1 -0
@@ -68,16 +68,34 @@
68
68
  }
69
69
  },
70
70
  "examples": [],
71
- "keywords": [],
71
+ "keywords": [
72
+ "feed-item",
73
+ "notification",
74
+ "toast-row",
75
+ "alert-row",
76
+ "feed-entry",
77
+ "notification-card"
78
+ ],
72
79
  "name": "UIFeedItem",
73
- "related": [],
80
+ "related": [
81
+ "Feed",
82
+ "Toast",
83
+ "Alert"
84
+ ],
74
85
  "slots": {
75
86
  "body": {
76
87
  "description": "Default content slot (also accepts the `text` / `heading` props)"
77
88
  }
78
89
  },
79
90
  "states": {},
80
- "synonyms": {},
91
+ "synonyms": {
92
+ "feed-item": [
93
+ "notification-row",
94
+ "toast-entry",
95
+ "feed-row",
96
+ "alert-item"
97
+ ]
98
+ },
81
99
  "tag": "feed-item-ui",
82
100
  "tokens": {},
83
101
  "traits": [],
@@ -48,3 +48,28 @@ slots:
48
48
  body:
49
49
  description: Default content slot (also accepts the `text` / `heading` props)
50
50
  states: {}
51
+
52
+ keywords:
53
+ - feed-item
54
+ - notification
55
+ - toast-row
56
+ - alert-row
57
+ - feed-entry
58
+ - notification-card
59
+
60
+ synonyms:
61
+ feed-item: [notification-row, toast-entry, feed-row, alert-item]
62
+
63
+ related:
64
+ - Feed
65
+ - Toast
66
+ - Alert
67
+
68
+ a2ui:
69
+ rules:
70
+ - rule: 'One notification entry inside <feed-ui>. Title + description + optional icon + auto-dismiss timer.'
71
+ reason: 'Feed-channel item primitive.'
72
+ - rule: 'Typically created programmatically via UIFeed.post(...); do not place declaratively.'
73
+ reason: 'Imperative ownership.'
74
+ - rule: 'Different from <alert-ui> (inline persistent) and <toast-ui> (standalone ephemeral); feed-item is feed-scoped.'
75
+ reason: 'Surface boundary.'
@@ -53,12 +53,32 @@
53
53
  }
54
54
  },
55
55
  "examples": [],
56
- "keywords": [],
56
+ "keywords": [
57
+ "feed",
58
+ "notification-feed",
59
+ "activity-stream",
60
+ "toast-stack",
61
+ "alert-stack",
62
+ "snackbar-stack",
63
+ "notification-channel"
64
+ ],
57
65
  "name": "UIFeedContainer",
58
- "related": [],
66
+ "related": [
67
+ "FeedItem",
68
+ "Toast",
69
+ "Alert"
70
+ ],
59
71
  "slots": {},
60
72
  "states": {},
61
- "synonyms": {},
73
+ "synonyms": {
74
+ "feed": [
75
+ "notification-feed",
76
+ "toast-feed",
77
+ "alert-feed",
78
+ "activity-feed",
79
+ "snackbar-stack"
80
+ ]
81
+ },
62
82
  "tag": "feed-ui",
63
83
  "tokens": {},
64
84
  "traits": [],
@@ -38,3 +38,29 @@ events:
38
38
  description: Fired on per-item dismissal (manual close, swipe, or auto-timeout). Bubbles.
39
39
  slots: {}
40
40
  states: {}
41
+
42
+ keywords:
43
+ - feed
44
+ - notification-feed
45
+ - activity-stream
46
+ - toast-stack
47
+ - alert-stack
48
+ - snackbar-stack
49
+ - notification-channel
50
+
51
+ synonyms:
52
+ feed: [notification-feed, toast-feed, alert-feed, activity-feed, snackbar-stack]
53
+
54
+ related:
55
+ - FeedItem
56
+ - Toast
57
+ - Alert
58
+
59
+ a2ui:
60
+ rules:
61
+ - rule: 'Top-layer notification feed channel — singleton per position (top-right, bottom-center, etc.) mounted lazily into document.body.'
62
+ reason: 'Per docs/specs/feed-channel.md.'
63
+ - rule: 'Hosts <feed-item-ui> children programmatically via static API (UIFeed.post(...)). Do not place feed-items declaratively.'
64
+ reason: 'Imperative API ownership.'
65
+ - rule: 'For inline persistent alerts inside content regions use <alert-ui> instead; feed is ephemeral overlay.'
66
+ reason: 'Surface boundary.'
@@ -54,7 +54,13 @@ tokens:
54
54
  --fields-column-gap:
55
55
  description: Override the column-gap independently of row-gap.
56
56
  a2ui:
57
- rules: []
57
+ rules:
58
+ - rule: 'Container for form rows. Hosts <field-ui> children (or <row-ui>/<col-ui> with labeled inputs) with consistent label + control + help layout.'
59
+ reason: 'Form-row layout primitive.'
60
+ - rule: 'Different from <description-list-ui> (read-only key:value display) — fields-ui is for editable inputs.'
61
+ reason: 'Read vs write distinction.'
62
+ - rule: 'For dynamic field arrays (repeat-able rows) compose fields-ui with manual add/remove controls.'
63
+ reason: 'No built-in repeat affordance.'
58
64
  anti_patterns:
59
65
  - description: >-
60
66
  Don't wrap <field-ui> children in <row-ui wrap> when grid
@@ -71,7 +71,13 @@
71
71
  "name": "idle"
72
72
  }
73
73
  ],
74
- "synonyms": {},
74
+ "synonyms": {
75
+ "footer": [
76
+ "footer-bar",
77
+ "footer-row",
78
+ "bottom-bar"
79
+ ]
80
+ },
75
81
  "tag": "footer-ui",
76
82
  "tokens": {},
77
83
  "traits": [],
@@ -27,7 +27,31 @@ states:
27
27
  traits: []
28
28
  tokens: {}
29
29
  a2ui:
30
- rules: []
30
+ rules:
31
+ - >-
32
+ Use <footer-ui> as the bottom chrome row inside a PRIMITIVE
33
+ container parent (<card-ui>, <drawer-ui>, <modal-ui>, <page-ui>).
34
+ Typically holds 1–3 <button-ui> children — the most common pattern
35
+ is a Cancel / Confirm pair inside <modal-ui> or <drawer-ui>.
36
+ - >-
37
+ Use `justify="end"` (default) for Cancel+Confirm and trailing
38
+ action clusters; `justify="between"` when one action lives left
39
+ and one right (e.g. Back / Submit); `justify="center"` for
40
+ single-button confirm flows; `justify="start"` for solo leading
41
+ actions like Back.
42
+ - >-
43
+ Do NOT substitute <footer-ui> for bespoke shell-tier bottom
44
+ chrome. Inside <admin-sidebar slot="footer"> use <admin-statusbar>;
45
+ inside <editor-shell> use <editor-statusbar>. <footer-ui> is
46
+ exclusively the in-container action bar at the primitive tier.
47
+ - >-
48
+ Do NOT wrap children in <row-ui> just to align them — the
49
+ `justify` prop already lays children out horizontally. A nested
50
+ row-ui double-applies layout and breaks the chrome's gap tokens.
51
+ - >-
52
+ Prefer flat <button-ui> children. If you need non-button content
53
+ (text summary, pagination indicator), keep it as a single flat
54
+ child so `justify` resolves cleanly.
31
55
  anti_patterns: []
32
56
  examples:
33
57
  - name: chat-interface
@@ -230,7 +254,8 @@ examples:
230
254
  ]
231
255
  keywords:
232
256
  - footer
233
- synonyms: {}
257
+ synonyms:
258
+ footer: [footer-bar, footer-row, bottom-bar]
234
259
  related:
235
260
  - avatar
236
261
  - input
@@ -19,6 +19,7 @@
19
19
  */
20
20
 
21
21
  import { UIElement } from '../../core/element.js';
22
+ import { parseResponsive, breakpoint } from '../../core/responsive.js';
22
23
 
23
24
  export class UIGrid extends UIElement {
24
25
  static properties = {
@@ -28,4 +29,60 @@ export class UIGrid extends UIElement {
28
29
  rowGap: { type: String, default: '', reflect: true, attribute: 'row-gap' },
29
30
  };
30
31
  static template = () => null;
32
+
33
+ render() {
34
+ // Reading breakpoint.value inside render() subscribes this component to
35
+ // the signal — UIElement re-runs render() whenever the viewport crosses
36
+ // a breakpoint boundary (and also on prop changes as normal).
37
+ const bp = breakpoint.value;
38
+
39
+ // ── columns ──────────────────────────────────────────────────────────────
40
+ // Responsive value: JS resolves + writes inline gridTemplateColumns.
41
+ // Also forces gridAutoFlow:row + gridAutoColumns:auto, overriding the
42
+ // default CSS which has grid-auto-flow:column (single-row spread) — that
43
+ // default only makes sense when NO explicit template is set.
44
+ // Scalar value: clear inline styles, CSS [columns="N"] rules take over.
45
+ const cols = this.columns;
46
+ if (cols?.includes('@')) {
47
+ const resolved = parseResponsive(cols, bp);
48
+ this.style.gridTemplateColumns = this.#colsToTemplate(resolved);
49
+ this.style.gridAutoFlow = resolved ? 'row' : '';
50
+ this.style.gridAutoColumns = resolved ? 'auto' : '';
51
+ } else {
52
+ this.style.gridTemplateColumns = '';
53
+ this.style.gridAutoFlow = '';
54
+ this.style.gridAutoColumns = '';
55
+ }
56
+
57
+ // ── gap ───────────────────────────────────────────────────────────────────
58
+ // Same pattern: responsive values set inline column/row-gap directly;
59
+ // scalar values clear those and let the universal [gap="N"] token rules
60
+ // in tokens.css handle everything via --a-gap.
61
+ const gap = this.gap;
62
+ if (gap?.includes('@')) {
63
+ const v = parseResponsive(gap, bp);
64
+ const css = this.#gapToCss(v);
65
+ this.style.columnGap = css;
66
+ this.style.rowGap = css;
67
+ } else {
68
+ this.style.columnGap = '';
69
+ this.style.rowGap = '';
70
+ }
71
+ }
72
+
73
+ /** Map a resolved columns value to a CSS grid-template-columns string. */
74
+ #colsToTemplate(v) {
75
+ if (!v) return '';
76
+ if (/^\d+$/.test(v)) return `repeat(${v}, 1fr)`;
77
+ if (v === 'auto-fill') return 'repeat(auto-fill, minmax(12rem, 1fr))';
78
+ if (v === 'auto-fit') return 'repeat(auto-fit, minmax(12rem, 1fr))';
79
+ return v; // passthrough for custom template expressions
80
+ }
81
+
82
+ /** Map a resolved gap value to a CSS length / custom-property reference. */
83
+ #gapToCss(v) {
84
+ if (!v || v === '0') return '0';
85
+ if (/^\d+$/.test(v)) return `var(--a-space-${v})`;
86
+ return `var(--a-gap-${v})`;
87
+ }
31
88
  }
@@ -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/Grid.json",
4
4
  "title": "Grid",
5
- "description": "CSS grid layout primitive. Supports [columns=\"1..6\"] for equal columns, [columns=\"auto-fill\"|\"auto-fit\"] for responsive density, and a per-child [span=\"2..6\"|\"full\"] attribute for asymmetric layouts. Compose a 2:1 split as columns=\"3\" + the wide child span=\"2\"; compose a 3:2 split as columns=\"5\" + span=\"3\" + span=\"2\". Never set grid-template-columns via inline style — use the span attribute on children instead.",
5
+ "description": "CSS grid layout primitive. Supports [columns=\"1..6\"] for equal columns, [columns=\"auto-fill\"|\"auto-fit\"] for responsive density, and a per-child [span=\"2..6\"|\"full\"] attribute for asymmetric layouts. Both [columns] and [gap] accept responsive `@bp` notation for viewport-driven layout: columns=\"1 2@sm 4@lg\" gives 1 column on xs, 2 from sm, 4 from lg/xl. Compose a 2:1 split as columns=\"3\" + span=\"2\"; 3:2 as columns=\"5\" + span=\"3\" + span=\"2\".",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -19,7 +19,7 @@
19
19
  "default": ""
20
20
  },
21
21
  "columns": {
22
- "description": "Number of columns or grid-template-columns",
22
+ "description": "Number of equal columns (1–6), \"auto-fill\", or \"auto-fit\". Accepts responsive `@bp` notation: \"1 2@sm 4@lg\" = 1 on xs, 2 from sm, 4 from lg/xl. Unannotated value is the mobile-first base.",
23
23
  "type": "string",
24
24
  "default": "3"
25
25
  },
@@ -27,7 +27,7 @@
27
27
  "const": "Grid"
28
28
  },
29
29
  "gap": {
30
- "description": "Grid gap",
30
+ "description": "Grid gap. Accepts numeric space-scale values (0–12) or named sizes (xs/sm/md/lg/xl). Responsive notation supported: \"2 4@md\" = 2 below md, 4 from md upward.",
31
31
  "type": "string",
32
32
  "default": "md"
33
33
  },
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `<grid-ui>` — CSS grid layout primitive. Supports [columns="1..6"] for equal columns, [columns="auto-fill"|"auto-fit"] for responsive density, and a per-child [span="2..6"|"full"] attribute for asymmetric layouts. Compose a 2:1 split as columns="3" + the wide child span="2"; compose a 3:2 split as columns="5" + span="3" + span="2". Never set grid-template-columns via inline style — use the span attribute on children instead.
2
+ * `<grid-ui>` — CSS grid layout primitive. Supports [columns="1..6"] for equal columns, [columns="auto-fill"|"auto-fit"] for responsive density, and a per-child [span="2..6"|"full"] attribute for asymmetric layouts. Both [columns] and [gap] accept responsive `@bp` notation for viewport-driven layout: columns="1 2@sm 4@lg" gives 1 column on xs, 2 from sm, 4 from lg/xl. Compose a 2:1 split as columns="3" + span="2"; 3:2 as columns="5" + span="3" + span="2".
3
3
  *
4
4
  * @see https://ui-kit.exe.xyz/site/components/grid
5
5
  *
@@ -15,9 +15,9 @@ import { UIElement } from '../../core/element.js';
15
15
  export class UIGrid extends UIElement {
16
16
  /** Column gap override */
17
17
  columnGap: string;
18
- /** Number of columns or grid-template-columns */
18
+ /** Number of equal columns (1–6), "auto-fill", or "auto-fit". Accepts responsive `@bp` notation: "1 2@sm 4@lg" = 1 on xs, 2 from sm, 4 from lg/xl. Unannotated value is the mobile-first base. */
19
19
  columns: string;
20
- /** Grid gap */
20
+ /** Grid gap. Accepts numeric space-scale values (0–12) or named sizes (xs/sm/md/lg/xl). Responsive notation supported: "2 4@md" = 2 below md, 4 from md upward. */
21
21
  gap: string;
22
22
  /** Row gap override */
23
23
  rowGap: string;
@@ -9,10 +9,11 @@ version: 1
9
9
  description: >-
10
10
  CSS grid layout primitive. Supports [columns="1..6"] for equal columns,
11
11
  [columns="auto-fill"|"auto-fit"] for responsive density, and a per-child
12
- [span="2..6"|"full"] attribute for asymmetric layouts. Compose a 2:1 split as
13
- columns="3" + the wide child span="2"; compose a 3:2 split as columns="5" +
14
- span="3" + span="2". Never set grid-template-columns via inline style use the
15
- span attribute on children instead.
12
+ [span="2..6"|"full"] attribute for asymmetric layouts. Both [columns] and
13
+ [gap] accept responsive `@bp` notation for viewport-driven layout:
14
+ columns="1 2@sm 4@lg" gives 1 column on xs, 2 from sm, 4 from lg/xl.
15
+ Compose a 2:1 split as columns="3" + span="2"; 3:2 as columns="5" +
16
+ span="3" + span="2".
16
17
  props:
17
18
  columnGap:
18
19
  description: Column gap override
@@ -20,11 +21,17 @@ props:
20
21
  default: ""
21
22
  attribute: column-gap
22
23
  columns:
23
- description: Number of columns or grid-template-columns
24
+ description: >-
25
+ Number of equal columns (1–6), "auto-fill", or "auto-fit". Accepts
26
+ responsive `@bp` notation: "1 2@sm 4@lg" = 1 on xs, 2 from sm, 4
27
+ from lg/xl. Unannotated value is the mobile-first base.
24
28
  type: string
25
29
  default: "3"
26
30
  gap:
27
- description: Grid gap
31
+ description: >-
32
+ Grid gap. Accepts numeric space-scale values (0–12) or named sizes
33
+ (xs/sm/md/lg/xl). Responsive notation supported: "2 4@md" = 2 below
34
+ md, 4 from md upward.
28
35
  type: string
29
36
  default: md
30
37
  rowGap:
@@ -45,8 +52,9 @@ a2ui:
45
52
  rules:
46
53
  - >-
47
54
  For asymmetric column ratios, use [columns="N"] plus [span="M"] on the child
48
- that should be wider. Never set grid-template-columns via style — it bypasses
49
- the component API and reads as a local hack.
55
+ that should be wider. Never set gridTemplateColumns via inline style in
56
+ compositions — the component's responsive resolver sets it internally for
57
+ @bp values; direct inline style bypasses that and reads as a local hack.
50
58
  - >-
51
59
  Canonical ratios: 1:1 → columns="2"; 2:1 → columns="3" + span="2";
52
60
  3:1 → columns="4" + span="3"; 3:2 → columns="5" + span="3"+"2";
@@ -55,6 +63,12 @@ a2ui:
55
63
  The default (no columns attribute) gives equal auto-columns flowing in a
56
64
  single row. Prefer the explicit numeric attribute for dashboard rows so the
57
65
  layout is predictable when items wrap.
66
+ - >-
67
+ For viewport-responsive layouts use `@bp` notation on [columns] and [gap]:
68
+ columns="1 2@sm 4@lg" gives 1 column on xs, 2 from sm, 4 from lg/xl.
69
+ Breakpoints (mobile-first, min-width): xs=0, sm=480, md=768, lg=1024,
70
+ xl=1280. Unannotated value = base (smallest). Each @bp overrides upward
71
+ until the next larger annotation takes over.
58
72
  anti_patterns: []
59
73
  examples:
60
74
  - name: chart-dashboard
@@ -68,7 +68,14 @@
68
68
  "name": "idle"
69
69
  }
70
70
  ],
71
- "synonyms": {},
71
+ "synonyms": {
72
+ "header": [
73
+ "header-bar",
74
+ "header-row",
75
+ "top-bar",
76
+ "chrome-top"
77
+ ]
78
+ },
72
79
  "tag": "header-ui",
73
80
  "tokens": {},
74
81
  "traits": [],
@@ -25,7 +25,34 @@ states:
25
25
  traits: []
26
26
  tokens: {}
27
27
  a2ui:
28
- rules: []
28
+ rules:
29
+ - >-
30
+ Use <header-ui> as the top chrome row inside a PRIMITIVE container
31
+ parent: <card-ui>, <drawer-ui>, <modal-ui>, <page-ui>. It is a
32
+ CSS-only slot stub — no JS, no events. The parent's @scope rules
33
+ drive layout and styling.
34
+ - >-
35
+ Compose with the default slot for the heading (typically
36
+ <text-ui variant="title">) and slot="action" for trailing controls
37
+ (button-ui, badge-ui). The slot vocabulary (icon / heading /
38
+ description / action) is shared with <aside-ui> / <section-ui> /
39
+ <footer-ui> per ADR-0009.
40
+ - >-
41
+ Do NOT substitute <header-ui> for bespoke shell-tier chrome.
42
+ Inside <admin-content> / <admin-sidebar> use <admin-topbar>;
43
+ inside <chat-shell> use <chat-header>; inside <editor-shell> use
44
+ <editor-toolbar>. Those modules carry shell-specific slot
45
+ vocabulary and CSS that <header-ui> does not. (admin-topbar.yaml
46
+ codifies this explicitly.)
47
+ - >-
48
+ Do NOT wrap header-ui's children in <col-ui> or <row-ui>. The
49
+ container parent's @scope already lays out
50
+ default+icon+heading+description+action via slot vocabulary; extra
51
+ layout primitives fight the chrome styling.
52
+ - >-
53
+ The `padding` attribute is a bare boolean — it enables default
54
+ header padding, but the *scale* is set by the container parent's
55
+ own `padding` prop. Do not pass numeric values.
29
56
  anti_patterns: []
30
57
  examples:
31
58
  - name: chat-interface
@@ -327,7 +354,8 @@ examples:
327
354
  ]
328
355
  keywords:
329
356
  - header
330
- synonyms: {}
357
+ synonyms:
358
+ header: [header-bar, header-row, top-bar, chrome-top]
331
359
  related:
332
360
  - avatar
333
361
  - input
@@ -89,7 +89,13 @@ states:
89
89
  traits: []
90
90
  tokens: {}
91
91
  a2ui:
92
- rules: []
92
+ rules:
93
+ - rule: 'Grid-cell heatmap visualization (calendar heatmap, density grid). Cells colored by value via OKLCH scale.'
94
+ reason: 'Data-density visualization.'
95
+ - rule: 'For continuous time-series use <chart-ui> with appropriate variant; heatmap is for grid-cell density.'
96
+ reason: 'Chart vs heatmap boundary.'
97
+ - rule: 'Tooltip on hover shows cell value; click events emit cell coordinates.'
98
+ reason: 'Interaction contract.'
93
99
  anti_patterns: []
94
100
  examples:
95
101
  - name: basic-heatmap
@@ -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/Icon.json",
4
4
  "title": "Icon",
5
- "description": "SVG icon from the icon registry. Renders inline SVG from getIcon().",
5
+ "description": "SVG icon from the icon registry. Renders inline SVG from getIcon() lookups with size + color token support; the canonical icon primitive throughout AdiaUI. Use for all icon needs; do not embed raw SVG or image-based icons in composed components.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -84,7 +84,14 @@
84
84
  "name": "idle"
85
85
  }
86
86
  ],
87
- "synonyms": {},
87
+ "synonyms": {
88
+ "icon": [
89
+ "glyph",
90
+ "phosphor-icon",
91
+ "ui-icon",
92
+ "symbol"
93
+ ]
94
+ },
88
95
  "tag": "icon-ui",
89
96
  "tokens": {},
90
97
  "traits": [],
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `<icon-ui>` — SVG icon from the icon registry. Renders inline SVG from getIcon().
2
+ * `<icon-ui>` — SVG icon from the icon registry. Renders inline SVG from getIcon() lookups with size + color token support; the canonical icon primitive throughout AdiaUI. Use for all icon needs; do not embed raw SVG or image-based icons in composed components.
3
3
  *
4
4
  * @see https://ui-kit.exe.xyz/site/components/icon
5
5
  *
@@ -6,7 +6,11 @@ tag: icon-ui
6
6
  component: Icon
7
7
  category: display
8
8
  version: 1
9
- description: SVG icon from the icon registry. Renders inline SVG from getIcon().
9
+ description: >-
10
+ SVG icon from the icon registry. Renders inline SVG from getIcon()
11
+ lookups with size + color token support; the canonical icon primitive
12
+ throughout AdiaUI. Use for all icon needs; do not embed raw SVG or
13
+ image-based icons in composed components.
10
14
  props:
11
15
  name:
12
16
  description: Icon name from registry
@@ -40,7 +44,31 @@ states:
40
44
  traits: []
41
45
  tokens: {}
42
46
  a2ui:
43
- rules: []
47
+ rules:
48
+ - >-
49
+ [name] must be a registered Phosphor key (e.g. "house", "gear",
50
+ "trash", "warning-circle"). Free-form names render empty. When
51
+ unsure, default to a semantically obvious glyph (check, x,
52
+ warning-circle, info).
53
+ - >-
54
+ Set [label] when the icon is the ONLY content of an interactive
55
+ control (icon-only button); omit [label] when icon is decorative
56
+ beside a text label. The host stamps role="img" + aria-label
57
+ when [label] is set.
58
+ - >-
59
+ Use named [size] tokens (sm | md | lg | xl) — px / rem values
60
+ only when matching a strict design spec. [size="xl"] is
61
+ conventional for empty-state hero icons; [size="md"] is the
62
+ default for inline use.
63
+ - >-
64
+ Use slot="icon" on parent primitives (<button-ui>, <badge-ui>,
65
+ <alert-ui>, <list-item-ui>, <input-ui>, <nav-item-ui>, every
66
+ chrome bar) — do NOT bare-render <icon-ui> beside text in a
67
+ <row-ui> when the parent supports the [slot="icon"] convention.
68
+ - >-
69
+ Use [weight="fill"] for selected / active toggles,
70
+ [weight="regular"] (default) for inactive. Do not mix weights
71
+ in the same set; the visual inconsistency reads as a bug.
44
72
  anti_patterns: []
45
73
  examples:
46
74
  - name: command-palette
@@ -234,7 +262,8 @@ examples:
234
262
  ]
235
263
  keywords:
236
264
  - icon
237
- synonyms: {}
265
+ synonyms:
266
+ icon: [glyph, phosphor-icon, ui-icon, symbol]
238
267
  related:
239
268
  - input
240
269
  - empty-state
@@ -70,7 +70,13 @@ states:
70
70
  traits: []
71
71
  tokens: {}
72
72
  a2ui:
73
- rules: []
73
+ rules:
74
+ - rule: 'Use for content images (illustrations, screenshots, user-uploaded photos). For icons use <icon-ui>; for embedded artifacts use <embed-ui>.'
75
+ reason: 'Icon is registry-driven; embed is iframe-style; image is plain src.'
76
+ - rule: 'Set aspect-ratio attribute to lock dimensions and prevent layout shift during load.'
77
+ reason: 'CLS prevention; canonical perf knob.'
78
+ - rule: 'For decorative-only images, set alt='''' and aria-hidden=''true'' so screen readers skip them.'
79
+ reason: 'Accessibility — decorative vs informative distinction.'
74
80
  anti_patterns: []
75
81
  examples:
76
82
  - name: bleed-design-settings
@@ -236,7 +236,35 @@ tokens:
236
236
  --input-transition:
237
237
  description: Override transition timing
238
238
  a2ui:
239
- rules: []
239
+ rules:
240
+ - >-
241
+ <input-ui> is the canonical single-line text input. The host IS
242
+ the contenteditable surface — NEVER wrap a native <input>. The
243
+ sole exception is type="password", which internally uses a real
244
+ <input type="password"> for masking (per ADR-0025).
245
+ - >-
246
+ Wrap <input-ui> in <field-ui label="…" hint="…" error="…"> for
247
+ the canonical stacked label / hint / error chrome. The inline
248
+ [label] / [hint] / [error] props are also supported on the
249
+ primitive for compact use.
250
+ - >-
251
+ Form participation is implicit via UIFormElement. Set [name] for
252
+ FormData submission; [required] / [disabled] / [readonly]
253
+ reflect; listen for `change` (blur or Enter commit) and `input`
254
+ (per keystroke). `submit` event fires when Enter commits the
255
+ value (used by <chat-composer>'s `composer-submit` forwarding).
256
+ - >-
257
+ For numeric input use [type="number"] with [min] [max] [step]
258
+ [precision] [prefix] / [suffix] — this stamps a contenteditable
259
+ surface + <button-ui> / <icon-ui> stepper column with ARIA
260
+ spinbutton semantics. Read `el.valueAsNumber` for the parsed
261
+ Number. Never substitute a native <input type="number">.
262
+ - >-
263
+ Inside <chat-composer>, the canonical inner input is
264
+ <chat-input-ui submit-on-enter> (chat variant subclass — owns
265
+ the submit-on-enter contract explicitly). The plain <input-ui>
266
+ primitive already fires `submit` on Enter, but only chat-input-ui
267
+ reflects the [submit-on-enter] attribute.
240
268
  anti_patterns: []
241
269
  examples:
242
270
  - name: quantity-stepper
@@ -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/Inspector.json",
4
4
  "title": "Inspector",
5
- "description": "Developer tools pane for inspecting A2UI state.",
5
+ "description": "Developer-tools pane for inspecting A2UI runtime state — composes\n<tabs-ui> + <code-ui> to show the live document JSON, rendered\nHTML, and event log for the bound <canvas-ui> / <a2ui-root>. The\nright-pane inspector of the a2ui-editor app. Use inside an\n<editor-sidebar slot=\"trailing\"> for debugging A2UI playgrounds;\nnot for end-user inspector panes (build those bespoke with\n<field-ui> + form rows per the editor-inspector-pane recipe in\npatterns-recipes.md).\n",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -46,7 +46,12 @@
46
46
  "inspector"
47
47
  ],
48
48
  "name": "UIInspector",
49
- "related": [],
49
+ "related": [
50
+ "A2uiRoot",
51
+ "EditorSidebar",
52
+ "Code",
53
+ "Tabs"
54
+ ],
50
55
  "slots": {
51
56
  "default": {
52
57
  "description": "Default slot — primary child content."
@@ -1,5 +1,13 @@
1
1
  /**
2
- * `<inspector-ui>` — Developer tools pane for inspecting A2UI state.
2
+ * `<inspector-ui>` — Developer-tools pane for inspecting A2UI runtime state — composes
3
+ <tabs-ui> + <code-ui> to show the live document JSON, rendered
4
+ HTML, and event log for the bound <canvas-ui> / <a2ui-root>. The
5
+ right-pane inspector of the a2ui-editor app. Use inside an
6
+ <editor-sidebar slot="trailing"> for debugging A2UI playgrounds;
7
+ not for end-user inspector panes (build those bespoke with
8
+ <field-ui> + form rows per the editor-inspector-pane recipe in
9
+ patterns-recipes.md).
10
+
3
11
  *
4
12
  * @see https://ui-kit.exe.xyz/site/components/inspector
5
13
  *