svelte-multiselect 8.3.0 → 8.5.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.
@@ -0,0 +1,84 @@
1
+ <script>/* eslint-disable no-undef */ // TODO: remove when fixed
2
+ // https://github.com/sveltejs/eslint-plugin-svelte3/issues/201
3
+ import { tick } from 'svelte';
4
+ import { fade } from 'svelte/transition';
5
+ import Select from '.';
6
+ export let actions;
7
+ export let trigger = `k`;
8
+ export let fade_duration = 200; // in ms
9
+ export let style = ``; // for dialog
10
+ // for span in option slot, has no effect when passing slot="option"
11
+ export let span_style = ``;
12
+ export let open = false;
13
+ export let dialog;
14
+ export let input;
15
+ export let placeholder = `Filter actions...`;
16
+ async function toggle(event) {
17
+ if (event.key === trigger && event.metaKey && !open) {
18
+ // open on cmd+trigger
19
+ open = true;
20
+ await tick(); // wait for dialog to open and input to be mounted
21
+ input?.focus();
22
+ }
23
+ else if (event.key === `Escape` && open) {
24
+ // close on escape
25
+ open = false;
26
+ }
27
+ }
28
+ function close_if_outside(event) {
29
+ if (open && !dialog?.contains(event.target)) {
30
+ open = false;
31
+ }
32
+ }
33
+ function run_and_close(event) {
34
+ event.detail.option.action();
35
+ open = false;
36
+ }
37
+ </script>
38
+
39
+ <svelte:window on:keydown={toggle} on:click={close_if_outside} />
40
+
41
+ {#if open}
42
+ <dialog
43
+ class:open
44
+ bind:this={dialog}
45
+ transition:fade={{ duration: fade_duration }}
46
+ {style}
47
+ >
48
+ <Select
49
+ options={actions}
50
+ bind:input
51
+ {placeholder}
52
+ on:add={run_and_close}
53
+ on:keydown={toggle}
54
+ {...$$props}
55
+ >
56
+ <!-- wait for https://github.com/sveltejs/svelte/pull/8304 -->
57
+ <slot slot="option" name="option" let:option>
58
+ <span style={span_style}>{option.label}</span>
59
+ </slot>
60
+ </Select>
61
+ </dialog>
62
+ {/if}
63
+
64
+ <style>
65
+ :where(dialog) {
66
+ position: fixed;
67
+ top: 30%;
68
+ border: none;
69
+ padding: 0;
70
+ background-color: transparent;
71
+ display: flex;
72
+ color: white;
73
+ z-index: 10;
74
+ font-size: 2.4ex;
75
+ }
76
+ dialog :global(div.multiselect) {
77
+ --sms-bg: var(--sms-options-bg);
78
+ --sms-width: min(20em, 90vw);
79
+ --sms-max-width: none;
80
+ --sms-placeholder-color: lightgray;
81
+ --sms-options-margin: 1px 0;
82
+ --sms-options-border-radius: 0 0 1ex 1ex;
83
+ }
84
+ </style>
@@ -0,0 +1,32 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ actions: {
6
+ label: string;
7
+ action: () => void;
8
+ }[];
9
+ trigger?: string | undefined;
10
+ fade_duration?: number | undefined;
11
+ style?: string | undefined;
12
+ span_style?: string | undefined;
13
+ open?: boolean | undefined;
14
+ dialog: HTMLDialogElement;
15
+ input: HTMLInputElement;
16
+ placeholder?: string | undefined;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {
22
+ option: {
23
+ slot: string;
24
+ };
25
+ };
26
+ };
27
+ export type CmdPaletteProps = typeof __propDef.props;
28
+ export type CmdPaletteEvents = typeof __propDef.events;
29
+ export type CmdPaletteSlots = typeof __propDef.slots;
30
+ export default class CmdPalette extends SvelteComponentTyped<CmdPaletteProps, CmdPaletteEvents, CmdPaletteSlots> {
31
+ }
32
+ export {};
@@ -112,7 +112,7 @@ if (activeIndex !== null && !matchingOptions[activeIndex]) {
112
112
  throw `Run time error, activeIndex=${activeIndex} is out of bounds, matchingOptions.length=${matchingOptions.length}`;
113
113
  }
114
114
  // update activeOption when activeIndex changes
115
- $: activeOption = activeIndex !== null ? matchingOptions[activeIndex] : null;
115
+ $: activeOption = matchingOptions[activeIndex ?? -1] ?? null;
116
116
  // add an option to selected list
117
117
  function add(label, event) {
118
118
  if (maxSelect && maxSelect > 1 && selected.length >= maxSelect)
@@ -217,7 +217,7 @@ function open_dropdown(event) {
217
217
  function close_dropdown(event) {
218
218
  open = false;
219
219
  input?.blur();
220
- activeOption = null;
220
+ activeIndex = null;
221
221
  dispatch(`close`, { event });
222
222
  }
223
223
  // handle all keyboard events this component receives
@@ -281,12 +281,16 @@ async function handle_keydown(event) {
281
281
  else if (event.key === `Backspace` && selected.length > 0 && !searchText) {
282
282
  remove(selected.map(get_label).at(-1));
283
283
  }
284
+ // make first matching option active on any keypress (if none of the above special cases match)
285
+ else if (matchingOptions.length > 0) {
286
+ activeIndex = 0;
287
+ }
284
288
  }
285
289
  function remove_all() {
286
- dispatch(`removeAll`, { options: selected });
287
- dispatch(`change`, { options: selected, type: `removeAll` });
288
290
  selected = [];
289
291
  searchText = ``;
292
+ dispatch(`removeAll`, { options: selected });
293
+ dispatch(`change`, { options: selected, type: `removeAll` });
290
294
  }
291
295
  $: is_selected = (label) => selected.map(get_label).includes(label);
292
296
  const if_enter_or_space = (handler) => (event) => {
@@ -340,13 +344,10 @@ const dragstart = (idx) => (event) => {
340
344
  class:disabled
341
345
  class:single={maxSelect === 1}
342
346
  class:open
343
- aria-expanded={open}
344
- aria-multiselectable={maxSelect === null || maxSelect > 1}
345
347
  class:invalid
346
348
  class="multiselect {outerDivClass}"
347
349
  on:mouseup|stopPropagation={open_dropdown}
348
350
  title={disabled ? disabledInputTitle : null}
349
- aria-disabled={disabled ? `true` : null}
350
351
  data-id={id}
351
352
  >
352
353
  <!-- bind:value={selected} prevents form submission if required prop is true and no options are selected -->
@@ -375,13 +376,19 @@ const dragstart = (idx) => (event) => {
375
376
  <slot name="expand-icon" {open}>
376
377
  <ExpandIcon width="15px" style="min-width: 1em; padding: 0 1pt; cursor: pointer;" />
377
378
  </slot>
378
- <ul class="selected {ulSelectedClass}">
379
+ <ul
380
+ class="selected {ulSelectedClass}"
381
+ role="listbox"
382
+ aria-multiselectable={maxSelect === null || maxSelect > 1}
383
+ aria-label="selected options"
384
+ >
379
385
  {#each selected as option, idx (get_label(option))}
380
386
  <li
381
387
  class={liSelectedClass}
388
+ role="option"
382
389
  aria-selected="true"
383
390
  animate:flip={{ duration: 100 }}
384
- draggable={selectedOptionsDraggable}
391
+ draggable={selectedOptionsDraggable && !disabled && selected.length > 1}
385
392
  on:dragstart={dragstart(idx)}
386
393
  on:drop|preventDefault={drop(idx)}
387
394
  on:dragenter={() => (drag_idx = idx)}
@@ -393,8 +400,7 @@ const dragstart = (idx) => (event) => {
393
400
  {#if parseLabelsAsHtml}
394
401
  {@html get_label(option)}
395
402
  {:else}
396
- {get_label(option)}
397
- {/if}
403
+ {get_label(option)}{/if}
398
404
  </slot>
399
405
  {#if !disabled && (minSelect === null || selected.length > minSelect)}
400
406
  <button
@@ -411,38 +417,36 @@ const dragstart = (idx) => (event) => {
411
417
  {/if}
412
418
  </li>
413
419
  {/each}
414
- <li style="display: contents;">
415
- <input
416
- class={inputClass}
417
- bind:this={input}
418
- {autocomplete}
419
- bind:value={searchText}
420
- on:mouseup|self|stopPropagation={open_dropdown}
421
- on:keydown|stopPropagation={handle_keydown}
422
- on:focus
423
- on:focus={open_dropdown}
424
- {id}
425
- {disabled}
426
- {inputmode}
427
- {pattern}
428
- placeholder={selected.length == 0 ? placeholder : null}
429
- aria-invalid={invalid ? `true` : null}
430
- ondrop="return false"
431
- on:blur
432
- on:change
433
- on:click
434
- on:keydown
435
- on:keyup
436
- on:mousedown
437
- on:mouseenter
438
- on:mouseleave
439
- on:touchcancel
440
- on:touchend
441
- on:touchmove
442
- on:touchstart
443
- />
444
- <!-- the above on:* lines forward potentially useful DOM events -->
445
- </li>
420
+ <input
421
+ class={inputClass}
422
+ bind:this={input}
423
+ bind:value={searchText}
424
+ on:mouseup|self|stopPropagation={open_dropdown}
425
+ on:keydown|stopPropagation={handle_keydown}
426
+ on:focus
427
+ on:focus={open_dropdown}
428
+ {id}
429
+ {disabled}
430
+ {autocomplete}
431
+ {inputmode}
432
+ {pattern}
433
+ placeholder={selected.length == 0 ? placeholder : null}
434
+ aria-invalid={invalid ? `true` : null}
435
+ ondrop="return false"
436
+ on:blur
437
+ on:change
438
+ on:click
439
+ on:keydown
440
+ on:keyup
441
+ on:mousedown
442
+ on:mouseenter
443
+ on:mouseleave
444
+ on:touchcancel
445
+ on:touchend
446
+ on:touchmove
447
+ on:touchstart
448
+ />
449
+ <!-- the above on:* lines forward potentially useful DOM events -->
446
450
  </ul>
447
451
  {#if loading}
448
452
  <slot name="spinner">
@@ -478,7 +482,14 @@ const dragstart = (idx) => (event) => {
478
482
 
479
483
  <!-- only render options dropdown if options or searchText is not empty needed to avoid briefly flashing empty dropdown -->
480
484
  {#if (searchText && noMatchingOptionsMsg) || options?.length > 0}
481
- <ul class:hidden={!open} class="options {ulOptionsClass}">
485
+ <ul
486
+ class:hidden={!open}
487
+ class="options {ulOptionsClass}"
488
+ role="listbox"
489
+ aria-multiselectable={maxSelect === null || maxSelect > 1}
490
+ aria-expanded={open}
491
+ aria-disabled={disabled ? `true` : null}
492
+ >
482
493
  {#each matchingOptions as option, idx}
483
494
  {@const {
484
495
  label,
@@ -508,6 +519,7 @@ const dragstart = (idx) => (event) => {
508
519
  }}
509
520
  on:mouseout={() => (activeIndex = null)}
510
521
  on:blur={() => (activeIndex = null)}
522
+ role="option"
511
523
  aria-selected="false"
512
524
  >
513
525
  <slot name="option" {option} {idx}>
@@ -593,7 +605,7 @@ const dragstart = (idx) => (event) => {
593
605
  padding: var(--sms-selected-li-padding, 1pt 5pt);
594
606
  color: var(--sms-selected-text-color, var(--sms-text-color));
595
607
  }
596
- :where(div.multiselect > ul.selected > li[draggable]) {
608
+ :where(div.multiselect > ul.selected > li[draggable='true']) {
597
609
  cursor: grab;
598
610
  }
599
611
  :where(div.multiselect > ul.selected > li.active) {
@@ -623,7 +635,7 @@ const dragstart = (idx) => (event) => {
623
635
  margin: auto 0; /* CSS reset */
624
636
  padding: 0; /* CSS reset */
625
637
  }
626
- :where(div.multiselect > ul.selected > li > input) {
638
+ :where(div.multiselect > ul.selected > input) {
627
639
  border: none;
628
640
  outline: none;
629
641
  background: none;
@@ -635,7 +647,8 @@ const dragstart = (idx) => (event) => {
635
647
  cursor: inherit; /* needed for disabled state */
636
648
  border-radius: 0; /* reset ul.selected > li */
637
649
  }
638
- :where(div.multiselect > ul.selected > li > input::placeholder) {
650
+ /* don't wrap ::placeholder rules in :where() as it seems to be overpowered by browser defaults i.t.o. specificity */
651
+ div.multiselect > ul.selected > input::placeholder {
639
652
  padding-left: 5pt;
640
653
  color: var(--sms-placeholder-color);
641
654
  opacity: var(--sms-placeholder-opacity);
@@ -653,18 +666,22 @@ const dragstart = (idx) => (event) => {
653
666
 
654
667
  :where(div.multiselect > ul.options) {
655
668
  list-style: none;
656
- padding: 4pt 0;
657
669
  top: 100%;
658
670
  left: 0;
659
671
  width: 100%;
660
672
  position: absolute;
661
- border-radius: 1ex;
662
673
  overflow: auto;
674
+ transition: all 0.2s;
675
+ box-sizing: border-box;
663
676
  background: var(--sms-options-bg, white);
664
677
  max-height: var(--sms-options-max-height, 50vh);
665
678
  overscroll-behavior: var(--sms-options-overscroll, none);
666
679
  box-shadow: var(--sms-options-shadow, 0 0 14pt -8pt black);
667
- transition: all 0.2s;
680
+ border: var(--sms-options-border);
681
+ border-width: var(--sms-options-border-width);
682
+ border-radius: var(--sms-options-border-radius, 1ex);
683
+ padding: var(--sms-options-padding);
684
+ margin: var(--sms-options-margin, inherit);
668
685
  }
669
686
  :where(div.multiselect > ul.options.hidden) {
670
687
  visibility: hidden;
@@ -1,4 +1,5 @@
1
1
  export { default as CircleSpinner } from './CircleSpinner.svelte';
2
+ export { default as CmdPalette } from './CmdPalette.svelte';
2
3
  export { default, default as MultiSelect } from './MultiSelect.svelte';
3
4
  export { default as Wiggle } from './Wiggle.svelte';
4
5
  export type Option = string | number | ObjectOption;
@@ -12,19 +13,19 @@ export type ObjectOption = {
12
13
  selectedTitle?: string;
13
14
  [key: string]: unknown;
14
15
  };
15
- export type DispatchEvents = {
16
+ export type DispatchEvents<T = Option> = {
16
17
  add: {
17
- option: Option;
18
+ option: T;
18
19
  };
19
20
  remove: {
20
- option: Option;
21
+ option: T;
21
22
  };
22
23
  removeAll: {
23
- options: Option[];
24
+ options: T[];
24
25
  };
25
26
  change: {
26
- option?: Option;
27
- options?: Option[];
27
+ option?: T;
28
+ options?: T[];
28
29
  type: 'add' | 'remove' | 'removeAll';
29
30
  };
30
31
  open: {
@@ -1,4 +1,5 @@
1
1
  export { default as CircleSpinner } from './CircleSpinner.svelte';
2
+ export { default as CmdPalette } from './CmdPalette.svelte';
2
3
  export { default, default as MultiSelect } from './MultiSelect.svelte';
3
4
  export { default as Wiggle } from './Wiggle.svelte';
4
5
  // Firefox lacks support for scrollIntoViewIfNeeded, see
package/package.json CHANGED
@@ -5,41 +5,55 @@
5
5
  "homepage": "https://janosh.github.io/svelte-multiselect",
6
6
  "repository": "https://github.com/janosh/svelte-multiselect",
7
7
  "license": "MIT",
8
- "version": "8.3.0",
8
+ "version": "8.5.0",
9
9
  "type": "module",
10
- "svelte": "index.js",
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 --ignore dist",
19
+ "test": "vitest --run --coverage tests/unit/*.ts && playwright test tests/*.test.ts",
20
+ "test:unit": "vitest tests/unit/*.ts",
21
+ "test:e2e": "playwright test tests/*.test.ts",
22
+ "changelog": "npx auto-changelog --package --output changelog.md --unreleased-only --hide-credit --commit-limit false",
23
+ "update-coverage": "vitest tests/unit --run --coverage && npx istanbul-badges-readme"
24
+ },
25
+ "dependencies": {
26
+ "svelte": "^3.56.0"
27
+ },
12
28
  "devDependencies": {
13
- "@iconify/svelte": "^3.0.1",
14
- "@playwright/test": "^1.29.2",
15
- "@sveltejs/adapter-static": "^1.0.5",
16
- "@sveltejs/kit": "^1.2.2",
17
- "@sveltejs/package": "1.0.2",
18
- "@sveltejs/vite-plugin-svelte": "^2.0.2",
19
- "@typescript-eslint/eslint-plugin": "^5.48.2",
20
- "@typescript-eslint/parser": "^5.48.2",
21
- "@vitest/coverage-c8": "^0.27.2",
22
- "eslint": "^8.32.0",
29
+ "@iconify/svelte": "^3.1.0",
30
+ "@playwright/test": "^1.31.2",
31
+ "@sveltejs/adapter-static": "^2.0.1",
32
+ "@sveltejs/kit": "^1.11.0",
33
+ "@sveltejs/package": "2.0.2",
34
+ "@sveltejs/vite-plugin-svelte": "^2.0.3",
35
+ "@typescript-eslint/eslint-plugin": "^5.54.1",
36
+ "@typescript-eslint/parser": "^5.54.1",
37
+ "@vitest/coverage-c8": "^0.29.2",
38
+ "eslint": "^8.35.0",
23
39
  "eslint-plugin-svelte3": "^4.0.0",
24
40
  "hastscript": "^7.2.0",
25
41
  "highlight.js": "^11.7.0",
26
- "jsdom": "^21.0.0",
42
+ "jsdom": "^21.1.0",
27
43
  "mdsvex": "^0.10.6",
28
44
  "mdsvexamples": "^0.3.3",
29
- "prettier": "^2.8.3",
45
+ "prettier": "^2.8.4",
30
46
  "prettier-plugin-svelte": "^2.9.0",
31
47
  "rehype-autolink-headings": "^6.1.1",
32
48
  "rehype-slug": "^5.1.0",
33
- "svelte": "^3.55.1",
34
- "svelte-check": "^3.0.2",
49
+ "svelte-check": "^3.1.0",
35
50
  "svelte-preprocess": "^5.0.1",
36
51
  "svelte-toc": "^0.5.2",
37
- "svelte-zoo": "^0.2.3",
38
- "svelte2tsx": "^0.6.0",
39
- "tslib": "^2.4.1",
40
- "typescript": "^4.9.4",
41
- "vite": "^4.0.4",
42
- "vitest": "^0.27.2"
52
+ "svelte-zoo": "^0.3.4",
53
+ "svelte2tsx": "^0.6.3",
54
+ "typescript": "^4.9.5",
55
+ "vite": "^4.1.4",
56
+ "vitest": "^0.29.2"
43
57
  },
44
58
  "keywords": [
45
59
  "svelte",
@@ -52,8 +66,18 @@
52
66
  "access": "public"
53
67
  },
54
68
  "exports": {
55
- "./package.json": "./package.json",
56
- "./MultiSelect.svelte": "./MultiSelect.svelte",
57
- ".": "./index.js"
58
- }
59
- }
69
+ "./MultiSelect.svelte": {
70
+ "types": "./dist/MultiSelect.svelte.d.ts",
71
+ "svelte": "./dist/MultiSelect.svelte",
72
+ "default": "./dist/MultiSelect.svelte"
73
+ },
74
+ ".": {
75
+ "types": "./dist/index.d.ts",
76
+ "svelte": "./dist/index.js",
77
+ "default": "./dist/index.js"
78
+ }
79
+ },
80
+ "files": [
81
+ "dist"
82
+ ]
83
+ }
package/readme.md CHANGED
@@ -8,7 +8,7 @@
8
8
  [![Tests](https://github.com/janosh/svelte-multiselect/actions/workflows/test.yml/badge.svg)](https://github.com/janosh/svelte-multiselect/actions/workflows/test.yml)
9
9
  [![GitHub Pages](https://github.com/janosh/svelte-multiselect/actions/workflows/gh-pages.yml/badge.svg)](https://github.com/janosh/svelte-multiselect/actions/workflows/gh-pages.yml)
10
10
  [![NPM version](https://img.shields.io/npm/v/svelte-multiselect?logo=NPM&color=purple)](https://npmjs.com/package/svelte-multiselect)
11
- [![Needs Svelte version](https://img.shields.io/npm/dependency-version/svelte-multiselect/dev/svelte?color=teal&logo=Svelte&label=Svelte)](https://github.com/sveltejs/svelte/blob/master/CHANGELOG.md)
11
+ [![Needs Svelte version](https://img.shields.io/npm/dependency-version/svelte-multiselect/svelte?color=teal&logo=Svelte&label=Svelte)](https://github.com/sveltejs/svelte/blob/master/CHANGELOG.md)
12
12
  [![REPL](https://img.shields.io/badge/Svelte-REPL-blue?label=Try%20it!)](https://svelte.dev/repl/a5a14b8f15d64cb083b567292480db05)
13
13
  [![Open in StackBlitz](https://img.shields.io/badge/Open%20in-StackBlitz-darkblue?logo=stackblitz)](https://stackblitz.com/github/janosh/svelte-multiselect)
14
14
 
@@ -532,6 +532,11 @@ If you only want to make small adjustments, you can pass the following CSS varia
532
532
  - `max-height: var(--sms-options-max-height, 50vh)`: Maximum height of options dropdown.
533
533
  - `overscroll-behavior: var(--sms-options-overscroll, none)`: Whether scroll events bubble to parent elements when reaching the top/bottom of the options dropdown. See [MDN](https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior).
534
534
  - `box-shadow: var(--sms-options-shadow, 0 0 14pt -8pt black)`: Box shadow of dropdown list.
535
+ - `border: var(--sms-options-border)`
536
+ - `border-width: var(--sms-options-border-width)`
537
+ - `border-radius: var(--sms-options-border-radius, 1ex)`
538
+ - `padding: var(--sms-options-padding)`
539
+ - `margin: var(--sms-options-margin, inherit)`
535
540
  - `div.multiselect > ul.options > li`
536
541
  - `scroll-margin: var(--sms-options-scroll-margin, 100px)`: Top/bottom margin to keep between dropdown list items and top/bottom screen edge when auto-scrolling list to keep items in view.
537
542
  - `div.multiselect > ul.options > li.selected`
@@ -606,7 +611,7 @@ Odd as it may seem, you get the most fine-grained control over the styling of ev
606
611
  :global(div.multiselect > ul.selected > li button, button.remove-all) {
607
612
  /* buttons to remove a single or all selected options at once */
608
613
  }
609
- :global(div.multiselect > ul.selected > li > input) {
614
+ :global(div.multiselect > input[autocomplete]) {
610
615
  /* input inside the top-level wrapper div */
611
616
  }
612
617
  :global(div.multiselect > ul.options) {
package/changelog.md DELETED
@@ -1,523 +0,0 @@
1
- ### Changelog
2
-
3
- All notable changes to this project will be documented in this file. Dates are displayed in UTC.
4
-
5
- <!-- auto-changelog-above -->
6
-
7
- #### [v8.3.0](https://github.com/janosh/svelte-multiselect/compare/v8.2.4...v8.3.0)
8
-
9
- > 25 January 2023
10
-
11
- - Don't error on removing options that are in `selected` but not in `options` array [`#204`](https://github.com/janosh/svelte-multiselect/pull/204)
12
- - Add class 'remove' to buttons that remove selected options [`#202`](https://github.com/janosh/svelte-multiselect/pull/202)
13
- - Add prop allowEmpty: boolean = false [`#198`](https://github.com/janosh/svelte-multiselect/pull/198)
14
- - Support `immutable` Svelte compiler option [`#197`](https://github.com/janosh/svelte-multiselect/pull/197)
15
- - group demo routes [`e813e48`](https://github.com/janosh/svelte-multiselect/commit/e813e480716f29ab4bdd53f90afe56485507fb1c)
16
- - breaking: rename addOptionMsg to createOptionMsg [`f24e025`](https://github.com/janosh/svelte-multiselect/commit/f24e0256fcdc32c90ed798edbb663a6be18ebe00)
17
-
18
- #### [v8.2.4](https://github.com/janosh/svelte-multiselect/compare/v8.2.3...v8.2.4)
19
-
20
- > 8 January 2023
21
-
22
- - Coverage badges [`#190`](https://github.com/janosh/svelte-multiselect/pull/190)
23
- - feat: add type inference for the `options` prop [`#189`](https://github.com/janosh/svelte-multiselect/pull/189)
24
- - feat: add type inference for the `options` prop (#189) [`#78`](https://github.com/janosh/svelte-multiselect/issues/78)
25
- - merge ExampleCode.svelte with CollapsibleCode.svelte [`56ff99b`](https://github.com/janosh/svelte-multiselect/commit/56ff99bcc378c5582b303aa1c03302cdbceb3076)
26
- - pnpm add -D svelte-zoo to outsource some site components and icons [`6ee64f3`](https://github.com/janosh/svelte-multiselect/commit/6ee64f376dfe166b993c94a36d376d1dce5f44f5)
27
- - restore reactive searchText block in loading example [`846da66`](https://github.com/janosh/svelte-multiselect/commit/846da66af058ac1f448c8aaa513d12fb4c2ac4cc)
28
- - fix bunch of TS errors, add playwright test for dragging selected options to reorder [`a483217`](https://github.com/janosh/svelte-multiselect/commit/a4832176f6fceb5346af2d4cd8ecc01a5626ab43)
29
- - add update-coverage package.json script [`1094f08`](https://github.com/janosh/svelte-multiselect/commit/1094f08cec9d6fd2f54b058af05022ab35ec4ac9)
30
- - add vite alias $root to clean up package.json, readme|contributing|changelog.md imports [`c19cbe4`](https://github.com/janosh/svelte-multiselect/commit/c19cbe4e38413bbcd04d4e35eddcd4cd88c67662)
31
- - mv src/components src/site [`3683ed7`](https://github.com/janosh/svelte-multiselect/commit/3683ed70f19498070ffe9e95c0261c688fb2f7c7)
32
-
33
- #### [v8.2.3](https://github.com/janosh/svelte-multiselect/compare/v8.2.2...v8.2.3)
34
-
35
- > 28 December 2022
36
-
37
- - add 'Open in StackBlitz' links to example code fences [`ac07557`](https://github.com/janosh/svelte-multiselect/commit/ac075576c261892807faa0071b5f3e0b5b4fcd2c)
38
- - v8.2.2 contains unintended breaking changes and was deprecated on NPM (see [#188](https://github.com/janosh/svelte-multiselect/issues/188)). Use this fixed release instead. [`ef4d669`](https://github.com/janosh/svelte-multiselect/commit/ef4d669)
39
-
40
- #### [v8.2.2](https://github.com/janosh/svelte-multiselect/compare/v8.2.1...v8.2.2)
41
-
42
- > 18 December 2022
43
-
44
- - Issue console warning if `sortSelected && selectedOptionsDraggable` [`#187`](https://github.com/janosh/svelte-multiselect/pull/187)
45
- - Add new slot named 'expand-icon' [`#186`](https://github.com/janosh/svelte-multiselect/pull/186)
46
-
47
- #### [v8.2.1](https://github.com/janosh/svelte-multiselect/compare/v8.2.0...v8.2.1)
48
-
49
- > 10 December 2022
50
-
51
- - Fix `allowUserOptions` preventing dropdown list navigation with up/down arrow keys [`#184`](https://github.com/janosh/svelte-multiselect/pull/184)
52
- - Mdsvexamples [`#182`](https://github.com/janosh/svelte-multiselect/pull/182)
53
- - Add changelog & contributing pages to site [`#181`](https://github.com/janosh/svelte-multiselect/pull/181)
54
- - tweak contributing.md and css-classes example [`6f78033`](https://github.com/janosh/svelte-multiselect/commit/6f78033826beb34cd00bf3282c93ac5328905735)
55
- - fix build error [`b896d36`](https://github.com/janosh/svelte-multiselect/commit/b896d3643a0988b0d0bed832ba46bcad0e2c4494)
56
- - fix readme badge for gh-pages.yml status [`906b560`](https://github.com/janosh/svelte-multiselect/commit/906b56024a826ed45263197b1267015d88f0a660)
57
-
58
- #### [v8.2.0](https://github.com/janosh/svelte-multiselect/compare/v8.1.0...v8.2.0)
59
-
60
- > 30 November 2022
61
-
62
- - Draggable selected options [`#178`](https://github.com/janosh/svelte-multiselect/pull/178)
63
- - Fix page navigation in GH pages, broken because served from non-apex domain [`#172`](https://github.com/janosh/svelte-multiselect/pull/172)
64
- - Publish docs to GitHub pages [`#170`](https://github.com/janosh/svelte-multiselect/pull/170)
65
- - Contributing docs plus issue and PR templates with StackBlitz repro starter [`#169`](https://github.com/janosh/svelte-multiselect/pull/169)
66
- - add missing about field to bug-report issue template (closes #171) [`#171`](https://github.com/janosh/svelte-multiselect/issues/171)
67
- - add changelog.md [`236d238`](https://github.com/janosh/svelte-multiselect/commit/236d238c5fa1ce5f07cf08c09861da4d8446acb2)
68
- - fix prop form_input: set default value null to make it optional [`b150fe0`](https://github.com/janosh/svelte-multiselect/commit/b150fe0032ebde82a319b23bd5e6b573e0c31721)
69
- - set `aliveStatusCodes: [200, 429]` in `.github/workflows/link-check-config.json` [`b34c7bf`](https://github.com/janosh/svelte-multiselect/commit/b34c7bf99d4afa96dcd3c9c322ab4e94b1ef3a39)
70
- - add changelog script to `package.json` [`c943617`](https://github.com/janosh/svelte-multiselect/commit/c9436171033e06e8098f4443ed40d48ddee35167)
71
-
72
- #### [v8.1.0](https://github.com/janosh/svelte-multiselect/compare/v8.0.4...v8.1.0)
73
-
74
- > 18 November 2022
75
-
76
- - Add minSelect prop [`#166`](https://github.com/janosh/svelte-multiselect/pull/166)
77
- - Add `pnpm test` to readme [`#168`](https://github.com/janosh/svelte-multiselect/pull/168)
78
- - Add class for maxSelectMsg [`#167`](https://github.com/janosh/svelte-multiselect/pull/167)
79
- - Allow `required=1 | 2 | ...` to set minimum number of selected options for form submission [`#161`](https://github.com/janosh/svelte-multiselect/pull/161)
80
- - Add minSelect prop (#166) [`#163`](https://github.com/janosh/svelte-multiselect/issues/163) [`#163`](https://github.com/janosh/svelte-multiselect/issues/163) [`#163`](https://github.com/janosh/svelte-multiselect/issues/163)
81
- - mv /max-select example to /min-max-select [`9838db8`](https://github.com/janosh/svelte-multiselect/commit/9838db87d044a0d3d261c82ac1d654b9e32310d1)
82
-
83
- #### [v8.0.4](https://github.com/janosh/svelte-multiselect/compare/v8.0.3...v8.0.4)
84
-
85
- > 15 November 2022
86
-
87
- - Form validation docs [`#159`](https://github.com/janosh/svelte-multiselect/pull/159)
88
- - Don't `console.error` about missing `options` if `disabled=true` [`#158`](https://github.com/janosh/svelte-multiselect/pull/158)
89
-
90
- #### [v8.0.3](https://github.com/janosh/svelte-multiselect/compare/v8.0.2...v8.0.3)
91
-
92
- > 15 November 2022
93
-
94
- - Test uncovered lines [`#157`](https://github.com/janosh/svelte-multiselect/pull/157)
95
- - Don't `console.error` about missing `options` if `loading=true` [`#156`](https://github.com/janosh/svelte-multiselect/pull/156)
96
- - Measure `vitest` coverage with `c8` [`#155`](https://github.com/janosh/svelte-multiselect/pull/155)
97
- - increase --sms-min-height 19->`22pt [`5d0e081`](<https://github.com/janosh/svelte-multiselect/commit/5d0e0815d0b488ae23b439a3f085dd083138c326>)
98
-
99
- #### [v8.0.2](https://github.com/janosh/svelte-multiselect/compare/v8.0.1...v8.0.2)
100
-
101
- > 7 November 2022
102
-
103
- - Pass JSON.stringified selected options to form submission handlers [`#152`](https://github.com/janosh/svelte-multiselect/pull/152)
104
- - Link check CI and readme housekeeping [`#149`](https://github.com/janosh/svelte-multiselect/pull/149)
105
- - REPL links for landing page examples [`#148`](https://github.com/janosh/svelte-multiselect/pull/148)
106
- - Add Collapsible code blocks to usage examples [`#143`](https://github.com/janosh/svelte-multiselect/pull/143)
107
- - REPL links for landing page examples (#148) [`#144`](https://github.com/janosh/svelte-multiselect/issues/144) [`#145`](https://github.com/janosh/svelte-multiselect/issues/145) [`#146`](https://github.com/janosh/svelte-multiselect/issues/146) [`#147`](https://github.com/janosh/svelte-multiselect/issues/147)
108
-
109
- #### [v8.0.1](https://github.com/janosh/svelte-multiselect/compare/v8.0.0...v8.0.1)
110
-
111
- > 30 October 2022
112
-
113
- - Revert SCSS preprocessing [`#141`](https://github.com/janosh/svelte-multiselect/pull/141)
114
- - Add unit tests for 2-/1-way binding of `activeIndex` and `activeOption` [`#139`](https://github.com/janosh/svelte-multiselect/pull/139)
115
-
116
- ### [v8.0.0](https://github.com/janosh/svelte-multiselect/compare/v7.1.0...v8.0.0)
117
-
118
- > 22 October 2022
119
-
120
- - Add new prop `value` [`#138`](https://github.com/janosh/svelte-multiselect/pull/138)
121
- - New prop resetFilterOnAdd [`#137`](https://github.com/janosh/svelte-multiselect/pull/137)
122
- - `yarn` to `pnpm` [`#134`](https://github.com/janosh/svelte-multiselect/pull/134)
123
- - Rename prop `noOptionsMsg -> noMatchingOptionsMsg` [`#133`](https://github.com/janosh/svelte-multiselect/pull/133)
124
- - remove props selectedLabels and selectedValues [`ef6598e`](https://github.com/janosh/svelte-multiselect/commit/ef6598e8b0dc1f2f8cb687074463cb73b2f9ebff)
125
-
126
- #### [v7.1.0](https://github.com/janosh/svelte-multiselect/compare/v7.0.2...v7.1.0)
127
-
128
- > 13 October 2022
129
-
130
- - Allow preventing duplicate options when allowUserOptions is thruthy [`#132`](https://github.com/janosh/svelte-multiselect/pull/132)
131
-
132
- #### [v7.0.2](https://github.com/janosh/svelte-multiselect/compare/v7.0.1...v7.0.2)
133
-
134
- > 8 October 2022
135
-
136
- - Fix TypeError: Cannot read properties of null (reading 'get_label') - take 2 [`#131`](https://github.com/janosh/svelte-multiselect/pull/131)
137
- - Fix selecting options with falsy labels (like 0) [`#130`](https://github.com/janosh/svelte-multiselect/pull/130)
138
-
139
- #### [v7.0.1](https://github.com/janosh/svelte-multiselect/compare/v7.0.0...v7.0.1)
140
-
141
- > 6 October 2022
142
-
143
- - Fix single select with arrow and enter keys [`#128`](https://github.com/janosh/svelte-multiselect/pull/128)
144
- - Add SCSS preprocessing [`#126`](https://github.com/janosh/svelte-multiselect/pull/126)
145
- - pre-commit autoupdate [`#124`](https://github.com/janosh/svelte-multiselect/pull/124)
146
- - more unit tests [`1adbc99`](https://github.com/janosh/svelte-multiselect/commit/1adbc994b746b39c4ad081dc2573bf37f27c96c0)
147
- - test required but empty MultiSelect fails form validity check (i.e. causes unsubmittable form) and filled one passes it [`fd8b377`](https://github.com/janosh/svelte-multiselect/commit/fd8b37782cd508aacfc8125c6647cefe56144b80)
148
-
149
- ### [v7.0.0](https://github.com/janosh/svelte-multiselect/compare/v6.1.0...v7.0.0)
150
-
151
- > 3 October 2022
152
-
153
- - Make selected a single value (not a length-1 array) if maxSelect=1 [`#123`](https://github.com/janosh/svelte-multiselect/pull/123)
154
- - Fix TypeError: Cannot read properties of null (reading 'get_label') at MultiSelect.svelte:75 [`#122`](https://github.com/janosh/svelte-multiselect/pull/122)
155
- - add stopPropagation to keydown handler (closes #114) [`#114`](https://github.com/janosh/svelte-multiselect/issues/114)
156
-
157
- #### [v6.1.0](https://github.com/janosh/svelte-multiselect/compare/v6.0.3...v6.1.0)
158
-
159
- > 30 September 2022
160
-
161
- - Forward input DOM events [`#120`](https://github.com/janosh/svelte-multiselect/pull/120)
162
- - Props to manipulating inputmode and pattern attributes [`#116`](https://github.com/janosh/svelte-multiselect/pull/116)
163
- - docs: remove `userInputAs` prop reference [`#115`](https://github.com/janosh/svelte-multiselect/pull/115)
164
- - Fix top option not selectable with enter key [`#113`](https://github.com/janosh/svelte-multiselect/pull/113)
165
-
166
- #### [v6.0.3](https://github.com/janosh/svelte-multiselect/compare/v6.0.2...v6.0.3)
167
-
168
- > 20 September 2022
169
-
170
- - Fix using arrow keys to control active option in dropdown list [`#111`](https://github.com/janosh/svelte-multiselect/pull/111)
171
- - eslintrc set @typescript-eslint/no-inferrable-types: off [`c688773`](https://github.com/janosh/svelte-multiselect/commit/c6887737871709cdadc2ef0835795d6c1696e34c)
172
-
173
- #### [v6.0.2](https://github.com/janosh/svelte-multiselect/compare/v6.0.1...v6.0.2)
174
-
175
- > 17 September 2022
176
-
177
- - Test readme docs on CSS variables [`#109`](https://github.com/janosh/svelte-multiselect/pull/109)
178
- - Fix selected array not being initialized to options with preselected=true [`#108`](https://github.com/janosh/svelte-multiselect/pull/108)
179
-
180
- #### [v6.0.1](https://github.com/janosh/svelte-multiselect/compare/v6.0.0...v6.0.1)
181
-
182
- > 13 September 2022
183
-
184
- - Better props docs and test [`#105`](https://github.com/janosh/svelte-multiselect/pull/105)
185
- - fix breaking change sveltekit:prefetch renamed to data-sveltekit-prefetch [`65ddbb9`](https://github.com/janosh/svelte-multiselect/commit/65ddbb93c720e3d92d7bc3fec232f58e87c0ea6d)
186
- - fix .svx demo routes [`fde53f1`](https://github.com/janosh/svelte-multiselect/commit/fde53f1225fda928412303256d48b77d122d19f1)
187
- - revert from adapter-netlify to adapter-static [`224144d`](https://github.com/janosh/svelte-multiselect/commit/224144dce012d1eef515abafa542c6a6b7e063e8)
188
-
189
- ### [v6.0.0](https://github.com/janosh/svelte-multiselect/compare/v5.0.6...v6.0.0)
190
-
191
- > 3 September 2022
192
-
193
- - Better on mobile and better about which option is active [`#103`](https://github.com/janosh/svelte-multiselect/pull/103)
194
- - SvelteKit routes auto migration [`#101`](https://github.com/janosh/svelte-multiselect/pull/101)
195
-
196
- #### [v5.0.6](https://github.com/janosh/svelte-multiselect/compare/v5.0.5...v5.0.6)
197
-
198
- > 2 August 2022
199
-
200
- - Fix 'Cannot find module `scroll-into-view-if-needed`' [`#99`](https://github.com/janosh/svelte-multiselect/pull/99)
201
-
202
- #### [v5.0.5](https://github.com/janosh/svelte-multiselect/compare/v5.0.4...v5.0.5)
203
-
204
- > 2 August 2022
205
-
206
- - Add `scroll-into-view-if-needed` ponyfill [`#97`](https://github.com/janosh/svelte-multiselect/pull/97)
207
-
208
- #### [v5.0.4](https://github.com/janosh/svelte-multiselect/compare/v5.0.3...v5.0.4)
209
-
210
- > 17 July 2022
211
-
212
- - Convert E2E tests from`vitest` to `@playwright/test` [`#95`](https://github.com/janosh/svelte-multiselect/pull/95)
213
- - Allow empty Multiselect [`#94`](https://github.com/janosh/svelte-multiselect/pull/94)
214
- - Add new slot `'remove-icon'` [`#93`](https://github.com/janosh/svelte-multiselect/pull/93)
215
- - pre-commit autoupdate [`#92`](https://github.com/janosh/svelte-multiselect/pull/92)
216
-
217
- #### [v5.0.3](https://github.com/janosh/svelte-multiselect/compare/v5.0.2...v5.0.3)
218
-
219
- > 1 July 2022
220
-
221
- - Reset `activeOption` to `null` if not in `matchingOptions` [`#90`](https://github.com/janosh/svelte-multiselect/pull/90)
222
-
223
- #### [v5.0.2](https://github.com/janosh/svelte-multiselect/compare/v5.0.1...v5.0.2)
224
-
225
- > 27 June 2022
226
-
227
- - Replace `li.scrollIntoViewIfNeeded()` with `li.scrollIntoView()` [`#88`](https://github.com/janosh/svelte-multiselect/pull/88)
228
- - Add new prop `parseLabelsAsHtml` [`#84`](https://github.com/janosh/svelte-multiselect/pull/84)
229
- - try fix flaky test 'multiselect >`can select and remove many options' [`2b0c453`](<https://github.com/janosh/svelte-multiselect/commit/2b0c453c794c0b3b82e81c5b994c10bc305a98d6>)
230
- - bump netlify node to v18, update readme + deps [`586c724`](https://github.com/janosh/svelte-multiselect/commit/586c724d471aece2b5a3726bb5eb145e36073fe3)
231
- - remove plausible.js analytics [`cd4c9f6`](https://github.com/janosh/svelte-multiselect/commit/cd4c9f6e18e13959dfb4fcebe9acba7a875b83a2)
232
-
233
- #### [v5.0.1](https://github.com/janosh/svelte-multiselect/compare/v5.0.0...v5.0.1)
234
-
235
- > 23 April 2022
236
-
237
- - Strongly typed custom events [`#79`](https://github.com/janosh/svelte-multiselect/pull/79)
238
-
239
- ### [v5.0.0](https://github.com/janosh/svelte-multiselect/compare/v4.0.6...v5.0.0)
240
-
241
- > 21 April 2022
242
-
243
- - v5 release [`#76`](https://github.com/janosh/svelte-multiselect/pull/76)
244
- - Work with string options as is, don't convert to objects internally [`#75`](https://github.com/janosh/svelte-multiselect/pull/75)
245
- - v5 release (#76) [`#57`](https://github.com/janosh/svelte-multiselect/issues/57)
246
-
247
- #### [v4.0.6](https://github.com/janosh/svelte-multiselect/compare/v4.0.5...v4.0.6)
248
-
249
- > 7 April 2022
250
-
251
- - Fix backspace deleting multiple selected options if identical labels [`#72`](https://github.com/janosh/svelte-multiselect/pull/72)
252
- - Several fixes for `allowUserOptions` [`#69`](https://github.com/janosh/svelte-multiselect/pull/69)
253
- - pre-commit autoupdate [`#70`](https://github.com/janosh/svelte-multiselect/pull/70)
254
-
255
- #### [v4.0.5](https://github.com/janosh/svelte-multiselect/compare/v4.0.4...v4.0.5)
256
-
257
- > 2 April 2022
258
-
259
- - Fix MultiSelect `localStorage` binding [`#66`](https://github.com/janosh/svelte-multiselect/pull/66)
260
-
261
- #### [v4.0.4](https://github.com/janosh/svelte-multiselect/compare/v4.0.3...v4.0.4)
262
-
263
- > 30 March 2022
264
-
265
- - Move examples to new `src/routes/demos` dir [`#63`](https://github.com/janosh/svelte-multiselect/pull/63)
266
- - make ToC position fixed (closes #64) [`#64`](https://github.com/janosh/svelte-multiselect/issues/64)
267
- - check for undefined (not falsy) value in rawOp processing (fixes #65) [`#65`](https://github.com/janosh/svelte-multiselect/issues/65)
268
- - LanguageSlot change SVG icons src repo to vscode-icons for more coverage [`92390e9`](https://github.com/janosh/svelte-multiselect/commit/92390e937a063b2b0c88e0ac6f9a9d8f3cb1eadd)
269
- - more preselected slots in Examples.svelte [`cd0a01a`](https://github.com/janosh/svelte-multiselect/commit/cd0a01a7a6b319299642b3c24c5caea8dc9dc24d)
270
-
271
- #### [v4.0.3](https://github.com/janosh/svelte-multiselect/compare/v4.0.2...v4.0.3)
272
-
273
- > 23 March 2022
274
-
275
- - Add `aria-label` to hidden `.form-control` input [`#62`](https://github.com/janosh/svelte-multiselect/pull/62)
276
- - Add `aria-label` to hidden `.form-control` input (#62) [`#58`](https://github.com/janosh/svelte-multiselect/issues/58) [`#35`](https://github.com/janosh/svelte-multiselect/issues/35)
277
- - fix dropdown closing when clicking between list items (closes #61) [`#61`](https://github.com/janosh/svelte-multiselect/issues/61)
278
- - `svelte.config.js` add `kit.prerender.default: true`, `mv src/{global,app}.d.ts` [`4a84913`](https://github.com/janosh/svelte-multiselect/commit/4a8491380e08bad137ca7bdda9ee4ddd38abe3d6)
279
-
280
- #### [v4.0.2](https://github.com/janosh/svelte-multiselect/compare/v4.0.1...v4.0.2)
281
-
282
- > 13 March 2022
283
-
284
- - Improve a11y [`#60`](https://github.com/janosh/svelte-multiselect/pull/60)
285
- - Convert tests to Playwright [`#59`](https://github.com/janosh/svelte-multiselect/pull/59)
286
- - Convert tests to Playwright (#59) [`#58`](https://github.com/janosh/svelte-multiselect/issues/58)
287
- - add and document prop invalid (closes #47) [`#47`](https://github.com/janosh/svelte-multiselect/issues/47)
288
- - set width (not height) on svg icons and as px (not em) so they don't shrink with fluid typography on mobile screens [`ba77f93`](https://github.com/janosh/svelte-multiselect/commit/ba77f93b23b375bb650411b580406f1f7d55f365)
289
-
290
- #### [v4.0.1](https://github.com/janosh/svelte-multiselect/compare/v4.0.0...v4.0.1)
291
-
292
- > 5 March 2022
293
-
294
- - Rename readonly to disabled [`#55`](https://github.com/janosh/svelte-multiselect/pull/55)
295
- - CSS and UX tweaks [`#52`](https://github.com/janosh/svelte-multiselect/pull/52)
296
- - Readme document test runner config to avoid transpiling errors in downstream testing [`#54`](https://github.com/janosh/svelte-multiselect/pull/54)
297
- - More tests [`#51`](https://github.com/janosh/svelte-multiselect/pull/51)
298
- - Add `vitest` [`#50`](https://github.com/janosh/svelte-multiselect/pull/50)
299
- - Rename readonly to disabled (#55) [`#45`](https://github.com/janosh/svelte-multiselect/issues/45)
300
- - close options dropdown list on input blur (fixes #53) [`#53`](https://github.com/janosh/svelte-multiselect/issues/53)
301
- - CSS and UX tweaks (#52) [`#44`](https://github.com/janosh/svelte-multiselect/issues/44) [`#44`](https://github.com/janosh/svelte-multiselect/issues/44) [`#44`](https://github.com/janosh/svelte-multiselect/issues/44)
302
- - Readme document test runner config to avoid transpiling errors in downstream testing (#54) [`#48`](https://github.com/janosh/svelte-multiselect/issues/48)
303
-
304
- ### [v4.0.0](https://github.com/janosh/svelte-multiselect/compare/v3.3.0...v4.0.0)
305
-
306
- > 21 February 2022
307
-
308
- - Implement `allowUserOptions`, `autoScroll` and `loading` (closes #39) [`#41`](https://github.com/janosh/svelte-multiselect/pull/41)
309
- - define DispatchEvents type used to annotate createEventDispatcher() [`#32`](https://github.com/janosh/svelte-multiselect/pull/32)
310
- - add prop required to prevent form submission if no options selected (closes #42) [`#42`](https://github.com/janosh/svelte-multiselect/issues/42)
311
- - Implement `allowUserOptions`, `autoScroll` and `loading` (closes #39) (#41) [`#39`](https://github.com/janosh/svelte-multiselect/issues/39) [`#39`](https://github.com/janosh/svelte-multiselect/issues/39)
312
-
313
- #### [v3.3.0](https://github.com/janosh/svelte-multiselect/compare/v3.2.3...v3.3.0)
314
-
315
- > 20 February 2022
316
-
317
- - by default, only show maxSelectMsg if maxSelect != null and >`1 (closes #37) [`#37`](<https://github.com/janosh/svelte-multiselect/issues/37>)
318
- - add CSS var --sms-options-shadow defaults to subtle black shadow around dropdown list (0 0 14pt -8pt black) (closes #36) [`#36`](https://github.com/janosh/svelte-multiselect/issues/36)
319
- - add prop liActiveOptionClass = '' (closes #35) [`#35`](https://github.com/janosh/svelte-multiselect/issues/35)
320
- - turn searchText = and showOptions = false into bindable props (closes #33) [`#33`](https://github.com/janosh/svelte-multiselect/issues/33)
321
- - document missing noOptionsMsg prop (closes #34) [`#34`](https://github.com/janosh/svelte-multiselect/issues/34)
322
- - ensure custom class names (outerDivClass, ulOptionsClass) come last (closes #38) [`#38`](https://github.com/janosh/svelte-multiselect/issues/38)
323
- - fix ToC scroll to heading (closes #31) [`#31`](https://github.com/janosh/svelte-multiselect/issues/31)
324
- - only show remove all btn when maxSelect !== 1 (for #37) [`64cfd8a`](https://github.com/janosh/svelte-multiselect/commit/64cfd8a1108e19aae12e65c3ad17177f09a066d8)
325
-
326
- #### [v3.2.3](https://github.com/janosh/svelte-multiselect/compare/v3.2.2...v3.2.3)
327
-
328
- > 19 February 2022
329
-
330
- - Fixes for focus on click and wiggle on hitting maxSelect [`#30`](https://github.com/janosh/svelte-multiselect/pull/30)
331
-
332
- #### [v3.2.2](https://github.com/janosh/svelte-multiselect/compare/v3.2.1...v3.2.2)
333
-
334
- > 16 February 2022
335
-
336
- - Expose filter method [`#29`](https://github.com/janosh/svelte-multiselect/pull/29)
337
- - readme improve docs on css variables and granular control through :global() selectors (closes #27) [`#27`](https://github.com/janosh/svelte-multiselect/issues/27)
338
-
339
- #### [v3.2.1](https://github.com/janosh/svelte-multiselect/compare/v3.2.0...v3.2.1)
340
-
341
- > 7 February 2022
342
-
343
- - mv input outside ul.selected for better HTML semantics (closes #26) [`#26`](https://github.com/janosh/svelte-multiselect/issues/26)
344
-
345
- #### [v3.2.0](https://github.com/janosh/svelte-multiselect/compare/v3.1.1...v3.2.0)
346
-
347
- > 3 February 2022
348
-
349
- - apply id prop to `<input>` instead of outer div (closes #25) [`#25`](https://github.com/janosh/svelte-multiselect/issues/25)
350
- - add eslint commit hook + update deps [`6ad44b8`](https://github.com/janosh/svelte-multiselect/commit/6ad44b85057aef71eae19293de80f9d42f91f87b)
351
- - v.3.2.0 [`71ff2d1`](https://github.com/janosh/svelte-multiselect/commit/71ff2d192caccacbe41f83949c14d7d4ca87d590)
352
- - add readme badge to document minimum svelte version (for #24) [`7d9fe5a`](https://github.com/janosh/svelte-multiselect/commit/7d9fe5a977b56dab95069b64321f0718e0d61f08)
353
-
354
- #### [v3.1.1](https://github.com/janosh/svelte-multiselect/compare/v3.1.0...v3.1.1)
355
-
356
- > 25 January 2022
357
-
358
- - wiggle the maxSelect msg on hitting selection limit (closes #19) [`#19`](https://github.com/janosh/svelte-multiselect/issues/19)
359
- - readme better docs for CSS variables, rename slots `{options,selected}Renderer -> render{options,selected}` [`c8ab724`](https://github.com/janosh/svelte-multiselect/commit/c8ab7241506cfe6b5930d098150a251e85c52afd)
360
-
361
- #### [v3.1.0](https://github.com/janosh/svelte-multiselect/compare/v3.0.1...v3.1.0)
362
-
363
- > 22 January 2022
364
-
365
- - add selectedRenderer + optionRenderer named slots (closes #21) [`#21`](https://github.com/janosh/svelte-multiselect/issues/21)
366
- - docs site use unmodified readme with slot to insert examples, yarn add svelte-github-corner [`1072691`](https://github.com/janosh/svelte-multiselect/commit/10726916ea2a72560cd8ee6f2806526bf932e771)
367
- - readme add note on type exports for TS users, add error page that redirects to index [`dde76c8`](https://github.com/janosh/svelte-multiselect/commit/dde76c8b92408b7fddca0b555a63c2b1bfd0dbe8)
368
-
369
- #### [v3.0.1](https://github.com/janosh/svelte-multiselect/compare/v3.0.0...v3.0.1)
370
-
371
- > 7 January 2022
372
-
373
- - favorite web framework show Confetti.svelte on:add Svelte [`8d109ee`](https://github.com/janosh/svelte-multiselect/commit/8d109ee5c7755e447fcb72419f3b7ecc19cac0b2)
374
- - bump svelte@3.45.0 to silence warning: MultiSelect has unused export property 'defaultDisabledTitle' (sveltejs/svelte#6964) [`f80a7a6`](https://github.com/janosh/svelte-multiselect/commit/f80a7a622310005407585298f2611597c0941990)
375
- - update readme + svelte-toc@0.2.0 [`40013ba`](https://github.com/janosh/svelte-multiselect/commit/40013badd61dd0fcade7ab295dabd26693e3cc51)
376
- - pre-commit autoupdate [`0d05864`](https://github.com/janosh/svelte-multiselect/commit/0d05864d19987460dd30d667eb22deb91a520668)
377
- - iOS Safari prevent zoom into page on focus MultiSelect input [`44f17be`](https://github.com/janosh/svelte-multiselect/commit/44f17be53378e38f4a8748b815737d25cdebc85f)
378
-
379
- ### [v3.0.0](https://github.com/janosh/svelte-multiselect/compare/v2.0.0...v3.0.0)
380
-
381
- > 29 December 2021
382
-
383
- - ensure active option is scrolled into view if needed (closes #15), breaking change: renames tokens to options [`#15`](https://github.com/janosh/svelte-multiselect/issues/15)
384
-
385
- ### [v2.0.0](https://github.com/janosh/svelte-multiselect/compare/v1.2.2...v2.0.0)
386
-
387
- > 24 December 2021
388
-
389
- - Convert options from simple strings to objects [`#16`](https://github.com/janosh/svelte-multiselect/pull/16)
390
- - Add local to transition:fly [`#14`](https://github.com/janosh/svelte-multiselect/pull/14)
391
- - add onClickOutside action, used to replace input.on:blur() for hiding options (closes #18) [`#18`](https://github.com/janosh/svelte-multiselect/issues/18)
392
- - update deps [`fb90f93`](https://github.com/janosh/svelte-multiselect/commit/fb90f936fa0d49f81e6c9c60986dd04749ea6a67)
393
- - more keyboard friendliness by showing remove button focus and triggering on space bar or enter key [`b87d22b`](https://github.com/janosh/svelte-multiselect/commit/b87d22bc5706acd18e1e79c40b3845f2ee3615b2)
394
- - add plausible [`0557c0f`](https://github.com/janosh/svelte-multiselect/commit/0557c0f2bbef80820540302af29c79b7ac89023b)
395
-
396
- #### [v1.2.2](https://github.com/janosh/svelte-multiselect/compare/v1.2.1...v1.2.2)
397
-
398
- > 27 October 2021
399
-
400
- - set `<input>` width back to 1pt as it's only needed to tab into, focus and blur `<MultiSelect>` (closes #12) [`#12`](https://github.com/janosh/svelte-multiselect/issues/12)
401
- - update readme [`45c7993`](https://github.com/janosh/svelte-multiselect/commit/45c7993398c986499d4c0729177620cbec719cb7)
402
-
403
- #### [v1.2.1](https://github.com/janosh/svelte-multiselect/compare/v1.2.0...v1.2.1)
404
-
405
- > 21 October 2021
406
-
407
- - make internal CSS easily overridable (sveltejs/svelte#6859) [`d15a445`](https://github.com/janosh/svelte-multiselect/commit/d15a44504707c178c67e22318b2cc6095b1b192f)
408
-
409
- #### [v1.2.0](https://github.com/janosh/svelte-multiselect/compare/v1.1.13...v1.2.0)
410
-
411
- > 12 October 2021
412
-
413
- - add src/lib/index.ts for package path export '.' (closes #11) [`#11`](https://github.com/janosh/svelte-multiselect/issues/11)
414
-
415
- #### [v1.1.13](https://github.com/janosh/svelte-multiselect/compare/v1.1.12...v1.1.13)
416
-
417
- > 12 October 2021
418
-
419
- - add src/lib/index.ts for package path export '.' (closes #11) [`#11`](https://github.com/janosh/svelte-multiselect/issues/11)
420
-
421
- #### [v1.1.12](https://github.com/janosh/svelte-multiselect/compare/v1.1.11...v1.1.12)
422
-
423
- > 11 October 2021
424
-
425
- - Add new prop disabledOptions [`#9`](https://github.com/janosh/svelte-multiselect/pull/9)
426
- - add pre-commit hooks [`dfb6399`](https://github.com/janosh/svelte-multiselect/commit/dfb6399a77b705f8e5979eb887d345a5f52ff929)
427
- - pre-commit autoupdate [`b69425d`](https://github.com/janosh/svelte-multiselect/commit/b69425d18473122f1af889d2f48c60d02e43b99f)
428
-
429
- #### [v1.1.11](https://github.com/janosh/svelte-multiselect/compare/v1.1.10...v1.1.11)
430
-
431
- > 3 September 2021
432
-
433
- - fix removeAll button not dispatching remove and change events (closes #7) [`#7`](https://github.com/janosh/svelte-multiselect/issues/7)
434
- - remove @tsconfig/svelte, update deps [`9b2c231`](https://github.com/janosh/svelte-multiselect/commit/9b2c23181f4a96bd9d002f535dd669153e772b72)
435
- - add type=(add|remove) detail to 'change' event dispatch [`8290458`](https://github.com/janosh/svelte-multiselect/commit/8290458b898292a28d65710d6941f193fb9964aa)
436
-
437
- #### [v1.1.10](https://github.com/janosh/svelte-multiselect/compare/v1.1.9...v1.1.10)
438
-
439
- > 12 August 2021
440
-
441
- - add `on:change` event and document events in readme (closes #5) [`#5`](https://github.com/janosh/svelte-multiselect/issues/5)
442
-
443
- #### [v1.1.9](https://github.com/janosh/svelte-multiselect/compare/v1.1.8...v1.1.9)
444
-
445
- > 12 July 2021
446
-
447
- - convert to typescript [`bd391c5`](https://github.com/janosh/svelte-multiselect/commit/bd391c5aba615ab41e2f561f81e057928a7064a8)
448
- - update to @sveltejs/kit@1.0.0-next.124+ to use svelte field in `package.json` [`2367e38`](https://github.com/janosh/svelte-multiselect/commit/2367e38d699e503e6dc98808904278f96eb54ee7)
449
-
450
- #### [v1.1.8](https://github.com/janosh/svelte-multiselect/compare/v1.1.7...v1.1.8)
451
-
452
- > 7 July 2021
453
-
454
- - turn hard-coded remove button titles into props [`c35162b`](https://github.com/janosh/svelte-multiselect/commit/c35162b0d0c1ed183bc23dbf15b0ff46638cbb3b)
455
- - guard against selected being nullish, keep ul.options in the DOM even if showoptions is false to allow selecting in dev tools for styling [`b9bd576`](https://github.com/janosh/svelte-multiselect/commit/b9bd576f6f76ec86ebeff1d899d8947bef64f66f)
456
-
457
- #### [v1.1.7](https://github.com/janosh/svelte-multiselect/compare/v1.1.6...v1.1.7)
458
-
459
- > 5 July 2021
460
-
461
- - add css classes as props for use with tailwind (closes #3) [`#3`](https://github.com/janosh/svelte-multiselect/issues/3)
462
-
463
- #### [v1.1.6](https://github.com/janosh/svelte-multiselect/compare/v1.1.5...v1.1.6)
464
-
465
- > 23 June 2021
466
-
467
- - fix: don't remove tags if search string is non-empty, open options on clicking selected tags (#2) [`5ffed50`](https://github.com/janosh/svelte-multiselect/commit/5ffed50617f47dba6ffbafd6ce266fa6e064c7de)
468
- - update svelte-toc to fix deploy [`d5279dd`](https://github.com/janosh/svelte-multiselect/commit/d5279dd11279509493030aeb26295873929b2253)
469
-
470
- #### [v1.1.5](https://github.com/janosh/svelte-multiselect/compare/v1.1.4...v1.1.5)
471
-
472
- > 22 June 2021
473
-
474
- - convert to `svelte-kit package` [`9db3cfb`](https://github.com/janosh/svelte-multiselect/commit/9db3cfb5b6e2db844961be5bc59fc12e5d5b6b76)
475
-
476
- #### [v1.1.4](https://github.com/janosh/svelte-multiselect/compare/v1.1.3...v1.1.4)
477
-
478
- > 21 June 2021
479
-
480
- - fix setting initial value for selected, fix setting class `'selected'` in single mode [`16d11de`](https://github.com/janosh/svelte-multiselect/commit/16d11de77567f9d30e37e815dfcb9a7d580d6500)
481
-
482
- #### [v1.1.3](https://github.com/janosh/svelte-multiselect/compare/v1.1.2...v1.1.3)
483
-
484
- > 20 June 2021
485
-
486
- - replace prop single with maxSelect to specify any number of selectable options, add class single to div.multiselect if maxSelect===1 (#2) [`36e916f`](https://github.com/janosh/svelte-multiselect/commit/36e916f4a42d395c394ddff47364a17fd22a7ec1)
487
- - add linked headings [`2eedf9a`](https://github.com/janosh/svelte-multiselect/commit/2eedf9aa24512ff96f8ccff564d3a1fa7615388a)
488
-
489
- #### [v1.1.2](https://github.com/janosh/svelte-multiselect/compare/v1.1.1...v1.1.2)
490
-
491
- > 28 May 2021
492
-
493
- - add css var props [`f591814`](https://github.com/janosh/svelte-multiselect/commit/f5918141805cfc6acda28c836a57c3df81fa758f)
494
-
495
- #### [v1.1.1](https://github.com/janosh/svelte-multiselect/compare/v1.1.0...v1.1.1)
496
-
497
- > 25 May 2021
498
-
499
- - add GitHubCorner.svelte for link to repo [`e80a402`](https://github.com/janosh/svelte-multiselect/commit/e80a402556783108bc5dc626f9816b647e2c937f)
500
- - remove selected tokens with backspace [`c5d7495`](https://github.com/janosh/svelte-multiselect/commit/c5d7495a43b945dd56ad06fbe639de0db542d5f4)
501
- - add readme badges [`992eaa4`](https://github.com/janosh/svelte-multiselect/commit/992eaa43ec19841b3035a5dcf9996eaf58316fa8)
502
- - demo site fix stripping start of readme for docs [`107273d`](https://github.com/janosh/svelte-multiselect/commit/107273de356f176cb0fc94f28ae4f2e773b62d42)
503
- - add `svelte-toc` table of contents to demo site [`36aa1c5`](https://github.com/janosh/svelte-multiselect/commit/36aa1c523c5bc3acb14e9613b61c04ffd54c6100)
504
-
505
- #### [v1.1.0](https://github.com/janosh/svelte-multiselect/compare/v1.0.1...v1.1.0)
506
-
507
- > 9 May 2021
508
-
509
- - import readme on demo site (more DRY) [`c0e4924`](https://github.com/janosh/svelte-multiselect/commit/c0e49246e76a81600bb35931fd7d30f6f6aeb550)
510
- - remove unused `example.svx` [`2138caa`](https://github.com/janosh/svelte-multiselect/commit/2138caa171f20a2f80c2e75d0dffd066caf17a83)
511
- - rename package dir, improve readme [`0150378`](https://github.com/janosh/svelte-multiselect/commit/015037848f666a76b24b93603764084b41611740)
512
-
513
- #### [v1.0.1](https://github.com/janosh/svelte-multiselect/compare/v1.0.0...v1.0.1)
514
-
515
- > 8 May 2021
516
-
517
- - remove hidden input for storing currently selected options as JSON [`802a219`](https://github.com/janosh/svelte-multiselect/commit/802a2195a28986c219298d7d9e7ca47f2aaf7db6)
518
-
519
- ### v1.0.0
520
-
521
- > 7 May 2021
522
-
523
- - initial commit [`14dd38a`](https://github.com/janosh/svelte-multiselect/commit/14dd38adb06a8899e39efabdb114faab943cedf0)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes