@hh.ru/magritte-internal-drop-base 5.0.4

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 ADDED
@@ -0,0 +1,8 @@
1
+ import { ReactElement, ForwardedRef } from 'react';
2
+ import type { DropBaseProps, DropBaseHorizontalPosition, DropBaseVerticalPosition, DropBaseHorizontalPositionWithoutCenter, DropBaseVerticalPositionWithoutCenter } from './types';
3
+ declare const DropBase: (<T extends DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseVerticalPositionWithoutCenter | DropBaseHorizontalPositionWithoutCenter>(props: import("./types").DropBasePermanentProps & T & {
4
+ ref?: ForwardedRef<HTMLElement> | undefined;
5
+ }) => ReactElement) & {
6
+ displayName: string;
7
+ };
8
+ export { DropBase };
package/DropBase.js ADDED
@@ -0,0 +1,124 @@
1
+ import './index.css';
2
+ import { jsx, Fragment } from 'react/jsx-runtime';
3
+ import { forwardRef, useRef, useState, useEffect } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { CSSTransition } from 'react-transition-group';
6
+ import { useEscapeToClose, useArrowNavigation } from '@hh.ru/magritte-common-keyboard';
7
+ import { useCloseByClickOutside } from '@hh.ru/magritte-common-mouse';
8
+ import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
9
+ import { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';
10
+ import { useIntersectionSubscription } from './intersectionManager.js';
11
+ import { useScrollSubscription } from './scrollManager.js';
12
+ import { useRenderParams } from './useRenderParams.js';
13
+ import '@hh.ru/magritte-common-func-utils';
14
+ import '@hh.ru/magritte-common-metrics';
15
+ import './calculateRect.js';
16
+
17
+ var styles = {"drop-base":"magritte-drop-base___uJNG4_5-0-4","dropBase":"magritte-drop-base___uJNG4_5-0-4"};
18
+
19
+ const EVENTS_TO_PREVENT_BUBBLING = [
20
+ 'onClick',
21
+ 'onContextMenu',
22
+ 'onDoubleClick',
23
+ 'onMouseDown',
24
+ 'onMouseEnter',
25
+ 'onMouseLeave',
26
+ 'onMouseMove',
27
+ 'onMouseOver',
28
+ 'onMouseOut',
29
+ 'onMouseUp',
30
+ 'onKeyDown',
31
+ 'onKeyPress',
32
+ 'onKeyUp',
33
+ 'onBlur',
34
+ 'onChange',
35
+ 'onFocus',
36
+ 'onInput',
37
+ 'onInvalid',
38
+ 'onReset',
39
+ 'onSelect',
40
+ 'onSubmit',
41
+ 'onDrag',
42
+ 'onDragEnd',
43
+ 'onDragEnter',
44
+ 'onDragLeave',
45
+ 'onDragOver',
46
+ 'onDragStart',
47
+ 'onDrop',
48
+ 'onCopy',
49
+ 'onCut',
50
+ 'onPaste',
51
+ 'onWheel',
52
+ 'onTouchCancel',
53
+ 'onTouchEnd',
54
+ 'onTouchMove',
55
+ 'onTouchStart',
56
+ ];
57
+ const bubblingCancelHandler = (event) => event.stopPropagation();
58
+ const preventBubblingProps = EVENTS_TO_PREVENT_BUBBLING.reduce((result, eventName) => {
59
+ result[eventName] = bubblingCancelHandler;
60
+ return result;
61
+ }, {});
62
+ const DropBaseComponent = ({ visible, children, arrowGuardDistance, activatorRef, host, alignment, direction, preferredViewport, onClose, autoFocusWhenOpened = false, closeByClickOutside = true, animationTimeout, animationClassNames, guardDistance = 8, role, occupyAllAvailableViewportHeight = false, forcePosition = false, widthEqualToActivator = false, arrowNavigation = false, ignoreIntersections = false, style = {}, ...props }, ref) => {
63
+ const dropNodeRef = useRef(null);
64
+ const dropScrollableContainerRef = useRef(null);
65
+ const [renderPortal, setRenderPortal] = useState(false);
66
+ const isVisibleDropDown = !!(renderPortal && visible);
67
+ const [lockClickOutside, setLockClickOutside] = useState(true);
68
+ useWhenFontLoaded(() => setRenderPortal(true));
69
+ const { metrics, position } = useRenderParams({
70
+ alignment,
71
+ direction,
72
+ activatorRef,
73
+ dropElementRef: dropNodeRef,
74
+ host,
75
+ arrowGuardDistance,
76
+ preferredViewport,
77
+ visible: isVisibleDropDown,
78
+ guardDistance,
79
+ occupyAllAvailableViewportHeight,
80
+ dropScrollableContainerRef,
81
+ forcePosition,
82
+ widthEqualToActivator,
83
+ });
84
+ useScrollSubscription(activatorRef, dropNodeRef, isVisibleDropDown);
85
+ useIntersectionSubscription(activatorRef, isVisibleDropDown, ignoreIntersections, () => {
86
+ onClose?.();
87
+ });
88
+ const escapeToCloseRef = useEscapeToClose(onClose);
89
+ const arrowNavigationRef = useArrowNavigation({
90
+ enabled: isVisibleDropDown && arrowNavigation,
91
+ });
92
+ const dropNodeRefCallback = useMultipleRefs(ref, dropNodeRef, arrowNavigationRef, escapeToCloseRef);
93
+ useCloseByClickOutside(dropNodeRef, () => {
94
+ if (isVisibleDropDown && !lockClickOutside && activatorRef.current !== document.activeElement) {
95
+ onClose?.();
96
+ }
97
+ }, closeByClickOutside);
98
+ useEffect(() => {
99
+ if (!isVisibleDropDown) {
100
+ setLockClickOutside(true);
101
+ }
102
+ }, [isVisibleDropDown, setLockClickOutside]);
103
+ useEffect(() => {
104
+ if (autoFocusWhenOpened && isVisibleDropDown && !lockClickOutside) {
105
+ dropNodeRef.current?.focus();
106
+ }
107
+ }, [autoFocusWhenOpened, isVisibleDropDown, lockClickOutside]);
108
+ return (jsx(Fragment, { children: renderPortal &&
109
+ createPortal(jsx(CSSTransition, { in: visible, onEntered: () => {
110
+ setLockClickOutside(false);
111
+ }, timeout: animationTimeout, classNames: animationClassNames, unmountOnExit: true, nodeRef: dropNodeRef, children: jsx("div", { ...props, ...preventBubblingProps, "data-qa": "drop-base", tabIndex: autoFocusWhenOpened ? 0 : -1, className: styles.dropBase, ref: dropNodeRefCallback, style: {
112
+ ...style,
113
+ top: `${metrics.top}px`,
114
+ left: `${metrics.left}px`,
115
+ }, role: role, children: children(position, {
116
+ metrics,
117
+ dropScrollableContainerRef,
118
+ }) }) }), host?.current ?? document.body) }));
119
+ };
120
+ const DropBase = forwardRef(DropBaseComponent);
121
+ DropBase.displayName = 'DropBase';
122
+
123
+ export { DropBase };
124
+ //# sourceMappingURL=DropBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropBase.js","sources":["../src/DropBase.tsx"],"sourcesContent":["import { useEffect, ReactElement, useRef, useState, forwardRef, ForwardedRef, ReactEventHandler } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { useEscapeToClose, useArrowNavigation } 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 { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';\nimport { useIntersectionSubscription } from '@hh.ru/magritte-internal-drop-base/intersectionManager';\nimport { useScrollSubscription } from '@hh.ru/magritte-internal-drop-base/scrollManager';\nimport type {\n DropBaseProps,\n DropBaseHorizontalPosition,\n DropBaseVerticalPosition,\n DropBaseHorizontalPositionWithoutCenter,\n DropBaseVerticalPositionWithoutCenter,\n} from '@hh.ru/magritte-internal-drop-base/types';\nimport { useRenderParams } from '@hh.ru/magritte-internal-drop-base/useRenderParams';\n\nimport styles from './styles.less';\n\nconst EVENTS_TO_PREVENT_BUBBLING = [\n 'onClick',\n 'onContextMenu',\n 'onDoubleClick',\n 'onMouseDown',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseMove',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseUp',\n 'onKeyDown',\n 'onKeyPress',\n 'onKeyUp',\n 'onBlur',\n 'onChange',\n 'onFocus',\n 'onInput',\n 'onInvalid',\n 'onReset',\n 'onSelect',\n 'onSubmit',\n 'onDrag',\n 'onDragEnd',\n 'onDragEnter',\n 'onDragLeave',\n 'onDragOver',\n 'onDragStart',\n 'onDrop',\n 'onCopy',\n 'onCut',\n 'onPaste',\n 'onWheel',\n 'onTouchCancel',\n 'onTouchEnd',\n 'onTouchMove',\n 'onTouchStart',\n] as const;\n\nconst bubblingCancelHandler: ReactEventHandler = (event) => event.stopPropagation();\nconst preventBubblingProps = EVENTS_TO_PREVENT_BUBBLING.reduce((result, eventName) => {\n result[eventName] = bubblingCancelHandler;\n return result;\n}, {} as Record<(typeof EVENTS_TO_PREVENT_BUBBLING)[number], ReactEventHandler>);\n\nconst DropBaseComponent = <\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>(\n {\n visible,\n children,\n arrowGuardDistance,\n activatorRef,\n host,\n alignment,\n direction,\n preferredViewport,\n onClose,\n autoFocusWhenOpened = false,\n closeByClickOutside = true,\n animationTimeout,\n animationClassNames,\n guardDistance = 8,\n role,\n occupyAllAvailableViewportHeight = false,\n forcePosition = false,\n widthEqualToActivator = false,\n arrowNavigation = false,\n ignoreIntersections = false,\n style = {},\n ...props\n }: DropBaseProps<T>,\n ref: ForwardedRef<HTMLElement>\n): ReactElement => {\n const dropNodeRef = useRef<HTMLDivElement>(null);\n const dropScrollableContainerRef = useRef(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 { metrics, position } = useRenderParams({\n alignment,\n direction,\n activatorRef,\n dropElementRef: dropNodeRef,\n host,\n arrowGuardDistance,\n preferredViewport,\n visible: isVisibleDropDown,\n guardDistance,\n occupyAllAvailableViewportHeight,\n dropScrollableContainerRef,\n forcePosition,\n widthEqualToActivator,\n });\n\n useScrollSubscription(activatorRef, dropNodeRef, isVisibleDropDown);\n useIntersectionSubscription(activatorRef, isVisibleDropDown, ignoreIntersections, () => {\n onClose?.();\n });\n\n const escapeToCloseRef = useEscapeToClose(onClose);\n const arrowNavigationRef = useArrowNavigation({\n enabled: isVisibleDropDown && arrowNavigation,\n });\n const dropNodeRefCallback = useMultipleRefs(ref, dropNodeRef, arrowNavigationRef, escapeToCloseRef);\n\n useCloseByClickOutside(\n dropNodeRef,\n () => {\n if (isVisibleDropDown && !lockClickOutside && activatorRef.current !== document.activeElement) {\n onClose?.();\n }\n },\n closeByClickOutside\n );\n\n useEffect(() => {\n if (!isVisibleDropDown) {\n setLockClickOutside(true);\n }\n }, [isVisibleDropDown, setLockClickOutside]);\n\n useEffect(() => {\n if (autoFocusWhenOpened && isVisibleDropDown && !lockClickOutside) {\n dropNodeRef.current?.focus();\n }\n }, [autoFocusWhenOpened, isVisibleDropDown, lockClickOutside]);\n\n return (\n <>\n {renderPortal &&\n createPortal(\n <CSSTransition\n in={visible}\n onEntered={() => {\n setLockClickOutside(false);\n }}\n timeout={animationTimeout}\n classNames={animationClassNames}\n unmountOnExit\n nodeRef={dropNodeRef}\n >\n <div\n {...props}\n {...preventBubblingProps}\n data-qa=\"drop-base\"\n tabIndex={autoFocusWhenOpened ? 0 : -1}\n className={styles.dropBase}\n ref={dropNodeRefCallback}\n style={{\n ...style,\n top: `${metrics.top}px`,\n left: `${metrics.left}px`,\n }}\n role={role}\n >\n {children(position, {\n metrics,\n dropScrollableContainerRef,\n })}\n </div>\n </CSSTransition>,\n host?.current ?? document.body\n )}\n </>\n );\n};\n\nconst DropBase = forwardRef(DropBaseComponent) as (<\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>(\n props: DropBaseProps<T> & { ref?: ForwardedRef<HTMLElement> }\n) => ReactElement) & { displayName: string };\n\nDropBase.displayName = 'DropBase';\n\nexport { DropBase };\n"],"names":["_jsx"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { BaseAlignPosition, CalculateRect, CalculateRectType, DropBaseHorizontalPosition, DropBaseVerticalPosition } from './types';
2
+ export declare const VIEWPORT_GUARD_DISTANCE = 16;
3
+ /**
4
+ * API для расчета метрик дропдауна и viewport | контейнера в котором
5
+ * хотим рисовать дропдаун. Cчитает метрики в случае - когда direction = VerticalPosition.
6
+ * Т.е. дропдаун показываем снизу или сверху активатора.
7
+ * Предоставляем три публичных метода для расположения относительно края активатора:
8
+ * left - выравнивание по левому краю
9
+ * right - выравнивание по правому краю
10
+ * center - выравнивание по центру
11
+ * */
12
+ export declare const calculateRectForVerticalPosition: {
13
+ left: CalculateRect<DropBaseVerticalPosition['direction']>;
14
+ right: CalculateRect<DropBaseVerticalPosition['direction']>;
15
+ center: CalculateRect<DropBaseVerticalPosition['direction']>;
16
+ _baseAlign: BaseAlignPosition<DropBaseVerticalPosition['direction']>;
17
+ };
18
+ export declare const calculateRect: CalculateRectType<DropBaseHorizontalPosition> & CalculateRectType<DropBaseVerticalPosition>;
@@ -0,0 +1,319 @@
1
+ import './index.css';
2
+ const VIEWPORT_GUARD_DISTANCE = 16;
3
+ const getPointToCenterActivator = ({ point, offsetPoint, contentSize, activatorSize, }) => point + offsetPoint - contentSize / 2 + activatorSize / 2;
4
+ /* Позволяет получить метрики drop, позицию относительно viewport
5
+ * для случая, когда дроп может занять всю доступную высоту viewport
6
+ * */
7
+ const calculateDropHeightAvailableViewport = {
8
+ top: ({ leftPositionForDrop, topPositionForViewport, preferredViewportMetrics, topPositionForDrop, dropMetrics, }) => {
9
+ const top = -(topPositionForViewport - preferredViewportMetrics.pageTop - topPositionForDrop) + VIEWPORT_GUARD_DISTANCE;
10
+ const _height = topPositionForViewport + dropMetrics.height - preferredViewportMetrics.pageTop - VIEWPORT_GUARD_DISTANCE;
11
+ const height = _height < dropMetrics.height ? dropMetrics.height : _height;
12
+ const _topPositionForViewport = topPositionForViewport + dropMetrics.height - height;
13
+ return {
14
+ top,
15
+ height,
16
+ left: leftPositionForDrop,
17
+ topPositionForViewport: _topPositionForViewport,
18
+ };
19
+ },
20
+ bottom: ({ leftPositionForDrop, topPositionForViewport, preferredViewportMetrics, topPositionForDrop, dropMetrics, }) => {
21
+ const _height = preferredViewportMetrics.height +
22
+ preferredViewportMetrics.pageTop -
23
+ topPositionForViewport -
24
+ VIEWPORT_GUARD_DISTANCE;
25
+ const height = _height < dropMetrics.height ? dropMetrics.height : _height;
26
+ return {
27
+ top: topPositionForDrop,
28
+ left: leftPositionForDrop,
29
+ height,
30
+ topPositionForViewport,
31
+ };
32
+ },
33
+ };
34
+ /**
35
+ * Позволяет получить метрику top или left дропдауна и viewport или
36
+ * контейнера в котором хотим рисовать дропдаун. Считать нужно
37
+ * для top или left в зависимости от того противоположна ли метрика
38
+ * к direction. Т.е мы считает метрику top только
39
+ * для горизонтального направления, a left для вертикального
40
+ * */
41
+ const getEdgeOppositeDirection = ({ activatorPosition, viewportShift, activatorOffset, shift, isNegativeArrowShift, arrowGuardDistance, activatorSize, }) => {
42
+ let shiftArrow = 0;
43
+ if (arrowGuardDistance && activatorSize / 2 < arrowGuardDistance) {
44
+ shiftArrow = arrowGuardDistance - activatorSize / 2;
45
+ }
46
+ if (isNegativeArrowShift) {
47
+ shiftArrow = -shiftArrow;
48
+ }
49
+ const positionForDrop = shift + activatorOffset + shiftArrow;
50
+ const positionForViewport = shift + activatorPosition + viewportShift + shiftArrow;
51
+ return [positionForDrop, positionForViewport];
52
+ };
53
+ /**
54
+ * Позволяет получить метрику top или left дропдауна и viewport
55
+ * или контейнера в котором хотим рисовать дропдаун. Считать нужно для top
56
+ * или left в зависимости от того совпдает ли метрика с direction.
57
+ * Т.е мы считает метрику top только для вертикального направления, a left
58
+ * для горизонтального направления
59
+ * */
60
+ const getEageCoincidingWithDirection = ({ activatorPosition, activatorSize, dropSize, viewportShift, isNegativePosition, activatorOffset, guardDistance, }) => {
61
+ let positionForViewport = 0;
62
+ let positionForDrop = 0;
63
+ if (isNegativePosition) {
64
+ positionForDrop = activatorOffset - guardDistance - dropSize;
65
+ positionForViewport = activatorPosition + viewportShift - guardDistance - dropSize;
66
+ }
67
+ else {
68
+ positionForDrop = activatorOffset + activatorSize + guardDistance;
69
+ positionForViewport = activatorPosition + viewportShift + activatorSize + guardDistance;
70
+ }
71
+ return [positionForDrop, positionForViewport];
72
+ };
73
+ /**
74
+ * API для расчета метрик дропдауна и viewport | контейнера в котором
75
+ * хотим рисовать дропдаун. Cчитает метрики в случае
76
+ * когда position = Horizontal.
77
+ * Т.е. дропдаун показываем cлева или справа от активатора.
78
+ * Предоставляем три публичных метода для расположения относительно края активатора:
79
+ * top - выравнивание по верхнему краю
80
+ * bottom - выравнивание по нижнему краю
81
+ * center - выравнивание по центру
82
+ * */
83
+ const calculateRectForHorizontalPosition = {
84
+ top({ activatorMetrics, dropMetrics, viewportMetrics, preferredViewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, }) {
85
+ const result = this._baseAlign({
86
+ activatorMetrics,
87
+ dropMetrics,
88
+ viewportMetrics,
89
+ direction,
90
+ isNegativeArrowShift: true,
91
+ activatorOffset,
92
+ shift: 0,
93
+ arrowGuardDistance,
94
+ guardDistance,
95
+ preferredViewportMetrics,
96
+ });
97
+ if (occupyAllAvailableViewportHeight) {
98
+ const metrics = calculateDropHeightAvailableViewport.bottom({
99
+ preferredViewportMetrics,
100
+ topPositionForViewport: result.top,
101
+ topPositionForDrop: result.dropMetrics.top,
102
+ leftPositionForDrop: result.dropMetrics.left,
103
+ dropMetrics,
104
+ });
105
+ return {
106
+ ...result,
107
+ top: metrics.topPositionForViewport,
108
+ bottom: metrics.topPositionForViewport + metrics.height,
109
+ dropMetrics: {
110
+ top: metrics.top,
111
+ left: metrics.left,
112
+ height: metrics.height,
113
+ },
114
+ };
115
+ }
116
+ return result;
117
+ },
118
+ bottom({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
119
+ const shift = dropMetrics.height - activatorMetrics.height;
120
+ const result = this._baseAlign({
121
+ activatorMetrics,
122
+ dropMetrics,
123
+ viewportMetrics,
124
+ direction,
125
+ activatorOffset,
126
+ shift: -shift,
127
+ arrowGuardDistance,
128
+ guardDistance,
129
+ preferredViewportMetrics,
130
+ });
131
+ if (occupyAllAvailableViewportHeight) {
132
+ const metrics = calculateDropHeightAvailableViewport.top({
133
+ preferredViewportMetrics,
134
+ topPositionForViewport: result.top,
135
+ topPositionForDrop: result.dropMetrics.top,
136
+ leftPositionForDrop: result.dropMetrics.left,
137
+ dropMetrics,
138
+ });
139
+ return {
140
+ top: metrics.topPositionForViewport,
141
+ left: result.left,
142
+ bottom: activatorMetrics.bottom,
143
+ right: result.right,
144
+ viewportMetrics,
145
+ dropMetrics: {
146
+ top: metrics.top,
147
+ left: metrics.left,
148
+ height: metrics.height,
149
+ },
150
+ };
151
+ }
152
+ return result;
153
+ },
154
+ center({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, preferredViewportMetrics, }) {
155
+ const pointToCenterActivator = getPointToCenterActivator({
156
+ point: 0,
157
+ offsetPoint: 0,
158
+ contentSize: dropMetrics.height,
159
+ activatorSize: activatorMetrics.height,
160
+ });
161
+ return this._baseAlign({
162
+ activatorMetrics,
163
+ dropMetrics,
164
+ viewportMetrics,
165
+ direction,
166
+ activatorOffset,
167
+ shift: pointToCenterActivator,
168
+ guardDistance,
169
+ preferredViewportMetrics,
170
+ });
171
+ },
172
+ _baseAlign({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, shift, arrowGuardDistance, isNegativeArrowShift = false, guardDistance, }) {
173
+ const [leftPositionForDrop, leftPositionForViewport] = getEageCoincidingWithDirection({
174
+ activatorPosition: activatorMetrics.left,
175
+ activatorSize: activatorMetrics.width,
176
+ dropSize: dropMetrics.width,
177
+ viewportShift: viewportMetrics.pageLeft,
178
+ isNegativePosition: direction === 'left',
179
+ activatorOffset: activatorOffset.offsetLeft,
180
+ guardDistance,
181
+ });
182
+ const [topPositionForDrop, topPositionForViewport] = getEdgeOppositeDirection({
183
+ activatorPosition: activatorMetrics.top,
184
+ viewportShift: viewportMetrics.pageTop,
185
+ activatorOffset: activatorOffset.offsetTop,
186
+ isNegativeArrowShift,
187
+ shift,
188
+ arrowGuardDistance,
189
+ activatorSize: activatorMetrics.height,
190
+ });
191
+ return {
192
+ top: topPositionForViewport,
193
+ left: leftPositionForViewport,
194
+ bottom: topPositionForViewport + dropMetrics.height,
195
+ right: leftPositionForViewport + dropMetrics.width,
196
+ dropMetrics: {
197
+ top: topPositionForDrop,
198
+ left: leftPositionForDrop,
199
+ height: 'auto',
200
+ },
201
+ viewportMetrics,
202
+ };
203
+ },
204
+ };
205
+ /**
206
+ * API для расчета метрик дропдауна и viewport | контейнера в котором
207
+ * хотим рисовать дропдаун. Cчитает метрики в случае - когда direction = VerticalPosition.
208
+ * Т.е. дропдаун показываем снизу или сверху активатора.
209
+ * Предоставляем три публичных метода для расположения относительно края активатора:
210
+ * left - выравнивание по левому краю
211
+ * right - выравнивание по правому краю
212
+ * center - выравнивание по центру
213
+ * */
214
+ const calculateRectForVerticalPosition = {
215
+ left({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
216
+ return this._baseAlign({
217
+ activatorMetrics,
218
+ dropMetrics,
219
+ viewportMetrics,
220
+ direction,
221
+ activatorOffset,
222
+ shift: 0,
223
+ isNegativeArrowShift: true,
224
+ guardDistance,
225
+ arrowGuardDistance,
226
+ occupyAllAvailableViewportHeight,
227
+ preferredViewportMetrics,
228
+ });
229
+ },
230
+ right({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, arrowGuardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
231
+ return this._baseAlign({
232
+ activatorMetrics,
233
+ dropMetrics,
234
+ viewportMetrics,
235
+ direction,
236
+ activatorOffset,
237
+ shift: -(dropMetrics.width - activatorMetrics.width),
238
+ arrowGuardDistance,
239
+ guardDistance,
240
+ occupyAllAvailableViewportHeight,
241
+ preferredViewportMetrics,
242
+ });
243
+ },
244
+ center({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, guardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
245
+ const pointToCenterActivator = getPointToCenterActivator({
246
+ point: 0,
247
+ offsetPoint: 0,
248
+ contentSize: dropMetrics.width,
249
+ activatorSize: activatorMetrics.width,
250
+ });
251
+ return this._baseAlign({
252
+ activatorMetrics,
253
+ dropMetrics,
254
+ viewportMetrics,
255
+ direction,
256
+ activatorOffset,
257
+ shift: pointToCenterActivator,
258
+ guardDistance,
259
+ occupyAllAvailableViewportHeight,
260
+ preferredViewportMetrics,
261
+ });
262
+ },
263
+ _baseAlign({ activatorMetrics, dropMetrics, viewportMetrics, direction, activatorOffset, shift, arrowGuardDistance, isNegativeArrowShift = false, guardDistance, occupyAllAvailableViewportHeight, preferredViewportMetrics, }) {
264
+ const [topPositionForDrop, topPositionForViewport] = getEageCoincidingWithDirection({
265
+ activatorPosition: activatorMetrics.top,
266
+ activatorSize: activatorMetrics.height,
267
+ dropSize: dropMetrics.height,
268
+ viewportShift: viewportMetrics.pageTop,
269
+ isNegativePosition: direction !== 'bottom',
270
+ activatorOffset: activatorOffset.offsetTop,
271
+ guardDistance,
272
+ });
273
+ const [leftPositionForDrop, leftPositionForViewport] = getEdgeOppositeDirection({
274
+ activatorPosition: activatorMetrics.left,
275
+ viewportShift: viewportMetrics.pageLeft,
276
+ activatorOffset: activatorOffset.offsetLeft,
277
+ shift,
278
+ isNegativeArrowShift,
279
+ arrowGuardDistance,
280
+ activatorSize: activatorMetrics.width,
281
+ });
282
+ let metrics = {
283
+ topPositionForViewport,
284
+ top: topPositionForDrop,
285
+ left: leftPositionForDrop,
286
+ height: 0,
287
+ };
288
+ if (occupyAllAvailableViewportHeight) {
289
+ metrics = calculateDropHeightAvailableViewport[direction]({
290
+ topPositionForViewport,
291
+ preferredViewportMetrics,
292
+ topPositionForDrop,
293
+ dropMetrics,
294
+ leftPositionForDrop,
295
+ });
296
+ }
297
+ return {
298
+ top: metrics.topPositionForViewport,
299
+ left: leftPositionForViewport,
300
+ bottom: metrics.topPositionForViewport + (metrics.height !== 0 ? metrics.height : dropMetrics.height),
301
+ right: leftPositionForViewport + dropMetrics.width,
302
+ dropMetrics: {
303
+ top: metrics.top,
304
+ left: metrics.left,
305
+ height: metrics.height !== 0 ? metrics.height : 'auto',
306
+ },
307
+ viewportMetrics,
308
+ };
309
+ },
310
+ };
311
+ const calculateRect = {
312
+ left: calculateRectForHorizontalPosition,
313
+ right: calculateRectForHorizontalPosition,
314
+ top: calculateRectForVerticalPosition,
315
+ bottom: calculateRectForVerticalPosition,
316
+ };
317
+
318
+ export { VIEWPORT_GUARD_DISTANCE, calculateRect, calculateRectForVerticalPosition };
319
+ //# sourceMappingURL=calculateRect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculateRect.js","sources":["../src/calculateRect.ts"],"sourcesContent":["import {\n BaseAlignPosition,\n GetEageCoincidingWithDirectionArgs,\n GetEdgeOppositeDirectionArgs,\n GetPointToCenterActivator,\n CalculateRect,\n CalculateRectType,\n CalculateDropHeightAvailableViewportArgs,\n CalculateDropHeightAvailableViewportResult,\n DropBaseHorizontalPosition,\n DropBaseVerticalPosition,\n} from '@hh.ru/magritte-internal-drop-base/types';\n\nexport const VIEWPORT_GUARD_DISTANCE = 16;\n\nconst getPointToCenterActivator = ({\n point,\n offsetPoint,\n contentSize,\n activatorSize,\n}: GetPointToCenterActivator): number => point + offsetPoint - contentSize / 2 + activatorSize / 2;\n\n/* Позволяет получить метрики drop, позицию относительно viewport\n * для случая, когда дроп может занять всю доступную высоту viewport\n * */\nconst calculateDropHeightAvailableViewport: {\n top: CalculateDropHeightAvailableViewportArgs;\n bottom: CalculateDropHeightAvailableViewportArgs;\n} = {\n top: ({\n leftPositionForDrop,\n topPositionForViewport,\n preferredViewportMetrics,\n topPositionForDrop,\n dropMetrics,\n }) => {\n const top =\n -(topPositionForViewport - preferredViewportMetrics.pageTop - topPositionForDrop) + VIEWPORT_GUARD_DISTANCE;\n const _height =\n topPositionForViewport + dropMetrics.height - preferredViewportMetrics.pageTop - VIEWPORT_GUARD_DISTANCE;\n const height = _height < dropMetrics.height ? dropMetrics.height : _height;\n const _topPositionForViewport = topPositionForViewport + dropMetrics.height - height;\n\n return {\n top,\n height,\n left: leftPositionForDrop,\n topPositionForViewport: _topPositionForViewport,\n };\n },\n\n bottom: ({\n leftPositionForDrop,\n topPositionForViewport,\n preferredViewportMetrics,\n topPositionForDrop,\n dropMetrics,\n }) => {\n const _height =\n preferredViewportMetrics.height +\n preferredViewportMetrics.pageTop -\n topPositionForViewport -\n VIEWPORT_GUARD_DISTANCE;\n const height = _height < dropMetrics.height ? dropMetrics.height : _height;\n\n return {\n top: topPositionForDrop,\n left: leftPositionForDrop,\n height,\n topPositionForViewport,\n };\n },\n};\n\n/**\n * Позволяет получить метрику top или left дропдауна и viewport или\n * контейнера в котором хотим рисовать дропдаун. Считать нужно\n * для top или left в зависимости от того противоположна ли метрика\n * к direction. Т.е мы считает метрику top только\n * для горизонтального направления, a left для вертикального\n * */\nconst getEdgeOppositeDirection = ({\n activatorPosition,\n viewportShift,\n activatorOffset,\n shift,\n isNegativeArrowShift,\n arrowGuardDistance,\n activatorSize,\n}: GetEdgeOppositeDirectionArgs): [number, number] => {\n let shiftArrow = 0;\n\n if (arrowGuardDistance && activatorSize / 2 < arrowGuardDistance) {\n shiftArrow = arrowGuardDistance - activatorSize / 2;\n }\n\n if (isNegativeArrowShift) {\n shiftArrow = -shiftArrow;\n }\n\n const positionForDrop = shift + activatorOffset + shiftArrow;\n const positionForViewport = shift + activatorPosition + viewportShift + shiftArrow;\n\n return [positionForDrop, positionForViewport];\n};\n\n/**\n * Позволяет получить метрику top или left дропдауна и viewport\n * или контейнера в котором хотим рисовать дропдаун. Считать нужно для top\n * или left в зависимости от того совпдает ли метрика с direction.\n * Т.е мы считает метрику top только для вертикального направления, a left\n * для горизонтального направления\n * */\nconst getEageCoincidingWithDirection = ({\n activatorPosition,\n activatorSize,\n dropSize,\n viewportShift,\n isNegativePosition,\n activatorOffset,\n guardDistance,\n}: GetEageCoincidingWithDirectionArgs): [number, number] => {\n let positionForViewport = 0;\n let positionForDrop = 0;\n\n if (isNegativePosition) {\n positionForDrop = activatorOffset - guardDistance - dropSize;\n positionForViewport = activatorPosition + viewportShift - guardDistance - dropSize;\n } else {\n positionForDrop = activatorOffset + activatorSize + guardDistance;\n positionForViewport = activatorPosition + viewportShift + activatorSize + guardDistance;\n }\n\n return [positionForDrop, positionForViewport];\n};\n\n/**\n * API для расчета метрик дропдауна и viewport | контейнера в котором\n * хотим рисовать дропдаун. Cчитает метрики в случае\n * когда position = Horizontal.\n * Т.е. дропдаун показываем cлева или справа от активатора.\n * Предоставляем три публичных метода для расположения относительно края активатора:\n * top - выравнивание по верхнему краю\n * bottom - выравнивание по нижнему краю\n * center - выравнивание по центру\n * */\nconst calculateRectForHorizontalPosition: {\n top: CalculateRect<DropBaseHorizontalPosition['direction']>;\n bottom: CalculateRect<DropBaseHorizontalPosition['direction']>;\n center: CalculateRect<DropBaseHorizontalPosition['direction']>;\n _baseAlign: BaseAlignPosition<DropBaseHorizontalPosition['direction']>;\n} = {\n top({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n preferredViewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n }) {\n const result = this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n isNegativeArrowShift: true,\n activatorOffset,\n shift: 0,\n arrowGuardDistance,\n guardDistance,\n preferredViewportMetrics,\n });\n\n if (occupyAllAvailableViewportHeight) {\n const metrics = calculateDropHeightAvailableViewport.bottom({\n preferredViewportMetrics,\n topPositionForViewport: result.top,\n topPositionForDrop: result.dropMetrics.top,\n leftPositionForDrop: result.dropMetrics.left,\n dropMetrics,\n });\n\n return {\n ...result,\n top: metrics.topPositionForViewport,\n bottom: metrics.topPositionForViewport + metrics.height,\n dropMetrics: {\n top: metrics.top,\n left: metrics.left,\n height: metrics.height,\n },\n };\n }\n\n return result;\n },\n bottom({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n const shift = dropMetrics.height - activatorMetrics.height;\n const result = this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: -shift,\n arrowGuardDistance,\n guardDistance,\n preferredViewportMetrics,\n });\n\n if (occupyAllAvailableViewportHeight) {\n const metrics = calculateDropHeightAvailableViewport.top({\n preferredViewportMetrics,\n topPositionForViewport: result.top,\n topPositionForDrop: result.dropMetrics.top,\n leftPositionForDrop: result.dropMetrics.left,\n dropMetrics,\n });\n\n return {\n top: metrics.topPositionForViewport,\n left: result.left,\n bottom: activatorMetrics.bottom,\n right: result.right,\n viewportMetrics,\n dropMetrics: {\n top: metrics.top,\n left: metrics.left,\n height: metrics.height,\n },\n };\n }\n\n return result;\n },\n center({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n preferredViewportMetrics,\n }) {\n const pointToCenterActivator = getPointToCenterActivator({\n point: 0,\n offsetPoint: 0,\n contentSize: dropMetrics.height,\n activatorSize: activatorMetrics.height,\n });\n\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: pointToCenterActivator,\n guardDistance,\n preferredViewportMetrics,\n });\n },\n _baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift,\n arrowGuardDistance,\n isNegativeArrowShift = false,\n guardDistance,\n }) {\n const [leftPositionForDrop, leftPositionForViewport] = getEageCoincidingWithDirection({\n activatorPosition: activatorMetrics.left,\n activatorSize: activatorMetrics.width,\n dropSize: dropMetrics.width,\n viewportShift: viewportMetrics.pageLeft,\n isNegativePosition: direction === 'left',\n activatorOffset: activatorOffset.offsetLeft,\n guardDistance,\n });\n\n const [topPositionForDrop, topPositionForViewport] = getEdgeOppositeDirection({\n activatorPosition: activatorMetrics.top,\n viewportShift: viewportMetrics.pageTop,\n activatorOffset: activatorOffset.offsetTop,\n isNegativeArrowShift,\n shift,\n arrowGuardDistance,\n activatorSize: activatorMetrics.height,\n });\n\n return {\n top: topPositionForViewport,\n left: leftPositionForViewport,\n bottom: topPositionForViewport + dropMetrics.height,\n right: leftPositionForViewport + dropMetrics.width,\n dropMetrics: {\n top: topPositionForDrop,\n left: leftPositionForDrop,\n height: 'auto',\n },\n viewportMetrics,\n };\n },\n};\n\n/**\n * API для расчета метрик дропдауна и viewport | контейнера в котором\n * хотим рисовать дропдаун. Cчитает метрики в случае - когда direction = VerticalPosition.\n * Т.е. дропдаун показываем снизу или сверху активатора.\n * Предоставляем три публичных метода для расположения относительно края активатора:\n * left - выравнивание по левому краю\n * right - выравнивание по правому краю\n * center - выравнивание по центру\n * */\nexport const calculateRectForVerticalPosition: {\n left: CalculateRect<DropBaseVerticalPosition['direction']>;\n right: CalculateRect<DropBaseVerticalPosition['direction']>;\n center: CalculateRect<DropBaseVerticalPosition['direction']>;\n _baseAlign: BaseAlignPosition<DropBaseVerticalPosition['direction']>;\n} = {\n left({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: 0,\n isNegativeArrowShift: true,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n });\n },\n right({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: -(dropMetrics.width - activatorMetrics.width),\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n });\n },\n center({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n const pointToCenterActivator = getPointToCenterActivator({\n point: 0,\n offsetPoint: 0,\n contentSize: dropMetrics.width,\n activatorSize: activatorMetrics.width,\n });\n\n return this._baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift: pointToCenterActivator,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n });\n },\n _baseAlign({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n activatorOffset,\n shift,\n arrowGuardDistance,\n isNegativeArrowShift = false,\n guardDistance,\n occupyAllAvailableViewportHeight,\n preferredViewportMetrics,\n }) {\n const [topPositionForDrop, topPositionForViewport] = getEageCoincidingWithDirection({\n activatorPosition: activatorMetrics.top,\n activatorSize: activatorMetrics.height,\n dropSize: dropMetrics.height,\n viewportShift: viewportMetrics.pageTop,\n isNegativePosition: direction !== 'bottom',\n activatorOffset: activatorOffset.offsetTop,\n guardDistance,\n });\n\n const [leftPositionForDrop, leftPositionForViewport] = getEdgeOppositeDirection({\n activatorPosition: activatorMetrics.left,\n viewportShift: viewportMetrics.pageLeft,\n activatorOffset: activatorOffset.offsetLeft,\n shift,\n isNegativeArrowShift,\n arrowGuardDistance,\n activatorSize: activatorMetrics.width,\n });\n\n let metrics: CalculateDropHeightAvailableViewportResult = {\n topPositionForViewport,\n top: topPositionForDrop,\n left: leftPositionForDrop,\n height: 0,\n };\n\n if (occupyAllAvailableViewportHeight) {\n metrics = calculateDropHeightAvailableViewport[direction]({\n topPositionForViewport,\n preferredViewportMetrics,\n topPositionForDrop,\n dropMetrics,\n leftPositionForDrop,\n });\n }\n\n return {\n top: metrics.topPositionForViewport,\n left: leftPositionForViewport,\n bottom: metrics.topPositionForViewport + (metrics.height !== 0 ? metrics.height : dropMetrics.height),\n right: leftPositionForViewport + dropMetrics.width,\n dropMetrics: {\n top: metrics.top,\n left: metrics.left,\n height: metrics.height !== 0 ? metrics.height : 'auto',\n },\n viewportMetrics,\n };\n },\n};\n\nexport const calculateRect: CalculateRectType<DropBaseHorizontalPosition> &\n CalculateRectType<DropBaseVerticalPosition> = {\n left: calculateRectForHorizontalPosition,\n right: calculateRectForHorizontalPosition,\n top: calculateRectForVerticalPosition,\n bottom: calculateRectForVerticalPosition,\n};\n"],"names":[],"mappings":"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"}
package/index.css ADDED
@@ -0,0 +1,4 @@
1
+ .magritte-drop-base___uJNG4_5-0-4{
2
+ position:absolute;
3
+ outline:none;
4
+ }
package/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './DropBase';
2
+ export type { DropBaseProps, ArrowGuardDistance, DropBasePermanentProps, DropBaseHorizontalPosition, DropBaseVerticalPosition, DropBaseHorizontalPositionWithoutCenter, DropBaseVerticalPositionWithoutCenter, } from './types';
3
+ export { INITIAL_HEIGHT_VALUE } from './useRenderParams';
package/index.js ADDED
@@ -0,0 +1,17 @@
1
+ import './index.css';
2
+ export { DropBase } from './DropBase.js';
3
+ export { INITIAL_HEIGHT_VALUE } from './useRenderParams.js';
4
+ import 'react/jsx-runtime';
5
+ import 'react';
6
+ import 'react-dom';
7
+ import 'react-transition-group';
8
+ import '@hh.ru/magritte-common-keyboard';
9
+ import '@hh.ru/magritte-common-mouse';
10
+ import '@hh.ru/magritte-common-use-multiple-refs';
11
+ import '@hh.ru/magritte-common-use-when-font-loaded';
12
+ import './intersectionManager.js';
13
+ import './scrollManager.js';
14
+ import '@hh.ru/magritte-common-func-utils';
15
+ import '@hh.ru/magritte-common-metrics';
16
+ import './calculateRect.js';
17
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ import { RefObject } from 'react';
2
+ export declare const useIntersectionSubscription: (activatorRef: RefObject<HTMLElement>, isVisible: boolean, ignore: boolean, callback: VoidFunction) => void;