@adia-ai/web-components 0.8.40 → 0.8.42

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 (410) hide show
  1. package/CHANGELOG.md +71 -3
  2. package/MIGRATION.md +1229 -16
  3. package/README.md +25 -30
  4. package/USAGE.md +30 -4
  5. package/bin/audit-template-children.mjs +556 -0
  6. package/components/accordion/accordion-item.a2ui.json +4 -0
  7. package/components/accordion/accordion-item.yaml +2 -0
  8. package/components/accordion/accordion.a2ui.json +4 -0
  9. package/components/accordion/accordion.yaml +2 -0
  10. package/components/action-list/action-item.a2ui.json +29 -2
  11. package/components/action-list/action-item.yaml +46 -3
  12. package/components/action-list/action-list.a2ui.json +6 -1
  13. package/components/action-list/action-list.class.js +114 -11
  14. package/components/action-list/action-list.css +43 -3
  15. package/components/action-list/action-list.d.ts +6 -2
  16. package/components/action-list/action-list.yaml +5 -0
  17. package/components/adia-mark/adia-mark.a2ui.json +1 -0
  18. package/components/adia-wordmark/adia-wordmark.a2ui.json +1 -0
  19. package/components/agent-artifact/agent-artifact.a2ui.json +1 -0
  20. package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +6 -5
  21. package/components/agent-feedback-bar/agent-feedback-bar.yaml +6 -2
  22. package/components/agent-questions/agent-questions.a2ui.json +1 -0
  23. package/components/agent-reasoning/agent-reasoning.a2ui.json +6 -5
  24. package/components/agent-reasoning/agent-reasoning.yaml +6 -2
  25. package/components/agent-suggestions/agent-suggestions.a2ui.json +11 -2
  26. package/components/agent-suggestions/agent-suggestions.class.js +2 -1
  27. package/components/agent-suggestions/agent-suggestions.d.ts +4 -4
  28. package/components/agent-suggestions/agent-suggestions.yaml +4 -2
  29. package/components/agent-trace/agent-trace.a2ui.json +6 -5
  30. package/components/agent-trace/agent-trace.yaml +6 -2
  31. package/components/alert/alert.a2ui.json +1 -0
  32. package/components/alert/alert.css +1 -1
  33. package/components/anchor-bar/anchor-bar.a2ui.json +1 -0
  34. package/components/aside/aside.a2ui.json +1 -0
  35. package/components/avatar/avatar-group.a2ui.json +7 -1
  36. package/components/avatar/avatar-group.yaml +1 -0
  37. package/components/avatar/avatar.a2ui.json +12 -11
  38. package/components/avatar/avatar.d.ts +1 -1
  39. package/components/avatar/avatar.yaml +4 -4
  40. package/components/badge/badge.a2ui.json +1 -0
  41. package/components/block/block.a2ui.json +1 -0
  42. package/components/blockquote/blockquote.a2ui.json +1 -0
  43. package/components/breadcrumb/breadcrumb.a2ui.json +1 -0
  44. package/components/button/button.a2ui.json +1 -3
  45. package/components/button/button.yaml +1 -3
  46. package/components/calendar-grid/calendar-grid.a2ui.json +1 -0
  47. package/components/calendar-grid/calendar-grid.class.js +2 -1
  48. package/components/calendar-picker/calendar-picker.a2ui.json +143 -24
  49. package/components/calendar-picker/calendar-picker.class.js +490 -197
  50. package/components/calendar-picker/calendar-picker.css +120 -171
  51. package/components/calendar-picker/calendar-picker.yaml +225 -47
  52. package/components/canvas/canvas.a2ui.json +6 -5
  53. package/components/canvas/canvas.d.ts +37 -0
  54. package/components/canvas/canvas.js +72 -3
  55. package/components/canvas/canvas.yaml +6 -2
  56. package/components/card/card.a2ui.json +25 -2
  57. package/components/card/card.class.js +3 -0
  58. package/components/card/card.css +31 -1
  59. package/components/card/card.d.ts +2 -2
  60. package/components/card/card.examples.md +3 -3
  61. package/components/card/card.yaml +28 -4
  62. package/components/chart/chart.a2ui.json +27 -7
  63. package/components/chart/chart.class.js +64 -22
  64. package/components/chart/chart.css +6 -4
  65. package/components/chart/chart.d.ts +10 -4
  66. package/components/chart/chart.yaml +40 -6
  67. package/components/chart-legend/chart-legend.a2ui.json +7 -1
  68. package/components/chart-legend/chart-legend.class.js +59 -6
  69. package/components/chart-legend/chart-legend.css +5 -2
  70. package/components/chart-legend/chart-legend.d.ts +3 -1
  71. package/components/chart-legend/chart-legend.yaml +15 -1
  72. package/components/chat-thread/chat-input.a2ui.json +1 -0
  73. package/components/chat-thread/chat-thread.a2ui.json +10 -9
  74. package/components/chat-thread/chat-thread.yaml +13 -20
  75. package/components/check/check.a2ui.json +10 -9
  76. package/components/check/check.yaml +4 -4
  77. package/components/code/code.a2ui.json +1 -0
  78. package/components/col/col.a2ui.json +1 -0
  79. package/components/color-area/color-area.a2ui.json +148 -0
  80. package/components/color-area/color-area.class.js +657 -0
  81. package/components/color-area/color-area.css +188 -0
  82. package/components/color-area/color-area.d.ts +66 -0
  83. package/components/color-area/color-area.examples.md +19 -0
  84. package/components/color-area/color-area.js +17 -0
  85. package/components/color-area/color-area.yaml +183 -0
  86. package/components/color-input/color-input.a2ui.json +6 -5
  87. package/components/color-input/color-input.class.js +9 -6
  88. package/components/color-input/color-input.css +1 -1
  89. package/components/color-input/color-input.js +2 -2
  90. package/components/color-input/color-input.yaml +14 -12
  91. package/components/color-picker/color-picker.a2ui.json +16 -12
  92. package/components/color-picker/color-picker.class.js +24 -633
  93. package/components/color-picker/color-picker.css +14 -182
  94. package/components/color-picker/color-picker.yaml +41 -41
  95. package/components/combobox/combobox.a2ui.json +3 -2
  96. package/components/combobox/combobox.yaml +2 -2
  97. package/components/command/command.a2ui.json +12 -10
  98. package/components/command/command.class.js +3 -2
  99. package/components/command/command.yaml +17 -4
  100. package/components/context-menu/context-menu.a2ui.json +1 -0
  101. package/components/date-range-picker/date-range-picker.a2ui.json +2 -1
  102. package/components/date-range-picker/date-range-picker.yaml +1 -1
  103. package/components/datetime-picker/datetime-picker.a2ui.json +15 -108
  104. package/components/datetime-picker/datetime-picker.class.js +37 -690
  105. package/components/datetime-picker/datetime-picker.css +11 -183
  106. package/components/datetime-picker/datetime-picker.d.ts +4 -5
  107. package/components/datetime-picker/datetime-picker.yaml +44 -135
  108. package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
  109. package/components/demo-toggle/demo-toggle.css +1 -1
  110. package/components/description-list/description-list.a2ui.json +2 -1
  111. package/components/description-list/description-list.css +1 -1
  112. package/components/description-list/description-list.d.ts +1 -1
  113. package/components/description-list/description-list.yaml +1 -1
  114. package/components/display-field/display-field.a2ui.json +1 -0
  115. package/components/divider/divider.a2ui.json +1 -0
  116. package/components/drawer/drawer.a2ui.json +1 -3
  117. package/components/drawer/drawer.css +1 -1
  118. package/components/drawer/drawer.yaml +0 -2
  119. package/components/drilldown/drilldown.a2ui.json +22 -20
  120. package/components/drilldown/drilldown.class.js +4 -3
  121. package/components/drilldown/drilldown.css +6 -6
  122. package/components/drilldown/drilldown.yaml +40 -9
  123. package/components/embed/embed.a2ui.json +6 -5
  124. package/components/embed/embed.yaml +2 -2
  125. package/components/empty-state/empty-state.a2ui.json +1 -0
  126. package/components/feed/feed-item.a2ui.json +25 -5
  127. package/components/feed/feed-item.yaml +28 -7
  128. package/components/feed/feed.a2ui.json +9 -2
  129. package/components/feed/feed.class.js +19 -12
  130. package/components/feed/feed.css +8 -8
  131. package/components/feed/feed.yaml +14 -1
  132. package/components/field/field.a2ui.json +2 -1
  133. package/components/field/field.class.js +4 -1
  134. package/components/field/field.examples.md +1 -1
  135. package/components/field/field.yaml +1 -1
  136. package/components/fields/fields.a2ui.json +1 -0
  137. package/components/fields/fields.examples.md +1 -1
  138. package/components/footer/footer.a2ui.json +1 -0
  139. package/components/frame/frame.a2ui.json +1 -0
  140. package/components/grid/grid.a2ui.json +1 -0
  141. package/components/header/header.a2ui.json +3 -2
  142. package/components/header/header.yaml +3 -3
  143. package/components/heatmap/heatmap.a2ui.json +2 -1
  144. package/components/heatmap/heatmap.class.js +1 -1
  145. package/components/heatmap/heatmap.css +4 -4
  146. package/components/heatmap/heatmap.yaml +1 -1
  147. package/components/icon/icon.a2ui.json +1 -0
  148. package/components/image/image.a2ui.json +28 -14
  149. package/components/image/image.class.js +38 -23
  150. package/components/image/image.css +18 -8
  151. package/components/image/image.d.ts +2 -2
  152. package/components/image/image.examples.md +3 -3
  153. package/components/image/image.yaml +23 -7
  154. package/components/index.js +1 -0
  155. package/components/inline-edit/inline-edit.a2ui.json +1 -0
  156. package/components/inline-message/inline-message.a2ui.json +3 -1
  157. package/components/inline-message/inline-message.class.js +3 -1
  158. package/components/inline-message/inline-message.d.ts +2 -2
  159. package/components/inline-message/inline-message.yaml +2 -1
  160. package/components/input/input.a2ui.json +66 -16
  161. package/components/input/input.class.js +64 -7
  162. package/components/input/input.css +14 -14
  163. package/components/input/input.d.ts +9 -4
  164. package/components/input/input.yaml +83 -10
  165. package/components/inspector/inspector.a2ui.json +1 -0
  166. package/components/integration-card/integration-card.a2ui.json +1 -0
  167. package/components/integration-card/integration-card.examples.md +2 -1
  168. package/components/kbd/kbd.a2ui.json +1 -0
  169. package/components/link/link.a2ui.json +2 -1
  170. package/components/link/link.yaml +1 -1
  171. package/components/list/list-item.a2ui.json +9 -0
  172. package/components/list/list-item.yaml +12 -0
  173. package/components/list/list.a2ui.json +9 -3
  174. package/components/list/list.class.js +14 -1
  175. package/components/list/list.css +12 -1
  176. package/components/list/list.d.ts +7 -5
  177. package/components/list/list.yaml +16 -6
  178. package/components/list-window/list-window.a2ui.json +1 -0
  179. package/components/list-window/list-window.class.js +2 -1
  180. package/components/loading-overlay/loading-overlay.a2ui.json +1 -0
  181. package/components/mark/mark.a2ui.json +2 -1
  182. package/components/mark/mark.yaml +1 -1
  183. package/components/menu/menu-divider.a2ui.json +1 -0
  184. package/components/menu/menu-item.a2ui.json +11 -4
  185. package/components/menu/menu-item.yaml +30 -3
  186. package/components/menu/menu-label.a2ui.json +1 -0
  187. package/components/menu/menu.a2ui.json +3 -2
  188. package/components/menu/menu.class.js +36 -8
  189. package/components/menu/menu.d.ts +5 -3
  190. package/components/menu/menu.yaml +3 -3
  191. package/components/modal/modal.a2ui.json +1 -0
  192. package/components/nav/nav.a2ui.json +1 -0
  193. package/components/nav/nav.class.js +14 -3
  194. package/components/nav-group/nav-group.a2ui.json +1 -0
  195. package/components/nav-group/nav-group.class.js +3 -1
  196. package/components/nav-item/nav-item.a2ui.json +1 -0
  197. package/components/noodles/noodles.a2ui.json +1 -0
  198. package/components/noodles/noodles.class.js +5 -1
  199. package/components/number-format/number-format.a2ui.json +1 -0
  200. package/components/option-card/option-card.a2ui.json +1 -0
  201. package/components/otp-input/otp-input.a2ui.json +3 -2
  202. package/components/otp-input/otp-input.yaml +9 -2
  203. package/components/page/page.a2ui.json +13 -0
  204. package/components/page/page.d.ts +1 -1
  205. package/components/page/page.yaml +1 -0
  206. package/components/pagination/pagination.a2ui.json +1 -0
  207. package/components/pagination/pagination.class.js +3 -2
  208. package/components/pane/pane.a2ui.json +17 -1
  209. package/components/pane/pane.class.js +35 -6
  210. package/components/pane/pane.css +17 -12
  211. package/components/pane/pane.d.ts +10 -7
  212. package/components/pane/pane.yaml +18 -1
  213. package/components/password-strength/password-strength.a2ui.json +1 -0
  214. package/components/pipeline-status/pipeline-status.a2ui.json +1 -0
  215. package/components/popover/popover.a2ui.json +7 -6
  216. package/components/popover/popover.class.js +2 -2
  217. package/components/popover/popover.d.ts +2 -2
  218. package/components/popover/popover.yaml +4 -4
  219. package/components/preview/preview.a2ui.json +1 -0
  220. package/components/preview/preview.class.js +5 -1
  221. package/components/progress/progress.a2ui.json +47 -24
  222. package/components/progress/progress.class.js +66 -11
  223. package/components/progress/progress.css +44 -26
  224. package/components/progress/progress.d.ts +7 -5
  225. package/components/progress/progress.examples.md +2 -2
  226. package/components/progress/progress.yaml +235 -53
  227. package/components/progress-row/progress-row.a2ui.json +16 -12
  228. package/components/progress-row/progress-row.d.ts +2 -2
  229. package/components/progress-row/progress-row.examples.md +2 -14
  230. package/components/progress-row/progress-row.yaml +28 -36
  231. package/components/qr-code/qr-code.a2ui.json +3 -2
  232. package/components/qr-code/qr-code.class.js +4 -4
  233. package/components/qr-code/qr-code.css +1 -1
  234. package/components/qr-code/qr-code.yaml +5 -3
  235. package/components/radio/radio.a2ui.json +8 -7
  236. package/components/radio/radio.class.js +8 -0
  237. package/components/radio/radio.yaml +3 -3
  238. package/components/radio-group/radio-group.a2ui.json +5 -3
  239. package/components/radio-group/radio-group.class.js +11 -0
  240. package/components/radio-group/radio-group.yaml +7 -1
  241. package/components/range/range.a2ui.json +6 -0
  242. package/components/range/range.class.js +2 -2
  243. package/components/range/range.css +2 -2
  244. package/components/range/range.yaml +3 -0
  245. package/components/rating/rating.a2ui.json +1 -0
  246. package/components/relative-time/relative-time.a2ui.json +1 -0
  247. package/components/richtext/richtext.a2ui.json +2 -1
  248. package/components/richtext/richtext.yaml +1 -1
  249. package/components/row/row.a2ui.json +1 -0
  250. package/components/search/search.a2ui.json +1 -0
  251. package/components/search/search.class.js +4 -1
  252. package/components/section/section.a2ui.json +1 -0
  253. package/components/segment/segment.a2ui.json +21 -10
  254. package/components/segment/segment.css +15 -0
  255. package/components/segment/segment.d.ts +2 -1
  256. package/components/segment/segment.yaml +20 -13
  257. package/components/segmented/segmented.a2ui.json +36 -7
  258. package/components/segmented/segmented.class.js +113 -22
  259. package/components/segmented/segmented.css +3 -0
  260. package/components/segmented/segmented.d.ts +3 -1
  261. package/components/segmented/segmented.yaml +80 -8
  262. package/components/select/select.a2ui.json +18 -13
  263. package/components/select/select.class.js +61 -37
  264. package/components/select/select.css +15 -13
  265. package/components/select/select.yaml +18 -7
  266. package/components/skeleton/skeleton.a2ui.json +8 -7
  267. package/components/skeleton/skeleton.class.js +8 -7
  268. package/components/skeleton/skeleton.css +21 -6
  269. package/components/skeleton/skeleton.d.ts +2 -2
  270. package/components/skeleton/skeleton.examples.md +2 -2
  271. package/components/skeleton/skeleton.yaml +3 -2
  272. package/components/skip-nav/skip-nav.a2ui.json +1 -0
  273. package/components/slider/slider.a2ui.json +6 -0
  274. package/components/slider/slider.class.js +20 -3
  275. package/components/slider/slider.css +2 -2
  276. package/components/slider/slider.yaml +3 -0
  277. package/components/spinner/spinner.a2ui.json +1 -0
  278. package/components/stack/stack.a2ui.json +1 -0
  279. package/components/stat/stat.a2ui.json +1 -0
  280. package/components/stat/stat.js +2 -2
  281. package/components/step-progress/step-progress.a2ui.json +1 -0
  282. package/components/step-progress/step-progress.yaml +1 -1
  283. package/components/stepper/stepper-item.a2ui.json +7 -3
  284. package/components/stepper/stepper-item.yaml +15 -5
  285. package/components/stepper/stepper.a2ui.json +5 -1
  286. package/components/stepper/stepper.class.js +31 -16
  287. package/components/stepper/stepper.d.ts +1 -1
  288. package/components/stepper/stepper.yaml +4 -2
  289. package/components/stream/stream.a2ui.json +1 -0
  290. package/components/swatch/swatch.a2ui.json +1 -0
  291. package/components/swatch/swatch.yaml +1 -1
  292. package/components/swiper/swiper.a2ui.json +1 -0
  293. package/components/swiper/swiper.class.js +5 -1
  294. package/components/switch/switch.a2ui.json +12 -11
  295. package/components/switch/switch.css +1 -1
  296. package/components/switch/switch.yaml +6 -6
  297. package/components/table/table.a2ui.json +1 -0
  298. package/components/table/table.class.js +14 -12
  299. package/components/table/table.css +11 -9
  300. package/components/table-toolbar/table-toolbar.a2ui.json +1 -0
  301. package/components/table-toolbar/table-toolbar.class.js +53 -22
  302. package/components/table-toolbar/table-toolbar.css +1 -1
  303. package/components/tabs/tab.a2ui.json +9 -0
  304. package/components/tabs/tab.js +4 -0
  305. package/components/tabs/tab.yaml +15 -0
  306. package/components/tabs/tabs.a2ui.json +9 -4
  307. package/components/tabs/tabs.class.js +13 -1
  308. package/components/tabs/tabs.css +8 -0
  309. package/components/tabs/tabs.d.ts +2 -0
  310. package/components/tabs/tabs.yaml +9 -2
  311. package/components/tag/tag.a2ui.json +1 -0
  312. package/components/tags-input/tags-input.a2ui.json +22 -17
  313. package/components/tags-input/tags-input.class.js +13 -11
  314. package/components/tags-input/tags-input.css +10 -6
  315. package/components/tags-input/tags-input.d.ts +16 -7
  316. package/components/tags-input/tags-input.examples.md +2 -2
  317. package/components/tags-input/tags-input.yaml +25 -8
  318. package/components/text/text.a2ui.json +6 -5
  319. package/components/text/text.css +10 -5
  320. package/components/text/text.d.ts +2 -2
  321. package/components/text/text.yaml +9 -4
  322. package/components/textarea/textarea.a2ui.json +2 -1
  323. package/components/textarea/textarea.yaml +1 -1
  324. package/components/theme-provider/theme-provider.a2ui.json +2 -1
  325. package/components/theme-provider/theme-provider.d.ts +5 -3
  326. package/components/theme-provider/theme-provider.yaml +5 -3
  327. package/components/time-picker/time-picker.a2ui.json +1 -0
  328. package/components/time-picker/time-picker.class.js +4 -2
  329. package/components/timeline/timeline-item.a2ui.json +26 -3
  330. package/components/timeline/timeline-item.yaml +22 -7
  331. package/components/timeline/timeline.a2ui.json +4 -0
  332. package/components/timeline/timeline.class.js +29 -18
  333. package/components/timeline/timeline.d.ts +3 -3
  334. package/components/timeline/timeline.yaml +2 -0
  335. package/components/toast/toast.a2ui.json +10 -3
  336. package/components/toast/toast.yaml +20 -13
  337. package/components/toc/toc.a2ui.json +1 -0
  338. package/components/toggle-group/toggle-group.a2ui.json +7 -3
  339. package/components/toggle-group/toggle-group.class.js +40 -1
  340. package/components/toggle-group/toggle-group.css +6 -1
  341. package/components/toggle-group/toggle-group.d.ts +2 -2
  342. package/components/toggle-group/toggle-group.yaml +21 -12
  343. package/components/toggle-group/toggle-option.a2ui.json +7 -3
  344. package/components/toggle-group/toggle-option.yaml +13 -7
  345. package/components/toggle-scheme/toggle-scheme.a2ui.json +2 -1
  346. package/components/toggle-scheme/toggle-scheme.yaml +1 -1
  347. package/components/toolbar/toolbar-group.a2ui.json +1 -0
  348. package/components/toolbar/toolbar.a2ui.json +1 -0
  349. package/components/toolbar/toolbar.class.js +3 -0
  350. package/components/tooltip/tooltip.a2ui.json +1 -0
  351. package/components/tour/tour-step.a2ui.json +4 -0
  352. package/components/tour/tour-step.yaml +2 -0
  353. package/components/tour/tour.a2ui.json +4 -0
  354. package/components/tour/tour.yaml +2 -0
  355. package/components/tree/tree-item.a2ui.json +5 -0
  356. package/components/tree/tree-item.yaml +3 -0
  357. package/components/tree/tree.a2ui.json +4 -0
  358. package/components/tree/tree.class.js +2 -1
  359. package/components/tree/tree.yaml +2 -0
  360. package/components/upload/upload.a2ui.json +8 -1
  361. package/components/upload/upload.class.js +35 -5
  362. package/components/upload/upload.css +28 -0
  363. package/components/upload/upload.d.ts +16 -0
  364. package/components/upload/upload.yaml +27 -7
  365. package/components/visually-hidden/visually-hidden.a2ui.json +1 -0
  366. package/core/dom.d.ts +11 -0
  367. package/core/dom.js +34 -0
  368. package/core/form.js +7 -0
  369. package/core/icons.js +5 -0
  370. package/core/index.d.ts +1 -0
  371. package/core/index.js +1 -0
  372. package/core/responsive.js +16 -4
  373. package/core/template.js +2 -1
  374. package/custom-elements.json +710 -587
  375. package/dist/host.min.css +1 -1
  376. package/dist/host.sheet.js +1 -1
  377. package/dist/theme-provider.min.js +5 -5
  378. package/dist/web-components.min.css +1 -1
  379. package/dist/web-components.min.js +92 -105
  380. package/dist/web-components.sheet.js +1 -1
  381. package/index.d.ts +12 -1
  382. package/package.json +4 -2
  383. package/patterns/admin-shell/admin-shell.examples.html +2 -2
  384. package/patterns/conversion-funnel/conversion-funnel.examples.html +15 -15
  385. package/patterns/form-system/form-system.examples.html +1 -1
  386. package/patterns/inline-dialog/inline-dialog.examples.html +2 -2
  387. package/patterns/inline-dialog/inline-dialog.html +4 -0
  388. package/patterns/timezone-selector/timezone-selector.examples.html +1 -1
  389. package/patterns/timezone-selector/timezone-selector.html +2 -2
  390. package/styles/api/text.css +7 -0
  391. package/styles/components.css +1 -0
  392. package/traits/_catalog.json +129 -41
  393. package/traits/anchor-positioning/anchor-positioning.js +1 -0
  394. package/traits/announcer/announcer.js +1 -0
  395. package/traits/arrow-grid-nav/arrow-grid-nav.js +1 -0
  396. package/traits/attention-pulse/attention-pulse.js +1 -0
  397. package/traits/count-up/count-up.js +1 -0
  398. package/traits/define.js +78 -0
  399. package/traits/focus-restore/focus-restore.js +2 -1
  400. package/traits/haptic-feedback/haptic-feedback.js +1 -0
  401. package/traits/input-mask/input-mask.js +1 -0
  402. package/traits/intersection-observer/intersection-observer.js +1 -0
  403. package/traits/layout-animation/layout-animation.js +1 -0
  404. package/traits/noise-texture/noise-texture.js +1 -0
  405. package/traits/resize-observer/resize-observer.js +1 -0
  406. package/traits/scroll-progress/scroll-progress.js +1 -0
  407. package/traits/snap-to-grid/snap-to-grid.js +1 -0
  408. package/traits/sound-feedback/sound-feedback.js +1 -0
  409. package/traits/spring-animate/spring-animate.js +1 -0
  410. package/traits/validation/validation.js +1 -0
@@ -51,6 +51,9 @@
51
51
  ],
52
52
  "unevaluatedProperties": false,
53
53
  "x-adiaui": {
54
+ "allowedParents": [
55
+ "Tour"
56
+ ],
54
57
  "anti_patterns": [
55
58
  {
56
59
  "fix": "<tour-step target=\"#dashboard\">",
@@ -68,6 +71,7 @@
68
71
  "guided-step"
69
72
  ],
70
73
  "name": "UITourStep",
74
+ "parts": {},
71
75
  "related": [
72
76
  "tour"
73
77
  ],
@@ -60,6 +60,8 @@ states: []
60
60
  traits: []
61
61
  tokens: {}
62
62
  a2ui:
63
+ allowedParents:
64
+ - Tour
63
65
  rules:
64
66
  - rule: 'Single step inside <tour-ui>. Declares target (CSS selector) + title + body content.'
65
67
  reason: 'Data carrier for tour-ui.'
@@ -42,6 +42,9 @@
42
42
  ],
43
43
  "unevaluatedProperties": false,
44
44
  "x-adiaui": {
45
+ "allowedChildren": [
46
+ "TourStep"
47
+ ],
45
48
  "anti_patterns": [
46
49
  {
47
50
  "fix": "<tour-ui><tour-step target=\"#dashboard\" title=\"Dashboard\">Tour the dashboard…</tour-step>…</tour-ui>",
@@ -90,6 +93,7 @@
90
93
  "feature-introduction"
91
94
  ],
92
95
  "name": "UITour",
96
+ "parts": {},
93
97
  "related": [
94
98
  "tooltip",
95
99
  "popover",
@@ -110,6 +110,8 @@ tokens:
110
110
  description: Maximum width of the popover.
111
111
  default: 22rem
112
112
  a2ui:
113
+ allowedChildren:
114
+ - TourStep
113
115
  rules:
114
116
  - rule: 'Use tour-ui for spotlight-driven product tours / walkthroughs — sequence of steps each targeting a CSS-selector-resolved element.'
115
117
  reason: 'Primary use case — guided feature introduction.'
@@ -46,6 +46,10 @@
46
46
  ],
47
47
  "unevaluatedProperties": false,
48
48
  "x-adiaui": {
49
+ "allowedParents": [
50
+ "Tree",
51
+ "TreeItem"
52
+ ],
49
53
  "anti_patterns": [],
50
54
  "category": "data",
51
55
  "composes": [],
@@ -58,6 +62,7 @@
58
62
  "hierarchy-item"
59
63
  ],
60
64
  "name": "UITreeItem",
65
+ "parts": {},
61
66
  "related": [
62
67
  "Tree",
63
68
  "List",
@@ -61,6 +61,9 @@ slots:
61
61
  rather than wrapping below it.
62
62
 
63
63
  a2ui:
64
+ allowedParents:
65
+ - Tree
66
+ - TreeItem
64
67
  rules:
65
68
  - >-
66
69
  <tree-item-ui> MUST be a direct or nested descendant of
@@ -22,6 +22,9 @@
22
22
  ],
23
23
  "unevaluatedProperties": false,
24
24
  "x-adiaui": {
25
+ "allowedChildren": [
26
+ "TreeItem"
27
+ ],
25
28
  "anti_patterns": [],
26
29
  "category": "data",
27
30
  "composes": [
@@ -70,6 +73,7 @@
70
73
  "folder"
71
74
  ],
72
75
  "name": "UITree",
76
+ "parts": {},
73
77
  "related": [
74
78
  "TreeItem",
75
79
  "Nav",
@@ -33,6 +33,7 @@
33
33
  */
34
34
 
35
35
  import { UIElement } from '../../core/element.js';
36
+ import { isElement } from '../../core/dom.js';
36
37
 
37
38
  export class UITree extends UIElement {
38
39
  // §154 (v0.5.3): Phosphor icons this primitive auto-stamps (without
@@ -91,7 +92,7 @@ export class UITree extends UIElement {
91
92
  */
92
93
  #resolveItem(arg) {
93
94
  if (!arg) return null;
94
- if (arg instanceof Element) {
95
+ if (isElement(arg)) {
95
96
  return arg.matches?.('tree-item-ui') ? arg : null;
96
97
  }
97
98
  if (typeof arg === 'string') {
@@ -98,6 +98,8 @@ tokens:
98
98
  requiredIcons:
99
99
  - caret-right
100
100
  a2ui:
101
+ allowedChildren:
102
+ - TreeItem
101
103
  rules:
102
104
  - >-
103
105
  Use <tree-ui> only when data is hierarchical with arbitrary
@@ -23,6 +23,11 @@
23
23
  "type": "string",
24
24
  "default": ""
25
25
  },
26
+ "compact": {
27
+ "description": "Icon-only trigger mode (sanctioned mode attribute, gh#1493) — collapses the dropzone to a compact icon button. The prompt text and visible label hide; [label] feeds the trigger's aria-label (\"Upload files\" when unset).",
28
+ "type": "boolean",
29
+ "default": false
30
+ },
26
31
  "component": {
27
32
  "const": "Upload"
28
33
  },
@@ -90,9 +95,11 @@
90
95
  "import",
91
96
  "transfer",
92
97
  "file-manager",
93
- "files"
98
+ "files",
99
+ "compact"
94
100
  ],
95
101
  "name": "UIUpload",
102
+ "parts": {},
96
103
  "related": [
97
104
  "progress",
98
105
  "button",
@@ -21,11 +21,20 @@ import { UIFormElement } from '../../core/form.js';
21
21
 
22
22
  export class UIUpload extends UIFormElement {
23
23
  static labelDeprecated = false; // §170 (v0.5.4): label is first-class per upload.yaml
24
+ // Phosphor icons this primitive auto-stamps (without consumer markup).
25
+ // Aggregated by installIconLoadersForRegistered() across all defined
26
+ // elements. Audited by check-required-icons.mjs.
27
+ static requiredIcons = ['upload-simple'];
28
+
24
29
  static properties = {
25
30
  ...UIFormElement.properties,
26
31
  label: { type: String, default: '', reflect: true },
27
32
  accept: { type: String, default: '', reflect: true },
28
33
  multiple: { type: Boolean, default: false, reflect: true },
34
+ /* gh#1493 — sanctioned mode attribute (component-token-contract.md
35
+ § Variants vs modes): icon-only trigger. Collapses the dropzone to a
36
+ compact icon button; [label] feeds the trigger's aria-label. */
37
+ compact: { type: Boolean, default: false, reflect: true },
29
38
  };
30
39
 
31
40
  static template = () => null;
@@ -38,7 +47,7 @@ export class UIUpload extends UIFormElement {
38
47
 
39
48
  if (!this.querySelector('[data-dropzone]')) {
40
49
  this.innerHTML = `
41
- <div data-dropzone tabindex="0" role="button">Drop files here or click to browse</div>
50
+ <div data-dropzone tabindex="0" role="button"><icon-ui data-upload-icon name="upload-simple"></icon-ui><span data-upload-text>Drop files here or click to browse</span></div>
42
51
  <span hint="${this.hint || ''}"></span>
43
52
  <div data-filelist></div>
44
53
  `;
@@ -58,6 +67,15 @@ export class UIUpload extends UIFormElement {
58
67
  const filelist = this.querySelector('[data-filelist]');
59
68
  if (!this.#dropzoneEl || !filelist) return;
60
69
 
70
+ // Compact trigger a11y (gh#1493) — the icon-only surface has no visible
71
+ // text, so it needs an accessible name. [label] feeds it; the visible
72
+ // ::before label is CSS-hidden in [compact], so this is a move, not a dupe.
73
+ if (this.compact) {
74
+ this.#dropzoneEl.setAttribute('aria-label', this.label || 'Upload files');
75
+ } else {
76
+ this.#dropzoneEl.removeAttribute('aria-label');
77
+ }
78
+
61
79
  // Update hint attribute
62
80
  const hintEl = this.querySelector('span[hint]');
63
81
  if (hintEl && this.hint) hintEl.setAttribute('hint', this.hint);
@@ -77,16 +95,28 @@ export class UIUpload extends UIFormElement {
77
95
 
78
96
  // ── File picking ──
79
97
 
80
- #onClickZone = () => {
98
+ /**
99
+ * Programmatically open the file picker — the public trigger API
100
+ * (gh#1493). Equivalent to activating the dropzone, without reaching
101
+ * into the internal `[data-dropzone]` part. No-ops when [disabled].
102
+ * Note: browsers gate the native picker on transient user activation,
103
+ * so call this from within a user-gesture handler.
104
+ * @returns {Promise<void>} resolves after selection commits or the
105
+ * user cancels.
106
+ */
107
+ async open() {
81
108
  if (this.disabled) return;
82
- this.#pickFiles();
109
+ await this.#pickFiles();
110
+ }
111
+
112
+ #onClickZone = () => {
113
+ this.open();
83
114
  };
84
115
 
85
116
  #onKeyZone = (e) => {
86
- if (this.disabled) return;
87
117
  if (e.key === 'Enter' || e.key === ' ') {
88
118
  e.preventDefault();
89
- this.#pickFiles();
119
+ this.open();
90
120
  }
91
121
  };
92
122
 
@@ -23,6 +23,7 @@
23
23
 
24
24
  /* ── Spacing ── */
25
25
  --upload-dropzone-pad: var(--a-space-6);
26
+ --upload-compact-pad: var(--a-space-2);
26
27
 
27
28
  /* ── Transitions ── */
28
29
  --upload-duration: var(--a-duration-fast);
@@ -82,6 +83,33 @@
82
83
  background: var(--upload-bg-dragover);
83
84
  }
84
85
 
86
+ /* Stamped leading icon — hidden in the default (text) dropzone; it IS
87
+ the surface in [compact] icon-only mode. */
88
+ [data-upload-icon] {
89
+ display: none;
90
+ }
91
+
92
+ /* ── Mode: [compact] — icon-only trigger (gh#1493) ──
93
+ Sanctioned mode attribute; see component-token-contract.md
94
+ § Variants vs modes. Host shrink-wraps instead of filling the row,
95
+ the dropzone collapses to icon padding, the prompt text and ::before
96
+ label hide (label feeds the trigger's aria-label from class.js). */
97
+ :scope[compact] {
98
+ display: inline-flex;
99
+ }
100
+ :scope[compact]::before {
101
+ display: none;
102
+ }
103
+ :scope[compact] [data-dropzone] {
104
+ padding: var(--upload-compact-pad);
105
+ }
106
+ :scope[compact] [data-upload-icon] {
107
+ display: inline-flex;
108
+ }
109
+ :scope[compact] [data-upload-text] {
110
+ display: none;
111
+ }
112
+
85
113
  /* Hint via ::after on span */
86
114
  span[hint]::after {
87
115
  content: attr(hint);
@@ -23,6 +23,22 @@ export class UIUpload extends UIFormElement {
23
23
  accept: string;
24
24
  /** §207 (v0.5.7): allow multi-file selection. */
25
25
  multiple: boolean;
26
+ /**
27
+ * gh#1493: icon-only compact trigger mode (sanctioned mode attribute).
28
+ * Collapses the dropzone to a compact icon button; `label` feeds the
29
+ * trigger's `aria-label` (`"Upload files"` when unset).
30
+ */
31
+ compact: boolean;
32
+
33
+ /**
34
+ * gh#1493: programmatically open the file picker — the public trigger
35
+ * API. Equivalent to activating the dropzone, without reaching into the
36
+ * internal `[data-dropzone]` part. No-ops when `disabled`. Browsers gate
37
+ * the native picker on transient user activation, so call from within a
38
+ * user-gesture handler. Resolves after selection commits or the user
39
+ * cancels.
40
+ */
41
+ open(): Promise<void>;
26
42
 
27
43
  addEventListener<K extends keyof HTMLElementEventMap>(
28
44
  type: K,
@@ -40,6 +40,15 @@ props:
40
40
  description: Allows selecting multiple files
41
41
  type: boolean
42
42
  default: false
43
+ compact:
44
+ description: >-
45
+ Icon-only trigger mode (sanctioned mode attribute, gh#1493) —
46
+ collapses the dropzone to a compact icon button. The prompt text and
47
+ visible label hide; [label] feeds the trigger's aria-label
48
+ ("Upload files" when unset).
49
+ type: boolean
50
+ default: false
51
+ reflect: true
43
52
  value:
44
53
  description: Current value
45
54
  type: string
@@ -48,13 +57,19 @@ events:
48
57
  change:
49
58
  description: Fired when files are selected via click or drag-and-drop
50
59
  slots: {}
51
- # Authoring note (2026-05-26): the previous slots block declared
52
- # dropzone/filelist/hint/input/label, but class.js stamps these as
53
- # `<div data-dropzone>` / `<div data-filelist>` / `<span hint="…">` etc.
54
- # NOT as `[slot="X"]` anchors. `<upload-ui><div slot="dropzone">…`
55
- # wouldn't render (innerHTML stamp wipes child). Hint + label are
56
- # already declared as props above (text-only); for an avatar / icon
57
- # / form-element wrapper, compose <field-ui label> around the upload.
60
+ # Authoring note (2026-05-26, refreshed 2026-08-17 gh#1493): the previous
61
+ # slots block declared dropzone/filelist/hint/input/label, but class.js
62
+ # stamps these as `<div data-dropzone>` / `<div data-filelist>` /
63
+ # `<span hint="">` etc. — template-owned anatomy (ADR-0067 `parts:`
64
+ # semantics), NOT `[slot="X"]` insertion points. `<upload-ui><div
65
+ # slot="dropzone">…` wouldn't render (innerHTML stamp wipes child). They
66
+ # stay undeclared here because they are data-attr anatomy, not slot attrs
67
+ # (the audit-slot-vocab-vs-css vocabulary is slot-attr based). Consumers
68
+ # must NOT reach into `[data-dropzone]` to trigger the picker — that is
69
+ # what the public `.open()` method and the [compact] trigger mode are for
70
+ # (gh#1493). Hint + label are declared as props above (text-only); for an
71
+ # avatar / icon / form-element wrapper, compose <field-ui label> around
72
+ # the upload.
58
73
  states:
59
74
  - name: idle
60
75
  description: Default, ready for interaction.
@@ -63,12 +78,16 @@ states:
63
78
  attribute: disabled
64
79
  traits: []
65
80
  tokens: {}
81
+ requiredIcons:
82
+ - upload-simple
66
83
  a2ui:
67
84
  rules:
68
85
  - rule: 'File-upload input with drop zone + browse button. Form-associated; emits file-list change events.'
69
86
  reason: 'File-input canonical primitive.'
70
87
  - rule: 'Multiple attribute enables multi-file selection; accept= constrains file types.'
71
88
  reason: 'Standard file-input knobs.'
89
+ - rule: 'compact renders an icon-only trigger (no drop-zone chrome) — use in toolbars/dense rows; label becomes the trigger''s aria-label. Programmatic triggering goes through the public .open() method, never the internal [data-dropzone] part.'
90
+ reason: 'Public trigger API (gh#1493); internal anatomy is not a contract.'
72
91
  - rule: 'For agent chat attachments use <chat-composer-ui>''s built-in upload affordance instead.'
73
92
  reason: 'Chat composer has its own attachment lane.'
74
93
  anti_patterns: []
@@ -257,6 +276,7 @@ keywords:
257
276
  - transfer
258
277
  - file-manager
259
278
  - files
279
+ - compact
260
280
  synonyms:
261
281
  attach:
262
282
  - file
@@ -47,6 +47,7 @@
47
47
  "accessibility"
48
48
  ],
49
49
  "name": "UIVisuallyHidden",
50
+ "parts": {},
50
51
  "related": [
51
52
  "text"
52
53
  ],
package/core/dom.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Structural node/element guards — `nodeType`-based, so they hold under DOM
3
+ * shims (linkedom via custom-elements-ssr) where `Node`/`Element` are not
4
+ * globals and a bare `instanceof` throws (gh#1436).
5
+ */
6
+
7
+ /** True for any DOM node (anything with a numeric `nodeType`). */
8
+ export declare function isNode(v: unknown): v is Node;
9
+
10
+ /** True for ELEMENT_NODE (nodeType 1) only. */
11
+ export declare function isElement(v: unknown): v is Element;
package/core/dom.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * AdiaUI DOM guards — structural node/element tests that survive DOM shims.
3
+ *
4
+ * Why (gh#1436): under SSR shims such as linkedom via `custom-elements-ssr`,
5
+ * only `HTMLElement` is installed as a global — `Node`, `Element`, `Text`,
6
+ * `DocumentFragment` are not — so a bare `v instanceof Node` is a
7
+ * `ReferenceError`, not `false`. Testing the wire shape (`nodeType`) instead
8
+ * of the constructor identity works in browsers, happy-dom, and linkedom
9
+ * alike, and also matches nodes from another realm (iframe, DOMParser
10
+ * document) that `instanceof` against the main-window constructor would
11
+ * reject. Same failure shape as
12
+ * `.claude/skills/ssr-compatibility/references/guard-patterns.md` §1.
13
+ *
14
+ * Use these anywhere the framework accepts "a node or something else"
15
+ * (renderer return values, `ref` arguments, event targets) instead of a bare
16
+ * `instanceof <DOM constructor>`.
17
+ */
18
+
19
+ /**
20
+ * @param {unknown} v
21
+ * @returns {v is Node}
22
+ */
23
+ export function isNode(v) {
24
+ return v != null && typeof v === 'object' && typeof (/** @type {any} */ (v).nodeType) === 'number';
25
+ }
26
+
27
+ /**
28
+ * ELEMENT_NODE (1) only — excludes text, comment, fragment and document nodes.
29
+ * @param {unknown} v
30
+ * @returns {v is Element}
31
+ */
32
+ export function isElement(v) {
33
+ return isNode(v) && v.nodeType === 1;
34
+ }
package/core/form.js CHANGED
@@ -26,6 +26,13 @@
26
26
  * data-msg-pattern="Invalid format"
27
27
  * data-msg-minlength="Too short"
28
28
  * data-msg-maxlength="Too long"
29
+ * Numeric-constraint siblings read by individual subclasses (input, tags-input):
30
+ * data-msg-min / data-msg-max / data-msg-bad-input
31
+ * This whole `data-msg-*` family is deliberately EXEMPT from yaml `states:`/
32
+ * `props:` declaration — component-side config read by this shared mixin
33
+ * across 7+ consuming components, not a per-component state or prop.
34
+ * Disposition + rationale: primitive-authoring's yaml-contract.md
35
+ * (gh#1332/#1464, ADR-0060 §Decision 3).
29
36
  *
30
37
  * Manual control:
31
38
  * el.validate() → returns boolean, surfaces error
package/core/icons.js CHANGED
@@ -306,6 +306,11 @@ function discoverRequiredIcons() {
306
306
  'agent-trace-ui',
307
307
  'calendar-picker-ui',
308
308
  'color-picker-ui',
309
+ // ADR-0063 (gh#1563) — color-picker-ui's real implementation moved to
310
+ // color-area-ui (the new canonical tag); color-picker-ui is now a thin
311
+ // deprecated alias. Both need to resolve here since either tag may be
312
+ // the one actually defined+used on a given page.
313
+ 'color-area-ui',
309
314
  'command-ui',
310
315
  'pane-ui',
311
316
  'select-ui',
package/core/index.d.ts CHANGED
@@ -15,3 +15,4 @@ export * from './register.js';
15
15
  // explicit form so the type barrel matches the runtime exactly.
16
16
  export { streams, whenStream } from './data-stream.js';
17
17
  export type { StreamEntry } from './data-stream.js';
18
+ export * from './dom.js';
package/core/index.js CHANGED
@@ -32,3 +32,4 @@ export * from './polyfills.js';
32
32
  export { streams, whenStream } from './data-stream.js';
33
33
  export * from './streams-bridge.js';
34
34
  export * from './responsive.js';
35
+ export * from './dom.js';
@@ -49,9 +49,20 @@ const BP_VALS = /** @type {number[]} */ (Object.values(BREAKPOINTS));
49
49
 
50
50
  // ─── Active-breakpoint signal ─────────────────────────────────────────────────
51
51
 
52
+ // Feature-detect, never environment-detect (gh#1430): SSR DOM shims
53
+ // (linkedom under custom-elements-ssr) define `window` as an object with
54
+ // no layout engine — `innerWidth` is undefined and `matchMedia` is absent —
55
+ // so `typeof window !== 'undefined'` passes there and the browser-only
56
+ // call throws at module import, taking every importer (row/col/grid/
57
+ // block/text) off the server. Same guard shape as
58
+ // `.claude/skills/ssr-compatibility/references/guard-patterns.md` §1.
59
+
52
60
  function _detect() {
53
- if (typeof window === 'undefined') return 'lg'; // SSR / non-browser fallback
54
- const w = window.innerWidth;
61
+ // A real viewport reports a numeric width; SSR / DOM shims / non-browser
62
+ // runtimes don't → the widest-common fallback so server output isn't a
63
+ // mobile layout.
64
+ const w = typeof window !== 'undefined' ? window.innerWidth : undefined;
65
+ if (typeof w !== 'number') return 'lg';
55
66
  for (let i = BP_NAMES.length - 1; i >= 0; i--) {
56
67
  if (w >= BP_VALS[i]) return BP_NAMES[i];
57
68
  }
@@ -67,8 +78,9 @@ function _detect() {
67
78
  */
68
79
  export const breakpoint = signal(_detect());
69
80
 
70
- // Wire matchMedia listeners once (browser only, skipped in SSR / tests)
71
- if (typeof window !== 'undefined') {
81
+ // Wire matchMedia listeners once only where the API exists (browser).
82
+ // Skipped under SSR shims and non-DOM tests; nothing to observe there.
83
+ if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
72
84
  // One listener per non-zero threshold; fires whenever the viewport crosses
73
85
  // that boundary in either direction.
74
86
  for (let i = 1; i < BP_VALS.length; i++) {
package/core/template.js CHANGED
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import { effect, isSignal } from './signals.js';
14
+ import { isNode } from './dom.js';
14
15
 
15
16
  const [PART, KEY_MAP] = [Symbol(), Symbol()];
16
17
 
@@ -467,7 +468,7 @@ function applyValue(p, v) {
467
468
  c.appendChild(document.createTextNode(item ?? ''));
468
469
  }
469
470
  }
470
- } else if (v instanceof Node) {
471
+ } else if (isNode(v)) {
471
472
  p.n.replaceWith(v);
472
473
  p.n = v;
473
474
  } else if (p.n[PART]) {