kamrify commited on
Commit
baff93a
·
1 Parent(s): 353f356

Add popover positioning for bottom

Browse files
Files changed (1) hide show
  1. src/popover.ts +68 -23
src/popover.ts CHANGED
@@ -65,6 +65,51 @@ function getPopoverDimensions() {
65
  };
66
  }
67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  export function repositionPopover(element: Element) {
69
  if (!popover) {
70
  return;
@@ -102,35 +147,35 @@ export function repositionPopover(element: Element) {
102
 
103
  popover.arrow.classList.add("driver-popover-arrow-none");
104
  } else if (isTopOptimal) {
105
- const topToSet = Math.min(topValue, window.innerHeight - popoverDimensions.height - popoverArrowDimensions.width);
106
-
107
- let leftToSet = 0;
108
-
109
- if (requiredAlignment === "start") {
110
- leftToSet = Math.max(
111
- Math.min(
112
- elementDimensions.left - popoverPadding,
113
- window.innerWidth - popoverDimensions!.realWidth - popoverArrowDimensions.width
114
- ),
115
- popoverArrowDimensions.width
116
- );
117
- } else if (requiredAlignment === "end") {
118
- leftToSet = Math.max(
119
- Math.min(
120
- elementDimensions.left - popoverDimensions?.realWidth + elementDimensions.width + popoverPadding,
121
- window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
122
- ),
123
- popoverArrowDimensions.width
124
- );
125
- }
126
-
127
 
128
  popover.wrapper.style.top = `${topToSet}px`;
129
  popover.wrapper.style.left = `${leftToSet}px`;
130
  popover.wrapper.style.bottom = `auto`;
131
  popover.wrapper.style.right = "auto";
132
  } else if (isBottomOptimal) {
133
- // @todo - handle bottom rendering
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  }
135
 
136
  // We need to check which position we end up rendering the popover at
 
65
  };
66
  }
67
 
68
+ // Calculate the left placement for top and bottom sides
69
+ function calculateLeftForTopBottom(
70
+ alignment: Alignment,
71
+ config: {
72
+ elementDimensions: DOMRect;
73
+ popoverDimensions?: ReturnType<typeof getPopoverDimensions>;
74
+ popoverPadding: number;
75
+ popoverArrowDimensions: { width: number; height: number };
76
+ }
77
+ ): number {
78
+ const { elementDimensions, popoverDimensions, popoverPadding, popoverArrowDimensions } = config;
79
+
80
+ if (alignment === "start") {
81
+ return Math.max(
82
+ Math.min(
83
+ elementDimensions.left - popoverPadding,
84
+ window.innerWidth - popoverDimensions!.realWidth - popoverArrowDimensions.width
85
+ ),
86
+ popoverArrowDimensions.width
87
+ );
88
+ }
89
+
90
+ if (alignment === "end") {
91
+ return Math.max(
92
+ Math.min(
93
+ elementDimensions.left - popoverDimensions?.realWidth + elementDimensions.width + popoverPadding,
94
+ window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
95
+ ),
96
+ popoverArrowDimensions.width
97
+ );
98
+ }
99
+
100
+ if (alignment === "center") {
101
+ return Math.max(
102
+ Math.min(
103
+ elementDimensions.left + elementDimensions.width / 2 - popoverDimensions?.realWidth / 2,
104
+ window.innerWidth - popoverDimensions?.realWidth - popoverArrowDimensions.width
105
+ ),
106
+ popoverArrowDimensions.width
107
+ );
108
+ }
109
+
110
+ return 0;
111
+ }
112
+
113
  export function repositionPopover(element: Element) {
114
  if (!popover) {
115
  return;
 
147
 
148
  popover.arrow.classList.add("driver-popover-arrow-none");
149
  } else if (isTopOptimal) {
150
+ const topToSet = Math.min(topValue, window.innerHeight - popoverDimensions!.height - popoverArrowDimensions.width);
151
+ let leftToSet = calculateLeftForTopBottom(requiredAlignment, {
152
+ elementDimensions,
153
+ popoverDimensions,
154
+ popoverPadding,
155
+ popoverArrowDimensions,
156
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
 
158
  popover.wrapper.style.top = `${topToSet}px`;
159
  popover.wrapper.style.left = `${leftToSet}px`;
160
  popover.wrapper.style.bottom = `auto`;
161
  popover.wrapper.style.right = "auto";
162
  } else if (isBottomOptimal) {
163
+ const bottomToSet = Math.min(
164
+ bottomValue,
165
+ window.innerHeight - popoverDimensions?.realHeight - popoverArrowDimensions.width
166
+ );
167
+
168
+ let leftToSet = calculateLeftForTopBottom(requiredAlignment, {
169
+ elementDimensions,
170
+ popoverDimensions,
171
+ popoverPadding,
172
+ popoverArrowDimensions,
173
+ });
174
+
175
+ popover.wrapper.style.left = `${leftToSet}px`;
176
+ popover.wrapper.style.bottom = `${bottomToSet}px`;
177
+ popover.wrapper.style.top = `auto`;
178
+ popover.wrapper.style.right = "auto";
179
  }
180
 
181
  // We need to check which position we end up rendering the popover at