@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
@@ -1,384 +1,18 @@
1
1
  /**
2
- * <toolbar-ui>
3
- * <toolbar-group-ui>
4
- * <button-ui icon="text-bold" variant="ghost" size="sm"></button-ui>
5
- * <button-ui icon="text-italic" variant="ghost" size="sm"></button-ui>
6
- * </toolbar-group-ui>
7
- * <divider-ui vertical></divider-ui>
8
- * <toolbar-group-ui>
9
- * <button-ui icon="text-align-left" variant="ghost" size="sm"></button-ui>
10
- * </toolbar-group-ui>
11
- * </toolbar-ui>
2
+ * `<toolbar-ui>` — auto-registers the tag on import.
12
3
  *
13
- * Horizontal action bar with automatic overflow:
14
- * ResizeObserver measures available width.
15
- * • Items that don't fit are moved (from the end) into a spillover popover.
16
- * • `toolbar-group-ui` wraps siblings so they move as an atomic unit
17
- * (no half-group split between visible bar and overflow menu).
18
- * • Trailing dividers are trimmed. Dividers are not moved to the menu.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
19
6
  *
20
- * Platform: Popover API (top-layer) + CSS Anchor Positioning via @core/anchor.js.
21
- */
22
-
23
- import { UIElement } from '../../core/element.js';
24
- import { anchorPopover } from '../../core/anchor.js';
25
-
26
- const SPILLOVER_ATTR = 'data-toolbar-spillover';
27
- const SPILLOVER_MENU_ATTR = 'data-toolbar-spillover-menu';
28
-
29
- /* Headroom kept free at the right edge before an item starts spilling over.
30
- A non-zero value makes overflow more responsive — items move to the menu
31
- while there's still breathing room, instead of waiting until they actually
32
- touch the toolbar's right edge. */
33
- const OVERFLOW_BUFFER = 8;
34
-
35
- class UIToolbar extends UIElement {
36
- static properties = {
37
- gap: { type: String, default: 'sm', reflect: true },
38
- align: { type: String, default: 'start', reflect: true },
39
- overflow: { type: String, default: 'menu', reflect: true },
40
- };
41
-
42
- static template = () => null;
43
-
44
- #ro = null;
45
- #mo = null;
46
- #trigger = null;
47
- #popover = null;
48
- #spilloverCleanup = null;
49
- #measuring = false;
50
- #reflowQueued = false;
51
- #reflowRaf = null;
52
- #rafId = null;
53
-
54
- connected() {
55
- this.setAttribute('role', 'toolbar');
56
- this.#ensureSpillover();
57
- this.#ro = new ResizeObserver(() => this.#queueReflow());
58
- this.#ro.observe(this);
59
- this.#mo = new MutationObserver(() => {
60
- if (this.#measuring) return;
61
- this.#queueReflow();
62
- });
63
- this.#moObserve();
64
- this.#queueReflow();
65
- }
66
-
67
- disconnected() {
68
- if (this.#reflowRaf != null) {
69
- cancelAnimationFrame(this.#reflowRaf);
70
- this.#reflowRaf = null;
71
- }
72
- this.#reflowQueued = false;
73
- this.#ro?.disconnect();
74
- this.#mo?.disconnect();
75
- this.#closeSpillover();
76
- this.#ro = null;
77
- this.#mo = null;
78
- this.#trigger = null;
79
- this.#popover = null;
80
- }
81
-
82
- // ── Spillover infrastructure ──
83
-
84
- #ensureSpillover() {
85
- if (this.#trigger) return;
86
-
87
- const trigger = document.createElement('button-ui');
88
- trigger.setAttribute('icon', 'dots-three');
89
- trigger.setAttribute('variant', 'ghost');
90
- trigger.setAttribute('size', 'sm');
91
- trigger.setAttribute(SPILLOVER_ATTR, '');
92
- trigger.setAttribute('aria-label', 'More actions');
93
- trigger.setAttribute('aria-haspopup', 'menu');
94
- trigger.hidden = true;
95
-
96
- const popover = document.createElement('div');
97
- popover.setAttribute(SPILLOVER_MENU_ATTR, '');
98
- popover.setAttribute('popover', 'manual');
99
- popover.setAttribute('role', 'menu');
100
-
101
- trigger.addEventListener('click', this.#onTriggerClick);
102
- popover.addEventListener('click', this.#onMenuClick);
103
- popover.addEventListener('toggle', this.#onToggle);
104
-
105
- this.appendChild(trigger);
106
- this.appendChild(popover);
107
-
108
- this.#trigger = trigger;
109
- this.#popover = popover;
110
- }
111
-
112
- #openSpillover() {
113
- const menu = this.#popover;
114
- if (!menu || menu.matches(':popover-open')) return;
115
- menu.showPopover?.();
116
- this.#spilloverCleanup?.();
117
- this.#spilloverCleanup = anchorPopover(this.#trigger, menu, {
118
- placement: 'bottom-end',
119
- gap: 4,
120
- });
121
- this.#rafId = requestAnimationFrame(() => {
122
- this.#rafId = null;
123
- document.addEventListener('pointerdown', this.#onOutside, true);
124
- document.addEventListener('keydown', this.#onKey, true);
125
- });
126
- }
127
-
128
- #closeSpillover() {
129
- this.#spilloverCleanup?.();
130
- this.#spilloverCleanup = null;
131
- if (this.#popover?.matches(':popover-open')) this.#popover.hidePopover?.();
132
- if (this.#rafId != null) {
133
- cancelAnimationFrame(this.#rafId);
134
- this.#rafId = null;
135
- }
136
- document.removeEventListener('pointerdown', this.#onOutside, true);
137
- document.removeEventListener('keydown', this.#onKey, true);
138
- }
139
-
140
- #onTriggerClick = (e) => {
141
- e.stopPropagation();
142
- if (this.#popover?.matches(':popover-open')) this.#closeSpillover();
143
- else this.#openSpillover();
144
- };
145
-
146
- #onMenuClick = (e) => {
147
- // Only auto-close after a "terminal" action (button-ui press). Composite
148
- // controls inside the menu — select-ui, segmented-ui, etc. — manage their
149
- // own state; clicking them must not dismiss the spillover.
150
- const btn = e.target.closest('button-ui');
151
- if (!btn) return;
152
- if (btn.matches(`[${SPILLOVER_ATTR}]`)) return;
153
- queueMicrotask(() => this.#closeSpillover());
154
- };
155
-
156
- #onOutside = (e) => {
157
- if (this.#trigger?.contains(e.target)) return;
158
- if (this.#popover?.contains(e.target)) return;
159
- // Ignore clicks inside any other open popover (e.g., a select-ui dropdown
160
- // launched from a select inside our spillover, which lives in the top
161
- // layer outside the spillover popover's DOM subtree).
162
- const path = e.composedPath?.() || [];
163
- for (const node of path) {
164
- if (node === document) break;
165
- if (node?.nodeType === 1 && node.hasAttribute?.('popover')) return;
166
- }
167
- this.#closeSpillover();
168
- };
169
-
170
- #onKey = (e) => {
171
- if (e.key === 'Escape') {
172
- e.stopPropagation();
173
- this.#closeSpillover();
174
- this.#trigger?.focus?.({ preventScroll: true });
175
- }
176
- };
177
-
178
- #onToggle = (e) => {
179
- if (e.newState === 'closed') {
180
- // Keep listeners cleaned up if closed externally.
181
- this.#spilloverCleanup?.();
182
- this.#spilloverCleanup = null;
183
- if (this.#rafId != null) {
184
- cancelAnimationFrame(this.#rafId);
185
- this.#rafId = null;
186
- }
187
- document.removeEventListener('pointerdown', this.#onOutside, true);
188
- document.removeEventListener('keydown', this.#onKey, true);
189
- }
190
- };
191
-
192
- // ── Reflow / overflow ──
193
-
194
- #queueReflow() {
195
- if (this.#reflowQueued) return;
196
- this.#reflowQueued = true;
197
- this.#reflowRaf = requestAnimationFrame(() => {
198
- this.#reflowRaf = null;
199
- this.#reflowQueued = false;
200
- if (!this.isConnected) return;
201
- this.#reflow();
202
- });
203
- }
204
-
205
- #moObserve() {
206
- this.#mo?.observe(this, { childList: true });
207
- }
208
-
209
- #moPause() {
210
- // MutationObserver delivers records asynchronously, so the #measuring
211
- // flag alone doesn't stop self-triggered reflows — by the time the
212
- // observer's microtask fires, the flag has already been cleared. We must
213
- // physically disconnect during reflow, flush any pending records the
214
- // observer had already queued, then reconnect on the next microtask.
215
- if (!this.#mo) return;
216
- this.#mo.disconnect();
217
- this.#mo.takeRecords();
218
- }
219
-
220
- #reflow() {
221
- if (!this.isConnected) return;
222
- const trigger = this.#trigger;
223
- const popover = this.#popover;
224
- if (!trigger || !popover) return;
225
-
226
- this.#measuring = true;
227
- this.#moPause();
228
- try {
229
- // 1. Move everything from the popover back into the toolbar (before the trigger).
230
- // Strip injected spillover labels so the buttons measure as icon-only again.
231
- while (popover.firstChild) {
232
- stripSpilloverLabels(popover.firstChild);
233
- this.insertBefore(popover.firstChild, trigger);
234
- }
235
-
236
- // Stamp the original DOM order on each item the first time we see it.
237
- // (Items moved to the popover and back must restore their original slot —
238
- // otherwise dividers end up clumped next to dividers and groups split.)
239
- let idx = 0;
240
- for (const el of this.children) {
241
- if (el === trigger || el === popover) continue;
242
- if (el.dataset.toolbarOrder == null) el.dataset.toolbarOrder = String(idx);
243
- idx += 1;
244
- }
245
-
246
- // Sort items back into their original order before measurement.
247
- const ordered = Array.from(this.children)
248
- .filter(c => c !== trigger && c !== popover)
249
- .sort((a, b) => Number(a.dataset.toolbarOrder) - Number(b.dataset.toolbarOrder));
250
- for (const el of ordered) this.insertBefore(el, trigger);
251
-
252
- const all = ordered;
253
- for (const el of all) el.hidden = false;
254
- trigger.hidden = true;
255
-
256
- // 2. Measure.
257
- const style = getComputedStyle(this);
258
- const padL = parseFloat(style.paddingLeft) || 0;
259
- const padR = parseFloat(style.paddingRight) || 0;
260
- const gap = parseFloat(style.columnGap || style.gap) || 0;
261
- const available = this.clientWidth - padL - padR;
262
-
263
- // Include horizontal margins — components like divider-ui add their own
264
- // margin-inline which getBoundingClientRect() does NOT include but flex
265
- // layout DOES count toward the row width.
266
- const widths = all.map(el => outerWidth(el));
267
- const total = widths.reduce((a, w) => a + w, 0) + Math.max(0, all.length - 1) * gap;
268
-
269
- // Reserve OVERFLOW_BUFFER worth of headroom — start spilling sooner
270
- // rather than waiting until items literally touch the right edge.
271
- const fitsCleanly = total <= available - OVERFLOW_BUFFER;
272
-
273
- if (this.overflow === 'none' || fitsCleanly) {
274
- return;
275
- }
276
-
277
- // 3. Need to move some items out. Reserve trigger width + buffer.
278
- trigger.hidden = false;
279
- const triggerW = outerWidth(trigger);
280
-
281
- let fitIdx = all.length;
282
- let running = total;
283
- // Drop items from the end (and subtract their width + preceding gap)
284
- // until visible items + trigger fit with buffer headroom.
285
- while (fitIdx > 0) {
286
- const wWithTrigger = running + gap + triggerW;
287
- if (wWithTrigger <= available - OVERFLOW_BUFFER) break;
288
- fitIdx -= 1;
289
- running -= widths[fitIdx];
290
- if (fitIdx > 0) running -= gap;
291
- }
292
-
293
- // 4. Trim trailing dividers from visible section.
294
- while (fitIdx > 0 && isDivider(all[fitIdx - 1])) fitIdx -= 1;
295
-
296
- // 5. Move overflowed items into popover (skip dividers entirely).
297
- const toMove = all.slice(fitIdx);
298
- for (const el of toMove) {
299
- if (isDivider(el)) {
300
- el.hidden = true;
301
- continue;
302
- }
303
- // Inject derived labels on icon-only buttons so the spillover row
304
- // shows "Bold" instead of just an unlabeled icon.
305
- applySpilloverLabels(el);
306
- popover.appendChild(el);
307
- }
308
-
309
- // 6. If nothing actually ended up in the popover (e.g. only a divider overflowed),
310
- // hide the trigger again.
311
- if (!popover.firstElementChild) {
312
- trigger.hidden = true;
313
- }
314
- } finally {
315
- this.#measuring = false;
316
- // Drop any mutation records our reflow produced before reconnecting,
317
- // otherwise they'd fire as soon as we observe() again and loop forever.
318
- queueMicrotask(() => {
319
- this.#mo?.takeRecords();
320
- this.#moObserve();
321
- });
322
- }
323
- }
324
- }
325
- customElements.define('toolbar-ui', UIToolbar);
326
-
327
- /**
328
- * <toolbar-group-ui> — atomic group within a toolbar.
329
- * Its children are displayed together with matching gap and, during overflow,
330
- * are moved to the spillover menu as a single unit.
7
+ * import { UIToolbar, UIToolbarGroup } from '@adia-ai/web-components/components/toolbar/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
331
10
  */
332
- class UIToolbarGroup extends UIElement {
333
- static template = () => null;
334
- connected() {
335
- this.setAttribute('role', 'group');
336
- }
337
- }
338
- customElements.define('toolbar-group-ui', UIToolbarGroup);
339
-
340
- function isDivider(el) {
341
- return el?.tagName && el.tagName.toLowerCase() === 'divider-ui';
342
- }
343
-
344
- const SPILLOVER_LABEL_FLAG = 'data-toolbar-spillover-label';
345
-
346
- function humanizeIcon(name) {
347
- if (!name) return '';
348
- return name
349
- .split('-')
350
- .filter(Boolean)
351
- .map(w => w[0].toUpperCase() + w.slice(1))
352
- .join(' ');
353
- }
354
-
355
- function applySpilloverLabels(root) {
356
- const buttons = root.matches?.('button-ui') ? [root] : Array.from(root.querySelectorAll?.('button-ui') || []);
357
- for (const btn of buttons) {
358
- if (btn.hasAttribute(SPILLOVER_LABEL_FLAG)) continue;
359
- if (btn.getAttribute('text')) continue; // user-provided text, leave alone
360
- const label = btn.getAttribute('aria-label') || humanizeIcon(btn.getAttribute('icon'));
361
- if (!label) continue;
362
- btn.setAttribute(SPILLOVER_LABEL_FLAG, '');
363
- btn.setAttribute('text', label);
364
- }
365
- }
366
11
 
367
- function stripSpilloverLabels(root) {
368
- const buttons = root.matches?.('button-ui') ? [root] : Array.from(root.querySelectorAll?.('button-ui') || []);
369
- for (const btn of buttons) {
370
- if (!btn.hasAttribute(SPILLOVER_LABEL_FLAG)) continue;
371
- btn.removeAttribute(SPILLOVER_LABEL_FLAG);
372
- btn.removeAttribute('text');
373
- }
374
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIToolbar, UIToolbarGroup } from './class.js';
375
14
 
376
- function outerWidth(el) {
377
- const r = el.getBoundingClientRect();
378
- const cs = getComputedStyle(el);
379
- const ml = parseFloat(cs.marginLeft) || 0;
380
- const mr = parseFloat(cs.marginRight) || 0;
381
- return r.width + ml + mr;
382
- }
15
+ defineIfFree('toolbar-ui', UIToolbar);
16
+ defineIfFree('toolbar-group-ui', UIToolbarGroup);
383
17
 
384
18
  export { UIToolbar, UIToolbarGroup };
@@ -8,6 +8,10 @@ category: layout
8
8
  version: 1
9
9
  description: Horizontal action bar with automatic overflow. Items that don't fit move to a spillover
10
10
  popover menu.
11
+ # Per ADR-0027 — primitives that programmatically create other primitives
12
+ # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
13
+ composes:
14
+ - button-ui
11
15
  props:
12
16
  bordered:
13
17
  description: Adds a border around the toolbar for visual separation from surrounding content.