@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,89 +1,17 @@
1
1
  /**
2
- * <tag-ui text="Label" variant="info" removable></tag-ui>
2
+ * `<tag-ui>` auto-registers the tag on import.
3
3
  *
4
- * Inline tag / chip. Pill-shaped, text rendered via CSS attr().
5
- * Optional dismiss button dispatches a 'remove' CustomEvent.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
6
  *
7
- * Variants: default, info, success, warning, danger
8
- * Sizes: sm, md (default)
7
+ * import { UITag } from '@adia-ai/web-components/components/tag/class';
9
8
  *
10
- * Events:
11
- * remove — { detail: { text, value } } fired when dismiss is clicked
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
10
  */
13
11
 
14
- import { UIElement } from '../../core/element.js';
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UITag } from './class.js';
15
14
 
16
- class UITag extends UIElement {
17
- static properties = {
18
- text: { type: String, default: '', reflect: true },
19
- textContent: { type: String, default: '' },
20
- variant: { type: String, default: 'default', reflect: true },
21
- size: { type: String, default: 'md', reflect: true },
22
- removable: { type: Boolean, default: false, reflect: true },
23
- disabled: { type: Boolean, default: false, reflect: true },
24
- };
25
-
26
- static parts = {
27
- dismiss: '<button slot="dismiss" type="button" aria-label="Remove"><icon-ui name="x"></icon-ui></button>',
28
- };
29
-
30
- static template = () => null;
31
-
32
- #onClick = (e) => {
33
- if (this.disabled) return;
34
- if (e.target.closest('[slot="dismiss"]')) {
35
- this.dispatchEvent(new CustomEvent('remove', {
36
- bubbles: true,
37
- detail: { text: this.text, value: this.text },
38
- }));
39
- this.remove();
40
- }
41
- };
42
-
43
- #onKeydown = (e) => {
44
- if (this.disabled) return;
45
- if (e.target.closest('[slot="dismiss"]') && (e.key === 'Enter' || e.key === ' ')) {
46
- e.preventDefault();
47
- this.dispatchEvent(new CustomEvent('remove', {
48
- bubbles: true,
49
- detail: { text: this.text, value: this.text },
50
- }));
51
- this.remove();
52
- }
53
- };
54
-
55
- connected() {
56
- this.setAttribute('role', 'status');
57
- this.setAttribute('tabindex', '0');
58
-
59
- this.addEventListener('click', this.#onClick);
60
- this.addEventListener('keydown', this.#onKeydown);
61
- }
62
-
63
- disconnected() {
64
- this.removeEventListener('click', this.#onClick);
65
- this.removeEventListener('keydown', this.#onKeydown);
66
- }
67
-
68
- render() {
69
- if (this.text) this.setAttribute('aria-label', this.text);
70
-
71
- if (this.disabled) {
72
- this.setAttribute('aria-disabled', 'true');
73
- this.setAttribute('tabindex', '-1');
74
- } else {
75
- this.removeAttribute('aria-disabled');
76
- this.setAttribute('tabindex', '0');
77
- }
78
-
79
- if (this.removable && !this.disabled) {
80
- const btn = this.ensure('dismiss');
81
- if (btn && btn.parentElement !== this) this.appendChild(btn);
82
- } else {
83
- this.drop('dismiss');
84
- }
85
- }
86
- }
87
- customElements.define('tag-ui', UITag);
15
+ defineIfFree('tag-ui', UITag);
88
16
 
89
17
  export { UITag };
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Non-side-effect class export for `<text-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/text`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <text-ui variant="heading">Hello World</text-ui>
16
+ * <text-ui truncate>Long text that gets cut off...</text-ui>
17
+ * <text-ui variant="body" lines="3">Multi-line clamped content...</text-ui>
18
+ *
19
+ * Typography wrapper that applies role tokens.
20
+ *
21
+ * Properties:
22
+ * variant — body | heading | title | display | caption | label | kicker | code
23
+ * truncate — single-line truncation with ellipsis
24
+ * lines — multi-line clamp count (0 = no clamp)
25
+ */
26
+
27
+ import { UIElement } from '../../core/element.js';
28
+
29
+ export class UIText extends UIElement {
30
+ static properties = {
31
+ variant: { type: String, default: 'body', reflect: true },
32
+ strong: { type: Boolean, default: false, reflect: true },
33
+ truncate: { type: Boolean, default: false, reflect: true },
34
+ lines: { type: Number, default: 0, reflect: true },
35
+ };
36
+
37
+ static template = () => null;
38
+
39
+ render() {
40
+ if (this.lines > 0) {
41
+ this.style.setProperty('--_text-lines', String(this.lines));
42
+ } else {
43
+ this.style.removeProperty('--_text-lines');
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `<text-ui>` — Typography wrapper that applies role tokens. Supports truncation and line clamping.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/text
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 UIText extends UIElement {
15
+ /** Multi-line clamp count (0 = no clamp) */
16
+ lines: number;
17
+ /** When true, applies stronger emphasis (heavier weight + accent color). Styled via :scope[strong] in text.css. Use instead of variant=heading when you want a single emphasized word inline in body copy. */
18
+ strong: boolean;
19
+ /** Display text content. The main payload field for Text components extracted from HTML. */
20
+ textContent: string;
21
+ /** Single-line truncation with ellipsis. Ignored when `lines` is set. */
22
+ truncate: boolean;
23
+ /** Typography variant — sets role tokens (size/weight/tracking/color). */
24
+ variant: 'body' | 'heading' | 'subheading' | 'title' | 'subsection' | 'display' | 'caption' | 'label' | 'kicker' | 'deck' | 'section' | 'metric' | 'code' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
25
+ }
@@ -1,36 +1,17 @@
1
1
  /**
2
- * <text-ui variant="heading">Hello World</text-ui>
3
- * <text-ui truncate>Long text that gets cut off...</text-ui>
4
- * <text-ui variant="body" lines="3">Multi-line clamped content...</text-ui>
2
+ * `<text-ui>` auto-registers the tag on import.
5
3
  *
6
- * Typography wrapper that applies role tokens.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
7
6
  *
8
- * Properties:
9
- * variant — body | heading | title | display | caption | label | kicker | code
10
- * truncate single-line truncation with ellipsis
11
- * lines — multi-line clamp count (0 = no clamp)
7
+ * import { UIText } from '@adia-ai/web-components/components/text/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
10
  */
13
11
 
14
- import { UIElement } from '../../core/element.js';
15
-
16
- class UIText extends UIElement {
17
- static properties = {
18
- variant: { type: String, default: 'body', reflect: true },
19
- strong: { type: Boolean, default: false, reflect: true },
20
- truncate: { type: Boolean, default: false, reflect: true },
21
- lines: { type: Number, default: 0, reflect: true },
22
- };
23
-
24
- static template = () => null;
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIText } from './class.js';
25
14
 
26
- render() {
27
- if (this.lines > 0) {
28
- this.style.setProperty('--_text-lines', String(this.lines));
29
- } else {
30
- this.style.removeProperty('--_text-lines');
31
- }
32
- }
33
- }
34
- customElements.define('text-ui', UIText);
15
+ defineIfFree('text-ui', UIText);
35
16
 
36
17
  export { UIText };
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Non-side-effect class export for `<textarea-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/textarea`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <textarea-ui> — Multiline text input. The host IS the interactive surface.
16
+ * Uses contenteditable for text entry, ElementInternals for form participation.
17
+ * No native <textarea> inside.
18
+ */
19
+
20
+ import { UIFormElement } from '../../core/form.js';
21
+
22
+ export class UITextarea extends UIFormElement {
23
+ static properties = {
24
+ ...UIFormElement.properties,
25
+ placeholder: { type: String, default: '', reflect: true },
26
+ label: { type: String, default: '', reflect: true },
27
+ rows: { type: Number, default: 3, reflect: true },
28
+ resize: { type: String, default: 'vertical', reflect: true },
29
+ };
30
+
31
+ static template = () => null;
32
+
33
+ #textEl = null;
34
+
35
+ connected() {
36
+ super.connected();
37
+ this.setAttribute('role', 'textbox');
38
+ this.setAttribute('aria-multiline', 'true');
39
+
40
+ if (!this.querySelector('[slot="text"]')) {
41
+ this.innerHTML = `
42
+ ${this.label ? `<label slot="label" label="${this.label}"></label>` : ''}
43
+ <div slot="text" contenteditable="plaintext-only" tabindex="0"
44
+ ${this.value ? '' : 'data-empty=""'}
45
+ data-placeholder="${this.placeholder}"></div>
46
+ `;
47
+ }
48
+
49
+ this.#textEl = this.querySelector('[slot="text"]');
50
+ if (this.value) this.#textEl.textContent = this.value;
51
+
52
+ if (this.#textEl) {
53
+ this.#textEl.addEventListener('input', this.#onInput);
54
+ this.#textEl.addEventListener('keydown', this.#onKeydown);
55
+ this.#textEl.addEventListener('blur', this.#onBlur);
56
+ this.#textEl.addEventListener('paste', this.#onPaste);
57
+ }
58
+ }
59
+
60
+ render() {
61
+ if (!this.#textEl) return;
62
+
63
+ this.#textEl.setAttribute('data-placeholder', this.placeholder);
64
+
65
+ if (this.disabled || this.readonly) {
66
+ this.#textEl.contentEditable = 'false';
67
+ } else {
68
+ this.#textEl.contentEditable = 'plaintext-only';
69
+ }
70
+
71
+ // Sync programmatic `value` assignments (form.reset(), trait writes,
72
+ // controlled-input patterns) into the contenteditable surface. Skip
73
+ // when the surface already matches to avoid clobbering an in-flight
74
+ // edit's caret.
75
+ const text = this.value || '';
76
+ if (this.#textEl.textContent !== text) {
77
+ this.#textEl.textContent = text;
78
+ this.#textEl.toggleAttribute('data-empty', !text);
79
+ }
80
+
81
+ const label = this.querySelector('[slot="label"]');
82
+ if (label && this.label) label.setAttribute('label', this.label);
83
+
84
+ this.setAttribute('aria-label', this.label || this.placeholder || '');
85
+ }
86
+
87
+ #onInput = () => {
88
+ const text = this.#textEl.textContent || '';
89
+ this.value = text;
90
+ this.#textEl.toggleAttribute('data-empty', !text);
91
+ this.syncValue(text);
92
+ this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
93
+ };
94
+
95
+ #onKeydown = (e) => {
96
+ // Enter without shift submits; shift+enter inserts newline
97
+ if (e.key === 'Enter' && !e.shiftKey) {
98
+ e.preventDefault();
99
+ this.dispatchEvent(new Event('submit', { bubbles: true }));
100
+ }
101
+ };
102
+
103
+ #onBlur = () => {
104
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { value: this.value } }));
105
+ };
106
+
107
+ #onPaste = (e) => {
108
+ e.preventDefault();
109
+ const text = e.clipboardData?.getData('text/plain') || '';
110
+ document.execCommand('insertText', false, text);
111
+ };
112
+
113
+ focus() { this.#textEl?.focus(); }
114
+
115
+ clear() {
116
+ this.value = '';
117
+ if (this.#textEl) {
118
+ this.#textEl.textContent = '';
119
+ this.#textEl.setAttribute('data-empty', '');
120
+ }
121
+ this.syncValue('');
122
+ }
123
+
124
+ disconnected() {
125
+ super.disconnected();
126
+ if (this.#textEl) {
127
+ this.#textEl.removeEventListener('input', this.#onInput);
128
+ this.#textEl.removeEventListener('keydown', this.#onKeydown);
129
+ this.#textEl.removeEventListener('blur', this.#onBlur);
130
+ this.#textEl.removeEventListener('paste', this.#onPaste);
131
+ }
132
+ this.#textEl = null;
133
+ }
134
+ }
@@ -1,124 +1,17 @@
1
1
  /**
2
- * <textarea-ui>Multiline text input. The host IS the interactive surface.
3
- * Uses contenteditable for text entry, ElementInternals for form participation.
4
- * No native <textarea> inside.
2
+ * `<textarea-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 { UITextarea } from '@adia-ai/web-components/components/textarea/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
5
10
  */
6
11
 
7
- import { UIFormElement } from '../../core/form.js';
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UITextarea } from './class.js';
8
14
 
9
- class UITextarea extends UIFormElement {
10
- static properties = {
11
- ...UIFormElement.properties,
12
- placeholder: { type: String, default: '', reflect: true },
13
- label: { type: String, default: '', reflect: true },
14
- rows: { type: Number, default: 3, reflect: true },
15
- resize: { type: String, default: 'vertical', reflect: true },
16
- };
17
-
18
- static template = () => null;
19
-
20
- #textEl = null;
21
-
22
- connected() {
23
- super.connected();
24
- this.setAttribute('role', 'textbox');
25
- this.setAttribute('aria-multiline', 'true');
26
-
27
- if (!this.querySelector('[slot="text"]')) {
28
- this.innerHTML = `
29
- ${this.label ? `<label slot="label" label="${this.label}"></label>` : ''}
30
- <div slot="text" contenteditable="plaintext-only" tabindex="0"
31
- ${this.value ? '' : 'data-empty=""'}
32
- data-placeholder="${this.placeholder}"></div>
33
- `;
34
- }
35
-
36
- this.#textEl = this.querySelector('[slot="text"]');
37
- if (this.value) this.#textEl.textContent = this.value;
38
-
39
- if (this.#textEl) {
40
- this.#textEl.addEventListener('input', this.#onInput);
41
- this.#textEl.addEventListener('keydown', this.#onKeydown);
42
- this.#textEl.addEventListener('blur', this.#onBlur);
43
- this.#textEl.addEventListener('paste', this.#onPaste);
44
- }
45
- }
46
-
47
- render() {
48
- if (!this.#textEl) return;
49
-
50
- this.#textEl.setAttribute('data-placeholder', this.placeholder);
51
-
52
- if (this.disabled || this.readonly) {
53
- this.#textEl.contentEditable = 'false';
54
- } else {
55
- this.#textEl.contentEditable = 'plaintext-only';
56
- }
57
-
58
- // Sync programmatic `value` assignments (form.reset(), trait writes,
59
- // controlled-input patterns) into the contenteditable surface. Skip
60
- // when the surface already matches to avoid clobbering an in-flight
61
- // edit's caret.
62
- const text = this.value || '';
63
- if (this.#textEl.textContent !== text) {
64
- this.#textEl.textContent = text;
65
- this.#textEl.toggleAttribute('data-empty', !text);
66
- }
67
-
68
- const label = this.querySelector('[slot="label"]');
69
- if (label && this.label) label.setAttribute('label', this.label);
70
-
71
- this.setAttribute('aria-label', this.label || this.placeholder || '');
72
- }
73
-
74
- #onInput = () => {
75
- const text = this.#textEl.textContent || '';
76
- this.value = text;
77
- this.#textEl.toggleAttribute('data-empty', !text);
78
- this.syncValue(text);
79
- this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
80
- };
81
-
82
- #onKeydown = (e) => {
83
- // Enter without shift submits; shift+enter inserts newline
84
- if (e.key === 'Enter' && !e.shiftKey) {
85
- e.preventDefault();
86
- this.dispatchEvent(new Event('submit', { bubbles: true }));
87
- }
88
- };
89
-
90
- #onBlur = () => {
91
- this.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { value: this.value } }));
92
- };
93
-
94
- #onPaste = (e) => {
95
- e.preventDefault();
96
- const text = e.clipboardData?.getData('text/plain') || '';
97
- document.execCommand('insertText', false, text);
98
- };
99
-
100
- focus() { this.#textEl?.focus(); }
101
-
102
- clear() {
103
- this.value = '';
104
- if (this.#textEl) {
105
- this.#textEl.textContent = '';
106
- this.#textEl.setAttribute('data-empty', '');
107
- }
108
- this.syncValue('');
109
- }
110
-
111
- disconnected() {
112
- super.disconnected();
113
- if (this.#textEl) {
114
- this.#textEl.removeEventListener('input', this.#onInput);
115
- this.#textEl.removeEventListener('keydown', this.#onKeydown);
116
- this.#textEl.removeEventListener('blur', this.#onBlur);
117
- this.#textEl.removeEventListener('paste', this.#onPaste);
118
- }
119
- this.#textEl = null;
120
- }
121
- }
122
- customElements.define('textarea-ui', UITextarea);
15
+ defineIfFree('textarea-ui', UITextarea);
123
16
 
124
17
  export { UITextarea };
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Non-side-effect class export for `<timeline-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/timeline`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <timeline-ui> — Vertical (or horizontal) event / progress log.
16
+ *
17
+ * Each <timeline-item-ui> is one entry, with its own state via the `status`
18
+ * enum (idle | active | completed | error), optional icon, duration, and an
19
+ * expandable outcomes list. `[spinner]` is an orthogonal presentation hint
20
+ * that animates the dot as a ring when combined with `status="active"`.
21
+ *
22
+ * <timeline-ui>
23
+ * <timeline-item-ui text="Shipped" time="2h ago" status="completed"></timeline-item-ui>
24
+ * <timeline-item-ui text="Delivery" time="now" status="active" spinner></timeline-item-ui>
25
+ * <timeline-item-ui text="Received"></timeline-item-ui>
26
+ * </timeline-ui>
27
+ *
28
+ * For agent reasoning / pipeline views, set size="sm" and use
29
+ * duration, outcomes, spinner, status="error"
30
+ *
31
+ * <timeline-ui size="sm">
32
+ * <timeline-item-ui text="search" duration="850ms" status="completed"></timeline-item-ui>
33
+ * <timeline-item-ui text="generate" status="active" spinner></timeline-item-ui>
34
+ * </timeline-ui>
35
+ *
36
+ * For wizard / numbered-circle patterns, use the dedicated <stepper-ui>.
37
+ *
38
+ * Attributes (container):
39
+ * orientation — vertical (default) | horizontal
40
+ * size — md (default) | sm
41
+ *
42
+ * Attributes (item):
43
+ * text — primary label
44
+ * description — secondary text (optional)
45
+ * time — right-aligned timestamp (optional; mutually exclusive with duration)
46
+ * duration — right-aligned duration label (e.g. "850ms", "2s"); also set when live=true
47
+ * icon — icon-ui name (replaces the dot when set)
48
+ * variant — default | success | accent | warning | danger (colors the dot/icon)
49
+ * completed — boolean; renders "done" state
50
+ * active — boolean; renders "active" state
51
+ * error — boolean; renders "error" state (red dot)
52
+ * spinner — boolean; spinning dot while active
53
+ *
54
+ * JS (item):
55
+ * .outcomes = string[] // renders an expandable sub-list under the row
56
+ */
57
+
58
+ import { UIElement } from '../../core/element.js';
59
+
60
+ // ── Container ──────────────────────────────────────────────────
61
+
62
+ export class UITimeline extends UIElement {
63
+ static properties = {
64
+ orientation: { type: String, default: 'vertical', reflect: true },
65
+ size: { type: String, default: 'md', reflect: true },
66
+ };
67
+
68
+ static template = () => null;
69
+
70
+ render() {
71
+ const items = [...this.querySelectorAll(':scope > timeline-item-ui')];
72
+ for (const item of items) item.removeAttribute('data-last');
73
+ const last = items[items.length - 1];
74
+ if (last) last.setAttribute('data-last', '');
75
+ }
76
+ }
77
+
78
+ export class UITimelineItem extends UIElement {
79
+ static properties = {
80
+ text: { type: String, default: '', reflect: true },
81
+ description: { type: String, default: '', reflect: true },
82
+ time: { type: String, default: '', reflect: true },
83
+ duration: { type: String, default: '', reflect: true },
84
+ icon: { type: String, default: '', reflect: true },
85
+ variant: { type: String, default: 'default', reflect: true },
86
+ status: { type: String, default: 'idle', reflect: true },
87
+ spinner: { type: Boolean, default: false, reflect: true },
88
+ };
89
+
90
+ static template = () => null;
91
+
92
+ #outcomes = [];
93
+ #expanded = false;
94
+
95
+ get outcomes() { return this.#outcomes; }
96
+ set outcomes(v) {
97
+ this.#outcomes = Array.isArray(v) ? v.slice() : [];
98
+ this.render();
99
+ }
100
+
101
+ connected() {
102
+ if (!this.querySelector(':scope > [slot="label"]')) {
103
+ // Author provided just text/time — stamp the default slot structure
104
+ this.innerHTML = `
105
+ <span slot="label"></span>
106
+ <span slot="description"></span>
107
+ <span slot="time"></span>
108
+ `;
109
+ }
110
+ }
111
+
112
+ render() {
113
+ const label = this.querySelector(':scope > [slot="label"]');
114
+ const desc = this.querySelector(':scope > [slot="description"]');
115
+ const time = this.querySelector(':scope > [slot="time"]');
116
+ if (label) label.textContent = this.text;
117
+ if (desc) desc.textContent = this.description;
118
+ if (time) time.textContent = this.duration || this.time;
119
+
120
+ if (this.icon) {
121
+ let iconEl = this.querySelector(':scope > [slot="icon"]');
122
+ if (!iconEl) {
123
+ iconEl = document.createElement('icon-ui');
124
+ iconEl.setAttribute('slot', 'icon');
125
+ this.prepend(iconEl);
126
+ }
127
+ iconEl.setAttribute('name', this.icon);
128
+ } else {
129
+ this.querySelector(':scope > [slot="icon"]')?.remove();
130
+ }
131
+
132
+ // Outcomes sub-list + toggle chevron
133
+ let body = this.querySelector(':scope > [slot="outcomes"]');
134
+ if (this.#outcomes.length > 0) {
135
+ if (!body) {
136
+ body = document.createElement('ul');
137
+ body.setAttribute('slot', 'outcomes');
138
+ this.appendChild(body);
139
+ }
140
+ body.innerHTML = '';
141
+ for (const o of this.#outcomes) {
142
+ const li = document.createElement('li');
143
+ li.textContent = o;
144
+ body.appendChild(li);
145
+ }
146
+ body.hidden = !this.#expanded;
147
+
148
+ // Toggle chevron lives on the row — we stamp a button once
149
+ let toggle = this.querySelector(':scope > [data-timeline-toggle]');
150
+ if (!toggle) {
151
+ toggle = document.createElement('button');
152
+ toggle.type = 'button';
153
+ toggle.setAttribute('data-timeline-toggle', '');
154
+ toggle.setAttribute('aria-label', 'Toggle details');
155
+ toggle.addEventListener('click', (e) => {
156
+ e.stopPropagation();
157
+ this.#expanded = !this.#expanded;
158
+ this.render();
159
+ this.dispatchEvent(new CustomEvent('timeline-toggle', {
160
+ bubbles: true, detail: { expanded: this.#expanded },
161
+ }));
162
+ });
163
+ this.appendChild(toggle);
164
+ }
165
+ toggle.innerHTML = '';
166
+ const caret = document.createElement('icon-ui');
167
+ caret.setAttribute('name', this.#expanded ? 'caret-down' : 'caret-right');
168
+ caret.setAttribute('color', 'muted');
169
+ caret.setAttribute('size', 'sm');
170
+ toggle.appendChild(caret);
171
+ } else {
172
+ this.querySelector(':scope > [data-timeline-toggle]')?.remove();
173
+ body?.remove();
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `<timeline-ui>` — Timeline and step wizard. Two modes: timeline (per-item state) and steps (parent-driven).
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/timeline
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 UITimeline extends UIElement {
15
+ /** Layout direction */
16
+ orientation: 'vertical' | 'horizontal';
17
+ /** Rail size preset — use `sm` for agent-reasoning/pipeline views; `md` is the default. */
18
+ size: 'sm' | 'md';
19
+ }