@adia-ai/web-components 0.4.5 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/README.md +63 -24
  2. package/USAGE.md +604 -0
  3. package/components/accordion/accordion.d.ts +17 -0
  4. package/components/accordion/accordion.js +10 -117
  5. package/components/accordion/class.js +132 -0
  6. package/components/action-list/action-list.d.ts +15 -0
  7. package/components/action-list/action-list.js +9 -140
  8. package/components/action-list/class.js +156 -0
  9. package/components/agent-artifact/agent-artifact.d.ts +25 -0
  10. package/components/agent-artifact/agent-artifact.js +8 -181
  11. package/components/agent-artifact/class.js +200 -0
  12. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
  13. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  14. package/components/agent-feedback-bar/class.js +162 -0
  15. package/components/agent-questions/agent-questions.d.ts +23 -0
  16. package/components/agent-questions/agent-questions.js +8 -180
  17. package/components/agent-questions/class.js +199 -0
  18. package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
  19. package/components/agent-reasoning/agent-reasoning.js +8 -494
  20. package/components/agent-reasoning/class.js +513 -0
  21. package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
  22. package/components/agent-suggestions/agent-suggestions.js +8 -78
  23. package/components/agent-suggestions/class.js +97 -0
  24. package/components/agent-trace/agent-trace.d.ts +19 -0
  25. package/components/alert/alert.d.ts +29 -0
  26. package/components/alert/alert.js +8 -175
  27. package/components/alert/class.js +194 -0
  28. package/components/avatar/avatar.d.ts +27 -0
  29. package/components/avatar/avatar.js +9 -159
  30. package/components/avatar/class.js +173 -0
  31. package/components/badge/badge.d.ts +27 -0
  32. package/components/badge/badge.js +9 -75
  33. package/components/badge/class.js +93 -0
  34. package/components/block/block.d.ts +19 -0
  35. package/components/block/block.js +9 -15
  36. package/components/block/class.js +33 -0
  37. package/components/breadcrumb/breadcrumb.d.ts +23 -0
  38. package/components/breadcrumb/breadcrumb.js +8 -113
  39. package/components/breadcrumb/class.js +132 -0
  40. package/components/button/button.d.ts +34 -0
  41. package/components/button/button.js +15 -66
  42. package/components/button/class.js +80 -0
  43. package/components/calendar-picker/calendar-picker.a2ui.json +6 -1
  44. package/components/calendar-picker/calendar-picker.d.ts +27 -0
  45. package/components/calendar-picker/calendar-picker.js +8 -332
  46. package/components/calendar-picker/calendar-picker.yaml +51 -177
  47. package/components/calendar-picker/class.js +351 -0
  48. package/components/canvas/canvas.a2ui.json +6 -1
  49. package/components/canvas/canvas.d.ts +17 -0
  50. package/components/canvas/canvas.yaml +19 -36
  51. package/components/card/card.a2ui.json +3 -0
  52. package/components/card/card.d.ts +27 -0
  53. package/components/card/card.js +9 -50
  54. package/components/card/card.yaml +171 -433
  55. package/components/card/class.js +68 -0
  56. package/components/chart/chart.d.ts +41 -0
  57. package/components/chart/chart.js +8 -2131
  58. package/components/chart/class.js +2150 -0
  59. package/components/chart-legend/chart-legend.d.ts +27 -0
  60. package/components/chart-legend/chart-legend.js +8 -197
  61. package/components/chart-legend/class.js +215 -0
  62. package/components/chat-thread/chat-thread.d.ts +17 -0
  63. package/components/chat-thread/chat-thread.js +8 -157
  64. package/components/chat-thread/class.js +176 -0
  65. package/components/check/check.d.ts +30 -0
  66. package/components/check/check.js +11 -52
  67. package/components/check/class.js +68 -0
  68. package/components/code/class.js +501 -0
  69. package/components/code/code.d.ts +39 -0
  70. package/components/code/code.js +8 -482
  71. package/components/col/class.js +30 -0
  72. package/components/col/col.d.ts +23 -0
  73. package/components/col/col.js +10 -13
  74. package/components/color-picker/class.js +550 -0
  75. package/components/color-picker/color-picker.d.ts +37 -0
  76. package/components/color-picker/color-picker.js +8 -531
  77. package/components/command/class.js +364 -0
  78. package/components/command/command.a2ui.json +3 -0
  79. package/components/command/command.d.ts +19 -0
  80. package/components/command/command.js +8 -345
  81. package/components/command/command.yaml +105 -124
  82. package/components/demo-toggle/class.js +153 -0
  83. package/components/demo-toggle/demo-toggle.d.ts +23 -0
  84. package/components/demo-toggle/demo-toggle.js +8 -135
  85. package/components/description-list/class.js +86 -0
  86. package/components/description-list/description-list.d.ts +21 -0
  87. package/components/description-list/description-list.js +8 -67
  88. package/components/divider/class.js +57 -0
  89. package/components/divider/divider.d.ts +19 -0
  90. package/components/divider/divider.js +10 -40
  91. package/components/drawer/class.js +306 -0
  92. package/components/drawer/drawer.d.ts +25 -0
  93. package/components/drawer/drawer.js +8 -287
  94. package/components/embed/class.js +73 -0
  95. package/components/embed/embed.d.ts +23 -0
  96. package/components/embed/embed.js +9 -55
  97. package/components/empty-state/class.js +108 -0
  98. package/components/empty-state/empty-state.d.ts +21 -0
  99. package/components/empty-state/empty-state.js +9 -90
  100. package/components/feed/class.js +381 -0
  101. package/components/feed/feed.d.ts +19 -0
  102. package/components/feed/feed.js +9 -367
  103. package/components/field/class.js +266 -0
  104. package/components/field/field.d.ts +23 -0
  105. package/components/field/field.js +8 -247
  106. package/components/fields/class.js +106 -0
  107. package/components/fields/fields.d.ts +19 -0
  108. package/components/fields/fields.js +8 -87
  109. package/components/grid/class.js +31 -0
  110. package/components/grid/grid.d.ts +23 -0
  111. package/components/grid/grid.js +10 -14
  112. package/components/heatmap/class.js +305 -0
  113. package/components/heatmap/heatmap.d.ts +31 -0
  114. package/components/heatmap/heatmap.js +8 -286
  115. package/components/icon/class.js +54 -0
  116. package/components/icon/icon.d.ts +23 -0
  117. package/components/icon/icon.js +13 -40
  118. package/components/image/class.js +112 -0
  119. package/components/image/image.d.ts +33 -0
  120. package/components/image/image.js +9 -94
  121. package/components/index.js +1 -0
  122. package/components/input/class.js +773 -0
  123. package/components/input/input.a2ui.json +3 -0
  124. package/components/input/input.d.ts +61 -0
  125. package/components/input/input.js +8 -755
  126. package/components/input/input.yaml +171 -442
  127. package/components/inspector/class.js +142 -0
  128. package/components/inspector/inspector.a2ui.json +8 -1
  129. package/components/inspector/inspector.d.ts +17 -0
  130. package/components/inspector/inspector.js +8 -124
  131. package/components/inspector/inspector.yaml +15 -30
  132. package/components/kbd/class.js +34 -0
  133. package/components/kbd/kbd.a2ui.json +3 -0
  134. package/components/kbd/kbd.d.ts +17 -0
  135. package/components/kbd/kbd.js +10 -17
  136. package/components/kbd/kbd.yaml +54 -185
  137. package/components/link/class.js +187 -0
  138. package/components/link/link.d.ts +55 -0
  139. package/components/link/link.js +8 -168
  140. package/components/list/class.js +249 -0
  141. package/components/list/list.d.ts +23 -0
  142. package/components/list/list.js +9 -231
  143. package/components/menu/class.js +332 -0
  144. package/components/menu/menu.d.ts +21 -0
  145. package/components/menu/menu.js +11 -316
  146. package/components/modal/class.js +231 -0
  147. package/components/modal/modal.a2ui.json +5 -1
  148. package/components/modal/modal.d.ts +23 -0
  149. package/components/modal/modal.js +8 -212
  150. package/components/modal/modal.yaml +19 -39
  151. package/components/nav/class.js +150 -0
  152. package/components/nav/nav.d.ts +31 -0
  153. package/components/nav/nav.js +8 -131
  154. package/components/nav-group/class.js +152 -0
  155. package/components/nav-group/nav-group.d.ts +35 -0
  156. package/components/nav-group/nav-group.js +9 -134
  157. package/components/nav-item/class.js +86 -0
  158. package/components/nav-item/nav-item.d.ts +37 -0
  159. package/components/nav-item/nav-item.js +10 -69
  160. package/components/noodles/class.js +510 -0
  161. package/components/noodles/noodles.d.ts +33 -0
  162. package/components/noodles/noodles.js +9 -493
  163. package/components/option-card/class.js +167 -0
  164. package/components/option-card/option-card.d.ts +30 -0
  165. package/components/option-card/option-card.js +8 -149
  166. package/components/otp-input/class.js +180 -0
  167. package/components/otp-input/otp-input.a2ui.json +5 -1
  168. package/components/otp-input/otp-input.d.ts +25 -0
  169. package/components/otp-input/otp-input.js +9 -162
  170. package/components/otp-input/otp-input.yaml +45 -174
  171. package/components/page/class.js +97 -0
  172. package/components/page/page.d.ts +46 -0
  173. package/components/page/page.js +8 -79
  174. package/components/pagination/class.js +195 -0
  175. package/components/pagination/pagination.d.ts +23 -0
  176. package/components/pagination/pagination.js +9 -177
  177. package/components/pane/class.js +186 -0
  178. package/components/pane/pane.a2ui.json +12 -1
  179. package/components/pane/pane.css +10 -0
  180. package/components/pane/pane.d.ts +31 -0
  181. package/components/pane/pane.js +8 -143
  182. package/components/pane/pane.yaml +57 -157
  183. package/components/pipeline-status/class.js +189 -0
  184. package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
  185. package/components/pipeline-status/pipeline-status.d.ts +21 -0
  186. package/components/pipeline-status/pipeline-status.js +9 -172
  187. package/components/pipeline-status/pipeline-status.yaml +34 -72
  188. package/components/popover/class.js +194 -0
  189. package/components/popover/popover.d.ts +23 -0
  190. package/components/popover/popover.js +9 -176
  191. package/components/progress/class.js +74 -0
  192. package/components/progress/progress.a2ui.json +3 -0
  193. package/components/progress/progress.d.ts +19 -0
  194. package/components/progress/progress.js +10 -57
  195. package/components/progress/progress.yaml +124 -287
  196. package/components/progress-row/class.js +110 -0
  197. package/components/progress-row/progress-row.d.ts +23 -0
  198. package/components/progress-row/progress-row.js +8 -92
  199. package/components/radio/class.js +83 -0
  200. package/components/radio/radio.d.ts +28 -0
  201. package/components/radio/radio.js +11 -67
  202. package/components/range/class.js +194 -0
  203. package/components/range/range.d.ts +31 -0
  204. package/components/range/range.js +9 -176
  205. package/components/rating/class.js +148 -0
  206. package/components/rating/rating.d.ts +33 -0
  207. package/components/rating/rating.js +9 -130
  208. package/components/richtext/class.js +87 -0
  209. package/components/richtext/richtext.a2ui.json +7 -1
  210. package/components/richtext/richtext.d.ts +19 -0
  211. package/components/richtext/richtext.js +8 -68
  212. package/components/richtext/richtext.yaml +30 -65
  213. package/components/row/class.js +50 -0
  214. package/components/row/row.d.ts +27 -0
  215. package/components/row/row.js +10 -33
  216. package/components/search/class.js +134 -0
  217. package/components/search/search.d.ts +35 -0
  218. package/components/search/search.js +10 -117
  219. package/components/segment/class.js +62 -0
  220. package/components/segment/segment.d.ts +25 -0
  221. package/components/segment/segment.js +10 -45
  222. package/components/segmented/class.js +165 -0
  223. package/components/segmented/segmented.a2ui.json +4 -0
  224. package/components/segmented/segmented.d.ts +24 -0
  225. package/components/segmented/segmented.js +10 -148
  226. package/components/segmented/segmented.yaml +41 -59
  227. package/components/select/class.js +408 -0
  228. package/components/select/select.d.ts +57 -0
  229. package/components/select/select.js +15 -396
  230. package/components/skeleton/class.js +52 -0
  231. package/components/skeleton/skeleton.d.ts +23 -0
  232. package/components/skeleton/skeleton.js +8 -34
  233. package/components/slider/class.js +184 -0
  234. package/components/slider/slider.d.ts +31 -0
  235. package/components/slider/slider.js +9 -166
  236. package/components/stack/class.js +28 -0
  237. package/components/stack/stack.d.ts +17 -0
  238. package/components/stack/stack.js +10 -11
  239. package/components/step-progress/class.js +98 -0
  240. package/components/step-progress/step-progress.d.ts +27 -0
  241. package/components/step-progress/step-progress.js +8 -79
  242. package/components/stepper/class.js +126 -0
  243. package/components/stepper/stepper.d.ts +19 -0
  244. package/components/stepper/stepper.js +9 -112
  245. package/components/stream/class.js +109 -0
  246. package/components/stream/stream.d.ts +19 -0
  247. package/components/stream/stream.js +8 -90
  248. package/components/swatch/class.js +131 -0
  249. package/components/swatch/swatch.d.ts +28 -0
  250. package/components/swatch/swatch.js +8 -112
  251. package/components/swiper/class.js +373 -0
  252. package/components/swiper/swiper.a2ui.json +4 -0
  253. package/components/swiper/swiper.d.ts +31 -0
  254. package/components/swiper/swiper.js +8 -354
  255. package/components/swiper/swiper.yaml +68 -212
  256. package/components/switch/class.js +63 -0
  257. package/components/switch/switch.a2ui.json +6 -1
  258. package/components/switch/switch.d.ts +30 -0
  259. package/components/switch/switch.js +11 -47
  260. package/components/switch/switch.yaml +70 -265
  261. package/components/table/class.js +1453 -0
  262. package/components/table/table.d.ts +37 -0
  263. package/components/table/table.js +8 -1435
  264. package/components/table-toolbar/class.js +680 -0
  265. package/components/table-toolbar/table-toolbar.d.ts +33 -0
  266. package/components/table-toolbar/table-toolbar.js +8 -689
  267. package/components/tabs/class.js +242 -0
  268. package/components/tabs/tabs.d.ts +21 -0
  269. package/components/tabs/tabs.js +8 -223
  270. package/components/tag/class.js +99 -0
  271. package/components/tag/tag.d.ts +27 -0
  272. package/components/tag/tag.js +8 -80
  273. package/components/text/class.js +46 -0
  274. package/components/text/text.d.ts +25 -0
  275. package/components/text/text.js +9 -28
  276. package/components/textarea/class.js +134 -0
  277. package/components/textarea/textarea.d.ts +31 -0
  278. package/components/textarea/textarea.js +11 -118
  279. package/components/timeline/class.js +176 -0
  280. package/components/timeline/timeline.d.ts +19 -0
  281. package/components/timeline/timeline.js +9 -162
  282. package/components/toast/class.js +92 -0
  283. package/components/toast/toast.d.ts +23 -0
  284. package/components/toast/toast.js +9 -76
  285. package/components/toggle-group/class.js +154 -0
  286. package/components/toggle-group/toggle-group.d.ts +19 -0
  287. package/components/toggle-group/toggle-group.js +11 -140
  288. package/components/toggle-scheme/class.js +286 -0
  289. package/components/toggle-scheme/toggle-scheme.a2ui.json +197 -0
  290. package/components/toggle-scheme/toggle-scheme.css +20 -0
  291. package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
  292. package/components/toggle-scheme/toggle-scheme.js +17 -0
  293. package/components/toggle-scheme/toggle-scheme.yaml +173 -0
  294. package/components/toolbar/class.js +388 -0
  295. package/components/toolbar/toolbar.d.ts +23 -0
  296. package/components/toolbar/toolbar.js +10 -376
  297. package/components/tooltip/class.js +299 -0
  298. package/components/tooltip/tooltip.d.ts +27 -0
  299. package/components/tooltip/tooltip.js +8 -280
  300. package/components/tree/class.js +245 -0
  301. package/components/tree/tree.d.ts +15 -0
  302. package/components/tree/tree.js +9 -244
  303. package/components/upload/class.js +199 -0
  304. package/components/upload/upload.d.ts +27 -0
  305. package/components/upload/upload.js +11 -183
  306. package/core/element.d.ts +174 -0
  307. package/core/form.d.ts +108 -0
  308. package/core/index.d.ts +11 -0
  309. package/core/index.js +1 -0
  310. package/core/register.d.ts +25 -0
  311. package/core/register.js +58 -0
  312. package/core/signals.d.ts +94 -0
  313. package/core/template.d.ts +70 -0
  314. package/index.d.ts +315 -0
  315. package/package.json +25 -6
  316. package/traits/CATEGORIES.md +1 -1
@@ -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": [],
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `<calendar-picker-ui>` — Date picker with popover-anchored calendar grid.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/calendar-picker
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface CalendarPickerChangeEventDetail {
10
+ /** Selected date in ISO-8601 form (e.g. `"2026-05-12"`). */
11
+ value: string;
12
+ }
13
+ export type CalendarPickerChangeEvent = CustomEvent<CalendarPickerChangeEventDetail>;
14
+
15
+ export class UICalendarPicker extends UIFormElement {
16
+ /** ISO-date string of the selected day. */
17
+ value: string;
18
+ /** Open/closed reflected state. */
19
+ open: boolean;
20
+
21
+ addEventListener<K extends keyof HTMLElementEventMap>(
22
+ type: K,
23
+ listener: (this: UICalendarPicker, ev: HTMLElementEventMap[K]) => unknown,
24
+ options?: boolean | AddEventListenerOptions,
25
+ ): void;
26
+ addEventListener(type: 'change', listener: (ev: CalendarPickerChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
27
+ }