@adia-ai/web-components 0.4.6 → 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 (284) hide show
  1. package/USAGE.md +29 -9
  2. package/components/accordion/accordion.d.ts +17 -0
  3. package/components/accordion/accordion.js +10 -117
  4. package/components/accordion/class.js +132 -0
  5. package/components/action-list/action-list.d.ts +15 -0
  6. package/components/action-list/action-list.js +9 -140
  7. package/components/action-list/class.js +156 -0
  8. package/components/agent-artifact/agent-artifact.d.ts +25 -0
  9. package/components/agent-artifact/agent-artifact.js +8 -181
  10. package/components/agent-artifact/class.js +200 -0
  11. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
  12. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  13. package/components/agent-feedback-bar/class.js +162 -0
  14. package/components/agent-questions/agent-questions.d.ts +23 -0
  15. package/components/agent-questions/agent-questions.js +8 -180
  16. package/components/agent-questions/class.js +199 -0
  17. package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
  18. package/components/agent-reasoning/agent-reasoning.js +8 -494
  19. package/components/agent-reasoning/class.js +513 -0
  20. package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
  21. package/components/agent-suggestions/agent-suggestions.js +8 -78
  22. package/components/agent-suggestions/class.js +97 -0
  23. package/components/agent-trace/agent-trace.d.ts +19 -0
  24. package/components/alert/alert.d.ts +29 -0
  25. package/components/alert/alert.js +8 -175
  26. package/components/alert/class.js +194 -0
  27. package/components/avatar/avatar.d.ts +27 -0
  28. package/components/avatar/avatar.js +9 -159
  29. package/components/avatar/class.js +173 -0
  30. package/components/badge/badge.d.ts +27 -0
  31. package/components/badge/badge.js +9 -75
  32. package/components/badge/class.js +93 -0
  33. package/components/block/block.d.ts +19 -0
  34. package/components/block/block.js +9 -15
  35. package/components/block/class.js +33 -0
  36. package/components/breadcrumb/breadcrumb.d.ts +23 -0
  37. package/components/breadcrumb/breadcrumb.js +8 -113
  38. package/components/breadcrumb/class.js +132 -0
  39. package/components/button/button.d.ts +34 -0
  40. package/components/button/button.js +15 -66
  41. package/components/button/class.js +80 -0
  42. package/components/calendar-picker/calendar-picker.a2ui.json +6 -1
  43. package/components/calendar-picker/calendar-picker.js +8 -332
  44. package/components/calendar-picker/calendar-picker.yaml +51 -177
  45. package/components/calendar-picker/class.js +351 -0
  46. package/components/canvas/canvas.a2ui.json +6 -1
  47. package/components/canvas/canvas.d.ts +17 -0
  48. package/components/canvas/canvas.yaml +19 -36
  49. package/components/card/card.a2ui.json +3 -0
  50. package/components/card/card.d.ts +27 -0
  51. package/components/card/card.js +9 -50
  52. package/components/card/card.yaml +171 -433
  53. package/components/card/class.js +68 -0
  54. package/components/chart/chart.d.ts +41 -0
  55. package/components/chart/chart.js +8 -2131
  56. package/components/chart/class.js +2150 -0
  57. package/components/chart-legend/chart-legend.d.ts +27 -0
  58. package/components/chart-legend/chart-legend.js +8 -197
  59. package/components/chart-legend/class.js +215 -0
  60. package/components/chat-thread/chat-thread.d.ts +17 -0
  61. package/components/chat-thread/chat-thread.js +8 -157
  62. package/components/chat-thread/class.js +176 -0
  63. package/components/check/check.js +11 -52
  64. package/components/check/class.js +68 -0
  65. package/components/code/class.js +501 -0
  66. package/components/code/code.js +8 -482
  67. package/components/col/class.js +30 -0
  68. package/components/col/col.d.ts +23 -0
  69. package/components/col/col.js +10 -13
  70. package/components/color-picker/class.js +550 -0
  71. package/components/color-picker/color-picker.js +8 -531
  72. package/components/command/class.js +364 -0
  73. package/components/command/command.a2ui.json +3 -0
  74. package/components/command/command.d.ts +19 -0
  75. package/components/command/command.js +8 -345
  76. package/components/command/command.yaml +105 -124
  77. package/components/demo-toggle/class.js +153 -0
  78. package/components/demo-toggle/demo-toggle.d.ts +23 -0
  79. package/components/demo-toggle/demo-toggle.js +8 -135
  80. package/components/description-list/class.js +86 -0
  81. package/components/description-list/description-list.d.ts +21 -0
  82. package/components/description-list/description-list.js +8 -67
  83. package/components/divider/class.js +57 -0
  84. package/components/divider/divider.d.ts +19 -0
  85. package/components/divider/divider.js +10 -40
  86. package/components/drawer/class.js +306 -0
  87. package/components/drawer/drawer.d.ts +25 -0
  88. package/components/drawer/drawer.js +8 -287
  89. package/components/embed/class.js +73 -0
  90. package/components/embed/embed.d.ts +23 -0
  91. package/components/embed/embed.js +9 -55
  92. package/components/empty-state/class.js +108 -0
  93. package/components/empty-state/empty-state.d.ts +21 -0
  94. package/components/empty-state/empty-state.js +9 -90
  95. package/components/feed/class.js +381 -0
  96. package/components/feed/feed.d.ts +19 -0
  97. package/components/feed/feed.js +9 -367
  98. package/components/field/class.js +266 -0
  99. package/components/field/field.d.ts +23 -0
  100. package/components/field/field.js +8 -247
  101. package/components/fields/class.js +106 -0
  102. package/components/fields/fields.d.ts +19 -0
  103. package/components/fields/fields.js +8 -87
  104. package/components/grid/class.js +31 -0
  105. package/components/grid/grid.d.ts +23 -0
  106. package/components/grid/grid.js +10 -14
  107. package/components/heatmap/class.js +305 -0
  108. package/components/heatmap/heatmap.d.ts +31 -0
  109. package/components/heatmap/heatmap.js +8 -286
  110. package/components/icon/class.js +54 -0
  111. package/components/icon/icon.d.ts +23 -0
  112. package/components/icon/icon.js +13 -40
  113. package/components/image/class.js +112 -0
  114. package/components/image/image.d.ts +33 -0
  115. package/components/image/image.js +9 -94
  116. package/components/input/class.js +773 -0
  117. package/components/input/input.a2ui.json +3 -0
  118. package/components/input/input.js +8 -755
  119. package/components/input/input.yaml +171 -442
  120. package/components/inspector/class.js +142 -0
  121. package/components/inspector/inspector.a2ui.json +8 -1
  122. package/components/inspector/inspector.d.ts +17 -0
  123. package/components/inspector/inspector.js +8 -124
  124. package/components/inspector/inspector.yaml +15 -30
  125. package/components/kbd/class.js +34 -0
  126. package/components/kbd/kbd.a2ui.json +3 -0
  127. package/components/kbd/kbd.d.ts +17 -0
  128. package/components/kbd/kbd.js +10 -17
  129. package/components/kbd/kbd.yaml +54 -185
  130. package/components/link/class.js +187 -0
  131. package/components/link/link.d.ts +55 -0
  132. package/components/link/link.js +8 -168
  133. package/components/list/class.js +249 -0
  134. package/components/list/list.d.ts +23 -0
  135. package/components/list/list.js +9 -231
  136. package/components/menu/class.js +332 -0
  137. package/components/menu/menu.d.ts +21 -0
  138. package/components/menu/menu.js +11 -316
  139. package/components/modal/class.js +231 -0
  140. package/components/modal/modal.a2ui.json +5 -1
  141. package/components/modal/modal.d.ts +23 -0
  142. package/components/modal/modal.js +8 -212
  143. package/components/modal/modal.yaml +19 -39
  144. package/components/nav/class.js +150 -0
  145. package/components/nav/nav.d.ts +31 -0
  146. package/components/nav/nav.js +8 -131
  147. package/components/nav-group/class.js +152 -0
  148. package/components/nav-group/nav-group.d.ts +35 -0
  149. package/components/nav-group/nav-group.js +9 -134
  150. package/components/nav-item/class.js +86 -0
  151. package/components/nav-item/nav-item.d.ts +37 -0
  152. package/components/nav-item/nav-item.js +10 -69
  153. package/components/noodles/class.js +510 -0
  154. package/components/noodles/noodles.d.ts +33 -0
  155. package/components/noodles/noodles.js +9 -493
  156. package/components/option-card/class.js +167 -0
  157. package/components/option-card/option-card.js +8 -149
  158. package/components/otp-input/class.js +180 -0
  159. package/components/otp-input/otp-input.a2ui.json +5 -1
  160. package/components/otp-input/otp-input.js +9 -162
  161. package/components/otp-input/otp-input.yaml +45 -174
  162. package/components/page/class.js +97 -0
  163. package/components/page/page.d.ts +46 -0
  164. package/components/page/page.js +8 -79
  165. package/components/pagination/class.js +195 -0
  166. package/components/pagination/pagination.d.ts +23 -0
  167. package/components/pagination/pagination.js +9 -177
  168. package/components/pane/class.js +186 -0
  169. package/components/pane/pane.a2ui.json +12 -1
  170. package/components/pane/pane.d.ts +31 -0
  171. package/components/pane/pane.js +8 -167
  172. package/components/pane/pane.yaml +57 -157
  173. package/components/pipeline-status/class.js +189 -0
  174. package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
  175. package/components/pipeline-status/pipeline-status.d.ts +21 -0
  176. package/components/pipeline-status/pipeline-status.js +9 -172
  177. package/components/pipeline-status/pipeline-status.yaml +34 -72
  178. package/components/popover/class.js +194 -0
  179. package/components/popover/popover.d.ts +23 -0
  180. package/components/popover/popover.js +9 -176
  181. package/components/progress/class.js +74 -0
  182. package/components/progress/progress.a2ui.json +3 -0
  183. package/components/progress/progress.d.ts +19 -0
  184. package/components/progress/progress.js +10 -57
  185. package/components/progress/progress.yaml +124 -287
  186. package/components/progress-row/class.js +110 -0
  187. package/components/progress-row/progress-row.d.ts +23 -0
  188. package/components/progress-row/progress-row.js +8 -92
  189. package/components/radio/class.js +83 -0
  190. package/components/radio/radio.js +11 -67
  191. package/components/range/class.js +194 -0
  192. package/components/range/range.js +9 -176
  193. package/components/rating/class.js +148 -0
  194. package/components/rating/rating.js +9 -130
  195. package/components/richtext/class.js +87 -0
  196. package/components/richtext/richtext.a2ui.json +7 -1
  197. package/components/richtext/richtext.d.ts +19 -0
  198. package/components/richtext/richtext.js +8 -68
  199. package/components/richtext/richtext.yaml +30 -65
  200. package/components/row/class.js +50 -0
  201. package/components/row/row.d.ts +27 -0
  202. package/components/row/row.js +10 -33
  203. package/components/search/class.js +134 -0
  204. package/components/search/search.js +10 -117
  205. package/components/segment/class.js +62 -0
  206. package/components/segment/segment.d.ts +25 -0
  207. package/components/segment/segment.js +10 -45
  208. package/components/segmented/class.js +165 -0
  209. package/components/segmented/segmented.a2ui.json +4 -0
  210. package/components/segmented/segmented.js +10 -148
  211. package/components/segmented/segmented.yaml +41 -59
  212. package/components/select/class.js +408 -0
  213. package/components/select/select.js +15 -396
  214. package/components/skeleton/class.js +52 -0
  215. package/components/skeleton/skeleton.d.ts +23 -0
  216. package/components/skeleton/skeleton.js +8 -34
  217. package/components/slider/class.js +184 -0
  218. package/components/slider/slider.js +9 -166
  219. package/components/stack/class.js +28 -0
  220. package/components/stack/stack.d.ts +17 -0
  221. package/components/stack/stack.js +10 -11
  222. package/components/step-progress/class.js +98 -0
  223. package/components/step-progress/step-progress.d.ts +27 -0
  224. package/components/step-progress/step-progress.js +8 -79
  225. package/components/stepper/class.js +126 -0
  226. package/components/stepper/stepper.d.ts +19 -0
  227. package/components/stepper/stepper.js +9 -112
  228. package/components/stream/class.js +109 -0
  229. package/components/stream/stream.d.ts +19 -0
  230. package/components/stream/stream.js +8 -90
  231. package/components/swatch/class.js +131 -0
  232. package/components/swatch/swatch.d.ts +28 -0
  233. package/components/swatch/swatch.js +8 -112
  234. package/components/swiper/class.js +373 -0
  235. package/components/swiper/swiper.a2ui.json +4 -0
  236. package/components/swiper/swiper.d.ts +31 -0
  237. package/components/swiper/swiper.js +8 -354
  238. package/components/swiper/swiper.yaml +68 -212
  239. package/components/switch/class.js +63 -0
  240. package/components/switch/switch.a2ui.json +6 -1
  241. package/components/switch/switch.js +11 -47
  242. package/components/switch/switch.yaml +70 -265
  243. package/components/table/class.js +1453 -0
  244. package/components/table/table.d.ts +37 -0
  245. package/components/table/table.js +8 -1435
  246. package/components/table-toolbar/class.js +680 -0
  247. package/components/table-toolbar/table-toolbar.d.ts +33 -0
  248. package/components/table-toolbar/table-toolbar.js +8 -689
  249. package/components/tabs/class.js +242 -0
  250. package/components/tabs/tabs.d.ts +21 -0
  251. package/components/tabs/tabs.js +8 -223
  252. package/components/tag/class.js +99 -0
  253. package/components/tag/tag.d.ts +27 -0
  254. package/components/tag/tag.js +8 -80
  255. package/components/text/class.js +46 -0
  256. package/components/text/text.d.ts +25 -0
  257. package/components/text/text.js +9 -28
  258. package/components/textarea/class.js +134 -0
  259. package/components/textarea/textarea.js +11 -118
  260. package/components/timeline/class.js +176 -0
  261. package/components/timeline/timeline.d.ts +19 -0
  262. package/components/timeline/timeline.js +9 -162
  263. package/components/toast/class.js +92 -0
  264. package/components/toast/toast.d.ts +23 -0
  265. package/components/toast/toast.js +9 -76
  266. package/components/toggle-group/class.js +154 -0
  267. package/components/toggle-group/toggle-group.d.ts +19 -0
  268. package/components/toggle-group/toggle-group.js +11 -140
  269. package/components/toggle-scheme/class.js +286 -0
  270. package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
  271. package/components/toggle-scheme/toggle-scheme.js +8 -268
  272. package/components/toolbar/class.js +388 -0
  273. package/components/toolbar/toolbar.d.ts +23 -0
  274. package/components/toolbar/toolbar.js +10 -376
  275. package/components/tooltip/class.js +299 -0
  276. package/components/tooltip/tooltip.d.ts +27 -0
  277. package/components/tooltip/tooltip.js +8 -280
  278. package/components/tree/class.js +245 -0
  279. package/components/tree/tree.d.ts +15 -0
  280. package/components/tree/tree.js +9 -244
  281. package/components/upload/class.js +199 -0
  282. package/components/upload/upload.js +11 -183
  283. package/index.d.ts +159 -5
  284. package/package.json +5 -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 };