svelte-multiselect 11.5.0 → 11.5.2
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/CircleSpinner.svelte +29 -0
- package/dist/CircleSpinner.svelte.d.ts +8 -0
- package/dist/CmdPalette.svelte +74 -0
- package/dist/CmdPalette.svelte.d.ts +76 -0
- package/dist/CodeExample.svelte +85 -0
- package/dist/CodeExample.svelte.d.ts +25 -0
- package/dist/CopyButton.svelte +67 -0
- package/dist/CopyButton.svelte.d.ts +25 -0
- package/dist/FileDetails.svelte +65 -0
- package/dist/FileDetails.svelte.d.ts +22 -0
- package/dist/GitHubCorner.svelte +82 -0
- package/dist/GitHubCorner.svelte.d.ts +13 -0
- package/dist/Icon.svelte +23 -0
- package/dist/Icon.svelte.d.ts +8 -0
- package/dist/MultiSelect.svelte +1725 -0
- package/dist/MultiSelect.svelte.d.ts +25 -0
- package/dist/Nav.svelte +627 -0
- package/dist/Nav.svelte.d.ts +43 -0
- package/dist/PrevNext.svelte +105 -0
- package/dist/PrevNext.svelte.d.ts +56 -0
- package/dist/Toggle.svelte +77 -0
- package/dist/Toggle.svelte.d.ts +11 -0
- package/dist/Wiggle.svelte +22 -0
- package/dist/Wiggle.svelte.d.ts +18 -0
- package/dist/attachments.d.ts +72 -0
- package/dist/attachments.js +698 -0
- package/dist/heading-anchors.d.ts +14 -0
- package/dist/heading-anchors.js +120 -0
- package/dist/icons.d.ts +55 -0
- package/dist/icons.js +54 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +43 -0
- package/dist/types.d.ts +246 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +63 -0
- package/package.json +20 -17
- package/readme.md +25 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<script lang="ts" generics="Item extends [string, unknown] = [string, unknown]">let { items = [], node = `nav`, current = ``, log = `errors`, nav_options = { replace_state: true, no_scroll: true }, titles = { prev: `← Previous`, next: `Next →` }, onkeyup = ({ prev, next }) => ({ ArrowLeft: prev[0], ArrowRight: next[0] }), prev_snippet, children, between, next_snippet, min_items = 3, link_props, ...rest } = $props();
|
|
2
|
+
// Convert items to consistent [key, value] format
|
|
3
|
+
let items_arr = $derived((items ?? []).map((itm) => (typeof itm === `string` ? [itm, itm] : itm)));
|
|
4
|
+
// Calculate prev/next items with wraparound
|
|
5
|
+
let idx = $derived(items_arr.findIndex(([key]) => key === current));
|
|
6
|
+
let prev = $derived(items_arr[idx - 1] ?? items_arr[items_arr.length - 1]);
|
|
7
|
+
let next = $derived(items_arr[idx + 1] ?? items_arr[0]);
|
|
8
|
+
// Validation and logging
|
|
9
|
+
$effect.pre(() => {
|
|
10
|
+
if (log !== `silent`) {
|
|
11
|
+
if (items_arr.length < min_items && log === `verbose`) {
|
|
12
|
+
console.warn(`PrevNext received ${items_arr.length} items - minimum of ${min_items} expected`);
|
|
13
|
+
}
|
|
14
|
+
if (idx < 0 && log === `errors`) {
|
|
15
|
+
const valid = items_arr.map(([key]) => key);
|
|
16
|
+
console.error(`PrevNext received invalid current=${current}, expected one of ${valid}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
function handle_keyup(event) {
|
|
21
|
+
if (!onkeyup)
|
|
22
|
+
return;
|
|
23
|
+
if ((items_arr?.length ?? 0) < min_items)
|
|
24
|
+
return;
|
|
25
|
+
if (!prev || !next)
|
|
26
|
+
return;
|
|
27
|
+
const key_map = onkeyup({ prev, next });
|
|
28
|
+
const to = key_map[event.key];
|
|
29
|
+
if (to !== undefined) {
|
|
30
|
+
const { replace_state, no_scroll } = nav_options;
|
|
31
|
+
const [scroll_x, scroll_y] = no_scroll
|
|
32
|
+
? [window.scrollX, window.scrollY]
|
|
33
|
+
: [0, 0];
|
|
34
|
+
const goto = window.history[replace_state ? `replaceState` : `pushState`];
|
|
35
|
+
goto.call(window.history, {}, ``, to); // Navigate using appropriate history method
|
|
36
|
+
if (no_scroll)
|
|
37
|
+
window.scrollTo(scroll_x, scroll_y); // Restore scroll position if needed
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export {};
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<svelte:window onkeyup={handle_keyup} />
|
|
44
|
+
|
|
45
|
+
{#if items_arr.length >= min_items}
|
|
46
|
+
<svelte:element this={node} class="prev-next" {...rest}>
|
|
47
|
+
<!-- ensures `prev` is a defined [key, value] tuple.
|
|
48
|
+
Due to prior normalization of the `items` prop, any defined `prev` item
|
|
49
|
+
is guaranteed to be a 2-element array except if `prev` is null.
|
|
50
|
+
-->
|
|
51
|
+
{#if prev?.length >= 2}
|
|
52
|
+
{#if prev_snippet}
|
|
53
|
+
{@render prev_snippet({ item: prev })}
|
|
54
|
+
{:else if children}
|
|
55
|
+
{@render children({ kind: `prev`, item: prev })}
|
|
56
|
+
{:else}
|
|
57
|
+
<div>
|
|
58
|
+
{#if titles.prev}<span>{@html titles.prev}</span>{/if}
|
|
59
|
+
<a data-sveltekit-preload-data="hover" {...link_props} href={prev[0]}>{
|
|
60
|
+
prev[0]
|
|
61
|
+
}</a>
|
|
62
|
+
</div>
|
|
63
|
+
{/if}
|
|
64
|
+
{/if}
|
|
65
|
+
{@render between?.()}
|
|
66
|
+
{#if next?.length >= 2}
|
|
67
|
+
{#if next_snippet}
|
|
68
|
+
{@render next_snippet({ item: next })}
|
|
69
|
+
{:else if children}
|
|
70
|
+
{@render children({ kind: `next`, item: next })}
|
|
71
|
+
{:else}
|
|
72
|
+
<div>
|
|
73
|
+
{#if titles.next}<span>{@html titles.next}</span>{/if}
|
|
74
|
+
<a data-sveltekit-preload-data="hover" {...link_props} href={next[0]}>{
|
|
75
|
+
next[0]
|
|
76
|
+
}</a>
|
|
77
|
+
</div>
|
|
78
|
+
{/if}
|
|
79
|
+
{/if}
|
|
80
|
+
</svelte:element>
|
|
81
|
+
{/if}
|
|
82
|
+
|
|
83
|
+
<style>
|
|
84
|
+
.prev-next {
|
|
85
|
+
display: flex;
|
|
86
|
+
list-style: none;
|
|
87
|
+
place-content: space-between;
|
|
88
|
+
gap: var(--prev-next-gap, 2em);
|
|
89
|
+
padding: var(--prev-next-padding, 0);
|
|
90
|
+
margin: var(--prev-next-margin, 3em auto);
|
|
91
|
+
}
|
|
92
|
+
.prev-next a {
|
|
93
|
+
color: var(--prev-next-color);
|
|
94
|
+
background: var(--prev-next-link-bg);
|
|
95
|
+
padding: var(--prev-next-link-padding);
|
|
96
|
+
border-radius: var(--prev-next-link-border-radius);
|
|
97
|
+
}
|
|
98
|
+
.prev-next span {
|
|
99
|
+
display: block;
|
|
100
|
+
margin: var(--prev-next-label-margin, 0 auto 1ex);
|
|
101
|
+
}
|
|
102
|
+
.prev-next > div:nth-child(2) {
|
|
103
|
+
text-align: right;
|
|
104
|
+
}
|
|
105
|
+
</style>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
declare function $$render<Item extends [string, unknown] = [string, unknown]>(): {
|
|
4
|
+
props: Omit<HTMLAttributes<HTMLElement>, "children" | "onkeyup"> & {
|
|
5
|
+
items?: (string | Item)[];
|
|
6
|
+
node?: string;
|
|
7
|
+
current?: string;
|
|
8
|
+
log?: `verbose` | `errors` | `silent`;
|
|
9
|
+
nav_options?: {
|
|
10
|
+
replace_state: boolean;
|
|
11
|
+
no_scroll: boolean;
|
|
12
|
+
};
|
|
13
|
+
titles?: {
|
|
14
|
+
prev: string;
|
|
15
|
+
next: string;
|
|
16
|
+
};
|
|
17
|
+
onkeyup?: ((obj: {
|
|
18
|
+
prev: Item;
|
|
19
|
+
next: Item;
|
|
20
|
+
}) => Record<string, string | undefined>) | null;
|
|
21
|
+
prev_snippet?: Snippet<[{
|
|
22
|
+
item: Item;
|
|
23
|
+
}]>;
|
|
24
|
+
children?: Snippet<[{
|
|
25
|
+
kind: `prev` | `next`;
|
|
26
|
+
item: Item;
|
|
27
|
+
}]>;
|
|
28
|
+
between?: Snippet<[]>;
|
|
29
|
+
next_snippet?: Snippet<[{
|
|
30
|
+
item: Item;
|
|
31
|
+
}]>;
|
|
32
|
+
min_items?: number;
|
|
33
|
+
link_props?: HTMLAttributes<HTMLAnchorElement>;
|
|
34
|
+
};
|
|
35
|
+
exports: {};
|
|
36
|
+
bindings: "";
|
|
37
|
+
slots: {};
|
|
38
|
+
events: {};
|
|
39
|
+
};
|
|
40
|
+
declare class __sveltets_Render<Item extends [string, unknown] = [string, unknown]> {
|
|
41
|
+
props(): ReturnType<typeof $$render<Item>>['props'];
|
|
42
|
+
events(): ReturnType<typeof $$render<Item>>['events'];
|
|
43
|
+
slots(): ReturnType<typeof $$render<Item>>['slots'];
|
|
44
|
+
bindings(): "";
|
|
45
|
+
exports(): {};
|
|
46
|
+
}
|
|
47
|
+
interface $$IsomorphicComponent {
|
|
48
|
+
new <Item extends [string, unknown] = [string, unknown]>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Item>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Item>['props']>, ReturnType<__sveltets_Render<Item>['events']>, ReturnType<__sveltets_Render<Item>['slots']>> & {
|
|
49
|
+
$$bindings?: ReturnType<__sveltets_Render<Item>['bindings']>;
|
|
50
|
+
} & ReturnType<__sveltets_Render<Item>['exports']>;
|
|
51
|
+
<Item extends [string, unknown] = [string, unknown]>(internal: unknown, props: ReturnType<__sveltets_Render<Item>['props']> & {}): ReturnType<__sveltets_Render<Item>['exports']>;
|
|
52
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
53
|
+
}
|
|
54
|
+
declare const PrevNext: $$IsomorphicComponent;
|
|
55
|
+
type PrevNext<Item extends [string, unknown] = [string, unknown]> = InstanceType<typeof PrevNext<Item>>;
|
|
56
|
+
export default PrevNext;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<script lang="ts">let { checked = $bindable(false), onkeydown, children, input_props, ...rest } = $props();
|
|
2
|
+
// normally input type=checkbox toggles on space bar, this handler also responds to enter
|
|
3
|
+
function handle_keydown(event) {
|
|
4
|
+
onkeydown?.(event);
|
|
5
|
+
if (event.key === `Enter`) {
|
|
6
|
+
event.preventDefault();
|
|
7
|
+
const target = event.target;
|
|
8
|
+
target.click(); // simulate real user toggle so 'change' is dispatched
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<label {...rest}>
|
|
15
|
+
{@render children?.()}
|
|
16
|
+
<input
|
|
17
|
+
type="checkbox"
|
|
18
|
+
bind:checked
|
|
19
|
+
{...input_props}
|
|
20
|
+
onkeydown={handle_keydown}
|
|
21
|
+
/>
|
|
22
|
+
<span></span>
|
|
23
|
+
</label>
|
|
24
|
+
|
|
25
|
+
<style>
|
|
26
|
+
label {
|
|
27
|
+
display: var(--toggle-label-display, inline-flex);
|
|
28
|
+
align-items: var(--toggle-label-align-items, center);
|
|
29
|
+
width: var(--toggle-label-width, max-content);
|
|
30
|
+
vertical-align: var(--toggle-label-vertical-align, middle);
|
|
31
|
+
}
|
|
32
|
+
span {
|
|
33
|
+
box-sizing: border-box;
|
|
34
|
+
height: var(--toggle-knob-height, 1.5em);
|
|
35
|
+
width: var(--toggle-knob-width, 3em);
|
|
36
|
+
padding: var(--toggle-knob-padding, 0.1em);
|
|
37
|
+
border: var(--toggle-knob-border, 1px solid light-dark(lightgray, #555));
|
|
38
|
+
border-radius: var(--toggle-knob-border-radius, 0.75em);
|
|
39
|
+
transition: var(--toggle-knob-transition, 0.3s);
|
|
40
|
+
}
|
|
41
|
+
input:checked + span {
|
|
42
|
+
background: var(--toggle-background, light-dark(#222, #555));
|
|
43
|
+
}
|
|
44
|
+
input {
|
|
45
|
+
position: absolute;
|
|
46
|
+
opacity: 0;
|
|
47
|
+
width: var(--toggle-input-width, 1em);
|
|
48
|
+
}
|
|
49
|
+
input + span::after {
|
|
50
|
+
content: '';
|
|
51
|
+
display: var(--toggle-knob-after-display, block);
|
|
52
|
+
height: var(--toggle-knob-after-height, 1.2em);
|
|
53
|
+
width: var(--toggle-knob-after-width, 1.2em);
|
|
54
|
+
border-radius: var(--toggle-knob-after-border-radius, 50%);
|
|
55
|
+
background: var(--toggle-knob-after-background, light-dark(gray, #888));
|
|
56
|
+
transition: var(--toggle-knob-after-transition, 0.3s);
|
|
57
|
+
}
|
|
58
|
+
input:checked + span::after {
|
|
59
|
+
background: var(--toggle-knob-after-background, light-dark(green, #4ade80));
|
|
60
|
+
transform: var(
|
|
61
|
+
--toggle-knob-after-transform,
|
|
62
|
+
translate(
|
|
63
|
+
calc(
|
|
64
|
+
var(--toggle-knob-width, 3em) - var(--toggle-knob-height, 1.5em)
|
|
65
|
+
+ var(--toggle-knob-padding, 0.1em)
|
|
66
|
+
- var(--toggle-knob-border, 2px)
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
input:focus + span {
|
|
72
|
+
border: var(
|
|
73
|
+
--toggle-knob-focus-border,
|
|
74
|
+
1px solid light-dark(cornflowerblue, #6495ed)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
</style>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
type $$ComponentProps = HTMLAttributes<HTMLLabelElement> & {
|
|
4
|
+
checked?: boolean;
|
|
5
|
+
onkeydown?: (event: KeyboardEvent) => void;
|
|
6
|
+
children?: Snippet<[]>;
|
|
7
|
+
input_props?: HTMLAttributes<HTMLInputElement>;
|
|
8
|
+
};
|
|
9
|
+
declare const Toggle: import("svelte").Component<$$ComponentProps, {}, "checked">;
|
|
10
|
+
type Toggle = ReturnType<typeof Toggle>;
|
|
11
|
+
export default Toggle;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script lang="ts">import { Spring } from 'svelte/motion';
|
|
2
|
+
let { wiggle = $bindable(false), angle = 0, scale = 1, dx = 0, dy = 0, duration = 200, spring_options = $bindable({ stiffness: 0.05, damping: 0.1 }), children, ...rest } = $props();
|
|
3
|
+
const store = Spring.of(() => (wiggle ? { scale, angle, dx, dy } : { angle: 0, scale: 1, dx: 0, dy: 0 }), spring_options);
|
|
4
|
+
// update spring physics when options change
|
|
5
|
+
$effect(() => {
|
|
6
|
+
store.stiffness = spring_options.stiffness;
|
|
7
|
+
store.damping = spring_options.damping;
|
|
8
|
+
});
|
|
9
|
+
$effect.pre(() => {
|
|
10
|
+
if (wiggle)
|
|
11
|
+
setTimeout(() => (wiggle = false), duration);
|
|
12
|
+
});
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<span
|
|
16
|
+
{...rest}
|
|
17
|
+
style:display="inline-block"
|
|
18
|
+
style:transform="rotate({store.current.angle}deg) scale({store.current.scale})
|
|
19
|
+
translate({store.current.dx}px, {store.current.dy}px)"
|
|
20
|
+
>
|
|
21
|
+
{@render children?.()}
|
|
22
|
+
</span>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
type $$ComponentProps = HTMLAttributes<HTMLSpanElement> & {
|
|
4
|
+
wiggle?: boolean;
|
|
5
|
+
angle?: number;
|
|
6
|
+
scale?: number;
|
|
7
|
+
dx?: number;
|
|
8
|
+
dy?: number;
|
|
9
|
+
duration?: number;
|
|
10
|
+
spring_options?: {
|
|
11
|
+
stiffness: number;
|
|
12
|
+
damping: number;
|
|
13
|
+
};
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
};
|
|
16
|
+
declare const Wiggle: import("svelte").Component<$$ComponentProps, {}, "wiggle" | "spring_options">;
|
|
17
|
+
type Wiggle = ReturnType<typeof Wiggle>;
|
|
18
|
+
export default Wiggle;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type Attachment } from 'svelte/attachments';
|
|
2
|
+
declare global {
|
|
3
|
+
interface CSS {
|
|
4
|
+
highlights: HighlightRegistry;
|
|
5
|
+
}
|
|
6
|
+
interface HighlightRegistry extends Map<string, Highlight> {
|
|
7
|
+
clear(): void;
|
|
8
|
+
delete(key: string): boolean;
|
|
9
|
+
set(key: string, value: Highlight): this;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export interface DraggableOptions {
|
|
13
|
+
handle_selector?: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
on_drag_start?: (event: MouseEvent) => void;
|
|
16
|
+
on_drag?: (event: MouseEvent) => void;
|
|
17
|
+
on_drag_end?: (event: MouseEvent) => void;
|
|
18
|
+
}
|
|
19
|
+
export type Dimensions = {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
};
|
|
23
|
+
export type ResizeCallback = (event: MouseEvent, dimensions: Dimensions) => void;
|
|
24
|
+
export interface ResizableOptions {
|
|
25
|
+
edges?: (`top` | `right` | `bottom` | `left`)[];
|
|
26
|
+
min_width?: number;
|
|
27
|
+
min_height?: number;
|
|
28
|
+
max_width?: number;
|
|
29
|
+
max_height?: number;
|
|
30
|
+
handle_size?: number;
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
on_resize_start?: ResizeCallback;
|
|
33
|
+
on_resize?: ResizeCallback;
|
|
34
|
+
on_resize_end?: ResizeCallback;
|
|
35
|
+
}
|
|
36
|
+
export declare const draggable: (options?: DraggableOptions) => Attachment;
|
|
37
|
+
export declare const resizable: (options?: ResizableOptions) => Attachment;
|
|
38
|
+
export declare function get_html_sort_value(element: HTMLElement): string;
|
|
39
|
+
export interface SortableOptions {
|
|
40
|
+
header_selector?: string;
|
|
41
|
+
asc_class?: string;
|
|
42
|
+
desc_class?: string;
|
|
43
|
+
sorted_style?: Partial<CSSStyleDeclaration>;
|
|
44
|
+
disabled?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export declare const sortable: (options?: SortableOptions) => (node: HTMLElement) => (() => void) | undefined;
|
|
47
|
+
export type HighlightOptions = {
|
|
48
|
+
query?: string;
|
|
49
|
+
disabled?: boolean;
|
|
50
|
+
fuzzy?: boolean;
|
|
51
|
+
node_filter?: (node: Node) => number;
|
|
52
|
+
css_class?: string;
|
|
53
|
+
};
|
|
54
|
+
export declare const highlight_matches: (ops: HighlightOptions) => (node: HTMLElement) => (() => boolean) | undefined;
|
|
55
|
+
export interface TooltipOptions {
|
|
56
|
+
content?: string;
|
|
57
|
+
placement?: `top` | `bottom` | `left` | `right`;
|
|
58
|
+
delay?: number;
|
|
59
|
+
hide_delay?: number;
|
|
60
|
+
disabled?: boolean | `touch-devices`;
|
|
61
|
+
style?: string;
|
|
62
|
+
show_arrow?: boolean;
|
|
63
|
+
offset?: number;
|
|
64
|
+
allow_html?: boolean;
|
|
65
|
+
}
|
|
66
|
+
export declare const tooltip: (options?: TooltipOptions) => Attachment;
|
|
67
|
+
export type ClickOutsideConfig<T extends HTMLElement> = {
|
|
68
|
+
enabled?: boolean;
|
|
69
|
+
exclude?: string[];
|
|
70
|
+
callback?: (node: T, config: ClickOutsideConfig<T>) => void;
|
|
71
|
+
};
|
|
72
|
+
export declare const click_outside: <T extends HTMLElement>(config?: ClickOutsideConfig<T>) => (node: T) => (() => void) | undefined;
|