@adia-ai/web-components 0.8.40 → 0.8.41

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 (378) hide show
  1. package/CHANGELOG.md +50 -3
  2. package/MIGRATION.md +1042 -16
  3. package/README.md +25 -30
  4. package/USAGE.md +26 -0
  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 +24 -2
  11. package/components/action-list/action-item.yaml +28 -3
  12. package/components/action-list/action-list.a2ui.json +6 -1
  13. package/components/action-list/action-list.class.js +52 -11
  14. package/components/action-list/action-list.css +43 -3
  15. package/components/action-list/action-list.d.ts +4 -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 +9 -4
  63. package/components/chart/chart.class.js +6 -6
  64. package/components/chart/chart.css +6 -4
  65. package/components/chart/chart.d.ts +1 -1
  66. package/components/chart/chart.yaml +5 -3
  67. package/components/chart-legend/chart-legend.a2ui.json +1 -0
  68. package/components/chat-thread/chat-input.a2ui.json +1 -0
  69. package/components/chat-thread/chat-thread.a2ui.json +10 -9
  70. package/components/chat-thread/chat-thread.yaml +13 -20
  71. package/components/check/check.a2ui.json +10 -9
  72. package/components/check/check.yaml +4 -4
  73. package/components/code/code.a2ui.json +1 -0
  74. package/components/col/col.a2ui.json +1 -0
  75. package/components/color-input/color-input.a2ui.json +1 -0
  76. package/components/color-picker/color-picker.a2ui.json +1 -0
  77. package/components/combobox/combobox.a2ui.json +3 -2
  78. package/components/combobox/combobox.yaml +2 -2
  79. package/components/command/command.a2ui.json +12 -10
  80. package/components/command/command.class.js +3 -2
  81. package/components/command/command.yaml +17 -4
  82. package/components/context-menu/context-menu.a2ui.json +1 -0
  83. package/components/date-range-picker/date-range-picker.a2ui.json +2 -1
  84. package/components/date-range-picker/date-range-picker.yaml +1 -1
  85. package/components/datetime-picker/datetime-picker.a2ui.json +15 -108
  86. package/components/datetime-picker/datetime-picker.class.js +37 -690
  87. package/components/datetime-picker/datetime-picker.css +11 -183
  88. package/components/datetime-picker/datetime-picker.d.ts +4 -5
  89. package/components/datetime-picker/datetime-picker.yaml +44 -135
  90. package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
  91. package/components/demo-toggle/demo-toggle.css +1 -1
  92. package/components/description-list/description-list.a2ui.json +1 -0
  93. package/components/display-field/display-field.a2ui.json +1 -0
  94. package/components/divider/divider.a2ui.json +1 -0
  95. package/components/drawer/drawer.a2ui.json +1 -3
  96. package/components/drawer/drawer.css +1 -1
  97. package/components/drawer/drawer.yaml +0 -2
  98. package/components/drilldown/drilldown.a2ui.json +22 -20
  99. package/components/drilldown/drilldown.class.js +4 -3
  100. package/components/drilldown/drilldown.css +6 -6
  101. package/components/drilldown/drilldown.yaml +40 -9
  102. package/components/embed/embed.a2ui.json +6 -5
  103. package/components/embed/embed.yaml +2 -2
  104. package/components/empty-state/empty-state.a2ui.json +1 -0
  105. package/components/feed/feed-item.a2ui.json +25 -5
  106. package/components/feed/feed-item.yaml +28 -7
  107. package/components/feed/feed.a2ui.json +9 -2
  108. package/components/feed/feed.class.js +19 -12
  109. package/components/feed/feed.css +8 -8
  110. package/components/feed/feed.yaml +14 -1
  111. package/components/field/field.a2ui.json +1 -0
  112. package/components/field/field.examples.md +1 -1
  113. package/components/fields/fields.a2ui.json +1 -0
  114. package/components/fields/fields.examples.md +1 -1
  115. package/components/footer/footer.a2ui.json +1 -0
  116. package/components/frame/frame.a2ui.json +1 -0
  117. package/components/grid/grid.a2ui.json +1 -0
  118. package/components/header/header.a2ui.json +3 -2
  119. package/components/header/header.yaml +3 -3
  120. package/components/heatmap/heatmap.a2ui.json +2 -1
  121. package/components/heatmap/heatmap.class.js +1 -1
  122. package/components/heatmap/heatmap.css +4 -4
  123. package/components/heatmap/heatmap.yaml +1 -1
  124. package/components/icon/icon.a2ui.json +1 -0
  125. package/components/image/image.a2ui.json +28 -14
  126. package/components/image/image.class.js +38 -23
  127. package/components/image/image.css +18 -8
  128. package/components/image/image.d.ts +2 -2
  129. package/components/image/image.examples.md +3 -3
  130. package/components/image/image.yaml +23 -7
  131. package/components/inline-edit/inline-edit.a2ui.json +1 -0
  132. package/components/inline-message/inline-message.a2ui.json +3 -1
  133. package/components/inline-message/inline-message.class.js +3 -1
  134. package/components/inline-message/inline-message.d.ts +2 -2
  135. package/components/inline-message/inline-message.yaml +2 -1
  136. package/components/input/input.a2ui.json +66 -16
  137. package/components/input/input.class.js +64 -7
  138. package/components/input/input.css +14 -14
  139. package/components/input/input.d.ts +9 -4
  140. package/components/input/input.yaml +83 -10
  141. package/components/inspector/inspector.a2ui.json +1 -0
  142. package/components/integration-card/integration-card.a2ui.json +1 -0
  143. package/components/kbd/kbd.a2ui.json +1 -0
  144. package/components/link/link.a2ui.json +2 -1
  145. package/components/link/link.yaml +1 -1
  146. package/components/list/list-item.a2ui.json +9 -0
  147. package/components/list/list-item.yaml +12 -0
  148. package/components/list/list.a2ui.json +9 -3
  149. package/components/list/list.class.js +14 -1
  150. package/components/list/list.css +12 -1
  151. package/components/list/list.d.ts +7 -5
  152. package/components/list/list.yaml +16 -6
  153. package/components/list-window/list-window.a2ui.json +1 -0
  154. package/components/list-window/list-window.class.js +2 -1
  155. package/components/loading-overlay/loading-overlay.a2ui.json +1 -0
  156. package/components/mark/mark.a2ui.json +2 -1
  157. package/components/mark/mark.yaml +1 -1
  158. package/components/menu/menu-divider.a2ui.json +1 -0
  159. package/components/menu/menu-item.a2ui.json +3 -1
  160. package/components/menu/menu-item.yaml +6 -0
  161. package/components/menu/menu-label.a2ui.json +1 -0
  162. package/components/menu/menu.a2ui.json +3 -2
  163. package/components/menu/menu.class.js +2 -2
  164. package/components/menu/menu.d.ts +2 -2
  165. package/components/menu/menu.yaml +3 -3
  166. package/components/modal/modal.a2ui.json +1 -0
  167. package/components/nav/nav.a2ui.json +1 -0
  168. package/components/nav/nav.class.js +14 -3
  169. package/components/nav-group/nav-group.a2ui.json +1 -0
  170. package/components/nav-group/nav-group.class.js +3 -1
  171. package/components/nav-item/nav-item.a2ui.json +1 -0
  172. package/components/noodles/noodles.a2ui.json +1 -0
  173. package/components/noodles/noodles.class.js +5 -1
  174. package/components/number-format/number-format.a2ui.json +1 -0
  175. package/components/option-card/option-card.a2ui.json +1 -0
  176. package/components/otp-input/otp-input.a2ui.json +3 -2
  177. package/components/otp-input/otp-input.yaml +9 -2
  178. package/components/page/page.a2ui.json +13 -0
  179. package/components/page/page.d.ts +1 -1
  180. package/components/page/page.yaml +1 -0
  181. package/components/pagination/pagination.a2ui.json +1 -0
  182. package/components/pagination/pagination.class.js +3 -2
  183. package/components/pane/pane.a2ui.json +6 -0
  184. package/components/pane/pane.class.js +3 -3
  185. package/components/pane/pane.css +2 -2
  186. package/components/pane/pane.yaml +3 -0
  187. package/components/password-strength/password-strength.a2ui.json +1 -0
  188. package/components/pipeline-status/pipeline-status.a2ui.json +1 -0
  189. package/components/popover/popover.a2ui.json +7 -6
  190. package/components/popover/popover.class.js +2 -2
  191. package/components/popover/popover.d.ts +2 -2
  192. package/components/popover/popover.yaml +4 -4
  193. package/components/preview/preview.a2ui.json +1 -0
  194. package/components/preview/preview.class.js +5 -1
  195. package/components/progress/progress.a2ui.json +47 -24
  196. package/components/progress/progress.class.js +66 -11
  197. package/components/progress/progress.css +44 -26
  198. package/components/progress/progress.d.ts +7 -5
  199. package/components/progress/progress.examples.md +2 -2
  200. package/components/progress/progress.yaml +235 -53
  201. package/components/progress-row/progress-row.a2ui.json +16 -12
  202. package/components/progress-row/progress-row.d.ts +2 -2
  203. package/components/progress-row/progress-row.examples.md +2 -14
  204. package/components/progress-row/progress-row.yaml +28 -36
  205. package/components/qr-code/qr-code.a2ui.json +3 -2
  206. package/components/qr-code/qr-code.class.js +4 -4
  207. package/components/qr-code/qr-code.css +1 -1
  208. package/components/qr-code/qr-code.yaml +5 -3
  209. package/components/radio/radio.a2ui.json +8 -7
  210. package/components/radio/radio.class.js +8 -0
  211. package/components/radio/radio.yaml +3 -3
  212. package/components/radio-group/radio-group.a2ui.json +5 -3
  213. package/components/radio-group/radio-group.class.js +11 -0
  214. package/components/radio-group/radio-group.yaml +7 -1
  215. package/components/range/range.a2ui.json +6 -0
  216. package/components/range/range.class.js +2 -2
  217. package/components/range/range.css +2 -2
  218. package/components/range/range.yaml +3 -0
  219. package/components/rating/rating.a2ui.json +1 -0
  220. package/components/relative-time/relative-time.a2ui.json +1 -0
  221. package/components/richtext/richtext.a2ui.json +2 -1
  222. package/components/richtext/richtext.yaml +1 -1
  223. package/components/row/row.a2ui.json +1 -0
  224. package/components/search/search.a2ui.json +1 -0
  225. package/components/search/search.class.js +4 -1
  226. package/components/section/section.a2ui.json +1 -0
  227. package/components/segment/segment.a2ui.json +21 -10
  228. package/components/segment/segment.css +15 -0
  229. package/components/segment/segment.d.ts +2 -1
  230. package/components/segment/segment.yaml +20 -13
  231. package/components/segmented/segmented.a2ui.json +36 -7
  232. package/components/segmented/segmented.class.js +113 -22
  233. package/components/segmented/segmented.css +3 -0
  234. package/components/segmented/segmented.d.ts +3 -1
  235. package/components/segmented/segmented.yaml +80 -8
  236. package/components/select/select.a2ui.json +18 -13
  237. package/components/select/select.class.js +61 -37
  238. package/components/select/select.css +15 -13
  239. package/components/select/select.yaml +18 -7
  240. package/components/skeleton/skeleton.a2ui.json +8 -7
  241. package/components/skeleton/skeleton.class.js +8 -7
  242. package/components/skeleton/skeleton.css +21 -6
  243. package/components/skeleton/skeleton.d.ts +2 -2
  244. package/components/skeleton/skeleton.examples.md +2 -2
  245. package/components/skeleton/skeleton.yaml +3 -2
  246. package/components/skip-nav/skip-nav.a2ui.json +1 -0
  247. package/components/slider/slider.a2ui.json +6 -0
  248. package/components/slider/slider.class.js +20 -3
  249. package/components/slider/slider.css +2 -2
  250. package/components/slider/slider.yaml +3 -0
  251. package/components/spinner/spinner.a2ui.json +1 -0
  252. package/components/stack/stack.a2ui.json +1 -0
  253. package/components/stat/stat.a2ui.json +1 -0
  254. package/components/stat/stat.js +2 -2
  255. package/components/step-progress/step-progress.a2ui.json +1 -0
  256. package/components/step-progress/step-progress.yaml +1 -1
  257. package/components/stepper/stepper-item.a2ui.json +7 -3
  258. package/components/stepper/stepper-item.yaml +15 -5
  259. package/components/stepper/stepper.a2ui.json +5 -1
  260. package/components/stepper/stepper.class.js +31 -16
  261. package/components/stepper/stepper.d.ts +1 -1
  262. package/components/stepper/stepper.yaml +4 -2
  263. package/components/stream/stream.a2ui.json +1 -0
  264. package/components/swatch/swatch.a2ui.json +1 -0
  265. package/components/swiper/swiper.a2ui.json +1 -0
  266. package/components/swiper/swiper.class.js +5 -1
  267. package/components/switch/switch.a2ui.json +12 -11
  268. package/components/switch/switch.css +1 -1
  269. package/components/switch/switch.yaml +6 -6
  270. package/components/table/table.a2ui.json +1 -0
  271. package/components/table/table.class.js +14 -12
  272. package/components/table/table.css +11 -9
  273. package/components/table-toolbar/table-toolbar.a2ui.json +1 -0
  274. package/components/table-toolbar/table-toolbar.class.js +38 -19
  275. package/components/table-toolbar/table-toolbar.css +1 -1
  276. package/components/tabs/tab.a2ui.json +9 -0
  277. package/components/tabs/tab.js +4 -0
  278. package/components/tabs/tab.yaml +15 -0
  279. package/components/tabs/tabs.a2ui.json +9 -4
  280. package/components/tabs/tabs.class.js +13 -1
  281. package/components/tabs/tabs.css +8 -0
  282. package/components/tabs/tabs.d.ts +2 -0
  283. package/components/tabs/tabs.yaml +9 -2
  284. package/components/tag/tag.a2ui.json +1 -0
  285. package/components/tags-input/tags-input.a2ui.json +22 -17
  286. package/components/tags-input/tags-input.class.js +13 -11
  287. package/components/tags-input/tags-input.css +10 -6
  288. package/components/tags-input/tags-input.d.ts +16 -7
  289. package/components/tags-input/tags-input.examples.md +2 -2
  290. package/components/tags-input/tags-input.yaml +25 -8
  291. package/components/text/text.a2ui.json +6 -5
  292. package/components/text/text.css +10 -5
  293. package/components/text/text.d.ts +2 -2
  294. package/components/text/text.yaml +9 -4
  295. package/components/textarea/textarea.a2ui.json +2 -1
  296. package/components/textarea/textarea.yaml +1 -1
  297. package/components/theme-provider/theme-provider.a2ui.json +2 -1
  298. package/components/theme-provider/theme-provider.d.ts +5 -3
  299. package/components/theme-provider/theme-provider.yaml +5 -3
  300. package/components/time-picker/time-picker.a2ui.json +1 -0
  301. package/components/time-picker/time-picker.class.js +4 -2
  302. package/components/timeline/timeline-item.a2ui.json +26 -3
  303. package/components/timeline/timeline-item.yaml +22 -7
  304. package/components/timeline/timeline.a2ui.json +4 -0
  305. package/components/timeline/timeline.class.js +29 -18
  306. package/components/timeline/timeline.d.ts +3 -3
  307. package/components/timeline/timeline.yaml +2 -0
  308. package/components/toast/toast.a2ui.json +10 -3
  309. package/components/toast/toast.yaml +20 -13
  310. package/components/toc/toc.a2ui.json +1 -0
  311. package/components/toggle-group/toggle-group.a2ui.json +7 -3
  312. package/components/toggle-group/toggle-group.class.js +40 -1
  313. package/components/toggle-group/toggle-group.css +6 -1
  314. package/components/toggle-group/toggle-group.d.ts +2 -2
  315. package/components/toggle-group/toggle-group.yaml +21 -12
  316. package/components/toggle-group/toggle-option.a2ui.json +7 -3
  317. package/components/toggle-group/toggle-option.yaml +13 -7
  318. package/components/toggle-scheme/toggle-scheme.a2ui.json +2 -1
  319. package/components/toggle-scheme/toggle-scheme.yaml +1 -1
  320. package/components/toolbar/toolbar-group.a2ui.json +1 -0
  321. package/components/toolbar/toolbar.a2ui.json +1 -0
  322. package/components/toolbar/toolbar.class.js +3 -0
  323. package/components/tooltip/tooltip.a2ui.json +1 -0
  324. package/components/tour/tour-step.a2ui.json +4 -0
  325. package/components/tour/tour-step.yaml +2 -0
  326. package/components/tour/tour.a2ui.json +4 -0
  327. package/components/tour/tour.yaml +2 -0
  328. package/components/tree/tree-item.a2ui.json +5 -0
  329. package/components/tree/tree-item.yaml +3 -0
  330. package/components/tree/tree.a2ui.json +4 -0
  331. package/components/tree/tree.class.js +2 -1
  332. package/components/tree/tree.yaml +2 -0
  333. package/components/upload/upload.a2ui.json +8 -1
  334. package/components/upload/upload.class.js +35 -5
  335. package/components/upload/upload.css +28 -0
  336. package/components/upload/upload.d.ts +16 -0
  337. package/components/upload/upload.yaml +27 -7
  338. package/components/visually-hidden/visually-hidden.a2ui.json +1 -0
  339. package/core/dom.d.ts +11 -0
  340. package/core/dom.js +34 -0
  341. package/core/form.js +7 -0
  342. package/core/index.d.ts +1 -0
  343. package/core/index.js +1 -0
  344. package/core/responsive.js +16 -4
  345. package/core/template.js +2 -1
  346. package/custom-elements.json +437 -489
  347. package/dist/host.min.css +1 -1
  348. package/dist/host.sheet.js +1 -1
  349. package/dist/theme-provider.min.js +5 -5
  350. package/dist/web-components.min.css +1 -1
  351. package/dist/web-components.min.js +91 -104
  352. package/dist/web-components.sheet.js +1 -1
  353. package/package.json +4 -2
  354. package/patterns/conversion-funnel/conversion-funnel.examples.html +15 -15
  355. package/patterns/inline-dialog/inline-dialog.examples.html +2 -2
  356. package/patterns/inline-dialog/inline-dialog.html +4 -0
  357. package/patterns/timezone-selector/timezone-selector.examples.html +1 -1
  358. package/patterns/timezone-selector/timezone-selector.html +2 -2
  359. package/styles/api/text.css +7 -0
  360. package/traits/_catalog.json +129 -41
  361. package/traits/anchor-positioning/anchor-positioning.js +1 -0
  362. package/traits/announcer/announcer.js +1 -0
  363. package/traits/arrow-grid-nav/arrow-grid-nav.js +1 -0
  364. package/traits/attention-pulse/attention-pulse.js +1 -0
  365. package/traits/count-up/count-up.js +1 -0
  366. package/traits/define.js +78 -0
  367. package/traits/focus-restore/focus-restore.js +2 -1
  368. package/traits/haptic-feedback/haptic-feedback.js +1 -0
  369. package/traits/input-mask/input-mask.js +1 -0
  370. package/traits/intersection-observer/intersection-observer.js +1 -0
  371. package/traits/layout-animation/layout-animation.js +1 -0
  372. package/traits/noise-texture/noise-texture.js +1 -0
  373. package/traits/resize-observer/resize-observer.js +1 -0
  374. package/traits/scroll-progress/scroll-progress.js +1 -0
  375. package/traits/snap-to-grid/snap-to-grid.js +1 -0
  376. package/traits/sound-feedback/sound-feedback.js +1 -0
  377. package/traits/spring-animate/spring-animate.js +1 -0
  378. package/traits/validation/validation.js +1 -0
@@ -44,6 +44,7 @@
44
44
  */
45
45
 
46
46
  import { UIElement } from '../../core/element.js';
47
+ import { isNode } from '../../core/dom.js';
47
48
 
48
49
  export class UIListWindow extends UIElement {
49
50
  static properties = {
@@ -616,7 +617,7 @@ export class UIListWindow extends UIElement {
616
617
  try { content = renderFn(item, index); }
617
618
  catch (err) { console.warn('[list-window-ui] render() threw:', err); }
618
619
  }
619
- if (content instanceof Node) {
620
+ if (isNode(content)) {
620
621
  row.appendChild(content);
621
622
  } else if (content != null) {
622
623
  row.textContent = String(content);
@@ -88,6 +88,7 @@
88
88
  "wait"
89
89
  ],
90
90
  "name": "UILoadingOverlay",
91
+ "parts": {},
91
92
  "related": [
92
93
  "Spinner",
93
94
  "Skeleton",
@@ -40,7 +40,7 @@
40
40
  "wrong": "<mark>matched</mark>"
41
41
  }
42
42
  ],
43
- "category": "typography",
43
+ "category": "display",
44
44
  "composes": [],
45
45
  "events": {},
46
46
  "examples": [
@@ -57,6 +57,7 @@
57
57
  "emphasis"
58
58
  ],
59
59
  "name": "UIMark",
60
+ "parts": {},
60
61
  "related": [
61
62
  "text",
62
63
  "tag"
@@ -3,7 +3,7 @@ name: UIMark
3
3
  tag: mark-ui
4
4
  status: stable
5
5
  component: Mark
6
- category: typography
6
+ category: display
7
7
  version: 1
8
8
  description: |
9
9
  Highlighted inline text — token-driven theme-aware wrapper around the
@@ -33,6 +33,7 @@
33
33
  "menu-rule"
34
34
  ],
35
35
  "name": "UIMenuDivider",
36
+ "parts": {},
36
37
  "related": [
37
38
  "Menu",
38
39
  "MenuItem",
@@ -68,11 +68,13 @@
68
68
  "dropdown-item"
69
69
  ],
70
70
  "name": "UIMenuItem",
71
+ "parts": {},
71
72
  "related": [
72
73
  "Menu",
73
74
  "MenuDivider",
74
75
  "Button",
75
- "NavItem"
76
+ "NavItem",
77
+ "ActionItem"
76
78
  ],
77
79
  "slots": {
78
80
  "icon": {
@@ -79,6 +79,11 @@ a2ui:
79
79
  Use slot="icon" / slot="text" only when you need custom markup
80
80
  (e.g. <avatar-ui slot="icon">, <kbd slot="trailing"> shortcut
81
81
  hint).
82
+ - >-
83
+ <action-item-ui> (child of <action-list-ui>) shares this row contract
84
+ (icon/text/subtitle/value/variant/disabled props, icon/text/subtitle/
85
+ trailing slot overrides) for inline, non-popover command rows — use
86
+ it instead when the surface isn't a <menu-ui> popover (#1363 C5).
82
87
 
83
88
  keywords:
84
89
  - menu-item
@@ -91,6 +96,7 @@ related:
91
96
  - MenuDivider
92
97
  - Button
93
98
  - NavItem
99
+ - ActionItem
94
100
 
95
101
  synonyms:
96
102
  menu-item: [dropdown-item, menu-row, popover-action]
@@ -39,6 +39,7 @@
39
39
  "menu-heading"
40
40
  ],
41
41
  "name": "UIMenuLabel",
42
+ "parts": {},
42
43
  "related": [
43
44
  "Menu",
44
45
  "MenuItem",
@@ -16,8 +16,8 @@
16
16
  "component": {
17
17
  "const": "Menu"
18
18
  },
19
- "gap": {
20
- "description": "Gap in px",
19
+ "offset": {
20
+ "description": "Pixel offset between the anchor (trigger) and the menu popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053); matches popover-ui's own `[offset]` (same anchorPopover() helper).",
21
21
  "type": "number",
22
22
  "default": 4
23
23
  },
@@ -81,6 +81,7 @@
81
81
  "right-click"
82
82
  ],
83
83
  "name": "UIMenu",
84
+ "parts": {},
84
85
  "related": [
85
86
  "MenuItem",
86
87
  "MenuDivider",
@@ -35,7 +35,7 @@ export class UIMenu extends UIElement {
35
35
  static properties = {
36
36
  open: { type: Boolean, default: false, reflect: true },
37
37
  placement: { type: String, default: 'bottom-start', reflect: true },
38
- gap: { type: Number, default: 4, reflect: true },
38
+ offset: { type: Number, default: 4, reflect: true },
39
39
  };
40
40
 
41
41
  static template = () => null;
@@ -103,7 +103,7 @@ export class UIMenu extends UIElement {
103
103
  this.#anchorCleanup?.();
104
104
  this.#anchorCleanup = anchorPopover(trigger, pop, {
105
105
  placement: this.placement,
106
- gap: this.gap,
106
+ gap: this.offset,
107
107
  });
108
108
 
109
109
  // Focus first enabled item (only when opened via keyboard).
@@ -22,8 +22,8 @@ export interface MenuActionEventDetail {
22
22
  export type MenuActionEvent = CustomEvent<MenuActionEventDetail>;
23
23
 
24
24
  export class UIMenu extends UIElement {
25
- /** Gap in px */
26
- gap: number;
25
+ /** Pixel offset between the anchor (trigger) and the menu popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053); matches popover-ui's own `[offset]` (same anchorPopover() helper). */
26
+ offset: number;
27
27
  /** Controls visibility via popover API */
28
28
  open: boolean;
29
29
  /** Preferred position relative to the anchor element */
@@ -13,8 +13,8 @@ description: Dropdown action menu with roving focus and keyboard navigation. Use
13
13
  composes:
14
14
  - icon-ui # leading affordances on menu items (created in render)
15
15
  props:
16
- gap:
17
- description: Gap in px
16
+ offset:
17
+ description: Pixel offset between the anchor (trigger) and the menu popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053); matches popover-ui's own `[offset]` (same anchorPopover() helper).
18
18
  type: number
19
19
  default: 4
20
20
  open:
@@ -83,7 +83,7 @@ a2ui:
83
83
  Set [placement="top-start"] or [placement="top-end"] when the
84
84
  trigger sits near the bottom of the viewport (statusbar / footer
85
85
  menus); default [placement="bottom-start"] otherwise. Adjust
86
- [gap] (default 4px) only when chrome demands it.
86
+ [offset] (default 4px) only when chrome demands it.
87
87
  anti_patterns: []
88
88
  examples:
89
89
  - name: basic-menu
@@ -66,6 +66,7 @@
66
66
  "modal"
67
67
  ],
68
68
  "name": "UIModal",
69
+ "parts": {},
69
70
  "related": [
70
71
  "Drawer",
71
72
  "Card",
@@ -98,6 +98,7 @@
98
98
  "links"
99
99
  ],
100
100
  "name": "UINav",
101
+ "parts": {},
101
102
  "related": [
102
103
  "NavGroup",
103
104
  "NavItem",
@@ -78,8 +78,20 @@ export class UINav extends UIElement {
78
78
  if (this.variant !== 'section') this.#updateTooltips();
79
79
  }
80
80
 
81
+ /**
82
+ * Collapsed = explicit [collapsed], or a rail narrower than 96px.
83
+ * linkedom (SSR — gh#1436's render sweep) has no getBoundingClientRect
84
+ * at all, so only the attribute can answer there. (A ZERO rect from a
85
+ * real pre-layout connect is the separate, unswept shape-3 question in
86
+ * ssr-compatibility's failure-shapes.md — not decided here.)
87
+ */
88
+ get #isCollapsed() {
89
+ return this.collapsed ||
90
+ (typeof this.getBoundingClientRect === 'function' && this.getBoundingClientRect().width <= 96);
91
+ }
92
+
81
93
  #updateTooltips() {
82
- const isCollapsed = this.collapsed || this.getBoundingClientRect().width <= 96;
94
+ const isCollapsed = this.#isCollapsed;
83
95
  for (const group of this.querySelectorAll(':scope > nav-group-ui')) {
84
96
  const header = group.querySelector(':scope > [slot="header"]');
85
97
  if (header) header.title = isCollapsed ? group.text : '';
@@ -143,8 +155,7 @@ export class UINav extends UIElement {
143
155
 
144
156
  const group = e.target.closest('nav-group-ui');
145
157
  if (group && this.contains(group)) {
146
- const isCollapsed = this.collapsed || this.getBoundingClientRect().width <= 96;
147
- if (isCollapsed) {
158
+ if (this.#isCollapsed) {
148
159
  // The flyout popover is appended INSIDE the group, so an option
149
160
  // click bubbles here after the option's own handler has selected
150
161
  // and hidePopover()'d — re-showing would instantly reopen the
@@ -92,6 +92,7 @@
92
92
  "menu"
93
93
  ],
94
94
  "name": "UINavGroup",
95
+ "parts": {},
95
96
  "related": [
96
97
  "Nav",
97
98
  "NavItem",
@@ -99,7 +99,9 @@ export class UINavGroup extends UIElement {
99
99
  // whole subtree includes this host's own [selected], which render()
100
100
  // reads anyway; render() writes only the icon's [weight], which the
101
101
  // attributeFilter excludes, so the observer can't feed back.
102
- if (!this.#selectionObserver) {
102
+ // Guarded like the other Observer sites (gh#285 §1 pattern) — SSR shims
103
+ // have no MutationObserver; teardown already uses `?.disconnect()`.
104
+ if (!this.#selectionObserver && typeof MutationObserver !== 'undefined') {
103
105
  this.#selectionObserver = new MutationObserver(this.#onChildSelection);
104
106
  this.#selectionObserver.observe(this, {
105
107
  subtree: true,
@@ -96,6 +96,7 @@
96
96
  "sidebar"
97
97
  ],
98
98
  "name": "UINavItem",
99
+ "parts": {},
99
100
  "related": [
100
101
  "Nav",
101
102
  "NavGroup",
@@ -156,6 +156,7 @@
156
156
  "noodles"
157
157
  ],
158
158
  "name": "UINoodles",
159
+ "parts": {},
159
160
  "related": [
160
161
  "Canvas",
161
162
  "EditorCanvas"
@@ -24,6 +24,7 @@
24
24
  */
25
25
 
26
26
  import { UIElement } from '../../core/element.js';
27
+ import { isElement } from '../../core/dom.js';
27
28
 
28
29
  let nextId = 0;
29
30
 
@@ -159,6 +160,9 @@ export class UINoodles extends UIElement {
159
160
 
160
161
  #scheduleUpdate() {
161
162
  if (this.#rafId) return;
163
+ // No rAF (SSR shim — gh#1436's render sweep) → no frame and no layout
164
+ // to measure connectors against; the client redraws on hydrate.
165
+ if (typeof requestAnimationFrame !== 'function') return;
162
166
  this.#rafId = requestAnimationFrame(() => {
163
167
  this.#rafId = null;
164
168
  this.#performUpdate();
@@ -251,7 +255,7 @@ export class UINoodles extends UIElement {
251
255
  // ── Element resolution ──────────────────────────────────────
252
256
 
253
257
  #resolveElement(ref) {
254
- if (ref instanceof HTMLElement) return ref;
258
+ if (isElement(ref)) return ref;
255
259
  if (typeof ref === 'string') return this.querySelector(`#${CSS.escape(ref)}`);
256
260
  if (typeof ref === 'number') return this.#getPortChildren()[ref] ?? null;
257
261
  return null;
@@ -143,6 +143,7 @@
143
143
  "intl"
144
144
  ],
145
145
  "name": "UINumberFormat",
146
+ "parts": {},
146
147
  "related": [
147
148
  "stat",
148
149
  "text",
@@ -101,6 +101,7 @@
101
101
  "registration"
102
102
  ],
103
103
  "name": "UIOptionCard",
104
+ "parts": {},
104
105
  "related": [
105
106
  "radio",
106
107
  "card",
@@ -93,12 +93,13 @@
93
93
  "input"
94
94
  ],
95
95
  "name": "UIOtpInput",
96
+ "parts": {},
96
97
  "related": [
97
98
  "button"
98
99
  ],
99
100
  "slots": {
100
- "field": {
101
- "description": "Container for the digit input boxes and optional separator"
101
+ "digit": {
102
+ "description": "Each digit input box, one per [length] — the component's own real slot=\"digit\" attribute (gh#1461; renamed from the yaml's prior `field` key, which matched no DOM element otp-input-ui stamps). Rebuilt wholesale on every #stamp() (innerHTML wipe + recreate), so this is template-owned in current behavior, not an author-content insertion point; left under slots: here since reclassifying slots:/parts: is gh#1454's charter, not this ticket's."
102
103
  }
103
104
  },
104
105
  "states": [
@@ -44,8 +44,15 @@ events:
44
44
  type: string
45
45
  description: Combined digits at the moment of the change.
46
46
  slots:
47
- field:
48
- description: Container for the digit input boxes and optional separator
47
+ digit:
48
+ description: >-
49
+ Each digit input box, one per [length] — the component's own real
50
+ slot="digit" attribute (gh#1461; renamed from the yaml's prior `field`
51
+ key, which matched no DOM element otp-input-ui stamps). Rebuilt
52
+ wholesale on every #stamp() (innerHTML wipe + recreate), so this is
53
+ template-owned in current behavior, not an author-content insertion
54
+ point; left under slots: here since reclassifying slots:/parts: is
55
+ gh#1454's charter, not this ticket's.
49
56
  states:
50
57
  - name: idle
51
58
  description: Default, ready for interaction.
@@ -31,6 +31,18 @@
31
31
  "padding": {
32
32
  "description": "Page-padding scale from the spacing system. Accepts `0`–`8`\n(mapped to `--a-space-N`). Empty (no value) applies the\n`--page-padding` token; `0` removes padding.\n",
33
33
  "type": "string",
34
+ "enum": [
35
+ "",
36
+ "0",
37
+ "1",
38
+ "2",
39
+ "3",
40
+ "4",
41
+ "5",
42
+ "6",
43
+ "7",
44
+ "8"
45
+ ],
34
46
  "default": ""
35
47
  },
36
48
  "scroll": {
@@ -77,6 +89,7 @@
77
89
  "dashboard-page"
78
90
  ],
79
91
  "name": "UIPage",
92
+ "parts": {},
80
93
  "related": [
81
94
  "app-shell",
82
95
  "card",
@@ -29,7 +29,7 @@ Centered horizontally via `margin-inline: auto`.
29
29
  (mapped to `--a-space-N`). Empty (no value) applies the
30
30
  `--page-padding` token; `0` removes padding.
31
31
  */
32
- padding: string;
32
+ padding: '' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8';
33
33
  /** Sets the page as a scroll container. `overflow-y: auto`, full
34
34
  height, contained overscroll. Use when the page IS the scroll
35
35
  surface (standalone pages); leave off when nested inside a parent
@@ -47,6 +47,7 @@ props:
47
47
  `--page-padding` token; `0` removes padding.
48
48
  type: string
49
49
  default: ""
50
+ enum: ["", "0", "1", "2", "3", "4", "5", "6", "7", "8"]
50
51
  reflect: true
51
52
  stickyHeader:
52
53
  description: |
@@ -93,6 +93,7 @@
93
93
  "paging"
94
94
  ],
95
95
  "name": "UIPagination",
96
+ "parts": {},
96
97
  "related": [
97
98
  "input",
98
99
  "table"
@@ -211,11 +211,12 @@ export class UIPagination extends UIElement {
211
211
  // state comes from button-ui's primary surface matrix (the
212
212
  // canonical token chain) \u2014 not a pagination-tier re-impl.
213
213
  el.setAttribute('variant', 'primary');
214
- el.setAttribute('data-active', '');
214
+ // aria-current="page" alone carries the active-page state — no
215
+ // private data-active mirror (gh#1332 Category A; admin-roster's
216
+ // aria-checked precedent from PR #1438).
215
217
  el.setAttribute('aria-current', 'page');
216
218
  } else {
217
219
  el.setAttribute('variant', this.#restVariant());
218
- el.removeAttribute('data-active');
219
220
  el.removeAttribute('aria-current');
220
221
  }
221
222
  }
@@ -78,6 +78,7 @@
78
78
  "pane"
79
79
  ],
80
80
  "name": "UIPane",
81
+ "parts": {},
81
82
  "related": [
82
83
  "text-area"
83
84
  ],
@@ -93,6 +94,11 @@
93
94
  {
94
95
  "description": "Default, ready for interaction.",
95
96
  "name": "idle"
97
+ },
98
+ {
99
+ "description": "The resize handle is mid-drag (pointer down through pointerup/pointercancel).",
100
+ "attribute": "resizing",
101
+ "name": "resizing"
96
102
  }
97
103
  ],
98
104
  "status": "stable",
@@ -138,7 +138,7 @@ export class UIPane extends UIElement {
138
138
  // it, and works under touch. Cursor is locked at the documentElement
139
139
  // level so it stays `col-resize` across the whole viewport during drag,
140
140
  // not just over the 4px handle. CSS bypasses any width transition while
141
- // `[data-resizing]` is set, so resizes track the pointer 1:1.
141
+ // `[resizing]` is set, so resizes track the pointer 1:1.
142
142
 
143
143
  #onResizeDown = (e) => {
144
144
  if (!e.isPrimary) return;
@@ -147,7 +147,7 @@ export class UIPane extends UIElement {
147
147
  this.#startX = e.clientX;
148
148
  this.#startW = this.getBoundingClientRect().width;
149
149
  this.#pointerId = e.pointerId;
150
- this.setAttribute('data-resizing', '');
150
+ this.setAttribute('resizing', '');
151
151
 
152
152
  try { this.#resizeEl.setPointerCapture(e.pointerId); } catch {}
153
153
  this.#resizeEl.addEventListener('pointermove', this.#onResizeMove);
@@ -173,7 +173,7 @@ export class UIPane extends UIElement {
173
173
  #onResizeUp = () => {
174
174
  if (!this.#dragging) return;
175
175
  this.#dragging = false;
176
- this.removeAttribute('data-resizing');
176
+ this.removeAttribute('resizing');
177
177
  try { this.#resizeEl?.releasePointerCapture(this.#pointerId); } catch {}
178
178
  this.#pointerId = null;
179
179
  this.#resizeEl?.removeEventListener('pointermove', this.#onResizeMove);
@@ -58,7 +58,7 @@
58
58
  width updates track 1:1 instead of interpolating through a consumer-
59
59
  declared width transition (e.g. editor-shell's collapse animation).
60
60
  Mirrors the admin-sidebar pattern. */
61
- :scope[data-resizing] {
61
+ :scope[resizing] {
62
62
  user-select: none;
63
63
  transition: none;
64
64
  }
@@ -211,7 +211,7 @@
211
211
  background: var(--pane-resize-fg-hover);
212
212
  }
213
213
 
214
- :scope[data-resizing] [slot="resize"] {
214
+ :scope[resizing] [slot="resize"] {
215
215
  background: var(--pane-resize-fg-active);
216
216
  }
217
217
  }
@@ -71,6 +71,9 @@ slots:
71
71
  states:
72
72
  - name: idle
73
73
  description: Default, ready for interaction.
74
+ - name: resizing
75
+ description: The resize handle is mid-drag (pointer down through pointerup/pointercancel).
76
+ attribute: resizing
74
77
  traits: []
75
78
  tokens: {}
76
79
  requiredIcons:
@@ -71,6 +71,7 @@
71
71
  "security"
72
72
  ],
73
73
  "name": "UIPasswordStrength",
74
+ "parts": {},
74
75
  "related": [
75
76
  "input",
76
77
  "field",
@@ -76,6 +76,7 @@
76
76
  "status"
77
77
  ],
78
78
  "name": "UIPipelineStatus",
79
+ "parts": {},
79
80
  "related": [
80
81
  "AgentTrace",
81
82
  "Stepper",
@@ -16,16 +16,16 @@
16
16
  "component": {
17
17
  "const": "Popover"
18
18
  },
19
- "gap": {
20
- "description": "Pixel offset between the anchor and the popover",
21
- "type": "number",
22
- "default": 4
23
- },
24
19
  "match-width": {
25
20
  "description": "Size the content panel to the trigger's width instead of max-content. Opt-in — the default (unset) keeps every existing consumer's content-sized panel unchanged.",
26
21
  "type": "boolean",
27
22
  "default": false
28
23
  },
24
+ "offset": {
25
+ "description": "Pixel offset between the anchor and the popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053).",
26
+ "type": "number",
27
+ "default": 4
28
+ },
29
29
  "open": {
30
30
  "description": "Controls visibility via showPopover()/hidePopover()",
31
31
  "type": "boolean",
@@ -92,13 +92,14 @@
92
92
  "right-click"
93
93
  ],
94
94
  "name": "UIPopover",
95
+ "parts": {},
95
96
  "related": [
96
97
  "button",
97
98
  "divider"
98
99
  ],
99
100
  "slots": {
100
101
  "content": {
101
- "description": "Popover body — any interactive content. Hoisted to the top-layer via :popover-open when shown. Positioned via the Popover API + CSS Anchor Positioning per [placement] / [gap]; no manual positioning required."
102
+ "description": "Popover body — any interactive content. Hoisted to the top-layer via :popover-open when shown. Positioned via the Popover API + CSS Anchor Positioning per [placement] / [offset]; no manual positioning required."
102
103
  },
103
104
  "trigger": {
104
105
  "description": "Focusable element that opens the popover when activated. Typically <button-ui>, but any focusable element works (button, a link with href). MUST be focusable for keyboard accessibility — bare <span> or <div> children will not respond to keyboard activation. Positioned at the anchor point per [placement]."
@@ -37,7 +37,7 @@ const HOVER_CLOSE_DELAY = 120;
37
37
  export class UIPopover extends UIElement {
38
38
  static properties = {
39
39
  placement: { type: String, default: 'bottom', reflect: true },
40
- gap: { type: Number, default: 4, reflect: true },
40
+ offset: { type: Number, default: 4, reflect: true },
41
41
  open: { type: Boolean, default: false, reflect: true },
42
42
  trigger: { type: String, default: 'click', reflect: true },
43
43
  matchWidth: { type: Boolean, default: false, reflect: true, attribute: 'match-width' },
@@ -107,7 +107,7 @@ export class UIPopover extends UIElement {
107
107
  this.#anchorCleanup?.();
108
108
  this.#anchorCleanup = anchorPopover(trigger, content, {
109
109
  placement: this.placement,
110
- gap: this.gap,
110
+ gap: this.offset,
111
111
  matchWidth: this.matchWidth,
112
112
  });
113
113
 
@@ -13,8 +13,8 @@
13
13
  import { UIElement } from '../../core/element.js';
14
14
 
15
15
  export class UIPopover extends UIElement {
16
- /** Pixel offset between the anchor and the popover */
17
- gap: number;
16
+ /** Pixel offset between the anchor and the popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053). */
17
+ offset: number;
18
18
  /** Controls visibility via showPopover()/hidePopover() */
19
19
  open: boolean;
20
20
  /** Popover placement */
@@ -9,8 +9,8 @@ category: container
9
9
  version: 1
10
10
  description: "Popover using Popover API + CSS Anchor Positioning. Triggers: click, hover, manual."
11
11
  props:
12
- gap:
13
- description: Pixel offset between the anchor and the popover
12
+ offset:
13
+ description: Pixel offset between the anchor and the popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053).
14
14
  type: number
15
15
  default: 4
16
16
  match-width:
@@ -60,7 +60,7 @@ slots:
60
60
  description: >-
61
61
  Popover body — any interactive content. Hoisted to the top-layer
62
62
  via :popover-open when shown. Positioned via the Popover API +
63
- CSS Anchor Positioning per [placement] / [gap]; no manual
63
+ CSS Anchor Positioning per [placement] / [offset]; no manual
64
64
  positioning required.
65
65
  states:
66
66
  - name: idle
@@ -91,7 +91,7 @@ a2ui:
91
91
  width ≈ trigger width). Use `bottom-end` only when the trigger
92
92
  sits at the right edge of a container by construction (toolbar
93
93
  spillover). Use `top-*` when the trigger sits low in the
94
- viewport (statusbar). [gap] (default 4px) sets offset from anchor.
94
+ viewport (statusbar). [offset] (default 4px) sets offset from anchor.
95
95
  - >-
96
96
  [trigger="hover"] is for non-essential disclosure only — never
97
97
  use it for popovers containing inputs, destructive actions, or
@@ -61,6 +61,7 @@
61
61
  "codepen"
62
62
  ],
63
63
  "name": "UIPreview",
64
+ "parts": {},
64
65
  "related": [
65
66
  "Code",
66
67
  "Card"
@@ -171,7 +171,11 @@ export class UIPreview extends UIElement {
171
171
  }
172
172
  };
173
173
 
174
- #scheduleFit = () => requestAnimationFrame(this.#fit);
174
+ // No rAF (SSR shim — gh#1436's render sweep) nothing to measure; the
175
+ // client fits on hydrate.
176
+ #scheduleFit = () => {
177
+ if (typeof requestAnimationFrame === 'function') requestAnimationFrame(this.#fit);
178
+ };
175
179
 
176
180
  #observeFit() {
177
181
  this.#scheduleFit();