@delightstack/components 0.1.0
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/LICENSE +21 -0
- package/README.md +136 -0
- package/SKILL.md +149 -0
- package/bin/agents.js +63 -0
- package/dist/actions/Alert.svelte +202 -0
- package/dist/actions/Alert.svelte.d.ts +36 -0
- package/dist/actions/Alert.svelte.d.ts.map +1 -0
- package/dist/actions/Button.svelte +1450 -0
- package/dist/actions/Button.svelte.d.ts +56 -0
- package/dist/actions/Button.svelte.d.ts.map +1 -0
- package/dist/actions/ButtonGroup.svelte +111 -0
- package/dist/actions/ButtonGroup.svelte.d.ts +41 -0
- package/dist/actions/ButtonGroup.svelte.d.ts.map +1 -0
- package/dist/actions/CommandPalette.svelte +939 -0
- package/dist/actions/CommandPalette.svelte.d.ts +37 -0
- package/dist/actions/CommandPalette.svelte.d.ts.map +1 -0
- package/dist/actions/ContextMenu.svelte +138 -0
- package/dist/actions/ContextMenu.svelte.d.ts +54 -0
- package/dist/actions/ContextMenu.svelte.d.ts.map +1 -0
- package/dist/actions/Modal.svelte +474 -0
- package/dist/actions/Modal.svelte.d.ts +28 -0
- package/dist/actions/Modal.svelte.d.ts.map +1 -0
- package/dist/actions/Popover.svelte +1214 -0
- package/dist/actions/Popover.svelte.d.ts +31 -0
- package/dist/actions/Popover.svelte.d.ts.map +1 -0
- package/dist/actions/Portal.svelte +80 -0
- package/dist/actions/Portal.svelte.d.ts +17 -0
- package/dist/actions/Portal.svelte.d.ts.map +1 -0
- package/dist/actions/ThemeToggle.svelte +345 -0
- package/dist/actions/ThemeToggle.svelte.d.ts +15 -0
- package/dist/actions/ThemeToggle.svelte.d.ts.map +1 -0
- package/dist/actions/index.d.ts +13 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +10 -0
- package/dist/actions/scrollbar.d.ts +48 -0
- package/dist/actions/scrollbar.d.ts.map +1 -0
- package/dist/actions/scrollbar.js +404 -0
- package/dist/display/Accordion.svelte +586 -0
- package/dist/display/Accordion.svelte.d.ts +41 -0
- package/dist/display/Accordion.svelte.d.ts.map +1 -0
- package/dist/display/Avatar.svelte +527 -0
- package/dist/display/Avatar.svelte.d.ts +22 -0
- package/dist/display/Avatar.svelte.d.ts.map +1 -0
- package/dist/display/AvatarGroup.svelte +298 -0
- package/dist/display/AvatarGroup.svelte.d.ts +31 -0
- package/dist/display/AvatarGroup.svelte.d.ts.map +1 -0
- package/dist/display/Calendar.svelte +1366 -0
- package/dist/display/Calendar.svelte.d.ts +58 -0
- package/dist/display/Calendar.svelte.d.ts.map +1 -0
- package/dist/display/Chart.svelte +1426 -0
- package/dist/display/Chart.svelte.d.ts +35 -0
- package/dist/display/Chart.svelte.d.ts.map +1 -0
- package/dist/display/Code.svelte +780 -0
- package/dist/display/Code.svelte.d.ts +19 -0
- package/dist/display/Code.svelte.d.ts.map +1 -0
- package/dist/display/Comparison.svelte +686 -0
- package/dist/display/Comparison.svelte.d.ts +22 -0
- package/dist/display/Comparison.svelte.d.ts.map +1 -0
- package/dist/display/Counter.svelte +285 -0
- package/dist/display/Counter.svelte.d.ts +21 -0
- package/dist/display/Counter.svelte.d.ts.map +1 -0
- package/dist/display/Expand.svelte +48 -0
- package/dist/display/Expand.svelte.d.ts +9 -0
- package/dist/display/Expand.svelte.d.ts.map +1 -0
- package/dist/display/List.svelte +294 -0
- package/dist/display/List.svelte.d.ts +40 -0
- package/dist/display/List.svelte.d.ts.map +1 -0
- package/dist/display/ListContextReset.svelte +19 -0
- package/dist/display/ListContextReset.svelte.d.ts +7 -0
- package/dist/display/ListContextReset.svelte.d.ts.map +1 -0
- package/dist/display/ListItem.svelte +834 -0
- package/dist/display/ListItem.svelte.d.ts +22 -0
- package/dist/display/ListItem.svelte.d.ts.map +1 -0
- package/dist/display/QR.svelte +1193 -0
- package/dist/display/QR.svelte.d.ts +23 -0
- package/dist/display/QR.svelte.d.ts.map +1 -0
- package/dist/display/SplitPane.svelte +744 -0
- package/dist/display/SplitPane.svelte.d.ts +25 -0
- package/dist/display/SplitPane.svelte.d.ts.map +1 -0
- package/dist/display/Stat.svelte +439 -0
- package/dist/display/Stat.svelte.d.ts +24 -0
- package/dist/display/Stat.svelte.d.ts.map +1 -0
- package/dist/display/Table.svelte +4654 -0
- package/dist/display/Table.svelte.d.ts +249 -0
- package/dist/display/Table.svelte.d.ts.map +1 -0
- package/dist/display/TableCellEditor.svelte +935 -0
- package/dist/display/TableCellEditor.svelte.d.ts +58 -0
- package/dist/display/TableCellEditor.svelte.d.ts.map +1 -0
- package/dist/display/Timeline.svelte +1258 -0
- package/dist/display/Timeline.svelte.d.ts +43 -0
- package/dist/display/Timeline.svelte.d.ts.map +1 -0
- package/dist/display/Tree.svelte +1740 -0
- package/dist/display/Tree.svelte.d.ts +74 -0
- package/dist/display/Tree.svelte.d.ts.map +1 -0
- package/dist/display/Typewriter.svelte +338 -0
- package/dist/display/Typewriter.svelte.d.ts +22 -0
- package/dist/display/Typewriter.svelte.d.ts.map +1 -0
- package/dist/display/index.d.ts +24 -0
- package/dist/display/index.d.ts.map +1 -0
- package/dist/display/index.js +18 -0
- package/dist/feedback/Callout.svelte +529 -0
- package/dist/feedback/Callout.svelte.d.ts +24 -0
- package/dist/feedback/Callout.svelte.d.ts.map +1 -0
- package/dist/feedback/Confetti.svelte +631 -0
- package/dist/feedback/Confetti.svelte.d.ts +90 -0
- package/dist/feedback/Confetti.svelte.d.ts.map +1 -0
- package/dist/feedback/Progress.svelte +382 -0
- package/dist/feedback/Progress.svelte.d.ts +25 -0
- package/dist/feedback/Progress.svelte.d.ts.map +1 -0
- package/dist/feedback/Toast.svelte +967 -0
- package/dist/feedback/Toast.svelte.d.ts +54 -0
- package/dist/feedback/Toast.svelte.d.ts.map +1 -0
- package/dist/feedback/index.d.ts +7 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +4 -0
- package/dist/form/Checkbox.svelte +449 -0
- package/dist/form/Checkbox.svelte.d.ts +27 -0
- package/dist/form/Checkbox.svelte.d.ts.map +1 -0
- package/dist/form/Fieldset.svelte +410 -0
- package/dist/form/Fieldset.svelte.d.ts +22 -0
- package/dist/form/Fieldset.svelte.d.ts.map +1 -0
- package/dist/form/FileUpload.svelte +934 -0
- package/dist/form/FileUpload.svelte.d.ts +41 -0
- package/dist/form/FileUpload.svelte.d.ts.map +1 -0
- package/dist/form/Form.svelte +530 -0
- package/dist/form/Form.svelte.d.ts +120 -0
- package/dist/form/Form.svelte.d.ts.map +1 -0
- package/dist/form/Input.svelte +2858 -0
- package/dist/form/Input.svelte.d.ts +66 -0
- package/dist/form/Input.svelte.d.ts.map +1 -0
- package/dist/form/Radio.svelte +507 -0
- package/dist/form/Radio.svelte.d.ts +39 -0
- package/dist/form/Radio.svelte.d.ts.map +1 -0
- package/dist/form/Range.svelte +912 -0
- package/dist/form/Range.svelte.d.ts +33 -0
- package/dist/form/Range.svelte.d.ts.map +1 -0
- package/dist/form/Rating.svelte +429 -0
- package/dist/form/Rating.svelte.d.ts +28 -0
- package/dist/form/Rating.svelte.d.ts.map +1 -0
- package/dist/form/Select.svelte +1933 -0
- package/dist/form/Select.svelte.d.ts +54 -0
- package/dist/form/Select.svelte.d.ts.map +1 -0
- package/dist/form/Toggle.svelte +645 -0
- package/dist/form/Toggle.svelte.d.ts +50 -0
- package/dist/form/Toggle.svelte.d.ts.map +1 -0
- package/dist/form/index.d.ts +15 -0
- package/dist/form/index.d.ts.map +1 -0
- package/dist/form/index.js +10 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/layout/README.md +172 -0
- package/dist/media/Carousel.svelte +2424 -0
- package/dist/media/Carousel.svelte.d.ts +47 -0
- package/dist/media/Carousel.svelte.d.ts.map +1 -0
- package/dist/media/Gallery.svelte +2881 -0
- package/dist/media/Gallery.svelte.d.ts +82 -0
- package/dist/media/Gallery.svelte.d.ts.map +1 -0
- package/dist/media/Image.svelte +389 -0
- package/dist/media/Image.svelte.d.ts +33 -0
- package/dist/media/Image.svelte.d.ts.map +1 -0
- package/dist/media/PDF.svelte +1793 -0
- package/dist/media/PDF.svelte.d.ts +44 -0
- package/dist/media/PDF.svelte.d.ts.map +1 -0
- package/dist/media/Panorama.svelte +1391 -0
- package/dist/media/Panorama.svelte.d.ts +47 -0
- package/dist/media/Panorama.svelte.d.ts.map +1 -0
- package/dist/media/Video.svelte +2501 -0
- package/dist/media/Video.svelte.d.ts +58 -0
- package/dist/media/Video.svelte.d.ts.map +1 -0
- package/dist/media/carousel.d.ts +211 -0
- package/dist/media/carousel.d.ts.map +1 -0
- package/dist/media/carousel.js +408 -0
- package/dist/media/index.d.ts +11 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +5 -0
- package/dist/navigation/BottomSheet.svelte +636 -0
- package/dist/navigation/BottomSheet.svelte.d.ts +27 -0
- package/dist/navigation/BottomSheet.svelte.d.ts.map +1 -0
- package/dist/navigation/Breadcrumbs.svelte +611 -0
- package/dist/navigation/Breadcrumbs.svelte.d.ts +28 -0
- package/dist/navigation/Breadcrumbs.svelte.d.ts.map +1 -0
- package/dist/navigation/Pagination.svelte +641 -0
- package/dist/navigation/Pagination.svelte.d.ts +27 -0
- package/dist/navigation/Pagination.svelte.d.ts.map +1 -0
- package/dist/navigation/Steps.svelte +965 -0
- package/dist/navigation/Steps.svelte.d.ts +43 -0
- package/dist/navigation/Steps.svelte.d.ts.map +1 -0
- package/dist/navigation/Tabs.svelte +698 -0
- package/dist/navigation/Tabs.svelte.d.ts +41 -0
- package/dist/navigation/Tabs.svelte.d.ts.map +1 -0
- package/dist/navigation/index.d.ts +8 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +5 -0
- package/package.json +139 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface TreeNode {
|
|
2
|
+
/** Unique identifier for the node */
|
|
3
|
+
id: string;
|
|
4
|
+
/** Display text for the node */
|
|
5
|
+
label: string;
|
|
6
|
+
/** Icon component shown before the label */
|
|
7
|
+
icon?: import('svelte').Component;
|
|
8
|
+
/** Child nodes (presence makes this a branch node) */
|
|
9
|
+
children?: TreeNode[];
|
|
10
|
+
/** Whether this node is disabled (cannot be selected or expanded) */
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
/** Whether this node can be selected. When undefined, inherits from the tree's selectable prop. Set to false to make clicking expand/collapse instead. */
|
|
13
|
+
selectable?: boolean;
|
|
14
|
+
/** Whether this node can accept children via drag-and-drop (defaults to true if node has children array) */
|
|
15
|
+
allowChildren?: boolean;
|
|
16
|
+
/** Arbitrary user data attached to the node (passed back in selection/drop callbacks) */
|
|
17
|
+
data?: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface FlatTreeNode {
|
|
20
|
+
/** Unique identifier for the node */
|
|
21
|
+
id: string;
|
|
22
|
+
/** The `id` of the parent node, or `null` for root-level nodes */
|
|
23
|
+
parentId: string | null;
|
|
24
|
+
/** Display text for the node */
|
|
25
|
+
label: string;
|
|
26
|
+
/** Icon component shown before the label */
|
|
27
|
+
icon?: import('svelte').Component;
|
|
28
|
+
/** Whether this node is disabled (cannot be selected or expanded) */
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
/** Whether this node can be selected. When undefined, inherits from the tree's selectable prop. */
|
|
31
|
+
selectable?: boolean;
|
|
32
|
+
/** Arbitrary user data attached to the node (passed back in selection/drop callbacks) */
|
|
33
|
+
data?: unknown;
|
|
34
|
+
}
|
|
35
|
+
import { type Snippet } from 'svelte';
|
|
36
|
+
declare const Tree: import("svelte").Component<{
|
|
37
|
+
data: any;
|
|
38
|
+
selected?: string[];
|
|
39
|
+
expanded?: string[];
|
|
40
|
+
selectable?: boolean;
|
|
41
|
+
multi_select?: boolean;
|
|
42
|
+
checkboxes?: boolean;
|
|
43
|
+
show_lines?: boolean;
|
|
44
|
+
draggable?: boolean;
|
|
45
|
+
filter?: string | undefined;
|
|
46
|
+
dense?: boolean;
|
|
47
|
+
comfortable?: boolean;
|
|
48
|
+
skeleton?: boolean;
|
|
49
|
+
skeleton_count?: number;
|
|
50
|
+
skeleton_depth?: number;
|
|
51
|
+
id?: string;
|
|
52
|
+
class?: string;
|
|
53
|
+
load_children?: ((node: TreeNode) => Promise<TreeNode[]>) | undefined;
|
|
54
|
+
node_content?: Snippet<[{
|
|
55
|
+
node: TreeNode;
|
|
56
|
+
level: number;
|
|
57
|
+
}]> | undefined;
|
|
58
|
+
onselect?: ((detail: {
|
|
59
|
+
node: TreeNode;
|
|
60
|
+
selected: string[];
|
|
61
|
+
}) => void) | undefined;
|
|
62
|
+
onexpand?: ((detail: {
|
|
63
|
+
node: TreeNode;
|
|
64
|
+
expanded: boolean;
|
|
65
|
+
}) => void) | undefined;
|
|
66
|
+
ondrop?: ((detail: {
|
|
67
|
+
node: TreeNode;
|
|
68
|
+
target: TreeNode;
|
|
69
|
+
position: "before" | "after" | "inside";
|
|
70
|
+
}) => void) | undefined;
|
|
71
|
+
}, {}, "selected" | "expanded">;
|
|
72
|
+
type Tree = ReturnType<typeof Tree>;
|
|
73
|
+
export default Tree;
|
|
74
|
+
//# sourceMappingURL=Tree.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree.svelte.d.ts","sourceRoot":"","sources":["../../src/display/Tree.svelte.ts"],"names":[],"mappings":"AAGC,MAAM,WAAW,QAAQ;IACxB,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0JAA0J;IAC1J,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4GAA4G;IAC5G,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAClC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mGAAmG;IACnG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yFAAyF;IACzF,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAGF,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAk9BlD,QAAA,MAAM,IAAI;UAr2BqE,GAAG;eAAa,MAAM,EAAE;eAAa,MAAM,EAAE;iBAAe,OAAO;mBAAiB,OAAO;iBAAe,OAAO;iBAAe,OAAO;gBAAc,OAAO;aAAW,MAAM,GAAG,SAAS;YAAU,OAAO;kBAAgB,OAAO;eAAa,OAAO;qBAAmB,MAAM;qBAAmB,MAAM;;YAA8B,MAAM;oBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,SAAS;mBAAiB,OAAO,CAAC,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS;eAAe,CAAC,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC,GAC9mB,SAAS;eAAe,CAAC,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC,GACjF,SAAS;aAAa,CAAC,CAAC,MAAM,EAAE;QAChC,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;KACvC,KAAK,IAAI,CAAC,GACX,SAAS;+BA81BoC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
const propId = $props.id();
|
|
3
|
+
let {
|
|
4
|
+
/** The text to type. A single string or array of strings to cycle through */
|
|
5
|
+
text,
|
|
6
|
+
|
|
7
|
+
/** Typing speed in milliseconds per character */
|
|
8
|
+
speed = 50,
|
|
9
|
+
|
|
10
|
+
/** Initial delay before typing starts (ms) */
|
|
11
|
+
delay = 1000,
|
|
12
|
+
|
|
13
|
+
/** Whether to loop through text array indefinitely */
|
|
14
|
+
loop = false,
|
|
15
|
+
|
|
16
|
+
/** Pause duration between cycling texts (ms) */
|
|
17
|
+
pause_between = 2000,
|
|
18
|
+
|
|
19
|
+
/** Cursor style: 'block', 'line', 'underscore', or false to hide */
|
|
20
|
+
cursor = 'line' as 'block' | 'line' | 'underscore' | false,
|
|
21
|
+
|
|
22
|
+
/** Whether the cursor blinks when idle */
|
|
23
|
+
cursor_blink = true,
|
|
24
|
+
|
|
25
|
+
/** Backspace speed in milliseconds per character */
|
|
26
|
+
delete_speed = 30,
|
|
27
|
+
|
|
28
|
+
/** Whether the animation is paused */
|
|
29
|
+
paused = false,
|
|
30
|
+
|
|
31
|
+
/** Element ID */
|
|
32
|
+
id = propId,
|
|
33
|
+
|
|
34
|
+
/** Additional CSS classes */
|
|
35
|
+
class: class_name = '',
|
|
36
|
+
|
|
37
|
+
/** Called when typing starts */
|
|
38
|
+
onstart = undefined as (() => void) | undefined,
|
|
39
|
+
|
|
40
|
+
/** Called when all text has been typed */
|
|
41
|
+
oncomplete = undefined as (() => void) | undefined,
|
|
42
|
+
|
|
43
|
+
/** Called when cycling loops back */
|
|
44
|
+
onloop = undefined as ((detail: { index: number }) => void) | undefined,
|
|
45
|
+
}: {
|
|
46
|
+
text: string | string[];
|
|
47
|
+
speed?: number;
|
|
48
|
+
delay?: number;
|
|
49
|
+
loop?: boolean;
|
|
50
|
+
pause_between?: number;
|
|
51
|
+
cursor?: 'block' | 'line' | 'underscore' | false;
|
|
52
|
+
cursor_blink?: boolean;
|
|
53
|
+
delete_speed?: number;
|
|
54
|
+
paused?: boolean;
|
|
55
|
+
id?: string;
|
|
56
|
+
class?: string;
|
|
57
|
+
onstart?: (() => void) | undefined;
|
|
58
|
+
oncomplete?: (() => void) | undefined;
|
|
59
|
+
onloop?: ((detail: { index: number }) => void) | undefined;
|
|
60
|
+
} = $props();
|
|
61
|
+
|
|
62
|
+
const texts = $derived(Array.isArray(text) ? text : [text]);
|
|
63
|
+
const is_multi = $derived(texts.length > 1);
|
|
64
|
+
const full_label = $derived(Array.isArray(text) ? text.join(', ') : text);
|
|
65
|
+
|
|
66
|
+
let displayed = $state('');
|
|
67
|
+
let is_typing = $state(false);
|
|
68
|
+
let prefers_reduced_motion = $state(false);
|
|
69
|
+
|
|
70
|
+
// Track all active timeouts so we can clean them up
|
|
71
|
+
let active_timeouts: ReturnType<typeof setTimeout>[] = [];
|
|
72
|
+
|
|
73
|
+
function safeTimeout(fn: () => void, ms: number): ReturnType<typeof setTimeout> {
|
|
74
|
+
const id = setTimeout(() => {
|
|
75
|
+
active_timeouts = active_timeouts.filter((t) => t !== id);
|
|
76
|
+
fn();
|
|
77
|
+
}, ms);
|
|
78
|
+
active_timeouts.push(id);
|
|
79
|
+
return id;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function clearAllTimeouts() {
|
|
83
|
+
for (const t of active_timeouts) {
|
|
84
|
+
clearTimeout(t);
|
|
85
|
+
}
|
|
86
|
+
active_timeouts = [];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function getCharDelay(char: string, base_speed: number): number {
|
|
90
|
+
let multiplier = 0.8 + Math.random() * 0.4;
|
|
91
|
+
|
|
92
|
+
// Smart punctuation pauses
|
|
93
|
+
if (char === '.' || char === '?' || char === '!') {
|
|
94
|
+
multiplier *= 3;
|
|
95
|
+
} else if (char === ',') {
|
|
96
|
+
multiplier *= 1.8;
|
|
97
|
+
} else if (char === ';' || char === ':') {
|
|
98
|
+
multiplier *= 2;
|
|
99
|
+
} else if (char === '\n') {
|
|
100
|
+
multiplier *= 2;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 5% chance of a micro-pause (2x speed)
|
|
104
|
+
if (Math.random() < 0.05) {
|
|
105
|
+
multiplier *= 2;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return base_speed * multiplier;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function findCommonPrefixLength(a: string, b: string): number {
|
|
112
|
+
let i = 0;
|
|
113
|
+
while (i < a.length && i < b.length && a[i] === b[i]) {
|
|
114
|
+
i++;
|
|
115
|
+
}
|
|
116
|
+
return i;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function typeText(target: string, from_index: number, onDone: () => void) {
|
|
120
|
+
if (paused) {
|
|
121
|
+
// When paused, wait and retry
|
|
122
|
+
safeTimeout(() => typeText(target, from_index, onDone), 50);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (from_index >= target.length) {
|
|
127
|
+
onDone();
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const char = target[from_index];
|
|
132
|
+
const char_delay = getCharDelay(char, speed);
|
|
133
|
+
|
|
134
|
+
safeTimeout(() => {
|
|
135
|
+
displayed = target.slice(0, from_index + 1);
|
|
136
|
+
typeText(target, from_index + 1, onDone);
|
|
137
|
+
}, char_delay);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function deleteText(to_length: number, onDone: () => void) {
|
|
141
|
+
if (paused) {
|
|
142
|
+
safeTimeout(() => deleteText(to_length, onDone), 50);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (displayed.length <= to_length) {
|
|
147
|
+
onDone();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const char_delay = delete_speed * (0.8 + Math.random() * 0.4);
|
|
152
|
+
|
|
153
|
+
safeTimeout(() => {
|
|
154
|
+
displayed = displayed.slice(0, -1);
|
|
155
|
+
deleteText(to_length, onDone);
|
|
156
|
+
}, char_delay);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function runSequence(text_index: number) {
|
|
160
|
+
const target = texts[text_index];
|
|
161
|
+
if (!target && target !== '') return;
|
|
162
|
+
|
|
163
|
+
is_typing = true;
|
|
164
|
+
onstart?.();
|
|
165
|
+
|
|
166
|
+
const common_prefix_len =
|
|
167
|
+
displayed.length > 0 ? findCommonPrefixLength(displayed, target) : 0;
|
|
168
|
+
|
|
169
|
+
function startTyping() {
|
|
170
|
+
typeText(target, common_prefix_len, () => {
|
|
171
|
+
is_typing = false;
|
|
172
|
+
|
|
173
|
+
if (is_multi) {
|
|
174
|
+
// Pause, then backspace, then type next
|
|
175
|
+
safeTimeout(() => {
|
|
176
|
+
const next_index = (text_index + 1) % texts.length;
|
|
177
|
+
|
|
178
|
+
if (next_index === 0 && !loop) {
|
|
179
|
+
oncomplete?.();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (next_index === 0) {
|
|
184
|
+
onloop?.({ index: next_index });
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const next_target = texts[next_index];
|
|
188
|
+
const next_common = findCommonPrefixLength(displayed, next_target);
|
|
189
|
+
|
|
190
|
+
is_typing = true;
|
|
191
|
+
deleteText(next_common, () => {
|
|
192
|
+
runSequence(next_index);
|
|
193
|
+
});
|
|
194
|
+
}, pause_between);
|
|
195
|
+
} else {
|
|
196
|
+
// Single text: done
|
|
197
|
+
oncomplete?.();
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// If we need to delete down to common prefix first
|
|
203
|
+
if (displayed.length > common_prefix_len) {
|
|
204
|
+
deleteText(common_prefix_len, startTyping);
|
|
205
|
+
} else {
|
|
206
|
+
startTyping();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function startAnimation() {
|
|
211
|
+
clearAllTimeouts();
|
|
212
|
+
displayed = '';
|
|
213
|
+
is_typing = false;
|
|
214
|
+
|
|
215
|
+
if (prefers_reduced_motion) {
|
|
216
|
+
// Show full text immediately for reduced motion
|
|
217
|
+
displayed = texts[0] || '';
|
|
218
|
+
oncomplete?.();
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
safeTimeout(() => {
|
|
223
|
+
runSequence(0);
|
|
224
|
+
}, delay);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Detect prefers-reduced-motion
|
|
228
|
+
$effect(() => {
|
|
229
|
+
const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
230
|
+
prefers_reduced_motion = mql.matches;
|
|
231
|
+
|
|
232
|
+
function handleChange(e: MediaQueryListEvent) {
|
|
233
|
+
prefers_reduced_motion = e.matches;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
mql.addEventListener('change', handleChange);
|
|
237
|
+
return () => mql.removeEventListener('change', handleChange);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// Start/restart animation when text changes or reduced motion changes
|
|
241
|
+
$effect(() => {
|
|
242
|
+
// Subscribe to reactive dependencies
|
|
243
|
+
const _texts = texts;
|
|
244
|
+
const _reduced = prefers_reduced_motion;
|
|
245
|
+
|
|
246
|
+
startAnimation();
|
|
247
|
+
|
|
248
|
+
return () => {
|
|
249
|
+
clearAllTimeouts();
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
</script>
|
|
253
|
+
|
|
254
|
+
<span
|
|
255
|
+
class={['typewriter', class_name].filter(Boolean).join(' ')}
|
|
256
|
+
class:cursor-line={cursor === 'line'}
|
|
257
|
+
class:cursor-block={cursor === 'block'}
|
|
258
|
+
class:cursor-underscore={cursor === 'underscore'}
|
|
259
|
+
class:cursor-blink={cursor_blink && !is_typing && cursor !== false}
|
|
260
|
+
class:has-cursor={cursor !== false}
|
|
261
|
+
class:is-typing={is_typing}
|
|
262
|
+
{id}
|
|
263
|
+
aria-label={full_label}>
|
|
264
|
+
<span aria-hidden="true">{displayed}</span>
|
|
265
|
+
</span>
|
|
266
|
+
|
|
267
|
+
<style>
|
|
268
|
+
.typewriter {
|
|
269
|
+
display: inline;
|
|
270
|
+
position: relative;
|
|
271
|
+
|
|
272
|
+
&.has-cursor > span {
|
|
273
|
+
position: relative;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* Line cursor — thin vertical bar */
|
|
277
|
+
&.cursor-line > span::after {
|
|
278
|
+
content: '';
|
|
279
|
+
display: inline-block;
|
|
280
|
+
vertical-align: text-bottom;
|
|
281
|
+
width: 2px;
|
|
282
|
+
height: 1.1em;
|
|
283
|
+
margin-left: 1px;
|
|
284
|
+
background-color: currentColor;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* Block cursor — filled rectangle */
|
|
288
|
+
&.cursor-block > span::after {
|
|
289
|
+
content: '';
|
|
290
|
+
display: inline-block;
|
|
291
|
+
vertical-align: text-bottom;
|
|
292
|
+
width: 0.6em;
|
|
293
|
+
height: 1.1em;
|
|
294
|
+
margin-left: 1px;
|
|
295
|
+
background-color: currentColor;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* Underscore cursor — horizontal line at bottom */
|
|
299
|
+
&.cursor-underscore > span::after {
|
|
300
|
+
content: '';
|
|
301
|
+
display: inline-block;
|
|
302
|
+
vertical-align: baseline;
|
|
303
|
+
width: 0.6em;
|
|
304
|
+
height: 2px;
|
|
305
|
+
margin-left: 1px;
|
|
306
|
+
background-color: currentColor;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* Blink animation — step-end for crisp on/off */
|
|
310
|
+
&.cursor-blink > span::after {
|
|
311
|
+
animation: typewriter-blink 1s step-end infinite;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* Stop blinking while typing */
|
|
315
|
+
&.is-typing > span::after {
|
|
316
|
+
animation: none;
|
|
317
|
+
opacity: 1;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
@keyframes typewriter-blink {
|
|
322
|
+
0%,
|
|
323
|
+
100% {
|
|
324
|
+
opacity: 1;
|
|
325
|
+
}
|
|
326
|
+
50% {
|
|
327
|
+
opacity: 0;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/* Reduced motion: no blinking */
|
|
332
|
+
@media (prefers-reduced-motion: reduce) {
|
|
333
|
+
.typewriter.cursor-blink > span::after {
|
|
334
|
+
animation: none;
|
|
335
|
+
opacity: 1;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
text: string | string[];
|
|
3
|
+
speed?: number;
|
|
4
|
+
delay?: number;
|
|
5
|
+
loop?: boolean;
|
|
6
|
+
pause_between?: number;
|
|
7
|
+
cursor?: 'block' | 'line' | 'underscore' | false;
|
|
8
|
+
cursor_blink?: boolean;
|
|
9
|
+
delete_speed?: number;
|
|
10
|
+
paused?: boolean;
|
|
11
|
+
id?: string;
|
|
12
|
+
class?: string;
|
|
13
|
+
onstart?: (() => void) | undefined;
|
|
14
|
+
oncomplete?: (() => void) | undefined;
|
|
15
|
+
onloop?: ((detail: {
|
|
16
|
+
index: number;
|
|
17
|
+
}) => void) | undefined;
|
|
18
|
+
};
|
|
19
|
+
declare const Typewriter: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
20
|
+
type Typewriter = ReturnType<typeof Typewriter>;
|
|
21
|
+
export default Typewriter;
|
|
22
|
+
//# sourceMappingURL=Typewriter.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Typewriter.svelte.d.ts","sourceRoot":"","sources":["../../src/display/Typewriter.svelte.ts"],"names":[],"mappings":"AAGC,KAAK,gBAAgB,GAAI;IACxB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,GAAG,KAAK,CAAC;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC3D,CAAC;AAuPH,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { default as Accordion, AccordionItem } from './Accordion.svelte';
|
|
2
|
+
export { default as Avatar } from './Avatar.svelte';
|
|
3
|
+
export { default as AvatarGroup } from './AvatarGroup.svelte';
|
|
4
|
+
export type { AvatarData } from './AvatarGroup.svelte';
|
|
5
|
+
export { default as Calendar } from './Calendar.svelte';
|
|
6
|
+
export { default as Chart } from './Chart.svelte';
|
|
7
|
+
export type { ChartData, Dataset as ChartDataset } from './Chart.svelte';
|
|
8
|
+
export type { CalendarEvent, MarkedDate } from './Calendar.svelte';
|
|
9
|
+
export { default as Code } from './Code.svelte';
|
|
10
|
+
export { default as Comparison } from './Comparison.svelte';
|
|
11
|
+
export { default as Counter } from './Counter.svelte';
|
|
12
|
+
export { default as Expand } from './Expand.svelte';
|
|
13
|
+
export { default as List } from './List.svelte';
|
|
14
|
+
export { default as ListItem } from './ListItem.svelte';
|
|
15
|
+
export { default as QR } from './QR.svelte';
|
|
16
|
+
export { default as SplitPane } from './SplitPane.svelte';
|
|
17
|
+
export { default as Stat } from './Stat.svelte';
|
|
18
|
+
export { default as Table } from './Table.svelte';
|
|
19
|
+
export type { Column as TableColumn, PaginationConfig as TablePaginationConfig, VirtualScroll, VirtualScrollOptions, VirtualScroller, CellOption as TableCellOption, CellEditContext as TableCellEditContext, CellEditorContext as TableCellEditorContext, CellAutocompleteContext as TableCellAutocompleteContext, CellEditorType as TableCellEditorType, } from './Table.svelte';
|
|
20
|
+
export { default as Timeline, TimelineItem } from './Timeline.svelte';
|
|
21
|
+
export { default as Tree } from './Tree.svelte';
|
|
22
|
+
export type { TreeNode, FlatTreeNode } from './Tree.svelte';
|
|
23
|
+
export { default as Typewriter } from './Typewriter.svelte';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/display/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACX,MAAM,IAAI,WAAW,EACrB,gBAAgB,IAAI,qBAAqB,EACzC,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,UAAU,IAAI,eAAe,EAC7B,eAAe,IAAI,oBAAoB,EACvC,iBAAiB,IAAI,sBAAsB,EAC3C,uBAAuB,IAAI,4BAA4B,EACvD,cAAc,IAAI,mBAAmB,GACrC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { default as Accordion, AccordionItem } from './Accordion.svelte';
|
|
2
|
+
export { default as Avatar } from './Avatar.svelte';
|
|
3
|
+
export { default as AvatarGroup } from './AvatarGroup.svelte';
|
|
4
|
+
export { default as Calendar } from './Calendar.svelte';
|
|
5
|
+
export { default as Chart } from './Chart.svelte';
|
|
6
|
+
export { default as Code } from './Code.svelte';
|
|
7
|
+
export { default as Comparison } from './Comparison.svelte';
|
|
8
|
+
export { default as Counter } from './Counter.svelte';
|
|
9
|
+
export { default as Expand } from './Expand.svelte';
|
|
10
|
+
export { default as List } from './List.svelte';
|
|
11
|
+
export { default as ListItem } from './ListItem.svelte';
|
|
12
|
+
export { default as QR } from './QR.svelte';
|
|
13
|
+
export { default as SplitPane } from './SplitPane.svelte';
|
|
14
|
+
export { default as Stat } from './Stat.svelte';
|
|
15
|
+
export { default as Table } from './Table.svelte';
|
|
16
|
+
export { default as Timeline, TimelineItem } from './Timeline.svelte';
|
|
17
|
+
export { default as Tree } from './Tree.svelte';
|
|
18
|
+
export { default as Typewriter } from './Typewriter.svelte';
|