@geoffcox/sterling-svelte 2.0.1 → 2.0.2
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/package.json +26 -28
- package/README.md +0 -18
- package/dist/@types/clickOutside.d.ts +0 -15
- package/dist/Button.svelte +0 -25
- package/dist/Button.svelte.d.ts +0 -9
- package/dist/Callout.svelte +0 -177
- package/dist/Callout.svelte.d.ts +0 -15
- package/dist/Callout.types.d.ts +0 -11
- package/dist/Callout.types.js +0 -1
- package/dist/Checkbox.svelte +0 -43
- package/dist/Checkbox.svelte.d.ts +0 -10
- package/dist/Dialog.svelte +0 -151
- package/dist/Dialog.svelte.d.ts +0 -14
- package/dist/Dropdown.svelte +0 -109
- package/dist/Dropdown.svelte.d.ts +0 -18
- package/dist/Input.svelte +0 -55
- package/dist/Input.svelte.d.ts +0 -12
- package/dist/Label.constants.d.ts +0 -2
- package/dist/Label.constants.js +0 -2
- package/dist/Label.svelte +0 -91
- package/dist/Label.svelte.d.ts +0 -17
- package/dist/Link.svelte +0 -25
- package/dist/Link.svelte.d.ts +0 -12
- package/dist/List.constants.d.ts +0 -1
- package/dist/List.constants.js +0 -1
- package/dist/List.svelte +0 -203
- package/dist/List.svelte.d.ts +0 -20
- package/dist/List.types.d.ts +0 -5
- package/dist/List.types.js +0 -1
- package/dist/ListItem.svelte +0 -49
- package/dist/ListItem.svelte.d.ts +0 -13
- package/dist/Menu.svelte +0 -83
- package/dist/Menu.svelte.d.ts +0 -13
- package/dist/MenuBar.constants.d.ts +0 -1
- package/dist/MenuBar.constants.js +0 -1
- package/dist/MenuBar.svelte +0 -113
- package/dist/MenuBar.svelte.d.ts +0 -13
- package/dist/MenuBar.types.d.ts +0 -4
- package/dist/MenuBar.types.js +0 -1
- package/dist/MenuButton.svelte +0 -116
- package/dist/MenuButton.svelte.d.ts +0 -20
- package/dist/MenuItem.constants.d.ts +0 -2
- package/dist/MenuItem.constants.js +0 -2
- package/dist/MenuItem.svelte +0 -342
- package/dist/MenuItem.svelte.d.ts +0 -22
- package/dist/MenuItem.types.d.ts +0 -20
- package/dist/MenuItem.types.js +0 -1
- package/dist/MenuItem.utils.d.ts +0 -7
- package/dist/MenuItem.utils.js +0 -36
- package/dist/MenuSeparator.svelte +0 -11
- package/dist/MenuSeparator.svelte.d.ts +0 -6
- package/dist/Popover.constants.d.ts +0 -1
- package/dist/Popover.constants.js +0 -14
- package/dist/Popover.svelte +0 -121
- package/dist/Popover.svelte.d.ts +0 -15
- package/dist/Popover.types.d.ts +0 -4
- package/dist/Popover.types.js +0 -1
- package/dist/Portal.constants.d.ts +0 -2
- package/dist/Portal.constants.js +0 -2
- package/dist/Portal.types.d.ts +0 -6
- package/dist/Portal.types.js +0 -1
- package/dist/Progress.constants.d.ts +0 -1
- package/dist/Progress.constants.js +0 -1
- package/dist/Progress.svelte +0 -36
- package/dist/Progress.svelte.d.ts +0 -12
- package/dist/Progress.types.d.ts +0 -4
- package/dist/Progress.types.js +0 -1
- package/dist/Radio.svelte +0 -53
- package/dist/Radio.svelte.d.ts +0 -13
- package/dist/Select.svelte +0 -196
- package/dist/Select.svelte.d.ts +0 -20
- package/dist/Slider.svelte +0 -133
- package/dist/Slider.svelte.d.ts +0 -19
- package/dist/Switch.svelte +0 -61
- package/dist/Switch.svelte.d.ts +0 -21
- package/dist/Tab.svelte +0 -51
- package/dist/Tab.svelte.d.ts +0 -12
- package/dist/TabList.constants.d.ts +0 -1
- package/dist/TabList.constants.js +0 -1
- package/dist/TabList.svelte +0 -202
- package/dist/TabList.svelte.d.ts +0 -18
- package/dist/TabList.types.d.ts +0 -5
- package/dist/TabList.types.js +0 -1
- package/dist/TextArea.constants.d.ts +0 -1
- package/dist/TextArea.constants.js +0 -1
- package/dist/TextArea.svelte +0 -74
- package/dist/TextArea.svelte.d.ts +0 -19
- package/dist/TextArea.types.d.ts +0 -4
- package/dist/TextArea.types.js +0 -1
- package/dist/Tooltip.svelte +0 -63
- package/dist/Tooltip.svelte.d.ts +0 -10
- package/dist/Tree.constants.d.ts +0 -1
- package/dist/Tree.constants.js +0 -1
- package/dist/Tree.svelte +0 -53
- package/dist/Tree.svelte.d.ts +0 -15
- package/dist/Tree.types.d.ts +0 -5
- package/dist/Tree.types.js +0 -1
- package/dist/TreeChevron.svelte +0 -27
- package/dist/TreeChevron.svelte.d.ts +0 -9
- package/dist/TreeItem.constants.d.ts +0 -1
- package/dist/TreeItem.constants.js +0 -1
- package/dist/TreeItem.svelte +0 -329
- package/dist/TreeItem.svelte.d.ts +0 -22
- package/dist/TreeItem.types.d.ts +0 -4
- package/dist/TreeItem.types.js +0 -1
- package/dist/actions/applyLightDarkMode.d.ts +0 -10
- package/dist/actions/applyLightDarkMode.js +0 -36
- package/dist/actions/clickOutside.d.ts +0 -15
- package/dist/actions/clickOutside.js +0 -28
- package/dist/actions/extraClass.d.ts +0 -8
- package/dist/actions/extraClass.js +0 -14
- package/dist/actions/forwardEvents.d.ts +0 -12
- package/dist/actions/forwardEvents.js +0 -32
- package/dist/actions/portal.d.ts +0 -8
- package/dist/actions/portal.js +0 -19
- package/dist/actions/trapKeyboardFocus.d.ts +0 -3
- package/dist/actions/trapKeyboardFocus.js +0 -52
- package/dist/idGenerator.d.ts +0 -4
- package/dist/idGenerator.js +0 -10
- package/dist/index.d.ts +0 -59
- package/dist/index.js +0 -54
- package/dist/mediaQueries/prefersColorSchemeDark.d.ts +0 -2
- package/dist/mediaQueries/prefersColorSchemeDark.js +0 -14
- package/dist/mediaQueries/prefersReducedMotion.d.ts +0 -2
- package/dist/mediaQueries/prefersReducedMotion.js +0 -14
- package/dist/mediaQueries/usingKeyboard.d.ts +0 -2
- package/dist/mediaQueries/usingKeyboard.js +0 -17
package/dist/Dropdown.svelte
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
<svelte:options runes={true} />
|
|
2
|
-
|
|
3
|
-
<script lang="ts">import {} from 'svelte';
|
|
4
|
-
import Popover from './Popover.svelte';
|
|
5
|
-
import { clickOutside } from './actions/clickOutside';
|
|
6
|
-
import { idGenerator } from './idGenerator';
|
|
7
|
-
import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
|
|
8
|
-
import { slide } from 'svelte/transition';
|
|
9
|
-
import { usingKeyboard } from './mediaQueries/usingKeyboard';
|
|
10
|
-
const popupId = idGenerator.nextId('Dropdown-popup');
|
|
11
|
-
let { class: _class, children, disabled = false, open = $bindable(false), onOpen, stayOpenOnClickAway = false, button, buttonIcon, value, ...rest } = $props();
|
|
12
|
-
// svelte-ignore non_reactive_update
|
|
13
|
-
let dropdownRef = $state(undefined);
|
|
14
|
-
// svelte-ignore non_reactive_update
|
|
15
|
-
let popupContentRef = $state(undefined);
|
|
16
|
-
// ----- Reactions ----- //
|
|
17
|
-
$effect(() => {
|
|
18
|
-
onOpen?.(open);
|
|
19
|
-
});
|
|
20
|
-
// ----- Methods ----- //
|
|
21
|
-
export const click = () => {
|
|
22
|
-
dropdownRef?.click();
|
|
23
|
-
};
|
|
24
|
-
export const blur = () => {
|
|
25
|
-
dropdownRef?.blur();
|
|
26
|
-
};
|
|
27
|
-
export const focus = (options) => {
|
|
28
|
-
dropdownRef?.focus(options);
|
|
29
|
-
};
|
|
30
|
-
const onClick = (event) => {
|
|
31
|
-
if (!disabled) {
|
|
32
|
-
open = !open;
|
|
33
|
-
event.preventDefault();
|
|
34
|
-
event.stopPropagation();
|
|
35
|
-
}
|
|
36
|
-
rest.onclick?.(event);
|
|
37
|
-
};
|
|
38
|
-
const onKeydown = (event) => {
|
|
39
|
-
if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
|
|
40
|
-
switch (event.key) {
|
|
41
|
-
case ' ':
|
|
42
|
-
open = !open;
|
|
43
|
-
event.preventDefault();
|
|
44
|
-
event.stopPropagation();
|
|
45
|
-
case 'Escape':
|
|
46
|
-
open = false;
|
|
47
|
-
event.preventDefault();
|
|
48
|
-
event.stopPropagation();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
rest.onkeydown?.(event);
|
|
52
|
-
};
|
|
53
|
-
const onClickOutside = (event) => {
|
|
54
|
-
if (!stayOpenOnClickAway) {
|
|
55
|
-
open = false;
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
// ----- Animation ----- //
|
|
59
|
-
const slideNoOp = (node, params) => {
|
|
60
|
-
return { delay: 0, duration: 0 };
|
|
61
|
-
};
|
|
62
|
-
let slideMotion = $derived(!$prefersReducedMotion ? slide : slideNoOp);
|
|
63
|
-
</script>
|
|
64
|
-
|
|
65
|
-
<div
|
|
66
|
-
bind:this={dropdownRef}
|
|
67
|
-
aria-controls={popupId}
|
|
68
|
-
aria-haspopup={true}
|
|
69
|
-
aria-expanded={open}
|
|
70
|
-
class={`sterling-dropdown ${_class}`}
|
|
71
|
-
class:disabled
|
|
72
|
-
class:open
|
|
73
|
-
class:using-keyboard={$usingKeyboard}
|
|
74
|
-
role="combobox"
|
|
75
|
-
tabindex="0"
|
|
76
|
-
use:clickOutside={{ ignoreOthers: [popupContentRef!], onclickoutside: onClickOutside }}
|
|
77
|
-
{...rest}
|
|
78
|
-
onclick={onClick}
|
|
79
|
-
onkeydown={onKeydown}
|
|
80
|
-
>
|
|
81
|
-
<div class="value">
|
|
82
|
-
{#if value}
|
|
83
|
-
{#if typeof value === 'string'}
|
|
84
|
-
{value}
|
|
85
|
-
{:else}
|
|
86
|
-
{@render value()}
|
|
87
|
-
{/if}
|
|
88
|
-
{/if}
|
|
89
|
-
</div>
|
|
90
|
-
<div class="button">
|
|
91
|
-
{#if button}
|
|
92
|
-
{@render button()}
|
|
93
|
-
{:else if buttonIcon}
|
|
94
|
-
{@render buttonIcon()}
|
|
95
|
-
{:else}
|
|
96
|
-
<div class="chevron"></div>
|
|
97
|
-
{/if}
|
|
98
|
-
</div>
|
|
99
|
-
|
|
100
|
-
<Popover reference={dropdownRef} open={!disabled && open} placement="bottom-start">
|
|
101
|
-
<div
|
|
102
|
-
class={`sterling-dropdown-popup-content ${_class}`}
|
|
103
|
-
transition:slideMotion|global={{ duration: 200 }}
|
|
104
|
-
bind:this={popupContentRef}
|
|
105
|
-
>
|
|
106
|
-
{@render children?.()}
|
|
107
|
-
</div>
|
|
108
|
-
</Popover>
|
|
109
|
-
</div>
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { type Snippet } from 'svelte';
|
|
2
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
type Props = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
-
disabled?: boolean | null | undefined;
|
|
5
|
-
open?: boolean | null | undefined;
|
|
6
|
-
stayOpenOnClickAway?: boolean | null | undefined;
|
|
7
|
-
onOpen?: (open: boolean | null | undefined) => void;
|
|
8
|
-
button?: Snippet;
|
|
9
|
-
buttonIcon?: Snippet;
|
|
10
|
-
value?: string | Snippet;
|
|
11
|
-
};
|
|
12
|
-
declare const Dropdown: import("svelte").Component<Props, {
|
|
13
|
-
click: () => void;
|
|
14
|
-
blur: () => void;
|
|
15
|
-
focus: (options?: FocusOptions) => void;
|
|
16
|
-
}, "open">;
|
|
17
|
-
type Dropdown = ReturnType<typeof Dropdown>;
|
|
18
|
-
export default Dropdown;
|
package/dist/Input.svelte
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
<svelte:options runes={true} />
|
|
2
|
-
|
|
3
|
-
<script lang="ts">import { idGenerator } from './idGenerator';
|
|
4
|
-
import { usingKeyboard } from './mediaQueries/usingKeyboard';
|
|
5
|
-
let { id, children, class: _class, disabled = false, value = $bindable(undefined), ...rest } = $props();
|
|
6
|
-
let inputRef;
|
|
7
|
-
$effect(() => {
|
|
8
|
-
if (children && id === undefined) {
|
|
9
|
-
id = idGenerator.nextId('Input');
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
export const blur = () => {
|
|
13
|
-
inputRef?.blur();
|
|
14
|
-
};
|
|
15
|
-
export const click = () => {
|
|
16
|
-
inputRef?.click();
|
|
17
|
-
};
|
|
18
|
-
export const focus = (options) => {
|
|
19
|
-
inputRef?.focus();
|
|
20
|
-
};
|
|
21
|
-
export const select = () => {
|
|
22
|
-
inputRef?.select();
|
|
23
|
-
};
|
|
24
|
-
export const setSelectionRange = (start, end, direction) => {
|
|
25
|
-
inputRef?.setSelectionRange(start, end, direction);
|
|
26
|
-
};
|
|
27
|
-
export const setRangeText = (replacement, start, end, selectionMode) => {
|
|
28
|
-
if (start && end) {
|
|
29
|
-
inputRef?.setRangeText(replacement, start, end, selectionMode);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
inputRef?.setRangeText(replacement);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
</script>
|
|
36
|
-
|
|
37
|
-
{#if children}
|
|
38
|
-
<label class={['sterling-input-label', _class].filter(Boolean).join(' ')} class:disabled for={id}>
|
|
39
|
-
{@render children()}
|
|
40
|
-
</label>
|
|
41
|
-
{/if}
|
|
42
|
-
<div
|
|
43
|
-
class={['sterling-input', _class].filter(Boolean).join(' ')}
|
|
44
|
-
class:disabled
|
|
45
|
-
class:using-keyboard={$usingKeyboard}
|
|
46
|
-
>
|
|
47
|
-
<input
|
|
48
|
-
bind:this={inputRef}
|
|
49
|
-
class:using-keyboard={$usingKeyboard}
|
|
50
|
-
{disabled}
|
|
51
|
-
{id}
|
|
52
|
-
bind:value
|
|
53
|
-
{...rest}
|
|
54
|
-
/>
|
|
55
|
-
</div>
|
package/dist/Input.svelte.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/// <reference types="svelte" />
|
|
2
|
-
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
3
|
-
declare const Input: import("svelte").Component<HTMLInputAttributes, {
|
|
4
|
-
blur: () => void;
|
|
5
|
-
click: () => void;
|
|
6
|
-
focus: (options?: FocusOptions) => void;
|
|
7
|
-
select: () => void;
|
|
8
|
-
setSelectionRange: (start: number | null, end: number | null, direction?: 'forward' | 'backward' | 'none') => void;
|
|
9
|
-
setRangeText: (replacement: string, start?: number, end?: number, selectionMode?: SelectionMode) => void;
|
|
10
|
-
}, "value">;
|
|
11
|
-
type Input = ReturnType<typeof Input>;
|
|
12
|
-
export default Input;
|
package/dist/Label.constants.js
DELETED
package/dist/Label.svelte
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
<svelte:options runes={true} />
|
|
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;
|
|
13
|
-
if (_for) {
|
|
14
|
-
candidate = labelRef?.querySelector(`[id="${_for}"]`) || null;
|
|
15
|
-
}
|
|
16
|
-
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;
|
|
29
|
-
}
|
|
30
|
-
targetRef = candidate;
|
|
31
|
-
};
|
|
32
|
-
// ----- Methods ----- //
|
|
33
|
-
export const click = () => {
|
|
34
|
-
labelRef?.click();
|
|
35
|
-
};
|
|
36
|
-
export const blur = () => {
|
|
37
|
-
labelRef?.blur();
|
|
38
|
-
};
|
|
39
|
-
export const focus = (options) => {
|
|
40
|
-
labelRef?.focus(options);
|
|
41
|
-
};
|
|
42
|
-
// ----- Event Handlers ----- //
|
|
43
|
-
const onClick = (event) => {
|
|
44
|
-
if (forwardClick) {
|
|
45
|
-
targetRef?.click();
|
|
46
|
-
}
|
|
47
|
-
rest.onclick?.(event);
|
|
48
|
-
};
|
|
49
|
-
</script>
|
|
50
|
-
|
|
51
|
-
{#snippet snippetOrText(item?: string | Snippet, _class?: string)}
|
|
52
|
-
{#if item}
|
|
53
|
-
{#if typeof item === 'string'}
|
|
54
|
-
<div class={_class}>{item}</div>
|
|
55
|
-
{:else}
|
|
56
|
-
<div class={_class}>
|
|
57
|
-
{@render item()}
|
|
58
|
-
</div>
|
|
59
|
-
{/if}
|
|
60
|
-
{/if}
|
|
61
|
-
{/snippet}
|
|
62
|
-
|
|
63
|
-
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
64
|
-
<label
|
|
65
|
-
bind:this={labelRef}
|
|
66
|
-
class={['sterling-label', _class].filter(Boolean).join(' ')}
|
|
67
|
-
class:using-keyboard={$usingKeyboard}
|
|
68
|
-
for={_for}
|
|
69
|
-
{...rest}
|
|
70
|
-
onclick={onClick}
|
|
71
|
-
>
|
|
72
|
-
{@render snippetOrText(text, 'text')}
|
|
73
|
-
{#if children}
|
|
74
|
-
<div class="content">
|
|
75
|
-
{@render children()}
|
|
76
|
-
</div>
|
|
77
|
-
{/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>
|
|
91
|
-
</label>
|
package/dist/Label.svelte.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { type Snippet } from 'svelte';
|
|
2
|
-
import type { HTMLLabelAttributes } from 'svelte/elements';
|
|
3
|
-
type Props = HTMLLabelAttributes & {
|
|
4
|
-
forwardClick?: boolean | null;
|
|
5
|
-
message?: string | Snippet;
|
|
6
|
-
required?: boolean | null;
|
|
7
|
-
requiredIndicator?: string | Snippet;
|
|
8
|
-
requiredReason?: string | Snippet;
|
|
9
|
-
text?: string | Snippet;
|
|
10
|
-
};
|
|
11
|
-
declare const Label: import("svelte").Component<Props, {
|
|
12
|
-
click: () => void;
|
|
13
|
-
blur: () => void;
|
|
14
|
-
focus: (options?: FocusOptions) => void;
|
|
15
|
-
}, "">;
|
|
16
|
-
type Label = ReturnType<typeof Label>;
|
|
17
|
-
export default Label;
|
package/dist/Link.svelte
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<svelte:options runes={true} />
|
|
2
|
-
|
|
3
|
-
<script lang="ts">let { children, class: _class, disabled, ...rest } = $props();
|
|
4
|
-
let linkRef;
|
|
5
|
-
export const blur = () => {
|
|
6
|
-
linkRef?.blur();
|
|
7
|
-
};
|
|
8
|
-
export const click = () => {
|
|
9
|
-
linkRef?.click();
|
|
10
|
-
};
|
|
11
|
-
export const focus = (options) => {
|
|
12
|
-
linkRef?.focus();
|
|
13
|
-
};
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<a
|
|
17
|
-
bind:this={linkRef}
|
|
18
|
-
class={['sterling-link', _class].filter(Boolean).join(' ')}
|
|
19
|
-
class:disabled
|
|
20
|
-
{...rest}
|
|
21
|
-
>
|
|
22
|
-
{#if children}
|
|
23
|
-
{@render children()}
|
|
24
|
-
{/if}
|
|
25
|
-
</a>
|
package/dist/Link.svelte.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/// <reference types="svelte" />
|
|
2
|
-
import type { HTMLAnchorAttributes } from 'svelte/elements';
|
|
3
|
-
type Props = HTMLAnchorAttributes & {
|
|
4
|
-
disabled?: boolean | null;
|
|
5
|
-
};
|
|
6
|
-
declare const Link: import("svelte").Component<Props, {
|
|
7
|
-
blur: () => void;
|
|
8
|
-
click: () => void;
|
|
9
|
-
focus: (options?: FocusOptions) => void;
|
|
10
|
-
}, "">;
|
|
11
|
-
type Link = ReturnType<typeof Link>;
|
|
12
|
-
export default Link;
|
package/dist/List.constants.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const LIST_CONTEXT_KEY = "sterlingList";
|
package/dist/List.constants.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const LIST_CONTEXT_KEY = 'sterlingList';
|
package/dist/List.svelte
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
<svelte:options runes={true} />
|
|
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({
|
|
10
|
-
disabled,
|
|
11
|
-
selectedValue,
|
|
12
|
-
horizontal
|
|
13
|
-
});
|
|
14
|
-
$effect(() => {
|
|
15
|
-
listContext.disabled = disabled;
|
|
16
|
-
});
|
|
17
|
-
$effect(() => {
|
|
18
|
-
listContext.horizontal = horizontal;
|
|
19
|
-
});
|
|
20
|
-
$effect(() => {
|
|
21
|
-
listContext.selectedValue = selectedValue;
|
|
22
|
-
});
|
|
23
|
-
setContext(LIST_CONTEXT_KEY, listContext);
|
|
24
|
-
export const blur = () => {
|
|
25
|
-
listRef?.blur();
|
|
26
|
-
};
|
|
27
|
-
export const click = () => {
|
|
28
|
-
listRef?.click();
|
|
29
|
-
};
|
|
30
|
-
export const focus = (options) => {
|
|
31
|
-
listRef?.focus();
|
|
32
|
-
};
|
|
33
|
-
export const scrollToSelectedItem = () => {
|
|
34
|
-
const element = getSelectedItemElement();
|
|
35
|
-
element?.scrollIntoView({ block: 'nearest', inline: 'nearest' });
|
|
36
|
-
};
|
|
37
|
-
$effect(() => {
|
|
38
|
-
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]');
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
const selectItem = (value, element) => {
|
|
57
|
-
selectedValue = value;
|
|
58
|
-
lastSelectedItemRef = element;
|
|
59
|
-
element.scrollIntoView({ block: 'nearest', inline: 'nearest' });
|
|
60
|
-
};
|
|
61
|
-
export const selectFirstItem = () => {
|
|
62
|
-
let candidate = listRef?.querySelector('[data-value][role=listitem]');
|
|
63
|
-
while (candidate && !isElementListItem(candidate)) {
|
|
64
|
-
candidate = candidate.nextElementSibling;
|
|
65
|
-
}
|
|
66
|
-
let candidateValue = candidate?.getAttribute('data-value');
|
|
67
|
-
if (candidateValue && candidate) {
|
|
68
|
-
selectItem(candidateValue, candidate);
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
|
-
return false;
|
|
72
|
-
};
|
|
73
|
-
export const selectPreviousItem = () => {
|
|
74
|
-
let selectedItem = getSelectedItemElement();
|
|
75
|
-
let candidate = selectedItem?.previousElementSibling;
|
|
76
|
-
while (candidate && !isElementListItem(candidate)) {
|
|
77
|
-
candidate = candidate.previousElementSibling;
|
|
78
|
-
}
|
|
79
|
-
let candidateValue = candidate?.getAttribute('data-value');
|
|
80
|
-
if (candidateValue && candidate) {
|
|
81
|
-
selectItem(candidateValue, candidate);
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
return false;
|
|
85
|
-
};
|
|
86
|
-
export const selectNextItem = () => {
|
|
87
|
-
let selectedItem = getSelectedItemElement();
|
|
88
|
-
let candidate = selectedItem?.nextElementSibling;
|
|
89
|
-
while (candidate && !isElementListItem(candidate)) {
|
|
90
|
-
candidate = candidate.nextElementSibling;
|
|
91
|
-
}
|
|
92
|
-
let candidateValue = candidate?.getAttribute('data-value');
|
|
93
|
-
if (candidateValue && candidate) {
|
|
94
|
-
selectItem(candidateValue, candidate);
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
return false;
|
|
98
|
-
};
|
|
99
|
-
export const selectLastItem = () => {
|
|
100
|
-
let candidate = listRef?.querySelector('[data-value][role=listitem]:last-of-type');
|
|
101
|
-
while (candidate && !isElementListItem(candidate)) {
|
|
102
|
-
candidate = candidate.previousElementSibling;
|
|
103
|
-
}
|
|
104
|
-
let candidateValue = candidate?.getAttribute('data-value');
|
|
105
|
-
if (candidateValue && candidate) {
|
|
106
|
-
selectItem(candidateValue, candidate);
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
return false;
|
|
110
|
-
};
|
|
111
|
-
const onClick = (event) => {
|
|
112
|
-
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
|
-
}
|
|
122
|
-
}
|
|
123
|
-
rest.onclick?.(event);
|
|
124
|
-
};
|
|
125
|
-
const onKeydown = (event) => {
|
|
126
|
-
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
|
-
}
|
|
175
|
-
}
|
|
176
|
-
rest.onkeydown?.(event);
|
|
177
|
-
};
|
|
178
|
-
</script>
|
|
179
|
-
|
|
180
|
-
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
181
|
-
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
182
|
-
<!-- svelte-ignore a11y_role_supports_aria_props -->
|
|
183
|
-
<div
|
|
184
|
-
aria-activedescendant={selectedValue}
|
|
185
|
-
aria-disabled={disabled}
|
|
186
|
-
aria-orientation={horizontal ? 'horizontal' : 'vertical'}
|
|
187
|
-
bind:this={listRef}
|
|
188
|
-
class={['sterling-list', _class].filter(Boolean).join(' ')}
|
|
189
|
-
class:disabled
|
|
190
|
-
class:horizontal
|
|
191
|
-
class:using-keyboard={$usingKeyboard}
|
|
192
|
-
role="list"
|
|
193
|
-
tabindex={0}
|
|
194
|
-
{...rest}
|
|
195
|
-
onclick={onClick}
|
|
196
|
-
onkeydown={onKeydown}
|
|
197
|
-
>
|
|
198
|
-
<div class="container">
|
|
199
|
-
{#if children}
|
|
200
|
-
{@render children()}
|
|
201
|
-
{/if}
|
|
202
|
-
</div>
|
|
203
|
-
</div>
|
package/dist/List.svelte.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/// <reference types="svelte" />
|
|
2
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
type Props = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
-
disabled?: boolean | null;
|
|
5
|
-
horizontal?: boolean | null;
|
|
6
|
-
selectedValue?: string;
|
|
7
|
-
onSelect?: (value?: string) => void;
|
|
8
|
-
};
|
|
9
|
-
declare const List: import("svelte").Component<Props, {
|
|
10
|
-
blur: () => void;
|
|
11
|
-
click: () => void;
|
|
12
|
-
focus: (options?: FocusOptions) => void;
|
|
13
|
-
scrollToSelectedItem: () => void;
|
|
14
|
-
selectFirstItem: () => boolean;
|
|
15
|
-
selectPreviousItem: () => boolean;
|
|
16
|
-
selectNextItem: () => boolean;
|
|
17
|
-
selectLastItem: () => boolean;
|
|
18
|
-
}, "selectedValue">;
|
|
19
|
-
type List = ReturnType<typeof List>;
|
|
20
|
-
export default List;
|
package/dist/List.types.d.ts
DELETED
package/dist/List.types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/ListItem.svelte
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
<svelte:options runes={true} />
|
|
2
|
-
|
|
3
|
-
<script lang="ts">import { getContext } from 'svelte';
|
|
4
|
-
import { LIST_CONTEXT_KEY } from './List.constants';
|
|
5
|
-
let { children, class: _class, disabled, value, ...rest } = $props();
|
|
6
|
-
const listContext = getContext(LIST_CONTEXT_KEY);
|
|
7
|
-
let selected = $state(listContext.selectedValue === value);
|
|
8
|
-
// Using $derived would be preferred, but this helps avoid
|
|
9
|
-
// updates to every list item when selectedValue changes.
|
|
10
|
-
$effect(() => {
|
|
11
|
-
if (listContext.selectedValue === value && !selected) {
|
|
12
|
-
selected = true;
|
|
13
|
-
}
|
|
14
|
-
else if (listContext.selectedValue !== value && selected) {
|
|
15
|
-
selected = false;
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
let itemRef;
|
|
19
|
-
export const click = () => {
|
|
20
|
-
itemRef?.click();
|
|
21
|
-
};
|
|
22
|
-
export const blur = () => {
|
|
23
|
-
itemRef?.blur();
|
|
24
|
-
};
|
|
25
|
-
export const focus = (options) => {
|
|
26
|
-
itemRef?.focus(options);
|
|
27
|
-
};
|
|
28
|
-
</script>
|
|
29
|
-
|
|
30
|
-
<!-- svelte-ignore a11y_role_supports_aria_props -->
|
|
31
|
-
<div
|
|
32
|
-
aria-selected={selected}
|
|
33
|
-
bind:this={itemRef}
|
|
34
|
-
class={['sterling-list-item', _class].filter(Boolean).join(' ')}
|
|
35
|
-
class:disabled={disabled || listContext.disabled}
|
|
36
|
-
class:horizontal={listContext.horizontal}
|
|
37
|
-
class:item-disabled={disabled}
|
|
38
|
-
class:list-disabled={listContext.disabled}
|
|
39
|
-
class:selected
|
|
40
|
-
data-value={value}
|
|
41
|
-
role="listitem"
|
|
42
|
-
{...rest}
|
|
43
|
-
>
|
|
44
|
-
{#if children}
|
|
45
|
-
{@render children()}
|
|
46
|
-
{:else}
|
|
47
|
-
{value}
|
|
48
|
-
{/if}
|
|
49
|
-
</div>
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/// <reference types="svelte" />
|
|
2
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
type Props = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
-
disabled?: boolean | null;
|
|
5
|
-
value?: string;
|
|
6
|
-
};
|
|
7
|
-
declare const ListItem: import("svelte").Component<Props, {
|
|
8
|
-
click: () => void;
|
|
9
|
-
blur: () => void;
|
|
10
|
-
focus: (options?: FocusOptions) => void;
|
|
11
|
-
}, "">;
|
|
12
|
-
type ListItem = ReturnType<typeof ListItem>;
|
|
13
|
-
export default ListItem;
|