@adia-ai/web-components 0.0.28 → 0.0.33

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 (349) hide show
  1. package/README.md +4 -8
  2. package/a2ui/index.js +1 -1
  3. package/components/accordion/accordion.a2ui.json +1 -1
  4. package/components/accordion/accordion.js +6 -6
  5. package/components/accordion/accordion.yaml +1 -1
  6. package/components/action-list/action-list.a2ui.json +1 -1
  7. package/components/action-list/action-list.js +6 -6
  8. package/components/action-list/action-list.yaml +1 -1
  9. package/components/agent-artifact/agent-artifact.a2ui.json +1 -1
  10. package/components/agent-artifact/agent-artifact.js +4 -4
  11. package/components/agent-artifact/agent-artifact.yaml +1 -1
  12. package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +1 -1
  13. package/components/agent-feedback-bar/agent-feedback-bar.js +4 -4
  14. package/components/agent-feedback-bar/agent-feedback-bar.yaml +1 -1
  15. package/components/agent-questions/agent-questions.a2ui.json +1 -1
  16. package/components/agent-questions/agent-questions.js +4 -4
  17. package/components/agent-questions/agent-questions.yaml +1 -1
  18. package/components/agent-reasoning/agent-reasoning.a2ui.json +3 -3
  19. package/components/agent-reasoning/agent-reasoning.js +4 -4
  20. package/components/agent-reasoning/agent-reasoning.yaml +3 -3
  21. package/components/agent-suggestions/agent-suggestions.a2ui.json +1 -1
  22. package/components/agent-suggestions/agent-suggestions.js +4 -4
  23. package/components/agent-suggestions/agent-suggestions.yaml +1 -1
  24. package/components/agent-trace/agent-trace.a2ui.json +1 -1
  25. package/components/agent-trace/agent-trace.js +4 -4
  26. package/components/agent-trace/agent-trace.yaml +1 -1
  27. package/components/alert/alert.a2ui.json +1 -1
  28. package/components/alert/alert.js +4 -4
  29. package/components/alert/alert.yaml +1 -1
  30. package/components/aside/aside.a2ui.json +1 -1
  31. package/components/aside/aside.yaml +1 -1
  32. package/components/avatar/avatar.a2ui.json +1 -1
  33. package/components/avatar/avatar.js +8 -8
  34. package/components/avatar/avatar.yaml +1 -1
  35. package/components/badge/badge.a2ui.json +1 -1
  36. package/components/badge/badge.js +4 -4
  37. package/components/badge/badge.yaml +1 -1
  38. package/components/block/block.a2ui.json +1 -1
  39. package/components/block/block.js +4 -4
  40. package/components/block/block.yaml +1 -1
  41. package/components/breadcrumb/breadcrumb.a2ui.json +1 -1
  42. package/components/breadcrumb/breadcrumb.js +4 -4
  43. package/components/breadcrumb/breadcrumb.yaml +1 -1
  44. package/components/button/button.a2ui.json +1 -1
  45. package/components/button/button.js +4 -4
  46. package/components/button/button.yaml +1 -1
  47. package/components/calendar-picker/calendar-picker.a2ui.json +1 -1
  48. package/components/calendar-picker/calendar-picker.js +6 -6
  49. package/components/calendar-picker/calendar-picker.yaml +1 -1
  50. package/components/canvas/canvas.a2ui.json +1 -1
  51. package/components/canvas/canvas.js +5 -5
  52. package/components/canvas/canvas.yaml +1 -1
  53. package/components/card/card.a2ui.json +1 -1
  54. package/components/card/card.js +4 -4
  55. package/components/card/card.yaml +1 -1
  56. package/components/chart/chart.a2ui.json +1 -1
  57. package/components/chart/chart.js +5 -5
  58. package/components/chart/chart.yaml +1 -1
  59. package/components/chart-legend/chart-legend.a2ui.json +1 -1
  60. package/components/chart-legend/chart-legend.js +7 -7
  61. package/components/chart-legend/chart-legend.yaml +1 -1
  62. package/components/{chat → chat-thread}/chat-input.js +5 -5
  63. package/components/{chat/chat.a2ui.json → chat-thread/chat-thread.a2ui.json} +6 -6
  64. package/components/{chat/chat.css → chat-thread/chat-thread.css} +2 -2
  65. package/components/{chat/chat.js → chat-thread/chat-thread.js} +7 -7
  66. package/components/{chat/chat.yaml → chat-thread/chat-thread.yaml} +4 -4
  67. package/components/check/check.a2ui.json +1 -1
  68. package/components/check/check.js +5 -5
  69. package/components/check/check.yaml +1 -1
  70. package/components/code/code.a2ui.json +1 -1
  71. package/components/code/code.js +4 -4
  72. package/components/code/code.yaml +1 -1
  73. package/components/col/col.a2ui.json +1 -1
  74. package/components/col/col.js +4 -4
  75. package/components/col/col.yaml +1 -1
  76. package/components/color-picker/color-picker.a2ui.json +1 -1
  77. package/components/color-picker/color-picker.js +6 -6
  78. package/components/color-picker/color-picker.yaml +1 -1
  79. package/components/command/command.a2ui.json +1 -1
  80. package/components/command/command.js +5 -5
  81. package/components/command/command.yaml +1 -1
  82. package/components/description-list/description-list.a2ui.json +1 -1
  83. package/components/description-list/description-list.js +4 -4
  84. package/components/description-list/description-list.yaml +1 -1
  85. package/components/divider/divider.a2ui.json +1 -1
  86. package/components/divider/divider.js +4 -4
  87. package/components/divider/divider.yaml +1 -1
  88. package/components/drawer/drawer.a2ui.json +1 -1
  89. package/components/drawer/drawer.js +4 -4
  90. package/components/drawer/drawer.yaml +1 -1
  91. package/components/embed/embed.a2ui.json +1 -1
  92. package/components/embed/embed.js +4 -4
  93. package/components/embed/embed.yaml +1 -1
  94. package/components/empty-state/empty-state.a2ui.json +1 -1
  95. package/components/empty-state/empty-state.js +4 -4
  96. package/components/empty-state/empty-state.yaml +1 -1
  97. package/components/feed/feed-item.yaml +2 -2
  98. package/components/feed/feed.a2ui.json +2 -2
  99. package/components/feed/feed.css +21 -3
  100. package/components/feed/feed.js +140 -31
  101. package/components/feed/feed.yaml +2 -2
  102. package/components/field/field.a2ui.json +1 -1
  103. package/components/field/field.js +10 -10
  104. package/components/field/field.yaml +2 -2
  105. package/components/footer/footer.a2ui.json +1 -1
  106. package/components/footer/footer.yaml +1 -1
  107. package/components/grid/grid.a2ui.json +1 -1
  108. package/components/grid/grid.js +4 -4
  109. package/components/grid/grid.yaml +1 -1
  110. package/components/header/header.a2ui.json +1 -1
  111. package/components/header/header.yaml +1 -1
  112. package/components/heatmap/heatmap.a2ui.json +1 -1
  113. package/components/heatmap/heatmap.js +4 -4
  114. package/components/heatmap/heatmap.yaml +1 -1
  115. package/components/icon/icon.a2ui.json +1 -1
  116. package/components/icon/icon.js +4 -4
  117. package/components/icon/icon.yaml +1 -1
  118. package/components/image/image.a2ui.json +1 -1
  119. package/components/image/image.js +4 -4
  120. package/components/image/image.yaml +1 -1
  121. package/components/index.js +88 -85
  122. package/components/input/input.a2ui.json +1 -1
  123. package/components/input/input.js +7 -7
  124. package/components/input/input.yaml +1 -1
  125. package/components/inspector/inspector.a2ui.json +1 -1
  126. package/components/inspector/inspector.js +4 -4
  127. package/components/inspector/inspector.yaml +1 -1
  128. package/components/kbd/kbd.a2ui.json +1 -1
  129. package/components/kbd/kbd.js +4 -4
  130. package/components/kbd/kbd.yaml +1 -1
  131. package/components/list/list.a2ui.json +1 -1
  132. package/components/list/list.js +6 -6
  133. package/components/list/list.yaml +1 -1
  134. package/components/menu/menu.a2ui.json +1 -1
  135. package/components/menu/menu.js +8 -8
  136. package/components/menu/menu.yaml +1 -1
  137. package/components/modal/modal.a2ui.json +1 -1
  138. package/components/modal/modal.js +4 -4
  139. package/components/modal/modal.yaml +1 -1
  140. package/components/nav/nav.a2ui.json +98 -0
  141. package/components/nav/nav.css +133 -0
  142. package/components/nav/nav.js +140 -0
  143. package/components/nav/nav.test.js +428 -0
  144. package/components/nav/nav.yaml +114 -0
  145. package/components/nav-group/nav-group.a2ui.json +100 -0
  146. package/{patterns/app-nav-group/app-nav-group.css → components/nav-group/nav-group.css} +71 -18
  147. package/{patterns/app-nav-group/app-nav-group.js → components/nav-group/nav-group.js} +51 -25
  148. package/components/nav-group/nav-group.yaml +69 -0
  149. package/components/nav-item/nav-item.a2ui.json +106 -0
  150. package/{patterns/app-nav-item/app-nav-item.css → components/nav-item/nav-item.css} +42 -10
  151. package/components/nav-item/nav-item.js +76 -0
  152. package/components/nav-item/nav-item.yaml +73 -0
  153. package/components/noodles/noodles.a2ui.json +1 -1
  154. package/components/noodles/noodles.js +4 -4
  155. package/components/noodles/noodles.yaml +1 -1
  156. package/components/option-card/option-card.a2ui.json +1 -1
  157. package/components/option-card/option-card.js +6 -6
  158. package/components/option-card/option-card.yaml +1 -1
  159. package/components/otp-input/otp-input.a2ui.json +1 -1
  160. package/components/otp-input/otp-input.js +5 -5
  161. package/components/otp-input/otp-input.yaml +1 -1
  162. package/components/page/page.a2ui.json +3 -3
  163. package/components/page/page.js +4 -4
  164. package/components/page/page.yaml +3 -3
  165. package/components/pagination/pagination.a2ui.json +1 -1
  166. package/components/pagination/pagination.js +4 -4
  167. package/components/pagination/pagination.yaml +1 -1
  168. package/components/pane/pane.a2ui.json +1 -1
  169. package/components/pane/pane.js +4 -4
  170. package/components/pane/pane.yaml +1 -1
  171. package/components/pipeline-status/pipeline-status.a2ui.json +1 -1
  172. package/components/pipeline-status/pipeline-status.js +4 -4
  173. package/components/pipeline-status/pipeline-status.yaml +1 -1
  174. package/components/popover/popover.a2ui.json +1 -1
  175. package/components/popover/popover.js +4 -4
  176. package/components/popover/popover.yaml +1 -1
  177. package/components/progress/progress.a2ui.json +1 -1
  178. package/components/progress/progress.js +4 -4
  179. package/components/progress/progress.yaml +1 -1
  180. package/components/progress-row/progress-row.a2ui.json +1 -1
  181. package/components/progress-row/progress-row.js +4 -4
  182. package/components/progress-row/progress-row.yaml +1 -1
  183. package/components/radio/radio.a2ui.json +1 -1
  184. package/components/radio/radio.js +5 -5
  185. package/components/radio/radio.yaml +1 -1
  186. package/components/range/range.a2ui.json +1 -1
  187. package/components/range/range.js +7 -7
  188. package/components/range/range.yaml +1 -1
  189. package/components/rating/rating.a2ui.json +1 -1
  190. package/components/rating/rating.js +6 -6
  191. package/components/rating/rating.yaml +1 -1
  192. package/components/richtext/richtext.a2ui.json +1 -1
  193. package/components/richtext/richtext.js +4 -4
  194. package/components/richtext/richtext.yaml +1 -1
  195. package/components/row/row.a2ui.json +1 -1
  196. package/components/row/row.js +4 -4
  197. package/components/row/row.yaml +1 -1
  198. package/components/search/search.a2ui.json +1 -1
  199. package/components/search/search.js +5 -5
  200. package/components/search/search.yaml +1 -1
  201. package/components/section/section.a2ui.json +1 -1
  202. package/components/section/section.yaml +1 -1
  203. package/components/segment/segment.a2ui.json +1 -1
  204. package/components/segment/segment.js +4 -4
  205. package/components/segment/segment.yaml +1 -1
  206. package/components/segmented/segmented.a2ui.json +1 -1
  207. package/components/segmented/segmented.css +6 -0
  208. package/components/segmented/segmented.js +7 -7
  209. package/components/segmented/segmented.yaml +1 -1
  210. package/components/select/select.a2ui.json +1 -1
  211. package/components/select/select.js +5 -5
  212. package/components/select/select.yaml +1 -1
  213. package/components/skeleton/skeleton.a2ui.json +1 -1
  214. package/components/skeleton/skeleton.js +4 -4
  215. package/components/skeleton/skeleton.yaml +1 -1
  216. package/components/slider/slider.a2ui.json +1 -1
  217. package/components/slider/slider.js +7 -7
  218. package/components/slider/slider.yaml +1 -1
  219. package/components/stack/stack.a2ui.json +1 -1
  220. package/components/stack/stack.js +4 -4
  221. package/components/stack/stack.yaml +1 -1
  222. package/components/stat/stat.a2ui.json +1 -1
  223. package/components/stat/stat.js +4 -4
  224. package/components/stat/stat.yaml +1 -1
  225. package/components/stepper/stepper.a2ui.json +1 -1
  226. package/components/stepper/stepper.js +6 -6
  227. package/components/stepper/stepper.yaml +1 -1
  228. package/components/stream/stream.a2ui.json +1 -1
  229. package/components/stream/stream.js +4 -4
  230. package/components/stream/stream.yaml +1 -1
  231. package/components/swatch/swatch.a2ui.json +1 -1
  232. package/components/swatch/swatch.js +4 -4
  233. package/components/swatch/swatch.yaml +1 -1
  234. package/components/swiper/swiper.a2ui.json +1 -1
  235. package/components/swiper/swiper.js +4 -4
  236. package/components/swiper/swiper.yaml +1 -1
  237. package/components/switch/switch.a2ui.json +1 -1
  238. package/components/switch/switch.js +5 -5
  239. package/components/switch/switch.yaml +1 -1
  240. package/components/table/table.a2ui.json +1 -1
  241. package/components/table/table.js +4 -4
  242. package/components/table/table.yaml +1 -1
  243. package/components/table-toolbar/table-toolbar.a2ui.json +1 -1
  244. package/components/table-toolbar/table-toolbar.js +4 -4
  245. package/components/table-toolbar/table-toolbar.yaml +1 -1
  246. package/components/tabs/tab.js +4 -4
  247. package/components/tabs/tabs.a2ui.json +1 -1
  248. package/components/tabs/tabs.js +5 -5
  249. package/components/tabs/tabs.yaml +1 -1
  250. package/components/tag/tag.a2ui.json +1 -1
  251. package/components/tag/tag.js +4 -4
  252. package/components/tag/tag.yaml +1 -1
  253. package/components/text/text.a2ui.json +1 -1
  254. package/components/text/text.js +4 -4
  255. package/components/text/text.yaml +1 -1
  256. package/components/textarea/textarea.a2ui.json +1 -1
  257. package/components/textarea/textarea.js +5 -5
  258. package/components/textarea/textarea.yaml +1 -1
  259. package/components/timeline/timeline.a2ui.json +1 -1
  260. package/components/timeline/timeline.js +6 -6
  261. package/components/timeline/timeline.yaml +1 -1
  262. package/components/toast/toast.a2ui.json +1 -1
  263. package/components/toast/toast.js +54 -184
  264. package/components/toast/toast.yaml +1 -1
  265. package/components/toggle-group/toggle-group.a2ui.json +1 -1
  266. package/components/toggle-group/toggle-group.js +6 -6
  267. package/components/toggle-group/toggle-group.yaml +1 -1
  268. package/components/toolbar/toolbar.a2ui.json +1 -1
  269. package/components/toolbar/toolbar.js +6 -6
  270. package/components/toolbar/toolbar.yaml +1 -1
  271. package/components/tooltip/tooltip.a2ui.json +1 -1
  272. package/components/tooltip/tooltip.js +7 -7
  273. package/components/tooltip/tooltip.yaml +1 -1
  274. package/components/tree/tree.a2ui.json +1 -1
  275. package/components/tree/tree.js +6 -6
  276. package/components/tree/tree.yaml +1 -1
  277. package/components/upload/upload.a2ui.json +1 -1
  278. package/components/upload/upload.js +6 -6
  279. package/components/upload/upload.yaml +1 -1
  280. package/core/element.js +4 -4
  281. package/core/element.test.js +18 -18
  282. package/core/form.js +9 -9
  283. package/core/index.js +2 -2
  284. package/core/provider.js +7 -7
  285. package/core/template.js +1 -1
  286. package/index.css +3 -2
  287. package/index.js +17 -7
  288. package/package.json +1 -5
  289. package/styles/components.css +10 -6
  290. package/styles/resets.css +1 -1
  291. package/traits/define.js +2 -2
  292. package/patterns/a2ui-root/a2ui-root.a2ui.json +0 -125
  293. package/patterns/a2ui-root/a2ui-root.js +0 -191
  294. package/patterns/a2ui-root/a2ui-root.yaml +0 -87
  295. package/patterns/adia-chat/adia-chat.a2ui.json +0 -149
  296. package/patterns/adia-chat/adia-chat.css +0 -10
  297. package/patterns/adia-chat/adia-chat.js +0 -297
  298. package/patterns/adia-chat/adia-chat.yaml +0 -118
  299. package/patterns/adia-chat/css/adia-chat.empty.css +0 -12
  300. package/patterns/adia-chat/css/adia-chat.layout.css +0 -60
  301. package/patterns/adia-chat/css/adia-chat.markdown.css +0 -74
  302. package/patterns/adia-chat/css/adia-chat.messages.css +0 -87
  303. package/patterns/adia-chat/css/adia-chat.streaming.css +0 -30
  304. package/patterns/adia-chat/css/adia-chat.tokens.css +0 -95
  305. package/patterns/adia-editor/adia-editor.a2ui.json +0 -73
  306. package/patterns/adia-editor/adia-editor.css +0 -6
  307. package/patterns/adia-editor/adia-editor.js +0 -56
  308. package/patterns/adia-editor/adia-editor.yaml +0 -59
  309. package/patterns/adia-editor/css/adia-editor.layout.css +0 -171
  310. package/patterns/adia-editor/css/adia-editor.tokens.css +0 -28
  311. package/patterns/app-nav/app-nav.a2ui.json +0 -89
  312. package/patterns/app-nav/app-nav.css +0 -92
  313. package/patterns/app-nav/app-nav.js +0 -112
  314. package/patterns/app-nav/app-nav.yaml +0 -54
  315. package/patterns/app-nav-group/app-nav-group.a2ui.json +0 -82
  316. package/patterns/app-nav-group/app-nav-group.yaml +0 -59
  317. package/patterns/app-nav-item/app-nav-item.a2ui.json +0 -83
  318. package/patterns/app-nav-item/app-nav-item.js +0 -42
  319. package/patterns/app-nav-item/app-nav-item.yaml +0 -62
  320. package/patterns/app-shell/app-shell.a2ui.json +0 -129
  321. package/patterns/app-shell/app-shell.css +0 -14
  322. package/patterns/app-shell/app-shell.js +0 -251
  323. package/patterns/app-shell/app-shell.yaml +0 -89
  324. package/patterns/app-shell/css/app-shell.collapsed.css +0 -86
  325. package/patterns/app-shell/css/app-shell.helpers.css +0 -42
  326. package/patterns/app-shell/css/app-shell.main.css +0 -172
  327. package/patterns/app-shell/css/app-shell.shell.css +0 -44
  328. package/patterns/app-shell/css/app-shell.sidebar.css +0 -161
  329. package/patterns/app-shell/css/app-shell.templates.css +0 -214
  330. package/patterns/app-shell/css/app-shell.tokens.css +0 -119
  331. package/patterns/gen-ui/gen-ui.a2ui.json +0 -72
  332. package/patterns/gen-ui/gen-ui.css +0 -83
  333. package/patterns/gen-ui/gen-ui.js +0 -136
  334. package/patterns/gen-ui/gen-ui.yaml +0 -43
  335. package/patterns/index.js +0 -11
  336. package/patterns/section-nav/section-nav.a2ui.json +0 -91
  337. package/patterns/section-nav/section-nav.css +0 -60
  338. package/patterns/section-nav/section-nav.js +0 -42
  339. package/patterns/section-nav/section-nav.yaml +0 -58
  340. package/patterns/section-nav-group/section-nav-group.a2ui.json +0 -95
  341. package/patterns/section-nav-group/section-nav-group.css +0 -74
  342. package/patterns/section-nav-group/section-nav-group.js +0 -84
  343. package/patterns/section-nav-group/section-nav-group.yaml +0 -66
  344. package/patterns/section-nav-item/section-nav-item.a2ui.json +0 -97
  345. package/patterns/section-nav-item/section-nav-item.css +0 -106
  346. package/patterns/section-nav-item/section-nav-item.js +0 -66
  347. package/patterns/section-nav-item/section-nav-item.yaml +0 -70
  348. package/styles/layouts/admin.css +0 -7
  349. /package/components/{chat → chat-thread}/chat-input.css +0 -0
@@ -12,12 +12,12 @@
12
12
  * (no auto-dismiss when `duration` is null/0; close button
13
13
  * surfaces when `dismissible` is set) but the action-required
14
14
  * focus-trap is deferred.
15
- * - Static API: AdiaFeed.post() / .get() / .clear() / .purge()
15
+ * - Static API: UIFeed.post() / .get() / .clear() / .purge()
16
16
  * — `purge()` directly addresses the audit's L-B4 container-leak
17
17
  * finding by giving consumers a tear-down hook.
18
18
  * - Global event channel: window.dispatchEvent(new CustomEvent(
19
19
  * 'feed', { detail: { text, position, ... } })) — same shape as
20
- * AdiaFeed.post() so any code can post without importing the
20
+ * UIFeed.post() so any code can post without importing the
21
21
  * module directly. Idempotent listener install (HMR-safe).
22
22
  *
23
23
  * Toast migration (spec § 2.5) is deferred — toast-ui keeps its own
@@ -25,11 +25,11 @@
25
25
  * surface has soaked.
26
26
  */
27
27
 
28
- import { AdiaElement, html } from '../../core/element.js';
28
+ import { UIElement, html } from '../../core/element.js';
29
29
 
30
30
  /* ── Container — one per position, mounted into document.body ── */
31
31
 
32
- class AdiaFeedContainer extends AdiaElement {
32
+ class UIFeedContainer extends UIElement {
33
33
  static properties = {
34
34
  position: { type: String, default: 'bottom-right', reflect: true },
35
35
  max: { type: Number, default: 5, reflect: true },
@@ -42,11 +42,11 @@ class AdiaFeedContainer extends AdiaElement {
42
42
  }
43
43
  }
44
44
 
45
- customElements.define('feed-ui', AdiaFeedContainer);
45
+ customElements.define('feed-ui', UIFeedContainer);
46
46
 
47
47
  /* ── Item — one per posted message ── */
48
48
 
49
- class AdiaFeedItem extends AdiaElement {
49
+ class UIFeedItem extends UIElement {
50
50
  #timer = null;
51
51
  #removing = false;
52
52
  #closeTimer = null;
@@ -59,6 +59,11 @@ class AdiaFeedItem extends AdiaElement {
59
59
  variant: { type: String, default: 'default', reflect: true },
60
60
  duration: { type: Number, default: 4000, reflect: true },
61
61
  dismissible: { type: Boolean, default: false, reflect: true },
62
+ // Phase 2: action-required policy. When set, the item carries an
63
+ // action button that the user MUST click (or dismiss) before the
64
+ // item goes away. Spec §2.3 — action-required role=alertdialog,
65
+ // focus is trapped until choice is made.
66
+ action: { type: String, default: '', reflect: true },
62
67
  };
63
68
 
64
69
  static parts = {
@@ -67,9 +72,21 @@ class AdiaFeedItem extends AdiaElement {
67
72
  static template = () => html``;
68
73
 
69
74
  #onPress = (e) => {
70
- if (e.target.closest('[data-feed-close]')) this.dismiss();
75
+ if (e.target.closest('[data-feed-close]')) { this.dismiss(); return; }
76
+ // Phase 2: action button — fires the action callback (if registered
77
+ // via FeedHandle.update with onAction) then dismisses. The handle's
78
+ // .update({onAction: fn}) populates this.#onAction below.
79
+ if (e.target.closest('[data-feed-action]')) {
80
+ try { this.#onAction?.(); } catch (err) { console.warn('[feed-item] action handler threw:', err); }
81
+ this.dismiss();
82
+ }
71
83
  };
72
84
 
85
+ // Phase 2 focus-trap state — only used when the policy is action-required.
86
+ #onAction = null;
87
+ #focusTrapPrev = null;
88
+ #onTrapKeydown = null;
89
+
73
90
  connected() {
74
91
  this.addEventListener('press', this.#onPress);
75
92
  }
@@ -95,17 +112,22 @@ class AdiaFeedItem extends AdiaElement {
95
112
  }
96
113
 
97
114
  /* Inferred policy roles per spec §2.4. Auto-fade gets `status`;
98
- sticky danger/warning gets `alert`; action-required gets
99
- `alertdialog` (a future phase wires the focus trap). */
115
+ sticky danger/warning gets `alert`; action-required (sticky +
116
+ has [action]) gets `alertdialog` and a focus trap. */
100
117
  const isSticky = !this.duration || this.duration <= 0;
101
118
  const isLoud = this.variant === 'danger' || this.variant === 'warning';
119
+ const isActionRequired = isSticky && !!this.action;
102
120
  let role = 'status';
103
- if (isSticky && isLoud) role = 'alert';
121
+ if (isActionRequired) role = 'alertdialog';
122
+ else if (isSticky && isLoud) role = 'alert';
104
123
  this.setAttribute('role', role);
105
- this.setAttribute('aria-live', role === 'alert' ? 'assertive' : 'polite');
124
+ this.setAttribute('aria-live', role === 'alert' || role === 'alertdialog' ? 'assertive' : 'polite');
125
+ if (isActionRequired) this.setAttribute('aria-modal', 'false'); // not page-blocking; focus-trap only
106
126
 
107
127
  /* Render dismiss button for sticky items (spec §2.2 — default true
108
- for sticky, false for auto-fade). */
128
+ for sticky, false for auto-fade). Action-required items still
129
+ allow Escape to dismiss for safety; the action button is not the
130
+ only escape. */
109
131
  const wantsClose = this.dismissible || isSticky;
110
132
  let close = this.querySelector(':scope > [data-feed-close]');
111
133
  if (wantsClose && !close) {
@@ -120,6 +142,27 @@ class AdiaFeedItem extends AdiaElement {
120
142
  close.remove();
121
143
  }
122
144
 
145
+ /* Phase 2 — render the action button when [action] is set. Sits
146
+ between the body and the close button. */
147
+ let actionBtn = this.querySelector(':scope > [data-feed-action]');
148
+ if (this.action) {
149
+ if (!actionBtn) {
150
+ actionBtn = document.createElement('button-ui');
151
+ actionBtn.setAttribute('data-feed-action', '');
152
+ actionBtn.setAttribute('variant', 'ghost');
153
+ actionBtn.setAttribute('size', 'sm');
154
+ if (close && close.parentElement === this) this.insertBefore(actionBtn, close);
155
+ else this.appendChild(actionBtn);
156
+ }
157
+ actionBtn.setAttribute('text', this.action);
158
+ } else if (actionBtn) {
159
+ actionBtn.remove();
160
+ }
161
+
162
+ /* Focus-trap activation for action-required. */
163
+ if (isActionRequired) this.#installFocusTrap();
164
+ else this.#uninstallFocusTrap();
165
+
123
166
  if (!this.hasAttribute('data-open') && !this.#removing) {
124
167
  this.#openRaf = requestAnimationFrame(() => {
125
168
  this.#openRaf = null;
@@ -147,31 +190,72 @@ class AdiaFeedItem extends AdiaElement {
147
190
  const container = this.parentElement;
148
191
  this.dispatchEvent(new Event('close', { bubbles: true }));
149
192
  this.remove();
150
- if (container?.matches?.('feed-ui')) AdiaFeed.releaseContainerIfEmpty(container);
193
+ if (container?.matches?.('feed-ui')) UIFeed.releaseContainerIfEmpty(container);
151
194
  }, this.#getDuration());
152
195
  }
153
196
 
154
197
  update(patch) {
155
198
  if (!patch || typeof patch !== 'object') return;
156
199
  for (const k of Object.keys(patch)) {
157
- if (k in AdiaFeedItem.properties) this[k] = patch[k];
200
+ if (k in UIFeedItem.properties) this[k] = patch[k];
158
201
  }
202
+ // Phase 2: handle is set via the FeedHandle's update(); not a
203
+ // reflected attribute, so it lives outside the property loop.
204
+ if (typeof patch.onAction === 'function') this.#onAction = patch.onAction;
159
205
  this.#scheduleAutoDismiss();
160
206
  }
161
207
 
208
+ // Phase 2 focus-trap. Installs on action-required items; saves the
209
+ // previously-focused element so we can return focus on dismiss; cycles
210
+ // Tab/Shift-Tab between focusable descendants; Escape dismisses.
211
+ #installFocusTrap() {
212
+ if (this.#onTrapKeydown) return; // already installed
213
+ this.#focusTrapPrev = document.activeElement;
214
+ const focusables = () => [...this.querySelectorAll('button, button-ui, [tabindex]:not([tabindex="-1"]), input, [data-feed-action], [data-feed-close]')]
215
+ .filter((el) => !el.hasAttribute('disabled') && el.offsetParent !== null);
216
+ this.#onTrapKeydown = (e) => {
217
+ if (e.key === 'Escape') { e.stopPropagation(); this.dismiss(); return; }
218
+ if (e.key !== 'Tab') return;
219
+ const els = focusables();
220
+ if (!els.length) return;
221
+ const first = els[0];
222
+ const last = els[els.length - 1];
223
+ const active = document.activeElement;
224
+ if (e.shiftKey && active === first) { e.preventDefault(); last.focus(); }
225
+ else if (!e.shiftKey && active === last) { e.preventDefault(); first.focus(); }
226
+ };
227
+ this.addEventListener('keydown', this.#onTrapKeydown, true);
228
+ // Move focus into the item — prefer the action button.
229
+ queueMicrotask(() => {
230
+ const els = focusables();
231
+ const action = this.querySelector('[data-feed-action]');
232
+ (action || els[0])?.focus?.();
233
+ });
234
+ }
235
+
236
+ #uninstallFocusTrap() {
237
+ if (!this.#onTrapKeydown) return;
238
+ this.removeEventListener('keydown', this.#onTrapKeydown, true);
239
+ this.#onTrapKeydown = null;
240
+ // Restore focus to whatever had it before the trap engaged.
241
+ try { this.#focusTrapPrev?.focus?.(); } catch { /* element may have been removed */ }
242
+ this.#focusTrapPrev = null;
243
+ }
244
+
162
245
  disconnected() {
163
246
  this.removeEventListener('press', this.#onPress);
164
247
  if (this.#timer) { clearTimeout(this.#timer); this.#timer = null; }
165
248
  if (this.#closeTimer) { clearTimeout(this.#closeTimer); this.#closeTimer = null; }
166
249
  if (this.#openRaf != null) { cancelAnimationFrame(this.#openRaf); this.#openRaf = null; }
250
+ this.#uninstallFocusTrap();
167
251
  }
168
252
  }
169
253
 
170
- customElements.define('feed-item-ui', AdiaFeedItem);
254
+ customElements.define('feed-item-ui', UIFeedItem);
171
255
 
172
- /* ── Static API — AdiaFeed ── */
256
+ /* ── Static API — UIFeed ── */
173
257
 
174
- class AdiaFeed {
258
+ class UIFeed {
175
259
  static #containers = new Map();
176
260
 
177
261
  /**
@@ -182,14 +266,14 @@ class AdiaFeed {
182
266
  * top-right + another in bottom-center) without collision.
183
267
  */
184
268
  static get(position = 'bottom-right') {
185
- let el = AdiaFeed.#containers.get(position);
269
+ let el = UIFeed.#containers.get(position);
186
270
  if (el && el.isConnected) return el;
187
271
  el = document.createElement('feed-ui');
188
272
  el.setAttribute('position', position);
189
273
  if ('popover' in HTMLElement.prototype) el.setAttribute('popover', 'manual');
190
274
  document.body.appendChild(el);
191
275
  try { el.showPopover?.(); } catch { /* graceful fallback */ }
192
- AdiaFeed.#containers.set(position, el);
276
+ UIFeed.#containers.set(position, el);
193
277
  return el;
194
278
  }
195
279
 
@@ -205,6 +289,12 @@ class AdiaFeed {
205
289
  * @param {string} [opts.position='bottom-right']
206
290
  * @param {boolean} [opts.dismissible] override default (true for sticky, false for auto)
207
291
  * @param {string} [opts.id]
292
+ * @param {string} [opts.action] Phase 2 — action button label. When set,
293
+ * duration is forced to null (sticky); the
294
+ * item gets role=alertdialog + focus trap.
295
+ * @param {function} [opts.onAction] Phase 2 — callback invoked when the
296
+ * action button is pressed. Item dismisses
297
+ * after the callback returns.
208
298
  */
209
299
  static post(opts = {}) {
210
300
  const {
@@ -216,18 +306,30 @@ class AdiaFeed {
216
306
  position = 'bottom-right',
217
307
  dismissible,
218
308
  id,
309
+ action = '',
310
+ onAction,
219
311
  } = opts;
220
312
  const v = variant === 'error' ? 'danger' : variant; // documented alias
221
- const container = AdiaFeed.get(position);
313
+ const container = UIFeed.get(position);
314
+ // Phase 2 max-queue: items above [max] queue with [data-queued] and
315
+ // become visible as visible items dismiss.
316
+ const max = parseInt(container.getAttribute('max') || '5', 10);
317
+ const visibleCount = [...container.children].filter((c) =>
318
+ c.tagName === 'FEED-ITEM-UI' && !c.hasAttribute('data-queued')
319
+ ).length;
222
320
  const item = document.createElement('feed-item-ui');
223
321
  if (id) item.setAttribute('data-id', id);
224
322
  item.text = text;
225
323
  item.heading = heading;
226
324
  item.icon = icon;
227
325
  item.variant = v;
228
- item.duration = duration;
326
+ // Action-required forces sticky.
327
+ item.duration = action ? 0 : duration;
229
328
  if (dismissible != null) item.dismissible = !!dismissible;
329
+ if (action) item.action = action;
330
+ if (visibleCount >= max) item.setAttribute('data-queued', '');
230
331
  container.appendChild(item);
332
+ if (typeof onAction === 'function') item.update({ onAction });
231
333
  return {
232
334
  id: id ?? null,
233
335
  dismiss: () => item.dismiss(),
@@ -237,7 +339,7 @@ class AdiaFeed {
237
339
 
238
340
  /** Clear all items in a single lane. */
239
341
  static clear(position = 'bottom-right') {
240
- const el = AdiaFeed.#containers.get(position);
342
+ const el = UIFeed.#containers.get(position);
241
343
  if (!el) return;
242
344
  for (const item of [...el.children]) {
243
345
  if (item.tagName === 'FEED-ITEM-UI') item.dismiss?.();
@@ -246,31 +348,38 @@ class AdiaFeed {
246
348
 
247
349
  /** Tear down ALL containers. Test cleanup; addresses audit L-B4. */
248
350
  static purge() {
249
- for (const el of AdiaFeed.#containers.values()) {
351
+ for (const el of UIFeed.#containers.values()) {
250
352
  try { el.hidePopover?.(); } catch { /* noop */ }
251
353
  el.remove();
252
354
  }
253
- AdiaFeed.#containers.clear();
355
+ UIFeed.#containers.clear();
254
356
  }
255
357
 
256
- /** Internal: drop a lane when its last item exits. */
358
+ /** Internal: drop a lane when its last item exits. Also rotates the
359
+ * Phase 2 max-queue: when a visible item leaves, promote the oldest
360
+ * queued sibling so the visible-count returns to [max]. */
257
361
  static releaseContainerIfEmpty(container) {
258
- if (!container || container.children.length > 0) return;
362
+ if (!container) return;
363
+ // Promote the oldest queued sibling (if any) before deciding whether
364
+ // to release. The queue is FIFO; queued items live at the tail.
365
+ const queued = container.querySelector('feed-item-ui[data-queued]');
366
+ if (queued) queued.removeAttribute('data-queued');
367
+ if (container.children.length > 0) return;
259
368
  try { container.hidePopover?.(); } catch { /* noop */ }
260
369
  container.remove();
261
- for (const [pos, el] of AdiaFeed.#containers) {
262
- if (el === container) AdiaFeed.#containers.delete(pos);
370
+ for (const [pos, el] of UIFeed.#containers) {
371
+ if (el === container) UIFeed.#containers.delete(pos);
263
372
  }
264
373
  }
265
374
  }
266
375
 
267
- /* Global 'feed' CustomEvent listener — same shape as AdiaFeed.post().
376
+ /* Global 'feed' CustomEvent listener — same shape as UIFeed.post().
268
377
  Idempotent (HMR-safe via window flag). */
269
378
  if (typeof window !== 'undefined' && !window.__adiaFeedListenerInstalled) {
270
379
  window.__adiaFeedListenerInstalled = true;
271
380
  window.addEventListener('feed', (e) => {
272
- if (e?.detail && typeof e.detail === 'object') AdiaFeed.post(e.detail);
381
+ if (e?.detail && typeof e.detail === 'object') UIFeed.post(e.detail);
273
382
  });
274
383
  }
275
384
 
276
- export { AdiaFeedContainer, AdiaFeedItem, AdiaFeed };
385
+ export { UIFeedContainer, UIFeedItem, UIFeed };
@@ -1,7 +1,7 @@
1
1
  # Generated alongside feed.js — kept in sync by hand for now (feed
2
2
  # is a Phase-1 skeleton; once it stabilizes, run the regen pipeline).
3
3
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
- name: AdiaFeedContainer
4
+ name: UIFeedContainer
5
5
  tag: feed-ui
6
6
  component: Feed
7
7
  category: container
@@ -10,7 +10,7 @@ description: >-
10
10
  Shared top-layer feed channel. Per docs/specs/feed-channel.md
11
11
  (SPEC-FEED-CHANNEL-001). Per-position singletons mounted lazily into
12
12
  document.body via Popover API; consumers post via the static API
13
- (`AdiaFeed.post()`) or the global 'feed' CustomEvent.
13
+ (`UIFeed.post()`) or the global 'feed' CustomEvent.
14
14
  props:
15
15
  position:
16
16
  description: Lane the feed renders into
@@ -64,7 +64,7 @@
64
64
  "input",
65
65
  "wrapper"
66
66
  ],
67
- "name": "AdiaField",
67
+ "name": "UIField",
68
68
  "related": [
69
69
  "input",
70
70
  "select",
@@ -32,9 +32,9 @@
32
32
  * MutationObserver watches childList so a swapped-in control gets its
33
33
  * `for=` and `aria-describedby` rebound.
34
34
  */
35
- import { AdiaElement } from '../../core/element.js';
35
+ import { UIElement } from '../../core/element.js';
36
36
 
37
- class AdiaField extends AdiaElement {
37
+ class UIField extends UIElement {
38
38
  static properties = {
39
39
  label: { type: String, default: '', reflect: true },
40
40
  hint: { type: String, default: '', reflect: true },
@@ -42,7 +42,7 @@ class AdiaField extends AdiaElement {
42
42
  inline: { type: Boolean, default: false, reflect: true },
43
43
  };
44
44
 
45
- // The validation message lives on the child control (AdiaFormElement.error
45
+ // The validation message lives on the child control (UIFormElement.error
46
46
  // is the single source of truth — validity is a property of the value, not
47
47
  // of the layout wrapper). field-ui mirrors the child's error string into
48
48
  // its own [data-field-error] slot so the validation message renders below
@@ -184,7 +184,7 @@ class AdiaField extends AdiaElement {
184
184
  const el = document.createElement('div');
185
185
  el.setAttribute('slot', 'hint');
186
186
  el.setAttribute('data-field-hint', '');
187
- el.setAttribute('id', AdiaField.#nextMsgId('hint'));
187
+ el.setAttribute('id', UIField.#nextMsgId('hint'));
188
188
  el.hidden = true;
189
189
  this.appendChild(el);
190
190
  this.#hintEl = el;
@@ -196,7 +196,7 @@ class AdiaField extends AdiaElement {
196
196
  const el = document.createElement('div');
197
197
  el.setAttribute('slot', 'error');
198
198
  el.setAttribute('data-field-error', '');
199
- el.setAttribute('id', AdiaField.#nextMsgId('err'));
199
+ el.setAttribute('id', UIField.#nextMsgId('err'));
200
200
  el.setAttribute('role', 'alert');
201
201
  el.hidden = true;
202
202
  this.appendChild(el);
@@ -210,7 +210,7 @@ class AdiaField extends AdiaElement {
210
210
  this.#labelEl.removeAttribute('for');
211
211
  return;
212
212
  }
213
- if (!control.id) control.id = AdiaField.#nextId();
213
+ if (!control.id) control.id = UIField.#nextId();
214
214
  this.#labelEl.setAttribute('for', control.id);
215
215
  }
216
216
 
@@ -247,10 +247,10 @@ class AdiaField extends AdiaElement {
247
247
  }
248
248
 
249
249
  static #idSeq = 0;
250
- static #nextId() { return `field-ctl-${++AdiaField.#idSeq}`; }
250
+ static #nextId() { return `field-ctl-${++UIField.#idSeq}`; }
251
251
  static #msgSeq = 0;
252
- static #nextMsgId(kind) { return `field-${kind}-${++AdiaField.#msgSeq}`; }
252
+ static #nextMsgId(kind) { return `field-${kind}-${++UIField.#msgSeq}`; }
253
253
  }
254
254
 
255
- customElements.define('field-ui', AdiaField);
256
- export { AdiaField };
255
+ customElements.define('field-ui', UIField);
256
+ export { UIField };
@@ -1,6 +1,6 @@
1
1
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
2
2
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
3
- name: AdiaField
3
+ name: UIField
4
4
  tag: field-ui
5
5
  component: Field
6
6
  category: form
@@ -29,7 +29,7 @@ props:
29
29
  default: ""
30
30
  reflect: true
31
31
  # `error` is mirrored from the slotted control's `error` property.
32
- # AdiaFormElement.error is the source of truth; field-ui renders the
32
+ # UIFormElement.error is the source of truth; field-ui renders the
33
33
  # message below the control in danger style, role="alert" so screen
34
34
  # readers announce changes. There is no field-level error attribute —
35
35
  # set the message on the control: `<field-ui><input-ui error="…"></input-ui></field-ui>`.
@@ -51,7 +51,7 @@
51
51
  "keywords": [
52
52
  "footer"
53
53
  ],
54
- "name": "AdiaFooter",
54
+ "name": "UIFooter",
55
55
  "related": [
56
56
  "avatar",
57
57
  "input",
@@ -1,7 +1,7 @@
1
1
  # Generated by scripts/migrate-yamls-to-v1.mjs — migrated to v1 contract.
2
2
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
3
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
- name: AdiaFooter
4
+ name: UIFooter
5
5
  tag: footer-ui
6
6
  component: Footer
7
7
  category: container
@@ -69,7 +69,7 @@
69
69
  "portfolio",
70
70
  "responsive"
71
71
  ],
72
- "name": "AdiaGrid",
72
+ "name": "UIGrid",
73
73
  "related": [
74
74
  "button",
75
75
  "badge",
@@ -5,9 +5,9 @@
5
5
  * <grid-ui columns="2" column-gap="2" row-gap="4">...</grid-ui>
6
6
  */
7
7
 
8
- import { AdiaElement } from '../../core/element.js';
8
+ import { UIElement } from '../../core/element.js';
9
9
 
10
- class AdiaGrid extends AdiaElement {
10
+ class UIGrid extends UIElement {
11
11
  static properties = {
12
12
  columns: { type: String, default: '3', reflect: true },
13
13
  gap: { type: String, default: 'md', reflect: true },
@@ -16,6 +16,6 @@ class AdiaGrid extends AdiaElement {
16
16
  };
17
17
  static template = () => null;
18
18
  }
19
- customElements.define('grid-ui', AdiaGrid);
19
+ customElements.define('grid-ui', UIGrid);
20
20
 
21
- export { AdiaGrid };
21
+ export { UIGrid };
@@ -1,7 +1,7 @@
1
1
  # Generated by scripts/migrate-yamls-to-v1.mjs — migrated to v1 contract.
2
2
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
3
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
- name: AdiaGrid
4
+ name: UIGrid
5
5
  tag: grid-ui
6
6
  component: Grid
7
7
  category: layout
@@ -45,7 +45,7 @@
45
45
  "keywords": [
46
46
  "header"
47
47
  ],
48
- "name": "AdiaHeader",
48
+ "name": "UIHeader",
49
49
  "related": [
50
50
  "avatar",
51
51
  "input",
@@ -1,7 +1,7 @@
1
1
  # Generated by scripts/migrate-yamls-to-v1.mjs — migrated to v1 contract.
2
2
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
3
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
- name: AdiaHeader
4
+ name: UIHeader
5
5
  tag: header-ui
6
6
  component: Header
7
7
  category: container
@@ -110,7 +110,7 @@
110
110
  "intensity",
111
111
  "activity"
112
112
  ],
113
- "name": "AdiaHeatmap",
113
+ "name": "UIHeatmap",
114
114
  "related": [
115
115
  "chart",
116
116
  "calendar-picker"
@@ -20,11 +20,11 @@
20
20
  * title — optional header title
21
21
  */
22
22
 
23
- import { AdiaElement } from '../../core/element.js';
23
+ import { UIElement } from '../../core/element.js';
24
24
 
25
25
  const MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
26
26
 
27
- class AdiaHeatmap extends AdiaElement {
27
+ class UIHeatmap extends UIElement {
28
28
  static properties = {
29
29
  type: { type: String, default: 'matrix', reflect: true },
30
30
  rows: { type: Number, default: 7, reflect: true },
@@ -291,5 +291,5 @@ class AdiaHeatmap extends AdiaElement {
291
291
  };
292
292
  }
293
293
 
294
- customElements.define('heatmap-ui', AdiaHeatmap);
295
- export { AdiaHeatmap };
294
+ customElements.define('heatmap-ui', UIHeatmap);
295
+ export { UIHeatmap };
@@ -1,7 +1,7 @@
1
1
  # Generated by scripts/migrate-yamls-to-v1.mjs — migrated to v1 contract.
2
2
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
3
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
- name: AdiaHeatmap
4
+ name: UIHeatmap
5
5
  tag: heatmap-ui
6
6
  component: Heatmap
7
7
  category: data-display
@@ -68,7 +68,7 @@
68
68
  "keywords": [
69
69
  "icon"
70
70
  ],
71
- "name": "AdiaIcon",
71
+ "name": "UIIcon",
72
72
  "related": [
73
73
  "input",
74
74
  "empty-state",
@@ -1,7 +1,7 @@
1
- import { AdiaElement, signal, html } from '../../core/element.js';
1
+ import { UIElement, signal, html } from '../../core/element.js';
2
2
  import { getIcon } from '../../core/icons.js';
3
3
 
4
- class AdiaIcon extends AdiaElement {
4
+ class UIIcon extends UIElement {
5
5
  static properties = {
6
6
  name: { type: String, default: '', reflect: true },
7
7
  size: { type: String, default: '', reflect: true },
@@ -39,6 +39,6 @@ class AdiaIcon extends AdiaElement {
39
39
  return /^\d+(\.\d+)?$/.test(s) ? `${s}px` : s;
40
40
  }
41
41
  }
42
- customElements.define('icon-ui', AdiaIcon);
42
+ customElements.define('icon-ui', UIIcon);
43
43
 
44
- export { AdiaIcon };
44
+ export { UIIcon };
@@ -1,7 +1,7 @@
1
1
  # Generated by scripts/migrate-yamls-to-v1.mjs — migrated to v1 contract.
2
2
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
3
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
- name: AdiaIcon
4
+ name: UIIcon
5
5
  tag: icon-ui
6
6
  component: Icon
7
7
  category: display
@@ -113,7 +113,7 @@
113
113
  "instagram",
114
114
  "assets"
115
115
  ],
116
- "name": "AdiaImage",
116
+ "name": "UIImage",
117
117
  "related": [
118
118
  "button",
119
119
  "select",
@@ -14,9 +14,9 @@
14
14
  * Raw: strips chrome (no background, no radius) for edge-to-edge rendering
15
15
  */
16
16
 
17
- import { AdiaElement } from '../../core/element.js';
17
+ import { UIElement } from '../../core/element.js';
18
18
 
19
- class AdiaImage extends AdiaElement {
19
+ class UIImage extends UIElement {
20
20
  static properties = {
21
21
  src: { type: String, default: '', reflect: true },
22
22
  alt: { type: String, default: '', reflect: true },
@@ -97,6 +97,6 @@ class AdiaImage extends AdiaElement {
97
97
  this.#skeleton = null;
98
98
  }
99
99
  }
100
- customElements.define('image-ui', AdiaImage);
100
+ customElements.define('image-ui', UIImage);
101
101
 
102
- export { AdiaImage };
102
+ export { UIImage };
@@ -1,7 +1,7 @@
1
1
  # Generated by scripts/migrate-yamls-to-v1.mjs — migrated to v1 contract.
2
2
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
3
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
- name: AdiaImage
4
+ name: UIImage
5
5
  tag: image-ui
6
6
  component: Image
7
7
  category: display