@geoffcox/sterling-svelte 2.0.2 → 2.0.4

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 (133) hide show
  1. package/README.md +18 -0
  2. package/dist/@types/clickOutside.d.ts +15 -0
  3. package/dist/Button.svelte +29 -0
  4. package/dist/Button.svelte.d.ts +8 -0
  5. package/dist/Callout.svelte +243 -0
  6. package/dist/Callout.svelte.d.ts +14 -0
  7. package/dist/Callout.types.d.ts +11 -0
  8. package/dist/Callout.types.js +1 -0
  9. package/dist/Checkbox.svelte +62 -0
  10. package/dist/Checkbox.svelte.d.ts +9 -0
  11. package/dist/Dialog.svelte +201 -0
  12. package/dist/Dialog.svelte.d.ts +14 -0
  13. package/dist/Dropdown.svelte +159 -0
  14. package/dist/Dropdown.svelte.d.ts +23 -0
  15. package/dist/Input.svelte +80 -0
  16. package/dist/Input.svelte.d.ts +11 -0
  17. package/dist/Label.constants.d.ts +2 -0
  18. package/dist/Label.constants.js +2 -0
  19. package/dist/Label.svelte +135 -0
  20. package/dist/Label.svelte.d.ts +17 -0
  21. package/dist/Link.svelte +31 -0
  22. package/dist/Link.svelte.d.ts +11 -0
  23. package/dist/List.constants.d.ts +1 -0
  24. package/dist/List.constants.js +1 -0
  25. package/dist/List.svelte +258 -0
  26. package/dist/List.svelte.d.ts +19 -0
  27. package/dist/List.types.d.ts +5 -0
  28. package/dist/List.types.js +1 -0
  29. package/dist/ListItem.svelte +64 -0
  30. package/dist/ListItem.svelte.d.ts +12 -0
  31. package/dist/Menu.svelte +105 -0
  32. package/dist/Menu.svelte.d.ts +12 -0
  33. package/dist/MenuBar.constants.d.ts +1 -0
  34. package/dist/MenuBar.constants.js +1 -0
  35. package/dist/MenuBar.svelte +144 -0
  36. package/dist/MenuBar.svelte.d.ts +12 -0
  37. package/dist/MenuBar.types.d.ts +4 -0
  38. package/dist/MenuBar.types.js +1 -0
  39. package/dist/MenuButton.svelte +156 -0
  40. package/dist/MenuButton.svelte.d.ts +20 -0
  41. package/dist/MenuItem.constants.d.ts +2 -0
  42. package/dist/MenuItem.constants.js +2 -0
  43. package/dist/MenuItem.svelte +431 -0
  44. package/dist/MenuItem.svelte.d.ts +22 -0
  45. package/dist/MenuItem.types.d.ts +20 -0
  46. package/dist/MenuItem.types.js +1 -0
  47. package/dist/MenuItem.utils.d.ts +7 -0
  48. package/dist/MenuItem.utils.js +36 -0
  49. package/dist/MenuSeparator.svelte +11 -0
  50. package/dist/MenuSeparator.svelte.d.ts +5 -0
  51. package/dist/Pagination.svelte +267 -0
  52. package/dist/Pagination.svelte.d.ts +4 -0
  53. package/dist/Pagination.types.d.ts +24 -0
  54. package/dist/Pagination.types.js +1 -0
  55. package/dist/Popover.constants.d.ts +1 -0
  56. package/dist/Popover.constants.js +14 -0
  57. package/dist/Popover.svelte +175 -0
  58. package/dist/Popover.svelte.d.ts +14 -0
  59. package/dist/Popover.types.d.ts +4 -0
  60. package/dist/Popover.types.js +1 -0
  61. package/dist/Portal.constants.d.ts +2 -0
  62. package/dist/Portal.constants.js +2 -0
  63. package/dist/Portal.types.d.ts +3 -0
  64. package/dist/Portal.types.js +1 -0
  65. package/dist/Progress.constants.d.ts +1 -0
  66. package/dist/Progress.constants.js +1 -0
  67. package/dist/Progress.svelte +61 -0
  68. package/dist/Progress.svelte.d.ts +11 -0
  69. package/dist/Progress.types.d.ts +4 -0
  70. package/dist/Progress.types.js +1 -0
  71. package/dist/Radio.svelte +65 -0
  72. package/dist/Radio.svelte.d.ts +12 -0
  73. package/dist/Select.svelte +262 -0
  74. package/dist/Select.svelte.d.ts +26 -0
  75. package/dist/Slider.svelte +182 -0
  76. package/dist/Slider.svelte.d.ts +18 -0
  77. package/dist/Switch.svelte +92 -0
  78. package/dist/Switch.svelte.d.ts +21 -0
  79. package/dist/Tab.svelte +66 -0
  80. package/dist/Tab.svelte.d.ts +11 -0
  81. package/dist/TabList.constants.d.ts +1 -0
  82. package/dist/TabList.constants.js +1 -0
  83. package/dist/TabList.svelte +253 -0
  84. package/dist/TabList.svelte.d.ts +17 -0
  85. package/dist/TabList.types.d.ts +5 -0
  86. package/dist/TabList.types.js +1 -0
  87. package/dist/TextArea.constants.d.ts +1 -0
  88. package/dist/TextArea.constants.js +1 -0
  89. package/dist/TextArea.svelte +116 -0
  90. package/dist/TextArea.svelte.d.ts +18 -0
  91. package/dist/TextArea.types.d.ts +4 -0
  92. package/dist/TextArea.types.js +1 -0
  93. package/dist/Tooltip.svelte +95 -0
  94. package/dist/Tooltip.svelte.d.ts +10 -0
  95. package/dist/Tree.constants.d.ts +1 -0
  96. package/dist/Tree.constants.js +1 -0
  97. package/dist/Tree.svelte +81 -0
  98. package/dist/Tree.svelte.d.ts +14 -0
  99. package/dist/Tree.types.d.ts +5 -0
  100. package/dist/Tree.types.js +1 -0
  101. package/dist/TreeChevron.svelte +39 -0
  102. package/dist/TreeChevron.svelte.d.ts +8 -0
  103. package/dist/TreeItem.constants.d.ts +1 -0
  104. package/dist/TreeItem.constants.js +1 -0
  105. package/dist/TreeItem.svelte +396 -0
  106. package/dist/TreeItem.svelte.d.ts +22 -0
  107. package/dist/TreeItem.types.d.ts +4 -0
  108. package/dist/TreeItem.types.js +1 -0
  109. package/dist/actions/applyLightDarkMode.d.ts +11 -0
  110. package/dist/actions/applyLightDarkMode.js +37 -0
  111. package/dist/actions/clickOutside.d.ts +15 -0
  112. package/dist/actions/clickOutside.js +28 -0
  113. package/dist/actions/colorScheme.d.ts +8 -0
  114. package/dist/actions/colorScheme.js +26 -0
  115. package/dist/actions/extraClass.d.ts +9 -0
  116. package/dist/actions/extraClass.js +15 -0
  117. package/dist/actions/forwardEvents.d.ts +12 -0
  118. package/dist/actions/forwardEvents.js +32 -0
  119. package/dist/actions/portal.d.ts +8 -0
  120. package/dist/actions/portal.js +19 -0
  121. package/dist/actions/trapKeyboardFocus.d.ts +3 -0
  122. package/dist/actions/trapKeyboardFocus.js +52 -0
  123. package/dist/idGenerator.d.ts +5 -0
  124. package/dist/idGenerator.js +11 -0
  125. package/dist/index.d.ts +61 -0
  126. package/dist/index.js +56 -0
  127. package/dist/mediaQueries/prefersColorSchemeDark.d.ts +1 -0
  128. package/dist/mediaQueries/prefersColorSchemeDark.js +14 -0
  129. package/dist/mediaQueries/prefersReducedMotion.d.ts +1 -0
  130. package/dist/mediaQueries/prefersReducedMotion.js +14 -0
  131. package/dist/mediaQueries/usingKeyboard.d.ts +1 -0
  132. package/dist/mediaQueries/usingKeyboard.js +17 -0
  133. package/package.json +17 -13
@@ -0,0 +1,66 @@
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">
4
+ import { getContext } from 'svelte';
5
+ import type { HTMLButtonAttributes } from 'svelte/elements';
6
+ import { TAB_LIST_CONTEXT_KEY } from './TabList.constants';
7
+ import type { TabListContext } from './TabList.types';
8
+ import { usingKeyboard } from './mediaQueries/usingKeyboard';
9
+
10
+ type Props = HTMLButtonAttributes & {
11
+ value: string;
12
+ };
13
+
14
+ let { children, class: _class, disabled = false, value, ...rest }: Props = $props();
15
+
16
+ let tabRef: HTMLButtonElement;
17
+
18
+ const tabListContext = getContext<TabListContext>(TAB_LIST_CONTEXT_KEY);
19
+
20
+ let selected = $state(tabListContext.selectedValue === value);
21
+
22
+ let _disabled = $derived(tabListContext.disabled || disabled);
23
+
24
+ // Using $derived would be preferred, but this helps avoid
25
+ // updates to every tab when selectedValue changes.
26
+ // let selected = $derived(tabContext.selectedValue === value);
27
+ $effect(() => {
28
+ if (tabListContext.selectedValue === value && !selected) {
29
+ selected = true;
30
+ } else if (tabListContext.selectedValue !== value && selected) {
31
+ selected = false;
32
+ }
33
+ });
34
+
35
+ export const click = () => {
36
+ tabRef?.click();
37
+ };
38
+
39
+ export const blur = () => {
40
+ tabRef?.blur();
41
+ };
42
+
43
+ export const focus = (options?: FocusOptions) => {
44
+ tabRef?.focus(options);
45
+ };
46
+ </script>
47
+
48
+ <button
49
+ bind:this={tabRef}
50
+ aria-selected={selected}
51
+ class={['sterling-tab', _class]}
52
+ class:selected
53
+ class:using-keyboard={$usingKeyboard}
54
+ class:vertical={tabListContext.vertical}
55
+ data-value={value}
56
+ disabled={_disabled}
57
+ role="tab"
58
+ type="button"
59
+ tabIndex={selected ? 0 : -1}
60
+ {...rest}
61
+ >
62
+ <div class="content">
63
+ {@render children?.()}
64
+ </div>
65
+ <div class="indicator"></div>
66
+ </button>
@@ -0,0 +1,11 @@
1
+ import type { HTMLButtonAttributes } from 'svelte/elements';
2
+ type Props = HTMLButtonAttributes & {
3
+ value: string;
4
+ };
5
+ declare const Tab: import("svelte").Component<Props, {
6
+ click: () => void;
7
+ blur: () => void;
8
+ focus: (options?: FocusOptions) => void;
9
+ }, "">;
10
+ type Tab = ReturnType<typeof Tab>;
11
+ export default Tab;
@@ -0,0 +1 @@
1
+ export declare const TAB_LIST_CONTEXT_KEY = "sterlingTabList";
@@ -0,0 +1 @@
1
+ export const TAB_LIST_CONTEXT_KEY = 'sterlingTabList';
@@ -0,0 +1,253 @@
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">
4
+ import { setContext } from 'svelte';
5
+ import type { HTMLAttributes, KeyboardEventHandler, MouseEventHandler } from 'svelte/elements';
6
+ import { TAB_LIST_CONTEXT_KEY } from './TabList.constants';
7
+ import type { TabListContext } from './TabList.types';
8
+
9
+ type Props = HTMLAttributes<HTMLDivElement> & {
10
+ disabled?: boolean | null;
11
+ selectedValue?: string;
12
+ vertical?: boolean | null;
13
+ onSelect?: (value?: string) => void;
14
+ };
15
+
16
+ let {
17
+ children,
18
+ class: _class,
19
+ disabled = false,
20
+ onSelect,
21
+ selectedValue = $bindable(),
22
+ vertical = false,
23
+ ...rest
24
+ }: Props = $props();
25
+
26
+ let tabListRef: HTMLDivElement;
27
+ let lastSelectedTabRef: HTMLElement;
28
+
29
+ let tabListContext: TabListContext = {
30
+ get disabled() {
31
+ return disabled;
32
+ },
33
+ set disabled(value) {
34
+ disabled = value;
35
+ },
36
+ get selectedValue() {
37
+ return selectedValue;
38
+ },
39
+ set selectedValue(value) {
40
+ selectedValue = value;
41
+ },
42
+ get vertical() {
43
+ return vertical;
44
+ },
45
+ set vertical(value) {
46
+ vertical = value;
47
+ }
48
+ };
49
+
50
+ $effect(() => {
51
+ tabListContext.disabled = disabled;
52
+ });
53
+
54
+ $effect(() => {
55
+ tabListContext.selectedValue = selectedValue;
56
+ });
57
+
58
+ $effect(() => {
59
+ tabListContext.vertical = vertical;
60
+ });
61
+
62
+ setContext<TabListContext>(TAB_LIST_CONTEXT_KEY, tabListContext);
63
+
64
+ $effect(() => {
65
+ onSelect?.(selectedValue);
66
+ });
67
+
68
+ export const blur = () => {
69
+ tabListRef?.blur();
70
+ };
71
+
72
+ export const focus = (options?: FocusOptions) => {
73
+ let selectedItem = getSelectedTabElement();
74
+ if (selectedValue && selectedItem) {
75
+ selectTab(selectedValue, selectedItem as HTMLElement);
76
+ } else {
77
+ selectFirstTab();
78
+ }
79
+ };
80
+
81
+ const isElementTab = (candidate: Element) => {
82
+ return (
83
+ candidate &&
84
+ candidate.getAttribute('data-value') !== null &&
85
+ candidate.getAttribute('data-value') !== undefined &&
86
+ candidate.getAttribute('role') === 'tab'
87
+ );
88
+ };
89
+
90
+ const getSelectedTabElement = () => {
91
+ if (
92
+ isElementTab(lastSelectedTabRef) &&
93
+ lastSelectedTabRef?.getAttribute('data-value') === selectedValue &&
94
+ lastSelectedTabRef?.closest('[role="tablist"]') === tabListRef
95
+ ) {
96
+ return lastSelectedTabRef;
97
+ } else {
98
+ return tabListRef?.querySelector('[data-value][aria-selected=true]');
99
+ }
100
+ };
101
+
102
+ const selectTab = (value: string, element: HTMLElement) => {
103
+ selectedValue = value;
104
+ lastSelectedTabRef = element;
105
+ element.scrollIntoView({ block: 'nearest', inline: 'nearest' });
106
+ element.focus();
107
+ };
108
+
109
+ export const selectFirstTab = () => {
110
+ let candidate: Element | undefined | null = tabListRef?.firstElementChild;
111
+ while (candidate && !isElementTab(candidate)) {
112
+ candidate = candidate.nextElementSibling;
113
+ }
114
+ let candidateValue = candidate?.getAttribute('data-value');
115
+
116
+ if (candidateValue && candidate) {
117
+ selectTab(candidateValue, candidate as HTMLElement);
118
+ return true;
119
+ }
120
+
121
+ return false;
122
+ };
123
+
124
+ export const selectPreviousTab = () => {
125
+ let selectedTab = getSelectedTabElement();
126
+ let candidate = selectedTab?.previousElementSibling;
127
+ while (candidate && !isElementTab(candidate)) {
128
+ candidate = candidate.previousElementSibling;
129
+ }
130
+ let candidateValue = candidate?.getAttribute('data-value');
131
+
132
+ if (candidateValue && candidate) {
133
+ selectTab(candidateValue, candidate as HTMLElement);
134
+ return true;
135
+ }
136
+
137
+ return false;
138
+ };
139
+
140
+ export const selectNextTab = () => {
141
+ let selectedTab = getSelectedTabElement();
142
+ let candidate = selectedTab?.nextElementSibling;
143
+ while (candidate && !isElementTab(candidate)) {
144
+ candidate = candidate.nextElementSibling;
145
+ }
146
+ let candidateValue = candidate?.getAttribute('data-value');
147
+
148
+ if (candidateValue && candidate) {
149
+ selectTab(candidateValue, candidate as HTMLElement);
150
+ return true;
151
+ }
152
+
153
+ return false;
154
+ };
155
+
156
+ export const selectLastTab = () => {
157
+ let candidate: Element | undefined | null = tabListRef?.lastElementChild;
158
+ while (candidate && !isElementTab(candidate)) {
159
+ candidate = candidate.previousElementSibling;
160
+ }
161
+ let candidateValue = candidate?.getAttribute('data-value');
162
+
163
+ if (candidateValue && candidate) {
164
+ selectTab(candidateValue, candidate as HTMLElement);
165
+ return true;
166
+ }
167
+
168
+ return false;
169
+ };
170
+
171
+ const onClick: MouseEventHandler<HTMLDivElement> = (event) => {
172
+ if (!disabled) {
173
+ let candidate: HTMLElement | null | undefined = event.target as HTMLElement;
174
+ let candidateValue: string | null | undefined = candidate?.getAttribute('data-value');
175
+
176
+ if (candidateValue === undefined || candidateValue === null) {
177
+ candidate = candidate?.closest<HTMLElement>('[role=tab]');
178
+ candidateValue = candidate?.getAttribute('data-value');
179
+ }
180
+
181
+ if (candidateValue && candidate) {
182
+ selectTab(candidateValue, candidate);
183
+ }
184
+ }
185
+
186
+ rest.onclick?.(event);
187
+ };
188
+
189
+ const onKeydown: KeyboardEventHandler<HTMLDivElement> = (event) => {
190
+ // if using arrows, only move when there are no modifier keys
191
+ if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
192
+ switch (event.key) {
193
+ case 'Home':
194
+ selectFirstTab();
195
+ event.preventDefault();
196
+ event.stopPropagation();
197
+ break;
198
+ case 'End':
199
+ selectLastTab();
200
+ event.preventDefault();
201
+ event.stopPropagation();
202
+ break;
203
+ case 'ArrowLeft':
204
+ if (!vertical) {
205
+ selectPreviousTab();
206
+ }
207
+ event.preventDefault();
208
+ event.stopPropagation();
209
+ break;
210
+ case 'ArrowRight':
211
+ if (!vertical) {
212
+ selectNextTab();
213
+ }
214
+ event.preventDefault();
215
+ event.stopPropagation();
216
+ break;
217
+ case 'ArrowUp':
218
+ if (vertical) {
219
+ selectPreviousTab();
220
+ }
221
+ event.preventDefault();
222
+ event.stopPropagation();
223
+ break;
224
+ case 'ArrowDown':
225
+ if (vertical) {
226
+ selectNextTab();
227
+ }
228
+ event.preventDefault();
229
+ event.stopPropagation();
230
+ break;
231
+ default:
232
+ break;
233
+ }
234
+ }
235
+
236
+ rest.onkeydown?.(event);
237
+ };
238
+ </script>
239
+
240
+ <div
241
+ aria-orientation={vertical ? 'vertical' : 'horizontal'}
242
+ bind:this={tabListRef}
243
+ class={['sterling-tab-list', _class]}
244
+ class:disabled
245
+ class:vertical
246
+ role="tablist"
247
+ tabindex="-1"
248
+ onclick={onClick}
249
+ onkeydown={onKeydown}
250
+ {...rest}
251
+ >
252
+ {@render children?.()}
253
+ </div>
@@ -0,0 +1,17 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ type Props = HTMLAttributes<HTMLDivElement> & {
3
+ disabled?: boolean | null;
4
+ selectedValue?: string;
5
+ vertical?: boolean | null;
6
+ onSelect?: (value?: string) => void;
7
+ };
8
+ declare const TabList: import("svelte").Component<Props, {
9
+ blur: () => void;
10
+ focus: (options?: FocusOptions) => void;
11
+ selectFirstTab: () => boolean;
12
+ selectPreviousTab: () => boolean;
13
+ selectNextTab: () => boolean;
14
+ selectLastTab: () => boolean;
15
+ }, "selectedValue">;
16
+ type TabList = ReturnType<typeof TabList>;
17
+ export default TabList;
@@ -0,0 +1,5 @@
1
+ export type TabListContext = {
2
+ disabled?: boolean | null | undefined;
3
+ selectedValue?: string | undefined;
4
+ vertical?: boolean | null | undefined;
5
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const TEXT_AREA_RESIZES: readonly ["none", "horizontal", "vertical", "both"];
@@ -0,0 +1 @@
1
+ export const TEXT_AREA_RESIZES = ['none', 'horizontal', 'vertical', 'both'];
@@ -0,0 +1,116 @@
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">
4
+ import { tick } from 'svelte';
5
+ import type { FormEventHandler, HTMLTextareaAttributes } from 'svelte/elements';
6
+ import type { TextAreaResize } from './TextArea.types';
7
+
8
+ type Props = HTMLTextareaAttributes & {
9
+ autoHeight?: boolean | null | undefined;
10
+ disabled?: boolean | null | undefined;
11
+ value?: string;
12
+ resize?: TextAreaResize;
13
+ };
14
+
15
+ let {
16
+ class: _class,
17
+ disabled = false,
18
+ value = $bindable(''),
19
+ autoHeight = false,
20
+ resize = $bindable('none'),
21
+ style,
22
+ ...rest
23
+ }: Props = $props();
24
+
25
+ let textAreaRef: HTMLTextAreaElement;
26
+
27
+ const correctResize = async () => {
28
+ await tick();
29
+ setTimeout(() => {
30
+ if (autoHeight) {
31
+ if (resize === 'both') {
32
+ console.warn(
33
+ 'The resize property cannot be set to "both" when autoHeight is true. The resize property will be set to "horizontal".'
34
+ );
35
+ resize = 'horizontal';
36
+ }
37
+ if (resize === 'vertical') {
38
+ console.warn(
39
+ 'The resize property cannot be set to "vertical" when autoHeight is true. The resize property will be set to "none".'
40
+ );
41
+ resize = 'none';
42
+ }
43
+ }
44
+ }, 0);
45
+ };
46
+
47
+ const autoSetHeight = () => {
48
+ if (autoHeight && textAreaRef) {
49
+ // the style must be directly set to avoid re-rendering looping latency
50
+ // setting to auto for a moment allows the textarea to shrink
51
+ textAreaRef.style.height = 'auto';
52
+ textAreaRef.style.height = `${textAreaRef.scrollHeight}px`;
53
+ }
54
+ };
55
+
56
+ $effect(() => {
57
+ autoHeight;
58
+ resize;
59
+ correctResize();
60
+ autoSetHeight();
61
+ });
62
+
63
+ const onInput: FormEventHandler<HTMLTextAreaElement> = (event) => {
64
+ autoSetHeight();
65
+ rest.oninput?.(event);
66
+ };
67
+
68
+ export const blur = () => {
69
+ textAreaRef?.blur();
70
+ };
71
+
72
+ export const click = () => {
73
+ textAreaRef?.click();
74
+ };
75
+
76
+ export const focus = (options?: FocusOptions) => {
77
+ textAreaRef?.focus();
78
+ };
79
+
80
+ export const select = () => {
81
+ textAreaRef?.select();
82
+ };
83
+
84
+ export const setSelectionRange = (
85
+ start: number | null,
86
+ end: number | null,
87
+ direction?: 'forward' | 'backward' | 'none'
88
+ ) => {
89
+ textAreaRef?.setSelectionRange(start, end, direction);
90
+ };
91
+
92
+ export const setRangeText = (
93
+ replacement: string,
94
+ start?: number,
95
+ end?: number,
96
+ selectionMode?: SelectionMode
97
+ ) => {
98
+ if (start && end) {
99
+ textAreaRef?.setRangeText(replacement, start, end, selectionMode);
100
+ } else {
101
+ textAreaRef?.setRangeText(replacement);
102
+ }
103
+ };
104
+ </script>
105
+
106
+ <div class={['sterling-text-area', _class]} class:disabled>
107
+ <textarea
108
+ bind:this={textAreaRef}
109
+ bind:value
110
+ {disabled}
111
+ rows="1"
112
+ {...rest}
113
+ oninput={onInput}
114
+ style={`--TextArea__resize: ${resize};${style}`}
115
+ ></textarea>
116
+ </div>
@@ -0,0 +1,18 @@
1
+ import type { HTMLTextareaAttributes } from 'svelte/elements';
2
+ import type { TextAreaResize } from './TextArea.types';
3
+ type Props = HTMLTextareaAttributes & {
4
+ autoHeight?: boolean | null | undefined;
5
+ disabled?: boolean | null | undefined;
6
+ value?: string;
7
+ resize?: TextAreaResize;
8
+ };
9
+ declare const TextArea: import("svelte").Component<Props, {
10
+ blur: () => void;
11
+ click: () => void;
12
+ focus: (options?: FocusOptions) => void;
13
+ select: () => void;
14
+ setSelectionRange: (start: number | null, end: number | null, direction?: "forward" | "backward" | "none") => void;
15
+ setRangeText: (replacement: string, start?: number, end?: number, selectionMode?: SelectionMode) => void;
16
+ }, "value" | "resize">;
17
+ type TextArea = ReturnType<typeof TextArea>;
18
+ export default TextArea;
@@ -0,0 +1,4 @@
1
+ import type { TEXT_AREA_RESIZES } from './TextArea.constants';
2
+ type TextAreaResizeTuple = typeof TEXT_AREA_RESIZES;
3
+ export type TextAreaResize = TextAreaResizeTuple[number];
4
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,95 @@
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">
4
+ import { onMount, type Snippet } from 'svelte';
5
+ import Callout from './Callout.svelte';
6
+ import type { CalloutProps } from './Callout.types';
7
+
8
+ type Props = Omit<CalloutProps, 'reference'> & {
9
+ disabled?: boolean;
10
+ hoverDelayMilliseconds?: number;
11
+ tip?: string | Snippet;
12
+ };
13
+
14
+ let {
15
+ children,
16
+ class: _class,
17
+ disabled = false,
18
+ hoverDelayMilliseconds = 1000,
19
+ open = $bindable(false),
20
+ tip,
21
+ ...rest
22
+ }: Props = $props();
23
+
24
+ let originRef: HTMLDivElement | undefined = $state();
25
+
26
+ let reference = $derived(
27
+ !!children ? (originRef?.previousElementSibling as HTMLElement) : undefined
28
+ );
29
+
30
+ const show = () => {
31
+ if (!disabled) {
32
+ open = true;
33
+ }
34
+ };
35
+
36
+ const hide = () => (open = false);
37
+
38
+ const delayShow = () => {
39
+ hoverDelayMilliseconds === 0
40
+ ? show()
41
+ : setTimeout(() => {
42
+ show();
43
+ }, hoverDelayMilliseconds);
44
+ };
45
+
46
+ $effect(() => {
47
+ if (disabled) {
48
+ hide();
49
+ }
50
+ });
51
+
52
+ // ----- Event Listeners ----- //
53
+
54
+ let cleanupAutoShowUpdate = () => {};
55
+
56
+ const autoShowUpdate = () => {
57
+ cleanupAutoShowUpdate();
58
+ cleanupAutoShowUpdate = () => {};
59
+
60
+ const element = reference;
61
+ open = false;
62
+
63
+ if (element) {
64
+ element.addEventListener('mouseenter', delayShow);
65
+ element.addEventListener('mouseleave', hide);
66
+ cleanupAutoShowUpdate = () => {
67
+ element.removeEventListener('mouseenter', delayShow);
68
+ element.removeEventListener('mouseleave', hide);
69
+ };
70
+ }
71
+ };
72
+
73
+ $effect(() => {
74
+ reference;
75
+ autoShowUpdate();
76
+ });
77
+
78
+ // ----- EventHandlers ----- //
79
+
80
+ onMount(() => {
81
+ autoShowUpdate();
82
+ });
83
+ </script>
84
+
85
+ {@render children?.()}
86
+ <div class={['sterling-tooltip-origin', _class]} bind:this={originRef}></div>
87
+ <Callout class={['sterling-tooltip-callout', _class]} {open} {reference} {...rest}>
88
+ {#if tip}
89
+ {#if typeof tip === 'string'}
90
+ {tip}
91
+ {:else}
92
+ {@render tip()}
93
+ {/if}
94
+ {/if}
95
+ </Callout>
@@ -0,0 +1,10 @@
1
+ import { type Snippet } from 'svelte';
2
+ import type { CalloutProps } from './Callout.types';
3
+ type Props = Omit<CalloutProps, 'reference'> & {
4
+ disabled?: boolean;
5
+ hoverDelayMilliseconds?: number;
6
+ tip?: string | Snippet;
7
+ };
8
+ declare const Tooltip: import("svelte").Component<Props, {}, "open">;
9
+ type Tooltip = ReturnType<typeof Tooltip>;
10
+ export default Tooltip;
@@ -0,0 +1 @@
1
+ export declare const TREE_CONTEXT_KEY = "sterlingTree";
@@ -0,0 +1 @@
1
+ export const TREE_CONTEXT_KEY = 'sterlingTree';