@geoffcox/sterling-svelte 0.0.30 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/@types/clickOutside.d.ts +11 -7
  2. package/Button.svelte +11 -183
  3. package/Button.svelte.d.ts +2 -6
  4. package/Callout.svelte +188 -0
  5. package/Callout.svelte.d.ts +54 -0
  6. package/Checkbox.svelte +15 -177
  7. package/Checkbox.svelte.d.ts +2 -2
  8. package/ColorPicker.svelte +204 -223
  9. package/ColorPicker.svelte.d.ts +1 -2
  10. package/Dialog.svelte +91 -187
  11. package/Dialog.svelte.d.ts +3 -1
  12. package/Dropdown.svelte +52 -219
  13. package/Dropdown.svelte.d.ts +4 -8
  14. package/HexColorSliders.svelte +77 -145
  15. package/HexColorSliders.svelte.d.ts +28 -1
  16. package/HslColorSliders.svelte +99 -179
  17. package/HslColorSliders.svelte.d.ts +28 -1
  18. package/Input.svelte +27 -136
  19. package/Input.svelte.d.ts +2 -3
  20. package/Label.constants.d.ts +1 -0
  21. package/Label.constants.js +1 -0
  22. package/Label.svelte +96 -169
  23. package/Label.svelte.d.ts +6 -1
  24. package/Label.types.d.ts +3 -1
  25. package/Link.svelte +9 -106
  26. package/Link.svelte.d.ts +0 -1
  27. package/List.svelte +142 -230
  28. package/List.svelte.d.ts +2 -3
  29. package/List.types.d.ts +6 -1
  30. package/ListItem.svelte +25 -94
  31. package/ListItem.svelte.d.ts +2 -0
  32. package/Menu.svelte +48 -64
  33. package/Menu.svelte.d.ts +4 -1
  34. package/MenuBar.svelte +84 -86
  35. package/MenuBar.svelte.d.ts +4 -1
  36. package/MenuButton.svelte +67 -74
  37. package/MenuButton.svelte.d.ts +7 -3
  38. package/MenuItem.svelte +256 -288
  39. package/MenuItem.svelte.d.ts +2 -2
  40. package/MenuItemDisplay.svelte +12 -116
  41. package/MenuItemDisplay.svelte.d.ts +21 -7
  42. package/MenuSeparator.svelte +6 -45
  43. package/MenuSeparator.svelte.d.ts +8 -78
  44. package/Popover.constants.d.ts +2 -0
  45. package/{floating-ui.constants.js → Popover.constants.js} +10 -9
  46. package/Popover.svelte +72 -82
  47. package/Popover.svelte.d.ts +10 -5
  48. package/Popover.types.d.ts +4 -0
  49. package/Progress.svelte +28 -126
  50. package/Progress.svelte.d.ts +4 -3
  51. package/Radio.svelte +49 -192
  52. package/Radio.svelte.d.ts +2 -2
  53. package/RgbColorSliders.svelte +48 -137
  54. package/RgbColorSliders.svelte.d.ts +5 -5
  55. package/Select.svelte +124 -251
  56. package/Select.svelte.d.ts +6 -2
  57. package/Slider.svelte +90 -259
  58. package/Slider.svelte.d.ts +1 -2
  59. package/Switch.svelte +24 -259
  60. package/Switch.svelte.d.ts +3 -1
  61. package/Tab.svelte +27 -175
  62. package/Tab.svelte.d.ts +6 -4
  63. package/TabList.svelte +146 -171
  64. package/TabList.svelte.d.ts +3 -2
  65. package/TabList.types.d.ts +6 -1
  66. package/TextArea.svelte +32 -129
  67. package/TextArea.svelte.d.ts +1 -1
  68. package/Tooltip.svelte +88 -222
  69. package/Tooltip.svelte.d.ts +21 -13
  70. package/Tree.constants.d.ts +0 -1
  71. package/Tree.constants.js +0 -1
  72. package/Tree.svelte +35 -119
  73. package/Tree.svelte.d.ts +4 -4
  74. package/Tree.types.d.ts +1 -3
  75. package/TreeChevron.svelte +18 -98
  76. package/TreeChevron.svelte.d.ts +1 -0
  77. package/TreeItem.constants.d.ts +1 -0
  78. package/TreeItem.constants.js +1 -0
  79. package/TreeItem.svelte +251 -211
  80. package/TreeItem.svelte.d.ts +7 -3
  81. package/TreeItem.types.d.ts +1 -1
  82. package/TreeItemDisplay.svelte +20 -104
  83. package/TreeItemDisplay.svelte.d.ts +2 -2
  84. package/actions/applyLightDarkMode.d.ts +10 -0
  85. package/actions/applyLightDarkMode.js +36 -0
  86. package/actions/forwardEvents.js +3 -3
  87. package/css/Button.base.css +74 -0
  88. package/css/Button.colorful.css +17 -0
  89. package/css/Button.css +7 -0
  90. package/css/Button.secondary.colorful.css +15 -0
  91. package/css/Button.secondary.css +11 -0
  92. package/css/Button.shapes.css +14 -0
  93. package/css/Button.tool.colorful.css +13 -0
  94. package/css/Button.tool.css +18 -0
  95. package/css/Callout.base.css +43 -0
  96. package/css/Callout.colorful.css +5 -0
  97. package/css/Callout.css +2 -0
  98. package/css/Checkbox.base.css +145 -0
  99. package/css/Checkbox.colorful.css +17 -0
  100. package/css/Checkbox.css +2 -0
  101. package/css/ColorPicker.base.css +23 -0
  102. package/css/ColorPicker.css +1 -0
  103. package/css/Dialog.base.css +116 -0
  104. package/css/Dialog.css +1 -0
  105. package/css/Dropdown.base.css +147 -0
  106. package/css/Dropdown.colorful.css +23 -0
  107. package/css/Dropdown.css +2 -0
  108. package/css/HexColorSliders.base.css +106 -0
  109. package/css/HexColorSliders.css +1 -0
  110. package/css/HslColorSliders.base.css +124 -0
  111. package/css/HslColorSliders.css +1 -0
  112. package/css/Input.base.css +100 -0
  113. package/css/Input.colorful.css +22 -0
  114. package/css/Input.composed.css +8 -0
  115. package/css/Input.css +3 -0
  116. package/css/Label.base.css +119 -0
  117. package/css/Label.boxed.colorful.css +21 -0
  118. package/css/Label.boxed.css +31 -0
  119. package/css/Label.colorful.css +3 -0
  120. package/css/Label.css +4 -0
  121. package/css/Link.base.css +52 -0
  122. package/css/Link.colorful.css +15 -0
  123. package/css/Link.css +6 -0
  124. package/css/Link.ghost.colorful.css +7 -0
  125. package/css/Link.ghost.css +11 -0
  126. package/css/Link.undecorated.colorful.css +6 -0
  127. package/css/Link.undecorated.css +6 -0
  128. package/css/List.base.css +98 -0
  129. package/css/List.css +1 -0
  130. package/css/ListItem.base.css +59 -0
  131. package/css/ListItem.css +1 -0
  132. package/css/Menu.base.css +21 -0
  133. package/css/Menu.css +1 -0
  134. package/css/MenuBar.base.css +9 -0
  135. package/css/MenuBar.css +1 -0
  136. package/css/MenuButton.base.css +13 -0
  137. package/css/MenuButton.css +1 -0
  138. package/css/MenuItem.base.css +48 -0
  139. package/css/MenuItem.css +1 -0
  140. package/css/MenuItemDisplay.base.css +104 -0
  141. package/css/MenuItemDisplay.css +1 -0
  142. package/css/MenuSeparator.base.css +5 -0
  143. package/css/MenuSeparator.css +1 -0
  144. package/css/Popover copy.css +21 -0
  145. package/css/Popover.css +21 -0
  146. package/css/Progress.base.css +99 -0
  147. package/css/Progress.css +1 -0
  148. package/css/Radio.base.css +135 -0
  149. package/css/Radio.colorful.css +18 -0
  150. package/css/Radio.css +2 -0
  151. package/css/RgbColorSliders.base.css +94 -0
  152. package/css/RgbColorSliders.css +1 -0
  153. package/css/Select.base.css +127 -0
  154. package/css/Select.colorful.css +24 -0
  155. package/css/Select.composed.css +12 -0
  156. package/css/Select.css +3 -0
  157. package/css/Slider.base.css +182 -0
  158. package/css/Slider.colorful.css +11 -0
  159. package/css/Slider.composed.css +8 -0
  160. package/css/Slider.css +3 -0
  161. package/css/Switch.base.css +193 -0
  162. package/css/Switch.colorful.css +39 -0
  163. package/css/Switch.css +2 -0
  164. package/css/Tab.base.css +135 -0
  165. package/css/Tab.colorful.css +13 -0
  166. package/css/Tab.css +2 -0
  167. package/css/TabList.base.css +34 -0
  168. package/css/TabList.css +1 -0
  169. package/css/TextArea.base.css +85 -0
  170. package/css/TextArea.colorful.css +17 -0
  171. package/css/TextArea.composed.css +8 -0
  172. package/css/TextArea.css +3 -0
  173. package/css/Tooltip.base.css +6 -0
  174. package/css/Tooltip.css +1 -0
  175. package/css/Tree.base.css +74 -0
  176. package/css/Tree.composed.css +8 -0
  177. package/css/Tree.css +2 -0
  178. package/css/TreeChevron.base.css +86 -0
  179. package/css/TreeChevron.css +1 -0
  180. package/css/TreeItem.base.css +3 -0
  181. package/css/TreeItem.css +1 -0
  182. package/css/TreeItemDisplay.base.css +74 -0
  183. package/css/TreeItemDisplay.colorful.css +9 -0
  184. package/css/TreeItemDisplay.css +1 -0
  185. package/css/dark-mode.css +134 -0
  186. package/css/light-mode.css +134 -0
  187. package/css/sterling.css +37 -0
  188. package/index.d.ts +13 -18
  189. package/index.js +11 -15
  190. package/mediaQueries/prefersColorSchemeDark.d.ts +2 -0
  191. package/mediaQueries/prefersColorSchemeDark.js +10 -0
  192. package/{stores → mediaQueries}/prefersReducedMotion.d.ts +1 -0
  193. package/{stores → mediaQueries}/usingKeyboard.d.ts +1 -0
  194. package/package.json +136 -19
  195. package/Link.constants.d.ts +0 -1
  196. package/Link.constants.js +0 -1
  197. package/Link.types.d.ts +0 -4
  198. package/Tooltip.constants.d.ts +0 -1
  199. package/Tooltip.constants.js +0 -1
  200. package/Tooltip.types.d.ts +0 -4
  201. package/Tooltip.types.js +0 -1
  202. package/floating-ui.constants.d.ts +0 -1
  203. package/floating-ui.types.d.ts +0 -4
  204. package/floating-ui.types.js +0 -1
  205. package/theme/applyDarkTheme.d.ts +0 -7
  206. package/theme/applyDarkTheme.js +0 -11
  207. package/theme/applyLightTheme.d.ts +0 -7
  208. package/theme/applyLightTheme.js +0 -11
  209. package/theme/applyTheme.d.ts +0 -7
  210. package/theme/applyTheme.js +0 -20
  211. package/theme/colors.d.ts +0 -54
  212. package/theme/colors.js +0 -82
  213. package/theme/darkTheme.d.ts +0 -2
  214. package/theme/darkTheme.js +0 -142
  215. package/theme/lightTheme.d.ts +0 -2
  216. package/theme/lightTheme.js +0 -119
  217. package/theme/toggleDarkTheme.d.ts +0 -18
  218. package/theme/toggleDarkTheme.js +0 -53
  219. package/theme/types.d.ts +0 -21
  220. package/theme/types.js +0 -1
  221. /package/{Link.types.js → Popover.types.js} +0 -0
  222. /package/{stores → mediaQueries}/prefersReducedMotion.js +0 -0
  223. /package/{stores → mediaQueries}/usingKeyboard.js +0 -0
@@ -1,11 +1,18 @@
1
- <script>export let checked = false;
1
+ <script>/** When true, displays the menu item as checked. */
2
+ export let checked = false;
3
+ /** When true, displays the menu item as disabled. */
2
4
  export let disabled = false;
5
+ /** When true, displays the menu item as a parent of children. */
3
6
  export let hasChildren = false;
7
+ /** When true, displays the menu as a top level menu bar item. */
4
8
  export let isMenuBarItem = false;
5
- export let menuItemRole = "menuitem";
9
+ /** The role of the menu item. */
10
+ export let menuItemRole = 'menuitem';
11
+ /** Additional class names to apply. */
12
+ export let variant = '';
6
13
  </script>
7
14
 
8
- <div class="sterling-menu-item-display" class:disabled>
15
+ <div class={`sterling-menu-item-display ${variant}`} class:disabled>
9
16
  <div
10
17
  class="check"
11
18
  class:checkmark={menuItemRole === 'menuitemcheckbox'}
@@ -13,124 +20,13 @@ export let menuItemRole = "menuitem";
13
20
  class:checked
14
21
  />
15
22
  <div class="content">
16
- <slot />
23
+ <slot {checked} {disabled} {hasChildren} {isMenuBarItem} {menuItemRole} {variant} />
17
24
  </div>
18
25
  {#if $$slots.shortcut}
19
26
  <div class="shortcut">
20
- <slot name="shortcut" />
27
+ <slot name="shortcut" {checked} {disabled} {isMenuBarItem} {menuItemRole} {variant} />
21
28
  </div>
22
29
  {:else}
23
30
  <div class="chevron" class:has-children={!isMenuBarItem && hasChildren} />
24
31
  {/if}
25
32
  </div>
26
-
27
- <style>
28
- .sterling-menu-item-display {
29
- align-items: center;
30
- justify-items: flex-start;
31
- display: grid;
32
- grid-template-columns: 1em 1fr 1em;
33
- column-gap: 0.5em;
34
- padding: 0.25em;
35
- }
36
-
37
- .check {
38
- box-sizing: border-box;
39
- pointer-events: none;
40
- width: 20px;
41
- height: 20px;
42
- position: relative;
43
- transition: background-color 250ms, color 250ms, border-color 250ms;
44
- }
45
-
46
- .check.checkmark.checked::after {
47
- border-color: currentColor;
48
- border-style: solid;
49
- border-width: 0 0.2em 0.2em 0;
50
- box-sizing: border-box;
51
- content: '';
52
- height: 0.8em;
53
- left: 45%;
54
- position: absolute;
55
- top: 45%;
56
- transform: translate(-50%, -50%) rotate(45deg);
57
- transform-origin: center;
58
- transition: border-color 250ms;
59
- width: 0.4em;
60
- }
61
-
62
- .check.bullet.checked::after {
63
- background-color: currentColor;
64
- border-radius: 10000px;
65
- content: '';
66
- height: 0.5em;
67
- left: 45%;
68
- position: absolute;
69
- top: 50%;
70
- transform: translate(-50%, -50%);
71
- transition: background-color 250ms;
72
- width: 0.5em;
73
- }
74
-
75
- .content {
76
- padding-top: 0.25em;
77
- }
78
-
79
- .chevron {
80
- position: relative;
81
- border: none;
82
- background: none;
83
- height: 1em;
84
- width: 1em;
85
- transform-origin: 50% 50%;
86
- }
87
-
88
- .chevron.has-children::after {
89
- position: absolute;
90
- content: '';
91
- top: 50%;
92
- left: 50%;
93
- width: 7px;
94
- height: 7px;
95
- border-right: 3px solid currentColor;
96
- border-top: 3px solid currentColor;
97
- transform: translate(-50%, -50%) rotate(45deg);
98
- }
99
-
100
- .sterling-menu-item-display.disabled {
101
- cursor: not-allowed;
102
- outline: none;
103
- }
104
-
105
- .sterling-menu-item-display::after {
106
- background: repeating-linear-gradient(
107
- var(--stsv-common--disabled__stripe-angle),
108
- var(--stsv-common--disabled__stripe-color),
109
- var(--stsv-common--disabled__stripe-color) var(--stsv-common--disabled__stripe-width),
110
- var(--stsv-common--disabled__stripe-color--alt) var(--stsv-common--disabled__stripe-width),
111
- var(--stsv-common--disabled__stripe-color--alt)
112
- calc(2 * var(--stsv-common--disabled__stripe-width))
113
- );
114
- bottom: 0;
115
- content: '';
116
- left: 0;
117
- opacity: 0;
118
- position: absolute;
119
- right: 0;
120
- top: 0;
121
- pointer-events: none;
122
- transition: opacity 250ms;
123
- }
124
-
125
- .sterling-menu-item-display.disabled::after {
126
- opacity: 1;
127
- }
128
-
129
- @media (prefers-reduced-motion) {
130
- .sterling-menu-item-display::after,
131
- .check,
132
- .check::after {
133
- transition: none;
134
- }
135
- }
136
- </style>
@@ -1,18 +1,32 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- checked?: boolean | undefined;
5
- disabled?: boolean | undefined;
6
- hasChildren?: boolean | undefined;
7
- isMenuBarItem?: boolean | undefined;
8
- menuItemRole?: "menuitem" | "menuitemcheckbox" | "menuitemradio" | undefined;
4
+ /** When true, displays the menu item as checked. */ checked?: boolean | undefined;
5
+ /** When true, displays the menu item as disabled. */ disabled?: boolean | undefined;
6
+ /** When true, displays the menu item as a parent of children. */ hasChildren?: boolean | undefined;
7
+ /** When true, displays the menu as a top level menu bar item. */ isMenuBarItem?: boolean | undefined;
8
+ /** The role of the menu item. */ menuItemRole?: "menuitem" | "menuitemcheckbox" | "menuitemradio" | undefined;
9
+ /** Additional class names to apply. */ variant?: string | undefined;
9
10
  };
10
11
  events: {
11
12
  [evt: string]: CustomEvent<any>;
12
13
  };
13
14
  slots: {
14
- default: {};
15
- shortcut: {};
15
+ default: {
16
+ checked: boolean;
17
+ disabled: boolean;
18
+ hasChildren: boolean;
19
+ isMenuBarItem: boolean;
20
+ menuItemRole: "menuitem" | "menuitemcheckbox" | "menuitemradio";
21
+ variant: string;
22
+ };
23
+ shortcut: {
24
+ checked: boolean;
25
+ disabled: boolean;
26
+ isMenuBarItem: boolean;
27
+ menuItemRole: "menuitem" | "menuitemcheckbox" | "menuitemradio";
28
+ variant: string;
29
+ };
16
30
  };
17
31
  };
18
32
  export type MenuItemDisplayProps = typeof __propDef.props;
@@ -1,48 +1,9 @@
1
+ <script>/** Additional class names to apply. */
2
+ export let variant = '';
3
+ </script>
4
+
1
5
  <!--
2
6
  @component
3
- A styled line to visually separate menu items in a menu.
7
+ A styled line to visually separate groups of menu items in a menu.
4
8
  -->
5
- <div
6
- class="sterling-menu-item-separator"
7
- role="separator"
8
- on:blur
9
- on:click
10
- on:dblclick
11
- on:dragend
12
- on:dragenter
13
- on:dragleave
14
- on:dragover
15
- on:dragstart
16
- on:drop
17
- on:focus
18
- on:focusin
19
- on:focusout
20
- on:keydown
21
- on:keypress
22
- on:keyup
23
- on:mousedown
24
- on:mouseenter
25
- on:mouseleave
26
- on:mousemove
27
- on:mouseover
28
- on:mouseout
29
- on:mouseup
30
- on:pointercancel
31
- on:pointerdown
32
- on:pointerenter
33
- on:pointerleave
34
- on:pointermove
35
- on:pointerover
36
- on:pointerout
37
- on:pointerup
38
- on:wheel|passive
39
- {...$$restProps}
40
- />
41
-
42
- <style>
43
- .sterling-menu-item-separator {
44
- height: var(--stsv-common__border-width);
45
- background-color: var(--stsv-common__border-color);
46
- margin: 0.1em 0;
47
- }
48
- </style>
9
+ <div class={`sterling-menu-separator ${variant}`} role="separator" {...$$restProps} />
@@ -1,88 +1,18 @@
1
- /** @typedef {typeof __propDef.props} MenuSeparatorProps */
2
- /** @typedef {typeof __propDef.events} MenuSeparatorEvents */
3
- /** @typedef {typeof __propDef.slots} MenuSeparatorSlots */
4
- /** A styled line to visually separate menu items in a menu. */
5
- export default class MenuSeparator extends SvelteComponentTyped<{
6
- [x: string]: never;
7
- }, {
8
- blur: FocusEvent;
9
- click: MouseEvent;
10
- dblclick: MouseEvent;
11
- dragend: DragEvent;
12
- dragenter: DragEvent;
13
- dragleave: DragEvent;
14
- dragover: DragEvent;
15
- dragstart: DragEvent;
16
- drop: DragEvent;
17
- focus: FocusEvent;
18
- focusin: FocusEvent;
19
- focusout: FocusEvent;
20
- keydown: KeyboardEvent;
21
- keypress: KeyboardEvent;
22
- keyup: KeyboardEvent;
23
- mousedown: MouseEvent;
24
- mouseenter: MouseEvent;
25
- mouseleave: MouseEvent;
26
- mousemove: MouseEvent;
27
- mouseover: MouseEvent;
28
- mouseout: MouseEvent;
29
- mouseup: MouseEvent;
30
- pointercancel: PointerEvent;
31
- pointerdown: PointerEvent;
32
- pointerenter: PointerEvent;
33
- pointerleave: PointerEvent;
34
- pointermove: PointerEvent;
35
- pointerover: PointerEvent;
36
- pointerout: PointerEvent;
37
- pointerup: PointerEvent;
38
- wheel: WheelEvent;
39
- } & {
40
- [evt: string]: CustomEvent<any>;
41
- }, {}> {
42
- }
43
- export type MenuSeparatorProps = typeof __propDef.props;
44
- export type MenuSeparatorEvents = typeof __propDef.events;
45
- export type MenuSeparatorSlots = typeof __propDef.slots;
46
1
  import { SvelteComponentTyped } from "svelte";
47
2
  declare const __propDef: {
48
3
  props: {
49
- [x: string]: never;
4
+ [x: string]: any;
5
+ variant?: string | undefined;
50
6
  };
51
7
  events: {
52
- blur: FocusEvent;
53
- click: MouseEvent;
54
- dblclick: MouseEvent;
55
- dragend: DragEvent;
56
- dragenter: DragEvent;
57
- dragleave: DragEvent;
58
- dragover: DragEvent;
59
- dragstart: DragEvent;
60
- drop: DragEvent;
61
- focus: FocusEvent;
62
- focusin: FocusEvent;
63
- focusout: FocusEvent;
64
- keydown: KeyboardEvent;
65
- keypress: KeyboardEvent;
66
- keyup: KeyboardEvent;
67
- mousedown: MouseEvent;
68
- mouseenter: MouseEvent;
69
- mouseleave: MouseEvent;
70
- mousemove: MouseEvent;
71
- mouseover: MouseEvent;
72
- mouseout: MouseEvent;
73
- mouseup: MouseEvent;
74
- pointercancel: PointerEvent;
75
- pointerdown: PointerEvent;
76
- pointerenter: PointerEvent;
77
- pointerleave: PointerEvent;
78
- pointermove: PointerEvent;
79
- pointerover: PointerEvent;
80
- pointerout: PointerEvent;
81
- pointerup: PointerEvent;
82
- wheel: WheelEvent;
83
- } & {
84
8
  [evt: string]: CustomEvent<any>;
85
9
  };
86
10
  slots: {};
87
11
  };
12
+ export type MenuSeparatorProps = typeof __propDef.props;
13
+ export type MenuSeparatorEvents = typeof __propDef.events;
14
+ export type MenuSeparatorSlots = typeof __propDef.slots;
15
+ /** A styled line to visually separate groups of menu items in a menu. */
16
+ export default class MenuSeparator extends SvelteComponentTyped<MenuSeparatorProps, MenuSeparatorEvents, MenuSeparatorSlots> {
17
+ }
88
18
  export {};
@@ -0,0 +1,2 @@
1
+ export declare const POPOVER_PLACEMENTS: string[];
2
+ export declare const STERLING_PORTAL_HOST_ID = "SterlingPortalHost";
@@ -1,14 +1,15 @@
1
- export const FLOATING_PLACEMENTS = [
2
- 'top',
3
- 'right',
4
- 'bottom',
5
- 'left',
1
+ export const POPOVER_PLACEMENTS = [
6
2
  'top-start',
7
- 'right-start',
8
- 'bottom-start',
9
- 'left-start',
3
+ 'top',
10
4
  'top-end',
5
+ 'right-start',
6
+ 'right',
11
7
  'right-end',
12
8
  'bottom-end',
13
- 'left-end'
9
+ 'bottom',
10
+ 'bottom-start',
11
+ 'left-end',
12
+ 'left',
13
+ 'left-start'
14
14
  ];
15
+ export const STERLING_PORTAL_HOST_ID = 'SterlingPortalHost';
package/Popover.svelte CHANGED
@@ -1,79 +1,96 @@
1
- <script>import { onMount } from "svelte";
2
- import { autoUpdate, computePosition, flip, offset } from "@floating-ui/dom";
3
- import { portal } from "./actions/portal";
4
- export let offsetOptions = { mainAxis: 0, crossAxis: 0 };
1
+ <script>import { onMount } from 'svelte';
2
+ import { autoUpdate, computePosition, flip, offset } from '@floating-ui/dom';
3
+ import { portal } from './actions/portal';
4
+ import { STERLING_PORTAL_HOST_ID } from './Popover.constants';
5
+ // ----- Props ----- //
6
+ /** When true, content is rendered only when the popover is open. */
7
+ export let conditionalRender = true;
8
+ /** The offset along the side of the reference element. */
9
+ export let crossAxisOffset = 0;
10
+ /** The offset towards or away from the side of the reference element. */
11
+ export let mainAxisOffset = 0;
12
+ /** When true, the popover is open and visible. */
5
13
  export let open = false;
6
- export let persistent = false;
7
- export let placement = "bottom-start";
8
- export let portalHost = void 0;
14
+ /** How the popover should be positioned relative to the reference element. */
15
+ export let placement = 'bottom-start';
16
+ /** The host container for the callout. */
17
+ export let portalHost = undefined;
18
+ /** The reference to the element anchoring the position of the popover. */
9
19
  export let reference;
20
+ /** Additional class names to apply. */
21
+ export let variant = '';
22
+ // ----- State ----- //
10
23
  let popupRef;
11
24
  let popupPosition = { x: 0, y: 0 };
12
- const hostId = "SterlingPopoverPortal";
25
+ $: floatingUIPlacement = placement;
26
+ // ----- Portal Host ----- //
13
27
  const ensurePortalHost = () => {
14
- if (document) {
15
- if (portalHost) {
16
- return portalHost;
28
+ if (document) {
29
+ if (portalHost) {
30
+ return portalHost;
31
+ }
32
+ let host = document.querySelector(`#${STERLING_PORTAL_HOST_ID}`);
33
+ if (!host) {
34
+ host = document.createElement('div');
35
+ host.id = STERLING_PORTAL_HOST_ID;
36
+ host.style.overflow = 'visible';
37
+ document.body.append(host);
38
+ }
39
+ portalHost = host;
17
40
  }
18
- let host = document.querySelector(`#${hostId}`);
19
- if (!host) {
20
- console.log("creating portal host");
21
- host = document.createElement("div");
22
- host.id = hostId;
23
- host.style.overflow = "visible";
24
- document.body.append(host);
25
- }
26
- portalHost = host;
27
- }
28
41
  };
42
+ // ----- Body Height Change ----- //
29
43
  let bodyHeight = 0;
44
+ // create an Observer instance
30
45
  const resizeObserver = new ResizeObserver((entries) => {
31
- bodyHeight = entries[0].target.clientHeight;
46
+ bodyHeight = entries[0].target.clientHeight;
32
47
  });
33
- $:
34
- middleware = [offset(offsetOptions), flip()];
35
- const computePopupPosition = async () => {
36
- if (reference && popupRef) {
37
- popupPosition = await computePosition(reference, popupRef, {
38
- placement,
39
- middleware
40
- });
41
- } else {
42
- popupPosition = { x: 0, y: 0 };
43
- }
44
- };
45
- let cleanupAutoUpdate = () => {
48
+ // ----- Position ----- //
49
+ $: middleware = [offset({ mainAxis: mainAxisOffset, crossAxis: crossAxisOffset }), flip()];
50
+ const computePopoverPosition = async () => {
51
+ if (reference && popupRef) {
52
+ popupPosition = await computePosition(reference, popupRef, {
53
+ placement: floatingUIPlacement,
54
+ middleware
55
+ });
56
+ }
57
+ else {
58
+ popupPosition = { x: 0, y: 0 };
59
+ }
46
60
  };
47
- const autoUpdateMenuPosition = () => {
48
- cleanupAutoUpdate();
49
- if (reference && popupRef) {
50
- cleanupAutoUpdate = autoUpdate(reference, popupRef, computePopupPosition);
51
- }
61
+ // whenever a positioned element is portaled it needs resubscription to auto-update
62
+ let cleanupAutoUpdate = () => { };
63
+ const autoUpdatePopoverPosition = () => {
64
+ cleanupAutoUpdate();
65
+ if (reference && popupRef) {
66
+ cleanupAutoUpdate = autoUpdate(reference, popupRef, computePopoverPosition);
67
+ }
52
68
  };
53
- $:
54
- popupRef, reference, autoUpdateMenuPosition();
55
- $:
56
- open, bodyHeight, middleware, placement, computePopupPosition();
69
+ $: popupRef, reference, autoUpdatePopoverPosition();
70
+ $: open, bodyHeight, middleware, floatingUIPlacement, computePopoverPosition();
71
+ // ----- EventHandlers ----- //
57
72
  onMount(() => {
58
- ensurePortalHost();
59
- resizeObserver.observe(document.body);
60
- return () => {
61
- resizeObserver.unobserve(document.body);
62
- };
73
+ ensurePortalHost();
74
+ // start observing a DOM node
75
+ resizeObserver.observe(document.body);
76
+ return () => {
77
+ resizeObserver.unobserve(document.body);
78
+ };
63
79
  });
64
80
  const onKeydown = (event) => {
65
- if (event.key === "Escape") {
66
- open = false;
67
- }
81
+ if (event.key === 'Escape') {
82
+ open = false;
83
+ }
68
84
  };
69
85
  ensurePortalHost();
70
86
  </script>
71
87
 
72
- {#if open || persistent}
88
+ {#if open || !conditionalRender}
73
89
  <div use:portal={{ target: portalHost ?? document.body }} class="sterling-popover-portal">
90
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
74
91
  <div
75
92
  bind:this={popupRef}
76
- class="sterling-popover"
93
+ class={`sterling-popover ${variant}`}
77
94
  class:open
78
95
  on:blur
79
96
  on:click
@@ -106,34 +123,7 @@ ensurePortalHost();
106
123
  {...$$restProps}
107
124
  style="left:{popupPosition.x}px; top:{popupPosition.y}px"
108
125
  >
109
- <slot />
126
+ <slot {open} {variant} />
110
127
  </div>
111
128
  </div>
112
129
  {/if}
113
-
114
- <style>
115
- .sterling-popover-portal {
116
- position: relative;
117
- overflow: visible;
118
- background: rgba(255, 0, 0, 0.1);
119
- }
120
-
121
- .sterling-popover {
122
- box-shadow: rgba(0, 0, 0, 0.4) 2px 2px 4px -1px;
123
- box-sizing: border-box;
124
- display: none;
125
- grid-template-columns: 1fr;
126
- grid-template-rows: 1fr;
127
- height: fit-content;
128
- left: 0;
129
- overflow: hidden;
130
- position: absolute;
131
- top: 0;
132
- width: max-content;
133
- z-index: 1;
134
- }
135
-
136
- .sterling-popover.open {
137
- display: grid;
138
- }
139
- </style>
@@ -2,12 +2,14 @@ import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
- offsetOptions?: import("@floating-ui/core").OffsetOptions | undefined;
5
+ conditionalRender?: boolean | undefined;
6
+ crossAxisOffset?: number | undefined;
7
+ mainAxisOffset?: number | undefined;
6
8
  open?: boolean | undefined;
7
- persistent?: boolean | undefined;
8
- placement?: import("@floating-ui/dom").Placement | undefined;
9
+ placement?: string | undefined;
9
10
  portalHost?: HTMLElement | undefined;
10
- reference: HTMLElement;
11
+ reference: HTMLElement | undefined;
12
+ variant?: string | undefined;
11
13
  };
12
14
  events: {
13
15
  blur: FocusEvent;
@@ -41,7 +43,10 @@ declare const __propDef: {
41
43
  [evt: string]: CustomEvent<any>;
42
44
  };
43
45
  slots: {
44
- default: {};
46
+ default: {
47
+ open: boolean;
48
+ variant: string;
49
+ };
45
50
  };
46
51
  };
47
52
  export type PopoverProps = typeof __propDef.props;
@@ -0,0 +1,4 @@
1
+ import type { POPOVER_PLACEMENTS } from './Popover.constants';
2
+ type PopoverPlacementTuple = typeof POPOVER_PLACEMENTS;
3
+ export type PopoverPlacement = PopoverPlacementTuple[number];
4
+ export {};