kamrify commited on
Commit
3d651f8
·
1 Parent(s): 5bc1611

Add left right alignment of popover

Browse files
Files changed (1) hide show
  1. src/popover.ts +81 -1
src/popover.ts CHANGED
@@ -65,6 +65,50 @@ function getPopoverDimensions() {
65
  };
66
  }
67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  // Calculate the left placement for top and bottom sides
69
  function calculateLeftForTopBottom(
70
  alignment: Alignment,
@@ -146,8 +190,44 @@ export function repositionPopover(element: Element) {
146
  popover.wrapper.style.top = `auto`;
147
 
148
  popover.arrow.classList.add("driver-popover-arrow-none");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  } else if (isTopOptimal) {
150
- const topToSet = Math.min(topValue, window.innerHeight - popoverDimensions!.realHeight - popoverArrowDimensions.width);
 
 
 
151
  let leftToSet = calculateLeftForTopBottom(requiredAlignment, {
152
  elementDimensions,
153
  popoverDimensions,
 
65
  };
66
  }
67
 
68
+ function calculatePopoverPositionForLeftRight(
69
+ alignment: Alignment,
70
+ config: {
71
+ elementDimensions: DOMRect;
72
+ popoverDimensions?: ReturnType<typeof getPopoverDimensions>;
73
+ popoverPadding: number;
74
+ popoverArrowDimensions: { width: number; height: number };
75
+ }
76
+ ): number {
77
+ const { elementDimensions, popoverDimensions, popoverPadding, popoverArrowDimensions } = config;
78
+
79
+ if (alignment === "start") {
80
+ return Math.max(
81
+ Math.min(
82
+ elementDimensions.top - popoverPadding,
83
+ window.innerHeight - popoverDimensions!.realHeight - popoverArrowDimensions.width
84
+ ),
85
+ popoverArrowDimensions.width
86
+ );
87
+ }
88
+
89
+ if (alignment === "end") {
90
+ return Math.max(
91
+ Math.min(
92
+ elementDimensions.top - popoverDimensions?.realHeight + elementDimensions.height + popoverPadding,
93
+ window.innerHeight - popoverDimensions?.realHeight - popoverArrowDimensions.width
94
+ ),
95
+ popoverArrowDimensions.width
96
+ );
97
+ }
98
+
99
+ if (alignment === "center") {
100
+ return Math.max(
101
+ Math.min(
102
+ elementDimensions.top + elementDimensions.height / 2 - popoverDimensions?.realHeight / 2,
103
+ window.innerHeight - popoverDimensions?.realHeight - popoverArrowDimensions.width
104
+ ),
105
+ popoverArrowDimensions.width
106
+ );
107
+ }
108
+
109
+ return 0;
110
+ }
111
+
112
  // Calculate the left placement for top and bottom sides
113
  function calculateLeftForTopBottom(
114
  alignment: Alignment,
 
190
  popover.wrapper.style.top = `auto`;
191
 
192
  popover.arrow.classList.add("driver-popover-arrow-none");
193
+ } else if (isLeftOptimal) {
194
+ const leftToSet = Math.min(
195
+ leftValue,
196
+ window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
197
+ );
198
+
199
+ const topToSet = calculatePopoverPositionForLeftRight(requiredAlignment, {
200
+ elementDimensions,
201
+ popoverDimensions,
202
+ popoverPadding,
203
+ popoverArrowDimensions,
204
+ });
205
+
206
+ popover.wrapper.style.left = `${leftToSet}px`;
207
+ popover.wrapper.style.top = `${topToSet}px`;
208
+ popover.wrapper.style.bottom = `auto`;
209
+ popover.wrapper.style.right = "auto";
210
+ } else if (isRightOptimal) {
211
+ const rightToSet = Math.min(
212
+ rightValue,
213
+ window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
214
+ );
215
+ const topToSet = calculatePopoverPositionForLeftRight(requiredAlignment, {
216
+ elementDimensions,
217
+ popoverDimensions,
218
+ popoverPadding,
219
+ popoverArrowDimensions,
220
+ });
221
+
222
+ popover.wrapper.style.right = `${rightToSet}px`;
223
+ popover.wrapper.style.top = `${topToSet}px`;
224
+ popover.wrapper.style.bottom = `auto`;
225
+ popover.wrapper.style.left = "auto";
226
  } else if (isTopOptimal) {
227
+ const topToSet = Math.min(
228
+ topValue,
229
+ window.innerHeight - popoverDimensions!.realHeight - popoverArrowDimensions.width
230
+ );
231
  let leftToSet = calculateLeftForTopBottom(requiredAlignment, {
232
  elementDimensions,
233
  popoverDimensions,