@geoffcox/sterling-svelte 1.0.12 → 2.0.1

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 (219) hide show
  1. package/dist/Button.svelte +8 -46
  2. package/dist/Button.svelte.d.ts +9 -65
  3. package/dist/Callout.svelte +47 -72
  4. package/dist/Callout.svelte.d.ts +14 -55
  5. package/dist/Callout.types.d.ts +11 -0
  6. package/dist/Checkbox.svelte +12 -48
  7. package/dist/Checkbox.svelte.d.ts +9 -62
  8. package/dist/Dialog.svelte +30 -38
  9. package/dist/Dialog.svelte.d.ts +13 -36
  10. package/dist/Dropdown.svelte +39 -71
  11. package/dist/Dropdown.svelte.d.ts +17 -76
  12. package/dist/Input.svelte +16 -50
  13. package/dist/Input.svelte.d.ts +12 -74
  14. package/dist/Label.svelte +55 -161
  15. package/dist/Label.svelte.d.ts +16 -81
  16. package/dist/Link.svelte +9 -41
  17. package/dist/Link.svelte.d.ts +11 -64
  18. package/dist/List.svelte +35 -85
  19. package/dist/List.svelte.d.ts +19 -74
  20. package/dist/List.types.d.ts +3 -11
  21. package/dist/ListItem.svelte +27 -56
  22. package/dist/ListItem.svelte.d.ts +12 -66
  23. package/dist/Menu.svelte +18 -45
  24. package/dist/Menu.svelte.d.ts +13 -63
  25. package/dist/MenuBar.svelte +36 -78
  26. package/dist/MenuBar.svelte.d.ts +12 -57
  27. package/dist/MenuButton.svelte +56 -85
  28. package/dist/MenuButton.svelte.d.ts +19 -70
  29. package/dist/MenuItem.svelte +107 -151
  30. package/dist/MenuItem.svelte.d.ts +21 -82
  31. package/dist/MenuItem.types.d.ts +1 -9
  32. package/dist/MenuSeparator.svelte +9 -7
  33. package/dist/MenuSeparator.svelte.d.ts +6 -20
  34. package/dist/Popover.svelte +45 -64
  35. package/dist/Popover.svelte.d.ts +14 -58
  36. package/dist/Progress.constants.d.ts +1 -1
  37. package/dist/Progress.constants.js +1 -1
  38. package/dist/Progress.svelte +24 -71
  39. package/dist/Progress.svelte.d.ts +11 -60
  40. package/dist/Progress.types.d.ts +3 -3
  41. package/dist/Radio.svelte +19 -92
  42. package/dist/Radio.svelte.d.ts +11 -63
  43. package/dist/Select.svelte +55 -94
  44. package/dist/Select.svelte.d.ts +19 -82
  45. package/dist/Slider.svelte +41 -98
  46. package/dist/Slider.svelte.d.ts +18 -65
  47. package/dist/Switch.svelte +29 -78
  48. package/dist/Switch.svelte.d.ts +20 -73
  49. package/dist/Tab.svelte +23 -66
  50. package/dist/Tab.svelte.d.ts +11 -70
  51. package/dist/TabList.svelte +50 -76
  52. package/dist/TabList.svelte.d.ts +17 -69
  53. package/dist/TabList.types.d.ts +3 -11
  54. package/dist/TextArea.svelte +17 -59
  55. package/dist/TextArea.svelte.d.ts +18 -68
  56. package/dist/Tooltip.svelte +23 -66
  57. package/dist/Tooltip.svelte.d.ts +9 -69
  58. package/dist/Tree.svelte +32 -83
  59. package/dist/Tree.svelte.d.ts +14 -66
  60. package/dist/Tree.types.d.ts +3 -11
  61. package/dist/TreeChevron.svelte +10 -49
  62. package/dist/TreeChevron.svelte.d.ts +8 -52
  63. package/dist/TreeItem.svelte +105 -159
  64. package/dist/TreeItem.svelte.d.ts +21 -100
  65. package/dist/TreeItem.types.d.ts +2 -12
  66. package/dist/actions/clickOutside.d.ts +1 -0
  67. package/dist/actions/clickOutside.js +1 -0
  68. package/dist/actions/extraClass.d.ts +8 -0
  69. package/dist/actions/extraClass.js +14 -0
  70. package/dist/index.d.ts +4 -12
  71. package/dist/index.js +3 -9
  72. package/package.json +20 -22
  73. package/dist/Button.constants.d.ts +0 -2
  74. package/dist/Button.constants.js +0 -2
  75. package/dist/Button.types.d.ts +0 -6
  76. package/dist/ColorPicker.constants.d.ts +0 -1
  77. package/dist/ColorPicker.constants.js +0 -1
  78. package/dist/ColorPicker.svelte +0 -287
  79. package/dist/ColorPicker.svelte.d.ts +0 -52
  80. package/dist/ColorPicker.types.d.ts +0 -4
  81. package/dist/ColorPicker.types.js +0 -1
  82. package/dist/HexColorSliders.svelte +0 -103
  83. package/dist/HexColorSliders.svelte.d.ts +0 -51
  84. package/dist/HslColorSliders.svelte +0 -128
  85. package/dist/HslColorSliders.svelte.d.ts +0 -51
  86. package/dist/Label.types.d.ts +0 -6
  87. package/dist/Label.types.js +0 -1
  88. package/dist/MenuItemDisplay.svelte +0 -32
  89. package/dist/MenuItemDisplay.svelte.d.ts +0 -39
  90. package/dist/RgbColorSliders.svelte +0 -93
  91. package/dist/RgbColorSliders.svelte.d.ts +0 -24
  92. package/dist/TreeItemDisplay.svelte +0 -74
  93. package/dist/TreeItemDisplay.svelte.d.ts +0 -73
  94. package/dist/css/Button.base.css +0 -54
  95. package/dist/css/Button.colorful.css +0 -17
  96. package/dist/css/Button.css +0 -8
  97. package/dist/css/Button.disabled.css +0 -22
  98. package/dist/css/Button.secondary.colorful.css +0 -15
  99. package/dist/css/Button.secondary.css +0 -11
  100. package/dist/css/Button.shapes.css +0 -14
  101. package/dist/css/Button.tool.colorful.css +0 -13
  102. package/dist/css/Button.tool.css +0 -18
  103. package/dist/css/Callout.base.css +0 -55
  104. package/dist/css/Callout.colorful.css +0 -5
  105. package/dist/css/Callout.css +0 -2
  106. package/dist/css/Checkbox.base.css +0 -121
  107. package/dist/css/Checkbox.colorful.css +0 -17
  108. package/dist/css/Checkbox.css +0 -3
  109. package/dist/css/Checkbox.disabled.css +0 -28
  110. package/dist/css/ColorPicker.base.css +0 -23
  111. package/dist/css/ColorPicker.css +0 -1
  112. package/dist/css/Dialog.base.css +0 -114
  113. package/dist/css/Dialog.css +0 -1
  114. package/dist/css/Dropdown.base.css +0 -105
  115. package/dist/css/Dropdown.colorful.css +0 -23
  116. package/dist/css/Dropdown.composed.css +0 -11
  117. package/dist/css/Dropdown.css +0 -4
  118. package/dist/css/Dropdown.disabled.css +0 -32
  119. package/dist/css/HexColorSliders.base.css +0 -87
  120. package/dist/css/HexColorSliders.css +0 -1
  121. package/dist/css/HslColorSliders.base.css +0 -105
  122. package/dist/css/HslColorSliders.css +0 -1
  123. package/dist/css/Input.base.css +0 -72
  124. package/dist/css/Input.colorful.css +0 -22
  125. package/dist/css/Input.composed.css +0 -12
  126. package/dist/css/Input.css +0 -4
  127. package/dist/css/Input.disabled.css +0 -24
  128. package/dist/css/Label.base.css +0 -114
  129. package/dist/css/Label.boxed.colorful.css +0 -21
  130. package/dist/css/Label.boxed.css +0 -31
  131. package/dist/css/Label.colorful.css +0 -3
  132. package/dist/css/Label.css +0 -5
  133. package/dist/css/Label.disabled.css +0 -9
  134. package/dist/css/Link.base.css +0 -43
  135. package/dist/css/Link.colorful.css +0 -15
  136. package/dist/css/Link.css +0 -11
  137. package/dist/css/Link.disabled.css +0 -10
  138. package/dist/css/Link.ghost.colorful.css +0 -7
  139. package/dist/css/Link.ghost.css +0 -11
  140. package/dist/css/Link.text-underline.css +0 -8
  141. package/dist/css/Link.text-underline.ghost.css +0 -13
  142. package/dist/css/Link.undecorated.colorful.css +0 -8
  143. package/dist/css/Link.undecorated.css +0 -8
  144. package/dist/css/Link.undecorated.ghost.css +0 -8
  145. package/dist/css/Link.undecorated.underline.css +0 -8
  146. package/dist/css/List.base.css +0 -84
  147. package/dist/css/List.composed.css +0 -8
  148. package/dist/css/List.css +0 -3
  149. package/dist/css/List.disabled.css +0 -7
  150. package/dist/css/ListItem.base.css +0 -33
  151. package/dist/css/ListItem.css +0 -2
  152. package/dist/css/ListItem.disabled.css +0 -28
  153. package/dist/css/Menu.base.css +0 -21
  154. package/dist/css/Menu.css +0 -1
  155. package/dist/css/MenuBar.base.css +0 -9
  156. package/dist/css/MenuBar.css +0 -1
  157. package/dist/css/MenuButton.base.css +0 -13
  158. package/dist/css/MenuButton.css +0 -1
  159. package/dist/css/MenuItem.base.css +0 -48
  160. package/dist/css/MenuItem.css +0 -1
  161. package/dist/css/MenuItemDisplay.base.css +0 -79
  162. package/dist/css/MenuItemDisplay.css +0 -2
  163. package/dist/css/MenuItemDisplay.disabled.css +0 -28
  164. package/dist/css/MenuSeparator.base.css +0 -5
  165. package/dist/css/MenuSeparator.css +0 -1
  166. package/dist/css/Popover.css +0 -21
  167. package/dist/css/Progress.base.css +0 -85
  168. package/dist/css/Progress.css +0 -2
  169. package/dist/css/Progress.disabled.css +0 -17
  170. package/dist/css/Radio.base.css +0 -109
  171. package/dist/css/Radio.colorful.css +0 -18
  172. package/dist/css/Radio.css +0 -3
  173. package/dist/css/Radio.disabled.css +0 -28
  174. package/dist/css/RgbColorSliders.base.css +0 -94
  175. package/dist/css/RgbColorSliders.css +0 -1
  176. package/dist/css/Select.base.css +0 -101
  177. package/dist/css/Select.colorful.css +0 -24
  178. package/dist/css/Select.composed.css +0 -12
  179. package/dist/css/Select.css +0 -4
  180. package/dist/css/Select.disabled.css +0 -28
  181. package/dist/css/Slider.base.css +0 -152
  182. package/dist/css/Slider.colorful.css +0 -11
  183. package/dist/css/Slider.composed.css +0 -8
  184. package/dist/css/Slider.css +0 -4
  185. package/dist/css/Slider.disabled.css +0 -30
  186. package/dist/css/Switch.base.css +0 -175
  187. package/dist/css/Switch.colorful.css +0 -45
  188. package/dist/css/Switch.css +0 -3
  189. package/dist/css/Switch.disabled.css +0 -30
  190. package/dist/css/Tab.base.css +0 -96
  191. package/dist/css/Tab.colorful.css +0 -13
  192. package/dist/css/Tab.css +0 -3
  193. package/dist/css/Tab.disabled.css +0 -36
  194. package/dist/css/TabList.base.css +0 -34
  195. package/dist/css/TabList.css +0 -1
  196. package/dist/css/TextArea.base.css +0 -62
  197. package/dist/css/TextArea.colorful.css +0 -17
  198. package/dist/css/TextArea.composed.css +0 -8
  199. package/dist/css/TextArea.css +0 -4
  200. package/dist/css/TextArea.disabled.css +0 -28
  201. package/dist/css/Tooltip.base.css +0 -6
  202. package/dist/css/Tooltip.css +0 -1
  203. package/dist/css/Tree.base.css +0 -49
  204. package/dist/css/Tree.composed.css +0 -8
  205. package/dist/css/Tree.css +0 -3
  206. package/dist/css/Tree.disabled.css +0 -27
  207. package/dist/css/TreeChevron.base.css +0 -86
  208. package/dist/css/TreeChevron.css +0 -1
  209. package/dist/css/TreeItem.base.css +0 -3
  210. package/dist/css/TreeItem.css +0 -1
  211. package/dist/css/TreeItemDisplay.base.css +0 -48
  212. package/dist/css/TreeItemDisplay.colorful.css +0 -9
  213. package/dist/css/TreeItemDisplay.css +0 -3
  214. package/dist/css/TreeItemDisplay.disabled.css +0 -28
  215. package/dist/css/dark-mode.css +0 -134
  216. package/dist/css/light-mode.css +0 -134
  217. package/dist/css/sterling.css +0 -37
  218. package/dist/package.json +0 -108
  219. /package/dist/{Button.types.js → Callout.types.js} +0 -0
package/dist/Label.svelte CHANGED
@@ -1,101 +1,34 @@
1
- <script>import { onMount } from 'svelte';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import {} from 'svelte';
2
4
  import Tooltip from './Tooltip.svelte';
3
5
  import { usingKeyboard } from './mediaQueries/usingKeyboard';
4
- // ----- Props ----- //
5
- let htmlFor = undefined;
6
- export { htmlFor as for };
7
- /**
8
- * If true, clicking the label invokes a click on the content.
9
- * Needed only when the label is not associated with the content through containment or the `for`/`id` relationship.
10
- */
11
- export let forwardClick = false;
12
- /** The text to display in the label. Not used if the text slot is filled. */
13
- export let text = undefined;
14
- /** The status message to display. */
15
- export let message = undefined;
16
- /** When true, indicates a value is required. */
17
- export let required = false;
18
- /** The reason the value is required. */
19
- export let requiredReason = 'required';
20
- /** The status of the label. */
21
- export let status = 'none';
22
- /** Additional class names to apply. */
23
- export let variant = '';
24
- /** When true, the label appears above the content. */
25
- export let vertical = true;
6
+ let { children, class: _class, for: _for, forwardClick = false, message, required, requiredIndicator = '*', requiredReason, text, ...rest } = $props();
26
7
  // ----- State ----- //
27
- let labelRef;
28
- let targetDisabled = false;
29
- let targetRef = null;
8
+ let labelRef = $state(null);
9
+ let targetRef = $state(null);
10
+ let requiredRef = $state(null);
30
11
  const findTarget = () => {
31
12
  let candidate = null;
32
- if (htmlFor) {
33
- candidate = labelRef?.querySelector(`[id="${htmlFor}"]`);
13
+ if (_for) {
14
+ candidate = labelRef?.querySelector(`[id="${_for}"]`) || null;
34
15
  }
35
16
  if (!candidate) {
36
- candidate = labelRef?.querySelector('a[href], ' +
37
- 'audio[controls], ' +
38
- 'button, ' +
39
- 'details, ' +
40
- 'div[contenteditable], ' +
41
- 'form, ' +
42
- 'input, ' +
43
- 'select, ' +
44
- 'textarea, ' +
45
- 'video[controls], ' +
46
- '[tabindex]:not([tabindex="-1"])');
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;
47
29
  }
48
30
  targetRef = candidate;
49
31
  };
50
- const isElementDisabled = (element) => {
51
- if (element) {
52
- return (element.getAttribute('aria-disabled') === 'true' ||
53
- element?.matches(':disabled') ||
54
- element?.disabled === true ||
55
- element?.classList.contains('disabled'));
56
- }
57
- return false;
58
- };
59
- $: $$slots.default, labelRef, htmlFor, findTarget();
60
- $: {
61
- targetDisabled = isElementDisabled(targetRef);
62
- }
63
- const mutationCallback = (mutations) => {
64
- let disabled = undefined;
65
- for (let i = 0; i < mutations.length; i++) {
66
- const mutation = mutations[i];
67
- if (mutation.type === 'attributes') {
68
- if (mutation.attributeName === 'aria-disabled' ||
69
- mutation.attributeName === 'disabled' ||
70
- mutation.attributeName === 'class') {
71
- if (isElementDisabled(targetRef)) {
72
- // a mutation caused the target to be disabled
73
- disabled = true;
74
- break;
75
- }
76
- // a mutation caused the target to be enabled
77
- disabled = false;
78
- }
79
- }
80
- }
81
- // if we found a mutation that changed disabled, then set targetDisabled
82
- if (disabled !== undefined) {
83
- targetDisabled = disabled;
84
- }
85
- };
86
- let mutationObserver;
87
- onMount(() => {
88
- mutationObserver = new MutationObserver(mutationCallback);
89
- return () => mutationObserver?.disconnect();
90
- });
91
- $: {
92
- mutationObserver?.disconnect();
93
- if (targetRef) {
94
- mutationObserver?.observe(targetRef, {
95
- attributes: true
96
- });
97
- }
98
- }
99
32
  // ----- Methods ----- //
100
33
  export const click = () => {
101
34
  labelRef?.click();
@@ -107,91 +40,52 @@ export const focus = (options) => {
107
40
  labelRef?.focus(options);
108
41
  };
109
42
  // ----- Event Handlers ----- //
110
- const onClick = () => {
43
+ const onClick = (event) => {
111
44
  if (forwardClick) {
112
45
  targetRef?.click();
113
46
  }
47
+ rest.onclick?.(event);
114
48
  };
115
49
  </script>
116
50
 
117
- <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
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 -->
118
64
  <label
119
65
  bind:this={labelRef}
120
- aria-disabled={targetDisabled}
121
- class={`sterling-label ${variant}`}
122
- class:disabled={targetDisabled}
66
+ class={['sterling-label', _class].filter(Boolean).join(' ')}
123
67
  class:using-keyboard={$usingKeyboard}
124
- class:vertical
125
- for={htmlFor}
126
- on:blur
127
- on:click
128
- on:click={onClick}
129
- on:copy
130
- on:cut
131
- on:dblclick
132
- on:dragend
133
- on:dragenter
134
- on:dragleave
135
- on:dragover
136
- on:dragstart
137
- on:drop
138
- on:focus
139
- on:focusin
140
- on:focusout
141
- on:keydown
142
- on:keypress
143
- on:keyup
144
- on:mousedown
145
- on:mouseenter
146
- on:mouseleave
147
- on:mousemove
148
- on:mouseover
149
- on:mouseout
150
- on:mouseup
151
- on:scroll
152
- on:wheel|passive
153
- on:paste
154
- {...$$restProps}
68
+ for={_for}
69
+ {...rest}
70
+ onclick={onClick}
155
71
  >
156
- {#if text || $$slots.text}
157
- <slot
158
- name="text"
159
- disabled={targetDisabled}
160
- for={htmlFor}
161
- {forwardClick}
162
- {required}
163
- {text}
164
- {variant}
165
- >
166
- <div class="text">
167
- {text}
168
- </div>
169
- </slot>
170
- {/if}
171
- {#if $$slots.default}
72
+ {@render snippetOrText(text, 'text')}
73
+ {#if children}
172
74
  <div class="content">
173
- <slot />
75
+ {@render children()}
174
76
  </div>
175
77
  {/if}
176
- {#if message}
177
- <slot name="message" disabled={targetDisabled} {message} {required} {status} {variant}>
178
- <div
179
- class="message"
180
- class:info={status === 'info'}
181
- class:success={status === 'success'}
182
- class:warning={status === 'warning'}
183
- class:error={status === 'danger'}
184
- >
185
- {message}
186
- </div>
187
- </slot>
188
- {/if}
189
- {#if required}
190
- <slot name="required" {requiredReason} {variant}>
191
- <Tooltip showOn="hover">
192
- <span class="required-reason" slot="tip">{requiredReason}</span>
193
- <div class="required">*</div>
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}
194
86
  </Tooltip>
195
- </slot>
196
- {/if}
87
+ {:else if required}
88
+ {@render snippetOrText(requiredIndicator, 'required')}
89
+ {/if}
90
+ </div>
197
91
  </label>
@@ -1,82 +1,17 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- for?: string | undefined;
6
- forwardClick?: boolean | undefined;
7
- text?: string | undefined;
8
- message?: string | undefined;
9
- required?: boolean | undefined;
10
- requiredReason?: string | undefined;
11
- status?: string | undefined;
12
- variant?: string | undefined;
13
- vertical?: boolean | undefined;
14
- click?: (() => void) | undefined;
15
- blur?: (() => void) | undefined;
16
- focus?: ((options?: FocusOptions) => void) | undefined;
17
- };
18
- events: {
19
- blur: FocusEvent;
20
- click: MouseEvent;
21
- copy: ClipboardEvent;
22
- cut: ClipboardEvent;
23
- dblclick: MouseEvent;
24
- dragend: DragEvent;
25
- dragenter: DragEvent;
26
- dragleave: DragEvent;
27
- dragover: DragEvent;
28
- dragstart: DragEvent;
29
- drop: DragEvent;
30
- focus: FocusEvent;
31
- focusin: FocusEvent;
32
- focusout: FocusEvent;
33
- keydown: KeyboardEvent;
34
- keypress: KeyboardEvent;
35
- keyup: KeyboardEvent;
36
- mousedown: MouseEvent;
37
- mouseenter: MouseEvent;
38
- mouseleave: MouseEvent;
39
- mousemove: MouseEvent;
40
- mouseover: MouseEvent;
41
- mouseout: MouseEvent;
42
- mouseup: MouseEvent;
43
- scroll: Event;
44
- wheel: WheelEvent;
45
- paste: ClipboardEvent;
46
- } & {
47
- [evt: string]: CustomEvent<any>;
48
- };
49
- slots: {
50
- text: {
51
- disabled: boolean;
52
- for: string | undefined;
53
- forwardClick: boolean;
54
- required: boolean;
55
- text: string | undefined;
56
- variant: string;
57
- };
58
- default: {};
59
- message: {
60
- disabled: boolean;
61
- message: string | undefined;
62
- required: boolean;
63
- status: string;
64
- variant: string;
65
- };
66
- required: {
67
- requiredReason: string;
68
- variant: string;
69
- };
70
- };
71
- exports?: undefined;
72
- bindings?: undefined;
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;
73
10
  };
74
- export type LabelProps = typeof __propDef.props;
75
- export type LabelEvents = typeof __propDef.events;
76
- export type LabelSlots = typeof __propDef.slots;
77
- export default class Label extends SvelteComponent<LabelProps, LabelEvents, LabelSlots> {
78
- get click(): () => void;
79
- get blur(): () => void;
80
- get focus(): (options?: FocusOptions | undefined) => void;
81
- }
82
- export {};
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 CHANGED
@@ -1,11 +1,7 @@
1
- <script>export let href;
2
- export let disabled = false;
3
- // ----- Props ----- //
4
- /** Additional class names to apply. */
5
- export let variant = '';
6
- // ----- State ----- //
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">let { children, class: _class, disabled, ...rest } = $props();
7
4
  let linkRef;
8
- // ----- Methods ----- //
9
5
  export const blur = () => {
10
6
  linkRef?.blur();
11
7
  };
@@ -19,39 +15,11 @@ export const focus = (options) => {
19
15
 
20
16
  <a
21
17
  bind:this={linkRef}
22
- class={`sterling-link ${variant}`}
18
+ class={['sterling-link', _class].filter(Boolean).join(' ')}
23
19
  class:disabled
24
- {href}
25
- on:blur
26
- on:click
27
- on:dblclick
28
- on:dragend
29
- on:dragenter
30
- on:dragleave
31
- on:dragover
32
- on:dragstart
33
- on:drop
34
- on:focus
35
- on:focusin
36
- on:focusout
37
- on:keydown
38
- on:keypress
39
- on:keyup
40
- on:mousedown
41
- on:mouseenter
42
- on:mouseleave
43
- on:mousemove
44
- on:mouseover
45
- on:mouseout
46
- on:mouseup
47
- on:pointercancel
48
- on:pointerdown
49
- on:pointerenter
50
- on:pointerleave
51
- on:pointermove
52
- on:pointerover
53
- on:pointerout
54
- on:pointerup
55
- on:wheel|passive
56
- {...$$restProps}><slot {disabled} {href} {variant} /></a
20
+ {...rest}
57
21
  >
22
+ {#if children}
23
+ {@render children()}
24
+ {/if}
25
+ </a>
@@ -1,65 +1,12 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- href: string;
6
- disabled?: boolean | undefined;
7
- variant?: string | undefined;
8
- blur?: (() => void) | undefined;
9
- click?: (() => void) | undefined;
10
- focus?: ((options?: FocusOptions) => void) | undefined;
11
- };
12
- events: {
13
- blur: FocusEvent;
14
- click: MouseEvent;
15
- dblclick: MouseEvent;
16
- dragend: DragEvent;
17
- dragenter: DragEvent;
18
- dragleave: DragEvent;
19
- dragover: DragEvent;
20
- dragstart: DragEvent;
21
- drop: DragEvent;
22
- focus: FocusEvent;
23
- focusin: FocusEvent;
24
- focusout: FocusEvent;
25
- keydown: KeyboardEvent;
26
- keypress: KeyboardEvent;
27
- keyup: KeyboardEvent;
28
- mousedown: MouseEvent;
29
- mouseenter: MouseEvent;
30
- mouseleave: MouseEvent;
31
- mousemove: MouseEvent;
32
- mouseover: MouseEvent;
33
- mouseout: MouseEvent;
34
- mouseup: MouseEvent;
35
- pointercancel: PointerEvent;
36
- pointerdown: PointerEvent;
37
- pointerenter: PointerEvent;
38
- pointerleave: PointerEvent;
39
- pointermove: PointerEvent;
40
- pointerover: PointerEvent;
41
- pointerout: PointerEvent;
42
- pointerup: PointerEvent;
43
- wheel: WheelEvent;
44
- } & {
45
- [evt: string]: CustomEvent<any>;
46
- };
47
- slots: {
48
- default: {
49
- disabled: boolean;
50
- href: string;
51
- variant: string;
52
- };
53
- };
54
- exports?: undefined;
55
- bindings?: undefined;
1
+ /// <reference types="svelte" />
2
+ import type { HTMLAnchorAttributes } from 'svelte/elements';
3
+ type Props = HTMLAnchorAttributes & {
4
+ disabled?: boolean | null;
56
5
  };
57
- export type LinkProps = typeof __propDef.props;
58
- export type LinkEvents = typeof __propDef.events;
59
- export type LinkSlots = typeof __propDef.slots;
60
- export default class Link extends SvelteComponent<LinkProps, LinkEvents, LinkSlots> {
61
- get blur(): () => void;
62
- get click(): () => void;
63
- get focus(): (options?: FocusOptions | undefined) => void;
64
- }
65
- export {};
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.svelte CHANGED
@@ -1,43 +1,26 @@
1
- <script>import { createEventDispatcher, setContext } from 'svelte';
2
- import { writable } from 'svelte/store';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { setContext } from 'svelte';
3
4
  import { LIST_CONTEXT_KEY } from './List.constants';
4
5
  import { usingKeyboard } from './mediaQueries/usingKeyboard';
5
- // ----- Props ----- //
6
- /** If the list and all its items are disabled. */
7
- export let disabled = false;
8
- /** When true, items are arranged horizontally. */
9
- export let horizontal = false;
10
- /** The value of the currently selected item. */
11
- export let selectedValue = undefined;
12
- /** Additional class names to apply. */
13
- export let variant = '';
14
- // ----- State ----- //
6
+ let { children, class: _class, disabled = false, horizontal = false, selectedValue = $bindable(), onSelect, ...rest } = $props();
15
7
  let listRef;
16
8
  let lastSelectedItemRef;
17
- const disabledStore = writable(disabled);
18
- const horizontalStore = writable(horizontal);
19
- const selectedValueStore = writable(selectedValue);
20
- $: {
21
- disabledStore.set(disabled);
22
- }
23
- $: {
24
- horizontalStore.set(horizontal);
25
- }
26
- $: {
27
- selectedValueStore.set(selectedValue);
28
- }
29
- $: {
30
- selectedValue = $selectedValueStore;
31
- }
32
- // ----- Events ----- //
33
- const dispatch = createEventDispatcher();
34
- const raiseSelect = (value) => {
35
- dispatch('select', { value });
36
- };
37
- $: {
38
- raiseSelect(selectedValue);
39
- }
40
- // ----- Methods ----- //
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);
41
24
  export const blur = () => {
42
25
  listRef?.blur();
43
26
  };
@@ -51,8 +34,9 @@ export const scrollToSelectedItem = () => {
51
34
  const element = getSelectedItemElement();
52
35
  element?.scrollIntoView({ block: 'nearest', inline: 'nearest' });
53
36
  };
54
- // ----- Focus ----- //
55
- // ----- Selection ----- //
37
+ $effect(() => {
38
+ onSelect?.(selectedValue);
39
+ });
56
40
  const isElementListItem = (candidate) => {
57
41
  return (candidate &&
58
42
  candidate.getAttribute('data-value') !== null &&
@@ -70,7 +54,7 @@ const getSelectedItemElement = () => {
70
54
  }
71
55
  };
72
56
  const selectItem = (value, element) => {
73
- selectedValueStore.set(value);
57
+ selectedValue = value;
74
58
  lastSelectedItemRef = element;
75
59
  element.scrollIntoView({ block: 'nearest', inline: 'nearest' });
76
60
  };
@@ -124,7 +108,6 @@ export const selectLastItem = () => {
124
108
  }
125
109
  return false;
126
110
  };
127
- // ----- Event Handlers ----- //
128
111
  const onClick = (event) => {
129
112
  if (!disabled) {
130
113
  let candidate = event.target;
@@ -137,6 +120,7 @@ const onClick = (event) => {
137
120
  selectItem(candidateValue, candidate);
138
121
  }
139
122
  }
123
+ rest.onclick?.(event);
140
124
  };
141
125
  const onKeydown = (event) => {
142
126
  if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
@@ -189,65 +173,31 @@ const onKeydown = (event) => {
189
173
  return false;
190
174
  }
191
175
  }
176
+ rest.onkeydown?.(event);
192
177
  };
193
- // ----- Set Context ----- //
194
- setContext(LIST_CONTEXT_KEY, {
195
- disabled: disabledStore,
196
- selectedValue: selectedValueStore,
197
- horizontal: horizontalStore
198
- });
199
178
  </script>
200
179
 
201
- <!--
202
- @component
203
- A list of items where a single item can be selected.
204
- -->
205
- <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
206
- <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
207
- <!-- svelte-ignore a11y-role-supports-aria-props -->
180
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
181
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
182
+ <!-- svelte-ignore a11y_role_supports_aria_props -->
208
183
  <div
209
184
  aria-activedescendant={selectedValue}
210
185
  aria-disabled={disabled}
211
186
  aria-orientation={horizontal ? 'horizontal' : 'vertical'}
212
187
  bind:this={listRef}
213
- class={`sterling-list ${variant}`}
188
+ class={['sterling-list', _class].filter(Boolean).join(' ')}
214
189
  class:disabled
215
190
  class:horizontal
216
191
  class:using-keyboard={$usingKeyboard}
217
192
  role="list"
218
193
  tabindex={0}
219
- on:blur
220
- on:click
221
- on:click={onClick}
222
- on:copy
223
- on:cut
224
- on:dblclick
225
- on:dragend
226
- on:dragenter
227
- on:dragleave
228
- on:dragover
229
- on:dragstart
230
- on:drop
231
- on:focus
232
- on:focusin
233
- on:focusout
234
- on:keydown
235
- on:keydown={onKeydown}
236
- on:keypress
237
- on:keyup
238
- on:mousedown
239
- on:mouseenter
240
- on:mouseleave
241
- on:mousemove
242
- on:mouseover
243
- on:mouseout
244
- on:mouseup
245
- on:scroll
246
- on:wheel|passive
247
- on:paste
248
- {...$$restProps}
194
+ {...rest}
195
+ onclick={onClick}
196
+ onkeydown={onKeydown}
249
197
  >
250
198
  <div class="container">
251
- <slot {disabled} {horizontal} {selectedValue} {variant} />
199
+ {#if children}
200
+ {@render children()}
201
+ {/if}
252
202
  </div>
253
203
  </div>