@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,122 +1,17 @@
1
1
  /**
2
- * <breadcrumb-ui separator="/">
3
- * <a href="/"><icon-ui name="house"></icon-ui></a>
4
- * <a href="#">Workspace</a>
5
- * <span>Current page</span>
6
- * </breadcrumb-ui>
2
+ * `<breadcrumb-ui>` — auto-registers the tag on import.
7
3
  *
8
- * Trail with auto-inserted separators. Items can be plain elements or
9
- * `<a href>` links; the last item is marked `aria-current="page"`.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
10
6
  *
11
- * Variants:
12
- * • Default — text-only crumbs
13
- * • Icon-leading — first child is `<icon-ui>` (or a link wrapping one)
14
- * • Collapsed — `[collapse]` hides middle crumbs into a `…` overflow
15
- * popover; keeps `[collapse-keep-leading]` (default 1) and
16
- * `[collapse-keep-trailing]` (default 2) visible at the edges.
7
+ * import { UIBreadcrumb } from '@adia-ai/web-components/components/breadcrumb/class';
17
8
  *
18
- * The overflow uses `<popover-ui>` so it rides the top-layer (no
19
- * z-index battles inside scrolling containers).
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
20
10
  */
21
11
 
22
- import { UIElement } from '../../core/element.js';
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIBreadcrumb } from './class.js';
23
14
 
24
- class UIBreadcrumb extends UIElement {
25
- static properties = {
26
- separator: { type: String, default: '/', reflect: true },
27
- collapse: { type: Boolean, default: false, reflect: true },
28
- collapseKeepLeading: { type: Number, default: 1, attribute: 'collapse-keep-leading', reflect: true },
29
- collapseKeepTrailing: { type: Number, default: 2, attribute: 'collapse-keep-trailing', reflect: true },
30
- };
15
+ defineIfFree('breadcrumb-ui', UIBreadcrumb);
31
16
 
32
- static template = () => null;
33
-
34
- connected() {
35
- this.setAttribute('role', 'navigation');
36
- this.setAttribute('aria-label', 'Breadcrumb');
37
- }
38
-
39
- render() {
40
- // Strip prior chrome so render is idempotent across attribute changes.
41
- this.querySelectorAll('[data-sep], [data-overflow]').forEach(el => el.remove());
42
-
43
- const items = Array.from(this.children).filter(c =>
44
- !c.hasAttribute('data-sep') && !c.hasAttribute('data-overflow')
45
- );
46
- const last = items.length - 1;
47
-
48
- // Reset per-item chrome
49
- items.forEach((child, i) => {
50
- child.setAttribute('data-item', '');
51
- child.removeAttribute('data-collapsed');
52
- if (i === last) child.setAttribute('aria-current', 'page');
53
- else child.removeAttribute('aria-current');
54
- });
55
-
56
- const keepLeading = Math.max(0, this.collapseKeepLeading | 0);
57
- const keepTrailing = Math.max(0, this.collapseKeepTrailing | 0);
58
- const minLen = keepLeading + keepTrailing + 1;
59
- const shouldCollapse = this.collapse && items.length >= Math.max(minLen, 4);
60
-
61
- if (shouldCollapse) {
62
- const collapsed = items.slice(keepLeading, items.length - keepTrailing);
63
- collapsed.forEach(el => el.setAttribute('data-collapsed', ''));
64
-
65
- const overflow = this.#buildOverflow(collapsed);
66
- if (keepLeading > 0) items[keepLeading - 1].after(overflow);
67
- else this.prepend(overflow);
68
- }
69
-
70
- // Stamp separators between every consecutive visible sibling.
71
- const visible = Array.from(this.children).filter(c =>
72
- !c.hasAttribute('data-sep') && !c.hasAttribute('data-collapsed')
73
- );
74
- for (let i = 0; i < visible.length - 1; i++) {
75
- const sep = document.createElement('span');
76
- sep.setAttribute('data-sep', '');
77
- sep.setAttribute('aria-hidden', 'true');
78
- sep.textContent = this.separator;
79
- visible[i].after(sep);
80
- }
81
- }
82
-
83
- #buildOverflow(collapsedItems) {
84
- // Use <menu-ui> as the canonical popover-list primitive — same surface
85
- // tokens as select-ui's listbox + menu-ui's action menu, with keyboard
86
- // nav, top-layer rendering, and anchor positioning for free.
87
- const menu = document.createElement('menu-ui');
88
- menu.setAttribute('data-overflow', '');
89
- menu.setAttribute('data-item', '');
90
- menu.setAttribute('placement', 'bottom-start');
91
-
92
- const trigger = document.createElement('button-ui');
93
- trigger.setAttribute('slot', 'trigger');
94
- trigger.setAttribute('text', '…');
95
- trigger.setAttribute('variant', 'ghost');
96
- trigger.setAttribute('size', 'sm');
97
- trigger.setAttribute('aria-label', 'Show collapsed crumbs');
98
- menu.appendChild(trigger);
99
-
100
- for (const item of collapsedItems) {
101
- const mi = document.createElement('menu-item-ui');
102
- mi.setAttribute('text', item.textContent.trim());
103
- // Encode the link target as the menu-item value; navigated on action.
104
- if (item.tagName === 'A' && item.hasAttribute('href')) {
105
- mi.setAttribute('value', item.getAttribute('href'));
106
- }
107
- menu.appendChild(mi);
108
- }
109
-
110
- // menu-ui dispatches `action` with `detail: { value, text }` on item
111
- // activation. Navigate to the encoded href; ignore placeholder `#`.
112
- menu.addEventListener('action', (e) => {
113
- const href = e.detail?.value;
114
- if (href && href !== '#') window.location.href = href;
115
- });
116
-
117
- return menu;
118
- }
119
- }
120
-
121
- customElements.define('breadcrumb-ui', UIBreadcrumb);
122
17
  export { UIBreadcrumb };
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Non-side-effect class export for `<breadcrumb-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/breadcrumb`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <breadcrumb-ui separator="/">
16
+ * <a href="/"><icon-ui name="house"></icon-ui></a>
17
+ * <a href="#">Workspace</a>
18
+ * <span>Current page</span>
19
+ * </breadcrumb-ui>
20
+ *
21
+ * Trail with auto-inserted separators. Items can be plain elements or
22
+ * `<a href>` links; the last item is marked `aria-current="page"`.
23
+ *
24
+ * Variants:
25
+ * • Default — text-only crumbs
26
+ * • Icon-leading — first child is `<icon-ui>` (or a link wrapping one)
27
+ * • Collapsed — `[collapse]` hides middle crumbs into a `…` overflow
28
+ * popover; keeps `[collapse-keep-leading]` (default 1) and
29
+ * `[collapse-keep-trailing]` (default 2) visible at the edges.
30
+ *
31
+ * The overflow uses `<popover-ui>` so it rides the top-layer (no
32
+ * z-index battles inside scrolling containers).
33
+ */
34
+
35
+ import { UIElement } from '../../core/element.js';
36
+
37
+ export class UIBreadcrumb extends UIElement {
38
+ static properties = {
39
+ separator: { type: String, default: '/', reflect: true },
40
+ collapse: { type: Boolean, default: false, reflect: true },
41
+ collapseKeepLeading: { type: Number, default: 1, attribute: 'collapse-keep-leading', reflect: true },
42
+ collapseKeepTrailing: { type: Number, default: 2, attribute: 'collapse-keep-trailing', reflect: true },
43
+ };
44
+
45
+ static template = () => null;
46
+
47
+ connected() {
48
+ this.setAttribute('role', 'navigation');
49
+ this.setAttribute('aria-label', 'Breadcrumb');
50
+ }
51
+
52
+ render() {
53
+ // Strip prior chrome so render is idempotent across attribute changes.
54
+ this.querySelectorAll('[data-sep], [data-overflow]').forEach(el => el.remove());
55
+
56
+ const items = Array.from(this.children).filter(c =>
57
+ !c.hasAttribute('data-sep') && !c.hasAttribute('data-overflow')
58
+ );
59
+ const last = items.length - 1;
60
+
61
+ // Reset per-item chrome
62
+ items.forEach((child, i) => {
63
+ child.setAttribute('data-item', '');
64
+ child.removeAttribute('data-collapsed');
65
+ if (i === last) child.setAttribute('aria-current', 'page');
66
+ else child.removeAttribute('aria-current');
67
+ });
68
+
69
+ const keepLeading = Math.max(0, this.collapseKeepLeading | 0);
70
+ const keepTrailing = Math.max(0, this.collapseKeepTrailing | 0);
71
+ const minLen = keepLeading + keepTrailing + 1;
72
+ const shouldCollapse = this.collapse && items.length >= Math.max(minLen, 4);
73
+
74
+ if (shouldCollapse) {
75
+ const collapsed = items.slice(keepLeading, items.length - keepTrailing);
76
+ collapsed.forEach(el => el.setAttribute('data-collapsed', ''));
77
+
78
+ const overflow = this.#buildOverflow(collapsed);
79
+ if (keepLeading > 0) items[keepLeading - 1].after(overflow);
80
+ else this.prepend(overflow);
81
+ }
82
+
83
+ // Stamp separators between every consecutive visible sibling.
84
+ const visible = Array.from(this.children).filter(c =>
85
+ !c.hasAttribute('data-sep') && !c.hasAttribute('data-collapsed')
86
+ );
87
+ for (let i = 0; i < visible.length - 1; i++) {
88
+ const sep = document.createElement('span');
89
+ sep.setAttribute('data-sep', '');
90
+ sep.setAttribute('aria-hidden', 'true');
91
+ sep.textContent = this.separator;
92
+ visible[i].after(sep);
93
+ }
94
+ }
95
+
96
+ #buildOverflow(collapsedItems) {
97
+ // Use <menu-ui> as the canonical popover-list primitive — same surface
98
+ // tokens as select-ui's listbox + menu-ui's action menu, with keyboard
99
+ // nav, top-layer rendering, and anchor positioning for free.
100
+ const menu = document.createElement('menu-ui');
101
+ menu.setAttribute('data-overflow', '');
102
+ menu.setAttribute('data-item', '');
103
+ menu.setAttribute('placement', 'bottom-start');
104
+
105
+ const trigger = document.createElement('button-ui');
106
+ trigger.setAttribute('slot', 'trigger');
107
+ trigger.setAttribute('text', '…');
108
+ trigger.setAttribute('variant', 'ghost');
109
+ trigger.setAttribute('size', 'sm');
110
+ trigger.setAttribute('aria-label', 'Show collapsed crumbs');
111
+ menu.appendChild(trigger);
112
+
113
+ for (const item of collapsedItems) {
114
+ const mi = document.createElement('menu-item-ui');
115
+ mi.setAttribute('text', item.textContent.trim());
116
+ // Encode the link target as the menu-item value; navigated on action.
117
+ if (item.tagName === 'A' && item.hasAttribute('href')) {
118
+ mi.setAttribute('value', item.getAttribute('href'));
119
+ }
120
+ menu.appendChild(mi);
121
+ }
122
+
123
+ // menu-ui dispatches `action` with `detail: { value, text }` on item
124
+ // activation. Navigate to the encoded href; ignore placeholder `#`.
125
+ menu.addEventListener('action', (e) => {
126
+ const href = e.detail?.value;
127
+ if (href && href !== '#') window.location.href = href;
128
+ });
129
+
130
+ return menu;
131
+ }
132
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `<button-ui>` — Clickable button with text, icon, and variant support. Supports submit type for forms.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/button
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 UIButton extends UIElement {
15
+ /** HTML button type (button, submit, reset) */
16
+ type: string;
17
+ /** Semantic intent — composes with [variant]. `<button-ui variant="solid" color="danger">` = filled destructive action; `<button-ui variant="outline" color="success">` = outlined success affordance. */
18
+ color: 'default' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
19
+ /** Disables interaction and prevents click/press events */
20
+ disabled: boolean;
21
+ /** Leading Phosphor icon name (rendered before text). */
22
+ icon: string;
23
+ /** Sizing scale (xs/sm/md/lg/xl). */
24
+ size: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
25
+ /** Makes the button stretch to fill the parent's width */
26
+ stretch: boolean;
27
+ /** Button text, rendered via CSS attr(text) on ::after */
28
+ text: string;
29
+ /** Button label. Renderer routes this to the `text` attribute, which is rendered via CSS attr(text) on ::after and mirrored to aria-label. */
30
+ textContent: string;
31
+ /** Visual style — `solid` (default fill), `outline`, `ghost`. `default` / `primary` are aliases of `solid`. Style is independent of semantic intent — to express destructive / success / info / warning intent, set [color="…"] alongside.
32
+ For **inline navigation** (Terms of Service, Privacy Policy, footer links, "Sign in" / "Sign up" cross-page affordances) use `<link-ui>` instead — it carries proper `<a href>` semantics, keyboard handling (Enter only, no Space), middle-click open-new-tab, and screen-reader announces "link" instead of "button". Mixing navigation and action affordances under the same primitive is a category error fixed at this junction. */
33
+ variant: 'default' | 'solid' | 'outline' | 'ghost' | 'primary' | 'secondary' | 'soft' | 'current';
34
+ }
@@ -1,68 +1,17 @@
1
- import { UIElement, signal, html } from '../../core/element.js';
2
- import { getIcon } from '../../core/icons.js';
3
-
4
- class UIButton extends UIElement {
5
- static properties = {
6
- text: { type: String, default: '', reflect: true },
7
- textContent: { type: String, default: '' },
8
- variant: { type: String, default: 'solid', reflect: true },
9
- color: { type: String, default: '', reflect: true },
10
- size: { type: String, default: 'md', reflect: true },
11
- disabled: { type: Boolean, default: false, reflect: true },
12
- stretch: { type: Boolean, default: false, reflect: true },
13
- icon: { type: String, default: '', reflect: true },
14
- type: { type: String, default: 'button', reflect: true },
15
- };
16
-
17
- static template = () => null;
18
-
19
- connected() {
20
- this.setAttribute('role', 'button');
21
- this.setAttribute('tabindex', '0');
22
- this.addEventListener('click', this.#onClick);
23
- this.addEventListener('keydown', this.#onKey);
24
- }
25
-
26
- render() {
27
- // Don't clobber a user-provided aria-label with an empty string when
28
- // text is unset (e.g. icon-only button with author-set aria-label).
29
- // Only auto-set when we have meaningful text to put there.
30
- if (this.text) this.setAttribute('aria-label', this.text);
31
- if (this.icon) {
32
- const existing = this.querySelector('icon-ui');
33
- if (!existing || existing.name !== this.icon) {
34
- if (existing) existing.remove();
35
- const iconEl = document.createElement('icon-ui');
36
- iconEl.setAttribute('name', this.icon);
37
- this.prepend(iconEl);
38
- }
39
- }
40
- }
41
-
42
- #onClick = (e) => {
43
- if (this.disabled) { e.stopPropagation(); return; }
44
- if (this.type === 'submit') {
45
- const form = this.closest('form');
46
- if (form?.requestSubmit) form.requestSubmit();
47
- } else if (this.type === 'reset') {
48
- const form = this.closest('form');
49
- if (form?.reset) form.reset();
50
- }
51
- this.dispatchEvent(new Event('press', { bubbles: true }));
52
- };
53
-
54
- #onKey = (e) => {
55
- if (e.key === 'Enter' || e.key === ' ') {
56
- e.preventDefault();
57
- this.click();
58
- }
59
- };
60
-
61
- disconnected() {
62
- this.removeEventListener('click', this.#onClick);
63
- this.removeEventListener('keydown', this.#onKey);
64
- }
65
- }
66
- customElements.define('button-ui', UIButton);
1
+ /**
2
+ * `<button-ui>` auto-registers the tag on import.
3
+ *
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UIButton } from '@adia-ai/web-components/components/button/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
10
+ */
11
+
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIButton } from './class.js';
14
+
15
+ defineIfFree('button-ui', UIButton);
67
16
 
68
17
  export { UIButton };
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `UIButton` class — non-side-effect export.
3
+ *
4
+ * Importing this file gives you the class without auto-registering the
5
+ * tag. Useful for:
6
+ * - Test isolation (register under a different tag in a test)
7
+ * - Subclassing with tag-name override
8
+ * - Tree-shaking-conscious bundles that compose primitives selectively
9
+ *
10
+ * The auto-register path stays at `@adia-ai/web-components/components/button`
11
+ * (which imports this file + calls `customElements.define`).
12
+ *
13
+ * @see ../../USAGE.md#registration--auto-vs-explicit
14
+ */
15
+
16
+ import { UIElement, signal, html } from '../../core/element.js';
17
+ import { getIcon } from '../../core/icons.js';
18
+
19
+ export class UIButton extends UIElement {
20
+ static properties = {
21
+ text: { type: String, default: '', reflect: true },
22
+ textContent: { type: String, default: '' },
23
+ variant: { type: String, default: 'solid', reflect: true },
24
+ color: { type: String, default: '', reflect: true },
25
+ size: { type: String, default: 'md', reflect: true },
26
+ disabled: { type: Boolean, default: false, reflect: true },
27
+ stretch: { type: Boolean, default: false, reflect: true },
28
+ icon: { type: String, default: '', reflect: true },
29
+ type: { type: String, default: 'button', reflect: true },
30
+ };
31
+
32
+ static template = () => null;
33
+
34
+ connected() {
35
+ this.setAttribute('role', 'button');
36
+ this.setAttribute('tabindex', '0');
37
+ this.addEventListener('click', this.#onClick);
38
+ this.addEventListener('keydown', this.#onKey);
39
+ }
40
+
41
+ render() {
42
+ // Don't clobber a user-provided aria-label with an empty string when
43
+ // text is unset (e.g. icon-only button with author-set aria-label).
44
+ // Only auto-set when we have meaningful text to put there.
45
+ if (this.text) this.setAttribute('aria-label', this.text);
46
+ if (this.icon) {
47
+ const existing = this.querySelector('icon-ui');
48
+ if (!existing || existing.name !== this.icon) {
49
+ if (existing) existing.remove();
50
+ const iconEl = document.createElement('icon-ui');
51
+ iconEl.setAttribute('name', this.icon);
52
+ this.prepend(iconEl);
53
+ }
54
+ }
55
+ }
56
+
57
+ #onClick = (e) => {
58
+ if (this.disabled) { e.stopPropagation(); return; }
59
+ if (this.type === 'submit') {
60
+ const form = this.closest('form');
61
+ if (form?.requestSubmit) form.requestSubmit();
62
+ } else if (this.type === 'reset') {
63
+ const form = this.closest('form');
64
+ if (form?.reset) form.reset();
65
+ }
66
+ this.dispatchEvent(new Event('press', { bubbles: true }));
67
+ };
68
+
69
+ #onKey = (e) => {
70
+ if (e.key === 'Enter' || e.key === ' ') {
71
+ e.preventDefault();
72
+ this.click();
73
+ }
74
+ };
75
+
76
+ disconnected() {
77
+ this.removeEventListener('click', this.#onClick);
78
+ this.removeEventListener('keydown', this.#onKey);
79
+ }
80
+ }
@@ -130,7 +130,12 @@
130
130
  "name": "disabled"
131
131
  }
132
132
  ],
133
- "synonyms": {},
133
+ "synonyms": {
134
+ "tags": [
135
+ "DateTimeInput",
136
+ "DatePicker"
137
+ ]
138
+ },
134
139
  "tag": "calendar-picker-ui",
135
140
  "tokens": {},
136
141
  "traits": [],