@geoffcox/sterling-svelte 2.0.1 → 2.0.3

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 (71) hide show
  1. package/README.md +1 -1
  2. package/dist/Button.svelte +18 -14
  3. package/dist/Button.svelte.d.ts +0 -1
  4. package/dist/Callout.svelte +162 -96
  5. package/dist/Callout.svelte.d.ts +1 -2
  6. package/dist/Checkbox.svelte +34 -15
  7. package/dist/Checkbox.svelte.d.ts +0 -1
  8. package/dist/Dialog.svelte +121 -71
  9. package/dist/Dialog.svelte.d.ts +1 -1
  10. package/dist/Dropdown.svelte +106 -56
  11. package/dist/Dropdown.svelte.d.ts +8 -3
  12. package/dist/Input.svelte +54 -29
  13. package/dist/Input.svelte.d.ts +1 -2
  14. package/dist/Label.svelte +99 -55
  15. package/dist/Label.svelte.d.ts +4 -4
  16. package/dist/Link.svelte +20 -14
  17. package/dist/Link.svelte.d.ts +0 -1
  18. package/dist/List.svelte +181 -126
  19. package/dist/List.svelte.d.ts +0 -1
  20. package/dist/ListItem.svelte +36 -21
  21. package/dist/ListItem.svelte.d.ts +0 -1
  22. package/dist/Menu.svelte +67 -45
  23. package/dist/Menu.svelte.d.ts +0 -1
  24. package/dist/MenuBar.svelte +96 -65
  25. package/dist/MenuBar.svelte.d.ts +0 -1
  26. package/dist/MenuButton.svelte +102 -62
  27. package/dist/MenuButton.svelte.d.ts +1 -1
  28. package/dist/MenuItem.svelte +332 -243
  29. package/dist/MenuItem.svelte.d.ts +3 -3
  30. package/dist/MenuSeparator.svelte +7 -7
  31. package/dist/MenuSeparator.svelte.d.ts +0 -1
  32. package/dist/Pagination.svelte +267 -0
  33. package/dist/Pagination.svelte.d.ts +4 -0
  34. package/dist/Pagination.types.d.ts +24 -0
  35. package/dist/Pagination.types.js +1 -0
  36. package/dist/Popover.svelte +114 -60
  37. package/dist/Popover.svelte.d.ts +1 -2
  38. package/dist/Portal.types.d.ts +1 -4
  39. package/dist/Progress.svelte +40 -15
  40. package/dist/Progress.svelte.d.ts +0 -1
  41. package/dist/Radio.svelte +37 -25
  42. package/dist/Radio.svelte.d.ts +0 -1
  43. package/dist/Select.svelte +191 -125
  44. package/dist/Select.svelte.d.ts +8 -2
  45. package/dist/Slider.svelte +120 -71
  46. package/dist/Slider.svelte.d.ts +0 -1
  47. package/dist/Switch.svelte +51 -20
  48. package/dist/Switch.svelte.d.ts +1 -1
  49. package/dist/Tab.svelte +39 -24
  50. package/dist/Tab.svelte.d.ts +0 -1
  51. package/dist/TabList.svelte +176 -125
  52. package/dist/TabList.svelte.d.ts +0 -1
  53. package/dist/TextArea.svelte +83 -41
  54. package/dist/TextArea.svelte.d.ts +2 -3
  55. package/dist/Tooltip.svelte +68 -36
  56. package/dist/Tree.svelte +52 -24
  57. package/dist/Tree.svelte.d.ts +0 -1
  58. package/dist/TreeChevron.svelte +24 -12
  59. package/dist/TreeChevron.svelte.d.ts +0 -1
  60. package/dist/TreeItem.svelte +292 -225
  61. package/dist/TreeItem.svelte.d.ts +1 -1
  62. package/dist/actions/extraClass.d.ts +1 -0
  63. package/dist/actions/extraClass.js +1 -0
  64. package/dist/idGenerator.d.ts +1 -0
  65. package/dist/idGenerator.js +1 -0
  66. package/dist/index.d.ts +3 -2
  67. package/dist/index.js +3 -2
  68. package/dist/mediaQueries/prefersColorSchemeDark.d.ts +0 -1
  69. package/dist/mediaQueries/prefersReducedMotion.d.ts +0 -1
  70. package/dist/mediaQueries/usingKeyboard.d.ts +0 -1
  71. package/package.json +21 -22
package/dist/Label.svelte CHANGED
@@ -1,61 +1,93 @@
1
1
  <svelte:options runes={true} />
2
2
 
3
- <script lang="ts">import {} from 'svelte';
4
- import Tooltip from './Tooltip.svelte';
5
- import { usingKeyboard } from './mediaQueries/usingKeyboard';
6
- let { children, class: _class, for: _for, forwardClick = false, message, required, requiredIndicator = '*', requiredReason, text, ...rest } = $props();
7
- // ----- State ----- //
8
- let labelRef = $state(null);
9
- let targetRef = $state(null);
10
- let requiredRef = $state(null);
11
- const findTarget = () => {
12
- let candidate = null;
3
+ <script lang="ts">
4
+ import { type Snippet } from 'svelte';
5
+ import type { HTMLLabelAttributes, MouseEventHandler } from 'svelte/elements';
6
+ import Tooltip from './Tooltip.svelte';
7
+ import { usingKeyboard } from './mediaQueries/usingKeyboard';
8
+
9
+ type Props = HTMLLabelAttributes & {
10
+ forwardClick?: boolean | null;
11
+ message?: Snippet | string;
12
+ required?: boolean | null;
13
+ requiredIndicator?: Snippet | string;
14
+ requiredReason?: Snippet | string;
15
+ text?: Snippet | string;
16
+ };
17
+
18
+ let {
19
+ children,
20
+ class: _class,
21
+ for: _for,
22
+ forwardClick = false,
23
+ message,
24
+ required,
25
+ requiredIndicator = '*',
26
+ requiredReason,
27
+ text,
28
+ ...rest
29
+ }: Props = $props();
30
+
31
+ // ----- State ----- //
32
+
33
+ let labelRef: HTMLLabelElement | null = $state(null);
34
+ let targetRef: HTMLElement | null = $state(null);
35
+
36
+ const findTarget = () => {
37
+ let candidate: HTMLElement | null = null;
13
38
  if (_for) {
14
- candidate = labelRef?.querySelector(`[id="${_for}"]`) || null;
39
+ candidate = labelRef?.querySelector<HTMLElement>(`[id="${_for}"]`) || null;
15
40
  }
16
41
  if (!candidate) {
17
- candidate =
18
- labelRef?.querySelector('a[href], ' +
19
- 'audio[controls], ' +
20
- 'button, ' +
21
- 'details, ' +
22
- 'div[contenteditable], ' +
23
- 'form, ' +
24
- 'input, ' +
25
- 'select, ' +
26
- 'textarea, ' +
27
- 'video[controls], ' +
28
- '[tabindex]:not([tabindex="-1"])') || null;
42
+ candidate =
43
+ labelRef?.querySelector<HTMLElement>(
44
+ 'a[href], ' +
45
+ 'audio[controls], ' +
46
+ 'button, ' +
47
+ 'details, ' +
48
+ 'div[contenteditable], ' +
49
+ 'form, ' +
50
+ 'input, ' +
51
+ 'select, ' +
52
+ 'textarea, ' +
53
+ 'video[controls], ' +
54
+ '[tabindex]:not([tabindex="-1"])'
55
+ ) || null;
29
56
  }
57
+
30
58
  targetRef = candidate;
31
- };
32
- // ----- Methods ----- //
33
- export const click = () => {
59
+ };
60
+
61
+ // ----- Methods ----- //
62
+
63
+ export const click = () => {
34
64
  labelRef?.click();
35
- };
36
- export const blur = () => {
65
+ };
66
+
67
+ export const blur = () => {
37
68
  labelRef?.blur();
38
- };
39
- export const focus = (options) => {
69
+ };
70
+
71
+ export const focus = (options?: FocusOptions) => {
40
72
  labelRef?.focus(options);
41
- };
42
- // ----- Event Handlers ----- //
43
- const onClick = (event) => {
73
+ };
74
+
75
+ // ----- Event Handlers ----- //
76
+
77
+ const onClick: MouseEventHandler<HTMLLabelElement> = (event) => {
44
78
  if (forwardClick) {
45
- targetRef?.click();
79
+ targetRef?.click();
46
80
  }
47
81
  rest.onclick?.(event);
48
- };
82
+ };
49
83
  </script>
50
84
 
51
- {#snippet snippetOrText(item?: string | Snippet, _class?: string)}
85
+ {#snippet stringOrSnippet(item?: string | Snippet)}
52
86
  {#if item}
53
87
  {#if typeof item === 'string'}
54
- <div class={_class}>{item}</div>
88
+ {item}
55
89
  {:else}
56
- <div class={_class}>
57
- {@render item()}
58
- </div>
90
+ {@render item()}
59
91
  {/if}
60
92
  {/if}
61
93
  {/snippet}
@@ -63,29 +95,41 @@ const onClick = (event) => {
63
95
  <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
64
96
  <label
65
97
  bind:this={labelRef}
66
- class={['sterling-label', _class].filter(Boolean).join(' ')}
98
+ class={['sterling-label', _class]}
67
99
  class:using-keyboard={$usingKeyboard}
68
100
  for={_for}
69
101
  {...rest}
70
102
  onclick={onClick}
71
103
  >
72
- {@render snippetOrText(text, 'text')}
104
+ {#if text}
105
+ <div class="text">
106
+ {@render stringOrSnippet(text)}
107
+ </div>
108
+ {/if}
73
109
  {#if children}
74
110
  <div class="content">
75
111
  {@render children()}
76
112
  </div>
77
113
  {/if}
78
- {@render snippetOrText(message, 'message')}
79
- <div class="required" bind:this={requiredRef}>
80
- {#if required && requiredReason}
81
- <Tooltip>
82
- {@render snippetOrText(requiredIndicator, 'required')}
83
- {#snippet tip()}
84
- {@render snippetOrText(requiredReason, 'required-reason')}
85
- {/snippet}
86
- </Tooltip>
87
- {:else if required}
88
- {@render snippetOrText(requiredIndicator, 'required')}
89
- {/if}
90
- </div>
114
+ {#if message}
115
+ <div class="message">
116
+ {@render stringOrSnippet(message)}
117
+ </div>
118
+ {/if}
119
+ {#if required && requiredIndicator && requiredReason}
120
+ <Tooltip>
121
+ <div class="required">
122
+ {@render stringOrSnippet(requiredIndicator)}
123
+ </div>
124
+ {#snippet tip()}
125
+ <div class="required-reason">
126
+ {@render stringOrSnippet(requiredReason)}
127
+ </div>
128
+ {/snippet}
129
+ </Tooltip>
130
+ {:else if required && requiredIndicator}
131
+ <div class="required">
132
+ {@render stringOrSnippet(requiredIndicator)}
133
+ </div>
134
+ {/if}
91
135
  </label>
@@ -2,11 +2,11 @@ import { type Snippet } from 'svelte';
2
2
  import type { HTMLLabelAttributes } from 'svelte/elements';
3
3
  type Props = HTMLLabelAttributes & {
4
4
  forwardClick?: boolean | null;
5
- message?: string | Snippet;
5
+ message?: Snippet | string;
6
6
  required?: boolean | null;
7
- requiredIndicator?: string | Snippet;
8
- requiredReason?: string | Snippet;
9
- text?: string | Snippet;
7
+ requiredIndicator?: Snippet | string;
8
+ requiredReason?: Snippet | string;
9
+ text?: Snippet | string;
10
10
  };
11
11
  declare const Label: import("svelte").Component<Props, {
12
12
  click: () => void;
package/dist/Link.svelte CHANGED
@@ -1,24 +1,30 @@
1
1
  <svelte:options runes={true} />
2
2
 
3
- <script lang="ts">let { children, class: _class, disabled, ...rest } = $props();
4
- let linkRef;
5
- export const blur = () => {
3
+ <script lang="ts">
4
+ import type { HTMLAnchorAttributes } from 'svelte/elements';
5
+
6
+ type Props = HTMLAnchorAttributes & {
7
+ disabled?: boolean | null;
8
+ };
9
+
10
+ let { children, class: _class, disabled, ...rest }: Props = $props();
11
+
12
+ let linkRef: HTMLAnchorElement;
13
+
14
+ export const blur = () => {
6
15
  linkRef?.blur();
7
- };
8
- export const click = () => {
16
+ };
17
+
18
+ export const click = () => {
9
19
  linkRef?.click();
10
- };
11
- export const focus = (options) => {
20
+ };
21
+
22
+ export const focus = (options?: FocusOptions) => {
12
23
  linkRef?.focus();
13
- };
24
+ };
14
25
  </script>
15
26
 
16
- <a
17
- bind:this={linkRef}
18
- class={['sterling-link', _class].filter(Boolean).join(' ')}
19
- class:disabled
20
- {...rest}
21
- >
27
+ <a bind:this={linkRef} class={['sterling-link', _class]} class:disabled {...rest}>
22
28
  {#if children}
23
29
  {@render children()}
24
30
  {/if}
@@ -1,4 +1,3 @@
1
- /// <reference types="svelte" />
2
1
  import type { HTMLAnchorAttributes } from 'svelte/elements';
3
2
  type Props = HTMLAnchorAttributes & {
4
3
  disabled?: boolean | null;
package/dist/List.svelte CHANGED
@@ -1,180 +1,235 @@
1
1
  <svelte:options runes={true} />
2
2
 
3
- <script lang="ts">import { setContext } from 'svelte';
4
- import { LIST_CONTEXT_KEY } from './List.constants';
5
- import { usingKeyboard } from './mediaQueries/usingKeyboard';
6
- let { children, class: _class, disabled = false, horizontal = false, selectedValue = $bindable(), onSelect, ...rest } = $props();
7
- let listRef;
8
- let lastSelectedItemRef;
9
- let listContext = $state({
3
+ <script lang="ts">
4
+ import { setContext } from 'svelte';
5
+ import type { HTMLAttributes, KeyboardEventHandler, MouseEventHandler } from 'svelte/elements';
6
+ import { LIST_CONTEXT_KEY } from './List.constants';
7
+ import type { ListContext } from './List.types';
8
+ import { usingKeyboard } from './mediaQueries/usingKeyboard';
9
+
10
+ type Props = HTMLAttributes<HTMLDivElement> & {
11
+ disabled?: boolean | null;
12
+ horizontal?: boolean | null;
13
+ selectedValue?: string;
14
+ onSelect?: (value?: string) => void;
15
+ };
16
+
17
+ let {
18
+ children,
19
+ class: _class,
20
+ disabled = false,
21
+ horizontal = false,
22
+ selectedValue = $bindable(),
23
+ onSelect,
24
+ ...rest
25
+ }: Props = $props();
26
+
27
+ let listRef: HTMLDivElement;
28
+ let lastSelectedItemRef: HTMLElement;
29
+
30
+ let listContext = $state({
10
31
  disabled,
11
32
  selectedValue,
12
33
  horizontal
13
- });
14
- $effect(() => {
34
+ });
35
+
36
+ $effect(() => {
15
37
  listContext.disabled = disabled;
16
- });
17
- $effect(() => {
38
+ });
39
+
40
+ $effect(() => {
18
41
  listContext.horizontal = horizontal;
19
- });
20
- $effect(() => {
42
+ });
43
+
44
+ $effect(() => {
21
45
  listContext.selectedValue = selectedValue;
22
- });
23
- setContext(LIST_CONTEXT_KEY, listContext);
24
- export const blur = () => {
46
+ });
47
+
48
+ setContext<ListContext>(LIST_CONTEXT_KEY, listContext);
49
+
50
+ export const blur = () => {
25
51
  listRef?.blur();
26
- };
27
- export const click = () => {
52
+ };
53
+
54
+ export const click = () => {
28
55
  listRef?.click();
29
- };
30
- export const focus = (options) => {
56
+ };
57
+
58
+ export const focus = (options?: FocusOptions) => {
31
59
  listRef?.focus();
32
- };
33
- export const scrollToSelectedItem = () => {
60
+ };
61
+
62
+ export const scrollToSelectedItem = () => {
34
63
  const element = getSelectedItemElement();
35
64
  element?.scrollIntoView({ block: 'nearest', inline: 'nearest' });
36
- };
37
- $effect(() => {
65
+ };
66
+
67
+ $effect(() => {
38
68
  onSelect?.(selectedValue);
39
- });
40
- const isElementListItem = (candidate) => {
41
- return (candidate &&
42
- candidate.getAttribute('data-value') !== null &&
43
- candidate.getAttribute('data-value') !== undefined &&
44
- candidate.getAttribute('role') === 'listitem');
45
- };
46
- const getSelectedItemElement = () => {
47
- if (isElementListItem(lastSelectedItemRef) &&
48
- lastSelectedItemRef?.getAttribute('data-value') === selectedValue &&
49
- lastSelectedItemRef?.closest('[role="list"]') === listRef) {
50
- return lastSelectedItemRef;
51
- }
52
- else {
53
- return listRef?.querySelector('[data-value][aria-selected=true]');
69
+ });
70
+
71
+ const isElementListItem = (candidate: Element) => {
72
+ return (
73
+ candidate &&
74
+ candidate.getAttribute('data-value') !== null &&
75
+ candidate.getAttribute('data-value') !== undefined &&
76
+ candidate.getAttribute('role') === 'listitem'
77
+ );
78
+ };
79
+
80
+ const getSelectedItemElement = () => {
81
+ if (
82
+ isElementListItem(lastSelectedItemRef) &&
83
+ lastSelectedItemRef?.getAttribute('data-value') === selectedValue &&
84
+ lastSelectedItemRef?.closest('[role="list"]') === listRef
85
+ ) {
86
+ return lastSelectedItemRef;
87
+ } else {
88
+ return listRef?.querySelector('[data-value][aria-selected=true]');
54
89
  }
55
- };
56
- const selectItem = (value, element) => {
90
+ };
91
+
92
+ const selectItem = (value: string, element: HTMLElement) => {
57
93
  selectedValue = value;
58
94
  lastSelectedItemRef = element;
59
95
  element.scrollIntoView({ block: 'nearest', inline: 'nearest' });
60
- };
61
- export const selectFirstItem = () => {
62
- let candidate = listRef?.querySelector('[data-value][role=listitem]');
96
+ };
97
+
98
+ export const selectFirstItem = () => {
99
+ let candidate: Element | undefined | null = listRef?.querySelector(
100
+ '[data-value][role=listitem]'
101
+ );
63
102
  while (candidate && !isElementListItem(candidate)) {
64
- candidate = candidate.nextElementSibling;
103
+ candidate = candidate.nextElementSibling;
65
104
  }
66
105
  let candidateValue = candidate?.getAttribute('data-value');
106
+
67
107
  if (candidateValue && candidate) {
68
- selectItem(candidateValue, candidate);
69
- return true;
108
+ selectItem(candidateValue, candidate as HTMLElement);
109
+ return true;
70
110
  }
111
+
71
112
  return false;
72
- };
73
- export const selectPreviousItem = () => {
113
+ };
114
+
115
+ export const selectPreviousItem = () => {
74
116
  let selectedItem = getSelectedItemElement();
75
117
  let candidate = selectedItem?.previousElementSibling;
76
118
  while (candidate && !isElementListItem(candidate)) {
77
- candidate = candidate.previousElementSibling;
119
+ candidate = candidate.previousElementSibling;
78
120
  }
79
121
  let candidateValue = candidate?.getAttribute('data-value');
122
+
80
123
  if (candidateValue && candidate) {
81
- selectItem(candidateValue, candidate);
82
- return true;
124
+ selectItem(candidateValue, candidate as HTMLElement);
125
+ return true;
83
126
  }
127
+
84
128
  return false;
85
- };
86
- export const selectNextItem = () => {
129
+ };
130
+
131
+ export const selectNextItem = () => {
87
132
  let selectedItem = getSelectedItemElement();
88
133
  let candidate = selectedItem?.nextElementSibling;
89
134
  while (candidate && !isElementListItem(candidate)) {
90
- candidate = candidate.nextElementSibling;
135
+ candidate = candidate.nextElementSibling;
91
136
  }
92
137
  let candidateValue = candidate?.getAttribute('data-value');
138
+
93
139
  if (candidateValue && candidate) {
94
- selectItem(candidateValue, candidate);
95
- return true;
140
+ selectItem(candidateValue, candidate as HTMLElement);
141
+ return true;
96
142
  }
143
+
97
144
  return false;
98
- };
99
- export const selectLastItem = () => {
100
- let candidate = listRef?.querySelector('[data-value][role=listitem]:last-of-type');
145
+ };
146
+
147
+ export const selectLastItem = () => {
148
+ let candidate: Element | undefined | null = listRef?.querySelector(
149
+ '[data-value][role=listitem]:last-of-type'
150
+ );
101
151
  while (candidate && !isElementListItem(candidate)) {
102
- candidate = candidate.previousElementSibling;
152
+ candidate = candidate.previousElementSibling;
103
153
  }
104
154
  let candidateValue = candidate?.getAttribute('data-value');
155
+
105
156
  if (candidateValue && candidate) {
106
- selectItem(candidateValue, candidate);
107
- return true;
157
+ selectItem(candidateValue, candidate as HTMLElement);
158
+ return true;
108
159
  }
160
+
109
161
  return false;
110
- };
111
- const onClick = (event) => {
162
+ };
163
+
164
+ const onClick: MouseEventHandler<HTMLDivElement> = (event) => {
112
165
  if (!disabled) {
113
- let candidate = event.target;
114
- let candidateValue = candidate?.getAttribute('data-value');
115
- if (candidateValue === undefined || candidateValue === null) {
116
- candidate = candidate?.closest('[data-value]');
117
- candidateValue = candidate?.getAttribute('data-value');
118
- }
119
- if (candidateValue && candidate) {
120
- selectItem(candidateValue, candidate);
121
- }
166
+ let candidate: HTMLElement | null | undefined = event.target as HTMLElement;
167
+ let candidateValue: string | null | undefined = candidate?.getAttribute('data-value');
168
+
169
+ if (candidateValue === undefined || candidateValue === null) {
170
+ candidate = candidate?.closest<HTMLElement>('[data-value]');
171
+ candidateValue = candidate?.getAttribute('data-value');
172
+ }
173
+ if (candidateValue && candidate) {
174
+ selectItem(candidateValue, candidate);
175
+ }
122
176
  }
123
177
  rest.onclick?.(event);
124
- };
125
- const onKeydown = (event) => {
178
+ };
179
+
180
+ const onKeydown: KeyboardEventHandler<HTMLDivElement> = (event) => {
126
181
  if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
127
- switch (event.key) {
128
- case 'Home':
129
- selectFirstItem();
130
- event.preventDefault();
131
- event.stopPropagation();
132
- return false;
133
- case 'End':
134
- selectLastItem();
135
- event.preventDefault();
136
- event.stopPropagation();
137
- return false;
138
- case 'ArrowLeft':
139
- if (horizontal) {
140
- selectedValue !== undefined && selectedValue.length > 0
141
- ? selectPreviousItem()
142
- : selectLastItem();
143
- }
144
- event.preventDefault();
145
- event.stopPropagation();
146
- return false;
147
- case 'ArrowRight':
148
- if (horizontal) {
149
- selectedValue !== undefined && selectedValue.length > 0
150
- ? selectNextItem()
151
- : selectFirstItem();
152
- }
153
- event.preventDefault();
154
- event.stopPropagation();
155
- return false;
156
- case 'ArrowUp':
157
- if (!horizontal) {
158
- selectedValue !== undefined && selectedValue.length > 0
159
- ? selectPreviousItem()
160
- : selectLastItem();
161
- }
162
- event.preventDefault();
163
- event.stopPropagation();
164
- return false;
165
- case 'ArrowDown':
166
- if (!horizontal) {
167
- selectedValue !== undefined && selectedValue.length > 0
168
- ? selectNextItem()
169
- : selectFirstItem();
170
- }
171
- event.preventDefault();
172
- event.stopPropagation();
173
- return false;
174
- }
182
+ switch (event.key) {
183
+ case 'Home':
184
+ selectFirstItem();
185
+ event.preventDefault();
186
+ event.stopPropagation();
187
+ return false;
188
+ case 'End':
189
+ selectLastItem();
190
+ event.preventDefault();
191
+ event.stopPropagation();
192
+ return false;
193
+ case 'ArrowLeft':
194
+ if (horizontal) {
195
+ selectedValue !== undefined && selectedValue.length > 0
196
+ ? selectPreviousItem()
197
+ : selectLastItem();
198
+ }
199
+ event.preventDefault();
200
+ event.stopPropagation();
201
+ return false;
202
+ case 'ArrowRight':
203
+ if (horizontal) {
204
+ selectedValue !== undefined && selectedValue.length > 0
205
+ ? selectNextItem()
206
+ : selectFirstItem();
207
+ }
208
+ event.preventDefault();
209
+ event.stopPropagation();
210
+ return false;
211
+ case 'ArrowUp':
212
+ if (!horizontal) {
213
+ selectedValue !== undefined && selectedValue.length > 0
214
+ ? selectPreviousItem()
215
+ : selectLastItem();
216
+ }
217
+ event.preventDefault();
218
+ event.stopPropagation();
219
+ return false;
220
+ case 'ArrowDown':
221
+ if (!horizontal) {
222
+ selectedValue !== undefined && selectedValue.length > 0
223
+ ? selectNextItem()
224
+ : selectFirstItem();
225
+ }
226
+ event.preventDefault();
227
+ event.stopPropagation();
228
+ return false;
229
+ }
175
230
  }
176
231
  rest.onkeydown?.(event);
177
- };
232
+ };
178
233
  </script>
179
234
 
180
235
  <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
@@ -185,7 +240,7 @@ const onKeydown = (event) => {
185
240
  aria-disabled={disabled}
186
241
  aria-orientation={horizontal ? 'horizontal' : 'vertical'}
187
242
  bind:this={listRef}
188
- class={['sterling-list', _class].filter(Boolean).join(' ')}
243
+ class={['sterling-list', _class]}
189
244
  class:disabled
190
245
  class:horizontal
191
246
  class:using-keyboard={$usingKeyboard}
@@ -1,4 +1,3 @@
1
- /// <reference types="svelte" />
2
1
  import type { HTMLAttributes } from 'svelte/elements';
3
2
  type Props = HTMLAttributes<HTMLDivElement> & {
4
3
  disabled?: boolean | null;