svelte-select-5 6.0.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.
Files changed (123) hide show
  1. package/.claude/settings.local.json +20 -0
  2. package/.prettierignore +2 -0
  3. package/.prettierrc +17 -0
  4. package/CHANGELOG.md +571 -0
  5. package/LICENSE +9 -0
  6. package/MIGRATION_GUIDE.md +98 -0
  7. package/README.md +316 -0
  8. package/docs/generate_theming_variables_md.cjs +53 -0
  9. package/docs/theming_variables.md +113 -0
  10. package/jsconfig.json +3 -0
  11. package/package.json +77 -0
  12. package/rollup.config.js +33 -0
  13. package/src/app.html +29 -0
  14. package/src/global.d.ts +1 -0
  15. package/src/lib/ChevronIcon.svelte +22 -0
  16. package/src/lib/ClearIcon.svelte +22 -0
  17. package/src/lib/LoadingIcon.svelte +33 -0
  18. package/src/lib/Select.svelte +1345 -0
  19. package/src/lib/filter.js +38 -0
  20. package/src/lib/get-items.js +25 -0
  21. package/src/lib/index.js +1 -0
  22. package/src/lib/tailwind.css +130 -0
  23. package/src/post-prepare.cjs +6 -0
  24. package/src/remove-styles.cjs +22 -0
  25. package/src/routes/+layout.js +1 -0
  26. package/src/routes/+layout.svelte +263 -0
  27. package/src/routes/+page.js +5 -0
  28. package/src/routes/+page.svelte +0 -0
  29. package/src/routes/examples/+page.svelte +84 -0
  30. package/src/routes/examples/advanced/create-item/+page.svelte +36 -0
  31. package/src/routes/examples/advanced/create-item-multiple/+page.svelte +38 -0
  32. package/src/routes/examples/advanced/floating-ui/+page.svelte +22 -0
  33. package/src/routes/examples/advanced/form-action/+page.server.js +10 -0
  34. package/src/routes/examples/advanced/form-action/+page.svelte +20 -0
  35. package/src/routes/examples/advanced/limit-multi-value/+page.svelte +31 -0
  36. package/src/routes/examples/advanced/long-item/+page.svelte +38 -0
  37. package/src/routes/examples/advanced/multi-item-checkboxes/+page.svelte +49 -0
  38. package/src/routes/examples/advanced/style-props/+page.svelte +14 -0
  39. package/src/routes/examples/advanced/virtual-list/+page.svelte +95 -0
  40. package/src/routes/examples/events/blur/+page.svelte +19 -0
  41. package/src/routes/examples/events/change/+page.svelte +16 -0
  42. package/src/routes/examples/events/clear/+page.svelte +18 -0
  43. package/src/routes/examples/events/error/+page.svelte +17 -0
  44. package/src/routes/examples/events/filter/+page.svelte +16 -0
  45. package/src/routes/examples/events/focus/+page.svelte +16 -0
  46. package/src/routes/examples/events/hoverItem/+page.svelte +16 -0
  47. package/src/routes/examples/events/input/+page.svelte +16 -0
  48. package/src/routes/examples/events/loaded/+page.svelte +23 -0
  49. package/src/routes/examples/props/class/+page.svelte +17 -0
  50. package/src/routes/examples/props/clearFilterTextOnBlur/+page.svelte +13 -0
  51. package/src/routes/examples/props/clearable/+page.svelte +13 -0
  52. package/src/routes/examples/props/closeListOnChange/+page.svelte +12 -0
  53. package/src/routes/examples/props/container-styles/+page.svelte +11 -0
  54. package/src/routes/examples/props/debounce-wait/+page.svelte +19 -0
  55. package/src/routes/examples/props/disabled/+page.svelte +15 -0
  56. package/src/routes/examples/props/filter-text/+page.svelte +14 -0
  57. package/src/routes/examples/props/floating-config/+page.svelte +42 -0
  58. package/src/routes/examples/props/focused/+page.svelte +16 -0
  59. package/src/routes/examples/props/group-header-selectable/+page.svelte +18 -0
  60. package/src/routes/examples/props/hide-empty-state/+page.svelte +8 -0
  61. package/src/routes/examples/props/id/+page.svelte +15 -0
  62. package/src/routes/examples/props/input-attributes/+page.svelte +11 -0
  63. package/src/routes/examples/props/item-id/+page.svelte +15 -0
  64. package/src/routes/examples/props/items/+page.svelte +15 -0
  65. package/src/routes/examples/props/just-value/+page.svelte +16 -0
  66. package/src/routes/examples/props/label/+page.svelte +15 -0
  67. package/src/routes/examples/props/list-auto-width/+page.svelte +21 -0
  68. package/src/routes/examples/props/list-offset/+page.svelte +21 -0
  69. package/src/routes/examples/props/list-open/+page.svelte +31 -0
  70. package/src/routes/examples/props/loadOptions/+page.svelte +16 -0
  71. package/src/routes/examples/props/loading/+page.svelte +15 -0
  72. package/src/routes/examples/props/multiFullItemClearable/+page.svelte +12 -0
  73. package/src/routes/examples/props/multiple/+page.svelte +12 -0
  74. package/src/routes/examples/props/name/+page.svelte +13 -0
  75. package/src/routes/examples/props/placeholder/+page.svelte +14 -0
  76. package/src/routes/examples/props/placeholder-always-show/+page.svelte +11 -0
  77. package/src/routes/examples/props/required/+page.svelte +14 -0
  78. package/src/routes/examples/props/searchable/+page.svelte +15 -0
  79. package/src/routes/examples/props/show-chevron/+page.svelte +15 -0
  80. package/src/routes/examples/props/value/+page.svelte +19 -0
  81. package/src/routes/examples/slots/chevron-icon/+page.svelte +16 -0
  82. package/src/routes/examples/slots/clear-icon/+page.svelte +21 -0
  83. package/src/routes/examples/slots/empty/+page.svelte +18 -0
  84. package/src/routes/examples/slots/input-hidden/+page.server.js +10 -0
  85. package/src/routes/examples/slots/input-hidden/+page.svelte +22 -0
  86. package/src/routes/examples/slots/item/+page.svelte +15 -0
  87. package/src/routes/examples/slots/list/+page.svelte +49 -0
  88. package/src/routes/examples/slots/list-append/+page.svelte +16 -0
  89. package/src/routes/examples/slots/list-prepend/+page.svelte +16 -0
  90. package/src/routes/examples/slots/loading-icon/+page.svelte +29 -0
  91. package/src/routes/examples/slots/multi-clear-icon/+page.svelte +16 -0
  92. package/src/routes/examples/slots/prepend/+page.svelte +22 -0
  93. package/src/routes/examples/slots/required/+page.svelte +31 -0
  94. package/src/routes/examples/slots/selection/+page.svelte +25 -0
  95. package/static/nav-icon.svg +2 -0
  96. package/static/svelte-select.png +0 -0
  97. package/svelte-select.png +0 -0
  98. package/svelte.config.js +10 -0
  99. package/tailwind.config.cjs +4 -0
  100. package/test/public/favicon.ico +0 -0
  101. package/test/public/index.html +15 -0
  102. package/test/src/ChevronSlotTest.svelte +19 -0
  103. package/test/src/ClearIconSlotTest.svelte +12 -0
  104. package/test/src/CustomItem.svelte +78 -0
  105. package/test/src/GroupHeaderNotSelectable.svelte +17 -0
  106. package/test/src/HoverItemIndexTest.svelte +21 -0
  107. package/test/src/InputHiddenSlotTest.svelte +12 -0
  108. package/test/src/ItemHeightTest.svelte +7 -0
  109. package/test/src/ItemSlotTest.svelte +11 -0
  110. package/test/src/ListSlotTest.svelte +14 -0
  111. package/test/src/LoadOptionsGroup.svelte +21 -0
  112. package/test/src/MultiItemColor.svelte +7 -0
  113. package/test/src/OuterListTest.svelte +16 -0
  114. package/test/src/PrependSlotTest.svelte +12 -0
  115. package/test/src/Select/ParentContainer.svelte +11 -0
  116. package/test/src/SelectionSlotMultipleTest.svelte +12 -0
  117. package/test/src/SelectionSlotTest.svelte +12 -0
  118. package/test/src/TestClearIcon.svelte +1 -0
  119. package/test/src/TestIcon.svelte +15 -0
  120. package/test/src/env.js +1 -0
  121. package/test/src/test-utils.js +124 -0
  122. package/test/src/tests.js +3745 -0
  123. package/vite.config.js +9 -0
@@ -0,0 +1,20 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let { form } = $props();
5
+
6
+ const items = ['Foo', 'Bar'];
7
+ let value = $state(null);
8
+ let multiple = $state(false);
9
+ </script>
10
+
11
+ <label for="toggle"><input id="toggle" type="checkbox" bind:checked={multiple} />Multiple</label>
12
+
13
+ <form method="POST" action="?/someaction">
14
+ <Select name="foobar" {multiple} required {items} bind:value />
15
+ <button>Send</button>
16
+ </form>
17
+
18
+ {#if form?.success}
19
+ <p>Data: {form?.foobar}</p>
20
+ {/if}
@@ -0,0 +1,31 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ const _items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ { value: 'four', label: 'Four' },
9
+ { value: 'five', label: 'Five' },
10
+ { value: 'six', label: 'Six' },
11
+ ];
12
+
13
+ let value = $state(undefined);
14
+
15
+ let maxItems = $derived(value?.length === 4);
16
+ let items = $derived(maxItems ? [] : [..._items]);
17
+ </script>
18
+
19
+ <Select {items} multiple bind:value>
20
+ {#snippet empty()}
21
+ <div class="empty">{maxItems ? 'Max 4 items' : 'No options'}</div>
22
+ {/snippet}
23
+ </Select>
24
+
25
+
26
+ <style>
27
+ .empty {
28
+ text-align: center;
29
+ padding: 20px 0;
30
+ }
31
+ </style>
@@ -0,0 +1,38 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let collection = [
5
+ {
6
+ value: 'one',
7
+ label: 'One one one one one one one one one One one one one one one one one one One one one one one one one one one One one one one one one one one one',
8
+ },
9
+ { value: 'two', label: 'Two' },
10
+ { value: 'three', label: 'Three' },
11
+ ];
12
+ </script>
13
+
14
+ <div class="container">
15
+ <Select items={collection} --item-height="auto" --item-line-height="auto">
16
+ {#snippet item({ item })}
17
+ <div class="item">
18
+ {item.label}
19
+ </div>
20
+ {/snippet}
21
+ </Select>
22
+ </div>
23
+
24
+ <style>
25
+ .container {
26
+ width: 500px;
27
+ }
28
+
29
+ .item {
30
+ min-height: 16px;
31
+ padding: 10px 0;
32
+ line-height: 16px;
33
+ display: flex;
34
+ line-break: auto;
35
+ white-space: pre-wrap;
36
+ align-items: center;
37
+ }
38
+ </style>
@@ -0,0 +1,49 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ let checked = $state([]);
11
+ let value = $derived(checked.map((c) => items.find((i) => i.value === c)));
12
+ let isChecked = $derived.by(() => {
13
+ const result = {};
14
+ checked.forEach((c) => (result[c] = true));
15
+ return result;
16
+ });
17
+
18
+ function handleChange(e, type) {
19
+ if (type === 'clear' && Array.isArray(e)) checked = [];
20
+ else
21
+ checked.includes(e.value)
22
+ ? (checked = checked.filter((i) => i != e.value))
23
+ : (checked = [...checked, e.value]);
24
+ }
25
+ </script>
26
+
27
+ <Select
28
+ {items}
29
+ {value}
30
+ multiple={true}
31
+ filterSelectedItems={false}
32
+ closeListOnChange={false}
33
+ onselect={(e) => handleChange(e, 'select')}
34
+ onclear={(e) => handleChange(e, 'clear')}>
35
+ {#snippet item({ item })}
36
+ <div class="item">
37
+ <label for={item.value}>
38
+ <input type="checkbox" id={item.value} checked={isChecked[item.value]} />
39
+ {item.label}
40
+ </label>
41
+ </div>
42
+ {/snippet}
43
+ </Select>
44
+
45
+ <style>
46
+ .item {
47
+ pointer-events: none;
48
+ }
49
+ </style>
@@ -0,0 +1,14 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = ['One', 'Two', 'Three'];
5
+ let listOpen = false;
6
+ </script>
7
+
8
+ <Select
9
+ bind:listOpen
10
+ {items}
11
+ listOffset={0}
12
+ --list-border-radius="0 0 5px 5px"
13
+ --item-first-border-radius="0"
14
+ --border-radius={listOpen ? '5px 5px 0 0' : '5px'} />
@@ -0,0 +1,95 @@
1
+ <script>
2
+ import VirtualList from 'svelte-tiny-virtual-list';
3
+ import { tick } from 'svelte';
4
+ import Select from '$lib/Select.svelte';
5
+
6
+ const items = [];
7
+
8
+ for (let i = 0; i < 8000; i++) {
9
+ items.push(i.toString());
10
+ }
11
+
12
+ let value = $state(undefined);
13
+ let listOpen = $state(false);
14
+ let activeIndex = $state(null);
15
+ let justValue = $state(undefined);
16
+ let hoverItemIndex = $state(0);
17
+
18
+ function handleClick(i) {
19
+ activeIndex = i;
20
+ value = items[i];
21
+ listOpen = false;
22
+ }
23
+
24
+ function handleHover(e) {
25
+ hoverItemIndex = e;
26
+ }
27
+
28
+ async function handleListOpen() {
29
+ if (!value) return;
30
+ await tick();
31
+ hoverItemIndex = activeIndex;
32
+ }
33
+
34
+ $effect(() => {
35
+ if (listOpen) {
36
+ handleListOpen();
37
+ }
38
+ });
39
+ </script>
40
+
41
+ <Select
42
+ --list-max-height="300px"
43
+ {items}
44
+ bind:listOpen
45
+ bind:value
46
+ bind:justValue
47
+ bind:hoverItemIndex
48
+ onhoverItem={(e) => handleHover(e)}>
49
+ {#snippet list({ filteredItems })}
50
+ {#if filteredItems.length > 0}
51
+ <VirtualList
52
+ width="100%"
53
+ height={300}
54
+ itemCount={filteredItems?.length}
55
+ itemSize={50}
56
+ scrollToIndex={hoverItemIndex}>
57
+ {#snippet item({ index, style })}
58
+ <div
59
+ class="item"
60
+ class:active={activeIndex === index}
61
+ class:hover={hoverItemIndex === index}
62
+ {style}
63
+ role="option"
64
+ aria-selected={activeIndex === index}
65
+ tabindex="0"
66
+ onclick={() => handleClick(index)}
67
+ onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(index); }}
68
+ onfocus={() => handleHover(index)}
69
+ onmouseover={() => handleHover(index)}>
70
+ Item: {filteredItems[index].label}, Index: #{index}
71
+ </div>
72
+ {/snippet}
73
+ </VirtualList>
74
+ {/if}
75
+ {/snippet}
76
+ </Select>
77
+
78
+ <style>
79
+ .item {
80
+ height: 30px;
81
+ display: flex;
82
+ align-items: center;
83
+ padding: 20px;
84
+ cursor: default;
85
+ }
86
+
87
+ .item.hover {
88
+ background: var(--item-hover-bg, #e7f2ff);
89
+ }
90
+
91
+ .item.active {
92
+ background: var(--item-is-active-bg, #007aff);
93
+ color: var(--item-is-active-color, #fff);
94
+ }
95
+ </style>
@@ -0,0 +1,19 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function handle(event) {
11
+ console.log(event);
12
+ }
13
+ </script>
14
+
15
+ <Select {items} onblur={handle} searchable={false} />
16
+
17
+ <br />
18
+
19
+ <Select {items} onblur={handle} multiple />
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function handle(value) {
11
+ console.log(value);
12
+ }
13
+ </script>
14
+
15
+ <Select {items} onchange={handle} />
16
+
@@ -0,0 +1,18 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function handle(value) {
11
+ console.log(value);
12
+ }
13
+ </script>
14
+
15
+ <Select {items} onclear={handle} />
16
+ <br />
17
+ <Select {items} onclear={handle} multiple />
18
+
@@ -0,0 +1,17 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ function loadOptions() {
5
+ return new Promise((resolve, reject) => {
6
+ setTimeout(() => {
7
+ reject('error');
8
+ });
9
+ });
10
+ }
11
+
12
+ function handle(error) {
13
+ console.log(error);
14
+ }
15
+ </script>
16
+
17
+ <Select onerror={handle} {loadOptions} />
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function handle(filteredItems) {
11
+ console.log(filteredItems);
12
+ }
13
+ </script>
14
+
15
+ <Select {items} onfilter={handle} />
16
+
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function handle(event) {
11
+ console.log(event);
12
+ }
13
+ </script>
14
+
15
+ <Select {items} onfocus={handle} />
16
+
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function handle(index) {
11
+ console.log(index);
12
+ }
13
+ </script>
14
+
15
+ <Select {items} onhoverItem={handle} />
16
+
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function handle(value) {
11
+ console.log(value);
12
+ }
13
+ </script>
14
+
15
+ <Select {items} oninput={handle} />
16
+
@@ -0,0 +1,23 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ function loadOptions() {
11
+ return new Promise((resolve) => {
12
+ setTimeout(() => {
13
+ resolve(JSON.parse(JSON.stringify(items)));
14
+ });
15
+ });
16
+ }
17
+
18
+ function handle(data) {
19
+ console.log(data);
20
+ }
21
+ </script>
22
+
23
+ <Select onloaded={handle} {loadOptions} />
@@ -0,0 +1,17 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+ </script>
10
+
11
+ <Select {items} class="foo bar" />
12
+
13
+ <style>
14
+ :global(.foo) {
15
+ background: pink !important;
16
+ }
17
+ </style>
@@ -0,0 +1,13 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ </script>
11
+
12
+ <Select {items} clearFilterTextOnBlur={false} />
13
+ <Select {items} multiple clearFilterTextOnBlur={false} />
@@ -0,0 +1,13 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+ </script>
10
+
11
+ <Select {items} clearable={false} />
12
+ <br />
13
+ <Select {items} clearable={true} />
@@ -0,0 +1,12 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+ </script>
10
+
11
+ <Select {items} closeListOnChange={false} multiple />
12
+
@@ -0,0 +1,11 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+ </script>
10
+
11
+ <Select {items} containerStyles="background: pink !important;" />
@@ -0,0 +1,19 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ let loadOptionsCalled = false;
11
+
12
+ function loadOptions() {
13
+ loadOptionsCalled = true;
14
+ return Promise.resolve(items);
15
+ }
16
+ </script>
17
+
18
+ <p>loadOptions called: {loadOptionsCalled}</p>
19
+ <Select {loadOptions} debounceWait="2000" />
@@ -0,0 +1,15 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ let disabled = $state(false);
11
+ </script>
12
+
13
+ <button onclick={() => disabled = !disabled}>Toggle disabled</button>
14
+
15
+ <Select {items} {disabled} />
@@ -0,0 +1,14 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ let filterText;
11
+ </script>
12
+
13
+ <p>{filterText}</p>
14
+ <Select {items} bind:filterText />
@@ -0,0 +1,42 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ let floatingConfig = {
11
+ strategy: 'fixed',
12
+ };
13
+
14
+ let topConfig = {
15
+ placement: 'top-start',
16
+ };
17
+ </script>
18
+
19
+ <div class="container">
20
+ <Select {items} {floatingConfig} --list-position="fixed" />
21
+ </div>
22
+
23
+ <div class="container tall">
24
+ <Select {items} floatingConfig={topConfig} />
25
+ </div>
26
+
27
+ <style>
28
+ .container {
29
+ margin: 0 0 20px;
30
+ overflow: hidden;
31
+ width: 300px;
32
+ background: grey;
33
+ padding: 20px;
34
+ height: 100px;
35
+ overflow-y: scroll;
36
+ }
37
+
38
+ .tall {
39
+ padding-top: 200px;
40
+ height: 300px;
41
+ }
42
+ </style>
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+ import { tick } from 'svelte';
4
+
5
+ let items = [
6
+ { value: 'one', label: 'One' },
7
+ { value: 'two', label: 'Two' },
8
+ { value: 'three', label: 'Three' },
9
+ ];
10
+
11
+ let focused = true;
12
+ </script>
13
+
14
+ <p>focused: {focused}</p>
15
+
16
+ <Select {items} bind:focused />
@@ -0,0 +1,18 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'chocolate', label: 'Chocolate', group: 'Sweet' },
6
+ { value: 'pizza', label: 'Pizza', group: 'Savory', selectable: false },
7
+ { value: 'cake', label: 'Cake', group: 'Sweet', selectable: false },
8
+ { value: 'chips', label: 'Chips', group: 'Savory' },
9
+ { value: 'ice-cream', label: 'Ice Cream', group: 'Sweet' },
10
+ ];
11
+
12
+ let value;
13
+ </script>
14
+
15
+ <Select {items} groupHeaderSelectable groupBy={(item) => item.group} bind:value />
16
+ <p>
17
+ {value?.label}
18
+ </p>
@@ -0,0 +1,8 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = ['One', 'Two', 'Three'];
5
+ </script>
6
+
7
+ <Select {items} hideEmptyState />
8
+
@@ -0,0 +1,15 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ </script>
11
+
12
+ <form>
13
+ <label for="foo">Foo</label>
14
+ <Select {items} id="foo" />
15
+ </form>
@@ -0,0 +1,11 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+ </script>
10
+
11
+ <Select id="username" {items} inputAttributes={{ autocomplete: 'off' }} />