@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
package/.DS_Store ADDED
Binary file
package/Button.svelte ADDED
@@ -0,0 +1,25 @@
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">let { children, class: _class, ...rest } = $props();
4
+ let buttonRef;
5
+ export const click = () => {
6
+ buttonRef?.click();
7
+ };
8
+ export const blur = () => {
9
+ buttonRef?.blur();
10
+ };
11
+ export const focus = (options) => {
12
+ buttonRef?.focus(options);
13
+ };
14
+ </script>
15
+
16
+ <button
17
+ bind:this={buttonRef}
18
+ class={['sterling-button', _class].filter(Boolean).join(' ')}
19
+ type="button"
20
+ {...rest}
21
+ >
22
+ {#if children}
23
+ {@render children()}
24
+ {/if}
25
+ </button>
@@ -0,0 +1,9 @@
1
+ /// <reference types="svelte" />
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ declare const Button: import("svelte").Component<HTMLButtonAttributes, {
4
+ click: () => void;
5
+ blur: () => void;
6
+ focus: (options?: FocusOptions) => void;
7
+ }, "">;
8
+ type Button = ReturnType<typeof Button>;
9
+ export default Button;
@@ -1,37 +1,21 @@
1
- <script>import { getContext, onMount, tick } from 'svelte';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { getContext, tick } from 'svelte';
2
4
  import { arrow, autoUpdate, computePosition, flip, offset } from '@floating-ui/dom';
3
5
  import { portal } from './actions/portal';
4
6
  import { fade } from 'svelte/transition';
5
7
  import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
6
8
  import { STERLING_PORTAL_HOST_ID, STERLING_PORTAL_CONTEXT_ID } from './Portal.constants';
7
- // ----- Props ----- //
8
- /** Conditionally renders content based on open. */
9
- export let conditionalRender = true;
10
- /** The offset along the side of the reference element. */
11
- export let crossAxisOffset = 0;
12
- /** The offset towards or away from the side of the reference element. */
13
- export let mainAxisOffset = 0;
14
- /** When true, the callout is open and visible. */
15
- export let open = false;
16
- /** How the callout should be positioned relative to the reference element. */
17
- export let placement = 'top-start';
18
- /** The host container for the callout. */
19
- export let portalHost = undefined;
20
- /** The reference to the element anchoring the position of the callout. */
21
- export let reference;
22
- /** Additional class names to apply. */
23
- export let variant = '';
24
- // ----- State ----- //
25
- let popupRef;
26
- let arrowRef;
27
- let popupPosition = { x: 0, y: 0 };
28
- $: floatingUIPlacement = placement;
29
- let bodyHeight = 0;
9
+ let { children, conditionalRender = $bindable(true), crossAxisOffset = $bindable(0), mainAxisOffset = $bindable(0), open = $bindable(false), placement = $bindable('top-start'), portalHost, reference, class: _class, ...rest } = $props();
10
+ let popupRef = $state(undefined);
11
+ let arrowRef = $state(undefined);
12
+ let popupPosition = $state({ x: 0, y: 0 });
13
+ let floatingUIPlacement = $derived(placement);
14
+ let bodyHeight = $state(0);
30
15
  let resizeObserver = undefined;
31
16
  const { portalHost: contextPortalHost } = getContext(STERLING_PORTAL_CONTEXT_ID) || {
32
17
  portalHost: undefined
33
18
  };
34
- // ----- Portal Host ----- //
35
19
  const ensurePortalHost = async () => {
36
20
  await tick();
37
21
  // use the host set from context, usually set from a Dialog
@@ -49,18 +33,18 @@ const ensurePortalHost = async () => {
49
33
  }
50
34
  portalHost = host;
51
35
  };
52
- // ----- Position ----- //
53
- $: middleware = [
36
+ let middleware = $derived([
54
37
  offset({ mainAxis: mainAxisOffset, crossAxis: crossAxisOffset }),
55
38
  flip(),
56
- arrow({ element: arrowRef, padding: 8 })
57
- ];
39
+ arrowRef && arrow({ element: arrowRef, padding: 8 })
40
+ ]);
58
41
  const computeCalloutPosition = async () => {
59
42
  if (reference && popupRef) {
60
43
  popupPosition = await computePosition(reference, popupRef, {
61
44
  placement: floatingUIPlacement,
62
45
  middleware
63
46
  });
47
+ console.log('popupPosition', popupPosition);
64
48
  }
65
49
  else {
66
50
  popupPosition = { x: 0, y: 0 };
@@ -70,12 +54,23 @@ const computeCalloutPosition = async () => {
70
54
  let cleanupAutoUpdate = () => { };
71
55
  const autoUpdateCalloutPosition = () => {
72
56
  cleanupAutoUpdate();
57
+ cleanupAutoUpdate = () => { };
73
58
  if (reference && popupRef) {
74
59
  cleanupAutoUpdate = autoUpdate(reference, popupRef, computeCalloutPosition);
75
60
  }
76
61
  };
77
- $: popupRef, reference, autoUpdateCalloutPosition();
78
- $: open, bodyHeight, middleware, placement, computeCalloutPosition();
62
+ $effect(() => {
63
+ autoUpdateCalloutPosition();
64
+ return () => {
65
+ cleanupAutoUpdate();
66
+ cleanupAutoUpdate = () => { };
67
+ };
68
+ });
69
+ $effect(() => {
70
+ bodyHeight;
71
+ reference;
72
+ computeCalloutPosition();
73
+ });
79
74
  // ----- Arrow ----- //
80
75
  const getArrowPlacementStyle = (position) => {
81
76
  if (position?.placement && arrowRef) {
@@ -112,14 +107,20 @@ const getArrowOffsetStyle = (position) => {
112
107
  }
113
108
  return '';
114
109
  };
115
- $: arrowStyle = getArrowPlacementStyle(popupPosition) + getArrowOffsetStyle(popupPosition);
110
+ let arrowStyle = $derived(getArrowPlacementStyle(popupPosition) + getArrowOffsetStyle(popupPosition));
116
111
  // ----- Animation ----- //
117
112
  const fadeNoOp = (node, params) => {
118
113
  return { delay: 0, duration: 0 };
119
114
  };
120
- $: fadeMotion = !$prefersReducedMotion ? fade : fadeNoOp;
115
+ let fadeMotion = $derived(!$prefersReducedMotion ? fade : fadeNoOp);
121
116
  // ----- EventHandlers ----- //
122
- onMount(() => {
117
+ const onKeydown = (event) => {
118
+ if (event.key === 'Escape') {
119
+ open = false;
120
+ }
121
+ rest.onkeydown?.(event);
122
+ };
123
+ $effect(() => {
123
124
  ensurePortalHost();
124
125
  resizeObserver = new ResizeObserver((entries) => {
125
126
  bodyHeight = entries[0].target.clientHeight;
@@ -132,11 +133,6 @@ onMount(() => {
132
133
  resizeObserver = undefined;
133
134
  };
134
135
  });
135
- const onKeydown = (event) => {
136
- if (event.key === 'Escape') {
137
- open = false;
138
- }
139
- };
140
136
  ensurePortalHost();
141
137
  </script>
142
138
 
@@ -146,10 +142,10 @@ ensurePortalHost();
146
142
  class="sterling-callout-portal"
147
143
  transition:fadeMotion|global={{ duration: 250 }}
148
144
  >
149
- <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
145
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
150
146
  <div
151
147
  bind:this={popupRef}
152
- class={`sterling-callout ${variant}`}
148
+ class={['sterling-callout', _class].filter(Boolean).join(' ')}
153
149
  class:open
154
150
  class:top={popupPosition.placement === 'top'}
155
151
  class:top-start={popupPosition.placement === 'top-start'}
@@ -164,39 +160,18 @@ ensurePortalHost();
164
160
  class:left-start={popupPosition.placement === 'left-start'}
165
161
  class:left-end={popupPosition.placement === 'left-end'}
166
162
  role="tooltip"
167
- on:blur
168
- on:click
169
- on:copy
170
- on:cut
171
- on:dblclick
172
- on:dragend
173
- on:dragenter
174
- on:dragleave
175
- on:dragover
176
- on:dragstart
177
- on:drop
178
- on:focus
179
- on:focusin
180
- on:focusout
181
- on:keydown
182
- on:keypress
183
- on:keyup
184
- on:mousedown
185
- on:mouseenter
186
- on:mouseleave
187
- on:mousemove
188
- on:mouseover
189
- on:mouseout
190
- on:mouseup
191
- on:scroll
192
- on:wheel|passive
193
- on:paste
194
- on:keydown={onKeydown}
195
- {...$$restProps}
163
+ {...rest}
164
+ onkeydown={onKeydown}
196
165
  style="left:{popupPosition.x}px; top:{popupPosition.y}px"
197
166
  >
198
- <slot />
199
- <div class="arrow" bind:this={arrowRef} style={arrowStyle} />
167
+ {#if children}
168
+ {#if typeof children === 'string'}
169
+ <div class="callout-text">{children}</div>
170
+ {:else}
171
+ {@render children()}
172
+ {/if}
173
+ {/if}
174
+ <div class="arrow" bind:this={arrowRef} style={arrowStyle}></div>
200
175
  </div>
201
176
  </div>
202
177
  {/if}
@@ -0,0 +1,15 @@
1
+ /// <reference types="svelte" />
2
+ import type { PopoverPlacement } from './Popover.types';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+ type Props = HTMLAttributes<HTMLDivElement> & {
5
+ conditionalRender?: boolean | null;
6
+ crossAxisOffset?: number;
7
+ mainAxisOffset?: number;
8
+ open?: boolean | null;
9
+ placement?: PopoverPlacement;
10
+ portalHost?: HTMLElement;
11
+ reference?: HTMLElement | null;
12
+ };
13
+ declare const Callout: import("svelte").Component<Props, {}, "conditionalRender" | "crossAxisOffset" | "mainAxisOffset" | "open" | "placement">;
14
+ type Callout = ReturnType<typeof Callout>;
15
+ export default Callout;
@@ -0,0 +1,11 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ import type { PopoverPlacement } from './Popover.types';
3
+ export type CalloutProps = HTMLAttributes<HTMLDivElement> & {
4
+ conditionalRender?: boolean | null;
5
+ crossAxisOffset?: number;
6
+ mainAxisOffset?: number;
7
+ open?: boolean | null;
8
+ placement?: PopoverPlacement;
9
+ portalHost?: HTMLElement;
10
+ reference?: HTMLElement | null;
11
+ };
@@ -0,0 +1,43 @@
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { idGenerator } from './idGenerator';
4
+ import { usingKeyboard } from './mediaQueries/usingKeyboard';
5
+ let { id, children, checked = $bindable(false), class: _class, disabled = $bindable(false), ...rest } = $props();
6
+ let inputRef;
7
+ $effect(() => {
8
+ if (children && id === undefined) {
9
+ id = idGenerator.nextId('Checkbox');
10
+ }
11
+ });
12
+ // ----- Methods ----- //
13
+ export const blur = () => {
14
+ inputRef?.blur();
15
+ };
16
+ export const click = () => {
17
+ inputRef?.click();
18
+ };
19
+ export const focus = (options) => {
20
+ inputRef?.focus(options);
21
+ };
22
+ </script>
23
+
24
+ <!--
25
+ @component
26
+ A styled HTML input type=checkbox element.
27
+ -->
28
+ <div
29
+ class={['sterling-checkbox', _class].filter(Boolean).join(' ')}
30
+ class:checked
31
+ class:disabled
32
+ class:using-keyboard={$usingKeyboard}
33
+ >
34
+ <div class="container">
35
+ <input bind:this={inputRef} bind:checked {disabled} {id} type="checkbox" {...rest} />
36
+ <div class="indicator"></div>
37
+ </div>
38
+ {#if children}
39
+ <label for={id}>
40
+ {@render children()}
41
+ </label>
42
+ {/if}
43
+ </div>
@@ -0,0 +1,10 @@
1
+ /// <reference types="svelte" />
2
+ import type { HTMLInputAttributes } from 'svelte/elements';
3
+ /** A styled HTML input type=checkbox element. */
4
+ declare const Checkbox: import("svelte").Component<HTMLInputAttributes, {
5
+ blur: () => void;
6
+ click: () => void;
7
+ focus: (options?: FocusOptions) => void;
8
+ }, "disabled" | "checked">;
9
+ type Checkbox = ReturnType<typeof Checkbox>;
10
+ export default Checkbox;
@@ -1,25 +1,15 @@
1
- <script>import { onMount, setContext, tick } from 'svelte';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { onMount, setContext, tick } from 'svelte';
2
4
  import Button from './Button.svelte';
3
5
  import { STERLING_PORTAL_CONTEXT_ID } from './Portal.constants';
4
6
  import { writable } from 'svelte/store';
5
7
  const dialogFadeDuration = 250;
6
- // ----- Props ----- //
7
- /** When true, clicking outside the dialog causes the dialog close. */
8
- export let backdropCloses = false;
9
- /** When true, the dialog is open; otherwise the dialog is closed. */
10
- export let open = false;
11
- /**
12
- * The return value from the dialog:
13
- * - an empty string indicates cancellation
14
- * - a value indicates form submission.
15
- */
16
- export let returnValue = '';
17
- /** Additional class names to apply. */
18
- export let variant = '';
19
- // ----- State ----- //
8
+ let { backdropCloses = false, open = $bindable(false), body, class: _class, content, footer, header, returnValue = $bindable(''), headerTitle, ...rest } = $props();
20
9
  let dialogRef;
21
10
  let contentRef;
22
11
  let formRef;
12
+ // svelte-ignore non_reactive_update
23
13
  let closing = false;
24
14
  const portalHostStore = writable(undefined);
25
15
  // ----- Context ----- //
@@ -101,9 +91,9 @@ const onSubmit = (event) => {
101
91
  return false;
102
92
  }
103
93
  };
104
- $: {
94
+ $effect(() => {
105
95
  updateDialog(open);
106
- }
96
+ });
107
97
  onMount(() => {
108
98
  updateDialog(open);
109
99
  // Use the dialog for any element portals
@@ -116,44 +106,46 @@ onMount(() => {
116
106
  });
117
107
  </script>
118
108
 
119
- <!-- @component
120
- A styled &lt;dialog&gt; element
121
-
122
- - Slots for typical dialog content.
123
- - Props and events to make using &lt;dialog&gt; easier
124
- -->
125
109
  <dialog
126
110
  bind:this={dialogRef}
127
- class={`sterling-dialog ${variant}`}
111
+ class={`sterling-dialog ${_class}`}
128
112
  class:open
129
113
  class:closing
130
- on:close
131
- on:cancel
132
- {...$$restProps}
114
+ {...rest}
133
115
  >
134
- <form method="dialog" bind:this={formRef} on:submit={onSubmit}>
116
+ <form method="dialog" bind:this={formRef} onsubmit={onSubmit}>
135
117
  <div class="content" bind:this={contentRef}>
136
- <slot name="content">
118
+ {#if content}
119
+ {@render content()}
120
+ {:else}
137
121
  <div class="header">
138
- <slot name="header">
122
+ {#if header}
123
+ {@render header()}
124
+ {:else}
139
125
  <div class="title">
140
- <slot name="title" />
126
+ {#if headerTitle}
127
+ {#if typeof headerTitle === 'string'}
128
+ {headerTitle}
129
+ {:else}
130
+ {@render headerTitle()}
131
+ {/if}
132
+ {/if}
141
133
  </div>
142
134
  <div class="close">
143
- <Button variant={`circular tool ${variant}`} on:click={() => closeDialog()}>
144
- <div class="close-x" />
135
+ <Button class={`circular tool`} onclick={() => closeDialog()}>
136
+ <div class="close-x"></div>
145
137
  </Button>
146
138
  </div>
147
- </slot>
139
+ {/if}
148
140
  </div>
149
141
  <div class="body">
150
- <slot name="body" />
142
+ {@render body?.()}
151
143
  </div>
152
- <div class="separator" />
144
+ <div class="separator"></div>
153
145
  <div class="footer">
154
- <slot name="footer" />
146
+ {@render footer?.()}
155
147
  </div>
156
- </slot>
148
+ {/if}
157
149
  </div>
158
150
  </form>
159
151
  </dialog>
@@ -0,0 +1,14 @@
1
+ import type { HTMLDialogAttributes } from 'svelte/elements';
2
+ import { type Snippet } from 'svelte';
3
+ type Props = HTMLDialogAttributes & {
4
+ backdropCloses?: boolean | null | undefined;
5
+ body?: Snippet;
6
+ content?: Snippet;
7
+ footer?: Snippet;
8
+ header?: Snippet;
9
+ returnValue?: string;
10
+ headerTitle?: string | Snippet;
11
+ };
12
+ declare const Dialog: import("svelte").Component<Props, {}, "open" | "returnValue">;
13
+ type Dialog = ReturnType<typeof Dialog>;
14
+ export default Dialog;
@@ -1,4 +1,6 @@
1
- <script>import { createEventDispatcher } from 'svelte';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import {} from 'svelte';
2
4
  import Popover from './Popover.svelte';
3
5
  import { clickOutside } from './actions/clickOutside';
4
6
  import { idGenerator } from './idGenerator';
@@ -6,27 +8,15 @@ import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
6
8
  import { slide } from 'svelte/transition';
7
9
  import { usingKeyboard } from './mediaQueries/usingKeyboard';
8
10
  const popupId = idGenerator.nextId('Dropdown-popup');
9
- // ----- Props ----- //
10
- /** Disables the dropdown. */
11
- export let disabled = false;
12
- /** When true, the dropdown is open. */
13
- export let open = false;
14
- /** When the user clicks away from the dropdown, it remains open. */
15
- export let stayOpenOnClickAway = false;
16
- /** Additional class names to apply. */
17
- export let variant = '';
18
- // ----- State ----- //
19
- let dropdownRef;
20
- let popupContentRef;
21
- // ----- Events ----- //
22
- const dispatch = createEventDispatcher();
23
- const raiseOpen = (open) => {
24
- dispatch('open', { open });
25
- };
11
+ let { class: _class, children, disabled = false, open = $bindable(false), onOpen, stayOpenOnClickAway = false, button, buttonIcon, value, ...rest } = $props();
12
+ // svelte-ignore non_reactive_update
13
+ let dropdownRef = $state(undefined);
14
+ // svelte-ignore non_reactive_update
15
+ let popupContentRef = $state(undefined);
26
16
  // ----- Reactions ----- //
27
- $: {
28
- raiseOpen(open);
29
- }
17
+ $effect(() => {
18
+ onOpen?.(open);
19
+ });
30
20
  // ----- Methods ----- //
31
21
  export const click = () => {
32
22
  dropdownRef?.click();
@@ -37,13 +27,13 @@ export const blur = () => {
37
27
  export const focus = (options) => {
38
28
  dropdownRef?.focus(options);
39
29
  };
40
- // ----- Event Handlers ----- //
41
30
  const onClick = (event) => {
42
31
  if (!disabled) {
43
32
  open = !open;
44
33
  event.preventDefault();
45
34
  event.stopPropagation();
46
35
  }
36
+ rest.onclick?.(event);
47
37
  };
48
38
  const onKeydown = (event) => {
49
39
  if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
@@ -52,14 +42,13 @@ const onKeydown = (event) => {
52
42
  open = !open;
53
43
  event.preventDefault();
54
44
  event.stopPropagation();
55
- return false;
56
45
  case 'Escape':
57
46
  open = false;
58
47
  event.preventDefault();
59
48
  event.stopPropagation();
60
- return false;
61
49
  }
62
50
  }
51
+ rest.onkeydown?.(event);
63
52
  };
64
53
  const onClickOutside = (event) => {
65
54
  if (!stayOpenOnClickAway) {
@@ -70,7 +59,7 @@ const onClickOutside = (event) => {
70
59
  const slideNoOp = (node, params) => {
71
60
  return { delay: 0, duration: 0 };
72
61
  };
73
- $: slideMotion = !$prefersReducedMotion ? slide : slideNoOp;
62
+ let slideMotion = $derived(!$prefersReducedMotion ? slide : slideNoOp);
74
63
  </script>
75
64
 
76
65
  <div
@@ -78,64 +67,43 @@ $: slideMotion = !$prefersReducedMotion ? slide : slideNoOp;
78
67
  aria-controls={popupId}
79
68
  aria-haspopup={true}
80
69
  aria-expanded={open}
81
- class={`sterling-dropdown ${variant}`}
70
+ class={`sterling-dropdown ${_class}`}
82
71
  class:disabled
83
72
  class:open
84
73
  class:using-keyboard={$usingKeyboard}
85
74
  role="combobox"
86
75
  tabindex="0"
87
- use:clickOutside={{ ignoreOthers: [popupContentRef] }}
88
- on:blur
89
- on:click
90
- on:click={onClick}
91
- on:copy
92
- on:cut
93
- on:dblclick
94
- on:dragend
95
- on:dragenter
96
- on:dragleave
97
- on:dragover
98
- on:dragstart
99
- on:drop
100
- on:focus
101
- on:focusin
102
- on:focusout
103
- on:keydown
104
- on:keydown={onKeydown}
105
- on:keypress
106
- on:keyup
107
- on:mousedown
108
- on:mouseenter
109
- on:mouseleave
110
- on:mousemove
111
- on:mouseover
112
- on:mouseout
113
- on:mouseup
114
- on:wheel|passive
115
- on:paste
116
- on:click_outside={onClickOutside}
117
- {...$$restProps}
76
+ use:clickOutside={{ ignoreOthers: [popupContentRef!], onclickoutside: onClickOutside }}
77
+ {...rest}
78
+ onclick={onClick}
79
+ onkeydown={onKeydown}
118
80
  >
119
- {#if $$slots.value}
120
- <div class="value">
121
- <slot name="value" {disabled} {open} {variant} />
122
- </div>
123
- {/if}
124
- <slot name="button" {disabled} {open} {variant}>
125
- <div class="button">
126
- <slot name="icon" {disabled} {open} {variant}>
127
- <div class="chevron" />
128
- </slot>
129
- </div>
130
- </slot>
81
+ <div class="value">
82
+ {#if value}
83
+ {#if typeof value === 'string'}
84
+ {value}
85
+ {:else}
86
+ {@render value()}
87
+ {/if}
88
+ {/if}
89
+ </div>
90
+ <div class="button">
91
+ {#if button}
92
+ {@render button()}
93
+ {:else if buttonIcon}
94
+ {@render buttonIcon()}
95
+ {:else}
96
+ <div class="chevron"></div>
97
+ {/if}
98
+ </div>
131
99
 
132
100
  <Popover reference={dropdownRef} open={!disabled && open} placement="bottom-start">
133
101
  <div
134
- class={`sterling-dropdown-popup-content ${variant}`}
102
+ class={`sterling-dropdown-popup-content ${_class}`}
135
103
  transition:slideMotion|global={{ duration: 200 }}
136
104
  bind:this={popupContentRef}
137
105
  >
138
- <slot {disabled} {open} {variant} />
106
+ {@render children?.()}
139
107
  </div>
140
108
  </Popover>
141
109
  </div>
@@ -0,0 +1,18 @@
1
+ import { type Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type Props = HTMLAttributes<HTMLDivElement> & {
4
+ disabled?: boolean | null | undefined;
5
+ open?: boolean | null | undefined;
6
+ stayOpenOnClickAway?: boolean | null | undefined;
7
+ onOpen?: (open: boolean | null | undefined) => void;
8
+ button?: Snippet;
9
+ buttonIcon?: Snippet;
10
+ value?: string | Snippet;
11
+ };
12
+ declare const Dropdown: import("svelte").Component<Props, {
13
+ click: () => void;
14
+ blur: () => void;
15
+ focus: (options?: FocusOptions) => void;
16
+ }, "open">;
17
+ type Dropdown = ReturnType<typeof Dropdown>;
18
+ export default Dropdown;