@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.
Files changed (219) hide show
  1. package/dist/Button.svelte +8 -46
  2. package/dist/Button.svelte.d.ts +9 -65
  3. package/dist/Callout.svelte +47 -72
  4. package/dist/Callout.svelte.d.ts +14 -55
  5. package/dist/Callout.types.d.ts +11 -0
  6. package/dist/Checkbox.svelte +12 -48
  7. package/dist/Checkbox.svelte.d.ts +9 -62
  8. package/dist/Dialog.svelte +30 -38
  9. package/dist/Dialog.svelte.d.ts +13 -36
  10. package/dist/Dropdown.svelte +39 -71
  11. package/dist/Dropdown.svelte.d.ts +17 -76
  12. package/dist/Input.svelte +16 -50
  13. package/dist/Input.svelte.d.ts +12 -74
  14. package/dist/Label.svelte +55 -161
  15. package/dist/Label.svelte.d.ts +16 -81
  16. package/dist/Link.svelte +9 -41
  17. package/dist/Link.svelte.d.ts +11 -64
  18. package/dist/List.svelte +35 -85
  19. package/dist/List.svelte.d.ts +19 -74
  20. package/dist/List.types.d.ts +3 -11
  21. package/dist/ListItem.svelte +27 -56
  22. package/dist/ListItem.svelte.d.ts +12 -66
  23. package/dist/Menu.svelte +18 -45
  24. package/dist/Menu.svelte.d.ts +13 -63
  25. package/dist/MenuBar.svelte +36 -78
  26. package/dist/MenuBar.svelte.d.ts +12 -57
  27. package/dist/MenuButton.svelte +56 -85
  28. package/dist/MenuButton.svelte.d.ts +19 -70
  29. package/dist/MenuItem.svelte +107 -151
  30. package/dist/MenuItem.svelte.d.ts +21 -82
  31. package/dist/MenuItem.types.d.ts +1 -9
  32. package/dist/MenuSeparator.svelte +9 -7
  33. package/dist/MenuSeparator.svelte.d.ts +6 -20
  34. package/dist/Popover.svelte +45 -64
  35. package/dist/Popover.svelte.d.ts +14 -58
  36. package/dist/Progress.constants.d.ts +1 -1
  37. package/dist/Progress.constants.js +1 -1
  38. package/dist/Progress.svelte +24 -71
  39. package/dist/Progress.svelte.d.ts +11 -60
  40. package/dist/Progress.types.d.ts +3 -3
  41. package/dist/Radio.svelte +19 -92
  42. package/dist/Radio.svelte.d.ts +11 -63
  43. package/dist/Select.svelte +55 -94
  44. package/dist/Select.svelte.d.ts +19 -82
  45. package/dist/Slider.svelte +41 -98
  46. package/dist/Slider.svelte.d.ts +18 -65
  47. package/dist/Switch.svelte +29 -78
  48. package/dist/Switch.svelte.d.ts +20 -73
  49. package/dist/Tab.svelte +23 -66
  50. package/dist/Tab.svelte.d.ts +11 -70
  51. package/dist/TabList.svelte +50 -76
  52. package/dist/TabList.svelte.d.ts +17 -69
  53. package/dist/TabList.types.d.ts +3 -11
  54. package/dist/TextArea.svelte +17 -59
  55. package/dist/TextArea.svelte.d.ts +18 -68
  56. package/dist/Tooltip.svelte +23 -66
  57. package/dist/Tooltip.svelte.d.ts +9 -69
  58. package/dist/Tree.svelte +32 -83
  59. package/dist/Tree.svelte.d.ts +14 -66
  60. package/dist/Tree.types.d.ts +3 -11
  61. package/dist/TreeChevron.svelte +10 -49
  62. package/dist/TreeChevron.svelte.d.ts +8 -52
  63. package/dist/TreeItem.svelte +105 -159
  64. package/dist/TreeItem.svelte.d.ts +21 -100
  65. package/dist/TreeItem.types.d.ts +2 -12
  66. package/dist/actions/clickOutside.d.ts +1 -0
  67. package/dist/actions/clickOutside.js +1 -0
  68. package/dist/actions/extraClass.d.ts +8 -0
  69. package/dist/actions/extraClass.js +14 -0
  70. package/dist/index.d.ts +4 -12
  71. package/dist/index.js +3 -9
  72. package/package.json +20 -22
  73. package/dist/Button.constants.d.ts +0 -2
  74. package/dist/Button.constants.js +0 -2
  75. package/dist/Button.types.d.ts +0 -6
  76. package/dist/ColorPicker.constants.d.ts +0 -1
  77. package/dist/ColorPicker.constants.js +0 -1
  78. package/dist/ColorPicker.svelte +0 -287
  79. package/dist/ColorPicker.svelte.d.ts +0 -52
  80. package/dist/ColorPicker.types.d.ts +0 -4
  81. package/dist/ColorPicker.types.js +0 -1
  82. package/dist/HexColorSliders.svelte +0 -103
  83. package/dist/HexColorSliders.svelte.d.ts +0 -51
  84. package/dist/HslColorSliders.svelte +0 -128
  85. package/dist/HslColorSliders.svelte.d.ts +0 -51
  86. package/dist/Label.types.d.ts +0 -6
  87. package/dist/Label.types.js +0 -1
  88. package/dist/MenuItemDisplay.svelte +0 -32
  89. package/dist/MenuItemDisplay.svelte.d.ts +0 -39
  90. package/dist/RgbColorSliders.svelte +0 -93
  91. package/dist/RgbColorSliders.svelte.d.ts +0 -24
  92. package/dist/TreeItemDisplay.svelte +0 -74
  93. package/dist/TreeItemDisplay.svelte.d.ts +0 -73
  94. package/dist/css/Button.base.css +0 -54
  95. package/dist/css/Button.colorful.css +0 -17
  96. package/dist/css/Button.css +0 -8
  97. package/dist/css/Button.disabled.css +0 -22
  98. package/dist/css/Button.secondary.colorful.css +0 -15
  99. package/dist/css/Button.secondary.css +0 -11
  100. package/dist/css/Button.shapes.css +0 -14
  101. package/dist/css/Button.tool.colorful.css +0 -13
  102. package/dist/css/Button.tool.css +0 -18
  103. package/dist/css/Callout.base.css +0 -55
  104. package/dist/css/Callout.colorful.css +0 -5
  105. package/dist/css/Callout.css +0 -2
  106. package/dist/css/Checkbox.base.css +0 -121
  107. package/dist/css/Checkbox.colorful.css +0 -17
  108. package/dist/css/Checkbox.css +0 -3
  109. package/dist/css/Checkbox.disabled.css +0 -28
  110. package/dist/css/ColorPicker.base.css +0 -23
  111. package/dist/css/ColorPicker.css +0 -1
  112. package/dist/css/Dialog.base.css +0 -114
  113. package/dist/css/Dialog.css +0 -1
  114. package/dist/css/Dropdown.base.css +0 -105
  115. package/dist/css/Dropdown.colorful.css +0 -23
  116. package/dist/css/Dropdown.composed.css +0 -11
  117. package/dist/css/Dropdown.css +0 -4
  118. package/dist/css/Dropdown.disabled.css +0 -32
  119. package/dist/css/HexColorSliders.base.css +0 -87
  120. package/dist/css/HexColorSliders.css +0 -1
  121. package/dist/css/HslColorSliders.base.css +0 -105
  122. package/dist/css/HslColorSliders.css +0 -1
  123. package/dist/css/Input.base.css +0 -72
  124. package/dist/css/Input.colorful.css +0 -22
  125. package/dist/css/Input.composed.css +0 -12
  126. package/dist/css/Input.css +0 -4
  127. package/dist/css/Input.disabled.css +0 -24
  128. package/dist/css/Label.base.css +0 -114
  129. package/dist/css/Label.boxed.colorful.css +0 -21
  130. package/dist/css/Label.boxed.css +0 -31
  131. package/dist/css/Label.colorful.css +0 -3
  132. package/dist/css/Label.css +0 -5
  133. package/dist/css/Label.disabled.css +0 -9
  134. package/dist/css/Link.base.css +0 -43
  135. package/dist/css/Link.colorful.css +0 -15
  136. package/dist/css/Link.css +0 -11
  137. package/dist/css/Link.disabled.css +0 -10
  138. package/dist/css/Link.ghost.colorful.css +0 -7
  139. package/dist/css/Link.ghost.css +0 -11
  140. package/dist/css/Link.text-underline.css +0 -8
  141. package/dist/css/Link.text-underline.ghost.css +0 -13
  142. package/dist/css/Link.undecorated.colorful.css +0 -8
  143. package/dist/css/Link.undecorated.css +0 -8
  144. package/dist/css/Link.undecorated.ghost.css +0 -8
  145. package/dist/css/Link.undecorated.underline.css +0 -8
  146. package/dist/css/List.base.css +0 -84
  147. package/dist/css/List.composed.css +0 -8
  148. package/dist/css/List.css +0 -3
  149. package/dist/css/List.disabled.css +0 -7
  150. package/dist/css/ListItem.base.css +0 -33
  151. package/dist/css/ListItem.css +0 -2
  152. package/dist/css/ListItem.disabled.css +0 -28
  153. package/dist/css/Menu.base.css +0 -21
  154. package/dist/css/Menu.css +0 -1
  155. package/dist/css/MenuBar.base.css +0 -9
  156. package/dist/css/MenuBar.css +0 -1
  157. package/dist/css/MenuButton.base.css +0 -13
  158. package/dist/css/MenuButton.css +0 -1
  159. package/dist/css/MenuItem.base.css +0 -48
  160. package/dist/css/MenuItem.css +0 -1
  161. package/dist/css/MenuItemDisplay.base.css +0 -79
  162. package/dist/css/MenuItemDisplay.css +0 -2
  163. package/dist/css/MenuItemDisplay.disabled.css +0 -28
  164. package/dist/css/MenuSeparator.base.css +0 -5
  165. package/dist/css/MenuSeparator.css +0 -1
  166. package/dist/css/Popover.css +0 -21
  167. package/dist/css/Progress.base.css +0 -85
  168. package/dist/css/Progress.css +0 -2
  169. package/dist/css/Progress.disabled.css +0 -17
  170. package/dist/css/Radio.base.css +0 -109
  171. package/dist/css/Radio.colorful.css +0 -18
  172. package/dist/css/Radio.css +0 -3
  173. package/dist/css/Radio.disabled.css +0 -28
  174. package/dist/css/RgbColorSliders.base.css +0 -94
  175. package/dist/css/RgbColorSliders.css +0 -1
  176. package/dist/css/Select.base.css +0 -101
  177. package/dist/css/Select.colorful.css +0 -24
  178. package/dist/css/Select.composed.css +0 -12
  179. package/dist/css/Select.css +0 -4
  180. package/dist/css/Select.disabled.css +0 -28
  181. package/dist/css/Slider.base.css +0 -152
  182. package/dist/css/Slider.colorful.css +0 -11
  183. package/dist/css/Slider.composed.css +0 -8
  184. package/dist/css/Slider.css +0 -4
  185. package/dist/css/Slider.disabled.css +0 -30
  186. package/dist/css/Switch.base.css +0 -175
  187. package/dist/css/Switch.colorful.css +0 -45
  188. package/dist/css/Switch.css +0 -3
  189. package/dist/css/Switch.disabled.css +0 -30
  190. package/dist/css/Tab.base.css +0 -96
  191. package/dist/css/Tab.colorful.css +0 -13
  192. package/dist/css/Tab.css +0 -3
  193. package/dist/css/Tab.disabled.css +0 -36
  194. package/dist/css/TabList.base.css +0 -34
  195. package/dist/css/TabList.css +0 -1
  196. package/dist/css/TextArea.base.css +0 -62
  197. package/dist/css/TextArea.colorful.css +0 -17
  198. package/dist/css/TextArea.composed.css +0 -8
  199. package/dist/css/TextArea.css +0 -4
  200. package/dist/css/TextArea.disabled.css +0 -28
  201. package/dist/css/Tooltip.base.css +0 -6
  202. package/dist/css/Tooltip.css +0 -1
  203. package/dist/css/Tree.base.css +0 -49
  204. package/dist/css/Tree.composed.css +0 -8
  205. package/dist/css/Tree.css +0 -3
  206. package/dist/css/Tree.disabled.css +0 -27
  207. package/dist/css/TreeChevron.base.css +0 -86
  208. package/dist/css/TreeChevron.css +0 -1
  209. package/dist/css/TreeItem.base.css +0 -3
  210. package/dist/css/TreeItem.css +0 -1
  211. package/dist/css/TreeItemDisplay.base.css +0 -48
  212. package/dist/css/TreeItemDisplay.colorful.css +0 -9
  213. package/dist/css/TreeItemDisplay.css +0 -3
  214. package/dist/css/TreeItemDisplay.disabled.css +0 -28
  215. package/dist/css/dark-mode.css +0 -134
  216. package/dist/css/light-mode.css +0 -134
  217. package/dist/css/sterling.css +0 -37
  218. package/dist/package.json +0 -108
  219. /package/dist/{Button.types.js → Callout.types.js} +0 -0
@@ -1,49 +1,32 @@
1
- <script>import { createEventDispatcher, tick } from 'svelte';
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
- let selectRef;
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
- raiseSelect(selectedValue);
38
- }
39
- $: {
19
+ });
20
+ $effect(() => {
21
+ onSelect?.(selectedValue);
22
+ });
23
+ $effect(() => {
40
24
  if (open) {
41
- raisePending(pendingSelectedValue);
25
+ onPending?.(pendingSelectedValue);
42
26
  }
43
- }
44
- $: {
45
- if (open && !prevOpen) {
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
- else if (prevOpen) {
55
- prevOpen = false;
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.selectPreviousItem();
83
+ listRef?.selectPreviousItem();
99
84
  }
100
85
  else {
101
- listRef.selectLastItem();
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.selectNextItem();
96
+ listRef?.selectNextItem();
112
97
  }
113
98
  else {
114
- listRef.selectFirstItem();
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 = (event) => {
155
- pendingSelectedValue = event.detail.value;
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={`sterling-select ${variant}`}
153
+ class={['sterling-select', _class].filter(Boolean).join(' ')}
168
154
  class:disabled
169
155
  role="combobox"
170
156
  tabindex="0"
171
- use:clickOutside
172
- on:blur
173
- on:click
174
- on:copy
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
- <slot name="value" {disabled} {open} {selectedValue} {variant}>
205
- {#if selectedValue}
206
- {selectedValue}
207
- {:else}
208
- <span>&nbsp;</span>
209
- {/if}
210
- </slot>
163
+ {#if valueSnippet}
164
+ {@render valueSnippet(selectedValue)}
165
+ {:else if selectedValue}
166
+ {selectedValue}
167
+ {:else}
168
+ <span>&nbsp;</span>
169
+ {/if}
211
170
  </div>
212
171
  <div class="button">
213
- <slot name="button" {disabled} {open} {selectedValue} {variant}>
214
- <slot name="icon" {disabled} {open} {selectedValue} {variant}>
215
- <div class="chevron" />
216
- </slot>
217
- </slot>
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={`sterling-select-popup-content ${variant}`}>
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
- on:click={onListClick}
226
- on:keydown={onListKeydown}
227
- on:select={onListSelect}
228
- tabIndex={open ? 0 : -1}
229
- variant={`composed ${listVariant}`}
184
+ onclick={onListClick}
185
+ onkeydown={onListKeydown}
186
+ onSelect={onListSelect}
187
+ tabindex={open ? 0 : -1}
188
+ class={`composed ${listClass}`}
230
189
  >
231
- <slot {variant} {listVariant} />
190
+ {#if children}
191
+ {@render children()}
192
+ {/if}
232
193
  </List>
233
194
  </div>
234
195
  </Popover>
@@ -1,83 +1,20 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- disabled?: boolean | undefined;
6
- open?: boolean | undefined;
7
- selectedValue?: string | undefined;
8
- variant?: string | undefined;
9
- listVariant?: string | undefined;
10
- blur?: (() => void) | undefined;
11
- click?: (() => void) | undefined;
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
- export type SelectProps = typeof __propDef.props;
75
- export type SelectEvents = typeof __propDef.events;
76
- export type SelectSlots = typeof __propDef.slots;
77
- export default class Select extends SvelteComponent<SelectProps, SelectEvents, SelectSlots> {
78
- get blur(): () => void;
79
- get click(): () => void;
80
- get focus(): (options?: FocusOptions | undefined) => void;
81
- get scrollToSelectedItem(): () => void;
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;
@@ -1,25 +1,8 @@
1
- <script>import { createEventDispatcher } from 'svelte';
2
- import { round } from 'lodash-es';
3
- // ----- Props ----- //
4
- /** When true, the slider is disabled. */
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
- // -----Events----- //
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
- $: min, max, precision, setValue(value);
64
- // Compute the ratio of the value to the range
65
- $: ratio = (value - min) / (max - min);
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
- raiseChange(value);
76
- }
41
+ $effect(() => {
42
+ onChange?.(value);
43
+ });
77
44
  // ----- Size tracking ----- //
78
- let sliderWidth;
79
- let sliderHeight;
80
- $: sliderSize = vertical ? sliderHeight : sliderWidth;
81
- $: valueOffset = sliderSize * ratio;
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={0}
102
+ aria-valuemin={min}
135
103
  aria-valuenow={value}
136
104
  aria-valuemax={max}
137
- class={`sterling-slider ${variant}`}
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
- on:blur
144
- on:click
145
- on:dblclick
146
- on:dragend
147
- on:dragenter
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 class="fill" style={vertical ? `height: ${valueOffset}px` : `width: ${valueOffset}px`} />
188
- <div class="thumb" style={vertical ? `bottom: ${valueOffset}px` : `left: ${valueOffset}px`} />
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>
@@ -1,66 +1,19 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- disabled?: boolean | undefined;
6
- min?: number | undefined;
7
- max?: number | undefined;
8
- precision?: number | undefined;
9
- step?: number | undefined;
10
- value?: number | undefined;
11
- variant?: string | undefined;
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
- export type SliderProps = typeof __propDef.props;
58
- export type SliderEvents = typeof __propDef.events;
59
- export type SliderSlots = typeof __propDef.slots;
60
- /** Slider lets the user chose a value within a min/max range by dragging a thumb button. */
61
- export default class Slider extends SvelteComponent<SliderProps, SliderEvents, SliderSlots> {
62
- get blur(): () => void;
63
- get click(): () => void;
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;