@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,33 @@
1
+ /**
2
+ * Non-side-effect class export for `<block-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/block`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <block-ui padding="md" margin="lg">Content here</block-ui>
16
+ *
17
+ * Generic padded/margined content wrapper. Pure CSS component.
18
+ *
19
+ * Properties:
20
+ * padding — none | xs | sm | md | lg | xl (default 'md')
21
+ * margin — none | xs | sm | md | lg | xl (default 'none')
22
+ */
23
+
24
+ import { UIElement } from '../../core/element.js';
25
+
26
+ export class UIBlock extends UIElement {
27
+ static properties = {
28
+ padding: { type: String, default: 'md', reflect: true },
29
+ margin: { type: String, default: 'none', reflect: true },
30
+ };
31
+
32
+ static template = () => null;
33
+ }
@@ -44,6 +44,11 @@
44
44
  "x-adiaui": {
45
45
  "anti_patterns": [],
46
46
  "category": "navigation",
47
+ "composes": [
48
+ "menu-ui",
49
+ "button-ui",
50
+ "menu-item-ui"
51
+ ],
47
52
  "events": {},
48
53
  "examples": [
49
54
  {
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `<breadcrumb-ui>` — Breadcrumb trail with auto-inserted separators. Supports a leading icon (first child) and an overflow popover that collapses middle crumbs into a `…` menu.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/breadcrumb
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 UIBreadcrumb extends UIElement {
16
+ /** Collapse middle crumbs into a `…` overflow popover when there are 4+ items. */
17
+ collapse: boolean;
18
+ /** Number of leading items to keep visible when [collapse] is active. The first item (often a home/icon link) sits before the overflow popover. */
19
+ collapseKeepLeading: number;
20
+ /** Number of trailing items to keep visible when [collapse] is active. The last item is always the current page. */
21
+ collapseKeepTrailing: number;
22
+ /** Character or string rendered between breadcrumb items via CSS ::before. */
23
+ separator: string;
24
+ }
@@ -1,122 +1,17 @@
1
1
  /**
2
- * <breadcrumb-ui separator="/">
3
- * <a href="/"><icon-ui name="house"></icon-ui></a>
4
- * <a href="#">Workspace</a>
5
- * <span>Current page</span>
6
- * </breadcrumb-ui>
2
+ * `<breadcrumb-ui>` — auto-registers the tag on import.
7
3
  *
8
- * Trail with auto-inserted separators. Items can be plain elements or
9
- * `<a href>` links; the last item is marked `aria-current="page"`.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
10
6
  *
11
- * Variants:
12
- * • Default — text-only crumbs
13
- * • Icon-leading — first child is `<icon-ui>` (or a link wrapping one)
14
- * • Collapsed — `[collapse]` hides middle crumbs into a `…` overflow
15
- * popover; keeps `[collapse-keep-leading]` (default 1) and
16
- * `[collapse-keep-trailing]` (default 2) visible at the edges.
7
+ * import { UIBreadcrumb } from '@adia-ai/web-components/components/breadcrumb/class';
17
8
  *
18
- * The overflow uses `<popover-ui>` so it rides the top-layer (no
19
- * z-index battles inside scrolling containers).
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
20
10
  */
21
11
 
22
- import { UIElement } from '../../core/element.js';
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIBreadcrumb } from './class.js';
23
14
 
24
- class UIBreadcrumb extends UIElement {
25
- static properties = {
26
- separator: { type: String, default: '/', reflect: true },
27
- collapse: { type: Boolean, default: false, reflect: true },
28
- collapseKeepLeading: { type: Number, default: 1, attribute: 'collapse-keep-leading', reflect: true },
29
- collapseKeepTrailing: { type: Number, default: 2, attribute: 'collapse-keep-trailing', reflect: true },
30
- };
15
+ defineIfFree('breadcrumb-ui', UIBreadcrumb);
31
16
 
32
- static template = () => null;
33
-
34
- connected() {
35
- this.setAttribute('role', 'navigation');
36
- this.setAttribute('aria-label', 'Breadcrumb');
37
- }
38
-
39
- render() {
40
- // Strip prior chrome so render is idempotent across attribute changes.
41
- this.querySelectorAll('[data-sep], [data-overflow]').forEach(el => el.remove());
42
-
43
- const items = Array.from(this.children).filter(c =>
44
- !c.hasAttribute('data-sep') && !c.hasAttribute('data-overflow')
45
- );
46
- const last = items.length - 1;
47
-
48
- // Reset per-item chrome
49
- items.forEach((child, i) => {
50
- child.setAttribute('data-item', '');
51
- child.removeAttribute('data-collapsed');
52
- if (i === last) child.setAttribute('aria-current', 'page');
53
- else child.removeAttribute('aria-current');
54
- });
55
-
56
- const keepLeading = Math.max(0, this.collapseKeepLeading | 0);
57
- const keepTrailing = Math.max(0, this.collapseKeepTrailing | 0);
58
- const minLen = keepLeading + keepTrailing + 1;
59
- const shouldCollapse = this.collapse && items.length >= Math.max(minLen, 4);
60
-
61
- if (shouldCollapse) {
62
- const collapsed = items.slice(keepLeading, items.length - keepTrailing);
63
- collapsed.forEach(el => el.setAttribute('data-collapsed', ''));
64
-
65
- const overflow = this.#buildOverflow(collapsed);
66
- if (keepLeading > 0) items[keepLeading - 1].after(overflow);
67
- else this.prepend(overflow);
68
- }
69
-
70
- // Stamp separators between every consecutive visible sibling.
71
- const visible = Array.from(this.children).filter(c =>
72
- !c.hasAttribute('data-sep') && !c.hasAttribute('data-collapsed')
73
- );
74
- for (let i = 0; i < visible.length - 1; i++) {
75
- const sep = document.createElement('span');
76
- sep.setAttribute('data-sep', '');
77
- sep.setAttribute('aria-hidden', 'true');
78
- sep.textContent = this.separator;
79
- visible[i].after(sep);
80
- }
81
- }
82
-
83
- #buildOverflow(collapsedItems) {
84
- // Use <menu-ui> as the canonical popover-list primitive — same surface
85
- // tokens as select-ui's listbox + menu-ui's action menu, with keyboard
86
- // nav, top-layer rendering, and anchor positioning for free.
87
- const menu = document.createElement('menu-ui');
88
- menu.setAttribute('data-overflow', '');
89
- menu.setAttribute('data-item', '');
90
- menu.setAttribute('placement', 'bottom-start');
91
-
92
- const trigger = document.createElement('button-ui');
93
- trigger.setAttribute('slot', 'trigger');
94
- trigger.setAttribute('text', '…');
95
- trigger.setAttribute('variant', 'ghost');
96
- trigger.setAttribute('size', 'sm');
97
- trigger.setAttribute('aria-label', 'Show collapsed crumbs');
98
- menu.appendChild(trigger);
99
-
100
- for (const item of collapsedItems) {
101
- const mi = document.createElement('menu-item-ui');
102
- mi.setAttribute('text', item.textContent.trim());
103
- // Encode the link target as the menu-item value; navigated on action.
104
- if (item.tagName === 'A' && item.hasAttribute('href')) {
105
- mi.setAttribute('value', item.getAttribute('href'));
106
- }
107
- menu.appendChild(mi);
108
- }
109
-
110
- // menu-ui dispatches `action` with `detail: { value, text }` on item
111
- // activation. Navigate to the encoded href; ignore placeholder `#`.
112
- menu.addEventListener('action', (e) => {
113
- const href = e.detail?.value;
114
- if (href && href !== '#') window.location.href = href;
115
- });
116
-
117
- return menu;
118
- }
119
- }
120
-
121
- customElements.define('breadcrumb-ui', UIBreadcrumb);
122
17
  export { UIBreadcrumb };
@@ -7,6 +7,12 @@ component: Breadcrumb
7
7
  category: navigation
8
8
  version: 1
9
9
  description: Breadcrumb trail with auto-inserted separators. Supports a leading icon (first child) and an overflow popover that collapses middle crumbs into a `…` menu.
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
+ - menu-ui
14
+ - button-ui
15
+ - menu-item-ui
10
16
  props:
11
17
  separator:
12
18
  description: Character or string rendered between breadcrumb items via CSS ::before.
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Non-side-effect class export for `<breadcrumb-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/breadcrumb`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <breadcrumb-ui separator="/">
16
+ * <a href="/"><icon-ui name="house"></icon-ui></a>
17
+ * <a href="#">Workspace</a>
18
+ * <span>Current page</span>
19
+ * </breadcrumb-ui>
20
+ *
21
+ * Trail with auto-inserted separators. Items can be plain elements or
22
+ * `<a href>` links; the last item is marked `aria-current="page"`.
23
+ *
24
+ * Variants:
25
+ * • Default — text-only crumbs
26
+ * • Icon-leading — first child is `<icon-ui>` (or a link wrapping one)
27
+ * • Collapsed — `[collapse]` hides middle crumbs into a `…` overflow
28
+ * popover; keeps `[collapse-keep-leading]` (default 1) and
29
+ * `[collapse-keep-trailing]` (default 2) visible at the edges.
30
+ *
31
+ * The overflow uses `<popover-ui>` so it rides the top-layer (no
32
+ * z-index battles inside scrolling containers).
33
+ */
34
+
35
+ import { UIElement } from '../../core/element.js';
36
+
37
+ export class UIBreadcrumb extends UIElement {
38
+ static properties = {
39
+ separator: { type: String, default: '/', reflect: true },
40
+ collapse: { type: Boolean, default: false, reflect: true },
41
+ collapseKeepLeading: { type: Number, default: 1, attribute: 'collapse-keep-leading', reflect: true },
42
+ collapseKeepTrailing: { type: Number, default: 2, attribute: 'collapse-keep-trailing', reflect: true },
43
+ };
44
+
45
+ static template = () => null;
46
+
47
+ connected() {
48
+ this.setAttribute('role', 'navigation');
49
+ this.setAttribute('aria-label', 'Breadcrumb');
50
+ }
51
+
52
+ render() {
53
+ // Strip prior chrome so render is idempotent across attribute changes.
54
+ this.querySelectorAll('[data-sep], [data-overflow]').forEach(el => el.remove());
55
+
56
+ const items = Array.from(this.children).filter(c =>
57
+ !c.hasAttribute('data-sep') && !c.hasAttribute('data-overflow')
58
+ );
59
+ const last = items.length - 1;
60
+
61
+ // Reset per-item chrome
62
+ items.forEach((child, i) => {
63
+ child.setAttribute('data-item', '');
64
+ child.removeAttribute('data-collapsed');
65
+ if (i === last) child.setAttribute('aria-current', 'page');
66
+ else child.removeAttribute('aria-current');
67
+ });
68
+
69
+ const keepLeading = Math.max(0, this.collapseKeepLeading | 0);
70
+ const keepTrailing = Math.max(0, this.collapseKeepTrailing | 0);
71
+ const minLen = keepLeading + keepTrailing + 1;
72
+ const shouldCollapse = this.collapse && items.length >= Math.max(minLen, 4);
73
+
74
+ if (shouldCollapse) {
75
+ const collapsed = items.slice(keepLeading, items.length - keepTrailing);
76
+ collapsed.forEach(el => el.setAttribute('data-collapsed', ''));
77
+
78
+ const overflow = this.#buildOverflow(collapsed);
79
+ if (keepLeading > 0) items[keepLeading - 1].after(overflow);
80
+ else this.prepend(overflow);
81
+ }
82
+
83
+ // Stamp separators between every consecutive visible sibling.
84
+ const visible = Array.from(this.children).filter(c =>
85
+ !c.hasAttribute('data-sep') && !c.hasAttribute('data-collapsed')
86
+ );
87
+ for (let i = 0; i < visible.length - 1; i++) {
88
+ const sep = document.createElement('span');
89
+ sep.setAttribute('data-sep', '');
90
+ sep.setAttribute('aria-hidden', 'true');
91
+ sep.textContent = this.separator;
92
+ visible[i].after(sep);
93
+ }
94
+ }
95
+
96
+ #buildOverflow(collapsedItems) {
97
+ // Use <menu-ui> as the canonical popover-list primitive — same surface
98
+ // tokens as select-ui's listbox + menu-ui's action menu, with keyboard
99
+ // nav, top-layer rendering, and anchor positioning for free.
100
+ const menu = document.createElement('menu-ui');
101
+ menu.setAttribute('data-overflow', '');
102
+ menu.setAttribute('data-item', '');
103
+ menu.setAttribute('placement', 'bottom-start');
104
+
105
+ const trigger = document.createElement('button-ui');
106
+ trigger.setAttribute('slot', 'trigger');
107
+ trigger.setAttribute('text', '…');
108
+ trigger.setAttribute('variant', 'ghost');
109
+ trigger.setAttribute('size', 'sm');
110
+ trigger.setAttribute('aria-label', 'Show collapsed crumbs');
111
+ menu.appendChild(trigger);
112
+
113
+ for (const item of collapsedItems) {
114
+ const mi = document.createElement('menu-item-ui');
115
+ mi.setAttribute('text', item.textContent.trim());
116
+ // Encode the link target as the menu-item value; navigated on action.
117
+ if (item.tagName === 'A' && item.hasAttribute('href')) {
118
+ mi.setAttribute('value', item.getAttribute('href'));
119
+ }
120
+ menu.appendChild(mi);
121
+ }
122
+
123
+ // menu-ui dispatches `action` with `detail: { value, text }` on item
124
+ // activation. Navigate to the encoded href; ignore placeholder `#`.
125
+ menu.addEventListener('action', (e) => {
126
+ const href = e.detail?.value;
127
+ if (href && href !== '#') window.location.href = href;
128
+ });
129
+
130
+ return menu;
131
+ }
132
+ }
@@ -98,6 +98,9 @@
98
98
  "x-adiaui": {
99
99
  "anti_patterns": [],
100
100
  "category": "action",
101
+ "composes": [
102
+ "icon-ui"
103
+ ],
101
104
  "events": {
102
105
  "press": {
103
106
  "description": "Fired on complete press (pointer up or Enter/Space)"
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `<button-ui>` — Clickable button with text, icon, and variant support. Supports submit type for forms.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/button
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 ButtonPressEvent = CustomEvent<unknown>;
16
+
17
+ export class UIButton extends UIElement {
18
+ /** HTML button type (button, submit, reset) */
19
+ type: string;
20
+ /** Semantic intent — composes with [variant]. `<button-ui variant="solid" color="danger">` = filled destructive action; `<button-ui variant="outline" color="success">` = outlined success affordance. */
21
+ color: 'default' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
22
+ /** Disables interaction and prevents click/press events */
23
+ disabled: boolean;
24
+ /** Leading Phosphor icon name (rendered before text). */
25
+ icon: string;
26
+ /** Sizing scale (xs/sm/md/lg/xl). */
27
+ size: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
28
+ /** Makes the button stretch to fill the parent's width */
29
+ stretch: boolean;
30
+ /** Button text, rendered via CSS attr(text) on ::after */
31
+ text: string;
32
+ /** Button label. Renderer routes this to the `text` attribute, which is rendered via CSS attr(text) on ::after and mirrored to aria-label. */
33
+ textContent: string;
34
+ /** Visual style — `solid` (default fill), `outline`, `ghost`. `default` / `primary` are aliases of `solid`. Style is independent of semantic intent — to express destructive / success / info / warning intent, set [color="…"] alongside.
35
+ For **inline navigation** (Terms of Service, Privacy Policy, footer links, "Sign in" / "Sign up" cross-page affordances) use `<link-ui>` instead — it carries proper `<a href>` semantics, keyboard handling (Enter only, no Space), middle-click open-new-tab, and screen-reader announces "link" instead of "button". Mixing navigation and action affordances under the same primitive is a category error fixed at this junction. */
36
+ variant: 'default' | 'solid' | 'outline' | 'ghost' | 'primary' | 'secondary' | 'soft' | 'current';
37
+
38
+ addEventListener<K extends keyof HTMLElementEventMap>(
39
+ type: K,
40
+ listener: (this: UIButton, ev: HTMLElementEventMap[K]) => unknown,
41
+ options?: boolean | AddEventListenerOptions,
42
+ ): void;
43
+ addEventListener(type: 'press', listener: (ev: ButtonPressEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
44
+ }
@@ -1,68 +1,17 @@
1
- import { UIElement, signal, html } from '../../core/element.js';
2
- import { getIcon } from '../../core/icons.js';
3
-
4
- class UIButton extends UIElement {
5
- static properties = {
6
- text: { type: String, default: '', reflect: true },
7
- textContent: { type: String, default: '' },
8
- variant: { type: String, default: 'solid', reflect: true },
9
- color: { type: String, default: '', reflect: true },
10
- size: { type: String, default: 'md', reflect: true },
11
- disabled: { type: Boolean, default: false, reflect: true },
12
- stretch: { type: Boolean, default: false, reflect: true },
13
- icon: { type: String, default: '', reflect: true },
14
- type: { type: String, default: 'button', reflect: true },
15
- };
16
-
17
- static template = () => null;
18
-
19
- connected() {
20
- this.setAttribute('role', 'button');
21
- this.setAttribute('tabindex', '0');
22
- this.addEventListener('click', this.#onClick);
23
- this.addEventListener('keydown', this.#onKey);
24
- }
25
-
26
- render() {
27
- // Don't clobber a user-provided aria-label with an empty string when
28
- // text is unset (e.g. icon-only button with author-set aria-label).
29
- // Only auto-set when we have meaningful text to put there.
30
- if (this.text) this.setAttribute('aria-label', this.text);
31
- if (this.icon) {
32
- const existing = this.querySelector('icon-ui');
33
- if (!existing || existing.name !== this.icon) {
34
- if (existing) existing.remove();
35
- const iconEl = document.createElement('icon-ui');
36
- iconEl.setAttribute('name', this.icon);
37
- this.prepend(iconEl);
38
- }
39
- }
40
- }
41
-
42
- #onClick = (e) => {
43
- if (this.disabled) { e.stopPropagation(); return; }
44
- if (this.type === 'submit') {
45
- const form = this.closest('form');
46
- if (form?.requestSubmit) form.requestSubmit();
47
- } else if (this.type === 'reset') {
48
- const form = this.closest('form');
49
- if (form?.reset) form.reset();
50
- }
51
- this.dispatchEvent(new Event('press', { bubbles: true }));
52
- };
53
-
54
- #onKey = (e) => {
55
- if (e.key === 'Enter' || e.key === ' ') {
56
- e.preventDefault();
57
- this.click();
58
- }
59
- };
60
-
61
- disconnected() {
62
- this.removeEventListener('click', this.#onClick);
63
- this.removeEventListener('keydown', this.#onKey);
64
- }
65
- }
66
- customElements.define('button-ui', UIButton);
1
+ /**
2
+ * `<button-ui>` auto-registers the tag on import.
3
+ *
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UIButton } from '@adia-ai/web-components/components/button/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
10
+ */
11
+
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIButton } from './class.js';
14
+
15
+ defineIfFree('button-ui', UIButton);
67
16
 
68
17
  export { UIButton };
@@ -7,6 +7,11 @@ component: Button
7
7
  category: action
8
8
  version: 1
9
9
  description: Clickable button with text, icon, and variant support. Supports submit type for forms.
10
+ # Per ADR-0027 — primitives that programmatically create other primitives
11
+ # in their render() do NOT auto-import them. Consumer (or demo shell) must
12
+ # explicitly import each composed primitive.
13
+ composes:
14
+ - icon-ui # created via document.createElement('icon-ui') when [icon] is set
10
15
  props:
11
16
  aria-label:
12
17
  description: Accessible label for screen readers. Auto-set from `text` when text is non-empty; meaningful override for icon-only buttons.
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `UIButton` class — non-side-effect export.
3
+ *
4
+ * Importing this file gives you the class without auto-registering the
5
+ * tag. Useful for:
6
+ * - Test isolation (register under a different tag in a test)
7
+ * - Subclassing with tag-name override
8
+ * - Tree-shaking-conscious bundles that compose primitives selectively
9
+ *
10
+ * The auto-register path stays at `@adia-ai/web-components/components/button`
11
+ * (which imports this file + calls `customElements.define`).
12
+ *
13
+ * @see ../../USAGE.md#registration--auto-vs-explicit
14
+ */
15
+
16
+ import { UIElement, signal, html } from '../../core/element.js';
17
+ import { getIcon } from '../../core/icons.js';
18
+
19
+ export class UIButton extends UIElement {
20
+ static properties = {
21
+ text: { type: String, default: '', reflect: true },
22
+ textContent: { type: String, default: '' },
23
+ variant: { type: String, default: 'solid', reflect: true },
24
+ color: { type: String, default: '', reflect: true },
25
+ size: { type: String, default: 'md', reflect: true },
26
+ disabled: { type: Boolean, default: false, reflect: true },
27
+ stretch: { type: Boolean, default: false, reflect: true },
28
+ icon: { type: String, default: '', reflect: true },
29
+ type: { type: String, default: 'button', reflect: true },
30
+ };
31
+
32
+ static template = () => null;
33
+
34
+ connected() {
35
+ this.setAttribute('role', 'button');
36
+ this.setAttribute('tabindex', '0');
37
+ this.addEventListener('click', this.#onClick);
38
+ this.addEventListener('keydown', this.#onKey);
39
+ }
40
+
41
+ render() {
42
+ // Don't clobber a user-provided aria-label with an empty string when
43
+ // text is unset (e.g. icon-only button with author-set aria-label).
44
+ // Only auto-set when we have meaningful text to put there.
45
+ if (this.text) this.setAttribute('aria-label', this.text);
46
+ if (this.icon) {
47
+ const existing = this.querySelector('icon-ui');
48
+ if (!existing || existing.name !== this.icon) {
49
+ if (existing) existing.remove();
50
+ const iconEl = document.createElement('icon-ui');
51
+ iconEl.setAttribute('name', this.icon);
52
+ this.prepend(iconEl);
53
+ }
54
+ }
55
+ }
56
+
57
+ #onClick = (e) => {
58
+ if (this.disabled) { e.stopPropagation(); return; }
59
+ if (this.type === 'submit') {
60
+ const form = this.closest('form');
61
+ if (form?.requestSubmit) form.requestSubmit();
62
+ } else if (this.type === 'reset') {
63
+ const form = this.closest('form');
64
+ if (form?.reset) form.reset();
65
+ }
66
+ this.dispatchEvent(new Event('press', { bubbles: true }));
67
+ };
68
+
69
+ #onKey = (e) => {
70
+ if (e.key === 'Enter' || e.key === ' ') {
71
+ e.preventDefault();
72
+ this.click();
73
+ }
74
+ };
75
+
76
+ disconnected() {
77
+ this.removeEventListener('click', this.#onClick);
78
+ this.removeEventListener('keydown', this.#onKey);
79
+ }
80
+ }
@@ -79,6 +79,7 @@
79
79
  "x-adiaui": {
80
80
  "anti_patterns": [],
81
81
  "category": "input",
82
+ "composes": [],
82
83
  "events": {
83
84
  "change": {
84
85
  "description": "Fired when a date is selected"
@@ -130,7 +131,12 @@
130
131
  "name": "disabled"
131
132
  }
132
133
  ],
133
- "synonyms": {},
134
+ "synonyms": {
135
+ "tags": [
136
+ "DateTimeInput",
137
+ "DatePicker"
138
+ ]
139
+ },
134
140
  "tag": "calendar-picker-ui",
135
141
  "tokens": {},
136
142
  "traits": [],