@hh.ru/magritte-internal-drop-base 6.0.4 → 7.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.
@@ -1,345 +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
- let activatorWidth;
94
- // сначала пытаемся получить ширину без трансформаций, getBoundingClientRect используем в последнюю очередь
95
- if (activatorElement instanceof HTMLElement) {
96
- activatorWidth = activatorElement.offsetWidth;
97
- }
98
- else if (activatorElement instanceof SVGGraphicsElement) {
99
- activatorWidth = activatorElement.getBBox().width;
100
- }
101
- else {
102
- activatorWidth = activatorElement.getBoundingClientRect().width;
103
- }
104
- dropElement.style.width = `${activatorWidth}px`;
105
- }
106
- hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);
107
- const useAvailableViewportHeightForDrop = (hasScrollRef.current && fromObserver) || _occupyAllAvailableViewportHeight;
108
- const element = activatorElement;
109
- const activatorMetrics = element.getBoundingClientRect();
110
- const dropMetricsRaw = dropElement.getBoundingClientRect();
111
- const dropMetrics = {
112
- top: dropMetricsRaw.top,
113
- left: dropMetricsRaw.left,
114
- right: dropMetricsRaw.right,
115
- bottom: dropMetricsRaw.bottom,
116
- height: dropMetricsRaw.height,
117
- width: dropMetricsRaw.width,
118
- };
119
- const viewport = window.visualViewport;
120
- if (minimalDropHeightRef.current && dropMetrics.height < minimalDropHeightRef.current) {
121
- minimalDropHeightRef.current = dropMetrics.height;
122
- }
123
- if (useAvailableViewportHeightForDrop) {
124
- minimalDropHeightRef.current = minimalDropHeightRef.current ?? dropMetrics.height;
125
- dropMetrics.height = minimalDropHeightRef.current;
126
- dropMetrics.bottom = dropMetrics.top + dropMetrics.height;
127
- }
128
- if (viewport === null) {
129
- throw new Error('Magritte component DropBase: Viewport data is null');
130
- }
131
- const viewports = [
132
- {
133
- pageTop: viewport.pageTop,
134
- pageLeft: viewport.pageLeft,
135
- width: viewport.width,
136
- height: viewport.height,
137
- },
138
- ];
139
- const preferredViewportElement = preferredViewport?.current;
140
- /**
141
- * Метрики расчета кастомного viewport, случай когда хотим
142
- * поционировать дроп внутри границ другого элемента
143
- * Если дроп не влезает в кастомный viewport помещаем его
144
- * в реальный viewport
145
- **/
146
- if (preferredViewportElement) {
147
- const preferredViewportMetrics = preferredViewportElement.getBoundingClientRect();
148
- /**
149
- * Высота кастомного viewport в случае если элемент находится
150
- * в рамках реального viewport с верхней стороны
151
- **/
152
- const viewportHeightForPositiveTop = preferredViewportMetrics.bottom > viewport.height
153
- ? viewport.height - preferredViewportMetrics.top
154
- : preferredViewportMetrics.height;
155
- /**
156
- * Высота кастомного viewport в случае если элемент не находится
157
- * в рамках реального viewport с верхней стороны
158
- * (часть блока проскролили)
159
- **/
160
- const viewportHeightForNegativeTop = preferredViewportMetrics.bottom < 0 ? 0 : preferredViewportMetrics.bottom;
161
- /**
162
- * Ширина кастомного viewport в случае если элемент находится
163
- * в рамках реального viewport с левой стороны
164
- **/
165
- const viewportWidthForPositiveLeft = preferredViewportMetrics.right > viewport.width
166
- ? viewport.width - preferredViewportMetrics.left
167
- : preferredViewportMetrics.width;
168
- /**
169
- * Ширина кастомного viewport в случае если элемент не находится
170
- * в рамках реального viewport с левой стороны
171
- * (часть блока проскролили)
172
- **/
173
- const viewportWidthForForNegativeLeft = preferredViewportMetrics.right < 0 ? 0 : preferredViewportMetrics.right;
174
- viewports.unshift({
175
- /* Имитация pageTop, pageLeft кастомного viewport, при скроле могут быть
176
- * смещения либо по границе реального viewport если часть
177
- * кастомного ушла за границу реального viewport, либо
178
- * если кастомный viewport находится в границе реального viewport
179
- **/
180
- pageTop: preferredViewportMetrics.top < 0
181
- ? viewport.pageTop
182
- : viewport.pageTop + preferredViewportMetrics.top,
183
- pageLeft: preferredViewportMetrics.left < 0
184
- ? viewport.pageLeft
185
- : viewport.pageLeft + preferredViewportMetrics.left,
186
- width: preferredViewportMetrics.left < 0
187
- ? viewportWidthForForNegativeLeft
188
- : viewportWidthForPositiveLeft,
189
- height: preferredViewportMetrics.top < 0 ? viewportHeightForNegativeTop : viewportHeightForPositiveTop,
190
- });
191
- }
192
- for (const viewportMetrics of viewports) {
193
- const activatorOffset = hostElement
194
- ? getOffsetElement(activatorElement, hostElement)
195
- : { offsetLeft: 0, offsetTop: 0 };
196
- let result = getDropMetricsByPositionAndAlignment({
197
- activatorMetrics,
198
- dropMetrics,
199
- viewportMetrics,
200
- direction,
201
- arrowGuardDistance,
202
- alignment,
203
- activatorOffset,
204
- guardDistance,
205
- occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,
206
- forceFitIntoViewport: forcePosition,
207
- });
208
- if (result === null) {
209
- result = findDynamicPosition({
210
- activatorMetrics,
211
- dropMetrics,
212
- viewportMetrics,
213
- activatorOffset,
214
- arrowGuardDistance,
215
- guardDistance,
216
- occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,
217
- }, {
218
- directions: horizontalDirections,
219
- alignments: occupyAllAvailableViewportHeight
220
- ? allowedAlignmentForHorizontalDirectionWithoutCenter
221
- : allowedAlignmentForHorizontalDirection,
222
- });
223
- }
224
- if (result === null) {
225
- result = findDynamicPosition({
226
- activatorMetrics,
227
- dropMetrics,
228
- viewportMetrics,
229
- activatorOffset,
230
- arrowGuardDistance,
231
- guardDistance,
232
- occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,
233
- }, {
234
- directions: verticalDirections,
235
- alignments: occupyAllAvailableViewportHeight
236
- ? allowedAlignmentForVerticalDirectionWithoutCenter
237
- : allowedAlignmentForVerticalDirection,
238
- });
239
- }
240
- if (result === null && viewports[viewports.length - 1] === viewportMetrics) {
241
- result = getDropMetricsByPositionAndAlignment({
242
- activatorMetrics,
243
- dropMetrics,
244
- viewportMetrics,
245
- direction,
246
- alignment,
247
- activatorOffset,
248
- arrowGuardDistance,
249
- forceFitIntoViewport: true,
250
- guardDistance,
251
- occupyAllAvailableViewportHeight: false,
252
- });
253
- if (result?.dropMetrics.height) {
254
- result.dropMetrics.height = INITIAL_HEIGHT_VALUE;
255
- }
256
- }
257
- if (result !== null) {
258
- setCalculateDirection(result.direction);
259
- setCalculateAlignment(result.alignment);
260
- setPosition(result.dropMetrics);
261
- hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);
262
- setResult(result);
263
- return;
264
- }
265
- }
266
- }, [
267
- visible,
268
- activatorRef,
269
- dropElementRef,
270
- dropScrollableContainerRef,
271
- host,
272
- alignment,
273
- direction,
274
- arrowGuardDistance,
275
- preferredViewport,
276
- guardDistance,
277
- _occupyAllAvailableViewportHeight,
278
- occupyAllAvailableViewportHeight,
279
- forcePosition,
280
- widthEqualToActivator,
281
- ]);
282
- useEffect(() => {
283
- if (occupyAllAvailableViewportHeight && result) {
284
- if (hasScrollRef.current) {
285
- return;
286
- }
287
- if (result.direction === 'top' ||
288
- ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'bottom')) {
289
- setOccupyAllAvailableViewportHeight(result?.dropMetricsRelativeToViewport.top - result.viewportMetrics.pageTop < VIEWPORT_GUARD_DISTANCE);
290
- }
291
- if (result.direction === 'bottom' ||
292
- ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'top')) {
293
- setOccupyAllAvailableViewportHeight(result.viewportMetrics.pageTop +
294
- result.viewportMetrics.height -
295
- result.dropMetricsRelativeToViewport.bottom <
296
- VIEWPORT_GUARD_DISTANCE);
297
- }
298
- }
299
- }, [result, occupyAllAvailableViewportHeight, _occupyAllAvailableViewportHeight]);
300
- useLayoutEffect(updateRenderParams, [updateRenderParams]);
301
- useEffect(() => {
302
- const activatorElement = activatorRef.current;
303
- const hostElement = host ? host.current : document.body;
304
- const updatePosition = () => {
305
- updateRenderParams(true);
306
- };
307
- const resizeObserver = new ResizeObserver(updatePosition);
308
- const observer = new MutationObserver(updatePosition);
309
- if (hostElement === document.body) {
310
- window.addEventListener('resize', updatePosition);
311
- }
312
- else if (hostElement) {
313
- resizeObserver.observe(hostElement);
314
- }
315
- if (hostElement !== document.body && occupyAllAvailableViewportHeight) {
316
- resizeObserver.observe(document.body);
317
- }
318
- if (activatorElement) {
319
- resizeObserver.observe(activatorElement);
320
- }
321
- if (activatorElement) {
322
- observer.observe(activatorElement, { attributes: true, childList: false, subtree: false });
323
- }
324
- if (preferredViewport?.current) {
325
- resizeObserver.observe(preferredViewport.current);
326
- }
327
- return () => {
328
- resizeObserver.disconnect();
329
- observer.disconnect();
330
- if (hostElement === document.body) {
331
- removeEventListener('resize', updatePosition);
332
- }
333
- };
334
- }, [updateRenderParams, activatorRef, host, preferredViewport, occupyAllAvailableViewportHeight]);
335
- return {
336
- position: {
337
- direction: calculateDirection,
338
- alignment: calculateAlignment,
339
- },
340
- metrics: position,
341
- };
342
- };
343
-
344
- export { INITIAL_HEIGHT_VALUE, START_OFFSET, allowedAlignmentForHorizontalDirection, allowedAlignmentForHorizontalDirectionWithoutCenter, allowedAlignmentForVerticalDirection, allowedAlignmentForVerticalDirectionWithoutCenter, findDynamicPosition, getDropMetricsByPositionAndAlignment, horizontalDirections, useRenderParams, verticalDirections };
345
- //# sourceMappingURL=useRenderParams.js.map
@@ -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 let activatorWidth;\n // сначала пытаемся получить ширину без трансформаций, getBoundingClientRect используем в последнюю очередь\n if (activatorElement instanceof HTMLElement) {\n activatorWidth = activatorElement.offsetWidth;\n } else if (activatorElement instanceof SVGGraphicsElement) {\n activatorWidth = activatorElement.getBBox().width;\n } else {\n activatorWidth = activatorElement.getBoundingClientRect().width;\n }\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":";;;;AAqBa,MAAA,oCAAoC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAW;AAC5E,MAAA,sCAAsC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAW;MAE9E,iDAAiD,GAAG,CAAC,MAAM,EAAE,OAAO,EAAW;MAC/E,mDAAmD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAW;MAEjF,kBAAkB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAW;MAChD,oBAAoB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAW;AAElD,MAAA,YAAY,GAAG,CAAC,MAAM;AAC5B,MAAM,oBAAoB,GAAG,uBAAuB;AAkD9C,MAAA,oCAAoC,GAAG,CAMlD,EACE,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,gCAAgC,GACM,KAA2B;AACjE,IAAA,MAAM,4BAA4B,GAAI,kBAAgD,GAAG,SAAS,CAAC,CAAC;IACpG,MAAM,+BAA+B,GAAkB,aAAsC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAC/G;QACI,gBAAgB;QAChB,WAAW;QACX,eAAe,EAAE,MAAM,CAAC,cAAgC;AACxD,QAAA,wBAAwB,EAAE,eAAe;QACzC,SAAS;QACT,eAAe;QACf,aAAa;AACb,QAAA,kBAAkB,EAAE,4BAA4B,GAAG,SAAS,CAAC;QAC7D,gCAAgC;AACnC,KAAA,CACJ,CAAC;AAEF,IAAA,MAAM,iBAAiB,GACnB,+BAA+B,CAAC,IAAI,IAAI,CAAC;QACzC,+BAA+B,CAAC,KAAK,IAAI,CAAC;QAC1C,+BAA+B,CAAC,MAAM,IAAI,CAAC;QAC3C,+BAA+B,CAAC,GAAG,IAAI,CAAC;AACxC,QAAA,+BAA+B,CAAC,GAAG,GAAG,eAAe,CAAC,OAAO;QAC7D,+BAA+B,CAAC,MAAM,GAAG,eAAe,CAAC,OAAO,GAAG,eAAe,CAAC,MAAM;AACzF,QAAA,+BAA+B,CAAC,IAAI,GAAG,eAAe,CAAC,QAAQ;QAC/D,+BAA+B,CAAC,KAAK,GAAG,eAAe,CAAC,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC;IAE7F,IAAI,iBAAiB,IAAI,oBAAoB,EAAE;QAC3C,OAAO;YACH,SAAS;YACT,SAAS;YACT,WAAW,EAAE,+BAA+B,CAAC,WAAW;YACxD,eAAe,EAAE,+BAA+B,CAAC,eAAe;AAChE,YAAA,6BAA6B,EAAE;gBAC3B,GAAG,EAAE,+BAA+B,CAAC,GAAG;gBACxC,IAAI,EAAE,+BAA+B,CAAC,IAAI;gBAC1C,KAAK,EAAE,+BAA+B,CAAC,KAAK;gBAC5C,MAAM,EAAE,+BAA+B,CAAC,MAAM;AACjD,aAAA;SACc,CAAC;AACvB,KAAA;AAED,IAAA,OAAO,IAAI,CAAC;AAChB,EAAE;AAEI,SAAU,mBAAmB,CAC/B,EACI,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,eAAe,EACf,aAAa,EACb,gCAAgC,GACA,EACpC,EAAE,UAAU,EAAE,UAAU,EAAK,EAAA;AAE7B,IAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAChC,QAAA,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE;YAC5B,MAAM,MAAM,GAAG,oCAAoC,CAAC;gBAChD,gBAAgB;gBAChB,WAAW;gBACX,eAAe;gBACf,SAAS;gBACT,kBAAkB;AAClB,gBAAA,SAAS,EAAE,KAAK;gBAChB,eAAe;gBACf,aAAa;gBACb,gCAAgC;AACnC,aAAA,CAAC,CAAC;AAEH,YAAA,IAAI,MAAM,EAAE;AACR,gBAAA,OAAO,MAAM,CAAC;AACjB,aAAA;AACJ,SAAA;AACJ,KAAA;AAED,IAAA,OAAO,IAAI,CAAC;AAChB,CAAC;AAeD,MAAM,WAAW,GAAG,CAAC,OAA2B,KAC5C,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC;AAE/D,MAAM,eAAe,GAAG,CAM7B,EACE,SAAS,EACT,SAAS,EACT,YAAY,EACZ,cAAc,EACd,IAAI,EACJ,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,gCAAgC,EAChC,0BAA0B,EAC1B,aAAa,EACb,qBAAqB,GACF,KAOnB;AACA,IAAA,MAAM,oBAAoB,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IACnE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAmB,SAAS,CAAC,CAAC;IAC1F,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAmB,SAAS,CAAC,CAAC;AAC1F,IAAA,MAAM,CAAC,iCAAiC,EAAE,mCAAmC,CAAC,GAAG,QAAQ,CACrF,gCAAgC,IAAI,KAAK,CAC5C,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAkB,CAAC;AAEvD,IAAA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAW;AAC/C,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,GAAG,EAAE,YAAY;AACjB,QAAA,MAAM,EAAE,MAAM;AACjB,KAAA,CAAC,CAAC;AACH,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AAElD,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAClC,CAAC,YAAsB,KAAI;AACvB,QAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC;AAC9C,QAAA,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC;AAC3C,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;QAExD,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE;YAC/C,OAAO;AACV,SAAA;AAED,QAAA,IAAI,qBAAqB,EAAE;AACvB,YAAA,IAAI,cAAc,CAAC;;YAEnB,IAAI,gBAAgB,YAAY,WAAW,EAAE;AACzC,gBAAA,cAAc,GAAG,gBAAgB,CAAC,WAAW,CAAC;AACjD,aAAA;iBAAM,IAAI,gBAAgB,YAAY,kBAAkB,EAAE;AACvD,gBAAA,cAAc,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;AACrD,aAAA;AAAM,iBAAA;AACH,gBAAA,cAAc,GAAG,gBAAgB,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;AACnE,aAAA;YACD,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,CAAG,EAAA,cAAc,IAAI,CAAC;AACnD,SAAA;QAED,YAAY,CAAC,OAAO,GAAG,WAAW,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,iCAAiC,GACnC,CAAC,YAAY,CAAC,OAAO,IAAI,YAAY,KAAK,iCAAiC,CAAC;QAEhF,MAAM,OAAO,GAAG,gBAAgB,CAAC;AACjC,QAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;AACzD,QAAA,MAAM,cAAc,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;AAC3D,QAAA,MAAM,WAAW,GAAgB;YAC7B,GAAG,EAAE,cAAc,CAAC,GAAG;YACvB,IAAI,EAAE,cAAc,CAAC,IAAI;YACzB,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;SAC9B,CAAC;AACF,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;QAEvC,IAAI,oBAAoB,CAAC,OAAO,IAAI,WAAW,CAAC,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE;AACnF,YAAA,oBAAoB,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;AACrD,SAAA;AAED,QAAA,IAAI,iCAAiC,EAAE;YACnC,oBAAoB,CAAC,OAAO,GAAG,oBAAoB,CAAC,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC;AAClF,YAAA,WAAW,CAAC,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC;YAClD,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;AAC7D,SAAA;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACzE,SAAA;AAED,QAAA,MAAM,SAAS,GAA2B;AACtC,YAAA;gBACI,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;AAC1B,aAAA;SACJ,CAAC;AAEF,QAAA,MAAM,wBAAwB,GAAG,iBAAiB,EAAE,OAAO,CAAC;AAE5D;;;;;AAKI;AACJ,QAAA,IAAI,wBAAwB,EAAE;AAC1B,YAAA,MAAM,wBAAwB,GAAG,wBAAwB,CAAC,qBAAqB,EAAE,CAAC;AAElF;;;AAGI;YACJ,MAAM,4BAA4B,GAC9B,wBAAwB,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC7C,kBAAE,QAAQ,CAAC,MAAM,GAAG,wBAAwB,CAAC,GAAG;AAChD,kBAAE,wBAAwB,CAAC,MAAM,CAAC;AAC1C;;;;AAII;AACJ,YAAA,MAAM,4BAA4B,GAC9B,wBAAwB,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,MAAM,CAAC;AAC9E;;;AAGI;YACJ,MAAM,4BAA4B,GAC9B,wBAAwB,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK;AAC3C,kBAAE,QAAQ,CAAC,KAAK,GAAG,wBAAwB,CAAC,IAAI;AAChD,kBAAE,wBAAwB,CAAC,KAAK,CAAC;AACzC;;;;AAII;AACJ,YAAA,MAAM,+BAA+B,GACjC,wBAAwB,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC;YAE5E,SAAS,CAAC,OAAO,CAAC;AACd;;;;AAII;AACJ,gBAAA,OAAO,EACH,wBAAwB,CAAC,GAAG,GAAG,CAAC;sBAC1B,QAAQ,CAAC,OAAO;AAClB,sBAAE,QAAQ,CAAC,OAAO,GAAG,wBAAwB,CAAC,GAAG;AACzD,gBAAA,QAAQ,EACJ,wBAAwB,CAAC,IAAI,GAAG,CAAC;sBAC3B,QAAQ,CAAC,QAAQ;AACnB,sBAAE,QAAQ,CAAC,QAAQ,GAAG,wBAAwB,CAAC,IAAI;AAC3D,gBAAA,KAAK,EACD,wBAAwB,CAAC,IAAI,GAAG,CAAC;AAC7B,sBAAE,+BAA+B;AACjC,sBAAE,4BAA4B;AACtC,gBAAA,MAAM,EACF,wBAAwB,CAAC,GAAG,GAAG,CAAC,GAAG,4BAA4B,GAAG,4BAA4B;AACrG,aAAA,CAAC,CAAC;AACN,SAAA;AAED,QAAA,KAAK,MAAM,eAAe,IAAI,SAAS,EAAE;YACrC,MAAM,eAAe,GAAG,WAAW;AAC/B,kBAAE,gBAAgB,CAAC,gBAAgB,EAAE,WAAW,CAAC;kBAC/C,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YAEtC,IAAI,MAAM,GAA0B,oCAAoC,CAAC;gBACrE,gBAAgB;gBAChB,WAAW;gBACX,eAAe;gBACf,SAAS;gBACT,kBAAkB;gBAClB,SAAS;gBACT,eAAe;gBACf,aAAa;AACb,gBAAA,gCAAgC,EAAE,iCAAiC;AACnE,gBAAA,oBAAoB,EAAE,aAAa;AACtC,aAAA,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI,EAAE;gBACjB,MAAM,GAAG,mBAAmB,CACxB;oBACI,gBAAgB;oBAChB,WAAW;oBACX,eAAe;oBACf,eAAe;oBACf,kBAAkB;oBAClB,aAAa;AACb,oBAAA,gCAAgC,EAAE,iCAAiC;iBACtE,EACD;AACI,oBAAA,UAAU,EAAE,oBAAoB;AAChC,oBAAA,UAAU,EAAE,gCAAgC;AACxC,0BAAE,mDAAmD;AACrD,0BAAE,sCAAsC;AAC/C,iBAAA,CACJ,CAAC;AACL,aAAA;YAED,IAAI,MAAM,KAAK,IAAI,EAAE;gBACjB,MAAM,GAAG,mBAAmB,CACxB;oBACI,gBAAgB;oBAChB,WAAW;oBACX,eAAe;oBACf,eAAe;oBACf,kBAAkB;oBAClB,aAAa;AACb,oBAAA,gCAAgC,EAAE,iCAAiC;iBACtE,EACD;AACI,oBAAA,UAAU,EAAE,kBAAkB;AAC9B,oBAAA,UAAU,EAAE,gCAAgC;AACxC,0BAAE,iDAAiD;AACnD,0BAAE,oCAAoC;AAC7C,iBAAA,CACJ,CAAC;AACL,aAAA;AAED,YAAA,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,eAAe,EAAE;gBACxE,MAAM,GAAG,oCAAoC,CAAC;oBAC1C,gBAAgB;oBAChB,WAAW;oBACX,eAAe;oBACf,SAAS;oBACT,SAAS;oBACT,eAAe;oBACf,kBAAkB;AAClB,oBAAA,oBAAoB,EAAE,IAAI;oBAC1B,aAAa;AACb,oBAAA,gCAAgC,EAAE,KAAK;AAC1C,iBAAA,CAAC,CAAC;AAEH,gBAAA,IAAI,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE;AAC5B,oBAAA,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,oBAAoB,CAAC;AACpD,iBAAA;AACJ,aAAA;YAED,IAAI,MAAM,KAAK,IAAI,EAAE;AACjB,gBAAA,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,gBAAA,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,gBAAA,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAChC,YAAY,CAAC,OAAO,GAAG,WAAW,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;gBACvE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAElB,OAAO;AACV,aAAA;AACJ,SAAA;AACL,KAAC,EACD;QACI,OAAO;QACP,YAAY;QACZ,cAAc;QACd,0BAA0B;QAC1B,IAAI;QACJ,SAAS;QACT,SAAS;QACT,kBAAkB;QAClB,iBAAiB;QACjB,aAAa;QACb,iCAAiC;QACjC,gCAAgC;QAChC,aAAa;QACb,qBAAqB;AACxB,KAAA,CACJ,CAAC;IAEF,SAAS,CAAC,MAAK;QACX,IAAI,gCAAgC,IAAI,MAAM,EAAE;YAC5C,IAAI,YAAY,CAAC,OAAO,EAAE;gBACtB,OAAO;AACV,aAAA;AAED,YAAA,IACI,MAAM,CAAC,SAAS,KAAK,KAAK;iBACzB,CAAC,MAAM,CAAC,SAAS,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,KAAK,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,EAClG;AACE,gBAAA,mCAAmC,CAC/B,MAAM,EAAE,6BAA6B,CAAC,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,GAAG,uBAAuB,CACvG,CAAC;AACL,aAAA;AAED,YAAA,IACI,MAAM,CAAC,SAAS,KAAK,QAAQ;iBAC5B,CAAC,MAAM,CAAC,SAAS,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,KAAK,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,EAC/F;AACE,gBAAA,mCAAmC,CAC/B,MAAM,CAAC,eAAe,CAAC,OAAO;oBAC1B,MAAM,CAAC,eAAe,CAAC,MAAM;oBAC7B,MAAM,CAAC,6BAA6B,CAAC,MAAM;AAC3C,oBAAA,uBAAuB,CAC9B,CAAC;AACL,aAAA;AACJ,SAAA;KACJ,EAAE,CAAC,MAAM,EAAE,gCAAgC,EAAE,iCAAiC,CAAC,CAAC,CAAC;AAElF,IAAA,eAAe,CAAC,kBAAkB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAE1D,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC;AAC9C,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;QAExD,MAAM,cAAc,GAAG,MAAK;YACxB,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC7B,SAAC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;AAC1D,QAAA,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,cAAc,CAAC,CAAC;AAEtD,QAAA,IAAI,WAAW,KAAK,QAAQ,CAAC,IAAI,EAAE;AAC/B,YAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AACrD,SAAA;AAAM,aAAA,IAAI,WAAW,EAAE;AACpB,YAAA,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACvC,SAAA;AACD,QAAA,IAAI,WAAW,KAAK,QAAQ,CAAC,IAAI,IAAI,gCAAgC,EAAE;AACnE,YAAA,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACzC,SAAA;AACD,QAAA,IAAI,gBAAgB,EAAE;AAClB,YAAA,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC5C,SAAA;AACD,QAAA,IAAI,gBAAgB,EAAE;AAClB,YAAA,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9F,SAAA;QACD,IAAI,iBAAiB,EAAE,OAAO,EAAE;AAC5B,YAAA,cAAc,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACrD,SAAA;AAED,QAAA,OAAO,MAAK;YACR,cAAc,CAAC,UAAU,EAAE,CAAC;YAC5B,QAAQ,CAAC,UAAU,EAAE,CAAC;AAEtB,YAAA,IAAI,WAAW,KAAK,QAAQ,CAAC,IAAI,EAAE;AAC/B,gBAAA,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AACjD,aAAA;AACL,SAAC,CAAC;AACN,KAAC,EAAE,CAAC,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,gCAAgC,CAAC,CAAC,CAAC;IAElG,OAAO;AACH,QAAA,QAAQ,EAAE;AACN,YAAA,SAAS,EAAE,kBAAkB;AAC7B,YAAA,SAAS,EAAE,kBAAkB;AAKU,SAAA;AAC3C,QAAA,OAAO,EAAE,QAAQ;KACpB,CAAC;AACN;;;;"}