@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.
- package/README.md +1 -1
- package/dist/Button.svelte +18 -14
- package/dist/Button.svelte.d.ts +0 -1
- package/dist/Callout.svelte +162 -96
- package/dist/Callout.svelte.d.ts +1 -2
- package/dist/Checkbox.svelte +34 -15
- package/dist/Checkbox.svelte.d.ts +0 -1
- package/dist/Dialog.svelte +121 -71
- package/dist/Dialog.svelte.d.ts +1 -1
- package/dist/Dropdown.svelte +106 -56
- package/dist/Dropdown.svelte.d.ts +8 -3
- package/dist/Input.svelte +54 -29
- package/dist/Input.svelte.d.ts +1 -2
- package/dist/Label.svelte +99 -55
- package/dist/Label.svelte.d.ts +4 -4
- package/dist/Link.svelte +20 -14
- package/dist/Link.svelte.d.ts +0 -1
- package/dist/List.svelte +181 -126
- package/dist/List.svelte.d.ts +0 -1
- package/dist/ListItem.svelte +36 -21
- package/dist/ListItem.svelte.d.ts +0 -1
- package/dist/Menu.svelte +67 -45
- package/dist/Menu.svelte.d.ts +0 -1
- package/dist/MenuBar.svelte +96 -65
- package/dist/MenuBar.svelte.d.ts +0 -1
- package/dist/MenuButton.svelte +102 -62
- package/dist/MenuButton.svelte.d.ts +1 -1
- package/dist/MenuItem.svelte +332 -243
- package/dist/MenuItem.svelte.d.ts +3 -3
- package/dist/MenuSeparator.svelte +7 -7
- package/dist/MenuSeparator.svelte.d.ts +0 -1
- package/dist/Pagination.svelte +267 -0
- package/dist/Pagination.svelte.d.ts +4 -0
- package/dist/Pagination.types.d.ts +24 -0
- package/dist/Pagination.types.js +1 -0
- package/dist/Popover.svelte +114 -60
- package/dist/Popover.svelte.d.ts +1 -2
- package/dist/Portal.types.d.ts +1 -4
- package/dist/Progress.svelte +40 -15
- package/dist/Progress.svelte.d.ts +0 -1
- package/dist/Radio.svelte +37 -25
- package/dist/Radio.svelte.d.ts +0 -1
- package/dist/Select.svelte +191 -125
- package/dist/Select.svelte.d.ts +8 -2
- package/dist/Slider.svelte +120 -71
- package/dist/Slider.svelte.d.ts +0 -1
- package/dist/Switch.svelte +51 -20
- package/dist/Switch.svelte.d.ts +1 -1
- package/dist/Tab.svelte +39 -24
- package/dist/Tab.svelte.d.ts +0 -1
- package/dist/TabList.svelte +176 -125
- package/dist/TabList.svelte.d.ts +0 -1
- package/dist/TextArea.svelte +83 -41
- package/dist/TextArea.svelte.d.ts +2 -3
- package/dist/Tooltip.svelte +68 -36
- package/dist/Tree.svelte +52 -24
- package/dist/Tree.svelte.d.ts +0 -1
- package/dist/TreeChevron.svelte +24 -12
- package/dist/TreeChevron.svelte.d.ts +0 -1
- package/dist/TreeItem.svelte +292 -225
- package/dist/TreeItem.svelte.d.ts +1 -1
- package/dist/actions/extraClass.d.ts +1 -0
- package/dist/actions/extraClass.js +1 -0
- package/dist/idGenerator.d.ts +1 -0
- package/dist/idGenerator.js +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/mediaQueries/prefersColorSchemeDark.d.ts +0 -1
- package/dist/mediaQueries/prefersReducedMotion.d.ts +0 -1
- package/dist/mediaQueries/usingKeyboard.d.ts +0 -1
- 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">
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
39
|
+
candidate = labelRef?.querySelector<HTMLElement>(`[id="${_for}"]`) || null;
|
|
15
40
|
}
|
|
16
41
|
if (!candidate) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
33
|
-
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// ----- Methods ----- //
|
|
62
|
+
|
|
63
|
+
export const click = () => {
|
|
34
64
|
labelRef?.click();
|
|
35
|
-
};
|
|
36
|
-
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const blur = () => {
|
|
37
68
|
labelRef?.blur();
|
|
38
|
-
};
|
|
39
|
-
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export const focus = (options?: FocusOptions) => {
|
|
40
72
|
labelRef?.focus(options);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// ----- Event Handlers ----- //
|
|
76
|
+
|
|
77
|
+
const onClick: MouseEventHandler<HTMLLabelElement> = (event) => {
|
|
44
78
|
if (forwardClick) {
|
|
45
|
-
|
|
79
|
+
targetRef?.click();
|
|
46
80
|
}
|
|
47
81
|
rest.onclick?.(event);
|
|
48
|
-
};
|
|
82
|
+
};
|
|
49
83
|
</script>
|
|
50
84
|
|
|
51
|
-
{#snippet
|
|
85
|
+
{#snippet stringOrSnippet(item?: string | Snippet)}
|
|
52
86
|
{#if item}
|
|
53
87
|
{#if typeof item === 'string'}
|
|
54
|
-
|
|
88
|
+
{item}
|
|
55
89
|
{:else}
|
|
56
|
-
|
|
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]
|
|
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
|
-
{
|
|
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
|
-
{
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
{
|
|
89
|
-
|
|
90
|
-
|
|
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>
|
package/dist/Label.svelte.d.ts
CHANGED
|
@@ -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?:
|
|
5
|
+
message?: Snippet | string;
|
|
6
6
|
required?: boolean | null;
|
|
7
|
-
requiredIndicator?:
|
|
8
|
-
requiredReason?:
|
|
9
|
-
text?:
|
|
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">
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const click = () => {
|
|
9
19
|
linkRef?.click();
|
|
10
|
-
};
|
|
11
|
-
|
|
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}
|
package/dist/Link.svelte.d.ts
CHANGED
package/dist/List.svelte
CHANGED
|
@@ -1,180 +1,235 @@
|
|
|
1
1
|
<svelte:options runes={true} />
|
|
2
2
|
|
|
3
|
-
<script lang="ts">
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
$effect(() => {
|
|
15
37
|
listContext.disabled = disabled;
|
|
16
|
-
});
|
|
17
|
-
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
$effect(() => {
|
|
18
41
|
listContext.horizontal = horizontal;
|
|
19
|
-
});
|
|
20
|
-
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
$effect(() => {
|
|
21
45
|
listContext.selectedValue = selectedValue;
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
setContext<ListContext>(LIST_CONTEXT_KEY, listContext);
|
|
49
|
+
|
|
50
|
+
export const blur = () => {
|
|
25
51
|
listRef?.blur();
|
|
26
|
-
};
|
|
27
|
-
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const click = () => {
|
|
28
55
|
listRef?.click();
|
|
29
|
-
};
|
|
30
|
-
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const focus = (options?: FocusOptions) => {
|
|
31
59
|
listRef?.focus();
|
|
32
|
-
};
|
|
33
|
-
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const scrollToSelectedItem = () => {
|
|
34
63
|
const element = getSelectedItemElement();
|
|
35
64
|
element?.scrollIntoView({ block: 'nearest', inline: 'nearest' });
|
|
36
|
-
};
|
|
37
|
-
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
$effect(() => {
|
|
38
68
|
onSelect?.(selectedValue);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
103
|
+
candidate = candidate.nextElementSibling;
|
|
65
104
|
}
|
|
66
105
|
let candidateValue = candidate?.getAttribute('data-value');
|
|
106
|
+
|
|
67
107
|
if (candidateValue && candidate) {
|
|
68
|
-
|
|
69
|
-
|
|
108
|
+
selectItem(candidateValue, candidate as HTMLElement);
|
|
109
|
+
return true;
|
|
70
110
|
}
|
|
111
|
+
|
|
71
112
|
return false;
|
|
72
|
-
};
|
|
73
|
-
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export const selectPreviousItem = () => {
|
|
74
116
|
let selectedItem = getSelectedItemElement();
|
|
75
117
|
let candidate = selectedItem?.previousElementSibling;
|
|
76
118
|
while (candidate && !isElementListItem(candidate)) {
|
|
77
|
-
|
|
119
|
+
candidate = candidate.previousElementSibling;
|
|
78
120
|
}
|
|
79
121
|
let candidateValue = candidate?.getAttribute('data-value');
|
|
122
|
+
|
|
80
123
|
if (candidateValue && candidate) {
|
|
81
|
-
|
|
82
|
-
|
|
124
|
+
selectItem(candidateValue, candidate as HTMLElement);
|
|
125
|
+
return true;
|
|
83
126
|
}
|
|
127
|
+
|
|
84
128
|
return false;
|
|
85
|
-
};
|
|
86
|
-
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const selectNextItem = () => {
|
|
87
132
|
let selectedItem = getSelectedItemElement();
|
|
88
133
|
let candidate = selectedItem?.nextElementSibling;
|
|
89
134
|
while (candidate && !isElementListItem(candidate)) {
|
|
90
|
-
|
|
135
|
+
candidate = candidate.nextElementSibling;
|
|
91
136
|
}
|
|
92
137
|
let candidateValue = candidate?.getAttribute('data-value');
|
|
138
|
+
|
|
93
139
|
if (candidateValue && candidate) {
|
|
94
|
-
|
|
95
|
-
|
|
140
|
+
selectItem(candidateValue, candidate as HTMLElement);
|
|
141
|
+
return true;
|
|
96
142
|
}
|
|
143
|
+
|
|
97
144
|
return false;
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
152
|
+
candidate = candidate.previousElementSibling;
|
|
103
153
|
}
|
|
104
154
|
let candidateValue = candidate?.getAttribute('data-value');
|
|
155
|
+
|
|
105
156
|
if (candidateValue && candidate) {
|
|
106
|
-
|
|
107
|
-
|
|
157
|
+
selectItem(candidateValue, candidate as HTMLElement);
|
|
158
|
+
return true;
|
|
108
159
|
}
|
|
160
|
+
|
|
109
161
|
return false;
|
|
110
|
-
};
|
|
111
|
-
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const onClick: MouseEventHandler<HTMLDivElement> = (event) => {
|
|
112
165
|
if (!disabled) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const onKeydown: KeyboardEventHandler<HTMLDivElement> = (event) => {
|
|
126
181
|
if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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]
|
|
243
|
+
class={['sterling-list', _class]}
|
|
189
244
|
class:disabled
|
|
190
245
|
class:horizontal
|
|
191
246
|
class:using-keyboard={$usingKeyboard}
|
package/dist/List.svelte.d.ts
CHANGED