@hh.ru/magritte-internal-drop-base 7.0.1 → 7.0.2
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.js +1 -2
- package/DropBase.js.map +1 -1
- package/index.css +1 -1
- package/index.js +0 -1
- package/index.js.map +1 -1
- package/package.json +2 -3
- package/positionManager.js +9 -14
- package/positionManager.js.map +1 -1
package/DropBase.js
CHANGED
|
@@ -10,12 +10,11 @@ import { useNoBubbling } from '@hh.ru/magritte-common-use-no-bubbling';
|
|
|
10
10
|
import { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';
|
|
11
11
|
import { useIntersectionSubscription } from './intersectionManager.js';
|
|
12
12
|
import { usePositionManager } from './positionManager.js';
|
|
13
|
-
import '@hh.ru/magritte-common-func-utils';
|
|
14
13
|
import './findBestFitPlacement.js';
|
|
15
14
|
import '@hh.ru/magritte-common-metrics';
|
|
16
15
|
import './useMonitorResize.js';
|
|
17
16
|
|
|
18
|
-
var styles = {"drop-base":"magritte-drop-base___uJNG4_7-0-
|
|
17
|
+
var styles = {"drop-base":"magritte-drop-base___uJNG4_7-0-2","dropBase":"magritte-drop-base___uJNG4_7-0-2"};
|
|
19
18
|
|
|
20
19
|
const DropBaseComponent = ({ visible, children, arrowGuardDistance, activatorRef, preferredViewport, onClose, autoFocusWhenOpened = false, closeByClickOutside = true, animationTimeout, animationClassNames, guardDistanceToActivator = 8, guardDistanceToViewport = 24, minHeight = 200, role, widthEqualToActivator = false, allowShrinkHeightToFitIntoViewport = false, keyboardNavigationMode = null, ignoreIntersections = false, style = {}, onAppear, onBeforeExit, onAfterExit, host, placement, forceDropMetricsUpdate, ...props }, ref) => {
|
|
21
20
|
const dropNodeRef = useRef(null);
|
package/DropBase.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropBase.js","sources":["../src/DropBase.tsx"],"sourcesContent":["import {\n ForwardedRef,\n ReactElement,\n forwardRef,\n useEffect,\n useRef,\n useState,\n MutableRefObject,\n RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { findNextFocusableElement, useEscapeToClose, useKeyboardNavigation } from '@hh.ru/magritte-common-keyboard';\nimport { useCloseByClickOutside } from '@hh.ru/magritte-common-mouse';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useNoBubbling } from '@hh.ru/magritte-common-use-no-bubbling';\nimport { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';\nimport { useIntersectionSubscription } from '@hh.ru/magritte-internal-drop-base/intersectionManager';\nimport { usePositionManager } from '@hh.ru/magritte-internal-drop-base/positionManager';\nimport type { DropBasePermanentProps } from '@hh.ru/magritte-internal-drop-base/types';\n\nimport styles from './styles.less';\n\n// Этот тип описан отдельно, чтобы данный проп не просачивался в Drop и Tooltip\ntype DropMetricsForceUpdateRef = { forceDropMetricsUpdate?: RefObject<VoidFunction> | MutableRefObject<VoidFunction> };\n\nconst DropBaseComponent = (\n {\n visible,\n children,\n arrowGuardDistance,\n activatorRef,\n preferredViewport,\n onClose,\n autoFocusWhenOpened = false,\n closeByClickOutside = true,\n animationTimeout,\n animationClassNames,\n guardDistanceToActivator = 8,\n guardDistanceToViewport = 24,\n minHeight = 200,\n role,\n widthEqualToActivator = false,\n allowShrinkHeightToFitIntoViewport = false,\n keyboardNavigationMode = null,\n ignoreIntersections = false,\n style = {},\n onAppear,\n onBeforeExit,\n onAfterExit,\n host,\n placement,\n forceDropMetricsUpdate,\n ...props\n }: DropBasePermanentProps & DropMetricsForceUpdateRef,\n ref: ForwardedRef<HTMLElement>\n): ReactElement => {\n const dropNodeRef = useRef<HTMLDivElement>(null);\n const [renderPortal, setRenderPortal] = useState(false);\n const isVisibleDropDown = !!(renderPortal && visible);\n const [lockClickOutside, setLockClickOutside] = useState(true);\n\n useWhenFontLoaded(() => setRenderPortal(true));\n\n const { bestFitPlacementRect, resizeRefCallbackFactory } = usePositionManager(\n activatorRef,\n dropNodeRef,\n isVisibleDropDown,\n placement,\n preferredViewport,\n allowShrinkHeightToFitIntoViewport,\n widthEqualToActivator,\n arrowGuardDistance || {},\n guardDistanceToActivator,\n guardDistanceToViewport,\n minHeight,\n forceDropMetricsUpdate as MutableRefObject<VoidFunction>\n );\n useIntersectionSubscription(activatorRef, isVisibleDropDown, ignoreIntersections, () => {\n onClose?.();\n });\n\n const escapeToCloseRef = useEscapeToClose(onClose);\n const keyboardNavigationRef = useKeyboardNavigation(\n keyboardNavigationMode !== null\n ? { enabled: isVisibleDropDown, mode: keyboardNavigationMode }\n : { enabled: false }\n );\n const dropNodeRefCallback = useMultipleRefs(ref, dropNodeRef, keyboardNavigationRef, escapeToCloseRef);\n\n useCloseByClickOutside(\n dropNodeRef,\n () => {\n if (isVisibleDropDown && !lockClickOutside && activatorRef.current !== document.activeElement) {\n onClose?.();\n }\n },\n closeByClickOutside\n );\n\n const eventHandlers = useNoBubbling(props);\n\n useEffect(() => {\n if (!isVisibleDropDown) {\n setLockClickOutside(true);\n }\n }, [isVisibleDropDown, setLockClickOutside]);\n\n useEffect(() => {\n if (autoFocusWhenOpened && dropNodeRef.current !== null && isVisibleDropDown && !lockClickOutside) {\n const nextFocusableElement = findNextFocusableElement(dropNodeRef.current, null, 'down', 'list');\n if (nextFocusableElement !== null) {\n nextFocusableElement.focus();\n } else {\n dropNodeRef.current.focus();\n }\n }\n }, [autoFocusWhenOpened, isVisibleDropDown, lockClickOutside]);\n\n return (\n <>\n {renderPortal &&\n createPortal(\n <CSSTransition\n in={visible}\n onEntered={() => {\n setLockClickOutside(false);\n onAppear?.();\n }}\n onExited={onAfterExit}\n onExit={onBeforeExit}\n timeout={animationTimeout}\n classNames={animationClassNames}\n unmountOnExit\n appear\n nodeRef={dropNodeRef}\n >\n <div\n {...props}\n {...eventHandlers}\n data-qa=\"drop-base\"\n tabIndex={autoFocusWhenOpened ? 0 : -1}\n className={styles.dropBase}\n ref={dropNodeRefCallback}\n style={{\n ...style,\n ...(bestFitPlacementRect || {}),\n }}\n role={role}\n >\n {children(resizeRefCallbackFactory)}\n </div>\n </CSSTransition>,\n host?.current ?? document.body\n )}\n </>\n );\n};\n\nconst DropBase = forwardRef<HTMLElement, DropBasePermanentProps & DropMetricsForceUpdateRef>(DropBaseComponent);\n\nexport { DropBase };\n"],"names":["_jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"DropBase.js","sources":["../src/DropBase.tsx"],"sourcesContent":["import {\n ForwardedRef,\n ReactElement,\n forwardRef,\n useEffect,\n useRef,\n useState,\n MutableRefObject,\n RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { findNextFocusableElement, useEscapeToClose, useKeyboardNavigation } from '@hh.ru/magritte-common-keyboard';\nimport { useCloseByClickOutside } from '@hh.ru/magritte-common-mouse';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useNoBubbling } from '@hh.ru/magritte-common-use-no-bubbling';\nimport { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';\nimport { useIntersectionSubscription } from '@hh.ru/magritte-internal-drop-base/intersectionManager';\nimport { usePositionManager } from '@hh.ru/magritte-internal-drop-base/positionManager';\nimport type { DropBasePermanentProps } from '@hh.ru/magritte-internal-drop-base/types';\n\nimport styles from './styles.less';\n\n// Этот тип описан отдельно, чтобы данный проп не просачивался в Drop и Tooltip\ntype DropMetricsForceUpdateRef = { forceDropMetricsUpdate?: RefObject<VoidFunction> | MutableRefObject<VoidFunction> };\n\nconst DropBaseComponent = (\n {\n visible,\n children,\n arrowGuardDistance,\n activatorRef,\n preferredViewport,\n onClose,\n autoFocusWhenOpened = false,\n closeByClickOutside = true,\n animationTimeout,\n animationClassNames,\n guardDistanceToActivator = 8,\n guardDistanceToViewport = 24,\n minHeight = 200,\n role,\n widthEqualToActivator = false,\n allowShrinkHeightToFitIntoViewport = false,\n keyboardNavigationMode = null,\n ignoreIntersections = false,\n style = {},\n onAppear,\n onBeforeExit,\n onAfterExit,\n host,\n placement,\n forceDropMetricsUpdate,\n ...props\n }: DropBasePermanentProps & DropMetricsForceUpdateRef,\n ref: ForwardedRef<HTMLElement>\n): ReactElement => {\n const dropNodeRef = useRef<HTMLDivElement>(null);\n const [renderPortal, setRenderPortal] = useState(false);\n const isVisibleDropDown = !!(renderPortal && visible);\n const [lockClickOutside, setLockClickOutside] = useState(true);\n\n useWhenFontLoaded(() => setRenderPortal(true));\n\n const { bestFitPlacementRect, resizeRefCallbackFactory } = usePositionManager(\n activatorRef,\n dropNodeRef,\n isVisibleDropDown,\n placement,\n preferredViewport,\n allowShrinkHeightToFitIntoViewport,\n widthEqualToActivator,\n arrowGuardDistance || {},\n guardDistanceToActivator,\n guardDistanceToViewport,\n minHeight,\n forceDropMetricsUpdate as MutableRefObject<VoidFunction>\n );\n useIntersectionSubscription(activatorRef, isVisibleDropDown, ignoreIntersections, () => {\n onClose?.();\n });\n\n const escapeToCloseRef = useEscapeToClose(onClose);\n const keyboardNavigationRef = useKeyboardNavigation(\n keyboardNavigationMode !== null\n ? { enabled: isVisibleDropDown, mode: keyboardNavigationMode }\n : { enabled: false }\n );\n const dropNodeRefCallback = useMultipleRefs(ref, dropNodeRef, keyboardNavigationRef, escapeToCloseRef);\n\n useCloseByClickOutside(\n dropNodeRef,\n () => {\n if (isVisibleDropDown && !lockClickOutside && activatorRef.current !== document.activeElement) {\n onClose?.();\n }\n },\n closeByClickOutside\n );\n\n const eventHandlers = useNoBubbling(props);\n\n useEffect(() => {\n if (!isVisibleDropDown) {\n setLockClickOutside(true);\n }\n }, [isVisibleDropDown, setLockClickOutside]);\n\n useEffect(() => {\n if (autoFocusWhenOpened && dropNodeRef.current !== null && isVisibleDropDown && !lockClickOutside) {\n const nextFocusableElement = findNextFocusableElement(dropNodeRef.current, null, 'down', 'list');\n if (nextFocusableElement !== null) {\n nextFocusableElement.focus();\n } else {\n dropNodeRef.current.focus();\n }\n }\n }, [autoFocusWhenOpened, isVisibleDropDown, lockClickOutside]);\n\n return (\n <>\n {renderPortal &&\n createPortal(\n <CSSTransition\n in={visible}\n onEntered={() => {\n setLockClickOutside(false);\n onAppear?.();\n }}\n onExited={onAfterExit}\n onExit={onBeforeExit}\n timeout={animationTimeout}\n classNames={animationClassNames}\n unmountOnExit\n appear\n nodeRef={dropNodeRef}\n >\n <div\n {...props}\n {...eventHandlers}\n data-qa=\"drop-base\"\n tabIndex={autoFocusWhenOpened ? 0 : -1}\n className={styles.dropBase}\n ref={dropNodeRefCallback}\n style={{\n ...style,\n ...(bestFitPlacementRect || {}),\n }}\n role={role}\n >\n {children(resizeRefCallbackFactory)}\n </div>\n </CSSTransition>,\n host?.current ?? document.body\n )}\n </>\n );\n};\n\nconst DropBase = forwardRef<HTMLElement, DropBasePermanentProps & DropMetricsForceUpdateRef>(DropBaseComponent);\n\nexport { DropBase };\n"],"names":["_jsx"],"mappings":"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"}
|
package/index.css
CHANGED
package/index.js
CHANGED
|
@@ -11,7 +11,6 @@ import '@hh.ru/magritte-common-use-no-bubbling';
|
|
|
11
11
|
import '@hh.ru/magritte-common-use-when-font-loaded';
|
|
12
12
|
import './intersectionManager.js';
|
|
13
13
|
import './positionManager.js';
|
|
14
|
-
import '@hh.ru/magritte-common-func-utils';
|
|
15
14
|
import './findBestFitPlacement.js';
|
|
16
15
|
import '@hh.ru/magritte-common-metrics';
|
|
17
16
|
import './useMonitorResize.js';
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-internal-drop-base",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.2",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"watch": "yarn root:watch $(pwd)"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@hh.ru/magritte-common-func-utils": "1.3.7",
|
|
24
23
|
"@hh.ru/magritte-common-keyboard": "4.0.1",
|
|
25
24
|
"@hh.ru/magritte-common-metrics": "2.1.0",
|
|
26
25
|
"@hh.ru/magritte-common-mouse": "1.1.11",
|
|
@@ -36,5 +35,5 @@
|
|
|
36
35
|
"publishConfig": {
|
|
37
36
|
"access": "public"
|
|
38
37
|
},
|
|
39
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "ec0b2010c50d4ebc4b8e852a0fa1d42aae536c4c"
|
|
40
39
|
}
|
package/positionManager.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
import { useRef, useCallback, useEffect, useLayoutEffect } from 'react';
|
|
3
|
-
import { requestAnimation } from '@hh.ru/magritte-common-func-utils';
|
|
4
3
|
import { applyPlacementToDrop, getMetrics, findBestFitPlacement } from './findBestFitPlacement.js';
|
|
5
4
|
import { useMonitorResize } from './useMonitorResize.js';
|
|
6
5
|
import '@hh.ru/magritte-common-metrics';
|
|
@@ -62,9 +61,8 @@ const usePositionManager = (activatorRef, dropRef, isVisible, placement, customV
|
|
|
62
61
|
const dropMetricsRef = useRef();
|
|
63
62
|
const prefferedPlacementRef = useRef();
|
|
64
63
|
const updateMetricsSyncRef = useRef(() => void 0);
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const getDropMetrics = useCallback(() => {
|
|
64
|
+
const { getResizeObserver, observeResizeRefCallbackFactory, getObservedElementsInfoMap } = useMonitorResize(dropMetricsRef, updateMetricsSyncRef);
|
|
65
|
+
const getDropMetrics = useCallback((activatorRect, widthEqualToActivator) => {
|
|
68
66
|
if (dropMetricsRef.current) {
|
|
69
67
|
return dropMetricsRef.current;
|
|
70
68
|
}
|
|
@@ -81,7 +79,9 @@ const usePositionManager = (activatorRef, dropRef, isVisible, placement, customV
|
|
|
81
79
|
});
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
|
-
|
|
82
|
+
// Ширина не должна превышать максимально допустимую, т.к. это может повлиять на высоту, например из-за
|
|
83
|
+
// переноса текста на новую строку.
|
|
84
|
+
dropRef.current.style.width = widthEqualToActivator ? `${activatorRect.width}px` : '';
|
|
85
85
|
dropRef.current.style.height = '';
|
|
86
86
|
dropMetricsRef.current = dropRef.current.getBoundingClientRect();
|
|
87
87
|
if (bestFitPlacementRef.current) {
|
|
@@ -93,10 +93,6 @@ const usePositionManager = (activatorRef, dropRef, isVisible, placement, customV
|
|
|
93
93
|
}
|
|
94
94
|
return dropMetricsRef.current;
|
|
95
95
|
}, [dropRef, getObservedElementsInfoMap]);
|
|
96
|
-
// Создаю синхронную функцию для обновления размещения дропа и обновления атрибутов на элементе
|
|
97
|
-
// и сразу же создаю вресию оберунтую в raf. Синхронная версия нужна при первом показе, т.к. на атрибуты на элементе
|
|
98
|
-
// может быть завязана анимация, которая должна начаться сразу же после показа. raf версия нужна для реакции на
|
|
99
|
-
// скролл/ресайз и т.д.
|
|
100
96
|
updateMetricsSyncRef.current = () => {
|
|
101
97
|
if (!dropRef.current || !isVisible) {
|
|
102
98
|
bestFitPlacementRef.current = undefined;
|
|
@@ -107,7 +103,7 @@ const usePositionManager = (activatorRef, dropRef, isVisible, placement, customV
|
|
|
107
103
|
customViewport,
|
|
108
104
|
dropRef,
|
|
109
105
|
});
|
|
110
|
-
const dropRect = getDropMetrics();
|
|
106
|
+
const dropRect = getDropMetrics(activatorRect, widthEqualToActivator);
|
|
111
107
|
const { rect, parsedPlacement: choosenPlacement, placement: prefferedPlacement, } = findBestFitPlacement({
|
|
112
108
|
placements: Array.isArray(placement) ? placement : [placement],
|
|
113
109
|
activatorRect,
|
|
@@ -129,11 +125,10 @@ const usePositionManager = (activatorRef, dropRef, isVisible, placement, customV
|
|
|
129
125
|
dropRef.current.dataset.magritteDropBaseAlignment = choosenPlacement.alignment;
|
|
130
126
|
bestFitPlacementRef.current = rect;
|
|
131
127
|
};
|
|
132
|
-
updateMetricsRef.current = requestAnimation(updateMetricsSyncRef.current);
|
|
133
128
|
if (forceDropMetricsUpdate) {
|
|
134
129
|
forceDropMetricsUpdate.current = () => {
|
|
135
130
|
dropMetricsRef.current = undefined;
|
|
136
|
-
|
|
131
|
+
updateMetricsSyncRef.current();
|
|
137
132
|
};
|
|
138
133
|
}
|
|
139
134
|
useEffect(() => {
|
|
@@ -143,7 +138,7 @@ const usePositionManager = (activatorRef, dropRef, isVisible, placement, customV
|
|
|
143
138
|
}
|
|
144
139
|
const activatorElement = activatorRef.current;
|
|
145
140
|
const customViewportElement = customViewport?.current;
|
|
146
|
-
const resizeHandler = () =>
|
|
141
|
+
const resizeHandler = () => updateMetricsSyncRef.current();
|
|
147
142
|
activatorElement && getResizeObserver().observe(activatorElement);
|
|
148
143
|
customViewportElement && getResizeObserver().observe(customViewportElement);
|
|
149
144
|
window.addEventListener('resize', resizeHandler);
|
|
@@ -181,7 +176,7 @@ const usePositionManager = (activatorRef, dropRef, isVisible, placement, customV
|
|
|
181
176
|
}
|
|
182
177
|
getProcessedScrollContainers().add(target);
|
|
183
178
|
}
|
|
184
|
-
|
|
179
|
+
updateMetricsSyncRef.current();
|
|
185
180
|
}, [activatorRef, dropRef]);
|
|
186
181
|
useEffect(() => {
|
|
187
182
|
// eslint-disable-next-line no-unused-expressions
|
package/positionManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"positionManager.js","sources":["../src/positionManager.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useLayoutEffect, MutableRefObject } from 'react';\n\nimport { requestAnimation } from '@hh.ru/magritte-common-func-utils';\nimport {\n findBestFitPlacement,\n getMetrics,\n applyPlacementToDrop,\n} from '@hh.ru/magritte-internal-drop-base/findBestFitPlacement';\nimport type {\n ArrowGuardDistance,\n ActivatorElementType,\n Placement,\n RefCallbackFactory,\n} from '@hh.ru/magritte-internal-drop-base/types';\nimport { useMonitorResize } from '@hh.ru/magritte-internal-drop-base/useMonitorResize';\n\nlet isInitialized = false;\n\ninterface SubscriptionCallback {\n (target: HTMLElement): void;\n}\n\nconst scrollSubscriptions: Array<SubscriptionCallback> = [];\nconst canceledScrollSubscriptions: Map<HTMLElement, Array<SubscriptionCallback>> = new Map();\n\nconst scrollHandler = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n\n if (scrollSubscriptions.length === 0) {\n return;\n }\n const canceledSubscriptions = canceledScrollSubscriptions.get(target);\n\n const subscriptions =\n canceledSubscriptions === undefined\n ? scrollSubscriptions\n : scrollSubscriptions.filter((subscription) => !canceledSubscriptions.includes(subscription));\n\n subscriptions.forEach((subscription) => subscription(target));\n};\n\nconst initialize = () => {\n if (isInitialized) {\n return;\n }\n\n isInitialized = true;\n document.addEventListener('scroll', scrollHandler, { capture: true, passive: false });\n};\n\nconst suspendSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n};\n\nconst reviveSubscription = (callback: SubscriptionCallback): void => {\n initialize();\n scrollSubscriptions.push(callback);\n};\n\nexport const deleteScrollSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n for (const [key, callbacks] of canceledScrollSubscriptions.entries()) {\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n canceledScrollSubscriptions.set(key, callbacks.splice(index, 1));\n }\n }\n};\n\nconst unsubscribeFromTarget = (target: HTMLElement, callback: SubscriptionCallback): void => {\n if (!canceledScrollSubscriptions.has(target)) {\n canceledScrollSubscriptions.set(target, []);\n }\n canceledScrollSubscriptions.get(target)?.push(callback);\n};\n\nexport const usePositionManager = (\n activatorRef: RefObject<ActivatorElementType>,\n dropRef: RefObject<HTMLElement>,\n isVisible: boolean,\n placement: Placement | Placement[],\n customViewport: RefObject<HTMLElement> | undefined,\n allowShrinkHeightToFitIntoViewport: boolean,\n widthEqualToActivator: boolean,\n arrowGuardDistance: ArrowGuardDistance,\n guardDistanceToActivator: number,\n guardDistanceToViewport: number,\n minDropHeight: number,\n forceDropMetricsUpdate: MutableRefObject<VoidFunction> | undefined\n): {\n resizeRefCallbackFactory: RefCallbackFactory;\n bestFitPlacementRect: DOMRect | undefined;\n} => {\n const bestFitPlacementRef = useRef<DOMRect>();\n const dropMetricsRef = useRef<DOMRect>();\n\n const prefferedPlacementRef = useRef<Placement>();\n\n const updateMetricsSyncRef = useRef<VoidFunction>(() => void 0);\n const updateMetricsRef = useRef<VoidFunction>(() => void 0);\n\n const { getResizeObserver, observeResizeRefCallbackFactory, getObservedElementsInfoMap } = useMonitorResize(\n dropMetricsRef,\n updateMetricsRef\n );\n\n const getDropMetrics = useCallback(() => {\n if (dropMetricsRef.current) {\n return dropMetricsRef.current;\n }\n if (!dropRef.current) {\n return new DOMRect();\n }\n\n const scrollPositions: { node: HTMLElement; top: number; left: number }[] = [];\n for (const info of getObservedElementsInfoMap().values()) {\n if (info.isScrollable && info.node) {\n scrollPositions.push({\n node: info.node,\n top: info.node.scrollTop,\n left: info.node.scrollLeft,\n });\n }\n }\n\n dropRef.current.style.width = '';\n dropRef.current.style.height = '';\n dropMetricsRef.current = dropRef.current.getBoundingClientRect();\n if (bestFitPlacementRef.current) {\n applyPlacementToDrop(dropRef, bestFitPlacementRef.current);\n }\n for (const { node, top, left } of scrollPositions) {\n node.scrollTop = top;\n node.scrollLeft = left;\n }\n return dropMetricsRef.current;\n }, [dropRef, getObservedElementsInfoMap]);\n\n // Создаю синхронную функцию для обновления размещения дропа и обновления атрибутов на элементе\n // и сразу же создаю вресию оберунтую в raf. Синхронная версия нужна при первом показе, т.к. на атрибуты на элементе\n // может быть завязана анимация, которая должна начаться сразу же после показа. raf версия нужна для реакции на\n // скролл/ресайз и т.д.\n updateMetricsSyncRef.current = () => {\n if (!dropRef.current || !isVisible) {\n bestFitPlacementRef.current = undefined;\n return;\n }\n const { activatorRect, viewportRect, offsetParentRect } = getMetrics({\n activatorRef,\n customViewport,\n dropRef,\n });\n const dropRect = getDropMetrics();\n const {\n rect,\n parsedPlacement: choosenPlacement,\n placement: prefferedPlacement,\n } = findBestFitPlacement({\n placements: Array.isArray(placement) ? placement : [placement],\n activatorRect,\n viewportRect,\n offsetParentRect,\n dropWidth: dropRect.width,\n dropHeight: dropRect.height,\n guardDistanceToActivator,\n guardDistanceToViewport,\n minDropHeight,\n widthEqualToActivator,\n allowShrinkHeightToFitIntoViewport,\n arrowGuardDistance,\n prefferedPlacement: prefferedPlacementRef.current,\n });\n prefferedPlacementRef.current = prefferedPlacement;\n applyPlacementToDrop(dropRef, rect);\n dropRef.current.dataset.magritteDropBaseDirection = choosenPlacement.direction;\n dropRef.current.dataset.magritteDropBaseAlignment = choosenPlacement.alignment;\n bestFitPlacementRef.current = rect;\n };\n updateMetricsRef.current = requestAnimation(updateMetricsSyncRef.current);\n\n if (forceDropMetricsUpdate) {\n forceDropMetricsUpdate.current = () => {\n dropMetricsRef.current = undefined;\n updateMetricsRef.current();\n };\n }\n\n useEffect(() => {\n if (!isVisible) {\n prefferedPlacementRef.current = undefined;\n return () => void 0;\n }\n const activatorElement = activatorRef.current;\n const customViewportElement = customViewport?.current;\n const resizeHandler = () => updateMetricsRef.current();\n activatorElement && getResizeObserver().observe(activatorElement);\n customViewportElement && getResizeObserver().observe(customViewportElement);\n window.addEventListener('resize', resizeHandler);\n return () => {\n activatorElement && getResizeObserver().unobserve(activatorElement);\n customViewportElement && getResizeObserver().unobserve(customViewportElement);\n window.removeEventListener('resize', resizeHandler);\n };\n }, [activatorRef, getResizeObserver, customViewport, isVisible]);\n\n useLayoutEffect(() => {\n isVisible && updateMetricsSyncRef.current();\n }, [isVisible, placement]);\n\n /**\n * список id скроллящихся элементов для которых была выполнена проверка\n * влияет ли их скролл на взаимное положение активатора и дропа.\n * Получение сделано с помощью отдельной функции чтобы не создавать сет на каждый ререндер.\n */\n const processedScrollContainers = useRef<Set<HTMLElement>>();\n const getProcessedScrollContainers = (): Set<HTMLElement> => {\n processedScrollContainers.current = processedScrollContainers.current || new Set();\n return processedScrollContainers.current;\n };\n\n const visibleRef = useRef(isVisible);\n visibleRef.current = isVisible;\n\n const scrollHandler = useCallback(\n (target: HTMLElement) => {\n if (!visibleRef.current || !dropRef.current || !activatorRef.current) {\n return;\n }\n\n // Если это первый скролл данного контейнера, то проверяем содержит ли он активатор\n // Если он не содержит активатор, то можно отписаться от дальнейших оповещений о его скролле.\n if (!getProcessedScrollContainers().has(target)) {\n if (!target.contains(activatorRef.current)) {\n unsubscribeFromTarget(target, scrollHandler);\n return;\n }\n getProcessedScrollContainers().add(target);\n }\n\n updateMetricsRef.current();\n },\n [activatorRef, dropRef]\n );\n\n useEffect(() => {\n // eslint-disable-next-line no-unused-expressions\n isVisible ? reviveSubscription(scrollHandler) : suspendSubscription(scrollHandler);\n }, [isVisible, scrollHandler]);\n\n useEffect(() => {\n return () => deleteScrollSubscription(scrollHandler);\n }, [scrollHandler]);\n\n return {\n resizeRefCallbackFactory: observeResizeRefCallbackFactory,\n bestFitPlacementRect: bestFitPlacementRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"positionManager.js","sources":["../src/positionManager.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useLayoutEffect, MutableRefObject } from 'react';\n\nimport {\n findBestFitPlacement,\n getMetrics,\n applyPlacementToDrop,\n} from '@hh.ru/magritte-internal-drop-base/findBestFitPlacement';\nimport type {\n ArrowGuardDistance,\n ActivatorElementType,\n Placement,\n RefCallbackFactory,\n} from '@hh.ru/magritte-internal-drop-base/types';\nimport { useMonitorResize } from '@hh.ru/magritte-internal-drop-base/useMonitorResize';\n\nlet isInitialized = false;\n\ninterface SubscriptionCallback {\n (target: HTMLElement): void;\n}\n\nconst scrollSubscriptions: Array<SubscriptionCallback> = [];\nconst canceledScrollSubscriptions: Map<HTMLElement, Array<SubscriptionCallback>> = new Map();\n\nconst scrollHandler = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n\n if (scrollSubscriptions.length === 0) {\n return;\n }\n const canceledSubscriptions = canceledScrollSubscriptions.get(target);\n\n const subscriptions =\n canceledSubscriptions === undefined\n ? scrollSubscriptions\n : scrollSubscriptions.filter((subscription) => !canceledSubscriptions.includes(subscription));\n\n subscriptions.forEach((subscription) => subscription(target));\n};\n\nconst initialize = () => {\n if (isInitialized) {\n return;\n }\n\n isInitialized = true;\n document.addEventListener('scroll', scrollHandler, { capture: true, passive: false });\n};\n\nconst suspendSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n};\n\nconst reviveSubscription = (callback: SubscriptionCallback): void => {\n initialize();\n scrollSubscriptions.push(callback);\n};\n\nexport const deleteScrollSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n for (const [key, callbacks] of canceledScrollSubscriptions.entries()) {\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n canceledScrollSubscriptions.set(key, callbacks.splice(index, 1));\n }\n }\n};\n\nconst unsubscribeFromTarget = (target: HTMLElement, callback: SubscriptionCallback): void => {\n if (!canceledScrollSubscriptions.has(target)) {\n canceledScrollSubscriptions.set(target, []);\n }\n canceledScrollSubscriptions.get(target)?.push(callback);\n};\n\nexport const usePositionManager = (\n activatorRef: RefObject<ActivatorElementType>,\n dropRef: RefObject<HTMLElement>,\n isVisible: boolean,\n placement: Placement | Placement[],\n customViewport: RefObject<HTMLElement> | undefined,\n allowShrinkHeightToFitIntoViewport: boolean,\n widthEqualToActivator: boolean,\n arrowGuardDistance: ArrowGuardDistance,\n guardDistanceToActivator: number,\n guardDistanceToViewport: number,\n minDropHeight: number,\n forceDropMetricsUpdate: MutableRefObject<VoidFunction> | undefined\n): {\n resizeRefCallbackFactory: RefCallbackFactory;\n bestFitPlacementRect: DOMRect | undefined;\n} => {\n const bestFitPlacementRef = useRef<DOMRect>();\n const dropMetricsRef = useRef<DOMRect>();\n\n const prefferedPlacementRef = useRef<Placement>();\n\n const updateMetricsSyncRef = useRef<VoidFunction>(() => void 0);\n\n const { getResizeObserver, observeResizeRefCallbackFactory, getObservedElementsInfoMap } = useMonitorResize(\n dropMetricsRef,\n updateMetricsSyncRef\n );\n\n const getDropMetrics = useCallback(\n (activatorRect: DOMRect, widthEqualToActivator: boolean) => {\n if (dropMetricsRef.current) {\n return dropMetricsRef.current;\n }\n if (!dropRef.current) {\n return new DOMRect();\n }\n\n const scrollPositions: { node: HTMLElement; top: number; left: number }[] = [];\n for (const info of getObservedElementsInfoMap().values()) {\n if (info.isScrollable && info.node) {\n scrollPositions.push({\n node: info.node,\n top: info.node.scrollTop,\n left: info.node.scrollLeft,\n });\n }\n }\n\n // Ширина не должна превышать максимально допустимую, т.к. это может повлиять на высоту, например из-за\n // переноса текста на новую строку.\n dropRef.current.style.width = widthEqualToActivator ? `${activatorRect.width}px` : '';\n dropRef.current.style.height = '';\n dropMetricsRef.current = dropRef.current.getBoundingClientRect();\n if (bestFitPlacementRef.current) {\n applyPlacementToDrop(dropRef, bestFitPlacementRef.current);\n }\n for (const { node, top, left } of scrollPositions) {\n node.scrollTop = top;\n node.scrollLeft = left;\n }\n return dropMetricsRef.current;\n },\n [dropRef, getObservedElementsInfoMap]\n );\n\n updateMetricsSyncRef.current = () => {\n if (!dropRef.current || !isVisible) {\n bestFitPlacementRef.current = undefined;\n return;\n }\n const { activatorRect, viewportRect, offsetParentRect } = getMetrics({\n activatorRef,\n customViewport,\n dropRef,\n });\n const dropRect = getDropMetrics(activatorRect, widthEqualToActivator);\n const {\n rect,\n parsedPlacement: choosenPlacement,\n placement: prefferedPlacement,\n } = findBestFitPlacement({\n placements: Array.isArray(placement) ? placement : [placement],\n activatorRect,\n viewportRect,\n offsetParentRect,\n dropWidth: dropRect.width,\n dropHeight: dropRect.height,\n guardDistanceToActivator,\n guardDistanceToViewport,\n minDropHeight,\n widthEqualToActivator,\n allowShrinkHeightToFitIntoViewport,\n arrowGuardDistance,\n prefferedPlacement: prefferedPlacementRef.current,\n });\n prefferedPlacementRef.current = prefferedPlacement;\n applyPlacementToDrop(dropRef, rect);\n dropRef.current.dataset.magritteDropBaseDirection = choosenPlacement.direction;\n dropRef.current.dataset.magritteDropBaseAlignment = choosenPlacement.alignment;\n bestFitPlacementRef.current = rect;\n };\n\n if (forceDropMetricsUpdate) {\n forceDropMetricsUpdate.current = () => {\n dropMetricsRef.current = undefined;\n updateMetricsSyncRef.current();\n };\n }\n\n useEffect(() => {\n if (!isVisible) {\n prefferedPlacementRef.current = undefined;\n return () => void 0;\n }\n const activatorElement = activatorRef.current;\n const customViewportElement = customViewport?.current;\n const resizeHandler = () => updateMetricsSyncRef.current();\n activatorElement && getResizeObserver().observe(activatorElement);\n customViewportElement && getResizeObserver().observe(customViewportElement);\n window.addEventListener('resize', resizeHandler);\n return () => {\n activatorElement && getResizeObserver().unobserve(activatorElement);\n customViewportElement && getResizeObserver().unobserve(customViewportElement);\n window.removeEventListener('resize', resizeHandler);\n };\n }, [activatorRef, getResizeObserver, customViewport, isVisible]);\n\n useLayoutEffect(() => {\n isVisible && updateMetricsSyncRef.current();\n }, [isVisible, placement]);\n\n /**\n * список id скроллящихся элементов для которых была выполнена проверка\n * влияет ли их скролл на взаимное положение активатора и дропа.\n * Получение сделано с помощью отдельной функции чтобы не создавать сет на каждый ререндер.\n */\n const processedScrollContainers = useRef<Set<HTMLElement>>();\n const getProcessedScrollContainers = (): Set<HTMLElement> => {\n processedScrollContainers.current = processedScrollContainers.current || new Set();\n return processedScrollContainers.current;\n };\n\n const visibleRef = useRef(isVisible);\n visibleRef.current = isVisible;\n\n const scrollHandler = useCallback(\n (target: HTMLElement) => {\n if (!visibleRef.current || !dropRef.current || !activatorRef.current) {\n return;\n }\n\n // Если это первый скролл данного контейнера, то проверяем содержит ли он активатор\n // Если он не содержит активатор, то можно отписаться от дальнейших оповещений о его скролле.\n if (!getProcessedScrollContainers().has(target)) {\n if (!target.contains(activatorRef.current)) {\n unsubscribeFromTarget(target, scrollHandler);\n return;\n }\n getProcessedScrollContainers().add(target);\n }\n\n updateMetricsSyncRef.current();\n },\n [activatorRef, dropRef]\n );\n\n useEffect(() => {\n // eslint-disable-next-line no-unused-expressions\n isVisible ? reviveSubscription(scrollHandler) : suspendSubscription(scrollHandler);\n }, [isVisible, scrollHandler]);\n\n useEffect(() => {\n return () => deleteScrollSubscription(scrollHandler);\n }, [scrollHandler]);\n\n return {\n resizeRefCallbackFactory: observeResizeRefCallbackFactory,\n bestFitPlacementRect: bestFitPlacementRef.current,\n };\n};\n"],"names":[],"mappings":";;;;;AAeA,IAAI,aAAa,GAAG,KAAK,CAAC;AAM1B,MAAM,mBAAmB,GAAgC,EAAE,CAAC;AAC5D,MAAM,2BAA2B,GAAkD,IAAI,GAAG,EAAE,CAAC;AAE7F,MAAM,aAAa,GAAG,CAAC,KAAY,KAAI;AACnC,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE;QACT,OAAO;AACV,KAAA;AAED,IAAA,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;QAClC,OAAO;AACV,KAAA;IACD,MAAM,qBAAqB,GAAG,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEtE,IAAA,MAAM,aAAa,GACf,qBAAqB,KAAK,SAAS;AAC/B,UAAE,mBAAmB;AACrB,UAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;AAEtG,IAAA,aAAa,CAAC,OAAO,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,MAAK;AACpB,IAAA,IAAI,aAAa,EAAE;QACf,OAAO;AACV,KAAA;IAED,aAAa,GAAG,IAAI,CAAC;AACrB,IAAA,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,QAA8B,KAAU;IACjE,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpD,IAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AACd,QAAA,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACxC,KAAA;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,QAA8B,KAAU;AAChE,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC,CAAC;AAEW,MAAA,wBAAwB,GAAG,CAAC,QAA8B,KAAU;IAC7E,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpD,IAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AACd,QAAA,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACxC,KAAA;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,2BAA2B,CAAC,OAAO,EAAE,EAAE;QAClE,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC1C,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AACd,YAAA,2BAA2B,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,SAAA;AACJ,KAAA;AACL,EAAE;AAEF,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAE,QAA8B,KAAU;AACxF,IAAA,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC1C,QAAA,2BAA2B,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/C,KAAA;IACD,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CAC9B,YAA6C,EAC7C,OAA+B,EAC/B,SAAkB,EAClB,SAAkC,EAClC,cAAkD,EAClD,kCAA2C,EAC3C,qBAA8B,EAC9B,kBAAsC,EACtC,wBAAgC,EAChC,uBAA+B,EAC/B,aAAqB,EACrB,sBAAkE,KAIlE;AACA,IAAA,MAAM,mBAAmB,GAAG,MAAM,EAAW,CAAC;AAC9C,IAAA,MAAM,cAAc,GAAG,MAAM,EAAW,CAAC;AAEzC,IAAA,MAAM,qBAAqB,GAAG,MAAM,EAAa,CAAC;IAElD,MAAM,oBAAoB,GAAG,MAAM,CAAe,MAAM,KAAK,CAAC,CAAC,CAAC;AAEhE,IAAA,MAAM,EAAE,iBAAiB,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,GAAG,gBAAgB,CACvG,cAAc,EACd,oBAAoB,CACvB,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAC9B,CAAC,aAAsB,EAAE,qBAA8B,KAAI;QACvD,IAAI,cAAc,CAAC,OAAO,EAAE;YACxB,OAAO,cAAc,CAAC,OAAO,CAAC;AACjC,SAAA;AACD,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAClB,OAAO,IAAI,OAAO,EAAE,CAAC;AACxB,SAAA;QAED,MAAM,eAAe,GAAuD,EAAE,CAAC;QAC/E,KAAK,MAAM,IAAI,IAAI,0BAA0B,EAAE,CAAC,MAAM,EAAE,EAAE;AACtD,YAAA,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE;gBAChC,eAAe,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,oBAAA,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;AACxB,oBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;AAC7B,iBAAA,CAAC,CAAC;AACN,aAAA;AACJ,SAAA;;;QAID,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,qBAAqB,GAAG,CAAG,EAAA,aAAa,CAAC,KAAK,CAAA,EAAA,CAAI,GAAG,EAAE,CAAC;QACtF,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACjE,IAAI,mBAAmB,CAAC,OAAO,EAAE;AAC7B,YAAA,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC9D,SAAA;QACD,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE;AAC/C,YAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;AACrB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AAC1B,SAAA;QACD,OAAO,cAAc,CAAC,OAAO,CAAC;AAClC,KAAC,EACD,CAAC,OAAO,EAAE,0BAA0B,CAAC,CACxC,CAAC;AAEF,IAAA,oBAAoB,CAAC,OAAO,GAAG,MAAK;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE;AAChC,YAAA,mBAAmB,CAAC,OAAO,GAAG,SAAS,CAAC;YACxC,OAAO;AACV,SAAA;QACD,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC;YACjE,YAAY;YACZ,cAAc;YACd,OAAO;AACV,SAAA,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;AACtE,QAAA,MAAM,EACF,IAAI,EACJ,eAAe,EAAE,gBAAgB,EACjC,SAAS,EAAE,kBAAkB,GAChC,GAAG,oBAAoB,CAAC;AACrB,YAAA,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC;YAC9D,aAAa;YACb,YAAY;YACZ,gBAAgB;YAChB,SAAS,EAAE,QAAQ,CAAC,KAAK;YACzB,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,wBAAwB;YACxB,uBAAuB;YACvB,aAAa;YACb,qBAAqB;YACrB,kCAAkC;YAClC,kBAAkB;YAClB,kBAAkB,EAAE,qBAAqB,CAAC,OAAO;AACpD,SAAA,CAAC,CAAC;AACH,QAAA,qBAAqB,CAAC,OAAO,GAAG,kBAAkB,CAAC;AACnD,QAAA,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,GAAG,gBAAgB,CAAC,SAAS,CAAC;QAC/E,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,GAAG,gBAAgB,CAAC,SAAS,CAAC;AAC/E,QAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC;AACvC,KAAC,CAAC;AAEF,IAAA,IAAI,sBAAsB,EAAE;AACxB,QAAA,sBAAsB,CAAC,OAAO,GAAG,MAAK;AAClC,YAAA,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC;YACnC,oBAAoB,CAAC,OAAO,EAAE,CAAC;AACnC,SAAC,CAAC;AACL,KAAA;IAED,SAAS,CAAC,MAAK;QACX,IAAI,CAAC,SAAS,EAAE;AACZ,YAAA,qBAAqB,CAAC,OAAO,GAAG,SAAS,CAAC;AAC1C,YAAA,OAAO,MAAM,KAAK,CAAC,CAAC;AACvB,SAAA;AACD,QAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC;AAC9C,QAAA,MAAM,qBAAqB,GAAG,cAAc,EAAE,OAAO,CAAC;QACtD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,CAAC;QAC3D,gBAAgB,IAAI,iBAAiB,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAClE,qBAAqB,IAAI,iBAAiB,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAC5E,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACjD,QAAA,OAAO,MAAK;YACR,gBAAgB,IAAI,iBAAiB,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YACpE,qBAAqB,IAAI,iBAAiB,EAAE,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAC9E,YAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACxD,SAAC,CAAC;KACL,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjE,eAAe,CAAC,MAAK;AACjB,QAAA,SAAS,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;AAChD,KAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE3B;;;;AAIG;AACH,IAAA,MAAM,yBAAyB,GAAG,MAAM,EAAoB,CAAC;IAC7D,MAAM,4BAA4B,GAAG,MAAuB;QACxD,yBAAyB,CAAC,OAAO,GAAG,yBAAyB,CAAC,OAAO,IAAI,IAAI,GAAG,EAAE,CAAC;QACnF,OAAO,yBAAyB,CAAC,OAAO,CAAC;AAC7C,KAAC,CAAC;AAEF,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AACrC,IAAA,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC;AAE/B,IAAA,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,MAAmB,KAAI;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YAClE,OAAO;AACV,SAAA;;;QAID,IAAI,CAAC,4BAA4B,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AACxC,gBAAA,qBAAqB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBAC7C,OAAO;AACV,aAAA;AACD,YAAA,4BAA4B,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9C,SAAA;QAED,oBAAoB,CAAC,OAAO,EAAE,CAAC;AACnC,KAAC,EACD,CAAC,YAAY,EAAE,OAAO,CAAC,CAC1B,CAAC;IAEF,SAAS,CAAC,MAAK;;AAEX,QAAA,SAAS,GAAG,kBAAkB,CAAC,aAAa,CAAC,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;AACvF,KAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE/B,SAAS,CAAC,MAAK;AACX,QAAA,OAAO,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAC;AACzD,KAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO;AACH,QAAA,wBAAwB,EAAE,+BAA+B;QACzD,oBAAoB,EAAE,mBAAmB,CAAC,OAAO;KACpD,CAAC;AACN;;;;"}
|