@adia-ai/web-components 0.4.5 → 0.4.7

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 (316) hide show
  1. package/README.md +63 -24
  2. package/USAGE.md +604 -0
  3. package/components/accordion/accordion.d.ts +17 -0
  4. package/components/accordion/accordion.js +10 -117
  5. package/components/accordion/class.js +132 -0
  6. package/components/action-list/action-list.d.ts +15 -0
  7. package/components/action-list/action-list.js +9 -140
  8. package/components/action-list/class.js +156 -0
  9. package/components/agent-artifact/agent-artifact.d.ts +25 -0
  10. package/components/agent-artifact/agent-artifact.js +8 -181
  11. package/components/agent-artifact/class.js +200 -0
  12. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
  13. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  14. package/components/agent-feedback-bar/class.js +162 -0
  15. package/components/agent-questions/agent-questions.d.ts +23 -0
  16. package/components/agent-questions/agent-questions.js +8 -180
  17. package/components/agent-questions/class.js +199 -0
  18. package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
  19. package/components/agent-reasoning/agent-reasoning.js +8 -494
  20. package/components/agent-reasoning/class.js +513 -0
  21. package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
  22. package/components/agent-suggestions/agent-suggestions.js +8 -78
  23. package/components/agent-suggestions/class.js +97 -0
  24. package/components/agent-trace/agent-trace.d.ts +19 -0
  25. package/components/alert/alert.d.ts +29 -0
  26. package/components/alert/alert.js +8 -175
  27. package/components/alert/class.js +194 -0
  28. package/components/avatar/avatar.d.ts +27 -0
  29. package/components/avatar/avatar.js +9 -159
  30. package/components/avatar/class.js +173 -0
  31. package/components/badge/badge.d.ts +27 -0
  32. package/components/badge/badge.js +9 -75
  33. package/components/badge/class.js +93 -0
  34. package/components/block/block.d.ts +19 -0
  35. package/components/block/block.js +9 -15
  36. package/components/block/class.js +33 -0
  37. package/components/breadcrumb/breadcrumb.d.ts +23 -0
  38. package/components/breadcrumb/breadcrumb.js +8 -113
  39. package/components/breadcrumb/class.js +132 -0
  40. package/components/button/button.d.ts +34 -0
  41. package/components/button/button.js +15 -66
  42. package/components/button/class.js +80 -0
  43. package/components/calendar-picker/calendar-picker.a2ui.json +6 -1
  44. package/components/calendar-picker/calendar-picker.d.ts +27 -0
  45. package/components/calendar-picker/calendar-picker.js +8 -332
  46. package/components/calendar-picker/calendar-picker.yaml +51 -177
  47. package/components/calendar-picker/class.js +351 -0
  48. package/components/canvas/canvas.a2ui.json +6 -1
  49. package/components/canvas/canvas.d.ts +17 -0
  50. package/components/canvas/canvas.yaml +19 -36
  51. package/components/card/card.a2ui.json +3 -0
  52. package/components/card/card.d.ts +27 -0
  53. package/components/card/card.js +9 -50
  54. package/components/card/card.yaml +171 -433
  55. package/components/card/class.js +68 -0
  56. package/components/chart/chart.d.ts +41 -0
  57. package/components/chart/chart.js +8 -2131
  58. package/components/chart/class.js +2150 -0
  59. package/components/chart-legend/chart-legend.d.ts +27 -0
  60. package/components/chart-legend/chart-legend.js +8 -197
  61. package/components/chart-legend/class.js +215 -0
  62. package/components/chat-thread/chat-thread.d.ts +17 -0
  63. package/components/chat-thread/chat-thread.js +8 -157
  64. package/components/chat-thread/class.js +176 -0
  65. package/components/check/check.d.ts +30 -0
  66. package/components/check/check.js +11 -52
  67. package/components/check/class.js +68 -0
  68. package/components/code/class.js +501 -0
  69. package/components/code/code.d.ts +39 -0
  70. package/components/code/code.js +8 -482
  71. package/components/col/class.js +30 -0
  72. package/components/col/col.d.ts +23 -0
  73. package/components/col/col.js +10 -13
  74. package/components/color-picker/class.js +550 -0
  75. package/components/color-picker/color-picker.d.ts +37 -0
  76. package/components/color-picker/color-picker.js +8 -531
  77. package/components/command/class.js +364 -0
  78. package/components/command/command.a2ui.json +3 -0
  79. package/components/command/command.d.ts +19 -0
  80. package/components/command/command.js +8 -345
  81. package/components/command/command.yaml +105 -124
  82. package/components/demo-toggle/class.js +153 -0
  83. package/components/demo-toggle/demo-toggle.d.ts +23 -0
  84. package/components/demo-toggle/demo-toggle.js +8 -135
  85. package/components/description-list/class.js +86 -0
  86. package/components/description-list/description-list.d.ts +21 -0
  87. package/components/description-list/description-list.js +8 -67
  88. package/components/divider/class.js +57 -0
  89. package/components/divider/divider.d.ts +19 -0
  90. package/components/divider/divider.js +10 -40
  91. package/components/drawer/class.js +306 -0
  92. package/components/drawer/drawer.d.ts +25 -0
  93. package/components/drawer/drawer.js +8 -287
  94. package/components/embed/class.js +73 -0
  95. package/components/embed/embed.d.ts +23 -0
  96. package/components/embed/embed.js +9 -55
  97. package/components/empty-state/class.js +108 -0
  98. package/components/empty-state/empty-state.d.ts +21 -0
  99. package/components/empty-state/empty-state.js +9 -90
  100. package/components/feed/class.js +381 -0
  101. package/components/feed/feed.d.ts +19 -0
  102. package/components/feed/feed.js +9 -367
  103. package/components/field/class.js +266 -0
  104. package/components/field/field.d.ts +23 -0
  105. package/components/field/field.js +8 -247
  106. package/components/fields/class.js +106 -0
  107. package/components/fields/fields.d.ts +19 -0
  108. package/components/fields/fields.js +8 -87
  109. package/components/grid/class.js +31 -0
  110. package/components/grid/grid.d.ts +23 -0
  111. package/components/grid/grid.js +10 -14
  112. package/components/heatmap/class.js +305 -0
  113. package/components/heatmap/heatmap.d.ts +31 -0
  114. package/components/heatmap/heatmap.js +8 -286
  115. package/components/icon/class.js +54 -0
  116. package/components/icon/icon.d.ts +23 -0
  117. package/components/icon/icon.js +13 -40
  118. package/components/image/class.js +112 -0
  119. package/components/image/image.d.ts +33 -0
  120. package/components/image/image.js +9 -94
  121. package/components/index.js +1 -0
  122. package/components/input/class.js +773 -0
  123. package/components/input/input.a2ui.json +3 -0
  124. package/components/input/input.d.ts +61 -0
  125. package/components/input/input.js +8 -755
  126. package/components/input/input.yaml +171 -442
  127. package/components/inspector/class.js +142 -0
  128. package/components/inspector/inspector.a2ui.json +8 -1
  129. package/components/inspector/inspector.d.ts +17 -0
  130. package/components/inspector/inspector.js +8 -124
  131. package/components/inspector/inspector.yaml +15 -30
  132. package/components/kbd/class.js +34 -0
  133. package/components/kbd/kbd.a2ui.json +3 -0
  134. package/components/kbd/kbd.d.ts +17 -0
  135. package/components/kbd/kbd.js +10 -17
  136. package/components/kbd/kbd.yaml +54 -185
  137. package/components/link/class.js +187 -0
  138. package/components/link/link.d.ts +55 -0
  139. package/components/link/link.js +8 -168
  140. package/components/list/class.js +249 -0
  141. package/components/list/list.d.ts +23 -0
  142. package/components/list/list.js +9 -231
  143. package/components/menu/class.js +332 -0
  144. package/components/menu/menu.d.ts +21 -0
  145. package/components/menu/menu.js +11 -316
  146. package/components/modal/class.js +231 -0
  147. package/components/modal/modal.a2ui.json +5 -1
  148. package/components/modal/modal.d.ts +23 -0
  149. package/components/modal/modal.js +8 -212
  150. package/components/modal/modal.yaml +19 -39
  151. package/components/nav/class.js +150 -0
  152. package/components/nav/nav.d.ts +31 -0
  153. package/components/nav/nav.js +8 -131
  154. package/components/nav-group/class.js +152 -0
  155. package/components/nav-group/nav-group.d.ts +35 -0
  156. package/components/nav-group/nav-group.js +9 -134
  157. package/components/nav-item/class.js +86 -0
  158. package/components/nav-item/nav-item.d.ts +37 -0
  159. package/components/nav-item/nav-item.js +10 -69
  160. package/components/noodles/class.js +510 -0
  161. package/components/noodles/noodles.d.ts +33 -0
  162. package/components/noodles/noodles.js +9 -493
  163. package/components/option-card/class.js +167 -0
  164. package/components/option-card/option-card.d.ts +30 -0
  165. package/components/option-card/option-card.js +8 -149
  166. package/components/otp-input/class.js +180 -0
  167. package/components/otp-input/otp-input.a2ui.json +5 -1
  168. package/components/otp-input/otp-input.d.ts +25 -0
  169. package/components/otp-input/otp-input.js +9 -162
  170. package/components/otp-input/otp-input.yaml +45 -174
  171. package/components/page/class.js +97 -0
  172. package/components/page/page.d.ts +46 -0
  173. package/components/page/page.js +8 -79
  174. package/components/pagination/class.js +195 -0
  175. package/components/pagination/pagination.d.ts +23 -0
  176. package/components/pagination/pagination.js +9 -177
  177. package/components/pane/class.js +186 -0
  178. package/components/pane/pane.a2ui.json +12 -1
  179. package/components/pane/pane.css +10 -0
  180. package/components/pane/pane.d.ts +31 -0
  181. package/components/pane/pane.js +8 -143
  182. package/components/pane/pane.yaml +57 -157
  183. package/components/pipeline-status/class.js +189 -0
  184. package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
  185. package/components/pipeline-status/pipeline-status.d.ts +21 -0
  186. package/components/pipeline-status/pipeline-status.js +9 -172
  187. package/components/pipeline-status/pipeline-status.yaml +34 -72
  188. package/components/popover/class.js +194 -0
  189. package/components/popover/popover.d.ts +23 -0
  190. package/components/popover/popover.js +9 -176
  191. package/components/progress/class.js +74 -0
  192. package/components/progress/progress.a2ui.json +3 -0
  193. package/components/progress/progress.d.ts +19 -0
  194. package/components/progress/progress.js +10 -57
  195. package/components/progress/progress.yaml +124 -287
  196. package/components/progress-row/class.js +110 -0
  197. package/components/progress-row/progress-row.d.ts +23 -0
  198. package/components/progress-row/progress-row.js +8 -92
  199. package/components/radio/class.js +83 -0
  200. package/components/radio/radio.d.ts +28 -0
  201. package/components/radio/radio.js +11 -67
  202. package/components/range/class.js +194 -0
  203. package/components/range/range.d.ts +31 -0
  204. package/components/range/range.js +9 -176
  205. package/components/rating/class.js +148 -0
  206. package/components/rating/rating.d.ts +33 -0
  207. package/components/rating/rating.js +9 -130
  208. package/components/richtext/class.js +87 -0
  209. package/components/richtext/richtext.a2ui.json +7 -1
  210. package/components/richtext/richtext.d.ts +19 -0
  211. package/components/richtext/richtext.js +8 -68
  212. package/components/richtext/richtext.yaml +30 -65
  213. package/components/row/class.js +50 -0
  214. package/components/row/row.d.ts +27 -0
  215. package/components/row/row.js +10 -33
  216. package/components/search/class.js +134 -0
  217. package/components/search/search.d.ts +35 -0
  218. package/components/search/search.js +10 -117
  219. package/components/segment/class.js +62 -0
  220. package/components/segment/segment.d.ts +25 -0
  221. package/components/segment/segment.js +10 -45
  222. package/components/segmented/class.js +165 -0
  223. package/components/segmented/segmented.a2ui.json +4 -0
  224. package/components/segmented/segmented.d.ts +24 -0
  225. package/components/segmented/segmented.js +10 -148
  226. package/components/segmented/segmented.yaml +41 -59
  227. package/components/select/class.js +408 -0
  228. package/components/select/select.d.ts +57 -0
  229. package/components/select/select.js +15 -396
  230. package/components/skeleton/class.js +52 -0
  231. package/components/skeleton/skeleton.d.ts +23 -0
  232. package/components/skeleton/skeleton.js +8 -34
  233. package/components/slider/class.js +184 -0
  234. package/components/slider/slider.d.ts +31 -0
  235. package/components/slider/slider.js +9 -166
  236. package/components/stack/class.js +28 -0
  237. package/components/stack/stack.d.ts +17 -0
  238. package/components/stack/stack.js +10 -11
  239. package/components/step-progress/class.js +98 -0
  240. package/components/step-progress/step-progress.d.ts +27 -0
  241. package/components/step-progress/step-progress.js +8 -79
  242. package/components/stepper/class.js +126 -0
  243. package/components/stepper/stepper.d.ts +19 -0
  244. package/components/stepper/stepper.js +9 -112
  245. package/components/stream/class.js +109 -0
  246. package/components/stream/stream.d.ts +19 -0
  247. package/components/stream/stream.js +8 -90
  248. package/components/swatch/class.js +131 -0
  249. package/components/swatch/swatch.d.ts +28 -0
  250. package/components/swatch/swatch.js +8 -112
  251. package/components/swiper/class.js +373 -0
  252. package/components/swiper/swiper.a2ui.json +4 -0
  253. package/components/swiper/swiper.d.ts +31 -0
  254. package/components/swiper/swiper.js +8 -354
  255. package/components/swiper/swiper.yaml +68 -212
  256. package/components/switch/class.js +63 -0
  257. package/components/switch/switch.a2ui.json +6 -1
  258. package/components/switch/switch.d.ts +30 -0
  259. package/components/switch/switch.js +11 -47
  260. package/components/switch/switch.yaml +70 -265
  261. package/components/table/class.js +1453 -0
  262. package/components/table/table.d.ts +37 -0
  263. package/components/table/table.js +8 -1435
  264. package/components/table-toolbar/class.js +680 -0
  265. package/components/table-toolbar/table-toolbar.d.ts +33 -0
  266. package/components/table-toolbar/table-toolbar.js +8 -689
  267. package/components/tabs/class.js +242 -0
  268. package/components/tabs/tabs.d.ts +21 -0
  269. package/components/tabs/tabs.js +8 -223
  270. package/components/tag/class.js +99 -0
  271. package/components/tag/tag.d.ts +27 -0
  272. package/components/tag/tag.js +8 -80
  273. package/components/text/class.js +46 -0
  274. package/components/text/text.d.ts +25 -0
  275. package/components/text/text.js +9 -28
  276. package/components/textarea/class.js +134 -0
  277. package/components/textarea/textarea.d.ts +31 -0
  278. package/components/textarea/textarea.js +11 -118
  279. package/components/timeline/class.js +176 -0
  280. package/components/timeline/timeline.d.ts +19 -0
  281. package/components/timeline/timeline.js +9 -162
  282. package/components/toast/class.js +92 -0
  283. package/components/toast/toast.d.ts +23 -0
  284. package/components/toast/toast.js +9 -76
  285. package/components/toggle-group/class.js +154 -0
  286. package/components/toggle-group/toggle-group.d.ts +19 -0
  287. package/components/toggle-group/toggle-group.js +11 -140
  288. package/components/toggle-scheme/class.js +286 -0
  289. package/components/toggle-scheme/toggle-scheme.a2ui.json +197 -0
  290. package/components/toggle-scheme/toggle-scheme.css +20 -0
  291. package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
  292. package/components/toggle-scheme/toggle-scheme.js +17 -0
  293. package/components/toggle-scheme/toggle-scheme.yaml +173 -0
  294. package/components/toolbar/class.js +388 -0
  295. package/components/toolbar/toolbar.d.ts +23 -0
  296. package/components/toolbar/toolbar.js +10 -376
  297. package/components/tooltip/class.js +299 -0
  298. package/components/tooltip/tooltip.d.ts +27 -0
  299. package/components/tooltip/tooltip.js +8 -280
  300. package/components/tree/class.js +245 -0
  301. package/components/tree/tree.d.ts +15 -0
  302. package/components/tree/tree.js +9 -244
  303. package/components/upload/class.js +199 -0
  304. package/components/upload/upload.d.ts +27 -0
  305. package/components/upload/upload.js +11 -183
  306. package/core/element.d.ts +174 -0
  307. package/core/form.d.ts +108 -0
  308. package/core/index.d.ts +11 -0
  309. package/core/index.js +1 -0
  310. package/core/register.d.ts +25 -0
  311. package/core/register.js +58 -0
  312. package/core/signals.d.ts +94 -0
  313. package/core/template.d.ts +70 -0
  314. package/index.d.ts +315 -0
  315. package/package.json +25 -6
  316. package/traits/CATEGORIES.md +1 -1
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Non-side-effect class export for `<nav-group-ui>`.
3
+ *
4
+ * Importing this file gives you the class(es) without auto-registering the tag.
5
+ * Useful for test isolation, subclassing with tag-name override, or selective
6
+ * composition.
7
+ *
8
+ * The auto-register path stays at `@adia-ai/web-components/components/nav-group`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <nav-group-ui> — Collapsible labeled group of nav items inside <nav-ui>.
16
+ *
17
+ * Consolidates the prior `app-nav-group-ui` + `section-nav-group-ui`
18
+ * per ADR-0015 § Nav consolidation. Behavior is unified; the parent
19
+ * <nav-ui>'s [variant] drives the visual treatment.
20
+ *
21
+ * Has icon, label, optional badge, and a caret indicating open/closed.
22
+ * When the parent <nav-ui> is collapsed (primary variant), clicking the
23
+ * group opens a popover with its children instead of toggling inline
24
+ * expansion. When [collapsible] (or always for primary variant), inline
25
+ * click + keyboard toggle is supported.
26
+ */
27
+
28
+ import { UIElement } from '../../core/element.js';
29
+ import { anchorPopover } from '../../core/anchor.js';
30
+
31
+ export class UINavGroup extends UIElement {
32
+ static properties = {
33
+ text: { type: String, default: '', reflect: true },
34
+ icon: { type: String, default: '', reflect: true },
35
+ badge: { type: String, default: '', reflect: true },
36
+ open: { type: Boolean, default: false, reflect: true },
37
+ collapsible: { type: Boolean, default: true, reflect: true },
38
+ variant: { type: String, default: '', reflect: true },
39
+ };
40
+
41
+ static template = () => null;
42
+
43
+ #popover = null;
44
+ #anchorCleanup = null;
45
+ #headerEl = null;
46
+
47
+ #onHeaderKey = (e) => {
48
+ if (!this.collapsible) return;
49
+ if (e.key === 'Enter' || e.key === ' ') {
50
+ e.preventDefault();
51
+ this.open = !this.open;
52
+ this.dispatchEvent(new CustomEvent('group-toggle', {
53
+ bubbles: true,
54
+ detail: { text: this.text, open: this.open },
55
+ }));
56
+ }
57
+ };
58
+
59
+ connected() {
60
+ this.setAttribute('role', 'group');
61
+
62
+ if (!this.querySelector(':scope > [slot="header"]')) {
63
+ this.#headerEl = document.createElement('div');
64
+ this.#headerEl.setAttribute('slot', 'header');
65
+ this.#headerEl.setAttribute('tabindex', '0');
66
+ this.#headerEl.innerHTML = `
67
+ <span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
68
+ <span slot="text">${this.text}</span>
69
+ ${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
70
+ <icon-ui slot="caret" name="caret-right"></icon-ui>
71
+ `;
72
+ this.prepend(this.#headerEl);
73
+ } else {
74
+ this.#headerEl = this.querySelector(':scope > [slot="header"]');
75
+ }
76
+
77
+ this.#headerEl?.addEventListener('keydown', this.#onHeaderKey);
78
+ }
79
+
80
+ render() {
81
+ const textEl = this.querySelector('[slot="header"] [slot="text"]');
82
+ if (textEl) textEl.textContent = this.text;
83
+
84
+ const badgeEl = this.querySelector('[slot="header"] [slot="badge"]');
85
+ if (badgeEl) badgeEl.textContent = this.badge;
86
+
87
+ this.setAttribute('aria-expanded', String(this.open));
88
+ }
89
+
90
+ showPopover() {
91
+ if (!this.#popover) {
92
+ this.#popover = document.createElement('div');
93
+ this.#popover.setAttribute('slot', 'popover');
94
+ this.#popover.setAttribute('popover', 'auto');
95
+
96
+ const label = document.createElement('div');
97
+ label.setAttribute('slot', 'popover-label');
98
+ label.textContent = this.text;
99
+ this.#popover.appendChild(label);
100
+
101
+ for (const child of this.querySelectorAll(':scope > nav-item-ui')) {
102
+ const opt = document.createElement('div');
103
+ opt.setAttribute('role', 'option');
104
+ opt.dataset.sourceValue = child.getAttribute('value') || '';
105
+ opt.textContent = child.text;
106
+ opt.addEventListener('click', () => {
107
+ const nav = this.closest('nav-ui');
108
+ if (nav) nav.select(child);
109
+ this.#popover.hidePopover();
110
+ });
111
+ this.#popover.appendChild(opt);
112
+ }
113
+
114
+ this.appendChild(this.#popover);
115
+
116
+ this.#popover.addEventListener('toggle', (e) => {
117
+ if (e.newState === 'closed') {
118
+ this.#anchorCleanup?.();
119
+ this.#anchorCleanup = null;
120
+ }
121
+ });
122
+ }
123
+
124
+ for (const opt of this.#popover.querySelectorAll('[role="option"]')) {
125
+ const srcValue = opt.dataset.sourceValue;
126
+ const src = srcValue
127
+ ? this.querySelector(`:scope > nav-item-ui[value="${srcValue}"]`)
128
+ : null;
129
+ if (src?.hasAttribute('selected')) {
130
+ opt.setAttribute('aria-current', 'page');
131
+ opt.setAttribute('aria-selected', 'true');
132
+ } else {
133
+ opt.removeAttribute('aria-current');
134
+ opt.removeAttribute('aria-selected');
135
+ }
136
+ }
137
+
138
+ this.#popover.showPopover();
139
+
140
+ this.#anchorCleanup?.();
141
+ this.#anchorCleanup = anchorPopover(this, this.#popover, {
142
+ placement: 'right', gap: 4,
143
+ });
144
+ }
145
+
146
+ disconnected() {
147
+ this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
148
+ this.#anchorCleanup?.();
149
+ this.#anchorCleanup = null;
150
+ this.#popover?.hidePopover?.();
151
+ }
152
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `<nav-group-ui>` — Collapsible labeled group of <nav-item-ui> children inside <nav-ui>.
3
+ Consolidates the prior `app-nav-group-ui` + `section-nav-group-ui`
4
+ per ADR-0015 § Nav consolidation.
5
+
6
+ When the parent <nav-ui> is collapsed (primary variant), clicking the
7
+ group opens a popover with its children instead of toggling inline
8
+ expansion. Inline click + keyboard (Enter/Space) toggle is supported
9
+ when [collapsible] (default true).
10
+
11
+ *
12
+ * @see https://ui-kit.exe.xyz/site/components/nav-group
13
+ *
14
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
15
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
16
+ * run `npm run components`, then `npm run codegen:dts` to regenerate;
17
+ * or hand-author this file fully if rich event types are needed.
18
+ */
19
+
20
+ import { UIElement } from '../../core/element.js';
21
+
22
+ export class UINavGroup extends UIElement {
23
+ /** Optional trailing badge (count, label). */
24
+ badge: string;
25
+ /** When true, the header row toggles the open state on click/keyboard. */
26
+ collapsible: boolean;
27
+ /** Optional leading icon name (resolved via <icon-ui>). */
28
+ icon: string;
29
+ /** Inline-expanded state. Toggled by header click when [collapsible]. */
30
+ open: boolean;
31
+ /** Visible group label. */
32
+ text: string;
33
+ /** Visual treatment. Default ('') renders as a primary-rail group (icon row, caret, collapsible). 'section' renders the header as a static kicker label with always-visible children. When the parent <nav-ui> carries variant="section", this group inherits it via CSS cascade unless an explicit variant is set on the group. */
34
+ variant: '' | 'section';
35
+ }
@@ -1,142 +1,17 @@
1
1
  /**
2
- * <nav-group-ui>Collapsible labeled group of nav items inside <nav-ui>.
2
+ * `<nav-group-ui>`auto-registers the tag on import.
3
3
  *
4
- * Consolidates the prior `app-nav-group-ui` + `section-nav-group-ui`
5
- * per ADR-0015 § Nav consolidation. Behavior is unified; the parent
6
- * <nav-ui>'s [variant] drives the visual treatment.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
7
6
  *
8
- * Has icon, label, optional badge, and a caret indicating open/closed.
9
- * When the parent <nav-ui> is collapsed (primary variant), clicking the
10
- * group opens a popover with its children instead of toggling inline
11
- * expansion. When [collapsible] (or always for primary variant), inline
12
- * click + keyboard toggle is supported.
7
+ * import { UINavGroup } from '@adia-ai/web-components/components/nav-group/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
13
10
  */
14
11
 
15
- import { UIElement } from '../../core/element.js';
16
- import { anchorPopover } from '../../core/anchor.js';
17
-
18
- class UINavGroup extends UIElement {
19
- static properties = {
20
- text: { type: String, default: '', reflect: true },
21
- icon: { type: String, default: '', reflect: true },
22
- badge: { type: String, default: '', reflect: true },
23
- open: { type: Boolean, default: false, reflect: true },
24
- collapsible: { type: Boolean, default: true, reflect: true },
25
- variant: { type: String, default: '', reflect: true },
26
- };
27
-
28
- static template = () => null;
29
-
30
- #popover = null;
31
- #anchorCleanup = null;
32
- #headerEl = null;
33
-
34
- #onHeaderKey = (e) => {
35
- if (!this.collapsible) return;
36
- if (e.key === 'Enter' || e.key === ' ') {
37
- e.preventDefault();
38
- this.open = !this.open;
39
- this.dispatchEvent(new CustomEvent('group-toggle', {
40
- bubbles: true,
41
- detail: { text: this.text, open: this.open },
42
- }));
43
- }
44
- };
45
-
46
- connected() {
47
- this.setAttribute('role', 'group');
48
-
49
- if (!this.querySelector(':scope > [slot="header"]')) {
50
- this.#headerEl = document.createElement('div');
51
- this.#headerEl.setAttribute('slot', 'header');
52
- this.#headerEl.setAttribute('tabindex', '0');
53
- this.#headerEl.innerHTML = `
54
- <span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
55
- <span slot="text">${this.text}</span>
56
- ${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
57
- <icon-ui slot="caret" name="caret-right"></icon-ui>
58
- `;
59
- this.prepend(this.#headerEl);
60
- } else {
61
- this.#headerEl = this.querySelector(':scope > [slot="header"]');
62
- }
63
-
64
- this.#headerEl?.addEventListener('keydown', this.#onHeaderKey);
65
- }
66
-
67
- render() {
68
- const textEl = this.querySelector('[slot="header"] [slot="text"]');
69
- if (textEl) textEl.textContent = this.text;
70
-
71
- const badgeEl = this.querySelector('[slot="header"] [slot="badge"]');
72
- if (badgeEl) badgeEl.textContent = this.badge;
73
-
74
- this.setAttribute('aria-expanded', String(this.open));
75
- }
76
-
77
- showPopover() {
78
- if (!this.#popover) {
79
- this.#popover = document.createElement('div');
80
- this.#popover.setAttribute('slot', 'popover');
81
- this.#popover.setAttribute('popover', 'auto');
82
-
83
- const label = document.createElement('div');
84
- label.setAttribute('slot', 'popover-label');
85
- label.textContent = this.text;
86
- this.#popover.appendChild(label);
87
-
88
- for (const child of this.querySelectorAll(':scope > nav-item-ui')) {
89
- const opt = document.createElement('div');
90
- opt.setAttribute('role', 'option');
91
- opt.dataset.sourceValue = child.getAttribute('value') || '';
92
- opt.textContent = child.text;
93
- opt.addEventListener('click', () => {
94
- const nav = this.closest('nav-ui');
95
- if (nav) nav.select(child);
96
- this.#popover.hidePopover();
97
- });
98
- this.#popover.appendChild(opt);
99
- }
100
-
101
- this.appendChild(this.#popover);
102
-
103
- this.#popover.addEventListener('toggle', (e) => {
104
- if (e.newState === 'closed') {
105
- this.#anchorCleanup?.();
106
- this.#anchorCleanup = null;
107
- }
108
- });
109
- }
110
-
111
- for (const opt of this.#popover.querySelectorAll('[role="option"]')) {
112
- const srcValue = opt.dataset.sourceValue;
113
- const src = srcValue
114
- ? this.querySelector(`:scope > nav-item-ui[value="${srcValue}"]`)
115
- : null;
116
- if (src?.hasAttribute('selected')) {
117
- opt.setAttribute('aria-current', 'page');
118
- opt.setAttribute('aria-selected', 'true');
119
- } else {
120
- opt.removeAttribute('aria-current');
121
- opt.removeAttribute('aria-selected');
122
- }
123
- }
124
-
125
- this.#popover.showPopover();
126
-
127
- this.#anchorCleanup?.();
128
- this.#anchorCleanup = anchorPopover(this, this.#popover, {
129
- placement: 'right', gap: 4,
130
- });
131
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UINavGroup } from './class.js';
132
14
 
133
- disconnected() {
134
- this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
135
- this.#anchorCleanup?.();
136
- this.#anchorCleanup = null;
137
- this.#popover?.hidePopover?.();
138
- }
139
- }
15
+ defineIfFree('nav-group-ui', UINavGroup);
140
16
 
141
- customElements.define('nav-group-ui', UINavGroup);
142
17
  export { UINavGroup };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Non-side-effect class export for `<nav-item-ui>`.
3
+ *
4
+ * Importing this file gives you the class(es) without auto-registering the tag.
5
+ * Useful for test isolation, subclassing with tag-name override, or selective
6
+ * composition.
7
+ *
8
+ * The auto-register path stays at `@adia-ai/web-components/components/nav-item`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <nav-item-ui> — Single navigation link inside <nav-ui> (optionally
16
+ * nested under <nav-group-ui>). Consolidates the prior
17
+ * `app-nav-item-ui` + `section-nav-item-ui` per ADR-0015 § Nav consolidation.
18
+ *
19
+ * Supports icon, label, optional badge, selected/disabled state, and
20
+ * keyboard activation (Enter/Space). Selection is managed by the parent
21
+ * <nav-ui>; clicking or keyboard-activating an item calls nav.select(this)
22
+ * and dispatches `nav-select` (bubbles, detail: { item, text, value }).
23
+ */
24
+
25
+ import { UIElement } from '../../core/element.js';
26
+
27
+ export class UINavItem extends UIElement {
28
+ static properties = {
29
+ text: { type: String, default: '', reflect: true },
30
+ icon: { type: String, default: '', reflect: true },
31
+ value: { type: String, default: '', reflect: true },
32
+ badge: { type: String, default: '', reflect: true },
33
+ selected: { type: Boolean, default: false, reflect: true },
34
+ disabled: { type: Boolean, default: false, reflect: true },
35
+ variant: { type: String, default: '', reflect: true },
36
+ };
37
+
38
+ static template = () => null;
39
+
40
+ #onClick = (e) => {
41
+ if (this.disabled) { e.preventDefault(); return; }
42
+ const parent = this.closest('nav-ui');
43
+ parent?.select?.(this);
44
+ this.dispatchEvent(new CustomEvent('nav-select', {
45
+ bubbles: true,
46
+ detail: { item: this, text: this.text, value: this.value },
47
+ }));
48
+ };
49
+
50
+ #onKey = (e) => {
51
+ if (this.disabled) return;
52
+ if (e.key === 'Enter' || e.key === ' ') {
53
+ e.preventDefault();
54
+ this.#onClick(e);
55
+ }
56
+ };
57
+
58
+ connected() {
59
+ this.setAttribute('role', 'link');
60
+ this.setAttribute('tabindex', this.disabled ? '-1' : '0');
61
+
62
+ if (!this.querySelector('[slot="text"]')) {
63
+ this.innerHTML = `
64
+ <span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
65
+ <span slot="text">${this.text}</span>
66
+ ${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
67
+ `;
68
+ }
69
+
70
+ this.addEventListener('click', this.#onClick);
71
+ this.addEventListener('keydown', this.#onKey);
72
+ }
73
+
74
+ render() {
75
+ const textEl = this.querySelector('[slot="text"]');
76
+ if (textEl) textEl.textContent = this.text;
77
+ this.setAttribute('tabindex', this.disabled ? '-1' : '0');
78
+ if (this.selected) this.setAttribute('aria-current', 'page');
79
+ else this.removeAttribute('aria-current');
80
+ }
81
+
82
+ disconnected() {
83
+ this.removeEventListener('click', this.#onClick);
84
+ this.removeEventListener('keydown', this.#onKey);
85
+ }
86
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `<nav-item-ui>` — Single navigation link inside <nav-ui> (optionally nested under
3
+ <nav-group-ui>). Consolidates the prior `app-nav-item-ui` +
4
+ `section-nav-item-ui` per ADR-0015 § Nav consolidation.
5
+
6
+ Supports icon, label, optional badge, selected/disabled state, and
7
+ keyboard activation (Enter/Space). Selection is managed by the parent
8
+ <nav-ui>; clicking or activating an item calls nav.select(this) and
9
+ bubbles a `nav-select` event.
10
+
11
+ *
12
+ * @see https://ui-kit.exe.xyz/site/components/nav-item
13
+ *
14
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
15
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
16
+ * run `npm run components`, then `npm run codegen:dts` to regenerate;
17
+ * or hand-author this file fully if rich event types are needed.
18
+ */
19
+
20
+ import { UIElement } from '../../core/element.js';
21
+
22
+ export class UINavItem extends UIElement {
23
+ /** Optional trailing badge. */
24
+ badge: string;
25
+ /** Suppresses click/keyboard activation; greyed visually. */
26
+ disabled: boolean;
27
+ /** Optional leading icon name. */
28
+ icon: string;
29
+ /** Set by the parent <nav-ui>'s select() method. */
30
+ selected: boolean;
31
+ /** Visible item label. */
32
+ text: string;
33
+ /** Identifier — typically a route or anchor. */
34
+ value: string;
35
+ /** Visual treatment. Default ('') renders as a primary-rail item (reserved icon space, in-icon selected accent). 'section' renders flat — no icon space when absent, left-edge accent bar for selected. When the parent <nav-ui> carries variant="section", this item inherits it via CSS cascade unless an explicit variant is set. */
36
+ variant: '' | 'section';
37
+ }
@@ -1,76 +1,17 @@
1
1
  /**
2
- * <nav-item-ui>Single navigation link inside <nav-ui> (optionally
3
- * nested under <nav-group-ui>). Consolidates the prior
4
- * `app-nav-item-ui` + `section-nav-item-ui` per ADR-0015 § Nav consolidation.
2
+ * `<nav-item-ui>`auto-registers the tag on import.
5
3
  *
6
- * Supports icon, label, optional badge, selected/disabled state, and
7
- * keyboard activation (Enter/Space). Selection is managed by the parent
8
- * <nav-ui>; clicking or keyboard-activating an item calls nav.select(this)
9
- * and dispatches `nav-select` (bubbles, detail: { item, text, value }).
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UINavItem } from '@adia-ai/web-components/components/nav-item/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
10
10
  */
11
11
 
12
- import { UIElement } from '../../core/element.js';
13
-
14
- class UINavItem extends UIElement {
15
- static properties = {
16
- text: { type: String, default: '', reflect: true },
17
- icon: { type: String, default: '', reflect: true },
18
- value: { type: String, default: '', reflect: true },
19
- badge: { type: String, default: '', reflect: true },
20
- selected: { type: Boolean, default: false, reflect: true },
21
- disabled: { type: Boolean, default: false, reflect: true },
22
- variant: { type: String, default: '', reflect: true },
23
- };
24
-
25
- static template = () => null;
26
-
27
- #onClick = (e) => {
28
- if (this.disabled) { e.preventDefault(); return; }
29
- const parent = this.closest('nav-ui');
30
- parent?.select?.(this);
31
- this.dispatchEvent(new CustomEvent('nav-select', {
32
- bubbles: true,
33
- detail: { item: this, text: this.text, value: this.value },
34
- }));
35
- };
36
-
37
- #onKey = (e) => {
38
- if (this.disabled) return;
39
- if (e.key === 'Enter' || e.key === ' ') {
40
- e.preventDefault();
41
- this.#onClick(e);
42
- }
43
- };
44
-
45
- connected() {
46
- this.setAttribute('role', 'link');
47
- this.setAttribute('tabindex', this.disabled ? '-1' : '0');
48
-
49
- if (!this.querySelector('[slot="text"]')) {
50
- this.innerHTML = `
51
- <span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
52
- <span slot="text">${this.text}</span>
53
- ${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
54
- `;
55
- }
56
-
57
- this.addEventListener('click', this.#onClick);
58
- this.addEventListener('keydown', this.#onKey);
59
- }
60
-
61
- render() {
62
- const textEl = this.querySelector('[slot="text"]');
63
- if (textEl) textEl.textContent = this.text;
64
- this.setAttribute('tabindex', this.disabled ? '-1' : '0');
65
- if (this.selected) this.setAttribute('aria-current', 'page');
66
- else this.removeAttribute('aria-current');
67
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UINavItem } from './class.js';
68
14
 
69
- disconnected() {
70
- this.removeEventListener('click', this.#onClick);
71
- this.removeEventListener('keydown', this.#onKey);
72
- }
73
- }
15
+ defineIfFree('nav-item-ui', UINavItem);
74
16
 
75
- customElements.define('nav-item-ui', UINavItem);
76
17
  export { UINavItem };