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.
- package/.claude/settings.local.json +20 -0
- package/.prettierignore +2 -0
- package/.prettierrc +17 -0
- package/CHANGELOG.md +571 -0
- package/LICENSE +9 -0
- package/MIGRATION_GUIDE.md +98 -0
- package/README.md +316 -0
- package/docs/generate_theming_variables_md.cjs +53 -0
- package/docs/theming_variables.md +113 -0
- package/jsconfig.json +3 -0
- package/package.json +77 -0
- package/rollup.config.js +33 -0
- package/src/app.html +29 -0
- package/src/global.d.ts +1 -0
- package/src/lib/ChevronIcon.svelte +22 -0
- package/src/lib/ClearIcon.svelte +22 -0
- package/src/lib/LoadingIcon.svelte +33 -0
- package/src/lib/Select.svelte +1345 -0
- package/src/lib/filter.js +38 -0
- package/src/lib/get-items.js +25 -0
- package/src/lib/index.js +1 -0
- package/src/lib/tailwind.css +130 -0
- package/src/post-prepare.cjs +6 -0
- package/src/remove-styles.cjs +22 -0
- package/src/routes/+layout.js +1 -0
- package/src/routes/+layout.svelte +263 -0
- package/src/routes/+page.js +5 -0
- package/src/routes/+page.svelte +0 -0
- package/src/routes/examples/+page.svelte +84 -0
- package/src/routes/examples/advanced/create-item/+page.svelte +36 -0
- package/src/routes/examples/advanced/create-item-multiple/+page.svelte +38 -0
- package/src/routes/examples/advanced/floating-ui/+page.svelte +22 -0
- package/src/routes/examples/advanced/form-action/+page.server.js +10 -0
- package/src/routes/examples/advanced/form-action/+page.svelte +20 -0
- package/src/routes/examples/advanced/limit-multi-value/+page.svelte +31 -0
- package/src/routes/examples/advanced/long-item/+page.svelte +38 -0
- package/src/routes/examples/advanced/multi-item-checkboxes/+page.svelte +49 -0
- package/src/routes/examples/advanced/style-props/+page.svelte +14 -0
- package/src/routes/examples/advanced/virtual-list/+page.svelte +95 -0
- package/src/routes/examples/events/blur/+page.svelte +19 -0
- package/src/routes/examples/events/change/+page.svelte +16 -0
- package/src/routes/examples/events/clear/+page.svelte +18 -0
- package/src/routes/examples/events/error/+page.svelte +17 -0
- package/src/routes/examples/events/filter/+page.svelte +16 -0
- package/src/routes/examples/events/focus/+page.svelte +16 -0
- package/src/routes/examples/events/hoverItem/+page.svelte +16 -0
- package/src/routes/examples/events/input/+page.svelte +16 -0
- package/src/routes/examples/events/loaded/+page.svelte +23 -0
- package/src/routes/examples/props/class/+page.svelte +17 -0
- package/src/routes/examples/props/clearFilterTextOnBlur/+page.svelte +13 -0
- package/src/routes/examples/props/clearable/+page.svelte +13 -0
- package/src/routes/examples/props/closeListOnChange/+page.svelte +12 -0
- package/src/routes/examples/props/container-styles/+page.svelte +11 -0
- package/src/routes/examples/props/debounce-wait/+page.svelte +19 -0
- package/src/routes/examples/props/disabled/+page.svelte +15 -0
- package/src/routes/examples/props/filter-text/+page.svelte +14 -0
- package/src/routes/examples/props/floating-config/+page.svelte +42 -0
- package/src/routes/examples/props/focused/+page.svelte +16 -0
- package/src/routes/examples/props/group-header-selectable/+page.svelte +18 -0
- package/src/routes/examples/props/hide-empty-state/+page.svelte +8 -0
- package/src/routes/examples/props/id/+page.svelte +15 -0
- package/src/routes/examples/props/input-attributes/+page.svelte +11 -0
- package/src/routes/examples/props/item-id/+page.svelte +15 -0
- package/src/routes/examples/props/items/+page.svelte +15 -0
- package/src/routes/examples/props/just-value/+page.svelte +16 -0
- package/src/routes/examples/props/label/+page.svelte +15 -0
- package/src/routes/examples/props/list-auto-width/+page.svelte +21 -0
- package/src/routes/examples/props/list-offset/+page.svelte +21 -0
- package/src/routes/examples/props/list-open/+page.svelte +31 -0
- package/src/routes/examples/props/loadOptions/+page.svelte +16 -0
- package/src/routes/examples/props/loading/+page.svelte +15 -0
- package/src/routes/examples/props/multiFullItemClearable/+page.svelte +12 -0
- package/src/routes/examples/props/multiple/+page.svelte +12 -0
- package/src/routes/examples/props/name/+page.svelte +13 -0
- package/src/routes/examples/props/placeholder/+page.svelte +14 -0
- package/src/routes/examples/props/placeholder-always-show/+page.svelte +11 -0
- package/src/routes/examples/props/required/+page.svelte +14 -0
- package/src/routes/examples/props/searchable/+page.svelte +15 -0
- package/src/routes/examples/props/show-chevron/+page.svelte +15 -0
- package/src/routes/examples/props/value/+page.svelte +19 -0
- package/src/routes/examples/slots/chevron-icon/+page.svelte +16 -0
- package/src/routes/examples/slots/clear-icon/+page.svelte +21 -0
- package/src/routes/examples/slots/empty/+page.svelte +18 -0
- package/src/routes/examples/slots/input-hidden/+page.server.js +10 -0
- package/src/routes/examples/slots/input-hidden/+page.svelte +22 -0
- package/src/routes/examples/slots/item/+page.svelte +15 -0
- package/src/routes/examples/slots/list/+page.svelte +49 -0
- package/src/routes/examples/slots/list-append/+page.svelte +16 -0
- package/src/routes/examples/slots/list-prepend/+page.svelte +16 -0
- package/src/routes/examples/slots/loading-icon/+page.svelte +29 -0
- package/src/routes/examples/slots/multi-clear-icon/+page.svelte +16 -0
- package/src/routes/examples/slots/prepend/+page.svelte +22 -0
- package/src/routes/examples/slots/required/+page.svelte +31 -0
- package/src/routes/examples/slots/selection/+page.svelte +25 -0
- package/static/nav-icon.svg +2 -0
- package/static/svelte-select.png +0 -0
- package/svelte-select.png +0 -0
- package/svelte.config.js +10 -0
- package/tailwind.config.cjs +4 -0
- package/test/public/favicon.ico +0 -0
- package/test/public/index.html +15 -0
- package/test/src/ChevronSlotTest.svelte +19 -0
- package/test/src/ClearIconSlotTest.svelte +12 -0
- package/test/src/CustomItem.svelte +78 -0
- package/test/src/GroupHeaderNotSelectable.svelte +17 -0
- package/test/src/HoverItemIndexTest.svelte +21 -0
- package/test/src/InputHiddenSlotTest.svelte +12 -0
- package/test/src/ItemHeightTest.svelte +7 -0
- package/test/src/ItemSlotTest.svelte +11 -0
- package/test/src/ListSlotTest.svelte +14 -0
- package/test/src/LoadOptionsGroup.svelte +21 -0
- package/test/src/MultiItemColor.svelte +7 -0
- package/test/src/OuterListTest.svelte +16 -0
- package/test/src/PrependSlotTest.svelte +12 -0
- package/test/src/Select/ParentContainer.svelte +11 -0
- package/test/src/SelectionSlotMultipleTest.svelte +12 -0
- package/test/src/SelectionSlotTest.svelte +12 -0
- package/test/src/TestClearIcon.svelte +1 -0
- package/test/src/TestIcon.svelte +15 -0
- package/test/src/env.js +1 -0
- package/test/src/test-utils.js +124 -0
- package/test/src/tests.js +3745 -0
- 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,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,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' }} />
|