svelte-multiselect 11.1.1 → 11.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/CircleSpinner.svelte +2 -1
  2. package/dist/CmdPalette.svelte +16 -9
  3. package/dist/CmdPalette.svelte.d.ts +4 -5
  4. package/dist/CodeExample.svelte +80 -0
  5. package/dist/CodeExample.svelte.d.ts +22 -0
  6. package/dist/CopyButton.svelte +47 -0
  7. package/dist/CopyButton.svelte.d.ts +25 -0
  8. package/dist/FileDetails.svelte +52 -0
  9. package/dist/FileDetails.svelte.d.ts +20 -0
  10. package/dist/GitHubCorner.svelte +82 -0
  11. package/dist/GitHubCorner.svelte.d.ts +13 -0
  12. package/dist/Icon.svelte +23 -0
  13. package/dist/Icon.svelte.d.ts +8 -0
  14. package/dist/MultiSelect.svelte +129 -76
  15. package/dist/MultiSelect.svelte.d.ts +2 -3
  16. package/dist/PrevNext.svelte +100 -0
  17. package/dist/PrevNext.svelte.d.ts +48 -0
  18. package/dist/RadioButtons.svelte +67 -0
  19. package/dist/RadioButtons.svelte.d.ts +44 -0
  20. package/dist/Toggle.svelte +78 -0
  21. package/dist/Toggle.svelte.d.ts +16 -0
  22. package/dist/icons.d.ts +47 -0
  23. package/dist/icons.js +46 -0
  24. package/dist/index.d.ts +10 -3
  25. package/dist/index.js +10 -3
  26. package/dist/types.d.ts +141 -0
  27. package/dist/utils.d.ts +6 -22
  28. package/dist/utils.js +17 -25
  29. package/package.json +17 -36
  30. package/readme.md +287 -121
  31. package/dist/icons/ChevronExpand.svelte +0 -9
  32. package/dist/icons/ChevronExpand.svelte.d.ts +0 -4
  33. package/dist/icons/Cross.svelte +0 -10
  34. package/dist/icons/Cross.svelte.d.ts +0 -4
  35. package/dist/icons/Disabled.svelte +0 -10
  36. package/dist/icons/Disabled.svelte.d.ts +0 -4
  37. package/dist/icons/Octocat.svelte +0 -9
  38. package/dist/icons/Octocat.svelte.d.ts +0 -4
  39. package/dist/icons/index.d.ts +0 -4
  40. package/dist/icons/index.js +0 -4
  41. package/dist/props.d.ts +0 -143
  42. package/dist/props.js +0 -1
@@ -0,0 +1,44 @@
1
+ import type { Snippet } from 'svelte';
2
+ type GenericOption = string | number | {
3
+ value: unknown;
4
+ label: string | number;
5
+ };
6
+ declare class __sveltets_Render<Option extends GenericOption> {
7
+ props(): {
8
+ [key: string]: unknown;
9
+ options: Option[];
10
+ selected?: string | number | null;
11
+ id?: string | null;
12
+ name?: string | null;
13
+ disabled?: boolean;
14
+ required?: boolean;
15
+ aria_label?: string | null;
16
+ onclick?: ((event: MouseEvent) => void) | undefined;
17
+ onchange?: ((event: Event) => void) | undefined;
18
+ oninput?: ((event: Event) => void) | undefined;
19
+ option_snippet?: Snippet<[{
20
+ option: Option;
21
+ selected: boolean;
22
+ active: boolean;
23
+ }]> | undefined;
24
+ children?: Snippet<[{
25
+ option: Option;
26
+ selected: boolean;
27
+ active: boolean;
28
+ }]> | undefined;
29
+ };
30
+ events(): {};
31
+ slots(): {};
32
+ bindings(): "selected";
33
+ exports(): {};
34
+ }
35
+ interface $$IsomorphicComponent {
36
+ new <Option extends GenericOption>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Option>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Option>['props']>, ReturnType<__sveltets_Render<Option>['events']>, ReturnType<__sveltets_Render<Option>['slots']>> & {
37
+ $$bindings?: ReturnType<__sveltets_Render<Option>['bindings']>;
38
+ } & ReturnType<__sveltets_Render<Option>['exports']>;
39
+ <Option extends GenericOption>(internal: unknown, props: ReturnType<__sveltets_Render<Option>['props']> & {}): ReturnType<__sveltets_Render<Option>['exports']>;
40
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
41
+ }
42
+ declare const RadioButtons: $$IsomorphicComponent;
43
+ type RadioButtons<Option extends GenericOption> = InstanceType<typeof RadioButtons<Option>>;
44
+ export default RadioButtons;
@@ -0,0 +1,78 @@
1
+ <script lang="ts">let { checked = $bindable(false), required = false, input_style = ``, id = null, onclick, onchange, onblur, onkeydown, children, ...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
+ checked = !checked;
8
+ }
9
+ }
10
+ export {};
11
+ </script>
12
+
13
+ <label {...rest}>
14
+ {@render children?.()}
15
+ <input
16
+ type="checkbox"
17
+ bind:checked
18
+ {id}
19
+ {required}
20
+ onkeydown={handle_keydown}
21
+ {onchange}
22
+ {onblur}
23
+ {onclick}
24
+ style={input_style}
25
+ />
26
+ <span></span>
27
+ </label>
28
+
29
+ <style>
30
+ label {
31
+ display: var(--toggle-label-display, inline-flex);
32
+ align-items: var(--toggle-label-align-items, center);
33
+ width: var(--toggle-label-width, max-content);
34
+ vertical-align: var(--toggle-label-vertical-align, middle);
35
+ }
36
+ span {
37
+ box-sizing: border-box;
38
+ height: var(--toggle-knob-height, 1.5em);
39
+ width: var(--toggle-knob-width, 3em);
40
+ padding: var(--toggle-knob-padding, 0.1em);
41
+ border: var(--toggle-knob-border, 1px solid lightgray);
42
+ border-radius: var(--toggle-knob-border-radius, 0.75em);
43
+ transition: var(--toggle-knob-transition, 0.3s);
44
+ }
45
+ input:checked + span {
46
+ background: var(--toggle-background, black);
47
+ }
48
+ input {
49
+ position: absolute;
50
+ opacity: 0;
51
+ width: var(--toggle-input-width, 1em);
52
+ }
53
+ input + span::after {
54
+ content: '';
55
+ display: var(--toggle-knob-after-display, block);
56
+ height: var(--toggle-knob-after-height, 1.2em);
57
+ width: var(--toggle-knob-after-width, 1.2em);
58
+ border-radius: var(--toggle-knob-after-border-radius, 50%);
59
+ background: var(--toggle-knob-after-background, gray);
60
+ transition: var(--toggle-knob-after-transition, 0.3s);
61
+ }
62
+ input:checked + span::after {
63
+ background: var(--toggle-knob-after-background, green);
64
+ transform: var(
65
+ --toggle-knob-after-transform,
66
+ translate(
67
+ calc(
68
+ var(--toggle-knob-width, 3em) - var(--toggle-knob-height, 1.5em)
69
+ + var(--toggle-knob-padding, 0.1em)
70
+ - var(--toggle-knob-border, 2px)
71
+ )
72
+ )
73
+ );
74
+ }
75
+ input:focus + span {
76
+ border: var(--toggle-knob-focus-border, 1px solid cornflowerblue);
77
+ }
78
+ </style>
@@ -0,0 +1,16 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ checked?: boolean;
4
+ required?: boolean;
5
+ input_style?: string;
6
+ id?: string | null;
7
+ onclick?: (event: MouseEvent) => void;
8
+ onchange?: (event: Event) => void;
9
+ onblur?: (event: FocusEvent) => void;
10
+ onkeydown?: (event: KeyboardEvent) => void;
11
+ children?: Snippet<[]>;
12
+ [key: string]: unknown;
13
+ }
14
+ declare const Toggle: import("svelte").Component<Props, {}, "checked">;
15
+ type Toggle = ReturnType<typeof Toggle>;
16
+ export default Toggle;
@@ -0,0 +1,47 @@
1
+ export declare const icon_data: {
2
+ readonly Alert: {
3
+ readonly viewBox: "0 0 16 16";
4
+ readonly path: "M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z";
5
+ };
6
+ readonly Check: {
7
+ readonly viewBox: "0 0 12 16";
8
+ readonly path: "M12 5l-8 8l-4-4l1.5-1.5L4 10l6.5-6.5L12 5z";
9
+ };
10
+ readonly ChevronExpand: {
11
+ readonly viewBox: "0 0 16 16";
12
+ readonly path: "M3.646 9.146a.5.5 0 0 1 .708 0L8 12.793l3.646-3.647a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 0-.708zm0-2.292a.5.5 0 0 0 .708 0L8 3.207l3.646 3.647a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 0 0 0 .708z";
13
+ };
14
+ readonly Collapse: {
15
+ readonly viewBox: "0 0 24 24";
16
+ readonly path: "M12 7.59L7.05 2.64L5.64 4.05L12 10.41l6.36-6.36l-1.41-1.41L12 7.59zM5.64 19.95l1.41 1.41L12 16.41l4.95 4.95l1.41-1.41L12 13.59l-6.36 6.36z";
17
+ };
18
+ readonly Copy: {
19
+ readonly viewBox: "0 0 16 16";
20
+ readonly path: "M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z";
21
+ };
22
+ readonly Cross: {
23
+ readonly viewBox: "0 0 24 24";
24
+ readonly path: "M18.3 5.71a.996.996 0 0 0-1.41 0L12 10.59L7.11 5.7A.996.996 0 1 0 5.7 7.11L10.59 12L5.7 16.89a.996.996 0 1 0 1.41 1.41L12 13.41l4.89 4.89a.996.996 0 1 0 1.41-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z";
25
+ };
26
+ readonly Disabled: {
27
+ readonly viewBox: "0 0 24 24";
28
+ readonly path: "M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10Zm-4.906-3.68L18.32 7.094A8 8 0 0 1 7.094 18.32ZM5.68 16.906A8 8 0 0 1 16.906 5.68L5.68 16.906Z";
29
+ };
30
+ readonly Expand: {
31
+ readonly viewBox: "0 0 24 24";
32
+ readonly path: "m12 19.24l-4.95-4.95l-1.41 1.42L12 22.07l6.36-6.36l-1.41-1.42L12 19.24zM5.64 8.29l1.41 1.42L12 4.76l4.95 4.95l1.41-1.42L12 1.93L5.64 8.29z";
33
+ };
34
+ readonly GitHub: {
35
+ readonly viewBox: "0 0 24 24";
36
+ readonly path: "M8.422 20.081c0 .896.01 1.753.016 2.285a.617.617 0 0 0 .422.58c2.078.686 4.317.718 6.414.091l.292-.087a.67.67 0 0 0 .478-.638c.005-.733.017-2.017.017-3.53c0-1.372-.477-2.25-1.031-2.707c3.399-.366 6.97-1.61 6.97-7.227c0-1.61-.592-2.91-1.566-3.934c.153-.366.688-1.866-.153-3.878c0 0-1.28-.403-4.201 1.5a14.76 14.76 0 0 0-3.82-.494c-1.298 0-2.597.165-3.819.494C5.52.65 4.24 1.036 4.24 1.036c-.84 2.012-.306 3.512-.153 3.878a5.565 5.565 0 0 0-1.566 3.934c0 5.598 3.552 6.86 6.951 7.227c-.439.366-.84 1.006-.973 1.957c-.879.384-3.075 1.006-4.45-1.207c-.286-.44-1.146-1.519-2.349-1.5c-1.28.018-.516.695.02.97c.648.347 1.393 1.646 1.565 2.067c.306.823 1.299 2.396 5.137 1.72Z";
37
+ };
38
+ readonly StackBlitz: {
39
+ readonly viewBox: "0 0 24 24";
40
+ readonly path: "M10.797 14.182H3.635L16.728 0l-3.525 9.818h7.162L7.272 24l3.524-9.818Z";
41
+ };
42
+ readonly Svelte: {
43
+ readonly viewBox: "0 0 24 24";
44
+ readonly path: "M10.354 21.125a4.44 4.44 0 0 1-4.765-1.767a4.109 4.109 0 0 1-.703-3.107a3.898 3.898 0 0 1 .134-.522l.105-.321l.287.21a7.21 7.21 0 0 0 2.186 1.092l.208.063l-.02.208a1.253 1.253 0 0 0 .226.83a1.337 1.337 0 0 0 1.435.533a1.231 1.231 0 0 0 .343-.15l5.59-3.562a1.164 1.164 0 0 0 .524-.778a1.242 1.242 0 0 0-.211-.937a1.338 1.338 0 0 0-1.435-.533a1.23 1.23 0 0 0-.343.15l-2.133 1.36a4.078 4.078 0 0 1-1.135.499a4.44 4.44 0 0 1-4.765-1.766a4.108 4.108 0 0 1-.702-3.108a3.855 3.855 0 0 1 1.742-2.582l5.589-3.563a4.072 4.072 0 0 1 1.135-.499a4.44 4.44 0 0 1 4.765 1.767a4.109 4.109 0 0 1 .703 3.107a3.943 3.943 0 0 1-.134.522l-.105.321l-.286-.21a7.204 7.204 0 0 0-2.187-1.093l-.208-.063l.02-.207a1.255 1.255 0 0 0-.226-.831a1.337 1.337 0 0 0-1.435-.532a1.231 1.231 0 0 0-.343.15L8.62 9.368a1.162 1.162 0 0 0-.524.778a1.24 1.24 0 0 0 .211.937a1.338 1.338 0 0 0 1.435.533a1.235 1.235 0 0 0 .344-.151l2.132-1.36a4.067 4.067 0 0 1 1.135-.498a4.44 4.44 0 0 1 4.765 1.766a4.108 4.108 0 0 1 .702 3.108a3.857 3.857 0 0 1-1.742 2.583l-5.589 3.562a4.072 4.072 0 0 1-1.135.499m10.358-17.95C18.484-.015 14.082-.96 10.9 1.068L5.31 4.63a6.412 6.412 0 0 0-2.896 4.295a6.753 6.753 0 0 0 .666 4.336a6.43 6.43 0 0 0-.96 2.396a6.833 6.833 0 0 0 1.168 5.167c2.229 3.19 6.63 4.135 9.812 2.108l5.59-3.562a6.41 6.41 0 0 0 2.896-4.295a6.756 6.756 0 0 0-.665-4.336a6.429 6.429 0 0 0 .958-2.396a6.831 6.831 0 0 0-1.167-5.168Z";
45
+ };
46
+ };
47
+ export type IconName = keyof typeof icon_data;
package/dist/icons.js ADDED
@@ -0,0 +1,46 @@
1
+ export const icon_data = {
2
+ Alert: {
3
+ viewBox: `0 0 16 16`,
4
+ path: `M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z`,
5
+ },
6
+ Check: {
7
+ viewBox: `0 0 12 16`,
8
+ path: `M12 5l-8 8l-4-4l1.5-1.5L4 10l6.5-6.5L12 5z`,
9
+ },
10
+ ChevronExpand: {
11
+ viewBox: `0 0 16 16`,
12
+ path: `M3.646 9.146a.5.5 0 0 1 .708 0L8 12.793l3.646-3.647a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 0-.708zm0-2.292a.5.5 0 0 0 .708 0L8 3.207l3.646 3.647a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 0 0 0 .708z`,
13
+ },
14
+ Collapse: {
15
+ viewBox: `0 0 24 24`,
16
+ path: `M12 7.59L7.05 2.64L5.64 4.05L12 10.41l6.36-6.36l-1.41-1.41L12 7.59zM5.64 19.95l1.41 1.41L12 16.41l4.95 4.95l1.41-1.41L12 13.59l-6.36 6.36z`,
17
+ },
18
+ Copy: {
19
+ viewBox: `0 0 16 16`,
20
+ path: `M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z`,
21
+ },
22
+ Cross: {
23
+ viewBox: `0 0 24 24`,
24
+ path: `M18.3 5.71a.996.996 0 0 0-1.41 0L12 10.59L7.11 5.7A.996.996 0 1 0 5.7 7.11L10.59 12L5.7 16.89a.996.996 0 1 0 1.41 1.41L12 13.41l4.89 4.89a.996.996 0 1 0 1.41-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z`,
25
+ },
26
+ Disabled: {
27
+ viewBox: `0 0 24 24`,
28
+ path: `M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10Zm-4.906-3.68L18.32 7.094A8 8 0 0 1 7.094 18.32ZM5.68 16.906A8 8 0 0 1 16.906 5.68L5.68 16.906Z`,
29
+ },
30
+ Expand: {
31
+ viewBox: `0 0 24 24`,
32
+ path: `m12 19.24l-4.95-4.95l-1.41 1.42L12 22.07l6.36-6.36l-1.41-1.42L12 19.24zM5.64 8.29l1.41 1.42L12 4.76l4.95 4.95l1.41-1.42L12 1.93L5.64 8.29z`,
33
+ },
34
+ GitHub: {
35
+ viewBox: `0 0 24 24`,
36
+ path: `M8.422 20.081c0 .896.01 1.753.016 2.285a.617.617 0 0 0 .422.58c2.078.686 4.317.718 6.414.091l.292-.087a.67.67 0 0 0 .478-.638c.005-.733.017-2.017.017-3.53c0-1.372-.477-2.25-1.031-2.707c3.399-.366 6.97-1.61 6.97-7.227c0-1.61-.592-2.91-1.566-3.934c.153-.366.688-1.866-.153-3.878c0 0-1.28-.403-4.201 1.5a14.76 14.76 0 0 0-3.82-.494c-1.298 0-2.597.165-3.819.494C5.52.65 4.24 1.036 4.24 1.036c-.84 2.012-.306 3.512-.153 3.878a5.565 5.565 0 0 0-1.566 3.934c0 5.598 3.552 6.86 6.951 7.227c-.439.366-.84 1.006-.973 1.957c-.879.384-3.075 1.006-4.45-1.207c-.286-.44-1.146-1.519-2.349-1.5c-1.28.018-.516.695.02.97c.648.347 1.393 1.646 1.565 2.067c.306.823 1.299 2.396 5.137 1.72Z`,
37
+ },
38
+ StackBlitz: {
39
+ viewBox: `0 0 24 24`,
40
+ path: `M10.797 14.182H3.635L16.728 0l-3.525 9.818h7.162L7.272 24l3.524-9.818Z`,
41
+ },
42
+ Svelte: {
43
+ viewBox: `0 0 24 24`,
44
+ path: `M10.354 21.125a4.44 4.44 0 0 1-4.765-1.767a4.109 4.109 0 0 1-.703-3.107a3.898 3.898 0 0 1 .134-.522l.105-.321l.287.21a7.21 7.21 0 0 0 2.186 1.092l.208.063l-.02.208a1.253 1.253 0 0 0 .226.83a1.337 1.337 0 0 0 1.435.533a1.231 1.231 0 0 0 .343-.15l5.59-3.562a1.164 1.164 0 0 0 .524-.778a1.242 1.242 0 0 0-.211-.937a1.338 1.338 0 0 0-1.435-.533a1.23 1.23 0 0 0-.343.15l-2.133 1.36a4.078 4.078 0 0 1-1.135.499a4.44 4.44 0 0 1-4.765-1.766a4.108 4.108 0 0 1-.702-3.108a3.855 3.855 0 0 1 1.742-2.582l5.589-3.563a4.072 4.072 0 0 1 1.135-.499a4.44 4.44 0 0 1 4.765 1.767a4.109 4.109 0 0 1 .703 3.107a3.943 3.943 0 0 1-.134.522l-.105.321l-.286-.21a7.204 7.204 0 0 0-2.187-1.093l-.208-.063l.02-.207a1.255 1.255 0 0 0-.226-.831a1.337 1.337 0 0 0-1.435-.532a1.231 1.231 0 0 0-.343.15L8.62 9.368a1.162 1.162 0 0 0-.524.778a1.24 1.24 0 0 0 .211.937a1.338 1.338 0 0 0 1.435.533a1.235 1.235 0 0 0 .344-.151l2.132-1.36a4.067 4.067 0 0 1 1.135-.498a4.44 4.44 0 0 1 4.765 1.766a4.108 4.108 0 0 1 .702 3.108a3.857 3.857 0 0 1-1.742 2.583l-5.589 3.562a4.072 4.072 0 0 1-1.135.499m10.358-17.95C18.484-.015 14.082-.96 10.9 1.068L5.31 4.63a6.412 6.412 0 0 0-2.896 4.295a6.753 6.753 0 0 0 .666 4.336a6.43 6.43 0 0 0-.96 2.396a6.833 6.833 0 0 0 1.168 5.167c2.229 3.19 6.63 4.135 9.812 2.108l5.59-3.562a6.41 6.41 0 0 0 2.896-4.295a6.756 6.756 0 0 0-.665-4.336a6.429 6.429 0 0 0 .958-2.396a6.831 6.831 0 0 0-1.167-5.168Z`,
45
+ },
46
+ };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,14 @@
1
1
  export { default as CircleSpinner } from './CircleSpinner.svelte';
2
2
  export { default as CmdPalette } from './CmdPalette.svelte';
3
- export { default as MultiSelect, default } from './MultiSelect.svelte';
4
- export { default as Wiggle } from './Wiggle.svelte';
5
- export * from './props';
3
+ export { default as CodeExample } from './CodeExample.svelte';
4
+ export { default as CopyButton } from './CopyButton.svelte';
5
+ export { default as FileDetails } from './FileDetails.svelte';
6
+ export { default as GitHubCorner } from './GitHubCorner.svelte';
7
+ export { default as Icon } from './Icon.svelte';
8
+ export { default, default as MultiSelect } from './MultiSelect.svelte';
9
+ export { default as PrevNext } from './PrevNext.svelte';
10
+ export { default as RadioButtons } from './RadioButtons.svelte';
11
+ export { default as Toggle } from './Toggle.svelte';
6
12
  export * from './types';
13
+ export { default as Wiggle } from './Wiggle.svelte';
7
14
  export declare function scroll_into_view_if_needed_polyfill(element: Element, centerIfNeeded?: boolean): IntersectionObserver;
package/dist/index.js CHANGED
@@ -1,9 +1,16 @@
1
1
  export { default as CircleSpinner } from './CircleSpinner.svelte';
2
2
  export { default as CmdPalette } from './CmdPalette.svelte';
3
- export { default as MultiSelect, default } from './MultiSelect.svelte';
4
- export { default as Wiggle } from './Wiggle.svelte';
5
- export * from './props';
3
+ export { default as CodeExample } from './CodeExample.svelte';
4
+ export { default as CopyButton } from './CopyButton.svelte';
5
+ export { default as FileDetails } from './FileDetails.svelte';
6
+ export { default as GitHubCorner } from './GitHubCorner.svelte';
7
+ export { default as Icon } from './Icon.svelte';
8
+ export { default, default as MultiSelect } from './MultiSelect.svelte';
9
+ export { default as PrevNext } from './PrevNext.svelte';
10
+ export { default as RadioButtons } from './RadioButtons.svelte';
11
+ export { default as Toggle } from './Toggle.svelte';
6
12
  export * from './types';
13
+ export { default as Wiggle } from './Wiggle.svelte';
7
14
  // Firefox lacks support for scrollIntoViewIfNeeded (https://caniuse.com/scrollintoviewifneeded).
8
15
  // See https://github.com/janosh/svelte-multiselect/issues/87
9
16
  // Polyfill copied from
package/dist/types.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { FocusEventHandler, HTMLInputAttributes, KeyboardEventHandler, MouseEventHandler, TouchEventHandler } from 'svelte/elements';
1
3
  export type Option = string | number | ObjectOption;
2
4
  export type OptionStyle = string | {
3
5
  option: string;
@@ -14,3 +16,142 @@ export type ObjectOption = {
14
16
  style?: OptionStyle;
15
17
  [key: string]: unknown;
16
18
  };
19
+ export interface MultiSelectNativeEvents {
20
+ onblur?: FocusEventHandler<HTMLInputElement>;
21
+ onclick?: MouseEventHandler<HTMLInputElement>;
22
+ onfocus?: FocusEventHandler<HTMLInputElement>;
23
+ onkeydown?: KeyboardEventHandler<HTMLInputElement>;
24
+ onkeyup?: KeyboardEventHandler<HTMLInputElement>;
25
+ onmousedown?: MouseEventHandler<HTMLInputElement>;
26
+ onmouseenter?: MouseEventHandler<HTMLInputElement>;
27
+ onmouseleave?: MouseEventHandler<HTMLInputElement>;
28
+ ontouchcancel?: TouchEventHandler<HTMLInputElement>;
29
+ ontouchend?: TouchEventHandler<HTMLInputElement>;
30
+ ontouchmove?: TouchEventHandler<HTMLInputElement>;
31
+ ontouchstart?: TouchEventHandler<HTMLInputElement>;
32
+ }
33
+ export interface MultiSelectEvents<T extends Option = Option> {
34
+ onadd?: (data: {
35
+ option: T;
36
+ }) => unknown;
37
+ oncreate?: (data: {
38
+ option: T;
39
+ }) => unknown;
40
+ onremove?: (data: {
41
+ option: T;
42
+ }) => unknown;
43
+ onremoveAll?: (data: {
44
+ options: T[];
45
+ }) => unknown;
46
+ onchange?: (data: {
47
+ option?: T;
48
+ options?: T[];
49
+ type: `add` | `remove` | `removeAll`;
50
+ }) => unknown;
51
+ onopen?: (data: {
52
+ event: Event;
53
+ }) => unknown;
54
+ onclose?: (data: {
55
+ event: Event;
56
+ }) => unknown;
57
+ }
58
+ type AfterInputProps = Pick<MultiSelectParameters, `selected` | `disabled` | `invalid` | `id` | `placeholder` | `open` | `required`>;
59
+ type UserMsgProps = {
60
+ searchText: string;
61
+ msgType: false | `dupe` | `create` | `no-match`;
62
+ msg: null | string;
63
+ };
64
+ export interface MultiSelectSnippets<T extends Option = Option> {
65
+ expandIcon?: Snippet<[{
66
+ open: boolean;
67
+ }]>;
68
+ selectedItem?: Snippet<[{
69
+ option: T;
70
+ idx: number;
71
+ }]>;
72
+ children?: Snippet<[{
73
+ option: T;
74
+ idx: number;
75
+ }]>;
76
+ removeIcon?: Snippet;
77
+ afterInput?: Snippet<[AfterInputProps]>;
78
+ spinner?: Snippet;
79
+ disabledIcon?: Snippet;
80
+ option?: Snippet<[{
81
+ option: T;
82
+ idx: number;
83
+ }]>;
84
+ userMsg?: Snippet<[UserMsgProps]>;
85
+ }
86
+ export interface PortalParams {
87
+ target_node?: HTMLElement | null;
88
+ active?: boolean;
89
+ }
90
+ export interface MultiSelectParameters<T extends Option = Option> {
91
+ activeIndex?: number | null;
92
+ activeOption?: T | null;
93
+ createOptionMsg?: string | null;
94
+ allowUserOptions?: boolean | `append`;
95
+ allowEmpty?: boolean;
96
+ autocomplete?: HTMLInputAttributes[`autocomplete`];
97
+ autoScroll?: boolean;
98
+ breakpoint?: number;
99
+ defaultDisabledTitle?: string;
100
+ disabled?: boolean;
101
+ disabledInputTitle?: string;
102
+ duplicateOptionMsg?: string;
103
+ duplicates?: boolean;
104
+ key?: (opt: T) => unknown;
105
+ filterFunc?: (opt: T, searchText: string) => boolean;
106
+ closeDropdownOnSelect?: boolean | `if-mobile` | `retain-focus`;
107
+ form_input?: HTMLInputElement | null;
108
+ highlightMatches?: boolean;
109
+ id?: string | null;
110
+ input?: HTMLInputElement | null;
111
+ inputClass?: string;
112
+ inputStyle?: string | null;
113
+ inputmode?: HTMLInputAttributes[`inputmode`] | null;
114
+ invalid?: boolean;
115
+ liActiveOptionClass?: string;
116
+ liActiveUserMsgClass?: string;
117
+ liOptionClass?: string;
118
+ liOptionStyle?: string | null;
119
+ liSelectedClass?: string;
120
+ liSelectedStyle?: string | null;
121
+ liUserMsgClass?: string;
122
+ loading?: boolean;
123
+ matchingOptions?: T[];
124
+ maxOptions?: number | undefined;
125
+ maxSelect?: number | null;
126
+ maxSelectMsg?: ((current: number, max: number) => string) | null;
127
+ maxSelectMsgClass?: string;
128
+ name?: string | null;
129
+ noMatchingOptionsMsg?: string;
130
+ open?: boolean;
131
+ options: T[];
132
+ outerDiv?: HTMLDivElement | null;
133
+ outerDivClass?: string;
134
+ parseLabelsAsHtml?: boolean;
135
+ pattern?: string | null;
136
+ placeholder?: string | null;
137
+ removeAllTitle?: string;
138
+ removeBtnTitle?: string;
139
+ minSelect?: number | null;
140
+ required?: boolean | number;
141
+ resetFilterOnAdd?: boolean;
142
+ searchText?: string;
143
+ selected?: T[];
144
+ sortSelected?: boolean | ((op1: T, op2: T) => number);
145
+ selectedOptionsDraggable?: boolean;
146
+ style?: string | null;
147
+ ulOptionsClass?: string;
148
+ ulSelectedClass?: string;
149
+ ulSelectedStyle?: string | null;
150
+ ulOptionsStyle?: string | null;
151
+ value?: T | T[] | null;
152
+ portal?: PortalParams;
153
+ [key: string]: unknown;
154
+ }
155
+ export interface MultiSelectProps<T extends Option = Option> extends MultiSelectNativeEvents, MultiSelectEvents<T>, MultiSelectSnippets<T>, MultiSelectParameters<T> {
156
+ }
157
+ export {};
package/dist/utils.d.ts CHANGED
@@ -1,25 +1,9 @@
1
- import type { Option, OptionStyle } from '../types';
2
- /**
3
- * Get the label key from an option object or the option itself if it's a string or number
4
- * @param opt Option
5
- * @returns Label
6
- */
7
- export declare const get_label: (opt: Option) => any;
8
- /**
9
- * This function is used extract CSS strings from a {selected, option} style object to be used in the style attribute of the option.
10
- * If the style is a string, it will be returned as is
11
- * @param option Option
12
- * @param key
13
- * @returns CSS string
14
- */
1
+ import type { Option, OptionStyle } from './types';
2
+ export declare const get_label: (opt: Option) => string | number;
15
3
  export declare function get_style(option: {
16
4
  style?: OptionStyle;
17
5
  [key: string]: unknown;
18
- } | string | number, key?: `selected` | `option` | null): any;
19
- /**
20
- * Highlights text nodes that matching the string query
21
- * @param element Parent element
22
- * @param query Search query
23
- * @param noMatchingOptionsMsg Text for empty node
24
- */
25
- export declare function highlight_matching_nodes(element: HTMLElement, query?: string, noMatchingOptionsMsg?: string): void;
6
+ } | string | number, key?: `selected` | `option` | null): string;
7
+ export declare function highlight_matching_nodes(element: HTMLElement, // parent element
8
+ query?: string, // search query
9
+ noMatchingOptionsMsg?: string): void;
package/dist/utils.js CHANGED
@@ -1,34 +1,28 @@
1
- /**
2
- * Get the label key from an option object or the option itself if it's a string or number
3
- * @param opt Option
4
- * @returns Label
5
- */
1
+ // Get the label key from an option object or the option itself
2
+ // if it's a string or number
6
3
  export const get_label = (opt) => {
7
4
  if (opt instanceof Object) {
8
5
  if (opt.label === undefined) {
9
- console.error(`MultiSelect option ${JSON.stringify(opt)} is an object but has no label key`);
6
+ const opt_str = JSON.stringify(opt);
7
+ console.error(`MultiSelect option ${opt_str} is an object but has no label key`);
10
8
  }
11
9
  return opt.label;
12
10
  }
13
11
  return `${opt}`;
14
12
  };
15
- /**
16
- * This function is used extract CSS strings from a {selected, option} style object to be used in the style attribute of the option.
17
- * If the style is a string, it will be returned as is
18
- * @param option Option
19
- * @param key
20
- * @returns CSS string
21
- */
13
+ // This function is used extract CSS strings from a {selected, option} style
14
+ // object to be used in the style attribute of the option.
15
+ // If the style is a string, it will be returned as is
22
16
  export function get_style(option, key = null) {
23
17
  let css_str = ``;
24
18
  if (![`selected`, `option`, null].includes(key)) {
25
19
  console.error(`MultiSelect: Invalid key=${key} for get_style`);
26
20
  }
27
- if (typeof option == `object` && option.style) {
28
- if (typeof option.style == `string`) {
21
+ if (typeof option === `object` && option.style) {
22
+ if (typeof option.style === `string`) {
29
23
  css_str = option.style;
30
24
  }
31
- if (typeof option.style == `object`) {
25
+ if (typeof option.style === `object`) {
32
26
  if (key && key in option.style)
33
27
  return option.style[key] ?? ``;
34
28
  else {
@@ -41,22 +35,20 @@ export function get_style(option, key = null) {
41
35
  css_str += `;`;
42
36
  return css_str;
43
37
  }
44
- /**
45
- * Highlights text nodes that matching the string query
46
- * @param element Parent element
47
- * @param query Search query
48
- * @param noMatchingOptionsMsg Text for empty node
49
- */
50
- export function highlight_matching_nodes(element, query, noMatchingOptionsMsg) {
51
- if (typeof CSS == `undefined` || !CSS.highlights || !query)
38
+ // Highlights text nodes that matching the string query
39
+ export function highlight_matching_nodes(element, // parent element
40
+ query, // search query
41
+ noMatchingOptionsMsg) {
42
+ if (typeof CSS === `undefined` || !CSS.highlights || !query)
52
43
  return; // abort if CSS highlight API not supported
53
44
  // clear previous ranges from HighlightRegistry
54
45
  CSS.highlights.clear();
55
46
  const tree_walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, {
56
47
  acceptNode: (node) => {
57
48
  // don't highlight text in the "no matching options" message
58
- if (node?.textContent === noMatchingOptionsMsg)
49
+ if (node?.textContent === noMatchingOptionsMsg) {
59
50
  return NodeFilter.FILTER_REJECT;
51
+ }
60
52
  return NodeFilter.FILTER_ACCEPT;
61
53
  },
62
54
  });
package/package.json CHANGED
@@ -5,58 +5,39 @@
5
5
  "homepage": "https://janosh.github.io/svelte-multiselect",
6
6
  "repository": "https://github.com/janosh/svelte-multiselect",
7
7
  "license": "MIT",
8
- "version": "11.1.1",
8
+ "version": "11.2.1",
9
9
  "type": "module",
10
10
  "svelte": "./dist/index.js",
11
11
  "bugs": "https://github.com/janosh/svelte-multiselect/issues",
12
- "scripts": {
13
- "dev": "vite dev",
14
- "build": "vite build",
15
- "preview": "vite preview",
16
- "package": "svelte-package",
17
- "serve": "vite build && vite preview",
18
- "check": "svelte-check src",
19
- "test": "vitest run && playwright test",
20
- "test:unit": "vitest tests/unit/*.ts",
21
- "test:e2e": "playwright test tests/*.test.ts",
22
- "changelog": "npx auto-changelog --package --output changelog.md --hide-empty-releases --hide-credit --commit-limit false",
23
- "update-coverage": "vitest tests/unit --run --coverage && npx istanbul-badges-readme"
24
- },
25
12
  "peerDependencies": {
26
- "svelte": "^5.8.0"
13
+ "svelte": "^5.35.6"
27
14
  },
28
15
  "devDependencies": {
29
- "@iconify/svelte": "^5.0.0",
30
- "@playwright/test": "^1.52.0",
31
- "@stylistic/eslint-plugin": "^4.2.0",
16
+ "@playwright/test": "^1.54.0",
17
+ "@stylistic/eslint-plugin": "^5.1.0",
32
18
  "@sveltejs/adapter-static": "^3.0.8",
33
- "@sveltejs/kit": "^2.21.1",
34
- "@sveltejs/package": "2.3.11",
35
- "@sveltejs/vite-plugin-svelte": "^5.0.3",
36
- "@types/node": "^22.15.20",
37
- "@vitest/coverage-v8": "^3.1.4",
38
- "eslint": "^9.27.0",
39
- "eslint-plugin-svelte": "^3.8.2",
40
- "globals": "^16.1.0",
19
+ "@sveltejs/kit": "^2.22.5",
20
+ "@sveltejs/package": "2.3.12",
21
+ "@sveltejs/vite-plugin-svelte": "^6.0.0",
22
+ "@types/node": "^24.0.13",
23
+ "@vitest/coverage-v8": "^3.2.4",
24
+ "eslint": "^9.30.1",
25
+ "eslint-plugin-svelte": "^3.10.1",
41
26
  "hastscript": "^9.0.1",
42
- "highlight.js": "^11.11.1",
43
27
  "jsdom": "^26.1.0",
44
28
  "mdsvex": "^0.12.6",
45
29
  "mdsvexamples": "^0.5.0",
46
- "prettier": "^3.5.3",
47
- "prettier-plugin-svelte": "^3.4.0",
48
30
  "rehype-autolink-headings": "^7.1.0",
49
31
  "rehype-slug": "^6.0.0",
50
- "svelte": "^5.32.1",
51
- "svelte-check": "^4.2.1",
32
+ "svelte": "^5.35.6",
33
+ "svelte-check": "^4.2.2",
52
34
  "svelte-preprocess": "^6.0.3",
53
35
  "svelte-toc": "^0.6.1",
54
- "svelte-zoo": "^0.4.18",
55
- "svelte2tsx": "^0.7.39",
36
+ "svelte2tsx": "^0.7.40",
56
37
  "typescript": "5.8.3",
57
- "typescript-eslint": "^8.32.1",
58
- "vite": "^6.3.5",
59
- "vitest": "^3.1.4"
38
+ "typescript-eslint": "^8.36.0",
39
+ "vite": "^7.0.4",
40
+ "vitest": "^3.2.4"
60
41
  },
61
42
  "keywords": [
62
43
  "svelte",