@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.
- package/README.md +63 -24
- package/USAGE.md +584 -0
- package/components/calendar-picker/calendar-picker.d.ts +27 -0
- package/components/check/check.d.ts +30 -0
- package/components/code/code.d.ts +39 -0
- package/components/color-picker/color-picker.d.ts +37 -0
- package/components/index.js +1 -0
- package/components/input/input.d.ts +61 -0
- package/components/option-card/option-card.d.ts +30 -0
- package/components/otp-input/otp-input.d.ts +25 -0
- package/components/pane/pane.css +10 -0
- package/components/pane/pane.js +28 -4
- package/components/radio/radio.d.ts +28 -0
- package/components/range/range.d.ts +31 -0
- package/components/rating/rating.d.ts +33 -0
- package/components/search/search.d.ts +35 -0
- package/components/segmented/segmented.d.ts +24 -0
- package/components/select/select.d.ts +57 -0
- package/components/slider/slider.d.ts +31 -0
- package/components/switch/switch.d.ts +30 -0
- package/components/textarea/textarea.d.ts +31 -0
- package/components/toggle-scheme/toggle-scheme.a2ui.json +197 -0
- package/components/toggle-scheme/toggle-scheme.css +20 -0
- package/components/toggle-scheme/toggle-scheme.js +277 -0
- package/components/toggle-scheme/toggle-scheme.yaml +173 -0
- package/components/upload/upload.d.ts +27 -0
- package/core/element.d.ts +174 -0
- package/core/form.d.ts +108 -0
- package/core/index.d.ts +11 -0
- package/core/index.js +1 -0
- package/core/register.d.ts +25 -0
- package/core/register.js +58 -0
- package/core/signals.d.ts +94 -0
- package/core/template.d.ts +70 -0
- package/index.d.ts +161 -0
- package/package.json +21 -6
- 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
|
+
}
|
package/components/index.js
CHANGED
|
@@ -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
|
+
}
|
package/components/pane/pane.css
CHANGED
|
@@ -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
|
|
package/components/pane/pane.js
CHANGED
|
@@ -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
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|