@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,67 +1,15 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- disabled?: boolean | undefined;
6
- selectedValue?: string | undefined;
7
- expandedValues?: string[] | undefined;
8
- variant?: string | 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
- expandCollapse: CustomEvent<any>;
45
- select: CustomEvent<any>;
46
- } & {
47
- [evt: string]: CustomEvent<any>;
48
- };
49
- slots: {
50
- default: {
51
- disabled: boolean;
52
- expandedValues: string[];
53
- selectedValue: string | undefined;
54
- variant: string;
55
- };
56
- };
57
- exports?: undefined;
58
- bindings?: undefined;
1
+ /// <reference types="svelte" />
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type Props = HTMLAttributes<HTMLDivElement> & {
4
+ disabled?: boolean | null;
5
+ expandedValues?: string[];
6
+ selectedValue?: string;
7
+ onExpandCollapse?: (expandedValues: string[]) => void;
8
+ onSelect?: (selectedValue: string | undefined) => void;
59
9
  };
60
- export type TreeProps = typeof __propDef.props;
61
- export type TreeEvents = typeof __propDef.events;
62
- export type TreeSlots = typeof __propDef.slots;
63
- export default class Tree extends SvelteComponent<TreeProps, TreeEvents, TreeSlots> {
64
- get blur(): () => void;
65
- get focus(): (options?: FocusOptions | undefined) => void;
66
- }
67
- export {};
10
+ declare const Tree: import("svelte").Component<Props, {
11
+ blur: () => void;
12
+ focus: (options?: FocusOptions) => void;
13
+ }, "selectedValue" | "expandedValues">;
14
+ type Tree = ReturnType<typeof Tree>;
15
+ export default Tree;
@@ -1,13 +1,5 @@
1
- /// <reference types="svelte" />
2
- import type { Readable, Writable } from 'svelte/store';
3
- /**
4
- * The context for a Tree and its descendants.
5
- */
6
1
  export type TreeContext = {
7
- /** When true, the tree and its descendants are disabled. */
8
- disabled: Readable<boolean>;
9
- /** The values of items that are expanded. */
10
- expandedValues: Writable<string[]>;
11
- /** The value of the currently selected item. */
12
- selectedValue: Writable<string | undefined>;
2
+ disabled: boolean | null | undefined;
3
+ expandedValues: string[];
4
+ selectedValue: string | undefined;
13
5
  };
@@ -1,66 +1,27 @@
1
- <script>import { onMount } from 'svelte';
2
- // ----- Props ----- //
3
- /** When true, the chevron rotates to indicate children are visible. */
4
- export let expanded = false;
5
- /** When true, the chevron is displayed, otherwise a dot is displayed. */
6
- export let hasChildren = false;
7
- /** Additional class names to apply. */
8
- export let variant = '';
9
- // ----- State ----- //
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { onMount } from 'svelte';
4
+ let { class: _class, expanded = false, hasChildren = false, ...rest } = $props();
10
5
  let previousExpanded = expanded;
11
6
  let mounted = false;
12
- // ----- Event Handlers ----- //
13
7
  onMount(() => {
14
8
  setTimeout(() => {
15
9
  mounted = true;
16
10
  }, 0);
17
11
  });
18
- // ----- Animation ----- //
19
- let animate = false;
20
- $: {
12
+ let animate = $state(false);
13
+ $effect(() => {
21
14
  if (expanded !== previousExpanded && mounted) {
22
15
  animate = true;
23
16
  }
24
17
  previousExpanded = expanded;
25
- }
18
+ });
26
19
  </script>
27
20
 
28
- <!-- svelte-ignore a11y-no-static-element-interactions -->
29
21
  <div
30
- class={`sterling-tree-chevron ${variant}`}
22
+ class={`sterling-tree-chevron ${_class}`}
31
23
  class:leaf={!hasChildren}
32
24
  class:animate
33
25
  class:expanded
34
- on:blur
35
- on:click
36
- on:dblclick
37
- on:dragend
38
- on:dragenter
39
- on:dragleave
40
- on:dragover
41
- on:dragstart
42
- on:drop
43
- on:focus
44
- on:focusin
45
- on:focusout
46
- on:keydown
47
- on:keypress
48
- on:keyup
49
- on:mousedown
50
- on:mouseenter
51
- on:mouseleave
52
- on:mousemove
53
- on:mouseover
54
- on:mouseout
55
- on:mouseup
56
- on:pointercancel
57
- on:pointerdown
58
- on:pointerenter
59
- on:pointerleave
60
- on:pointermove
61
- on:pointerover
62
- on:pointerout
63
- on:pointerup
64
- on:wheel|passive
65
- {...$$restProps}
66
- />
26
+ {...rest}
27
+ ></div>
@@ -1,53 +1,9 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- expanded?: boolean | undefined;
6
- hasChildren?: boolean | undefined;
7
- variant?: string | undefined;
8
- };
9
- events: {
10
- blur: FocusEvent;
11
- click: MouseEvent;
12
- dblclick: MouseEvent;
13
- dragend: DragEvent;
14
- dragenter: DragEvent;
15
- dragleave: DragEvent;
16
- dragover: DragEvent;
17
- dragstart: DragEvent;
18
- drop: DragEvent;
19
- focus: FocusEvent;
20
- focusin: FocusEvent;
21
- focusout: FocusEvent;
22
- keydown: KeyboardEvent;
23
- keypress: KeyboardEvent;
24
- keyup: KeyboardEvent;
25
- mousedown: MouseEvent;
26
- mouseenter: MouseEvent;
27
- mouseleave: MouseEvent;
28
- mousemove: MouseEvent;
29
- mouseover: MouseEvent;
30
- mouseout: MouseEvent;
31
- mouseup: MouseEvent;
32
- pointercancel: PointerEvent;
33
- pointerdown: PointerEvent;
34
- pointerenter: PointerEvent;
35
- pointerleave: PointerEvent;
36
- pointermove: PointerEvent;
37
- pointerover: PointerEvent;
38
- pointerout: PointerEvent;
39
- pointerup: PointerEvent;
40
- wheel: WheelEvent;
41
- } & {
42
- [evt: string]: CustomEvent<any>;
43
- };
44
- slots: {};
45
- exports?: undefined;
46
- bindings?: undefined;
1
+ /// <reference types="svelte" />
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type Props = HTMLAttributes<HTMLDivElement> & {
4
+ expanded?: boolean | null | undefined;
5
+ hasChildren?: boolean | null | undefined;
47
6
  };
48
- export type TreeChevronProps = typeof __propDef.props;
49
- export type TreeChevronEvents = typeof __propDef.events;
50
- export type TreeChevronSlots = typeof __propDef.slots;
51
- export default class TreeChevron extends SvelteComponent<TreeChevronProps, TreeChevronEvents, TreeChevronSlots> {
52
- }
53
- export {};
7
+ declare const TreeChevron: import("svelte").Component<Props, {}, "">;
8
+ type TreeChevron = ReturnType<typeof TreeChevron>;
9
+ export default TreeChevron;
@@ -1,53 +1,66 @@
1
- <script>import { getContext, setContext } from 'svelte';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { getContext, setContext } from 'svelte';
2
4
  import { slide } from 'svelte/transition';
5
+ import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
3
6
  import { TREE_CONTEXT_KEY } from './Tree.constants';
7
+ import TreeChevron from './TreeChevron.svelte';
4
8
  import { TREE_ITEM_CONTEXT_KEY } from './TreeItem.constants';
5
- import TreeItemDisplay from './TreeItemDisplay.svelte';
6
- import { readable, writable } from 'svelte/store';
7
- import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
8
- // ----- Props ----
9
- /** When true, the item is disabled. */
10
- export let disabled = false;
11
- /** The text for the item. Not used when either the item or label slots are filled. */
12
- export let text = undefined;
13
- /** The value uniquely identifying this item within the tree. */
14
- export let value;
15
- /** Additional class names to apply. */
16
- export let variant = '';
17
- // ----- Animation ----- //
18
- const slidNoOp = (node, params) => {
9
+ let { children, class: _class, disabled = false, icon, label, style, value, ...rest } = $props();
10
+ const slideNoOp = (node, params) => {
19
11
  return { delay: 0, duration: 0 };
20
12
  };
21
- $: slideMotion = !$prefersReducedMotion ? slide : slidNoOp;
22
- // ----- Get Context ----- //
23
- const { disabled: treeDisabled, expandedValues, selectedValue } = getContext(TREE_CONTEXT_KEY);
24
- const { depth, disabled: parentDisabled } = getContext(TREE_ITEM_CONTEXT_KEY) || {
25
- depth: readable(0),
26
- disabled: readable(false)
13
+ let slideMotion = $derived(!$prefersReducedMotion ? slide : slideNoOp);
14
+ const treeContext = getContext(TREE_CONTEXT_KEY) || {
15
+ disabled: false,
16
+ expandedValues: [],
17
+ selectedValue: null
27
18
  };
28
- // ----- State ----- //
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
+ });
29
44
  let treeItemRef;
30
- $: hasChildren = $$slots.default;
31
- $: expanded = $expandedValues.includes(value);
32
- $: selected = $selectedValue === value;
33
- $: _disabled = disabled || $parentDisabled || $treeDisabled;
34
- const depthStore = writable($depth);
35
- const disabledStore = writable(_disabled);
36
- $: {
37
- depthStore.set($depth + 1);
38
- }
39
- $: {
40
- disabledStore.set(_disabled);
41
- }
42
- // ----- Expand/Collapse ----- //
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);
43
55
  const collapseItem = (index) => {
44
56
  if (!_disabled) {
45
- index = index ?? $expandedValues.findIndex((expandedValue) => expandedValue === value);
57
+ index =
58
+ index ?? treeContext.expandedValues.findIndex((expandedValue) => expandedValue === value);
46
59
  if (index !== -1) {
47
- expandedValues.set([
48
- ...$expandedValues.slice(0, index),
49
- ...$expandedValues.slice(index + 1)
50
- ]);
60
+ treeContext.expandedValues = [
61
+ ...treeContext.expandedValues.slice(0, index),
62
+ ...treeContext.expandedValues.slice(index + 1)
63
+ ];
51
64
  return true;
52
65
  }
53
66
  }
@@ -56,9 +69,10 @@ const collapseItem = (index) => {
56
69
  export const collapse = () => collapseItem();
57
70
  const expandItem = (index) => {
58
71
  if (!_disabled) {
59
- index = index ?? $expandedValues.findIndex((expandedValue) => expandedValue === value);
72
+ index =
73
+ index ?? treeContext.expandedValues.findIndex((expandedValue) => expandedValue === value);
60
74
  if (index === -1) {
61
- expandedValues.set([...$expandedValues, value]);
75
+ treeContext.expandedValues = [...treeContext.expandedValues, value];
62
76
  return true;
63
77
  }
64
78
  }
@@ -66,13 +80,12 @@ const expandItem = (index) => {
66
80
  };
67
81
  export const expand = () => expandItem();
68
82
  export const toggleExpanded = () => {
69
- if (!_disabled) {
70
- const index = $expandedValues.findIndex((expandedValue) => expandedValue === value);
83
+ if (!_disabled && children) {
84
+ const index = treeContext.expandedValues.findIndex((expandedValue) => expandedValue === value);
71
85
  return index !== -1 ? collapseItem(index) : expandItem(index);
72
86
  }
73
87
  return false;
74
88
  };
75
- // ----- Focus ----- //
76
89
  const blurItem = (treeItemElement) => {
77
90
  if (!_disabled) {
78
91
  const item = treeItemElement?.querySelector('.item');
@@ -84,7 +97,7 @@ export const blur = () => {
84
97
  };
85
98
  const focusItem = (treeItemElement, options) => {
86
99
  if (!_disabled) {
87
- const item = treeItemElement?.querySelector('.item');
100
+ const item = treeItemElement;
88
101
  item?.focus(options);
89
102
  }
90
103
  };
@@ -92,20 +105,18 @@ export const focus = (options) => {
92
105
  focusItem(treeItemRef);
93
106
  treeItemRef?.focus(options);
94
107
  };
95
- // ----- Click ----- //
96
108
  const clickItem = (treeItemElement) => {
97
109
  if (!_disabled) {
98
- const item = treeItemElement?.querySelector('.item');
110
+ const item = treeItemElement;
99
111
  item?.click();
100
112
  }
101
113
  };
102
114
  export const click = () => {
103
115
  clickItem(treeItemRef);
104
116
  };
105
- // ----- Selection ----- //
106
117
  const selectItemByValue = (value) => {
107
118
  if (!_disabled) {
108
- selectedValue.set(value);
119
+ treeContext.selectedValue = value;
109
120
  }
110
121
  };
111
122
  export const select = () => {
@@ -187,12 +198,14 @@ export const selectNext = () => {
187
198
  }
188
199
  return false;
189
200
  };
190
- // ----- Event Handlers ----- //
191
- const onClick = () => {
192
- if (!_disabled) {
201
+ const onClick = (event) => {
202
+ const eventTarget = event.target;
203
+ if (!_disabled && itemRef.contains(eventTarget)) {
193
204
  toggleExpanded();
194
205
  select();
206
+ return;
195
207
  }
208
+ rest.onclick?.(event);
196
209
  };
197
210
  const onKeydown = (event) => {
198
211
  if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
@@ -202,7 +215,7 @@ const onKeydown = (event) => {
202
215
  if (toggleExpanded()) {
203
216
  event.preventDefault();
204
217
  event.stopPropagation();
205
- return false;
218
+ return;
206
219
  }
207
220
  break;
208
221
  case 'ArrowRight':
@@ -211,18 +224,18 @@ const onKeydown = (event) => {
211
224
  When focus is on an open item, moves focus to the first child item.
212
225
  When focus is on an end item (a tree item with no children), does nothing.
213
226
  */
214
- if (hasChildren) {
227
+ if (children) {
215
228
  if (expanded) {
216
229
  if (selectNext()) {
217
230
  event.preventDefault();
218
231
  event.stopPropagation();
219
- return false;
232
+ return;
220
233
  }
221
234
  }
222
235
  else if (expandItem()) {
223
236
  event.preventDefault();
224
237
  event.stopPropagation();
225
- return false;
238
+ return;
226
239
  }
227
240
  }
228
241
  break;
@@ -232,17 +245,17 @@ const onKeydown = (event) => {
232
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.
233
246
  When focus is on a closed `tree`, does nothing.
234
247
  */
235
- if (hasChildren && expanded) {
248
+ if (expanded && children) {
236
249
  if (collapseItem()) {
237
250
  event.preventDefault();
238
251
  event.stopPropagation();
239
- return false;
252
+ return;
240
253
  }
241
254
  }
242
255
  else if (selectParent()) {
243
256
  event.preventDefault();
244
257
  event.stopPropagation();
245
- return false;
258
+ return;
246
259
  }
247
260
  break;
248
261
  case 'ArrowUp':
@@ -252,7 +265,7 @@ const onKeydown = (event) => {
252
265
  if (selectPrevious()) {
253
266
  event.preventDefault();
254
267
  event.stopPropagation();
255
- return false;
268
+ return;
256
269
  }
257
270
  break;
258
271
  case 'ArrowDown':
@@ -262,122 +275,55 @@ const onKeydown = (event) => {
262
275
  if (selectNext()) {
263
276
  event.preventDefault();
264
277
  event.stopPropagation();
265
- return false;
278
+ return;
266
279
  }
267
280
  break;
268
281
  }
269
282
  }
283
+ rest.onkeydown?.(event);
270
284
  };
271
- // ----- Set Context ----- //
272
- setContext(TREE_ITEM_CONTEXT_KEY, {
273
- depth: depthStore,
274
- disabled: disabledStore
275
- });
276
285
  </script>
277
286
 
278
- <!--
279
- @component
280
- A item in a Tree displaying the item and children.
281
- -->
282
- <!-- svelte-ignore a11y-interactive-supports-focus -->
283
287
  <div
288
+ bind:this={treeItemRef}
284
289
  aria-selected={selected ? true : undefined}
285
290
  aria-expanded={expanded}
286
- bind:this={treeItemRef}
287
- class={`sterling-tree-item ${variant}`}
291
+ class={`sterling-tree-item ${_class}`}
288
292
  class:disabled={_disabled}
293
+ class:expanded
289
294
  class:item-disabled={disabled}
290
- class:parent-disabled={$parentDisabled}
291
- class:tree-disabled={$treeDisabled}
295
+ class:leaf={!children}
296
+ class:parent-disabled={treeItemContext.disabled}
297
+ class:selected
298
+ class:tree-disabled={treeContext.disabled}
292
299
  data-value={value}
293
300
  role="treeitem"
294
- on:blur
295
- on:click
296
- on:dblclick
297
- on:dragend
298
- on:dragenter
299
- on:dragleave
300
- on:dragover
301
- on:dragstart
302
- on:drop
303
- on:focus
304
- on:focusin
305
- on:focusout
306
- on:keydown
307
- on:keypress
308
- on:keyup
309
- on:mousedown
310
- on:mouseenter
311
- on:mouseleave
312
- on:mousemove
313
- on:mouseover
314
- on:mouseout
315
- on:mouseup
316
- on:pointercancel
317
- on:pointerdown
318
- on:pointerenter
319
- on:pointerleave
320
- on:pointermove
321
- on:pointerover
322
- on:pointerout
323
- on:pointerup
324
- on:wheel|passive
325
- {...$$restProps}
301
+ tabindex={selected ? 0 : -1}
302
+ {...rest}
303
+ onclick={onClick}
304
+ onkeydown={onKeydown}
305
+ style={`--sterling-tree-item-depth: ${treeItemContext.depth}; ${style}`}
326
306
  >
327
- <div
328
- aria-selected={selected ? true : undefined}
329
- class="item"
330
- class:selected
331
- role="treeitem"
332
- tabindex={selected ? 0 : -1}
333
- on:click={onClick}
334
- on:keydown={onKeydown}
335
- >
336
- <slot
337
- name="item"
338
- {depth}
339
- disabled={_disabled}
340
- {expanded}
341
- {hasChildren}
342
- {selected}
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}
343
321
  {value}
344
- {variant}
345
- >
346
- <TreeItemDisplay
347
- depth={$depth}
348
- disabled={_disabled && !$treeDisabled}
349
- {expanded}
350
- {hasChildren}
351
- {selected}
352
- {value}
353
- {variant}
354
- >
355
- <svelte:fragment
356
- let:depth
357
- let:disabled
358
- let:expanded
359
- let:hasChildren
360
- let:selected
361
- let:value
362
- let:variant
363
- >
364
- <slot
365
- name="label"
366
- {depth}
367
- {disabled}
368
- {expanded}
369
- {hasChildren}
370
- {selected}
371
- {value}
372
- {variant}>{text || value}</slot
373
- >
374
- </svelte:fragment>
375
- </TreeItemDisplay>
376
- </slot>
322
+ {/if}
377
323
  </div>
378
- {#if expanded && hasChildren}
324
+ {#if expanded && children}
379
325
  <div class="children" transition:slideMotion|global={{ duration: 200 }} role="group">
380
- <slot depth={$depth} disabled={_disabled} {selected} {value} {variant} />
326
+ {@render children?.()}
381
327
  </div>
382
328
  {/if}
383
329
  </div>