@geoffcox/sterling-svelte 1.0.12 → 2.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 (325) hide show
  1. package/.DS_Store +0 -0
  2. package/Button.svelte +25 -0
  3. package/Button.svelte.d.ts +9 -0
  4. package/{dist/Callout.svelte → Callout.svelte} +47 -72
  5. package/Callout.svelte.d.ts +15 -0
  6. package/Callout.types.d.ts +11 -0
  7. package/Checkbox.svelte +43 -0
  8. package/Checkbox.svelte.d.ts +10 -0
  9. package/{dist/Dialog.svelte → Dialog.svelte} +30 -38
  10. package/Dialog.svelte.d.ts +14 -0
  11. package/{dist/Dropdown.svelte → Dropdown.svelte} +39 -71
  12. package/Dropdown.svelte.d.ts +18 -0
  13. package/Input.svelte +55 -0
  14. package/Input.svelte.d.ts +12 -0
  15. package/Label.svelte +91 -0
  16. package/Label.svelte.d.ts +17 -0
  17. package/Link.svelte +25 -0
  18. package/Link.svelte.d.ts +12 -0
  19. package/{dist/List.svelte → List.svelte} +35 -85
  20. package/List.svelte.d.ts +20 -0
  21. package/List.types.d.ts +5 -0
  22. package/ListItem.svelte +49 -0
  23. package/ListItem.svelte.d.ts +13 -0
  24. package/{dist/Menu.svelte → Menu.svelte} +18 -45
  25. package/Menu.svelte.d.ts +13 -0
  26. package/{dist/MenuBar.svelte → MenuBar.svelte} +36 -78
  27. package/MenuBar.svelte.d.ts +13 -0
  28. package/MenuButton.svelte +116 -0
  29. package/MenuButton.svelte.d.ts +20 -0
  30. package/{dist/MenuItem.svelte → MenuItem.svelte} +107 -151
  31. package/MenuItem.svelte.d.ts +22 -0
  32. package/{dist/MenuItem.types.d.ts → MenuItem.types.d.ts} +1 -9
  33. package/MenuSeparator.svelte +11 -0
  34. package/MenuSeparator.svelte.d.ts +6 -0
  35. package/{dist/Popover.svelte → Popover.svelte} +45 -64
  36. package/Popover.svelte.d.ts +15 -0
  37. package/Progress.constants.d.ts +1 -0
  38. package/Progress.constants.js +1 -0
  39. package/Progress.svelte +36 -0
  40. package/Progress.svelte.d.ts +12 -0
  41. package/Progress.types.d.ts +4 -0
  42. package/Radio.svelte +53 -0
  43. package/Radio.svelte.d.ts +13 -0
  44. package/{dist/Select.svelte → Select.svelte} +55 -94
  45. package/Select.svelte.d.ts +20 -0
  46. package/Slider.svelte +133 -0
  47. package/Slider.svelte.d.ts +19 -0
  48. package/Switch.svelte +61 -0
  49. package/Switch.svelte.d.ts +21 -0
  50. package/Tab.svelte +51 -0
  51. package/Tab.svelte.d.ts +12 -0
  52. package/{dist/TabList.svelte → TabList.svelte} +50 -76
  53. package/TabList.svelte.d.ts +18 -0
  54. package/TabList.types.d.ts +5 -0
  55. package/{dist/TextArea.svelte → TextArea.svelte} +17 -59
  56. package/TextArea.svelte.d.ts +19 -0
  57. package/Tooltip.svelte +63 -0
  58. package/Tooltip.svelte.d.ts +10 -0
  59. package/Tree.svelte +53 -0
  60. package/Tree.svelte.d.ts +15 -0
  61. package/Tree.types.d.ts +5 -0
  62. package/TreeChevron.svelte +27 -0
  63. package/TreeChevron.svelte.d.ts +9 -0
  64. package/{dist/TreeItem.svelte → TreeItem.svelte} +105 -159
  65. package/TreeItem.svelte.d.ts +22 -0
  66. package/TreeItem.types.d.ts +4 -0
  67. package/{dist/actions → actions}/clickOutside.d.ts +1 -0
  68. package/{dist/actions → actions}/clickOutside.js +1 -0
  69. package/actions/extraClass.d.ts +8 -0
  70. package/actions/extraClass.js +14 -0
  71. package/{dist/index.d.ts → index.d.ts} +4 -12
  72. package/{dist/index.js → index.js} +3 -9
  73. package/package.json +26 -28
  74. package/README.md +0 -18
  75. package/dist/Button.constants.d.ts +0 -2
  76. package/dist/Button.constants.js +0 -2
  77. package/dist/Button.svelte +0 -63
  78. package/dist/Button.svelte.d.ts +0 -65
  79. package/dist/Button.types.d.ts +0 -6
  80. package/dist/Callout.svelte.d.ts +0 -56
  81. package/dist/Checkbox.svelte +0 -79
  82. package/dist/Checkbox.svelte.d.ts +0 -63
  83. package/dist/ColorPicker.constants.d.ts +0 -1
  84. package/dist/ColorPicker.constants.js +0 -1
  85. package/dist/ColorPicker.svelte +0 -287
  86. package/dist/ColorPicker.svelte.d.ts +0 -52
  87. package/dist/ColorPicker.types.d.ts +0 -4
  88. package/dist/ColorPicker.types.js +0 -1
  89. package/dist/Dialog.svelte.d.ts +0 -37
  90. package/dist/Dropdown.svelte.d.ts +0 -77
  91. package/dist/HexColorSliders.svelte +0 -103
  92. package/dist/HexColorSliders.svelte.d.ts +0 -51
  93. package/dist/HslColorSliders.svelte +0 -128
  94. package/dist/HslColorSliders.svelte.d.ts +0 -51
  95. package/dist/Input.svelte +0 -89
  96. package/dist/Input.svelte.d.ts +0 -74
  97. package/dist/Label.svelte +0 -197
  98. package/dist/Label.svelte.d.ts +0 -82
  99. package/dist/Label.types.d.ts +0 -6
  100. package/dist/Label.types.js +0 -1
  101. package/dist/Link.svelte +0 -57
  102. package/dist/Link.svelte.d.ts +0 -65
  103. package/dist/List.svelte.d.ts +0 -75
  104. package/dist/List.types.d.ts +0 -13
  105. package/dist/ListItem.svelte +0 -78
  106. package/dist/ListItem.svelte.d.ts +0 -67
  107. package/dist/Menu.svelte.d.ts +0 -63
  108. package/dist/MenuBar.svelte.d.ts +0 -58
  109. package/dist/MenuButton.svelte +0 -145
  110. package/dist/MenuButton.svelte.d.ts +0 -71
  111. package/dist/MenuItem.svelte.d.ts +0 -83
  112. package/dist/MenuItemDisplay.svelte +0 -32
  113. package/dist/MenuItemDisplay.svelte.d.ts +0 -39
  114. package/dist/MenuSeparator.svelte +0 -9
  115. package/dist/MenuSeparator.svelte.d.ts +0 -20
  116. package/dist/Popover.svelte.d.ts +0 -59
  117. package/dist/Progress.constants.d.ts +0 -1
  118. package/dist/Progress.constants.js +0 -1
  119. package/dist/Progress.svelte +0 -83
  120. package/dist/Progress.svelte.d.ts +0 -61
  121. package/dist/Progress.types.d.ts +0 -4
  122. package/dist/Radio.svelte +0 -126
  123. package/dist/Radio.svelte.d.ts +0 -65
  124. package/dist/RgbColorSliders.svelte +0 -93
  125. package/dist/RgbColorSliders.svelte.d.ts +0 -24
  126. package/dist/Select.svelte.d.ts +0 -83
  127. package/dist/Slider.svelte +0 -190
  128. package/dist/Slider.svelte.d.ts +0 -66
  129. package/dist/Switch.svelte +0 -110
  130. package/dist/Switch.svelte.d.ts +0 -74
  131. package/dist/Tab.svelte +0 -94
  132. package/dist/Tab.svelte.d.ts +0 -71
  133. package/dist/TabList.svelte.d.ts +0 -70
  134. package/dist/TabList.types.d.ts +0 -13
  135. package/dist/TextArea.svelte.d.ts +0 -69
  136. package/dist/Tooltip.svelte +0 -106
  137. package/dist/Tooltip.svelte.d.ts +0 -70
  138. package/dist/Tree.svelte +0 -104
  139. package/dist/Tree.svelte.d.ts +0 -67
  140. package/dist/Tree.types.d.ts +0 -13
  141. package/dist/TreeChevron.svelte +0 -66
  142. package/dist/TreeChevron.svelte.d.ts +0 -53
  143. package/dist/TreeItem.svelte.d.ts +0 -101
  144. package/dist/TreeItem.types.d.ts +0 -14
  145. package/dist/TreeItemDisplay.svelte +0 -74
  146. package/dist/TreeItemDisplay.svelte.d.ts +0 -73
  147. package/dist/css/Button.base.css +0 -54
  148. package/dist/css/Button.colorful.css +0 -17
  149. package/dist/css/Button.css +0 -8
  150. package/dist/css/Button.disabled.css +0 -22
  151. package/dist/css/Button.secondary.colorful.css +0 -15
  152. package/dist/css/Button.secondary.css +0 -11
  153. package/dist/css/Button.shapes.css +0 -14
  154. package/dist/css/Button.tool.colorful.css +0 -13
  155. package/dist/css/Button.tool.css +0 -18
  156. package/dist/css/Callout.base.css +0 -55
  157. package/dist/css/Callout.colorful.css +0 -5
  158. package/dist/css/Callout.css +0 -2
  159. package/dist/css/Checkbox.base.css +0 -121
  160. package/dist/css/Checkbox.colorful.css +0 -17
  161. package/dist/css/Checkbox.css +0 -3
  162. package/dist/css/Checkbox.disabled.css +0 -28
  163. package/dist/css/ColorPicker.base.css +0 -23
  164. package/dist/css/ColorPicker.css +0 -1
  165. package/dist/css/Dialog.base.css +0 -114
  166. package/dist/css/Dialog.css +0 -1
  167. package/dist/css/Dropdown.base.css +0 -105
  168. package/dist/css/Dropdown.colorful.css +0 -23
  169. package/dist/css/Dropdown.composed.css +0 -11
  170. package/dist/css/Dropdown.css +0 -4
  171. package/dist/css/Dropdown.disabled.css +0 -32
  172. package/dist/css/HexColorSliders.base.css +0 -87
  173. package/dist/css/HexColorSliders.css +0 -1
  174. package/dist/css/HslColorSliders.base.css +0 -105
  175. package/dist/css/HslColorSliders.css +0 -1
  176. package/dist/css/Input.base.css +0 -72
  177. package/dist/css/Input.colorful.css +0 -22
  178. package/dist/css/Input.composed.css +0 -12
  179. package/dist/css/Input.css +0 -4
  180. package/dist/css/Input.disabled.css +0 -24
  181. package/dist/css/Label.base.css +0 -114
  182. package/dist/css/Label.boxed.colorful.css +0 -21
  183. package/dist/css/Label.boxed.css +0 -31
  184. package/dist/css/Label.colorful.css +0 -3
  185. package/dist/css/Label.css +0 -5
  186. package/dist/css/Label.disabled.css +0 -9
  187. package/dist/css/Link.base.css +0 -43
  188. package/dist/css/Link.colorful.css +0 -15
  189. package/dist/css/Link.css +0 -11
  190. package/dist/css/Link.disabled.css +0 -10
  191. package/dist/css/Link.ghost.colorful.css +0 -7
  192. package/dist/css/Link.ghost.css +0 -11
  193. package/dist/css/Link.text-underline.css +0 -8
  194. package/dist/css/Link.text-underline.ghost.css +0 -13
  195. package/dist/css/Link.undecorated.colorful.css +0 -8
  196. package/dist/css/Link.undecorated.css +0 -8
  197. package/dist/css/Link.undecorated.ghost.css +0 -8
  198. package/dist/css/Link.undecorated.underline.css +0 -8
  199. package/dist/css/List.base.css +0 -84
  200. package/dist/css/List.composed.css +0 -8
  201. package/dist/css/List.css +0 -3
  202. package/dist/css/List.disabled.css +0 -7
  203. package/dist/css/ListItem.base.css +0 -33
  204. package/dist/css/ListItem.css +0 -2
  205. package/dist/css/ListItem.disabled.css +0 -28
  206. package/dist/css/Menu.base.css +0 -21
  207. package/dist/css/Menu.css +0 -1
  208. package/dist/css/MenuBar.base.css +0 -9
  209. package/dist/css/MenuBar.css +0 -1
  210. package/dist/css/MenuButton.base.css +0 -13
  211. package/dist/css/MenuButton.css +0 -1
  212. package/dist/css/MenuItem.base.css +0 -48
  213. package/dist/css/MenuItem.css +0 -1
  214. package/dist/css/MenuItemDisplay.base.css +0 -79
  215. package/dist/css/MenuItemDisplay.css +0 -2
  216. package/dist/css/MenuItemDisplay.disabled.css +0 -28
  217. package/dist/css/MenuSeparator.base.css +0 -5
  218. package/dist/css/MenuSeparator.css +0 -1
  219. package/dist/css/Popover.css +0 -21
  220. package/dist/css/Progress.base.css +0 -85
  221. package/dist/css/Progress.css +0 -2
  222. package/dist/css/Progress.disabled.css +0 -17
  223. package/dist/css/Radio.base.css +0 -109
  224. package/dist/css/Radio.colorful.css +0 -18
  225. package/dist/css/Radio.css +0 -3
  226. package/dist/css/Radio.disabled.css +0 -28
  227. package/dist/css/RgbColorSliders.base.css +0 -94
  228. package/dist/css/RgbColorSliders.css +0 -1
  229. package/dist/css/Select.base.css +0 -101
  230. package/dist/css/Select.colorful.css +0 -24
  231. package/dist/css/Select.composed.css +0 -12
  232. package/dist/css/Select.css +0 -4
  233. package/dist/css/Select.disabled.css +0 -28
  234. package/dist/css/Slider.base.css +0 -152
  235. package/dist/css/Slider.colorful.css +0 -11
  236. package/dist/css/Slider.composed.css +0 -8
  237. package/dist/css/Slider.css +0 -4
  238. package/dist/css/Slider.disabled.css +0 -30
  239. package/dist/css/Switch.base.css +0 -175
  240. package/dist/css/Switch.colorful.css +0 -45
  241. package/dist/css/Switch.css +0 -3
  242. package/dist/css/Switch.disabled.css +0 -30
  243. package/dist/css/Tab.base.css +0 -96
  244. package/dist/css/Tab.colorful.css +0 -13
  245. package/dist/css/Tab.css +0 -3
  246. package/dist/css/Tab.disabled.css +0 -36
  247. package/dist/css/TabList.base.css +0 -34
  248. package/dist/css/TabList.css +0 -1
  249. package/dist/css/TextArea.base.css +0 -62
  250. package/dist/css/TextArea.colorful.css +0 -17
  251. package/dist/css/TextArea.composed.css +0 -8
  252. package/dist/css/TextArea.css +0 -4
  253. package/dist/css/TextArea.disabled.css +0 -28
  254. package/dist/css/Tooltip.base.css +0 -6
  255. package/dist/css/Tooltip.css +0 -1
  256. package/dist/css/Tree.base.css +0 -49
  257. package/dist/css/Tree.composed.css +0 -8
  258. package/dist/css/Tree.css +0 -3
  259. package/dist/css/Tree.disabled.css +0 -27
  260. package/dist/css/TreeChevron.base.css +0 -86
  261. package/dist/css/TreeChevron.css +0 -1
  262. package/dist/css/TreeItem.base.css +0 -3
  263. package/dist/css/TreeItem.css +0 -1
  264. package/dist/css/TreeItemDisplay.base.css +0 -48
  265. package/dist/css/TreeItemDisplay.colorful.css +0 -9
  266. package/dist/css/TreeItemDisplay.css +0 -3
  267. package/dist/css/TreeItemDisplay.disabled.css +0 -28
  268. package/dist/css/dark-mode.css +0 -134
  269. package/dist/css/light-mode.css +0 -134
  270. package/dist/css/sterling.css +0 -37
  271. package/dist/package.json +0 -108
  272. /package/{dist/@types → @types}/clickOutside.d.ts +0 -0
  273. /package/{dist/Button.types.js → Callout.types.js} +0 -0
  274. /package/{dist/Label.constants.d.ts → Label.constants.d.ts} +0 -0
  275. /package/{dist/Label.constants.js → Label.constants.js} +0 -0
  276. /package/{dist/List.constants.d.ts → List.constants.d.ts} +0 -0
  277. /package/{dist/List.constants.js → List.constants.js} +0 -0
  278. /package/{dist/List.types.js → List.types.js} +0 -0
  279. /package/{dist/MenuBar.constants.d.ts → MenuBar.constants.d.ts} +0 -0
  280. /package/{dist/MenuBar.constants.js → MenuBar.constants.js} +0 -0
  281. /package/{dist/MenuBar.types.d.ts → MenuBar.types.d.ts} +0 -0
  282. /package/{dist/MenuBar.types.js → MenuBar.types.js} +0 -0
  283. /package/{dist/MenuItem.constants.d.ts → MenuItem.constants.d.ts} +0 -0
  284. /package/{dist/MenuItem.constants.js → MenuItem.constants.js} +0 -0
  285. /package/{dist/MenuItem.types.js → MenuItem.types.js} +0 -0
  286. /package/{dist/MenuItem.utils.d.ts → MenuItem.utils.d.ts} +0 -0
  287. /package/{dist/MenuItem.utils.js → MenuItem.utils.js} +0 -0
  288. /package/{dist/Popover.constants.d.ts → Popover.constants.d.ts} +0 -0
  289. /package/{dist/Popover.constants.js → Popover.constants.js} +0 -0
  290. /package/{dist/Popover.types.d.ts → Popover.types.d.ts} +0 -0
  291. /package/{dist/Popover.types.js → Popover.types.js} +0 -0
  292. /package/{dist/Portal.constants.d.ts → Portal.constants.d.ts} +0 -0
  293. /package/{dist/Portal.constants.js → Portal.constants.js} +0 -0
  294. /package/{dist/Portal.types.d.ts → Portal.types.d.ts} +0 -0
  295. /package/{dist/Portal.types.js → Portal.types.js} +0 -0
  296. /package/{dist/Progress.types.js → Progress.types.js} +0 -0
  297. /package/{dist/TabList.constants.d.ts → TabList.constants.d.ts} +0 -0
  298. /package/{dist/TabList.constants.js → TabList.constants.js} +0 -0
  299. /package/{dist/TabList.types.js → TabList.types.js} +0 -0
  300. /package/{dist/TextArea.constants.d.ts → TextArea.constants.d.ts} +0 -0
  301. /package/{dist/TextArea.constants.js → TextArea.constants.js} +0 -0
  302. /package/{dist/TextArea.types.d.ts → TextArea.types.d.ts} +0 -0
  303. /package/{dist/TextArea.types.js → TextArea.types.js} +0 -0
  304. /package/{dist/Tree.constants.d.ts → Tree.constants.d.ts} +0 -0
  305. /package/{dist/Tree.constants.js → Tree.constants.js} +0 -0
  306. /package/{dist/Tree.types.js → Tree.types.js} +0 -0
  307. /package/{dist/TreeItem.constants.d.ts → TreeItem.constants.d.ts} +0 -0
  308. /package/{dist/TreeItem.constants.js → TreeItem.constants.js} +0 -0
  309. /package/{dist/TreeItem.types.js → TreeItem.types.js} +0 -0
  310. /package/{dist/actions → actions}/applyLightDarkMode.d.ts +0 -0
  311. /package/{dist/actions → actions}/applyLightDarkMode.js +0 -0
  312. /package/{dist/actions → actions}/forwardEvents.d.ts +0 -0
  313. /package/{dist/actions → actions}/forwardEvents.js +0 -0
  314. /package/{dist/actions → actions}/portal.d.ts +0 -0
  315. /package/{dist/actions → actions}/portal.js +0 -0
  316. /package/{dist/actions → actions}/trapKeyboardFocus.d.ts +0 -0
  317. /package/{dist/actions → actions}/trapKeyboardFocus.js +0 -0
  318. /package/{dist/idGenerator.d.ts → idGenerator.d.ts} +0 -0
  319. /package/{dist/idGenerator.js → idGenerator.js} +0 -0
  320. /package/{dist/mediaQueries → mediaQueries}/prefersColorSchemeDark.d.ts +0 -0
  321. /package/{dist/mediaQueries → mediaQueries}/prefersColorSchemeDark.js +0 -0
  322. /package/{dist/mediaQueries → mediaQueries}/prefersReducedMotion.d.ts +0 -0
  323. /package/{dist/mediaQueries → mediaQueries}/prefersReducedMotion.js +0 -0
  324. /package/{dist/mediaQueries → mediaQueries}/usingKeyboard.d.ts +0 -0
  325. /package/{dist/mediaQueries → mediaQueries}/usingKeyboard.js +0 -0
@@ -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>
@@ -0,0 +1,22 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ import { type Snippet } from 'svelte';
3
+ type Props = HTMLAttributes<HTMLDivElement> & {
4
+ disabled?: boolean | null | undefined;
5
+ icon?: Snippet;
6
+ label?: string | Snippet;
7
+ value: string;
8
+ };
9
+ declare const TreeItem: import("svelte").Component<Props, {
10
+ collapse: () => boolean;
11
+ expand: () => boolean;
12
+ toggleExpanded: () => boolean;
13
+ blur: () => void;
14
+ focus: (options?: FocusOptions) => void;
15
+ click: () => void;
16
+ select: () => void;
17
+ selectParent: () => boolean;
18
+ selectPrevious: () => boolean;
19
+ selectNext: () => boolean;
20
+ }, "">;
21
+ type TreeItem = ReturnType<typeof TreeItem>;
22
+ export default TreeItem;
@@ -0,0 +1,4 @@
1
+ export type TreeItemContext = {
2
+ depth: number;
3
+ disabled: boolean | null | undefined;
4
+ };
@@ -1,6 +1,7 @@
1
1
  type Params = {
2
2
  /** Other elements should not raise the event if clicked. */
3
3
  ignoreOthers?: HTMLElement[];
4
+ onclickoutside?: (mouseEvent: MouseEvent) => void;
4
5
  };
5
6
  /**
6
7
  * Raises the click_outside event when the user clicks outside the node.
@@ -10,6 +10,7 @@ export const clickOutside = (node, params) => {
10
10
  if (targetNode &&
11
11
  !node.contains(targetNode) &&
12
12
  (!ignoreOthers || ignoreOthers.filter(Boolean).every((x) => !x.contains(targetNode)))) {
13
+ params?.onclickoutside?.(event);
13
14
  node.dispatchEvent(new CustomEvent('click_outside', {
14
15
  detail: { mouseEvent: event }
15
16
  }));
@@ -0,0 +1,8 @@
1
+ type Params = {
2
+ extraClass: string | null | undefined;
3
+ };
4
+ export declare const extraClass: (node: HTMLElement, params?: Params) => {
5
+ update(params: Params): void;
6
+ destroy(): void;
7
+ };
8
+ export {};
@@ -0,0 +1,14 @@
1
+ export const extraClass = (node, params) => {
2
+ let _class = params?.extraClass;
3
+ !!_class && node.classList.add(_class);
4
+ return {
5
+ update(params) {
6
+ !!_class && node.classList.remove(_class);
7
+ _class = params.extraClass;
8
+ !!_class && node.classList.add(_class);
9
+ },
10
+ destroy() {
11
+ !!_class && node.classList.remove(_class);
12
+ }
13
+ };
14
+ };
@@ -1,6 +1,7 @@
1
1
  export type { ClickOutsideEvent, ClickOutsideEventDetail } from './@types/clickOutside';
2
2
  export { applyLightDarkMode } from './actions/applyLightDarkMode';
3
3
  export { clickOutside } from './actions/clickOutside';
4
+ export { extraClass } from './actions/extraClass';
4
5
  export { forwardEvents } from './actions/forwardEvents';
5
6
  export { portal } from './actions/portal';
6
7
  export { trapKeyboardFocus } from './actions/trapKeyboardFocus';
@@ -8,24 +9,21 @@ export { prefersColorSchemeDark } from './mediaQueries/prefersColorSchemeDark';
8
9
  export { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
9
10
  export { usingKeyboard } from './mediaQueries/usingKeyboard';
10
11
  export { idGenerator } from './idGenerator';
11
- export type { ButtonVariant, ButtonShape } from './Button.types';
12
- export type { LabelStatus, LabelVariant } from './Label.types';
13
12
  export type { ListContext } from './List.types';
14
13
  export type { MenuBarContext } from './MenuBar.types';
15
14
  export type { MenuItemContext, MenuItemRegistration, MenuItemRole } from './MenuItem.types';
16
15
  export type { PopoverPlacement } from './Popover.types';
17
- export type { ProgressStatus } from './Progress.types';
16
+ export type { ProgressOrientation } from './Progress.types';
18
17
  export type { TabListContext } from './TabList.types';
19
18
  export type { TextAreaResize } from './TextArea.types';
20
19
  export type { TreeContext } from './Tree.types';
21
20
  export type { TreeItemContext } from './TreeItem.types';
22
- export { BUTTON_SHAPES, BUTTON_VARIANTS } from './Button.constants';
23
21
  export { LABEL_STATUSES, LABEL_VARIANTS } from './Label.constants';
24
22
  export { LIST_CONTEXT_KEY } from './List.constants';
25
23
  export { MENU_BAR_CONTEXT_KEY } from './MenuBar.constants';
26
24
  export { MENU_ITEM_CONTEXT_KEY, MENU_ITEM_ROLES } from './MenuItem.constants';
27
25
  export { POPOVER_PLACEMENTS } from './Popover.constants';
28
- export { PROGRESS_STATUSES } from './Progress.constants';
26
+ export { PROGRESS_ORIENTATIONS } from './Progress.constants';
29
27
  export { TAB_LIST_CONTEXT_KEY } from './TabList.constants';
30
28
  export { TEXT_AREA_RESIZES } from './TextArea.constants';
31
29
  export { TREE_CONTEXT_KEY } from './Tree.constants';
@@ -33,12 +31,9 @@ export { TREE_ITEM_CONTEXT_KEY } from './TreeItem.constants';
33
31
  import Button from './Button.svelte';
34
32
  import Callout from './Callout.svelte';
35
33
  import Checkbox from './Checkbox.svelte';
36
- import ColorPicker from './ColorPicker.svelte';
37
34
  import Dialog from './Dialog.svelte';
38
35
  import Dropdown from './Dropdown.svelte';
39
36
  import Label from './Label.svelte';
40
- import HexColorSliders from './HexColorSliders.svelte';
41
- import HslColorSliders from './HslColorSliders.svelte';
42
37
  import Input from './Input.svelte';
43
38
  import Link from './Link.svelte';
44
39
  import List from './List.svelte';
@@ -47,12 +42,10 @@ import Menu from './Menu.svelte';
47
42
  import MenuBar from './MenuBar.svelte';
48
43
  import MenuButton from './MenuButton.svelte';
49
44
  import MenuItem from './MenuItem.svelte';
50
- import MenuItemDisplay from './MenuItemDisplay.svelte';
51
45
  import MenuSeparator from './MenuSeparator.svelte';
52
46
  import Popover from './Popover.svelte';
53
47
  import Progress from './Progress.svelte';
54
48
  import Radio from './Radio.svelte';
55
- import RgbColorSliders from './RgbColorSliders.svelte';
56
49
  import Select from './Select.svelte';
57
50
  import Slider from './Slider.svelte';
58
51
  import Switch from './Switch.svelte';
@@ -63,5 +56,4 @@ import Tooltip from './Tooltip.svelte';
63
56
  import Tree from './Tree.svelte';
64
57
  import TreeChevron from './TreeChevron.svelte';
65
58
  import TreeItem from './TreeItem.svelte';
66
- import TreeItemDisplay from './TreeItemDisplay.svelte';
67
- export { Button, Callout, Checkbox, ColorPicker, Dialog, Dropdown, HexColorSliders, HslColorSliders, Input, Label, Link, List, ListItem, Menu, MenuBar, MenuButton, MenuItem, MenuItemDisplay, MenuSeparator, Popover, Progress, Radio, RgbColorSliders, Select, Slider, Switch, Tab, TabList, TextArea, Tooltip, Tree, TreeChevron, TreeItem, TreeItemDisplay };
59
+ export { Button, Callout, Checkbox, Dialog, Dropdown, Input, Label, Link, List, ListItem, Menu, MenuBar, MenuButton, MenuItem, MenuSeparator, Popover, Progress, Radio, Select, Slider, Switch, Tab, TabList, TextArea, Tooltip, Tree, TreeChevron, TreeItem };
@@ -1,6 +1,7 @@
1
1
  // ----- actions ----- //
2
2
  export { applyLightDarkMode } from './actions/applyLightDarkMode';
3
3
  export { clickOutside } from './actions/clickOutside';
4
+ export { extraClass } from './actions/extraClass';
4
5
  export { forwardEvents } from './actions/forwardEvents';
5
6
  export { portal } from './actions/portal';
6
7
  export { trapKeyboardFocus } from './actions/trapKeyboardFocus';
@@ -11,13 +12,12 @@ export { usingKeyboard } from './mediaQueries/usingKeyboard';
11
12
  // ----- functions ----- //
12
13
  export { idGenerator } from './idGenerator';
13
14
  // ----- Component constants ----- //
14
- export { BUTTON_SHAPES, BUTTON_VARIANTS } from './Button.constants';
15
15
  export { LABEL_STATUSES, LABEL_VARIANTS } from './Label.constants';
16
16
  export { LIST_CONTEXT_KEY } from './List.constants';
17
17
  export { MENU_BAR_CONTEXT_KEY } from './MenuBar.constants';
18
18
  export { MENU_ITEM_CONTEXT_KEY, MENU_ITEM_ROLES } from './MenuItem.constants';
19
19
  export { POPOVER_PLACEMENTS } from './Popover.constants';
20
- export { PROGRESS_STATUSES } from './Progress.constants';
20
+ export { PROGRESS_ORIENTATIONS } from './Progress.constants';
21
21
  export { TAB_LIST_CONTEXT_KEY } from './TabList.constants';
22
22
  export { TEXT_AREA_RESIZES } from './TextArea.constants';
23
23
  export { TREE_CONTEXT_KEY } from './Tree.constants';
@@ -26,12 +26,9 @@ export { TREE_ITEM_CONTEXT_KEY } from './TreeItem.constants';
26
26
  import Button from './Button.svelte';
27
27
  import Callout from './Callout.svelte';
28
28
  import Checkbox from './Checkbox.svelte';
29
- import ColorPicker from './ColorPicker.svelte';
30
29
  import Dialog from './Dialog.svelte';
31
30
  import Dropdown from './Dropdown.svelte';
32
31
  import Label from './Label.svelte';
33
- import HexColorSliders from './HexColorSliders.svelte';
34
- import HslColorSliders from './HslColorSliders.svelte';
35
32
  import Input from './Input.svelte';
36
33
  import Link from './Link.svelte';
37
34
  import List from './List.svelte';
@@ -40,12 +37,10 @@ import Menu from './Menu.svelte';
40
37
  import MenuBar from './MenuBar.svelte';
41
38
  import MenuButton from './MenuButton.svelte';
42
39
  import MenuItem from './MenuItem.svelte';
43
- import MenuItemDisplay from './MenuItemDisplay.svelte';
44
40
  import MenuSeparator from './MenuSeparator.svelte';
45
41
  import Popover from './Popover.svelte';
46
42
  import Progress from './Progress.svelte';
47
43
  import Radio from './Radio.svelte';
48
- import RgbColorSliders from './RgbColorSliders.svelte';
49
44
  import Select from './Select.svelte';
50
45
  import Slider from './Slider.svelte';
51
46
  import Switch from './Switch.svelte';
@@ -56,5 +51,4 @@ import Tooltip from './Tooltip.svelte';
56
51
  import Tree from './Tree.svelte';
57
52
  import TreeChevron from './TreeChevron.svelte';
58
53
  import TreeItem from './TreeItem.svelte';
59
- import TreeItemDisplay from './TreeItemDisplay.svelte';
60
- export { Button, Callout, Checkbox, ColorPicker, Dialog, Dropdown, HexColorSliders, HslColorSliders, Input, Label, Link, List, ListItem, Menu, MenuBar, MenuButton, MenuItem, MenuItemDisplay, MenuSeparator, Popover, Progress, Radio, RgbColorSliders, Select, Slider, Switch, Tab, TabList, TextArea, Tooltip, Tree, TreeChevron, TreeItem, TreeItemDisplay };
54
+ export { Button, Callout, Checkbox, Dialog, Dropdown, Input, Label, Link, List, ListItem, Menu, MenuBar, MenuButton, MenuItem, MenuSeparator, Popover, Progress, Radio, Select, Slider, Switch, Tab, TabList, TextArea, Tooltip, Tree, TreeChevron, TreeItem };