@adia-ai/web-components 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/USAGE.md +29 -9
  2. package/components/accordion/accordion.d.ts +17 -0
  3. package/components/accordion/accordion.js +10 -117
  4. package/components/accordion/class.js +132 -0
  5. package/components/action-list/action-list.d.ts +15 -0
  6. package/components/action-list/action-list.js +9 -140
  7. package/components/action-list/class.js +156 -0
  8. package/components/agent-artifact/agent-artifact.d.ts +25 -0
  9. package/components/agent-artifact/agent-artifact.js +8 -181
  10. package/components/agent-artifact/class.js +200 -0
  11. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
  12. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  13. package/components/agent-feedback-bar/class.js +162 -0
  14. package/components/agent-questions/agent-questions.d.ts +23 -0
  15. package/components/agent-questions/agent-questions.js +8 -180
  16. package/components/agent-questions/class.js +199 -0
  17. package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
  18. package/components/agent-reasoning/agent-reasoning.js +8 -494
  19. package/components/agent-reasoning/class.js +513 -0
  20. package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
  21. package/components/agent-suggestions/agent-suggestions.js +8 -78
  22. package/components/agent-suggestions/class.js +97 -0
  23. package/components/agent-trace/agent-trace.d.ts +19 -0
  24. package/components/alert/alert.d.ts +29 -0
  25. package/components/alert/alert.js +8 -175
  26. package/components/alert/class.js +194 -0
  27. package/components/avatar/avatar.d.ts +27 -0
  28. package/components/avatar/avatar.js +9 -159
  29. package/components/avatar/class.js +173 -0
  30. package/components/badge/badge.d.ts +27 -0
  31. package/components/badge/badge.js +9 -75
  32. package/components/badge/class.js +93 -0
  33. package/components/block/block.d.ts +19 -0
  34. package/components/block/block.js +9 -15
  35. package/components/block/class.js +33 -0
  36. package/components/breadcrumb/breadcrumb.d.ts +23 -0
  37. package/components/breadcrumb/breadcrumb.js +8 -113
  38. package/components/breadcrumb/class.js +132 -0
  39. package/components/button/button.d.ts +34 -0
  40. package/components/button/button.js +15 -66
  41. package/components/button/class.js +80 -0
  42. package/components/calendar-picker/calendar-picker.a2ui.json +6 -1
  43. package/components/calendar-picker/calendar-picker.js +8 -332
  44. package/components/calendar-picker/calendar-picker.yaml +51 -177
  45. package/components/calendar-picker/class.js +351 -0
  46. package/components/canvas/canvas.a2ui.json +6 -1
  47. package/components/canvas/canvas.d.ts +17 -0
  48. package/components/canvas/canvas.yaml +19 -36
  49. package/components/card/card.a2ui.json +3 -0
  50. package/components/card/card.d.ts +27 -0
  51. package/components/card/card.js +9 -50
  52. package/components/card/card.yaml +171 -433
  53. package/components/card/class.js +68 -0
  54. package/components/chart/chart.d.ts +41 -0
  55. package/components/chart/chart.js +8 -2131
  56. package/components/chart/class.js +2150 -0
  57. package/components/chart-legend/chart-legend.d.ts +27 -0
  58. package/components/chart-legend/chart-legend.js +8 -197
  59. package/components/chart-legend/class.js +215 -0
  60. package/components/chat-thread/chat-thread.d.ts +17 -0
  61. package/components/chat-thread/chat-thread.js +8 -157
  62. package/components/chat-thread/class.js +176 -0
  63. package/components/check/check.js +11 -52
  64. package/components/check/class.js +68 -0
  65. package/components/code/class.js +501 -0
  66. package/components/code/code.js +8 -482
  67. package/components/col/class.js +30 -0
  68. package/components/col/col.d.ts +23 -0
  69. package/components/col/col.js +10 -13
  70. package/components/color-picker/class.js +550 -0
  71. package/components/color-picker/color-picker.js +8 -531
  72. package/components/command/class.js +364 -0
  73. package/components/command/command.a2ui.json +3 -0
  74. package/components/command/command.d.ts +19 -0
  75. package/components/command/command.js +8 -345
  76. package/components/command/command.yaml +105 -124
  77. package/components/demo-toggle/class.js +153 -0
  78. package/components/demo-toggle/demo-toggle.d.ts +23 -0
  79. package/components/demo-toggle/demo-toggle.js +8 -135
  80. package/components/description-list/class.js +86 -0
  81. package/components/description-list/description-list.d.ts +21 -0
  82. package/components/description-list/description-list.js +8 -67
  83. package/components/divider/class.js +57 -0
  84. package/components/divider/divider.d.ts +19 -0
  85. package/components/divider/divider.js +10 -40
  86. package/components/drawer/class.js +306 -0
  87. package/components/drawer/drawer.d.ts +25 -0
  88. package/components/drawer/drawer.js +8 -287
  89. package/components/embed/class.js +73 -0
  90. package/components/embed/embed.d.ts +23 -0
  91. package/components/embed/embed.js +9 -55
  92. package/components/empty-state/class.js +108 -0
  93. package/components/empty-state/empty-state.d.ts +21 -0
  94. package/components/empty-state/empty-state.js +9 -90
  95. package/components/feed/class.js +381 -0
  96. package/components/feed/feed.d.ts +19 -0
  97. package/components/feed/feed.js +9 -367
  98. package/components/field/class.js +266 -0
  99. package/components/field/field.d.ts +23 -0
  100. package/components/field/field.js +8 -247
  101. package/components/fields/class.js +106 -0
  102. package/components/fields/fields.d.ts +19 -0
  103. package/components/fields/fields.js +8 -87
  104. package/components/grid/class.js +31 -0
  105. package/components/grid/grid.d.ts +23 -0
  106. package/components/grid/grid.js +10 -14
  107. package/components/heatmap/class.js +305 -0
  108. package/components/heatmap/heatmap.d.ts +31 -0
  109. package/components/heatmap/heatmap.js +8 -286
  110. package/components/icon/class.js +54 -0
  111. package/components/icon/icon.d.ts +23 -0
  112. package/components/icon/icon.js +13 -40
  113. package/components/image/class.js +112 -0
  114. package/components/image/image.d.ts +33 -0
  115. package/components/image/image.js +9 -94
  116. package/components/input/class.js +773 -0
  117. package/components/input/input.a2ui.json +3 -0
  118. package/components/input/input.js +8 -755
  119. package/components/input/input.yaml +171 -442
  120. package/components/inspector/class.js +142 -0
  121. package/components/inspector/inspector.a2ui.json +8 -1
  122. package/components/inspector/inspector.d.ts +17 -0
  123. package/components/inspector/inspector.js +8 -124
  124. package/components/inspector/inspector.yaml +15 -30
  125. package/components/kbd/class.js +34 -0
  126. package/components/kbd/kbd.a2ui.json +3 -0
  127. package/components/kbd/kbd.d.ts +17 -0
  128. package/components/kbd/kbd.js +10 -17
  129. package/components/kbd/kbd.yaml +54 -185
  130. package/components/link/class.js +187 -0
  131. package/components/link/link.d.ts +55 -0
  132. package/components/link/link.js +8 -168
  133. package/components/list/class.js +249 -0
  134. package/components/list/list.d.ts +23 -0
  135. package/components/list/list.js +9 -231
  136. package/components/menu/class.js +332 -0
  137. package/components/menu/menu.d.ts +21 -0
  138. package/components/menu/menu.js +11 -316
  139. package/components/modal/class.js +231 -0
  140. package/components/modal/modal.a2ui.json +5 -1
  141. package/components/modal/modal.d.ts +23 -0
  142. package/components/modal/modal.js +8 -212
  143. package/components/modal/modal.yaml +19 -39
  144. package/components/nav/class.js +150 -0
  145. package/components/nav/nav.d.ts +31 -0
  146. package/components/nav/nav.js +8 -131
  147. package/components/nav-group/class.js +152 -0
  148. package/components/nav-group/nav-group.d.ts +35 -0
  149. package/components/nav-group/nav-group.js +9 -134
  150. package/components/nav-item/class.js +86 -0
  151. package/components/nav-item/nav-item.d.ts +37 -0
  152. package/components/nav-item/nav-item.js +10 -69
  153. package/components/noodles/class.js +510 -0
  154. package/components/noodles/noodles.d.ts +33 -0
  155. package/components/noodles/noodles.js +9 -493
  156. package/components/option-card/class.js +167 -0
  157. package/components/option-card/option-card.js +8 -149
  158. package/components/otp-input/class.js +180 -0
  159. package/components/otp-input/otp-input.a2ui.json +5 -1
  160. package/components/otp-input/otp-input.js +9 -162
  161. package/components/otp-input/otp-input.yaml +45 -174
  162. package/components/page/class.js +97 -0
  163. package/components/page/page.d.ts +46 -0
  164. package/components/page/page.js +8 -79
  165. package/components/pagination/class.js +195 -0
  166. package/components/pagination/pagination.d.ts +23 -0
  167. package/components/pagination/pagination.js +9 -177
  168. package/components/pane/class.js +186 -0
  169. package/components/pane/pane.a2ui.json +12 -1
  170. package/components/pane/pane.d.ts +31 -0
  171. package/components/pane/pane.js +8 -167
  172. package/components/pane/pane.yaml +57 -157
  173. package/components/pipeline-status/class.js +189 -0
  174. package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
  175. package/components/pipeline-status/pipeline-status.d.ts +21 -0
  176. package/components/pipeline-status/pipeline-status.js +9 -172
  177. package/components/pipeline-status/pipeline-status.yaml +34 -72
  178. package/components/popover/class.js +194 -0
  179. package/components/popover/popover.d.ts +23 -0
  180. package/components/popover/popover.js +9 -176
  181. package/components/progress/class.js +74 -0
  182. package/components/progress/progress.a2ui.json +3 -0
  183. package/components/progress/progress.d.ts +19 -0
  184. package/components/progress/progress.js +10 -57
  185. package/components/progress/progress.yaml +124 -287
  186. package/components/progress-row/class.js +110 -0
  187. package/components/progress-row/progress-row.d.ts +23 -0
  188. package/components/progress-row/progress-row.js +8 -92
  189. package/components/radio/class.js +83 -0
  190. package/components/radio/radio.js +11 -67
  191. package/components/range/class.js +194 -0
  192. package/components/range/range.js +9 -176
  193. package/components/rating/class.js +148 -0
  194. package/components/rating/rating.js +9 -130
  195. package/components/richtext/class.js +87 -0
  196. package/components/richtext/richtext.a2ui.json +7 -1
  197. package/components/richtext/richtext.d.ts +19 -0
  198. package/components/richtext/richtext.js +8 -68
  199. package/components/richtext/richtext.yaml +30 -65
  200. package/components/row/class.js +50 -0
  201. package/components/row/row.d.ts +27 -0
  202. package/components/row/row.js +10 -33
  203. package/components/search/class.js +134 -0
  204. package/components/search/search.js +10 -117
  205. package/components/segment/class.js +62 -0
  206. package/components/segment/segment.d.ts +25 -0
  207. package/components/segment/segment.js +10 -45
  208. package/components/segmented/class.js +165 -0
  209. package/components/segmented/segmented.a2ui.json +4 -0
  210. package/components/segmented/segmented.js +10 -148
  211. package/components/segmented/segmented.yaml +41 -59
  212. package/components/select/class.js +408 -0
  213. package/components/select/select.js +15 -396
  214. package/components/skeleton/class.js +52 -0
  215. package/components/skeleton/skeleton.d.ts +23 -0
  216. package/components/skeleton/skeleton.js +8 -34
  217. package/components/slider/class.js +184 -0
  218. package/components/slider/slider.js +9 -166
  219. package/components/stack/class.js +28 -0
  220. package/components/stack/stack.d.ts +17 -0
  221. package/components/stack/stack.js +10 -11
  222. package/components/step-progress/class.js +98 -0
  223. package/components/step-progress/step-progress.d.ts +27 -0
  224. package/components/step-progress/step-progress.js +8 -79
  225. package/components/stepper/class.js +126 -0
  226. package/components/stepper/stepper.d.ts +19 -0
  227. package/components/stepper/stepper.js +9 -112
  228. package/components/stream/class.js +109 -0
  229. package/components/stream/stream.d.ts +19 -0
  230. package/components/stream/stream.js +8 -90
  231. package/components/swatch/class.js +131 -0
  232. package/components/swatch/swatch.d.ts +28 -0
  233. package/components/swatch/swatch.js +8 -112
  234. package/components/swiper/class.js +373 -0
  235. package/components/swiper/swiper.a2ui.json +4 -0
  236. package/components/swiper/swiper.d.ts +31 -0
  237. package/components/swiper/swiper.js +8 -354
  238. package/components/swiper/swiper.yaml +68 -212
  239. package/components/switch/class.js +63 -0
  240. package/components/switch/switch.a2ui.json +6 -1
  241. package/components/switch/switch.js +11 -47
  242. package/components/switch/switch.yaml +70 -265
  243. package/components/table/class.js +1453 -0
  244. package/components/table/table.d.ts +37 -0
  245. package/components/table/table.js +8 -1435
  246. package/components/table-toolbar/class.js +680 -0
  247. package/components/table-toolbar/table-toolbar.d.ts +33 -0
  248. package/components/table-toolbar/table-toolbar.js +8 -689
  249. package/components/tabs/class.js +242 -0
  250. package/components/tabs/tabs.d.ts +21 -0
  251. package/components/tabs/tabs.js +8 -223
  252. package/components/tag/class.js +99 -0
  253. package/components/tag/tag.d.ts +27 -0
  254. package/components/tag/tag.js +8 -80
  255. package/components/text/class.js +46 -0
  256. package/components/text/text.d.ts +25 -0
  257. package/components/text/text.js +9 -28
  258. package/components/textarea/class.js +134 -0
  259. package/components/textarea/textarea.js +11 -118
  260. package/components/timeline/class.js +176 -0
  261. package/components/timeline/timeline.d.ts +19 -0
  262. package/components/timeline/timeline.js +9 -162
  263. package/components/toast/class.js +92 -0
  264. package/components/toast/toast.d.ts +23 -0
  265. package/components/toast/toast.js +9 -76
  266. package/components/toggle-group/class.js +154 -0
  267. package/components/toggle-group/toggle-group.d.ts +19 -0
  268. package/components/toggle-group/toggle-group.js +11 -140
  269. package/components/toggle-scheme/class.js +286 -0
  270. package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
  271. package/components/toggle-scheme/toggle-scheme.js +8 -268
  272. package/components/toolbar/class.js +388 -0
  273. package/components/toolbar/toolbar.d.ts +23 -0
  274. package/components/toolbar/toolbar.js +10 -376
  275. package/components/tooltip/class.js +299 -0
  276. package/components/tooltip/tooltip.d.ts +27 -0
  277. package/components/tooltip/tooltip.js +8 -280
  278. package/components/tree/class.js +245 -0
  279. package/components/tree/tree.d.ts +15 -0
  280. package/components/tree/tree.js +9 -244
  281. package/components/upload/class.js +199 -0
  282. package/components/upload/upload.js +11 -183
  283. package/index.d.ts +159 -5
  284. package/package.json +5 -1
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Non-side-effect class export for `<demo-toggle-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/demo-toggle`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <demo-toggle-ui>
16
+ * <section slot="off">…without trait…</section>
17
+ * <section slot="on">…with trait…</section>
18
+ * </demo-toggle-ui>
19
+ *
20
+ * Side-by-side "with trait / without trait" comparison primitive.
21
+ * Renders a header bar with a switch-ui that flips which child slot is
22
+ * visible. Reflects [data-state="on"|"off"] on the host so consumer CSS
23
+ * can theme the bar around the active variant.
24
+ *
25
+ * Two layout modes:
26
+ * default — only the active slot is in the layout (the other is `display: none`).
27
+ * data-mode="overlay" — both slots stack on the same coordinates; inactive
28
+ * slot is `visibility: hidden` so layout never shifts.
29
+ *
30
+ * Authoring API:
31
+ * [label-on] — header label when state=on (default: "On")
32
+ * [label-off] — header label when state=off (default: "Off")
33
+ * [initial] — "on" | "off"; only consulted when [state] is unset on connect
34
+ * [state] — "on" | "off"; reflected; the live state attribute
35
+ *
36
+ * Events:
37
+ * change — { detail: { state: "on" | "off" } }
38
+ *
39
+ * Keyboard:
40
+ * The embedded <switch-ui> handles space + enter via its own keydown wiring.
41
+ */
42
+
43
+ import { UIElement } from '../../core/element.js';
44
+ import '../switch/switch.js';
45
+ import '../row/row.js';
46
+ import '../text/text.js';
47
+
48
+ export class UIDemoToggle extends UIElement {
49
+ static properties = {
50
+ labelOn: { type: String, default: 'On', attribute: 'label-on', reflect: true },
51
+ labelOff: { type: String, default: 'Off', attribute: 'label-off', reflect: true },
52
+ initial: { type: String, default: 'off', reflect: true },
53
+ state: { type: String, default: '', reflect: true },
54
+ };
55
+
56
+ // Header bar with a switch + active label. Stamped once per class via
57
+ // static parts; live label text is updated in render() so the same
58
+ // template covers every (label-on, label-off, state) tuple.
59
+ static parts = {
60
+ bar: `
61
+ <row-ui slot="bar" gap="3" align="center" data-demo-toggle-bar>
62
+ <text-ui slot="label" data-demo-toggle-label></text-ui>
63
+ <switch-ui slot="switch" data-demo-toggle-switch></switch-ui>
64
+ </row-ui>
65
+ `,
66
+ };
67
+
68
+ static template = () => null;
69
+
70
+ #bar = null;
71
+ #switch = null;
72
+ #label = null;
73
+ #bound = false;
74
+
75
+ connected() {
76
+ // Resolve the initial state. Honor [state] if explicitly authored;
77
+ // otherwise fall back to [initial] (default "off"). Anything other
78
+ // than the literal "on" coerces to "off" so authors can't poison
79
+ // the data-state attribute with arbitrary values.
80
+ if (!this.state) {
81
+ const seed = (this.initial === 'on') ? 'on' : 'off';
82
+ this.state = seed;
83
+ } else {
84
+ this.state = (this.state === 'on') ? 'on' : 'off';
85
+ }
86
+
87
+ // Stamp the header bar lazily — `this.ensure('bar')` clones the
88
+ // blueprint into the light DOM the first time it's called.
89
+ this.#bar = this.ensure('bar');
90
+ this.#switch = this.#bar.querySelector('[data-demo-toggle-switch]');
91
+ this.#label = this.#bar.querySelector('[data-demo-toggle-label]');
92
+
93
+ if (!this.#bound) {
94
+ this.#bound = true;
95
+ this.#switch.addEventListener('change', this.#onSwitchChange);
96
+ }
97
+ }
98
+
99
+ disconnected() {
100
+ if (this.#switch) {
101
+ this.#switch.removeEventListener('change', this.#onSwitchChange);
102
+ }
103
+ this.#bar = null;
104
+ this.#switch = null;
105
+ this.#label = null;
106
+ this.#bound = false;
107
+ }
108
+
109
+ render() {
110
+ if (!this.#bar) return;
111
+ const on = this.state === 'on';
112
+
113
+ // Sync the embedded switch to the host's state. checked is a
114
+ // reflected property; the assignment fires no event because
115
+ // syncValue() short-circuits when the next state matches.
116
+ if (this.#switch.checked !== on) {
117
+ this.#switch.checked = on;
118
+ }
119
+
120
+ if (this.#label) {
121
+ this.#label.textContent = on ? this.labelOn : this.labelOff;
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Public toggle method — flips the host between on and off and emits
127
+ * a `change` event. Mirrors the click-on-switch path so consumers
128
+ * can drive the state from outside without touching the embedded
129
+ * switch directly.
130
+ */
131
+ toggle() {
132
+ this.state = (this.state === 'on') ? 'off' : 'on';
133
+ this.dispatchEvent(new CustomEvent('change', {
134
+ bubbles: true,
135
+ detail: { state: this.state },
136
+ }));
137
+ }
138
+
139
+ #onSwitchChange = (e) => {
140
+ // The embedded <switch-ui> fires a bubbling `change`. Stop it at the
141
+ // host boundary — we re-dispatch our own `change` with detail.state
142
+ // so consumers see exactly one event per toggle, not the inner
143
+ // switch's bare event AND our annotated one.
144
+ e.stopPropagation();
145
+ const next = this.#switch.checked ? 'on' : 'off';
146
+ if (next === this.state) return;
147
+ this.state = next;
148
+ this.dispatchEvent(new CustomEvent('change', {
149
+ bubbles: true,
150
+ detail: { state: this.state },
151
+ }));
152
+ };
153
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `<demo-toggle-ui>` — Side-by-side comparison primitive — header bar with a switch + two child slots ("on" / "off"); toggling the switch swaps which slot is visible. Used on trait detail pages to show "with trait" vs "without trait" on the same chrome. data-mode="overlay" stacks the slots on the same coordinates so layout never shifts.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/demo-toggle
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 UIDemoToggle extends UIElement {
15
+ /** Initial state when [state] is not set on connect ("on" | "off"). */
16
+ initial: 'on' | 'off';
17
+ /** Header label rendered when state is "off". */
18
+ labelOff: string;
19
+ /** Header label rendered when state is "on". */
20
+ labelOn: string;
21
+ /** Current toggle state ("on" | "off"). Reflected as data-state on the host. */
22
+ state: '' | 'on' | 'off';
23
+ }
@@ -1,144 +1,17 @@
1
1
  /**
2
- * <demo-toggle-ui>
3
- * <section slot="off">…without trait…</section>
4
- * <section slot="on">…with trait…</section>
5
- * </demo-toggle-ui>
2
+ * `<demo-toggle-ui>` — auto-registers the tag on import.
6
3
  *
7
- * Side-by-side "with trait / without trait" comparison primitive.
8
- * Renders a header bar with a switch-ui that flips which child slot is
9
- * visible. Reflects [data-state="on"|"off"] on the host so consumer CSS
10
- * can theme the bar around the active variant.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
11
6
  *
12
- * Two layout modes:
13
- * default — only the active slot is in the layout (the other is `display: none`).
14
- * data-mode="overlay" — both slots stack on the same coordinates; inactive
15
- * slot is `visibility: hidden` so layout never shifts.
7
+ * import { UIDemoToggle } from '@adia-ai/web-components/components/demo-toggle/class';
16
8
  *
17
- * Authoring API:
18
- * [label-on] — header label when state=on (default: "On")
19
- * [label-off] — header label when state=off (default: "Off")
20
- * [initial] — "on" | "off"; only consulted when [state] is unset on connect
21
- * [state] — "on" | "off"; reflected; the live state attribute
22
- *
23
- * Events:
24
- * change — { detail: { state: "on" | "off" } }
25
- *
26
- * Keyboard:
27
- * The embedded <switch-ui> handles space + enter via its own keydown wiring.
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
28
10
  */
29
11
 
30
- import { UIElement } from '../../core/element.js';
31
- import '../switch/switch.js';
32
- import '../row/row.js';
33
- import '../text/text.js';
34
-
35
- class UIDemoToggle extends UIElement {
36
- static properties = {
37
- labelOn: { type: String, default: 'On', attribute: 'label-on', reflect: true },
38
- labelOff: { type: String, default: 'Off', attribute: 'label-off', reflect: true },
39
- initial: { type: String, default: 'off', reflect: true },
40
- state: { type: String, default: '', reflect: true },
41
- };
42
-
43
- // Header bar with a switch + active label. Stamped once per class via
44
- // static parts; live label text is updated in render() so the same
45
- // template covers every (label-on, label-off, state) tuple.
46
- static parts = {
47
- bar: `
48
- <row-ui slot="bar" gap="3" align="center" data-demo-toggle-bar>
49
- <text-ui slot="label" data-demo-toggle-label></text-ui>
50
- <switch-ui slot="switch" data-demo-toggle-switch></switch-ui>
51
- </row-ui>
52
- `,
53
- };
54
-
55
- static template = () => null;
56
-
57
- #bar = null;
58
- #switch = null;
59
- #label = null;
60
- #bound = false;
61
-
62
- connected() {
63
- // Resolve the initial state. Honor [state] if explicitly authored;
64
- // otherwise fall back to [initial] (default "off"). Anything other
65
- // than the literal "on" coerces to "off" so authors can't poison
66
- // the data-state attribute with arbitrary values.
67
- if (!this.state) {
68
- const seed = (this.initial === 'on') ? 'on' : 'off';
69
- this.state = seed;
70
- } else {
71
- this.state = (this.state === 'on') ? 'on' : 'off';
72
- }
73
-
74
- // Stamp the header bar lazily — `this.ensure('bar')` clones the
75
- // blueprint into the light DOM the first time it's called.
76
- this.#bar = this.ensure('bar');
77
- this.#switch = this.#bar.querySelector('[data-demo-toggle-switch]');
78
- this.#label = this.#bar.querySelector('[data-demo-toggle-label]');
79
-
80
- if (!this.#bound) {
81
- this.#bound = true;
82
- this.#switch.addEventListener('change', this.#onSwitchChange);
83
- }
84
- }
85
-
86
- disconnected() {
87
- if (this.#switch) {
88
- this.#switch.removeEventListener('change', this.#onSwitchChange);
89
- }
90
- this.#bar = null;
91
- this.#switch = null;
92
- this.#label = null;
93
- this.#bound = false;
94
- }
95
-
96
- render() {
97
- if (!this.#bar) return;
98
- const on = this.state === 'on';
99
-
100
- // Sync the embedded switch to the host's state. checked is a
101
- // reflected property; the assignment fires no event because
102
- // syncValue() short-circuits when the next state matches.
103
- if (this.#switch.checked !== on) {
104
- this.#switch.checked = on;
105
- }
106
-
107
- if (this.#label) {
108
- this.#label.textContent = on ? this.labelOn : this.labelOff;
109
- }
110
- }
111
-
112
- /**
113
- * Public toggle method — flips the host between on and off and emits
114
- * a `change` event. Mirrors the click-on-switch path so consumers
115
- * can drive the state from outside without touching the embedded
116
- * switch directly.
117
- */
118
- toggle() {
119
- this.state = (this.state === 'on') ? 'off' : 'on';
120
- this.dispatchEvent(new CustomEvent('change', {
121
- bubbles: true,
122
- detail: { state: this.state },
123
- }));
124
- }
125
-
126
- #onSwitchChange = (e) => {
127
- // The embedded <switch-ui> fires a bubbling `change`. Stop it at the
128
- // host boundary — we re-dispatch our own `change` with detail.state
129
- // so consumers see exactly one event per toggle, not the inner
130
- // switch's bare event AND our annotated one.
131
- e.stopPropagation();
132
- const next = this.#switch.checked ? 'on' : 'off';
133
- if (next === this.state) return;
134
- this.state = next;
135
- this.dispatchEvent(new CustomEvent('change', {
136
- bubbles: true,
137
- detail: { state: this.state },
138
- }));
139
- };
140
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIDemoToggle } from './class.js';
141
14
 
142
- customElements.define('demo-toggle-ui', UIDemoToggle);
15
+ defineIfFree('demo-toggle-ui', UIDemoToggle);
143
16
 
144
17
  export { UIDemoToggle };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Non-side-effect class export for `<description-list-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/description-list`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <description-list-ui> — Semantic dl/dt/dd wrapper for key-value metadata.
16
+ *
17
+ * Pure layout component. Renders terms and descriptions in a grid.
18
+ *
19
+ * Declarative use (recommended — preserves semantics for SSR + AT):
20
+ * <description-list-ui>
21
+ * <dt>Status</dt><dd>Active</dd>
22
+ * <dt>Plan</dt><dd>Pro</dd>
23
+ * </description-list-ui>
24
+ *
25
+ * Programmatic use:
26
+ * <description-list-ui
27
+ * items='[{"term":"Status","description":"Active"}]'></description-list-ui>
28
+ *
29
+ * Props:
30
+ * layout — "stacked" (term above, default) | "inline" (term : value on one row)
31
+ * align — "start" (default) | "between" (space-between for inline layout)
32
+ * items — optional JSON array of {term, description} pairs
33
+ */
34
+
35
+ import { UIElement } from '../../core/element.js';
36
+
37
+ export class UIDescriptionList extends UIElement {
38
+ static properties = {
39
+ layout: { type: String, default: 'stacked', reflect: true },
40
+ align: { type: String, default: 'start', reflect: true },
41
+ };
42
+
43
+ static template = () => null;
44
+
45
+ connected() {
46
+ // ARIA 1.2: list role requires listitem children, but <dt>/<dd>
47
+ // aren't listitems. group role is the accurate fit for a
48
+ // labeled-pairs grouping.
49
+ this.setAttribute('role', 'group');
50
+ }
51
+
52
+ render() {
53
+ const items = this.#resolveItems();
54
+ if (!items.length) return; // preserve declarative children
55
+
56
+ this.innerHTML = items.map(({ term, description }) => `
57
+ <dt data-dl-term>${this.#escape(term)}</dt>
58
+ <dd data-dl-desc>${this.#escape(description)}</dd>
59
+ `).join('');
60
+ }
61
+
62
+ #resolveItems() {
63
+ if (Array.isArray(this._items) && this._items.length) return this._items;
64
+ const attr = this.getAttribute('items');
65
+ if (attr) {
66
+ try {
67
+ const parsed = JSON.parse(attr);
68
+ if (Array.isArray(parsed)) return parsed;
69
+ } catch { /* fall through */ }
70
+ }
71
+ return [];
72
+ }
73
+
74
+ set items(v) {
75
+ this._items = Array.isArray(v) ? v : [];
76
+ this.render();
77
+ }
78
+
79
+ get items() {
80
+ return this._items || [];
81
+ }
82
+
83
+ #escape(s) {
84
+ return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
85
+ }
86
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `<description-list-ui>` — Semantic key-value list (dl/dt/dd). Preserves native HTML semantics for screen readers and SSR. Layout supports stacked (default) or inline.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/description-list
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 UIDescriptionList extends UIElement {
15
+ /** Optional JSON array of {term, description} — alternative to declarative <dt>/<dd> children */
16
+ items: unknown[];
17
+ /** Alignment for inline layout — between = term left, value right. */
18
+ align: 'start' | 'between';
19
+ /** stacked: term above description. inline: term and description on one row. */
20
+ layout: 'stacked' | 'inline';
21
+ }
@@ -1,76 +1,17 @@
1
1
  /**
2
- * <description-list-ui>Semantic dl/dt/dd wrapper for key-value metadata.
2
+ * `<description-list-ui>`auto-registers the tag on import.
3
3
  *
4
- * Pure layout component. Renders terms and descriptions in a grid.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
5
6
  *
6
- * Declarative use (recommended preserves semantics for SSR + AT):
7
- * <description-list-ui>
8
- * <dt>Status</dt><dd>Active</dd>
9
- * <dt>Plan</dt><dd>Pro</dd>
10
- * </description-list-ui>
7
+ * import { UIDescriptionList } from '@adia-ai/web-components/components/description-list/class';
11
8
  *
12
- * Programmatic use:
13
- * <description-list-ui
14
- * items='[{"term":"Status","description":"Active"}]'></description-list-ui>
15
- *
16
- * Props:
17
- * layout — "stacked" (term above, default) | "inline" (term : value on one row)
18
- * align — "start" (default) | "between" (space-between for inline layout)
19
- * items — optional JSON array of {term, description} pairs
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
20
10
  */
21
11
 
22
- import { UIElement } from '../../core/element.js';
23
-
24
- class UIDescriptionList extends UIElement {
25
- static properties = {
26
- layout: { type: String, default: 'stacked', reflect: true },
27
- align: { type: String, default: 'start', reflect: true },
28
- };
29
-
30
- static template = () => null;
31
-
32
- connected() {
33
- // ARIA 1.2: list role requires listitem children, but <dt>/<dd>
34
- // aren't listitems. group role is the accurate fit for a
35
- // labeled-pairs grouping.
36
- this.setAttribute('role', 'group');
37
- }
38
-
39
- render() {
40
- const items = this.#resolveItems();
41
- if (!items.length) return; // preserve declarative children
42
-
43
- this.innerHTML = items.map(({ term, description }) => `
44
- <dt data-dl-term>${this.#escape(term)}</dt>
45
- <dd data-dl-desc>${this.#escape(description)}</dd>
46
- `).join('');
47
- }
48
-
49
- #resolveItems() {
50
- if (Array.isArray(this._items) && this._items.length) return this._items;
51
- const attr = this.getAttribute('items');
52
- if (attr) {
53
- try {
54
- const parsed = JSON.parse(attr);
55
- if (Array.isArray(parsed)) return parsed;
56
- } catch { /* fall through */ }
57
- }
58
- return [];
59
- }
60
-
61
- set items(v) {
62
- this._items = Array.isArray(v) ? v : [];
63
- this.render();
64
- }
65
-
66
- get items() {
67
- return this._items || [];
68
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIDescriptionList } from './class.js';
69
14
 
70
- #escape(s) {
71
- return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
72
- }
73
- }
15
+ defineIfFree('description-list-ui', UIDescriptionList);
74
16
 
75
- customElements.define('description-list-ui', UIDescriptionList);
76
17
  export { UIDescriptionList };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Non-side-effect class export for `<divider-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/divider`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <divider-ui></divider-ui>
16
+ * <divider-ui label="or"></divider-ui>
17
+ * <divider-ui vertical></divider-ui>
18
+ *
19
+ * Horizontal or vertical divider with optional label.
20
+ * Renders as a simple line, or a line broken by centered text.
21
+ */
22
+
23
+ import { UIElement } from '../../core/element.js';
24
+
25
+ export class UIDivider extends UIElement {
26
+ static properties = {
27
+ label: { type: String, default: '', reflect: true },
28
+ vertical: { type: Boolean, default: false, reflect: true },
29
+ };
30
+
31
+ static template = () => null;
32
+
33
+ connected() {
34
+ this.setAttribute('role', 'separator');
35
+ }
36
+
37
+ render() {
38
+ if (this.vertical) {
39
+ this.setAttribute('aria-orientation', 'vertical');
40
+ } else {
41
+ this.removeAttribute('aria-orientation');
42
+ }
43
+
44
+ if (this.label) {
45
+ let span = this.querySelector('[slot="label"]');
46
+ if (!span) {
47
+ span = document.createElement('span');
48
+ span.setAttribute('slot', 'label');
49
+ this.appendChild(span);
50
+ }
51
+ span.textContent = this.label;
52
+ } else {
53
+ const span = this.querySelector('[slot="label"]');
54
+ if (span) span.remove();
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `<divider-ui>` — Horizontal or vertical divider with optional label.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/divider
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 UIDivider extends UIElement {
15
+ /** Center label text */
16
+ label: string;
17
+ /** Vertical orientation */
18
+ vertical: boolean;
19
+ }
@@ -1,47 +1,17 @@
1
1
  /**
2
- * <divider-ui></divider-ui>
3
- * <divider-ui label="or"></divider-ui>
4
- * <divider-ui vertical></divider-ui>
2
+ * `<divider-ui>` — auto-registers the tag on import.
5
3
  *
6
- * Horizontal or vertical divider with optional label.
7
- * Renders as a simple line, or a line broken by centered text.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UIDivider } from '@adia-ai/web-components/components/divider/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
8
10
  */
9
11
 
10
- import { UIElement } from '../../core/element.js';
11
-
12
- class UIDivider extends UIElement {
13
- static properties = {
14
- label: { type: String, default: '', reflect: true },
15
- vertical: { type: Boolean, default: false, reflect: true },
16
- };
17
-
18
- static template = () => null;
19
-
20
- connected() {
21
- this.setAttribute('role', 'separator');
22
- }
23
-
24
- render() {
25
- if (this.vertical) {
26
- this.setAttribute('aria-orientation', 'vertical');
27
- } else {
28
- this.removeAttribute('aria-orientation');
29
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIDivider } from './class.js';
30
14
 
31
- if (this.label) {
32
- let span = this.querySelector('[slot="label"]');
33
- if (!span) {
34
- span = document.createElement('span');
35
- span.setAttribute('slot', 'label');
36
- this.appendChild(span);
37
- }
38
- span.textContent = this.label;
39
- } else {
40
- const span = this.querySelector('[slot="label"]');
41
- if (span) span.remove();
42
- }
43
- }
44
- }
45
- customElements.define('divider-ui', UIDivider);
15
+ defineIfFree('divider-ui', UIDivider);
46
16
 
47
17
  export { UIDivider };