@adia-ai/web-components 0.4.6 → 0.4.8

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 (399) hide show
  1. package/README.md +39 -0
  2. package/USAGE.md +29 -9
  3. package/components/accordion/accordion.a2ui.json +3 -0
  4. package/components/accordion/accordion.d.ts +27 -0
  5. package/components/accordion/accordion.js +10 -117
  6. package/components/accordion/accordion.yaml +4 -0
  7. package/components/accordion/class.js +132 -0
  8. package/components/action-list/action-list.a2ui.json +3 -0
  9. package/components/action-list/action-list.d.ts +25 -0
  10. package/components/action-list/action-list.js +9 -140
  11. package/components/action-list/action-list.yaml +4 -0
  12. package/components/action-list/class.js +156 -0
  13. package/components/agent-artifact/agent-artifact.a2ui.json +4 -0
  14. package/components/agent-artifact/agent-artifact.d.ts +35 -0
  15. package/components/agent-artifact/agent-artifact.js +8 -181
  16. package/components/agent-artifact/agent-artifact.yaml +5 -0
  17. package/components/agent-artifact/class.js +200 -0
  18. package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +3 -0
  19. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +33 -0
  20. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  21. package/components/agent-feedback-bar/agent-feedback-bar.yaml +4 -0
  22. package/components/agent-feedback-bar/class.js +162 -0
  23. package/components/agent-questions/agent-questions.a2ui.json +3 -0
  24. package/components/agent-questions/agent-questions.d.ts +33 -0
  25. package/components/agent-questions/agent-questions.js +8 -180
  26. package/components/agent-questions/agent-questions.yaml +4 -0
  27. package/components/agent-questions/class.js +199 -0
  28. package/components/agent-reasoning/agent-reasoning.a2ui.json +4 -0
  29. package/components/agent-reasoning/agent-reasoning.d.ts +37 -0
  30. package/components/agent-reasoning/agent-reasoning.js +8 -494
  31. package/components/agent-reasoning/agent-reasoning.yaml +5 -0
  32. package/components/agent-reasoning/class.js +513 -0
  33. package/components/agent-suggestions/agent-suggestions.a2ui.json +3 -0
  34. package/components/agent-suggestions/agent-suggestions.d.ts +31 -0
  35. package/components/agent-suggestions/agent-suggestions.js +8 -78
  36. package/components/agent-suggestions/agent-suggestions.yaml +4 -0
  37. package/components/agent-suggestions/class.js +97 -0
  38. package/components/agent-trace/agent-trace.a2ui.json +1 -0
  39. package/components/agent-trace/agent-trace.d.ts +29 -0
  40. package/components/alert/alert.a2ui.json +1 -0
  41. package/components/alert/alert.d.ts +39 -0
  42. package/components/alert/alert.js +8 -175
  43. package/components/alert/class.js +194 -0
  44. package/components/aside/aside.a2ui.json +1 -0
  45. package/components/avatar/avatar.a2ui.json +3 -0
  46. package/components/avatar/avatar.d.ts +28 -0
  47. package/components/avatar/avatar.js +9 -159
  48. package/components/avatar/avatar.yaml +4 -0
  49. package/components/avatar/class.js +173 -0
  50. package/components/badge/badge.a2ui.json +3 -0
  51. package/components/badge/badge.d.ts +28 -0
  52. package/components/badge/badge.js +9 -75
  53. package/components/badge/badge.yaml +4 -0
  54. package/components/badge/class.js +93 -0
  55. package/components/block/block.a2ui.json +1 -0
  56. package/components/block/block.d.ts +20 -0
  57. package/components/block/block.js +9 -15
  58. package/components/block/class.js +33 -0
  59. package/components/breadcrumb/breadcrumb.a2ui.json +5 -0
  60. package/components/breadcrumb/breadcrumb.d.ts +24 -0
  61. package/components/breadcrumb/breadcrumb.js +8 -113
  62. package/components/breadcrumb/breadcrumb.yaml +6 -0
  63. package/components/breadcrumb/class.js +132 -0
  64. package/components/button/button.a2ui.json +3 -0
  65. package/components/button/button.d.ts +44 -0
  66. package/components/button/button.js +15 -66
  67. package/components/button/button.yaml +5 -0
  68. package/components/button/class.js +80 -0
  69. package/components/calendar-picker/calendar-picker.a2ui.json +7 -1
  70. package/components/calendar-picker/calendar-picker.js +8 -332
  71. package/components/calendar-picker/calendar-picker.yaml +51 -177
  72. package/components/calendar-picker/class.js +351 -0
  73. package/components/canvas/canvas.a2ui.json +7 -1
  74. package/components/canvas/canvas.d.ts +33 -0
  75. package/components/canvas/canvas.yaml +29 -36
  76. package/components/card/card.a2ui.json +4 -0
  77. package/components/card/card.d.ts +37 -0
  78. package/components/card/card.js +9 -50
  79. package/components/card/card.yaml +171 -433
  80. package/components/card/class.js +68 -0
  81. package/components/chart/chart.a2ui.json +1 -0
  82. package/components/chart/chart.d.ts +55 -0
  83. package/components/chart/chart.js +8 -2131
  84. package/components/chart/class.js +2150 -0
  85. package/components/chart-legend/chart-legend.a2ui.json +4 -0
  86. package/components/chart-legend/chart-legend.d.ts +37 -0
  87. package/components/chart-legend/chart-legend.js +8 -197
  88. package/components/chart-legend/chart-legend.yaml +5 -0
  89. package/components/chart-legend/class.js +215 -0
  90. package/components/chat-thread/chat-thread.a2ui.json +1 -0
  91. package/components/chat-thread/chat-thread.d.ts +27 -0
  92. package/components/chat-thread/chat-thread.js +8 -157
  93. package/components/chat-thread/class.js +176 -0
  94. package/components/check/check.a2ui.json +1 -0
  95. package/components/check/check.js +11 -52
  96. package/components/check/class.js +68 -0
  97. package/components/code/class.js +501 -0
  98. package/components/code/code.a2ui.json +1 -0
  99. package/components/code/code.js +8 -482
  100. package/components/col/class.js +30 -0
  101. package/components/col/col.a2ui.json +1 -0
  102. package/components/col/col.d.ts +24 -0
  103. package/components/col/col.js +10 -13
  104. package/components/color-picker/class.js +550 -0
  105. package/components/color-picker/color-picker.a2ui.json +3 -0
  106. package/components/color-picker/color-picker.js +8 -531
  107. package/components/color-picker/color-picker.yaml +4 -0
  108. package/components/command/class.js +364 -0
  109. package/components/command/command.a2ui.json +4 -0
  110. package/components/command/command.d.ts +31 -0
  111. package/components/command/command.js +8 -345
  112. package/components/command/command.yaml +105 -124
  113. package/components/demo-toggle/class.js +153 -0
  114. package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
  115. package/components/demo-toggle/demo-toggle.d.ts +33 -0
  116. package/components/demo-toggle/demo-toggle.js +8 -135
  117. package/components/description-list/class.js +86 -0
  118. package/components/description-list/description-list.a2ui.json +1 -0
  119. package/components/description-list/description-list.d.ts +22 -0
  120. package/components/description-list/description-list.js +8 -67
  121. package/components/divider/class.js +57 -0
  122. package/components/divider/divider.a2ui.json +1 -0
  123. package/components/divider/divider.d.ts +20 -0
  124. package/components/divider/divider.js +10 -40
  125. package/components/drawer/class.js +306 -0
  126. package/components/drawer/drawer.a2ui.json +1 -0
  127. package/components/drawer/drawer.d.ts +35 -0
  128. package/components/drawer/drawer.js +8 -287
  129. package/components/embed/class.js +73 -0
  130. package/components/embed/embed.a2ui.json +1 -0
  131. package/components/embed/embed.d.ts +24 -0
  132. package/components/embed/embed.js +9 -55
  133. package/components/empty-state/class.js +108 -0
  134. package/components/empty-state/empty-state.a2ui.json +3 -0
  135. package/components/empty-state/empty-state.d.ts +22 -0
  136. package/components/empty-state/empty-state.js +9 -90
  137. package/components/empty-state/empty-state.yaml +4 -0
  138. package/components/feed/class.js +381 -0
  139. package/components/feed/feed.a2ui.json +9 -1
  140. package/components/feed/feed.d.ts +29 -0
  141. package/components/feed/feed.js +9 -367
  142. package/components/feed/feed.yaml +8 -1
  143. package/components/field/class.js +266 -0
  144. package/components/field/field.a2ui.json +1 -0
  145. package/components/field/field.d.ts +24 -0
  146. package/components/field/field.js +8 -247
  147. package/components/fields/class.js +106 -0
  148. package/components/fields/fields.a2ui.json +1 -0
  149. package/components/fields/fields.d.ts +20 -0
  150. package/components/fields/fields.js +8 -87
  151. package/components/footer/footer.a2ui.json +1 -0
  152. package/components/grid/class.js +31 -0
  153. package/components/grid/grid.a2ui.json +1 -0
  154. package/components/grid/grid.d.ts +24 -0
  155. package/components/grid/grid.js +10 -14
  156. package/components/header/header.a2ui.json +1 -0
  157. package/components/heatmap/class.js +305 -0
  158. package/components/heatmap/heatmap.a2ui.json +1 -0
  159. package/components/heatmap/heatmap.d.ts +43 -0
  160. package/components/heatmap/heatmap.js +8 -286
  161. package/components/icon/class.js +54 -0
  162. package/components/icon/icon.a2ui.json +1 -0
  163. package/components/icon/icon.d.ts +24 -0
  164. package/components/icon/icon.js +13 -40
  165. package/components/image/class.js +112 -0
  166. package/components/image/image.a2ui.json +3 -0
  167. package/components/image/image.d.ts +34 -0
  168. package/components/image/image.js +9 -94
  169. package/components/image/image.yaml +4 -0
  170. package/components/index.js +8 -0
  171. package/components/input/class.js +773 -0
  172. package/components/input/input.a2ui.json +7 -0
  173. package/components/input/input.js +8 -755
  174. package/components/input/input.yaml +177 -442
  175. package/components/inspector/class.js +142 -0
  176. package/components/inspector/inspector.a2ui.json +13 -1
  177. package/components/inspector/inspector.d.ts +18 -0
  178. package/components/inspector/inspector.js +8 -124
  179. package/components/inspector/inspector.yaml +21 -30
  180. package/components/kbd/class.js +34 -0
  181. package/components/kbd/kbd.a2ui.json +4 -0
  182. package/components/kbd/kbd.d.ts +18 -0
  183. package/components/kbd/kbd.js +10 -17
  184. package/components/kbd/kbd.yaml +54 -185
  185. package/components/link/class.js +187 -0
  186. package/components/link/link.a2ui.json +1 -0
  187. package/components/link/link.d.ts +65 -0
  188. package/components/link/link.js +8 -168
  189. package/components/list/class.js +249 -0
  190. package/components/list/list.a2ui.json +3 -0
  191. package/components/list/list.d.ts +33 -0
  192. package/components/list/list.js +9 -231
  193. package/components/list/list.yaml +4 -0
  194. package/components/menu/class.js +332 -0
  195. package/components/menu/menu.a2ui.json +3 -0
  196. package/components/menu/menu.d.ts +31 -0
  197. package/components/menu/menu.js +11 -316
  198. package/components/menu/menu.yaml +4 -0
  199. package/components/modal/class.js +231 -0
  200. package/components/modal/modal.a2ui.json +6 -1
  201. package/components/modal/modal.d.ts +33 -0
  202. package/components/modal/modal.js +8 -212
  203. package/components/modal/modal.yaml +19 -39
  204. package/components/nav/class.js +150 -0
  205. package/components/nav/nav.a2ui.json +1 -0
  206. package/components/nav/nav.d.ts +41 -0
  207. package/components/nav/nav.js +8 -131
  208. package/components/nav-group/class.js +152 -0
  209. package/components/nav-group/nav-group.a2ui.json +1 -0
  210. package/components/nav-group/nav-group.d.ts +45 -0
  211. package/components/nav-group/nav-group.js +9 -134
  212. package/components/nav-item/class.js +86 -0
  213. package/components/nav-item/nav-item.a2ui.json +1 -0
  214. package/components/nav-item/nav-item.d.ts +47 -0
  215. package/components/nav-item/nav-item.js +10 -69
  216. package/components/noodles/class.js +510 -0
  217. package/components/noodles/noodles.a2ui.json +1 -0
  218. package/components/noodles/noodles.d.ts +47 -0
  219. package/components/noodles/noodles.js +9 -493
  220. package/components/option-card/class.js +167 -0
  221. package/components/option-card/option-card.a2ui.json +3 -0
  222. package/components/option-card/option-card.js +8 -149
  223. package/components/option-card/option-card.yaml +4 -0
  224. package/components/otp-input/class.js +180 -0
  225. package/components/otp-input/otp-input.a2ui.json +6 -1
  226. package/components/otp-input/otp-input.js +9 -162
  227. package/components/otp-input/otp-input.yaml +45 -174
  228. package/components/page/class.js +97 -0
  229. package/components/page/page.a2ui.json +1 -0
  230. package/components/page/page.d.ts +47 -0
  231. package/components/page/page.js +8 -79
  232. package/components/pagination/class.js +195 -0
  233. package/components/pagination/pagination.a2ui.json +1 -0
  234. package/components/pagination/pagination.d.ts +33 -0
  235. package/components/pagination/pagination.js +9 -177
  236. package/components/pane/class.js +186 -0
  237. package/components/pane/pane.a2ui.json +20 -2
  238. package/components/pane/pane.d.ts +41 -0
  239. package/components/pane/pane.js +8 -167
  240. package/components/pane/pane.yaml +64 -158
  241. package/components/pipeline-status/class.js +189 -0
  242. package/components/pipeline-status/pipeline-status.a2ui.json +8 -1
  243. package/components/pipeline-status/pipeline-status.d.ts +22 -0
  244. package/components/pipeline-status/pipeline-status.js +9 -172
  245. package/components/pipeline-status/pipeline-status.yaml +34 -72
  246. package/components/popover/class.js +194 -0
  247. package/components/popover/popover.a2ui.json +1 -0
  248. package/components/popover/popover.d.ts +24 -0
  249. package/components/popover/popover.js +9 -176
  250. package/components/progress/class.js +74 -0
  251. package/components/progress/progress.a2ui.json +4 -0
  252. package/components/progress/progress.d.ts +20 -0
  253. package/components/progress/progress.js +10 -57
  254. package/components/progress/progress.yaml +124 -287
  255. package/components/progress-row/class.js +110 -0
  256. package/components/progress-row/progress-row.a2ui.json +3 -0
  257. package/components/progress-row/progress-row.d.ts +24 -0
  258. package/components/progress-row/progress-row.js +8 -92
  259. package/components/progress-row/progress-row.yaml +4 -0
  260. package/components/radio/class.js +83 -0
  261. package/components/radio/radio.a2ui.json +1 -0
  262. package/components/radio/radio.js +11 -67
  263. package/components/range/class.js +194 -0
  264. package/components/range/range.a2ui.json +1 -0
  265. package/components/range/range.js +9 -176
  266. package/components/rating/class.js +148 -0
  267. package/components/rating/rating.a2ui.json +1 -0
  268. package/components/rating/rating.js +9 -130
  269. package/components/richtext/class.js +87 -0
  270. package/components/richtext/richtext.a2ui.json +8 -1
  271. package/components/richtext/richtext.d.ts +20 -0
  272. package/components/richtext/richtext.js +8 -68
  273. package/components/richtext/richtext.yaml +30 -65
  274. package/components/row/class.js +50 -0
  275. package/components/row/row.a2ui.json +1 -0
  276. package/components/row/row.d.ts +37 -0
  277. package/components/row/row.js +10 -33
  278. package/components/search/class.js +134 -0
  279. package/components/search/search.a2ui.json +1 -0
  280. package/components/search/search.js +10 -117
  281. package/components/section/section.a2ui.json +1 -0
  282. package/components/segment/class.js +62 -0
  283. package/components/segment/segment.a2ui.json +3 -0
  284. package/components/segment/segment.d.ts +26 -0
  285. package/components/segment/segment.js +10 -45
  286. package/components/segment/segment.yaml +4 -0
  287. package/components/segmented/class.js +165 -0
  288. package/components/segmented/segmented.a2ui.json +5 -0
  289. package/components/segmented/segmented.js +10 -148
  290. package/components/segmented/segmented.yaml +41 -59
  291. package/components/select/class.js +408 -0
  292. package/components/select/select.a2ui.json +3 -0
  293. package/components/select/select.js +15 -396
  294. package/components/select/select.yaml +4 -0
  295. package/components/skeleton/class.js +52 -0
  296. package/components/skeleton/skeleton.a2ui.json +1 -0
  297. package/components/skeleton/skeleton.d.ts +24 -0
  298. package/components/skeleton/skeleton.js +8 -34
  299. package/components/slider/class.js +184 -0
  300. package/components/slider/slider.a2ui.json +1 -0
  301. package/components/slider/slider.js +9 -166
  302. package/components/stack/class.js +28 -0
  303. package/components/stack/stack.a2ui.json +1 -0
  304. package/components/stack/stack.d.ts +18 -0
  305. package/components/stack/stack.js +10 -11
  306. package/components/stat/stat.a2ui.json +1 -0
  307. package/components/step-progress/class.js +98 -0
  308. package/components/step-progress/step-progress.a2ui.json +1 -0
  309. package/components/step-progress/step-progress.d.ts +28 -0
  310. package/components/step-progress/step-progress.js +8 -79
  311. package/components/stepper/class.js +126 -0
  312. package/components/stepper/stepper.a2ui.json +3 -0
  313. package/components/stepper/stepper.d.ts +20 -0
  314. package/components/stepper/stepper.js +9 -112
  315. package/components/stepper/stepper.yaml +4 -0
  316. package/components/stream/class.js +109 -0
  317. package/components/stream/stream.a2ui.json +1 -0
  318. package/components/stream/stream.d.ts +33 -0
  319. package/components/stream/stream.js +8 -90
  320. package/components/swatch/class.js +131 -0
  321. package/components/swatch/swatch.a2ui.json +1 -0
  322. package/components/swatch/swatch.d.ts +29 -0
  323. package/components/swatch/swatch.js +8 -112
  324. package/components/swiper/class.js +373 -0
  325. package/components/swiper/swiper.a2ui.json +7 -0
  326. package/components/swiper/swiper.d.ts +45 -0
  327. package/components/swiper/swiper.js +8 -354
  328. package/components/swiper/swiper.yaml +72 -212
  329. package/components/switch/class.js +63 -0
  330. package/components/switch/switch.a2ui.json +7 -1
  331. package/components/switch/switch.js +11 -47
  332. package/components/switch/switch.yaml +70 -265
  333. package/components/table/class.js +1453 -0
  334. package/components/table/table.a2ui.json +7 -0
  335. package/components/table/table.d.ts +55 -0
  336. package/components/table/table.js +8 -1435
  337. package/components/table/table.yaml +8 -0
  338. package/components/table-toolbar/class.js +680 -0
  339. package/components/table-toolbar/table-toolbar.a2ui.json +12 -0
  340. package/components/table-toolbar/table-toolbar.d.ts +49 -0
  341. package/components/table-toolbar/table-toolbar.js +8 -689
  342. package/components/table-toolbar/table-toolbar.yaml +13 -0
  343. package/components/tabs/class.js +242 -0
  344. package/components/tabs/tabs.a2ui.json +3 -0
  345. package/components/tabs/tabs.d.ts +31 -0
  346. package/components/tabs/tabs.js +8 -223
  347. package/components/tabs/tabs.yaml +4 -0
  348. package/components/tag/class.js +99 -0
  349. package/components/tag/tag.a2ui.json +1 -0
  350. package/components/tag/tag.d.ts +37 -0
  351. package/components/tag/tag.js +8 -80
  352. package/components/text/class.js +46 -0
  353. package/components/text/text.a2ui.json +1 -0
  354. package/components/text/text.d.ts +26 -0
  355. package/components/text/text.js +9 -28
  356. package/components/textarea/class.js +134 -0
  357. package/components/textarea/textarea.a2ui.json +1 -0
  358. package/components/textarea/textarea.js +11 -118
  359. package/components/timeline/class.js +176 -0
  360. package/components/timeline/timeline.a2ui.json +18 -1
  361. package/components/timeline/timeline.d.ts +36 -0
  362. package/components/timeline/timeline.js +9 -162
  363. package/components/timeline/timeline.yaml +14 -1
  364. package/components/toast/class.js +92 -0
  365. package/components/toast/toast.a2ui.json +1 -0
  366. package/components/toast/toast.d.ts +33 -0
  367. package/components/toast/toast.js +9 -76
  368. package/components/toggle-group/class.js +154 -0
  369. package/components/toggle-group/toggle-group.a2ui.json +1 -0
  370. package/components/toggle-group/toggle-group.d.ts +29 -0
  371. package/components/toggle-group/toggle-group.js +11 -140
  372. package/components/toggle-scheme/class.js +286 -0
  373. package/components/toggle-scheme/toggle-scheme.a2ui.json +3 -0
  374. package/components/toggle-scheme/toggle-scheme.d.ts +51 -0
  375. package/components/toggle-scheme/toggle-scheme.js +8 -268
  376. package/components/toggle-scheme/toggle-scheme.yaml +4 -0
  377. package/components/toolbar/class.js +388 -0
  378. package/components/toolbar/toolbar.a2ui.json +3 -0
  379. package/components/toolbar/toolbar.d.ts +24 -0
  380. package/components/toolbar/toolbar.js +10 -376
  381. package/components/toolbar/toolbar.yaml +4 -0
  382. package/components/tooltip/class.js +299 -0
  383. package/components/tooltip/tooltip.a2ui.json +1 -0
  384. package/components/tooltip/tooltip.d.ts +28 -0
  385. package/components/tooltip/tooltip.js +8 -280
  386. package/components/tree/class.js +245 -0
  387. package/components/tree/tree.a2ui.json +3 -0
  388. package/components/tree/tree.d.ts +25 -0
  389. package/components/tree/tree.js +9 -244
  390. package/components/tree/tree.yaml +4 -0
  391. package/components/upload/class.js +199 -0
  392. package/components/upload/upload.a2ui.json +1 -0
  393. package/components/upload/upload.js +11 -183
  394. package/core/icons-phosphor.js +93 -0
  395. package/core/icons.js +92 -90
  396. package/core/index.js +5 -0
  397. package/index.d.ts +160 -5
  398. package/index.js +7 -0
  399. package/package.json +7 -2
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Non-side-effect class export for `<action-list-ui>` (+ co-located primitives).
3
+ *
4
+ * Importing this file gives you the class(es) without auto-registering the tag.
5
+ * Useful for test isolation, subclassing with tag-name override, or selective
6
+ * composition.
7
+ *
8
+ * The auto-register path stays at `@adia-ai/web-components/components/action-list`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <action-list-ui>
16
+ * <action-item-ui icon="plus" text="New Project" value="new"></action-item-ui>
17
+ * <action-item-ui icon="users" text="Invite Team" value="invite"></action-item-ui>
18
+ * <action-item-ui icon="download" text="Export Data" value="export"></action-item-ui>
19
+ * </action-list-ui>
20
+ *
21
+ * Inline (non-dropdown) list of command actions. Think of it as a menu that
22
+ * stays open — useful for quick-actions cards, settings rails, sidebar shortcuts.
23
+ *
24
+ * Differs from <menu-ui> (which renders in a popover) and <list-ui> (which is
25
+ * passive — no hover/click semantics).
26
+ *
27
+ * Fires `action` CustomEvent with { value, text, item } when an item is clicked
28
+ * or activated via keyboard (Enter / Space). Keyboard nav: ArrowUp/Down, Home/End.
29
+ */
30
+
31
+ import { UIElement } from '../../core/element.js';
32
+
33
+ export class UIActionList extends UIElement {
34
+ static properties = {};
35
+ static template = () => null;
36
+
37
+ #bound = false;
38
+
39
+ connected() {
40
+ this.setAttribute('role', 'list');
41
+ if (!this.#bound) {
42
+ this.#bound = true;
43
+ this.addEventListener('click', this.#onClick);
44
+ this.addEventListener('keydown', this.#onKey);
45
+ }
46
+ }
47
+
48
+ disconnected() {
49
+ this.removeEventListener('click', this.#onClick);
50
+ this.removeEventListener('keydown', this.#onKey);
51
+ this.#bound = false;
52
+ }
53
+
54
+ #items() {
55
+ return Array.from(this.querySelectorAll(':scope > action-item-ui:not([disabled])'));
56
+ }
57
+
58
+ #onClick = (e) => {
59
+ const item = e.target.closest('action-item-ui');
60
+ if (!item || item.hasAttribute('disabled')) return;
61
+ if (!this.contains(item)) return;
62
+ this.dispatchEvent(new CustomEvent('action', {
63
+ bubbles: true,
64
+ detail: { value: item.getAttribute('value') || '', text: item.getAttribute('text') || item.textContent.trim(), item },
65
+ }));
66
+ };
67
+
68
+ #onKey = (e) => {
69
+ const items = this.#items();
70
+ if (!items.length) return;
71
+ const active = document.activeElement?.closest?.('action-item-ui');
72
+ const i = active ? items.indexOf(active) : -1;
73
+ const focus = (idx) => {
74
+ const next = items[(idx + items.length) % items.length];
75
+ next?.focus?.({ preventScroll: true });
76
+ };
77
+ switch (e.key) {
78
+ case 'ArrowDown': e.preventDefault(); focus(i + 1); break;
79
+ case 'ArrowUp': e.preventDefault(); focus(i - 1); break;
80
+ case 'Home': e.preventDefault(); focus(0); break;
81
+ case 'End': e.preventDefault(); focus(items.length - 1); break;
82
+ case 'Enter':
83
+ case ' ': {
84
+ if (active) { e.preventDefault(); active.click(); }
85
+ break;
86
+ }
87
+ }
88
+ };
89
+ }
90
+
91
+ export class UIActionItem extends UIElement {
92
+ static properties = {
93
+ icon: { type: String, default: '', reflect: true },
94
+ text: { type: String, default: '', reflect: true },
95
+ value: { type: String, default: '', reflect: true },
96
+ variant: { type: String, default: 'default', reflect: true },
97
+ disabled: { type: Boolean, default: false, reflect: true },
98
+ };
99
+
100
+ static template = () => null;
101
+
102
+ connected() {
103
+ this.setAttribute('role', 'listitem');
104
+ if (!this.hasAttribute('tabindex')) this.setAttribute('tabindex', '0');
105
+ this.#stamp();
106
+ this.#syncAria();
107
+ }
108
+
109
+ #stamp() {
110
+ if (this.querySelector('[slot="text"]')) return;
111
+
112
+ if (this.icon) {
113
+ const iconEl = document.createElement('icon-ui');
114
+ iconEl.setAttribute('slot', 'icon');
115
+ iconEl.setAttribute('name', this.icon);
116
+ this.appendChild(iconEl);
117
+ }
118
+
119
+ if (this.text) {
120
+ const span = document.createElement('span');
121
+ span.setAttribute('slot', 'text');
122
+ span.textContent = this.text;
123
+ this.appendChild(span);
124
+ }
125
+ }
126
+
127
+ #syncAria() {
128
+ if (this.disabled) {
129
+ this.setAttribute('aria-disabled', 'true');
130
+ this.setAttribute('tabindex', '-1');
131
+ } else {
132
+ this.removeAttribute('aria-disabled');
133
+ this.setAttribute('tabindex', '0');
134
+ }
135
+ }
136
+
137
+ render() {
138
+ const iconEl = this.querySelector('[slot="icon"]');
139
+ if (this.icon) {
140
+ if (iconEl) iconEl.setAttribute('name', this.icon);
141
+ else {
142
+ const el = document.createElement('icon-ui');
143
+ el.setAttribute('slot', 'icon');
144
+ el.setAttribute('name', this.icon);
145
+ this.prepend(el);
146
+ }
147
+ } else if (iconEl) {
148
+ iconEl.remove();
149
+ }
150
+
151
+ const textEl = this.querySelector('[slot="text"]');
152
+ if (textEl) textEl.textContent = this.text;
153
+
154
+ this.#syncAria();
155
+ }
156
+ }
@@ -49,6 +49,10 @@
49
49
  "x-adiaui": {
50
50
  "anti_patterns": [],
51
51
  "category": "agent",
52
+ "composes": [
53
+ "icon-ui",
54
+ "badge-ui"
55
+ ],
52
56
  "events": {
53
57
  "artifact-toggle": {
54
58
  "description": "Fired on artifact-toggle."
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `<agent-artifact-ui>` — Inline container for structured agent artifacts (A2UI, JSON, tickets).
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/agent-artifact
5
+ *
6
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
7
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
8
+ * run `npm run build:components`, then `npm run codegen:dts` to
9
+ * regenerate; or hand-author this file fully if rich event types are
10
+ * needed beyond what the yaml `events:` block can express.
11
+ */
12
+
13
+ import { UIElement } from '../../core/element.js';
14
+
15
+ export type AgentArtifactArtifactToggleEvent = CustomEvent<unknown>;
16
+
17
+ export class UIAgentArtifact extends UIElement {
18
+ /** Header title. */
19
+ title: string;
20
+ /** Start collapsed. */
21
+ collapsed: boolean;
22
+ /** icon-ui name in header. */
23
+ icon: string;
24
+ /** Badge label; value is normalized to uppercase before rendering. */
25
+ kind: string;
26
+ /** neutral | accent | warning | danger */
27
+ tone: string;
28
+
29
+ addEventListener<K extends keyof HTMLElementEventMap>(
30
+ type: K,
31
+ listener: (this: UIAgentArtifact, ev: HTMLElementEventMap[K]) => unknown,
32
+ options?: boolean | AddEventListenerOptions,
33
+ ): void;
34
+ addEventListener(type: 'artifact-toggle', listener: (ev: AgentArtifactArtifactToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
35
+ }
@@ -1,190 +1,17 @@
1
1
  /**
2
- * <agent-artifact-ui>Inline container for a structured agent artifact.
2
+ * `<agent-artifact-ui>`auto-registers the tag on import.
3
3
  *
4
- * Wraps an artifact (A2UI UI, JSON blob, ticket, code, etc.) with a compact
5
- * header showing a title + icon + optional kind badge, and two action slots:
6
- * "primary" (e.g. "Open in canvas") and "secondary" (e.g. "Download"). The
7
- * artifact body goes in the default slot.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
8
6
  *
9
- * The host can attach any node (code-ui, canvas-ui, div, etc.) as the body.
7
+ * import { UIAgentArtifact } from '@adia-ai/web-components/components/agent-artifact/class';
10
8
  *
11
- * Usage:
12
- * <agent-artifact-ui title="product-card" kind="A2UI" icon="layout">
13
- * <button-ui slot="primary" text="Open in canvas" icon="arrows-out-simple"></button-ui>
14
- * <button-ui slot="secondary" text="Copy" icon="copy"></button-ui>
15
- * <code-ui language="json">{…}</code-ui>
16
- * </agent-artifact-ui>
17
- *
18
- * Attributes:
19
- * title — header title (string)
20
- * kind — small badge, e.g. "A2UI", "JSON", "TICKET" (value is
21
- * normalized to uppercase before rendering)
22
- * icon — icon-ui name for the header
23
- * collapsed — start collapsed (body hidden)
24
- * tone — neutral (default) | accent | warning | danger
25
- *
26
- * Events:
27
- * artifact-toggle — detail: { collapsed }
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
28
10
  */
29
11
 
30
- import { UIElement } from '../../core/element.js';
31
-
32
- const TONE_TO_BADGE_VARIANT = {
33
- neutral: 'default',
34
- accent: 'accent',
35
- warning: 'warning',
36
- danger: 'danger',
37
- };
38
-
39
- class UIAgentArtifact extends UIElement {
40
- static properties = {
41
- title: { type: String, default: '', reflect: true },
42
- kind: { type: String, default: '', reflect: true },
43
- icon: { type: String, default: '', reflect: true },
44
- collapsed: { type: Boolean, default: false, reflect: true },
45
- tone: { type: String, default: 'neutral', reflect: true },
46
- };
47
-
48
- static template = () => null;
49
-
50
- #headerEl = null;
51
- #iconEl = null;
52
- #titleEl = null;
53
- #kindEl = null;
54
- #chevronEl = null;
55
- #bodyEl = null;
56
-
57
- connected() {
58
- this.#build();
59
- }
60
-
61
- disconnected() {
62
- this.#headerEl?.removeEventListener('click', this.#onHeaderClick);
63
- this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
64
- this.#headerEl = this.#iconEl = this.#titleEl = null;
65
- this.#kindEl = this.#chevronEl = this.#bodyEl = null;
66
- }
67
-
68
- #onHeaderClick = (e) => {
69
- // Ignore clicks that land on header action buttons
70
- if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
71
- this.collapsed = !this.collapsed;
72
- this.dispatchEvent(new CustomEvent('artifact-toggle', {
73
- bubbles: true, detail: { collapsed: this.collapsed },
74
- }));
75
- this.render();
76
- };
77
-
78
- // Keyboard activation — Space/Enter toggle (matches role="button" semantics).
79
- #onHeaderKey = (e) => {
80
- if (e.key === ' ' || e.key === 'Enter') {
81
- // Don't fire when the focus is on a slotted action button — let those
82
- // handle their own activation.
83
- if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
84
- e.preventDefault();
85
- this.#onHeaderClick(e);
86
- }
87
- };
88
-
89
- render() {
90
- if (!this.#headerEl) return;
91
-
92
- if (this.#iconEl) {
93
- if (this.icon) { this.#iconEl.setAttribute('name', this.icon); this.#iconEl.hidden = false; }
94
- else { this.#iconEl.hidden = true; }
95
- }
96
- if (this.#titleEl) {
97
- this.#titleEl.textContent = this.title || '';
98
- this.#titleEl.hidden = !this.title;
99
- }
100
- if (this.#kindEl) {
101
- this.#kindEl.setAttribute('text', (this.kind || '').toUpperCase());
102
- this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
103
- this.#kindEl.hidden = !this.kind;
104
- }
105
- if (this.#chevronEl) {
106
- this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
107
- }
108
- if (this.#bodyEl) {
109
- this.#bodyEl.hidden = this.collapsed;
110
- }
111
- if (this.#headerEl) {
112
- this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
113
- }
114
- }
115
-
116
- #build() {
117
- // We operate in a slotted model: the author's children that match
118
- // slot="primary"/slot="secondary" live in the header; the rest is body.
119
- // We build scaffolding DOM around those children without reparenting.
120
- //
121
- // To keep the Light-DOM approach consistent, we wrap existing children
122
- // into a body container if one isn't already present.
123
-
124
- // Capture any existing non-slotted children to put into the body wrapper
125
- const existingBodyNodes = Array.from(this.childNodes).filter((n) => {
126
- if (n.nodeType === 1) {
127
- const slot = /** @type {Element} */ (n).getAttribute?.('slot') || '';
128
- return slot !== 'primary' && slot !== 'secondary';
129
- }
130
- return true;
131
- });
132
-
133
- // Clear — we'll rebuild, preserving slotted action buttons
134
- const primaryBtns = this.querySelectorAll(':scope > [slot="primary"]');
135
- const secondaryBtns = this.querySelectorAll(':scope > [slot="secondary"]');
136
-
137
- this.innerHTML = '';
138
-
139
- // Header — keyboard-focusable button-style row that toggles collapsed.
140
- // role/tabindex make Space/Enter activate it the same as click.
141
- this.#headerEl = document.createElement('div');
142
- this.#headerEl.setAttribute('data-artifact-header', '');
143
- this.#headerEl.setAttribute('role', 'button');
144
- this.#headerEl.setAttribute('tabindex', '0');
145
- this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
146
- this.#headerEl.addEventListener('click', this.#onHeaderClick);
147
- this.#headerEl.addEventListener('keydown', this.#onHeaderKey);
148
-
149
- this.#iconEl = document.createElement('icon-ui');
150
- this.#iconEl.setAttribute('data-artifact-icon', '');
151
- this.#iconEl.setAttribute('color', 'muted');
152
- if (this.icon) this.#iconEl.setAttribute('name', this.icon);
153
- else this.#iconEl.hidden = true;
154
-
155
- this.#titleEl = document.createElement('span');
156
- this.#titleEl.setAttribute('data-artifact-title', '');
157
- if (this.title) this.#titleEl.textContent = this.title;
158
- else this.#titleEl.hidden = true;
159
-
160
- this.#kindEl = document.createElement('badge-ui');
161
- this.#kindEl.setAttribute('data-artifact-kind', '');
162
- this.#kindEl.setAttribute('size', 'sm');
163
- this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
164
- if (this.kind) this.#kindEl.setAttribute('text', this.kind.toUpperCase());
165
- else this.#kindEl.hidden = true;
166
-
167
- const actions = document.createElement('span');
168
- actions.setAttribute('data-artifact-actions', '');
169
- for (const btn of secondaryBtns) actions.appendChild(btn);
170
- for (const btn of primaryBtns) actions.appendChild(btn);
171
-
172
- this.#chevronEl = document.createElement('icon-ui');
173
- this.#chevronEl.setAttribute('color', 'muted');
174
- this.#chevronEl.setAttribute('data-artifact-chevron', '');
175
- this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
176
-
177
- this.#headerEl.append(this.#iconEl, this.#titleEl, this.#kindEl, actions, this.#chevronEl);
178
-
179
- // Body
180
- this.#bodyEl = document.createElement('div');
181
- this.#bodyEl.setAttribute('data-artifact-body', '');
182
- for (const n of existingBodyNodes) this.#bodyEl.appendChild(n);
183
- if (this.collapsed) this.#bodyEl.hidden = true;
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIAgentArtifact } from './class.js';
184
14
 
185
- this.append(this.#headerEl, this.#bodyEl);
186
- }
187
- }
15
+ defineIfFree('agent-artifact-ui', UIAgentArtifact);
188
16
 
189
- customElements.define('agent-artifact-ui', UIAgentArtifact);
190
17
  export { UIAgentArtifact };
@@ -7,6 +7,11 @@ component: AgentArtifact
7
7
  category: agent
8
8
  version: 1
9
9
  description: Inline container for structured agent artifacts (A2UI, JSON, tickets).
10
+ # Per ADR-0027 — primitives that programmatically create other primitives
11
+ # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
12
+ composes:
13
+ - icon-ui
14
+ - badge-ui
10
15
  props:
11
16
  kind:
12
17
  description: Badge label; value is normalized to uppercase before rendering.
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Non-side-effect class export for `<agent-artifact-ui>`.
3
+ *
4
+ * Importing this file gives you the class(es) without auto-registering the tag.
5
+ * Useful for test isolation, subclassing with tag-name override, or selective
6
+ * composition.
7
+ *
8
+ * The auto-register path stays at `@adia-ai/web-components/components/agent-artifact`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <agent-artifact-ui> — Inline container for a structured agent artifact.
16
+ *
17
+ * Wraps an artifact (A2UI UI, JSON blob, ticket, code, etc.) with a compact
18
+ * header showing a title + icon + optional kind badge, and two action slots:
19
+ * "primary" (e.g. "Open in canvas") and "secondary" (e.g. "Download"). The
20
+ * artifact body goes in the default slot.
21
+ *
22
+ * The host can attach any node (code-ui, canvas-ui, div, etc.) as the body.
23
+ *
24
+ * Usage:
25
+ * <agent-artifact-ui title="product-card" kind="A2UI" icon="layout">
26
+ * <button-ui slot="primary" text="Open in canvas" icon="arrows-out-simple"></button-ui>
27
+ * <button-ui slot="secondary" text="Copy" icon="copy"></button-ui>
28
+ * <code-ui language="json">{…}</code-ui>
29
+ * </agent-artifact-ui>
30
+ *
31
+ * Attributes:
32
+ * title — header title (string)
33
+ * kind — small badge, e.g. "A2UI", "JSON", "TICKET" (value is
34
+ * normalized to uppercase before rendering)
35
+ * icon — icon-ui name for the header
36
+ * collapsed — start collapsed (body hidden)
37
+ * tone — neutral (default) | accent | warning | danger
38
+ *
39
+ * Events:
40
+ * artifact-toggle — detail: { collapsed }
41
+ */
42
+
43
+ import { UIElement } from '../../core/element.js';
44
+
45
+ const TONE_TO_BADGE_VARIANT = {
46
+ neutral: 'default',
47
+ accent: 'accent',
48
+ warning: 'warning',
49
+ danger: 'danger',
50
+ };
51
+
52
+ export class UIAgentArtifact extends UIElement {
53
+ static properties = {
54
+ title: { type: String, default: '', reflect: true },
55
+ kind: { type: String, default: '', reflect: true },
56
+ icon: { type: String, default: '', reflect: true },
57
+ collapsed: { type: Boolean, default: false, reflect: true },
58
+ tone: { type: String, default: 'neutral', reflect: true },
59
+ };
60
+
61
+ static template = () => null;
62
+
63
+ #headerEl = null;
64
+ #iconEl = null;
65
+ #titleEl = null;
66
+ #kindEl = null;
67
+ #chevronEl = null;
68
+ #bodyEl = null;
69
+
70
+ connected() {
71
+ this.#build();
72
+ }
73
+
74
+ disconnected() {
75
+ this.#headerEl?.removeEventListener('click', this.#onHeaderClick);
76
+ this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
77
+ this.#headerEl = this.#iconEl = this.#titleEl = null;
78
+ this.#kindEl = this.#chevronEl = this.#bodyEl = null;
79
+ }
80
+
81
+ #onHeaderClick = (e) => {
82
+ // Ignore clicks that land on header action buttons
83
+ if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
84
+ this.collapsed = !this.collapsed;
85
+ this.dispatchEvent(new CustomEvent('artifact-toggle', {
86
+ bubbles: true, detail: { collapsed: this.collapsed },
87
+ }));
88
+ this.render();
89
+ };
90
+
91
+ // Keyboard activation — Space/Enter toggle (matches role="button" semantics).
92
+ #onHeaderKey = (e) => {
93
+ if (e.key === ' ' || e.key === 'Enter') {
94
+ // Don't fire when the focus is on a slotted action button — let those
95
+ // handle their own activation.
96
+ if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
97
+ e.preventDefault();
98
+ this.#onHeaderClick(e);
99
+ }
100
+ };
101
+
102
+ render() {
103
+ if (!this.#headerEl) return;
104
+
105
+ if (this.#iconEl) {
106
+ if (this.icon) { this.#iconEl.setAttribute('name', this.icon); this.#iconEl.hidden = false; }
107
+ else { this.#iconEl.hidden = true; }
108
+ }
109
+ if (this.#titleEl) {
110
+ this.#titleEl.textContent = this.title || '';
111
+ this.#titleEl.hidden = !this.title;
112
+ }
113
+ if (this.#kindEl) {
114
+ this.#kindEl.setAttribute('text', (this.kind || '').toUpperCase());
115
+ this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
116
+ this.#kindEl.hidden = !this.kind;
117
+ }
118
+ if (this.#chevronEl) {
119
+ this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
120
+ }
121
+ if (this.#bodyEl) {
122
+ this.#bodyEl.hidden = this.collapsed;
123
+ }
124
+ if (this.#headerEl) {
125
+ this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
126
+ }
127
+ }
128
+
129
+ #build() {
130
+ // We operate in a slotted model: the author's children that match
131
+ // slot="primary"/slot="secondary" live in the header; the rest is body.
132
+ // We build scaffolding DOM around those children without reparenting.
133
+ //
134
+ // To keep the Light-DOM approach consistent, we wrap existing children
135
+ // into a body container if one isn't already present.
136
+
137
+ // Capture any existing non-slotted children to put into the body wrapper
138
+ const existingBodyNodes = Array.from(this.childNodes).filter((n) => {
139
+ if (n.nodeType === 1) {
140
+ const slot = /** @type {Element} */ (n).getAttribute?.('slot') || '';
141
+ return slot !== 'primary' && slot !== 'secondary';
142
+ }
143
+ return true;
144
+ });
145
+
146
+ // Clear — we'll rebuild, preserving slotted action buttons
147
+ const primaryBtns = this.querySelectorAll(':scope > [slot="primary"]');
148
+ const secondaryBtns = this.querySelectorAll(':scope > [slot="secondary"]');
149
+
150
+ this.innerHTML = '';
151
+
152
+ // Header — keyboard-focusable button-style row that toggles collapsed.
153
+ // role/tabindex make Space/Enter activate it the same as click.
154
+ this.#headerEl = document.createElement('div');
155
+ this.#headerEl.setAttribute('data-artifact-header', '');
156
+ this.#headerEl.setAttribute('role', 'button');
157
+ this.#headerEl.setAttribute('tabindex', '0');
158
+ this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
159
+ this.#headerEl.addEventListener('click', this.#onHeaderClick);
160
+ this.#headerEl.addEventListener('keydown', this.#onHeaderKey);
161
+
162
+ this.#iconEl = document.createElement('icon-ui');
163
+ this.#iconEl.setAttribute('data-artifact-icon', '');
164
+ this.#iconEl.setAttribute('color', 'muted');
165
+ if (this.icon) this.#iconEl.setAttribute('name', this.icon);
166
+ else this.#iconEl.hidden = true;
167
+
168
+ this.#titleEl = document.createElement('span');
169
+ this.#titleEl.setAttribute('data-artifact-title', '');
170
+ if (this.title) this.#titleEl.textContent = this.title;
171
+ else this.#titleEl.hidden = true;
172
+
173
+ this.#kindEl = document.createElement('badge-ui');
174
+ this.#kindEl.setAttribute('data-artifact-kind', '');
175
+ this.#kindEl.setAttribute('size', 'sm');
176
+ this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
177
+ if (this.kind) this.#kindEl.setAttribute('text', this.kind.toUpperCase());
178
+ else this.#kindEl.hidden = true;
179
+
180
+ const actions = document.createElement('span');
181
+ actions.setAttribute('data-artifact-actions', '');
182
+ for (const btn of secondaryBtns) actions.appendChild(btn);
183
+ for (const btn of primaryBtns) actions.appendChild(btn);
184
+
185
+ this.#chevronEl = document.createElement('icon-ui');
186
+ this.#chevronEl.setAttribute('color', 'muted');
187
+ this.#chevronEl.setAttribute('data-artifact-chevron', '');
188
+ this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
189
+
190
+ this.#headerEl.append(this.#iconEl, this.#titleEl, this.#kindEl, actions, this.#chevronEl);
191
+
192
+ // Body
193
+ this.#bodyEl = document.createElement('div');
194
+ this.#bodyEl.setAttribute('data-artifact-body', '');
195
+ for (const n of existingBodyNodes) this.#bodyEl.appendChild(n);
196
+ if (this.collapsed) this.#bodyEl.hidden = true;
197
+
198
+ this.append(this.#headerEl, this.#bodyEl);
199
+ }
200
+ }
@@ -39,6 +39,9 @@
39
39
  "x-adiaui": {
40
40
  "anti_patterns": [],
41
41
  "category": "agent",
42
+ "composes": [
43
+ "button-ui"
44
+ ],
42
45
  "events": {
43
46
  "feedback-rate": {
44
47
  "description": "Fired on feedback-rate."
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `<agent-feedback-bar-ui>` — Thumbs + save row under an agent response.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/agent-feedback-bar
5
+ *
6
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
7
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
8
+ * run `npm run build:components`, then `npm run codegen:dts` to
9
+ * regenerate; or hand-author this file fully if rich event types are
10
+ * needed beyond what the yaml `events:` block can express.
11
+ */
12
+
13
+ import { UIElement } from '../../core/element.js';
14
+
15
+ export type AgentFeedbackBarFeedbackRateEvent = CustomEvent<unknown>;
16
+ export type AgentFeedbackBarFeedbackSaveEvent = CustomEvent<unknown>;
17
+
18
+ export class UIAgentFeedbackBar extends UIElement {
19
+ /** Disable all actions. */
20
+ disabled: boolean;
21
+ /** Save button icon. */
22
+ saveIcon: string;
23
+ /** Save button text; empty hides it. */
24
+ saveLabel: string;
25
+
26
+ addEventListener<K extends keyof HTMLElementEventMap>(
27
+ type: K,
28
+ listener: (this: UIAgentFeedbackBar, ev: HTMLElementEventMap[K]) => unknown,
29
+ options?: boolean | AddEventListenerOptions,
30
+ ): void;
31
+ addEventListener(type: 'feedback-rate', listener: (ev: AgentFeedbackBarFeedbackRateEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
32
+ addEventListener(type: 'feedback-save', listener: (ev: AgentFeedbackBarFeedbackSaveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
33
+ }