@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.
Files changed (127) hide show
  1. package/package.json +26 -28
  2. package/README.md +0 -18
  3. package/dist/@types/clickOutside.d.ts +0 -15
  4. package/dist/Button.svelte +0 -25
  5. package/dist/Button.svelte.d.ts +0 -9
  6. package/dist/Callout.svelte +0 -177
  7. package/dist/Callout.svelte.d.ts +0 -15
  8. package/dist/Callout.types.d.ts +0 -11
  9. package/dist/Callout.types.js +0 -1
  10. package/dist/Checkbox.svelte +0 -43
  11. package/dist/Checkbox.svelte.d.ts +0 -10
  12. package/dist/Dialog.svelte +0 -151
  13. package/dist/Dialog.svelte.d.ts +0 -14
  14. package/dist/Dropdown.svelte +0 -109
  15. package/dist/Dropdown.svelte.d.ts +0 -18
  16. package/dist/Input.svelte +0 -55
  17. package/dist/Input.svelte.d.ts +0 -12
  18. package/dist/Label.constants.d.ts +0 -2
  19. package/dist/Label.constants.js +0 -2
  20. package/dist/Label.svelte +0 -91
  21. package/dist/Label.svelte.d.ts +0 -17
  22. package/dist/Link.svelte +0 -25
  23. package/dist/Link.svelte.d.ts +0 -12
  24. package/dist/List.constants.d.ts +0 -1
  25. package/dist/List.constants.js +0 -1
  26. package/dist/List.svelte +0 -203
  27. package/dist/List.svelte.d.ts +0 -20
  28. package/dist/List.types.d.ts +0 -5
  29. package/dist/List.types.js +0 -1
  30. package/dist/ListItem.svelte +0 -49
  31. package/dist/ListItem.svelte.d.ts +0 -13
  32. package/dist/Menu.svelte +0 -83
  33. package/dist/Menu.svelte.d.ts +0 -13
  34. package/dist/MenuBar.constants.d.ts +0 -1
  35. package/dist/MenuBar.constants.js +0 -1
  36. package/dist/MenuBar.svelte +0 -113
  37. package/dist/MenuBar.svelte.d.ts +0 -13
  38. package/dist/MenuBar.types.d.ts +0 -4
  39. package/dist/MenuBar.types.js +0 -1
  40. package/dist/MenuButton.svelte +0 -116
  41. package/dist/MenuButton.svelte.d.ts +0 -20
  42. package/dist/MenuItem.constants.d.ts +0 -2
  43. package/dist/MenuItem.constants.js +0 -2
  44. package/dist/MenuItem.svelte +0 -342
  45. package/dist/MenuItem.svelte.d.ts +0 -22
  46. package/dist/MenuItem.types.d.ts +0 -20
  47. package/dist/MenuItem.types.js +0 -1
  48. package/dist/MenuItem.utils.d.ts +0 -7
  49. package/dist/MenuItem.utils.js +0 -36
  50. package/dist/MenuSeparator.svelte +0 -11
  51. package/dist/MenuSeparator.svelte.d.ts +0 -6
  52. package/dist/Popover.constants.d.ts +0 -1
  53. package/dist/Popover.constants.js +0 -14
  54. package/dist/Popover.svelte +0 -121
  55. package/dist/Popover.svelte.d.ts +0 -15
  56. package/dist/Popover.types.d.ts +0 -4
  57. package/dist/Popover.types.js +0 -1
  58. package/dist/Portal.constants.d.ts +0 -2
  59. package/dist/Portal.constants.js +0 -2
  60. package/dist/Portal.types.d.ts +0 -6
  61. package/dist/Portal.types.js +0 -1
  62. package/dist/Progress.constants.d.ts +0 -1
  63. package/dist/Progress.constants.js +0 -1
  64. package/dist/Progress.svelte +0 -36
  65. package/dist/Progress.svelte.d.ts +0 -12
  66. package/dist/Progress.types.d.ts +0 -4
  67. package/dist/Progress.types.js +0 -1
  68. package/dist/Radio.svelte +0 -53
  69. package/dist/Radio.svelte.d.ts +0 -13
  70. package/dist/Select.svelte +0 -196
  71. package/dist/Select.svelte.d.ts +0 -20
  72. package/dist/Slider.svelte +0 -133
  73. package/dist/Slider.svelte.d.ts +0 -19
  74. package/dist/Switch.svelte +0 -61
  75. package/dist/Switch.svelte.d.ts +0 -21
  76. package/dist/Tab.svelte +0 -51
  77. package/dist/Tab.svelte.d.ts +0 -12
  78. package/dist/TabList.constants.d.ts +0 -1
  79. package/dist/TabList.constants.js +0 -1
  80. package/dist/TabList.svelte +0 -202
  81. package/dist/TabList.svelte.d.ts +0 -18
  82. package/dist/TabList.types.d.ts +0 -5
  83. package/dist/TabList.types.js +0 -1
  84. package/dist/TextArea.constants.d.ts +0 -1
  85. package/dist/TextArea.constants.js +0 -1
  86. package/dist/TextArea.svelte +0 -74
  87. package/dist/TextArea.svelte.d.ts +0 -19
  88. package/dist/TextArea.types.d.ts +0 -4
  89. package/dist/TextArea.types.js +0 -1
  90. package/dist/Tooltip.svelte +0 -63
  91. package/dist/Tooltip.svelte.d.ts +0 -10
  92. package/dist/Tree.constants.d.ts +0 -1
  93. package/dist/Tree.constants.js +0 -1
  94. package/dist/Tree.svelte +0 -53
  95. package/dist/Tree.svelte.d.ts +0 -15
  96. package/dist/Tree.types.d.ts +0 -5
  97. package/dist/Tree.types.js +0 -1
  98. package/dist/TreeChevron.svelte +0 -27
  99. package/dist/TreeChevron.svelte.d.ts +0 -9
  100. package/dist/TreeItem.constants.d.ts +0 -1
  101. package/dist/TreeItem.constants.js +0 -1
  102. package/dist/TreeItem.svelte +0 -329
  103. package/dist/TreeItem.svelte.d.ts +0 -22
  104. package/dist/TreeItem.types.d.ts +0 -4
  105. package/dist/TreeItem.types.js +0 -1
  106. package/dist/actions/applyLightDarkMode.d.ts +0 -10
  107. package/dist/actions/applyLightDarkMode.js +0 -36
  108. package/dist/actions/clickOutside.d.ts +0 -15
  109. package/dist/actions/clickOutside.js +0 -28
  110. package/dist/actions/extraClass.d.ts +0 -8
  111. package/dist/actions/extraClass.js +0 -14
  112. package/dist/actions/forwardEvents.d.ts +0 -12
  113. package/dist/actions/forwardEvents.js +0 -32
  114. package/dist/actions/portal.d.ts +0 -8
  115. package/dist/actions/portal.js +0 -19
  116. package/dist/actions/trapKeyboardFocus.d.ts +0 -3
  117. package/dist/actions/trapKeyboardFocus.js +0 -52
  118. package/dist/idGenerator.d.ts +0 -4
  119. package/dist/idGenerator.js +0 -10
  120. package/dist/index.d.ts +0 -59
  121. package/dist/index.js +0 -54
  122. package/dist/mediaQueries/prefersColorSchemeDark.d.ts +0 -2
  123. package/dist/mediaQueries/prefersColorSchemeDark.js +0 -14
  124. package/dist/mediaQueries/prefersReducedMotion.d.ts +0 -2
  125. package/dist/mediaQueries/prefersReducedMotion.js +0 -14
  126. package/dist/mediaQueries/usingKeyboard.d.ts +0 -2
  127. package/dist/mediaQueries/usingKeyboard.js +0 -17
@@ -1,329 +0,0 @@
1
- <svelte:options runes={true} />
2
-
3
- <script lang="ts">import { getContext, setContext } from 'svelte';
4
- import { slide } from 'svelte/transition';
5
- import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
6
- import { TREE_CONTEXT_KEY } from './Tree.constants';
7
- import TreeChevron from './TreeChevron.svelte';
8
- import { TREE_ITEM_CONTEXT_KEY } from './TreeItem.constants';
9
- let { children, class: _class, disabled = false, icon, label, style, value, ...rest } = $props();
10
- const slideNoOp = (node, params) => {
11
- return { delay: 0, duration: 0 };
12
- };
13
- let slideMotion = $derived(!$prefersReducedMotion ? slide : slideNoOp);
14
- const treeContext = getContext(TREE_CONTEXT_KEY) || {
15
- disabled: false,
16
- expandedValues: [],
17
- selectedValue: null
18
- };
19
- const treeItemContext = getContext(TREE_ITEM_CONTEXT_KEY) || {
20
- depth: 0,
21
- disabled: false
22
- };
23
- let _disabled = $derived(disabled || treeItemContext.disabled || treeContext.disabled);
24
- // Using $derived would be preferred, but this helps avoid
25
- // updates to every tree item when expandedValues changes.
26
- let expanded = $state(treeContext.expandedValues?.includes(value));
27
- $effect(() => {
28
- let expandedCandidate = treeContext.expandedValues?.includes(value);
29
- if (expandedCandidate !== expanded) {
30
- expanded = expandedCandidate;
31
- }
32
- });
33
- // Using $derived would be preferred, but this helps avoid
34
- // updates to every list item when selectedValue changes.
35
- let selected = $state(treeContext.selectedValue === value);
36
- $effect(() => {
37
- if (treeContext.selectedValue === value && !selected) {
38
- selected = true;
39
- }
40
- else if (treeContext.selectedValue !== value && selected) {
41
- selected = false;
42
- }
43
- });
44
- let treeItemRef;
45
- let itemRef;
46
- let treeItemChildContext = {
47
- get disabled() {
48
- return _disabled;
49
- },
50
- get depth() {
51
- return treeItemContext.depth ? treeItemContext.depth + 1 : 1;
52
- }
53
- };
54
- setContext(TREE_ITEM_CONTEXT_KEY, treeItemChildContext);
55
- const collapseItem = (index) => {
56
- if (!_disabled) {
57
- index =
58
- index ?? treeContext.expandedValues.findIndex((expandedValue) => expandedValue === value);
59
- if (index !== -1) {
60
- treeContext.expandedValues = [
61
- ...treeContext.expandedValues.slice(0, index),
62
- ...treeContext.expandedValues.slice(index + 1)
63
- ];
64
- return true;
65
- }
66
- }
67
- return false;
68
- };
69
- export const collapse = () => collapseItem();
70
- const expandItem = (index) => {
71
- if (!_disabled) {
72
- index =
73
- index ?? treeContext.expandedValues.findIndex((expandedValue) => expandedValue === value);
74
- if (index === -1) {
75
- treeContext.expandedValues = [...treeContext.expandedValues, value];
76
- return true;
77
- }
78
- }
79
- return false;
80
- };
81
- export const expand = () => expandItem();
82
- export const toggleExpanded = () => {
83
- if (!_disabled && children) {
84
- const index = treeContext.expandedValues.findIndex((expandedValue) => expandedValue === value);
85
- return index !== -1 ? collapseItem(index) : expandItem(index);
86
- }
87
- return false;
88
- };
89
- const blurItem = (treeItemElement) => {
90
- if (!_disabled) {
91
- const item = treeItemElement?.querySelector('.item');
92
- item?.blur();
93
- }
94
- };
95
- export const blur = () => {
96
- blurItem(treeItemRef);
97
- };
98
- const focusItem = (treeItemElement, options) => {
99
- if (!_disabled) {
100
- const item = treeItemElement;
101
- item?.focus(options);
102
- }
103
- };
104
- export const focus = (options) => {
105
- focusItem(treeItemRef);
106
- treeItemRef?.focus(options);
107
- };
108
- const clickItem = (treeItemElement) => {
109
- if (!_disabled) {
110
- const item = treeItemElement;
111
- item?.click();
112
- }
113
- };
114
- export const click = () => {
115
- clickItem(treeItemRef);
116
- };
117
- const selectItemByValue = (value) => {
118
- if (!_disabled) {
119
- treeContext.selectedValue = value;
120
- }
121
- };
122
- export const select = () => {
123
- if (!_disabled) {
124
- selectItemByValue(value);
125
- }
126
- };
127
- export const selectParent = () => {
128
- if (!_disabled) {
129
- let candidate = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
130
- let candidateValue = candidate?.getAttribute('data-value');
131
- if (candidateValue && candidate) {
132
- selectItemByValue(candidateValue);
133
- focusItem(candidate);
134
- return true;
135
- }
136
- }
137
- return false;
138
- };
139
- export const selectPrevious = () => {
140
- if (!_disabled) {
141
- let candidate = undefined;
142
- let candidateValue = undefined;
143
- const previousSibling = treeItemRef?.previousElementSibling;
144
- if (previousSibling) {
145
- // look for the last (recursive) decendant of ths previous sibling
146
- const decendants = previousSibling.querySelectorAll('[role="treeitem"][data-value]');
147
- if (decendants) {
148
- candidate = decendants[decendants.length - 1];
149
- candidateValue = candidate?.getAttribute('data-value');
150
- }
151
- // look for the previous sibling
152
- if (!candidateValue) {
153
- candidate = previousSibling;
154
- candidateValue = candidate?.getAttribute('data-value');
155
- }
156
- }
157
- // look for the parent
158
- if (!candidateValue) {
159
- candidate = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
160
- candidateValue = candidate?.getAttribute('data-value');
161
- }
162
- if (candidateValue && candidate) {
163
- selectItemByValue(candidateValue);
164
- focusItem(candidate);
165
- return true;
166
- }
167
- }
168
- return false;
169
- };
170
- export const selectNext = () => {
171
- if (!_disabled) {
172
- let candidateValue = undefined;
173
- // look for decendants
174
- let candidate = treeItemRef.querySelector('[role="treeitem"][data-value]');
175
- candidateValue = candidate?.getAttribute('data-value');
176
- // look for next sibling
177
- if (!candidateValue) {
178
- candidate = treeItemRef.nextElementSibling;
179
- while (candidate && candidate.getAttribute('data-value') === null) {
180
- candidate = candidate.nextElementSibling;
181
- }
182
- candidateValue = candidate?.getAttribute('data-value');
183
- }
184
- // look for next sibling of ancestor
185
- if (!candidateValue) {
186
- let ancestor = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
187
- while (ancestor && !candidateValue) {
188
- candidate = ancestor?.nextElementSibling;
189
- candidateValue = candidate?.getAttribute('data-value');
190
- ancestor = ancestor.parentElement?.closest('[role="treeitem"][data-value]');
191
- }
192
- }
193
- if (candidateValue && candidate) {
194
- selectItemByValue(candidateValue);
195
- focusItem(candidate);
196
- return true;
197
- }
198
- }
199
- return false;
200
- };
201
- const onClick = (event) => {
202
- const eventTarget = event.target;
203
- if (!_disabled && itemRef.contains(eventTarget)) {
204
- toggleExpanded();
205
- select();
206
- return;
207
- }
208
- rest.onclick?.(event);
209
- };
210
- const onKeydown = (event) => {
211
- if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
212
- switch (event.key) {
213
- case 'Enter':
214
- case ' ':
215
- if (toggleExpanded()) {
216
- event.preventDefault();
217
- event.stopPropagation();
218
- return;
219
- }
220
- break;
221
- case 'ArrowRight':
222
- /*
223
- When focus is on a closed item, opens the item; focus does not move.
224
- When focus is on an open item, moves focus to the first child item.
225
- When focus is on an end item (a tree item with no children), does nothing.
226
- */
227
- if (children) {
228
- if (expanded) {
229
- if (selectNext()) {
230
- event.preventDefault();
231
- event.stopPropagation();
232
- return;
233
- }
234
- }
235
- else if (expandItem()) {
236
- event.preventDefault();
237
- event.stopPropagation();
238
- return;
239
- }
240
- }
241
- break;
242
- case 'ArrowLeft':
243
- /*
244
- When focus is on an open item, closes the item.
245
- When focus is on a child item that is also either an end item or a closed item, moves focus to its parent item.
246
- When focus is on a closed `tree`, does nothing.
247
- */
248
- if (expanded && children) {
249
- if (collapseItem()) {
250
- event.preventDefault();
251
- event.stopPropagation();
252
- return;
253
- }
254
- }
255
- else if (selectParent()) {
256
- event.preventDefault();
257
- event.stopPropagation();
258
- return;
259
- }
260
- break;
261
- case 'ArrowUp':
262
- /*
263
- Moves focus to the previous item that is focusable without opening or closing a item.
264
- */
265
- if (selectPrevious()) {
266
- event.preventDefault();
267
- event.stopPropagation();
268
- return;
269
- }
270
- break;
271
- case 'ArrowDown':
272
- /*
273
- Moves focus to the next item that is focusable without opening or closing a item.
274
- */
275
- if (selectNext()) {
276
- event.preventDefault();
277
- event.stopPropagation();
278
- return;
279
- }
280
- break;
281
- }
282
- }
283
- rest.onkeydown?.(event);
284
- };
285
- </script>
286
-
287
- <div
288
- bind:this={treeItemRef}
289
- aria-selected={selected ? true : undefined}
290
- aria-expanded={expanded}
291
- class={`sterling-tree-item ${_class}`}
292
- class:disabled={_disabled}
293
- class:expanded
294
- class:item-disabled={disabled}
295
- class:leaf={!children}
296
- class:parent-disabled={treeItemContext.disabled}
297
- class:selected
298
- class:tree-disabled={treeContext.disabled}
299
- data-value={value}
300
- role="treeitem"
301
- tabindex={selected ? 0 : -1}
302
- {...rest}
303
- onclick={onClick}
304
- onkeydown={onKeydown}
305
- style={`--sterling-tree-item-depth: ${treeItemContext.depth}; ${style}`}
306
- >
307
- <!-- TODO: In RTL consider position of icon and label get reversed -->
308
- <div bind:this={itemRef} class="item" class:selected>
309
- {#if icon}
310
- {@render icon()}
311
- {:else}
312
- <TreeChevron {expanded} hasChildren={!!children} />
313
- {/if}
314
- {#if label}
315
- {#if typeof label === 'string'}
316
- {label}
317
- {:else}
318
- {@render label()}
319
- {/if}
320
- {:else}
321
- {value}
322
- {/if}
323
- </div>
324
- {#if expanded && children}
325
- <div class="children" transition:slideMotion|global={{ duration: 200 }} role="group">
326
- {@render children?.()}
327
- </div>
328
- {/if}
329
- </div>
@@ -1,22 +0,0 @@
1
- import type { HTMLAttributes } from 'svelte/elements';
2
- import { type Snippet } from 'svelte';
3
- type Props = HTMLAttributes<HTMLDivElement> & {
4
- disabled?: boolean | null | undefined;
5
- icon?: Snippet;
6
- label?: string | Snippet;
7
- value: string;
8
- };
9
- declare const TreeItem: import("svelte").Component<Props, {
10
- collapse: () => boolean;
11
- expand: () => boolean;
12
- toggleExpanded: () => boolean;
13
- blur: () => void;
14
- focus: (options?: FocusOptions) => void;
15
- click: () => void;
16
- select: () => void;
17
- selectParent: () => boolean;
18
- selectPrevious: () => boolean;
19
- selectNext: () => boolean;
20
- }, "">;
21
- type TreeItem = ReturnType<typeof TreeItem>;
22
- export default TreeItem;
@@ -1,4 +0,0 @@
1
- export type TreeItemContext = {
2
- depth: number;
3
- disabled: boolean | null | undefined;
4
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,10 +0,0 @@
1
- type Mode = 'auto' | 'light' | 'dark';
2
- type Params = {
3
- atDocumentRoot?: boolean;
4
- mode?: Mode;
5
- };
6
- export declare const applyLightDarkMode: (node: HTMLElement, params?: Params) => {
7
- destroy(): void;
8
- update(params?: Params): void;
9
- };
10
- export {};
@@ -1,36 +0,0 @@
1
- import { prefersColorSchemeDark } from '../mediaQueries/prefersColorSchemeDark';
2
- const modes = ['light-mode', 'dark-mode'];
3
- const addMode = (element, mode, prefersDark) => {
4
- const darkMode = mode === 'dark' || (mode === 'auto' && prefersDark);
5
- element.classList.remove(...modes);
6
- element.classList.add(modes[darkMode ? 1 : 0]);
7
- };
8
- const clearModes = (element) => {
9
- element.classList.remove(...modes);
10
- };
11
- export const applyLightDarkMode = (node, params) => {
12
- let mode = params?.mode || 'auto';
13
- let prefersDark = false;
14
- let atDocumentRoot = params?.atDocumentRoot === true;
15
- let target = atDocumentRoot ? document.documentElement : node;
16
- const unsubscribe = prefersColorSchemeDark.subscribe((value) => {
17
- prefersDark = value;
18
- addMode(target, mode, prefersDark);
19
- });
20
- addMode(target, mode, prefersDark);
21
- return {
22
- destroy() {
23
- unsubscribe();
24
- },
25
- update(params) {
26
- // if changing the target, then clear from previous target
27
- if (atDocumentRoot !== params?.atDocumentRoot) {
28
- clearModes(target);
29
- }
30
- mode = params?.mode || 'auto';
31
- atDocumentRoot = params?.atDocumentRoot === true;
32
- target = atDocumentRoot ? document.documentElement : node;
33
- addMode(target, mode, prefersDark);
34
- }
35
- };
36
- };
@@ -1,15 +0,0 @@
1
- type Params = {
2
- /** Other elements should not raise the event if clicked. */
3
- ignoreOthers?: HTMLElement[];
4
- onclickoutside?: (mouseEvent: MouseEvent) => void;
5
- };
6
- /**
7
- * Raises the click_outside event when the user clicks outside the node.
8
- * @param node The node to check and receive the event.
9
- * @param params Additional parameters
10
- */
11
- export declare const clickOutside: (node: HTMLElement, params?: Params) => {
12
- update(params: Params): void;
13
- destroy(): void;
14
- };
15
- export {};
@@ -1,28 +0,0 @@
1
- /**
2
- * Raises the click_outside event when the user clicks outside the node.
3
- * @param node The node to check and receive the event.
4
- * @param params Additional parameters
5
- */
6
- export const clickOutside = (node, params) => {
7
- let ignoreOthers = params?.ignoreOthers;
8
- const handleClick = (event) => {
9
- const targetNode = event?.target;
10
- if (targetNode &&
11
- !node.contains(targetNode) &&
12
- (!ignoreOthers || ignoreOthers.filter(Boolean).every((x) => !x.contains(targetNode)))) {
13
- params?.onclickoutside?.(event);
14
- node.dispatchEvent(new CustomEvent('click_outside', {
15
- detail: { mouseEvent: event }
16
- }));
17
- }
18
- };
19
- document.addEventListener('click', handleClick, true);
20
- return {
21
- update(params) {
22
- ignoreOthers = params.ignoreOthers;
23
- },
24
- destroy() {
25
- document.removeEventListener('click', handleClick, true);
26
- }
27
- };
28
- };
@@ -1,8 +0,0 @@
1
- type Params = {
2
- extraClass: string | null | undefined;
3
- };
4
- export declare const extraClass: (node: HTMLElement, params?: Params) => {
5
- update(params: Params): void;
6
- destroy(): void;
7
- };
8
- export {};
@@ -1,14 +0,0 @@
1
- export const extraClass = (node, params) => {
2
- let _class = params?.extraClass;
3
- !!_class && node.classList.add(_class);
4
- return {
5
- update(params) {
6
- !!_class && node.classList.remove(_class);
7
- _class = params.extraClass;
8
- !!_class && node.classList.add(_class);
9
- },
10
- destroy() {
11
- !!_class && node.classList.remove(_class);
12
- }
13
- };
14
- };
@@ -1,12 +0,0 @@
1
- export declare const forwardEvents: (node: HTMLElement, params: {
2
- target: HTMLElement;
3
- events?: string[];
4
- customEvents?: string[];
5
- }) => {
6
- update: (params: {
7
- target: HTMLElement;
8
- events?: string[];
9
- customEvents?: [];
10
- }) => void;
11
- destroy(): void;
12
- };
@@ -1,32 +0,0 @@
1
- export const forwardEvents = (node, params) => {
2
- const addListeners = (node, target, events, customEvents) => {
3
- let forward = (event) => {
4
- target.dispatchEvent(event);
5
- };
6
- let forwardCustom = (event) => {
7
- const customEvent = event;
8
- target.dispatchEvent(new CustomEvent(customEvent.type, {
9
- bubbles: customEvent.bubbles,
10
- cancelable: customEvent.cancelable,
11
- detail: customEvent.detail
12
- }));
13
- };
14
- events?.forEach((e) => node.addEventListener(e, forward));
15
- customEvents?.forEach((e) => node.addEventListener(e, forwardCustom));
16
- return () => {
17
- events?.forEach((e) => node.removeEventListener(e, forward));
18
- customEvents?.forEach((e) => node.removeEventListener(e, forwardCustom));
19
- };
20
- };
21
- let unsubscribe = addListeners(node, params.target, params.events, params.customEvents);
22
- const update = (params) => {
23
- unsubscribe();
24
- unsubscribe = addListeners(node, params.target, params.events, params.customEvents);
25
- };
26
- return {
27
- update,
28
- destroy() {
29
- unsubscribe();
30
- }
31
- };
32
- };
@@ -1,8 +0,0 @@
1
- export declare const portal: (node: HTMLElement, params: {
2
- target?: HTMLElement;
3
- }) => {
4
- update: (params: {
5
- target?: HTMLElement;
6
- }) => void;
7
- destroy(): void;
8
- };
@@ -1,19 +0,0 @@
1
- export const portal = (node, params) => {
2
- const child = node;
3
- let portaled = false;
4
- const createPortal = (node, params) => {
5
- if (!portaled && params.target && node) {
6
- params.target.appendChild(node);
7
- portaled = true;
8
- }
9
- };
10
- createPortal(child, params);
11
- return {
12
- update: (params) => createPortal(child, params),
13
- destroy() {
14
- if (portaled) {
15
- child?.parentNode?.removeChild(child);
16
- }
17
- }
18
- };
19
- };
@@ -1,3 +0,0 @@
1
- export declare const trapKeyboardFocus: (node: HTMLElement) => {
2
- destroy: () => void;
3
- };
@@ -1,52 +0,0 @@
1
- const getFirstFocusable = (node) => {
2
- // we can't select [tabIndex] as many elements don't have tabIndex as a declared property
3
- // but do default to tabIndex >= 0.
4
- const nodes = node.querySelectorAll('*');
5
- const elements = Array.from(nodes)
6
- .map((n) => n)
7
- .filter((n) => n.tabIndex !== undefined && n.tabIndex >= 0);
8
- return elements.length > 0 ? elements[0] : null;
9
- };
10
- const getLastFocusable = (node) => {
11
- // we can't select [tabIndex] as many elements don't have tabIndex as a declared property
12
- // but do default to tabIndex >= 0.
13
- const nodes = node.querySelectorAll('*');
14
- const elements = Array.from(nodes)
15
- .map((n) => n)
16
- .filter((n) => n.tabIndex !== undefined && n.tabIndex >= 0);
17
- return elements.length > 0 ? elements[elements.length - 1] : null;
18
- };
19
- export const trapKeyboardFocus = (node) => {
20
- const onKeydown = (e) => {
21
- let handledFocus = false;
22
- if (e.key === 'Tab') {
23
- if (e.shiftKey) {
24
- const firstFocusable = getFirstFocusable(node);
25
- if (document.activeElement === firstFocusable) {
26
- const lastFocusable = getLastFocusable(node);
27
- lastFocusable?.focus();
28
- handledFocus = true;
29
- }
30
- }
31
- else {
32
- const lastFocusable = getLastFocusable(node);
33
- if (document.activeElement === lastFocusable) {
34
- const firstFocusable = getFirstFocusable(node);
35
- firstFocusable?.focus();
36
- handledFocus = true;
37
- }
38
- }
39
- }
40
- if (handledFocus) {
41
- e.stopPropagation();
42
- e.preventDefault();
43
- return false;
44
- }
45
- };
46
- node.addEventListener('keydown', onKeydown);
47
- return {
48
- destroy: () => {
49
- node.removeEventListener('keydown', onKeydown);
50
- }
51
- };
52
- };
@@ -1,4 +0,0 @@
1
- export declare const idGenerator: {
2
- next: () => number;
3
- nextId: (prefix?: string) => string;
4
- };
@@ -1,10 +0,0 @@
1
- let id = 0;
2
- const next = () => {
3
- return ++id;
4
- };
5
- export const idGenerator = {
6
- next,
7
- nextId: (prefix) => {
8
- return prefix ? `${prefix}-${next()}` : `${next()}`;
9
- }
10
- };