@geoffcox/sterling-svelte 0.0.30 → 1.0.0

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 (223) hide show
  1. package/@types/clickOutside.d.ts +11 -7
  2. package/Button.svelte +11 -183
  3. package/Button.svelte.d.ts +2 -6
  4. package/Callout.svelte +188 -0
  5. package/Callout.svelte.d.ts +54 -0
  6. package/Checkbox.svelte +15 -177
  7. package/Checkbox.svelte.d.ts +2 -2
  8. package/ColorPicker.svelte +204 -223
  9. package/ColorPicker.svelte.d.ts +1 -2
  10. package/Dialog.svelte +91 -187
  11. package/Dialog.svelte.d.ts +3 -1
  12. package/Dropdown.svelte +52 -219
  13. package/Dropdown.svelte.d.ts +4 -8
  14. package/HexColorSliders.svelte +77 -145
  15. package/HexColorSliders.svelte.d.ts +28 -1
  16. package/HslColorSliders.svelte +99 -179
  17. package/HslColorSliders.svelte.d.ts +28 -1
  18. package/Input.svelte +27 -136
  19. package/Input.svelte.d.ts +2 -3
  20. package/Label.constants.d.ts +1 -0
  21. package/Label.constants.js +1 -0
  22. package/Label.svelte +96 -169
  23. package/Label.svelte.d.ts +6 -1
  24. package/Label.types.d.ts +3 -1
  25. package/Link.svelte +9 -106
  26. package/Link.svelte.d.ts +0 -1
  27. package/List.svelte +142 -230
  28. package/List.svelte.d.ts +2 -3
  29. package/List.types.d.ts +6 -1
  30. package/ListItem.svelte +25 -94
  31. package/ListItem.svelte.d.ts +2 -0
  32. package/Menu.svelte +48 -64
  33. package/Menu.svelte.d.ts +4 -1
  34. package/MenuBar.svelte +84 -86
  35. package/MenuBar.svelte.d.ts +4 -1
  36. package/MenuButton.svelte +67 -74
  37. package/MenuButton.svelte.d.ts +7 -3
  38. package/MenuItem.svelte +256 -288
  39. package/MenuItem.svelte.d.ts +2 -2
  40. package/MenuItemDisplay.svelte +12 -116
  41. package/MenuItemDisplay.svelte.d.ts +21 -7
  42. package/MenuSeparator.svelte +6 -45
  43. package/MenuSeparator.svelte.d.ts +8 -78
  44. package/Popover.constants.d.ts +2 -0
  45. package/{floating-ui.constants.js → Popover.constants.js} +10 -9
  46. package/Popover.svelte +72 -82
  47. package/Popover.svelte.d.ts +10 -5
  48. package/Popover.types.d.ts +4 -0
  49. package/Progress.svelte +28 -126
  50. package/Progress.svelte.d.ts +4 -3
  51. package/Radio.svelte +49 -192
  52. package/Radio.svelte.d.ts +2 -2
  53. package/RgbColorSliders.svelte +48 -137
  54. package/RgbColorSliders.svelte.d.ts +5 -5
  55. package/Select.svelte +124 -251
  56. package/Select.svelte.d.ts +6 -2
  57. package/Slider.svelte +90 -259
  58. package/Slider.svelte.d.ts +1 -2
  59. package/Switch.svelte +24 -259
  60. package/Switch.svelte.d.ts +3 -1
  61. package/Tab.svelte +27 -175
  62. package/Tab.svelte.d.ts +6 -4
  63. package/TabList.svelte +146 -171
  64. package/TabList.svelte.d.ts +3 -2
  65. package/TabList.types.d.ts +6 -1
  66. package/TextArea.svelte +32 -129
  67. package/TextArea.svelte.d.ts +1 -1
  68. package/Tooltip.svelte +88 -222
  69. package/Tooltip.svelte.d.ts +21 -13
  70. package/Tree.constants.d.ts +0 -1
  71. package/Tree.constants.js +0 -1
  72. package/Tree.svelte +35 -119
  73. package/Tree.svelte.d.ts +4 -4
  74. package/Tree.types.d.ts +1 -3
  75. package/TreeChevron.svelte +18 -98
  76. package/TreeChevron.svelte.d.ts +1 -0
  77. package/TreeItem.constants.d.ts +1 -0
  78. package/TreeItem.constants.js +1 -0
  79. package/TreeItem.svelte +251 -211
  80. package/TreeItem.svelte.d.ts +7 -3
  81. package/TreeItem.types.d.ts +1 -1
  82. package/TreeItemDisplay.svelte +20 -104
  83. package/TreeItemDisplay.svelte.d.ts +2 -2
  84. package/actions/applyLightDarkMode.d.ts +10 -0
  85. package/actions/applyLightDarkMode.js +36 -0
  86. package/actions/forwardEvents.js +3 -3
  87. package/css/Button.base.css +74 -0
  88. package/css/Button.colorful.css +17 -0
  89. package/css/Button.css +7 -0
  90. package/css/Button.secondary.colorful.css +15 -0
  91. package/css/Button.secondary.css +11 -0
  92. package/css/Button.shapes.css +14 -0
  93. package/css/Button.tool.colorful.css +13 -0
  94. package/css/Button.tool.css +18 -0
  95. package/css/Callout.base.css +43 -0
  96. package/css/Callout.colorful.css +5 -0
  97. package/css/Callout.css +2 -0
  98. package/css/Checkbox.base.css +145 -0
  99. package/css/Checkbox.colorful.css +17 -0
  100. package/css/Checkbox.css +2 -0
  101. package/css/ColorPicker.base.css +23 -0
  102. package/css/ColorPicker.css +1 -0
  103. package/css/Dialog.base.css +116 -0
  104. package/css/Dialog.css +1 -0
  105. package/css/Dropdown.base.css +147 -0
  106. package/css/Dropdown.colorful.css +23 -0
  107. package/css/Dropdown.css +2 -0
  108. package/css/HexColorSliders.base.css +106 -0
  109. package/css/HexColorSliders.css +1 -0
  110. package/css/HslColorSliders.base.css +124 -0
  111. package/css/HslColorSliders.css +1 -0
  112. package/css/Input.base.css +100 -0
  113. package/css/Input.colorful.css +22 -0
  114. package/css/Input.composed.css +8 -0
  115. package/css/Input.css +3 -0
  116. package/css/Label.base.css +119 -0
  117. package/css/Label.boxed.colorful.css +21 -0
  118. package/css/Label.boxed.css +31 -0
  119. package/css/Label.colorful.css +3 -0
  120. package/css/Label.css +4 -0
  121. package/css/Link.base.css +52 -0
  122. package/css/Link.colorful.css +15 -0
  123. package/css/Link.css +6 -0
  124. package/css/Link.ghost.colorful.css +7 -0
  125. package/css/Link.ghost.css +11 -0
  126. package/css/Link.undecorated.colorful.css +6 -0
  127. package/css/Link.undecorated.css +6 -0
  128. package/css/List.base.css +98 -0
  129. package/css/List.css +1 -0
  130. package/css/ListItem.base.css +59 -0
  131. package/css/ListItem.css +1 -0
  132. package/css/Menu.base.css +21 -0
  133. package/css/Menu.css +1 -0
  134. package/css/MenuBar.base.css +9 -0
  135. package/css/MenuBar.css +1 -0
  136. package/css/MenuButton.base.css +13 -0
  137. package/css/MenuButton.css +1 -0
  138. package/css/MenuItem.base.css +48 -0
  139. package/css/MenuItem.css +1 -0
  140. package/css/MenuItemDisplay.base.css +104 -0
  141. package/css/MenuItemDisplay.css +1 -0
  142. package/css/MenuSeparator.base.css +5 -0
  143. package/css/MenuSeparator.css +1 -0
  144. package/css/Popover copy.css +21 -0
  145. package/css/Popover.css +21 -0
  146. package/css/Progress.base.css +99 -0
  147. package/css/Progress.css +1 -0
  148. package/css/Radio.base.css +135 -0
  149. package/css/Radio.colorful.css +18 -0
  150. package/css/Radio.css +2 -0
  151. package/css/RgbColorSliders.base.css +94 -0
  152. package/css/RgbColorSliders.css +1 -0
  153. package/css/Select.base.css +127 -0
  154. package/css/Select.colorful.css +24 -0
  155. package/css/Select.composed.css +12 -0
  156. package/css/Select.css +3 -0
  157. package/css/Slider.base.css +182 -0
  158. package/css/Slider.colorful.css +11 -0
  159. package/css/Slider.composed.css +8 -0
  160. package/css/Slider.css +3 -0
  161. package/css/Switch.base.css +193 -0
  162. package/css/Switch.colorful.css +39 -0
  163. package/css/Switch.css +2 -0
  164. package/css/Tab.base.css +135 -0
  165. package/css/Tab.colorful.css +13 -0
  166. package/css/Tab.css +2 -0
  167. package/css/TabList.base.css +34 -0
  168. package/css/TabList.css +1 -0
  169. package/css/TextArea.base.css +85 -0
  170. package/css/TextArea.colorful.css +17 -0
  171. package/css/TextArea.composed.css +8 -0
  172. package/css/TextArea.css +3 -0
  173. package/css/Tooltip.base.css +6 -0
  174. package/css/Tooltip.css +1 -0
  175. package/css/Tree.base.css +74 -0
  176. package/css/Tree.composed.css +8 -0
  177. package/css/Tree.css +2 -0
  178. package/css/TreeChevron.base.css +86 -0
  179. package/css/TreeChevron.css +1 -0
  180. package/css/TreeItem.base.css +3 -0
  181. package/css/TreeItem.css +1 -0
  182. package/css/TreeItemDisplay.base.css +74 -0
  183. package/css/TreeItemDisplay.colorful.css +9 -0
  184. package/css/TreeItemDisplay.css +1 -0
  185. package/css/dark-mode.css +134 -0
  186. package/css/light-mode.css +134 -0
  187. package/css/sterling.css +37 -0
  188. package/index.d.ts +13 -18
  189. package/index.js +11 -15
  190. package/mediaQueries/prefersColorSchemeDark.d.ts +2 -0
  191. package/mediaQueries/prefersColorSchemeDark.js +10 -0
  192. package/{stores → mediaQueries}/prefersReducedMotion.d.ts +1 -0
  193. package/{stores → mediaQueries}/usingKeyboard.d.ts +1 -0
  194. package/package.json +136 -19
  195. package/Link.constants.d.ts +0 -1
  196. package/Link.constants.js +0 -1
  197. package/Link.types.d.ts +0 -4
  198. package/Tooltip.constants.d.ts +0 -1
  199. package/Tooltip.constants.js +0 -1
  200. package/Tooltip.types.d.ts +0 -4
  201. package/Tooltip.types.js +0 -1
  202. package/floating-ui.constants.d.ts +0 -1
  203. package/floating-ui.types.d.ts +0 -4
  204. package/floating-ui.types.js +0 -1
  205. package/theme/applyDarkTheme.d.ts +0 -7
  206. package/theme/applyDarkTheme.js +0 -11
  207. package/theme/applyLightTheme.d.ts +0 -7
  208. package/theme/applyLightTheme.js +0 -11
  209. package/theme/applyTheme.d.ts +0 -7
  210. package/theme/applyTheme.js +0 -20
  211. package/theme/colors.d.ts +0 -54
  212. package/theme/colors.js +0 -82
  213. package/theme/darkTheme.d.ts +0 -2
  214. package/theme/darkTheme.js +0 -142
  215. package/theme/lightTheme.d.ts +0 -2
  216. package/theme/lightTheme.js +0 -119
  217. package/theme/toggleDarkTheme.d.ts +0 -18
  218. package/theme/toggleDarkTheme.js +0 -53
  219. package/theme/types.d.ts +0 -21
  220. package/theme/types.js +0 -1
  221. /package/{Link.types.js → Popover.types.js} +0 -0
  222. /package/{stores → mediaQueries}/prefersReducedMotion.js +0 -0
  223. /package/{stores → mediaQueries}/usingKeyboard.js +0 -0
package/TreeItem.svelte CHANGED
@@ -1,258 +1,294 @@
1
- <script>import { getContext, setContext } from "svelte";
2
- import { slide } from "svelte/transition";
3
- import { TREE_CONTEXT_KEY, TREE_ITEM_CONTEXT_KEY } from "./Tree.constants";
4
- import TreeItemDisplay from "./TreeItemDisplay.svelte";
5
- import { readable, writable } from "svelte/store";
6
- import { prefersReducedMotion } from "./stores/prefersReducedMotion";
1
+ <script>import { getContext, setContext } from 'svelte';
2
+ import { slide } from 'svelte/transition';
3
+ import { TREE_CONTEXT_KEY } from './Tree.constants';
4
+ 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. */
7
10
  export let disabled = false;
8
- export let text = void 0;
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. */
9
14
  export let value;
15
+ /** Additional class names to apply. */
16
+ export let variant = '';
17
+ // ----- Animation ----- //
10
18
  const slidNoOp = (node, params) => {
11
- return { delay: 0, duration: 0 };
19
+ return { delay: 0, duration: 0 };
12
20
  };
13
- $:
14
- slideMotion = !$prefersReducedMotion ? slide : slidNoOp;
15
- const {
16
- colorful,
17
- disabled: treeDisabled,
18
- expandedValues,
19
- selectedValue
20
- } = getContext(TREE_CONTEXT_KEY);
21
- const { depth = 0 } = getContext(TREE_ITEM_CONTEXT_KEY) || {
22
- colorful: readable(false),
23
- disabled: readable(false),
24
- expandedValues: readable([]),
25
- selectedValue: readable(void 0)
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)
26
27
  };
28
+ // ----- State ----- //
27
29
  let treeItemRef;
28
- $:
29
- hasChildren = $$slots.default;
30
- $:
31
- expanded = $expandedValues.includes(value);
32
- $:
33
- selected = $selectedValue === value;
34
- $:
35
- _disabled = disabled || $treeDisabled;
36
- const disabledStore = writable(disabled);
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);
37
36
  $: {
38
- disabledStore.set(disabled);
37
+ depthStore.set($depth + 1);
39
38
  }
39
+ $: {
40
+ disabledStore.set(_disabled);
41
+ }
42
+ // ----- Expand/Collapse ----- //
40
43
  const collapseItem = (index) => {
41
- if (!_disabled) {
42
- index = index ?? $expandedValues.findIndex((expandedValue) => expandedValue === value);
43
- if (index !== -1) {
44
- expandedValues.set([
45
- ...$expandedValues.slice(0, index),
46
- ...$expandedValues.slice(index + 1)
47
- ]);
48
- return true;
44
+ if (!_disabled) {
45
+ index = index ?? $expandedValues.findIndex((expandedValue) => expandedValue === value);
46
+ if (index !== -1) {
47
+ expandedValues.set([
48
+ ...$expandedValues.slice(0, index),
49
+ ...$expandedValues.slice(index + 1)
50
+ ]);
51
+ return true;
52
+ }
49
53
  }
50
- }
51
- return false;
54
+ return false;
52
55
  };
53
56
  export const collapse = () => collapseItem();
54
57
  const expandItem = (index) => {
55
- if (!_disabled) {
56
- index = index ?? $expandedValues.findIndex((expandedValue) => expandedValue === value);
57
- if (index === -1) {
58
- expandedValues.set([...$expandedValues, value]);
59
- return true;
58
+ if (!_disabled) {
59
+ index = index ?? $expandedValues.findIndex((expandedValue) => expandedValue === value);
60
+ if (index === -1) {
61
+ expandedValues.set([...$expandedValues, value]);
62
+ return true;
63
+ }
60
64
  }
61
- }
62
- return false;
65
+ return false;
63
66
  };
64
67
  export const expand = () => expandItem();
65
68
  export const toggleExpanded = () => {
66
- if (!_disabled) {
67
- const index = $expandedValues.findIndex((expandedValue) => expandedValue === value);
68
- return index !== -1 ? collapseItem(index) : expandItem(index);
69
- }
70
- return false;
69
+ if (!_disabled) {
70
+ const index = $expandedValues.findIndex((expandedValue) => expandedValue === value);
71
+ return index !== -1 ? collapseItem(index) : expandItem(index);
72
+ }
73
+ return false;
71
74
  };
75
+ // ----- Focus ----- //
72
76
  const blurItem = (treeItemElement) => {
73
- if (!_disabled) {
74
- const item = treeItemElement?.querySelector(".item");
75
- item?.blur();
76
- }
77
+ if (!_disabled) {
78
+ const item = treeItemElement?.querySelector('.item');
79
+ item?.blur();
80
+ }
77
81
  };
78
82
  export const blur = () => {
79
- blurItem(treeItemRef);
83
+ blurItem(treeItemRef);
80
84
  };
81
85
  const focusItem = (treeItemElement, options) => {
82
- if (!_disabled) {
83
- const item = treeItemElement?.querySelector(".item");
84
- item?.focus(options);
85
- }
86
+ if (!_disabled) {
87
+ const item = treeItemElement?.querySelector('.item');
88
+ item?.focus(options);
89
+ }
86
90
  };
87
91
  export const focus = (options) => {
88
- focusItem(treeItemRef);
89
- treeItemRef?.focus(options);
92
+ focusItem(treeItemRef);
93
+ treeItemRef?.focus(options);
90
94
  };
95
+ // ----- Click ----- //
91
96
  const clickItem = (treeItemElement) => {
92
- if (!_disabled) {
93
- const item = treeItemElement?.querySelector(".item");
94
- item?.click();
95
- }
97
+ if (!_disabled) {
98
+ const item = treeItemElement?.querySelector('.item');
99
+ item?.click();
100
+ }
96
101
  };
97
102
  export const click = () => {
98
- clickItem(treeItemRef);
103
+ clickItem(treeItemRef);
99
104
  };
100
- const selectItemByValue = (value2) => {
101
- if (!_disabled) {
102
- selectedValue.set(value2);
103
- }
105
+ // ----- Selection ----- //
106
+ const selectItemByValue = (value) => {
107
+ if (!_disabled) {
108
+ selectedValue.set(value);
109
+ }
104
110
  };
105
111
  export const select = () => {
106
- if (!_disabled) {
107
- selectItemByValue(value);
108
- }
112
+ if (!_disabled) {
113
+ selectItemByValue(value);
114
+ }
109
115
  };
110
116
  export const selectParent = () => {
111
- if (!_disabled) {
112
- let candidate = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
113
- let candidateValue = candidate?.getAttribute("data-value");
114
- if (candidateValue && candidate) {
115
- selectItemByValue(candidateValue);
116
- focusItem(candidate);
117
- return true;
117
+ if (!_disabled) {
118
+ let candidate = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
119
+ let candidateValue = candidate?.getAttribute('data-value');
120
+ if (candidateValue && candidate) {
121
+ selectItemByValue(candidateValue);
122
+ focusItem(candidate);
123
+ return true;
124
+ }
118
125
  }
119
- }
120
- return false;
126
+ return false;
121
127
  };
122
128
  export const selectPrevious = () => {
123
- if (!_disabled) {
124
- let candidate = void 0;
125
- let candidateValue = void 0;
126
- const previousSibling = treeItemRef?.previousElementSibling;
127
- if (previousSibling) {
128
- const decendants = previousSibling.querySelectorAll('[role="treeitem"][data-value]');
129
- if (decendants) {
130
- candidate = decendants[decendants.length - 1];
131
- candidateValue = candidate?.getAttribute("data-value");
132
- }
133
- if (!candidateValue) {
134
- candidate = previousSibling;
135
- candidateValue = candidate?.getAttribute("data-value");
136
- }
137
- }
138
- if (!candidateValue) {
139
- candidate = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
140
- candidateValue = candidate?.getAttribute("data-value");
141
- }
142
- if (candidateValue && candidate) {
143
- selectItemByValue(candidateValue);
144
- focusItem(candidate);
145
- return true;
129
+ if (!_disabled) {
130
+ let candidate = undefined;
131
+ let candidateValue = undefined;
132
+ const previousSibling = treeItemRef?.previousElementSibling;
133
+ if (previousSibling) {
134
+ // look for the last (recursive) decendant of ths previous sibling
135
+ const decendants = previousSibling.querySelectorAll('[role="treeitem"][data-value]');
136
+ if (decendants) {
137
+ candidate = decendants[decendants.length - 1];
138
+ candidateValue = candidate?.getAttribute('data-value');
139
+ }
140
+ // look for the previous sibling
141
+ if (!candidateValue) {
142
+ candidate = previousSibling;
143
+ candidateValue = candidate?.getAttribute('data-value');
144
+ }
145
+ }
146
+ // look for the parent
147
+ if (!candidateValue) {
148
+ candidate = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
149
+ candidateValue = candidate?.getAttribute('data-value');
150
+ }
151
+ if (candidateValue && candidate) {
152
+ selectItemByValue(candidateValue);
153
+ focusItem(candidate);
154
+ return true;
155
+ }
146
156
  }
147
- }
148
- return false;
157
+ return false;
149
158
  };
150
159
  export const selectNext = () => {
151
- if (!_disabled) {
152
- let candidateValue = void 0;
153
- let candidate = treeItemRef.querySelector('[role="treeitem"][data-value]');
154
- candidateValue = candidate?.getAttribute("data-value");
155
- if (!candidateValue) {
156
- candidate = treeItemRef.nextElementSibling;
157
- while (candidate && candidate.getAttribute("data-value") === null) {
158
- candidate = candidate.nextElementSibling;
159
- }
160
- candidateValue = candidate?.getAttribute("data-value");
161
- }
162
- if (!candidateValue) {
163
- let ancestor = treeItemRef.parentElement?.closest(
164
- '[role="treeitem"][data-value]'
165
- );
166
- while (ancestor && !candidateValue) {
167
- candidate = ancestor?.nextElementSibling;
168
- candidateValue = candidate?.getAttribute("data-value");
169
- ancestor = ancestor.parentElement?.closest('[role="treeitem"][data-value]');
170
- }
171
- }
172
- if (candidateValue && candidate) {
173
- selectItemByValue(candidateValue);
174
- focusItem(candidate);
175
- return true;
160
+ if (!_disabled) {
161
+ let candidateValue = undefined;
162
+ // look for decendants
163
+ let candidate = treeItemRef.querySelector('[role="treeitem"][data-value]');
164
+ candidateValue = candidate?.getAttribute('data-value');
165
+ // look for next sibling
166
+ if (!candidateValue) {
167
+ candidate = treeItemRef.nextElementSibling;
168
+ while (candidate && candidate.getAttribute('data-value') === null) {
169
+ candidate = candidate.nextElementSibling;
170
+ }
171
+ candidateValue = candidate?.getAttribute('data-value');
172
+ }
173
+ // look for next sibling of ancestor
174
+ if (!candidateValue) {
175
+ let ancestor = treeItemRef.parentElement?.closest('[role="treeitem"][data-value]');
176
+ while (ancestor && !candidateValue) {
177
+ candidate = ancestor?.nextElementSibling;
178
+ candidateValue = candidate?.getAttribute('data-value');
179
+ ancestor = ancestor.parentElement?.closest('[role="treeitem"][data-value]');
180
+ }
181
+ }
182
+ if (candidateValue && candidate) {
183
+ selectItemByValue(candidateValue);
184
+ focusItem(candidate);
185
+ return true;
186
+ }
176
187
  }
177
- }
178
- return false;
188
+ return false;
179
189
  };
190
+ // ----- Event Handlers ----- //
180
191
  const onClick = () => {
181
- if (!_disabled) {
182
- toggleExpanded();
183
- select();
184
- }
192
+ if (!_disabled) {
193
+ toggleExpanded();
194
+ select();
195
+ }
185
196
  };
186
197
  const onKeydown = (event) => {
187
- if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
188
- switch (event.key) {
189
- case "Enter":
190
- case " ":
191
- if (toggleExpanded()) {
192
- event.preventDefault();
193
- event.stopPropagation();
194
- return false;
195
- }
196
- break;
197
- case "ArrowRight":
198
- if (hasChildren) {
199
- if (expanded) {
200
- if (selectNext()) {
201
- event.preventDefault();
202
- event.stopPropagation();
203
- return false;
204
- }
205
- } else if (expandItem()) {
206
- event.preventDefault();
207
- event.stopPropagation();
208
- return false;
209
- }
198
+ if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
199
+ switch (event.key) {
200
+ case 'Enter':
201
+ case ' ':
202
+ if (toggleExpanded()) {
203
+ event.preventDefault();
204
+ event.stopPropagation();
205
+ return false;
206
+ }
207
+ break;
208
+ case 'ArrowRight':
209
+ /*
210
+ When focus is on a closed item, opens the item; focus does not move.
211
+ When focus is on an open item, moves focus to the first child item.
212
+ When focus is on an end item (a tree item with no children), does nothing.
213
+ */
214
+ if (hasChildren) {
215
+ if (expanded) {
216
+ if (selectNext()) {
217
+ event.preventDefault();
218
+ event.stopPropagation();
219
+ return false;
220
+ }
221
+ }
222
+ else if (expandItem()) {
223
+ event.preventDefault();
224
+ event.stopPropagation();
225
+ return false;
226
+ }
227
+ }
228
+ break;
229
+ case 'ArrowLeft':
230
+ /*
231
+ When focus is on an open item, closes the item.
232
+ 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
+ When focus is on a closed `tree`, does nothing.
234
+ */
235
+ if (hasChildren && expanded) {
236
+ if (collapseItem()) {
237
+ event.preventDefault();
238
+ event.stopPropagation();
239
+ return false;
240
+ }
241
+ }
242
+ else if (selectParent()) {
243
+ event.preventDefault();
244
+ event.stopPropagation();
245
+ return false;
246
+ }
247
+ break;
248
+ case 'ArrowUp':
249
+ /*
250
+ Moves focus to the previous item that is focusable without opening or closing a item.
251
+ */
252
+ if (selectPrevious()) {
253
+ event.preventDefault();
254
+ event.stopPropagation();
255
+ return false;
256
+ }
257
+ break;
258
+ case 'ArrowDown':
259
+ /*
260
+ Moves focus to the next item that is focusable without opening or closing a item.
261
+ */
262
+ if (selectNext()) {
263
+ event.preventDefault();
264
+ event.stopPropagation();
265
+ return false;
266
+ }
267
+ break;
210
268
  }
211
- break;
212
- case "ArrowLeft":
213
- if (hasChildren && expanded) {
214
- if (collapseItem()) {
215
- event.preventDefault();
216
- event.stopPropagation();
217
- return false;
218
- }
219
- } else if (selectParent()) {
220
- event.preventDefault();
221
- event.stopPropagation();
222
- return false;
223
- }
224
- break;
225
- case "ArrowUp":
226
- if (selectPrevious()) {
227
- event.preventDefault();
228
- event.stopPropagation();
229
- return false;
230
- }
231
- break;
232
- case "ArrowDown":
233
- if (selectNext()) {
234
- event.preventDefault();
235
- event.stopPropagation();
236
- return false;
237
- }
238
- break;
239
269
  }
240
- }
241
270
  };
242
- setContext(TREE_ITEM_CONTEXT_KEY, { depth: depth + 1, disabled: disabledStore });
271
+ // ----- Set Context ----- //
272
+ setContext(TREE_ITEM_CONTEXT_KEY, {
273
+ depth: depthStore,
274
+ disabled: disabledStore
275
+ });
243
276
  </script>
244
277
 
245
278
  <!--
246
279
  @component
247
280
  A item in a Tree displaying the item and children.
248
281
  -->
282
+ <!-- svelte-ignore a11y-interactive-supports-focus -->
249
283
  <div
250
284
  aria-selected={selected ? true : undefined}
251
285
  aria-expanded={expanded}
252
286
  bind:this={treeItemRef}
253
- class="sterling-tree-item"
254
- class:colorful={$colorful}
287
+ class={`sterling-tree-item ${variant}`}
255
288
  class:disabled={_disabled}
289
+ class:item-disabled={disabled}
290
+ class:parent-disabled={$parentDisabled}
291
+ class:tree-disabled={$treeDisabled}
256
292
  data-value={value}
257
293
  role="treeitem"
258
294
  on:blur
@@ -288,42 +324,52 @@ A item in a Tree displaying the item and children.
288
324
  on:wheel|passive
289
325
  {...$$restProps}
290
326
  >
291
- <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
292
327
  <div
328
+ aria-selected={selected ? true : undefined}
293
329
  class="item"
294
330
  class:selected
331
+ role="treeitem"
295
332
  tabindex={selected ? 0 : -1}
296
333
  on:click={onClick}
297
334
  on:keydown={onKeydown}
298
335
  >
299
- <slot name="item" {depth} disabled={_disabled} {expanded} {hasChildren} {selected} {value}>
336
+ <slot
337
+ name="item"
338
+ {depth}
339
+ disabled={_disabled}
340
+ {expanded}
341
+ {hasChildren}
342
+ {selected}
343
+ {value}
344
+ {variant}
345
+ >
300
346
  <TreeItemDisplay
301
- colorful={$colorful}
302
- {depth}
303
- disabled={_disabled}
347
+ depth={$depth}
348
+ disabled={_disabled && !$treeDisabled}
304
349
  {expanded}
305
350
  {hasChildren}
306
351
  {selected}
307
352
  {value}
353
+ {variant}
308
354
  >
309
355
  <svelte:fragment
310
- let:colorful
311
356
  let:depth
312
357
  let:disabled
313
358
  let:expanded
314
359
  let:hasChildren
315
360
  let:selected
316
361
  let:value
362
+ let:variant
317
363
  >
318
364
  <slot
319
365
  name="label"
320
- {colorful}
321
366
  {depth}
322
367
  {disabled}
323
368
  {expanded}
324
369
  {hasChildren}
325
370
  {selected}
326
- {value}>{text || value}</slot
371
+ {value}
372
+ {variant}>{text || value}</slot
327
373
  >
328
374
  </svelte:fragment>
329
375
  </TreeItemDisplay>
@@ -331,13 +377,7 @@ A item in a Tree displaying the item and children.
331
377
  </div>
332
378
  {#if expanded && hasChildren}
333
379
  <div class="children" transition:slideMotion|global={{ duration: 200 }} role="group">
334
- <slot {depth} {selected} {value} />
380
+ <slot depth={$depth} disabled={_disabled} {selected} {value} {variant} />
335
381
  </div>
336
382
  {/if}
337
383
  </div>
338
-
339
- <style>
340
- .item {
341
- outline: none;
342
- }
343
- </style>
@@ -5,6 +5,7 @@ declare const __propDef: {
5
5
  disabled?: boolean | undefined;
6
6
  text?: string | undefined;
7
7
  value: string;
8
+ variant?: string | undefined;
8
9
  collapse?: (() => boolean) | undefined;
9
10
  expand?: (() => boolean) | undefined;
10
11
  toggleExpanded?: (() => boolean) | undefined;
@@ -53,26 +54,29 @@ declare const __propDef: {
53
54
  };
54
55
  slots: {
55
56
  item: {
56
- depth: number;
57
+ depth: import("svelte/store").Readable<number>;
57
58
  disabled: boolean;
58
59
  expanded: boolean;
59
60
  hasChildren: boolean;
60
61
  selected: boolean;
61
62
  value: string;
63
+ variant: string;
62
64
  };
63
65
  label: {
64
- colorful: import("svelte/store").Readable<boolean>;
65
- depth: number;
66
+ depth: import("svelte/store").Readable<number>;
66
67
  disabled: boolean;
67
68
  expanded: boolean;
68
69
  hasChildren: boolean;
69
70
  selected: boolean;
70
71
  value: string;
72
+ variant: string;
71
73
  };
72
74
  default: {
73
75
  depth: number;
76
+ disabled: boolean;
74
77
  selected: boolean;
75
78
  value: string;
79
+ variant: string;
76
80
  };
77
81
  };
78
82
  };
@@ -7,7 +7,7 @@ export type TreeItemContext = {
7
7
  * The depth of this tree item within the tree hierarchy.
8
8
  * Starts at zero.
9
9
  */
10
- depth: number;
10
+ depth: Readable<number>;
11
11
  /** When true, the three item is disabled. */
12
12
  disabled: Readable<boolean>;
13
13
  };