@geoffcox/sterling-svelte 0.0.31 → 1.0.1

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 (215) 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 +107 -146
  5. package/Callout.svelte.d.ts +1 -1
  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 +90 -187
  11. package/Dialog.svelte.d.ts +2 -1
  12. package/Dropdown.svelte +52 -220
  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 -65
  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 +66 -73
  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 +1 -1
  45. package/Popover.constants.js +1 -1
  46. package/Popover.svelte +66 -80
  47. package/Popover.svelte.d.ts +5 -1
  48. package/Progress.svelte +28 -126
  49. package/Progress.svelte.d.ts +4 -3
  50. package/Radio.svelte +49 -192
  51. package/Radio.svelte.d.ts +2 -2
  52. package/RgbColorSliders.svelte +48 -137
  53. package/RgbColorSliders.svelte.d.ts +5 -5
  54. package/Select.svelte +122 -250
  55. package/Select.svelte.d.ts +6 -2
  56. package/Slider.svelte +90 -259
  57. package/Slider.svelte.d.ts +1 -2
  58. package/Switch.svelte +24 -259
  59. package/Switch.svelte.d.ts +3 -1
  60. package/Tab.svelte +27 -175
  61. package/Tab.svelte.d.ts +6 -4
  62. package/TabList.svelte +146 -171
  63. package/TabList.svelte.d.ts +3 -2
  64. package/TabList.types.d.ts +6 -1
  65. package/TextArea.svelte +32 -129
  66. package/TextArea.svelte.d.ts +1 -1
  67. package/Tooltip.svelte +46 -47
  68. package/Tooltip.svelte.d.ts +8 -3
  69. package/Tree.constants.d.ts +0 -1
  70. package/Tree.constants.js +0 -1
  71. package/Tree.svelte +35 -119
  72. package/Tree.svelte.d.ts +4 -4
  73. package/Tree.types.d.ts +1 -3
  74. package/TreeChevron.svelte +18 -98
  75. package/TreeChevron.svelte.d.ts +1 -0
  76. package/TreeItem.constants.d.ts +1 -0
  77. package/TreeItem.constants.js +1 -0
  78. package/TreeItem.svelte +251 -211
  79. package/TreeItem.svelte.d.ts +7 -3
  80. package/TreeItem.types.d.ts +1 -1
  81. package/TreeItemDisplay.svelte +20 -104
  82. package/TreeItemDisplay.svelte.d.ts +2 -2
  83. package/actions/applyLightDarkMode.d.ts +10 -0
  84. package/actions/applyLightDarkMode.js +36 -0
  85. package/actions/forwardEvents.js +3 -3
  86. package/css/Button.base.css +74 -0
  87. package/css/Button.colorful.css +17 -0
  88. package/css/Button.css +7 -0
  89. package/css/Button.secondary.colorful.css +15 -0
  90. package/css/Button.secondary.css +11 -0
  91. package/css/Button.shapes.css +14 -0
  92. package/css/Button.tool.colorful.css +13 -0
  93. package/css/Button.tool.css +18 -0
  94. package/css/Callout.base.css +43 -0
  95. package/css/Callout.colorful.css +5 -0
  96. package/css/Callout.css +2 -0
  97. package/css/Checkbox.base.css +145 -0
  98. package/css/Checkbox.colorful.css +17 -0
  99. package/css/Checkbox.css +2 -0
  100. package/css/ColorPicker.base.css +23 -0
  101. package/css/ColorPicker.css +1 -0
  102. package/css/Dialog.base.css +116 -0
  103. package/css/Dialog.css +1 -0
  104. package/css/Dropdown.base.css +147 -0
  105. package/css/Dropdown.colorful.css +23 -0
  106. package/css/Dropdown.css +2 -0
  107. package/css/HexColorSliders.base.css +106 -0
  108. package/css/HexColorSliders.css +1 -0
  109. package/css/HslColorSliders.base.css +124 -0
  110. package/css/HslColorSliders.css +1 -0
  111. package/css/Input.base.css +100 -0
  112. package/css/Input.colorful.css +22 -0
  113. package/css/Input.composed.css +8 -0
  114. package/css/Input.css +3 -0
  115. package/css/Label.base.css +119 -0
  116. package/css/Label.boxed.colorful.css +21 -0
  117. package/css/Label.boxed.css +31 -0
  118. package/css/Label.colorful.css +3 -0
  119. package/css/Label.css +4 -0
  120. package/css/Link.base.css +52 -0
  121. package/css/Link.colorful.css +15 -0
  122. package/css/Link.css +6 -0
  123. package/css/Link.ghost.colorful.css +7 -0
  124. package/css/Link.ghost.css +11 -0
  125. package/css/Link.undecorated.colorful.css +6 -0
  126. package/css/Link.undecorated.css +6 -0
  127. package/css/List.base.css +98 -0
  128. package/css/List.css +1 -0
  129. package/css/ListItem.base.css +59 -0
  130. package/css/ListItem.css +1 -0
  131. package/css/Menu.base.css +21 -0
  132. package/css/Menu.css +1 -0
  133. package/css/MenuBar.base.css +9 -0
  134. package/css/MenuBar.css +1 -0
  135. package/css/MenuButton.base.css +13 -0
  136. package/css/MenuButton.css +1 -0
  137. package/css/MenuItem.base.css +48 -0
  138. package/css/MenuItem.css +1 -0
  139. package/css/MenuItemDisplay.base.css +104 -0
  140. package/css/MenuItemDisplay.css +1 -0
  141. package/css/MenuSeparator.base.css +5 -0
  142. package/css/MenuSeparator.css +1 -0
  143. package/css/Popover copy.css +21 -0
  144. package/css/Popover.css +21 -0
  145. package/css/Progress.base.css +99 -0
  146. package/css/Progress.css +1 -0
  147. package/css/Radio.base.css +135 -0
  148. package/css/Radio.colorful.css +18 -0
  149. package/css/Radio.css +2 -0
  150. package/css/RgbColorSliders.base.css +94 -0
  151. package/css/RgbColorSliders.css +1 -0
  152. package/css/Select.base.css +127 -0
  153. package/css/Select.colorful.css +24 -0
  154. package/css/Select.composed.css +12 -0
  155. package/css/Select.css +3 -0
  156. package/css/Slider.base.css +182 -0
  157. package/css/Slider.colorful.css +11 -0
  158. package/css/Slider.composed.css +8 -0
  159. package/css/Slider.css +3 -0
  160. package/css/Switch.base.css +193 -0
  161. package/css/Switch.colorful.css +39 -0
  162. package/css/Switch.css +2 -0
  163. package/css/Tab.base.css +135 -0
  164. package/css/Tab.colorful.css +13 -0
  165. package/css/Tab.css +2 -0
  166. package/css/TabList.base.css +34 -0
  167. package/css/TabList.css +1 -0
  168. package/css/TextArea.base.css +85 -0
  169. package/css/TextArea.colorful.css +17 -0
  170. package/css/TextArea.composed.css +8 -0
  171. package/css/TextArea.css +3 -0
  172. package/css/Tooltip.base.css +6 -0
  173. package/css/Tooltip.css +1 -0
  174. package/css/Tree.base.css +74 -0
  175. package/css/Tree.composed.css +8 -0
  176. package/css/Tree.css +2 -0
  177. package/css/TreeChevron.base.css +86 -0
  178. package/css/TreeChevron.css +1 -0
  179. package/css/TreeItem.base.css +3 -0
  180. package/css/TreeItem.css +1 -0
  181. package/css/TreeItemDisplay.base.css +74 -0
  182. package/css/TreeItemDisplay.colorful.css +9 -0
  183. package/css/TreeItemDisplay.css +1 -0
  184. package/css/dark-mode.css +134 -0
  185. package/css/light-mode.css +134 -0
  186. package/css/sterling.css +37 -0
  187. package/index.d.ts +9 -13
  188. package/index.js +8 -12
  189. package/mediaQueries/prefersColorSchemeDark.d.ts +2 -0
  190. package/mediaQueries/prefersColorSchemeDark.js +10 -0
  191. package/{stores → mediaQueries}/prefersReducedMotion.d.ts +1 -0
  192. package/{stores → mediaQueries}/usingKeyboard.d.ts +1 -0
  193. package/package.json +121 -13
  194. package/Link.constants.d.ts +0 -1
  195. package/Link.constants.js +0 -1
  196. package/Link.types.d.ts +0 -4
  197. package/Link.types.js +0 -1
  198. package/theme/applyDarkTheme.d.ts +0 -7
  199. package/theme/applyDarkTheme.js +0 -11
  200. package/theme/applyLightTheme.d.ts +0 -7
  201. package/theme/applyLightTheme.js +0 -11
  202. package/theme/applyTheme.d.ts +0 -7
  203. package/theme/applyTheme.js +0 -20
  204. package/theme/colors.d.ts +0 -54
  205. package/theme/colors.js +0 -82
  206. package/theme/darkTheme.d.ts +0 -2
  207. package/theme/darkTheme.js +0 -142
  208. package/theme/lightTheme.d.ts +0 -2
  209. package/theme/lightTheme.js +0 -119
  210. package/theme/toggleDarkTheme.d.ts +0 -18
  211. package/theme/toggleDarkTheme.js +0 -53
  212. package/theme/types.d.ts +0 -21
  213. package/theme/types.js +0 -1
  214. /package/{stores → mediaQueries}/prefersReducedMotion.js +0 -0
  215. /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 {};
@@ -1,2 +1,2 @@
1
1
  export declare const POPOVER_PLACEMENTS: string[];
2
- export declare const POPOVER_PORTAL_ID = "SterlingPopoverPortal";
2
+ export declare const STERLING_PORTAL_HOST_ID = "SterlingPortalHost";
@@ -12,4 +12,4 @@ export const POPOVER_PLACEMENTS = [
12
12
  'left',
13
13
  'left-start'
14
14
  ];
15
- export const POPOVER_PORTAL_ID = 'SterlingPopoverPortal';
15
+ export const STERLING_PORTAL_HOST_ID = 'SterlingPortalHost';
package/Popover.svelte CHANGED
@@ -1,86 +1,96 @@
1
- <script>import { onMount } from "svelte";
2
- import {
3
- autoUpdate,
4
- computePosition,
5
- flip,
6
- offset
7
- } from "@floating-ui/dom";
8
- import { portal } from "./actions/portal";
9
- import { POPOVER_PORTAL_ID } from "./Popover.constants";
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. */
10
7
  export let conditionalRender = true;
8
+ /** The offset along the side of the reference element. */
11
9
  export let crossAxisOffset = 0;
10
+ /** The offset towards or away from the side of the reference element. */
12
11
  export let mainAxisOffset = 0;
12
+ /** When true, the popover is open and visible. */
13
13
  export let open = false;
14
- export let placement = "bottom-start";
15
- 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. */
16
19
  export let reference;
20
+ /** Additional class names to apply. */
21
+ export let variant = '';
22
+ // ----- State ----- //
17
23
  let popupRef;
18
24
  let popupPosition = { x: 0, y: 0 };
19
- $:
20
- floatingUIPlacement = placement;
25
+ $: floatingUIPlacement = placement;
26
+ // ----- Portal Host ----- //
21
27
  const ensurePortalHost = () => {
22
- if (document) {
23
- if (portalHost) {
24
- 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;
25
40
  }
26
- let host = document.querySelector(`#${POPOVER_PORTAL_ID}`);
27
- if (!host) {
28
- host = document.createElement("div");
29
- host.id = POPOVER_PORTAL_ID;
30
- host.style.overflow = "visible";
31
- document.body.append(host);
32
- }
33
- portalHost = host;
34
- }
35
41
  };
42
+ // ----- Body Height Change ----- //
36
43
  let bodyHeight = 0;
44
+ // create an Observer instance
37
45
  const resizeObserver = new ResizeObserver((entries) => {
38
- bodyHeight = entries[0].target.clientHeight;
46
+ bodyHeight = entries[0].target.clientHeight;
39
47
  });
40
- $:
41
- middleware = [offset({ mainAxis: mainAxisOffset, crossAxis: crossAxisOffset }), flip()];
48
+ // ----- Position ----- //
49
+ $: middleware = [offset({ mainAxis: mainAxisOffset, crossAxis: crossAxisOffset }), flip()];
42
50
  const computePopoverPosition = async () => {
43
- if (reference && popupRef) {
44
- popupPosition = await computePosition(reference, popupRef, {
45
- placement: floatingUIPlacement,
46
- middleware
47
- });
48
- } else {
49
- popupPosition = { x: 0, y: 0 };
50
- }
51
- };
52
- let cleanupAutoUpdate = () => {
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
+ }
53
60
  };
61
+ // whenever a positioned element is portaled it needs resubscription to auto-update
62
+ let cleanupAutoUpdate = () => { };
54
63
  const autoUpdatePopoverPosition = () => {
55
- cleanupAutoUpdate();
56
- if (reference && popupRef) {
57
- cleanupAutoUpdate = autoUpdate(reference, popupRef, computePopoverPosition);
58
- }
64
+ cleanupAutoUpdate();
65
+ if (reference && popupRef) {
66
+ cleanupAutoUpdate = autoUpdate(reference, popupRef, computePopoverPosition);
67
+ }
59
68
  };
60
- $:
61
- popupRef, reference, autoUpdatePopoverPosition();
62
- $:
63
- open, bodyHeight, middleware, floatingUIPlacement, computePopoverPosition();
69
+ $: popupRef, reference, autoUpdatePopoverPosition();
70
+ $: open, bodyHeight, middleware, floatingUIPlacement, computePopoverPosition();
71
+ // ----- EventHandlers ----- //
64
72
  onMount(() => {
65
- ensurePortalHost();
66
- resizeObserver.observe(document.body);
67
- return () => {
68
- resizeObserver.unobserve(document.body);
69
- };
73
+ ensurePortalHost();
74
+ // start observing a DOM node
75
+ resizeObserver.observe(document.body);
76
+ return () => {
77
+ resizeObserver.unobserve(document.body);
78
+ };
70
79
  });
71
80
  const onKeydown = (event) => {
72
- if (event.key === "Escape") {
73
- open = false;
74
- }
81
+ if (event.key === 'Escape') {
82
+ open = false;
83
+ }
75
84
  };
76
85
  ensurePortalHost();
77
86
  </script>
78
87
 
79
88
  {#if open || !conditionalRender}
80
89
  <div use:portal={{ target: portalHost ?? document.body }} class="sterling-popover-portal">
90
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
81
91
  <div
82
92
  bind:this={popupRef}
83
- class="sterling-popover"
93
+ class={`sterling-popover ${variant}`}
84
94
  class:open
85
95
  on:blur
86
96
  on:click
@@ -113,31 +123,7 @@ ensurePortalHost();
113
123
  {...$$restProps}
114
124
  style="left:{popupPosition.x}px; top:{popupPosition.y}px"
115
125
  >
116
- <slot />
126
+ <slot {open} {variant} />
117
127
  </div>
118
128
  </div>
119
129
  {/if}
120
-
121
- <style>
122
- .sterling-popover-portal {
123
- position: relative;
124
- overflow: visible;
125
- }
126
-
127
- .sterling-popover {
128
- box-sizing: border-box;
129
- display: none;
130
- grid-template-columns: 1fr;
131
- grid-template-rows: 1fr;
132
- height: fit-content;
133
- left: 0;
134
- overflow: visible;
135
- position: absolute;
136
- top: 0;
137
- width: max-content;
138
- }
139
-
140
- .sterling-popover.open {
141
- display: grid;
142
- }
143
- </style>
@@ -9,6 +9,7 @@ declare const __propDef: {
9
9
  placement?: string | undefined;
10
10
  portalHost?: HTMLElement | undefined;
11
11
  reference: HTMLElement | undefined;
12
+ variant?: string | undefined;
12
13
  };
13
14
  events: {
14
15
  blur: FocusEvent;
@@ -42,7 +43,10 @@ declare const __propDef: {
42
43
  [evt: string]: CustomEvent<any>;
43
44
  };
44
45
  slots: {
45
- default: {};
46
+ default: {
47
+ open: boolean;
48
+ variant: string;
49
+ };
46
50
  };
47
51
  };
48
52
  export type PopoverProps = typeof __propDef.props;