@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
@@ -1,75 +1,20 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- disabled?: boolean | undefined;
6
- horizontal?: boolean | undefined;
7
- selectedValue?: string | undefined;
8
- variant?: string | undefined;
9
- blur?: (() => void) | undefined;
10
- click?: (() => void) | undefined;
11
- focus?: ((options?: FocusOptions) => void) | undefined;
12
- scrollToSelectedItem?: (() => void) | undefined;
13
- selectFirstItem?: (() => boolean) | undefined;
14
- selectPreviousItem?: (() => boolean) | undefined;
15
- selectNextItem?: (() => boolean) | undefined;
16
- selectLastItem?: (() => boolean) | 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
- select: CustomEvent<any>;
47
- } & {
48
- [evt: string]: CustomEvent<any>;
49
- };
50
- slots: {
51
- default: {
52
- disabled: boolean;
53
- horizontal: boolean;
54
- selectedValue: string | undefined;
55
- variant: string;
56
- };
57
- };
58
- exports?: undefined;
59
- bindings?: undefined;
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;
60
8
  };
61
- export type ListProps = typeof __propDef.props;
62
- export type ListEvents = typeof __propDef.events;
63
- export type ListSlots = typeof __propDef.slots;
64
- /** A list of items where a single item can be selected. */
65
- export default class List extends SvelteComponent<ListProps, ListEvents, ListSlots> {
66
- get blur(): () => void;
67
- get click(): () => void;
68
- get focus(): (options?: FocusOptions | undefined) => void;
69
- get scrollToSelectedItem(): () => void;
70
- get selectFirstItem(): () => boolean;
71
- get selectPreviousItem(): () => boolean;
72
- get selectNextItem(): () => boolean;
73
- get selectLastItem(): () => boolean;
74
- }
75
- export {};
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;
@@ -1,13 +1,5 @@
1
- /// <reference types="svelte" />
2
- import type { Readable, Writable } from 'svelte/store';
3
- /**
4
- * The context for a List and its descendants.
5
- */
6
1
  export type ListContext = {
7
- /** When true, the list and its items are disabled. */
8
- disabled?: Readable<boolean>;
9
- /** The value of the currently selected item. */
10
- selectedValue?: Writable<string | undefined>;
11
- /** When true, the list is laid out horizontally. */
12
- horizontal?: Readable<boolean>;
2
+ disabled?: boolean | null | undefined;
3
+ selectedValue?: string;
4
+ horizontal?: boolean | null | undefined;
13
5
  };
@@ -1,23 +1,21 @@
1
- <script>import { getContext } from 'svelte';
2
- import { readable, writable } from 'svelte/store';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { getContext } from 'svelte';
3
4
  import { LIST_CONTEXT_KEY } from './List.constants';
4
- // ----- Props ----- //
5
- /** When true the item is disabled. The item is also disabled if the parent list is disabled. */
6
- export let disabled = false;
7
- /** The value uniquely identifying this item within the list. */
8
- export let value;
9
- /** Additional class names to apply. */
10
- export let variant = '';
11
- // ----- GetContext ----- //
12
- const { disabled: listDisabled, selectedValue, horizontal } = getContext(LIST_CONTEXT_KEY) || {
13
- disabled: readable(false),
14
- selectedValue: writable(undefined),
15
- horizontal: readable(false)
16
- };
17
- // ----- State ----- //
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
18
  let itemRef;
19
- $: selected = $selectedValue === value;
20
- // ----- Methods ----- //
21
19
  export const click = () => {
22
20
  itemRef?.click();
23
21
  };
@@ -29,50 +27,23 @@ export const focus = (options) => {
29
27
  };
30
28
  </script>
31
29
 
32
- <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
33
- <!-- svelte-ignore a11y-role-supports-aria-props -->
30
+ <!-- svelte-ignore a11y_role_supports_aria_props -->
34
31
  <div
35
32
  aria-selected={selected}
36
33
  bind:this={itemRef}
37
- class={`sterling-list-item ${variant}`}
38
- class:disabled={disabled || $listDisabled}
34
+ class={['sterling-list-item', _class].filter(Boolean).join(' ')}
35
+ class:disabled={disabled || listContext.disabled}
36
+ class:horizontal={listContext.horizontal}
39
37
  class:item-disabled={disabled}
40
- class:list-disabled={$listDisabled}
38
+ class:list-disabled={listContext.disabled}
41
39
  class:selected
42
40
  data-value={value}
43
41
  role="listitem"
44
- on:blur
45
- on:click
46
- on:dblclick
47
- on:dragend
48
- on:dragenter
49
- on:dragleave
50
- on:dragover
51
- on:dragstart
52
- on:drop
53
- on:focus
54
- on:focusin
55
- on:focusout
56
- on:keydown
57
- on:keypress
58
- on:keyup
59
- on:mousedown
60
- on:mouseenter
61
- on:mouseleave
62
- on:mousemove
63
- on:mouseover
64
- on:mouseout
65
- on:mouseup
66
- on:pointercancel
67
- on:pointerdown
68
- on:pointerenter
69
- on:pointerleave
70
- on:pointermove
71
- on:pointerover
72
- on:pointerout
73
- on:pointerup
74
- on:wheel|passive
75
- {...$$restProps}
42
+ {...rest}
76
43
  >
77
- <slot {disabled} {horizontal} {selected} {value} {variant}>{value}</slot>
44
+ {#if children}
45
+ {@render children()}
46
+ {:else}
47
+ {value}
48
+ {/if}
78
49
  </div>
@@ -1,67 +1,13 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- disabled?: boolean | undefined;
6
- value: string;
7
- variant?: string | undefined;
8
- click?: (() => void) | undefined;
9
- blur?: (() => 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
- horizontal: import("svelte/store").Readable<boolean> | undefined;
51
- selected: boolean;
52
- value: string;
53
- variant: string;
54
- };
55
- };
56
- exports?: undefined;
57
- bindings?: undefined;
1
+ /// <reference types="svelte" />
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type Props = HTMLAttributes<HTMLDivElement> & {
4
+ disabled?: boolean | null;
5
+ value?: string;
58
6
  };
59
- export type ListItemProps = typeof __propDef.props;
60
- export type ListItemEvents = typeof __propDef.events;
61
- export type ListItemSlots = typeof __propDef.slots;
62
- export default class ListItem extends SvelteComponent<ListItemProps, ListItemEvents, ListItemSlots> {
63
- get click(): () => void;
64
- get blur(): () => void;
65
- get focus(): (options?: FocusOptions | undefined) => void;
66
- }
67
- export {};
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;
package/dist/Menu.svelte CHANGED
@@ -1,30 +1,27 @@
1
- <script>import { getContext } from 'svelte';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { getContext } from 'svelte';
2
4
  import { slide } from 'svelte/transition';
3
5
  import { MENU_ITEM_CONTEXT_KEY } from './MenuItem.constants';
4
6
  import { isElementEnabledMenuItem, isElementMenuItem } from './MenuItem.utils';
5
7
  import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
6
- // ----- Props ----- //
7
- /** Additional class names to apply. */
8
- export let variant = '';
9
- // ----- State ----- //
8
+ let { children, class: _class, ...rest } = $props();
10
9
  let menuRef;
11
10
  let menuItemsRef;
12
- // ----- Media Queries ----- //
13
- const slidNoOp = (node, params) => {
11
+ const noSlide = (node, params) => {
14
12
  return { delay: 0, duration: 0 };
15
13
  };
16
- $: slideMotion = !$prefersReducedMotion ? slide : slidNoOp;
17
- // ----- Get Context ----- //
18
- const { rootValue } = getContext(MENU_ITEM_CONTEXT_KEY) || {};
19
- // ----- Methods ----- //
20
- export const blur = () => {
21
- menuRef?.blur();
14
+ let slideMotion = $derived(!$prefersReducedMotion ? slide : noSlide);
15
+ const { rootValue = undefined } = getContext(MENU_ITEM_CONTEXT_KEY);
16
+ const isElementInThisMenu = (candidate) => {
17
+ return candidate && candidate.closest('[role="menu"]') === menuRef;
22
18
  };
19
+ //#region focus
23
20
  export const focus = (options) => {
24
21
  menuRef?.focus(options);
25
22
  };
26
- const isElementInThisMenu = (candidate) => {
27
- return candidate && candidate.closest('[role="menu"]') === menuRef;
23
+ export const blur = () => {
24
+ menuRef?.blur();
28
25
  };
29
26
  export const focusFirstMenuItem = () => {
30
27
  let candidate = menuItemsRef?.firstElementChild;
@@ -64,47 +61,23 @@ export const focusLastMenuItem = () => {
64
61
  candidate?.focus({ preventScroll: true });
65
62
  return !!candidate;
66
63
  };
64
+ //#endregion
67
65
  </script>
68
66
 
69
67
  <div
70
68
  bind:this={menuRef}
71
- class={`sterling-menu ${variant}`}
69
+ class={['sterling-menu', _class].filter(Boolean).join(' ')}
72
70
  role="menu"
73
71
  class:open
74
72
  data-root-value={rootValue}
75
73
  tabindex="-1"
76
74
  in:slideMotion|global={{ duration: 300 }}
77
75
  out:slideMotion|global={{ duration: 100 }}
78
- on:blur
79
- on:click
80
- on:copy
81
- on:cut
82
- on:dblclick
83
- on:dragend
84
- on:dragenter
85
- on:dragleave
86
- on:dragover
87
- on:dragstart
88
- on:drop
89
- on:focus
90
- on:focusin
91
- on:focusout
92
- on:keydown
93
- on:keypress
94
- on:keyup
95
- on:mousedown
96
- on:mouseenter
97
- on:mouseleave
98
- on:mousemove
99
- on:mouseover
100
- on:mouseout
101
- on:mouseup
102
- on:scroll
103
- on:wheel|passive
104
- on:paste
105
- {...$$restProps}
76
+ {...rest}
106
77
  >
107
78
  <div bind:this={menuItemsRef} class="menu-items">
108
- <slot {variant} />
79
+ {#if children}
80
+ {@render children()}
81
+ {/if}
109
82
  </div>
110
83
  </div>
@@ -1,63 +1,13 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- variant?: string | undefined;
6
- blur?: (() => void) | undefined;
7
- focus?: ((options?: FocusOptions) => void) | undefined;
8
- focusFirstMenuItem?: (() => boolean) | undefined;
9
- focusPreviousMenuItem?: (() => boolean) | undefined;
10
- focusNextMenuItem?: (() => boolean) | undefined;
11
- focusLastMenuItem?: (() => boolean) | undefined;
12
- };
13
- events: {
14
- blur: FocusEvent;
15
- click: MouseEvent;
16
- copy: ClipboardEvent;
17
- cut: ClipboardEvent;
18
- dblclick: MouseEvent;
19
- dragend: DragEvent;
20
- dragenter: DragEvent;
21
- dragleave: DragEvent;
22
- dragover: DragEvent;
23
- dragstart: DragEvent;
24
- drop: DragEvent;
25
- focus: FocusEvent;
26
- focusin: FocusEvent;
27
- focusout: FocusEvent;
28
- keydown: KeyboardEvent;
29
- keypress: KeyboardEvent;
30
- keyup: KeyboardEvent;
31
- mousedown: MouseEvent;
32
- mouseenter: MouseEvent;
33
- mouseleave: MouseEvent;
34
- mousemove: MouseEvent;
35
- mouseover: MouseEvent;
36
- mouseout: MouseEvent;
37
- mouseup: MouseEvent;
38
- scroll: Event;
39
- wheel: WheelEvent;
40
- paste: ClipboardEvent;
41
- } & {
42
- [evt: string]: CustomEvent<any>;
43
- };
44
- slots: {
45
- default: {
46
- variant: string;
47
- };
48
- };
49
- exports?: undefined;
50
- bindings?: undefined;
51
- };
52
- export type MenuProps = typeof __propDef.props;
53
- export type MenuEvents = typeof __propDef.events;
54
- export type MenuSlots = typeof __propDef.slots;
55
- export default class Menu extends SvelteComponent<MenuProps, MenuEvents, MenuSlots> {
56
- get blur(): () => void;
57
- get focus(): (options?: FocusOptions | undefined) => void;
58
- get focusFirstMenuItem(): () => boolean;
59
- get focusPreviousMenuItem(): () => boolean;
60
- get focusNextMenuItem(): () => boolean;
61
- get focusLastMenuItem(): () => boolean;
62
- }
63
- export {};
1
+ /// <reference types="svelte" />
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type Props = HTMLAttributes<HTMLDivElement>;
4
+ declare const Menu: import("svelte").Component<Props, {
5
+ focus: (options?: FocusOptions) => void;
6
+ blur: () => void;
7
+ focusFirstMenuItem: () => boolean;
8
+ focusPreviousMenuItem: () => boolean;
9
+ focusNextMenuItem: () => boolean;
10
+ focusLastMenuItem: () => boolean;
11
+ }, "">;
12
+ type Menu = ReturnType<typeof Menu>;
13
+ export default Menu;
@@ -1,53 +1,35 @@
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 { clickOutside } from './actions/clickOutside';
4
5
  import { idGenerator } from './idGenerator';
5
6
  import { MENU_BAR_CONTEXT_KEY } from './MenuBar.constants';
6
7
  import { MENU_ITEM_CONTEXT_KEY } from './MenuItem.constants';
7
8
  import { isElementEnabledMenuItem } from './MenuItem.utils';
8
- // ----- Props ----- //
9
- /** Additional class names to apply. */
10
- export let variant = '';
11
- // ----- State ----- //
12
- const openValues = writable([]);
9
+ let { class: _class, children, onClose, onOpen, onSelect, ...rest } = $props();
13
10
  const rootValue = idGenerator.nextId('MenuBar');
11
+ let openValues = $state([]);
12
+ let prevOpenValue = $state();
14
13
  let menuBarRef;
15
- let prevOpenValue = undefined;
16
- // Remember the last open value
17
- $: {
18
- if ($openValues.length > 0) {
19
- prevOpenValue = $openValues[0];
20
- }
21
- }
14
+ $effect(() => {
15
+ prevOpenValue = openValues[0];
16
+ });
22
17
  // Restore focus to the last open menu bar item when it closes
23
- $: {
24
- if ($openValues.length === 0 && prevOpenValue !== undefined) {
18
+ $effect(() => {
19
+ if (openValues.length === 0 && prevOpenValue !== undefined) {
25
20
  const candidate = menuBarRef.querySelector(`[data-value="${prevOpenValue}"]`);
26
21
  candidate?.focus();
27
22
  prevOpenValue = undefined;
28
23
  }
29
- }
30
- // ----- Events ----- //
31
- const dispatch = createEventDispatcher();
32
- const raiseClose = (value) => {
33
- dispatch('close', { value });
34
- };
35
- const raiseOpen = (value) => {
36
- dispatch('open', { value });
37
- };
38
- const raiseSelect = (value) => {
39
- dispatch('select', { value });
40
- };
41
- // ----- Methods ----- //
24
+ });
42
25
  export const blur = () => {
43
26
  menuBarRef?.blur();
44
27
  };
45
28
  export const focus = (options) => {
46
29
  menuBarRef?.focus(options);
47
30
  };
48
- // ----- Open/Close ----- //
49
31
  const getOpenMenuBarItem = () => {
50
- const value = $openValues[0];
32
+ const value = openValues[0];
51
33
  if (value) {
52
34
  return menuBarRef.querySelector(`[data-value="${value}"]`);
53
35
  }
@@ -86,12 +68,10 @@ const openNextMenuBarItem = () => {
86
68
  return !!candidate;
87
69
  };
88
70
  const closeAllMenus = () => {
89
- openValues.set([]);
71
+ openValues = [];
90
72
  };
91
- // ----- Event Handlers ----- //
92
73
  const onClickOutside = (event) => {
93
- const { detail: { mouseEvent } } = event;
94
- let element = mouseEvent.target;
74
+ let element = event.target;
95
75
  while (element) {
96
76
  if (element.getAttribute('data-root-value') === rootValue) {
97
77
  return;
@@ -100,56 +80,34 @@ const onClickOutside = (event) => {
100
80
  }
101
81
  closeAllMenus?.();
102
82
  };
103
- // ----- Set Context ----- //
104
- setContext(MENU_BAR_CONTEXT_KEY, {
105
- openPreviousMenuBarItem,
106
- openNextMenuBarItem
107
- });
108
- setContext(MENU_ITEM_CONTEXT_KEY, {
83
+ let menuBarContext = { openPreviousMenuBarItem, openNextMenuBarItem };
84
+ setContext(MENU_BAR_CONTEXT_KEY, menuBarContext);
85
+ let menuItemContext = {
109
86
  isMenuBarItem: true,
110
- openValues,
87
+ depth: 0,
88
+ get openValues() {
89
+ return openValues;
90
+ },
91
+ set openValues(value) {
92
+ openValues = value;
93
+ },
111
94
  rootValue,
112
- onClose: raiseClose,
113
- onOpen: raiseOpen,
114
- onSelect: raiseSelect
115
- });
95
+ onClose,
96
+ onOpen,
97
+ onSelect
98
+ };
99
+ setContext(MENU_ITEM_CONTEXT_KEY, menuItemContext);
116
100
  </script>
117
101
 
118
102
  <div
119
103
  bind:this={menuBarRef}
120
- class={`sterling-menu-bar ${variant}`}
104
+ class={['sterling-menu-bar', _class].filter(Boolean).join(' ')}
121
105
  role="menubar"
122
106
  tabindex="-1"
123
- on:blur
124
- on:click
125
- on:copy
126
- on:cut
127
- on:dblclick
128
- on:dragend
129
- on:dragenter
130
- on:dragleave
131
- on:dragover
132
- on:dragstart
133
- on:drop
134
- on:focus
135
- on:focusin
136
- on:focusout
137
- on:keydown
138
- on:keypress
139
- on:keyup
140
- on:mousedown
141
- on:mouseenter
142
- on:mouseleave
143
- on:mousemove
144
- on:mouseover
145
- on:mouseout
146
- on:mouseup
147
- on:scroll
148
- on:wheel|passive
149
- on:paste
150
- {...$$restProps}
151
- use:clickOutside
152
- on:click_outside={onClickOutside}
107
+ {...rest}
108
+ use:clickOutside={{ onclickoutside: onClickOutside }}
153
109
  >
154
- <slot {variant} />
110
+ {#if children}
111
+ {@render children()}
112
+ {/if}
155
113
  </div>