@geoffcox/sterling-svelte 1.0.12 → 2.0.1
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/dist/Button.svelte +8 -46
- package/dist/Button.svelte.d.ts +9 -65
- package/dist/Callout.svelte +47 -72
- package/dist/Callout.svelte.d.ts +14 -55
- package/dist/Callout.types.d.ts +11 -0
- package/dist/Checkbox.svelte +12 -48
- package/dist/Checkbox.svelte.d.ts +9 -62
- package/dist/Dialog.svelte +30 -38
- package/dist/Dialog.svelte.d.ts +13 -36
- package/dist/Dropdown.svelte +39 -71
- package/dist/Dropdown.svelte.d.ts +17 -76
- package/dist/Input.svelte +16 -50
- package/dist/Input.svelte.d.ts +12 -74
- package/dist/Label.svelte +55 -161
- package/dist/Label.svelte.d.ts +16 -81
- package/dist/Link.svelte +9 -41
- package/dist/Link.svelte.d.ts +11 -64
- package/dist/List.svelte +35 -85
- package/dist/List.svelte.d.ts +19 -74
- package/dist/List.types.d.ts +3 -11
- package/dist/ListItem.svelte +27 -56
- package/dist/ListItem.svelte.d.ts +12 -66
- package/dist/Menu.svelte +18 -45
- package/dist/Menu.svelte.d.ts +13 -63
- package/dist/MenuBar.svelte +36 -78
- package/dist/MenuBar.svelte.d.ts +12 -57
- package/dist/MenuButton.svelte +56 -85
- package/dist/MenuButton.svelte.d.ts +19 -70
- package/dist/MenuItem.svelte +107 -151
- package/dist/MenuItem.svelte.d.ts +21 -82
- package/dist/MenuItem.types.d.ts +1 -9
- package/dist/MenuSeparator.svelte +9 -7
- package/dist/MenuSeparator.svelte.d.ts +6 -20
- package/dist/Popover.svelte +45 -64
- package/dist/Popover.svelte.d.ts +14 -58
- package/dist/Progress.constants.d.ts +1 -1
- package/dist/Progress.constants.js +1 -1
- package/dist/Progress.svelte +24 -71
- package/dist/Progress.svelte.d.ts +11 -60
- package/dist/Progress.types.d.ts +3 -3
- package/dist/Radio.svelte +19 -92
- package/dist/Radio.svelte.d.ts +11 -63
- package/dist/Select.svelte +55 -94
- package/dist/Select.svelte.d.ts +19 -82
- package/dist/Slider.svelte +41 -98
- package/dist/Slider.svelte.d.ts +18 -65
- package/dist/Switch.svelte +29 -78
- package/dist/Switch.svelte.d.ts +20 -73
- package/dist/Tab.svelte +23 -66
- package/dist/Tab.svelte.d.ts +11 -70
- package/dist/TabList.svelte +50 -76
- package/dist/TabList.svelte.d.ts +17 -69
- package/dist/TabList.types.d.ts +3 -11
- package/dist/TextArea.svelte +17 -59
- package/dist/TextArea.svelte.d.ts +18 -68
- package/dist/Tooltip.svelte +23 -66
- package/dist/Tooltip.svelte.d.ts +9 -69
- package/dist/Tree.svelte +32 -83
- package/dist/Tree.svelte.d.ts +14 -66
- package/dist/Tree.types.d.ts +3 -11
- package/dist/TreeChevron.svelte +10 -49
- package/dist/TreeChevron.svelte.d.ts +8 -52
- package/dist/TreeItem.svelte +105 -159
- package/dist/TreeItem.svelte.d.ts +21 -100
- package/dist/TreeItem.types.d.ts +2 -12
- package/dist/actions/clickOutside.d.ts +1 -0
- package/dist/actions/clickOutside.js +1 -0
- package/dist/actions/extraClass.d.ts +8 -0
- package/dist/actions/extraClass.js +14 -0
- package/dist/index.d.ts +4 -12
- package/dist/index.js +3 -9
- package/package.json +20 -22
- package/dist/Button.constants.d.ts +0 -2
- package/dist/Button.constants.js +0 -2
- package/dist/Button.types.d.ts +0 -6
- package/dist/ColorPicker.constants.d.ts +0 -1
- package/dist/ColorPicker.constants.js +0 -1
- package/dist/ColorPicker.svelte +0 -287
- package/dist/ColorPicker.svelte.d.ts +0 -52
- package/dist/ColorPicker.types.d.ts +0 -4
- package/dist/ColorPicker.types.js +0 -1
- package/dist/HexColorSliders.svelte +0 -103
- package/dist/HexColorSliders.svelte.d.ts +0 -51
- package/dist/HslColorSliders.svelte +0 -128
- package/dist/HslColorSliders.svelte.d.ts +0 -51
- package/dist/Label.types.d.ts +0 -6
- package/dist/Label.types.js +0 -1
- package/dist/MenuItemDisplay.svelte +0 -32
- package/dist/MenuItemDisplay.svelte.d.ts +0 -39
- package/dist/RgbColorSliders.svelte +0 -93
- package/dist/RgbColorSliders.svelte.d.ts +0 -24
- package/dist/TreeItemDisplay.svelte +0 -74
- package/dist/TreeItemDisplay.svelte.d.ts +0 -73
- package/dist/css/Button.base.css +0 -54
- package/dist/css/Button.colorful.css +0 -17
- package/dist/css/Button.css +0 -8
- package/dist/css/Button.disabled.css +0 -22
- package/dist/css/Button.secondary.colorful.css +0 -15
- package/dist/css/Button.secondary.css +0 -11
- package/dist/css/Button.shapes.css +0 -14
- package/dist/css/Button.tool.colorful.css +0 -13
- package/dist/css/Button.tool.css +0 -18
- package/dist/css/Callout.base.css +0 -55
- package/dist/css/Callout.colorful.css +0 -5
- package/dist/css/Callout.css +0 -2
- package/dist/css/Checkbox.base.css +0 -121
- package/dist/css/Checkbox.colorful.css +0 -17
- package/dist/css/Checkbox.css +0 -3
- package/dist/css/Checkbox.disabled.css +0 -28
- package/dist/css/ColorPicker.base.css +0 -23
- package/dist/css/ColorPicker.css +0 -1
- package/dist/css/Dialog.base.css +0 -114
- package/dist/css/Dialog.css +0 -1
- package/dist/css/Dropdown.base.css +0 -105
- package/dist/css/Dropdown.colorful.css +0 -23
- package/dist/css/Dropdown.composed.css +0 -11
- package/dist/css/Dropdown.css +0 -4
- package/dist/css/Dropdown.disabled.css +0 -32
- package/dist/css/HexColorSliders.base.css +0 -87
- package/dist/css/HexColorSliders.css +0 -1
- package/dist/css/HslColorSliders.base.css +0 -105
- package/dist/css/HslColorSliders.css +0 -1
- package/dist/css/Input.base.css +0 -72
- package/dist/css/Input.colorful.css +0 -22
- package/dist/css/Input.composed.css +0 -12
- package/dist/css/Input.css +0 -4
- package/dist/css/Input.disabled.css +0 -24
- package/dist/css/Label.base.css +0 -114
- package/dist/css/Label.boxed.colorful.css +0 -21
- package/dist/css/Label.boxed.css +0 -31
- package/dist/css/Label.colorful.css +0 -3
- package/dist/css/Label.css +0 -5
- package/dist/css/Label.disabled.css +0 -9
- package/dist/css/Link.base.css +0 -43
- package/dist/css/Link.colorful.css +0 -15
- package/dist/css/Link.css +0 -11
- package/dist/css/Link.disabled.css +0 -10
- package/dist/css/Link.ghost.colorful.css +0 -7
- package/dist/css/Link.ghost.css +0 -11
- package/dist/css/Link.text-underline.css +0 -8
- package/dist/css/Link.text-underline.ghost.css +0 -13
- package/dist/css/Link.undecorated.colorful.css +0 -8
- package/dist/css/Link.undecorated.css +0 -8
- package/dist/css/Link.undecorated.ghost.css +0 -8
- package/dist/css/Link.undecorated.underline.css +0 -8
- package/dist/css/List.base.css +0 -84
- package/dist/css/List.composed.css +0 -8
- package/dist/css/List.css +0 -3
- package/dist/css/List.disabled.css +0 -7
- package/dist/css/ListItem.base.css +0 -33
- package/dist/css/ListItem.css +0 -2
- package/dist/css/ListItem.disabled.css +0 -28
- package/dist/css/Menu.base.css +0 -21
- package/dist/css/Menu.css +0 -1
- package/dist/css/MenuBar.base.css +0 -9
- package/dist/css/MenuBar.css +0 -1
- package/dist/css/MenuButton.base.css +0 -13
- package/dist/css/MenuButton.css +0 -1
- package/dist/css/MenuItem.base.css +0 -48
- package/dist/css/MenuItem.css +0 -1
- package/dist/css/MenuItemDisplay.base.css +0 -79
- package/dist/css/MenuItemDisplay.css +0 -2
- package/dist/css/MenuItemDisplay.disabled.css +0 -28
- package/dist/css/MenuSeparator.base.css +0 -5
- package/dist/css/MenuSeparator.css +0 -1
- package/dist/css/Popover.css +0 -21
- package/dist/css/Progress.base.css +0 -85
- package/dist/css/Progress.css +0 -2
- package/dist/css/Progress.disabled.css +0 -17
- package/dist/css/Radio.base.css +0 -109
- package/dist/css/Radio.colorful.css +0 -18
- package/dist/css/Radio.css +0 -3
- package/dist/css/Radio.disabled.css +0 -28
- package/dist/css/RgbColorSliders.base.css +0 -94
- package/dist/css/RgbColorSliders.css +0 -1
- package/dist/css/Select.base.css +0 -101
- package/dist/css/Select.colorful.css +0 -24
- package/dist/css/Select.composed.css +0 -12
- package/dist/css/Select.css +0 -4
- package/dist/css/Select.disabled.css +0 -28
- package/dist/css/Slider.base.css +0 -152
- package/dist/css/Slider.colorful.css +0 -11
- package/dist/css/Slider.composed.css +0 -8
- package/dist/css/Slider.css +0 -4
- package/dist/css/Slider.disabled.css +0 -30
- package/dist/css/Switch.base.css +0 -175
- package/dist/css/Switch.colorful.css +0 -45
- package/dist/css/Switch.css +0 -3
- package/dist/css/Switch.disabled.css +0 -30
- package/dist/css/Tab.base.css +0 -96
- package/dist/css/Tab.colorful.css +0 -13
- package/dist/css/Tab.css +0 -3
- package/dist/css/Tab.disabled.css +0 -36
- package/dist/css/TabList.base.css +0 -34
- package/dist/css/TabList.css +0 -1
- package/dist/css/TextArea.base.css +0 -62
- package/dist/css/TextArea.colorful.css +0 -17
- package/dist/css/TextArea.composed.css +0 -8
- package/dist/css/TextArea.css +0 -4
- package/dist/css/TextArea.disabled.css +0 -28
- package/dist/css/Tooltip.base.css +0 -6
- package/dist/css/Tooltip.css +0 -1
- package/dist/css/Tree.base.css +0 -49
- package/dist/css/Tree.composed.css +0 -8
- package/dist/css/Tree.css +0 -3
- package/dist/css/Tree.disabled.css +0 -27
- package/dist/css/TreeChevron.base.css +0 -86
- package/dist/css/TreeChevron.css +0 -1
- package/dist/css/TreeItem.base.css +0 -3
- package/dist/css/TreeItem.css +0 -1
- package/dist/css/TreeItemDisplay.base.css +0 -48
- package/dist/css/TreeItemDisplay.colorful.css +0 -9
- package/dist/css/TreeItemDisplay.css +0 -3
- package/dist/css/TreeItemDisplay.disabled.css +0 -28
- package/dist/css/dark-mode.css +0 -134
- package/dist/css/light-mode.css +0 -134
- package/dist/css/sterling.css +0 -37
- package/dist/package.json +0 -108
- /package/dist/{Button.types.js → Callout.types.js} +0 -0
package/dist/Select.svelte
CHANGED
|
@@ -1,49 +1,32 @@
|
|
|
1
|
-
<
|
|
1
|
+
<svelte:options runes={true} />
|
|
2
|
+
|
|
3
|
+
<script lang="ts">import { tick } from 'svelte';
|
|
2
4
|
import { clickOutside } from './actions/clickOutside';
|
|
3
5
|
import { idGenerator } from './idGenerator';
|
|
4
6
|
import List from './List.svelte';
|
|
5
7
|
import Popover from './Popover.svelte';
|
|
8
|
+
let { buttonSnippet, children, class: _class, disabled = false, open = $bindable(false), onSelect, onPending, selectedValue = $bindable(), listClass, valueSnippet, ...rest } = $props();
|
|
6
9
|
const popupId = idGenerator.nextId('Select-popup');
|
|
7
|
-
// ----- Props ----- //
|
|
8
|
-
export let disabled = false;
|
|
9
|
-
/** When true, the select's dropdown is open. */
|
|
10
|
-
export let open = false;
|
|
11
|
-
/** The value of the selected item.*/
|
|
12
|
-
export let selectedValue = undefined;
|
|
13
|
-
/** Additional class names to apply. */
|
|
14
|
-
export let variant = '';
|
|
15
|
-
/** Additional class names to apply to the List*/
|
|
16
|
-
export let listVariant = '';
|
|
17
10
|
// ----- State ----- //
|
|
18
|
-
// Tracks the previous open state
|
|
19
|
-
let prevOpen = false;
|
|
20
11
|
// Tracks the pending selected index
|
|
21
|
-
let pendingSelectedValue = selectedValue;
|
|
22
|
-
|
|
12
|
+
let pendingSelectedValue = $state(selectedValue);
|
|
13
|
+
// svelte-ignore non_reactive_update
|
|
14
|
+
let selectRef = $state(undefined);
|
|
23
15
|
let listRef;
|
|
24
|
-
// ----- Events ----- //
|
|
25
|
-
const dispatch = createEventDispatcher();
|
|
26
|
-
const raiseSelect = (value) => {
|
|
27
|
-
dispatch('select', { value });
|
|
28
|
-
};
|
|
29
|
-
const raisePending = (value) => {
|
|
30
|
-
dispatch('pending', { value });
|
|
31
|
-
};
|
|
32
16
|
// ----- Reactions ----- //
|
|
33
|
-
|
|
17
|
+
$effect(() => {
|
|
34
18
|
pendingSelectedValue = selectedValue;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
19
|
+
});
|
|
20
|
+
$effect(() => {
|
|
21
|
+
onSelect?.(selectedValue);
|
|
22
|
+
});
|
|
23
|
+
$effect(() => {
|
|
40
24
|
if (open) {
|
|
41
|
-
|
|
25
|
+
onPending?.(pendingSelectedValue);
|
|
42
26
|
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (open
|
|
46
|
-
prevOpen = true;
|
|
27
|
+
});
|
|
28
|
+
$effect(() => {
|
|
29
|
+
if (open) {
|
|
47
30
|
tick().then(() => {
|
|
48
31
|
setTimeout(() => {
|
|
49
32
|
listRef?.focus();
|
|
@@ -51,11 +34,12 @@ $: {
|
|
|
51
34
|
}, 10);
|
|
52
35
|
});
|
|
53
36
|
}
|
|
54
|
-
|
|
55
|
-
|
|
37
|
+
});
|
|
38
|
+
$effect(() => {
|
|
39
|
+
if (!open) {
|
|
56
40
|
tick().then(() => selectRef?.focus());
|
|
57
41
|
}
|
|
58
|
-
}
|
|
42
|
+
});
|
|
59
43
|
// ----- Methods ----- //
|
|
60
44
|
export const blur = () => {
|
|
61
45
|
selectRef?.blur();
|
|
@@ -78,6 +62,7 @@ const onSelectClick = (event) => {
|
|
|
78
62
|
event.preventDefault();
|
|
79
63
|
event.stopPropagation();
|
|
80
64
|
}
|
|
65
|
+
rest.onclick?.(event);
|
|
81
66
|
};
|
|
82
67
|
const onSelectKeydown = (event) => {
|
|
83
68
|
if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
|
|
@@ -95,10 +80,10 @@ const onSelectKeydown = (event) => {
|
|
|
95
80
|
case 'ArrowUp':
|
|
96
81
|
{
|
|
97
82
|
if (selectedValue) {
|
|
98
|
-
listRef
|
|
83
|
+
listRef?.selectPreviousItem();
|
|
99
84
|
}
|
|
100
85
|
else {
|
|
101
|
-
listRef
|
|
86
|
+
listRef?.selectLastItem();
|
|
102
87
|
}
|
|
103
88
|
event.preventDefault();
|
|
104
89
|
event.stopPropagation();
|
|
@@ -108,10 +93,10 @@ const onSelectKeydown = (event) => {
|
|
|
108
93
|
case 'ArrowDown':
|
|
109
94
|
{
|
|
110
95
|
if (selectedValue) {
|
|
111
|
-
listRef
|
|
96
|
+
listRef?.selectNextItem();
|
|
112
97
|
}
|
|
113
98
|
else {
|
|
114
|
-
listRef
|
|
99
|
+
listRef?.selectFirstItem();
|
|
115
100
|
}
|
|
116
101
|
event.preventDefault();
|
|
117
102
|
event.stopPropagation();
|
|
@@ -120,6 +105,7 @@ const onSelectKeydown = (event) => {
|
|
|
120
105
|
break;
|
|
121
106
|
}
|
|
122
107
|
}
|
|
108
|
+
rest.onkeydown?.(event);
|
|
123
109
|
};
|
|
124
110
|
const onListKeydown = (event) => {
|
|
125
111
|
if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
|
|
@@ -151,8 +137,8 @@ const onListClick = (event) => {
|
|
|
151
137
|
event.stopPropagation();
|
|
152
138
|
return false;
|
|
153
139
|
};
|
|
154
|
-
const onListSelect = (
|
|
155
|
-
pendingSelectedValue =
|
|
140
|
+
const onListSelect = (value) => {
|
|
141
|
+
pendingSelectedValue = value;
|
|
156
142
|
if (!open) {
|
|
157
143
|
selectedValue = pendingSelectedValue;
|
|
158
144
|
}
|
|
@@ -164,71 +150,46 @@ const onListSelect = (event) => {
|
|
|
164
150
|
aria-controls={popupId}
|
|
165
151
|
aria-haspopup="listbox"
|
|
166
152
|
aria-expanded={open}
|
|
167
|
-
class={
|
|
153
|
+
class={['sterling-select', _class].filter(Boolean).join(' ')}
|
|
168
154
|
class:disabled
|
|
169
155
|
role="combobox"
|
|
170
156
|
tabindex="0"
|
|
171
|
-
use:clickOutside
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
on:cut
|
|
176
|
-
on:dblclick
|
|
177
|
-
on:dragend
|
|
178
|
-
on:dragenter
|
|
179
|
-
on:dragleave
|
|
180
|
-
on:dragover
|
|
181
|
-
on:dragstart
|
|
182
|
-
on:drop
|
|
183
|
-
on:focus
|
|
184
|
-
on:focusin
|
|
185
|
-
on:focusout
|
|
186
|
-
on:keydown
|
|
187
|
-
on:keypress
|
|
188
|
-
on:keyup
|
|
189
|
-
on:mousedown
|
|
190
|
-
on:mouseenter
|
|
191
|
-
on:mouseleave
|
|
192
|
-
on:mousemove
|
|
193
|
-
on:mouseover
|
|
194
|
-
on:mouseout
|
|
195
|
-
on:mouseup
|
|
196
|
-
on:wheel|passive
|
|
197
|
-
on:paste
|
|
198
|
-
on:click={onSelectClick}
|
|
199
|
-
on:click_outside={() => (open = false)}
|
|
200
|
-
on:keydown={onSelectKeydown}
|
|
201
|
-
{...$$restProps}
|
|
157
|
+
use:clickOutside={{ onclickoutside: () => (open = false) }}
|
|
158
|
+
{...rest}
|
|
159
|
+
onclick={onSelectClick}
|
|
160
|
+
onkeydown={onSelectKeydown}
|
|
202
161
|
>
|
|
203
162
|
<div class="value">
|
|
204
|
-
|
|
205
|
-
{
|
|
206
|
-
|
|
207
|
-
{
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
163
|
+
{#if valueSnippet}
|
|
164
|
+
{@render valueSnippet(selectedValue)}
|
|
165
|
+
{:else if selectedValue}
|
|
166
|
+
{selectedValue}
|
|
167
|
+
{:else}
|
|
168
|
+
<span> </span>
|
|
169
|
+
{/if}
|
|
211
170
|
</div>
|
|
212
171
|
<div class="button">
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
172
|
+
{#if buttonSnippet}
|
|
173
|
+
{@render buttonSnippet()}
|
|
174
|
+
{:else}
|
|
175
|
+
<div class="chevron"></div>
|
|
176
|
+
{/if}
|
|
218
177
|
</div>
|
|
219
178
|
<Popover reference={selectRef} bind:open id={popupId} conditionalRender={false}>
|
|
220
|
-
<div class={
|
|
179
|
+
<div class={['sterling-select-popup-content', _class].filter(Boolean).join(' ')}>
|
|
221
180
|
<List
|
|
222
181
|
bind:this={listRef}
|
|
223
182
|
{disabled}
|
|
224
183
|
selectedValue={pendingSelectedValue}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
184
|
+
onclick={onListClick}
|
|
185
|
+
onkeydown={onListKeydown}
|
|
186
|
+
onSelect={onListSelect}
|
|
187
|
+
tabindex={open ? 0 : -1}
|
|
188
|
+
class={`composed ${listClass}`}
|
|
230
189
|
>
|
|
231
|
-
|
|
190
|
+
{#if children}
|
|
191
|
+
{@render children()}
|
|
192
|
+
{/if}
|
|
232
193
|
</List>
|
|
233
194
|
</div>
|
|
234
195
|
</Popover>
|
package/dist/Select.svelte.d.ts
CHANGED
|
@@ -1,83 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
focus?: ((options?: FocusOptions) => void) | undefined;
|
|
13
|
-
scrollToSelectedItem?: (() => void) | undefined;
|
|
14
|
-
};
|
|
15
|
-
events: {
|
|
16
|
-
blur: FocusEvent;
|
|
17
|
-
click: MouseEvent;
|
|
18
|
-
copy: ClipboardEvent;
|
|
19
|
-
cut: ClipboardEvent;
|
|
20
|
-
dblclick: MouseEvent;
|
|
21
|
-
dragend: DragEvent;
|
|
22
|
-
dragenter: DragEvent;
|
|
23
|
-
dragleave: DragEvent;
|
|
24
|
-
dragover: DragEvent;
|
|
25
|
-
dragstart: DragEvent;
|
|
26
|
-
drop: DragEvent;
|
|
27
|
-
focus: FocusEvent;
|
|
28
|
-
focusin: FocusEvent;
|
|
29
|
-
focusout: FocusEvent;
|
|
30
|
-
keydown: KeyboardEvent;
|
|
31
|
-
keypress: KeyboardEvent;
|
|
32
|
-
keyup: KeyboardEvent;
|
|
33
|
-
mousedown: MouseEvent;
|
|
34
|
-
mouseenter: MouseEvent;
|
|
35
|
-
mouseleave: MouseEvent;
|
|
36
|
-
mousemove: MouseEvent;
|
|
37
|
-
mouseover: MouseEvent;
|
|
38
|
-
mouseout: MouseEvent;
|
|
39
|
-
mouseup: MouseEvent;
|
|
40
|
-
wheel: WheelEvent;
|
|
41
|
-
paste: ClipboardEvent;
|
|
42
|
-
select: CustomEvent<any>;
|
|
43
|
-
pending: CustomEvent<any>;
|
|
44
|
-
} & {
|
|
45
|
-
[evt: string]: CustomEvent<any>;
|
|
46
|
-
};
|
|
47
|
-
slots: {
|
|
48
|
-
value: {
|
|
49
|
-
disabled: boolean;
|
|
50
|
-
open: boolean;
|
|
51
|
-
selectedValue: string | undefined;
|
|
52
|
-
variant: string;
|
|
53
|
-
};
|
|
54
|
-
button: {
|
|
55
|
-
disabled: boolean;
|
|
56
|
-
open: boolean;
|
|
57
|
-
selectedValue: string | undefined;
|
|
58
|
-
variant: string;
|
|
59
|
-
};
|
|
60
|
-
icon: {
|
|
61
|
-
disabled: boolean;
|
|
62
|
-
open: boolean;
|
|
63
|
-
selectedValue: string | undefined;
|
|
64
|
-
variant: string;
|
|
65
|
-
};
|
|
66
|
-
default: {
|
|
67
|
-
variant: string;
|
|
68
|
-
listVariant: string;
|
|
69
|
-
};
|
|
70
|
-
};
|
|
71
|
-
exports?: undefined;
|
|
72
|
-
bindings?: undefined;
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
type Props = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
+
buttonSnippet?: Snippet;
|
|
5
|
+
disabled?: boolean | null;
|
|
6
|
+
listClass?: string;
|
|
7
|
+
onPending?: (value?: string) => void;
|
|
8
|
+
onSelect?: (value?: string) => void;
|
|
9
|
+
open?: boolean | null;
|
|
10
|
+
selectedValue?: string;
|
|
11
|
+
valueSnippet?: Snippet<[string | undefined]>;
|
|
73
12
|
};
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
export {};
|
|
13
|
+
declare const Select: import("svelte").Component<Props, {
|
|
14
|
+
blur: () => void;
|
|
15
|
+
click: () => void;
|
|
16
|
+
focus: (options?: FocusOptions) => void;
|
|
17
|
+
scrollToSelectedItem: () => void;
|
|
18
|
+
}, "open" | "selectedValue">;
|
|
19
|
+
type Select = ReturnType<typeof Select>;
|
|
20
|
+
export default Select;
|
package/dist/Slider.svelte
CHANGED
|
@@ -1,25 +1,8 @@
|
|
|
1
|
-
<
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export let disabled = false;
|
|
6
|
-
/** The minimum value of the slider. */
|
|
7
|
-
export let min = 0;
|
|
8
|
-
/** The maximum value of the slider. */
|
|
9
|
-
export let max = 100;
|
|
10
|
-
/** The number of decimal places for rounding the value. */
|
|
11
|
-
export let precision = undefined;
|
|
12
|
-
/** The amount the value changes by pressing arrow keys. */
|
|
13
|
-
export let step = 1;
|
|
14
|
-
/** The value of the slider. */
|
|
15
|
-
export let value = 0;
|
|
16
|
-
/** Additional class names to apply. */
|
|
17
|
-
export let variant = '';
|
|
18
|
-
/** When true, the slider is displayed vertically. */
|
|
19
|
-
export let vertical = false;
|
|
20
|
-
// ----- State ----- //
|
|
1
|
+
<svelte:options runes={true} />
|
|
2
|
+
|
|
3
|
+
<script lang="ts">import { round } from 'lodash-es';
|
|
4
|
+
let { class: _class, disabled, min = 0, max = 100, onChange, precision = 0, step = 1, value = $bindable(0), vertical, ...rest } = $props();
|
|
21
5
|
let sliderRef;
|
|
22
|
-
// ----- Methods ----- //
|
|
23
6
|
export const blur = () => {
|
|
24
7
|
sliderRef?.blur();
|
|
25
8
|
};
|
|
@@ -29,40 +12,24 @@ export const click = () => {
|
|
|
29
12
|
export const focus = (options) => {
|
|
30
13
|
sliderRef?.focus();
|
|
31
14
|
};
|
|
32
|
-
|
|
33
|
-
const dispatch = createEventDispatcher();
|
|
34
|
-
//TODO: have change and input events for parity with input type=slider
|
|
35
|
-
// or use input internally within this component.
|
|
36
|
-
const raiseChange = (newValue) => {
|
|
37
|
-
dispatch('change', { value: newValue });
|
|
38
|
-
};
|
|
39
|
-
// ----- Value tracking ----- //
|
|
40
|
-
// const getPrecision = (value?: number): number => {
|
|
41
|
-
// if (value !== undefined && Number !== null && !Number.isNaN(value)) {
|
|
42
|
-
// const text = value.toString();
|
|
43
|
-
// const position = text.indexOf('.');
|
|
44
|
-
// if (position !== -1) {
|
|
45
|
-
// const fraction = text.substring(position + 1);
|
|
46
|
-
// if (fraction) {
|
|
47
|
-
// return fraction.length;
|
|
48
|
-
// }
|
|
49
|
-
// }
|
|
50
|
-
// }
|
|
51
|
-
// return 0;
|
|
52
|
-
// };
|
|
15
|
+
let ratio = $derived((value - min) / (max - min));
|
|
53
16
|
const setValue = (newValue) => {
|
|
54
17
|
const clamped = Math.max(min, Math.min(max, newValue));
|
|
55
18
|
value = precision !== undefined ? round(clamped, precision) : clamped;
|
|
56
19
|
};
|
|
57
20
|
// ensure min <= max
|
|
58
|
-
|
|
21
|
+
$effect(() => {
|
|
59
22
|
if (min > max) {
|
|
60
23
|
min = max;
|
|
61
24
|
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
25
|
+
});
|
|
26
|
+
$effect(() => {
|
|
27
|
+
const clamped = Math.max(min, Math.min(max, value));
|
|
28
|
+
const newValue = precision !== undefined ? round(clamped, precision) : clamped;
|
|
29
|
+
if (value !== newValue) {
|
|
30
|
+
value = newValue;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
66
33
|
const setValueByOffset = (offset) => {
|
|
67
34
|
if (sliderSize > 0) {
|
|
68
35
|
const positionRatio = Math.max(0, Math.min(1, offset / sliderSize));
|
|
@@ -71,14 +38,14 @@ const setValueByOffset = (offset) => {
|
|
|
71
38
|
}
|
|
72
39
|
};
|
|
73
40
|
// Raise change event when value changes
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
41
|
+
$effect(() => {
|
|
42
|
+
onChange?.(value);
|
|
43
|
+
});
|
|
77
44
|
// ----- Size tracking ----- //
|
|
78
|
-
let sliderWidth;
|
|
79
|
-
let sliderHeight;
|
|
80
|
-
|
|
81
|
-
|
|
45
|
+
let sliderWidth = $state(0);
|
|
46
|
+
let sliderHeight = $state(0);
|
|
47
|
+
let sliderSize = $derived(vertical ? sliderHeight : sliderWidth);
|
|
48
|
+
let valueOffset = $derived(sliderSize * ratio);
|
|
82
49
|
// ----- Event handlers ----- //
|
|
83
50
|
const onPointerDown = (event) => {
|
|
84
51
|
if (!disabled) {
|
|
@@ -90,6 +57,7 @@ const onPointerDown = (event) => {
|
|
|
90
57
|
setValueByOffset(event.x - sliderRef.getBoundingClientRect().left);
|
|
91
58
|
}
|
|
92
59
|
}
|
|
60
|
+
rest?.onpointerdown?.(event);
|
|
93
61
|
};
|
|
94
62
|
const onPointerMove = (event) => {
|
|
95
63
|
if (!disabled && event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
@@ -100,11 +68,13 @@ const onPointerMove = (event) => {
|
|
|
100
68
|
setValueByOffset(event.x - sliderRef.getBoundingClientRect().left);
|
|
101
69
|
}
|
|
102
70
|
}
|
|
71
|
+
rest?.onpointermove?.(event);
|
|
103
72
|
};
|
|
104
73
|
const onPointerUp = (event) => {
|
|
105
74
|
if (!disabled) {
|
|
106
75
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
107
76
|
}
|
|
77
|
+
rest?.onpointerup?.(event);
|
|
108
78
|
};
|
|
109
79
|
const onKeyDown = (event) => {
|
|
110
80
|
if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey) {
|
|
@@ -123,59 +93,26 @@ const onKeyDown = (event) => {
|
|
|
123
93
|
return;
|
|
124
94
|
}
|
|
125
95
|
}
|
|
96
|
+
rest?.onkeydown?.(event);
|
|
126
97
|
};
|
|
127
98
|
</script>
|
|
128
99
|
|
|
129
|
-
<!-- @component
|
|
130
|
-
Slider lets the user chose a value within a min/max range by dragging a thumb button.
|
|
131
|
-
-->
|
|
132
100
|
<div
|
|
133
101
|
aria-disabled={disabled}
|
|
134
|
-
aria-valuemin={
|
|
102
|
+
aria-valuemin={min}
|
|
135
103
|
aria-valuenow={value}
|
|
136
104
|
aria-valuemax={max}
|
|
137
|
-
class={`sterling-slider ${
|
|
105
|
+
class={`sterling-slider ${_class}`}
|
|
138
106
|
class:disabled
|
|
139
107
|
class:horizontal={!vertical}
|
|
140
108
|
class:vertical
|
|
141
109
|
role="slider"
|
|
142
110
|
tabindex={!disabled ? 0 : undefined}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
on:dragleave
|
|
149
|
-
on:dragover
|
|
150
|
-
on:dragstart
|
|
151
|
-
on:drop
|
|
152
|
-
on:focus
|
|
153
|
-
on:focusin
|
|
154
|
-
on:focusout
|
|
155
|
-
on:keydown
|
|
156
|
-
on:keydown={onKeyDown}
|
|
157
|
-
on:keypress
|
|
158
|
-
on:keyup
|
|
159
|
-
on:mousedown
|
|
160
|
-
on:mouseenter
|
|
161
|
-
on:mouseleave
|
|
162
|
-
on:mousemove
|
|
163
|
-
on:mouseover
|
|
164
|
-
on:mouseout
|
|
165
|
-
on:mouseup
|
|
166
|
-
on:pointercancel
|
|
167
|
-
on:pointerdown
|
|
168
|
-
on:pointerdown={onPointerDown}
|
|
169
|
-
on:pointerenter
|
|
170
|
-
on:pointerleave
|
|
171
|
-
on:pointermove
|
|
172
|
-
on:pointermove={onPointerMove}
|
|
173
|
-
on:pointerover
|
|
174
|
-
on:pointerout
|
|
175
|
-
on:pointerup
|
|
176
|
-
on:pointerup={onPointerUp}
|
|
177
|
-
on:wheel|passive
|
|
178
|
-
{...$$restProps}
|
|
111
|
+
{...rest}
|
|
112
|
+
onkeydown={onKeyDown}
|
|
113
|
+
onpointerdown={onPointerDown}
|
|
114
|
+
onpointermove={onPointerMove}
|
|
115
|
+
onpointerup={onPointerUp}
|
|
179
116
|
>
|
|
180
117
|
<div
|
|
181
118
|
class="container"
|
|
@@ -183,8 +120,14 @@ Slider lets the user chose a value within a min/max range by dragging a thumb bu
|
|
|
183
120
|
bind:clientWidth={sliderWidth}
|
|
184
121
|
bind:clientHeight={sliderHeight}
|
|
185
122
|
>
|
|
186
|
-
<div class="track"
|
|
187
|
-
<div
|
|
188
|
-
|
|
123
|
+
<div class="track"></div>
|
|
124
|
+
<div
|
|
125
|
+
class="fill"
|
|
126
|
+
style={vertical ? `height: ${valueOffset}px` : `width: ${valueOffset}px`}
|
|
127
|
+
></div>
|
|
128
|
+
<div
|
|
129
|
+
class="thumb"
|
|
130
|
+
style={vertical ? `bottom: ${valueOffset}px` : `left: ${valueOffset}px`}
|
|
131
|
+
></div>
|
|
189
132
|
</div>
|
|
190
133
|
</div>
|
package/dist/Slider.svelte.d.ts
CHANGED
|
@@ -1,66 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
vertical?: boolean | undefined;
|
|
13
|
-
blur?: (() => void) | undefined;
|
|
14
|
-
click?: (() => void) | undefined;
|
|
15
|
-
focus?: ((options?: FocusOptions) => void) | undefined;
|
|
16
|
-
};
|
|
17
|
-
events: {
|
|
18
|
-
blur: FocusEvent;
|
|
19
|
-
click: MouseEvent;
|
|
20
|
-
dblclick: MouseEvent;
|
|
21
|
-
dragend: DragEvent;
|
|
22
|
-
dragenter: DragEvent;
|
|
23
|
-
dragleave: DragEvent;
|
|
24
|
-
dragover: DragEvent;
|
|
25
|
-
dragstart: DragEvent;
|
|
26
|
-
drop: DragEvent;
|
|
27
|
-
focus: FocusEvent;
|
|
28
|
-
focusin: FocusEvent;
|
|
29
|
-
focusout: FocusEvent;
|
|
30
|
-
keydown: KeyboardEvent;
|
|
31
|
-
keypress: KeyboardEvent;
|
|
32
|
-
keyup: KeyboardEvent;
|
|
33
|
-
mousedown: MouseEvent;
|
|
34
|
-
mouseenter: MouseEvent;
|
|
35
|
-
mouseleave: MouseEvent;
|
|
36
|
-
mousemove: MouseEvent;
|
|
37
|
-
mouseover: MouseEvent;
|
|
38
|
-
mouseout: MouseEvent;
|
|
39
|
-
mouseup: MouseEvent;
|
|
40
|
-
pointercancel: PointerEvent;
|
|
41
|
-
pointerdown: PointerEvent;
|
|
42
|
-
pointerenter: PointerEvent;
|
|
43
|
-
pointerleave: PointerEvent;
|
|
44
|
-
pointermove: PointerEvent;
|
|
45
|
-
pointerover: PointerEvent;
|
|
46
|
-
pointerout: PointerEvent;
|
|
47
|
-
pointerup: PointerEvent;
|
|
48
|
-
wheel: WheelEvent;
|
|
49
|
-
change: CustomEvent<any>;
|
|
50
|
-
} & {
|
|
51
|
-
[evt: string]: CustomEvent<any>;
|
|
52
|
-
};
|
|
53
|
-
slots: {};
|
|
54
|
-
exports?: undefined;
|
|
55
|
-
bindings?: undefined;
|
|
1
|
+
/// <reference types="svelte" />
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
type Props = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
+
disabled?: boolean | null;
|
|
5
|
+
min?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
precision?: number;
|
|
8
|
+
step?: number;
|
|
9
|
+
value?: number;
|
|
10
|
+
vertical?: boolean | null;
|
|
11
|
+
onChange?: (value: number) => void;
|
|
56
12
|
};
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
get focus(): (options?: FocusOptions | undefined) => void;
|
|
65
|
-
}
|
|
66
|
-
export {};
|
|
13
|
+
declare const Slider: import("svelte").Component<Props, {
|
|
14
|
+
blur: () => void;
|
|
15
|
+
click: () => void;
|
|
16
|
+
focus: (options?: FocusOptions) => void;
|
|
17
|
+
}, "value">;
|
|
18
|
+
type Slider = ReturnType<typeof Slider>;
|
|
19
|
+
export default Slider;
|