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,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,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,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
|
package/svelte.config.js
ADDED
|
File without changes
|