@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
@@ -5,14 +5,19 @@ status: stable
5
5
  component: Segmented
6
6
  category: navigation
7
7
  version: 1
8
- description: Single-select toggle group with an animated sliding indicator. Children must be segment-ui elements.
8
+ description: Toggle group with an animated sliding indicator (single-select) or independently-toggleable segments (multi-select via [multiple]). Children must be segment-ui elements.
9
9
  props:
10
10
  value:
11
- description: Value of the currently selected segment.
11
+ description: Value of the currently selected segment. Under [multiple], a comma-separated set of selected values (same encoding as select-ui[multiple]).
12
12
  type: string
13
13
  default: ''
14
+ multiple:
15
+ 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)."
16
+ type: boolean
17
+ default: false
18
+ reflect: true
14
19
  allowEmpty:
15
- 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.
20
+ 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").
16
21
  type: boolean
17
22
  default: false
18
23
  attribute: allow-empty
@@ -22,20 +27,27 @@ events:
22
27
  slots:
23
28
  default:
24
29
  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.
30
+ parts:
25
31
  indicator:
26
- description: Auto-created sliding indicator element prepended on first render.
32
+ description: >-
33
+ Auto-created sliding indicator element prepended on first render —
34
+ template-owned anatomy part, not a light-DOM insertion point
35
+ (gh#1454). Lazily created once via an internal-field guard, never
36
+ adopted from a consumer-authored element.
27
37
  states:
28
38
  - name: idle
29
39
  description: Default, ready for interaction.
30
40
  traits: []
31
41
  tokens: {}
32
42
  a2ui:
43
+ allowedChildren:
44
+ - Segment
33
45
  rules:
34
- - rule: 'Single-select segmented control. Hosts <segment-ui> children; exactly one selected at a time.'
46
+ - rule: 'Single-select by default. Hosts <segment-ui> children; exactly one selected at a time.'
35
47
  reason: 'Single-select cluster contract.'
36
- - rule: 'For multi-select use <toggle-group-ui> + <toggle-option-ui> instead.'
37
- reason: 'Selection model boundary.'
38
- - rule: 'Use for view-mode switches (grid/list, light/dark) or short filter sets (3-5 options); for longer sets use <tabs-ui> or <select-ui>.'
48
+ - rule: 'For multi-select (filter chips, multi-flag toggles, day-of-week pickers), set [multiple] instead of using a separate component — value becomes a comma-separated set of selected segment values. <toggle-group-ui>/<toggle-option-ui> are deprecated; use <segmented-ui multiple> + <segment-ui> instead (gh#1369, #1363 C1).'
49
+ reason: 'Selection model axis — multiple absorbs the deprecated multi-select pair.'
50
+ - rule: 'Use for view-mode switches (grid/list, light/dark) or short filter sets (3-5 options); for longer sets use <tabs-ui> or <select-ui multiple>.'
39
51
  reason: 'Capacity guidance.'
40
52
  anti_patterns: []
41
53
  examples:
@@ -86,6 +98,54 @@ examples:
86
98
  "text": "Monthly"
87
99
  }
88
100
  ]
101
+ - name: multi-select-filter-chips
102
+ description: Multi-select segmented control (gh#1369) for filter chips — [multiple] set, value is a comma-separated set of active segments.
103
+ a2ui: >-
104
+ [
105
+ {
106
+ "id": "root",
107
+ "component": "Card",
108
+ "children": [
109
+ "sec"
110
+ ]
111
+ },
112
+ {
113
+ "id": "sec",
114
+ "component": "Section",
115
+ "children": [
116
+ "comp"
117
+ ]
118
+ },
119
+ {
120
+ "id": "comp",
121
+ "component": "Segmented",
122
+ "multiple": true,
123
+ "value": "bold,italic",
124
+ "children": [
125
+ "s1",
126
+ "s2",
127
+ "s3"
128
+ ]
129
+ },
130
+ {
131
+ "id": "s1",
132
+ "component": "Segment",
133
+ "value": "bold",
134
+ "text": "Bold"
135
+ },
136
+ {
137
+ "id": "s2",
138
+ "component": "Segment",
139
+ "value": "italic",
140
+ "text": "Italic"
141
+ },
142
+ {
143
+ "id": "s3",
144
+ "component": "Segment",
145
+ "value": "underline",
146
+ "text": "Underline"
147
+ }
148
+ ]
89
149
  keywords:
90
150
  - segmented
91
151
  - options
@@ -95,6 +155,9 @@ keywords:
95
155
  - tab
96
156
  - tabs
97
157
  - button-group
158
+ - filter
159
+ - multi-select
160
+ - filter-chips
98
161
  synonyms:
99
162
  button-group:
100
163
  - toolbar
@@ -125,11 +188,20 @@ synonyms:
125
188
  - segmented
126
189
  - radio
127
190
  - settings
191
+ filter:
192
+ - segmented
193
+ - toggle-group
194
+ - filter-chips
195
+ multi-select:
196
+ - segmented
197
+ - toggle-group
198
+ - select
128
199
  tags:
129
200
  - SegmentedControl
130
201
  - Segmented
131
202
  related:
132
203
  - Segment
133
204
  - ToggleGroup
205
+ - ToggleOption
134
206
  - Tabs
135
207
  - Radio
@@ -83,7 +83,10 @@
83
83
  },
84
84
  "maxlength": {
85
85
  "description": "Maximum character length for validation",
86
- "type": "number",
86
+ "type": [
87
+ "number",
88
+ "null"
89
+ ],
87
90
  "default": null
88
91
  },
89
92
  "min": {
@@ -93,7 +96,10 @@
93
96
  },
94
97
  "minlength": {
95
98
  "description": "Minimum character length for validation",
96
- "type": "number",
99
+ "type": [
100
+ "number",
101
+ "null"
102
+ ],
97
103
  "default": null
98
104
  },
99
105
  "multiple": {
@@ -158,7 +164,7 @@
158
164
  "summary-label": {
159
165
  "description": "Multi-select only (gh#442). Replaces the chip trigger with one\ntext line: a single selection shows its own label; N > 1 shows\n\"<summary-label> (N)\" — e.g. \"Organizations (2)\"; none shows the\nplaceholder. Popover checkbox rows, Backspace-removes-last, the\ncomma-separated form value, [select-all], and [clearable] are\nunchanged. Absent (default) = tag-ui chip trigger. Prefer this\nform for narrow triggers (filter bars) where wrapping chips\nwould balloon the control.\n",
160
166
  "type": "string",
161
- "default": null
167
+ "default": ""
162
168
  },
163
169
  "value": {
164
170
  "description": "Currently selected option value. With declarative <option> children, a child carrying the native `selected` attribute sets the initial value when this attribute is absent (native <select> parity).",
@@ -226,6 +232,14 @@
226
232
  "picker"
227
233
  ],
228
234
  "name": "UISelect",
235
+ "parts": {
236
+ "hint": {
237
+ "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] per this description, but template-owned in practice (gh#1454): the trigger stamp is an unconditional `this.innerHTML = …` with no capture-before-wipe for `hint` (unlike `leading`/`trailing` on input-ui), so any pre-existing [slot=\"hint\"] content is discarded, not adopted, on first render."
238
+ },
239
+ "listbox": {
240
+ "description": "Popover container for options (role=listbox) — template-owned anatomy part, not a light-DOM insertion point (gh#1454). Its contents are always wiped (`innerHTML = ''`) and rebuilt wholesale from `.options`/ parsed `<option>` children on every options render."
241
+ }
242
+ },
229
243
  "related": [
230
244
  "image",
231
245
  "button",
@@ -234,17 +248,8 @@
234
248
  "upload"
235
249
  ],
236
250
  "slots": {
237
- "hint": {
238
- "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]."
239
- },
240
- "label": {
241
- "description": "Label element above the trigger"
242
- },
243
- "listbox": {
244
- "description": "Popover container for options (role=listbox)"
245
- },
246
251
  "trigger": {
247
- "description": "Button that opens the listbox"
252
+ "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."
248
253
  }
249
254
  },
250
255
  "states": [
@@ -399,8 +399,7 @@ export class UISelect extends UIFormElement {
399
399
  this.#parseOptions();
400
400
  if (this.#options.length) {
401
401
  this.#renderOptions();
402
- const display = this.querySelector('[slot="display"]');
403
- if (display) display.textContent = this.#displayText();
402
+ this.#syncDisplayText();
404
403
  }
405
404
  });
406
405
  }
@@ -410,12 +409,13 @@ export class UISelect extends UIFormElement {
410
409
  render() {
411
410
  // SPEC-040 — in multi-select mode the trigger needs to host chips +
412
411
  // optional clear-x + optional "+N more" pill alongside the usual
413
- // leading / display / caret. We toggle host attribute [data-multi-chips]
414
- // so CSS can switch layout from single-line text to flex-wrap chip row.
412
+ // leading / display / caret. CSS switches layout from single-line
413
+ // text to flex-wrap chip row off the compound selector
414
+ // [multiple]:not([summary-label]) — both already-declared, reflected
415
+ // props, so no private data-* mirror is needed here (gh#1332
416
+ // Category A; dropped [data-multi-chips]).
415
417
  // gh#442 — [summary-label] keeps the single-line text layout: the
416
418
  // summary renders through [slot="display"], no chip row.
417
- if (this.multiple && !this.summaryLabel) this.setAttribute('data-multi-chips', '');
418
- else this.removeAttribute('data-multi-chips');
419
419
 
420
420
  // A11y (FB-88): name a placeholder-only select from its placeholder, like
421
421
  // input-ui, so it isn't unnamed for assistive tech (WCAG 4.1.2).
@@ -495,34 +495,7 @@ export class UISelect extends UIFormElement {
495
495
  // Re-attach listbox after trigger is stamped
496
496
  if (lb) this.appendChild(lb);
497
497
  } else {
498
- const display = this.querySelector('[slot="display"]');
499
- if (display && !this.multiple) {
500
- // Single-select: keep the canonical text-rendering path.
501
- if (display.hasAttribute('contenteditable')) {
502
- // Only update text when not actively editing (no active query)
503
- if (!this.#query) {
504
- const text = this.#displayText() === this.placeholder ? '' : this.#displayText();
505
- display.textContent = text;
506
- display.toggleAttribute('data-empty', !text);
507
- }
508
- } else {
509
- display.textContent = this.#displayText();
510
- }
511
- } else if (display && this.multiple) {
512
- // Multi-select: display element holds the placeholder ONLY when
513
- // no chips are present (otherwise the chip row IS the display).
514
- const hasChips = this.#values().length > 0;
515
- if (display.hasAttribute('contenteditable')) {
516
- // search input — keep placeholder; never inject the value text.
517
- display.setAttribute('data-placeholder', hasChips ? '' : (this.placeholder || ''));
518
- if (!this.#query) {
519
- display.textContent = '';
520
- display.toggleAttribute('data-empty', true);
521
- }
522
- } else {
523
- display.textContent = hasChips ? '' : (this.placeholder || '');
524
- }
525
- }
498
+ this.#syncDisplayText();
526
499
  }
527
500
 
528
501
  // Reflect the selected option's mark/avatar/icon in the trigger leading.
@@ -597,6 +570,57 @@ export class UISelect extends UIFormElement {
597
570
  }
598
571
  }
599
572
 
573
+ /**
574
+ * Reconcile the trigger's text with its [data-empty] flag — ALWAYS together.
575
+ *
576
+ * ADIA2-8927. For a searchable trigger the placeholder paints from
577
+ * `[slot="display"][contenteditable][data-empty]::before` (select.css), so
578
+ * text and flag are two halves of ONE state, not two independent writes:
579
+ * set the text and leave the flag and the label renders on top of the
580
+ * placeholder in the same box. `#displayText()` also falls back to
581
+ * `placeholder` when nothing is selected, and that string must never land in
582
+ * the editable surface as real content — the pseudo owns it, so writing it
583
+ * paints the placeholder twice, over itself.
584
+ *
585
+ * This lived inline in render()'s else-branch while `set options` and the
586
+ * FB-98 observer kept their own text-only writes, which is exactly how both
587
+ * drifted: a programmatically populated searchable select showed the overlap
588
+ * until the first click re-entered render() and repaired it. One caller-
589
+ * agnostic method is what keeps a third write site from repeating it.
590
+ */
591
+ #syncDisplayText() {
592
+ const display = this.querySelector('[slot="display"]');
593
+ if (!display) return; // trigger not stamped yet
594
+
595
+ if (!this.multiple) {
596
+ // Single-select: keep the canonical text-rendering path.
597
+ if (display.hasAttribute('contenteditable')) {
598
+ // Only update text when not actively editing (no active query)
599
+ if (!this.#query) {
600
+ const text = this.#displayText() === this.placeholder ? '' : this.#displayText();
601
+ display.textContent = text;
602
+ display.toggleAttribute('data-empty', !text);
603
+ }
604
+ } else {
605
+ display.textContent = this.#displayText();
606
+ }
607
+ } else {
608
+ // Multi-select: display element holds the placeholder ONLY when
609
+ // no chips are present (otherwise the chip row IS the display).
610
+ const hasChips = this.#values().length > 0;
611
+ if (display.hasAttribute('contenteditable')) {
612
+ // search input — keep placeholder; never inject the value text.
613
+ display.setAttribute('data-placeholder', hasChips ? '' : (this.placeholder || ''));
614
+ if (!this.#query) {
615
+ display.textContent = '';
616
+ display.toggleAttribute('data-empty', true);
617
+ }
618
+ } else {
619
+ display.textContent = hasChips ? '' : (this.placeholder || '');
620
+ }
621
+ }
622
+ }
623
+
600
624
  /** Parse <option> and <optgroup> children into internal model. */
601
625
  // FB-98: collect declarative <option>/<optgroup> children — direct OR nested
602
626
  // inside the template engine's display:contents wrapper spans (which carry
@@ -689,8 +713,7 @@ export class UISelect extends UIFormElement {
689
713
  }
690
714
  }
691
715
  this.#renderOptions();
692
- const display = this.querySelector('[slot="display"]');
693
- if (display) display.textContent = this.#displayText();
716
+ this.#syncDisplayText();
694
717
  // Pre-existing gap surfaced while adding mark (gh#339): #renderOptions()
695
718
  // only rebuilds the LISTBOX rows — the trigger's leading visual
696
719
  // (icon/avatar/mark) was only ever reconciled from render()'s call to
@@ -975,7 +998,8 @@ export class UISelect extends UIFormElement {
975
998
  return `${this.summaryLabel} (${values.length})`;
976
999
  }
977
1000
  // SPEC-040 — chips render the selection; display element holds the
978
- // placeholder when empty and is otherwise empty (CSS sees [data-multi-chips]).
1001
+ // placeholder when empty and is otherwise empty (CSS sees
1002
+ // [multiple]:not([summary-label])).
979
1003
  return this.value ? '' : this.placeholder;
980
1004
  }
981
1005
  const flat = this.#options.flatMap(o => o.options || [o]);
@@ -91,7 +91,7 @@
91
91
  border: 1px solid var(--select-border);
92
92
  border-radius: var(--select-radius);
93
93
  background: var(--select-bg);
94
- line-height: 1;
94
+ line-height: var(--a-font-leading-none);
95
95
  cursor: pointer;
96
96
  /* Match every property the hover / focus / invalid states change. */
97
97
  transition:
@@ -130,7 +130,7 @@
130
130
  display: inline-flex;
131
131
  align-items: center;
132
132
  flex-shrink: 0;
133
- line-height: 1;
133
+ line-height: var(--a-font-leading-none);
134
134
  --a-icon-size: var(--select-font-size);
135
135
  color: var(--select-fg-muted);
136
136
  }
@@ -215,11 +215,13 @@
215
215
  }
216
216
 
217
217
  /* ── SPEC-040 — Multi-select chip trigger ──
218
- [data-multi-chips] is set on the host by render() when [multiple] is
219
- active. Layout switches from inline-text trigger to wrap-flex chip row.
220
- Tag-ui chips inside [data-chips] inherit the host's tag-ui token set;
221
- the +more pill is a CSS-only button styled to match. */
222
- :scope[data-multi-chips] [slot="trigger"] {
218
+ [multiple]:not([summary-label]) both already-declared, reflected
219
+ props; no private stamp needed (dropped the redundant [data-multi-chips]
220
+ mirror, gh#1332 Category A). Layout switches from inline-text trigger
221
+ to wrap-flex chip row. Tag-ui chips inside [data-chips] inherit the
222
+ host's tag-ui token set; the +more pill is a CSS-only button styled
223
+ to match. */
224
+ :scope[multiple]:not([summary-label]) [slot="trigger"] {
223
225
  flex-wrap: wrap;
224
226
  align-items: center;
225
227
  /* Pack chips left with a small gap — override the base trigger's
@@ -232,17 +234,17 @@
232
234
  it to grow as chips overflow. */
233
235
  padding-block: calc(var(--select-py, var(--a-space-1)));
234
236
  }
235
- :scope[data-multi-chips] [data-chips] {
237
+ :scope[multiple]:not([summary-label]) [data-chips] {
236
238
  display: contents; /* let chips participate in the trigger's flex line */
237
239
  }
238
- :scope[data-multi-chips] [data-chips] tag-ui {
240
+ :scope[multiple]:not([summary-label]) [data-chips] tag-ui {
239
241
  /* Chip styling tracks the active variant via tag-ui's own tokens. */
240
242
  --tag-size: var(--a-ui-tiny);
241
243
  }
242
244
  /* "+N more" overflow pill — a stamped <button-ui variant="ghost" size="sm">
243
245
  (gh issue 276: no native <button> in stamped DOM); pill shape + chip-row
244
246
  height via button token re-points, chrome stays button-ui's own. */
245
- :scope[data-multi-chips] [data-chips] [data-more] {
247
+ :scope[multiple]:not([summary-label]) [data-chips] [data-more] {
246
248
  --button-radius: var(--a-radius-full);
247
249
  --button-height: calc(var(--a-size) - var(--a-space-3));
248
250
  --button-fg: var(--select-fg-muted);
@@ -252,7 +254,7 @@
252
254
 
253
255
  /* Clear-all `x` affordance — stamped <button-ui variant="ghost" size="sm"
254
256
  icon="x"> (gh issue 276). Visible only when [clearable] AND chips. */
255
- :scope[data-multi-chips] [data-clear-all] {
257
+ :scope[multiple]:not([summary-label]) [data-clear-all] {
256
258
  --button-radius: var(--a-radius-full);
257
259
  --button-height: calc(var(--a-size) - var(--a-space-3));
258
260
  --button-fg: var(--select-fg-muted);
@@ -263,16 +265,16 @@
263
265
  }
264
266
  /* button-ui's own :scope display wins over the UA [hidden] rule —
265
267
  keep the explicit guard. */
266
- :scope[data-multi-chips] [data-clear-all][hidden] { display: none; }
268
+ :scope[multiple]:not([summary-label]) [data-clear-all][hidden] { display: none; }
267
269
 
268
270
  /* In multi-select with chips present, the trigger display element is
269
271
  the rest-of-row slot — make it flex-grow but not push chips off. */
270
- :scope[data-multi-chips] [slot="display"] {
272
+ :scope[multiple]:not([summary-label]) [slot="display"] {
271
273
  flex: 1;
272
274
  min-width: 4ch;
273
275
  }
274
276
  /* Hide the display when empty in multi-mode (chips fill the slot). */
275
- :scope[data-multi-chips] [slot="display"]:empty {
277
+ :scope[multiple]:not([summary-label]) [slot="display"]:empty {
276
278
  flex: 0 0 0;
277
279
  padding: 0;
278
280
  }
@@ -414,7 +416,7 @@ select-ui [role="group"] [slot="group-label"] {
414
416
  font-weight: var(--a-ui-weight);
415
417
  color: var(--select-fg-muted);
416
418
  text-transform: uppercase;
417
- letter-spacing: 0.05em;
419
+ letter-spacing: var(--a-font-tracking-wide);
418
420
  white-space: nowrap;
419
421
  }
420
422
 
@@ -432,7 +434,7 @@ select-ui [slot="hint"] {
432
434
  margin-top: var(--select-hint-mt, var(--a-space-1));
433
435
  font-size: var(--select-hint-size, var(--a-ui-xs));
434
436
  color: var(--select-hint-fg, var(--select-fg-muted));
435
- line-height: var(--select-hint-lh, 1.4);
437
+ line-height: var(--select-hint-lh, var(--a-font-leading-normal));
436
438
  }
437
439
 
438
440
  /* ── SPEC-040 — Multi-select popover affordances ──
@@ -147,7 +147,7 @@ props:
147
147
  form for narrow triggers (filter bars) where wrapping chips
148
148
  would balloon the control.
149
149
  type: string
150
- default: null
150
+ default: ''
151
151
  reflect: true
152
152
  min:
153
153
  description: |
@@ -251,17 +251,28 @@ usage: |-
251
251
  </script>
252
252
  ```
253
253
  slots:
254
- label:
255
- description: Label element above the trigger
256
- listbox:
257
- description: Popover container for options (role=listbox)
258
254
  trigger:
259
- description: Button that opens the listbox
255
+ description: >-
256
+ Button that opens the listbox. Stamped only if no consumer-authored
257
+ [slot="trigger"] is already present at first render (adopt-or-stamp) —
258
+ a genuine light-DOM insertion point.
259
+ parts:
260
+ listbox:
261
+ description: >-
262
+ Popover container for options (role=listbox) — template-owned anatomy
263
+ part, not a light-DOM insertion point (gh#1454). Its contents are
264
+ always wiped (`innerHTML = ''`) and rebuilt wholesale from `.options`/
265
+ parsed `<option>` children on every options render.
260
266
  hint:
261
267
  description: >-
262
268
  Override slot for hint markup richer than the plain [hint] attribute
263
269
  string (inline links, code spans). Renders beneath the trigger at
264
- body-subtle typography. Mutually exclusive with [hint].
270
+ body-subtle typography. Mutually exclusive with [hint] per this
271
+ description, but template-owned in practice (gh#1454): the trigger
272
+ stamp is an unconditional `this.innerHTML = …` with no
273
+ capture-before-wipe for `hint` (unlike `leading`/`trailing` on
274
+ input-ui), so any pre-existing [slot="hint"] content is discarded, not
275
+ adopted, on first render.
265
276
  states:
266
277
  - name: idle
267
278
  description: Default, ready for interaction.
@@ -16,13 +16,8 @@
16
16
  "component": {
17
17
  "const": "Skeleton"
18
18
  },
19
- "height": {
20
- "description": "Height of the placeholder.",
21
- "type": "string",
22
- "default": "1.2em"
23
- },
24
- "radius": {
25
- "description": "Border radius",
19
+ "cornerRadius": {
20
+ "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).",
26
21
  "type": "string",
27
22
  "enum": [
28
23
  "none",
@@ -33,6 +28,11 @@
33
28
  ],
34
29
  "default": "sm"
35
30
  },
31
+ "height": {
32
+ "description": "Height of the placeholder.",
33
+ "type": "string",
34
+ "default": "1.2em"
35
+ },
36
36
  "static": {
37
37
  "description": "When true, suppress the shimmer animation.",
38
38
  "type": "boolean",
@@ -68,6 +68,7 @@
68
68
  "shimmer"
69
69
  ],
70
70
  "name": "UISkeleton",
71
+ "parts": {},
71
72
  "related": [
72
73
  "EmptyState",
73
74
  "Card",
@@ -12,8 +12,8 @@
12
12
  */
13
13
 
14
14
  /**
15
- * <skeleton-ui width="200px" height="1.2em" radius="sm"></skeleton-ui>
16
- * <skeleton-ui width="100%" height="3rem" radius="md" static></skeleton-ui>
15
+ * <skeleton-ui width="200px" height="1.2em" corner-radius="sm"></skeleton-ui>
16
+ * <skeleton-ui width="100%" height="3rem" corner-radius="md" static></skeleton-ui>
17
17
  *
18
18
  * Placeholder shimmer for loading states.
19
19
  * Purely presentational — no DOM stamping needed.
@@ -21,17 +21,18 @@
21
21
  * Props (attributes):
22
22
  * static — suppress the shimmer animation (default: false — shimmer on)
23
23
  *
24
- * Radius: none, sm (default), md, lg, full
24
+ * Corner radius: none, sm (default), md, lg, full. Renamed from `[radius]`
25
+ * (gh#1335) — see skeleton.yaml.
25
26
  */
26
27
 
27
28
  import { UIElement } from '../../core/element.js';
28
29
 
29
30
  export class UISkeleton extends UIElement {
30
31
  static properties = {
31
- width: { type: String, default: '100%', reflect: true },
32
- height: { type: String, default: '1.2em', reflect: true },
33
- radius: { type: String, default: 'sm', reflect: true },
34
- static: { type: Boolean, default: false, reflect: true },
32
+ width: { type: String, default: '100%', reflect: true },
33
+ height: { type: String, default: '1.2em', reflect: true },
34
+ cornerRadius: { type: String, default: 'sm', reflect: true, attribute: 'corner-radius' },
35
+ static: { type: Boolean, default: false, reflect: true },
35
36
  };
36
37
 
37
38
  static template = () => null;
@@ -18,12 +18,27 @@
18
18
  border-radius: var(--skeleton-radius);
19
19
  }
20
20
 
21
- /* ── Radius variants ── */
22
- :scope[radius="none"] { --skeleton-radius: 0; }
23
- :scope[radius="sm"] { --skeleton-radius: var(--a-radius-sm); }
24
- :scope[radius="md"] { --skeleton-radius: var(--a-radius-md); }
25
- :scope[radius="lg"] { --skeleton-radius: var(--a-radius-lg); }
26
- :scope[radius="full"] { --skeleton-radius: var(--a-radius-full); }
21
+ /* ── Overlay mode (gh#1362) ──
22
+ Set by a composing parent (e.g. image-ui) that wants this element
23
+ positioned absolutely over itself. Declared here, inside skeleton-ui's
24
+ OWN `@scope` block, so it competes at skeleton-ui's own proximity (0)
25
+ against the base `:scope { position: relative }` rule above — an
26
+ equal-proximity tie the higher-specificity attribute selector wins
27
+ outright. A parent's own `@scope` overlay rule (image-ui's included)
28
+ can NEVER win this by raising its own specificity: `@scope` proximity
29
+ is resolved before specificity, and that parent's scoping root is one
30
+ level further away (proximity 1) — see CSS Cascade & Inheritance L6. */
31
+ :scope[data-overlay] {
32
+ position: absolute;
33
+ inset: 0;
34
+ }
35
+
36
+ /* ── Corner-radius variants (attribute renamed from [radius], gh#1335) ── */
37
+ :scope[corner-radius="none"] { --skeleton-radius: 0; }
38
+ :scope[corner-radius="sm"] { --skeleton-radius: var(--a-radius-sm); }
39
+ :scope[corner-radius="md"] { --skeleton-radius: var(--a-radius-md); }
40
+ :scope[corner-radius="lg"] { --skeleton-radius: var(--a-radius-lg); }
41
+ :scope[corner-radius="full"] { --skeleton-radius: var(--a-radius-full); }
27
42
 
28
43
  /* ── Shimmer animation (default; suppress with [static]) ── */
29
44
  :scope:not([static])::after {
@@ -13,10 +13,10 @@
13
13
  import { UIElement } from '../../core/element.js';
14
14
 
15
15
  export class UISkeleton extends UIElement {
16
+ /** 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). */
17
+ cornerRadius: 'none' | 'sm' | 'md' | 'lg' | 'full';
16
18
  /** Height of the placeholder. */
17
19
  height: string;
18
- /** Border radius */
19
- radius: 'none' | 'sm' | 'md' | 'lg' | 'full';
20
20
  /** When true, suppress the shimmer animation. */
21
21
  static: boolean;
22
22
  /** Width of the placeholder. */
@@ -6,10 +6,10 @@
6
6
  <skeleton-ui width="100px" height="1em"></skeleton-ui>
7
7
  ```
8
8
 
9
- ## radius
9
+ ## corner-radius
10
10
 
11
11
  ```html
12
- <skeleton-ui width="120px" height="2em" radius="none"></skeleton-ui>
12
+ <skeleton-ui width="120px" height="2em" corner-radius="none"></skeleton-ui>
13
13
  ```
14
14
 
15
15
  ## static
@@ -17,10 +17,11 @@ props:
17
17
  description: Height of the placeholder.
18
18
  type: string
19
19
  default: 1.2em
20
- radius:
21
- description: Border radius
20
+ cornerRadius:
21
+ 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).
22
22
  type: string
23
23
  default: sm
24
+ attribute: corner-radius
24
25
  enum:
25
26
  - none
26
27
  - sm
@@ -58,6 +58,7 @@
58
58
  "keyboard-navigation"
59
59
  ],
60
60
  "name": "UISkipNav",
61
+ "parts": {},
61
62
  "related": [
62
63
  "visually-hidden"
63
64
  ],