@adia-ai/web-components 0.8.39 → 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 (424) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/MIGRATION.md +1269 -3
  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-artifact/agent-artifact.css +1 -1
  21. package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +6 -5
  22. package/components/agent-feedback-bar/agent-feedback-bar.yaml +6 -2
  23. package/components/agent-questions/agent-questions.a2ui.json +1 -0
  24. package/components/agent-reasoning/agent-reasoning.a2ui.json +6 -5
  25. package/components/agent-reasoning/agent-reasoning.css +2 -2
  26. package/components/agent-reasoning/agent-reasoning.yaml +6 -2
  27. package/components/agent-suggestions/agent-suggestions.a2ui.json +11 -2
  28. package/components/agent-suggestions/agent-suggestions.class.js +2 -1
  29. package/components/agent-suggestions/agent-suggestions.d.ts +4 -4
  30. package/components/agent-suggestions/agent-suggestions.yaml +4 -2
  31. package/components/agent-trace/agent-trace.a2ui.json +6 -5
  32. package/components/agent-trace/agent-trace.css +3 -3
  33. package/components/agent-trace/agent-trace.yaml +6 -2
  34. package/components/alert/alert.a2ui.json +1 -0
  35. package/components/alert/alert.css +2 -2
  36. package/components/anchor-bar/anchor-bar.a2ui.json +1 -0
  37. package/components/aside/aside.a2ui.json +1 -0
  38. package/components/avatar/avatar-group.a2ui.json +7 -1
  39. package/components/avatar/avatar-group.yaml +1 -0
  40. package/components/avatar/avatar.a2ui.json +12 -11
  41. package/components/avatar/avatar.css +1 -1
  42. package/components/avatar/avatar.d.ts +1 -1
  43. package/components/avatar/avatar.yaml +4 -4
  44. package/components/badge/badge.a2ui.json +1 -0
  45. package/components/badge/badge.css +1 -1
  46. package/components/block/block.a2ui.json +1 -0
  47. package/components/blockquote/blockquote.a2ui.json +1 -0
  48. package/components/breadcrumb/breadcrumb.a2ui.json +1 -0
  49. package/components/button/button.a2ui.json +1 -3
  50. package/components/button/button.css +6 -5
  51. package/components/button/button.yaml +1 -3
  52. package/components/calendar-grid/calendar-grid.a2ui.json +1 -0
  53. package/components/calendar-grid/calendar-grid.class.js +2 -1
  54. package/components/calendar-picker/calendar-picker.a2ui.json +143 -24
  55. package/components/calendar-picker/calendar-picker.class.js +490 -197
  56. package/components/calendar-picker/calendar-picker.css +121 -172
  57. package/components/calendar-picker/calendar-picker.yaml +225 -47
  58. package/components/canvas/canvas.a2ui.json +6 -5
  59. package/components/canvas/canvas.d.ts +37 -0
  60. package/components/canvas/canvas.js +72 -3
  61. package/components/canvas/canvas.yaml +6 -2
  62. package/components/card/card.a2ui.json +25 -2
  63. package/components/card/card.class.js +3 -0
  64. package/components/card/card.css +34 -4
  65. package/components/card/card.d.ts +2 -2
  66. package/components/card/card.examples.md +3 -3
  67. package/components/card/card.yaml +28 -4
  68. package/components/chart/chart.a2ui.json +13 -8
  69. package/components/chart/chart.class.js +10 -10
  70. package/components/chart/chart.css +12 -10
  71. package/components/chart/chart.d.ts +2 -2
  72. package/components/chart/chart.yaml +8 -5
  73. package/components/chart-legend/chart-legend.a2ui.json +1 -0
  74. package/components/chat-thread/chat-input.a2ui.json +1 -0
  75. package/components/chat-thread/chat-thread.a2ui.json +10 -9
  76. package/components/chat-thread/chat-thread.css +1 -1
  77. package/components/chat-thread/chat-thread.yaml +13 -20
  78. package/components/check/check.a2ui.json +10 -9
  79. package/components/check/check.yaml +4 -4
  80. package/components/code/code.a2ui.json +1 -0
  81. package/components/code/code.css +6 -6
  82. package/components/col/col.a2ui.json +1 -0
  83. package/components/color-input/color-input.a2ui.json +1 -0
  84. package/components/color-picker/color-picker.a2ui.json +1 -0
  85. package/components/combobox/combobox.a2ui.json +3 -2
  86. package/components/combobox/combobox.css +2 -2
  87. package/components/combobox/combobox.yaml +2 -2
  88. package/components/command/command.a2ui.json +12 -10
  89. package/components/command/command.class.js +3 -2
  90. package/components/command/command.css +3 -3
  91. package/components/command/command.yaml +17 -4
  92. package/components/context-menu/context-menu.a2ui.json +1 -0
  93. package/components/date-range-picker/date-range-picker.a2ui.json +2 -1
  94. package/components/date-range-picker/date-range-picker.css +1 -1
  95. package/components/date-range-picker/date-range-picker.yaml +1 -1
  96. package/components/datetime-picker/datetime-picker.a2ui.json +15 -108
  97. package/components/datetime-picker/datetime-picker.class.js +37 -690
  98. package/components/datetime-picker/datetime-picker.css +11 -183
  99. package/components/datetime-picker/datetime-picker.d.ts +4 -5
  100. package/components/datetime-picker/datetime-picker.yaml +44 -135
  101. package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
  102. package/components/demo-toggle/demo-toggle.css +1 -1
  103. package/components/description-list/description-list.a2ui.json +1 -0
  104. package/components/description-list/description-list.css +2 -2
  105. package/components/display-field/display-field.a2ui.json +1 -0
  106. package/components/display-field/display-field.css +3 -3
  107. package/components/divider/divider.a2ui.json +1 -0
  108. package/components/divider/divider.css +1 -1
  109. package/components/drawer/drawer.a2ui.json +1 -3
  110. package/components/drawer/drawer.css +3 -3
  111. package/components/drawer/drawer.yaml +0 -2
  112. package/components/drilldown/drilldown.a2ui.json +22 -20
  113. package/components/drilldown/drilldown.class.js +4 -3
  114. package/components/drilldown/drilldown.css +8 -8
  115. package/components/drilldown/drilldown.yaml +40 -9
  116. package/components/embed/embed.a2ui.json +6 -5
  117. package/components/embed/embed.yaml +2 -2
  118. package/components/empty-state/empty-state.a2ui.json +1 -0
  119. package/components/empty-state/empty-state.css +2 -2
  120. package/components/feed/feed-item.a2ui.json +25 -5
  121. package/components/feed/feed-item.yaml +28 -7
  122. package/components/feed/feed.a2ui.json +9 -2
  123. package/components/feed/feed.class.js +19 -12
  124. package/components/feed/feed.css +8 -8
  125. package/components/feed/feed.yaml +14 -1
  126. package/components/field/field.a2ui.json +1 -0
  127. package/components/field/field.css +1 -1
  128. package/components/field/field.examples.md +1 -1
  129. package/components/fields/fields.a2ui.json +1 -0
  130. package/components/fields/fields.examples.md +1 -1
  131. package/components/footer/footer.a2ui.json +1 -0
  132. package/components/frame/frame.a2ui.json +1 -0
  133. package/components/grid/grid.a2ui.json +1 -0
  134. package/components/header/header.a2ui.json +3 -2
  135. package/components/header/header.yaml +3 -3
  136. package/components/heatmap/heatmap.a2ui.json +2 -1
  137. package/components/heatmap/heatmap.class.js +1 -1
  138. package/components/heatmap/heatmap.css +6 -6
  139. package/components/heatmap/heatmap.yaml +1 -1
  140. package/components/icon/icon.a2ui.json +1 -0
  141. package/components/image/image.a2ui.json +28 -14
  142. package/components/image/image.class.js +38 -23
  143. package/components/image/image.css +18 -8
  144. package/components/image/image.d.ts +2 -2
  145. package/components/image/image.examples.md +3 -3
  146. package/components/image/image.yaml +23 -7
  147. package/components/inline-edit/inline-edit.a2ui.json +1 -0
  148. package/components/inline-message/inline-message.a2ui.json +3 -1
  149. package/components/inline-message/inline-message.class.js +3 -1
  150. package/components/inline-message/inline-message.css +1 -1
  151. package/components/inline-message/inline-message.d.ts +2 -2
  152. package/components/inline-message/inline-message.yaml +2 -1
  153. package/components/input/input.a2ui.json +66 -16
  154. package/components/input/input.class.js +64 -7
  155. package/components/input/input.css +19 -18
  156. package/components/input/input.d.ts +9 -4
  157. package/components/input/input.yaml +83 -10
  158. package/components/inspector/inspector.a2ui.json +1 -0
  159. package/components/integration-card/integration-card.a2ui.json +1 -0
  160. package/components/integration-card/integration-card.css +4 -4
  161. package/components/kbd/kbd.a2ui.json +1 -0
  162. package/components/kbd/kbd.css +1 -1
  163. package/components/link/link.a2ui.json +2 -1
  164. package/components/link/link.yaml +1 -1
  165. package/components/list/list-item.a2ui.json +9 -0
  166. package/components/list/list-item.yaml +12 -0
  167. package/components/list/list.a2ui.json +9 -3
  168. package/components/list/list.class.js +14 -1
  169. package/components/list/list.css +14 -3
  170. package/components/list/list.d.ts +7 -5
  171. package/components/list/list.yaml +16 -6
  172. package/components/list-window/list-window.a2ui.json +1 -0
  173. package/components/list-window/list-window.class.js +2 -1
  174. package/components/loading-overlay/loading-overlay.a2ui.json +1 -0
  175. package/components/mark/mark.a2ui.json +2 -1
  176. package/components/mark/mark.yaml +1 -1
  177. package/components/menu/menu-divider.a2ui.json +1 -0
  178. package/components/menu/menu-item.a2ui.json +3 -1
  179. package/components/menu/menu-item.yaml +6 -0
  180. package/components/menu/menu-label.a2ui.json +1 -0
  181. package/components/menu/menu.a2ui.json +3 -2
  182. package/components/menu/menu.class.js +2 -2
  183. package/components/menu/menu.d.ts +2 -2
  184. package/components/menu/menu.yaml +3 -3
  185. package/components/modal/modal.a2ui.json +1 -0
  186. package/components/nav/nav.a2ui.json +1 -0
  187. package/components/nav/nav.class.js +14 -3
  188. package/components/nav/nav.css +2 -2
  189. package/components/nav-group/nav-group.a2ui.json +1 -0
  190. package/components/nav-group/nav-group.class.js +3 -1
  191. package/components/nav-group/nav-group.css +3 -3
  192. package/components/nav-item/nav-item.a2ui.json +1 -0
  193. package/components/nav-item/nav-item.css +2 -2
  194. package/components/noodles/noodles.a2ui.json +1 -0
  195. package/components/noodles/noodles.class.js +5 -1
  196. package/components/number-format/number-format.a2ui.json +1 -0
  197. package/components/option-card/option-card.a2ui.json +1 -0
  198. package/components/option-card/option-card.css +1 -1
  199. package/components/otp-input/otp-input.a2ui.json +3 -2
  200. package/components/otp-input/otp-input.css +1 -1
  201. package/components/otp-input/otp-input.yaml +9 -2
  202. package/components/page/page.a2ui.json +13 -0
  203. package/components/page/page.css +2 -2
  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/pagination/pagination.css +1 -1
  209. package/components/pane/pane.a2ui.json +6 -0
  210. package/components/pane/pane.class.js +3 -3
  211. package/components/pane/pane.css +3 -3
  212. package/components/pane/pane.yaml +3 -0
  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.css +2 -2
  229. package/components/progress-row/progress-row.d.ts +2 -2
  230. package/components/progress-row/progress-row.examples.md +2 -14
  231. package/components/progress-row/progress-row.yaml +28 -36
  232. package/components/qr-code/qr-code.a2ui.json +13 -12
  233. package/components/qr-code/qr-code.class.js +7 -7
  234. package/components/qr-code/qr-code.css +1 -1
  235. package/components/qr-code/qr-code.d.ts +10 -7
  236. package/components/qr-code/qr-code.yaml +18 -12
  237. package/components/radio/radio.a2ui.json +8 -7
  238. package/components/radio/radio.class.js +8 -0
  239. package/components/radio/radio.yaml +3 -3
  240. package/components/radio-group/radio-group.a2ui.json +5 -3
  241. package/components/radio-group/radio-group.class.js +11 -0
  242. package/components/radio-group/radio-group.yaml +7 -1
  243. package/components/range/range.a2ui.json +6 -0
  244. package/components/range/range.class.js +2 -2
  245. package/components/range/range.css +3 -3
  246. package/components/range/range.yaml +3 -0
  247. package/components/rating/rating.a2ui.json +1 -0
  248. package/components/rating/rating.css +1 -1
  249. package/components/relative-time/relative-time.a2ui.json +1 -0
  250. package/components/richtext/richtext.a2ui.json +2 -1
  251. package/components/richtext/richtext.css +3 -3
  252. package/components/richtext/richtext.yaml +1 -1
  253. package/components/row/row.a2ui.json +1 -0
  254. package/components/search/search.a2ui.json +1 -0
  255. package/components/search/search.class.js +4 -1
  256. package/components/section/section.a2ui.json +1 -0
  257. package/components/segment/segment.a2ui.json +21 -10
  258. package/components/segment/segment.css +20 -4
  259. package/components/segment/segment.d.ts +2 -1
  260. package/components/segment/segment.yaml +20 -13
  261. package/components/segmented/segmented.a2ui.json +36 -7
  262. package/components/segmented/segmented.class.js +113 -22
  263. package/components/segmented/segmented.css +3 -0
  264. package/components/segmented/segmented.d.ts +3 -1
  265. package/components/segmented/segmented.yaml +80 -8
  266. package/components/select/select.a2ui.json +18 -13
  267. package/components/select/select.class.js +61 -37
  268. package/components/select/select.css +18 -16
  269. package/components/select/select.yaml +18 -7
  270. package/components/skeleton/skeleton.a2ui.json +8 -7
  271. package/components/skeleton/skeleton.class.js +8 -7
  272. package/components/skeleton/skeleton.css +21 -6
  273. package/components/skeleton/skeleton.d.ts +2 -2
  274. package/components/skeleton/skeleton.examples.md +2 -2
  275. package/components/skeleton/skeleton.yaml +3 -2
  276. package/components/skip-nav/skip-nav.a2ui.json +1 -0
  277. package/components/slider/slider.a2ui.json +6 -0
  278. package/components/slider/slider.class.js +20 -3
  279. package/components/slider/slider.css +2 -2
  280. package/components/slider/slider.yaml +3 -0
  281. package/components/spinner/spinner.a2ui.json +1 -0
  282. package/components/spinner/spinner.css +1 -1
  283. package/components/stack/stack.a2ui.json +1 -0
  284. package/components/stat/stat.a2ui.json +1 -0
  285. package/components/stat/stat.css +3 -3
  286. package/components/stat/stat.js +2 -2
  287. package/components/step-progress/step-progress.a2ui.json +1 -0
  288. package/components/step-progress/step-progress.css +1 -1
  289. package/components/step-progress/step-progress.yaml +1 -1
  290. package/components/stepper/stepper-item.a2ui.json +7 -3
  291. package/components/stepper/stepper-item.yaml +15 -5
  292. package/components/stepper/stepper.a2ui.json +5 -1
  293. package/components/stepper/stepper.class.js +31 -16
  294. package/components/stepper/stepper.css +2 -2
  295. package/components/stepper/stepper.d.ts +1 -1
  296. package/components/stepper/stepper.yaml +4 -2
  297. package/components/stream/stream.a2ui.json +1 -0
  298. package/components/swatch/swatch.a2ui.json +1 -0
  299. package/components/swatch/swatch.css +2 -2
  300. package/components/swiper/swiper.a2ui.json +1 -0
  301. package/components/swiper/swiper.class.js +5 -1
  302. package/components/switch/switch.a2ui.json +12 -11
  303. package/components/switch/switch.css +1 -1
  304. package/components/switch/switch.yaml +6 -6
  305. package/components/table/table.a2ui.json +1 -10
  306. package/components/table/table.class.js +18 -16
  307. package/components/table/table.css +17 -18
  308. package/components/table/table.d.ts +0 -2
  309. package/components/table/table.yaml +0 -9
  310. package/components/table-toolbar/table-toolbar.a2ui.json +1 -0
  311. package/components/table-toolbar/table-toolbar.class.js +38 -19
  312. package/components/table-toolbar/table-toolbar.css +2 -2
  313. package/components/tabs/tab.a2ui.json +9 -0
  314. package/components/tabs/tab.js +4 -0
  315. package/components/tabs/tab.yaml +15 -0
  316. package/components/tabs/tabs.a2ui.json +9 -4
  317. package/components/tabs/tabs.class.js +13 -1
  318. package/components/tabs/tabs.css +9 -1
  319. package/components/tabs/tabs.d.ts +2 -0
  320. package/components/tabs/tabs.yaml +9 -2
  321. package/components/tag/tag.a2ui.json +1 -0
  322. package/components/tag/tag.css +2 -2
  323. package/components/tags-input/tags-input.a2ui.json +22 -17
  324. package/components/tags-input/tags-input.class.js +13 -11
  325. package/components/tags-input/tags-input.css +11 -7
  326. package/components/tags-input/tags-input.d.ts +16 -7
  327. package/components/tags-input/tags-input.examples.md +2 -2
  328. package/components/tags-input/tags-input.yaml +25 -8
  329. package/components/text/text.a2ui.json +6 -5
  330. package/components/text/text.css +10 -5
  331. package/components/text/text.d.ts +2 -2
  332. package/components/text/text.yaml +9 -4
  333. package/components/textarea/textarea.a2ui.json +2 -1
  334. package/components/textarea/textarea.css +1 -1
  335. package/components/textarea/textarea.yaml +1 -1
  336. package/components/theme-provider/theme-provider.a2ui.json +2 -1
  337. package/components/theme-provider/theme-provider.d.ts +5 -3
  338. package/components/theme-provider/theme-provider.yaml +5 -3
  339. package/components/time-picker/time-picker.a2ui.json +1 -0
  340. package/components/time-picker/time-picker.class.js +4 -2
  341. package/components/time-picker/time-picker.css +1 -1
  342. package/components/timeline/timeline-item.a2ui.json +26 -3
  343. package/components/timeline/timeline-item.yaml +22 -7
  344. package/components/timeline/timeline.a2ui.json +4 -0
  345. package/components/timeline/timeline.class.js +29 -18
  346. package/components/timeline/timeline.css +4 -4
  347. package/components/timeline/timeline.d.ts +3 -3
  348. package/components/timeline/timeline.yaml +2 -0
  349. package/components/toast/toast.a2ui.json +10 -3
  350. package/components/toast/toast.yaml +20 -13
  351. package/components/toc/toc.a2ui.json +1 -0
  352. package/components/toc/toc.css +1 -1
  353. package/components/toggle-group/toggle-group.a2ui.json +7 -3
  354. package/components/toggle-group/toggle-group.class.js +43 -12
  355. package/components/toggle-group/toggle-group.css +7 -4
  356. package/components/toggle-group/toggle-group.d.ts +3 -4
  357. package/components/toggle-group/toggle-group.yaml +22 -16
  358. package/components/toggle-group/toggle-option.a2ui.json +8 -4
  359. package/components/toggle-group/toggle-option.yaml +15 -13
  360. package/components/toggle-scheme/toggle-scheme.a2ui.json +2 -1
  361. package/components/toggle-scheme/toggle-scheme.yaml +1 -1
  362. package/components/toolbar/toolbar-group.a2ui.json +1 -0
  363. package/components/toolbar/toolbar.a2ui.json +1 -0
  364. package/components/toolbar/toolbar.class.js +3 -0
  365. package/components/tooltip/tooltip.a2ui.json +1 -0
  366. package/components/tooltip/tooltip.css +1 -1
  367. package/components/tour/tour-step.a2ui.json +4 -0
  368. package/components/tour/tour-step.yaml +2 -0
  369. package/components/tour/tour.a2ui.json +4 -0
  370. package/components/tour/tour.css +2 -2
  371. package/components/tour/tour.yaml +2 -0
  372. package/components/tree/tree-item.a2ui.json +5 -0
  373. package/components/tree/tree-item.yaml +3 -0
  374. package/components/tree/tree.a2ui.json +4 -0
  375. package/components/tree/tree.class.js +2 -1
  376. package/components/tree/tree.css +1 -1
  377. package/components/tree/tree.yaml +2 -0
  378. package/components/upload/upload.a2ui.json +8 -1
  379. package/components/upload/upload.class.js +35 -5
  380. package/components/upload/upload.css +28 -0
  381. package/components/upload/upload.d.ts +16 -0
  382. package/components/upload/upload.yaml +27 -7
  383. package/components/visually-hidden/visually-hidden.a2ui.json +1 -0
  384. package/core/dom.d.ts +11 -0
  385. package/core/dom.js +34 -0
  386. package/core/form.js +7 -0
  387. package/core/index.d.ts +1 -0
  388. package/core/index.js +1 -0
  389. package/core/responsive.js +16 -4
  390. package/core/template.js +2 -1
  391. package/custom-elements.json +442 -502
  392. package/dist/host.min.css +1 -1
  393. package/dist/host.sheet.js +1 -1
  394. package/dist/theme-provider.min.js +5 -5
  395. package/dist/web-components.min.css +1 -1
  396. package/dist/web-components.min.js +91 -104
  397. package/dist/web-components.sheet.js +1 -1
  398. package/package.json +4 -2
  399. package/patterns/conversion-funnel/conversion-funnel.examples.html +15 -15
  400. package/patterns/inline-dialog/inline-dialog.examples.html +2 -2
  401. package/patterns/inline-dialog/inline-dialog.html +4 -0
  402. package/patterns/timezone-selector/timezone-selector.examples.html +1 -1
  403. package/patterns/timezone-selector/timezone-selector.html +2 -2
  404. package/styles/api/text.css +7 -0
  405. package/styles/type/scale.css +6 -7
  406. package/traits/_catalog.json +129 -41
  407. package/traits/anchor-positioning/anchor-positioning.js +1 -0
  408. package/traits/announcer/announcer.js +1 -0
  409. package/traits/arrow-grid-nav/arrow-grid-nav.js +1 -0
  410. package/traits/attention-pulse/attention-pulse.js +1 -0
  411. package/traits/count-up/count-up.js +1 -0
  412. package/traits/define.js +78 -0
  413. package/traits/focus-restore/focus-restore.js +2 -1
  414. package/traits/haptic-feedback/haptic-feedback.js +1 -0
  415. package/traits/input-mask/input-mask.js +1 -0
  416. package/traits/intersection-observer/intersection-observer.js +1 -0
  417. package/traits/layout-animation/layout-animation.js +1 -0
  418. package/traits/noise-texture/noise-texture.js +1 -0
  419. package/traits/resize-observer/resize-observer.js +1 -0
  420. package/traits/scroll-progress/scroll-progress.js +1 -0
  421. package/traits/snap-to-grid/snap-to-grid.js +1 -0
  422. package/traits/sound-feedback/sound-feedback.js +1 -0
  423. package/traits/spring-animate/spring-animate.js +1 -0
  424. package/traits/validation/validation.js +1 -0
@@ -137,7 +137,7 @@
137
137
  "declarations": [
138
138
  {
139
139
  "kind": "class",
140
- "description": "Child of <action-list-ui>. One actionable row — icon + label, forwards activation to the parent action-list.",
140
+ "description": "Child of <action-list-ui>. One actionable row — icon + label + optional subtitle, forwards activation to the parent action-list. Row contract converges on <menu-item-ui>: icon/text/subtitle/value/variant/disabled props and icon/text/subtitle/trailing slot overrides (#1363 C5).",
141
141
  "name": "UIActionItem",
142
142
  "tagName": "action-item-ui",
143
143
  "superclass": {
@@ -159,6 +159,13 @@
159
159
  },
160
160
  "description": "Action label."
161
161
  },
162
+ {
163
+ "name": "subtitle",
164
+ "type": {
165
+ "text": "string"
166
+ },
167
+ "description": "Optional secondary description line rendered under the label."
168
+ },
162
169
  {
163
170
  "name": "value",
164
171
  "type": {
@@ -172,7 +179,7 @@
172
179
  "text": "string"
173
180
  },
174
181
  "default": "default",
175
- "description": "Visual variant (default | accent | danger)."
182
+ "description": "Visual variant (default | danger)."
176
183
  },
177
184
  {
178
185
  "name": "disabled",
@@ -187,6 +194,18 @@
187
194
  {
188
195
  "name": "icon",
189
196
  "description": "Override the [icon] glyph with a custom slotted element (custom icon-ui, image, avatar). Mutually exclusive with the [icon] attribute — slot child wins."
197
+ },
198
+ {
199
+ "name": "text",
200
+ "description": "Custom label content; falls through to [text] prop if not slotted."
201
+ },
202
+ {
203
+ "name": "subtitle",
204
+ "description": "Custom secondary-line content override; falls through to [subtitle] prop if not slotted."
205
+ },
206
+ {
207
+ "name": "trailing",
208
+ "description": "Trailing element pinned to the far edge (shortcut hint, badge, caret). Supersedes the unnamed default slot this row previously used for trailing content — see MIGRATION GUIDE."
190
209
  }
191
210
  ]
192
211
  },
@@ -449,12 +468,6 @@
449
468
  "description": "Save button text; empty hides it."
450
469
  }
451
470
  ],
452
- "slots": [
453
- {
454
- "name": "default",
455
- "description": "Default slot — primary child content."
456
- }
457
- ],
458
471
  "events": [
459
472
  {
460
473
  "name": "feedback-rate",
@@ -603,12 +616,6 @@
603
616
  "description": "Drives the status icon — idle, active (spinner), done (check), error (warning)."
604
617
  }
605
618
  ],
606
- "slots": [
607
- {
608
- "name": "default",
609
- "description": "Default slot — NOT a step-authoring surface: the component rebuilds its body from the addStep()/addThought() pipeline and does not consume authored children (gh#938)."
610
- }
611
- ],
612
619
  "events": [
613
620
  {
614
621
  "name": "reasoning-finish",
@@ -673,7 +680,7 @@
673
680
  "text": "string"
674
681
  },
675
682
  "default": "sm",
676
- "description": "sm | md"
683
+ "description": "sm | md — forwarded to each chip's <button-ui size>."
677
684
  },
678
685
  {
679
686
  "name": "variant",
@@ -681,7 +688,7 @@
681
688
  "text": "string"
682
689
  },
683
690
  "default": "outline",
684
- "description": "outline | ghost | subtle"
691
+ "description": "outline | ghost forwarded to each chip's <button-ui variant>."
685
692
  }
686
693
  ],
687
694
  "slots": [
@@ -742,12 +749,6 @@
742
749
  "description": "Hide the trace body. Default-visible disclosure (matches the agent-* family — agent-reasoning, agent-artifact). Set to opt out."
743
750
  }
744
751
  ],
745
- "slots": [
746
- {
747
- "name": "default",
748
- "description": "Default slot — primary child content."
749
- }
750
- ],
751
752
  "events": [
752
753
  {
753
754
  "name": "trace-toggle",
@@ -1092,20 +1093,6 @@
1092
1093
  },
1093
1094
  "description": "Image source URL. Falls back to initials on error."
1094
1095
  }
1095
- ],
1096
- "slots": [
1097
- {
1098
- "name": "icon",
1099
- "description": "Phosphor icon rendered inside the avatar circle (system-event avatars)"
1100
- },
1101
- {
1102
- "name": "img",
1103
- "description": "Avatar image element"
1104
- },
1105
- {
1106
- "name": "initials",
1107
- "description": "Initials text span"
1108
- }
1109
1096
  ]
1110
1097
  }
1111
1098
  ],
@@ -1455,10 +1442,6 @@
1455
1442
  }
1456
1443
  ],
1457
1444
  "slots": [
1458
- {
1459
- "name": "leading",
1460
- "description": "Icon container (start), sized to --content-height"
1461
- },
1462
1445
  {
1463
1446
  "name": "trailing",
1464
1447
  "description": "Icon container (end), sized to --content-height"
@@ -1598,7 +1581,7 @@
1598
1581
  "declarations": [
1599
1582
  {
1600
1583
  "kind": "class",
1601
- "description": "Date picker with trigger button and popover calendar grid. Form-associated input emitting ISO date string via change events; supports min/max and disabled-date masks. Use for single-date input in forms; for date ranges compose two pickers or use a dedicated range component.",
1584
+ "description": "Date (and, per `[precision]`, date+time) picker with trigger button and popover panel. Form-associated input emitting an ISO date (or, when `precision` is `minute`/`second`, ISO datetime) string via change events; supports min/max and disabled-date masks. Use for single-date or single-datetime input in forms; for date ranges use <date-range-picker-ui> instead of composing two calendar-picker instances. gh#1372 (#1363 C3c) folded <datetime-picker-ui>'s surface into this widened `precision` axis — see the deprecated <datetime-picker-ui> alias.",
1602
1585
  "name": "UICalendarPicker",
1603
1586
  "tagName": "calendar-picker-ui",
1604
1587
  "superclass": {
@@ -1629,34 +1612,65 @@
1629
1612
  "default": "false",
1630
1613
  "description": "Disables interaction"
1631
1614
  },
1615
+ {
1616
+ "name": "readonly",
1617
+ "type": {
1618
+ "text": "boolean"
1619
+ },
1620
+ "default": "false",
1621
+ "description": "Blocks edits; the trigger stays keyboard-focusable for screen-reader inspection but the popover does not open."
1622
+ },
1632
1623
  {
1633
1624
  "name": "format",
1634
1625
  "type": {
1635
1626
  "text": "string"
1636
1627
  },
1637
1628
  "default": "short",
1638
- "description": "Display format for the selected date"
1629
+ "description": "Display format for the trigger text. `short`, e.g. `Jan 1, 2026` (+ ` 14:30` when `precision` is minute/second); `long`, e.g. `January 1, 2026`; `iso`, the raw ISO string."
1639
1630
  },
1640
1631
  {
1641
- "name": "label",
1632
+ "name": "max",
1642
1633
  "type": {
1643
1634
  "text": "string"
1644
1635
  },
1645
- "description": "Label text displayed above the trigger"
1636
+ "description": "Maximum selectable date (ISO `YYYY-MM-DD`), or datetime (ISO `YYYY-MM-DDTHH:mm[:ss]`) when `precision` is minute/second."
1646
1637
  },
1647
1638
  {
1648
- "name": "max",
1639
+ "name": "min",
1649
1640
  "type": {
1650
1641
  "text": "string"
1651
1642
  },
1652
- "description": "Maximum selectable date in ISO format (YYYY-MM-DD)"
1643
+ "description": "Minimum selectable date (ISO `YYYY-MM-DD`), or datetime (ISO `YYYY-MM-DDTHH:mm[:ss]`) when `precision` is minute/second."
1653
1644
  },
1654
1645
  {
1655
- "name": "min",
1646
+ "name": "precision",
1647
+ "type": {
1648
+ "text": "string"
1649
+ },
1650
+ "default": "date",
1651
+ "description": "Mode axis (gh#1372,"
1652
+ },
1653
+ {
1654
+ "name": "step",
1655
+ "type": {
1656
+ "text": "number"
1657
+ },
1658
+ "default": "60",
1659
+ "description": "Per-Arrow-keypress increment in seconds for the time pane. Active only when `precision` is minute/second. 60 = minute precision (default), 900 = 15-minute, 1 = second precision."
1660
+ },
1661
+ {
1662
+ "name": "hour-cycle",
1663
+ "type": {
1664
+ "text": "string"
1665
+ },
1666
+ "description": "Hour cycle for the time pane. Active only when `precision` is minute/second. Empty (default) derives from the document locale. `h12` forces a 12-hour cycle with an AM/PM (meridiem) segment; `h23` forces 24-hour cycle."
1667
+ },
1668
+ {
1669
+ "name": "locale",
1656
1670
  "type": {
1657
1671
  "text": "string"
1658
1672
  },
1659
- "description": "Minimum selectable date in ISO format (YYYY-MM-DD)"
1673
+ "description": "BCP-47 locale tag used to derive hour-cycle when `hour-cycle` is empty. Active only when `precision` is minute/second. Falls back to `<html lang>` then to browser default."
1660
1674
  },
1661
1675
  {
1662
1676
  "name": "open",
@@ -1679,7 +1693,7 @@
1679
1693
  "type": {
1680
1694
  "text": "string"
1681
1695
  },
1682
- "description": "Selected date (ISO string)"
1696
+ "description": "Selected date (ISO string), or datetime (ISO `YYYY-MM-DDTHH:mm[:ss]`) when `precision` is minute/second."
1683
1697
  },
1684
1698
  {
1685
1699
  "name": "placement",
@@ -1692,16 +1706,16 @@
1692
1706
  ],
1693
1707
  "slots": [
1694
1708
  {
1695
- "name": "calendar",
1696
- "description": "Popover container for the month grid"
1697
- },
1698
- {
1699
- "name": "label",
1700
- "description": "Label element above the trigger"
1709
+ "name": "popover",
1710
+ "description": "Popover container for the calendar pane(s) (gh#1461; renamed from the yaml's prior `calendar` key, which matched no real slot=\"…\" attribute — render() stamps this element as slot=\"popover\")."
1701
1711
  },
1702
1712
  {
1703
1713
  "name": "trigger",
1704
1714
  "description": "Combobox button that opens the calendar popover"
1715
+ },
1716
+ {
1717
+ "name": "footer",
1718
+ "description": "Optional Apply/Cancel buttons for explicit-commit flows. Spans the pane(s) below the calendar (+ time, when `precision` is minute/second)."
1705
1719
  }
1706
1720
  ],
1707
1721
  "events": [
@@ -1710,7 +1724,35 @@
1710
1724
  "type": {
1711
1725
  "text": "CustomEvent"
1712
1726
  },
1713
- "description": "Fired when a date is selected"
1727
+ "description": "Fired when a value commits (date picked, or — when `precision` is minute/second — date picked + time edited, or Apply clicked in an explicit-commit footer)."
1728
+ },
1729
+ {
1730
+ "name": "input",
1731
+ "type": {
1732
+ "text": "CustomEvent"
1733
+ },
1734
+ "description": "Fired during partial selection (date picked but time still pending, or vice versa — meaningful only when `precision` is minute/second)."
1735
+ },
1736
+ {
1737
+ "name": "open",
1738
+ "type": {
1739
+ "text": "CustomEvent"
1740
+ },
1741
+ "description": "Popover opened (user clicked the trigger, pressed Enter/Space, or Apply/Cancel in a footer closed then reopened)."
1742
+ },
1743
+ {
1744
+ "name": "close",
1745
+ "type": {
1746
+ "text": "CustomEvent"
1747
+ },
1748
+ "description": "Popover closed (without commit, or after commit)."
1749
+ },
1750
+ {
1751
+ "name": "invalid",
1752
+ "type": {
1753
+ "text": "CustomEvent"
1754
+ },
1755
+ "description": "A constraint failed (out of range, or — when `precision` is minute/second — a parse error)."
1714
1756
  }
1715
1757
  ]
1716
1758
  }
@@ -1726,6 +1768,195 @@
1726
1768
  }
1727
1769
  ]
1728
1770
  },
1771
+ {
1772
+ "kind": "javascript-module",
1773
+ "path": "components/calendar-picker/calendar-picker.test.js",
1774
+ "declarations": [
1775
+ {
1776
+ "kind": "class",
1777
+ "description": "DEPRECATED (gh#1372, widened `precision` axis. `<datetime-picker-ui>` is now a thin `UICalendarPicker` subclass (see datetime-picker.class.js) rather than an independent implementation: `precision` defaults to `\"minute\"` (not `\"date\"`) and `placeholder` defaults to `\"Select date and time\"`; every other prop/event/token is inherited unchanged from <calendar-picker-ui>. Existing markup keeps working, but new markup should reach for `<calendar-picker-ui precision=\"minute\">` (or `precision=\"second\"`) directly. See <calendar-picker-ui> for the full contract.",
1778
+ "name": "UIDatetimePicker",
1779
+ "tagName": "datetime-picker-ui",
1780
+ "superclass": {
1781
+ "name": "UIElement",
1782
+ "module": "/core/element.js"
1783
+ },
1784
+ "attributes": [
1785
+ {
1786
+ "name": "name",
1787
+ "type": {
1788
+ "text": "string"
1789
+ },
1790
+ "description": "Form field name. The ISO 8601 datetime is submitted under this key when the picker is inside a `<form>`."
1791
+ },
1792
+ {
1793
+ "name": "value",
1794
+ "type": {
1795
+ "text": "string"
1796
+ },
1797
+ "description": "Current value as ISO 8601 datetime (\"YYYY-MM-DDTHH:mm\" or \"YYYY-MM-DDTHH:mm:ss\"). Empty when no value selected."
1798
+ },
1799
+ {
1800
+ "name": "min",
1801
+ "type": {
1802
+ "text": "string"
1803
+ },
1804
+ "description": "Earliest selectable ISO 8601 datetime (inclusive). Days before are disabled in the calendar pane; times before are rejected by the time pane on the same day."
1805
+ },
1806
+ {
1807
+ "name": "max",
1808
+ "type": {
1809
+ "text": "string"
1810
+ },
1811
+ "description": "Latest selectable ISO 8601 datetime (inclusive). Days after are disabled in the calendar pane; times after are rejected by the time pane on the same day."
1812
+ },
1813
+ {
1814
+ "name": "step",
1815
+ "type": {
1816
+ "text": "number"
1817
+ },
1818
+ "default": "60",
1819
+ "description": "Per-Arrow-keypress increment in seconds for the time pane. 60 = minute precision (default), 900 = 15-minute, 1 = second precision."
1820
+ },
1821
+ {
1822
+ "name": "precision",
1823
+ "type": {
1824
+ "text": "string"
1825
+ },
1826
+ "default": "minute",
1827
+ "description": "Time-pane precision. `minute` (default HERE — `date` on the base `<calendar-picker-ui>`) emits `HH:mm`; `second` exposes the seconds segment and emits `HH:mm:ss`; `date` drops the time pane entirely (identical to the base class's own default)."
1828
+ },
1829
+ {
1830
+ "name": "hour-cycle",
1831
+ "type": {
1832
+ "text": "string"
1833
+ },
1834
+ "description": "Hour cycle for the time pane. Empty (default) derives from the document locale. `h12` forces a 12-hour cycle with an AM/PM (meridiem) segment; `h23` forces 24-hour cycle."
1835
+ },
1836
+ {
1837
+ "name": "disabled",
1838
+ "type": {
1839
+ "text": "boolean"
1840
+ },
1841
+ "default": "false",
1842
+ "description": "Block all interaction. Trigger remains rendered but does not open the popover."
1843
+ },
1844
+ {
1845
+ "name": "readonly",
1846
+ "type": {
1847
+ "text": "boolean"
1848
+ },
1849
+ "default": "false",
1850
+ "description": "Block edits; allow keyboard navigation for screen-reader inspection."
1851
+ },
1852
+ {
1853
+ "name": "required",
1854
+ "type": {
1855
+ "text": "boolean"
1856
+ },
1857
+ "default": "false",
1858
+ "description": "Required for validation when inside a `<form>`."
1859
+ },
1860
+ {
1861
+ "name": "open",
1862
+ "type": {
1863
+ "text": "boolean"
1864
+ },
1865
+ "default": "false",
1866
+ "description": "Whether the popover is currently open."
1867
+ },
1868
+ {
1869
+ "name": "placeholder",
1870
+ "type": {
1871
+ "text": "string"
1872
+ },
1873
+ "default": "Select date and time",
1874
+ "description": "Text shown in the trigger when the value is empty. Defaults to \"Select date and time\" HERE (vs. \"Select date...\" on the base `<calendar-picker-ui>`)."
1875
+ },
1876
+ {
1877
+ "name": "format",
1878
+ "type": {
1879
+ "text": "string"
1880
+ },
1881
+ "default": "short",
1882
+ "description": "Trigger button date format. `short`: `Jan 1, 2026 14:30`; `long`: `January 1, 2026 14:30`; `iso`: full ISO string."
1883
+ },
1884
+ {
1885
+ "name": "locale",
1886
+ "type": {
1887
+ "text": "string"
1888
+ },
1889
+ "description": "BCP-47 locale tag used to derive hour-cycle when `hour-cycle` is empty. Falls back to `<html lang>` then to browser default."
1890
+ },
1891
+ {
1892
+ "name": "placement",
1893
+ "type": {
1894
+ "text": "string"
1895
+ },
1896
+ "default": "bottom",
1897
+ "description": "Popover placement relative to the trigger. Default `bottom` centers the calendar+time panel under the trigger (ADR-0034 Rule 2 — ~600px panel >> trigger)."
1898
+ }
1899
+ ],
1900
+ "slots": [
1901
+ {
1902
+ "name": "trigger",
1903
+ "description": "Custom trigger replacement. When omitted, a default trigger is stamped (a plain clickable span, per the base `<calendar-picker-ui>` — NOT the old standalone datetime-picker's `<button-ui>` trigger; see the Consequences note below)."
1904
+ },
1905
+ {
1906
+ "name": "footer",
1907
+ "description": "Optional Apply / Cancel buttons for explicit-commit flows. Spans both panes below the calendar + time area."
1908
+ }
1909
+ ],
1910
+ "events": [
1911
+ {
1912
+ "name": "change",
1913
+ "type": {
1914
+ "text": "CustomEvent"
1915
+ },
1916
+ "description": "Fired when the value commits (date picked + time edited, OR Apply clicked in explicit-commit mode)."
1917
+ },
1918
+ {
1919
+ "name": "input",
1920
+ "type": {
1921
+ "text": "CustomEvent"
1922
+ },
1923
+ "description": "Fired during partial selection (date picked but time still pending, or vice versa)."
1924
+ },
1925
+ {
1926
+ "name": "open",
1927
+ "type": {
1928
+ "text": "CustomEvent"
1929
+ },
1930
+ "description": "Popover opened (user clicked the trigger or pressed Enter / Space)."
1931
+ },
1932
+ {
1933
+ "name": "close",
1934
+ "type": {
1935
+ "text": "CustomEvent"
1936
+ },
1937
+ "description": "Popover closed (without commit, or after commit)."
1938
+ },
1939
+ {
1940
+ "name": "invalid",
1941
+ "type": {
1942
+ "text": "CustomEvent"
1943
+ },
1944
+ "description": "A constraint failed (out of range, parse error)."
1945
+ }
1946
+ ]
1947
+ }
1948
+ ],
1949
+ "exports": [
1950
+ {
1951
+ "kind": "custom-element-definition",
1952
+ "name": "datetime-picker-ui",
1953
+ "declaration": {
1954
+ "name": "UIDatetimePicker",
1955
+ "module": "./components/calendar-picker/calendar-picker.test.js"
1956
+ }
1957
+ }
1958
+ ]
1959
+ },
1729
1960
  {
1730
1961
  "kind": "javascript-module",
1731
1962
  "path": "components/canvas/canvas.js",
@@ -1748,12 +1979,6 @@
1748
1979
  "description": "Component property: theme."
1749
1980
  }
1750
1981
  ],
1751
- "slots": [
1752
- {
1753
- "name": "default",
1754
- "description": "Default slot — primary child content."
1755
- }
1756
- ],
1757
1982
  "events": [
1758
1983
  {
1759
1984
  "name": "canvas-interaction",
@@ -1795,8 +2020,7 @@
1795
2020
  "type": {
1796
2021
  "text": "string"
1797
2022
  },
1798
- "default": "md",
1799
- "description": "Interior padding scale (overrides --card-padding). Accepts the named scale (none/xs/sm/md/lg/xl) or a numeric"
2023
+ "description": "Interior padding scale — overrides --card-inset (the header/section/footer inset token) for the whole"
1800
2024
  },
1801
2025
  {
1802
2026
  "name": "draggable",
@@ -2028,12 +2252,12 @@
2028
2252
  "description": "Hide value labels"
2029
2253
  },
2030
2254
  {
2031
- "name": "radius",
2255
+ "name": "corner-radius",
2032
2256
  "type": {
2033
2257
  "text": "number"
2034
2258
  },
2035
2259
  "default": "null",
2036
- "description": "Bar corner radius (null = let CSS tokens decide)"
2260
+ "description": "Bar corner radius in px (null = let CSS tokens decide)"
2037
2261
  },
2038
2262
  {
2039
2263
  "name": "size",
@@ -2107,7 +2331,7 @@
2107
2331
  },
2108
2332
  {
2109
2333
  "name": "empty",
2110
- "description": "Shown in place of the SVG when `.data` is empty or missing. Typically an `<empty-state-ui>` with icon + heading + description + optional action. Visibility is CSS-toggled via `[data-has-data]` on the host — authors don't need to manage it imperatively."
2334
+ "description": "Shown in place of the SVG when `.data` is empty or missing. Typically an `<empty-state-ui>` with icon + heading + description + optional action. Visibility is CSS-toggled via `[has-data]` on the host — authors don't need to manage it imperatively."
2111
2335
  }
2112
2336
  ],
2113
2337
  "events": [
@@ -2377,16 +2601,6 @@
2377
2601
  "description": "Form value (submitted as 'on' when checked)"
2378
2602
  }
2379
2603
  ],
2380
- "slots": [
2381
- {
2382
- "name": "box",
2383
- "description": "Visual checkbox indicator"
2384
- },
2385
- {
2386
- "name": "label",
2387
- "description": "Label text beside the checkbox"
2388
- }
2389
- ],
2390
2604
  "events": [
2391
2605
  {
2392
2606
  "name": "change",
@@ -3178,19 +3392,7 @@
3178
3392
  "slots": [
3179
3393
  {
3180
3394
  "name": "empty",
3181
- "description": "Empty state shown when no items match"
3182
- },
3183
- {
3184
- "name": "footer",
3185
- "description": "Keyboard hint bar"
3186
- },
3187
- {
3188
- "name": "input",
3189
- "description": "The auto-stamped search field — a contenteditable=\"plaintext-only\" span carrying role=\"combobox\" (per ADR-0025/ADR-0055; no native <input>). Internal only; not consumer-slottable."
3190
- },
3191
- {
3192
- "name": "list",
3193
- "description": "Container for command items and groups"
3395
+ "description": "Empty state shown when no items match. Consumer-supplied [slot=\"empty\"] content is captured before the internal shell renders and re-inserted — a genuine light-DOM insertion point."
3194
3396
  }
3195
3397
  ],
3196
3398
  "events": [
@@ -3241,238 +3443,52 @@
3241
3443
  "type": {
3242
3444
  "text": "string"
3243
3445
  },
3244
- "description": "CSS selector(s) for target element(s). Empty = use default-slot child."
3245
- },
3246
- {
3247
- "name": "open",
3248
- "type": {
3249
- "text": "boolean"
3250
- },
3251
- "default": "false",
3252
- "description": "Programmatic open state. Set true to open at target center."
3253
- },
3254
- {
3255
- "name": "long-press-ms",
3256
- "type": {
3257
- "text": "number"
3258
- },
3259
- "default": "500",
3260
- "description": "Long-press duration (ms) on touch devices to open the menu."
3261
- }
3262
- ],
3263
- "slots": [
3264
- {
3265
- "name": "default",
3266
- "description": "Two-purpose slot: the wrapped target element (mode A — first non-menu-item-ui child) AND the menu-item-ui items. Items are promoted to the popover surface on open."
3267
- }
3268
- ],
3269
- "events": [
3270
- {
3271
- "name": "context-menu-open",
3272
- "type": {
3273
- "text": "CustomEvent"
3274
- },
3275
- "description": "Fired when the menu opens (right-click / long-press / keyboard)."
3276
- },
3277
- {
3278
- "name": "context-menu-close",
3279
- "type": {
3280
- "text": "CustomEvent"
3281
- },
3282
- "description": "Fired when the menu closes (item-select / outside-click / Escape)."
3283
- },
3284
- {
3285
- "name": "context-menu-select",
3286
- "type": {
3287
- "text": "CustomEvent"
3288
- },
3289
- "description": "Fired when an item is activated. Same shape as menu-ui's `action` event."
3290
- }
3291
- ]
3292
- }
3293
- ],
3294
- "exports": [
3295
- {
3296
- "kind": "custom-element-definition",
3297
- "name": "context-menu-ui",
3298
- "declaration": {
3299
- "name": "UIContextMenu",
3300
- "module": "./components/context-menu/context-menu.js"
3301
- }
3302
- }
3303
- ]
3304
- },
3305
- {
3306
- "kind": "javascript-module",
3307
- "path": "components/date-range-picker/date-range-picker.js",
3308
- "declarations": [
3309
- {
3310
- "kind": "class",
3311
- "description": "Compound form primitive for selecting a start + end date pair with optional named preset shortcuts (\"Today\", \"Last 7 days\", \"This month\", ...). Default presentation is a trigger button showing the formatted range; on activation a popover opens with two synchronized calendar panes + a preset side rail. Composes <calendar-grid-ui> twice; emits {from, to} ISO 8601 dates. Both panes are ONE selection surface: first click = start, second click = end, in either grid; a second click earlier than the start restarts the range there. Optional comparison-range mode emits a secondary range for analytics surfaces.",
3312
- "name": "UIDateRangePicker",
3313
- "tagName": "date-range-picker-ui",
3314
- "superclass": {
3315
- "name": "UIElement",
3316
- "module": "/core/element.js"
3317
- },
3318
- "attributes": [
3319
- {
3320
- "name": "name",
3321
- "type": {
3322
- "text": "string"
3323
- },
3324
- "description": "Form field name for form data submission. The selected range serializes as JSON `{\"from\":\"...\",\"to\":\"...\"}` under this key."
3325
- },
3326
- {
3327
- "name": "value",
3328
- "type": {
3329
- "text": "string"
3330
- },
3331
- "description": "Selected range as `{from, to}` ISO 8601 dates. Null when empty. Emitted on commit."
3332
- },
3333
- {
3334
- "name": "compare-value",
3335
- "type": {
3336
- "text": "string"
3337
- },
3338
- "description": "Comparison range when `[comparison]` is set. Same `{from, to}` shape as `value`."
3339
- },
3340
- {
3341
- "name": "comparison",
3342
- "type": {
3343
- "text": "boolean"
3344
- },
3345
- "default": "false",
3346
- "description": "Enable comparison-range mode. Renders a second preset cluster and emits a secondary range under `<name>-compare`."
3347
- },
3348
- {
3349
- "name": "min",
3350
- "type": {
3351
- "text": "string"
3352
- },
3353
- "description": "Earliest selectable ISO date (inclusive). Days before are disabled in both panes."
3354
- },
3355
- {
3356
- "name": "max",
3357
- "type": {
3358
- "text": "string"
3359
- },
3360
- "description": "Latest selectable ISO date (inclusive). Days after are disabled in both panes."
3361
- },
3362
- {
3363
- "name": "disabled",
3364
- "type": {
3365
- "text": "boolean"
3366
- },
3367
- "default": "false",
3368
- "description": "Block all interaction. Trigger remains rendered but does not open the popover."
3369
- },
3370
- {
3371
- "name": "readonly",
3372
- "type": {
3373
- "text": "boolean"
3374
- },
3375
- "default": "false",
3376
- "description": "Block edits; allow keyboard navigation for screen-reader inspection."
3377
- },
3378
- {
3379
- "name": "required",
3380
- "type": {
3381
- "text": "boolean"
3382
- },
3383
- "default": "false",
3384
- "description": "Required for validation when inside a `<form>`."
3385
- },
3386
- {
3387
- "name": "open",
3388
- "type": {
3389
- "text": "boolean"
3390
- },
3391
- "default": "false",
3392
- "description": "Whether the popover is currently open."
3393
- },
3394
- {
3395
- "name": "placeholder",
3396
- "type": {
3397
- "text": "string"
3398
- },
3399
- "default": "Select range",
3400
- "description": "Text shown in the trigger when the value is empty."
3401
- },
3402
- {
3403
- "name": "format",
3404
- "type": {
3405
- "text": "string"
3406
- },
3407
- "default": "short",
3408
- "description": "Trigger button date format. `short`: `Jan 1, 2026`; `long`: `January 1, 2026`; `iso`: `2026-01-01`."
3446
+ "description": "CSS selector(s) for target element(s). Empty = use default-slot child."
3409
3447
  },
3410
3448
  {
3411
- "name": "no-presets",
3449
+ "name": "open",
3412
3450
  "type": {
3413
3451
  "text": "boolean"
3414
3452
  },
3415
3453
  "default": "false",
3416
- "description": "Hide the preset side rail."
3454
+ "description": "Programmatic open state. Set true to open at target center."
3417
3455
  },
3418
3456
  {
3419
- "name": "placement",
3457
+ "name": "long-press-ms",
3420
3458
  "type": {
3421
- "text": "string"
3459
+ "text": "number"
3422
3460
  },
3423
- "default": "bottom",
3424
- "description": "Popover placement relative to the trigger. Default `bottom` centers the two-calendar panel under the trigger (ADR-0034 Rule 2 ~800px panel >> trigger)."
3461
+ "default": "500",
3462
+ "description": "Long-press duration (ms) on touch devices to open the menu."
3425
3463
  }
3426
3464
  ],
3427
3465
  "slots": [
3428
3466
  {
3429
- "name": "trigger",
3430
- "description": "Custom trigger replacement. When omitted, a default `<button-ui>` is stamped."
3431
- },
3432
- {
3433
- "name": "presets",
3434
- "description": "Custom preset content replacing the default preset rail."
3435
- },
3436
- {
3437
- "name": "footer",
3438
- "description": "Optional footer area below the calendars (e.g., \"Apply\" / \"Cancel\" buttons for explicit-commit flows)."
3467
+ "name": "default",
3468
+ "description": "Two-purpose slot: the wrapped target element (mode A — first non-menu-item-ui child) AND the menu-item-ui items. Items are promoted to the popover surface on open."
3439
3469
  }
3440
3470
  ],
3441
3471
  "events": [
3442
3472
  {
3443
- "name": "change",
3444
- "type": {
3445
- "text": "CustomEvent"
3446
- },
3447
- "description": "Fired when the range commits (both `from` AND `to` selected, OR a preset clicked)."
3448
- },
3449
- {
3450
- "name": "input",
3451
- "type": {
3452
- "text": "CustomEvent"
3453
- },
3454
- "description": "Fired during selection — e.g. user clicked `from` but has not yet picked `to`."
3455
- },
3456
- {
3457
- "name": "open",
3473
+ "name": "context-menu-open",
3458
3474
  "type": {
3459
3475
  "text": "CustomEvent"
3460
3476
  },
3461
- "description": "Popover opened (user clicked the trigger or pressed Enter / Space)."
3477
+ "description": "Fired when the menu opens (right-click / long-press / keyboard)."
3462
3478
  },
3463
3479
  {
3464
- "name": "close",
3480
+ "name": "context-menu-close",
3465
3481
  "type": {
3466
3482
  "text": "CustomEvent"
3467
3483
  },
3468
- "description": "Popover closed (without commit, or after commit)."
3484
+ "description": "Fired when the menu closes (item-select / outside-click / Escape)."
3469
3485
  },
3470
3486
  {
3471
- "name": "invalid",
3487
+ "name": "context-menu-select",
3472
3488
  "type": {
3473
3489
  "text": "CustomEvent"
3474
3490
  },
3475
- "description": "A constraint failed (out of range, end < start)."
3491
+ "description": "Fired when an item is activated. Same shape as menu-ui's `action` event."
3476
3492
  }
3477
3493
  ]
3478
3494
  }
@@ -3480,23 +3496,23 @@
3480
3496
  "exports": [
3481
3497
  {
3482
3498
  "kind": "custom-element-definition",
3483
- "name": "date-range-picker-ui",
3499
+ "name": "context-menu-ui",
3484
3500
  "declaration": {
3485
- "name": "UIDateRangePicker",
3486
- "module": "./components/date-range-picker/date-range-picker.js"
3501
+ "name": "UIContextMenu",
3502
+ "module": "./components/context-menu/context-menu.js"
3487
3503
  }
3488
3504
  }
3489
3505
  ]
3490
3506
  },
3491
3507
  {
3492
3508
  "kind": "javascript-module",
3493
- "path": "components/datetime-picker/datetime-picker.js",
3509
+ "path": "components/date-range-picker/date-range-picker.js",
3494
3510
  "declarations": [
3495
3511
  {
3496
3512
  "kind": "class",
3497
- "description": "Single-control date + time selection. Trigger button opens a popover with a `<calendar-picker-ui>` on the left + a `<time-picker-ui>` on the right; commit emits a full ISO 8601 datetime string (\"YYYY-MM-DDTHH:mm\" or with seconds). Composes the two underlying primitives never wraps a native `<input type=\"datetime-local\">` (per ADR-0025). Form-associated under one `name`. SPEC-038.",
3498
- "name": "UIDatetimePicker",
3499
- "tagName": "datetime-picker-ui",
3513
+ "description": "Compound form primitive for selecting a start + end date pair with optional named preset shortcuts (\"Today\", \"Last 7 days\", \"This month\", ...). Default presentation is a trigger button showing the formatted range; on activation a popover opens with two synchronized calendar panes + a preset side rail. Composes <calendar-grid-ui> twice; emits {from, to} ISO 8601 dates. Both panes are ONE selection surface: first click = start, second click = end, in either grid; a second click earlier than the start restarts the range there. Optional comparison-range mode emits a secondary range for analytics surfaces.",
3514
+ "name": "UIDateRangePicker",
3515
+ "tagName": "date-range-picker-ui",
3500
3516
  "superclass": {
3501
3517
  "name": "UIElement",
3502
3518
  "module": "/core/element.js"
@@ -3507,51 +3523,43 @@
3507
3523
  "type": {
3508
3524
  "text": "string"
3509
3525
  },
3510
- "description": "Form field name. The ISO 8601 datetime is submitted under this key when the picker is inside a `<form>`."
3526
+ "description": "Form field name for form data submission. The selected range serializes as JSON `{\"from\":\"...\",\"to\":\"...\"}` under this key."
3511
3527
  },
3512
3528
  {
3513
3529
  "name": "value",
3514
3530
  "type": {
3515
3531
  "text": "string"
3516
3532
  },
3517
- "description": "Current value as ISO 8601 datetime (\"YYYY-MM-DDTHH:mm\" or \"YYYY-MM-DDTHH:mm:ss\"). Empty when no value selected."
3518
- },
3519
- {
3520
- "name": "min",
3521
- "type": {
3522
- "text": "string"
3523
- },
3524
- "description": "Earliest selectable ISO 8601 datetime (inclusive). Days before are disabled in the calendar pane; times before are rejected by the time pane on the same day."
3533
+ "description": "Selected range as `{from, to}` ISO 8601 dates. Null when empty. Emitted on commit."
3525
3534
  },
3526
3535
  {
3527
- "name": "max",
3536
+ "name": "compare-value",
3528
3537
  "type": {
3529
3538
  "text": "string"
3530
3539
  },
3531
- "description": "Latest selectable ISO 8601 datetime (inclusive). Days after are disabled in the calendar pane; times after are rejected by the time pane on the same day."
3540
+ "description": "Comparison range when `[comparison]` is set. Same `{from, to}` shape as `value`."
3532
3541
  },
3533
3542
  {
3534
- "name": "step",
3543
+ "name": "comparison",
3535
3544
  "type": {
3536
- "text": "number"
3545
+ "text": "boolean"
3537
3546
  },
3538
- "default": "60",
3539
- "description": "Per-Arrow-keypress increment in seconds for the time pane. 60 = minute precision (default), 900 = 15-minute, 1 = second precision."
3547
+ "default": "false",
3548
+ "description": "Enable comparison-range mode. Renders a second preset cluster and emits a secondary range under `<name>-compare`."
3540
3549
  },
3541
3550
  {
3542
- "name": "precision",
3551
+ "name": "min",
3543
3552
  "type": {
3544
3553
  "text": "string"
3545
3554
  },
3546
- "default": "minute",
3547
- "description": "Time-pane precision. `minute` (default) emits `HH:mm`; `second` exposes the seconds segment and emits `HH:mm:ss`."
3555
+ "description": "Earliest selectable ISO date (inclusive). Days before are disabled in both panes."
3548
3556
  },
3549
3557
  {
3550
- "name": "hour-cycle",
3558
+ "name": "max",
3551
3559
  "type": {
3552
3560
  "text": "string"
3553
3561
  },
3554
- "description": "Hour cycle for the time pane. Empty (default) derives from the document locale. `h12` forces a 12-hour cycle with an AM/PM (meridiem) segment; `h23` forces 24-hour cycle."
3562
+ "description": "Latest selectable ISO date (inclusive). Days after are disabled in both panes."
3555
3563
  },
3556
3564
  {
3557
3565
  "name": "disabled",
@@ -3590,7 +3598,7 @@
3590
3598
  "type": {
3591
3599
  "text": "string"
3592
3600
  },
3593
- "default": "Select date and time",
3601
+ "default": "Select range",
3594
3602
  "description": "Text shown in the trigger when the value is empty."
3595
3603
  },
3596
3604
  {
@@ -3599,14 +3607,15 @@
3599
3607
  "text": "string"
3600
3608
  },
3601
3609
  "default": "short",
3602
- "description": "Trigger button date format. `short`: `Jan 1, 2026 14:30`; `long`: `January 1, 2026 14:30`; `iso`: full ISO string."
3610
+ "description": "Trigger button date format. `short`: `Jan 1, 2026`; `long`: `January 1, 2026`; `iso`: `2026-01-01`."
3603
3611
  },
3604
3612
  {
3605
- "name": "locale",
3613
+ "name": "no-presets",
3606
3614
  "type": {
3607
- "text": "string"
3615
+ "text": "boolean"
3608
3616
  },
3609
- "description": "BCP-47 locale tag used to derive hour-cycle when `hour-cycle` is empty. Falls back to `<html lang>` then to browser default."
3617
+ "default": "false",
3618
+ "description": "Hide the preset side rail."
3610
3619
  },
3611
3620
  {
3612
3621
  "name": "placement",
@@ -3614,7 +3623,7 @@
3614
3623
  "text": "string"
3615
3624
  },
3616
3625
  "default": "bottom",
3617
- "description": "Popover placement relative to the trigger. Default `bottom` centers the calendar+time panel under the trigger (ADR-0034 Rule 2 — ~600px panel >> trigger)."
3626
+ "description": "Popover placement relative to the trigger. Default `bottom` centers the two-calendar panel under the trigger (ADR-0034 Rule 2 — ~800px panel >> trigger)."
3618
3627
  }
3619
3628
  ],
3620
3629
  "slots": [
@@ -3622,9 +3631,13 @@
3622
3631
  "name": "trigger",
3623
3632
  "description": "Custom trigger replacement. When omitted, a default `<button-ui>` is stamped."
3624
3633
  },
3634
+ {
3635
+ "name": "presets",
3636
+ "description": "Custom preset content replacing the default preset rail."
3637
+ },
3625
3638
  {
3626
3639
  "name": "footer",
3627
- "description": "Optional Apply / Cancel buttons for explicit-commit flows. Spans both panes below the calendar + time area."
3640
+ "description": "Optional footer area below the calendars (e.g., \"Apply\" / \"Cancel\" buttons for explicit-commit flows)."
3628
3641
  }
3629
3642
  ],
3630
3643
  "events": [
@@ -3633,14 +3646,14 @@
3633
3646
  "type": {
3634
3647
  "text": "CustomEvent"
3635
3648
  },
3636
- "description": "Fired when the value commits (date picked + time edited, OR Apply clicked in explicit-commit mode)."
3649
+ "description": "Fired when the range commits (both `from` AND `to` selected, OR a preset clicked)."
3637
3650
  },
3638
3651
  {
3639
3652
  "name": "input",
3640
3653
  "type": {
3641
3654
  "text": "CustomEvent"
3642
3655
  },
3643
- "description": "Fired during partial selection (date picked but time still pending, or vice versa)."
3656
+ "description": "Fired during selection e.g. user clicked `from` but has not yet picked `to`."
3644
3657
  },
3645
3658
  {
3646
3659
  "name": "open",
@@ -3661,7 +3674,7 @@
3661
3674
  "type": {
3662
3675
  "text": "CustomEvent"
3663
3676
  },
3664
- "description": "A constraint failed (out of range, parse error)."
3677
+ "description": "A constraint failed (out of range, end < start)."
3665
3678
  }
3666
3679
  ]
3667
3680
  }
@@ -3669,10 +3682,10 @@
3669
3682
  "exports": [
3670
3683
  {
3671
3684
  "kind": "custom-element-definition",
3672
- "name": "datetime-picker-ui",
3685
+ "name": "date-range-picker-ui",
3673
3686
  "declaration": {
3674
- "name": "UIDatetimePicker",
3675
- "module": "./components/datetime-picker/datetime-picker.js"
3687
+ "name": "UIDateRangePicker",
3688
+ "module": "./components/date-range-picker/date-range-picker.js"
3676
3689
  }
3677
3690
  }
3678
3691
  ]
@@ -3995,10 +4008,6 @@
3995
4008
  }
3996
4009
  ],
3997
4010
  "slots": [
3998
- {
3999
- "name": "backdrop",
4000
- "description": "Scrim overlay behind the drawer (stamped by the component)."
4001
- },
4002
4011
  {
4003
4012
  "name": "panel",
4004
4013
  "description": "Sliding panel container (stamped by the component)."
@@ -4143,42 +4152,6 @@
4143
4152
  {
4144
4153
  "name": "breadcrumb",
4145
4154
  "description": "Optional slot for a consumer-supplied <breadcrumb-ui> in the level header, for deep hierarchies. Not managed by drilldown-ui — the consumer wires jump clicks to `.path = [...]` itself."
4146
- },
4147
- {
4148
- "name": "header",
4149
- "description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable."
4150
- },
4151
- {
4152
- "name": "back",
4153
- "description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level."
4154
- },
4155
- {
4156
- "name": "title",
4157
- "description": "Auto-stamped title cluster (current-level label + item count) inside the header."
4158
- },
4159
- {
4160
- "name": "filter",
4161
- "description": "Auto-stamped filter-input row, shown only when `[filterable]` is set."
4162
- },
4163
- {
4164
- "name": "viewport",
4165
- "description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip)."
4166
- },
4167
- {
4168
- "name": "dot",
4169
- "description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone."
4170
- },
4171
- {
4172
- "name": "main",
4173
- "description": "Auto-stamped per-row content column (label + optional meta line)."
4174
- },
4175
- {
4176
- "name": "meta",
4177
- "description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta`."
4178
- },
4179
- {
4180
- "name": "counts",
4181
- "description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts`."
4182
4155
  }
4183
4156
  ],
4184
4157
  "events": [
@@ -4254,12 +4227,6 @@
4254
4227
  "default": "100%",
4255
4228
  "description": "Iframe width. Any CSS width value."
4256
4229
  }
4257
- ],
4258
- "slots": [
4259
- {
4260
- "name": "iframe",
4261
- "description": "Sandboxed <iframe> element (allow-scripts allow-same-origin)"
4262
- }
4263
4230
  ]
4264
4231
  }
4265
4232
  ],
@@ -4424,12 +4391,6 @@
4424
4391
  "description": "Label of an inline action button (the \"deep-link\" / \"undo\" pattern). Pair with `onAction` callback in `UIFeed.post()` — click invokes the callback then auto-dismisses. Empty string renders no action button."
4425
4392
  }
4426
4393
  ],
4427
- "slots": [
4428
- {
4429
- "name": "body",
4430
- "description": "Default content slot (also accepts the `text` / `heading` props)"
4431
- }
4432
- ],
4433
4394
  "events": [
4434
4395
  {
4435
4396
  "name": "close",
@@ -5019,11 +4980,11 @@
5019
4980
  "description": "Size preset — e.g. 'full' fills the container width and height."
5020
4981
  },
5021
4982
  {
5022
- "name": "radius",
4983
+ "name": "corner-radius",
5023
4984
  "type": {
5024
4985
  "text": "string"
5025
4986
  },
5026
- "description": "Border radius token"
4987
+ "description": "Border radius token. Renamed from `[radius]` (gh#1335) — a preset-enum can't share a name with the global Enum·preset `[radius]` attribute (`sharp`/`rounded`/`round`), whose vocabulary is unrelated (ADR-0053); mirrors chart-ui's own `[corner-radius]` fix (ADR-0054) and skeleton-ui's matching rename (image-ui composes skeleton-ui for its loading fallback)."
5027
4988
  },
5028
4989
  {
5029
4990
  "name": "src",
@@ -5042,8 +5003,12 @@
5042
5003
  ],
5043
5004
  "slots": [
5044
5005
  {
5045
- "name": "img",
5046
- "description": "Stamped <img> element"
5006
+ "name": "image",
5007
+ "description": "The <img> element. Adopt-or-stamp (gh#1461): an author-supplied [slot=\"image\"] child is adopted as-is; otherwise a lazy-loading <img> is created. Renamed from the yaml's prior `img` key, which matched neither this real attribute value nor any DOM element image-ui stamps."
5008
+ },
5009
+ {
5010
+ "name": "skeleton",
5011
+ "description": "Loading-state placeholder shown until the image loads or errors. Adopt-or-stamp: an author-supplied [slot=\"skeleton\"] child is adopted; otherwise a <skeleton-ui> is created."
5047
5012
  }
5048
5013
  ]
5049
5014
  }
@@ -5182,7 +5147,7 @@
5182
5147
  "type": {
5183
5148
  "text": "string"
5184
5149
  },
5185
- "description": "Sets `aria-live` on the host for dynamic message updates. Empty = no live region (static annotation)."
5150
+ "description": "Sets `aria-live` on the host for dynamic message updates. `off` = no live region (static annotation) — the A2UI v1.0 vocabulary (off | polite | assertive, SPEC REQ-013); empty string is the legacy alias for `off`, kept for existing consumers."
5186
5151
  }
5187
5152
  ],
5188
5153
  "slots": [
@@ -5235,7 +5200,7 @@
5235
5200
  "text": "string"
5236
5201
  },
5237
5202
  "default": "text",
5238
- "description": "Input type. `password` wraps a native `<input>` for disc masking; `number` renders a contenteditable + stepper"
5203
+ "description": "Input type. `password` wraps a native `<input>` for disc masking; `number` renders a contenteditable + stepper buttons (no native input). `text`/`email`/`tel`/`url` use plain contenteditable. input-ui does NOT implement date/time/color/search affordances — those HTML5 type values render as a plain contenteditable with no calendar, clock, swatch, or search affordance (first-pass-VALID against this enum historically, but functionally broken generation output). Use the owning primitive instead — CalendarPicker for date (+ month/week, no dedicated granularity primitive exists), DatetimePicker for datetime-local, TimePicker for time, ColorInput/ColorPicker for color, Search for search. See anti_patterns."
5239
5204
  },
5240
5205
  {
5241
5206
  "name": "required",
@@ -5951,6 +5916,14 @@
5951
5916
  "text": "string"
5952
5917
  },
5953
5918
  "description": "Secondary line below the primary text. Subtle color."
5919
+ },
5920
+ {
5921
+ "name": "selected",
5922
+ "type": {
5923
+ "text": "boolean"
5924
+ },
5925
+ "default": "false",
5926
+ "description": "Whether this row is the current selection. Managed by the parent <list-ui>[selectable] — don't set directly; the parent's [selectedKey] is the single source of truth (ADR-0056)."
5954
5927
  }
5955
5928
  ],
5956
5929
  "slots": [
@@ -5978,7 +5951,7 @@
5978
5951
  },
5979
5952
  {
5980
5953
  "kind": "class",
5981
- "description": "Styled flat list with optional row dividers and icons — each row is a <list-item-ui> child. Selectable mode via [selectable] + [selectedKey] / `select` event. Composes <icon-ui> for row leading glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware), <tree-ui> (hierarchical with arbitrary nesting), and <table-ui> (tabular data with columns). Use list-ui for non-navigable, non-tabular vertical rows — comment lists, file lists, message streams outside chat-shell.",
5954
+ "description": "Styled flat list with optional row dividers and icons — each row is a <list-item-ui> child. Selectable mode via [selectable] + [selectedKey] / `selection-change` event. Composes <icon-ui> for row leading glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware), <tree-ui> (hierarchical with arbitrary nesting), and <table-ui> (tabular data with columns). Use list-ui for non-navigable, non-tabular vertical rows — comment lists, file lists, message streams outside chat-shell.",
5982
5955
  "name": "UIList",
5983
5956
  "tagName": "list-ui",
5984
5957
  "superclass": {
@@ -6015,7 +5988,7 @@
6015
5988
  "type": {
6016
5989
  "text": "string"
6017
5990
  },
6018
- "description": "ID (or data-key) of the currently-selected child listitem."
5991
+ "description": "ID (or data-key) of the currently-selected child listitem — drives each child's [selected] reflected prop (ADR-0056, #1363 B7). Kept as `selectedKey` rather than renamed to `value` (segmented/tabs/ select's parent-selection prop name): list rows are identified by DOM id/data-key, not an option value, and ADR-0056 itself governs only the child's own [selected] state surface, not this naming — a cross-family rename has no ratifying ADR (B5/B9-shaped follow-up)."
6019
5992
  },
6020
5993
  {
6021
5994
  "name": "spacing",
@@ -6023,7 +5996,7 @@
6023
5996
  "text": "string"
6024
5997
  },
6025
5998
  "default": "md",
6026
- "description": "Item spacing"
5999
+ "description": "Item spacing scale — `sm`/`lg` modulate the per-item inset; `md` (default) is the base inset."
6027
6000
  }
6028
6001
  ],
6029
6002
  "events": [
@@ -6288,12 +6261,12 @@
6288
6261
  },
6289
6262
  "attributes": [
6290
6263
  {
6291
- "name": "gap",
6264
+ "name": "offset",
6292
6265
  "type": {
6293
6266
  "text": "number"
6294
6267
  },
6295
6268
  "default": "4",
6296
- "description": "Gap in px"
6269
+ "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)."
6297
6270
  },
6298
6271
  {
6299
6272
  "name": "open",
@@ -7161,8 +7134,8 @@
7161
7134
  ],
7162
7135
  "slots": [
7163
7136
  {
7164
- "name": "field",
7165
- "description": "Container for the digit input boxes and optional separator"
7137
+ "name": "digit",
7138
+ "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 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."
7166
7139
  }
7167
7140
  ],
7168
7141
  "events": [
@@ -7581,12 +7554,12 @@
7581
7554
  },
7582
7555
  "attributes": [
7583
7556
  {
7584
- "name": "gap",
7557
+ "name": "offset",
7585
7558
  "type": {
7586
7559
  "text": "number"
7587
7560
  },
7588
7561
  "default": "4",
7589
- "description": "Pixel offset between the anchor and the popover"
7562
+ "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)."
7590
7563
  },
7591
7564
  {
7592
7565
  "name": "match-width",
@@ -7628,7 +7601,7 @@
7628
7601
  },
7629
7602
  {
7630
7603
  "name": "content",
7631
- "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."
7604
+ "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."
7632
7605
  }
7633
7606
  ]
7634
7607
  }
@@ -7715,7 +7688,7 @@
7715
7688
  "declarations": [
7716
7689
  {
7717
7690
  "kind": "class",
7718
- "description": "Inline labeled progress row with label, progress bar, and meta text. Used for storage",
7691
+ "description": "DEPRECATED (gh#1363 C4) — absorbed into <progress-ui>: set `label` (and optional `meta`) directly on <progress-ui> instead, which activates the identical row layout in place. progress-row-ui keeps working (still composes <progress-ui> internally, unchanged behavior) for existing back-compat markup, but is no longer taught or generated for new work. Was: inline labeled progress row with label, progress bar, and meta text storage quotas, capacity breakdowns, usage indicators.",
7719
7692
  "name": "UIProgressRow",
7720
7693
  "tagName": "progress-row-ui",
7721
7694
  "superclass": {
@@ -7783,7 +7756,7 @@
7783
7756
  "declarations": [
7784
7757
  {
7785
7758
  "kind": "class",
7786
- "description": "Progress indicator with bar (default) or spinner variant. Value < 0 marks indeterminate state showing animated activity instead of a fill. Use inside <progress-row-ui> for labeled task lists or standalone for global loading indicators; for percent-complete inline displays use <stat-ui> instead.",
7759
+ "description": "Linear progress bar indicator. Value < 0 marks indeterminate state showing animated activity instead of a fill. Bar-only for circular loading indicators use <spinner-ui> instead (the former `variant=\"spinner\"` render mode was retired; spinner-ui owns circular). Set `label` for a labeled task-list row (label + bar + optional `meta` text in one row, e.g. storage quotas, capacity breakdowns) — absorbed <progress-row-ui>'s row layout directly; that component is now a deprecated alias. Omit `label` for a standalone bar (global loading indicators); for percent-complete inline displays use <stat-ui> instead.",
7787
7760
  "name": "UIProgress",
7788
7761
  "tagName": "progress-ui",
7789
7762
  "superclass": {
@@ -7797,25 +7770,21 @@
7797
7770
  "text": "number"
7798
7771
  },
7799
7772
  "default": "null",
7800
- "description": "Current progress. 0..max (or 0..1 when max omitted). null = indeterminate (legacy -1 accepted for back-compat)."
7773
+ "description": "Current progress, 0-100 (clamped). null = indeterminate (legacy -1 accepted for back-compat)."
7801
7774
  },
7802
7775
  {
7803
- "name": "variant",
7776
+ "name": "label",
7804
7777
  "type": {
7805
7778
  "text": "string"
7806
7779
  },
7807
- "default": "bar",
7808
- "description": "Render mode — `bar` (default) or `spinner`. For fill color set"
7809
- }
7810
- ],
7811
- "slots": [
7812
- {
7813
- "name": "fill",
7814
- "description": "Bar fill element inside track"
7780
+ "description": "Left-hand label text. Presence (non-empty) switches to the labeled row layout — label + bar + optional `meta` in one row; absent = plain bar. Sanctioned Mode Attribute (component-token-contract.md)."
7815
7781
  },
7816
7782
  {
7817
- "name": "track",
7818
- "description": "Bar track container"
7783
+ "name": "meta",
7784
+ "type": {
7785
+ "text": "string"
7786
+ },
7787
+ "description": "Right-hand meta text shown in row layout (e.g. '32 GB', '4.2k / 10k'). No visible effect without `label`."
7819
7788
  }
7820
7789
  ]
7821
7790
  }
@@ -7837,7 +7806,7 @@
7837
7806
  "declarations": [
7838
7807
  {
7839
7808
  "kind": "class",
7840
- "description": "Inline QR code generator — renders a scannable code as inline SVG. Two modes: **A. Auto-encode (default).** Set `[value]` to a string (URL, plain text, share link, 2FA secret). The component encodes the data with the built-in zero-deps QR encoder (byte mode, ECC level configurable, versions 1–10 up to ~150 byte chars) and renders an SVG. **B. Bring-your-own matrix.** Set `[matrix]` to a JSON string of a 2-D 0/1 array (`[[1,0,1,...],[...],...]`). The component renders the supplied matrix directly without invoking its own encoder. Use this when you need versions 11–40, kanji/alphanumeric mode, or any encoder feature beyond the built-in. When both `[value]` and `[matrix]` are set, the matrix wins (BYO override). Output is a single `<svg>` with `viewBox=\"0 0 N N\"`. Crisp-edges rendering preserves the scannable cell boundaries at any size. Sizing is controlled by the `[size]` prop (host CSS-pixel dimension); internal cell size is computed from `size / (matrix-size + 2 · margin)`. ARIA: `role=\"img\"` with `aria-label` (default \"QR code\" or the `[label]` prop).",
7809
+ "description": "Inline QR code generator — renders a scannable code as inline SVG. Two modes: **A. Auto-encode (default).** Set `[value]` to a string (URL, plain text, share link, 2FA secret). The component encodes the data with the built-in zero-deps QR encoder (byte mode, ECC level configurable, versions 1–10 up to ~150 byte chars) and renders an SVG. **B. Bring-your-own matrix.** Set `[matrix]` to a JSON string of a 2-D 0/1 array (`[[1,0,1,...],[...],...]`). The component renders the supplied matrix directly without invoking its own encoder. Use this when you need versions 11–40, kanji/alphanumeric mode, or any encoder feature beyond the built-in. When both `[value]` and `[matrix]` are set, the matrix wins (BYO override). Output is a single `<svg>` with `viewBox=\"0 0 N N\"`. Crisp-edges rendering preserves the scannable cell boundaries at any size. Sizing is controlled by the `[size]` prop (host CSS-pixel dimension); internal cell size is computed from `size / (matrix-size + 2 · quiet-zone)`. ARIA: `role=\"img\"` with `aria-label` (default \"QR code\" or the `[label]` prop).",
7841
7810
  "name": "UIQRCode",
7842
7811
  "tagName": "qr-code-ui",
7843
7812
  "superclass": {
@@ -7865,7 +7834,7 @@
7865
7834
  "text": "number"
7866
7835
  },
7867
7836
  "default": "200",
7868
- "description": "Host display size in CSS pixels (width and height; the SVG is always square). Default 200. Internal cell size is computed from this divided by `matrix-size + 2·margin`."
7837
+ "description": "Host display size in CSS pixels (width and height; the SVG is always square). Default 200. Internal cell size is computed from this divided by `matrix-size + 2·quiet-zone`."
7869
7838
  },
7870
7839
  {
7871
7840
  "name": "error-correction",
@@ -7876,12 +7845,12 @@
7876
7845
  "description": "Error-correction level (auto-encode mode only). `L` (7% recovery), `M` (15%, default), `Q` (25%), `H` (30%). Higher levels recover from more damage at the cost of QR-version size growth."
7877
7846
  },
7878
7847
  {
7879
- "name": "margin",
7848
+ "name": "quiet-zone",
7880
7849
  "type": {
7881
7850
  "text": "number"
7882
7851
  },
7883
7852
  "default": "4",
7884
- "description": "Quiet zone in cells around the QR pattern. QR spec requires a minimum 4-cell margin for reliable scanning; smaller values may not scan on some devices. Default `4`."
7853
+ "description": "Quiet zone in cells around the QR pattern. QR spec requires a minimum 4-cell quiet zone for reliable scanning; smaller values may not scan on some devices. Default `4`. (Renamed from `[margin]` — that name collided with the framework's global `[margin]` Scale attribute; `margin` on `qr-code-ui` now means the global spacing attribute, per ADR-0053.)"
7885
7854
  },
7886
7855
  {
7887
7856
  "name": "color",
@@ -7953,10 +7922,6 @@
7953
7922
  {
7954
7923
  "name": "default",
7955
7924
  "description": "radio-ui children sharing one [name=] — exclusivity and arrow-key navigation are unchanged; they still resolve via closest('fieldset, [role=radiogroup]'), which now matches this host."
7956
- },
7957
- {
7958
- "name": "label",
7959
- "description": "Auto-minted label element (mounted by radio-group-ui from the [label] prop) — do not author this slot directly."
7960
7925
  }
7961
7926
  ]
7962
7927
  }
@@ -8054,16 +8019,6 @@
8054
8019
  "description": "Form value submitted when checked (defaults to 'on' if empty)"
8055
8020
  }
8056
8021
  ],
8057
- "slots": [
8058
- {
8059
- "name": "dot",
8060
- "description": "Radio dot indicator, sized via --dot-size"
8061
- },
8062
- {
8063
- "name": "label",
8064
- "description": "Label text container, rendered via CSS attr(label) on ::after"
8065
- }
8066
- ],
8067
8022
  "events": [
8068
8023
  {
8069
8024
  "name": "change",
@@ -8617,7 +8572,7 @@
8617
8572
  "declarations": [
8618
8573
  {
8619
8574
  "kind": "class",
8620
- "description": "Individual segment child of <segmented-ui> — carries the [value], [text], optional [icon], and [selected] state for one option in a horizontal segmented selector. Distinct from <tab-ui> (a view switcher's child) and <option> (native option for <select-ui>). Use segment-ui only as a direct child of <segmented-ui>; never standalone.",
8575
+ "description": "Individual segment child of <segmented-ui> — carries the [value], [text], optional [icon], and [selected] state for one option in a horizontal segmented selector, single- or multi-select (<segmented-ui multiple>, gh#1369). Distinct from <tab-ui> (a view switcher's child) and <option> (native option for <select-ui>). Use segment-ui only as a direct child of <segmented-ui>; never standalone.",
8621
8576
  "name": "UISegment",
8622
8577
  "tagName": "segment-ui",
8623
8578
  "superclass": {
@@ -8682,7 +8637,7 @@
8682
8637
  "declarations": [
8683
8638
  {
8684
8639
  "kind": "class",
8685
- "description": "Single-select toggle group with an animated sliding indicator. Children must be segment-ui elements.",
8640
+ "description": "Toggle group with an animated sliding indicator (single-select) or independently-toggleable segments (multi-select via [multiple]). Children must be segment-ui elements.",
8686
8641
  "name": "UISegmented",
8687
8642
  "tagName": "segmented-ui",
8688
8643
  "superclass": {
@@ -8695,7 +8650,15 @@
8695
8650
  "type": {
8696
8651
  "text": "string"
8697
8652
  },
8698
- "description": "Value of the currently selected segment."
8653
+ "description": "Value of the currently selected segment. Under [multiple], a comma-separated set of selected values (same encoding as select-ui[multiple])."
8654
+ },
8655
+ {
8656
+ "name": "multiple",
8657
+ "type": {
8658
+ "text": "boolean"
8659
+ },
8660
+ "default": "false",
8661
+ "description": "Enables multi-select — value becomes a comma-separated set, the sliding indicator is suppressed (each selected segment carries its own background instead), and Space/Enter toggles a focused segment instead of arrow-move selecting it. Positive polarity, matching select-ui[multiple]. Absorbs the role of the deprecated <toggle-group-ui> + <toggle-option-ui> pair (gh#1369, #1363 C1). Unlike <toggle-group-ui single>, re-clicking an already-selected segment does NOT clear the selection — segmented-ui's single-select is standard radiogroup semantics (always exactly one selected once a value is set)."
8699
8662
  },
8700
8663
  {
8701
8664
  "name": "allow-empty",
@@ -8703,17 +8666,13 @@
8703
8666
  "text": "boolean"
8704
8667
  },
8705
8668
  "default": "false",
8706
- "description": "Suppresses the connect-time self-select of the first enabled segment when value is falsy. Without it, an empty value silently selects the first segment; with it, a falsy value renders every segment unselected until a real value arrives — for path-bound consumers whose bound value can be a genuine empty state."
8669
+ "description": "Suppresses the connect-time self-select of the first enabled segment when value is falsy. Without it, an empty value silently selects the first segment; with it, a falsy value renders every segment unselected until a real value arrives — for path-bound consumers whose bound value can be a genuine empty state. No effect under [multiple] — multi-select never self-selects (empty value already means \"nothing chosen\")."
8707
8670
  }
8708
8671
  ],
8709
8672
  "slots": [
8710
8673
  {
8711
8674
  "name": "default",
8712
8675
  "description": "Child segment-ui elements that form the toggle group. Children MUST be segment-ui — bare segment tags render text but are silently ignored for the sliding indicator and role/aria-checked state."
8713
- },
8714
- {
8715
- "name": "indicator",
8716
- "description": "Auto-created sliding indicator element prepended on first render."
8717
8676
  }
8718
8677
  ],
8719
8678
  "events": [
@@ -8895,7 +8854,6 @@
8895
8854
  "type": {
8896
8855
  "text": "string"
8897
8856
  },
8898
- "default": "null",
8899
8857
  "description": "Multi-select only (gh#442). Replaces the chip trigger with one text line: a single selection shows its own label; N > 1 shows \"<summary-label> (N)\" — e.g. \"Organizations (2)\"; none shows the placeholder. Popover checkbox rows, Backspace-removes-last, the comma-separated form value, [select-all], and [clearable] are unchanged. Absent (default) = tag-ui chip trigger. Prefer this form for narrow triggers (filter bars) where wrapping chips would balloon the control."
8900
8858
  },
8901
8859
  {
@@ -8986,21 +8944,9 @@
8986
8944
  }
8987
8945
  ],
8988
8946
  "slots": [
8989
- {
8990
- "name": "label",
8991
- "description": "Label element above the trigger"
8992
- },
8993
- {
8994
- "name": "listbox",
8995
- "description": "Popover container for options (role=listbox)"
8996
- },
8997
8947
  {
8998
8948
  "name": "trigger",
8999
- "description": "Button that opens the listbox"
9000
- },
9001
- {
9002
- "name": "hint",
9003
- "description": "Override slot for hint markup richer than the plain [hint] attribute string (inline links, code spans). Renders beneath the trigger at body-subtle typography. Mutually exclusive with [hint]."
8949
+ "description": "Button that opens the listbox. Stamped only if no consumer-authored [slot=\"trigger\"] is already present at first render (adopt-or-stamp) — a genuine light-DOM insertion point."
9004
8950
  }
9005
8951
  ],
9006
8952
  "events": [
@@ -9055,12 +9001,12 @@
9055
9001
  "description": "Height of the placeholder."
9056
9002
  },
9057
9003
  {
9058
- "name": "radius",
9004
+ "name": "corner-radius",
9059
9005
  "type": {
9060
9006
  "text": "string"
9061
9007
  },
9062
9008
  "default": "sm",
9063
- "description": "Border radius"
9009
+ "description": "Border radius. Renamed from `[radius]` (gh#1335) — a preset-enum can't share a name with the global Enum·preset `[radius]` attribute (`sharp`/`rounded`/`round`), whose vocabulary is unrelated (ADR-0053); mirrors chart-ui's own `[corner-radius]` fix (ADR-0054)."
9064
9010
  },
9065
9011
  {
9066
9012
  "name": "static",
@@ -9648,21 +9594,21 @@
9648
9594
  "slots": [
9649
9595
  {
9650
9596
  "name": "label",
9651
- "description": "Custom label content; falls through to `[text]` prop if not slotted."
9597
+ "description": "Custom label content; falls through to [text] prop if not slotted. Adopt-or-stamp guarded (gh#1462): render() only writes into the component-stamped fallback span — a consumer-authored `[slot=\"label\"]` child is adopted as source of truth and never overwritten."
9652
9598
  },
9653
9599
  {
9654
9600
  "name": "description",
9655
- "description": "Custom description content; falls through to `[description]` prop if not slotted."
9601
+ "description": "Custom secondary-line content; falls through to [description] prop if not slotted. Same adopt-or-stamp guard as `label` (gh#1462)."
9656
9602
  },
9657
9603
  {
9658
9604
  "name": "icon",
9659
- "description": "Override the step-status glyph with a custom slotted element. By default the step renders a numeral / check / x indicator based on [status]; slot an `<icon-ui>` or image to customize."
9605
+ "description": "Override the step-status glyph with a custom slotted element (custom icon-ui, image). Mutually exclusive with the [icon] attribute a consumer-authored slot child wins and is never renamed or removed by render() (gh#1462 adopt-or-stamp guard)."
9660
9606
  }
9661
9607
  ]
9662
9608
  },
9663
9609
  {
9664
9610
  "kind": "class",
9665
- "description": "Wizard / process stepper — parent step index drives numbered children's complete/current/upcoming states automatically. Renders horizontally as a labeled step bar with connectors. Use for multi-step forms, onboarding, or pipelines; for read-only event history use <timeline-ui> instead. Add [interactive] to opt into click-to-navigate + roving- tabindex keyboard (arrow keys / Home / End) — the host still owns whether navigation is permitted: listen for the cancelable [step-request] event and call preventDefault() to veto a step before it lands, or set [disabled] on a stepper-item-ui to phase-gate it out of reach entirely.",
9611
+ "description": "Wizard / process stepper — parent step index drives numbered children's complete/current/upcoming states automatically. Renders horizontally as a labeled step bar with connectors. Use for multi-step forms, onboarding, or pipelines; for read-only event history use <timeline-ui> instead. Add [interactive] to opt into click-to-navigate + roving-tabindex keyboard (arrow keys / Home / End) — the host still owns whether navigation is permitted: listen for the cancelable [step-request] event and call preventDefault() to veto a step before it lands, or set [disabled] on a stepper-item-ui to phase-gate it out of reach entirely.",
9666
9612
  "name": "UIStepper",
9667
9613
  "tagName": "stepper-ui",
9668
9614
  "superclass": {
@@ -10173,24 +10119,6 @@
10173
10119
  "description": "Form value (submitted as 'on' when checked)"
10174
10120
  }
10175
10121
  ],
10176
- "slots": [
10177
- {
10178
- "name": "hint",
10179
- "description": "Help text below the label"
10180
- },
10181
- {
10182
- "name": "label",
10183
- "description": "Label text beside the toggle"
10184
- },
10185
- {
10186
- "name": "thumb",
10187
- "description": "Sliding thumb indicator inside track"
10188
- },
10189
- {
10190
- "name": "track",
10191
- "description": "Toggle track container (holds thumb)"
10192
- }
10193
- ],
10194
10122
  "events": [
10195
10123
  {
10196
10124
  "name": "change",
@@ -10376,14 +10304,6 @@
10376
10304
  "default": "[]",
10377
10305
  "description": "JS property (set programmatically — `el.data = [...]`) — row records, an array of plain objects keyed to columns[].key. May also be supplied declaratively as a JSON-array `data=\"[…]\"` attribute, hydrated once at connect (gh#288) — the same pattern chart-ui's `data` attribute uses. Custom accessor on the element class, not a reflected attribute."
10378
10306
  },
10379
- {
10380
- "name": "density",
10381
- "type": {
10382
- "text": "string"
10383
- },
10384
- "default": "standard",
10385
- "description": "Controls cell padding and row height. 'compact' for dense data, 'standard' for default"
10386
- },
10387
10307
  {
10388
10308
  "name": "expandable",
10389
10309
  "type": {
@@ -10592,6 +10512,14 @@
10592
10512
  },
10593
10513
  "default": "false",
10594
10514
  "description": "Whether the tab is selectable."
10515
+ },
10516
+ {
10517
+ "name": "selected",
10518
+ "type": {
10519
+ "text": "boolean"
10520
+ },
10521
+ "default": "false",
10522
+ "description": "Whether this tab's panel is the active one. Managed by the parent <tabs-ui> container — don't set directly; the parent's [value] is the single source of truth (ADR-0056)."
10595
10523
  }
10596
10524
  ]
10597
10525
  }
@@ -10648,10 +10576,6 @@
10648
10576
  {
10649
10577
  "name": "default",
10650
10578
  "description": "Child tab-ui elements that form the tab strip"
10651
- },
10652
- {
10653
- "name": "indicator",
10654
- "description": "Auto-created sliding indicator element (line variant only)"
10655
10579
  }
10656
10580
  ],
10657
10581
  "events": [
@@ -10842,7 +10766,7 @@
10842
10766
  "text": "number"
10843
10767
  },
10844
10768
  "default": "1",
10845
- "description": "Minimum per-token character count after `transform` is applied."
10769
+ "description": "Minimum per-token character count after `normalize` is applied."
10846
10770
  },
10847
10771
  {
10848
10772
  "name": "max-length",
@@ -10861,11 +10785,11 @@
10861
10785
  "description": "Reject duplicate tokens silently (no `invalid` event for accidental dups)."
10862
10786
  },
10863
10787
  {
10864
- "name": "transform",
10788
+ "name": "normalize",
10865
10789
  "type": {
10866
10790
  "text": "string"
10867
10791
  },
10868
- "description": "Normalize tokens on commit. `lowercase` lowercases, `trim` strips leading + trailing whitespace, `strip-spaces` removes all whitespace, `\"\"` (default) preserves the typed value."
10792
+ "description": "Normalize tokens on commit, applied AFTER every candidate is already trimmed of leading/trailing whitespace (unconditional, independent of this attribute). `lowercase` lowercases, `trim` is then a no-op (the trim already happened), `strip-spaces` removes all remaining interior whitespace, `\"\"` (default) applies no further normalization beyond that unconditional trim — case and interior spacing are preserved verbatim. Renamed from `[transform]` (gh#1335) — this is a value-commit normalization step, a different concept from the global Enum·semantic `[transform]` (CSS text-transform display styling: uppercase/lowercase/capitalize/none), not merely a colliding vocabulary."
10869
10793
  },
10870
10794
  {
10871
10795
  "name": "suggestions",
@@ -11014,7 +10938,7 @@
11014
10938
  "type": {
11015
10939
  "text": "string"
11016
10940
  },
11017
- "description": "Override text alignment. Note: text-ui defaults to display:inline, so this only takes effect when text-ui is block-like (wrapping or parent display:block/grid). Added v0.6.18 (FB-10)."
10941
+ "description": "Override text alignment. Note: text-ui defaults to display:inline, so this only takes effect when text-ui is block-like (wrapping or parent display:block/grid). Added v0.6.18 (FB-10). Converged onto the global Enum·semantic `[text-align]` physical vocabulary (gh#1335) — `start`/`end` renamed to `left`/`right`; `justify` kept (a genuine physical alignment value, now also supported by the global grammar)."
11018
10942
  },
11019
10943
  {
11020
10944
  "name": "truncate",
@@ -11029,7 +10953,7 @@
11029
10953
  "type": {
11030
10954
  "text": "string"
11031
10955
  },
11032
- "description": "Override the variant's font-weight. Maps to --a-weight / --a-weight-medium / --a-weight-semibold / --a-weight-bold. Permissive: unknown values are no-ops (variant weight wins). Added v0.6.18 (FB-10)."
10956
+ "description": "Override the variant's font-weight. Maps to --a-weight / --a-weight-medium / --a-weight-semibold / --a-weight-bold. Permissive: unknown values are no-ops (variant weight wins). Added v0.6.18 (FB-10). `normal` (was `regular`, gh#1335 — converged onto the global Enum·semantic `[weight]` vocabulary's spelling)."
11033
10957
  },
11034
10958
  {
11035
10959
  "name": "textContent",
@@ -11200,7 +11124,7 @@
11200
11124
  "declarations": [
11201
11125
  {
11202
11126
  "kind": "class",
11203
- "description": "Foundation-providing wrapper — adopts the AdiaUI foundation (design tokens + resets + page-frame + every primitive's CSS) into the document from anywhere in the DOM, so a surface renders fully-styled WITHOUT a hand-wired <link rel=\"stylesheet\"> in <head>. Layout-transparent (display: contents): the element owns no box; children lay out as if it weren't there. Mechanism: it imports the constructable-stylesheet twin of web-components.min.css (byte-identical to the CDN bundle, emitted from the same build buffer) and adopts it once into document.adoptedStyleSheets, deduped — adoption fires at module load, before paint. Coexists with the render-blocking <link> path; both deliver the same bytes. Use a <link> (-> the CDN web-components.min.css) for multi-page / top-level surfaces (cacheable across navigations, zero flash); use <theme-provider> for SPA roots, embedded apps, and dynamic mounts where you do not control <head> (e.g. <embed-shell>, an A2UI surface, a micro-frontend). Theming: the base foundation is OS light/dark via light-dark() tokens. Two opt-in attributes adopt their layer on demand — theme=\"ocean|forest|slate|…\" applies a named preset (adopts the themes layer; matches the [theme] hook) and scale=\"verse|prose\" sets the compact / long-form typographic register (adopts the matching register layer; maps onto the [verse]/[prose] attribute). Each layer is fetched only when its attribute is set, so a bare provider stays lean. Opt-in infra: NOT in the all-in-one @adia-ai/web-components barrel (it carries the whole foundation); import @adia-ai/web-components/components/theme-provider explicitly. Distinct from <frame-ui> (a layout skeleton, owns no CSS delivery) and the page shells (chrome over the same foundation).",
11127
+ "description": "Foundation-providing wrapper — adopts the AdiaUI foundation (design tokens + resets + page-frame + every primitive's CSS) into the document from anywhere in the DOM, so a surface renders fully-styled WITHOUT a hand-wired <link rel=\"stylesheet\"> in <head>. Layout-transparent (display: contents): the element owns no box; children lay out as if it weren't there. Mechanism: it imports the constructable-stylesheet twin of web-components.min.css (byte-identical to the CDN bundle, emitted from the same build buffer) and adopts it once into document.adoptedStyleSheets, deduped — adoption fires at module load, before paint. Coexists with the render-blocking <link> path; both deliver the same bytes. Use a <link> (-> the CDN web-components.min.css) for multi-page / top-level surfaces (cacheable across navigations, zero flash); use <theme-provider> for SPA roots, embedded apps, and dynamic mounts where you do not control <head> (e.g. <embed-shell>, an A2UI surface, a micro-frontend). Theming: the base foundation is OS light/dark via light-dark() tokens. Two opt-in attributes adopt their layer on demand — theme=\"ocean|forest|slate|…\" applies a named preset (adopts the themes layer; matches the [theme] hook) and scale=\"ui-sm|ui-md|ui-lg|content-sm|content-md|content-lg\" sets the sizing register (adopts the matching register layer). Deprecated aliases \"verse\" (→ ui-sm) and \"prose\" (→ content-md) still map onto the legacy [verse]/[prose] attributes; removed at v1.0. Each layer is fetched only when its attribute is set, so a bare provider stays lean. Opt-in infra: NOT in the all-in-one @adia-ai/web-components barrel (it carries the whole foundation); import @adia-ai/web-components/components/theme-provider explicitly. Distinct from <frame-ui> (a layout skeleton, owns no CSS delivery) and the page shells (chrome over the same foundation).",
11204
11128
  "name": "UIThemeProvider",
11205
11129
  "tagName": "theme-provider",
11206
11130
  "superclass": {
@@ -11450,7 +11374,7 @@
11450
11374
  "text": "string"
11451
11375
  },
11452
11376
  "default": "idle",
11453
- "description": "Lifecycle state (idle | active | completed | error). Pairs with `spinner` on \"active\" for an in-progress step."
11377
+ "description": "Lifecycle state (idle | active | completed | error) — the values timeline.css currently styles. Pairs with `spinner` on \"active\" for an in-progress step."
11454
11378
  },
11455
11379
  {
11456
11380
  "name": "spinner",
@@ -11462,13 +11386,21 @@
11462
11386
  }
11463
11387
  ],
11464
11388
  "slots": [
11389
+ {
11390
+ "name": "label",
11391
+ "description": "Custom primary-line content; falls through to the [text] prop if not slotted. render() only writes into the component-stamped fallback span (gh#1462 adopt-or-stamp guard)."
11392
+ },
11393
+ {
11394
+ "name": "time",
11395
+ "description": "Custom timestamp/duration content; falls through to the [duration] or [time] prop if not slotted. render() only writes into the component-stamped fallback span (gh#1462 adopt-or-stamp guard)."
11396
+ },
11465
11397
  {
11466
11398
  "name": "icon",
11467
- "description": "Override the [icon] glyph with a custom slotted element. Use for branded icons, avatars, or non-Phosphor sources. Mutually exclusive with the [icon] attribute."
11399
+ "description": "Override the [icon] glyph with a custom slotted element (custom icon-ui, image, avatar). Mutually exclusive with the [icon] attribute — a consumer-authored slot child wins and is never renamed or removed by render() (gh#1462 adopt-or-stamp guard)."
11468
11400
  },
11469
11401
  {
11470
11402
  "name": "description",
11471
- "description": "Override slot for rich description markup (inline links, code spans, embedded badges). Renders beneath the primary text at body-subtle typography."
11403
+ "description": "Custom secondary-line content; falls through to [description] prop if not slotted. render() only writes into the component-stamped fallback span (gh#1462 adopt-or-stamp guard)."
11472
11404
  }
11473
11405
  ]
11474
11406
  },
@@ -11674,7 +11606,7 @@
11674
11606
  "declarations": [
11675
11607
  {
11676
11608
  "kind": "class",
11677
- "description": "Multi-select button group (unlike <segmented-ui> which is single-select). Hosts <toggle-option-ui> children, each independently toggleable; emits change events with the active value set. Use for filter chips or feature flag clusters; for single-select option groups use <segmented-ui> instead.",
11609
+ "description": "DEPRECATED (gh#1369) — use <segmented-ui multiple> + <segment-ui> instead. Multi-select button group (unlike <segmented-ui> which is single-select by default). Hosts <toggle-option-ui> children, each independently toggleable; emits change events with the active value set.",
11678
11610
  "name": "UIToggleGroup",
11679
11611
  "tagName": "toggle-group-ui",
11680
11612
  "superclass": {
@@ -11688,7 +11620,7 @@
11688
11620
  "text": "boolean"
11689
11621
  },
11690
11622
  "default": "false",
11691
- "description": "When true, restrict to one active option (single-select)."
11623
+ "description": "When true, restrict to one active option (single-select) — clicking the already-selected option again CLEARS it (empty value), unlike a native radiogroup. Migration (gh#1369): [single]=true maps to plain <segmented-ui> (no [multiple]) — note segmented-ui's single-select never clears on re-click, it's standard radiogroup semantics; the default (false, multi-select) maps to <segmented-ui multiple>."
11692
11624
  },
11693
11625
  {
11694
11626
  "name": "value",
@@ -11716,7 +11648,7 @@
11716
11648
  },
11717
11649
  {
11718
11650
  "kind": "class",
11719
- "description": "Child of `<toggle-group-ui>`. One toggleable option inside a single-select or multi-select group. Pressed state mirrors `value` against the parent's selection.",
11651
+ "description": "DEPRECATED (gh#1369) — use `<segment-ui>` inside `<segmented-ui multiple>` instead. Child of `<toggle-group-ui>`. One toggleable option inside a single-select or multi-select group. Pressed state mirrors `value` against the parent's selection.",
11720
11652
  "name": "UIToggleOption",
11721
11653
  "tagName": "toggle-option-ui",
11722
11654
  "superclass": {
@@ -11759,7 +11691,7 @@
11759
11691
  "text": "boolean"
11760
11692
  },
11761
11693
  "default": "false",
11762
- "description": "Whether this option is currently selected. Managed by the parent <toggle-group-ui> container (ADR-0056) — don't set directly; the group's `value` is the single source of truth. Converges onto <segment-ui>'s declared reflected-prop mechanism (was previously a private `data-selected` stamp with no declared API surface)."
11694
+ "description": "Whether this option is currently selected. Managed by the parent <toggle-group-ui> container (ADR-0056) — don't set directly; the group's `value` is the single source of truth. Converges onto <segment-ui>'s declared reflected-prop mechanism."
11763
11695
  }
11764
11696
  ]
11765
11697
  }
@@ -12404,6 +12336,14 @@
12404
12336
  "default": "false",
12405
12337
  "description": "Allows selecting multiple files"
12406
12338
  },
12339
+ {
12340
+ "name": "compact",
12341
+ "type": {
12342
+ "text": "boolean"
12343
+ },
12344
+ "default": "false",
12345
+ "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)."
12346
+ },
12407
12347
  {
12408
12348
  "name": "value",
12409
12349
  "type": {