@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,97 @@
1
+ /**
2
+ * Non-side-effect class export for `<agent-suggestions-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-suggestions`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <agent-suggestions-ui> — Row of follow-up suggestion chips.
16
+ *
17
+ * The agent proposes 2-4 next-step prompts; user picks one. The host listens
18
+ * for `suggestion-select` and dispatches the associated prompt.
19
+ *
20
+ * JS API:
21
+ * el.suggestions = [
22
+ * { label: 'Add price comparison' }, // label === prompt
23
+ * { label: 'Add quantity stepper', prompt: 'add a stepper' },
24
+ * { label: 'Variants picker', prompt: 'add a variants picker', icon: 'tag' },
25
+ * ];
26
+ *
27
+ * el.addEventListener('suggestion-select', (e) => {
28
+ * submit(e.detail.prompt);
29
+ * });
30
+ *
31
+ * Attributes:
32
+ * variant — outline (default) | ghost | subtle
33
+ * size — sm (default) | md
34
+ * disabled — disable all chips
35
+ *
36
+ * Events:
37
+ * suggestion-select — detail: { label, prompt, index }
38
+ */
39
+
40
+ import { UIElement } from '../../core/element.js';
41
+
42
+ function truncate(s, n) {
43
+ if (typeof s !== 'string') return '';
44
+ return s.length > n ? s.slice(0, n - 1) + '…' : s;
45
+ }
46
+
47
+ export class UIAgentSuggestions extends UIElement {
48
+ static properties = {
49
+ variant: { type: String, default: 'outline', reflect: true },
50
+ size: { type: String, default: 'sm', reflect: true },
51
+ disabled: { type: Boolean, default: false, reflect: true },
52
+ };
53
+
54
+ static template = () => null;
55
+
56
+ #suggestions = [];
57
+
58
+ get suggestions() { return this.#suggestions; }
59
+ set suggestions(v) {
60
+ this.#suggestions = Array.isArray(v) ? v.slice() : [];
61
+ this.#render();
62
+ }
63
+
64
+ connected() {
65
+ this.#render();
66
+ }
67
+
68
+ disconnected() {
69
+ this.innerHTML = '';
70
+ }
71
+
72
+ #render() {
73
+ this.innerHTML = '';
74
+ for (let i = 0; i < this.#suggestions.length; i++) {
75
+ const s = this.#suggestions[i];
76
+ const label = typeof s === 'string' ? s : s.label || s.prompt || '';
77
+ const prompt = typeof s === 'string' ? s : s.prompt || s.label || '';
78
+ const icon = typeof s === 'object' ? s.icon : null;
79
+
80
+ const chip = document.createElement('button-ui');
81
+ chip.setAttribute('text', truncate(label, 42));
82
+ chip.setAttribute('variant', this.variant);
83
+ chip.setAttribute('size', this.size);
84
+ if (icon) chip.setAttribute('icon', icon);
85
+ if (this.disabled) chip.setAttribute('disabled', '');
86
+
87
+ chip.addEventListener('press', () => {
88
+ if (this.disabled) return;
89
+ this.dispatchEvent(new CustomEvent('suggestion-select', {
90
+ bubbles: true,
91
+ detail: { label, prompt, index: i },
92
+ }));
93
+ });
94
+ this.appendChild(chip);
95
+ }
96
+ }
97
+ }
@@ -34,6 +34,7 @@
34
34
  "x-adiaui": {
35
35
  "anti_patterns": [],
36
36
  "category": "agent",
37
+ "composes": [],
37
38
  "events": {
38
39
  "trace-toggle": {
39
40
  "description": "Fired on trace-toggle."
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `<agent-trace-ui>` — Collapsible metrics + training-feedback panel for an agent turn.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/agent-trace
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 AgentTraceTraceToggleEvent = CustomEvent<unknown>;
16
+
17
+ export class UIAgentTrace extends UIElement {
18
+ /** Hide the trace body. Default-visible disclosure (matches the agent-* family — agent-reasoning, agent-artifact). Set to opt out. */
19
+ collapsed: boolean;
20
+ /** Fallback summary label. */
21
+ label: string;
22
+
23
+ addEventListener<K extends keyof HTMLElementEventMap>(
24
+ type: K,
25
+ listener: (this: UIAgentTrace, ev: HTMLElementEventMap[K]) => unknown,
26
+ options?: boolean | AddEventListenerOptions,
27
+ ): void;
28
+ addEventListener(type: 'trace-toggle', listener: (ev: AgentTraceTraceToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
29
+ }
@@ -68,6 +68,7 @@
68
68
  "x-adiaui": {
69
69
  "anti_patterns": [],
70
70
  "category": "container",
71
+ "composes": [],
71
72
  "events": {
72
73
  "close": {
73
74
  "description": "Fired when the close button is clicked"
@@ -0,0 +1,39 @@
1
+ /**
2
+ * `<alert-ui>` — Inline alert banner with optional icon and close button.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/alert
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 AlertCloseEvent = CustomEvent<unknown>;
16
+
17
+ export class UIAlert extends UIElement {
18
+ /** Bold headline rendered as the first line of the alert content. Pair with [description] for the canonical "banner" pattern (headline + body). When [title] or [description] is set, the [text] prop is ignored. */
19
+ title: string;
20
+ /** Body text rendered as the second line of the alert content, below [title]. May be used alone (without [title]) for a single muted-body message. */
21
+ description: string;
22
+ /** Whether a close button is displayed. Alias [dismissible] is also accepted (same semantics, different spelling — the corpus and many libraries use both; both map to the same state). */
23
+ closable: boolean;
24
+ /** Public alias for [closable] — same semantics. Both attributes render the close button. Use whichever spelling matches your authoring style. */
25
+ dismissible: boolean;
26
+ /** Icon identifier displayed before the message content */
27
+ icon: string;
28
+ /** Single-line alert message. For two-line "headline + body" alerts, use [title] + [description] instead. For rich content (links, formatting), use the [slot="content"] slot. */
29
+ text: string;
30
+ /** Semantic color variant. */
31
+ variant: 'default' | 'info' | 'success' | 'warning' | 'danger' | 'muted' | 'neutral';
32
+
33
+ addEventListener<K extends keyof HTMLElementEventMap>(
34
+ type: K,
35
+ listener: (this: UIAlert, ev: HTMLElementEventMap[K]) => unknown,
36
+ options?: boolean | AddEventListenerOptions,
37
+ ): void;
38
+ addEventListener(type: 'close', listener: (ev: AlertCloseEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
39
+ }
@@ -1,184 +1,17 @@
1
1
  /**
2
- * <alert-ui text="Something happened" variant="info" icon="info-circle"></alert-ui>
3
- * <alert-ui text="Deleted." variant="danger" closable></alert-ui>
2
+ * `<alert-ui>` auto-registers the tag on import.
4
3
  *
5
- * Inline alert banner with optional icon and close button.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
6
  *
7
- * Variants: default, info, success, warning, danger, muted, neutral
8
- * Slots: leading (icon), content (text), close (dismiss button)
7
+ * import { UIAlert } from '@adia-ai/web-components/components/alert/class';
9
8
  *
10
- * Events:
11
- * close — fired when the user dismisses the alert
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
10
  */
13
11
 
14
- import { UIElement } from '../../core/element.js';
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIAlert } from './class.js';
15
14
 
16
- // One-time warn cache so the same alias hit doesn't spam the console
17
- // across hundreds of components per render. We use warnings ONLY for
18
- // genuine hallucinations the LLM should learn to stop emitting:
19
- // - variant="error" (canonical: "danger" — explicit in the enum)
20
- // - [closeable] (canonical: "closable" — established spelling)
21
- // First-class props ([title], [description], [dismissible]) do NOT warn —
22
- // they're public, supported, documented in alert.yaml.
23
- const _aliasWarned = new Set();
24
- function _warnOnce(key, message) {
25
- if (_aliasWarned.has(key)) return;
26
- _aliasWarned.add(key);
27
- // eslint-disable-next-line no-console
28
- console.warn(`[alert-ui] ${message}`);
29
- }
30
-
31
- class UIAlert extends UIElement {
32
- static properties = {
33
- text: { type: String, default: '', reflect: true },
34
- title: { type: String, default: '', reflect: true },
35
- description: { type: String, default: '', reflect: true },
36
- variant: { type: String, default: 'default', reflect: true },
37
- closable: { type: Boolean, default: false, reflect: true },
38
- dismissible: { type: Boolean, default: false, reflect: true },
39
- icon: { type: String, default: '', reflect: true },
40
- };
41
-
42
- static parts = {
43
- leading: '<icon-ui slot="leading"></icon-ui>',
44
- content: '<span slot="content"></span>',
45
- /* Close affordance is a real button-ui \u2014 inherits the system focus
46
- ring, hover transition, and icon sizing automatically. Listen for
47
- the canonical `press` event (button-ui dispatches on click + Enter
48
- + Space, no extra keydown wiring needed). */
49
- close: '<button-ui slot="close" icon="x" variant="ghost" size="sm" aria-label="Close"></button-ui>',
50
- };
51
-
52
- static template = () => null;
53
-
54
- /**
55
- * Normalize alias attrs that the LLM / corpus occasionally emits in
56
- * non-canonical forms. Runs once at connected() before render(). Two
57
- * categories:
58
- *
59
- * FIRST-CLASS ALIASES (public, supported, no warn):
60
- * - [dismissible] ↔ [closable] (same semantics; either spelling
61
- * maps to the same close-button affordance)
62
- *
63
- * HALLUCINATION ALIASES (warn-once, encourage canonical form):
64
- * - variant="error" → variant="danger" (not in the canonical
65
- * enum [default, info, success, warning, danger, muted, neutral])
66
- * - [closeable] → [closable] (alternate spelling, less standard
67
- * than dismissible/closable; warn to discourage)
68
- */
69
- #normalizeAliases() {
70
- // variant=error → danger (hallucination; warn)
71
- if (this.getAttribute('variant') === 'error') {
72
- _warnOnce('variant-error', 'variant="error" is not in the canonical enum [default, info, success, warning, danger, muted, neutral]. Mapping to "danger". Fix the source (LLM prompt / corpus pattern) to emit "danger" directly.');
73
- this.setAttribute('variant', 'danger');
74
- }
75
-
76
- // closeable → closable (typo-class; warn)
77
- if (this.hasAttribute('closeable') && !this.hasAttribute('closable') && !this.hasAttribute('dismissible')) {
78
- _warnOnce('alias-closeable', 'attribute [closeable] is a misspelled alias of canonical [closable]. Mapping. Fix the source to use [closable] or [dismissible].');
79
- this.setAttribute('closable', '');
80
- this.removeAttribute('closeable');
81
- }
82
-
83
- // dismissible ↔ closable (first-class alias; no warn)
84
- if (this.hasAttribute('dismissible') && !this.hasAttribute('closable')) {
85
- this.setAttribute('closable', '');
86
- }
87
- }
88
-
89
- #onPress = (e) => {
90
- if (e.target.closest('[slot="close"]')) this.#close();
91
- };
92
-
93
- connected() {
94
- this.#normalizeAliases();
95
- this.#updateRole();
96
-
97
- // Stamp default DOM if nothing was provided
98
- if (this.icon) this.ensure('leading');
99
- this.ensure('content');
100
- if (this.closable) this.ensure('close');
101
-
102
- this.addEventListener('press', this.#onPress);
103
- }
104
-
105
- disconnected() {
106
- this.removeEventListener('press', this.#onPress);
107
- }
108
-
109
- render() {
110
- // Icon
111
- if (this.icon) {
112
- const leading = this.ensure('leading');
113
- if (leading) leading.setAttribute('name', this.icon);
114
- } else {
115
- this.drop('leading');
116
- }
117
-
118
- // Content rendering — three modes, in precedence order:
119
- // 1. Author-provided <span slot="content">…</span> with content
120
- // already inside wins (rich content path)
121
- // 2. [title] and/or [description] — bolded headline + body paragraph
122
- // 3. [text] — single-line message
123
- //
124
- // Detection of "author content" is by checking whether the slot
125
- // element has its `data-alert-auto` flag (set by us when we stamp
126
- // content). If the flag is absent AND the element has any content,
127
- // the author provided it; leave it alone.
128
- const content = this.ensure('content');
129
- if (content) {
130
- const wasAutoStamped = content.hasAttribute('data-alert-auto');
131
- const hasContent = content.childNodes.length > 0;
132
- if (!wasAutoStamped && hasContent) {
133
- // Author-provided rich content. Mirror title/description to
134
- // aria-label if they were set, but don't touch the markup.
135
- if (this.title || this.description) {
136
- const aria = [this.title, this.description].filter(Boolean).join('. ');
137
- this.setAttribute('aria-label', aria);
138
- }
139
- } else if (this.title || this.description) {
140
- // Mode 2: title + description composed
141
- content.setAttribute('data-alert-auto', 'title-desc');
142
- content.replaceChildren();
143
- if (this.title) {
144
- const strong = document.createElement('strong');
145
- strong.textContent = this.title;
146
- content.appendChild(strong);
147
- if (this.description) content.appendChild(document.createTextNode(' '));
148
- }
149
- if (this.description) {
150
- content.appendChild(document.createTextNode(this.description));
151
- }
152
- const aria = [this.title, this.description].filter(Boolean).join('. ');
153
- this.setAttribute('aria-label', aria);
154
- } else if (this.text) {
155
- // Mode 3: single-line text
156
- content.setAttribute('data-alert-auto', 'text');
157
- content.textContent = this.text;
158
- }
159
- }
160
-
161
- // Close button
162
- if (this.closable || this.dismissible) {
163
- this.ensure('close');
164
- } else {
165
- this.drop('close');
166
- }
167
-
168
- // Role
169
- this.#updateRole();
170
- }
171
-
172
- #updateRole() {
173
- const role = (this.variant === 'danger' || this.variant === 'warning') ? 'alert' : 'status';
174
- this.setAttribute('role', role);
175
- }
176
-
177
- #close() {
178
- this.dispatchEvent(new Event('close', { bubbles: true }));
179
- this.remove();
180
- }
181
- }
182
- customElements.define('alert-ui', UIAlert);
15
+ defineIfFree('alert-ui', UIAlert);
183
16
 
184
17
  export { UIAlert };
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Non-side-effect class export for `<alert-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/alert`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <alert-ui text="Something happened" variant="info" icon="info-circle"></alert-ui>
16
+ * <alert-ui text="Deleted." variant="danger" closable></alert-ui>
17
+ *
18
+ * Inline alert banner with optional icon and close button.
19
+ *
20
+ * Variants: default, info, success, warning, danger, muted, neutral
21
+ * Slots: leading (icon), content (text), close (dismiss button)
22
+ *
23
+ * Events:
24
+ * close — fired when the user dismisses the alert
25
+ */
26
+
27
+ import { UIElement } from '../../core/element.js';
28
+
29
+ // One-time warn cache so the same alias hit doesn't spam the console
30
+ // across hundreds of components per render. We use warnings ONLY for
31
+ // genuine hallucinations the LLM should learn to stop emitting:
32
+ // - variant="error" (canonical: "danger" — explicit in the enum)
33
+ // - [closeable] (canonical: "closable" — established spelling)
34
+ // First-class props ([title], [description], [dismissible]) do NOT warn —
35
+ // they're public, supported, documented in alert.yaml.
36
+ const _aliasWarned = new Set();
37
+ function _warnOnce(key, message) {
38
+ if (_aliasWarned.has(key)) return;
39
+ _aliasWarned.add(key);
40
+ // eslint-disable-next-line no-console
41
+ console.warn(`[alert-ui] ${message}`);
42
+ }
43
+
44
+ export class UIAlert extends UIElement {
45
+ static properties = {
46
+ text: { type: String, default: '', reflect: true },
47
+ title: { type: String, default: '', reflect: true },
48
+ description: { type: String, default: '', reflect: true },
49
+ variant: { type: String, default: 'default', reflect: true },
50
+ closable: { type: Boolean, default: false, reflect: true },
51
+ dismissible: { type: Boolean, default: false, reflect: true },
52
+ icon: { type: String, default: '', reflect: true },
53
+ };
54
+
55
+ static parts = {
56
+ leading: '<icon-ui slot="leading"></icon-ui>',
57
+ content: '<span slot="content"></span>',
58
+ /* Close affordance is a real button-ui \u2014 inherits the system focus
59
+ ring, hover transition, and icon sizing automatically. Listen for
60
+ the canonical `press` event (button-ui dispatches on click + Enter
61
+ + Space, no extra keydown wiring needed). */
62
+ close: '<button-ui slot="close" icon="x" variant="ghost" size="sm" aria-label="Close"></button-ui>',
63
+ };
64
+
65
+ static template = () => null;
66
+
67
+ /**
68
+ * Normalize alias attrs that the LLM / corpus occasionally emits in
69
+ * non-canonical forms. Runs once at connected() before render(). Two
70
+ * categories:
71
+ *
72
+ * FIRST-CLASS ALIASES (public, supported, no warn):
73
+ * - [dismissible] ↔ [closable] (same semantics; either spelling
74
+ * maps to the same close-button affordance)
75
+ *
76
+ * HALLUCINATION ALIASES (warn-once, encourage canonical form):
77
+ * - variant="error" → variant="danger" (not in the canonical
78
+ * enum [default, info, success, warning, danger, muted, neutral])
79
+ * - [closeable] → [closable] (alternate spelling, less standard
80
+ * than dismissible/closable; warn to discourage)
81
+ */
82
+ #normalizeAliases() {
83
+ // variant=error → danger (hallucination; warn)
84
+ if (this.getAttribute('variant') === 'error') {
85
+ _warnOnce('variant-error', 'variant="error" is not in the canonical enum [default, info, success, warning, danger, muted, neutral]. Mapping to "danger". Fix the source (LLM prompt / corpus pattern) to emit "danger" directly.');
86
+ this.setAttribute('variant', 'danger');
87
+ }
88
+
89
+ // closeable → closable (typo-class; warn)
90
+ if (this.hasAttribute('closeable') && !this.hasAttribute('closable') && !this.hasAttribute('dismissible')) {
91
+ _warnOnce('alias-closeable', 'attribute [closeable] is a misspelled alias of canonical [closable]. Mapping. Fix the source to use [closable] or [dismissible].');
92
+ this.setAttribute('closable', '');
93
+ this.removeAttribute('closeable');
94
+ }
95
+
96
+ // dismissible ↔ closable (first-class alias; no warn)
97
+ if (this.hasAttribute('dismissible') && !this.hasAttribute('closable')) {
98
+ this.setAttribute('closable', '');
99
+ }
100
+ }
101
+
102
+ #onPress = (e) => {
103
+ if (e.target.closest('[slot="close"]')) this.#close();
104
+ };
105
+
106
+ connected() {
107
+ this.#normalizeAliases();
108
+ this.#updateRole();
109
+
110
+ // Stamp default DOM if nothing was provided
111
+ if (this.icon) this.ensure('leading');
112
+ this.ensure('content');
113
+ if (this.closable) this.ensure('close');
114
+
115
+ this.addEventListener('press', this.#onPress);
116
+ }
117
+
118
+ disconnected() {
119
+ this.removeEventListener('press', this.#onPress);
120
+ }
121
+
122
+ render() {
123
+ // Icon
124
+ if (this.icon) {
125
+ const leading = this.ensure('leading');
126
+ if (leading) leading.setAttribute('name', this.icon);
127
+ } else {
128
+ this.drop('leading');
129
+ }
130
+
131
+ // Content rendering — three modes, in precedence order:
132
+ // 1. Author-provided <span slot="content">…</span> with content
133
+ // already inside wins (rich content path)
134
+ // 2. [title] and/or [description] — bolded headline + body paragraph
135
+ // 3. [text] — single-line message
136
+ //
137
+ // Detection of "author content" is by checking whether the slot
138
+ // element has its `data-alert-auto` flag (set by us when we stamp
139
+ // content). If the flag is absent AND the element has any content,
140
+ // the author provided it; leave it alone.
141
+ const content = this.ensure('content');
142
+ if (content) {
143
+ const wasAutoStamped = content.hasAttribute('data-alert-auto');
144
+ const hasContent = content.childNodes.length > 0;
145
+ if (!wasAutoStamped && hasContent) {
146
+ // Author-provided rich content. Mirror title/description to
147
+ // aria-label if they were set, but don't touch the markup.
148
+ if (this.title || this.description) {
149
+ const aria = [this.title, this.description].filter(Boolean).join('. ');
150
+ this.setAttribute('aria-label', aria);
151
+ }
152
+ } else if (this.title || this.description) {
153
+ // Mode 2: title + description composed
154
+ content.setAttribute('data-alert-auto', 'title-desc');
155
+ content.replaceChildren();
156
+ if (this.title) {
157
+ const strong = document.createElement('strong');
158
+ strong.textContent = this.title;
159
+ content.appendChild(strong);
160
+ if (this.description) content.appendChild(document.createTextNode(' '));
161
+ }
162
+ if (this.description) {
163
+ content.appendChild(document.createTextNode(this.description));
164
+ }
165
+ const aria = [this.title, this.description].filter(Boolean).join('. ');
166
+ this.setAttribute('aria-label', aria);
167
+ } else if (this.text) {
168
+ // Mode 3: single-line text
169
+ content.setAttribute('data-alert-auto', 'text');
170
+ content.textContent = this.text;
171
+ }
172
+ }
173
+
174
+ // Close button
175
+ if (this.closable || this.dismissible) {
176
+ this.ensure('close');
177
+ } else {
178
+ this.drop('close');
179
+ }
180
+
181
+ // Role
182
+ this.#updateRole();
183
+ }
184
+
185
+ #updateRole() {
186
+ const role = (this.variant === 'danger' || this.variant === 'warning') ? 'alert' : 'status';
187
+ this.setAttribute('role', role);
188
+ }
189
+
190
+ #close() {
191
+ this.dispatchEvent(new Event('close', { bubbles: true }));
192
+ this.remove();
193
+ }
194
+ }
@@ -40,6 +40,7 @@
40
40
  "x-adiaui": {
41
41
  "anti_patterns": [],
42
42
  "category": "container",
43
+ "composes": [],
43
44
  "events": {},
44
45
  "examples": [
45
46
  {
@@ -69,6 +69,9 @@
69
69
  "x-adiaui": {
70
70
  "anti_patterns": [],
71
71
  "category": "display",
72
+ "composes": [
73
+ "icon-ui"
74
+ ],
72
75
  "events": {},
73
76
  "examples": [
74
77
  {
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `<avatar-ui>` — Avatar with image → initials → empty fallback chain.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/avatar
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 class UIAvatar extends UIElement {
16
+ /** Phosphor icon name shown instead of initials when `src`/`text` are empty. */
17
+ icon: string;
18
+ /** Deprecated alias for `text` (logs a one-shot console warning; will be removed in a future release). New code should use `text=` instead. */
19
+ name: string;
20
+ /** Avatar shape */
21
+ shape: 'circle' | 'square';
22
+ /** Avatar size. Canonical scale (xs/sm/md/lg/xl); long-form aliases (small/medium/large/xlarge) accepted for back-compat. */
23
+ size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'small' | 'medium' | 'large' | 'xlarge';
24
+ /** Image source URL. Falls back to initials on error. */
25
+ src: string;
26
+ /** Display string (full name or initials). Initials derive from spaces — first letter of each word, max 2. */
27
+ text: string;
28
+ }