@llui/components 0.0.5 → 0.0.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.
- package/dist/components/angle-slider.d.ts.map +1 -1
- package/dist/components/angle-slider.js +3 -1
- package/dist/components/carousel.d.ts +6 -6
- package/dist/components/carousel.d.ts.map +1 -1
- package/dist/components/carousel.js +10 -7
- package/dist/components/cascade-select.d.ts +1 -1
- package/dist/components/cascade-select.d.ts.map +1 -1
- package/dist/components/cascade-select.js +4 -1
- package/dist/components/clipboard.d.ts +1 -1
- package/dist/components/clipboard.d.ts.map +1 -1
- package/dist/components/clipboard.js +4 -1
- package/dist/components/color-picker.d.ts +4 -4
- package/dist/components/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker.js +7 -4
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +4 -2
- package/dist/components/date-input.d.ts +1 -1
- package/dist/components/date-input.d.ts.map +1 -1
- package/dist/components/date-input.js +4 -1
- package/dist/components/date-picker.d.ts +14 -2
- package/dist/components/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker.js +27 -19
- package/dist/components/dialog.d.ts +1 -1
- package/dist/components/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +4 -2
- package/dist/components/drawer.d.ts +1 -1
- package/dist/components/drawer.d.ts.map +1 -1
- package/dist/components/drawer.js +4 -2
- package/dist/components/enter-view.d.ts +73 -0
- package/dist/components/enter-view.d.ts.map +1 -0
- package/dist/components/enter-view.js +51 -0
- package/dist/components/file-upload.d.ts +5 -4
- package/dist/components/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload.js +6 -2
- package/dist/components/floating-panel.d.ts +4 -4
- package/dist/components/floating-panel.d.ts.map +1 -1
- package/dist/components/floating-panel.js +7 -4
- package/dist/components/form.d.ts +115 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +102 -0
- package/dist/components/hover-card.d.ts +0 -1
- package/dist/components/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card.js +0 -1
- package/dist/components/image-cropper.d.ts +1 -1
- package/dist/components/image-cropper.d.ts.map +1 -1
- package/dist/components/image-cropper.js +4 -1
- package/dist/components/in-view.d.ts +69 -0
- package/dist/components/in-view.d.ts.map +1 -0
- package/dist/components/in-view.js +51 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4 -0
- package/dist/components/navigation-menu.d.ts +1 -1
- package/dist/components/navigation-menu.d.ts.map +1 -1
- package/dist/components/navigation-menu.js +4 -1
- package/dist/components/number-input.d.ts +2 -2
- package/dist/components/number-input.d.ts.map +1 -1
- package/dist/components/number-input.js +5 -2
- package/dist/components/pagination.d.ts +3 -3
- package/dist/components/pagination.d.ts.map +1 -1
- package/dist/components/pagination.js +7 -4
- package/dist/components/password-input.d.ts.map +1 -1
- package/dist/components/password-input.js +8 -3
- package/dist/components/pin-input.d.ts.map +1 -1
- package/dist/components/pin-input.js +7 -4
- package/dist/components/popover.d.ts +1 -1
- package/dist/components/popover.d.ts.map +1 -1
- package/dist/components/popover.js +4 -2
- package/dist/components/progress.d.ts.map +1 -1
- package/dist/components/progress.js +2 -1
- package/dist/components/qr-code.d.ts +2 -2
- package/dist/components/qr-code.d.ts.map +1 -1
- package/dist/components/qr-code.js +5 -2
- package/dist/components/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group.js +3 -1
- package/dist/components/rating-group.d.ts.map +1 -1
- package/dist/components/rating-group.js +3 -1
- package/dist/components/scroll-area.d.ts +1 -0
- package/dist/components/scroll-area.d.ts.map +1 -1
- package/dist/components/scroll-area.js +1 -0
- package/dist/components/signature-pad.d.ts +3 -3
- package/dist/components/signature-pad.d.ts.map +1 -1
- package/dist/components/signature-pad.js +6 -3
- package/dist/components/slider.d.ts.map +1 -1
- package/dist/components/slider.js +3 -1
- package/dist/components/sortable.d.ts +106 -0
- package/dist/components/sortable.d.ts.map +1 -0
- package/dist/components/sortable.js +97 -0
- package/dist/components/splitter.d.ts.map +1 -1
- package/dist/components/splitter.js +3 -1
- package/dist/components/steps.d.ts +1 -1
- package/dist/components/steps.d.ts.map +1 -1
- package/dist/components/steps.js +4 -1
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +3 -1
- package/dist/components/tags-input.d.ts +3 -4
- package/dist/components/tags-input.d.ts.map +1 -1
- package/dist/components/tags-input.js +16 -11
- package/dist/components/theme-switch.d.ts +89 -0
- package/dist/components/theme-switch.d.ts.map +1 -0
- package/dist/components/theme-switch.js +96 -0
- package/dist/components/time-picker.d.ts +4 -4
- package/dist/components/time-picker.d.ts.map +1 -1
- package/dist/components/time-picker.js +7 -4
- package/dist/components/timer.d.ts +3 -3
- package/dist/components/timer.d.ts.map +1 -1
- package/dist/components/timer.js +6 -3
- package/dist/components/toast.d.ts +3 -3
- package/dist/components/toast.d.ts.map +1 -1
- package/dist/components/toast.js +5 -2
- package/dist/components/toc.d.ts +2 -2
- package/dist/components/toc.d.ts.map +1 -1
- package/dist/components/toc.js +5 -2
- package/dist/components/toggle-group.d.ts +0 -1
- package/dist/components/toggle-group.d.ts.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/tour.d.ts +1 -1
- package/dist/components/tour.d.ts.map +1 -1
- package/dist/components/tour.js +4 -1
- package/dist/components/tree-view.d.ts.map +1 -1
- package/dist/components/tree-view.js +3 -1
- package/dist/format/cache.d.ts +3 -0
- package/dist/format/cache.d.ts.map +1 -0
- package/dist/format/cache.js +24 -0
- package/dist/format/defaults.d.ts +3 -0
- package/dist/format/defaults.d.ts.map +1 -0
- package/dist/format/defaults.js +4 -0
- package/dist/format/format-date.d.ts +41 -0
- package/dist/format/format-date.d.ts.map +1 -0
- package/dist/format/format-date.js +48 -0
- package/dist/format/format-display-name.d.ts +9 -0
- package/dist/format/format-display-name.d.ts.map +1 -0
- package/dist/format/format-display-name.js +21 -0
- package/dist/format/format-file-size.d.ts +7 -0
- package/dist/format/format-file-size.d.ts.map +1 -0
- package/dist/format/format-file-size.js +27 -0
- package/dist/format/format-list.d.ts +7 -0
- package/dist/format/format-list.d.ts.map +1 -0
- package/dist/format/format-list.js +12 -0
- package/dist/format/format-number.d.ts +19 -0
- package/dist/format/format-number.d.ts.map +1 -0
- package/dist/format/format-number.js +37 -0
- package/dist/format/format-plural.d.ts +16 -0
- package/dist/format/format-plural.d.ts.map +1 -0
- package/dist/format/format-plural.js +30 -0
- package/dist/format/format-relative-time.d.ts +8 -0
- package/dist/format/format-relative-time.d.ts.map +1 -0
- package/dist/format/format-relative-time.js +12 -0
- package/dist/format/index.d.ts +8 -0
- package/dist/format/index.d.ts.map +1 -0
- package/dist/format/index.js +7 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/locale.d.ts +127 -0
- package/dist/locale.d.ts.map +1 -0
- package/dist/locale.js +73 -0
- package/dist/styles/theme.css +2 -2
- package/dist/utils/direction.d.ts +11 -0
- package/dist/utils/direction.d.ts.map +1 -0
- package/dist/utils/direction.js +26 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/validators.d.ts +34 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +83 -0
- package/package.json +4 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { show, portal, onMount, div } from '@llui/dom';
|
|
1
|
+
import { show, portal, onMount, div, useContext } from '@llui/dom';
|
|
2
|
+
import { LocaleContext } from '../locale';
|
|
2
3
|
import { pushFocusTrap } from '../utils/focus-trap';
|
|
3
4
|
import { pushDismissable } from '../utils/dismissable';
|
|
4
5
|
import { setAriaHiddenOutside } from '../utils/aria-hidden';
|
|
@@ -26,7 +27,8 @@ export function connect(get, send, opts) {
|
|
|
26
27
|
const triggerId = `${base}:trigger`;
|
|
27
28
|
const role = opts.role ?? 'dialog';
|
|
28
29
|
const modal = opts.modal !== false;
|
|
29
|
-
const
|
|
30
|
+
const locale = useContext(LocaleContext);
|
|
31
|
+
const closeLabel = opts.closeLabel ?? ((s) => locale(s).dialog.close);
|
|
30
32
|
return {
|
|
31
33
|
trigger: {
|
|
32
34
|
type: 'button',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../src/components/drawer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../src/components/drawer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { show, portal, onMount, div } from '@llui/dom';
|
|
1
|
+
import { show, portal, onMount, div, useContext } from '@llui/dom';
|
|
2
|
+
import { LocaleContext } from '../locale';
|
|
2
3
|
import { pushDismissable } from '../utils/dismissable';
|
|
3
4
|
import { pushFocusTrap } from '../utils/focus-trap';
|
|
4
5
|
import { setAriaHiddenOutside } from '../utils/aria-hidden';
|
|
@@ -19,13 +20,14 @@ export function update(state, msg) {
|
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
export function connect(get, send, opts) {
|
|
23
|
+
const locale = useContext(LocaleContext);
|
|
22
24
|
const side = opts.side ?? 'right';
|
|
23
25
|
const base = opts.id;
|
|
24
26
|
const contentId = `${base}:content`;
|
|
25
27
|
const titleId = `${base}:title`;
|
|
26
28
|
const descId = `${base}:description`;
|
|
27
29
|
const triggerId = `${base}:trigger`;
|
|
28
|
-
const closeLabel = opts.closeLabel ??
|
|
30
|
+
const closeLabel = opts.closeLabel ?? ((s) => locale(s).drawer.close);
|
|
29
31
|
return {
|
|
30
32
|
trigger: {
|
|
31
33
|
type: 'button',
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Send } from '@llui/dom';
|
|
2
|
+
/**
|
|
3
|
+
* Enter View — tracks whether an element is visible in the viewport
|
|
4
|
+
* using IntersectionObserver.
|
|
5
|
+
*
|
|
6
|
+
* State machine: `{ visible: false }` → enter → `{ visible: true }` → leave → …
|
|
7
|
+
*
|
|
8
|
+
* With `once: true`, the observer disconnects after the first enter,
|
|
9
|
+
* keeping `visible: true` permanently. Useful for lazy-load and
|
|
10
|
+
* scroll-triggered animations.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const parts = enterView.connect<State>(s => s.ev, sendEv, {
|
|
14
|
+
* id: 'hero',
|
|
15
|
+
* threshold: 0.5,
|
|
16
|
+
* once: true,
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* view: () => [
|
|
20
|
+
* div({ ...parts.root, class: (s) => s.ev.visible ? 'fade-in' : '' }, [
|
|
21
|
+
* // content that animates on scroll
|
|
22
|
+
* ]),
|
|
23
|
+
* ]
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* Wire up the observer in `onMount`:
|
|
27
|
+
* ```ts
|
|
28
|
+
* onMount((el) => enterView.createObserver(el, sendEv, { threshold: 0.5, once: true }))
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export interface EnterViewState {
|
|
32
|
+
visible: boolean;
|
|
33
|
+
}
|
|
34
|
+
export type EnterViewMsg = {
|
|
35
|
+
type: 'enter';
|
|
36
|
+
} | {
|
|
37
|
+
type: 'leave';
|
|
38
|
+
};
|
|
39
|
+
export declare function init(): EnterViewState;
|
|
40
|
+
export declare function update(state: EnterViewState, msg: EnterViewMsg): [EnterViewState, never[]];
|
|
41
|
+
export interface EnterViewParts<S> {
|
|
42
|
+
root: {
|
|
43
|
+
'data-scope': 'enter-view';
|
|
44
|
+
'data-part': 'root';
|
|
45
|
+
'data-state': (s: S) => 'visible' | 'hidden';
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface ConnectOptions {
|
|
49
|
+
id: string;
|
|
50
|
+
}
|
|
51
|
+
export declare function connect<S>(get: (s: S) => EnterViewState, _send: Send<EnterViewMsg>, _opts: ConnectOptions): EnterViewParts<S>;
|
|
52
|
+
export interface ObserverOptions {
|
|
53
|
+
threshold?: number;
|
|
54
|
+
rootMargin?: string;
|
|
55
|
+
once?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create an IntersectionObserver for the given element. Returns a cleanup
|
|
59
|
+
* function that disconnects the observer.
|
|
60
|
+
*
|
|
61
|
+
* Call this inside `onMount`:
|
|
62
|
+
* ```ts
|
|
63
|
+
* onMount((el) => enterView.createObserver(el, send, { once: true }))
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function createObserver(el: Element, send: Send<EnterViewMsg>, opts?: ObserverOptions): () => void;
|
|
67
|
+
export declare const enterView: {
|
|
68
|
+
init: typeof init;
|
|
69
|
+
update: typeof update;
|
|
70
|
+
connect: typeof connect;
|
|
71
|
+
createObserver: typeof createObserver;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=enter-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enter-view.d.ts","sourceRoot":"","sources":["../../src/components/enter-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAEhE,wBAAgB,IAAI,IAAI,cAAc,CAErC;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,CAO1F;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE;QACJ,YAAY,EAAE,YAAY,CAAA;QAC1B,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,GAAG,QAAQ,CAAA;KAC7C,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;CACX;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,EAC7B,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,EACzB,KAAK,EAAE,cAAc,GACpB,cAAc,CAAC,CAAC,CAAC,CAQnB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EACxB,IAAI,GAAE,eAAoB,GACzB,MAAM,IAAI,CAuBZ;AAED,eAAO,MAAM,SAAS;;;;;CAA4C,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export function init() {
|
|
2
|
+
return { visible: false };
|
|
3
|
+
}
|
|
4
|
+
export function update(state, msg) {
|
|
5
|
+
switch (msg.type) {
|
|
6
|
+
case 'enter':
|
|
7
|
+
return state.visible ? [state, []] : [{ visible: true }, []];
|
|
8
|
+
case 'leave':
|
|
9
|
+
return state.visible ? [{ visible: false }, []] : [state, []];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function connect(get, _send, _opts) {
|
|
13
|
+
return {
|
|
14
|
+
root: {
|
|
15
|
+
'data-scope': 'enter-view',
|
|
16
|
+
'data-part': 'root',
|
|
17
|
+
'data-state': (s) => (get(s).visible ? 'visible' : 'hidden'),
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create an IntersectionObserver for the given element. Returns a cleanup
|
|
23
|
+
* function that disconnects the observer.
|
|
24
|
+
*
|
|
25
|
+
* Call this inside `onMount`:
|
|
26
|
+
* ```ts
|
|
27
|
+
* onMount((el) => enterView.createObserver(el, send, { once: true }))
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function createObserver(el, send, opts = {}) {
|
|
31
|
+
const observer = new IntersectionObserver((entries) => {
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
if (entry.isIntersecting) {
|
|
34
|
+
send({ type: 'enter' });
|
|
35
|
+
if (opts.once) {
|
|
36
|
+
observer.disconnect();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
send({ type: 'leave' });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}, {
|
|
45
|
+
threshold: opts.threshold ?? 0,
|
|
46
|
+
rootMargin: opts.rootMargin ?? '0px',
|
|
47
|
+
});
|
|
48
|
+
observer.observe(el);
|
|
49
|
+
return () => observer.disconnect();
|
|
50
|
+
}
|
|
51
|
+
export const enterView = { init, update, connect, createObserver };
|
|
@@ -117,7 +117,7 @@ export declare function totalSize(state: FileUploadState): number;
|
|
|
117
117
|
* page. Call from onMount and invoke the returned disposer on unmount.
|
|
118
118
|
*/
|
|
119
119
|
export declare function preventDocumentDrop(): () => void;
|
|
120
|
-
export interface FileUploadItemParts<
|
|
120
|
+
export interface FileUploadItemParts<S> {
|
|
121
121
|
item: {
|
|
122
122
|
'data-scope': 'file-upload';
|
|
123
123
|
'data-part': 'item';
|
|
@@ -137,7 +137,7 @@ export interface FileUploadItemParts<_S> {
|
|
|
137
137
|
};
|
|
138
138
|
removeTrigger: {
|
|
139
139
|
type: 'button';
|
|
140
|
-
'aria-label': string;
|
|
140
|
+
'aria-label': string | ((s: S) => string);
|
|
141
141
|
'data-scope': 'file-upload';
|
|
142
142
|
'data-part': 'item-remove';
|
|
143
143
|
onClick: (e: MouseEvent) => void;
|
|
@@ -145,7 +145,7 @@ export interface FileUploadItemParts<_S> {
|
|
|
145
145
|
/** Zag-aligned alias for removeTrigger. Same wiring. */
|
|
146
146
|
itemDeleteTrigger: {
|
|
147
147
|
type: 'button';
|
|
148
|
-
'aria-label': string;
|
|
148
|
+
'aria-label': string | ((s: S) => string);
|
|
149
149
|
'data-scope': 'file-upload';
|
|
150
150
|
'data-part': 'item-delete-trigger';
|
|
151
151
|
onClick: (e: MouseEvent) => void;
|
|
@@ -180,6 +180,7 @@ export interface FileUploadParts<S> {
|
|
|
180
180
|
hiddenInput: {
|
|
181
181
|
type: 'file';
|
|
182
182
|
tabIndex: -1;
|
|
183
|
+
'aria-hidden': 'true';
|
|
183
184
|
style: string;
|
|
184
185
|
disabled: (s: S) => boolean;
|
|
185
186
|
multiple: (s: S) => boolean;
|
|
@@ -200,7 +201,7 @@ export interface FileUploadParts<S> {
|
|
|
200
201
|
};
|
|
201
202
|
clearTrigger: {
|
|
202
203
|
type: 'button';
|
|
203
|
-
'aria-label': string;
|
|
204
|
+
'aria-label': string | ((s: S) => string);
|
|
204
205
|
'data-scope': 'file-upload';
|
|
205
206
|
'data-part': 'clear-trigger';
|
|
206
207
|
onClick: (e: MouseEvent) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.d.ts","sourceRoot":"","sources":["../../src/components/file-upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"file-upload.d.ts","sourceRoot":"","sources":["../../src/components/file-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { useContext } from '@llui/dom';
|
|
2
|
+
import { LocaleContext } from '../locale';
|
|
1
3
|
export function init(opts = {}) {
|
|
2
4
|
return {
|
|
3
5
|
files: opts.files ?? [],
|
|
@@ -164,9 +166,10 @@ export function preventDocumentDrop() {
|
|
|
164
166
|
}
|
|
165
167
|
const HIDDEN_STYLE = 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;';
|
|
166
168
|
export function connect(get, send, opts) {
|
|
169
|
+
const locale = useContext(LocaleContext);
|
|
167
170
|
const inputId = `${opts.id}:input`;
|
|
168
|
-
const removeLabel = opts.removeLabel ??
|
|
169
|
-
const clearLabel = opts.clearLabel ??
|
|
171
|
+
const removeLabel = opts.removeLabel ?? ((s) => locale(s).fileUpload.remove);
|
|
172
|
+
const clearLabel = opts.clearLabel ?? ((s) => locale(s).fileUpload.clear);
|
|
170
173
|
const runPipeline = async (raw) => {
|
|
171
174
|
let files = raw;
|
|
172
175
|
if (opts.transformFiles)
|
|
@@ -243,6 +246,7 @@ export function connect(get, send, opts) {
|
|
|
243
246
|
hiddenInput: {
|
|
244
247
|
type: 'file',
|
|
245
248
|
tabIndex: -1,
|
|
249
|
+
'aria-hidden': 'true',
|
|
246
250
|
style: HIDDEN_STYLE,
|
|
247
251
|
disabled: (s) => get(s).disabled,
|
|
248
252
|
multiple: (s) => get(s).multiple,
|
|
@@ -108,7 +108,7 @@ export declare function update(state: FloatingPanelState, msg: FloatingPanelMsg)
|
|
|
108
108
|
export interface FloatingPanelParts<S> {
|
|
109
109
|
root: {
|
|
110
110
|
role: 'dialog';
|
|
111
|
-
'aria-label': string;
|
|
111
|
+
'aria-label': string | ((s: S) => string);
|
|
112
112
|
'data-scope': 'floating-panel';
|
|
113
113
|
'data-part': 'root';
|
|
114
114
|
'data-dragging': (s: S) => '' | undefined;
|
|
@@ -130,21 +130,21 @@ export interface FloatingPanelParts<S> {
|
|
|
130
130
|
};
|
|
131
131
|
minimizeTrigger: {
|
|
132
132
|
type: 'button';
|
|
133
|
-
'aria-label': string;
|
|
133
|
+
'aria-label': string | ((s: S) => string);
|
|
134
134
|
'data-scope': 'floating-panel';
|
|
135
135
|
'data-part': 'minimize-trigger';
|
|
136
136
|
onClick: (e: MouseEvent) => void;
|
|
137
137
|
};
|
|
138
138
|
maximizeTrigger: {
|
|
139
139
|
type: 'button';
|
|
140
|
-
'aria-label': string;
|
|
140
|
+
'aria-label': string | ((s: S) => string);
|
|
141
141
|
'data-scope': 'floating-panel';
|
|
142
142
|
'data-part': 'maximize-trigger';
|
|
143
143
|
onClick: (e: MouseEvent) => void;
|
|
144
144
|
};
|
|
145
145
|
closeTrigger: {
|
|
146
146
|
type: 'button';
|
|
147
|
-
'aria-label': string;
|
|
147
|
+
'aria-label': string | ((s: S) => string);
|
|
148
148
|
'data-scope': 'floating-panel';
|
|
149
149
|
'data-part': 'close-trigger';
|
|
150
150
|
onClick: (e: MouseEvent) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../../src/components/floating-panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../../src/components/floating-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { useContext } from '@llui/dom';
|
|
2
|
+
import { LocaleContext } from '../locale';
|
|
1
3
|
function clamp(v, min, max) {
|
|
2
4
|
return Math.max(min, Math.min(max, v));
|
|
3
5
|
}
|
|
@@ -136,10 +138,11 @@ export function update(state, msg) {
|
|
|
136
138
|
}
|
|
137
139
|
}
|
|
138
140
|
export function connect(get, send, opts = {}) {
|
|
141
|
+
const locale = useContext(LocaleContext);
|
|
139
142
|
return {
|
|
140
143
|
root: {
|
|
141
144
|
role: 'dialog',
|
|
142
|
-
'aria-label': opts.label ??
|
|
145
|
+
'aria-label': opts.label ?? ((s) => locale(s).floatingPanel.label),
|
|
143
146
|
'data-scope': 'floating-panel',
|
|
144
147
|
'data-part': 'root',
|
|
145
148
|
'data-dragging': (s) => (get(s).dragging ? '' : undefined),
|
|
@@ -168,21 +171,21 @@ export function connect(get, send, opts = {}) {
|
|
|
168
171
|
},
|
|
169
172
|
minimizeTrigger: {
|
|
170
173
|
type: 'button',
|
|
171
|
-
'aria-label': opts.minimizeLabel ??
|
|
174
|
+
'aria-label': opts.minimizeLabel ?? ((s) => locale(s).floatingPanel.minimize),
|
|
172
175
|
'data-scope': 'floating-panel',
|
|
173
176
|
'data-part': 'minimize-trigger',
|
|
174
177
|
onClick: () => send({ type: 'toggleMinimize' }),
|
|
175
178
|
},
|
|
176
179
|
maximizeTrigger: {
|
|
177
180
|
type: 'button',
|
|
178
|
-
'aria-label': opts.maximizeLabel ??
|
|
181
|
+
'aria-label': opts.maximizeLabel ?? ((s) => locale(s).floatingPanel.maximize),
|
|
179
182
|
'data-scope': 'floating-panel',
|
|
180
183
|
'data-part': 'maximize-trigger',
|
|
181
184
|
onClick: () => send({ type: 'toggleMaximize' }),
|
|
182
185
|
},
|
|
183
186
|
closeTrigger: {
|
|
184
187
|
type: 'button',
|
|
185
|
-
'aria-label': opts.closeLabel ??
|
|
188
|
+
'aria-label': opts.closeLabel ?? ((s) => locale(s).floatingPanel.close),
|
|
186
189
|
'data-scope': 'floating-panel',
|
|
187
190
|
'data-part': 'close-trigger',
|
|
188
191
|
onClick: () => send({ type: 'close' }),
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Send } from '@llui/dom';
|
|
2
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
3
|
+
/**
|
|
4
|
+
* Form — submit lifecycle + touched tracking + Standard Schema validation.
|
|
5
|
+
*
|
|
6
|
+
* Values live in the parent component's state; `form` tracks submit status
|
|
7
|
+
* and which fields have been interacted with (blur), so errors are shown
|
|
8
|
+
* only after touch instead of immediately.
|
|
9
|
+
*
|
|
10
|
+
* Bring your own validation library — any Standard Schema-compatible
|
|
11
|
+
* schema works (Zod, Valibot, ArkType, etc.). See https://standardschema.dev.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { z } from 'zod'
|
|
15
|
+
* import { form, validateSchema } from '@llui/components/form'
|
|
16
|
+
*
|
|
17
|
+
* const schema = z.object({
|
|
18
|
+
* email: z.string().email(),
|
|
19
|
+
* password: z.string().min(8),
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* type Values = z.infer<typeof schema>
|
|
23
|
+
* type State = { values: Values; form: FormState }
|
|
24
|
+
*
|
|
25
|
+
* update: (state, msg) => {
|
|
26
|
+
* switch (msg.type) {
|
|
27
|
+
* case 'submit': {
|
|
28
|
+
* const result = validateSchema(schema, state.values)
|
|
29
|
+
* if (!result.isValid) {
|
|
30
|
+
* return [{ ...state, form: { ...state.form, touched: { email: true, password: true } } }, []]
|
|
31
|
+
* }
|
|
32
|
+
* return [{ ...state, form: { ...state.form, status: 'submitting' } }, [saveUserEffect]]
|
|
33
|
+
* }
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export type FormStatus = 'idle' | 'submitting' | 'submitted' | 'error';
|
|
39
|
+
export interface FormState {
|
|
40
|
+
status: FormStatus;
|
|
41
|
+
touched: Record<string, boolean>;
|
|
42
|
+
submitError: string | null;
|
|
43
|
+
}
|
|
44
|
+
export type FormMsg = {
|
|
45
|
+
type: 'touch';
|
|
46
|
+
field: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'touchAll';
|
|
49
|
+
fields: string[];
|
|
50
|
+
} | {
|
|
51
|
+
type: 'submit';
|
|
52
|
+
} | {
|
|
53
|
+
type: 'submitSuccess';
|
|
54
|
+
} | {
|
|
55
|
+
type: 'submitError';
|
|
56
|
+
error: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'reset';
|
|
59
|
+
};
|
|
60
|
+
export declare function init(): FormState;
|
|
61
|
+
export declare function update(state: FormState, msg: FormMsg): [FormState, never[]];
|
|
62
|
+
export interface FormParts<S> {
|
|
63
|
+
root: {
|
|
64
|
+
'data-scope': 'form';
|
|
65
|
+
'data-part': 'root';
|
|
66
|
+
'data-state': (s: S) => FormStatus;
|
|
67
|
+
'aria-busy': (s: S) => 'true' | undefined;
|
|
68
|
+
};
|
|
69
|
+
field: (name: string) => {
|
|
70
|
+
'data-scope': 'form';
|
|
71
|
+
'data-part': 'field';
|
|
72
|
+
'data-touched': (s: S) => '' | undefined;
|
|
73
|
+
touched: (s: S) => boolean;
|
|
74
|
+
onBlur: (e: FocusEvent) => void;
|
|
75
|
+
};
|
|
76
|
+
submit: {
|
|
77
|
+
type: 'submit';
|
|
78
|
+
'data-scope': 'form';
|
|
79
|
+
'data-part': 'submit';
|
|
80
|
+
'data-state': (s: S) => FormStatus;
|
|
81
|
+
disabled: (s: S) => boolean;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export interface ConnectOptions {
|
|
85
|
+
id: string;
|
|
86
|
+
}
|
|
87
|
+
export declare function connect<S>(get: (s: S) => FormState, send: Send<FormMsg>, _opts: ConnectOptions): FormParts<S>;
|
|
88
|
+
export interface ValidateResult<T> {
|
|
89
|
+
isValid: boolean;
|
|
90
|
+
/** Field name → first error message. Field name is derived from the issue's path. */
|
|
91
|
+
errors: Partial<Record<keyof T, string>>;
|
|
92
|
+
/** All issues from the schema validator, unaltered. */
|
|
93
|
+
issues: readonly StandardSchemaV1.Issue[];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Run a Standard Schema synchronously against a values object. Throws if
|
|
97
|
+
* the schema returns a Promise — use sync validation only for form submit.
|
|
98
|
+
*
|
|
99
|
+
* Works with any library implementing the Standard Schema spec:
|
|
100
|
+
* Zod (v3.24+), Valibot (v1+), ArkType, etc.
|
|
101
|
+
*/
|
|
102
|
+
export declare function validateSchema<T>(schema: StandardSchemaV1<T>, values: unknown): ValidateResult<T>;
|
|
103
|
+
/**
|
|
104
|
+
* Async variant — returns a Promise. Use when the schema performs async
|
|
105
|
+
* validation (e.g. uniqueness checks against a backend).
|
|
106
|
+
*/
|
|
107
|
+
export declare function validateSchemaAsync<T>(schema: StandardSchemaV1<T>, values: unknown): Promise<ValidateResult<T>>;
|
|
108
|
+
export declare const form: {
|
|
109
|
+
init: typeof init;
|
|
110
|
+
update: typeof update;
|
|
111
|
+
connect: typeof connect;
|
|
112
|
+
validateSchema: typeof validateSchema;
|
|
113
|
+
validateSchemaAsync: typeof validateSchemaAsync;
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/components/form.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAA;AAEtE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAErB,wBAAgB,IAAI,IAAI,SAAS,CAEhC;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAmB3E;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,IAAI,EAAE;QACJ,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,UAAU,CAAA;QAClC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;KAC1C,CAAA;IACD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QACvB,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,OAAO,CAAA;QACpB,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACxC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAC1B,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KAChC,CAAA;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ,CAAA;QACd,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,QAAQ,CAAA;QACrB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,UAAU,CAAA;QAClC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;CACX;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,EACxB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EACnB,KAAK,EAAE,cAAc,GACpB,SAAS,CAAC,CAAC,CAAC,CAuBd;AAID,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,qFAAqF;IACrF,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IACxC,uDAAuD;IACvD,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAA;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CA0BjG;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC3B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAmB5B;AAED,eAAO,MAAM,IAAI;;;;;;CAAiE,CAAA"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export function init() {
|
|
2
|
+
return { status: 'idle', touched: {}, submitError: null };
|
|
3
|
+
}
|
|
4
|
+
export function update(state, msg) {
|
|
5
|
+
switch (msg.type) {
|
|
6
|
+
case 'touch':
|
|
7
|
+
if (state.touched[msg.field])
|
|
8
|
+
return [state, []];
|
|
9
|
+
return [{ ...state, touched: { ...state.touched, [msg.field]: true } }, []];
|
|
10
|
+
case 'touchAll': {
|
|
11
|
+
const touched = { ...state.touched };
|
|
12
|
+
for (const f of msg.fields)
|
|
13
|
+
touched[f] = true;
|
|
14
|
+
return [{ ...state, touched }, []];
|
|
15
|
+
}
|
|
16
|
+
case 'submit':
|
|
17
|
+
return [{ ...state, status: 'submitting', submitError: null }, []];
|
|
18
|
+
case 'submitSuccess':
|
|
19
|
+
return [{ ...state, status: 'submitted', submitError: null }, []];
|
|
20
|
+
case 'submitError':
|
|
21
|
+
return [{ ...state, status: 'error', submitError: msg.error }, []];
|
|
22
|
+
case 'reset':
|
|
23
|
+
return [init(), []];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function connect(get, send, _opts) {
|
|
27
|
+
return {
|
|
28
|
+
root: {
|
|
29
|
+
'data-scope': 'form',
|
|
30
|
+
'data-part': 'root',
|
|
31
|
+
'data-state': (s) => get(s).status,
|
|
32
|
+
'aria-busy': (s) => (get(s).status === 'submitting' ? 'true' : undefined),
|
|
33
|
+
},
|
|
34
|
+
field: (name) => ({
|
|
35
|
+
'data-scope': 'form',
|
|
36
|
+
'data-part': 'field',
|
|
37
|
+
'data-touched': (s) => (get(s).touched[name] ? '' : undefined),
|
|
38
|
+
touched: (s) => !!get(s).touched[name],
|
|
39
|
+
onBlur: () => send({ type: 'touch', field: name }),
|
|
40
|
+
}),
|
|
41
|
+
submit: {
|
|
42
|
+
type: 'submit',
|
|
43
|
+
'data-scope': 'form',
|
|
44
|
+
'data-part': 'submit',
|
|
45
|
+
'data-state': (s) => get(s).status,
|
|
46
|
+
disabled: (s) => get(s).status === 'submitting',
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run a Standard Schema synchronously against a values object. Throws if
|
|
52
|
+
* the schema returns a Promise — use sync validation only for form submit.
|
|
53
|
+
*
|
|
54
|
+
* Works with any library implementing the Standard Schema spec:
|
|
55
|
+
* Zod (v3.24+), Valibot (v1+), ArkType, etc.
|
|
56
|
+
*/
|
|
57
|
+
export function validateSchema(schema, values) {
|
|
58
|
+
const result = schema['~standard'].validate(values);
|
|
59
|
+
if (result instanceof Promise) {
|
|
60
|
+
throw new Error('[@llui/components/form] validateSchema: schema returned a Promise. ' +
|
|
61
|
+
'Form validation must be synchronous. Use `validateSchemaAsync` for async schemas.');
|
|
62
|
+
}
|
|
63
|
+
if (!result.issues) {
|
|
64
|
+
return { isValid: true, errors: {}, issues: [] };
|
|
65
|
+
}
|
|
66
|
+
const errors = {};
|
|
67
|
+
for (const issue of result.issues) {
|
|
68
|
+
const path = issue.path;
|
|
69
|
+
if (!path || path.length === 0)
|
|
70
|
+
continue;
|
|
71
|
+
const first = path[0];
|
|
72
|
+
const key = (typeof first === 'object' ? first.key : first);
|
|
73
|
+
// Only record the first error per field
|
|
74
|
+
if (errors[key] === undefined) {
|
|
75
|
+
errors[key] = issue.message;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { isValid: false, errors, issues: result.issues };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Async variant — returns a Promise. Use when the schema performs async
|
|
82
|
+
* validation (e.g. uniqueness checks against a backend).
|
|
83
|
+
*/
|
|
84
|
+
export async function validateSchemaAsync(schema, values) {
|
|
85
|
+
const result = await schema['~standard'].validate(values);
|
|
86
|
+
if (!result.issues) {
|
|
87
|
+
return { isValid: true, errors: {}, issues: [] };
|
|
88
|
+
}
|
|
89
|
+
const errors = {};
|
|
90
|
+
for (const issue of result.issues) {
|
|
91
|
+
const path = issue.path;
|
|
92
|
+
if (!path || path.length === 0)
|
|
93
|
+
continue;
|
|
94
|
+
const first = path[0];
|
|
95
|
+
const key = (typeof first === 'object' ? first.key : first);
|
|
96
|
+
if (errors[key] === undefined) {
|
|
97
|
+
errors[key] = issue.message;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { isValid: false, errors, issues: result.issues };
|
|
101
|
+
}
|
|
102
|
+
export const form = { init, update, connect, validateSchema, validateSchemaAsync };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover-card.d.ts","sourceRoot":"","sources":["../../src/components/hover-card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAExD,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElE;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAEnG,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,aAAkB,GAAG,cAAc,CAE7D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,CAS1F;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAA;QACV,eAAe,EAAE,QAAQ,CAAA;QACzB,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"hover-card.d.ts","sourceRoot":"","sources":["../../src/components/hover-card.ts"],"names":[],"mappings":"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"}
|