@likable-hair/svelte 3.3.30 → 3.3.32

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 (198) hide show
  1. package/dist/components/composed/buttons/ActivableButton.svelte +6 -2
  2. package/dist/components/composed/buttons/ActivableButton.svelte.d.ts +36 -32
  3. package/dist/components/composed/common/MenuOrDrawer.svelte +30 -23
  4. package/dist/components/composed/common/MenuOrDrawer.svelte.d.ts +39 -25
  5. package/dist/components/composed/common/MenuOrDrawerOptions.svelte +42 -33
  6. package/dist/components/composed/common/MenuOrDrawerOptions.svelte.d.ts +25 -21
  7. package/dist/components/composed/common/QuickActions.svelte +84 -48
  8. package/dist/components/composed/common/QuickActions.svelte.d.ts +24 -20
  9. package/dist/components/composed/common/ToolTip.svelte +31 -22
  10. package/dist/components/composed/common/ToolTip.svelte.d.ts +32 -43
  11. package/dist/components/composed/forms/AsyncAutocomplete.svelte +44 -23
  12. package/dist/components/composed/forms/AsyncAutocomplete.svelte.d.ts +44 -39
  13. package/dist/components/composed/forms/AvatarDropdown.svelte +57 -27
  14. package/dist/components/composed/forms/AvatarDropdown.svelte.d.ts +45 -41
  15. package/dist/components/composed/forms/ConfirmOrCancelButtons.svelte +35 -17
  16. package/dist/components/composed/forms/ConfirmOrCancelButtons.svelte.d.ts +41 -37
  17. package/dist/components/composed/forms/CountriesAutocomplete.svelte +16 -7
  18. package/dist/components/composed/forms/CountriesAutocomplete.svelte.d.ts +31 -60
  19. package/dist/components/composed/forms/DatePickerTextField.svelte +166 -114
  20. package/dist/components/composed/forms/DatePickerTextField.svelte.d.ts +67 -63
  21. package/dist/components/composed/forms/Dropdown.svelte +51 -21
  22. package/dist/components/composed/forms/Dropdown.svelte.d.ts +48 -43
  23. package/dist/components/composed/forms/IconsDropdown.svelte +61 -33
  24. package/dist/components/composed/forms/IconsDropdown.svelte.d.ts +30 -26
  25. package/dist/components/composed/forms/LabelAndSelect.svelte +32 -7
  26. package/dist/components/composed/forms/LabelAndSelect.svelte.d.ts +35 -31
  27. package/dist/components/composed/forms/LabelAndTextField.svelte +30 -5
  28. package/dist/components/composed/forms/LabelAndTextField.svelte.d.ts +46 -42
  29. package/dist/components/composed/forms/ToggleList.svelte +59 -33
  30. package/dist/components/composed/forms/ToggleList.svelte.d.ts +21 -17
  31. package/dist/components/composed/forms/YearPickerTextField.svelte +114 -74
  32. package/dist/components/composed/forms/YearPickerTextField.svelte.d.ts +53 -49
  33. package/dist/components/composed/list/DynamicTable.css +10 -8
  34. package/dist/components/composed/list/DynamicTable.svelte +1138 -733
  35. package/dist/components/composed/list/DynamicTable.svelte.d.ts +370 -366
  36. package/dist/components/composed/list/PaginatedTable.svelte +144 -76
  37. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +111 -110
  38. package/dist/components/composed/progress/HorizontalStackedProgress.svelte +59 -30
  39. package/dist/components/composed/progress/HorizontalStackedProgress.svelte.d.ts +26 -22
  40. package/dist/components/composed/search/DynamicFilters.svelte +104 -83
  41. package/dist/components/composed/search/DynamicFilters.svelte.d.ts +31 -27
  42. package/dist/components/composed/search/FilterEditor.svelte +106 -77
  43. package/dist/components/composed/search/FilterEditor.svelte.d.ts +37 -33
  44. package/dist/components/composed/search/Filters.svelte +363 -293
  45. package/dist/components/composed/search/Filters.svelte.d.ts +56 -52
  46. package/dist/components/composed/search/GlobalSearchTextField.svelte +79 -41
  47. package/dist/components/composed/search/GlobalSearchTextField.svelte.d.ts +43 -39
  48. package/dist/components/composed/search/MobileFilterEditor.svelte +135 -93
  49. package/dist/components/composed/search/MobileFilterEditor.svelte.d.ts +39 -35
  50. package/dist/components/composed/search/SearchBar.svelte +28 -5
  51. package/dist/components/composed/search/SearchBar.svelte.d.ts +34 -30
  52. package/dist/components/composed/search/SearchResults.svelte +42 -7
  53. package/dist/components/composed/search/SearchResults.svelte.d.ts +40 -36
  54. package/dist/components/composed/shop/ProductCard.svelte +18 -4
  55. package/dist/components/composed/shop/ProductCard.svelte.d.ts +32 -28
  56. package/dist/components/composed/shop/ProductsGrid.svelte +22 -2
  57. package/dist/components/composed/shop/ProductsGrid.svelte.d.ts +44 -40
  58. package/dist/components/layouts/CollapsibleSideBarLayout.svelte +55 -29
  59. package/dist/components/layouts/CollapsibleSideBarLayout.svelte.d.ts +85 -54
  60. package/dist/components/layouts/StableDividedSideBarLayout.svelte +47 -17
  61. package/dist/components/layouts/StableDividedSideBarLayout.svelte.d.ts +50 -32
  62. package/dist/components/layouts/UnstableDividedSideBarLayout.svelte +53 -30
  63. package/dist/components/layouts/UnstableDividedSideBarLayout.svelte.d.ts +103 -63
  64. package/dist/components/simple/buttons/Button.svelte +78 -32
  65. package/dist/components/simple/buttons/Button.svelte.d.ts +47 -35
  66. package/dist/components/simple/buttons/LinkButton.svelte +54 -22
  67. package/dist/components/simple/buttons/LinkButton.svelte.d.ts +50 -33
  68. package/dist/components/simple/charts/GanymedeBarChart.svelte +172 -134
  69. package/dist/components/simple/charts/GanymedeBarChart.svelte.d.ts +50 -46
  70. package/dist/components/simple/charts/GanymedeLineChart.svelte +157 -115
  71. package/dist/components/simple/charts/GanymedeLineChart.svelte.d.ts +51 -47
  72. package/dist/components/simple/charts/GanymedePieChart.svelte +62 -39
  73. package/dist/components/simple/charts/GanymedePieChart.svelte.d.ts +37 -33
  74. package/dist/components/simple/common/Card.svelte +20 -1
  75. package/dist/components/simple/common/Card.svelte.d.ts +51 -38
  76. package/dist/components/simple/common/CollapsibleDivider.svelte +23 -11
  77. package/dist/components/simple/common/CollapsibleDivider.svelte.d.ts +29 -25
  78. package/dist/components/simple/common/Divider.svelte +8 -2
  79. package/dist/components/simple/common/Divider.svelte.d.ts +23 -19
  80. package/dist/components/simple/common/Gesture.svelte +64 -46
  81. package/dist/components/simple/common/Gesture.svelte.d.ts +21 -17
  82. package/dist/components/simple/common/InfiniteScroll.svelte +52 -29
  83. package/dist/components/simple/common/InfiniteScroll.svelte.d.ts +24 -20
  84. package/dist/components/simple/common/IntersectionObserver.svelte +45 -32
  85. package/dist/components/simple/common/IntersectionObserver.svelte.d.ts +34 -21
  86. package/dist/components/simple/common/MediaQuery.svelte +30 -21
  87. package/dist/components/simple/common/MediaQuery.svelte.d.ts +34 -30
  88. package/dist/components/simple/common/Menu.svelte +421 -298
  89. package/dist/components/simple/common/Menu.svelte.d.ts +51 -40
  90. package/dist/components/simple/common/Playground.svelte +18 -17
  91. package/dist/components/simple/common/Playground.svelte.d.ts +19 -15
  92. package/dist/components/simple/common/VerticalDraggableList.svelte +35 -16
  93. package/dist/components/simple/common/VerticalDraggableList.svelte.d.ts +33 -29
  94. package/dist/components/simple/dashboards/DashboardGridShaper.svelte +32 -26
  95. package/dist/components/simple/dashboards/DashboardGridShaper.svelte.d.ts +16 -12
  96. package/dist/components/simple/dates/Calendar.svelte +52 -28
  97. package/dist/components/simple/dates/Calendar.svelte.d.ts +45 -41
  98. package/dist/components/simple/dates/DatePicker.svelte +90 -60
  99. package/dist/components/simple/dates/DatePicker.svelte.d.ts +44 -40
  100. package/dist/components/simple/dates/MonthSelector.svelte +37 -15
  101. package/dist/components/simple/dates/MonthSelector.svelte.d.ts +35 -31
  102. package/dist/components/simple/dates/TimePicker.svelte +45 -31
  103. package/dist/components/simple/dates/TimePicker.svelte.d.ts +24 -20
  104. package/dist/components/simple/dates/TimePickerTextField.svelte +56 -35
  105. package/dist/components/simple/dates/TimePickerTextField.svelte.d.ts +28 -24
  106. package/dist/components/simple/dates/YearSelector.svelte +54 -29
  107. package/dist/components/simple/dates/YearSelector.svelte.d.ts +35 -31
  108. package/dist/components/simple/dialogs/Dialog.svelte +95 -62
  109. package/dist/components/simple/dialogs/Dialog.svelte.d.ts +43 -28
  110. package/dist/components/simple/forms/Autocomplete.svelte +201 -142
  111. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +83 -79
  112. package/dist/components/simple/forms/Checkbox.svelte +40 -24
  113. package/dist/components/simple/forms/Checkbox.svelte.d.ts +26 -22
  114. package/dist/components/simple/forms/FileInput.svelte +88 -48
  115. package/dist/components/simple/forms/FileInput.svelte.d.ts +37 -33
  116. package/dist/components/simple/forms/FileInputList.svelte +62 -37
  117. package/dist/components/simple/forms/FileInputList.svelte.d.ts +39 -35
  118. package/dist/components/simple/forms/RadioButton.svelte +11 -3
  119. package/dist/components/simple/forms/RadioButton.svelte.d.ts +31 -27
  120. package/dist/components/simple/forms/Select.svelte +16 -3
  121. package/dist/components/simple/forms/Select.svelte.d.ts +24 -20
  122. package/dist/components/simple/forms/SimpleTextField.svelte +53 -6
  123. package/dist/components/simple/forms/SimpleTextField.svelte.d.ts +64 -60
  124. package/dist/components/simple/forms/Switch.svelte +30 -16
  125. package/dist/components/simple/forms/Switch.svelte.d.ts +25 -21
  126. package/dist/components/simple/forms/Textarea.svelte +27 -2
  127. package/dist/components/simple/forms/Textarea.svelte.d.ts +41 -37
  128. package/dist/components/simple/forms/Textfield.svelte +56 -18
  129. package/dist/components/simple/forms/Textfield.svelte.d.ts +55 -51
  130. package/dist/components/simple/forms/TreeEditor.svelte +141 -95
  131. package/dist/components/simple/forms/TreeEditor.svelte.d.ts +42 -38
  132. package/dist/components/simple/forms/TreeEditorItem.svelte +77 -42
  133. package/dist/components/simple/forms/TreeEditorItem.svelte.d.ts +54 -50
  134. package/dist/components/simple/forms/VerticalSwitch.svelte +11 -1
  135. package/dist/components/simple/forms/VerticalSwitch.svelte.d.ts +32 -28
  136. package/dist/components/simple/forms/VerticalTextSwitch.svelte +15 -3
  137. package/dist/components/simple/forms/VerticalTextSwitch.svelte.d.ts +30 -26
  138. package/dist/components/simple/lists/ColorInvertedSelector.svelte +53 -23
  139. package/dist/components/simple/lists/ColorInvertedSelector.svelte.d.ts +46 -42
  140. package/dist/components/simple/lists/HierarchyMenu.svelte +38 -19
  141. package/dist/components/simple/lists/HierarchyMenu.svelte.d.ts +34 -30
  142. package/dist/components/simple/lists/Paginator.svelte +50 -41
  143. package/dist/components/simple/lists/Paginator.svelte.d.ts +23 -19
  144. package/dist/components/simple/lists/SelectableMenuList.svelte +43 -15
  145. package/dist/components/simple/lists/SelectableMenuList.svelte.d.ts +24 -20
  146. package/dist/components/simple/lists/SelectableVerticalList.svelte +100 -59
  147. package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +51 -47
  148. package/dist/components/simple/lists/SidebarMenuList.svelte +116 -71
  149. package/dist/components/simple/lists/SidebarMenuList.svelte.d.ts +26 -22
  150. package/dist/components/simple/lists/SimpleTable.svelte +264 -154
  151. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +70 -66
  152. package/dist/components/simple/loaders/CircularLoader.svelte +16 -5
  153. package/dist/components/simple/loaders/CircularLoader.svelte.d.ts +19 -15
  154. package/dist/components/simple/loaders/Skeleton.svelte +3 -2
  155. package/dist/components/simple/loaders/Skeleton.svelte.d.ts +16 -12
  156. package/dist/components/simple/media/AttachmentDownloader.svelte +17 -3
  157. package/dist/components/simple/media/AttachmentDownloader.svelte.d.ts +32 -28
  158. package/dist/components/simple/media/Avatar.svelte +18 -12
  159. package/dist/components/simple/media/Avatar.svelte.d.ts +31 -20
  160. package/dist/components/simple/media/Carousel.svelte +29 -11
  161. package/dist/components/simple/media/Carousel.svelte.d.ts +28 -24
  162. package/dist/components/simple/media/DescriptiveAvatar.svelte +12 -4
  163. package/dist/components/simple/media/DescriptiveAvatar.svelte.d.ts +44 -28
  164. package/dist/components/simple/media/FlagIcon.svelte +8 -5
  165. package/dist/components/simple/media/FlagIcon.svelte.d.ts +19 -15
  166. package/dist/components/simple/media/Gallery.svelte +49 -29
  167. package/dist/components/simple/media/Gallery.svelte.d.ts +27 -23
  168. package/dist/components/simple/media/Icon.svelte +9 -4
  169. package/dist/components/simple/media/Icon.svelte.d.ts +24 -20
  170. package/dist/components/simple/media/Image.svelte +42 -20
  171. package/dist/components/simple/media/Image.svelte.d.ts +44 -33
  172. package/dist/components/simple/media/ImageGrid.svelte +37 -12
  173. package/dist/components/simple/media/ImageGrid.svelte.d.ts +32 -28
  174. package/dist/components/simple/navigation/Breadcrumb.svelte +28 -10
  175. package/dist/components/simple/navigation/Breadcrumb.svelte.d.ts +26 -22
  176. package/dist/components/simple/navigation/Chip.svelte +44 -23
  177. package/dist/components/simple/navigation/Chip.svelte.d.ts +42 -31
  178. package/dist/components/simple/navigation/Drawer.svelte +107 -65
  179. package/dist/components/simple/navigation/Drawer.svelte.d.ts +50 -37
  180. package/dist/components/simple/navigation/HeaderMenu.svelte +40 -23
  181. package/dist/components/simple/navigation/HeaderMenu.svelte.d.ts +39 -35
  182. package/dist/components/simple/navigation/Navigator.svelte +30 -8
  183. package/dist/components/simple/navigation/Navigator.svelte.d.ts +28 -24
  184. package/dist/components/simple/navigation/TabSwitcher.svelte +83 -47
  185. package/dist/components/simple/navigation/TabSwitcher.svelte.d.ts +38 -34
  186. package/dist/components/simple/notifiers/AlertBanner.svelte +43 -15
  187. package/dist/components/simple/notifiers/AlertBanner.svelte.d.ts +41 -37
  188. package/dist/components/simple/progress/ProgressBar.svelte +20 -13
  189. package/dist/components/simple/progress/ProgressBar.svelte.d.ts +21 -17
  190. package/dist/components/simple/timeline/SimpleTimeLine.svelte +26 -12
  191. package/dist/components/simple/timeline/SimpleTimeLine.svelte.d.ts +39 -35
  192. package/dist/components/simple/typography/Code.svelte +27 -12
  193. package/dist/components/simple/typography/Code.svelte.d.ts +28 -24
  194. package/dist/stores/debounce.d.ts +0 -1
  195. package/dist/stores/layouts/unstableSidebarOpened.d.ts +0 -1
  196. package/dist/stores/mediaQuery.d.ts +0 -1
  197. package/dist/stores/theme.d.ts +0 -1
  198. package/package.json +1 -1
@@ -1,371 +1,494 @@
1
- <script>import { createId } from "@paralleldrive/cuid2";
2
- import {
3
- fly
4
- } from "svelte/transition";
5
- import { sidebarOpened } from "../../../stores/layouts/unstableSidebarOpened";
6
- export let _top = void 0, _left = void 0, _width = "auto", _height = "auto", _maxHeight = void 0, _minWidth = void 0, _overflow = "auto", _boxShadow = void 0, _borderRadius = void 0, _activatorGap = 5;
7
- export let open = false, refreshPosition = false, activator = void 0, anchor = "bottom", closeOnClickOutside = false, inAnimation = fly, inAnimationConfig = {
8
- duration: 100,
9
- y: 10
10
- }, outAnimation = fly, outAnimationConfig = {
11
- duration: 100,
12
- y: 10
13
- }, menuElement = void 0, flipOnOverflow = false, stayInViewport = false, openingId = void 0;
14
- let zIndex = 50, currentUid = createId(), closeController;
15
- function calculateMenuPosition(params) {
16
- if (params.menuElement) {
17
- if (params.activator) {
18
- if (anchor == "bottom") {
19
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
20
- let activatorHeight = params.activator.offsetHeight;
21
- _top = activatorTop + activatorHeight + _activatorGap;
22
- _left = activatorLeft;
23
- let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
24
- if (!!fixedParent) {
25
- _top = _top - fixedParentTop;
26
- _left = _left - fixedParentLeft;
27
- } else if (!validStickyParent && !fixedParent) {
28
- _top = _top + window.scrollY;
29
- _left = _left + window.scrollX;
30
- }
31
- } else if (anchor == "bottom-center") {
32
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
33
- let activatorHeight = params.activator.offsetHeight;
34
- let activatorWidth = params.activator.offsetWidth;
35
- let menuWidth = params.menuElement.offsetWidth;
36
- _top = activatorTop + activatorHeight + _activatorGap;
37
- _left = activatorLeft;
38
- let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
39
- if (!!fixedParent) {
40
- _top = _top - fixedParentTop;
41
- _left = _left - fixedParentLeft;
42
- } else if (!validStickyParent && !fixedParent) {
43
- _top = _top + window.scrollY;
44
- _left = _left + window.scrollX;
1
+ <script lang="ts">
2
+ import { createId } from '@paralleldrive/cuid2';
3
+
4
+ import {
5
+ fly,
6
+ type FadeParams,
7
+ type FlyParams,
8
+ type SlideParams,
9
+ type TransitionConfig,
10
+ } from "svelte/transition";
11
+
12
+ import { sidebarOpened } from '../../../stores/layouts/unstableSidebarOpened';
13
+
14
+ export let _top: number | undefined = undefined,
15
+ _left: number | undefined = undefined,
16
+ _width: string = 'auto',
17
+ _height: string = 'auto',
18
+ _maxHeight: string | undefined = undefined,
19
+ _minWidth: string | undefined = undefined,
20
+ _overflow = "auto",
21
+ _boxShadow: string | undefined = undefined,
22
+ _borderRadius: string | undefined = undefined,
23
+ _activatorGap: number = 5
24
+
25
+ export let open = false,
26
+ refreshPosition = false,
27
+ activator: HTMLElement | undefined = undefined,
28
+ anchor: "bottom" | "bottom-center" | "right-center" | "left-center" | "up" | "left" | "right" | "up-center" = "bottom",
29
+ closeOnClickOutside = false,
30
+ inAnimation: (
31
+ node: Element,
32
+ params?: SlideParams | FlyParams | FadeParams
33
+ ) => TransitionConfig = fly,
34
+ inAnimationConfig: SlideParams | FlyParams | FadeParams = {
35
+ duration: 100,
36
+ y: 10,
37
+ },
38
+ outAnimation: (
39
+ node: Element,
40
+ params?: SlideParams | FlyParams | FadeParams
41
+ ) => TransitionConfig = fly,
42
+ outAnimationConfig: SlideParams | FlyParams | FadeParams = {
43
+ duration: 100,
44
+ y: 10,
45
+ },
46
+ menuElement: HTMLElement | undefined = undefined,
47
+ flipOnOverflow: boolean = false,
48
+ stayInViewport: boolean = false,
49
+ openingId: string | undefined = undefined;
50
+
51
+ let zIndex = 50,
52
+ currentUid: string = createId(),
53
+ closeController: HTMLElement;
54
+
55
+ function calculateMenuPosition(params: {
56
+ activator: HTMLElement;
57
+ menuElement: HTMLElement;
58
+ }) {
59
+ if (params.menuElement) {
60
+ if (params.activator) {
61
+ if (anchor == "bottom") {
62
+ let { left: activatorLeft, top: activatorTop } =
63
+ params.activator.getBoundingClientRect();
64
+ let activatorHeight = params.activator.offsetHeight;
65
+ _top = activatorTop + activatorHeight + _activatorGap;
66
+ _left = activatorLeft;
67
+
68
+ let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
69
+ if(!!fixedParent) {
70
+ _top = _top - fixedParentTop
71
+ _left = _left - fixedParentLeft
72
+ } else if(!validStickyParent && !fixedParent) {
73
+ _top = _top + window.scrollY
74
+ _left = _left + window.scrollX
75
+ }
76
+
77
+ } else if (anchor == "bottom-center") {
78
+ let { left: activatorLeft, top: activatorTop } =
79
+ params.activator.getBoundingClientRect();
80
+ let activatorHeight = params.activator.offsetHeight;
81
+ let activatorWidth = params.activator.offsetWidth;
82
+ let menuWidth = params.menuElement.offsetWidth;
83
+ _top = activatorTop + activatorHeight + _activatorGap;
84
+ _left = activatorLeft;
85
+
86
+ let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
87
+ if(!!fixedParent) {
88
+ _top = _top - fixedParentTop
89
+ _left = _left - fixedParentLeft
90
+ } else if(!validStickyParent && !fixedParent) {
91
+ _top = _top + window.scrollY
92
+ _left = _left + window.scrollX
93
+ }
94
+
95
+ if (menuWidth > activatorWidth) {
96
+ _left = _left - (menuWidth - activatorWidth) / 2;
97
+ } else {
98
+ _left = _left + (activatorWidth - menuWidth) / 2;
99
+ }
100
+ } else if (anchor == 'right-center') {
101
+ let { left: activatorLeft, top: activatorTop } =
102
+ params.activator.getBoundingClientRect();
103
+ let activatorHeight = params.activator.offsetHeight;
104
+ let activatorWidth = params.activator.offsetWidth;
105
+ let menuHeight = params.menuElement.offsetHeight;
106
+ let { top: fixedParentTop, left: fixedParentLeft } = getParentInstanceFromViewport(activator?.parentElement);
107
+
108
+ _top = activatorTop + window.scrollY + (activatorHeight / 2) - (menuHeight / 2) - fixedParentTop;
109
+ _left = activatorLeft + window.scrollX + activatorWidth + _activatorGap - fixedParentLeft;
110
+ } else if (anchor == 'left-center') {
111
+ let { left: activatorLeft, top: activatorTop } =
112
+ params.activator.getBoundingClientRect();
113
+ let activatorHeight = params.activator.offsetHeight;
114
+ let menuHeight = params.menuElement.offsetHeight;
115
+ let menuWidth = params.menuElement.offsetWidth;
116
+ let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
117
+
118
+ _top = activatorTop + (activatorHeight / 2) - (menuHeight / 2);
119
+ _left = activatorLeft - menuWidth - _activatorGap;
120
+
121
+ if(!!fixedParent) {
122
+ _top = _top - fixedParentTop
123
+ _left = _left - fixedParentLeft
124
+ } else if(!validStickyParent && !fixedParent) {
125
+ _top = _top + window.scrollY
126
+ _left = _left + window.scrollX
127
+ }
128
+ } else if (anchor == 'up') {
129
+ let { left: activatorLeft, top: activatorTop } =
130
+ params.activator.getBoundingClientRect();
131
+ let menuHeight = params.menuElement.offsetHeight;
132
+ _top = activatorTop - menuHeight - _activatorGap;
133
+ _left = activatorLeft;
134
+
135
+ let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
136
+ if(!!fixedParent) {
137
+ _top = _top - fixedParentTop
138
+ _left = _left - fixedParentLeft
139
+ } else if(!validStickyParent && !fixedParent) {
140
+ _top = _top + window.scrollY
141
+ _left = _left + window.scrollX
142
+ }
143
+ } else if (anchor == 'left') {
144
+ let { left: activatorLeft, top: activatorTop } =
145
+ params.activator.getBoundingClientRect();
146
+ let menuWidth = params.menuElement.offsetWidth;
147
+ _top = activatorTop;
148
+ _left = activatorLeft - menuWidth - _activatorGap;
149
+
150
+ let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
151
+ if(!!fixedParent) {
152
+ _top = _top - fixedParentTop
153
+ _left = _left - fixedParentLeft
154
+ } else if(!validStickyParent && !fixedParent) {
155
+ _top = _top + window.scrollY
156
+ _left = _left + window.scrollX
157
+ }
158
+ } else if (anchor == 'right') {
159
+ let { left: activatorLeft, top: activatorTop } =
160
+ params.activator.getBoundingClientRect();
161
+ let activatorWidth = params.activator.offsetWidth;
162
+ _top = activatorTop;
163
+ _left = activatorLeft + activatorWidth + _activatorGap;
164
+
165
+ let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
166
+ if(!!fixedParent) {
167
+ _top = _top - fixedParentTop
168
+ _left = _left - fixedParentLeft
169
+ } else if(!validStickyParent && !fixedParent) {
170
+ _top = _top + window.scrollY
171
+ _left = _left + window.scrollX
172
+ }
173
+ } else if (anchor == 'up-center') {
174
+ let { left: activatorLeft, top: activatorTop } =
175
+ params.activator.getBoundingClientRect();
176
+ let activatorWidth = params.activator.offsetWidth;
177
+ let menuHeight = params.menuElement.offsetHeight;
178
+ let menuWidth = params.menuElement.offsetWidth;
179
+ _top = activatorTop - menuHeight - _activatorGap;
180
+ _left = activatorLeft;
181
+
182
+ let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
183
+ if(!!fixedParent) {
184
+ _top = _top - fixedParentTop
185
+ _left = _left - fixedParentLeft
186
+ } else if(!validStickyParent && !fixedParent) {
187
+ _top = _top + window.scrollY
188
+ _left = _left + window.scrollX
189
+ }
190
+
191
+ if (menuWidth > activatorWidth) {
192
+ _left = _left - (menuWidth - activatorWidth) / 2;
193
+ } else {
194
+ _left = _left + (activatorWidth - menuWidth) / 2;
195
+ }
45
196
  }
46
- if (menuWidth > activatorWidth) {
47
- _left = _left - (menuWidth - activatorWidth) / 2;
48
- } else {
49
- _left = _left + (activatorWidth - menuWidth) / 2;
197
+ }
198
+
199
+ if(flipOnOverflow && !!params.activator) {
200
+ let { top: activatorTopDistance } = params.activator.getBoundingClientRect()
201
+ if (window.innerHeight < activatorTopDistance + (menuElement?.offsetHeight || 0) + ((menuElement?.offsetHeight || 0) * 0.1)) {
202
+ _top = getTopDistance(params.activator) - _activatorGap - (menuElement?.offsetHeight || 0)
50
203
  }
51
- } else if (anchor == "right-center") {
52
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
53
- let activatorHeight = params.activator.offsetHeight;
54
- let activatorWidth = params.activator.offsetWidth;
55
- let menuHeight = params.menuElement.offsetHeight;
56
- let { top: fixedParentTop, left: fixedParentLeft } = getParentInstanceFromViewport(activator?.parentElement);
57
- _top = activatorTop + window.scrollY + activatorHeight / 2 - menuHeight / 2 - fixedParentTop;
58
- _left = activatorLeft + window.scrollX + activatorWidth + _activatorGap - fixedParentLeft;
59
- } else if (anchor == "left-center") {
60
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
61
- let activatorHeight = params.activator.offsetHeight;
62
- let menuHeight = params.menuElement.offsetHeight;
63
- let menuWidth = params.menuElement.offsetWidth;
64
- let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
65
- _top = activatorTop + activatorHeight / 2 - menuHeight / 2;
66
- _left = activatorLeft - menuWidth - _activatorGap;
67
- if (!!fixedParent) {
68
- _top = _top - fixedParentTop;
69
- _left = _left - fixedParentLeft;
70
- } else if (!validStickyParent && !fixedParent) {
71
- _top = _top + window.scrollY;
72
- _left = _left + window.scrollX;
204
+
205
+ if (
206
+ anchor == 'right-center' &&
207
+ window.innerWidth + window.scrollX <
208
+ (_left || 0) + (menuElement?.offsetWidth || 0)
209
+ ) {
210
+ let { left: activatorLeft } = params.activator.getBoundingClientRect();
211
+ _left = activatorLeft + window.scrollX - _activatorGap - (menuElement?.offsetWidth || 0)
73
212
  }
74
- } else if (anchor == "up") {
75
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
76
- let menuHeight = params.menuElement.offsetHeight;
77
- _top = activatorTop - menuHeight - _activatorGap;
78
- _left = activatorLeft;
79
- let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
80
- if (!!fixedParent) {
81
- _top = _top - fixedParentTop;
82
- _left = _left - fixedParentLeft;
83
- } else if (!validStickyParent && !fixedParent) {
84
- _top = _top + window.scrollY;
85
- _left = _left + window.scrollX;
213
+
214
+ if (
215
+ anchor == 'left-center' &&
216
+ (_left || 0) < 0
217
+ ) {
218
+ let { left: activatorLeft } = params.activator.getBoundingClientRect();
219
+ let activatorWidth = params.activator.offsetWidth;
220
+ _left = activatorLeft + window.scrollX + activatorWidth + _activatorGap
86
221
  }
87
- } else if (anchor == "left") {
88
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
89
- let menuWidth = params.menuElement.offsetWidth;
90
- _top = activatorTop;
91
- _left = activatorLeft - menuWidth - _activatorGap;
92
- let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
93
- if (!!fixedParent) {
94
- _top = _top - fixedParentTop;
95
- _left = _left - fixedParentLeft;
96
- } else if (!validStickyParent && !fixedParent) {
97
- _top = _top + window.scrollY;
98
- _left = _left + window.scrollX;
222
+
223
+ if (
224
+ anchor == 'left' &&
225
+ (_left || 0) < 0
226
+ ) {
227
+ let { left: activatorLeft } = params.activator.getBoundingClientRect();
228
+ let activatorWidth = params.activator.offsetWidth;
229
+ _left = activatorLeft + window.scrollX + activatorWidth + _activatorGap
99
230
  }
100
- } else if (anchor == "right") {
101
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
102
- let activatorWidth = params.activator.offsetWidth;
103
- _top = activatorTop;
104
- _left = activatorLeft + activatorWidth + _activatorGap;
105
- let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
106
- if (!!fixedParent) {
107
- _top = _top - fixedParentTop;
108
- _left = _left - fixedParentLeft;
109
- } else if (!validStickyParent && !fixedParent) {
110
- _top = _top + window.scrollY;
111
- _left = _left + window.scrollX;
231
+
232
+ if (
233
+ anchor == 'right' &&
234
+ window.innerWidth + window.scrollX <
235
+ (_left || 0) + (menuElement?.offsetWidth || 0)
236
+ ) {
237
+ let { left: activatorLeft } = params.activator.getBoundingClientRect();
238
+ let menuWidth = params.menuElement.offsetWidth;
239
+ _left = activatorLeft + window.scrollX - menuWidth - _activatorGap
112
240
  }
113
- } else if (anchor == "up-center") {
114
- let { left: activatorLeft, top: activatorTop } = params.activator.getBoundingClientRect();
115
- let activatorWidth = params.activator.offsetWidth;
116
- let menuHeight = params.menuElement.offsetHeight;
117
- let menuWidth = params.menuElement.offsetWidth;
118
- _top = activatorTop - menuHeight - _activatorGap;
119
- _left = activatorLeft;
120
- let { top: fixedParentTop, left: fixedParentLeft, fixedParent, validStickyParent } = getParentInstanceFromViewport(activator?.parentElement);
121
- if (!!fixedParent) {
122
- _top = _top - fixedParentTop;
123
- _left = _left - fixedParentLeft;
124
- } else if (!validStickyParent && !fixedParent) {
125
- _top = _top + window.scrollY;
126
- _left = _left + window.scrollX;
241
+
242
+ if (
243
+ anchor == 'up' &&
244
+ (_top || 0) < window.scrollY
245
+ ) {
246
+ let { top: activatorTop } = params.activator.getBoundingClientRect();
247
+ let activatorHeight = params.activator.offsetHeight;
248
+ _top = activatorTop + window.scrollY + activatorHeight + _activatorGap
127
249
  }
128
- if (menuWidth > activatorWidth) {
129
- _left = _left - (menuWidth - activatorWidth) / 2;
130
- } else {
131
- _left = _left + (activatorWidth - menuWidth) / 2;
250
+
251
+ if (
252
+ anchor == 'up-center' &&
253
+ (_top || 0) < window.scrollY
254
+ ) {
255
+ let { top: activatorTop } = params.activator.getBoundingClientRect();
256
+ let activatorHeight = params.activator.offsetHeight;
257
+ _top = activatorTop + window.scrollY + activatorHeight + _activatorGap
132
258
  }
133
259
  }
134
- }
135
- if (flipOnOverflow && !!params.activator) {
136
- let { top: activatorTopDistance } = params.activator.getBoundingClientRect();
137
- if (window.innerHeight < activatorTopDistance + (menuElement?.offsetHeight || 0) + (menuElement?.offsetHeight || 0) * 0.1) {
138
- _top = getTopDistance(params.activator) - _activatorGap - (menuElement?.offsetHeight || 0);
139
- }
140
- if (anchor == "right-center" && window.innerWidth + window.scrollX < (_left || 0) + (menuElement?.offsetWidth || 0)) {
141
- let { left: activatorLeft } = params.activator.getBoundingClientRect();
142
- _left = activatorLeft + window.scrollX - _activatorGap - (menuElement?.offsetWidth || 0);
143
- }
144
- if (anchor == "left-center" && (_left || 0) < 0) {
145
- let { left: activatorLeft } = params.activator.getBoundingClientRect();
146
- let activatorWidth = params.activator.offsetWidth;
147
- _left = activatorLeft + window.scrollX + activatorWidth + _activatorGap;
148
- }
149
- if (anchor == "left" && (_left || 0) < 0) {
150
- let { left: activatorLeft } = params.activator.getBoundingClientRect();
151
- let activatorWidth = params.activator.offsetWidth;
152
- _left = activatorLeft + window.scrollX + activatorWidth + _activatorGap;
153
- }
154
- if (anchor == "right" && window.innerWidth + window.scrollX < (_left || 0) + (menuElement?.offsetWidth || 0)) {
155
- let { left: activatorLeft } = params.activator.getBoundingClientRect();
156
- let menuWidth = params.menuElement.offsetWidth;
157
- _left = activatorLeft + window.scrollX - menuWidth - _activatorGap;
158
- }
159
- if (anchor == "up" && (_top || 0) < window.scrollY) {
160
- let { top: activatorTop } = params.activator.getBoundingClientRect();
161
- let activatorHeight = params.activator.offsetHeight;
162
- _top = activatorTop + window.scrollY + activatorHeight + _activatorGap;
163
- }
164
- if (anchor == "up-center" && (_top || 0) < window.scrollY) {
165
- let { top: activatorTop } = params.activator.getBoundingClientRect();
166
- let activatorHeight = params.activator.offsetHeight;
167
- _top = activatorTop + window.scrollY + activatorHeight + _activatorGap;
168
- }
169
- }
170
- if (stayInViewport) {
171
- if (window.innerWidth + window.scrollX < (_left || 0) + (menuElement?.offsetWidth || 0)) {
172
- _left = Math.max(
173
- window.innerWidth + window.scrollX - (menuElement?.offsetWidth || 0),
174
- 0
175
- );
176
- }
177
- if ((_left || 0) < window.scrollX) {
178
- _left = window.scrollX;
260
+
261
+ if(stayInViewport) {
262
+ if (
263
+ window.innerWidth + window.scrollX <
264
+ (_left || 0) + (menuElement?.offsetWidth || 0)
265
+ ) {
266
+ _left = Math.max(
267
+ window.innerWidth + window.scrollX - (menuElement?.offsetWidth || 0),
268
+ 0
269
+ );
270
+ }
271
+
272
+ if ((_left || 0) < window.scrollX) {
273
+ _left = window.scrollX;
274
+ }
179
275
  }
180
- }
181
- if (!!positionedAncestor) {
182
- let { left: positionedAncestorLeft, top: positionedAncestorTop } = positionedAncestor.getBoundingClientRect();
183
- if (!_left)
184
- _left = 0;
185
- if (!_top)
186
- _top = 0;
187
- _left = _left - (positionedAncestorLeft + window.scrollX);
188
- _top = _top - (positionedAncestorTop + window.scrollY);
189
- if (!!activator) {
190
- let { validStickyParent, fixedParent } = getParentInstanceFromViewport(activator?.parentElement);
191
- if (!!validStickyParent || !!fixedParent) {
192
- _left = _left + window.scrollX;
193
- _top = _top + window.scrollY;
276
+
277
+ if(!!positionedAncestor) {
278
+ let { left: positionedAncestorLeft, top: positionedAncestorTop } = positionedAncestor.getBoundingClientRect();
279
+
280
+ if(!_left) _left = 0
281
+ if(!_top) _top = 0
282
+
283
+ _left = _left - (positionedAncestorLeft + window.scrollX)
284
+ _top = _top - (positionedAncestorTop + window.scrollY)
285
+
286
+ if(!!activator) {
287
+ let { validStickyParent, fixedParent } = getParentInstanceFromViewport(activator?.parentElement)
288
+ if(!!validStickyParent || !!fixedParent) {
289
+ _left = _left + window.scrollX
290
+ _top = _top + window.scrollY
291
+ }
194
292
  }
195
293
  }
196
294
  }
197
295
  }
198
- }
199
- function getTopDistance(elem) {
200
- let positionedAncestor2 = getPositionedAncestor(elem);
201
- if (!!positionedAncestor2) {
202
- let top = parseInt(getComputedStyle(positionedAncestor2).top);
203
- return (isNaN(top) ? 0 : top) + elem.offsetTop - calcScrollY(elem);
296
+
297
+ function getTopDistance(elem: HTMLElement): number {
298
+ let positionedAncestor = getPositionedAncestor(elem)
299
+ if(!!positionedAncestor) {
300
+ let top: number = parseInt(getComputedStyle(positionedAncestor).top)
301
+ return (isNaN(top) ? 0 : top) + elem.offsetTop - calcScrollY(elem)
302
+ }
303
+ return window.scrollY + elem.getBoundingClientRect().top
204
304
  }
205
- return window.scrollY + elem.getBoundingClientRect().top;
206
- }
207
- function calcScrollY(elem) {
208
- let parent = elem.parentElement;
209
- let scroll = 0;
210
- while (!!parent) {
211
- scroll += parent.scrollTop;
212
- let parentPosition = getComputedStyle(parent).position;
213
- if (parentPosition === "absolute" || parentPosition === "fixed" || parentPosition === "relative")
214
- break;
215
- parent = parent.parentElement;
305
+
306
+ function calcScrollY(elem: HTMLElement): number {
307
+ let parent = elem.parentElement
308
+ let scroll = 0
309
+ while(!!parent) {
310
+ scroll += parent.scrollTop
311
+ let parentPosition = getComputedStyle(parent).position
312
+ if(parentPosition === 'absolute' || parentPosition === 'fixed' || parentPosition === 'relative') break
313
+ parent = parent.parentElement
314
+ }
315
+ return scroll
216
316
  }
217
- return scroll;
218
- }
219
- $:
220
- if (open) {
221
- if (!!activator) {
222
- let parent = activator.parentElement;
223
- while (!!parent) {
224
- let parentPosition = getComputedStyle(parent).position;
225
- parent.addEventListener("scroll", refreshMenuPosition);
226
- if (parentPosition == "absolute" || parentPosition == "fixed" || parentPosition === "relative")
227
- break;
228
- parent = parent.parentElement;
317
+
318
+
319
+ $: if (open) {
320
+ if(!!activator) {
321
+ let parent = activator.parentElement
322
+ while(!!parent) {
323
+ let parentPosition = getComputedStyle(parent).position
324
+ parent.addEventListener('scroll', refreshMenuPosition)
325
+ if(parentPosition == 'absolute' || parentPosition == 'fixed' || parentPosition === 'relative') break
326
+ parent = parent.parentElement
229
327
  }
230
328
  }
231
- if (!!openingId) {
232
- const controllers = document.querySelectorAll(`[data-operation="close"][data-opening-id="${openingId}"]`);
233
- for (let k = 0; k < controllers.length; k += 1) {
234
- if (controllers[k] !== closeController) {
235
- const clickEvent = new MouseEvent("click", {
329
+
330
+ if(!!openingId) {
331
+ const controllers = document.querySelectorAll(`[data-operation="close"][data-opening-id="${openingId}"]`)
332
+ for(let k = 0; k < controllers.length; k += 1) {
333
+ if(controllers[k] !== closeController) {
334
+ const clickEvent = new MouseEvent('click', {
236
335
  bubbles: true,
237
336
  cancelable: true,
238
337
  view: window
239
- });
240
- controllers[k].dispatchEvent(clickEvent);
338
+ })
339
+
340
+ controllers[k].dispatchEvent(clickEvent)
241
341
  }
242
342
  }
243
343
  }
244
- let otherMenus = document.querySelectorAll("[data-menu]");
245
- let otherDialogs = document.querySelectorAll("[data-dialog]");
246
- let maxZIndex = void 0;
344
+
345
+ let otherMenus: NodeListOf<HTMLElement> =
346
+ document.querySelectorAll("[data-menu]");
347
+ let otherDialogs: NodeListOf<HTMLElement> =
348
+ document.querySelectorAll("[data-dialog]");
349
+
350
+ let maxZIndex: number | undefined = undefined;
247
351
  if (otherDialogs.length > 0) {
248
352
  otherDialogs.forEach((dialog) => {
249
353
  if (!maxZIndex || maxZIndex < Number(dialog.style.zIndex))
250
354
  maxZIndex = Number(dialog.style.zIndex);
251
355
  });
252
356
  }
357
+
253
358
  if (otherMenus.length > 0) {
254
359
  otherMenus.forEach((menu) => {
255
360
  if (!maxZIndex || maxZIndex < Number(menu.style.zIndex))
256
361
  maxZIndex = Number(menu.style.zIndex);
257
362
  });
258
363
  }
364
+
259
365
  if (!!activator && !!menuElement)
260
366
  calculateMenuPosition({ activator, menuElement });
261
- if (maxZIndex)
262
- zIndex = maxZIndex + 2;
367
+
368
+ if (maxZIndex) zIndex = maxZIndex + 2;
263
369
  }
264
- $:
265
- if (!!_width && !!activator && !!menuElement) {
370
+ $: if (!!_width && !!activator && !!menuElement) {
266
371
  setTimeout(() => {
267
- if (!!activator && !!menuElement)
372
+ if(!!activator && !!menuElement)
268
373
  calculateMenuPosition({ activator, menuElement });
269
- }, 1);
374
+ }, 1)
270
375
  }
271
- $:
272
- if (refreshPosition && !!activator && !!menuElement) {
376
+ $: if (refreshPosition && !!activator && !!menuElement) {
273
377
  calculateMenuPosition({ activator, menuElement });
274
378
  refreshPosition = false;
275
379
  }
276
- $:
277
- if (closeOnClickOutside && !!menuElement) {
380
+ $: if (closeOnClickOutside && !!menuElement) {
278
381
  window.addEventListener("mousedown", () => {
279
382
  open = false;
280
383
  });
384
+
281
385
  window.addEventListener("touchstart", () => {
282
386
  open = false;
283
387
  });
388
+
284
389
  if (activator) {
285
390
  activator.addEventListener("mousedown", (event) => {
286
391
  event.stopPropagation();
287
392
  });
393
+
288
394
  activator.addEventListener("touchstart", (event) => {
289
395
  event.stopPropagation();
290
396
  });
291
397
  }
398
+
292
399
  menuElement.addEventListener("mousedown", (event) => {
293
400
  event.stopPropagation();
294
401
  });
402
+
295
403
  menuElement.addEventListener("touchstart", (event) => {
296
404
  event.stopPropagation();
297
405
  });
298
406
  }
299
- let positionedAncestor = void 0;
300
- $:
301
- if (!!menuElement && !!activator) {
302
- let elem = getPositionedAncestor(menuElement.parentElement);
303
- positionedAncestor = elem == null ? void 0 : elem;
304
- calculateMenuPosition({ menuElement, activator });
407
+
408
+
409
+ let positionedAncestor: HTMLElement | undefined = undefined
410
+
411
+ $: if(!!menuElement && !!activator) {
412
+ let elem = getPositionedAncestor(menuElement.parentElement)
413
+ positionedAncestor = elem == null ? undefined : elem
414
+ calculateMenuPosition({menuElement, activator})
305
415
  }
306
- function getPositionedAncestor(elem) {
307
- if (!elem)
308
- return null;
309
- if (["fixed", "absolute", "sticky", "relative"].includes(getComputedStyle(elem).position))
310
- return elem;
311
- return getPositionedAncestor(elem.parentElement);
312
- }
313
- function handleCloseControllerClick() {
314
- open = false;
315
- }
316
- function getParentInstanceFromViewport(activatorParent) {
317
- let top = 0;
318
- let left = 0;
319
- let fixedParent = void 0;
320
- let stickyParent = !!activatorParent && getComputedStyle(activatorParent).position === "sticky" ? activatorParent : void 0;
321
- let isStickyValid = false;
322
- while (!!activatorParent && activatorParent.nodeName.toLowerCase() !== "html" && activatorParent.nodeName.toLowerCase() !== "body") {
323
- const currentParent = activatorParent.parentElement;
324
- if (!currentParent)
325
- break;
326
- const computedStyle = getComputedStyle(currentParent);
327
- const position = computedStyle.position;
328
- const display = computedStyle.display;
329
- if ((position === "fixed" || position === "absolute" || position === "relative") && display === "flex") {
330
- const boundingClientRect = activatorParent.getBoundingClientRect();
331
- top = top + boundingClientRect.top;
332
- left = left + boundingClientRect.left;
333
- fixedParent = activatorParent;
334
- }
335
- if (position === "sticky") {
336
- stickyParent = activatorParent;
337
- }
338
- if (position === "relative" && !!stickyParent) {
339
- isStickyValid = true;
340
- }
341
- activatorParent = activatorParent.parentElement;
416
+
417
+ function getPositionedAncestor(elem: HTMLElement | null): HTMLElement | null {
418
+ if (!elem) return null
419
+ if (['fixed', 'absolute', 'sticky', 'relative'].includes(getComputedStyle(elem).position)) return elem
420
+ return getPositionedAncestor(elem.parentElement)
421
+ }
422
+
423
+ function handleCloseControllerClick() {
424
+ open = false
342
425
  }
343
- return { top, left, fixedParent, validStickyParent: isStickyValid ? stickyParent : void 0 };
344
- }
345
- function refreshMenuPosition() {
346
- if (open && !!menuElement && !!activator)
347
- calculateMenuPosition({ menuElement, activator });
348
- }
349
- function handleMenuClick(e, zIndex2) {
350
- let otherMenus = document.querySelectorAll(`[data-menu]`);
351
- otherMenus.forEach((m) => {
352
- let uid = m.getAttribute("data-uid");
353
- if (uid !== currentUid && Number(m.style.zIndex) > zIndex2) {
354
- let controller = document.querySelector(`[data-operation="close"][data-uid="${uid}"]`);
355
- if (!!controller) {
356
- const clickEvent = new MouseEvent("click", {
357
- bubbles: false,
358
- cancelable: true,
359
- view: window
360
- });
361
- controller.dispatchEvent(clickEvent);
426
+
427
+ function getParentInstanceFromViewport(activatorParent: HTMLElement | undefined | null): {
428
+ top: number
429
+ left: number
430
+ fixedParent?: HTMLElement,
431
+ validStickyParent?: HTMLElement
432
+ } {
433
+ let top = 0
434
+ let left = 0
435
+ let fixedParent: HTMLElement | undefined = undefined
436
+ let stickyParent: HTMLElement | undefined = !!activatorParent && getComputedStyle(activatorParent).position === 'sticky' ? activatorParent : undefined
437
+ let isStickyValid: boolean = false
438
+
439
+ while(!!activatorParent && activatorParent.nodeName.toLowerCase() !== 'html' && activatorParent.nodeName.toLowerCase() !== 'body') {
440
+ const currentParent = activatorParent.parentElement
441
+ if(!currentParent) break
442
+
443
+ const computedStyle = getComputedStyle(currentParent)
444
+ const position = computedStyle.position;
445
+ const display = computedStyle.display;
446
+
447
+ if((position === 'fixed' || position === 'absolute' || position === 'relative') && display === "flex") {
448
+ const boundingClientRect = activatorParent.getBoundingClientRect();
449
+ top = top + boundingClientRect.top
450
+ left = left + boundingClientRect.left
451
+ fixedParent = activatorParent
452
+ }
453
+
454
+ if(position === 'sticky') {
455
+ stickyParent = activatorParent
456
+ }
457
+
458
+ if(position === 'relative' && !!stickyParent) {
459
+ isStickyValid = true
362
460
  }
461
+
462
+ activatorParent = activatorParent.parentElement
463
+
363
464
  }
364
- });
365
- }
366
- $:
367
- if ($sidebarOpened !== void 0)
368
- setTimeout(refreshMenuPosition, 300);
465
+ return { top, left, fixedParent, validStickyParent: isStickyValid ? stickyParent : undefined }
466
+ }
467
+
468
+ function refreshMenuPosition() {
469
+ if(open && !!menuElement && !!activator) calculateMenuPosition({ menuElement, activator })
470
+ }
471
+
472
+ function handleMenuClick(e: MouseEvent, zIndex: number) {
473
+ let otherMenus: NodeListOf<HTMLElement> = document.querySelectorAll(`[data-menu]`)
474
+ otherMenus.forEach(m => {
475
+ let uid = m.getAttribute('data-uid')
476
+ if(uid !== currentUid && Number(m.style.zIndex) > zIndex) {
477
+ let controller = document.querySelector(`[data-operation="close"][data-uid="${uid}"]`)
478
+ if(!!controller) {
479
+ const clickEvent = new MouseEvent('click', {
480
+ bubbles: false,
481
+ cancelable: true,
482
+ view: window
483
+ })
484
+ controller.dispatchEvent(clickEvent)
485
+ }
486
+ }
487
+ })
488
+ }
489
+
490
+ // TODO find a better way to update menu positions with animations
491
+ $: if($sidebarOpened !== undefined) setTimeout(refreshMenuPosition, 300)
369
492
  </script>
370
493
 
371
494
  <svelte:window on:scroll={refreshMenuPosition} on:resize={refreshMenuPosition} ></svelte:window>