@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
@@ -112,43 +112,45 @@
112
112
  "catalog-browser"
113
113
  ],
114
114
  "name": "UIDrilldown",
115
- "related": [
116
- "Tree",
117
- "List",
118
- "Nav",
119
- "Breadcrumb",
120
- "Menu"
121
- ],
122
- "slots": {
115
+ "parts": {
123
116
  "title": {
124
- "description": "Auto-stamped title cluster (current-level label + item count) inside the header."
117
+ "description": "Auto-stamped title cluster (current-level label + item count) inside the header — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
125
118
  },
126
119
  "back": {
127
- "description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level."
128
- },
129
- "breadcrumb": {
130
- "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."
120
+ "description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
131
121
  },
132
122
  "counts": {
133
- "description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts`."
123
+ "description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts` — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
134
124
  },
135
125
  "dot": {
136
- "description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone."
126
+ "description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
137
127
  },
138
128
  "filter": {
139
- "description": "Auto-stamped filter-input row, shown only when `[filterable]` is set."
129
+ "description": "Auto-stamped filter-input row, shown only when `[filterable]` is set — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
140
130
  },
141
131
  "header": {
142
- "description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable."
132
+ "description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable; template-owned anatomy part, not a light-DOM insertion point (gh#1454). Stamped once via an unconditional `this.innerHTML = …` with no consumer-content capture (except `breadcrumb`, which stays in `slots:` above)."
143
133
  },
144
134
  "main": {
145
- "description": "Auto-stamped per-row content column (label + optional meta line)."
135
+ "description": "Auto-stamped per-row content column (label + optional meta line) — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
146
136
  },
147
137
  "meta": {
148
- "description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta`."
138
+ "description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta` — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
149
139
  },
150
140
  "viewport": {
151
- "description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip)."
141
+ "description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip) — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
142
+ }
143
+ },
144
+ "related": [
145
+ "Tree",
146
+ "List",
147
+ "Nav",
148
+ "Breadcrumb",
149
+ "Menu"
150
+ ],
151
+ "slots": {
152
+ "breadcrumb": {
153
+ "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."
152
154
  }
153
155
  },
154
156
  "states": [
@@ -12,6 +12,7 @@
12
12
  */
13
13
 
14
14
  import { UIElement, untracked } from '../../core/element.js';
15
+ import { isElement } from '../../core/dom.js';
15
16
 
16
17
  /**
17
18
  * <drilldown-ui> — Single-panel, multi-level drill-in menu.
@@ -427,7 +428,7 @@ export class UIDrilldown extends UIElement {
427
428
  const counts = Array.isArray(item.counts) ? item.counts : [];
428
429
  if (counts.length) {
429
430
  html += `<span slot="counts">${counts
430
- .map((c) => `<span data-count-chip data-tone="${this.#escAttr(c.variant || 'neutral')}">${this.#escText(c.value)}</span>`)
431
+ .map((c) => `<span data-drilldown-chip data-tone="${this.#escAttr(c.variant || 'neutral')}">${this.#escText(c.value)}</span>`)
431
432
  .join('')}</span>`;
432
433
  }
433
434
  if (hasChildren) html += `<icon-ui name="caret-right" slot="chevron"></icon-ui>`;
@@ -500,7 +501,7 @@ export class UIDrilldown extends UIElement {
500
501
  };
501
502
 
502
503
  #onPanelClick = (e) => {
503
- const row = e.target instanceof Element ? e.target.closest('[role="option"]') : null;
504
+ const row = isElement(e.target) ? e.target.closest('[role="option"]') : null;
504
505
  if (!row) return;
505
506
  const item = this.#rowByEl.get(row);
506
507
  if (!item) return;
@@ -509,7 +510,7 @@ export class UIDrilldown extends UIElement {
509
510
  };
510
511
 
511
512
  #onKeydown = (e) => {
512
- const row = e.target instanceof Element ? e.target.closest('[role="option"]') : null;
513
+ const row = isElement(e.target) ? e.target.closest('[role="option"]') : null;
513
514
  switch (e.key) {
514
515
  case 'ArrowDown':
515
516
  e.preventDefault();
@@ -230,7 +230,7 @@
230
230
  flex-direction: column;
231
231
  min-width: 0;
232
232
  flex: 1;
233
- line-height: 1.3;
233
+ line-height: var(--a-font-leading-normal);
234
234
  }
235
235
  [slot="label"] {
236
236
  overflow: hidden;
@@ -251,21 +251,21 @@
251
251
  gap: var(--a-space-1);
252
252
  flex-shrink: 0;
253
253
  }
254
- [data-count-chip] {
254
+ [data-drilldown-chip] {
255
255
  padding: var(--drilldown-count-chip-py) var(--drilldown-count-chip-px);
256
256
  border-radius: var(--drilldown-count-chip-radius);
257
257
  font-size: var(--drilldown-count-chip-font-size);
258
258
  font-variant-numeric: tabular-nums;
259
- line-height: 1;
259
+ line-height: var(--a-font-leading-none);
260
260
  background: var(--drilldown-count-chip-bg);
261
261
  color: var(--drilldown-count-chip-fg);
262
262
  white-space: nowrap;
263
263
  }
264
- [data-count-chip][data-tone="info"] { background: var(--a-info-bg); color: var(--md-sys-color-info-on-info); }
265
- [data-count-chip][data-tone="success"] { background: var(--a-success-bg); color: var(--md-sys-color-success-on-success); }
266
- [data-count-chip][data-tone="warning"] { background: var(--a-warning-bg); color: var(--md-sys-color-warning-on-warning); }
267
- [data-count-chip][data-tone="danger"] { background: var(--a-danger-bg); color: var(--md-sys-color-danger-on-danger); }
268
- [data-count-chip][data-tone="primary"] { background: var(--a-primary-bg); color: var(--md-sys-color-primary-on-primary); }
264
+ [data-drilldown-chip][data-tone="info"] { background: var(--a-info-bg); color: var(--md-sys-color-info-on-info); }
265
+ [data-drilldown-chip][data-tone="success"] { background: var(--a-success-bg); color: var(--md-sys-color-success-on-success); }
266
+ [data-drilldown-chip][data-tone="warning"] { background: var(--a-warning-bg); color: var(--md-sys-color-warning-on-warning); }
267
+ [data-drilldown-chip][data-tone="danger"] { background: var(--a-danger-bg); color: var(--md-sys-color-danger-on-danger); }
268
+ [data-drilldown-chip][data-tone="primary"] { background: var(--a-primary-bg); color: var(--md-sys-color-primary-on-primary); }
269
269
 
270
270
  [slot="chevron"] {
271
271
  --a-icon-size: var(--drilldown-chevron-size);
@@ -130,24 +130,55 @@ slots:
130
130
  Optional slot for a consumer-supplied <breadcrumb-ui> in the level
131
131
  header, for deep hierarchies. Not managed by drilldown-ui — the
132
132
  consumer wires jump clicks to `.path = [...]` itself.
133
+ parts:
133
134
  header:
134
- description: Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable.
135
+ description: >-
136
+ Auto-stamped level-header container (back affordance + breadcrumb +
137
+ title/count). Structural — not consumer-overridable; template-owned
138
+ anatomy part, not a light-DOM insertion point (gh#1454). Stamped once
139
+ via an unconditional `this.innerHTML = …` with no consumer-content
140
+ capture (except `breadcrumb`, which stays in `slots:` above).
135
141
  back:
136
- description: Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level.
142
+ description: >-
143
+ Auto-stamped back-affordance <button> (chevron + parent-level label).
144
+ Hidden at the root level — template-owned anatomy part, not a
145
+ light-DOM insertion point (gh#1454).
137
146
  title:
138
- description: Auto-stamped title cluster (current-level label + item count) inside the header.
147
+ description: >-
148
+ Auto-stamped title cluster (current-level label + item count) inside
149
+ the header — template-owned anatomy part, not a light-DOM insertion
150
+ point (gh#1454).
139
151
  filter:
140
- description: Auto-stamped filter-input row, shown only when `[filterable]` is set.
152
+ description: >-
153
+ Auto-stamped filter-input row, shown only when `[filterable]` is set —
154
+ template-owned anatomy part, not a light-DOM insertion point (gh#1454).
141
155
  viewport:
142
- description: Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip).
156
+ description: >-
157
+ Auto-stamped clipping container for the current level's panel (hosts
158
+ the slide-transition overflow clip) — template-owned anatomy part, not
159
+ a light-DOM insertion point (gh#1454).
143
160
  dot:
144
- description: Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone.
161
+ description: >-
162
+ Auto-stamped per-row leading color swatch, rendered when the row's
163
+ data item declares a `dot` tone — template-owned anatomy part,
164
+ rendered from data every row, not a light-DOM insertion point
165
+ (gh#1454).
145
166
  main:
146
- description: Auto-stamped per-row content column (label + optional meta line).
167
+ description: >-
168
+ Auto-stamped per-row content column (label + optional meta line) —
169
+ template-owned anatomy part, rendered from data every row, not a
170
+ light-DOM insertion point (gh#1454).
147
171
  meta:
148
- description: Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta`.
172
+ description: >-
173
+ Auto-stamped per-row secondary meta line, rendered when the row's data
174
+ item declares `meta` — template-owned anatomy part, rendered from data
175
+ every row, not a light-DOM insertion point (gh#1454).
149
176
  counts:
150
- description: Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts`.
177
+ description: >-
178
+ Auto-stamped per-row trailing count-chip cluster, rendered when the
179
+ row's data item declares `counts` — template-owned anatomy part,
180
+ rendered from data every row, not a light-DOM insertion point
181
+ (gh#1454).
151
182
  states:
152
183
  - name: idle
153
184
  description: Default, ready for interaction.
@@ -71,15 +71,16 @@
71
71
  "third-party"
72
72
  ],
73
73
  "name": "UIEmbed",
74
+ "parts": {
75
+ "iframe": {
76
+ "description": "Sandboxed <iframe> element (allow-scripts allow-same-origin) — template-owned anatomy part, not a light-DOM insertion point (gh#1447)"
77
+ }
78
+ },
74
79
  "related": [
75
80
  "slider",
76
81
  "button"
77
82
  ],
78
- "slots": {
79
- "iframe": {
80
- "description": "Sandboxed <iframe> element (allow-scripts allow-same-origin)"
81
- }
82
- },
83
+ "slots": {},
83
84
  "states": [
84
85
  {
85
86
  "description": "Default, ready for interaction.",
@@ -33,9 +33,9 @@ props:
33
33
  type: string
34
34
  default: 100%
35
35
  events: {}
36
- slots:
36
+ parts:
37
37
  iframe:
38
- description: Sandboxed <iframe> element (allow-scripts allow-same-origin)
38
+ description: Sandboxed <iframe> element (allow-scripts allow-same-origin) — template-owned anatomy part, not a light-DOM insertion point (gh#1447)
39
39
  states:
40
40
  - name: idle
41
41
  description: Default, ready for interaction.
@@ -77,6 +77,7 @@
77
77
  "state"
78
78
  ],
79
79
  "name": "UIEmptyState",
80
+ "parts": {},
80
81
  "related": [
81
82
  "button",
82
83
  "drawer",
@@ -44,14 +44,14 @@
44
44
  font-size: var(--empty-state-heading-size);
45
45
  font-weight: var(--empty-state-heading-weight);
46
46
  color: var(--empty-state-heading-fg);
47
- line-height: 1.3;
47
+ line-height: var(--a-font-leading-normal);
48
48
  }
49
49
 
50
50
  /* ── Description ── */
51
51
  [slot="description"] {
52
52
  font-size: var(--empty-state-desc-size);
53
53
  color: var(--empty-state-desc-fg);
54
- line-height: 1.5;
54
+ line-height: var(--a-font-leading-relaxed);
55
55
  max-width: 36ch;
56
56
  }
57
57
 
@@ -65,6 +65,9 @@
65
65
  ],
66
66
  "unevaluatedProperties": false,
67
67
  "x-adiaui": {
68
+ "allowedParents": [
69
+ "Feed"
70
+ ],
68
71
  "anti_patterns": [],
69
72
  "category": "feedback",
70
73
  "composes": [],
@@ -83,17 +86,34 @@
83
86
  "notification-card"
84
87
  ],
85
88
  "name": "UIFeedItem",
89
+ "parts": {
90
+ "body": {
91
+ "description": "Template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always clears (`body.textContent = ''`) and rebuilds it wholesale from the `text` / `heading` props every cycle — no consumer content is preserved."
92
+ }
93
+ },
86
94
  "related": [
87
95
  "Feed",
88
96
  "Toast",
89
97
  "Alert"
90
98
  ],
91
- "slots": {
92
- "body": {
93
- "description": "Default content slot (also accepts the `text` / `heading` props)"
99
+ "slots": {},
100
+ "states": [
101
+ {
102
+ "description": "Entry transition settled — deferred one frame (or immediate under SSR) after mount so the enter transition can run.",
103
+ "attribute": "open",
104
+ "name": "open"
105
+ },
106
+ {
107
+ "description": "Dismiss in progress — the exit transition is running before the element removes itself.",
108
+ "attribute": "closing",
109
+ "name": "closing"
110
+ },
111
+ {
112
+ "description": "Above the parent `<feed-ui>`'s `[max]` visible-lane limit; hidden until a visible sibling dismisses and promotes it (Phase 2 max-queue).",
113
+ "attribute": "queued",
114
+ "name": "queued"
94
115
  }
95
- },
96
- "states": {},
116
+ ],
97
117
  "status": "stable",
98
118
  "synonyms": {
99
119
  "feed-item": [
@@ -59,10 +59,29 @@ props:
59
59
  events:
60
60
  close:
61
61
  description: Fired after the item finishes its exit animation
62
- slots:
62
+ parts:
63
63
  body:
64
- description: Default content slot (also accepts the `text` / `heading` props)
65
- states: {}
64
+ description: >-
65
+ Template-owned anatomy part, not a light-DOM insertion point (gh#1454).
66
+ render() always clears (`body.textContent = ''`) and rebuilds it
67
+ wholesale from the `text` / `heading` props every cycle — no consumer
68
+ content is preserved.
69
+ states:
70
+ - name: open
71
+ description: >-
72
+ Entry transition settled — deferred one frame (or immediate under
73
+ SSR) after mount so the enter transition can run.
74
+ attribute: open
75
+ - name: closing
76
+ description: >-
77
+ Dismiss in progress — the exit transition is running before the
78
+ element removes itself.
79
+ attribute: closing
80
+ - name: queued
81
+ description: >-
82
+ Above the parent `<feed-ui>`'s `[max]` visible-lane limit; hidden
83
+ until a visible sibling dismisses and promotes it (Phase 2 max-queue).
84
+ attribute: queued
66
85
 
67
86
  keywords:
68
87
  - feed-item
@@ -81,12 +100,14 @@ related:
81
100
  - Alert
82
101
 
83
102
  a2ui:
103
+ allowedParents:
104
+ - Feed
84
105
  rules:
85
106
  - rule: 'One notification entry inside <feed-ui>. Title + description + optional icon + auto-dismiss timer.'
86
107
  reason: 'Feed-channel item primitive.'
87
- - rule: 'Typically created programmatically via UIFeed.post(...); do not place declaratively.'
88
- reason: 'Imperative ownership.'
89
- - rule: 'Different from <alert-ui> (inline persistent) and <toast-ui> (standalone ephemeral); feed-item is feed-scoped.'
90
- reason: 'Surface boundary.'
108
+ - rule: 'Typically created programmatically via UIFeed.post(...); do not place declaratively — for a generated declarative notification author `Toast` instead, which forwards into this same channel (SPEC-FEED-CHANNEL-001 Phase 4).'
109
+ reason: 'Imperative ownership; taught-default ruling (#1363 C6 / #1375).'
110
+ - rule: 'Different from <alert-ui> (inline persistent). <toast-ui> is not a separate standalone system — it is the declarative-authoring facade for this same feed channel; both render as a feed-item paint site.'
111
+ reason: 'Surface boundary — corrected post-#1375 (toast used to be standalone, is now a facade).'
91
112
  - rule: 'For "notification deep-link" pattern: post with action + onAction. Click navigates and auto-dismisses (router.push() / location.href / api.markRead()).'
92
113
  reason: 'Deep-link pattern lives in the onAction callback, not in markup.'
@@ -41,8 +41,14 @@
41
41
  ],
42
42
  "unevaluatedProperties": false,
43
43
  "x-adiaui": {
44
- "anti_patterns": [],
45
- "category": "container",
44
+ "anti_patterns": [
45
+ {
46
+ "fix": "{\"component\": \"Toast\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}\n",
47
+ "why": "<feed-ui> is a lazily-mounted per-position singleton reached via\nUIFeed.get()/.post(); statically nesting <feed-item-ui> children in\ngenerated markup bypasses that container lifecycle. Declarative\ntransient notifications are <toast-ui>'s job — it already dissolves\ninto this same channel on connect (SPEC-FEED-CHANNEL-001 Phase 4).\n",
48
+ "wrong": "{\"component\": \"Feed\", \"children\": [{\"component\": \"FeedItem\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}]}\n"
49
+ }
50
+ ],
51
+ "category": "feedback",
46
52
  "composes": [
47
53
  "button-ui",
48
54
  "feed-item-ui"
@@ -63,6 +69,7 @@
63
69
  "notification-channel"
64
70
  ],
65
71
  "name": "UIFeedContainer",
72
+ "parts": {},
66
73
  "related": [
67
74
  "FeedItem",
68
75
  "Toast",
@@ -177,11 +177,18 @@ export class UIFeedItem extends UIElement {
177
177
  if (isActionRequired) this.#installFocusTrap();
178
178
  else this.#uninstallFocusTrap();
179
179
 
180
- if (!this.hasAttribute('data-open') && !this.#removing) {
181
- this.#openRaf = requestAnimationFrame(() => {
182
- this.#openRaf = null;
183
- this.setAttribute('data-open', '');
184
- });
180
+ if (!this.hasAttribute('open') && !this.#removing) {
181
+ // rAF defers the attribute one frame so the enter transition can
182
+ // run. No rAF (SSR shim — gh#1436's render sweep) → emit the settled
183
+ // state directly; there's no frame to animate into.
184
+ if (typeof requestAnimationFrame === 'function') {
185
+ this.#openRaf = requestAnimationFrame(() => {
186
+ this.#openRaf = null;
187
+ this.setAttribute('open', '');
188
+ });
189
+ } else {
190
+ this.setAttribute('open', '');
191
+ }
185
192
  }
186
193
  this.#scheduleAutoDismiss();
187
194
  }
@@ -197,8 +204,8 @@ export class UIFeedItem extends UIElement {
197
204
  if (this.#removing) return;
198
205
  this.#removing = true;
199
206
  if (this.#timer) { clearTimeout(this.#timer); this.#timer = null; }
200
- this.removeAttribute('data-open');
201
- this.setAttribute('data-closing', '');
207
+ this.removeAttribute('open');
208
+ this.setAttribute('closing', '');
202
209
  this.#closeTimer = setTimeout(() => {
203
210
  this.#closeTimer = null;
204
211
  const container = this.parentElement;
@@ -328,11 +335,11 @@ export class UIFeed {
328
335
  } = opts;
329
336
  const v = variant === 'error' ? 'danger' : variant; // documented alias
330
337
  const container = UIFeed.get(position);
331
- // Phase 2 max-queue: items above [max] queue with [data-queued] and
338
+ // Phase 2 max-queue: items above [max] queue with [queued] and
332
339
  // become visible as visible items dismiss.
333
340
  const max = parseInt(container.getAttribute('max') || '5', 10);
334
341
  const visibleCount = [...container.children].filter((c) =>
335
- c.tagName === 'FEED-ITEM-UI' && !c.hasAttribute('data-queued')
342
+ c.tagName === 'FEED-ITEM-UI' && !c.hasAttribute('queued')
336
343
  ).length;
337
344
  const item = document.createElement('feed-item-ui');
338
345
  if (id) item.setAttribute('data-id', id);
@@ -347,7 +354,7 @@ export class UIFeed {
347
354
  item.duration = action && !explicitDuration ? 0 : duration;
348
355
  if (dismissible != null) item.dismissible = !!dismissible;
349
356
  if (action) item.action = action;
350
- if (visibleCount >= max) item.setAttribute('data-queued', '');
357
+ if (visibleCount >= max) item.setAttribute('queued', '');
351
358
  container.appendChild(item);
352
359
  if (typeof onAction === 'function') item.update({ onAction });
353
360
  return {
@@ -382,8 +389,8 @@ export class UIFeed {
382
389
  if (!container) return;
383
390
  // Promote the oldest queued sibling (if any) before deciding whether
384
391
  // to release. The queue is FIFO; queued items live at the tail.
385
- const queued = container.querySelector('feed-item-ui[data-queued]');
386
- if (queued) queued.removeAttribute('data-queued');
392
+ const queued = container.querySelector('feed-item-ui[queued]');
393
+ if (queued) queued.removeAttribute('queued');
387
394
  if (container.children.length > 0) return;
388
395
  try { container.hidePopover?.(); } catch { /* noop */ }
389
396
  container.remove();
@@ -3,16 +3,16 @@
3
3
  Per docs/specs/feed-channel.md (SPEC-FEED-CHANNEL-001).
4
4
  ═══════════════════════════════════════════════════════════════ */
5
5
 
6
- /* Safari 17.x bug — same as toast: `:scope[data-open]` flavor B
6
+ /* Safari 17.x bug — same as toast: `:scope[open]` flavor B
7
7
  doesn't reliably restyle on attribute toggling inside @scope.
8
- Selectors moved out as plain feed-item-ui[data-…] rules. */
9
- feed-item-ui[data-open] {
8
+ Selectors moved out as plain feed-item-ui[] rules. */
9
+ feed-item-ui[open] {
10
10
  transition: transform var(--feed-item-duration) var(--feed-item-easing),
11
11
  opacity var(--feed-item-duration) var(--feed-item-easing);
12
12
  transform: translateY(0);
13
13
  opacity: 1;
14
14
  }
15
- feed-item-ui[data-closing] {
15
+ feed-item-ui[closing] {
16
16
  transition: transform var(--feed-item-duration) var(--feed-item-easing),
17
17
  opacity var(--feed-item-duration) var(--feed-item-easing);
18
18
  opacity: 0;
@@ -182,19 +182,19 @@ feed-item-ui[data-closing] {
182
182
  }
183
183
  }
184
184
 
185
- /* Phase 2 max-queue: items above [max] are appended with [data-queued]
185
+ /* Phase 2 max-queue: items above [max] are appended with [queued]
186
186
  and stay invisible until a visible sibling dismisses (at which point
187
187
  `releaseContainerIfEmpty` strips the attribute). Display:none keeps
188
188
  them out of the layout AND screen-reader-invisible — items not yet
189
189
  shown shouldn't be announced. */
190
- feed-item-ui[data-queued] {
190
+ feed-item-ui[queued] {
191
191
  display: none;
192
192
  }
193
193
 
194
194
  /* Reduced-motion: skip slide-in/out, keep opacity. */
195
195
  @media (prefers-reduced-motion: reduce) {
196
- feed-item-ui[data-open],
197
- feed-item-ui[data-closing] {
196
+ feed-item-ui[open],
197
+ feed-item-ui[closing] {
198
198
  transition: opacity var(--feed-item-duration) var(--feed-item-easing);
199
199
  transform: none !important;
200
200
  }
@@ -5,7 +5,7 @@ name: UIFeedContainer
5
5
  tag: feed-ui
6
6
  status: stable
7
7
  component: Feed
8
- category: container
8
+ category: feedback
9
9
  version: 1
10
10
  description: >-
11
11
  Shared top-layer feed channel. Per .claude/docs/specs/feed-channel.md
@@ -67,3 +67,16 @@ a2ui:
67
67
  reason: 'Imperative API ownership.'
68
68
  - rule: 'For inline persistent alerts inside content regions use <alert-ui> instead; feed is ephemeral overlay.'
69
69
  reason: 'Surface boundary.'
70
+ - rule: 'Not the generation target for a new transient notification — author `Toast` instead. <toast-ui> is a thin declarative facade that already posts into this channel and self-removes on connect (SPEC-FEED-CHANNEL-001 Phase 4); `<feed-ui>`/`<feed-item-ui>` are the imperative/programmatic infrastructure underneath it, reached via `UIFeed.post()` or a declared `<toast-ui>`, never by placing `<feed-ui>`/`<feed-item-ui>` directly in generated markup.'
71
+ reason: 'Taught-default ruling (#1363 C6 / #1375) — cross-references <toast-ui>''s own a2ui rules.'
72
+ anti_patterns:
73
+ - wrong: |
74
+ {"component": "Feed", "children": [{"component": "FeedItem", "variant": "success", "text": "Saved successfully."}]}
75
+ why: |
76
+ <feed-ui> is a lazily-mounted per-position singleton reached via
77
+ UIFeed.get()/.post(); statically nesting <feed-item-ui> children in
78
+ generated markup bypasses that container lifecycle. Declarative
79
+ transient notifications are <toast-ui>'s job — it already dissolves
80
+ into this same channel on connect (SPEC-FEED-CHANNEL-001 Phase 4).
81
+ fix: |
82
+ {"component": "Toast", "variant": "success", "text": "Saved successfully."}
@@ -89,6 +89,7 @@
89
89
  "wrapper"
90
90
  ],
91
91
  "name": "UIField",
92
+ "parts": {},
92
93
  "related": [
93
94
  "input",
94
95
  "select",
@@ -133,7 +133,7 @@
133
133
  :scope [slot="hint"],
134
134
  :scope [slot="error"] {
135
135
  grid-area: message;
136
- line-height: 1.3;
136
+ line-height: var(--a-font-leading-normal);
137
137
  }
138
138
  :scope [slot="hint"] {
139
139
  color: var(--field-hint-color);
@@ -43,6 +43,6 @@
43
43
 
44
44
  ```html
45
45
  <field-ui inline label="Search">
46
- <input-ui type="search" placeholder="Type a command…"></input-ui>
46
+ <search-ui placeholder="Type a command…"></search-ui>
47
47
  </field-ui>
48
48
  ```
@@ -67,6 +67,7 @@
67
67
  "group"
68
68
  ],
69
69
  "name": "UIFields",
70
+ "parts": {},
70
71
  "related": [
71
72
  "field",
72
73
  "input",
@@ -45,7 +45,7 @@
45
45
  ```html
46
46
  <fields-ui inline>
47
47
  <field-ui label="Search">
48
- <input-ui type="search" placeholder="Type to search…"></input-ui>
48
+ <search-ui placeholder="Type to search…"></search-ui>
49
49
  </field-ui>
50
50
  <field-ui label="Kind">
51
51
  <select-ui value="all">
@@ -53,6 +53,7 @@
53
53
  "footer"
54
54
  ],
55
55
  "name": "UIFooter",
56
+ "parts": {},
56
57
  "related": [
57
58
  "avatar",
58
59
  "input",
@@ -46,6 +46,7 @@
46
46
  "sheet"
47
47
  ],
48
48
  "name": "UIFrame",
49
+ "parts": {},
49
50
  "related": [
50
51
  "Card",
51
52
  "Drawer",
@@ -86,6 +86,7 @@
86
86
  "responsive"
87
87
  ],
88
88
  "name": "UIGrid",
89
+ "parts": {},
89
90
  "related": [
90
91
  "button",
91
92
  "badge",
@@ -16,8 +16,8 @@
16
16
  "component": {
17
17
  "const": "Header"
18
18
  },
19
- "padding": {
20
- "description": "Bare attribute — enables default header padding. The container parent's own `padding` prop sets the scale.",
19
+ "padded": {
20
+ "description": "Bare attribute — enables default header padding. The container parent's own `padding` prop sets the scale. Renamed from `[padding]` (gh#1335) — a boolean can't share a name with the global Scale-grammar `[padding]` attribute (ADR-0053).",
21
21
  "type": "boolean",
22
22
  "default": false
23
23
  }
@@ -47,6 +47,7 @@
47
47
  "header"
48
48
  ],
49
49
  "name": "UIHeader",
50
+ "parts": {},
50
51
  "related": [
51
52
  "avatar",
52
53
  "input",