@hh.ru/magritte-internal-drop-base 6.0.3 → 7.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.
- package/DropBase.d.ts +194 -7
- package/DropBase.js +9 -29
- package/DropBase.js.map +1 -1
- package/findBestFitPlacement.d.ts +69 -0
- package/findBestFitPlacement.js +270 -0
- package/findBestFitPlacement.js.map +1 -0
- package/index.css +1 -1
- package/index.d.ts +1 -2
- package/index.js +3 -3
- package/intersectionManager.d.ts +2 -1
- package/intersectionManager.js.map +1 -1
- package/package.json +4 -4
- package/positionManager.d.ts +11 -0
- package/positionManager.js +180 -0
- package/positionManager.js.map +1 -0
- package/types.d.ts +36 -173
- package/useMonitorResize.d.ts +18 -0
- package/useMonitorResize.js +56 -0
- package/useMonitorResize.js.map +1 -0
- package/calculateRect.d.ts +0 -18
- package/calculateRect.js +0 -319
- package/calculateRect.js.map +0 -1
- package/scrollManager.d.ts +0 -7
- package/scrollManager.js +0 -131
- package/scrollManager.js.map +0 -1
- package/useRenderParams.d.ts +0 -53
- package/useRenderParams.js +0 -335
- package/useRenderParams.js.map +0 -1
package/useRenderParams.js
DELETED
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import './index.css';
|
|
2
|
-
import { useRef, useState, useCallback, useEffect, useLayoutEffect } from 'react';
|
|
3
|
-
import { getOffsetElement } from '@hh.ru/magritte-common-metrics';
|
|
4
|
-
import { calculateRect, VIEWPORT_GUARD_DISTANCE } from './calculateRect.js';
|
|
5
|
-
|
|
6
|
-
const allowedAlignmentForVerticalDirection = ['left', 'right', 'center'];
|
|
7
|
-
const allowedAlignmentForHorizontalDirection = ['top', 'bottom', 'center'];
|
|
8
|
-
const allowedAlignmentForVerticalDirectionWithoutCenter = ['left', 'right'];
|
|
9
|
-
const allowedAlignmentForHorizontalDirectionWithoutCenter = ['top', 'bottom'];
|
|
10
|
-
const verticalDirections = ['top', 'bottom'];
|
|
11
|
-
const horizontalDirections = ['left', 'right'];
|
|
12
|
-
const START_OFFSET = -10000;
|
|
13
|
-
const INITIAL_HEIGHT_VALUE = 'force-initial-height';
|
|
14
|
-
const getDropMetricsByPositionAndAlignment = ({ activatorMetrics, dropMetrics, viewportMetrics, direction, alignment, arrowGuardDistance, activatorOffset, forceFitIntoViewport, guardDistance, occupyAllAvailableViewportHeight, }) => {
|
|
15
|
-
const arrowGuardDistanceByPosition = arrowGuardDistance?.[direction];
|
|
16
|
-
const minimalRectForActivatorWithDrop = calculateRect[direction][alignment]({
|
|
17
|
-
activatorMetrics,
|
|
18
|
-
dropMetrics,
|
|
19
|
-
viewportMetrics: window.visualViewport,
|
|
20
|
-
preferredViewportMetrics: viewportMetrics,
|
|
21
|
-
direction,
|
|
22
|
-
activatorOffset,
|
|
23
|
-
guardDistance,
|
|
24
|
-
arrowGuardDistance: arrowGuardDistanceByPosition?.[alignment],
|
|
25
|
-
occupyAllAvailableViewportHeight,
|
|
26
|
-
});
|
|
27
|
-
const isFitIntoViewport = minimalRectForActivatorWithDrop.left >= 0 &&
|
|
28
|
-
minimalRectForActivatorWithDrop.right >= 0 &&
|
|
29
|
-
minimalRectForActivatorWithDrop.bottom >= 0 &&
|
|
30
|
-
minimalRectForActivatorWithDrop.top >= 0 &&
|
|
31
|
-
minimalRectForActivatorWithDrop.top > viewportMetrics.pageTop &&
|
|
32
|
-
minimalRectForActivatorWithDrop.bottom < viewportMetrics.pageTop + viewportMetrics.height &&
|
|
33
|
-
minimalRectForActivatorWithDrop.left > viewportMetrics.pageLeft &&
|
|
34
|
-
minimalRectForActivatorWithDrop.right < viewportMetrics.pageLeft + viewportMetrics.width;
|
|
35
|
-
if (isFitIntoViewport || forceFitIntoViewport) {
|
|
36
|
-
return {
|
|
37
|
-
direction,
|
|
38
|
-
alignment,
|
|
39
|
-
dropMetrics: minimalRectForActivatorWithDrop.dropMetrics,
|
|
40
|
-
viewportMetrics: minimalRectForActivatorWithDrop.viewportMetrics,
|
|
41
|
-
dropMetricsRelativeToViewport: {
|
|
42
|
-
top: minimalRectForActivatorWithDrop.top,
|
|
43
|
-
left: minimalRectForActivatorWithDrop.left,
|
|
44
|
-
right: minimalRectForActivatorWithDrop.right,
|
|
45
|
-
bottom: minimalRectForActivatorWithDrop.bottom,
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return null;
|
|
50
|
-
};
|
|
51
|
-
function findDynamicPosition({ activatorMetrics, arrowGuardDistance, dropMetrics, viewportMetrics, activatorOffset, guardDistance, occupyAllAvailableViewportHeight, }, { directions, alignments }) {
|
|
52
|
-
for (const direction of directions) {
|
|
53
|
-
for (const align of alignments) {
|
|
54
|
-
const result = getDropMetricsByPositionAndAlignment({
|
|
55
|
-
activatorMetrics,
|
|
56
|
-
dropMetrics,
|
|
57
|
-
viewportMetrics,
|
|
58
|
-
direction,
|
|
59
|
-
arrowGuardDistance,
|
|
60
|
-
alignment: align,
|
|
61
|
-
activatorOffset,
|
|
62
|
-
guardDistance,
|
|
63
|
-
occupyAllAvailableViewportHeight,
|
|
64
|
-
});
|
|
65
|
-
if (result) {
|
|
66
|
-
return result;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
const checkScroll = (element) => element ? element.scrollHeight - element.clientHeight > 0 : false;
|
|
73
|
-
const useRenderParams = ({ direction, alignment, activatorRef, dropElementRef, host, arrowGuardDistance, preferredViewport, visible, guardDistance, occupyAllAvailableViewportHeight, dropScrollableContainerRef, forcePosition, widthEqualToActivator, }) => {
|
|
74
|
-
const minimalDropHeightRef = useRef(undefined);
|
|
75
|
-
const [calculateDirection, setCalculateDirection] = useState(direction);
|
|
76
|
-
const [calculateAlignment, setCalculateAlignment] = useState(alignment);
|
|
77
|
-
const [_occupyAllAvailableViewportHeight, setOccupyAllAvailableViewportHeight] = useState(occupyAllAvailableViewportHeight ?? false);
|
|
78
|
-
const [result, setResult] = useState();
|
|
79
|
-
const [position, setPosition] = useState({
|
|
80
|
-
left: START_OFFSET,
|
|
81
|
-
top: START_OFFSET,
|
|
82
|
-
height: 'auto',
|
|
83
|
-
});
|
|
84
|
-
const hasScrollRef = useRef(null);
|
|
85
|
-
const updateRenderParams = useCallback((fromObserver) => {
|
|
86
|
-
const activatorElement = activatorRef.current;
|
|
87
|
-
const dropElement = dropElementRef.current;
|
|
88
|
-
const hostElement = host ? host.current : document.body;
|
|
89
|
-
if (!dropElement || !activatorElement || !visible) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
if (widthEqualToActivator) {
|
|
93
|
-
const activatorWidth = activatorElement.offsetWidth;
|
|
94
|
-
dropElement.style.width = `${activatorWidth}px`;
|
|
95
|
-
}
|
|
96
|
-
hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);
|
|
97
|
-
const useAvailableViewportHeightForDrop = (hasScrollRef.current && fromObserver) || _occupyAllAvailableViewportHeight;
|
|
98
|
-
const element = activatorElement;
|
|
99
|
-
const activatorMetrics = element.getBoundingClientRect();
|
|
100
|
-
const dropMetricsRaw = dropElement.getBoundingClientRect();
|
|
101
|
-
const dropMetrics = {
|
|
102
|
-
top: dropMetricsRaw.top,
|
|
103
|
-
left: dropMetricsRaw.left,
|
|
104
|
-
right: dropMetricsRaw.right,
|
|
105
|
-
bottom: dropMetricsRaw.bottom,
|
|
106
|
-
height: dropMetricsRaw.height,
|
|
107
|
-
width: dropMetricsRaw.width,
|
|
108
|
-
};
|
|
109
|
-
const viewport = window.visualViewport;
|
|
110
|
-
if (minimalDropHeightRef.current && dropMetrics.height < minimalDropHeightRef.current) {
|
|
111
|
-
minimalDropHeightRef.current = dropMetrics.height;
|
|
112
|
-
}
|
|
113
|
-
if (useAvailableViewportHeightForDrop) {
|
|
114
|
-
minimalDropHeightRef.current = minimalDropHeightRef.current ?? dropMetrics.height;
|
|
115
|
-
dropMetrics.height = minimalDropHeightRef.current;
|
|
116
|
-
dropMetrics.bottom = dropMetrics.top + dropMetrics.height;
|
|
117
|
-
}
|
|
118
|
-
if (viewport === null) {
|
|
119
|
-
throw new Error('Magritte component DropBase: Viewport data is null');
|
|
120
|
-
}
|
|
121
|
-
const viewports = [
|
|
122
|
-
{
|
|
123
|
-
pageTop: viewport.pageTop,
|
|
124
|
-
pageLeft: viewport.pageLeft,
|
|
125
|
-
width: viewport.width,
|
|
126
|
-
height: viewport.height,
|
|
127
|
-
},
|
|
128
|
-
];
|
|
129
|
-
const preferredViewportElement = preferredViewport?.current;
|
|
130
|
-
/**
|
|
131
|
-
* Метрики расчета кастомного viewport, случай когда хотим
|
|
132
|
-
* поционировать дроп внутри границ другого элемента
|
|
133
|
-
* Если дроп не влезает в кастомный viewport помещаем его
|
|
134
|
-
* в реальный viewport
|
|
135
|
-
**/
|
|
136
|
-
if (preferredViewportElement) {
|
|
137
|
-
const preferredViewportMetrics = preferredViewportElement.getBoundingClientRect();
|
|
138
|
-
/**
|
|
139
|
-
* Высота кастомного viewport в случае если элемент находится
|
|
140
|
-
* в рамках реального viewport с верхней стороны
|
|
141
|
-
**/
|
|
142
|
-
const viewportHeightForPositiveTop = preferredViewportMetrics.bottom > viewport.height
|
|
143
|
-
? viewport.height - preferredViewportMetrics.top
|
|
144
|
-
: preferredViewportMetrics.height;
|
|
145
|
-
/**
|
|
146
|
-
* Высота кастомного viewport в случае если элемент не находится
|
|
147
|
-
* в рамках реального viewport с верхней стороны
|
|
148
|
-
* (часть блока проскролили)
|
|
149
|
-
**/
|
|
150
|
-
const viewportHeightForNegativeTop = preferredViewportMetrics.bottom < 0 ? 0 : preferredViewportMetrics.bottom;
|
|
151
|
-
/**
|
|
152
|
-
* Ширина кастомного viewport в случае если элемент находится
|
|
153
|
-
* в рамках реального viewport с левой стороны
|
|
154
|
-
**/
|
|
155
|
-
const viewportWidthForPositiveLeft = preferredViewportMetrics.right > viewport.width
|
|
156
|
-
? viewport.width - preferredViewportMetrics.left
|
|
157
|
-
: preferredViewportMetrics.width;
|
|
158
|
-
/**
|
|
159
|
-
* Ширина кастомного viewport в случае если элемент не находится
|
|
160
|
-
* в рамках реального viewport с левой стороны
|
|
161
|
-
* (часть блока проскролили)
|
|
162
|
-
**/
|
|
163
|
-
const viewportWidthForForNegativeLeft = preferredViewportMetrics.right < 0 ? 0 : preferredViewportMetrics.right;
|
|
164
|
-
viewports.unshift({
|
|
165
|
-
/* Имитация pageTop, pageLeft кастомного viewport, при скроле могут быть
|
|
166
|
-
* смещения либо по границе реального viewport если часть
|
|
167
|
-
* кастомного ушла за границу реального viewport, либо
|
|
168
|
-
* если кастомный viewport находится в границе реального viewport
|
|
169
|
-
**/
|
|
170
|
-
pageTop: preferredViewportMetrics.top < 0
|
|
171
|
-
? viewport.pageTop
|
|
172
|
-
: viewport.pageTop + preferredViewportMetrics.top,
|
|
173
|
-
pageLeft: preferredViewportMetrics.left < 0
|
|
174
|
-
? viewport.pageLeft
|
|
175
|
-
: viewport.pageLeft + preferredViewportMetrics.left,
|
|
176
|
-
width: preferredViewportMetrics.left < 0
|
|
177
|
-
? viewportWidthForForNegativeLeft
|
|
178
|
-
: viewportWidthForPositiveLeft,
|
|
179
|
-
height: preferredViewportMetrics.top < 0 ? viewportHeightForNegativeTop : viewportHeightForPositiveTop,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
for (const viewportMetrics of viewports) {
|
|
183
|
-
const activatorOffset = hostElement
|
|
184
|
-
? getOffsetElement(activatorElement, hostElement)
|
|
185
|
-
: { offsetLeft: 0, offsetTop: 0 };
|
|
186
|
-
let result = getDropMetricsByPositionAndAlignment({
|
|
187
|
-
activatorMetrics,
|
|
188
|
-
dropMetrics,
|
|
189
|
-
viewportMetrics,
|
|
190
|
-
direction,
|
|
191
|
-
arrowGuardDistance,
|
|
192
|
-
alignment,
|
|
193
|
-
activatorOffset,
|
|
194
|
-
guardDistance,
|
|
195
|
-
occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,
|
|
196
|
-
forceFitIntoViewport: forcePosition,
|
|
197
|
-
});
|
|
198
|
-
if (result === null) {
|
|
199
|
-
result = findDynamicPosition({
|
|
200
|
-
activatorMetrics,
|
|
201
|
-
dropMetrics,
|
|
202
|
-
viewportMetrics,
|
|
203
|
-
activatorOffset,
|
|
204
|
-
arrowGuardDistance,
|
|
205
|
-
guardDistance,
|
|
206
|
-
occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,
|
|
207
|
-
}, {
|
|
208
|
-
directions: horizontalDirections,
|
|
209
|
-
alignments: occupyAllAvailableViewportHeight
|
|
210
|
-
? allowedAlignmentForHorizontalDirectionWithoutCenter
|
|
211
|
-
: allowedAlignmentForHorizontalDirection,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
if (result === null) {
|
|
215
|
-
result = findDynamicPosition({
|
|
216
|
-
activatorMetrics,
|
|
217
|
-
dropMetrics,
|
|
218
|
-
viewportMetrics,
|
|
219
|
-
activatorOffset,
|
|
220
|
-
arrowGuardDistance,
|
|
221
|
-
guardDistance,
|
|
222
|
-
occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,
|
|
223
|
-
}, {
|
|
224
|
-
directions: verticalDirections,
|
|
225
|
-
alignments: occupyAllAvailableViewportHeight
|
|
226
|
-
? allowedAlignmentForVerticalDirectionWithoutCenter
|
|
227
|
-
: allowedAlignmentForVerticalDirection,
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
if (result === null && viewports[viewports.length - 1] === viewportMetrics) {
|
|
231
|
-
result = getDropMetricsByPositionAndAlignment({
|
|
232
|
-
activatorMetrics,
|
|
233
|
-
dropMetrics,
|
|
234
|
-
viewportMetrics,
|
|
235
|
-
direction,
|
|
236
|
-
alignment,
|
|
237
|
-
activatorOffset,
|
|
238
|
-
arrowGuardDistance,
|
|
239
|
-
forceFitIntoViewport: true,
|
|
240
|
-
guardDistance,
|
|
241
|
-
occupyAllAvailableViewportHeight: false,
|
|
242
|
-
});
|
|
243
|
-
if (result?.dropMetrics.height) {
|
|
244
|
-
result.dropMetrics.height = INITIAL_HEIGHT_VALUE;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
if (result !== null) {
|
|
248
|
-
setCalculateDirection(result.direction);
|
|
249
|
-
setCalculateAlignment(result.alignment);
|
|
250
|
-
setPosition(result.dropMetrics);
|
|
251
|
-
hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);
|
|
252
|
-
setResult(result);
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}, [
|
|
257
|
-
visible,
|
|
258
|
-
activatorRef,
|
|
259
|
-
dropElementRef,
|
|
260
|
-
dropScrollableContainerRef,
|
|
261
|
-
host,
|
|
262
|
-
alignment,
|
|
263
|
-
direction,
|
|
264
|
-
arrowGuardDistance,
|
|
265
|
-
preferredViewport,
|
|
266
|
-
guardDistance,
|
|
267
|
-
_occupyAllAvailableViewportHeight,
|
|
268
|
-
occupyAllAvailableViewportHeight,
|
|
269
|
-
forcePosition,
|
|
270
|
-
widthEqualToActivator,
|
|
271
|
-
]);
|
|
272
|
-
useEffect(() => {
|
|
273
|
-
if (occupyAllAvailableViewportHeight && result) {
|
|
274
|
-
if (hasScrollRef.current) {
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (result.direction === 'top' ||
|
|
278
|
-
((result.direction === 'left' || result.direction === 'right') && result.alignment === 'bottom')) {
|
|
279
|
-
setOccupyAllAvailableViewportHeight(result?.dropMetricsRelativeToViewport.top - result.viewportMetrics.pageTop < VIEWPORT_GUARD_DISTANCE);
|
|
280
|
-
}
|
|
281
|
-
if (result.direction === 'bottom' ||
|
|
282
|
-
((result.direction === 'left' || result.direction === 'right') && result.alignment === 'top')) {
|
|
283
|
-
setOccupyAllAvailableViewportHeight(result.viewportMetrics.pageTop +
|
|
284
|
-
result.viewportMetrics.height -
|
|
285
|
-
result.dropMetricsRelativeToViewport.bottom <
|
|
286
|
-
VIEWPORT_GUARD_DISTANCE);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}, [result, occupyAllAvailableViewportHeight, _occupyAllAvailableViewportHeight]);
|
|
290
|
-
useLayoutEffect(updateRenderParams, [updateRenderParams]);
|
|
291
|
-
useEffect(() => {
|
|
292
|
-
const activatorElement = activatorRef.current;
|
|
293
|
-
const hostElement = host ? host.current : document.body;
|
|
294
|
-
const updatePosition = () => {
|
|
295
|
-
updateRenderParams(true);
|
|
296
|
-
};
|
|
297
|
-
const resizeObserver = new ResizeObserver(updatePosition);
|
|
298
|
-
const observer = new MutationObserver(updatePosition);
|
|
299
|
-
if (hostElement === document.body) {
|
|
300
|
-
window.addEventListener('resize', updatePosition);
|
|
301
|
-
}
|
|
302
|
-
else if (hostElement) {
|
|
303
|
-
resizeObserver.observe(hostElement);
|
|
304
|
-
}
|
|
305
|
-
if (hostElement !== document.body && occupyAllAvailableViewportHeight) {
|
|
306
|
-
resizeObserver.observe(document.body);
|
|
307
|
-
}
|
|
308
|
-
if (activatorElement) {
|
|
309
|
-
resizeObserver.observe(activatorElement);
|
|
310
|
-
}
|
|
311
|
-
if (activatorElement) {
|
|
312
|
-
observer.observe(activatorElement, { attributes: true, childList: false, subtree: false });
|
|
313
|
-
}
|
|
314
|
-
if (preferredViewport?.current) {
|
|
315
|
-
resizeObserver.observe(preferredViewport.current);
|
|
316
|
-
}
|
|
317
|
-
return () => {
|
|
318
|
-
resizeObserver.disconnect();
|
|
319
|
-
observer.disconnect();
|
|
320
|
-
if (hostElement === document.body) {
|
|
321
|
-
removeEventListener('resize', updatePosition);
|
|
322
|
-
}
|
|
323
|
-
};
|
|
324
|
-
}, [updateRenderParams, activatorRef, host, preferredViewport, occupyAllAvailableViewportHeight]);
|
|
325
|
-
return {
|
|
326
|
-
position: {
|
|
327
|
-
direction: calculateDirection,
|
|
328
|
-
alignment: calculateAlignment,
|
|
329
|
-
},
|
|
330
|
-
metrics: position,
|
|
331
|
-
};
|
|
332
|
-
};
|
|
333
|
-
|
|
334
|
-
export { INITIAL_HEIGHT_VALUE, START_OFFSET, allowedAlignmentForHorizontalDirection, allowedAlignmentForHorizontalDirectionWithoutCenter, allowedAlignmentForVerticalDirection, allowedAlignmentForVerticalDirectionWithoutCenter, findDynamicPosition, getDropMetricsByPositionAndAlignment, horizontalDirections, useRenderParams, verticalDirections };
|
|
335
|
-
//# sourceMappingURL=useRenderParams.js.map
|
package/useRenderParams.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRenderParams.js","sources":["../src/useRenderParams.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useState, RefObject, useCallback, useRef } from 'react';\n\nimport { getOffsetElement } from '@hh.ru/magritte-common-metrics';\nimport { calculateRect, VIEWPORT_GUARD_DISTANCE } from '@hh.ru/magritte-internal-drop-base/calculateRect';\nimport type {\n ActivatorOffset,\n DropBaseProps,\n DropMetrics,\n RectPosition,\n CustomVisualViewport,\n CalculateRectType,\n ArrowGuardDistance,\n BaseArrowGuardDistance,\n DOMRectLike,\n DropBaseHorizontalPosition,\n DropBaseVerticalPosition,\n DropBaseHorizontalPositionWithoutCenter,\n DropBaseVerticalPositionWithoutCenter,\n Metrics,\n} from '@hh.ru/magritte-internal-drop-base/types';\n\nexport const allowedAlignmentForVerticalDirection = ['left', 'right', 'center'] as const;\nexport const allowedAlignmentForHorizontalDirection = ['top', 'bottom', 'center'] as const;\n\nexport const allowedAlignmentForVerticalDirectionWithoutCenter = ['left', 'right'] as const;\nexport const allowedAlignmentForHorizontalDirectionWithoutCenter = ['top', 'bottom'] as const;\n\nexport const verticalDirections = ['top', 'bottom'] as const;\nexport const horizontalDirections = ['left', 'right'] as const;\n\nexport const START_OFFSET = -10000;\nexport const INITIAL_HEIGHT_VALUE = 'force-initial-height';\n\ninterface FindDynamicPositionHor {\n directions: typeof horizontalDirections;\n alignments:\n | typeof allowedAlignmentForHorizontalDirection\n | typeof allowedAlignmentForHorizontalDirectionWithoutCenter;\n}\n\ninterface FindDynamicPositionVert {\n directions: typeof verticalDirections;\n alignments: typeof allowedAlignmentForVerticalDirection | typeof allowedAlignmentForVerticalDirectionWithoutCenter;\n}\n\ninterface FindDynamicPositionElementMetrics {\n activatorMetrics: DOMRect;\n dropMetrics: DOMRectLike;\n viewportMetrics: CustomVisualViewport;\n activatorOffset: ActivatorOffset;\n forceFitIntoViewport?: boolean;\n guardDistance: number;\n arrowGuardDistance?: ArrowGuardDistance;\n occupyAllAvailableViewportHeight: boolean;\n}\n\ntype ResultPosition = {\n viewportMetrics: CustomVisualViewport;\n hasScroll?: boolean;\n dropMetricsRelativeToViewport: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n dropMetrics: DropMetrics;\n} & (\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n);\n\ntype GetDropMetricsByPositionAndAlignment<\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n> = FindDynamicPositionElementMetrics & Pick<DropBaseProps<T>, 'direction' | 'alignment'>;\n\nexport const getDropMetricsByPositionAndAlignment = <\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n alignment,\n arrowGuardDistance,\n activatorOffset,\n forceFitIntoViewport,\n guardDistance,\n occupyAllAvailableViewportHeight,\n}: GetDropMetricsByPositionAndAlignment<T>): ResultPosition | null => {\n const arrowGuardDistanceByPosition = (arrowGuardDistance as BaseArrowGuardDistance<T>)?.[direction];\n const minimalRectForActivatorWithDrop: RectPosition = (calculateRect as CalculateRectType<T>)[direction][alignment](\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics: window.visualViewport as VisualViewport,\n preferredViewportMetrics: viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance: arrowGuardDistanceByPosition?.[alignment],\n occupyAllAvailableViewportHeight,\n }\n );\n\n const isFitIntoViewport =\n minimalRectForActivatorWithDrop.left >= 0 &&\n minimalRectForActivatorWithDrop.right >= 0 &&\n minimalRectForActivatorWithDrop.bottom >= 0 &&\n minimalRectForActivatorWithDrop.top >= 0 &&\n minimalRectForActivatorWithDrop.top > viewportMetrics.pageTop &&\n minimalRectForActivatorWithDrop.bottom < viewportMetrics.pageTop + viewportMetrics.height &&\n minimalRectForActivatorWithDrop.left > viewportMetrics.pageLeft &&\n minimalRectForActivatorWithDrop.right < viewportMetrics.pageLeft + viewportMetrics.width;\n\n if (isFitIntoViewport || forceFitIntoViewport) {\n return {\n direction,\n alignment,\n dropMetrics: minimalRectForActivatorWithDrop.dropMetrics,\n viewportMetrics: minimalRectForActivatorWithDrop.viewportMetrics,\n dropMetricsRelativeToViewport: {\n top: minimalRectForActivatorWithDrop.top,\n left: minimalRectForActivatorWithDrop.left,\n right: minimalRectForActivatorWithDrop.right,\n bottom: minimalRectForActivatorWithDrop.bottom,\n },\n } as ResultPosition;\n }\n\n return null;\n};\n\nexport function findDynamicPosition<T extends FindDynamicPositionHor | FindDynamicPositionVert>(\n {\n activatorMetrics,\n arrowGuardDistance,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n }: FindDynamicPositionElementMetrics,\n { directions, alignments }: T\n): ResultPosition | null {\n for (const direction of directions) {\n for (const align of alignments) {\n const result = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n arrowGuardDistance,\n alignment: align,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n });\n\n if (result) {\n return result;\n }\n }\n }\n\n return null;\n}\n\nexport type RenderParamsProps<\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n> = Omit<DropBaseProps<T>, 'children' | 'animationClassNames' | 'animationTimeout' | 'guardDistance' | 'role'> & {\n dropElementRef: RefObject<HTMLElement>;\n dropScrollableContainerRef: RefObject<HTMLElement>;\n guardDistance: number;\n widthEqualToActivator?: boolean;\n};\n\nconst checkScroll = (element: HTMLElement | null) =>\n element ? element.scrollHeight - element.clientHeight > 0 : false;\n\nexport const useRenderParams = <\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>({\n direction,\n alignment,\n activatorRef,\n dropElementRef,\n host,\n arrowGuardDistance,\n preferredViewport,\n visible,\n guardDistance,\n occupyAllAvailableViewportHeight,\n dropScrollableContainerRef,\n forcePosition,\n widthEqualToActivator,\n}: RenderParamsProps<T>): {\n metrics: Metrics;\n position:\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter;\n} => {\n const minimalDropHeightRef = useRef<undefined | number>(undefined);\n const [calculateDirection, setCalculateDirection] = useState<typeof direction>(direction);\n const [calculateAlignment, setCalculateAlignment] = useState<typeof alignment>(alignment);\n const [_occupyAllAvailableViewportHeight, setOccupyAllAvailableViewportHeight] = useState(\n occupyAllAvailableViewportHeight ?? false\n );\n const [result, setResult] = useState<ResultPosition>();\n type Position = { top: number; left: number; height?: string | number };\n const [position, setPosition] = useState<Position>({\n left: START_OFFSET,\n top: START_OFFSET,\n height: 'auto',\n });\n const hasScrollRef = useRef<boolean | null>(null);\n\n const updateRenderParams = useCallback(\n (fromObserver?: boolean) => {\n const activatorElement = activatorRef.current;\n const dropElement = dropElementRef.current;\n const hostElement = host ? host.current : document.body;\n\n if (!dropElement || !activatorElement || !visible) {\n return;\n }\n\n if (widthEqualToActivator) {\n const activatorWidth = activatorElement.offsetWidth;\n dropElement.style.width = `${activatorWidth}px`;\n }\n\n hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);\n const useAvailableViewportHeightForDrop =\n (hasScrollRef.current && fromObserver) || _occupyAllAvailableViewportHeight;\n\n const element = activatorElement;\n const activatorMetrics = element.getBoundingClientRect();\n const dropMetricsRaw = dropElement.getBoundingClientRect();\n const dropMetrics: DOMRectLike = {\n top: dropMetricsRaw.top,\n left: dropMetricsRaw.left,\n right: dropMetricsRaw.right,\n bottom: dropMetricsRaw.bottom,\n height: dropMetricsRaw.height,\n width: dropMetricsRaw.width,\n };\n const viewport = window.visualViewport;\n\n if (minimalDropHeightRef.current && dropMetrics.height < minimalDropHeightRef.current) {\n minimalDropHeightRef.current = dropMetrics.height;\n }\n\n if (useAvailableViewportHeightForDrop) {\n minimalDropHeightRef.current = minimalDropHeightRef.current ?? dropMetrics.height;\n dropMetrics.height = minimalDropHeightRef.current;\n dropMetrics.bottom = dropMetrics.top + dropMetrics.height;\n }\n\n if (viewport === null) {\n throw new Error('Magritte component DropBase: Viewport data is null');\n }\n\n const viewports: CustomVisualViewport[] = [\n {\n pageTop: viewport.pageTop,\n pageLeft: viewport.pageLeft,\n width: viewport.width,\n height: viewport.height,\n },\n ];\n\n const preferredViewportElement = preferredViewport?.current;\n\n /**\n * Метрики расчета кастомного viewport, случай когда хотим\n * поционировать дроп внутри границ другого элемента\n * Если дроп не влезает в кастомный viewport помещаем его\n * в реальный viewport\n **/\n if (preferredViewportElement) {\n const preferredViewportMetrics = preferredViewportElement.getBoundingClientRect();\n\n /**\n * Высота кастомного viewport в случае если элемент находится\n * в рамках реального viewport с верхней стороны\n **/\n const viewportHeightForPositiveTop =\n preferredViewportMetrics.bottom > viewport.height\n ? viewport.height - preferredViewportMetrics.top\n : preferredViewportMetrics.height;\n /**\n * Высота кастомного viewport в случае если элемент не находится\n * в рамках реального viewport с верхней стороны\n * (часть блока проскролили)\n **/\n const viewportHeightForNegativeTop =\n preferredViewportMetrics.bottom < 0 ? 0 : preferredViewportMetrics.bottom;\n /**\n * Ширина кастомного viewport в случае если элемент находится\n * в рамках реального viewport с левой стороны\n **/\n const viewportWidthForPositiveLeft =\n preferredViewportMetrics.right > viewport.width\n ? viewport.width - preferredViewportMetrics.left\n : preferredViewportMetrics.width;\n /**\n * Ширина кастомного viewport в случае если элемент не находится\n * в рамках реального viewport с левой стороны\n * (часть блока проскролили)\n **/\n const viewportWidthForForNegativeLeft =\n preferredViewportMetrics.right < 0 ? 0 : preferredViewportMetrics.right;\n\n viewports.unshift({\n /* Имитация pageTop, pageLeft кастомного viewport, при скроле могут быть\n * смещения либо по границе реального viewport если часть\n * кастомного ушла за границу реального viewport, либо\n * если кастомный viewport находится в границе реального viewport\n **/\n pageTop:\n preferredViewportMetrics.top < 0\n ? viewport.pageTop\n : viewport.pageTop + preferredViewportMetrics.top,\n pageLeft:\n preferredViewportMetrics.left < 0\n ? viewport.pageLeft\n : viewport.pageLeft + preferredViewportMetrics.left,\n width:\n preferredViewportMetrics.left < 0\n ? viewportWidthForForNegativeLeft\n : viewportWidthForPositiveLeft,\n height:\n preferredViewportMetrics.top < 0 ? viewportHeightForNegativeTop : viewportHeightForPositiveTop,\n });\n }\n\n for (const viewportMetrics of viewports) {\n const activatorOffset = hostElement\n ? getOffsetElement(activatorElement, hostElement)\n : { offsetLeft: 0, offsetTop: 0 };\n\n let result: ResultPosition | null = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n arrowGuardDistance,\n alignment,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n forceFitIntoViewport: forcePosition,\n });\n\n if (result === null) {\n result = findDynamicPosition<FindDynamicPositionHor>(\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n },\n {\n directions: horizontalDirections,\n alignments: occupyAllAvailableViewportHeight\n ? allowedAlignmentForHorizontalDirectionWithoutCenter\n : allowedAlignmentForHorizontalDirection,\n }\n );\n }\n\n if (result === null) {\n result = findDynamicPosition<FindDynamicPositionVert>(\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n },\n {\n directions: verticalDirections,\n alignments: occupyAllAvailableViewportHeight\n ? allowedAlignmentForVerticalDirectionWithoutCenter\n : allowedAlignmentForVerticalDirection,\n }\n );\n }\n\n if (result === null && viewports[viewports.length - 1] === viewportMetrics) {\n result = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n alignment,\n activatorOffset,\n arrowGuardDistance,\n forceFitIntoViewport: true,\n guardDistance,\n occupyAllAvailableViewportHeight: false,\n });\n\n if (result?.dropMetrics.height) {\n result.dropMetrics.height = INITIAL_HEIGHT_VALUE;\n }\n }\n\n if (result !== null) {\n setCalculateDirection(result.direction);\n setCalculateAlignment(result.alignment);\n setPosition(result.dropMetrics);\n hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);\n setResult(result);\n\n return;\n }\n }\n },\n [\n visible,\n activatorRef,\n dropElementRef,\n dropScrollableContainerRef,\n host,\n alignment,\n direction,\n arrowGuardDistance,\n preferredViewport,\n guardDistance,\n _occupyAllAvailableViewportHeight,\n occupyAllAvailableViewportHeight,\n forcePosition,\n widthEqualToActivator,\n ]\n );\n\n useEffect(() => {\n if (occupyAllAvailableViewportHeight && result) {\n if (hasScrollRef.current) {\n return;\n }\n\n if (\n result.direction === 'top' ||\n ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'bottom')\n ) {\n setOccupyAllAvailableViewportHeight(\n result?.dropMetricsRelativeToViewport.top - result.viewportMetrics.pageTop < VIEWPORT_GUARD_DISTANCE\n );\n }\n\n if (\n result.direction === 'bottom' ||\n ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'top')\n ) {\n setOccupyAllAvailableViewportHeight(\n result.viewportMetrics.pageTop +\n result.viewportMetrics.height -\n result.dropMetricsRelativeToViewport.bottom <\n VIEWPORT_GUARD_DISTANCE\n );\n }\n }\n }, [result, occupyAllAvailableViewportHeight, _occupyAllAvailableViewportHeight]);\n\n useLayoutEffect(updateRenderParams, [updateRenderParams]);\n\n useEffect(() => {\n const activatorElement = activatorRef.current;\n const hostElement = host ? host.current : document.body;\n\n const updatePosition = () => {\n updateRenderParams(true);\n };\n\n const resizeObserver = new ResizeObserver(updatePosition);\n const observer = new MutationObserver(updatePosition);\n\n if (hostElement === document.body) {\n window.addEventListener('resize', updatePosition);\n } else if (hostElement) {\n resizeObserver.observe(hostElement);\n }\n if (hostElement !== document.body && occupyAllAvailableViewportHeight) {\n resizeObserver.observe(document.body);\n }\n if (activatorElement) {\n resizeObserver.observe(activatorElement);\n }\n if (activatorElement) {\n observer.observe(activatorElement, { attributes: true, childList: false, subtree: false });\n }\n if (preferredViewport?.current) {\n resizeObserver.observe(preferredViewport.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n observer.disconnect();\n\n if (hostElement === document.body) {\n removeEventListener('resize', updatePosition);\n }\n };\n }, [updateRenderParams, activatorRef, host, preferredViewport, occupyAllAvailableViewportHeight]);\n\n return {\n position: {\n direction: calculateDirection,\n alignment: calculateAlignment,\n } as\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter,\n metrics: position,\n };\n};\n"],"names":[],"mappings":"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"}
|