@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,174 @@
1
+ /**
2
+ * UIElement — light-DOM reactive base class.
3
+ *
4
+ * Every primitive in `@adia-ai/web-components` extends this (or `UIFormElement`
5
+ * for form-bearing primitives). Provides signal-backed property reactivity,
6
+ * lifecycle hooks (`connected`/`render`/`updated`/`disconnected`), and
7
+ * tagged-template rendering.
8
+ *
9
+ * @see ../USAGE.md#lifecycle
10
+ * @see ../USAGE.md#property-reactivity-signal-backed
11
+ */
12
+
13
+ import type { ReadonlySignal, Signal } from './signals.js';
14
+ import type { TemplateResult } from './template.js';
15
+
16
+ /** Property declaration in a component's `static properties = { … }` map. */
17
+ export interface PropertyConfig<T = unknown> {
18
+ /** Coercion target — `Boolean`, `Number`, `String`, or custom. */
19
+ type?: BooleanConstructor | NumberConstructor | StringConstructor | (new (...args: unknown[]) => T);
20
+ /** Initial value. Defaults to `undefined`. */
21
+ default?: T;
22
+ /** Mirror property changes to an HTML attribute. */
23
+ reflect?: boolean;
24
+ /** Custom attribute name. Default: kebab-case of property key. */
25
+ attribute?: string;
26
+ }
27
+
28
+ /** Map of property name → config. The shape consumed by `static properties`. */
29
+ export type PropertiesMap = Record<string, PropertyConfig>;
30
+
31
+ /** Trait name + config tuple passed via `static traits`. */
32
+ export type TraitDeclaration = string | { name: string; [opt: string]: unknown };
33
+
34
+ /** Map of slot name → markup string. Consumed by `static parts`. */
35
+ export type PartsMap = Record<string, string>;
36
+
37
+ /**
38
+ * Light-DOM reactive base class. Subclass to author a primitive.
39
+ *
40
+ * @example
41
+ * class MyWidget extends UIElement {
42
+ * static properties = { label: { type: String, default: '' } };
43
+ * render() { this.textContent = this.label; }
44
+ * }
45
+ * customElements.define('my-widget', MyWidget);
46
+ */
47
+ export class UIElement extends HTMLElement {
48
+ /**
49
+ * Property declarations — signal-backed getters/setters wired by the
50
+ * constructor. Override in subclasses.
51
+ */
52
+ static properties: PropertiesMap;
53
+
54
+ /** Trait declarations — applied during `connectedCallback`. */
55
+ static traits: readonly TraitDeclaration[];
56
+
57
+ /** Slot blueprints used by `ensure(slotName)`. */
58
+ static parts?: PartsMap;
59
+
60
+ /** Stylesheets to adopt onto the document on first render. */
61
+ static styles?: CSSStyleSheet | readonly CSSStyleSheet[];
62
+
63
+ /**
64
+ * Pure-function template — called inside the host's render effect. Reading
65
+ * `this.foo` inside subscribes the effect to the `foo` signal.
66
+ *
67
+ * Override OR return `null` and update DOM imperatively in `render()`.
68
+ */
69
+ static template: <T extends UIElement>(host: T) => TemplateResult | null;
70
+
71
+ /** Observed attribute names — derived from `static properties`. */
72
+ static readonly observedAttributes: readonly string[];
73
+
74
+ /** ElementInternals — attached in the constructor; carries form state etc. */
75
+ readonly internals: ElementInternals;
76
+
77
+ /**
78
+ * Setup hook — called after construction + insertion, before the first render
79
+ * effect installs. Set up listeners on document / external targets here.
80
+ *
81
+ * Override in subclasses; default is a no-op. Runs inside `untracked()` so
82
+ * reads don't leak subscriptions to outer effects.
83
+ */
84
+ connected(): void;
85
+
86
+ /**
87
+ * Imperative update hook — called every time any property signal mutates.
88
+ * Reading `this.foo` here subscribes the effect to `foo`.
89
+ *
90
+ * Override in subclasses; default is a no-op.
91
+ */
92
+ render(): void;
93
+
94
+ /**
95
+ * Post-render hook — called after `render()`. `changed` is a map of every
96
+ * property that mutated this tick, keyed by property name with old value.
97
+ *
98
+ * Override in subclasses; default is a no-op.
99
+ */
100
+ updated(changed: ReadonlyMap<string, unknown>): void;
101
+
102
+ /**
103
+ * Teardown hook — called on element removal. Clean up listeners + intervals
104
+ * + observers here.
105
+ *
106
+ * Override in subclasses; default is a no-op.
107
+ */
108
+ disconnected(): void;
109
+
110
+ /**
111
+ * Error hook — called when the host's render effect throws. Receives the
112
+ * thrown value. Default behavior: rethrow.
113
+ */
114
+ onError?(err: unknown): void;
115
+
116
+ // ── Standard custom-element callbacks (overridable but rarely needed) ──
117
+
118
+ connectedCallback(): void;
119
+ disconnectedCallback(): void;
120
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
121
+
122
+ // ── Convenience helpers ──
123
+
124
+ /**
125
+ * Create a local signal bound to this element's lifetime. Disposed on
126
+ * `disconnectedCallback`.
127
+ */
128
+ signal<T>(initial: T): Signal<T>;
129
+
130
+ /**
131
+ * Get or stamp a slot child by name. If a `[slot="name"]` child exists,
132
+ * returns it; otherwise stamps the blueprint from `static parts[name]`,
133
+ * appends it, and returns the new node.
134
+ */
135
+ ensure(slotName: string): Element | null;
136
+
137
+ /** Remove the `[slot="name"]` child if present. */
138
+ drop(slotName: string): void;
139
+
140
+ /**
141
+ * Keyed-reconcile a parent's children against `items`. Used internally by
142
+ * the `repeat` directive; consumers rarely call directly.
143
+ */
144
+ reconcile<T>(
145
+ parent: Element,
146
+ items: readonly T[],
147
+ keyFn: (item: T, i: number) => string | number,
148
+ stampFn: (item: T, i: number, existing: Element | null) => Element,
149
+ ): void;
150
+
151
+ // ── Controller pattern (optional advanced) ──
152
+
153
+ /** Set the controller; calls connect/disconnect on it through lifecycle. */
154
+ set controller(c: UIController | null);
155
+ get controller(): UIController | null;
156
+
157
+ /**
158
+ * Factory — create an instance of this element with the given props applied.
159
+ * Tag must already be registered.
160
+ */
161
+ static create<T extends typeof UIElement>(
162
+ this: T,
163
+ props?: Partial<InstanceType<T>>,
164
+ ): InstanceType<T>;
165
+ }
166
+
167
+ /**
168
+ * Controller — optional pluggable behavior attached to a UIElement via
169
+ * `element.controller = …`. Lifecycle mirrors the host.
170
+ */
171
+ export interface UIController {
172
+ connect?(host: UIElement): void;
173
+ disconnect?(host: UIElement): void;
174
+ }
package/core/form.d.ts ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * UIFormElement — base class for form-bearing primitives.
3
+ *
4
+ * Extends UIElement with `ElementInternals` form participation, value sync,
5
+ * constraint validation, and the standard validity surface. 15 primitives
6
+ * extend this: input, select, slider, switch, segmented, check, radio,
7
+ * textarea, range, color-picker, rating, option-card, search, otp-input, code.
8
+ *
9
+ * @see ../USAGE.md#form-participation
10
+ */
11
+
12
+ import { UIElement, type PropertiesMap } from './element.js';
13
+
14
+ /**
15
+ * Form-participating reactive base class. Subclass to author a form-bearing
16
+ * primitive. `static formAssociated = true` is already set; consumer subclasses
17
+ * shouldn't override it.
18
+ *
19
+ * @example
20
+ * class MyField extends UIFormElement {
21
+ * static properties = {
22
+ * ...UIFormElement.properties,
23
+ * maxItems: { type: Number, default: 10 },
24
+ * };
25
+ * }
26
+ */
27
+ export class UIFormElement extends UIElement {
28
+ /** Marks the element as form-associated. Do not override. */
29
+ static readonly formAssociated: true;
30
+
31
+ /**
32
+ * Base property set inherited by every form-bearing primitive. Subclasses
33
+ * spread this into their own `static properties`.
34
+ */
35
+ static properties: PropertiesMap & {
36
+ name: { type: StringConstructor; default: ''; reflect: true };
37
+ value: { type: StringConstructor; default: ''; reflect: true };
38
+ disabled: { type: BooleanConstructor; default: false; reflect: true };
39
+ required: { type: BooleanConstructor; default: false; reflect: true };
40
+ readonly: { type: BooleanConstructor; default: false; reflect: true };
41
+ error: { type: StringConstructor; default: ''; reflect: true };
42
+ hint: { type: StringConstructor; default: ''; reflect: true };
43
+ pattern: { type: StringConstructor; default: ''; reflect: true };
44
+ minlength: { type: NumberConstructor; default: null; reflect: true };
45
+ maxlength: { type: NumberConstructor; default: null; reflect: true };
46
+ };
47
+
48
+ // ── Inherited UIFormElement properties (typed) ──
49
+ /** Form field name — submitted as key in FormData. */
50
+ name: string;
51
+ /** Submitted value. Subclasses may narrow the type (e.g. `slider-ui` to `number`). */
52
+ value: string;
53
+ /** Disabled state — reflected, blocks interaction. */
54
+ disabled: boolean;
55
+ /** Required state — checked against value emptiness on validation. */
56
+ required: boolean;
57
+ /** Read-only state — reflected, blocks user input but submits value. */
58
+ readonly: boolean;
59
+ /** Current error message — surfaces via `:invalid` + reportValidity. */
60
+ error: string;
61
+ /** Hint text — usually rendered below the control. */
62
+ hint: string;
63
+ /** Regex pattern — value must match if set. */
64
+ pattern: string;
65
+ /** Minimum length — `null` to disable. */
66
+ minlength: number | null;
67
+ /** Maximum length — `null` to disable. */
68
+ maxlength: number | null;
69
+
70
+ // ── ElementInternals accessors ──
71
+
72
+ /** The form this element is associated with, or `null` if not in a form. */
73
+ readonly form: HTMLFormElement | null;
74
+ /** Labels associated with this element via `for` / wrapping. */
75
+ readonly labels: NodeList;
76
+ /** Current validity state. */
77
+ readonly validity: ValidityState;
78
+ /** Localized validation message. */
79
+ readonly validationMessage: string;
80
+ /** Whether the element will be validated when its form is submitted. */
81
+ readonly willValidate: boolean;
82
+
83
+ /** Returns true if the element passes all constraint validations. */
84
+ checkValidity(): boolean;
85
+
86
+ /** Like `checkValidity()` but also surfaces error UI if invalid. */
87
+ reportValidity(): boolean;
88
+
89
+ // ── Manual validation control ──
90
+
91
+ /**
92
+ * Run constraint validation against the current value. Returns true if valid.
93
+ * Sets `error` + surfaces UI if invalid.
94
+ */
95
+ validate(): boolean;
96
+
97
+ /** Mark the element invalid with a custom error message. */
98
+ setInvalid(message: string): void;
99
+
100
+ /** Clear the invalid state. */
101
+ setValid(): void;
102
+
103
+ /**
104
+ * Update the form-submission value + run constraint checks. Called internally
105
+ * on input/change; consumers rarely call directly.
106
+ */
107
+ syncValue(value: string): void;
108
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Core types — re-exports the public API surface from `core/`.
3
+ *
4
+ * @see ../USAGE.md
5
+ */
6
+
7
+ export * from './signals.js';
8
+ export * from './template.js';
9
+ export * from './element.js';
10
+ export * from './form.js';
11
+ export * from './register.js';
package/core/index.js CHANGED
@@ -16,6 +16,7 @@ export * from './element.js';
16
16
  export * from './form.js';
17
17
  export * from './signals.js';
18
18
  export * from './template.js';
19
+ export * from './register.js';
19
20
  export * from './controller.js';
20
21
  export * from './provider.js';
21
22
  export * from './anchor.js';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Custom-element registration helpers.
3
+ *
4
+ * @see ../USAGE.md#registration--auto-vs-explicit
5
+ */
6
+
7
+ /**
8
+ * Register a custom element. Same semantics as `customElements.define` — throws
9
+ * if `tagName` is already registered.
10
+ */
11
+ export function register(tagName: string, ctor: CustomElementConstructor): void;
12
+
13
+ /**
14
+ * Register a custom element only if the tag isn't already taken. Useful when
15
+ * multiple sources may try to register the same tag (e.g. when a host page
16
+ * imports the AdiaUI bundle AND a downstream consumer imports per-component
17
+ * subpaths). Without this, the second `customElements.define` throws.
18
+ *
19
+ * Returns `true` if registration happened, `false` if the tag was already
20
+ * registered.
21
+ */
22
+ export function defineIfFree(tagName: string, ctor: CustomElementConstructor): boolean;
23
+
24
+ /** Returns true if the given tag is already registered. */
25
+ export function isRegistered(tagName: string): boolean;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Custom-element registration helpers.
3
+ *
4
+ * The package's components auto-register their tags at the bottom of each
5
+ * component `.js` file (the de-facto web-components convention). These
6
+ * helpers give consumers controllable alternatives:
7
+ *
8
+ * - `register(tagName, ctor)` — direct alias for `customElements.define`.
9
+ * No magic; provided so consumers can write the registration call without
10
+ * importing the constructor globally.
11
+ *
12
+ * - `defineIfFree(tagName, ctor)` — no-op if the tag is already registered.
13
+ * Use this when multiple packages may try to register the same tag (e.g.
14
+ * when a host page imports the AdiaUI bundle AND a downstream consumer
15
+ * also imports per-component subpaths). Without this, the second
16
+ * `customElements.define` throws `NotSupportedError`.
17
+ *
18
+ * @see ../USAGE.md#registration--auto-vs-explicit
19
+ */
20
+
21
+ /**
22
+ * Register a custom element. Same semantics as `customElements.define`;
23
+ * throws if `tagName` is already registered.
24
+ *
25
+ * @param {string} tagName The kebab-case tag name (e.g. `'my-slider'`)
26
+ * @param {CustomElementConstructor} ctor The class to register
27
+ */
28
+ export function register(tagName, ctor) {
29
+ customElements.define(tagName, ctor);
30
+ }
31
+
32
+ /**
33
+ * Register a custom element only if the tag isn't already taken. Useful for
34
+ * conflict-safe registration when multiple sources may want to register the
35
+ * same tag.
36
+ *
37
+ * Returns `true` if registration happened, `false` if the tag was already
38
+ * registered.
39
+ *
40
+ * @param {string} tagName The kebab-case tag name
41
+ * @param {CustomElementConstructor} ctor The class to register
42
+ * @returns {boolean}
43
+ */
44
+ export function defineIfFree(tagName, ctor) {
45
+ if (customElements.get(tagName)) return false;
46
+ customElements.define(tagName, ctor);
47
+ return true;
48
+ }
49
+
50
+ /**
51
+ * Check whether a tag is already registered.
52
+ *
53
+ * @param {string} tagName
54
+ * @returns {boolean}
55
+ */
56
+ export function isRegistered(tagName) {
57
+ return Boolean(customElements.get(tagName));
58
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Reactive signals — the primitive that UIElement's property system is built on.
3
+ *
4
+ * @see ../USAGE.md#property-reactivity-signal-backed
5
+ */
6
+
7
+ /** Read-only signal. Reading `.value` inside an `effect()` subscribes that effect. */
8
+ export interface ReadonlySignal<T> {
9
+ readonly value: T;
10
+ /** Read without creating a subscription. */
11
+ peek(): T;
12
+ }
13
+
14
+ /** Mutable signal. Writing `.value` notifies all subscribers. */
15
+ export interface Signal<T> extends ReadonlySignal<T> {
16
+ value: T;
17
+ }
18
+
19
+ /** Computed signal — derived from other signals; recomputes lazily. */
20
+ export type ComputedSignal<T> = ReadonlySignal<T>;
21
+
22
+ /** Effect options. */
23
+ export interface EffectOptions {
24
+ /** Host tag name for diagnostic logging. */
25
+ host?: string;
26
+ /** Called when the effect body throws. Receives the error. */
27
+ onError?: ((err: unknown) => void) | null;
28
+ }
29
+
30
+ /** Cleanup function returned by `effect()`. Call to dispose the subscription. */
31
+ export type EffectDisposer = () => void;
32
+
33
+ /**
34
+ * Create a mutable signal. Reading `.value` inside an `effect()` subscribes it.
35
+ *
36
+ * @example
37
+ * const count = signal(0);
38
+ * effect(() => console.log(count.value)); // subscribes
39
+ * count.value = 1; // logs 1
40
+ */
41
+ export function signal<T>(initial: T): Signal<T>;
42
+ export function signal<T = undefined>(): Signal<T | undefined>;
43
+
44
+ /**
45
+ * Create a computed signal — re-derives when any dependency changes. Lazy:
46
+ * recomputes only when read.
47
+ *
48
+ * @example
49
+ * const a = signal(2);
50
+ * const b = signal(3);
51
+ * const sum = computed(() => a.value + b.value);
52
+ * sum.value; // 5
53
+ */
54
+ export function computed<T>(fn: () => T): ComputedSignal<T>;
55
+
56
+ /**
57
+ * Run `fn` inside a reactive context. Re-runs when any signal read during the
58
+ * last run changes. Returns a disposer.
59
+ *
60
+ * @example
61
+ * const dispose = effect(() => console.log(count.value));
62
+ * // later
63
+ * dispose();
64
+ */
65
+ export function effect(fn: () => void, opts?: EffectOptions): EffectDisposer;
66
+
67
+ /**
68
+ * Batch multiple signal mutations into one effect re-run. Useful for atomic
69
+ * updates that touch several signals.
70
+ *
71
+ * @example
72
+ * batch(() => {
73
+ * a.value = 1;
74
+ * b.value = 2;
75
+ * }); // effect runs once after both mutations
76
+ */
77
+ export function batch(fn: () => void): void;
78
+
79
+ /**
80
+ * Read signals inside `fn` without subscribing the surrounding effect.
81
+ *
82
+ * @example
83
+ * effect(() => {
84
+ * const snapshot = untracked(() => other.value); // does NOT subscribe
85
+ * console.log(active.value, snapshot); // only `active` subscribes
86
+ * });
87
+ */
88
+ export function untracked<T>(fn: () => T): T;
89
+
90
+ /** Type guard — true if `v` looks like a signal. */
91
+ export function isSignal(v: unknown): v is ReadonlySignal<unknown>;
92
+
93
+ /** Brand symbol — identifies signal objects. Exported for advanced introspection. */
94
+ export const SIGNAL: unique symbol;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Lightweight tagged-template rendering — `html`, `css`, `repeat`, `stamp`.
3
+ *
4
+ * Detects signal/function bound values and wraps them in `effect()` so the
5
+ * binding re-fires on dependency change. Static values bypass — see USAGE.md
6
+ * § property-binding-patterns for the eager-evaluation trap.
7
+ */
8
+
9
+ import type { ReadonlySignal } from './signals.js';
10
+
11
+ /** Result of an `html\`…\`` call — pass to `stamp()` to mount in a container. */
12
+ export interface TemplateResult {
13
+ readonly strings: TemplateStringsArray;
14
+ readonly values: readonly unknown[];
15
+ }
16
+
17
+ /**
18
+ * Tagged template for HTML — returns a `TemplateResult` that `stamp()` mounts.
19
+ *
20
+ * - `attr=${value}` — attribute binding (string-coerced, removed if null/false)
21
+ * - `.prop=${value}` — JS property binding (signal/function = reactive)
22
+ * - `@event=${handler}` — event listener binding
23
+ *
24
+ * @example
25
+ * html`<button-ui .disabled=${isLoading} @click=${onSave}>Save</button-ui>`
26
+ */
27
+ export function html(strings: TemplateStringsArray, ...values: unknown[]): TemplateResult;
28
+
29
+ /**
30
+ * Tagged template for CSS — returns a `CSSStyleSheet`. Use as `static styles =
31
+ * css\`…\`` on a component or feed to `document.adoptedStyleSheets`.
32
+ *
33
+ * @example
34
+ * const sheet = css`button { color: red; }`;
35
+ * document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
36
+ */
37
+ export function css(strings: TemplateStringsArray, ...values: unknown[]): CSSStyleSheet;
38
+
39
+ /**
40
+ * Mount or update a `TemplateResult` inside a container. Re-running with a
41
+ * different result with the same `strings` reuses the template; different
42
+ * `strings` re-mounts.
43
+ */
44
+ export function stamp(result: TemplateResult, container: Element): void;
45
+
46
+ /**
47
+ * Internal — disposes effects attached to template parts. You won't call this
48
+ * directly unless implementing a custom directive.
49
+ */
50
+ export function disposeParts(parts: readonly unknown[]): void;
51
+
52
+ /**
53
+ * Keyed list directive — minimal-ops re-render of dynamic lists. Reuses DOM
54
+ * elements across re-renders by `key`.
55
+ *
56
+ * @example
57
+ * html`<ul>${repeat(
58
+ * items.value,
59
+ * (item) => item.id,
60
+ * (item) => html`<li>${item.name}</li>`
61
+ * )}</ul>`
62
+ */
63
+ export function repeat<T>(
64
+ items: readonly T[],
65
+ keyFn: (item: T, index: number) => string | number,
66
+ tplFn: (item: T, index: number) => TemplateResult,
67
+ ): unknown;
68
+
69
+ /** Internal symbol — key-map storage on container nodes for `repeat()`. */
70
+ export const KEY_MAP: unique symbol;