@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
@@ -1,168 +1,18 @@
1
1
  /**
2
- * <avatar-ui src="photo.jpg" text="Alice Smith" size="md" shape="circle"></avatar-ui>
2
+ * `<avatar-ui>` auto-registers the tag on import.
3
3
  *
4
- * Fallback chain: image initials empty.
5
- * If src fails to load, falls back to initials derived from text.
6
- * `name` is a deprecated alias for `text` (warns on use).
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
7
6
  *
8
- * <avatar-group-ui max="4" size="md">
9
- * <avatar-ui text="Alice"></avatar-ui>
10
- * <avatar-ui text="Bob"></avatar-ui>
11
- * ...
12
- * </avatar-group-ui>
7
+ * import { UIAvatar, UIAvatarGroup } from '@adia-ai/web-components/components/avatar/class';
13
8
  *
14
- * Overlapping avatar stack with +N overflow counter.
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
15
10
  */
16
11
 
17
- import { UIElement } from '../../core/element.js';
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIAvatar, UIAvatarGroup } from './class.js';
18
14
 
19
- // ── Avatar ──────────────────────────────────────────────────
20
-
21
- class UIAvatar extends UIElement {
22
- static properties = {
23
- src: { type: String, default: '', reflect: true },
24
- text: { type: String, default: '', reflect: true },
25
- name: { type: String, default: '', reflect: true }, // backcompat alias for text
26
- icon: { type: String, default: '', reflect: true },
27
- size: { type: String, default: 'md', reflect: true },
28
- shape: { type: String, default: 'circle', reflect: true },
29
- };
30
-
31
- /** Display string — `text` takes priority, `name` is backcompat alias */
32
- get displayName() { return this.text || this.name; }
33
-
34
- static template = () => null;
35
-
36
- static #nameWarned = false;
37
-
38
- #imgEl = null;
39
- #initialsEl = null;
40
- #iconEl = null;
41
-
42
- connected() {
43
- this.setAttribute('role', 'img');
44
- if (this.name && !this.text && !UIAvatar.#nameWarned) {
45
- UIAvatar.#nameWarned = true;
46
- // eslint-disable-next-line no-console
47
- console.warn(
48
- `[AdiaUI] <avatar-ui name="…"> is deprecated — use text="…" instead. ` +
49
- `Docs: https://ui-kit.exe.xyz/site/components/avatar`
50
- );
51
- }
52
- }
53
-
54
- render() {
55
- if (!this.src && !this.displayName && !this.icon) return;
56
-
57
- if (this.src) {
58
- if (!this.#imgEl) {
59
- this.#imgEl = document.createElement('img');
60
- this.#imgEl.setAttribute('slot', 'img');
61
- this.#imgEl.onerror = () => {
62
- this.#imgEl.remove();
63
- this.#imgEl = null;
64
- this.#showInitials();
65
- };
66
- }
67
- this.#imgEl.src = this.src;
68
- this.#imgEl.alt = this.name || '';
69
- if (!this.#imgEl.parentElement) this.appendChild(this.#imgEl);
70
-
71
- // Remove initials when image is showing
72
- if (this.#initialsEl) {
73
- this.#initialsEl.remove();
74
- this.#initialsEl = null;
75
- }
76
- } else if (this.icon) {
77
- // Icon avatar (system events, non-person rep)
78
- if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
79
- if (this.#initialsEl) { this.#initialsEl.remove(); this.#initialsEl = null; }
80
- if (!this.#iconEl) {
81
- this.#iconEl = document.createElement('icon-ui');
82
- this.#iconEl.setAttribute('slot', 'icon');
83
- this.appendChild(this.#iconEl);
84
- }
85
- this.#iconEl.setAttribute('name', this.icon);
86
- } else {
87
- // No src / no icon — show initials
88
- if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
89
- if (this.#iconEl) { this.#iconEl.remove(); this.#iconEl = null; }
90
- this.#showInitials();
91
- }
92
-
93
- this.setAttribute('aria-label', this.displayName || this.icon || '');
94
- }
95
-
96
- #showInitials() {
97
- if (!this.displayName) return;
98
- const initials = this.displayName
99
- .split(/\s+/)
100
- .map(w => w[0])
101
- .join('')
102
- .slice(0, 2)
103
- .toUpperCase();
104
-
105
- if (!this.#initialsEl) {
106
- this.#initialsEl = document.createElement('span');
107
- this.#initialsEl.setAttribute('slot', 'initials');
108
- this.appendChild(this.#initialsEl);
109
- }
110
- this.#initialsEl.textContent = initials;
111
- }
112
- }
113
-
114
- customElements.define('avatar-ui', UIAvatar);
115
-
116
- // ── Avatar Group ────────────────────────────────────────────
117
-
118
- class UIAvatarGroup extends UIElement {
119
- static properties = {
120
- max: { type: Number, default: 5, reflect: true },
121
- size: { type: String, default: '', reflect: true },
122
- };
123
-
124
- static template = () => null;
125
-
126
- connected() {
127
- this.setAttribute('role', 'group');
128
- if (!this.hasAttribute('aria-label')) {
129
- this.setAttribute('aria-label', 'Avatar group');
130
- }
131
- }
132
-
133
- render() {
134
- const avatars = [...this.querySelectorAll('avatar-ui')];
135
- const max = this.max;
136
- const overflow = avatars.length - max;
137
-
138
- // Propagate size
139
- if (this.size) {
140
- for (const av of avatars) av.setAttribute('size', this.size);
141
- }
142
-
143
- // Show/hide based on max
144
- avatars.forEach((av, i) => {
145
- av.style.display = i < max ? '' : 'none';
146
- av.style.zIndex = String(avatars.length - i);
147
- });
148
-
149
- // Overflow counter
150
- let counter = this.querySelector('[slot="overflow"]');
151
- if (overflow > 0) {
152
- if (!counter) {
153
- counter = document.createElement('span');
154
- counter.setAttribute('slot', 'overflow');
155
- this.appendChild(counter);
156
- }
157
- counter.textContent = `+${overflow}`;
158
- counter.setAttribute('aria-label', `${overflow} more`);
159
- counter.style.zIndex = '0';
160
- } else if (counter) {
161
- counter.remove();
162
- }
163
- }
164
- }
165
-
166
- customElements.define('avatar-group-ui', UIAvatarGroup);
15
+ defineIfFree('avatar-ui', UIAvatar);
16
+ defineIfFree('avatar-group-ui', UIAvatarGroup);
167
17
 
168
18
  export { UIAvatar, UIAvatarGroup };
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Non-side-effect class export for `<avatar-ui>` (+ co-located primitives).
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/avatar`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <avatar-ui src="photo.jpg" text="Alice Smith" size="md" shape="circle"></avatar-ui>
16
+ *
17
+ * Fallback chain: image → initials → empty.
18
+ * If src fails to load, falls back to initials derived from text.
19
+ * `name` is a deprecated alias for `text` (warns on use).
20
+ *
21
+ * <avatar-group-ui max="4" size="md">
22
+ * <avatar-ui text="Alice"></avatar-ui>
23
+ * <avatar-ui text="Bob"></avatar-ui>
24
+ * ...
25
+ * </avatar-group-ui>
26
+ *
27
+ * Overlapping avatar stack with +N overflow counter.
28
+ */
29
+
30
+ import { UIElement } from '../../core/element.js';
31
+
32
+ // ── Avatar ──────────────────────────────────────────────────
33
+
34
+ export class UIAvatar extends UIElement {
35
+ static properties = {
36
+ src: { type: String, default: '', reflect: true },
37
+ text: { type: String, default: '', reflect: true },
38
+ name: { type: String, default: '', reflect: true }, // backcompat alias for text
39
+ icon: { type: String, default: '', reflect: true },
40
+ size: { type: String, default: 'md', reflect: true },
41
+ shape: { type: String, default: 'circle', reflect: true },
42
+ };
43
+
44
+ /** Display string — `text` takes priority, `name` is backcompat alias */
45
+ get displayName() { return this.text || this.name; }
46
+
47
+ static template = () => null;
48
+
49
+ static #nameWarned = false;
50
+
51
+ #imgEl = null;
52
+ #initialsEl = null;
53
+ #iconEl = null;
54
+
55
+ connected() {
56
+ this.setAttribute('role', 'img');
57
+ if (this.name && !this.text && !UIAvatar.#nameWarned) {
58
+ UIAvatar.#nameWarned = true;
59
+ // eslint-disable-next-line no-console
60
+ console.warn(
61
+ `[AdiaUI] <avatar-ui name="…"> is deprecated — use text="…" instead. ` +
62
+ `Docs: https://ui-kit.exe.xyz/site/components/avatar`
63
+ );
64
+ }
65
+ }
66
+
67
+ render() {
68
+ if (!this.src && !this.displayName && !this.icon) return;
69
+
70
+ if (this.src) {
71
+ if (!this.#imgEl) {
72
+ this.#imgEl = document.createElement('img');
73
+ this.#imgEl.setAttribute('slot', 'img');
74
+ this.#imgEl.onerror = () => {
75
+ this.#imgEl.remove();
76
+ this.#imgEl = null;
77
+ this.#showInitials();
78
+ };
79
+ }
80
+ this.#imgEl.src = this.src;
81
+ this.#imgEl.alt = this.name || '';
82
+ if (!this.#imgEl.parentElement) this.appendChild(this.#imgEl);
83
+
84
+ // Remove initials when image is showing
85
+ if (this.#initialsEl) {
86
+ this.#initialsEl.remove();
87
+ this.#initialsEl = null;
88
+ }
89
+ } else if (this.icon) {
90
+ // Icon avatar (system events, non-person rep)
91
+ if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
92
+ if (this.#initialsEl) { this.#initialsEl.remove(); this.#initialsEl = null; }
93
+ if (!this.#iconEl) {
94
+ this.#iconEl = document.createElement('icon-ui');
95
+ this.#iconEl.setAttribute('slot', 'icon');
96
+ this.appendChild(this.#iconEl);
97
+ }
98
+ this.#iconEl.setAttribute('name', this.icon);
99
+ } else {
100
+ // No src / no icon — show initials
101
+ if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
102
+ if (this.#iconEl) { this.#iconEl.remove(); this.#iconEl = null; }
103
+ this.#showInitials();
104
+ }
105
+
106
+ this.setAttribute('aria-label', this.displayName || this.icon || '');
107
+ }
108
+
109
+ #showInitials() {
110
+ if (!this.displayName) return;
111
+ const initials = this.displayName
112
+ .split(/\s+/)
113
+ .map(w => w[0])
114
+ .join('')
115
+ .slice(0, 2)
116
+ .toUpperCase();
117
+
118
+ if (!this.#initialsEl) {
119
+ this.#initialsEl = document.createElement('span');
120
+ this.#initialsEl.setAttribute('slot', 'initials');
121
+ this.appendChild(this.#initialsEl);
122
+ }
123
+ this.#initialsEl.textContent = initials;
124
+ }
125
+ }
126
+
127
+ export class UIAvatarGroup extends UIElement {
128
+ static properties = {
129
+ max: { type: Number, default: 5, reflect: true },
130
+ size: { type: String, default: '', reflect: true },
131
+ };
132
+
133
+ static template = () => null;
134
+
135
+ connected() {
136
+ this.setAttribute('role', 'group');
137
+ if (!this.hasAttribute('aria-label')) {
138
+ this.setAttribute('aria-label', 'Avatar group');
139
+ }
140
+ }
141
+
142
+ render() {
143
+ const avatars = [...this.querySelectorAll('avatar-ui')];
144
+ const max = this.max;
145
+ const overflow = avatars.length - max;
146
+
147
+ // Propagate size
148
+ if (this.size) {
149
+ for (const av of avatars) av.setAttribute('size', this.size);
150
+ }
151
+
152
+ // Show/hide based on max
153
+ avatars.forEach((av, i) => {
154
+ av.style.display = i < max ? '' : 'none';
155
+ av.style.zIndex = String(avatars.length - i);
156
+ });
157
+
158
+ // Overflow counter
159
+ let counter = this.querySelector('[slot="overflow"]');
160
+ if (overflow > 0) {
161
+ if (!counter) {
162
+ counter = document.createElement('span');
163
+ counter.setAttribute('slot', 'overflow');
164
+ this.appendChild(counter);
165
+ }
166
+ counter.textContent = `+${overflow}`;
167
+ counter.setAttribute('aria-label', `${overflow} more`);
168
+ counter.style.zIndex = '0';
169
+ } else if (counter) {
170
+ counter.remove();
171
+ }
172
+ }
173
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `<badge-ui>` — Inline pill-shaped badge/tag. Text rendered via CSS attr().
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/badge
5
+ *
6
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
7
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
8
+ * run `npm run components`, then `npm run codegen:dts` to regenerate;
9
+ * or hand-author this file fully if rich event types are needed.
10
+ */
11
+
12
+ import { UIElement } from '../../core/element.js';
13
+
14
+ export class UIBadge extends UIElement {
15
+ /** Optional leading icon (any registered name). Use icon="dot" for chart-legend / status-pip chips. Inherits the variant's foreground color so the dot matches the label. */
16
+ icon: string;
17
+ /** Badge size */
18
+ size: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
19
+ /** Semantic status shorthand. Auto-maps to variant and sets text. `new` → success "New"; `updated` → info "Updated"; `deprecated` → warning "Deprecated"; `removed` → danger "Removed"; `beta` → accent "Beta". Use `variant` + `text` directly for custom chips. */
20
+ status: 'new' | 'updated' | 'deprecated' | 'removed' | 'beta';
21
+ /** Badge text content. Falls back to existing textContent. */
22
+ text: string;
23
+ /** Badge display text. Renderer routes this to the `text` attribute via CSS attr(text) on ::after. */
24
+ textContent: string;
25
+ /** Semantic color variant. */
26
+ variant: 'default' | 'accent' | 'info' | 'success' | 'warning' | 'danger' | 'primary' | 'muted' | 'neutral';
27
+ }
@@ -1,83 +1,17 @@
1
1
  /**
2
- * <badge-ui text="New" variant="accent"></badge-ui>
3
- * <badge-ui text="3" variant="danger" size="sm"></badge-ui>
4
- * <badge-ui text="Organic" variant="accent" icon="dot"></badge-ui> ← chart legend chip
5
- * <badge-ui status="beta"></badge-ui> ← status shorthand
2
+ * `<badge-ui>` auto-registers the tag on import.
6
3
  *
7
- * Inline badge / tag. Pill-shaped, text rendered via CSS attr().
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
8
6
  *
9
- * Variants: default, accent, info, success, warning, danger, primary, muted, neutral
10
- * Sizes: sm, md (default)
11
- * Icon: optional leading icon (any registered icon name; "dot" for legend
12
- * markers). Inherits the variant's foreground color so legend chips
13
- * read as a single visual unit instead of icon + label collage.
14
- * Status: semantic shorthand that auto-maps variant + text.
7
+ * import { UIBadge } from '@adia-ai/web-components/components/badge/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
15
10
  */
16
11
 
17
- import { UIElement } from '../../core/element.js';
18
-
19
- const STATUS_MAP = {
20
- new: { variant: 'success', text: 'New' },
21
- updated: { variant: 'info', text: 'Updated' },
22
- deprecated: { variant: 'warning', text: 'Deprecated' },
23
- removed: { variant: 'danger', text: 'Removed' },
24
- beta: { variant: 'accent', text: 'Beta' },
25
- };
26
-
27
- class UIBadge extends UIElement {
28
- static properties = {
29
- text: { type: String, default: '', reflect: true },
30
- textContent: { type: String, default: '' },
31
- variant: { type: String, default: 'default', reflect: true },
32
- size: { type: String, default: 'md', reflect: true },
33
- icon: { type: String, default: '', reflect: true },
34
- status: { type: String, default: '', reflect: true },
35
- };
36
-
37
- static template = () => null;
38
-
39
- connected() {
40
- /* Default role is `status` (matches badge's "passive callout" semantic
41
- — a screen reader announces the badge text as a state without
42
- interrupting). Consumers that wire interactivity (e.g.
43
- `<chart-legend-ui>` toggling series) are free to set
44
- `role="button"` (or any other role) before connection — we don't
45
- overwrite an explicit consumer choice. */
46
- if (!this.hasAttribute('role')) {
47
- this.setAttribute('role', 'status');
48
- }
49
- }
50
-
51
- render() {
52
- // Status shorthand wins over explicit variant/text while it's set —
53
- // mixing is unsupported. Converges in one extra render pass.
54
- if (this.status) {
55
- const entry = STATUS_MAP[this.status];
56
- if (entry) {
57
- if (this.variant !== entry.variant) this.variant = entry.variant;
58
- if (this.text !== entry.text) this.text = entry.text;
59
- }
60
- }
61
-
62
- if (this.text) this.setAttribute('aria-label', this.text);
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIBadge } from './class.js';
63
14
 
64
- // Stamp / update the leading icon. Pattern mirrors button-ui so the same
65
- // icon-ui element handles loading + cleanup; we just `prepend` so the icon
66
- // sits before the CSS-rendered text (text is `:scope::after { content }`).
67
- if (this.icon) {
68
- const existing = this.querySelector(':scope > icon-ui');
69
- if (!existing || existing.getAttribute('name') !== this.icon) {
70
- if (existing) existing.remove();
71
- const iconEl = document.createElement('icon-ui');
72
- iconEl.setAttribute('name', this.icon);
73
- iconEl.setAttribute('size', 'sm');
74
- this.prepend(iconEl);
75
- }
76
- } else {
77
- this.querySelector(':scope > icon-ui')?.remove();
78
- }
79
- }
80
- }
81
- customElements.define('badge-ui', UIBadge);
15
+ defineIfFree('badge-ui', UIBadge);
82
16
 
83
17
  export { UIBadge };
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Non-side-effect class export for `<badge-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/badge`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <badge-ui text="New" variant="accent"></badge-ui>
16
+ * <badge-ui text="3" variant="danger" size="sm"></badge-ui>
17
+ * <badge-ui text="Organic" variant="accent" icon="dot"></badge-ui> ← chart legend chip
18
+ * <badge-ui status="beta"></badge-ui> ← status shorthand
19
+ *
20
+ * Inline badge / tag. Pill-shaped, text rendered via CSS attr().
21
+ *
22
+ * Variants: default, accent, info, success, warning, danger, primary, muted, neutral
23
+ * Sizes: sm, md (default)
24
+ * Icon: optional leading icon (any registered icon name; "dot" for legend
25
+ * markers). Inherits the variant's foreground color so legend chips
26
+ * read as a single visual unit instead of icon + label collage.
27
+ * Status: semantic shorthand that auto-maps variant + text.
28
+ */
29
+
30
+ import { UIElement } from '../../core/element.js';
31
+
32
+ const STATUS_MAP = {
33
+ new: { variant: 'success', text: 'New' },
34
+ updated: { variant: 'info', text: 'Updated' },
35
+ deprecated: { variant: 'warning', text: 'Deprecated' },
36
+ removed: { variant: 'danger', text: 'Removed' },
37
+ beta: { variant: 'accent', text: 'Beta' },
38
+ };
39
+
40
+ export class UIBadge extends UIElement {
41
+ static properties = {
42
+ text: { type: String, default: '', reflect: true },
43
+ textContent: { type: String, default: '' },
44
+ variant: { type: String, default: 'default', reflect: true },
45
+ size: { type: String, default: 'md', reflect: true },
46
+ icon: { type: String, default: '', reflect: true },
47
+ status: { type: String, default: '', reflect: true },
48
+ };
49
+
50
+ static template = () => null;
51
+
52
+ connected() {
53
+ /* Default role is `status` (matches badge's "passive callout" semantic
54
+ — a screen reader announces the badge text as a state without
55
+ interrupting). Consumers that wire interactivity (e.g.
56
+ `<chart-legend-ui>` toggling series) are free to set
57
+ `role="button"` (or any other role) before connection — we don't
58
+ overwrite an explicit consumer choice. */
59
+ if (!this.hasAttribute('role')) {
60
+ this.setAttribute('role', 'status');
61
+ }
62
+ }
63
+
64
+ render() {
65
+ // Status shorthand wins over explicit variant/text while it's set —
66
+ // mixing is unsupported. Converges in one extra render pass.
67
+ if (this.status) {
68
+ const entry = STATUS_MAP[this.status];
69
+ if (entry) {
70
+ if (this.variant !== entry.variant) this.variant = entry.variant;
71
+ if (this.text !== entry.text) this.text = entry.text;
72
+ }
73
+ }
74
+
75
+ if (this.text) this.setAttribute('aria-label', this.text);
76
+
77
+ // Stamp / update the leading icon. Pattern mirrors button-ui so the same
78
+ // icon-ui element handles loading + cleanup; we just `prepend` so the icon
79
+ // sits before the CSS-rendered text (text is `:scope::after { content }`).
80
+ if (this.icon) {
81
+ const existing = this.querySelector(':scope > icon-ui');
82
+ if (!existing || existing.getAttribute('name') !== this.icon) {
83
+ if (existing) existing.remove();
84
+ const iconEl = document.createElement('icon-ui');
85
+ iconEl.setAttribute('name', this.icon);
86
+ iconEl.setAttribute('size', 'sm');
87
+ this.prepend(iconEl);
88
+ }
89
+ } else {
90
+ this.querySelector(':scope > icon-ui')?.remove();
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `<block-ui>` — Generic padded/margined content wrapper.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/block
5
+ *
6
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
7
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
8
+ * run `npm run components`, then `npm run codegen:dts` to regenerate;
9
+ * or hand-author this file fully if rich event types are needed.
10
+ */
11
+
12
+ import { UIElement } from '../../core/element.js';
13
+
14
+ export class UIBlock extends UIElement {
15
+ /** Margin size */
16
+ margin: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
17
+ /** Padding amount, maps to spacing tokens */
18
+ padding: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
19
+ }
@@ -1,23 +1,17 @@
1
1
  /**
2
- * <block-ui padding="md" margin="lg">Content here</block-ui>
2
+ * `<block-ui>` auto-registers the tag on import.
3
3
  *
4
- * Generic padded/margined content wrapper. Pure CSS component.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
5
6
  *
6
- * Properties:
7
- * padding — none | xs | sm | md | lg | xl (default 'md')
8
- * margin — none | xs | sm | md | lg | xl (default 'none')
7
+ * import { UIBlock } from '@adia-ai/web-components/components/block/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
9
10
  */
10
11
 
11
- import { UIElement } from '../../core/element.js';
12
-
13
- class UIBlock extends UIElement {
14
- static properties = {
15
- padding: { type: String, default: 'md', reflect: true },
16
- margin: { type: String, default: 'none', reflect: true },
17
- };
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIBlock } from './class.js';
18
14
 
19
- static template = () => null;
20
- }
21
- customElements.define('block-ui', UIBlock);
15
+ defineIfFree('block-ui', UIBlock);
22
16
 
23
17
  export { UIBlock };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Non-side-effect class export for `<block-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/block`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <block-ui padding="md" margin="lg">Content here</block-ui>
16
+ *
17
+ * Generic padded/margined content wrapper. Pure CSS component.
18
+ *
19
+ * Properties:
20
+ * padding — none | xs | sm | md | lg | xl (default 'md')
21
+ * margin — none | xs | sm | md | lg | xl (default 'none')
22
+ */
23
+
24
+ import { UIElement } from '../../core/element.js';
25
+
26
+ export class UIBlock extends UIElement {
27
+ static properties = {
28
+ padding: { type: String, default: 'md', reflect: true },
29
+ margin: { type: String, default: 'none', reflect: true },
30
+ };
31
+
32
+ static template = () => null;
33
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `<breadcrumb-ui>` — Breadcrumb trail with auto-inserted separators. Supports a leading icon (first child) and an overflow popover that collapses middle crumbs into a `…` menu.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/breadcrumb
5
+ *
6
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
7
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
8
+ * run `npm run components`, then `npm run codegen:dts` to regenerate;
9
+ * or hand-author this file fully if rich event types are needed.
10
+ */
11
+
12
+ import { UIElement } from '../../core/element.js';
13
+
14
+ export class UIBreadcrumb extends UIElement {
15
+ /** Collapse middle crumbs into a `…` overflow popover when there are 4+ items. */
16
+ collapse: boolean;
17
+ /** Number of leading items to keep visible when [collapse] is active. The first item (often a home/icon link) sits before the overflow popover. */
18
+ collapseKeepLeading: number;
19
+ /** Number of trailing items to keep visible when [collapse] is active. The last item is always the current page. */
20
+ collapseKeepTrailing: number;
21
+ /** Character or string rendered between breadcrumb items via CSS ::before. */
22
+ separator: string;
23
+ }