@adia-ai/web-components 0.8.40 → 0.8.41

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 (378) hide show
  1. package/CHANGELOG.md +50 -3
  2. package/MIGRATION.md +1042 -16
  3. package/README.md +25 -30
  4. package/USAGE.md +26 -0
  5. package/bin/audit-template-children.mjs +556 -0
  6. package/components/accordion/accordion-item.a2ui.json +4 -0
  7. package/components/accordion/accordion-item.yaml +2 -0
  8. package/components/accordion/accordion.a2ui.json +4 -0
  9. package/components/accordion/accordion.yaml +2 -0
  10. package/components/action-list/action-item.a2ui.json +24 -2
  11. package/components/action-list/action-item.yaml +28 -3
  12. package/components/action-list/action-list.a2ui.json +6 -1
  13. package/components/action-list/action-list.class.js +52 -11
  14. package/components/action-list/action-list.css +43 -3
  15. package/components/action-list/action-list.d.ts +4 -2
  16. package/components/action-list/action-list.yaml +5 -0
  17. package/components/adia-mark/adia-mark.a2ui.json +1 -0
  18. package/components/adia-wordmark/adia-wordmark.a2ui.json +1 -0
  19. package/components/agent-artifact/agent-artifact.a2ui.json +1 -0
  20. package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +6 -5
  21. package/components/agent-feedback-bar/agent-feedback-bar.yaml +6 -2
  22. package/components/agent-questions/agent-questions.a2ui.json +1 -0
  23. package/components/agent-reasoning/agent-reasoning.a2ui.json +6 -5
  24. package/components/agent-reasoning/agent-reasoning.yaml +6 -2
  25. package/components/agent-suggestions/agent-suggestions.a2ui.json +11 -2
  26. package/components/agent-suggestions/agent-suggestions.class.js +2 -1
  27. package/components/agent-suggestions/agent-suggestions.d.ts +4 -4
  28. package/components/agent-suggestions/agent-suggestions.yaml +4 -2
  29. package/components/agent-trace/agent-trace.a2ui.json +6 -5
  30. package/components/agent-trace/agent-trace.yaml +6 -2
  31. package/components/alert/alert.a2ui.json +1 -0
  32. package/components/alert/alert.css +1 -1
  33. package/components/anchor-bar/anchor-bar.a2ui.json +1 -0
  34. package/components/aside/aside.a2ui.json +1 -0
  35. package/components/avatar/avatar-group.a2ui.json +7 -1
  36. package/components/avatar/avatar-group.yaml +1 -0
  37. package/components/avatar/avatar.a2ui.json +12 -11
  38. package/components/avatar/avatar.d.ts +1 -1
  39. package/components/avatar/avatar.yaml +4 -4
  40. package/components/badge/badge.a2ui.json +1 -0
  41. package/components/block/block.a2ui.json +1 -0
  42. package/components/blockquote/blockquote.a2ui.json +1 -0
  43. package/components/breadcrumb/breadcrumb.a2ui.json +1 -0
  44. package/components/button/button.a2ui.json +1 -3
  45. package/components/button/button.yaml +1 -3
  46. package/components/calendar-grid/calendar-grid.a2ui.json +1 -0
  47. package/components/calendar-grid/calendar-grid.class.js +2 -1
  48. package/components/calendar-picker/calendar-picker.a2ui.json +143 -24
  49. package/components/calendar-picker/calendar-picker.class.js +490 -197
  50. package/components/calendar-picker/calendar-picker.css +120 -171
  51. package/components/calendar-picker/calendar-picker.yaml +225 -47
  52. package/components/canvas/canvas.a2ui.json +6 -5
  53. package/components/canvas/canvas.d.ts +37 -0
  54. package/components/canvas/canvas.js +72 -3
  55. package/components/canvas/canvas.yaml +6 -2
  56. package/components/card/card.a2ui.json +25 -2
  57. package/components/card/card.class.js +3 -0
  58. package/components/card/card.css +31 -1
  59. package/components/card/card.d.ts +2 -2
  60. package/components/card/card.examples.md +3 -3
  61. package/components/card/card.yaml +28 -4
  62. package/components/chart/chart.a2ui.json +9 -4
  63. package/components/chart/chart.class.js +6 -6
  64. package/components/chart/chart.css +6 -4
  65. package/components/chart/chart.d.ts +1 -1
  66. package/components/chart/chart.yaml +5 -3
  67. package/components/chart-legend/chart-legend.a2ui.json +1 -0
  68. package/components/chat-thread/chat-input.a2ui.json +1 -0
  69. package/components/chat-thread/chat-thread.a2ui.json +10 -9
  70. package/components/chat-thread/chat-thread.yaml +13 -20
  71. package/components/check/check.a2ui.json +10 -9
  72. package/components/check/check.yaml +4 -4
  73. package/components/code/code.a2ui.json +1 -0
  74. package/components/col/col.a2ui.json +1 -0
  75. package/components/color-input/color-input.a2ui.json +1 -0
  76. package/components/color-picker/color-picker.a2ui.json +1 -0
  77. package/components/combobox/combobox.a2ui.json +3 -2
  78. package/components/combobox/combobox.yaml +2 -2
  79. package/components/command/command.a2ui.json +12 -10
  80. package/components/command/command.class.js +3 -2
  81. package/components/command/command.yaml +17 -4
  82. package/components/context-menu/context-menu.a2ui.json +1 -0
  83. package/components/date-range-picker/date-range-picker.a2ui.json +2 -1
  84. package/components/date-range-picker/date-range-picker.yaml +1 -1
  85. package/components/datetime-picker/datetime-picker.a2ui.json +15 -108
  86. package/components/datetime-picker/datetime-picker.class.js +37 -690
  87. package/components/datetime-picker/datetime-picker.css +11 -183
  88. package/components/datetime-picker/datetime-picker.d.ts +4 -5
  89. package/components/datetime-picker/datetime-picker.yaml +44 -135
  90. package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
  91. package/components/demo-toggle/demo-toggle.css +1 -1
  92. package/components/description-list/description-list.a2ui.json +1 -0
  93. package/components/display-field/display-field.a2ui.json +1 -0
  94. package/components/divider/divider.a2ui.json +1 -0
  95. package/components/drawer/drawer.a2ui.json +1 -3
  96. package/components/drawer/drawer.css +1 -1
  97. package/components/drawer/drawer.yaml +0 -2
  98. package/components/drilldown/drilldown.a2ui.json +22 -20
  99. package/components/drilldown/drilldown.class.js +4 -3
  100. package/components/drilldown/drilldown.css +6 -6
  101. package/components/drilldown/drilldown.yaml +40 -9
  102. package/components/embed/embed.a2ui.json +6 -5
  103. package/components/embed/embed.yaml +2 -2
  104. package/components/empty-state/empty-state.a2ui.json +1 -0
  105. package/components/feed/feed-item.a2ui.json +25 -5
  106. package/components/feed/feed-item.yaml +28 -7
  107. package/components/feed/feed.a2ui.json +9 -2
  108. package/components/feed/feed.class.js +19 -12
  109. package/components/feed/feed.css +8 -8
  110. package/components/feed/feed.yaml +14 -1
  111. package/components/field/field.a2ui.json +1 -0
  112. package/components/field/field.examples.md +1 -1
  113. package/components/fields/fields.a2ui.json +1 -0
  114. package/components/fields/fields.examples.md +1 -1
  115. package/components/footer/footer.a2ui.json +1 -0
  116. package/components/frame/frame.a2ui.json +1 -0
  117. package/components/grid/grid.a2ui.json +1 -0
  118. package/components/header/header.a2ui.json +3 -2
  119. package/components/header/header.yaml +3 -3
  120. package/components/heatmap/heatmap.a2ui.json +2 -1
  121. package/components/heatmap/heatmap.class.js +1 -1
  122. package/components/heatmap/heatmap.css +4 -4
  123. package/components/heatmap/heatmap.yaml +1 -1
  124. package/components/icon/icon.a2ui.json +1 -0
  125. package/components/image/image.a2ui.json +28 -14
  126. package/components/image/image.class.js +38 -23
  127. package/components/image/image.css +18 -8
  128. package/components/image/image.d.ts +2 -2
  129. package/components/image/image.examples.md +3 -3
  130. package/components/image/image.yaml +23 -7
  131. package/components/inline-edit/inline-edit.a2ui.json +1 -0
  132. package/components/inline-message/inline-message.a2ui.json +3 -1
  133. package/components/inline-message/inline-message.class.js +3 -1
  134. package/components/inline-message/inline-message.d.ts +2 -2
  135. package/components/inline-message/inline-message.yaml +2 -1
  136. package/components/input/input.a2ui.json +66 -16
  137. package/components/input/input.class.js +64 -7
  138. package/components/input/input.css +14 -14
  139. package/components/input/input.d.ts +9 -4
  140. package/components/input/input.yaml +83 -10
  141. package/components/inspector/inspector.a2ui.json +1 -0
  142. package/components/integration-card/integration-card.a2ui.json +1 -0
  143. package/components/kbd/kbd.a2ui.json +1 -0
  144. package/components/link/link.a2ui.json +2 -1
  145. package/components/link/link.yaml +1 -1
  146. package/components/list/list-item.a2ui.json +9 -0
  147. package/components/list/list-item.yaml +12 -0
  148. package/components/list/list.a2ui.json +9 -3
  149. package/components/list/list.class.js +14 -1
  150. package/components/list/list.css +12 -1
  151. package/components/list/list.d.ts +7 -5
  152. package/components/list/list.yaml +16 -6
  153. package/components/list-window/list-window.a2ui.json +1 -0
  154. package/components/list-window/list-window.class.js +2 -1
  155. package/components/loading-overlay/loading-overlay.a2ui.json +1 -0
  156. package/components/mark/mark.a2ui.json +2 -1
  157. package/components/mark/mark.yaml +1 -1
  158. package/components/menu/menu-divider.a2ui.json +1 -0
  159. package/components/menu/menu-item.a2ui.json +3 -1
  160. package/components/menu/menu-item.yaml +6 -0
  161. package/components/menu/menu-label.a2ui.json +1 -0
  162. package/components/menu/menu.a2ui.json +3 -2
  163. package/components/menu/menu.class.js +2 -2
  164. package/components/menu/menu.d.ts +2 -2
  165. package/components/menu/menu.yaml +3 -3
  166. package/components/modal/modal.a2ui.json +1 -0
  167. package/components/nav/nav.a2ui.json +1 -0
  168. package/components/nav/nav.class.js +14 -3
  169. package/components/nav-group/nav-group.a2ui.json +1 -0
  170. package/components/nav-group/nav-group.class.js +3 -1
  171. package/components/nav-item/nav-item.a2ui.json +1 -0
  172. package/components/noodles/noodles.a2ui.json +1 -0
  173. package/components/noodles/noodles.class.js +5 -1
  174. package/components/number-format/number-format.a2ui.json +1 -0
  175. package/components/option-card/option-card.a2ui.json +1 -0
  176. package/components/otp-input/otp-input.a2ui.json +3 -2
  177. package/components/otp-input/otp-input.yaml +9 -2
  178. package/components/page/page.a2ui.json +13 -0
  179. package/components/page/page.d.ts +1 -1
  180. package/components/page/page.yaml +1 -0
  181. package/components/pagination/pagination.a2ui.json +1 -0
  182. package/components/pagination/pagination.class.js +3 -2
  183. package/components/pane/pane.a2ui.json +6 -0
  184. package/components/pane/pane.class.js +3 -3
  185. package/components/pane/pane.css +2 -2
  186. package/components/pane/pane.yaml +3 -0
  187. package/components/password-strength/password-strength.a2ui.json +1 -0
  188. package/components/pipeline-status/pipeline-status.a2ui.json +1 -0
  189. package/components/popover/popover.a2ui.json +7 -6
  190. package/components/popover/popover.class.js +2 -2
  191. package/components/popover/popover.d.ts +2 -2
  192. package/components/popover/popover.yaml +4 -4
  193. package/components/preview/preview.a2ui.json +1 -0
  194. package/components/preview/preview.class.js +5 -1
  195. package/components/progress/progress.a2ui.json +47 -24
  196. package/components/progress/progress.class.js +66 -11
  197. package/components/progress/progress.css +44 -26
  198. package/components/progress/progress.d.ts +7 -5
  199. package/components/progress/progress.examples.md +2 -2
  200. package/components/progress/progress.yaml +235 -53
  201. package/components/progress-row/progress-row.a2ui.json +16 -12
  202. package/components/progress-row/progress-row.d.ts +2 -2
  203. package/components/progress-row/progress-row.examples.md +2 -14
  204. package/components/progress-row/progress-row.yaml +28 -36
  205. package/components/qr-code/qr-code.a2ui.json +3 -2
  206. package/components/qr-code/qr-code.class.js +4 -4
  207. package/components/qr-code/qr-code.css +1 -1
  208. package/components/qr-code/qr-code.yaml +5 -3
  209. package/components/radio/radio.a2ui.json +8 -7
  210. package/components/radio/radio.class.js +8 -0
  211. package/components/radio/radio.yaml +3 -3
  212. package/components/radio-group/radio-group.a2ui.json +5 -3
  213. package/components/radio-group/radio-group.class.js +11 -0
  214. package/components/radio-group/radio-group.yaml +7 -1
  215. package/components/range/range.a2ui.json +6 -0
  216. package/components/range/range.class.js +2 -2
  217. package/components/range/range.css +2 -2
  218. package/components/range/range.yaml +3 -0
  219. package/components/rating/rating.a2ui.json +1 -0
  220. package/components/relative-time/relative-time.a2ui.json +1 -0
  221. package/components/richtext/richtext.a2ui.json +2 -1
  222. package/components/richtext/richtext.yaml +1 -1
  223. package/components/row/row.a2ui.json +1 -0
  224. package/components/search/search.a2ui.json +1 -0
  225. package/components/search/search.class.js +4 -1
  226. package/components/section/section.a2ui.json +1 -0
  227. package/components/segment/segment.a2ui.json +21 -10
  228. package/components/segment/segment.css +15 -0
  229. package/components/segment/segment.d.ts +2 -1
  230. package/components/segment/segment.yaml +20 -13
  231. package/components/segmented/segmented.a2ui.json +36 -7
  232. package/components/segmented/segmented.class.js +113 -22
  233. package/components/segmented/segmented.css +3 -0
  234. package/components/segmented/segmented.d.ts +3 -1
  235. package/components/segmented/segmented.yaml +80 -8
  236. package/components/select/select.a2ui.json +18 -13
  237. package/components/select/select.class.js +61 -37
  238. package/components/select/select.css +15 -13
  239. package/components/select/select.yaml +18 -7
  240. package/components/skeleton/skeleton.a2ui.json +8 -7
  241. package/components/skeleton/skeleton.class.js +8 -7
  242. package/components/skeleton/skeleton.css +21 -6
  243. package/components/skeleton/skeleton.d.ts +2 -2
  244. package/components/skeleton/skeleton.examples.md +2 -2
  245. package/components/skeleton/skeleton.yaml +3 -2
  246. package/components/skip-nav/skip-nav.a2ui.json +1 -0
  247. package/components/slider/slider.a2ui.json +6 -0
  248. package/components/slider/slider.class.js +20 -3
  249. package/components/slider/slider.css +2 -2
  250. package/components/slider/slider.yaml +3 -0
  251. package/components/spinner/spinner.a2ui.json +1 -0
  252. package/components/stack/stack.a2ui.json +1 -0
  253. package/components/stat/stat.a2ui.json +1 -0
  254. package/components/stat/stat.js +2 -2
  255. package/components/step-progress/step-progress.a2ui.json +1 -0
  256. package/components/step-progress/step-progress.yaml +1 -1
  257. package/components/stepper/stepper-item.a2ui.json +7 -3
  258. package/components/stepper/stepper-item.yaml +15 -5
  259. package/components/stepper/stepper.a2ui.json +5 -1
  260. package/components/stepper/stepper.class.js +31 -16
  261. package/components/stepper/stepper.d.ts +1 -1
  262. package/components/stepper/stepper.yaml +4 -2
  263. package/components/stream/stream.a2ui.json +1 -0
  264. package/components/swatch/swatch.a2ui.json +1 -0
  265. package/components/swiper/swiper.a2ui.json +1 -0
  266. package/components/swiper/swiper.class.js +5 -1
  267. package/components/switch/switch.a2ui.json +12 -11
  268. package/components/switch/switch.css +1 -1
  269. package/components/switch/switch.yaml +6 -6
  270. package/components/table/table.a2ui.json +1 -0
  271. package/components/table/table.class.js +14 -12
  272. package/components/table/table.css +11 -9
  273. package/components/table-toolbar/table-toolbar.a2ui.json +1 -0
  274. package/components/table-toolbar/table-toolbar.class.js +38 -19
  275. package/components/table-toolbar/table-toolbar.css +1 -1
  276. package/components/tabs/tab.a2ui.json +9 -0
  277. package/components/tabs/tab.js +4 -0
  278. package/components/tabs/tab.yaml +15 -0
  279. package/components/tabs/tabs.a2ui.json +9 -4
  280. package/components/tabs/tabs.class.js +13 -1
  281. package/components/tabs/tabs.css +8 -0
  282. package/components/tabs/tabs.d.ts +2 -0
  283. package/components/tabs/tabs.yaml +9 -2
  284. package/components/tag/tag.a2ui.json +1 -0
  285. package/components/tags-input/tags-input.a2ui.json +22 -17
  286. package/components/tags-input/tags-input.class.js +13 -11
  287. package/components/tags-input/tags-input.css +10 -6
  288. package/components/tags-input/tags-input.d.ts +16 -7
  289. package/components/tags-input/tags-input.examples.md +2 -2
  290. package/components/tags-input/tags-input.yaml +25 -8
  291. package/components/text/text.a2ui.json +6 -5
  292. package/components/text/text.css +10 -5
  293. package/components/text/text.d.ts +2 -2
  294. package/components/text/text.yaml +9 -4
  295. package/components/textarea/textarea.a2ui.json +2 -1
  296. package/components/textarea/textarea.yaml +1 -1
  297. package/components/theme-provider/theme-provider.a2ui.json +2 -1
  298. package/components/theme-provider/theme-provider.d.ts +5 -3
  299. package/components/theme-provider/theme-provider.yaml +5 -3
  300. package/components/time-picker/time-picker.a2ui.json +1 -0
  301. package/components/time-picker/time-picker.class.js +4 -2
  302. package/components/timeline/timeline-item.a2ui.json +26 -3
  303. package/components/timeline/timeline-item.yaml +22 -7
  304. package/components/timeline/timeline.a2ui.json +4 -0
  305. package/components/timeline/timeline.class.js +29 -18
  306. package/components/timeline/timeline.d.ts +3 -3
  307. package/components/timeline/timeline.yaml +2 -0
  308. package/components/toast/toast.a2ui.json +10 -3
  309. package/components/toast/toast.yaml +20 -13
  310. package/components/toc/toc.a2ui.json +1 -0
  311. package/components/toggle-group/toggle-group.a2ui.json +7 -3
  312. package/components/toggle-group/toggle-group.class.js +40 -1
  313. package/components/toggle-group/toggle-group.css +6 -1
  314. package/components/toggle-group/toggle-group.d.ts +2 -2
  315. package/components/toggle-group/toggle-group.yaml +21 -12
  316. package/components/toggle-group/toggle-option.a2ui.json +7 -3
  317. package/components/toggle-group/toggle-option.yaml +13 -7
  318. package/components/toggle-scheme/toggle-scheme.a2ui.json +2 -1
  319. package/components/toggle-scheme/toggle-scheme.yaml +1 -1
  320. package/components/toolbar/toolbar-group.a2ui.json +1 -0
  321. package/components/toolbar/toolbar.a2ui.json +1 -0
  322. package/components/toolbar/toolbar.class.js +3 -0
  323. package/components/tooltip/tooltip.a2ui.json +1 -0
  324. package/components/tour/tour-step.a2ui.json +4 -0
  325. package/components/tour/tour-step.yaml +2 -0
  326. package/components/tour/tour.a2ui.json +4 -0
  327. package/components/tour/tour.yaml +2 -0
  328. package/components/tree/tree-item.a2ui.json +5 -0
  329. package/components/tree/tree-item.yaml +3 -0
  330. package/components/tree/tree.a2ui.json +4 -0
  331. package/components/tree/tree.class.js +2 -1
  332. package/components/tree/tree.yaml +2 -0
  333. package/components/upload/upload.a2ui.json +8 -1
  334. package/components/upload/upload.class.js +35 -5
  335. package/components/upload/upload.css +28 -0
  336. package/components/upload/upload.d.ts +16 -0
  337. package/components/upload/upload.yaml +27 -7
  338. package/components/visually-hidden/visually-hidden.a2ui.json +1 -0
  339. package/core/dom.d.ts +11 -0
  340. package/core/dom.js +34 -0
  341. package/core/form.js +7 -0
  342. package/core/index.d.ts +1 -0
  343. package/core/index.js +1 -0
  344. package/core/responsive.js +16 -4
  345. package/core/template.js +2 -1
  346. package/custom-elements.json +437 -489
  347. package/dist/host.min.css +1 -1
  348. package/dist/host.sheet.js +1 -1
  349. package/dist/theme-provider.min.js +5 -5
  350. package/dist/web-components.min.css +1 -1
  351. package/dist/web-components.min.js +91 -104
  352. package/dist/web-components.sheet.js +1 -1
  353. package/package.json +4 -2
  354. package/patterns/conversion-funnel/conversion-funnel.examples.html +15 -15
  355. package/patterns/inline-dialog/inline-dialog.examples.html +2 -2
  356. package/patterns/inline-dialog/inline-dialog.html +4 -0
  357. package/patterns/timezone-selector/timezone-selector.examples.html +1 -1
  358. package/patterns/timezone-selector/timezone-selector.html +2 -2
  359. package/styles/api/text.css +7 -0
  360. package/traits/_catalog.json +129 -41
  361. package/traits/anchor-positioning/anchor-positioning.js +1 -0
  362. package/traits/announcer/announcer.js +1 -0
  363. package/traits/arrow-grid-nav/arrow-grid-nav.js +1 -0
  364. package/traits/attention-pulse/attention-pulse.js +1 -0
  365. package/traits/count-up/count-up.js +1 -0
  366. package/traits/define.js +78 -0
  367. package/traits/focus-restore/focus-restore.js +2 -1
  368. package/traits/haptic-feedback/haptic-feedback.js +1 -0
  369. package/traits/input-mask/input-mask.js +1 -0
  370. package/traits/intersection-observer/intersection-observer.js +1 -0
  371. package/traits/layout-animation/layout-animation.js +1 -0
  372. package/traits/noise-texture/noise-texture.js +1 -0
  373. package/traits/resize-observer/resize-observer.js +1 -0
  374. package/traits/scroll-progress/scroll-progress.js +1 -0
  375. package/traits/snap-to-grid/snap-to-grid.js +1 -0
  376. package/traits/sound-feedback/sound-feedback.js +1 -0
  377. package/traits/spring-animate/spring-animate.js +1 -0
  378. package/traits/validation/validation.js +1 -0
@@ -16,7 +16,10 @@ component: ActionItem
16
16
  category: navigation
17
17
  version: 1
18
18
  description: |-
19
- Child of <action-list-ui>. One actionable row — icon + label, forwards activation to the parent action-list.
19
+ Child of <action-list-ui>. One actionable row — icon + label + optional
20
+ subtitle, forwards activation to the parent action-list. Row contract
21
+ converges on <menu-item-ui>: icon/text/subtitle/value/variant/disabled
22
+ props and icon/text/subtitle/trailing slot overrides (#1363 C5).
20
23
 
21
24
  props:
22
25
  icon:
@@ -25,13 +28,18 @@ props:
25
28
  text:
26
29
  description: Action label.
27
30
  type: string
31
+ subtitle:
32
+ description: Optional secondary description line rendered under the label.
33
+ type: string
34
+ default: ''
28
35
  value:
29
36
  description: Identifier passed to the action-list change/activate handlers.
30
37
  type: string
31
38
  variant:
32
- description: Visual variant (default | accent | danger).
39
+ description: Visual variant (default | danger).
33
40
  type: string
34
41
  default: 'default'
42
+ enum: [default, danger]
35
43
  disabled:
36
44
  description: Disables click + keyboard activation; aria-disabled is set.
37
45
  type: boolean
@@ -43,6 +51,17 @@ slots:
43
51
  Override the [icon] glyph with a custom slotted element (custom
44
52
  icon-ui, image, avatar). Mutually exclusive with the [icon]
45
53
  attribute — slot child wins.
54
+ text:
55
+ description: Custom label content; falls through to [text] prop if not slotted.
56
+ subtitle:
57
+ description: >-
58
+ Custom secondary-line content override; falls through to [subtitle]
59
+ prop if not slotted.
60
+ trailing:
61
+ description: >-
62
+ Trailing element pinned to the far edge (shortcut hint, badge, caret).
63
+ Supersedes the unnamed default slot this row previously used for
64
+ trailing content — see MIGRATION GUIDE.
46
65
 
47
66
  keywords:
48
67
  - action-item
@@ -60,10 +79,16 @@ related:
60
79
  - Button
61
80
 
62
81
  a2ui:
82
+ allowedParents:
83
+ - ActionList
63
84
  rules:
64
- - rule: 'Child of <action-list-ui> — one inline-action row with icon + label + optional shortcut + optional sublabel.'
85
+ - rule: 'Child of <action-list-ui> — one inline-action row with icon + label + optional subtitle + optional trailing shortcut/badge.'
65
86
  reason: 'Action-list cluster contract.'
66
87
  - rule: 'Different from <menu-item-ui>: action-items live inline in content surfaces; menu-items live inside <menu-ui> popovers.'
67
88
  reason: 'Context boundary.'
68
89
  - rule: 'For navigation entries (route-changing) use <nav-item-ui> instead.'
69
90
  reason: 'Different intent — actions vs navigation.'
91
+ - rule: 'Use [variant="danger"] exclusively for destructive/irreversible actions (Delete, Remove). Pair danger items with an explicit confirm flow when the action cannot be undone.'
92
+ reason: 'Converged with <menu-item-ui>''s danger-variant guidance (#1363 C5).'
93
+ - rule: 'Prefer [icon]/[text]/[subtitle] props over slotted markup; use slot="icon"/"text"/"subtitle"/"trailing" only for custom markup (e.g. a slotted <kbd> shortcut hint).'
94
+ reason: 'Row-contract convergence with <menu-item-ui> (#1363 C5).'
@@ -22,6 +22,9 @@
22
22
  ],
23
23
  "unevaluatedProperties": false,
24
24
  "x-adiaui": {
25
+ "allowedChildren": [
26
+ "ActionItem"
27
+ ],
25
28
  "anti_patterns": [],
26
29
  "category": "navigation",
27
30
  "composes": [
@@ -60,10 +63,12 @@
60
63
  "list"
61
64
  ],
62
65
  "name": "UIActionList",
66
+ "parts": {},
63
67
  "related": [
64
68
  "ActionItem",
65
69
  "Menu",
66
- "Button"
70
+ "Button",
71
+ "List"
67
72
  ],
68
73
  "slots": {
69
74
  "default": {
@@ -94,6 +94,7 @@ export class UIActionItem extends UIElement {
94
94
  static properties = {
95
95
  icon: { type: String, default: '', reflect: true },
96
96
  text: { type: String, default: '', reflect: true },
97
+ subtitle: { type: String, default: '', reflect: true },
97
98
  value: { type: String, default: '', reflect: true },
98
99
  variant: { type: String, default: 'default', reflect: true },
99
100
  disabled: { type: Boolean, default: false, reflect: true },
@@ -101,6 +102,21 @@ export class UIActionItem extends UIElement {
101
102
 
102
103
  static template = () => null;
103
104
 
105
+ // Set when connected()/render() stamped this fallback child from a prop —
106
+ // never touch a consumer-authored slot="icon"/"text"/"subtitle" child
107
+ // (ADR-0010, slot content is source of truth). Mirrors menu-item-ui's
108
+ // UIMenuItem stamp-marking exactly (CodeRabbit review, PR #1429).
109
+ #stampMark(el) { el.dataset.actionItemStamped = '1'; return el; }
110
+ #wasStamped(el) { return el?.dataset?.actionItemStamped === '1'; }
111
+
112
+ #ownChild(selector) {
113
+ // wrapper-trap-ok: finds component-stamped children (data-action-item-stamped) — consumer children are read but never overwritten
114
+ for (const ch of this.children) {
115
+ if (ch.matches(selector)) return ch;
116
+ }
117
+ return null;
118
+ }
119
+
104
120
  connected() {
105
121
  // Adopt-or-stamp (gh#753): a consumer-authored role survives connect —
106
122
  // only stamp "listitem" when the host has no author-set role at all.
@@ -111,21 +127,28 @@ export class UIActionItem extends UIElement {
111
127
  }
112
128
 
113
129
  #stamp() {
114
- if (this.querySelector('[slot="text"]')) return;
130
+ if (this.#ownChild('[slot="text"]')) return;
115
131
 
116
- if (this.icon) {
117
- const iconEl = document.createElement('icon-ui');
132
+ if (this.icon && !this.#ownChild('[slot="icon"]')) {
133
+ const iconEl = this.#stampMark(document.createElement('icon-ui'));
118
134
  iconEl.setAttribute('slot', 'icon');
119
135
  iconEl.setAttribute('name', this.icon);
120
136
  this.appendChild(iconEl);
121
137
  }
122
138
 
123
139
  if (this.text) {
124
- const span = document.createElement('span');
140
+ const span = this.#stampMark(document.createElement('span'));
125
141
  span.setAttribute('slot', 'text');
126
142
  span.textContent = this.text;
127
143
  this.appendChild(span);
128
144
  }
145
+
146
+ if (this.subtitle && !this.#ownChild('[slot="subtitle"]')) {
147
+ const sub = this.#stampMark(document.createElement('span'));
148
+ sub.setAttribute('slot', 'subtitle');
149
+ sub.textContent = this.subtitle;
150
+ this.appendChild(sub);
151
+ }
129
152
  }
130
153
 
131
154
  #syncAria() {
@@ -139,21 +162,39 @@ export class UIActionItem extends UIElement {
139
162
  }
140
163
 
141
164
  render() {
142
- const iconEl = this.querySelector('[slot="icon"]');
165
+ // Sync icon — only touch elements we stamped.
166
+ const iconEl = this.#ownChild('[slot="icon"]');
143
167
  if (this.icon) {
144
- if (iconEl) iconEl.setAttribute('name', this.icon);
145
- else {
146
- const el = document.createElement('icon-ui');
168
+ if (iconEl) {
169
+ if (this.#wasStamped(iconEl)) iconEl.setAttribute('name', this.icon);
170
+ } else {
171
+ const el = this.#stampMark(document.createElement('icon-ui'));
147
172
  el.setAttribute('slot', 'icon');
148
173
  el.setAttribute('name', this.icon);
149
174
  this.prepend(el);
150
175
  }
151
- } else if (iconEl) {
176
+ } else if (this.#wasStamped(iconEl)) {
152
177
  iconEl.remove();
153
178
  }
154
179
 
155
- const textEl = this.querySelector('[slot="text"]');
156
- if (textEl) textEl.textContent = this.text;
180
+ // Sync text — only touch elements we stamped.
181
+ const textEl = this.#ownChild('[slot="text"]');
182
+ if (this.#wasStamped(textEl)) textEl.textContent = this.text;
183
+
184
+ // Sync subtitle — only touch elements we stamped.
185
+ const subEl = this.#ownChild('[slot="subtitle"]');
186
+ if (this.subtitle) {
187
+ if (subEl) {
188
+ if (this.#wasStamped(subEl)) subEl.textContent = this.subtitle;
189
+ } else {
190
+ const sub = this.#stampMark(document.createElement('span'));
191
+ sub.setAttribute('slot', 'subtitle');
192
+ sub.textContent = this.subtitle;
193
+ this.appendChild(sub);
194
+ }
195
+ } else if (this.#wasStamped(subEl)) {
196
+ subEl.remove();
197
+ }
157
198
 
158
199
  this.#syncAria();
159
200
  }
@@ -47,6 +47,8 @@ action-item-ui:hover [slot="icon"] {
47
47
 
48
48
  --action-item-font-size: var(--a-ui-size);
49
49
  --action-item-icon-size: var(--action-item-font-size);
50
+ --action-item-subtitle-size: var(--a-ui-sm);
51
+ --action-item-subtitle-fg: var(--a-fg-muted);
50
52
 
51
53
  --action-item-focus-ring: var(--a-focus-ring);
52
54
 
@@ -98,11 +100,49 @@ action-item-ui:hover [slot="icon"] {
98
100
  text-overflow: ellipsis;
99
101
  }
100
102
 
101
- /* Default slot (trailing content: kbd, badge, caret) pushed to far right */
102
- & > :not([slot="icon"]):not([slot="text"]) {
103
+ /* Trailing (shortcut hint, badge, caret) pinned to the far edge.
104
+ Converged onto <menu-item-ui>'s named-slot contract (#1363 C5); the
105
+ unnamed default slot this row previously used for trailing content had
106
+ zero known consumers (verified across the monorepo at dispatch time —
107
+ see MIGRATION GUIDE) and is retired in favor of an explicit slot. */
108
+ [slot="trailing"] {
103
109
  flex-shrink: 0;
104
110
  margin-inline-start: auto;
105
- color: var(--action-item-icon-fg);
111
+ }
112
+
113
+ /* ── Subtitle — two-line anatomy, mirrors <menu-item-ui> ──
114
+ Content-driven: a present [slot="subtitle"] switches the row to a
115
+ grid so the subtitle sits under the label while icon and trailing
116
+ content span both lines. */
117
+ :scope:has(> [slot="subtitle"]) {
118
+ display: grid;
119
+ grid-template-columns: auto 1fr auto;
120
+ align-items: center;
121
+ column-gap: var(--action-item-gap);
122
+ row-gap: 0;
123
+ }
124
+ :scope:has(> [slot="subtitle"]) > [slot="icon"] {
125
+ grid-column: 1;
126
+ grid-row: 1 / span 2;
127
+ }
128
+ :scope:has(> [slot="subtitle"]) > [slot="text"] {
129
+ grid-column: 2;
130
+ grid-row: 1;
131
+ }
132
+ :scope:has(> [slot="subtitle"]) > [slot="trailing"] {
133
+ grid-column: 3;
134
+ grid-row: 1 / span 2;
135
+ margin-inline-start: 0;
136
+ }
137
+ :scope > [slot="subtitle"] {
138
+ grid-column: 2;
139
+ grid-row: 2;
140
+ min-width: 0;
141
+ font-size: var(--action-item-subtitle-size);
142
+ color: var(--action-item-subtitle-fg);
143
+ white-space: nowrap;
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
106
146
  }
107
147
 
108
148
  /* Variant: danger (destructive action) — only remaps tokens */
@@ -38,10 +38,12 @@ export class UIActionItem extends UIElement {
38
38
  disabled: boolean;
39
39
  /** Leading icon name (Phosphor). */
40
40
  icon: string;
41
+ /** Optional secondary description line rendered under the label. */
42
+ subtitle: string;
41
43
  /** Action label. */
42
44
  text: string;
43
45
  /** Identifier passed to the action-list change/activate handlers. */
44
46
  value: string;
45
- /** Visual variant (default | accent | danger). */
46
- variant: string;
47
+ /** Visual variant (default | danger). */
48
+ variant: 'default' | 'danger';
47
49
  }
@@ -36,6 +36,8 @@ states:
36
36
  traits: []
37
37
  tokens: {}
38
38
  a2ui:
39
+ allowedChildren:
40
+ - ActionItem
39
41
  rules:
40
42
  - rule: 'Hosts <action-item-ui> children as a vertical command list inline in content surfaces.'
41
43
  reason: 'Cluster contract.'
@@ -43,6 +45,8 @@ a2ui:
43
45
  reason: 'Inline vs popover.'
44
46
  - rule: 'Typical use: command palettes, settings panels, agent suggestion lists.'
45
47
  reason: 'Surface examples.'
48
+ - rule: 'For a persisted, non-firing single selection (highlight the current row, no keyboard-activated command) use <list-ui selectable> instead — action-list-ui always fires and never holds a selected state.'
49
+ reason: 'Container-level decision (#1363 C5): kept as its own component rather than a <list-ui> mode axis; rationale in gh#1374 Findings.'
46
50
  anti_patterns: []
47
51
  examples:
48
52
  - name: basic-action-list
@@ -79,3 +83,4 @@ related:
79
83
  - ActionItem
80
84
  - Menu
81
85
  - Button
86
+ - List
@@ -70,6 +70,7 @@
70
70
  "icon"
71
71
  ],
72
72
  "name": "UIAdiaMark",
73
+ "parts": {},
73
74
  "related": [
74
75
  "AdiaWordmark",
75
76
  "Icon",
@@ -67,6 +67,7 @@
67
67
  "identity"
68
68
  ],
69
69
  "name": "UIAdiaWordmark",
70
+ "parts": {},
70
71
  "related": [
71
72
  "AdiaMark",
72
73
  "Icon",
@@ -79,6 +79,7 @@
79
79
  "attachment"
80
80
  ],
81
81
  "name": "UIAgentArtifact",
82
+ "parts": {},
82
83
  "related": [
83
84
  "card-ui",
84
85
  "code-ui"
@@ -71,15 +71,16 @@
71
71
  "bookmark"
72
72
  ],
73
73
  "name": "UIAgentFeedbackBar",
74
+ "parts": {
75
+ "default": {
76
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#1454). `#build()` unconditionally wipes the host (`this.innerHTML = ''`) and rebuilds a fixed thumbs-up/thumbs-down/save row from props — no pre-existing children are captured or preserved."
77
+ }
78
+ },
74
79
  "related": [
75
80
  "agent-suggestions-ui",
76
81
  "agent-trace-ui"
77
82
  ],
78
- "slots": {
79
- "default": {
80
- "description": "Default slot — primary child content."
81
- }
82
- },
83
+ "slots": {},
83
84
  "states": [
84
85
  {
85
86
  "description": "Default, ready for interaction.",
@@ -44,9 +44,13 @@ events:
44
44
  description: Rating value selected by the user.
45
45
  feedback-save:
46
46
  description: "Fired on feedback-save."
47
- slots:
47
+ parts:
48
48
  default:
49
- description: "Default slot — primary child content."
49
+ description: >-
50
+ Template-owned anatomy, not a light-DOM insertion point (gh#1454).
51
+ `#build()` unconditionally wipes the host (`this.innerHTML = ''`) and
52
+ rebuilds a fixed thumbs-up/thumbs-down/save row from props — no
53
+ pre-existing children are captured or preserved.
50
54
  states:
51
55
  - name: idle
52
56
  description: Default, ready for interaction.
@@ -79,6 +79,7 @@
79
79
  "clarify"
80
80
  ],
81
81
  "name": "UIAgentQuestions",
82
+ "parts": {},
82
83
  "related": [
83
84
  "agent-suggestions-ui",
84
85
  "agent-reasoning-ui"
@@ -105,15 +105,16 @@
105
105
  "iteration"
106
106
  ],
107
107
  "name": "UIAgentReasoning",
108
+ "parts": {
109
+ "default": {
110
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#938, gh#1454): the component rebuilds its body from the addStep()/addThought() pipeline (`this.innerHTML = ''` then rebuild) and does not consume authored children."
111
+ }
112
+ },
108
113
  "related": [
109
114
  "agent-trace-ui",
110
115
  "pipeline-status-ui"
111
116
  ],
112
- "slots": {
113
- "default": {
114
- "description": "Default slot — NOT a step-authoring surface: the component rebuilds its body from the addStep()/addThought() pipeline and does not consume authored children (gh#938)."
115
- }
116
- },
117
+ "slots": {},
117
118
  "states": [
118
119
  {
119
120
  "description": "Default, ready for interaction.",
@@ -55,9 +55,13 @@ events:
55
55
  collapsed:
56
56
  type: boolean
57
57
  description: Whether the reasoning section is now collapsed.
58
- slots:
58
+ parts:
59
59
  default:
60
- description: "Default slot — NOT a step-authoring surface: the component rebuilds its body from the addStep()/addThought() pipeline and does not consume authored children (gh#938)."
60
+ description: >-
61
+ Template-owned anatomy, not a light-DOM insertion point (gh#938,
62
+ gh#1454): the component rebuilds its body from the
63
+ addStep()/addThought() pipeline (`this.innerHTML = ''` then rebuild)
64
+ and does not consume authored children.
61
65
  states:
62
66
  - name: idle
63
67
  description: Default, ready for interaction.
@@ -22,13 +22,21 @@
22
22
  "default": false
23
23
  },
24
24
  "size": {
25
- "description": "sm | md",
25
+ "description": "sm | md — forwarded to each chip's <button-ui size>.",
26
26
  "type": "string",
27
+ "enum": [
28
+ "sm",
29
+ "md"
30
+ ],
27
31
  "default": "sm"
28
32
  },
29
33
  "variant": {
30
- "description": "outline | ghost | subtle",
34
+ "description": "outline | ghost forwarded to each chip's <button-ui variant>.",
31
35
  "type": "string",
36
+ "enum": [
37
+ "outline",
38
+ "ghost"
39
+ ],
32
40
  "default": "outline"
33
41
  }
34
42
  },
@@ -75,6 +83,7 @@
75
83
  "quick replies"
76
84
  ],
77
85
  "name": "UIAgentSuggestions",
86
+ "parts": {},
78
87
  "related": [
79
88
  "agent-questions-ui",
80
89
  "agent-feedback-bar-ui"
@@ -29,7 +29,8 @@
29
29
  * });
30
30
  *
31
31
  * Attributes:
32
- * variant — outline (default) | ghost | subtle
32
+ * variant — outline (default) | ghost (forwarded to each chip's button-ui;
33
+ * "subtle" is not a real button-ui variant — dropped gh#1378)
33
34
  * size — sm (default) | md
34
35
  * disabled — disable all chips
35
36
  *
@@ -32,10 +32,10 @@ export type AgentSuggestionsSuggestionSelectEvent = CustomEvent<AgentSuggestions
32
32
  export class UIAgentSuggestions extends UIElement {
33
33
  /** Disable all chips. */
34
34
  disabled: boolean;
35
- /** sm | md */
36
- size: string;
37
- /** outline | ghost | subtle */
38
- variant: string;
35
+ /** sm | md — forwarded to each chip's <button-ui size>. */
36
+ size: 'sm' | 'md';
37
+ /** outline | ghost forwarded to each chip's <button-ui variant>. */
38
+ variant: 'outline' | 'ghost';
39
39
 
40
40
  addEventListener(type: 'suggestion-select', listener: (ev: AgentSuggestionsSuggestionSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
41
41
  addEventListener<K extends keyof HTMLElementEventMap>(
@@ -25,13 +25,15 @@ props:
25
25
  default: false
26
26
  reflect: true
27
27
  size:
28
- description: sm | md
28
+ description: sm | md — forwarded to each chip's <button-ui size>.
29
29
  type: string
30
30
  default: sm
31
+ enum: [sm, md]
31
32
  variant:
32
- description: outline | ghost | subtle
33
+ description: outline | ghost forwarded to each chip's <button-ui variant>.
33
34
  type: string
34
35
  default: outline
36
+ enum: [outline, ghost]
35
37
  events:
36
38
  suggestion-select:
37
39
  description: "Fired on suggestion-select."
@@ -61,15 +61,16 @@
61
61
  "training feedback"
62
62
  ],
63
63
  "name": "UIAgentTrace",
64
+ "parts": {
65
+ "default": {
66
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#1454). `#buildShell()` unconditionally wipes the host (`this.innerHTML = ''`) and rebuilds a `<details>` root from the `pills`/`metrics`/`feedback` properties — no pre-existing children are captured or preserved."
67
+ }
68
+ },
64
69
  "related": [
65
70
  "agent-reasoning-ui",
66
71
  "agent-feedback-bar-ui"
67
72
  ],
68
- "slots": {
69
- "default": {
70
- "description": "Default slot — primary child content."
71
- }
72
- },
73
+ "slots": {},
73
74
  "states": [
74
75
  {
75
76
  "description": "Default, ready for interaction.",
@@ -29,9 +29,13 @@ events:
29
29
  collapsed:
30
30
  type: boolean
31
31
  description: Whether the trace is now collapsed.
32
- slots:
32
+ parts:
33
33
  default:
34
- description: "Default slot — primary child content."
34
+ description: >-
35
+ Template-owned anatomy, not a light-DOM insertion point (gh#1454).
36
+ `#buildShell()` unconditionally wipes the host (`this.innerHTML = ''`)
37
+ and rebuilds a `<details>` root from the `pills`/`metrics`/`feedback`
38
+ properties — no pre-existing children are captured or preserved.
35
39
  states:
36
40
  - name: idle
37
41
  description: Default, ready for interaction.
@@ -163,6 +163,7 @@
163
163
  "announce"
164
164
  ],
165
165
  "name": "UIAlert",
166
+ "parts": {},
166
167
  "related": [
167
168
  "button"
168
169
  ],
@@ -14,7 +14,7 @@
14
14
 
15
15
  /* ── Typography ── */
16
16
  --alert-font: var(--a-ui-size);
17
- --alert-line-height: var(--a-ui-line-height, 1.5);
17
+ --alert-line-height: var(--a-ui-line-height, var(--a-font-leading-relaxed));
18
18
 
19
19
  /* ── SPEC-006 dunning pattern tokens ── */
20
20
  --alert-amount-font: var(--a-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
@@ -82,6 +82,7 @@
82
82
  "bulk action"
83
83
  ],
84
84
  "name": "UIAnchorBar",
85
+ "parts": {},
85
86
  "related": [],
86
87
  "slots": {
87
88
  "default": {
@@ -58,6 +58,7 @@
58
58
  "nav-rail"
59
59
  ],
60
60
  "name": "UIAside",
61
+ "parts": {},
61
62
  "related": [
62
63
  "app-shell",
63
64
  "drawer",
@@ -23,7 +23,12 @@
23
23
  },
24
24
  "size": {
25
25
  "description": "Forwards to each child <avatar-ui> (sm|md|lg). Empty uses the per-avatar size. For denser or larger sets, set [scale] on an ancestor.",
26
- "type": "string"
26
+ "type": "string",
27
+ "enum": [
28
+ "sm",
29
+ "md",
30
+ "lg"
31
+ ]
27
32
  }
28
33
  },
29
34
  "required": [
@@ -45,6 +50,7 @@
45
50
  "overflow-avatars"
46
51
  ],
47
52
  "name": "UIAvatarGroup",
53
+ "parts": {},
48
54
  "related": [
49
55
  "Avatar",
50
56
  "Tag"
@@ -25,6 +25,7 @@ props:
25
25
  size:
26
26
  description: Forwards to each child <avatar-ui> (sm|md|lg). Empty uses the per-avatar size. For denser or larger sets, set [scale] on an ancestor.
27
27
  type: string
28
+ enum: [sm, md, lg]
28
29
 
29
30
  keywords:
30
31
  - avatar-group
@@ -88,24 +88,25 @@
88
88
  "user"
89
89
  ],
90
90
  "name": "UIAvatar",
91
- "related": [
92
- "input",
93
- "button",
94
- "check-box",
95
- "badge",
96
- "avatar-group"
97
- ],
98
- "slots": {
91
+ "parts": {
99
92
  "icon": {
100
- "description": "Phosphor icon rendered inside the avatar circle (system-event avatars)"
93
+ "description": "Phosphor icon rendered inside the avatar circle (system-event avatars) — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always creates it from the `icon` prop; no consumer override path exists in source."
101
94
  },
102
95
  "img": {
103
- "description": "Avatar image element"
96
+ "description": "Avatar image element — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always creates it from the `src` prop; no consumer override path exists in source."
104
97
  },
105
98
  "initials": {
106
- "description": "Initials text span"
99
+ "description": "Initials text span — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always creates it from the `text` prop; no consumer override path exists in source."
107
100
  }
108
101
  },
102
+ "related": [
103
+ "input",
104
+ "button",
105
+ "check-box",
106
+ "badge",
107
+ "avatar-group"
108
+ ],
109
+ "slots": {},
109
110
  "states": [
110
111
  {
111
112
  "description": "Default, ready for interaction.",
@@ -35,5 +35,5 @@ export class UIAvatarGroup extends UIElement {
35
35
  /** Maximum avatars to show before the +N overflow indicator. */
36
36
  max: number;
37
37
  /** Forwards to each child <avatar-ui> (sm|md|lg). Empty uses the per-avatar size. For denser or larger sets, set [scale] on an ancestor. */
38
- size: string;
38
+ size: 'sm' | 'md' | 'lg';
39
39
  }