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,15 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [
5
+ { foo: '1', label: 'One' },
6
+ { foo: '2', label: 'Two' },
7
+ { foo: '3', label: 'Three' },
8
+ ];
9
+
10
+ let justValue;
11
+ </script>
12
+
13
+ <Select {items} itemId="foo" bind:justValue />
14
+
15
+ <p>{justValue}</p>
@@ -0,0 +1,15 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = ['One', 'Two', 'Three'];
5
+
6
+ let collection = [
7
+ { value: 'one', label: 'One' },
8
+ { value: 'two', label: 'Two' },
9
+ { value: 'three', label: 'Three' },
10
+ ];
11
+ </script>
12
+
13
+ <Select {items} />
14
+ <br />
15
+ <Select items={collection} />
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let collection = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ let justValue;
11
+ </script>
12
+
13
+
14
+ <Select items={collection} bind:justValue />
15
+
16
+ <p>justValue: {justValue}</p>
@@ -0,0 +1,15 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let collection = [
5
+ { value: 'one', foo: 'One' },
6
+ { value: 'two', foo: 'Two' },
7
+ { value: 'three', foo: 'Three' },
8
+ ];
9
+
10
+ let value;
11
+ </script>
12
+
13
+ <Select items={collection} label="foo" bind:value />
14
+
15
+ <p>value: {value?.['foo']}</p>
@@ -0,0 +1,21 @@
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
+ <div>
12
+ <Select {items} listAutoWidth={false} />
13
+
14
+ <Select {items} listAutoWidth={true} />
15
+ </div>
16
+
17
+ <style>
18
+ div {
19
+ display: flex;
20
+ }
21
+ </style>
@@ -0,0 +1,21 @@
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
+ <div>
12
+ <Select {items} listOffset={10}></Select>
13
+
14
+
15
+ </div>
16
+
17
+ <style>
18
+ div {
19
+ display: flex;
20
+ }
21
+ </style>
@@ -0,0 +1,31 @@
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 listOpen = $state(false);
11
+ let show = $state(false);
12
+ </script>
13
+
14
+ <button
15
+ onpointerdown={(e) => {
16
+ e.preventDefault();
17
+ listOpen = !listOpen;
18
+ }}>Open</button>
19
+
20
+ <Select {items} bind:listOpen />
21
+
22
+ <br />
23
+
24
+ <button
25
+ onclick={() => {
26
+ show = !show;
27
+ }}>Show Select</button>
28
+
29
+ {#if show}
30
+ <Select {items} listOpen />
31
+ {/if}
@@ -0,0 +1,16 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+ import Fuse from 'fuse.js';
4
+
5
+ let items = ['one', 'two', 'three'];
6
+
7
+ async function handleOptions(filterText) {
8
+ if (filterText.length === 0) return [...items];
9
+
10
+ const fuse = new Fuse([...items]);
11
+
12
+ return fuse.search(filterText).map(({ item }) => item);
13
+ }
14
+ </script>
15
+
16
+ <Select loadOptions={handleOptions} debounceWait="0" />
@@ -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 loading = $state(true);
11
+ </script>
12
+
13
+ <button onclick={() => (loading = !loading)}>Toggle Loading</button>
14
+
15
+ <Select {items} bind:loading />
@@ -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} multiple multiFullItemClearable />
12
+
@@ -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} multiple />
12
+
@@ -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
+ let name = 'numbers';
11
+ </script>
12
+
13
+ <Select {items} {name} />
@@ -0,0 +1,14 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let collection = [
5
+ { value: 'one', label: 'One' },
6
+ { value: 'two', label: 'Two' },
7
+ { value: 'three', label: 'Three' },
8
+ ];
9
+
10
+ </script>
11
+
12
+ <Select items={collection} placeholder="foo" />
13
+
14
+
@@ -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} placeholderAlwaysShow multiple />
@@ -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
+ </script>
10
+
11
+ <form onsubmit={(e) => e.preventDefault()}>
12
+ <Select {items} required />
13
+ <button type="submit">Submit</button>
14
+ </form>
@@ -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 searchable = $state(true);
11
+ </script>
12
+
13
+ <button onclick={() => searchable = !searchable}>Searchable: {searchable}</button>
14
+
15
+ <Select {items} {searchable} />
@@ -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
+ </script>
10
+
11
+ <Select {items} showChevron />
12
+
13
+ <style>
14
+
15
+ </style>
@@ -0,0 +1,19 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = ['One', 'Two', 'Three'];
5
+
6
+ let collection = [
7
+ { value: 'one', label: 'One' },
8
+ { value: 'two', label: 'Two' },
9
+ { value: 'three', label: 'Three' },
10
+ ];
11
+
12
+ let value;
13
+ </script>
14
+
15
+ <Select {items} value="One" />
16
+ <br />
17
+ <Select items={collection} bind:value />
18
+
19
+ <p>{value?.label || ''}</p>
@@ -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
+ </script>
10
+
11
+
12
+ <Select {items} showChevron>
13
+ {#snippet chevronIcon({ listOpen })}
14
+ <div>{listOpen ? '⬆️' : '⬇️'}</div>
15
+ {/snippet}
16
+ </Select>
@@ -0,0 +1,21 @@
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}>
12
+ {#snippet clearIcon()}
13
+ <div class="clear-icon">❌</div>
14
+ {/snippet}
15
+ </Select>
16
+
17
+ <style>
18
+ .clear-icon {
19
+ cursor: default;
20
+ }
21
+ </style>
@@ -0,0 +1,18 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let items = [];
5
+ </script>
6
+
7
+ <Select {items}>
8
+ {#snippet empty()}
9
+ <div class="empty-message">Nothing to see here...</div>
10
+ {/snippet}
11
+ </Select>
12
+
13
+ <style>
14
+ .empty-message {
15
+ padding: 10px;
16
+ text-align: center;
17
+ }
18
+ </style>
@@ -0,0 +1,10 @@
1
+ export const prerender = false;
2
+
3
+ /** @type {import('./$types').Actions} */
4
+ export const actions = {
5
+ someaction: async ({ request }) => {
6
+ const data = await request.formData();
7
+ const demo = data.get('demo');
8
+ return { success: true, demo };
9
+ },
10
+ };
@@ -0,0 +1,22 @@
1
+ <script>
2
+ import Select from '$lib/Select.svelte';
3
+
4
+ let { form } = $props();
5
+
6
+ let value = $state(undefined);
7
+ let items = ['pizza', 'crisps', 'ice-cream'];
8
+ </script>
9
+
10
+ <form method="POST" action="?/someaction">
11
+ <Select {items} bind:value>
12
+ {#snippet inputHidden({ value })}
13
+ <input type="hidden" name="demo" value={value ? JSON.stringify(value) : ''} />
14
+ {/snippet}
15
+ </Select>
16
+
17
+ <button>Send</button>
18
+ </form>
19
+
20
+ {#if form?.success}
21
+ <p>Data: {form?.demo}</p>
22
+ {/if}
@@ -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
+ </script>
10
+
11
+ <Select {items}>
12
+ {#snippet item({ item, index })}
13
+ <div>{index}: {item.label}</div>
14
+ {/snippet}
15
+ </Select>
@@ -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 value = $state([]);
11
+
12
+ function handleClick(item) {
13
+ if (!value) value = [item];
14
+ else value = [...value, item]
15
+ }
16
+ </script>
17
+
18
+ <Select {items} bind:value multiple>
19
+ {#snippet list({ filteredItems })}
20
+ <div class="custom-list">
21
+ {#each filteredItems as item }
22
+ <span
23
+ role="option"
24
+ aria-selected={value?.some(v => v.value === item.value) ?? false}
25
+ tabindex="0"
26
+ onclick={() => handleClick(item)}
27
+ onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(item); }}>
28
+ {item.label}
29
+ </span>
30
+ {/each}
31
+ </div>
32
+ {/snippet}
33
+ </Select>
34
+
35
+
36
+ <style>
37
+ .custom-list {
38
+ display: flex;
39
+ flex-direction: column;
40
+ font-family: Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif;
41
+ }
42
+
43
+ span {
44
+ height: 50px;
45
+ display: flex;
46
+ align-items: center;
47
+ padding: 20px;
48
+ }
49
+ </style>
@@ -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
+ </script>
10
+
11
+
12
+ <Select {items} listOpen>
13
+ {#snippet listAppend()}
14
+ <div>* AFTER *</div>
15
+ {/snippet}
16
+ </Select>
@@ -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
+ </script>
10
+
11
+
12
+ <Select {items} listOpen>
13
+ {#snippet listPrepend()}
14
+ <div>* BEFORE *</div>
15
+ {/snippet}
16
+ </Select>
@@ -0,0 +1,29 @@
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} loading>
12
+ {#snippet loadingIcon()}
13
+ <div class="spin">★</div>
14
+ {/snippet}
15
+ </Select>
16
+
17
+ <style>
18
+ .spin {
19
+ animation: rotate 0.75s linear infinite;
20
+ transform-origin: center center;
21
+ transform: none;
22
+ }
23
+
24
+ @keyframes rotate {
25
+ 100% {
26
+ transform: rotate(360deg);
27
+ }
28
+ }
29
+ </style>
@@ -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
+ </script>
10
+
11
+
12
+ <Select {items} multiple>
13
+ {#snippet multiClearIcon()}
14
+ <div>❌</div>
15
+ {/snippet}
16
+ </Select>
@@ -0,0 +1,22 @@
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
+
12
+ <Select {items}>
13
+ {#snippet prepend()}
14
+ <div class="prepend-icon">💪</div>
15
+ {/snippet}
16
+ </Select>
17
+
18
+ <style>
19
+ .prepend-icon {
20
+ margin-right: 5px;
21
+ }
22
+ </style>
@@ -0,0 +1,31 @@
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
+
12
+ <Select {items} required>
13
+ {#snippet requiredSlot({ value })}
14
+ <div class="required">
15
+ REQUIRED
16
+ </div>
17
+ {/snippet}
18
+ </Select>
19
+
20
+ <style>
21
+ .required {
22
+ color: red;
23
+ position: absolute;
24
+ height: 40px;
25
+ line-height: 40px;
26
+ right: 0;
27
+ border: 1px solid;
28
+ padding: 0 15px;
29
+ background: #fff;
30
+ }
31
+ </style>
@@ -0,0 +1,25 @@
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
+
12
+ <Select {items}>
13
+ {#snippet selection({ selection })}
14
+ <div>🎉 {selection.label} 🎉</div>
15
+ {/snippet}
16
+ </Select>
17
+
18
+ <br />
19
+ <br />
20
+
21
+ <Select {items} multiple>
22
+ {#snippet selection({ selection, index })}
23
+ <div>🎉 {index} : {selection.label} 🎉</div>
24
+ {/snippet}
25
+ </Select>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#000000"><path d="M 3 5 A 1.0001 1.0001 0 1 0 3 7 L 21 7 A 1.0001 1.0001 0 1 0 21 5 L 3 5 z M 3 11 A 1.0001 1.0001 0 1 0 3 13 L 21 13 A 1.0001 1.0001 0 1 0 21 11 L 3 11 z M 3 17 A 1.0001 1.0001 0 1 0 3 19 L 21 19 A 1.0001 1.0001 0 1 0 21 17 L 3 17 z" fill="#000000"/></svg>
Binary file
Binary file
@@ -0,0 +1,10 @@
1
+ import adapter from '@sveltejs/adapter-auto';
2
+
3
+ /** @type {import('@sveltejs/kit').Config} */
4
+ const config = {
5
+ kit: {
6
+ adapter: adapter()
7
+ }
8
+ };
9
+
10
+ export default config;
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ mode: 'jit',
3
+ purge: ['./src/**/*.svelte'],
4
+ };
File without changes