@adia-ai/web-components 0.4.5 → 0.4.6

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 (37) hide show
  1. package/README.md +63 -24
  2. package/USAGE.md +584 -0
  3. package/components/calendar-picker/calendar-picker.d.ts +27 -0
  4. package/components/check/check.d.ts +30 -0
  5. package/components/code/code.d.ts +39 -0
  6. package/components/color-picker/color-picker.d.ts +37 -0
  7. package/components/index.js +1 -0
  8. package/components/input/input.d.ts +61 -0
  9. package/components/option-card/option-card.d.ts +30 -0
  10. package/components/otp-input/otp-input.d.ts +25 -0
  11. package/components/pane/pane.css +10 -0
  12. package/components/pane/pane.js +28 -4
  13. package/components/radio/radio.d.ts +28 -0
  14. package/components/range/range.d.ts +31 -0
  15. package/components/rating/rating.d.ts +33 -0
  16. package/components/search/search.d.ts +35 -0
  17. package/components/segmented/segmented.d.ts +24 -0
  18. package/components/select/select.d.ts +57 -0
  19. package/components/slider/slider.d.ts +31 -0
  20. package/components/switch/switch.d.ts +30 -0
  21. package/components/textarea/textarea.d.ts +31 -0
  22. package/components/toggle-scheme/toggle-scheme.a2ui.json +197 -0
  23. package/components/toggle-scheme/toggle-scheme.css +20 -0
  24. package/components/toggle-scheme/toggle-scheme.js +277 -0
  25. package/components/toggle-scheme/toggle-scheme.yaml +173 -0
  26. package/components/upload/upload.d.ts +27 -0
  27. package/core/element.d.ts +174 -0
  28. package/core/form.d.ts +108 -0
  29. package/core/index.d.ts +11 -0
  30. package/core/index.js +1 -0
  31. package/core/register.d.ts +25 -0
  32. package/core/register.js +58 -0
  33. package/core/signals.d.ts +94 -0
  34. package/core/template.d.ts +70 -0
  35. package/index.d.ts +161 -0
  36. package/package.json +21 -6
  37. package/traits/CATEGORIES.md +1 -1
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `<color-picker-ui>` — Color picker with hex / rgb / hsl / oklch formats.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/color-picker
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'oklch';
10
+
11
+ export interface ColorPickerChangeEventDetail {
12
+ value: string;
13
+ format: ColorFormat;
14
+ }
15
+ export type ColorPickerChangeEvent = CustomEvent<ColorPickerChangeEventDetail>;
16
+ export type ColorPickerInputEvent = CustomEvent<ColorPickerChangeEventDetail>;
17
+
18
+ export interface ColorPickerFormatChangeEventDetail {
19
+ format: ColorFormat;
20
+ }
21
+ export type ColorPickerFormatChangeEvent = CustomEvent<ColorPickerFormatChangeEventDetail>;
22
+
23
+ export class UIColorPicker extends UIFormElement {
24
+ /** Current color as a string in the active `format`. */
25
+ value: string;
26
+ /** Output format. */
27
+ format: ColorFormat;
28
+
29
+ addEventListener<K extends keyof HTMLElementEventMap>(
30
+ type: K,
31
+ listener: (this: UIColorPicker, ev: HTMLElementEventMap[K]) => unknown,
32
+ options?: boolean | AddEventListenerOptions,
33
+ ): void;
34
+ addEventListener(type: 'change', listener: (ev: ColorPickerChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
35
+ addEventListener(type: 'input', listener: (ev: ColorPickerInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
36
+ addEventListener(type: 'format-change', listener: (ev: ColorPickerFormatChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
37
+ }
@@ -87,6 +87,7 @@ export { UIEmbed } from './embed/embed.js';
87
87
  export { UIBlock } from './block/block.js';
88
88
  export { UIText } from './text/text.js';
89
89
  export { UIToggleGroup, UIToggleOption } from './toggle-group/toggle-group.js';
90
+ export { UIToggleScheme } from './toggle-scheme/toggle-scheme.js';
90
91
  export { UIDemoToggle } from './demo-toggle/demo-toggle.js';
91
92
  export { UIRichText } from './richtext/richtext.js';
92
93
  export { UIStream } from './stream/stream.js';
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `<input-ui>` — Text + email + password + number + tel + url + search input.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/input
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ /** Native HTML input types this primitive supports. */
10
+ export type UIInputType =
11
+ | 'text'
12
+ | 'email'
13
+ | 'password'
14
+ | 'number'
15
+ | 'tel'
16
+ | 'url'
17
+ | 'search';
18
+
19
+ export interface InputChangeEventDetail {
20
+ value: string;
21
+ }
22
+ export type InputChangeEvent = CustomEvent<InputChangeEventDetail>;
23
+ export type InputInputEvent = CustomEvent<InputChangeEventDetail>;
24
+
25
+ export class UIInput extends UIFormElement {
26
+ placeholder: string;
27
+ type: UIInputType;
28
+ label: string;
29
+ prefix: string;
30
+ suffix: string;
31
+ /** Raw mode — drops chrome (border, padding) for inline composition. */
32
+ raw: boolean;
33
+
34
+ // ── Number-mode properties (active when type="number") ──
35
+ /** Minimum value. `null` to disable. */
36
+ min: number | null;
37
+ /** Maximum value. `null` to disable. */
38
+ max: number | null;
39
+ /** Step size for stepper buttons + arrow keys. */
40
+ step: number;
41
+ /** Decimal precision (places); `null` to derive from step. */
42
+ precision: number | null;
43
+ /**
44
+ * BCP-47 locale tag for number formatting — e.g. `"de-DE"` / `"fr-FR"` /
45
+ * `"en-IN"`. Default empty = en-US (`.` decimal separator, no thousands
46
+ * grouping). `.value` stays canonical (`Number(v)` round-trips).
47
+ */
48
+ locale: string;
49
+
50
+ // ── Number-mode accessor ──
51
+ /** Parsed numeric value. Returns `NaN` if value isn't a number. */
52
+ readonly valueAsNumber: number;
53
+
54
+ addEventListener<K extends keyof HTMLElementEventMap>(
55
+ type: K,
56
+ listener: (this: UIInput, ev: HTMLElementEventMap[K]) => unknown,
57
+ options?: boolean | AddEventListenerOptions,
58
+ ): void;
59
+ addEventListener(type: 'change', listener: (ev: InputChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
60
+ addEventListener(type: 'input', listener: (ev: InputInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
61
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `<option-card-ui>` — Radio-style card with heading + description + icon.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/option-card
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface OptionCardChangeEventDetail {
10
+ value: string;
11
+ checked: boolean;
12
+ }
13
+ export type OptionCardChangeEvent = CustomEvent<OptionCardChangeEventDetail>;
14
+
15
+ export class UIOptionCard extends UIFormElement {
16
+ /** Selected state — reflected; setting `checked=true` deselects siblings in the group. */
17
+ checked: boolean;
18
+ heading: string;
19
+ description: string;
20
+ icon: string;
21
+ /** Layout — `default` (vertical) / `horizontal` / `compact`. */
22
+ layout: 'default' | 'horizontal' | 'compact';
23
+
24
+ addEventListener<K extends keyof HTMLElementEventMap>(
25
+ type: K,
26
+ listener: (this: UIOptionCard, ev: HTMLElementEventMap[K]) => unknown,
27
+ options?: boolean | AddEventListenerOptions,
28
+ ): void;
29
+ addEventListener(type: 'change', listener: (ev: OptionCardChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
30
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `<otp-input-ui>` — Auto-focus-advancing one-time-passcode input (6 digits by default).
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/otp-input
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface OtpInputEventDetail {
10
+ /** Combined digits as a string (e.g. `"123456"`). */
11
+ value: string;
12
+ }
13
+ export type OtpInputEvent = CustomEvent<OtpInputEventDetail>;
14
+
15
+ export class UIOtpInput extends UIFormElement {
16
+ /** Number of digit slots. */
17
+ length: number;
18
+
19
+ addEventListener<K extends keyof HTMLElementEventMap>(
20
+ type: K,
21
+ listener: (this: UIOtpInput, ev: HTMLElementEventMap[K]) => unknown,
22
+ options?: boolean | AddEventListenerOptions,
23
+ ): void;
24
+ addEventListener(type: 'input', listener: (ev: OtpInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
25
+ }
@@ -54,6 +54,15 @@
54
54
  overflow: hidden;
55
55
  }
56
56
 
57
+ /* During an active drag-resize: kill all transitions so pointer-driven
58
+ width updates track 1:1 instead of interpolating through a consumer-
59
+ declared width transition (e.g. editor-shell's collapse animation).
60
+ Mirrors the admin-sidebar pattern. */
61
+ :scope[data-resizing] {
62
+ user-select: none;
63
+ transition: none;
64
+ }
65
+
57
66
  /* Side-aware border treatment.
58
67
  `leading` — pane sits at the leading edge of a horizontal row, so
59
68
  the only visual separator it needs is on its trailing
@@ -187,6 +196,7 @@
187
196
  cursor: col-resize;
188
197
  background: transparent;
189
198
  transition: background var(--pane-duration) var(--pane-easing);
199
+ touch-action: none;
190
200
  z-index: 1;
191
201
  }
192
202
 
@@ -48,6 +48,8 @@ class UIPane extends UIElement {
48
48
  #dragging = false;
49
49
  #startX = 0;
50
50
  #startW = 0;
51
+ #pointerId = null;
52
+ #prevDocCursor = '';
51
53
  #bound = false;
52
54
 
53
55
  connected() {
@@ -110,15 +112,30 @@ class UIPane extends UIElement {
110
112
  };
111
113
 
112
114
  // ── Resize ──
115
+ //
116
+ // Pointer capture + handle-level listeners (not document-level): keeps
117
+ // pointer events flowing to the grabber even when the cursor races past
118
+ // it, and works under touch. Cursor is locked at the documentElement
119
+ // level so it stays `col-resize` across the whole viewport during drag,
120
+ // not just over the 4px handle. CSS bypasses any width transition while
121
+ // `[data-resizing]` is set, so resizes track the pointer 1:1.
113
122
 
114
123
  #onResizeDown = (e) => {
124
+ if (!e.isPrimary) return;
115
125
  e.preventDefault();
116
126
  this.#dragging = true;
117
127
  this.#startX = e.clientX;
118
128
  this.#startW = this.getBoundingClientRect().width;
129
+ this.#pointerId = e.pointerId;
119
130
  this.setAttribute('data-resizing', '');
120
- document.addEventListener('pointermove', this.#onResizeMove);
121
- document.addEventListener('pointerup', this.#onResizeUp, { once: true });
131
+
132
+ try { this.#resizeEl.setPointerCapture(e.pointerId); } catch {}
133
+ this.#resizeEl.addEventListener('pointermove', this.#onResizeMove);
134
+ this.#resizeEl.addEventListener('pointerup', this.#onResizeUp, { once: true });
135
+ this.#resizeEl.addEventListener('pointercancel', this.#onResizeUp, { once: true });
136
+
137
+ this.#prevDocCursor = document.documentElement.style.cursor;
138
+ document.documentElement.style.cursor = 'col-resize';
122
139
  };
123
140
 
124
141
  #onResizeMove = (e) => {
@@ -134,16 +151,23 @@ class UIPane extends UIElement {
134
151
  };
135
152
 
136
153
  #onResizeUp = () => {
154
+ if (!this.#dragging) return;
137
155
  this.#dragging = false;
138
156
  this.removeAttribute('data-resizing');
139
- document.removeEventListener('pointermove', this.#onResizeMove);
157
+ try { this.#resizeEl?.releasePointerCapture(this.#pointerId); } catch {}
158
+ this.#pointerId = null;
159
+ this.#resizeEl?.removeEventListener('pointermove', this.#onResizeMove);
160
+ document.documentElement.style.cursor = this.#prevDocCursor;
140
161
  };
141
162
 
142
163
  disconnected() {
143
164
  this.removeEventListener('click', this.#onClick);
144
165
  this.removeEventListener('keydown', this.#onKey);
145
166
  this.#resizeEl?.removeEventListener('pointerdown', this.#onResizeDown);
146
- document.removeEventListener('pointermove', this.#onResizeMove);
167
+ this.#resizeEl?.removeEventListener('pointermove', this.#onResizeMove);
168
+ if (this.#dragging) {
169
+ document.documentElement.style.cursor = this.#prevDocCursor;
170
+ }
147
171
  this.#bound = false;
148
172
  }
149
173
  }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `<radio-ui>` — Radio button (boolean-semantic form control; group via shared name).
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/radio
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface RadioChangeEventDetail {
10
+ /** Submitted value (the radio's `value` attribute). */
11
+ value: string;
12
+ /** Current checked state. */
13
+ checked: boolean;
14
+ }
15
+ export type RadioChangeEvent = CustomEvent<RadioChangeEventDetail>;
16
+
17
+ export class UIRadio extends UIFormElement {
18
+ /** Checked state — reflected; setting `checked=true` deselects siblings in the group. */
19
+ checked: boolean;
20
+ label: string;
21
+
22
+ addEventListener<K extends keyof HTMLElementEventMap>(
23
+ type: K,
24
+ listener: (this: UIRadio, ev: HTMLElementEventMap[K]) => unknown,
25
+ options?: boolean | AddEventListenerOptions,
26
+ ): void;
27
+ addEventListener(type: 'change', listener: (ev: RadioChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
28
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `<range-ui>` — Range track with click-to-jump + drag.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/range
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface RangeChangeEventDetail {
10
+ value: number;
11
+ }
12
+ export type RangeChangeEvent = CustomEvent<RangeChangeEventDetail>;
13
+ export type RangeInputEvent = CustomEvent<RangeChangeEventDetail>;
14
+
15
+ export class UIRange extends UIFormElement {
16
+ /** Numeric value — overrides UIFormElement.value (which is String). */
17
+ value: number;
18
+ min: number;
19
+ max: number;
20
+ step: number;
21
+ label: string;
22
+ suffix: string;
23
+
24
+ addEventListener<K extends keyof HTMLElementEventMap>(
25
+ type: K,
26
+ listener: (this: UIRange, ev: HTMLElementEventMap[K]) => unknown,
27
+ options?: boolean | AddEventListenerOptions,
28
+ ): void;
29
+ addEventListener(type: 'change', listener: (ev: RangeChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
30
+ addEventListener(type: 'input', listener: (ev: RangeInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
31
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `<rating-ui>` — Star rating input (or other icon set).
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/rating
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface RatingChangeEventDetail {
10
+ value: number;
11
+ }
12
+ export type RatingChangeEvent = CustomEvent<RatingChangeEventDetail>;
13
+
14
+ export class UIRating extends UIFormElement {
15
+ /** Numeric rating value — overrides UIFormElement.value (which is String). */
16
+ value: number;
17
+ /** Maximum rating — number of icons rendered. */
18
+ max: number;
19
+ /** Phosphor icon name (default: `star`). */
20
+ icon: string;
21
+ /** Read-only mode (display only; no interaction). */
22
+ readonly: boolean;
23
+ /** Allow half-step values (0.5, 1.5, …). */
24
+ allowHalf: boolean;
25
+ size: 'sm' | 'md' | 'lg';
26
+
27
+ addEventListener<K extends keyof HTMLElementEventMap>(
28
+ type: K,
29
+ listener: (this: UIRating, ev: HTMLElementEventMap[K]) => unknown,
30
+ options?: boolean | AddEventListenerOptions,
31
+ ): void;
32
+ addEventListener(type: 'change', listener: (ev: RatingChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
33
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `<search-ui>` — Search input with debounce + clear button + Enter-to-search.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/search
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface SearchInputEventDetail {
10
+ value: string;
11
+ }
12
+ export type SearchInputEvent = CustomEvent<SearchInputEventDetail>;
13
+
14
+ export interface SearchEventDetail {
15
+ value: string;
16
+ }
17
+ /** Fired after debounce OR on Enter — your "do the search" trigger. */
18
+ export type SearchEvent = CustomEvent<SearchEventDetail>;
19
+
20
+ export class UISearch extends UIFormElement {
21
+ placeholder: string;
22
+ /** Debounce delay in ms before `search` event fires. */
23
+ debounce: number;
24
+
25
+ /** Programmatically focus the inner input. */
26
+ focus(): void;
27
+
28
+ addEventListener<K extends keyof HTMLElementEventMap>(
29
+ type: K,
30
+ listener: (this: UISearch, ev: HTMLElementEventMap[K]) => unknown,
31
+ options?: boolean | AddEventListenerOptions,
32
+ ): void;
33
+ addEventListener(type: 'input', listener: (ev: SearchInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
34
+ addEventListener(type: 'search', listener: (ev: SearchEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
35
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `<segmented-ui>` — Segmented control for 2-5 mutually-exclusive options.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/segmented
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface SegmentedChangeEventDetail {
10
+ value: string;
11
+ }
12
+ export type SegmentedChangeEvent = CustomEvent<SegmentedChangeEventDetail>;
13
+
14
+ export class UISegmented extends UIFormElement {
15
+ /** Selected segment's value. */
16
+ value: string;
17
+
18
+ addEventListener<K extends keyof HTMLElementEventMap>(
19
+ type: K,
20
+ listener: (this: UISegmented, ev: HTMLElementEventMap[K]) => unknown,
21
+ options?: boolean | AddEventListenerOptions,
22
+ ): void;
23
+ addEventListener(type: 'change', listener: (ev: SegmentedChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
24
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * `<select-ui>` — Custom-styled select / combobox / multi-select.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/select
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface SelectOption {
10
+ value: string;
11
+ label?: string;
12
+ icon?: string;
13
+ avatar?: string;
14
+ disabled?: boolean;
15
+ action?: string;
16
+ divider?: boolean;
17
+ }
18
+
19
+ export interface SelectChangeEventDetail {
20
+ value: string;
21
+ }
22
+ export type SelectChangeEvent = CustomEvent<SelectChangeEventDetail>;
23
+
24
+ export interface SelectActionEventDetail {
25
+ action: string;
26
+ }
27
+ export type SelectActionEvent = CustomEvent<SelectActionEventDetail>;
28
+
29
+ export class UISelect extends UIFormElement {
30
+ placeholder: string;
31
+ /** Open/closed reflected attribute — toggled by trigger click / keyboard. */
32
+ open: boolean;
33
+ label: string;
34
+ /** Leading icon name (Phosphor registry). */
35
+ icon: string;
36
+ /** Leading avatar URL or name. */
37
+ avatar: string;
38
+ multiple: boolean;
39
+ searchable: boolean;
40
+ /** Allow values not in the option list (combobox mode). */
41
+ freeText: boolean;
42
+ divider: boolean;
43
+
44
+ /**
45
+ * Dynamic option list. Setting `.options = [...]` stamps option elements at
46
+ * connection time + auto-syncs the listbox.
47
+ */
48
+ options: readonly SelectOption[];
49
+
50
+ addEventListener<K extends keyof HTMLElementEventMap>(
51
+ type: K,
52
+ listener: (this: UISelect, ev: HTMLElementEventMap[K]) => unknown,
53
+ options?: boolean | AddEventListenerOptions,
54
+ ): void;
55
+ addEventListener(type: 'change', listener: (ev: SelectChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
56
+ addEventListener(type: 'action', listener: (ev: SelectActionEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
57
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `<slider-ui>` — Single-handle slider for numeric input.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/slider
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface SliderChangeEventDetail {
10
+ value: number;
11
+ }
12
+ export type SliderChangeEvent = CustomEvent<SliderChangeEventDetail>;
13
+ export type SliderInputEvent = CustomEvent<SliderChangeEventDetail>;
14
+
15
+ export class UISlider extends UIFormElement {
16
+ /** Numeric value — overrides UIFormElement.value (which is String). */
17
+ value: number;
18
+ min: number;
19
+ max: number;
20
+ step: number;
21
+ label: string;
22
+ suffix: string;
23
+
24
+ addEventListener<K extends keyof HTMLElementEventMap>(
25
+ type: K,
26
+ listener: (this: UISlider, ev: HTMLElementEventMap[K]) => unknown,
27
+ options?: boolean | AddEventListenerOptions,
28
+ ): void;
29
+ addEventListener(type: 'change', listener: (ev: SliderChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
30
+ addEventListener(type: 'input', listener: (ev: SliderInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
31
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `<switch-ui>` — Toggle switch (boolean-semantic form control).
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/switch
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface SwitchChangeEventDetail {
10
+ /** Submitted value (defaults to `"on"` when checked). */
11
+ value: string;
12
+ /** Current checked state. */
13
+ checked: boolean;
14
+ }
15
+ export type SwitchChangeEvent = CustomEvent<SwitchChangeEventDetail>;
16
+
17
+ export class UISwitch extends UIFormElement {
18
+ /** Checked state — reflected, toggles on click. */
19
+ checked: boolean;
20
+ label: string;
21
+ /** Size — `sm` / `md` / `lg`. */
22
+ size: '' | 'sm' | 'md' | 'lg';
23
+
24
+ addEventListener<K extends keyof HTMLElementEventMap>(
25
+ type: K,
26
+ listener: (this: UISwitch, ev: HTMLElementEventMap[K]) => unknown,
27
+ options?: boolean | AddEventListenerOptions,
28
+ ): void;
29
+ addEventListener(type: 'change', listener: (ev: SwitchChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
30
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `<textarea-ui>` — Multi-line text input with Enter-submit semantic.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/textarea
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface TextareaChangeEventDetail {
10
+ value: string;
11
+ }
12
+ export type TextareaChangeEvent = CustomEvent<TextareaChangeEventDetail>;
13
+ export type TextareaInputEvent = CustomEvent<TextareaChangeEventDetail>;
14
+
15
+ export class UITextarea extends UIFormElement {
16
+ placeholder: string;
17
+ label: string;
18
+ rows: number;
19
+ /** CSS `resize` value — `none` / `vertical` (default) / `horizontal` / `both`. */
20
+ resize: 'none' | 'vertical' | 'horizontal' | 'both';
21
+
22
+ addEventListener<K extends keyof HTMLElementEventMap>(
23
+ type: K,
24
+ listener: (this: UITextarea, ev: HTMLElementEventMap[K]) => unknown,
25
+ options?: boolean | AddEventListenerOptions,
26
+ ): void;
27
+ addEventListener(type: 'change', listener: (ev: TextareaChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
28
+ addEventListener(type: 'input', listener: (ev: TextareaInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
29
+ /** Fired on Enter without Shift; user can `e.preventDefault()` to insert newline. */
30
+ addEventListener(type: 'submit', listener: (ev: Event) => unknown, options?: boolean | AddEventListenerOptions): void;
31
+ }