@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
@@ -4,7 +4,10 @@ tag: kbd-ui
4
4
  component: Kbd
5
5
  category: display
6
6
  version: 1
7
- description: Keyboard key cap. Purely decorative, content from innerHTML.
7
+ description: >-
8
+ Keyboard key cap. Purely decorative, content from innerHTML — typically
9
+ a single key or short chord like "⌘K" or "Ctrl+Shift+P". Use inline in
10
+ menu items, tooltips, command hints, and shortcut documentation.
8
11
  props:
9
12
  size:
10
13
  description: Sizing scale (compact tier — sm / md only).
@@ -24,7 +27,13 @@ states:
24
27
  traits: []
25
28
  tokens: {}
26
29
  a2ui:
27
- rules: []
30
+ rules:
31
+ - rule: 'Inline-only — content from innerHTML, typically one or two key labels.'
32
+ reason: 'Decorative; do not place block content inside.'
33
+ - rule: 'In menu items, use the kbd= attribute on <menu-item-ui> instead of nesting <kbd-ui> directly.'
34
+ reason: 'Menu-item has positioning logic for shortcut hints.'
35
+ - rule: 'Chord notation uses + between keys (Ctrl+Shift+P); platform-symbol variants ⌘⌥⇧ are fine.'
36
+ reason: 'Convention for cross-platform docs.'
28
37
  anti_patterns: []
29
38
  examples:
30
39
  - name: kbd-shortcuts
@@ -39,12 +39,30 @@
39
39
  "composes": [],
40
40
  "events": {},
41
41
  "examples": [],
42
- "keywords": [],
42
+ "keywords": [
43
+ "list-item",
44
+ "list-row",
45
+ "list-entry",
46
+ "item-row",
47
+ "row"
48
+ ],
43
49
  "name": "UIListItem",
44
- "related": [],
50
+ "related": [
51
+ "List",
52
+ "NavItem",
53
+ "MenuItem",
54
+ "TreeItem"
55
+ ],
45
56
  "slots": {},
46
57
  "states": [],
47
- "synonyms": {},
58
+ "synonyms": {
59
+ "list-item": [
60
+ "row",
61
+ "entry",
62
+ "list-row",
63
+ "item"
64
+ ]
65
+ },
48
66
  "tag": "list-item-ui",
49
67
  "tokens": {},
50
68
  "traits": [],
@@ -27,3 +27,28 @@ props:
27
27
  description:
28
28
  description: Secondary line below the primary text. Subtle color.
29
29
  type: string
30
+
31
+ keywords:
32
+ - list-item
33
+ - list-row
34
+ - list-entry
35
+ - item-row
36
+ - row
37
+
38
+ synonyms:
39
+ list-item: [row, entry, list-row, item]
40
+
41
+ related:
42
+ - List
43
+ - NavItem
44
+ - MenuItem
45
+ - TreeItem
46
+
47
+ a2ui:
48
+ rules:
49
+ - rule: 'Child of <list-ui> — one row of generic-list content.'
50
+ reason: 'Cluster contract.'
51
+ - rule: 'For navigation lists use <nav-item-ui> inside <nav-ui>; for menu items use <menu-item-ui>; for tree rows use <tree-item-ui>.'
52
+ reason: 'Per-context list-row primitives — list-item is generic.'
53
+ - rule: 'Interactive list-items should have role=''button'' or be wrapped in <button-ui>; default is non-interactive.'
54
+ reason: 'Accessibility — semantic clarity.'
@@ -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/List.json",
4
4
  "title": "List",
5
- "description": "Styled list with optional icons and dividers.",
5
+ "description": "Styled flat list with optional row dividers and icons — each row\nis a <list-item-ui> child. Selectable mode via [selectable] +\n[selectedKey] / `select` event. Composes <icon-ui> for row leading\nglyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),\n<tree-ui> (hierarchical with arbitrary nesting), and <table-ui>\n(tabular data with columns). Use list-ui for non-navigable,\nnon-tabular vertical rows — comment lists, file lists, message\nstreams outside chat-shell.\n",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -79,7 +79,12 @@
79
79
  "star"
80
80
  ],
81
81
  "name": "UIList",
82
- "related": [],
82
+ "related": [
83
+ "ListItem",
84
+ "Tree",
85
+ "Nav",
86
+ "Table"
87
+ ],
83
88
  "slots": {},
84
89
  "states": [
85
90
  {
@@ -1,5 +1,13 @@
1
1
  /**
2
- * `<list-ui>` — Styled list with optional icons and dividers.
2
+ * `<list-ui>` — Styled flat list with optional row dividers and icons — each row
3
+ is a <list-item-ui> child. Selectable mode via [selectable] +
4
+ [selectedKey] / `select` event. Composes <icon-ui> for row leading
5
+ glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),
6
+ <tree-ui> (hierarchical with arbitrary nesting), and <table-ui>
7
+ (tabular data with columns). Use list-ui for non-navigable,
8
+ non-tabular vertical rows — comment lists, file lists, message
9
+ streams outside chat-shell.
10
+
3
11
  *
4
12
  * @see https://ui-kit.exe.xyz/site/components/list
5
13
  *
@@ -6,7 +6,15 @@ tag: list-ui
6
6
  component: List
7
7
  category: layout
8
8
  version: 1
9
- description: Styled list with optional icons and dividers.
9
+ description: |
10
+ Styled flat list with optional row dividers and icons — each row
11
+ is a <list-item-ui> child. Selectable mode via [selectable] +
12
+ [selectedKey] / `select` event. Composes <icon-ui> for row leading
13
+ glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),
14
+ <tree-ui> (hierarchical with arbitrary nesting), and <table-ui>
15
+ (tabular data with columns). Use list-ui for non-navigable,
16
+ non-tabular vertical rows — comment lists, file lists, message
17
+ streams outside chat-shell.
10
18
  # Per ADR-0027 — primitives that programmatically create other primitives
11
19
  # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
12
20
  composes:
@@ -46,7 +54,13 @@ states:
46
54
  traits: []
47
55
  tokens: {}
48
56
  a2ui:
49
- rules: []
57
+ rules:
58
+ - rule: 'Generic vertical list container — hosts <list-item-ui> or arbitrary children.'
59
+ reason: 'Lowest-friction list primitive.'
60
+ - rule: 'For interactive selection lists use <nav-ui> (single-select navigation) or <menu-ui> (action menu); list-ui is content display.'
61
+ reason: 'Different interaction contracts.'
62
+ - rule: 'For data-grid / sortable / sticky-header needs use <table-ui> instead.'
63
+ reason: 'Table has different semantics.'
50
64
  anti_patterns: []
51
65
  examples:
52
66
  - name: basic-list
@@ -103,4 +117,8 @@ synonyms:
103
117
  - bookmark
104
118
  - list
105
119
  - leaderboard
106
- related: []
120
+ related:
121
+ - ListItem
122
+ - Tree
123
+ - Nav
124
+ - Table
@@ -27,12 +27,26 @@
27
27
  "composes": [],
28
28
  "events": {},
29
29
  "examples": [],
30
- "keywords": [],
30
+ "keywords": [
31
+ "menu-divider",
32
+ "separator",
33
+ "menu-rule"
34
+ ],
31
35
  "name": "UIMenuDivider",
32
- "related": [],
36
+ "related": [
37
+ "Menu",
38
+ "MenuItem",
39
+ "Divider"
40
+ ],
33
41
  "slots": {},
34
42
  "states": [],
35
- "synonyms": {},
43
+ "synonyms": {
44
+ "menu-divider": [
45
+ "menu-separator",
46
+ "menu-rule",
47
+ "popover-divider"
48
+ ]
49
+ },
36
50
  "tag": "menu-divider-ui",
37
51
  "tokens": {},
38
52
  "traits": [],
@@ -13,3 +13,38 @@ category: navigation
13
13
  version: 1
14
14
  description: |-
15
15
  Visual separator between groups of `<menu-item-ui>` rows. Renders as a horizontal rule with role="separator".
16
+
17
+ a2ui:
18
+ rules:
19
+ - >-
20
+ <menu-divider-ui> MUST be a direct child of <menu-ui>; a raw
21
+ <hr> will render OUTSIDE the popover because <menu-ui> only
22
+ hoists <menu-item-ui> and <menu-divider-ui> children via its
23
+ direct-child selector.
24
+ - >-
25
+ Use to group items by semantic tier — primary actions →
26
+ secondary → destructive (danger). Avoid leading / trailing
27
+ dividers and consecutive dividers; they produce visual noise
28
+ without grouping value.
29
+ - >-
30
+ Do not place a divider as the first or last child of <menu-ui> —
31
+ the top / bottom popover padding already provides separation
32
+ from the chrome.
33
+ - >-
34
+ Has no props, slots, or events. Treat as an inert separator with
35
+ role="separator". If you need a labeled group, split into
36
+ multiple <menu-ui> instances stacked, not custom content inside
37
+ a divider.
38
+
39
+ keywords:
40
+ - menu-divider
41
+ - separator
42
+ - menu-rule
43
+
44
+ related:
45
+ - Menu
46
+ - MenuItem
47
+ - Divider
48
+
49
+ synonyms:
50
+ menu-divider: [menu-separator, menu-rule, popover-divider]
@@ -56,9 +56,19 @@
56
56
  "composes": [],
57
57
  "events": {},
58
58
  "examples": [],
59
- "keywords": [],
59
+ "keywords": [
60
+ "menu-item",
61
+ "menu-row",
62
+ "popover-action",
63
+ "dropdown-item"
64
+ ],
60
65
  "name": "UIMenuItem",
61
- "related": [],
66
+ "related": [
67
+ "Menu",
68
+ "MenuDivider",
69
+ "Button",
70
+ "NavItem"
71
+ ],
62
72
  "slots": {
63
73
  "icon": {
64
74
  "description": "Custom leading element override; falls through to `[icon]` prop if not slotted."
@@ -68,7 +78,13 @@
68
78
  }
69
79
  },
70
80
  "states": [],
71
- "synonyms": {},
81
+ "synonyms": {
82
+ "menu-item": [
83
+ "dropdown-item",
84
+ "menu-row",
85
+ "popover-action"
86
+ ]
87
+ },
72
88
  "tag": "menu-item-ui",
73
89
  "tokens": {},
74
90
  "traits": [],
@@ -43,3 +43,45 @@ slots:
43
43
  description: Custom leading element override; falls through to `[icon]` prop if not slotted.
44
44
  text:
45
45
  description: Custom label content; falls through to `[text]` prop if not slotted.
46
+
47
+ a2ui:
48
+ rules:
49
+ - >-
50
+ <menu-item-ui> MUST be a direct child of <menu-ui>; do not place
51
+ inside arbitrary containers or other components — <menu-ui>
52
+ hoists items into its top-layer popover via a `:scope > menu-item-ui`
53
+ selector that requires direct descendancy.
54
+ - >-
55
+ Always set a stable [value] — it is the only identifier surfaced
56
+ on the parent's `action` event detail. [text] is the visible
57
+ label; optional [icon] is a Phosphor icon name shown leading the
58
+ label.
59
+ - >-
60
+ Use [variant="danger"] exclusively for destructive / irreversible
61
+ actions (Delete, Remove). "Sign out" is NOT danger. Pair danger
62
+ items with an explicit confirm flow (<modal-ui> destructive-confirm
63
+ pattern) when the action cannot be undone.
64
+ - >-
65
+ Set [disabled] (not [hidden]) when an action is contextually
66
+ unavailable — disabled items remain visible for affordance
67
+ discoverability but skip roving focus + don't fire `action`.
68
+ - >-
69
+ Prefer [icon] + [text] props over slotted markup for consistency.
70
+ Use slot="icon" / slot="text" only when you need custom markup
71
+ (e.g. <avatar-ui slot="icon">, <kbd slot="trailing"> shortcut
72
+ hint).
73
+
74
+ keywords:
75
+ - menu-item
76
+ - menu-row
77
+ - popover-action
78
+ - dropdown-item
79
+
80
+ related:
81
+ - Menu
82
+ - MenuDivider
83
+ - Button
84
+ - NavItem
85
+
86
+ synonyms:
87
+ menu-item: [dropdown-item, menu-row, popover-action]
@@ -81,7 +81,13 @@
81
81
  "right-click"
82
82
  ],
83
83
  "name": "UIMenu",
84
- "related": [],
84
+ "related": [
85
+ "MenuItem",
86
+ "MenuDivider",
87
+ "Popover",
88
+ "Command",
89
+ "Button"
90
+ ],
85
91
  "slots": {
86
92
  "default": {
87
93
  "description": "Menu items with role=\"menuitem\" and optional <hr> dividers"
@@ -49,7 +49,33 @@ states:
49
49
  traits: []
50
50
  tokens: {}
51
51
  a2ui:
52
- rules: []
52
+ rules:
53
+ - >-
54
+ <menu-ui> MUST have exactly one child with slot="trigger" (typically
55
+ <button-ui>, but any focusable element works). Without it the menu
56
+ cannot open. The trigger lives in light DOM; the items are hoisted
57
+ to a top-layer popover on open.
58
+ - >-
59
+ Default slot accepts only <menu-item-ui> and <menu-divider-ui>
60
+ children — no submenus, headers, or arbitrary content. Roving
61
+ tabindex + Arrow / Home / End / Enter / Escape keyboard nav is
62
+ built in.
63
+ - >-
64
+ Listen for the `action` event on <menu-ui> (or an ancestor —
65
+ bubbles). Detail = { value, text }. Do NOT treat menu-ui as a
66
+ value-holder; for single-select form input use <select-ui>
67
+ instead. Menu fires actions, doesn't store state.
68
+ - >-
69
+ Use <menu-ui> for transient action surfaces (kebab / ⋯ row
70
+ actions, workspace / user switchers, view-as toggles). For
71
+ persistent side navigation use <nav-ui>; for inline (non-popover)
72
+ command lists use <action-list-ui>; for searchable command
73
+ palettes use <command-ui> inside <admin-command>.
74
+ - >-
75
+ Set [placement="top-start"] or [placement="top-end"] when the
76
+ trigger sits near the bottom of the viewport (statusbar / footer
77
+ menus); default [placement="bottom-start"] otherwise. Adjust
78
+ [gap] (default 4px) only when chrome demands it.
53
79
  anti_patterns: []
54
80
  examples:
55
81
  - name: basic-menu
@@ -123,4 +149,9 @@ synonyms:
123
149
  right-click:
124
150
  - popover
125
151
  - menu
126
- related: []
152
+ related:
153
+ - MenuItem
154
+ - MenuDivider
155
+ - Popover
156
+ - Command
157
+ - Button
@@ -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/Modal.json",
4
4
  "title": "Modal",
5
- "description": "Centered dialog overlay using native <dialog>. Focus trapping, Escape key, backdrop.",
5
+ "description": "Centered dialog overlay using native <dialog> — same portal /\nbackdrop / focus-trap / Escape-dismiss primitives as <drawer-ui>,\nbut anchored to the viewport center with size presets. Canonical\ninner shape mirrors drawer / card: <header> + one or more <section>\n+ optional <footer>. The header stamps a built-in title bar from\n[text] plus an auto-close button (unless [permanent]). Use modal-ui\nfor centered confirmations, destructive prompts, transient previews,\nand short focused interactions; use <drawer-ui> instead for\nedge-anchored multi-field editors and mobile sheet patterns.\n",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -67,7 +67,12 @@
67
67
  "modal"
68
68
  ],
69
69
  "name": "UIModal",
70
- "related": [],
70
+ "related": [
71
+ "Drawer",
72
+ "Card",
73
+ "Popover",
74
+ "AdminCommand"
75
+ ],
71
76
  "slots": {
72
77
  "default": {
73
78
  "description": "Content placed inside the modal surface. Accepts any elements (card-ui, command-ui, custom markup)."
@@ -1,5 +1,14 @@
1
1
  /**
2
- * `<modal-ui>` — Centered dialog overlay using native <dialog>. Focus trapping, Escape key, backdrop.
2
+ * `<modal-ui>` — Centered dialog overlay using native <dialog> same portal /
3
+ backdrop / focus-trap / Escape-dismiss primitives as <drawer-ui>,
4
+ but anchored to the viewport center with size presets. Canonical
5
+ inner shape mirrors drawer / card: <header> + one or more <section>
6
+ + optional <footer>. The header stamps a built-in title bar from
7
+ [text] plus an auto-close button (unless [permanent]). Use modal-ui
8
+ for centered confirmations, destructive prompts, transient previews,
9
+ and short focused interactions; use <drawer-ui> instead for
10
+ edge-anchored multi-field editors and mobile sheet patterns.
11
+
3
12
  *
4
13
  * @see https://ui-kit.exe.xyz/site/components/modal
5
14
  *
@@ -4,7 +4,16 @@ tag: modal-ui
4
4
  component: Modal
5
5
  category: container
6
6
  version: 1
7
- description: Centered dialog overlay using native <dialog>. Focus trapping, Escape key, backdrop.
7
+ description: |
8
+ Centered dialog overlay using native <dialog> — same portal /
9
+ backdrop / focus-trap / Escape-dismiss primitives as <drawer-ui>,
10
+ but anchored to the viewport center with size presets. Canonical
11
+ inner shape mirrors drawer / card: <header> + one or more <section>
12
+ + optional <footer>. The header stamps a built-in title bar from
13
+ [text] plus an auto-close button (unless [permanent]). Use modal-ui
14
+ for centered confirmations, destructive prompts, transient previews,
15
+ and short focused interactions; use <drawer-ui> instead for
16
+ edge-anchored multi-field editors and mobile sheet patterns.
8
17
  props:
9
18
  open:
10
19
  description: Controls overlay visibility. Setting to true opens the surface with entry animation.
@@ -57,7 +66,39 @@ tokens:
57
66
  --modal-shadow:
58
67
  description: Override surface box shadow
59
68
  a2ui:
60
- rules: []
69
+ rules:
70
+ - >-
71
+ Reflect modal visibility via the [open] boolean attribute on the
72
+ host (open=true / open=false). Do NOT toggle [hidden], CSS
73
+ display, or wrap in a sibling visibility container — modal-ui
74
+ owns the native <dialog> lifecycle, focus trap, ::backdrop, and
75
+ Escape-dismiss. Listen for the `close` event to react to
76
+ dismiss.
77
+ - >-
78
+ Compose modal-ui with the same triplet as drawer-ui / card-ui:
79
+ <header> (or [slot="header"]) + <section> (or default body) +
80
+ <footer> (or [slot="footer"]). Set the title via [text] (which
81
+ stamps the heading + aria-label) or a <span slot="heading">. Do
82
+ not author your own close button unless using [permanent].
83
+ - >-
84
+ Use modal-ui (centered, interruptive) for short confirmations,
85
+ destructive prompts, and transient previews — typically ≤2 form
86
+ fields or a single decision. For edge-anchored multi-field detail
87
+ editors and mobile sheets, use <drawer-ui> instead. The
88
+ destructive-confirm-modal pattern lives at
89
+ catalog/ui-patterns/app/destructive-confirm-modal/ as the
90
+ canonical reference.
91
+ - >-
92
+ modal-ui is NOT the Cmd+K command palette. The palette is a
93
+ bespoke shell-tier component (<admin-command> under <admin-shell>);
94
+ do not model command palettes as modal-ui surfaces even though
95
+ the visual is overlay-like. The palette owns its own keyboard /
96
+ filter loop.
97
+ - >-
98
+ Use [size] presets (sm = 24rem | md = 32rem | lg = 48rem | xl =
99
+ 95vw) to scale width. Do not override width with inline style or
100
+ wrap modal-ui in a sizing container — the [size] attribute is
101
+ the only supported width contract.
61
102
  anti_patterns: []
62
103
  examples:
63
104
  - name: basic-modal
@@ -70,4 +111,8 @@ keywords:
70
111
  synonyms:
71
112
  tags:
72
113
  - Dialog
73
- related: []
114
+ related:
115
+ - Drawer
116
+ - Card
117
+ - Popover
118
+ - AdminCommand
@@ -93,7 +93,13 @@
93
93
  "links"
94
94
  ],
95
95
  "name": "UINav",
96
- "related": [],
96
+ "related": [
97
+ "NavGroup",
98
+ "NavItem",
99
+ "Tabs",
100
+ "Breadcrumb",
101
+ "AdminSidebar"
102
+ ],
97
103
  "slots": {
98
104
  "default": {
99
105
  "description": "Primary slot — accepts <nav-group-ui> + <nav-item-ui> children, plus <hr data-nav-divider> for hand-placed dividers."
@@ -109,7 +115,15 @@
109
115
  "name": "collapsed"
110
116
  }
111
117
  ],
112
- "synonyms": {},
118
+ "synonyms": {
119
+ "nav": [
120
+ "sidebar",
121
+ "side-nav",
122
+ "navigation-rail",
123
+ "primary-nav",
124
+ "section-nav"
125
+ ]
126
+ },
113
127
  "tag": "nav-ui",
114
128
  "tokens": {},
115
129
  "traits": [],
@@ -66,7 +66,38 @@ states:
66
66
  traits: []
67
67
  tokens: {}
68
68
  a2ui:
69
- rules: []
69
+ rules:
70
+ - >-
71
+ Composition: place <nav-ui> inside <admin-sidebar slot="leading">
72
+ wrapped in <section-ui> for app sidebars; inside an
73
+ <aside data-subnav> with variant="section" for section / subnav
74
+ rails; standalone on docs / auth pages. Children: <nav-group-ui>,
75
+ <nav-item-ui>, optional <hr data-nav-divider>.
76
+ - >-
77
+ Variants: variant="primary" (default) — app sidebar; ResizeObserver
78
+ collapses to icon-only ≤96px; collapsible groups open as a popover
79
+ when collapsed. variant="section" — subnav rail; quieter chrome;
80
+ optional [heading] kicker rendered via ::before.
81
+ - >-
82
+ Section-variant cascade (ADR-0015 § Nav consolidation):
83
+ variant="section" on <nav-ui> cascades visually to direct
84
+ <nav-group-ui> / <nav-item-ui> descendants via CSS
85
+ `:not([variant])`. Children's JS state is NOT mutated; the cascade
86
+ is purely visual. Explicit [variant] on a child always wins — use
87
+ it to escape the cascade or style a standalone group/item.
88
+ - >-
89
+ Decision rule: if the user navigates AWAY (different page, route,
90
+ or anchor) → <nav-ui>. If the user switches VIEWS within the same
91
+ logical page → <tabs-ui>. Never use <nav-ui> as an in-page section
92
+ switcher.
93
+ - >-
94
+ Anti-patterns: do NOT wrap <nav-ui> children in <col-ui> /
95
+ <row-ui> — wrapping breaks selection bubbling + the variant
96
+ cascade. Do NOT nest <nav-ui> inside <nav-ui>. The legacy 6-element
97
+ family (<app-nav-ui> / <section-nav-ui> / <app-nav-item-ui> /
98
+ <section-nav-item-ui> / <app-nav-group-ui> / <section-nav-group-ui>)
99
+ was retired in ADR-0015 — only <nav-ui> / <nav-group-ui> /
100
+ <nav-item-ui> remain.
70
101
  anti_patterns: []
71
102
 
72
103
  examples:
@@ -126,5 +157,11 @@ examples:
126
157
  ]
127
158
 
128
159
  keywords: [nav, navigation, sidebar, menu, links]
129
- synonyms: {}
130
- related: []
160
+ synonyms:
161
+ nav: [sidebar, side-nav, navigation-rail, primary-nav, section-nav]
162
+ related:
163
+ - NavGroup
164
+ - NavItem
165
+ - Tabs
166
+ - Breadcrumb
167
+ - AdminSidebar
@@ -87,7 +87,11 @@
87
87
  "menu"
88
88
  ],
89
89
  "name": "UINavGroup",
90
- "related": [],
90
+ "related": [
91
+ "Nav",
92
+ "NavItem",
93
+ "Accordion"
94
+ ],
91
95
  "slots": {
92
96
  "default": {
93
97
  "description": "Children — typically <nav-item-ui> rows."
@@ -106,7 +110,13 @@
106
110
  "name": "open"
107
111
  }
108
112
  ],
109
- "synonyms": {},
113
+ "synonyms": {
114
+ "nav-group": [
115
+ "nav-section",
116
+ "sidebar-group",
117
+ "menu-group"
118
+ ]
119
+ },
110
120
  "tag": "nav-group-ui",
111
121
  "tokens": {},
112
122
  "traits": [],
@@ -72,10 +72,44 @@ states:
72
72
  traits: []
73
73
  tokens: {}
74
74
  a2ui:
75
- rules: []
75
+ rules:
76
+ - >-
77
+ Composition: <nav-group-ui> MUST be a direct child of <nav-ui>
78
+ (or standalone with explicit variant="section" outside a rail).
79
+ Default slot accepts <nav-item-ui> children; do NOT wrap them in
80
+ layout primitives — selection, keyboard, and the section-variant
81
+ cascade all rely on direct descendancy.
82
+ - >-
83
+ Variant cascade: when parent <nav-ui variant="section">, this
84
+ group inherits section styling (static kicker header, children
85
+ always visible) via CSS — without touching its JS state. Set
86
+ [variant="section"] explicitly only when there is no <nav-ui>
87
+ parent, OR to override a primary-rail context.
88
+ - >-
89
+ Collapsibility: primary variant — [collapsible] (default true)
90
+ toggles [open] via header click / Enter / Space; fires
91
+ `group-toggle` event with detail {text, open}. When the parent
92
+ <nav-ui> is collapsed to icon-only, the header opens a popover
93
+ with this group's children instead. Section variant ignores
94
+ [open] / [collapsible] (children always visible).
95
+ - >-
96
+ Decision rule: use <nav-group-ui> to group ≥2 related navigation
97
+ links under one label inside <nav-ui>. For a single link, use
98
+ <nav-item-ui> directly. For switching sub-views inside one page,
99
+ use <tabs-ui> / <tab-ui>, never <nav-group-ui>.
100
+ - >-
101
+ Anti-patterns: do NOT nest <nav-group-ui> inside another
102
+ <nav-group-ui> (flatten the hierarchy or split into two groups).
103
+ Do NOT place non-<nav-item-ui> content in the default slot. Do
104
+ NOT use it as a generic disclosure — for that use <accordion-ui>
105
+ or <details>.
76
106
  anti_patterns: []
77
107
  examples: []
78
108
 
79
109
  keywords: [nav, navigation, group, sidebar, menu]
80
- synonyms: {}
81
- related: []
110
+ synonyms:
111
+ nav-group: [nav-section, sidebar-group, menu-group]
112
+ related:
113
+ - Nav
114
+ - NavItem
115
+ - Accordion