@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
@@ -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 };