@hh.ru/magritte-internal-drop-base 7.0.3 → 7.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.js CHANGED
@@ -11,10 +11,9 @@ 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
13
  import './findBestFitPlacement.js';
14
- import '@hh.ru/magritte-common-metrics';
15
14
  import './useMonitorResize.js';
16
15
 
17
- var styles = {"drop-base":"magritte-drop-base___uJNG4_7-0-3","dropBase":"magritte-drop-base___uJNG4_7-0-3"};
16
+ var styles = {"drop-base":"magritte-drop-base___uJNG4_7-0-4","dropBase":"magritte-drop-base___uJNG4_7-0-4"};
18
17
 
19
18
  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) => {
20
19
  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":"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"}
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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"}
@@ -1,10 +1,8 @@
1
1
  import './index.css';
2
- import { getViewportSpaceDOMRectWithoutTransform } from '@hh.ru/magritte-common-metrics';
3
-
4
2
  const getMetrics = ({ activatorRef, customViewport, dropRef }) => {
5
3
  let activatorRect = new DOMRect();
6
4
  if (activatorRef.current) {
7
- activatorRect = getViewportSpaceDOMRectWithoutTransform(activatorRef.current);
5
+ activatorRect = activatorRef.current.getBoundingClientRect();
8
6
  }
9
7
  const viewportRect = customViewport && customViewport.current
10
8
  ? customViewport.current.getBoundingClientRect()
@@ -1 +1 @@
1
- {"version":3,"file":"findBestFitPlacement.js","sources":["../src/findBestFitPlacement.ts"],"sourcesContent":["import { RefObject } from 'react';\n\nimport { getViewportSpaceDOMRectWithoutTransform } from '@hh.ru/magritte-common-metrics';\nimport {\n ActivatorElementType,\n Placement,\n VerticalDirection,\n HorizontalDirection,\n AlignmentForVerticalDirection,\n AlignmentForHorizontalDirection,\n ArrowGuardDistance,\n ParsedPlacement,\n} from '@hh.ru/magritte-internal-drop-base/types';\n\ninterface GetMetricsFunc {\n (args: {\n activatorRef: RefObject<ActivatorElementType>;\n customViewport?: RefObject<HTMLElement>;\n dropRef: RefObject<HTMLElement>;\n }): {\n activatorRect: DOMRect;\n viewportRect: DOMRect;\n offsetParentRect: DOMRect;\n };\n}\n\nexport const getMetrics: GetMetricsFunc = ({ activatorRef, customViewport, dropRef }) => {\n let activatorRect: DOMRect = new DOMRect();\n\n if (activatorRef.current) {\n activatorRect = getViewportSpaceDOMRectWithoutTransform(activatorRef.current);\n }\n const viewportRect =\n customViewport && customViewport.current\n ? customViewport.current.getBoundingClientRect()\n : DOMRect.fromRect({\n width: window.visualViewport?.width,\n height: window.visualViewport?.height,\n x: 0,\n y: 0,\n });\n const offsetParentRect = dropRef.current?.offsetParent?.getBoundingClientRect() || new DOMRect();\n\n return { activatorRect, viewportRect, offsetParentRect };\n};\n\nconst parsePlacement = (\n placement: Placement\n): [VerticalDirection | HorizontalDirection, AlignmentForHorizontalDirection | AlignmentForVerticalDirection] => {\n return placement.split('-') as [\n VerticalDirection | HorizontalDirection,\n AlignmentForHorizontalDirection | AlignmentForVerticalDirection\n ];\n};\n\ntype Rect = { left: number; top: number; width: number; height: number; right: number; bottom: number };\n// Возвращает описание прямоугольника и размеры и позицию правой и нижней стороны, при этом позволяет не указывать\n// в аргументах либо размеры, либо позицию правой и нижней стороны\nconst createRect = (args: {\n left: number;\n top: number;\n width?: number;\n height?: number;\n right?: number;\n bottom?: number;\n}) => ({\n left: args.left,\n top: args.top,\n width: args.width || (args?.right || 0) - args.left,\n height: args.height || (args?.bottom || 0) - args.top,\n right: args.right || (args?.width || 0) + args.left,\n bottom: args.bottom || (args?.height || 0) + args.top,\n});\n\ninterface GetAvailableRectsForPlacementsFunc {\n (args: { placements: Placement[]; activatorRect: DOMRect; viewportRect: DOMRect }): { [key in Placement]: Rect };\n}\n\nconst getAvailableRectsForPlacements: GetAvailableRectsForPlacementsFunc = ({\n placements,\n activatorRect,\n viewportRect,\n}) => {\n // Вычисляем содержащий прямоугольник для свободного пространство с каждой из сторон от активатора\n // https://excalidraw.com/#json=3O9770_G2g6lkJuIftLiQ,2ZRIYkXrSjCpobPS5Ufh7w\n const freeSpaceBySide = {\n top: () =>\n createRect({\n left: viewportRect.x,\n top: viewportRect.y,\n width: viewportRect.width,\n height: activatorRect.top - viewportRect.top,\n }),\n right: () =>\n createRect({\n left: activatorRect.right,\n top: viewportRect.top,\n width: viewportRect.right - activatorRect.right,\n height: viewportRect.height,\n }),\n bottom: () =>\n createRect({\n left: viewportRect.x,\n top: activatorRect.bottom,\n width: viewportRect.width,\n height: viewportRect.bottom - activatorRect.bottom,\n }),\n left: () =>\n createRect({\n left: viewportRect.x,\n top: viewportRect.y,\n width: activatorRect.left - viewportRect.left,\n height: viewportRect.height,\n }),\n };\n\n // Для каждого варианта позиционирования вычисляем содержащий прямоугольник доступного пространства\n // с учетом позиции активатора и границ вьюпорта\n return placements.reduce((acc, placement) => {\n const [direction, alignment] = parsePlacement(placement);\n\n const freeSpace = freeSpaceBySide[direction]();\n acc[placement] = freeSpace;\n\n // Берем свободное пространство с той стороны от активатора куда должен выпасть дроп\n // и устанавливает позицию стороны соответствующей alignment равно позиции той же стороны активатора.\n // На схеме понятнее откуда берется эта логика:\n // https://excalidraw.com/#json=cTKcB__3Oi3U3lF1Z4FLk,6jWpaYZLXePae-FDUbC9PQ\n if (alignment !== 'center') {\n acc[placement][alignment] = activatorRect[alignment];\n acc[placement] = createRect({ ...acc[placement], width: undefined, height: undefined });\n }\n return acc;\n }, {} as { [key in Placement]: Rect });\n};\n\nconst vertPlacement = ['top', 'bottom'];\nconst axisStartAlignment = ['left', 'top'];\n\nexport interface FindBestFitPlacementFunc {\n (args: {\n /** Список доступных направлений для выпадения, напр.: `['top-left', 'left-bottom']` */\n placements: Placement[];\n /** Содержащий прямоугольник активатора */\n activatorRect: DOMRect;\n /** Содержащий прямоугольник viewport */\n viewportRect: DOMRect;\n /** Содержащий прямоугольник offsetParent дропа */\n offsetParentRect: DOMRect;\n /** Ширина дропа */\n dropWidth: number;\n /** Высота дропа */\n dropHeight: number;\n /** Расстояние от дропа до активатора */\n guardDistanceToActivator: number;\n /** Расстояние от дропа до верхней и нижней границы экрана */\n guardDistanceToViewport: number;\n /** Расстояние от центра стрелки (например в тултипе), до ближайшего края дропа */\n arrowGuardDistance: ArrowGuardDistance;\n /**\n * Минимальная высота дропа, используется для вычисления позиции и размера дропа в случае когда\n * необходимо уместить дроп во `viewport`. Если дроп не умещается во `viewport`, то его высота будет уменьшаться\n * до достижения этого значения. После достижения будет игнорироваться параметр `guardDistanceToViewport`.\n * */\n minDropHeight: number;\n /** Флаг, указывающий что требуется пытаться уместить дроп во viewport за счет изменения его размеров */\n allowShrinkHeightToFitIntoViewport: boolean;\n /** Флаг, указывающий что ширина дропа должна быть равна ширине активатора */\n widthEqualToActivator: boolean;\n prefferedPlacement: Placement | undefined;\n }): {\n /** Содержащий прямоугольник выбранного места размещения дропа. Задает позицию и размер дропа */\n rect: DOMRect;\n /**\n * Вариант из списка переданного в параметре `placements` выбранный в качестве\n * наиболее подходящего для размещения дропа\n * */\n parsedPlacement: ParsedPlacement;\n placement: Placement;\n };\n}\n\n/**\n * Функция находит наилучшее расположение для дропа с учетом доступного пространства.\n * Наилучшее расположение выбирается из списка допустимых (`placements`).\n * Алгоритм выбора следующий:\n * - Если дроп полностью умещается на экране при выпадении в соответствующем направлении, то выбирается это направление.\n * - Если таких направлений несколько, то выбирается направление с наименьшим индексом в списке.\n * - Если ни одно из направлений не может полностью уместить дроп, то выбирается направление, которое умещает наибольшую\n * часть дропа по вертикали. Если таких направлений несколько, то среди них выбирается первое направление полностью\n * умещающее дроп по ширине, или умещающее наибольшую часть его ширины.\n */\nexport const findBestFitPlacement: FindBestFitPlacementFunc = ({\n placements,\n activatorRect,\n viewportRect,\n offsetParentRect,\n dropWidth,\n dropHeight,\n guardDistanceToActivator,\n guardDistanceToViewport,\n minDropHeight,\n allowShrinkHeightToFitIntoViewport,\n widthEqualToActivator,\n arrowGuardDistance,\n prefferedPlacement,\n}) => {\n const availablePlacements = getAvailableRectsForPlacements({ placements, activatorRect, viewportRect });\n const actualWidth = widthEqualToActivator ? activatorRect.width : dropWidth;\n\n // Прямоугольники описывающие место необходимое для размещения дропа при вертикальном и горизонтальном размещении.\n // С учетом отступов от активатора и от краев экрана.\n const dropRectForVertPlacement = DOMRect.fromRect({\n x: 0,\n y: 0,\n width: actualWidth,\n height:\n dropHeight + (allowShrinkHeightToFitIntoViewport ? guardDistanceToViewport : 0) + guardDistanceToActivator,\n });\n\n const dropRectForHorPlacement = DOMRect.fromRect({\n x: 0,\n y: 0,\n width: actualWidth + guardDistanceToActivator,\n height: dropHeight + (allowShrinkHeightToFitIntoViewport ? guardDistanceToViewport : 0),\n });\n const viewport = createRect(viewportRect);\n const activator = createRect(activatorRect);\n\n // хранит выбранный лучший вариант размещения, может меняться в процессе перебора вариантов\n let bestFitPlacement = prefferedPlacement || placements[0];\n let bestFitPlacementDistanceToViewportBorder = Number.MIN_SAFE_INTEGER;\n let bestFitPlacementArrowGuardOffset = 0;\n // Минимальная высота необходимая для размещения дропа\n const minHeightToFit = allowShrinkHeightToFitIntoViewport ? minDropHeight + guardDistanceToViewport : dropHeight;\n\n for (let i = 0, j = prefferedPlacement ? placements.length + 1 : placements.length; i < j; i++) {\n // Если передан prefferedPlacement, то сначала надо проверить его\n // При этом если он не подошел, то при дальнейшей обработке массива допустимых размещений\n // снова наткнемся на него, в этом случае нужно сразу перейти к следующему элементу\n let placement = placements[i];\n if (prefferedPlacement) {\n if (i === 0) {\n placement = prefferedPlacement;\n } else {\n placement = placements[i - 1];\n if (placement === prefferedPlacement) {\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n }\n const freeSpace = availablePlacements[placement];\n const [direction, alignment] = parsePlacement(placement);\n const isVertPlacement = vertPlacement.includes(direction);\n const dropRect = isVertPlacement ? dropRectForVertPlacement : dropRectForHorPlacement;\n\n /*\n * Если есть стрелка и для нее задан сдвиг, то стрелка должна лежать со стороны от центра активатора равной\n * alignment. Т.е. чтобы соблюсти это правило нужно проверить что сдвиг стрелки меньше или равен половине ширины\n * или высоты активатора в зависимости от направления размещения дропа. Если это не так, то дроп необходимо\n * сдвинуть так, чтобы стрелка была по середине активатора. Это может повлиять на величину пересечения дропа\n * с границей вьюпорта\n */\n const arrowGuardDistanceForPlacement =\n arrowGuardDistance[direction]?.[\n alignment as AlignmentForVerticalDirection & AlignmentForHorizontalDirection\n ];\n let arrowGuardOffset = 0;\n if (\n arrowGuardDistanceForPlacement &&\n arrowGuardDistanceForPlacement > activatorRect[isVertPlacement ? 'width' : 'height'] / 2\n ) {\n arrowGuardOffset = arrowGuardDistanceForPlacement - activatorRect[isVertPlacement ? 'width' : 'height'] / 2;\n }\n\n // Расчитываем расстояние от стороны по которой выравнен дроп до границы вьюпорта\n // Нужно для обработки случаев когда часть активатора уходит за границы экрана, например вниз.\n // В этом случае от нижнего края активатора до границы вьюпорта места больше чем от верхнего края активатора\n // до границы вьюпорта. Но спозиционировать дроп оптимальнее по верхней границе активатора, т.к. в этом случае\n // меньшая часть дропа будет уходить за границы экрана.\n // https://excalidraw.com/#json=V-b0E4ic-4RYECCPfjQ56,gMxZkd6HDGw9kIBksRBylQ\n let distanceToViewportBorder = 0;\n if (alignment !== 'center') {\n distanceToViewportBorder = axisStartAlignment.includes(alignment)\n ? freeSpace[alignment] - viewport[alignment]\n : viewport[alignment] - freeSpace[alignment];\n distanceToViewportBorder -= arrowGuardOffset;\n } else {\n const dropRect = createRect({\n // Т.к. к варианту с alignment=center не применяется изменение размера дропа, то для вычисления\n // пересечения дропа с границами экрана в этом варианте размещения можно использовать прямоугольник\n // размеры которого равны размерам дропа, центр которого расположен в центре активатора.\n left: activator.left - (actualWidth - activator.width) / 2,\n top: activator.top - (actualWidth - activator.height) / 2,\n width: actualWidth,\n height: dropHeight,\n });\n // С разных сторон может быть разная величина пересечения, берем худший вариант.\n distanceToViewportBorder = isVertPlacement\n ? Math.min(dropRect.left - viewport.left, viewport.right - dropRect.right)\n : Math.min(dropRect.top - viewport.top, viewport.bottom - dropRect.bottom);\n }\n\n if (freeSpace.width >= dropRect.width && freeSpace.height >= dropRect.height && distanceToViewportBorder >= 0) {\n bestFitPlacement = placement;\n bestFitPlacementArrowGuardOffset = arrowGuardOffset;\n break;\n }\n\n const currentCanFitByHeight =\n freeSpace.height >= minHeightToFit + (isVertPlacement ? guardDistanceToActivator : 0);\n const currentNotWorseByHeight =\n freeSpace.height >= availablePlacements[bestFitPlacement].height || freeSpace.height >= dropRect.height;\n const currentFitsBetterByHeight =\n availablePlacements[bestFitPlacement].height < dropHeight &&\n freeSpace.height > availablePlacements[bestFitPlacement].height;\n\n const currentNotWorseByWidth =\n freeSpace.width >= availablePlacements[bestFitPlacement].width || freeSpace.width >= dropRect.width;\n const currentFitsBetterByWidth =\n availablePlacements[bestFitPlacement].width < dropRect.width &&\n freeSpace.width > availablePlacements[bestFitPlacement].width;\n\n const currentFitsBetter =\n (currentFitsBetterByHeight && currentNotWorseByWidth && distanceToViewportBorder >= 0) ||\n (currentFitsBetterByWidth && currentNotWorseByHeight && distanceToViewportBorder >= 0) ||\n (currentCanFitByHeight &&\n currentNotWorseByWidth &&\n bestFitPlacementDistanceToViewportBorder < 0 &&\n distanceToViewportBorder > bestFitPlacementDistanceToViewportBorder);\n\n if (currentFitsBetter) {\n bestFitPlacement = placement;\n bestFitPlacementDistanceToViewportBorder = distanceToViewportBorder;\n bestFitPlacementArrowGuardOffset = arrowGuardOffset;\n }\n }\n\n // После того как найден содержащий прямоугольник для дропа вычисляем высоту дропа, затем позицию\n const [direction, alignment] = parsePlacement(bestFitPlacement);\n const freeSpace = availablePlacements[bestFitPlacement];\n const isVertPlacement = vertPlacement.includes(direction);\n const actualHeight =\n allowShrinkHeightToFitIntoViewport && alignment !== 'center'\n ? Math.min(\n dropHeight,\n Math.max(\n minDropHeight,\n freeSpace.height - guardDistanceToViewport - (isVertPlacement ? guardDistanceToActivator : 0)\n )\n )\n : dropHeight;\n\n // Для определения позиции дропа необходимо вычислить left/top, но для некоторых вариантов размещения проще\n // вычислить right/bottom т.к. они совпадают с соответствующими сторонами содержащего прямоугольника.\n // Поэтому сначала проверяем можем ли мы вычислить right/bottom.\n const position: Partial<Rect> = {};\n if (direction === 'left' || alignment === 'right') {\n position.right = freeSpace.right;\n }\n if (direction === 'top' || alignment === 'bottom') {\n position.bottom = freeSpace.bottom;\n }\n // Вычисляем left/top на основе right/bottom и width/height если они есть. Если их нет - значит в этом варианте\n // размещения с содержащим прямоугольником совпадают left/top.\n position.left = position.right !== undefined ? position.right - actualWidth : freeSpace.left;\n position.top = position.bottom !== undefined ? position.bottom - actualHeight : freeSpace.top;\n\n // Отдельно вычисляем позицию/размер для выравнивания по центру\n if (alignment === 'center') {\n const startPosAttr = isVertPlacement ? 'left' : 'top';\n const sizeAttr = isVertPlacement ? 'width' : 'height';\n const dropSize = isVertPlacement ? actualWidth : actualHeight;\n position[startPosAttr] = activatorRect[startPosAttr] + (activatorRect[sizeAttr] - dropSize) / 2;\n }\n\n // Отодвигаем на заданный отступ от активатора\n const signedActivatorOffset = ['bottom', 'right'].includes(direction)\n ? guardDistanceToActivator\n : -guardDistanceToActivator;\n position.top += isVertPlacement ? signedActivatorOffset : 0;\n position.left += !isVertPlacement ? signedActivatorOffset : 0;\n\n position.width = actualWidth;\n position.height = actualHeight;\n // Создаем новую переменную чтобы поменять тип, потому что на этом этапе мы точно знаем что у нас есть эти поля\n // и нет необходимости писать тайпгарды в каждом месте использования\n const finalPosition = position as { left: number; top: number; width: number; height: number };\n\n // Если необходим сдвиг для выравнивания стрелки относительно активатора - применяем его\n if (bestFitPlacementArrowGuardOffset) {\n finalPosition[isVertPlacement ? 'left' : 'top'] += axisStartAlignment.includes(alignment)\n ? -bestFitPlacementArrowGuardOffset\n : bestFitPlacementArrowGuardOffset;\n // Добавляем дополнительно пространство к размеру дропа\n finalPosition[isVertPlacement ? 'height' : 'width'] += bestFitPlacementArrowGuardOffset;\n // Удостоверяемся что после этого размер дропа не превышает размер необходимый для его контента\n finalPosition.height = Math.min(finalPosition.height, dropHeight);\n finalPosition.width = Math.min(finalPosition.width, actualWidth);\n }\n\n return {\n rect: new DOMRect(\n finalPosition.left - offsetParentRect.left, // Переводим координаты в систему координат offsetParent\n finalPosition.top - offsetParentRect.top,\n finalPosition.width,\n finalPosition.height\n ),\n parsedPlacement: { direction, alignment },\n placement: bestFitPlacement,\n };\n};\n\nexport const applyPlacementToDrop = (dropRef: RefObject<HTMLElement>, placement: DOMRect): void => {\n if (!dropRef.current) {\n return;\n }\n\n dropRef.current.style.top = `${placement.top}px`;\n dropRef.current.style.left = `${placement.left}px`;\n dropRef.current.style.width = `${placement.width}px`;\n dropRef.current.style.height = `${placement.height}px`;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"findBestFitPlacement.js","sources":["../src/findBestFitPlacement.ts"],"sourcesContent":["import { RefObject } from 'react';\n\nimport {\n ActivatorElementType,\n Placement,\n VerticalDirection,\n HorizontalDirection,\n AlignmentForVerticalDirection,\n AlignmentForHorizontalDirection,\n ArrowGuardDistance,\n ParsedPlacement,\n} from '@hh.ru/magritte-internal-drop-base/types';\n\ninterface GetMetricsFunc {\n (args: {\n activatorRef: RefObject<ActivatorElementType>;\n customViewport?: RefObject<HTMLElement>;\n dropRef: RefObject<HTMLElement>;\n }): {\n activatorRect: DOMRect;\n viewportRect: DOMRect;\n offsetParentRect: DOMRect;\n };\n}\n\nexport const getMetrics: GetMetricsFunc = ({ activatorRef, customViewport, dropRef }) => {\n let activatorRect: DOMRect = new DOMRect();\n\n if (activatorRef.current) {\n activatorRect = activatorRef.current.getBoundingClientRect();\n }\n const viewportRect =\n customViewport && customViewport.current\n ? customViewport.current.getBoundingClientRect()\n : DOMRect.fromRect({\n width: window.visualViewport?.width,\n height: window.visualViewport?.height,\n x: 0,\n y: 0,\n });\n const offsetParentRect = dropRef.current?.offsetParent?.getBoundingClientRect() || new DOMRect();\n\n return { activatorRect, viewportRect, offsetParentRect };\n};\n\nconst parsePlacement = (\n placement: Placement\n): [VerticalDirection | HorizontalDirection, AlignmentForHorizontalDirection | AlignmentForVerticalDirection] => {\n return placement.split('-') as [\n VerticalDirection | HorizontalDirection,\n AlignmentForHorizontalDirection | AlignmentForVerticalDirection\n ];\n};\n\ntype Rect = { left: number; top: number; width: number; height: number; right: number; bottom: number };\n// Возвращает описание прямоугольника и размеры и позицию правой и нижней стороны, при этом позволяет не указывать\n// в аргументах либо размеры, либо позицию правой и нижней стороны\nconst createRect = (args: {\n left: number;\n top: number;\n width?: number;\n height?: number;\n right?: number;\n bottom?: number;\n}) => ({\n left: args.left,\n top: args.top,\n width: args.width || (args?.right || 0) - args.left,\n height: args.height || (args?.bottom || 0) - args.top,\n right: args.right || (args?.width || 0) + args.left,\n bottom: args.bottom || (args?.height || 0) + args.top,\n});\n\ninterface GetAvailableRectsForPlacementsFunc {\n (args: { placements: Placement[]; activatorRect: DOMRect; viewportRect: DOMRect }): { [key in Placement]: Rect };\n}\n\nconst getAvailableRectsForPlacements: GetAvailableRectsForPlacementsFunc = ({\n placements,\n activatorRect,\n viewportRect,\n}) => {\n // Вычисляем содержащий прямоугольник для свободного пространство с каждой из сторон от активатора\n // https://excalidraw.com/#json=3O9770_G2g6lkJuIftLiQ,2ZRIYkXrSjCpobPS5Ufh7w\n const freeSpaceBySide = {\n top: () =>\n createRect({\n left: viewportRect.x,\n top: viewportRect.y,\n width: viewportRect.width,\n height: activatorRect.top - viewportRect.top,\n }),\n right: () =>\n createRect({\n left: activatorRect.right,\n top: viewportRect.top,\n width: viewportRect.right - activatorRect.right,\n height: viewportRect.height,\n }),\n bottom: () =>\n createRect({\n left: viewportRect.x,\n top: activatorRect.bottom,\n width: viewportRect.width,\n height: viewportRect.bottom - activatorRect.bottom,\n }),\n left: () =>\n createRect({\n left: viewportRect.x,\n top: viewportRect.y,\n width: activatorRect.left - viewportRect.left,\n height: viewportRect.height,\n }),\n };\n\n // Для каждого варианта позиционирования вычисляем содержащий прямоугольник доступного пространства\n // с учетом позиции активатора и границ вьюпорта\n return placements.reduce((acc, placement) => {\n const [direction, alignment] = parsePlacement(placement);\n\n const freeSpace = freeSpaceBySide[direction]();\n acc[placement] = freeSpace;\n\n // Берем свободное пространство с той стороны от активатора куда должен выпасть дроп\n // и устанавливает позицию стороны соответствующей alignment равно позиции той же стороны активатора.\n // На схеме понятнее откуда берется эта логика:\n // https://excalidraw.com/#json=cTKcB__3Oi3U3lF1Z4FLk,6jWpaYZLXePae-FDUbC9PQ\n if (alignment !== 'center') {\n acc[placement][alignment] = activatorRect[alignment];\n acc[placement] = createRect({ ...acc[placement], width: undefined, height: undefined });\n }\n return acc;\n }, {} as { [key in Placement]: Rect });\n};\n\nconst vertPlacement = ['top', 'bottom'];\nconst axisStartAlignment = ['left', 'top'];\n\nexport interface FindBestFitPlacementFunc {\n (args: {\n /** Список доступных направлений для выпадения, напр.: `['top-left', 'left-bottom']` */\n placements: Placement[];\n /** Содержащий прямоугольник активатора */\n activatorRect: DOMRect;\n /** Содержащий прямоугольник viewport */\n viewportRect: DOMRect;\n /** Содержащий прямоугольник offsetParent дропа */\n offsetParentRect: DOMRect;\n /** Ширина дропа */\n dropWidth: number;\n /** Высота дропа */\n dropHeight: number;\n /** Расстояние от дропа до активатора */\n guardDistanceToActivator: number;\n /** Расстояние от дропа до верхней и нижней границы экрана */\n guardDistanceToViewport: number;\n /** Расстояние от центра стрелки (например в тултипе), до ближайшего края дропа */\n arrowGuardDistance: ArrowGuardDistance;\n /**\n * Минимальная высота дропа, используется для вычисления позиции и размера дропа в случае когда\n * необходимо уместить дроп во `viewport`. Если дроп не умещается во `viewport`, то его высота будет уменьшаться\n * до достижения этого значения. После достижения будет игнорироваться параметр `guardDistanceToViewport`.\n * */\n minDropHeight: number;\n /** Флаг, указывающий что требуется пытаться уместить дроп во viewport за счет изменения его размеров */\n allowShrinkHeightToFitIntoViewport: boolean;\n /** Флаг, указывающий что ширина дропа должна быть равна ширине активатора */\n widthEqualToActivator: boolean;\n prefferedPlacement: Placement | undefined;\n }): {\n /** Содержащий прямоугольник выбранного места размещения дропа. Задает позицию и размер дропа */\n rect: DOMRect;\n /**\n * Вариант из списка переданного в параметре `placements` выбранный в качестве\n * наиболее подходящего для размещения дропа\n * */\n parsedPlacement: ParsedPlacement;\n placement: Placement;\n };\n}\n\n/**\n * Функция находит наилучшее расположение для дропа с учетом доступного пространства.\n * Наилучшее расположение выбирается из списка допустимых (`placements`).\n * Алгоритм выбора следующий:\n * - Если дроп полностью умещается на экране при выпадении в соответствующем направлении, то выбирается это направление.\n * - Если таких направлений несколько, то выбирается направление с наименьшим индексом в списке.\n * - Если ни одно из направлений не может полностью уместить дроп, то выбирается направление, которое умещает наибольшую\n * часть дропа по вертикали. Если таких направлений несколько, то среди них выбирается первое направление полностью\n * умещающее дроп по ширине, или умещающее наибольшую часть его ширины.\n */\nexport const findBestFitPlacement: FindBestFitPlacementFunc = ({\n placements,\n activatorRect,\n viewportRect,\n offsetParentRect,\n dropWidth,\n dropHeight,\n guardDistanceToActivator,\n guardDistanceToViewport,\n minDropHeight,\n allowShrinkHeightToFitIntoViewport,\n widthEqualToActivator,\n arrowGuardDistance,\n prefferedPlacement,\n}) => {\n const availablePlacements = getAvailableRectsForPlacements({ placements, activatorRect, viewportRect });\n const actualWidth = widthEqualToActivator ? activatorRect.width : dropWidth;\n\n // Прямоугольники описывающие место необходимое для размещения дропа при вертикальном и горизонтальном размещении.\n // С учетом отступов от активатора и от краев экрана.\n const dropRectForVertPlacement = DOMRect.fromRect({\n x: 0,\n y: 0,\n width: actualWidth,\n height:\n dropHeight + (allowShrinkHeightToFitIntoViewport ? guardDistanceToViewport : 0) + guardDistanceToActivator,\n });\n\n const dropRectForHorPlacement = DOMRect.fromRect({\n x: 0,\n y: 0,\n width: actualWidth + guardDistanceToActivator,\n height: dropHeight + (allowShrinkHeightToFitIntoViewport ? guardDistanceToViewport : 0),\n });\n const viewport = createRect(viewportRect);\n const activator = createRect(activatorRect);\n\n // хранит выбранный лучший вариант размещения, может меняться в процессе перебора вариантов\n let bestFitPlacement = prefferedPlacement || placements[0];\n let bestFitPlacementDistanceToViewportBorder = Number.MIN_SAFE_INTEGER;\n let bestFitPlacementArrowGuardOffset = 0;\n // Минимальная высота необходимая для размещения дропа\n const minHeightToFit = allowShrinkHeightToFitIntoViewport ? minDropHeight + guardDistanceToViewport : dropHeight;\n\n for (let i = 0, j = prefferedPlacement ? placements.length + 1 : placements.length; i < j; i++) {\n // Если передан prefferedPlacement, то сначала надо проверить его\n // При этом если он не подошел, то при дальнейшей обработке массива допустимых размещений\n // снова наткнемся на него, в этом случае нужно сразу перейти к следующему элементу\n let placement = placements[i];\n if (prefferedPlacement) {\n if (i === 0) {\n placement = prefferedPlacement;\n } else {\n placement = placements[i - 1];\n if (placement === prefferedPlacement) {\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n }\n const freeSpace = availablePlacements[placement];\n const [direction, alignment] = parsePlacement(placement);\n const isVertPlacement = vertPlacement.includes(direction);\n const dropRect = isVertPlacement ? dropRectForVertPlacement : dropRectForHorPlacement;\n\n /*\n * Если есть стрелка и для нее задан сдвиг, то стрелка должна лежать со стороны от центра активатора равной\n * alignment. Т.е. чтобы соблюсти это правило нужно проверить что сдвиг стрелки меньше или равен половине ширины\n * или высоты активатора в зависимости от направления размещения дропа. Если это не так, то дроп необходимо\n * сдвинуть так, чтобы стрелка была по середине активатора. Это может повлиять на величину пересечения дропа\n * с границей вьюпорта\n */\n const arrowGuardDistanceForPlacement =\n arrowGuardDistance[direction]?.[\n alignment as AlignmentForVerticalDirection & AlignmentForHorizontalDirection\n ];\n let arrowGuardOffset = 0;\n if (\n arrowGuardDistanceForPlacement &&\n arrowGuardDistanceForPlacement > activatorRect[isVertPlacement ? 'width' : 'height'] / 2\n ) {\n arrowGuardOffset = arrowGuardDistanceForPlacement - activatorRect[isVertPlacement ? 'width' : 'height'] / 2;\n }\n\n // Расчитываем расстояние от стороны по которой выравнен дроп до границы вьюпорта\n // Нужно для обработки случаев когда часть активатора уходит за границы экрана, например вниз.\n // В этом случае от нижнего края активатора до границы вьюпорта места больше чем от верхнего края активатора\n // до границы вьюпорта. Но спозиционировать дроп оптимальнее по верхней границе активатора, т.к. в этом случае\n // меньшая часть дропа будет уходить за границы экрана.\n // https://excalidraw.com/#json=V-b0E4ic-4RYECCPfjQ56,gMxZkd6HDGw9kIBksRBylQ\n let distanceToViewportBorder = 0;\n if (alignment !== 'center') {\n distanceToViewportBorder = axisStartAlignment.includes(alignment)\n ? freeSpace[alignment] - viewport[alignment]\n : viewport[alignment] - freeSpace[alignment];\n distanceToViewportBorder -= arrowGuardOffset;\n } else {\n const dropRect = createRect({\n // Т.к. к варианту с alignment=center не применяется изменение размера дропа, то для вычисления\n // пересечения дропа с границами экрана в этом варианте размещения можно использовать прямоугольник\n // размеры которого равны размерам дропа, центр которого расположен в центре активатора.\n left: activator.left - (actualWidth - activator.width) / 2,\n top: activator.top - (actualWidth - activator.height) / 2,\n width: actualWidth,\n height: dropHeight,\n });\n // С разных сторон может быть разная величина пересечения, берем худший вариант.\n distanceToViewportBorder = isVertPlacement\n ? Math.min(dropRect.left - viewport.left, viewport.right - dropRect.right)\n : Math.min(dropRect.top - viewport.top, viewport.bottom - dropRect.bottom);\n }\n\n if (freeSpace.width >= dropRect.width && freeSpace.height >= dropRect.height && distanceToViewportBorder >= 0) {\n bestFitPlacement = placement;\n bestFitPlacementArrowGuardOffset = arrowGuardOffset;\n break;\n }\n\n const currentCanFitByHeight =\n freeSpace.height >= minHeightToFit + (isVertPlacement ? guardDistanceToActivator : 0);\n const currentNotWorseByHeight =\n freeSpace.height >= availablePlacements[bestFitPlacement].height || freeSpace.height >= dropRect.height;\n const currentFitsBetterByHeight =\n availablePlacements[bestFitPlacement].height < dropHeight &&\n freeSpace.height > availablePlacements[bestFitPlacement].height;\n\n const currentNotWorseByWidth =\n freeSpace.width >= availablePlacements[bestFitPlacement].width || freeSpace.width >= dropRect.width;\n const currentFitsBetterByWidth =\n availablePlacements[bestFitPlacement].width < dropRect.width &&\n freeSpace.width > availablePlacements[bestFitPlacement].width;\n\n const currentFitsBetter =\n (currentFitsBetterByHeight && currentNotWorseByWidth && distanceToViewportBorder >= 0) ||\n (currentFitsBetterByWidth && currentNotWorseByHeight && distanceToViewportBorder >= 0) ||\n (currentCanFitByHeight &&\n currentNotWorseByWidth &&\n bestFitPlacementDistanceToViewportBorder < 0 &&\n distanceToViewportBorder > bestFitPlacementDistanceToViewportBorder);\n\n if (currentFitsBetter) {\n bestFitPlacement = placement;\n bestFitPlacementDistanceToViewportBorder = distanceToViewportBorder;\n bestFitPlacementArrowGuardOffset = arrowGuardOffset;\n }\n }\n\n // После того как найден содержащий прямоугольник для дропа вычисляем высоту дропа, затем позицию\n const [direction, alignment] = parsePlacement(bestFitPlacement);\n const freeSpace = availablePlacements[bestFitPlacement];\n const isVertPlacement = vertPlacement.includes(direction);\n const actualHeight =\n allowShrinkHeightToFitIntoViewport && alignment !== 'center'\n ? Math.min(\n dropHeight,\n Math.max(\n minDropHeight,\n freeSpace.height - guardDistanceToViewport - (isVertPlacement ? guardDistanceToActivator : 0)\n )\n )\n : dropHeight;\n\n // Для определения позиции дропа необходимо вычислить left/top, но для некоторых вариантов размещения проще\n // вычислить right/bottom т.к. они совпадают с соответствующими сторонами содержащего прямоугольника.\n // Поэтому сначала проверяем можем ли мы вычислить right/bottom.\n const position: Partial<Rect> = {};\n if (direction === 'left' || alignment === 'right') {\n position.right = freeSpace.right;\n }\n if (direction === 'top' || alignment === 'bottom') {\n position.bottom = freeSpace.bottom;\n }\n // Вычисляем left/top на основе right/bottom и width/height если они есть. Если их нет - значит в этом варианте\n // размещения с содержащим прямоугольником совпадают left/top.\n position.left = position.right !== undefined ? position.right - actualWidth : freeSpace.left;\n position.top = position.bottom !== undefined ? position.bottom - actualHeight : freeSpace.top;\n\n // Отдельно вычисляем позицию/размер для выравнивания по центру\n if (alignment === 'center') {\n const startPosAttr = isVertPlacement ? 'left' : 'top';\n const sizeAttr = isVertPlacement ? 'width' : 'height';\n const dropSize = isVertPlacement ? actualWidth : actualHeight;\n position[startPosAttr] = activatorRect[startPosAttr] + (activatorRect[sizeAttr] - dropSize) / 2;\n }\n\n // Отодвигаем на заданный отступ от активатора\n const signedActivatorOffset = ['bottom', 'right'].includes(direction)\n ? guardDistanceToActivator\n : -guardDistanceToActivator;\n position.top += isVertPlacement ? signedActivatorOffset : 0;\n position.left += !isVertPlacement ? signedActivatorOffset : 0;\n\n position.width = actualWidth;\n position.height = actualHeight;\n // Создаем новую переменную чтобы поменять тип, потому что на этом этапе мы точно знаем что у нас есть эти поля\n // и нет необходимости писать тайпгарды в каждом месте использования\n const finalPosition = position as { left: number; top: number; width: number; height: number };\n\n // Если необходим сдвиг для выравнивания стрелки относительно активатора - применяем его\n if (bestFitPlacementArrowGuardOffset) {\n finalPosition[isVertPlacement ? 'left' : 'top'] += axisStartAlignment.includes(alignment)\n ? -bestFitPlacementArrowGuardOffset\n : bestFitPlacementArrowGuardOffset;\n // Добавляем дополнительно пространство к размеру дропа\n finalPosition[isVertPlacement ? 'height' : 'width'] += bestFitPlacementArrowGuardOffset;\n // Удостоверяемся что после этого размер дропа не превышает размер необходимый для его контента\n finalPosition.height = Math.min(finalPosition.height, dropHeight);\n finalPosition.width = Math.min(finalPosition.width, actualWidth);\n }\n\n return {\n rect: new DOMRect(\n finalPosition.left - offsetParentRect.left, // Переводим координаты в систему координат offsetParent\n finalPosition.top - offsetParentRect.top,\n finalPosition.width,\n finalPosition.height\n ),\n parsedPlacement: { direction, alignment },\n placement: bestFitPlacement,\n };\n};\n\nexport const applyPlacementToDrop = (dropRef: RefObject<HTMLElement>, placement: DOMRect): void => {\n if (!dropRef.current) {\n return;\n }\n\n dropRef.current.style.top = `${placement.top}px`;\n dropRef.current.style.left = `${placement.left}px`;\n dropRef.current.style.width = `${placement.width}px`;\n dropRef.current.style.height = `${placement.height}px`;\n};\n"],"names":[],"mappings":"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"}
package/index.css CHANGED
@@ -1,4 +1,4 @@
1
- .magritte-drop-base___uJNG4_7-0-3{
1
+ .magritte-drop-base___uJNG4_7-0-4{
2
2
  position:absolute;
3
3
  outline:none;
4
4
  }
package/index.js CHANGED
@@ -12,6 +12,5 @@ import '@hh.ru/magritte-common-use-when-font-loaded';
12
12
  import './intersectionManager.js';
13
13
  import './positionManager.js';
14
14
  import './findBestFitPlacement.js';
15
- import '@hh.ru/magritte-common-metrics';
16
15
  import './useMonitorResize.js';
17
16
  //# sourceMappingURL=index.js.map
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",
3
+ "version": "7.0.4",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -21,7 +21,6 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@hh.ru/magritte-common-keyboard": "4.0.1",
24
- "@hh.ru/magritte-common-metrics": "2.1.0",
25
24
  "@hh.ru/magritte-common-mouse": "1.1.11",
26
25
  "@hh.ru/magritte-common-use-multiple-refs": "1.1.4",
27
26
  "@hh.ru/magritte-common-use-no-bubbling": "1.0.1",
@@ -35,5 +34,5 @@
35
34
  "publishConfig": {
36
35
  "access": "public"
37
36
  },
38
- "gitHead": "50daf2166c2b04a09f61e3a765014bfe51c9bfdb"
37
+ "gitHead": "2b3aed34009f34d3b554fc674e5e7a2e64856968"
39
38
  }
@@ -2,7 +2,6 @@ import './index.css';
2
2
  import { useRef, useCallback, useEffect, useLayoutEffect } from 'react';
3
3
  import { applyPlacementToDrop, getMetrics, findBestFitPlacement } from './findBestFitPlacement.js';
4
4
  import { useMonitorResize } from './useMonitorResize.js';
5
- import '@hh.ru/magritte-common-metrics';
6
5
 
7
6
  let isInitialized = false;
8
7
  const scrollSubscriptions = [];
@@ -1 +1 @@
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":"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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":"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"}