@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,35 @@
1
- <script>import { createEventDispatcher, setContext } from 'svelte';
2
- import { writable } from 'svelte/store';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { setContext } from 'svelte';
3
4
  import { clickOutside } from './actions/clickOutside';
4
5
  import { idGenerator } from './idGenerator';
5
6
  import { MENU_BAR_CONTEXT_KEY } from './MenuBar.constants';
6
7
  import { MENU_ITEM_CONTEXT_KEY } from './MenuItem.constants';
7
8
  import { isElementEnabledMenuItem } from './MenuItem.utils';
8
- // ----- Props ----- //
9
- /** Additional class names to apply. */
10
- export let variant = '';
11
- // ----- State ----- //
12
- const openValues = writable([]);
9
+ let { class: _class, children, onClose, onOpen, onSelect, ...rest } = $props();
13
10
  const rootValue = idGenerator.nextId('MenuBar');
11
+ let openValues = $state([]);
12
+ let prevOpenValue = $state();
14
13
  let menuBarRef;
15
- let prevOpenValue = undefined;
16
- // Remember the last open value
17
- $: {
18
- if ($openValues.length > 0) {
19
- prevOpenValue = $openValues[0];
20
- }
21
- }
14
+ $effect(() => {
15
+ prevOpenValue = openValues[0];
16
+ });
22
17
  // Restore focus to the last open menu bar item when it closes
23
- $: {
24
- if ($openValues.length === 0 && prevOpenValue !== undefined) {
18
+ $effect(() => {
19
+ if (openValues.length === 0 && prevOpenValue !== undefined) {
25
20
  const candidate = menuBarRef.querySelector(`[data-value="${prevOpenValue}"]`);
26
21
  candidate?.focus();
27
22
  prevOpenValue = undefined;
28
23
  }
29
- }
30
- // ----- Events ----- //
31
- const dispatch = createEventDispatcher();
32
- const raiseClose = (value) => {
33
- dispatch('close', { value });
34
- };
35
- const raiseOpen = (value) => {
36
- dispatch('open', { value });
37
- };
38
- const raiseSelect = (value) => {
39
- dispatch('select', { value });
40
- };
41
- // ----- Methods ----- //
24
+ });
42
25
  export const blur = () => {
43
26
  menuBarRef?.blur();
44
27
  };
45
28
  export const focus = (options) => {
46
29
  menuBarRef?.focus(options);
47
30
  };
48
- // ----- Open/Close ----- //
49
31
  const getOpenMenuBarItem = () => {
50
- const value = $openValues[0];
32
+ const value = openValues[0];
51
33
  if (value) {
52
34
  return menuBarRef.querySelector(`[data-value="${value}"]`);
53
35
  }
@@ -86,12 +68,10 @@ const openNextMenuBarItem = () => {
86
68
  return !!candidate;
87
69
  };
88
70
  const closeAllMenus = () => {
89
- openValues.set([]);
71
+ openValues = [];
90
72
  };
91
- // ----- Event Handlers ----- //
92
73
  const onClickOutside = (event) => {
93
- const { detail: { mouseEvent } } = event;
94
- let element = mouseEvent.target;
74
+ let element = event.target;
95
75
  while (element) {
96
76
  if (element.getAttribute('data-root-value') === rootValue) {
97
77
  return;
@@ -100,56 +80,34 @@ const onClickOutside = (event) => {
100
80
  }
101
81
  closeAllMenus?.();
102
82
  };
103
- // ----- Set Context ----- //
104
- setContext(MENU_BAR_CONTEXT_KEY, {
105
- openPreviousMenuBarItem,
106
- openNextMenuBarItem
107
- });
108
- setContext(MENU_ITEM_CONTEXT_KEY, {
83
+ let menuBarContext = { openPreviousMenuBarItem, openNextMenuBarItem };
84
+ setContext(MENU_BAR_CONTEXT_KEY, menuBarContext);
85
+ let menuItemContext = {
109
86
  isMenuBarItem: true,
110
- openValues,
87
+ depth: 0,
88
+ get openValues() {
89
+ return openValues;
90
+ },
91
+ set openValues(value) {
92
+ openValues = value;
93
+ },
111
94
  rootValue,
112
- onClose: raiseClose,
113
- onOpen: raiseOpen,
114
- onSelect: raiseSelect
115
- });
95
+ onClose,
96
+ onOpen,
97
+ onSelect
98
+ };
99
+ setContext(MENU_ITEM_CONTEXT_KEY, menuItemContext);
116
100
  </script>
117
101
 
118
102
  <div
119
103
  bind:this={menuBarRef}
120
- class={`sterling-menu-bar ${variant}`}
104
+ class={['sterling-menu-bar', _class].filter(Boolean).join(' ')}
121
105
  role="menubar"
122
106
  tabindex="-1"
123
- on:blur
124
- on:click
125
- on:copy
126
- on:cut
127
- on:dblclick
128
- on:dragend
129
- on:dragenter
130
- on:dragleave
131
- on:dragover
132
- on:dragstart
133
- on:drop
134
- on:focus
135
- on:focusin
136
- on:focusout
137
- on:keydown
138
- on:keypress
139
- on:keyup
140
- on:mousedown
141
- on:mouseenter
142
- on:mouseleave
143
- on:mousemove
144
- on:mouseover
145
- on:mouseout
146
- on:mouseup
147
- on:scroll
148
- on:wheel|passive
149
- on:paste
150
- {...$$restProps}
151
- use:clickOutside
152
- on:click_outside={onClickOutside}
107
+ {...rest}
108
+ use:clickOutside={{ onclickoutside: onClickOutside }}
153
109
  >
154
- <slot {variant} />
110
+ {#if children}
111
+ {@render children()}
112
+ {/if}
155
113
  </div>
@@ -0,0 +1,13 @@
1
+ /// <reference types="svelte" />
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type Props = HTMLAttributes<HTMLDivElement> & {
4
+ onClose?: (value: string) => void;
5
+ onOpen?: (value: string) => void;
6
+ onSelect?: (value: string) => void;
7
+ };
8
+ declare const MenuBar: import("svelte").Component<Props, {
9
+ blur: () => void;
10
+ focus: (options?: FocusOptions) => void;
11
+ }, "">;
12
+ type MenuBar = ReturnType<typeof MenuBar>;
13
+ export default MenuBar;
@@ -0,0 +1,116 @@
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { setContext, tick } from 'svelte';
4
+ import Button from './Button.svelte';
5
+ import Menu from './Menu.svelte';
6
+ import { MENU_ITEM_CONTEXT_KEY } from './MenuItem.constants';
7
+ import { idGenerator } from './idGenerator';
8
+ import Popover from './Popover.svelte';
9
+ import { clickOutside } from './actions/clickOutside';
10
+ let { children, class: _class, items, menuClass, open = $bindable(false), onClose, onOpen, onSelect, popoverPlacement = 'bottom-start', value, ...rest } = $props();
11
+ const instanceId = idGenerator.nextId('MenuButton');
12
+ let buttonRef;
13
+ let openValues = $state([]);
14
+ let menuRef;
15
+ let menuId = $derived(`${value}-menu-${instanceId}`);
16
+ let prevOpen = $state(open);
17
+ let reference = $state();
18
+ export const click = () => {
19
+ buttonRef?.click();
20
+ };
21
+ export const blur = () => {
22
+ buttonRef?.blur();
23
+ };
24
+ export const focus = (options) => {
25
+ buttonRef?.focus(options);
26
+ };
27
+ // update open based on openValues
28
+ $effect(() => {
29
+ open = openValues.length > 0;
30
+ });
31
+ // update openValues based on open
32
+ $effect(() => {
33
+ if (open) {
34
+ openValues = openValues.length > 0 ? openValues : ['menu-button'];
35
+ }
36
+ else {
37
+ openValues = openValues.length === 0 ? openValues : [];
38
+ }
39
+ });
40
+ // focus when closing
41
+ $effect(() => {
42
+ if (!open && open !== prevOpen) {
43
+ focus();
44
+ }
45
+ prevOpen = open;
46
+ });
47
+ const onClick = async () => {
48
+ if (!open) {
49
+ openValues = ['menu-button'];
50
+ open = true;
51
+ await tick();
52
+ menuRef?.focusFirstMenuItem();
53
+ }
54
+ else {
55
+ open = false;
56
+ openValues = [];
57
+ }
58
+ };
59
+ const closeAllMenus = () => {
60
+ openValues = [];
61
+ open = false;
62
+ };
63
+ const onClickOutside = (event) => {
64
+ let element = event.target;
65
+ while (element) {
66
+ if (element.getAttribute('data-root-value') === value) {
67
+ return;
68
+ }
69
+ element = element.parentElement;
70
+ }
71
+ closeAllMenus?.();
72
+ };
73
+ // ----- Context ----- //
74
+ setContext(MENU_ITEM_CONTEXT_KEY, {
75
+ depth: 1,
76
+ get openValues() {
77
+ return openValues;
78
+ },
79
+ set openValues(value) {
80
+ openValues = value;
81
+ },
82
+ rootValue: value,
83
+ closeContainingMenu: () => {
84
+ open = false;
85
+ },
86
+ onOpen,
87
+ onClose,
88
+ onSelect
89
+ });
90
+ </script>
91
+
92
+ <Button
93
+ bind:this={buttonRef}
94
+ aria-controls={menuId}
95
+ aria-expanded={!!open}
96
+ aria-haspopup={!!children}
97
+ aria-owns={menuId}
98
+ class={['sterling-menu-button', _class].filter(Boolean).join(' ')}
99
+ data-value={value}
100
+ data-root-value={value}
101
+ {...rest}
102
+ onclick={onClick}
103
+ >
104
+ <div
105
+ class="reference"
106
+ bind:this={reference}
107
+ use:clickOutside={{ onclickoutside: onClickOutside }}
108
+ >
109
+ {@render children?.()}
110
+ </div>
111
+ <Popover {reference} {open} placement={popoverPlacement}>
112
+ <Menu bind:this={menuRef} id={menuId} class={menuClass}>
113
+ {@render items?.()}
114
+ </Menu>
115
+ </Popover>
116
+ </Button>
@@ -0,0 +1,20 @@
1
+ import type { HTMLButtonAttributes } from 'svelte/elements';
2
+ import { type Snippet } from 'svelte';
3
+ import type { PopoverPlacement } from './Popover.types';
4
+ type Props = HTMLButtonAttributes & {
5
+ items: Snippet;
6
+ menuClass?: string;
7
+ onOpen?: (value: string) => void;
8
+ onClose?: (value: string) => void;
9
+ onSelect?: (value: string) => void;
10
+ open?: boolean | null | undefined;
11
+ popoverPlacement?: PopoverPlacement;
12
+ value?: string;
13
+ };
14
+ declare const MenuButton: import("svelte").Component<Props, {
15
+ click: () => void;
16
+ blur: () => void;
17
+ focus: (options?: FocusOptions) => void;
18
+ }, "open">;
19
+ type MenuButton = ReturnType<typeof MenuButton>;
20
+ export default MenuButton;