@vkontakte/vkui 6.3.0 → 6.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/Cell/Cell.d.ts.map +1 -1
- package/dist/cjs/components/Cell/Cell.js +5 -3
- package/dist/cjs/components/Cell/Cell.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js +7 -2
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/Popover/Popover.d.ts +2 -2
- package/dist/cjs/components/Popover/Popover.d.ts.map +1 -1
- package/dist/cjs/components/Popover/Popover.js +4 -2
- package/dist/cjs/components/Popover/Popover.js.map +1 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/types.d.ts +4 -0
- package/dist/cjs/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts +1 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +6 -2
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/components/Cell/Cell.d.ts.map +1 -1
- package/dist/components/Cell/Cell.js +5 -3
- package/dist/components/Cell/Cell.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +7 -2
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +2 -2
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +4 -2
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +21 -9
- package/dist/cssm/components/Cell/Cell.d.ts.map +1 -1
- package/dist/cssm/components/Cell/Cell.js +7 -1
- package/dist/cssm/components/Cell/Cell.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +7 -2
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/ModalDismissButton/ModalDismissButton.module.css +3 -3
- package/dist/cssm/components/Popover/Popover.d.ts +2 -2
- package/dist/cssm/components/Popover/Popover.d.ts.map +1 -1
- package/dist/cssm/components/Popover/Popover.js +3 -2
- package/dist/cssm/components/Popover/Popover.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/types.d.ts +4 -0
- package/dist/cssm/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +7 -3
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/types.d.ts +4 -0
- package/dist/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +7 -3
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +21 -9
- package/package.json +1 -1
- package/src/components/Cell/Cell.tsx +5 -1
- package/src/components/CustomSelect/CustomSelect.tsx +4 -4
- package/src/components/ModalDismissButton/ModalDismissButton.module.css +3 -3
- package/src/components/Popover/Popover.tsx +3 -0
- package/src/lib/floating/useFloatingWithInteractions/types.ts +4 -0
- package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { usePatchChildren } from '../../hooks/usePatchChildren';\nimport { injectAriaExpandedPropByRole } from '../../lib/accessibility';\nimport { animationFadeClassNames, transformOriginClassNames } from '../../lib/animation';\nimport {\n type FloatingComponentProps,\n type FloatingContentRenderProp,\n type OnShownChange,\n useFloatingMiddlewaresBootstrap,\n useFloatingWithInteractions,\n usePlacementChangeCallback,\n} from '../../lib/floating';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport {\n DEFAULT_ARROW_HEIGHT,\n DEFAULT_ARROW_PADDING,\n DefaultIcon,\n} from '../FloatingArrow/DefaultIcon';\nimport {\n FloatingArrow,\n type FloatingArrowProps as FloatingArrowPropsPrivate,\n} from '../FloatingArrow/FloatingArrow';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport styles from './Popover.module.css';\n\n/**\n * @alias\n * @public\n */\nexport type PopoverArrowProps = Omit<\n FloatingArrowPropsPrivate,\n 'getRootRef' | 'coords' | 'placement' | 'Icon'\n>;\n\n/**\n * @alias\n * @public\n */\nexport type PopoverOnShownChange = OnShownChange;\n\n/**\n * @alias\n * @public\n */\nexport type PopoverContentRenderProp = FloatingContentRenderProp;\n\ntype AllowedFloatingComponentProps = Pick<\n FloatingComponentProps,\n | 'arrow'\n | 'arrowHeight'\n | 'arrowPadding'\n | 'placement'\n | 'onPlacementChange'\n | 'trigger'\n | 'content'\n | 'hoverDelay'\n | 'closeAfterClick'\n | 'offsetByMainAxis'\n | 'offsetByCrossAxis'\n | 'defaultShown'\n | 'shown'\n | 'onShownChange'\n | 'usePortal'\n | 'sameWidth'\n | 'hideWhenReferenceHidden'\n | 'disabled'\n | 'disableInteractive'\n | 'disableCloseOnClickOutside'\n | 'disableCloseOnEscKey'\n | 'autoFocus'\n | 'restoreFocus'\n | 'children'\n | 'zIndex'\n | 'disableFlipMiddleware'\n | 'customMiddlewares'\n>;\n\n/**\n * @public\n */\nexport interface PopoverProps\n extends AllowedFloatingComponentProps,\n Omit<HTMLAttributesWithRootRef<HTMLDivElement>, keyof FloatingComponentProps> {\n /**\n * Отключает у всплывающего элемента стилизацию по умолчанию.\n *\n * У `content`:\n * - _background_\n * - _border-radius_\n * - _box-shadow_\n *\n * У `arrow`:\n * - _color_\n *\n * Используется в случае, если необходимо стилизовать по своему. Для `arrow` _color_ можно\n * определить через в `arrowProps.iconClassName` или `arrowProps.iconStyle`.\n */\n noStyling?: boolean;\n /**\n * Позволяет набросить на стрелку пользовательские атрибуты.\n */\n arrowProps?: PopoverArrowProps;\n /**\n * Пользовательская SVG иконка.\n *\n * Требования:\n *\n * 1. Иконка по умолчанию должна быть направлена вверх (a.k.a `IconUp`).\n * 2. Чтобы избежать проблемы с пространством между стрелкой и контентом на некоторых экранах,\n * растяните кривую по высоте на `1px` и увеличьте на этот размер `height` и `viewBox` SVG.\n * (см. https://github.com/VKCOM/VKUI/pull/4496).\n * 3. Передайте высоту иконки в параметр `arrowHeight`. В значении высоты можно исключить хак с `1px` из п.2.\n * 4. Убедитесь, что компонент принимает все валидные для SVG параметры.\n * 5. Убедитесь, что SVG и её элементы наследует цвет через `fill=\"currentColor\"`.\n */\n ArrowIcon?: FloatingArrowPropsPrivate['Icon'];\n /**\n * Используется для того, чтобы не удалять поповер из DOM дерева при скрытии.\n */\n keepMounted?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Popover\n */\nexport const Popover = ({\n // UsePopoverProps\n arrow: withArrow,\n arrowHeight = DEFAULT_ARROW_HEIGHT,\n arrowPadding = DEFAULT_ARROW_PADDING,\n placement: expectedPlacement = 'bottom-start',\n onPlacementChange,\n disableFlipMiddleware = false,\n trigger = 'click',\n content,\n hoverDelay = 150,\n closeAfterClick,\n offsetByMainAxis = 8,\n offsetByCrossAxis = 0,\n sameWidth,\n hideWhenReferenceHidden,\n disabled,\n disableInteractive,\n disableCloseOnClickOutside,\n disableCloseOnEscKey,\n keepMounted = false,\n customMiddlewares,\n // uncontrolled\n defaultShown = false,\n // controlled\n shown: shownProp,\n onShownChange,\n\n // Для AppRootPortal\n usePortal = true,\n\n // Для FloatingArrow\n arrowProps,\n ArrowIcon = DefaultIcon,\n\n // FocusTrapProps\n autoFocus = true,\n restoreFocus = true,\n className,\n children,\n noStyling = false,\n zIndex = 'var(--vkui--z_index_popout)',\n // a11y\n role = 'dialog',\n ...restPopoverProps\n}: PopoverProps): React.ReactNode => {\n const [arrowRef, setArrowRef] = React.useState<HTMLDivElement | null>(null);\n const { middlewares, strictPlacement } = useFloatingMiddlewaresBootstrap({\n arrow: withArrow,\n arrowRef,\n arrowHeight,\n arrowPadding,\n placement: expectedPlacement,\n offsetByMainAxis,\n offsetByCrossAxis,\n sameWidth,\n hideWhenReferenceHidden,\n disableFlipMiddleware,\n customMiddlewares,\n });\n const {\n placement: resolvedPlacement,\n shown,\n willBeHide,\n refs,\n referenceProps,\n floatingProps,\n middlewareData,\n onClose,\n onRestoreFocus,\n onEscapeKeyDown,\n } = useFloatingWithInteractions({\n middlewares,\n placement: strictPlacement,\n trigger,\n hoverDelay,\n closeAfterClick,\n disabled,\n disableInteractive,\n disableCloseOnClickOutside,\n disableCloseOnEscKey,\n defaultShown,\n shown: shownProp,\n onShownChange,\n });\n\n usePlacementChangeCallback(expectedPlacement, resolvedPlacement, onPlacementChange);\n\n const [, child] = usePatchChildren<HTMLDivElement>(\n children,\n injectAriaExpandedPropByRole(referenceProps, shown, role),\n refs.setReference,\n );\n\n let popover: React.ReactNode = null;\n if (shown || keepMounted) {\n const hidden = keepMounted && !shown;\n if (!hidden) {\n floatingProps.style.zIndex = String(zIndex);\n }\n\n let arrow: React.ReactElement | null = null;\n if (withArrow) {\n const { arrow: arrowCoords } = middlewareData;\n arrow = (\n <FloatingArrow\n iconClassName={noStyling ? undefined : styles['Popover__arrow']}\n {...arrowProps}\n coords={arrowCoords}\n placement={resolvedPlacement}\n getRootRef={setArrowRef}\n Icon={ArrowIcon}\n />\n );\n }\n\n popover = (\n <AppRootPortal usePortal={usePortal}>\n <div\n ref={refs.setFloating}\n className={classNames(styles['Popover'], hidden && styles['Popover--hidden'])}\n {...floatingProps}\n >\n <FocusTrap\n {...restPopoverProps}\n role={role}\n className={classNames(\n styles['Popover__in'],\n noStyling ? undefined : styles['Popover__in--withStyling'],\n willBeHide ? animationFadeClassNames.out : animationFadeClassNames.in,\n transformOriginClassNames[resolvedPlacement],\n className,\n )}\n mount={!hidden}\n disabled={hidden}\n autoFocus={disableInteractive ? false : autoFocus}\n restoreFocus={restoreFocus ? onRestoreFocus : false}\n onClose={onEscapeKeyDown}\n >\n {arrow}\n {typeof content === 'function' ? content({ onClose }) : content}\n </FocusTrap>\n </div>\n </AppRootPortal>\n );\n }\n\n return (\n <React.Fragment>\n {child}\n {popover}\n </React.Fragment>\n );\n};\n"],"names":["React","classNames","usePatchChildren","injectAriaExpandedPropByRole","animationFadeClassNames","transformOriginClassNames","useFloatingMiddlewaresBootstrap","useFloatingWithInteractions","usePlacementChangeCallback","AppRootPortal","DEFAULT_ARROW_HEIGHT","DEFAULT_ARROW_PADDING","DefaultIcon","FloatingArrow","FocusTrap","styles","Popover","arrow","withArrow","arrowHeight","arrowPadding","placement","expectedPlacement","onPlacementChange","disableFlipMiddleware","trigger","content","hoverDelay","closeAfterClick","offsetByMainAxis","offsetByCrossAxis","sameWidth","hideWhenReferenceHidden","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","keepMounted","customMiddlewares","defaultShown","shown","shownProp","onShownChange","usePortal","arrowProps","ArrowIcon","autoFocus","restoreFocus","className","children","noStyling","zIndex","role","restPopoverProps","arrowRef","setArrowRef","useState","middlewares","strictPlacement","resolvedPlacement","willBeHide","refs","referenceProps","floatingProps","middlewareData","onClose","onRestoreFocus","onEscapeKeyDown","child","setReference","popover","hidden","style","String","arrowCoords","iconClassName","undefined","coords","getRootRef","Icon","div","ref","setFloating","out","in","mount","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { usePatchChildren } from '../../hooks/usePatchChildren';\nimport { injectAriaExpandedPropByRole } from '../../lib/accessibility';\nimport { animationFadeClassNames, transformOriginClassNames } from '../../lib/animation';\nimport {\n type FloatingComponentProps,\n type FloatingContentRenderProp,\n type OnShownChange,\n useFloatingMiddlewaresBootstrap,\n useFloatingWithInteractions,\n usePlacementChangeCallback,\n} from '../../lib/floating';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport {\n DEFAULT_ARROW_HEIGHT,\n DEFAULT_ARROW_PADDING,\n DefaultIcon,\n} from '../FloatingArrow/DefaultIcon';\nimport {\n FloatingArrow,\n type FloatingArrowProps as FloatingArrowPropsPrivate,\n} from '../FloatingArrow/FloatingArrow';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport styles from './Popover.module.css';\n\n/**\n * @alias\n * @public\n */\nexport type PopoverArrowProps = Omit<\n FloatingArrowPropsPrivate,\n 'getRootRef' | 'coords' | 'placement' | 'Icon'\n>;\n\n/**\n * @alias\n * @public\n */\nexport type PopoverOnShownChange = OnShownChange;\n\n/**\n * @alias\n * @public\n */\nexport type PopoverContentRenderProp = FloatingContentRenderProp;\n\ntype AllowedFloatingComponentProps = Pick<\n FloatingComponentProps,\n | 'arrow'\n | 'arrowHeight'\n | 'arrowPadding'\n | 'placement'\n | 'onPlacementChange'\n | 'trigger'\n | 'content'\n | 'hoverDelay'\n | 'closeAfterClick'\n | 'offsetByMainAxis'\n | 'offsetByCrossAxis'\n | 'defaultShown'\n | 'shown'\n | 'onShownChange'\n | 'onShownChanged'\n | 'usePortal'\n | 'sameWidth'\n | 'hideWhenReferenceHidden'\n | 'disabled'\n | 'disableInteractive'\n | 'disableCloseOnClickOutside'\n | 'disableCloseOnEscKey'\n | 'autoFocus'\n | 'restoreFocus'\n | 'children'\n | 'zIndex'\n | 'disableFlipMiddleware'\n | 'customMiddlewares'\n>;\n\n/**\n * @public\n */\nexport interface PopoverProps\n extends AllowedFloatingComponentProps,\n Omit<HTMLAttributesWithRootRef<HTMLDivElement>, keyof FloatingComponentProps> {\n /**\n * Отключает у всплывающего элемента стилизацию по умолчанию.\n *\n * У `content`:\n * - _background_\n * - _border-radius_\n * - _box-shadow_\n *\n * У `arrow`:\n * - _color_\n *\n * Используется в случае, если необходимо стилизовать по своему. Для `arrow` _color_ можно\n * определить через в `arrowProps.iconClassName` или `arrowProps.iconStyle`.\n */\n noStyling?: boolean;\n /**\n * Позволяет набросить на стрелку пользовательские атрибуты.\n */\n arrowProps?: PopoverArrowProps;\n /**\n * Пользовательская SVG иконка.\n *\n * Требования:\n *\n * 1. Иконка по умолчанию должна быть направлена вверх (a.k.a `IconUp`).\n * 2. Чтобы избежать проблемы с пространством между стрелкой и контентом на некоторых экранах,\n * растяните кривую по высоте на `1px` и увеличьте на этот размер `height` и `viewBox` SVG.\n * (см. https://github.com/VKCOM/VKUI/pull/4496).\n * 3. Передайте высоту иконки в параметр `arrowHeight`. В значении высоты можно исключить хак с `1px` из п.2.\n * 4. Убедитесь, что компонент принимает все валидные для SVG параметры.\n * 5. Убедитесь, что SVG и её элементы наследует цвет через `fill=\"currentColor\"`.\n */\n ArrowIcon?: FloatingArrowPropsPrivate['Icon'];\n /**\n * Используется для того, чтобы не удалять поповер из DOM дерева при скрытии.\n */\n keepMounted?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Popover\n */\nexport const Popover = ({\n // UsePopoverProps\n arrow: withArrow,\n arrowHeight = DEFAULT_ARROW_HEIGHT,\n arrowPadding = DEFAULT_ARROW_PADDING,\n placement: expectedPlacement = 'bottom-start',\n onPlacementChange,\n disableFlipMiddleware = false,\n trigger = 'click',\n content,\n hoverDelay = 150,\n closeAfterClick,\n offsetByMainAxis = 8,\n offsetByCrossAxis = 0,\n sameWidth,\n hideWhenReferenceHidden,\n disabled,\n disableInteractive,\n disableCloseOnClickOutside,\n disableCloseOnEscKey,\n keepMounted = false,\n customMiddlewares,\n // uncontrolled\n defaultShown = false,\n // controlled\n shown: shownProp,\n onShownChange,\n onShownChanged,\n\n // Для AppRootPortal\n usePortal = true,\n\n // Для FloatingArrow\n arrowProps,\n ArrowIcon = DefaultIcon,\n\n // FocusTrapProps\n autoFocus = true,\n restoreFocus = true,\n className,\n children,\n noStyling = false,\n zIndex = 'var(--vkui--z_index_popout)',\n // a11y\n role = 'dialog',\n ...restPopoverProps\n}: PopoverProps): React.ReactNode => {\n const [arrowRef, setArrowRef] = React.useState<HTMLDivElement | null>(null);\n const { middlewares, strictPlacement } = useFloatingMiddlewaresBootstrap({\n arrow: withArrow,\n arrowRef,\n arrowHeight,\n arrowPadding,\n placement: expectedPlacement,\n offsetByMainAxis,\n offsetByCrossAxis,\n sameWidth,\n hideWhenReferenceHidden,\n disableFlipMiddleware,\n customMiddlewares,\n });\n const {\n placement: resolvedPlacement,\n shown,\n willBeHide,\n refs,\n referenceProps,\n floatingProps,\n middlewareData,\n onClose,\n onRestoreFocus,\n onEscapeKeyDown,\n } = useFloatingWithInteractions({\n middlewares,\n placement: strictPlacement,\n trigger,\n hoverDelay,\n closeAfterClick,\n disabled,\n disableInteractive,\n disableCloseOnClickOutside,\n disableCloseOnEscKey,\n defaultShown,\n shown: shownProp,\n onShownChange,\n onShownChanged,\n });\n\n usePlacementChangeCallback(expectedPlacement, resolvedPlacement, onPlacementChange);\n\n const [, child] = usePatchChildren<HTMLDivElement>(\n children,\n injectAriaExpandedPropByRole(referenceProps, shown, role),\n refs.setReference,\n );\n\n let popover: React.ReactNode = null;\n if (shown || keepMounted) {\n const hidden = keepMounted && !shown;\n if (!hidden) {\n floatingProps.style.zIndex = String(zIndex);\n }\n\n let arrow: React.ReactElement | null = null;\n if (withArrow) {\n const { arrow: arrowCoords } = middlewareData;\n arrow = (\n <FloatingArrow\n iconClassName={noStyling ? undefined : styles['Popover__arrow']}\n {...arrowProps}\n coords={arrowCoords}\n placement={resolvedPlacement}\n getRootRef={setArrowRef}\n Icon={ArrowIcon}\n />\n );\n }\n\n popover = (\n <AppRootPortal usePortal={usePortal}>\n <div\n ref={refs.setFloating}\n className={classNames(styles['Popover'], hidden && styles['Popover--hidden'])}\n {...floatingProps}\n >\n <FocusTrap\n {...restPopoverProps}\n role={role}\n className={classNames(\n styles['Popover__in'],\n noStyling ? undefined : styles['Popover__in--withStyling'],\n willBeHide ? animationFadeClassNames.out : animationFadeClassNames.in,\n transformOriginClassNames[resolvedPlacement],\n className,\n )}\n mount={!hidden}\n disabled={hidden}\n autoFocus={disableInteractive ? false : autoFocus}\n restoreFocus={restoreFocus ? onRestoreFocus : false}\n onClose={onEscapeKeyDown}\n >\n {arrow}\n {typeof content === 'function' ? content({ onClose }) : content}\n </FocusTrap>\n </div>\n </AppRootPortal>\n );\n }\n\n return (\n <React.Fragment>\n {child}\n {popover}\n </React.Fragment>\n );\n};\n"],"names":["React","classNames","usePatchChildren","injectAriaExpandedPropByRole","animationFadeClassNames","transformOriginClassNames","useFloatingMiddlewaresBootstrap","useFloatingWithInteractions","usePlacementChangeCallback","AppRootPortal","DEFAULT_ARROW_HEIGHT","DEFAULT_ARROW_PADDING","DefaultIcon","FloatingArrow","FocusTrap","styles","Popover","arrow","withArrow","arrowHeight","arrowPadding","placement","expectedPlacement","onPlacementChange","disableFlipMiddleware","trigger","content","hoverDelay","closeAfterClick","offsetByMainAxis","offsetByCrossAxis","sameWidth","hideWhenReferenceHidden","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","keepMounted","customMiddlewares","defaultShown","shown","shownProp","onShownChange","onShownChanged","usePortal","arrowProps","ArrowIcon","autoFocus","restoreFocus","className","children","noStyling","zIndex","role","restPopoverProps","arrowRef","setArrowRef","useState","middlewares","strictPlacement","resolvedPlacement","willBeHide","refs","referenceProps","floatingProps","middlewareData","onClose","onRestoreFocus","onEscapeKeyDown","child","setReference","popover","hidden","style","String","arrowCoords","iconClassName","undefined","coords","getRootRef","Icon","div","ref","setFloating","out","in","mount","Fragment"],"mappings":"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"}
|
|
@@ -63,6 +63,10 @@ export interface UseFloatingWithInteractionsProps {
|
|
|
63
63
|
* Вызывается при каждом изменении видимости всплывающего элемента.
|
|
64
64
|
*/
|
|
65
65
|
onShownChange?: OnShownChange;
|
|
66
|
+
/**
|
|
67
|
+
* Вызывается при каждом изменении видимости всплывающего элемента, но после завершении анимации.
|
|
68
|
+
*/
|
|
69
|
+
onShownChanged?: OnShownChange;
|
|
66
70
|
}
|
|
67
71
|
export type ReferenceProps<T = HTMLElement> = Omit<React.HTMLAttributes<T>, keyof React.DOMAttributes<T>> & Pick<React.DOMAttributes<T>, 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'>;
|
|
68
72
|
export type FloatingProps<T = HTMLElement> = Omit<React.HTMLAttributes<T>, keyof React.DOMAttributes<T> | 'style'> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,qBAAqB,EACrB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAEzC,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,sBAAsB,EAAE,CAAC;AAEhG,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,YAAY,GACZ,OAAO,GACP,OAAO,GACP,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAEjF,MAAM,WAAW,gCAAgC;IAC/C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"sourcesContent":["import type {\n Placement,\n UseFloatingData,\n UseFloatingMiddleware,\n UseFloatingRefs,\n} from '../types/common';\n\nexport type InteractiveTriggerType = 'click' | 'hover' | 'focus';\n\nexport type ManualTriggerType = 'manual';\n\nexport type TriggerType = ManualTriggerType | InteractiveTriggerType | InteractiveTriggerType[];\n\nexport type ShownChangeReason =\n | 'click-outside'\n | 'escape-key'\n | 'click'\n | 'hover'\n | 'focus'\n | 'callback';\n\nexport type OnShownChange = (shown: boolean, reason?: ShownChangeReason) => void;\n\nexport interface UseFloatingWithInteractionsProps {\n placement?: Placement;\n middlewares?: UseFloatingMiddleware[];\n /**\n * Механика вызова всплывающего элемента.\n *\n * - `\"click\"` – показывается/скрывается только при нажатии.\n * - `\"hover\"` – будет показываться/скрывается при наведении/отведении мыши.\n * - `\"focus\"` – будет показываться/скрывается при фокусе/потере фокуса мыши.\n * - `\"manual\"` – будет показываться/скрывается только через свойство `shown`. `onShownChange`\n * будет вызываться при нажатии за пределы целевого и всплывающего элементов, а также по кнопке\n * ESC.\n *\n * > ⚠️`\"hover\"` на тач-устройствах будет работать как `\"click\"`, с одним лишь нюансом, что\n * > не будет закрываться при повторном нажатии на целевой элемент. Для закрытия необходимо нажать\n * > на область вне целевого элемента и выпадающего окна.\n */\n trigger?: TriggerType;\n /**\n * Количество миллисекунд, после которых произойдёт показ/скрытие всплывающего элемента\n * при наведении.\n *\n * > Чтобы задать разное время на показ и скрытие, передайте массив типа `[<показ>, <скрытие>]`.\n *\n * > Используется только для `trigger=\"hover\"`.\n */\n hoverDelay?: number | [number, number];\n /**\n * При `trigger=\"hover\"` закрывает всплывающий элемент при нажатии на целевой элемент.\n */\n closeAfterClick?: boolean;\n /**\n * Блокирует изменение состояния.\n */\n disabled?: boolean;\n /**\n * Отключает взаимодействие со всплывающим элементом.\n */\n disableInteractive?: boolean;\n /**\n * Отключает закрытие нажатием на область вне целевого и всплывающего элемента.\n */\n disableCloseOnClickOutside?: boolean;\n /**\n * Отключает закрытие нажатием на кнопку ESC.\n */\n disableCloseOnEscKey?: boolean;\n /**\n * Начальное состояние всплывающего элемента.\n */\n defaultShown?: boolean;\n /**\n * Если передан, то всплывающий элемент будет показано/скрыто в зависимости от значения свойства.\n */\n shown?: boolean;\n /**\n * Вызывается при каждом изменении видимости всплывающего элемента.\n */\n onShownChange?: OnShownChange;\n}\n\nexport type ReferenceProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T>\n> &\n Pick<React.DOMAttributes<T>, 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'>;\n\nexport type FloatingProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T> | 'style'\n> & { style: React.CSSProperties } & Pick<\n React.DOMAttributes<T>,\n 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onAnimationStart' | 'onAnimationEnd'\n >;\n\nexport interface UseFloatingWithInteractionsReturn<T extends HTMLElement = HTMLElement> {\n placement: Placement;\n shown: boolean;\n willBeHide: boolean;\n refs: UseFloatingRefs<T>;\n referenceProps: ReferenceProps<T>;\n floatingProps: FloatingProps<T>;\n middlewareData: UseFloatingData['middlewareData'];\n onClose: (this: void) => void;\n onEscapeKeyDown?: (this: void) => void;\n onRestoreFocus: (this: void) => boolean;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"sourcesContent":["import type {\n Placement,\n UseFloatingData,\n UseFloatingMiddleware,\n UseFloatingRefs,\n} from '../types/common';\n\nexport type InteractiveTriggerType = 'click' | 'hover' | 'focus';\n\nexport type ManualTriggerType = 'manual';\n\nexport type TriggerType = ManualTriggerType | InteractiveTriggerType | InteractiveTriggerType[];\n\nexport type ShownChangeReason =\n | 'click-outside'\n | 'escape-key'\n | 'click'\n | 'hover'\n | 'focus'\n | 'callback';\n\nexport type OnShownChange = (shown: boolean, reason?: ShownChangeReason) => void;\n\nexport interface UseFloatingWithInteractionsProps {\n placement?: Placement;\n middlewares?: UseFloatingMiddleware[];\n /**\n * Механика вызова всплывающего элемента.\n *\n * - `\"click\"` – показывается/скрывается только при нажатии.\n * - `\"hover\"` – будет показываться/скрывается при наведении/отведении мыши.\n * - `\"focus\"` – будет показываться/скрывается при фокусе/потере фокуса мыши.\n * - `\"manual\"` – будет показываться/скрывается только через свойство `shown`. `onShownChange`\n * будет вызываться при нажатии за пределы целевого и всплывающего элементов, а также по кнопке\n * ESC.\n *\n * > ⚠️`\"hover\"` на тач-устройствах будет работать как `\"click\"`, с одним лишь нюансом, что\n * > не будет закрываться при повторном нажатии на целевой элемент. Для закрытия необходимо нажать\n * > на область вне целевого элемента и выпадающего окна.\n */\n trigger?: TriggerType;\n /**\n * Количество миллисекунд, после которых произойдёт показ/скрытие всплывающего элемента\n * при наведении.\n *\n * > Чтобы задать разное время на показ и скрытие, передайте массив типа `[<показ>, <скрытие>]`.\n *\n * > Используется только для `trigger=\"hover\"`.\n */\n hoverDelay?: number | [number, number];\n /**\n * При `trigger=\"hover\"` закрывает всплывающий элемент при нажатии на целевой элемент.\n */\n closeAfterClick?: boolean;\n /**\n * Блокирует изменение состояния.\n */\n disabled?: boolean;\n /**\n * Отключает взаимодействие со всплывающим элементом.\n */\n disableInteractive?: boolean;\n /**\n * Отключает закрытие нажатием на область вне целевого и всплывающего элемента.\n */\n disableCloseOnClickOutside?: boolean;\n /**\n * Отключает закрытие нажатием на кнопку ESC.\n */\n disableCloseOnEscKey?: boolean;\n /**\n * Начальное состояние всплывающего элемента.\n */\n defaultShown?: boolean;\n /**\n * Если передан, то всплывающий элемент будет показано/скрыто в зависимости от значения свойства.\n */\n shown?: boolean;\n /**\n * Вызывается при каждом изменении видимости всплывающего элемента.\n */\n onShownChange?: OnShownChange;\n /**\n * Вызывается при каждом изменении видимости всплывающего элемента, но после завершении анимации.\n */\n onShownChanged?: OnShownChange;\n}\n\nexport type ReferenceProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T>\n> &\n Pick<React.DOMAttributes<T>, 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'>;\n\nexport type FloatingProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T> | 'style'\n> & { style: React.CSSProperties } & Pick<\n React.DOMAttributes<T>,\n 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onAnimationStart' | 'onAnimationEnd'\n >;\n\nexport interface UseFloatingWithInteractionsReturn<T extends HTMLElement = HTMLElement> {\n placement: Placement;\n shown: boolean;\n willBeHide: boolean;\n refs: UseFloatingRefs<T>;\n referenceProps: ReferenceProps<T>;\n floatingProps: FloatingProps<T>;\n middlewareData: UseFloatingData['middlewareData'];\n onClose: (this: void) => void;\n onEscapeKeyDown?: (this: void) => void;\n onRestoreFocus: (this: void) => boolean;\n}\n"],"names":[],"mappings":"AAsGA,WAWC"}
|
|
@@ -2,5 +2,5 @@ import type { UseFloatingWithInteractionsProps, UseFloatingWithInteractionsRetur
|
|
|
2
2
|
/**
|
|
3
3
|
* @private
|
|
4
4
|
*/
|
|
5
|
-
export declare const useFloatingWithInteractions: <T extends HTMLElement = HTMLElement>({ trigger, placement: placementProp, middlewares, hoverDelay, closeAfterClick, disabled, disableInteractive, disableCloseOnClickOutside, disableCloseOnEscKey, defaultShown, shown: shownProp, onShownChange: onShownChangeProp, }: UseFloatingWithInteractionsProps) => UseFloatingWithInteractionsReturn<T>;
|
|
5
|
+
export declare const useFloatingWithInteractions: <T extends HTMLElement = HTMLElement>({ trigger, placement: placementProp, middlewares, hoverDelay, closeAfterClick, disabled, disableInteractive, disableCloseOnClickOutside, disableCloseOnEscKey, defaultShown, shown: shownProp, onShownChange: onShownChangeProp, onShownChanged: onShownChangedProp, }: UseFloatingWithInteractionsProps) => UseFloatingWithInteractionsReturn<T>;
|
|
6
6
|
//# sourceMappingURL=useFloatingWithInteractions.d.ts.map
|
package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,WAAW,
|
|
1
|
+
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,WAAW,wRAsB9D,gCAAgC,KAAG,iCAAiC,CAAC,CAAC,CAsUxE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { debounce } from '@vkontakte/vkjs';
|
|
2
|
+
import { debounce, noop } from '@vkontakte/vkjs';
|
|
3
3
|
import { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';
|
|
4
4
|
import { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';
|
|
5
5
|
import { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';
|
|
@@ -19,7 +19,7 @@ const whileElementsMounted = (...args)=>/* istanbul ignore next: не знаю
|
|
|
19
19
|
placement: placementProp = 'bottom', middlewares, hoverDelay = 0, closeAfterClick = false, // disables
|
|
20
20
|
disabled = false, disableInteractive = false, disableCloseOnClickOutside = false, disableCloseOnEscKey = false, // uncontrolled
|
|
21
21
|
defaultShown = false, // controlled
|
|
22
|
-
shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
22
|
+
shown: shownProp, onShownChange: onShownChangeProp, onShownChanged: onShownChangedProp })=>{
|
|
23
23
|
const memoizedValue = React.useMemo(()=>shownProp !== undefined ? {
|
|
24
24
|
shown: shownProp
|
|
25
25
|
} : undefined, [
|
|
@@ -37,6 +37,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
37
37
|
}
|
|
38
38
|
})
|
|
39
39
|
});
|
|
40
|
+
const onShownChanged = useStableCallback(onShownChangedProp ? onShownChangedProp : noop);
|
|
40
41
|
const [shownFinalState, setShownFinalState] = React.useState(()=>shownLocalState.shown);
|
|
41
42
|
const [willBeHide, setWillBeHide] = React.useState(false);
|
|
42
43
|
const hasCSSAnimation = React.useRef(false);
|
|
@@ -154,6 +155,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
154
155
|
if (willBeHide) {
|
|
155
156
|
setShownFinalState(false);
|
|
156
157
|
setWillBeHide(false);
|
|
158
|
+
onShownChanged(false, shownLocalState.reason);
|
|
157
159
|
}
|
|
158
160
|
};
|
|
159
161
|
const handleOnClose = React.useCallback(()=>{
|
|
@@ -210,6 +212,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
210
212
|
}
|
|
211
213
|
if (shownLocalState.shown) {
|
|
212
214
|
setShownFinalState(true);
|
|
215
|
+
onShownChanged(true, shownLocalState.reason);
|
|
213
216
|
} else if (hasCSSAnimation.current && !willBeHide) {
|
|
214
217
|
setWillBeHide(true);
|
|
215
218
|
} else {
|
|
@@ -221,7 +224,8 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
221
224
|
}, [
|
|
222
225
|
shownLocalState,
|
|
223
226
|
shownFinalState,
|
|
224
|
-
willBeHide
|
|
227
|
+
willBeHide,
|
|
228
|
+
onShownChanged
|
|
225
229
|
]);
|
|
226
230
|
const referencePropsRef = React.useRef({});
|
|
227
231
|
const floatingPropsRef = React.useRef({
|
package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown || prevState.reason !== reason) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n // Повторный вызов события фокуса - следствие клика на reference-элемент\n if (shownLocalState.shown) {\n commitShownLocalState(false, 'focus');\n return;\n }\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n // Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов\n if (shownLocalState.reason === 'focus') {\n commitShownLocalState(shownLocalState.shown, 'click');\n return;\n }\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback((event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n hideWithDelay();\n }\n },\n );\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["React","debounce","getWindow","isHTMLElement","useCustomEnsuredControl","useGlobalOnClickOutside","useStableCallback","contains","getActiveElementByAnotherElement","useIsomorphicLayoutEffect","autoUpdateFloatingElement","useFloating","convertFloatingDataToReactCSSProperties","DEFAULT_TRIGGER","useResolveTriggerType","whileElementsMounted","args","elementResize","useFloatingWithInteractions","trigger","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","memoizedValue","useMemo","undefined","shownLocalState","setShownLocalState","value","defaultValue","onChange","reason","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","x","y","strategy","refs","middlewareData","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","currentTarget","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","win","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,SAASC,SAAS,EAAEC,aAAa,QAAQ,wCAAwC;AACjF,SAASC,uBAAuB,QAAQ,mCAAmC;AAC3E,SAASC,uBAAuB,QAAQ,yCAAyC;AACjF,SAASC,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,QAAQ,EAAEC,gCAAgC,QAAQ,YAAY;AACvE,SAASC,yBAAyB,QAAQ,kCAAkC;AAC5E,SAASC,yBAAyB,EAAEC,WAAW,QAAQ,cAAc;AACrE,SAASC,uCAAuC,QAAQ,eAAe;AAEvE,SAASC,eAAe,QAAQ,cAAc;AAQ9C,SAASC,qBAAqB,QAAQ,0BAA0B;AAIhE,MAAMC,uBAAmE,CAAC,GAAGC,OAC3E,+CAA+C,GAC/CN,6BAA6BM,MAAM;QAAEC,eAAe;IAAK;AAE3D;;CAEC,GACD,OAAO,MAAMC,8BAA8B,CAAsC,EAC/EC,UAAUN,eAAe,EAEzB,cAAc;AACdO,WAAWC,gBAAgB,QAAQ,EACnCC,WAAW,EACXC,aAAa,CAAC,EACdC,kBAAkB,KAAK,EAEvB,WAAW;AACXC,WAAW,KAAK,EAChBC,qBAAqB,KAAK,EAC1BC,6BAA6B,KAAK,EAClCC,uBAAuB,KAAK,EAE5B,eAAe;AACfC,eAAe,KAAK,EAEpB,aAAa;AACbC,OAAOC,SAAS,EAChBC,eAAeC,iBAAiB,EACC;IACjC,MAAMC,gBAAgBlC,MAAMmC,OAAO,CACjC,IAAOJ,cAAcK,YAAY;YAAEN,OAAOC;QAAU,IAAIK,WACxD;QAACL;KAAU;IAEb,MAAM,CAACM,iBAAiBC,mBAAmB,GAAGlC,wBAAoC;QAChFmC,OAAOL;QACPT;QACAe,cAAc;YAAEV,OAAOD;QAAa;QACpCY,UAAUnC,kBAAkB,CAAC,EAAEwB,KAAK,EAAEY,MAAM,EAAE;YAC5C,IAAIT,mBAAmB;gBACrBA,kBAAkBH,OAAOY;YAC3B;QACF;IACF;IACA,MAAM,CAACC,iBAAiBC,mBAAmB,GAAG5C,MAAM6C,QAAQ,CAAC,IAAMR,gBAAgBP,KAAK;IACxF,MAAM,CAACgB,YAAYC,cAAc,GAAG/C,MAAM6C,QAAQ,CAAC;IAEnD,MAAMG,kBAAkBhD,MAAMiD,MAAM,CAAC;IAErC,MAAMC,qBAAqBlD,MAAMiD,MAAM,CAAC;IACxC,MAAME,gBAAgBnD,MAAMiD,MAAM,CAAC;IACnC,MAAMG,iBAAiBpD,MAAMiD,MAAM;IAEnC,MAAMI,6CACJ5B,YAAYE,8BAA8BmB,cAAc,CAACT,gBAAgBP,KAAK;IAChF,MAAMwB,4CACJ5B,sBAAsB2B;IAExB,MAAM,EAAEE,cAAc,EAAEC,cAAc,EAAEC,cAAc,EAAE,GAAG3C,sBAAsBK;IAEjF,2BAA2B;IAC3B,MAAM,EAAEC,SAAS,EAAEsC,CAAC,EAAEC,CAAC,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,cAAc,EAAE,GAAGnD,YAAe;QACzEiD,UAAU;QACVxC,WAAWC;QACX0C,YAAYzC;QACZP;IACF;IAEA,MAAMiD,wBAAwBhE,MAAMiE,WAAW,CAC7C,CAACC,WAAoBxB;QACnBJ,mBAAmB,CAAC6B;YAClB,IAAIA,UAAUrC,KAAK,KAAKoC,aAAaC,UAAUzB,MAAM,KAAKA,QAAQ;gBAChE,OAAO;oBACLZ,OAAOoC;oBACPxB;gBACF;YACF;YACA,+GAA+G,GAC/G,OAAOyB;QACT;IACF,GACA;QAAC7B;KAAmB;IAGtB,MAAM,CAAC8B,iBAAiBC,gBAAgB,GACtC,OAAO9C,eAAe,WAAW;QAACA;QAAYA;KAAW,GAAGA;IAE9D,MAAM+C,gBAAgBtE,MAAMmC,OAAO,CACjC,IAAMlC,SAAS,IAAM+D,sBAAsB,MAAM,UAAUI,kBAC3D;QAACA;QAAiBJ;KAAsB;IAG1C,MAAMO,gBAAgBvE,MAAMmC,OAAO,CACjC,IAAMlC,SAAS,IAAM+D,sBAAsB,OAAO,UAAUK,kBAC5D;QAACA;QAAiBL;KAAsB;IAG1C,MAAMQ,yBAAyBlE,kBAAkB;QAC/C,wEAAwE;QACxE,IAAI+B,gBAAgBP,KAAK,EAAE;YACzBkC,sBAAsB,OAAO;YAC7B;QACF;QACA,IAAIb,cAAcsB,OAAO,EAAE;YACzB,oFAAoF,GACpFtB,cAAcsB,OAAO,GAAG;YACxB;QACF;QAEAT,sBAAsB,MAAM;IAC9B;IAEA,MAAMU,wBAAwBpE,kBAAkB,CAACqE;QAC/CxB,cAAcsB,OAAO,GAAG;QACxBvB,mBAAmBuB,OAAO,GAAG;QAE7B,IAAI,CAACpC,gBAAgBP,KAAK,EAAE;YAC1B8C,aAAaxB,eAAeqB,OAAO;YACnC;QACF;QAEA,MAAMI,gBAAgBF,MAAME,aAAa;QACzCzB,eAAeqB,OAAO,GAAGK,WAAW,SAASC;YAC3C,MAAMC,YAAYnB,KAAKmB,SAAS,CAACP,OAAO;YACxC,kEAAkE;YAClE,oCAAoC;YACpC,mEAAmE,GACnE,IAAI,CAACI,iBAAiBrE,iCAAiCwE,eAAeA,WAAW;gBAC/E,wBAAwB,GACxB;YACF;YAEA,uFAAuF;YACvF,wFAAwF;YACxF,IAAIzE,SAASsD,KAAKoB,QAAQ,CAACR,OAAO,EAAEI,kBAAkBtE,SAASyE,WAAWH,gBAAgB;gBACxF;YACF;YAEAb,sBAAsB,OAAO;QAC/B;IACF;IAEA,MAAMkB,yBAAyB5E,kBAAkB;QAC/C,8FAA8F;QAC9F,IAAI+B,gBAAgBK,MAAM,KAAK,SAAS;YACtCsB,sBAAsB3B,gBAAgBP,KAAK,EAAE;YAC7C;QACF;QACAkC,sBAAsB,CAAC3B,gBAAgBP,KAAK,EAAE;IAChD;IAEA,MAAMqD,qCAAqC7E,kBAAkB;QAC3D4C,mBAAmBuB,OAAO,GAAG;QAC7BT,sBAAsB,OAAO;IAC/B;IAEA,MAAMoB,yBAAyB9E,kBAAkB,CAACqE;QAChD,IAAI7B,cAAc6B,MAAMU,aAAa,KAAKxB,KAAKoB,QAAQ,CAACR,OAAO,EAAE;YAC/D;QACF;QAEAH,cAAcgB,MAAM;QACpBf,cAAce,MAAM;QAEpB,IAAI,CAACpC,mBAAmBuB,OAAO,IAAI,CAACpC,gBAAgBP,KAAK,EAAE;YACzDwC;QACF;IACF;IAEA,MAAMiB,+CAA+CjF,kBACnD,CAACqE;QACC,IAAI7B,cAAc6B,MAAMU,aAAa,KAAKxB,KAAKoB,QAAQ,CAACR,OAAO,EAAE;YAC/D;QACF;QAEAtB,cAAcsB,OAAO,GAAG;QACxBvB,mBAAmBuB,OAAO,GAAG;QAE7B,IAAIhB,gBAAgB;YAClBa,cAAcgB,MAAM;YACpBf,cAAce,MAAM;YAEpBf;QACF;IACF;IAGF,MAAMiB,+BAA+B;QACnCxC,gBAAgByB,OAAO,GAAG;IAC5B;IAEA,MAAMgB,6BAA6B;QACjC,IAAI3C,YAAY;YACdF,mBAAmB;YACnBG,cAAc;QAChB;IACF;IAEA,MAAM2C,gBAAgB1F,MAAMiE,WAAW,CAAC;QACtCd,cAAcsB,OAAO,GAAG;QACxBT,sBAAsB,OAAO;IAC/B,GAAG;QAACA;KAAsB;IAE1B,MAAM2B,qBAAqB3F,MAAMiE,WAAW,CAC1C,IAAOV,iBAAiBJ,cAAcsB,OAAO,GAAG,MAChD;QAAClB;KAAe;IAGlB,MAAMqC,sBAAsB5F,MAAMiE,WAAW,CAAC;QAC5Cd,cAAcsB,OAAO,GAAG;QACxBT,sBAAsB,OAAO;IAC/B,GAAG;QAACA;KAAsB;IAE1B,MAAM6B,qBAAqB7F,MAAMiE,WAAW,CAAC;QAC3Cd,cAAcsB,OAAO,GAAG;QACxBT,sBAAsB,OAAO;IAC/B,GAAG;QAACA;KAAsB;IAE1B3D,wBACEwF,oBACAxC,6CAA6C,OAAOQ,KAAKmB,SAAS,EAClE1B,4CAA4C,OAAOO,KAAKoB,QAAQ;IAGlExE,0BACE;;;;;;KAMC,GACD,SAASqF;QACP,IAAI,CAACvC,kBAAkB,CAACM,KAAKmB,SAAS,CAACP,OAAO,EAAE;YAC9C;QACF;QAEA,MAAMsB,mBAAmB;YACvB,wBAAwB,GACxB,MAAMf,YAAYnB,KAAKmB,SAAS,CAACP,OAAO;YACxC,mEAAmE,GACnE,IACE,CAACpC,gBAAgBP,KAAK,IACtB3B,cAAc6E,cACdA,cAAcxE,iCAAiCwE,YAC/C;gBACA,wBAAwB,GACxB7B,cAAcsB,OAAO,GAAG;YAC1B;QACF;QAEA,MAAMuB,MAAM9F,UAAU2D,KAAKmB,SAAS,CAACP,OAAO;QAC5CuB,IAAIC,gBAAgB,CAAC,QAAQF;QAC7B,OAAO;YACLC,IAAIE,mBAAmB,CAAC,QAAQH;QAClC;IACF,GACA;QAACxC;QAAgBM,KAAKmB,SAAS;QAAE3C;KAAgB;IAGnD5B,0BACE,SAAS0F;QACP,IAAIrD,cAAcT,gBAAgBP,KAAK,KAAKa,iBAAiB;YAC3D;QACF;QAEA,IAAIN,gBAAgBP,KAAK,EAAE;YACzBc,mBAAmB;QACrB,OAAO,IAAII,gBAAgByB,OAAO,IAAI,CAAC3B,YAAY;YACjDC,cAAc;QAChB,OAAO;YACLH,mBAAmB;QACrB;QAEA,OAAO;YACLgC,aAAaxB,eAAeqB,OAAO;QACrC;IACF,GACA;QAACpC;QAAiBM;QAAiBG;KAAW;IAGhD,MAAMsD,oBAAoBpG,MAAMiD,MAAM,CAAiB,CAAC;IACxD,MAAMoD,mBAAmBrG,MAAMiD,MAAM,CAAgB;QAAEqD,OAAO,CAAC;IAAE;IAEjE,IAAI3D,iBAAiB;QACnB0D,iBAAiB5B,OAAO,CAAC6B,KAAK,GAAG1F,wCAC/BgD,UACAF,GACAC,GACAvB,WACA0B;QAGF,IAAIpC,oBAAoB;YACtB2E,iBAAiB5B,OAAO,CAAC6B,KAAK,CAACC,aAAa,GAAG;QACjD;IACF;IAEA,IAAIhD,gBAAgB;QAClB6C,kBAAkB3B,OAAO,CAAC+B,OAAO,GAAGhC;QACpC4B,kBAAkB3B,OAAO,CAACgC,MAAM,GAAG/B;IACrC;IAEA,IAAIlB,gBAAgB;QAClB4C,kBAAkB3B,OAAO,CAACiC,OAAO,GAAGxB;IACtC;IAEA,IAAIzB,gBAAgB;QAClB2C,kBAAkB3B,OAAO,CAACkC,WAAW,GAAGvB;QAExC,IAAI5D,mBAAmB,CAACgC,gBAAgB;YACtC4C,kBAAkB3B,OAAO,CAACiC,OAAO,GAAGvB;QACtC;QAEA,IAAI,CAACzD,oBAAoB;YACvB2E,iBAAiB5B,OAAO,CAACkC,WAAW,GAAGvB;QACzC;IACF;IAEA,IAAI3B,kBAAkBF,gBAAgB;QACpC6C,kBAAkB3B,OAAO,CAACmC,YAAY,GAAGrB;QAEzC,IAAI,CAAC7D,oBAAoB;YACvB2E,iBAAiB5B,OAAO,CAACmC,YAAY,GAAGrB;QAC1C;IACF;IAEA,IAAI5C,iBAAiB;QACnB0D,iBAAiB5B,OAAO,CAACoC,gBAAgB,GAAGrB;QAC5Ca,iBAAiB5B,OAAO,CAACqC,cAAc,GAAGrB;IAC5C;IAEA,OAAO;QACLrE;QACAU,OAAOa;QACPG;QACAe;QACAkD,gBAAgBX,kBAAkB3B,OAAO;QACzCuC,eAAeX,iBAAiB5B,OAAO;QACvCX;QACAmD,SAASvB;QACT,4FAA4F;QAC5F,kCAAkC;QAClCwB,iBAAiB,CAACvE,mBAAmBf,uBAAuBQ,YAAYwD;QACxE,2BAA2B;QAC3B,EAAE;QACF,+FAA+F;QAC/F,qFAAqF;QACrF,mFAAmF;QACnF,gFAAgF;QAChFuB,gBAAgBxB;IAClB;AACF,EAAE"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce, noop } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n onShownChanged: onShownChangedProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const onShownChanged = useStableCallback(onShownChangedProp ? onShownChangedProp : noop);\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown || prevState.reason !== reason) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n // Повторный вызов события фокуса - следствие клика на reference-элемент\n if (shownLocalState.shown) {\n commitShownLocalState(false, 'focus');\n return;\n }\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n // Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов\n if (shownLocalState.reason === 'focus') {\n commitShownLocalState(shownLocalState.shown, 'click');\n return;\n }\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback((event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n hideWithDelay();\n }\n },\n );\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n onShownChanged(false, shownLocalState.reason);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n onShownChanged(true, shownLocalState.reason);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide, onShownChanged],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["React","debounce","noop","getWindow","isHTMLElement","useCustomEnsuredControl","useGlobalOnClickOutside","useStableCallback","contains","getActiveElementByAnotherElement","useIsomorphicLayoutEffect","autoUpdateFloatingElement","useFloating","convertFloatingDataToReactCSSProperties","DEFAULT_TRIGGER","useResolveTriggerType","whileElementsMounted","args","elementResize","useFloatingWithInteractions","trigger","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","onShownChanged","onShownChangedProp","memoizedValue","useMemo","undefined","shownLocalState","setShownLocalState","value","defaultValue","onChange","reason","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","x","y","strategy","refs","middlewareData","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","currentTarget","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","win","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"mappings":"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"}
|
|
@@ -63,6 +63,10 @@ export interface UseFloatingWithInteractionsProps {
|
|
|
63
63
|
* Вызывается при каждом изменении видимости всплывающего элемента.
|
|
64
64
|
*/
|
|
65
65
|
onShownChange?: OnShownChange;
|
|
66
|
+
/**
|
|
67
|
+
* Вызывается при каждом изменении видимости всплывающего элемента, но после завершении анимации.
|
|
68
|
+
*/
|
|
69
|
+
onShownChanged?: OnShownChange;
|
|
66
70
|
}
|
|
67
71
|
export type ReferenceProps<T = HTMLElement> = Omit<React.HTMLAttributes<T>, keyof React.DOMAttributes<T>> & Pick<React.DOMAttributes<T>, 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'>;
|
|
68
72
|
export type FloatingProps<T = HTMLElement> = Omit<React.HTMLAttributes<T>, keyof React.DOMAttributes<T> | 'style'> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,qBAAqB,EACrB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAEzC,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,sBAAsB,EAAE,CAAC;AAEhG,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,YAAY,GACZ,OAAO,GACP,OAAO,GACP,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAEjF,MAAM,WAAW,gCAAgC;IAC/C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"sourcesContent":["import type {\n Placement,\n UseFloatingData,\n UseFloatingMiddleware,\n UseFloatingRefs,\n} from '../types/common';\n\nexport type InteractiveTriggerType = 'click' | 'hover' | 'focus';\n\nexport type ManualTriggerType = 'manual';\n\nexport type TriggerType = ManualTriggerType | InteractiveTriggerType | InteractiveTriggerType[];\n\nexport type ShownChangeReason =\n | 'click-outside'\n | 'escape-key'\n | 'click'\n | 'hover'\n | 'focus'\n | 'callback';\n\nexport type OnShownChange = (shown: boolean, reason?: ShownChangeReason) => void;\n\nexport interface UseFloatingWithInteractionsProps {\n placement?: Placement;\n middlewares?: UseFloatingMiddleware[];\n /**\n * Механика вызова всплывающего элемента.\n *\n * - `\"click\"` – показывается/скрывается только при нажатии.\n * - `\"hover\"` – будет показываться/скрывается при наведении/отведении мыши.\n * - `\"focus\"` – будет показываться/скрывается при фокусе/потере фокуса мыши.\n * - `\"manual\"` – будет показываться/скрывается только через свойство `shown`. `onShownChange`\n * будет вызываться при нажатии за пределы целевого и всплывающего элементов, а также по кнопке\n * ESC.\n *\n * > ⚠️`\"hover\"` на тач-устройствах будет работать как `\"click\"`, с одним лишь нюансом, что\n * > не будет закрываться при повторном нажатии на целевой элемент. Для закрытия необходимо нажать\n * > на область вне целевого элемента и выпадающего окна.\n */\n trigger?: TriggerType;\n /**\n * Количество миллисекунд, после которых произойдёт показ/скрытие всплывающего элемента\n * при наведении.\n *\n * > Чтобы задать разное время на показ и скрытие, передайте массив типа `[<показ>, <скрытие>]`.\n *\n * > Используется только для `trigger=\"hover\"`.\n */\n hoverDelay?: number | [number, number];\n /**\n * При `trigger=\"hover\"` закрывает всплывающий элемент при нажатии на целевой элемент.\n */\n closeAfterClick?: boolean;\n /**\n * Блокирует изменение состояния.\n */\n disabled?: boolean;\n /**\n * Отключает взаимодействие со всплывающим элементом.\n */\n disableInteractive?: boolean;\n /**\n * Отключает закрытие нажатием на область вне целевого и всплывающего элемента.\n */\n disableCloseOnClickOutside?: boolean;\n /**\n * Отключает закрытие нажатием на кнопку ESC.\n */\n disableCloseOnEscKey?: boolean;\n /**\n * Начальное состояние всплывающего элемента.\n */\n defaultShown?: boolean;\n /**\n * Если передан, то всплывающий элемент будет показано/скрыто в зависимости от значения свойства.\n */\n shown?: boolean;\n /**\n * Вызывается при каждом изменении видимости всплывающего элемента.\n */\n onShownChange?: OnShownChange;\n}\n\nexport type ReferenceProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T>\n> &\n Pick<React.DOMAttributes<T>, 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'>;\n\nexport type FloatingProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T> | 'style'\n> & { style: React.CSSProperties } & Pick<\n React.DOMAttributes<T>,\n 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onAnimationStart' | 'onAnimationEnd'\n >;\n\nexport interface UseFloatingWithInteractionsReturn<T extends HTMLElement = HTMLElement> {\n placement: Placement;\n shown: boolean;\n willBeHide: boolean;\n refs: UseFloatingRefs<T>;\n referenceProps: ReferenceProps<T>;\n floatingProps: FloatingProps<T>;\n middlewareData: UseFloatingData['middlewareData'];\n onClose: (this: void) => void;\n onEscapeKeyDown?: (this: void) => void;\n onRestoreFocus: (this: void) => boolean;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/floating/useFloatingWithInteractions/types.ts"],"sourcesContent":["import type {\n Placement,\n UseFloatingData,\n UseFloatingMiddleware,\n UseFloatingRefs,\n} from '../types/common';\n\nexport type InteractiveTriggerType = 'click' | 'hover' | 'focus';\n\nexport type ManualTriggerType = 'manual';\n\nexport type TriggerType = ManualTriggerType | InteractiveTriggerType | InteractiveTriggerType[];\n\nexport type ShownChangeReason =\n | 'click-outside'\n | 'escape-key'\n | 'click'\n | 'hover'\n | 'focus'\n | 'callback';\n\nexport type OnShownChange = (shown: boolean, reason?: ShownChangeReason) => void;\n\nexport interface UseFloatingWithInteractionsProps {\n placement?: Placement;\n middlewares?: UseFloatingMiddleware[];\n /**\n * Механика вызова всплывающего элемента.\n *\n * - `\"click\"` – показывается/скрывается только при нажатии.\n * - `\"hover\"` – будет показываться/скрывается при наведении/отведении мыши.\n * - `\"focus\"` – будет показываться/скрывается при фокусе/потере фокуса мыши.\n * - `\"manual\"` – будет показываться/скрывается только через свойство `shown`. `onShownChange`\n * будет вызываться при нажатии за пределы целевого и всплывающего элементов, а также по кнопке\n * ESC.\n *\n * > ⚠️`\"hover\"` на тач-устройствах будет работать как `\"click\"`, с одним лишь нюансом, что\n * > не будет закрываться при повторном нажатии на целевой элемент. Для закрытия необходимо нажать\n * > на область вне целевого элемента и выпадающего окна.\n */\n trigger?: TriggerType;\n /**\n * Количество миллисекунд, после которых произойдёт показ/скрытие всплывающего элемента\n * при наведении.\n *\n * > Чтобы задать разное время на показ и скрытие, передайте массив типа `[<показ>, <скрытие>]`.\n *\n * > Используется только для `trigger=\"hover\"`.\n */\n hoverDelay?: number | [number, number];\n /**\n * При `trigger=\"hover\"` закрывает всплывающий элемент при нажатии на целевой элемент.\n */\n closeAfterClick?: boolean;\n /**\n * Блокирует изменение состояния.\n */\n disabled?: boolean;\n /**\n * Отключает взаимодействие со всплывающим элементом.\n */\n disableInteractive?: boolean;\n /**\n * Отключает закрытие нажатием на область вне целевого и всплывающего элемента.\n */\n disableCloseOnClickOutside?: boolean;\n /**\n * Отключает закрытие нажатием на кнопку ESC.\n */\n disableCloseOnEscKey?: boolean;\n /**\n * Начальное состояние всплывающего элемента.\n */\n defaultShown?: boolean;\n /**\n * Если передан, то всплывающий элемент будет показано/скрыто в зависимости от значения свойства.\n */\n shown?: boolean;\n /**\n * Вызывается при каждом изменении видимости всплывающего элемента.\n */\n onShownChange?: OnShownChange;\n /**\n * Вызывается при каждом изменении видимости всплывающего элемента, но после завершении анимации.\n */\n onShownChanged?: OnShownChange;\n}\n\nexport type ReferenceProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T>\n> &\n Pick<React.DOMAttributes<T>, 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onFocus' | 'onBlur'>;\n\nexport type FloatingProps<T = HTMLElement> = Omit<\n React.HTMLAttributes<T>,\n keyof React.DOMAttributes<T> | 'style'\n> & { style: React.CSSProperties } & Pick<\n React.DOMAttributes<T>,\n 'onMouseOver' | 'onMouseLeave' | 'onClick' | 'onAnimationStart' | 'onAnimationEnd'\n >;\n\nexport interface UseFloatingWithInteractionsReturn<T extends HTMLElement = HTMLElement> {\n placement: Placement;\n shown: boolean;\n willBeHide: boolean;\n refs: UseFloatingRefs<T>;\n referenceProps: ReferenceProps<T>;\n floatingProps: FloatingProps<T>;\n middlewareData: UseFloatingData['middlewareData'];\n onClose: (this: void) => void;\n onEscapeKeyDown?: (this: void) => void;\n onRestoreFocus: (this: void) => boolean;\n}\n"],"names":[],"mappings":"AAsGA,WAWC"}
|
|
@@ -2,5 +2,5 @@ import type { UseFloatingWithInteractionsProps, UseFloatingWithInteractionsRetur
|
|
|
2
2
|
/**
|
|
3
3
|
* @private
|
|
4
4
|
*/
|
|
5
|
-
export declare const useFloatingWithInteractions: <T extends HTMLElement = HTMLElement>({ trigger, placement: placementProp, middlewares, hoverDelay, closeAfterClick, disabled, disableInteractive, disableCloseOnClickOutside, disableCloseOnEscKey, defaultShown, shown: shownProp, onShownChange: onShownChangeProp, }: UseFloatingWithInteractionsProps) => UseFloatingWithInteractionsReturn<T>;
|
|
5
|
+
export declare const useFloatingWithInteractions: <T extends HTMLElement = HTMLElement>({ trigger, placement: placementProp, middlewares, hoverDelay, closeAfterClick, disabled, disableInteractive, disableCloseOnClickOutside, disableCloseOnEscKey, defaultShown, shown: shownProp, onShownChange: onShownChangeProp, onShownChanged: onShownChangedProp, }: UseFloatingWithInteractionsProps) => UseFloatingWithInteractionsReturn<T>;
|
|
6
6
|
//# sourceMappingURL=useFloatingWithInteractions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,WAAW,
|
|
1
|
+
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,WAAW,wRAsB9D,gCAAgC,KAAG,iCAAiC,CAAC,CAAC,CAsUxE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { debounce } from '@vkontakte/vkjs';
|
|
2
|
+
import { debounce, noop } from '@vkontakte/vkjs';
|
|
3
3
|
import { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';
|
|
4
4
|
import { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';
|
|
5
5
|
import { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';
|
|
@@ -19,7 +19,7 @@ const whileElementsMounted = (...args)=>/* istanbul ignore next: не знаю
|
|
|
19
19
|
placement: placementProp = 'bottom', middlewares, hoverDelay = 0, closeAfterClick = false, // disables
|
|
20
20
|
disabled = false, disableInteractive = false, disableCloseOnClickOutside = false, disableCloseOnEscKey = false, // uncontrolled
|
|
21
21
|
defaultShown = false, // controlled
|
|
22
|
-
shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
22
|
+
shown: shownProp, onShownChange: onShownChangeProp, onShownChanged: onShownChangedProp })=>{
|
|
23
23
|
const memoizedValue = React.useMemo(()=>shownProp !== undefined ? {
|
|
24
24
|
shown: shownProp
|
|
25
25
|
} : undefined, [
|
|
@@ -37,6 +37,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
37
37
|
}
|
|
38
38
|
})
|
|
39
39
|
});
|
|
40
|
+
const onShownChanged = useStableCallback(onShownChangedProp ? onShownChangedProp : noop);
|
|
40
41
|
const [shownFinalState, setShownFinalState] = React.useState(()=>shownLocalState.shown);
|
|
41
42
|
const [willBeHide, setWillBeHide] = React.useState(false);
|
|
42
43
|
const hasCSSAnimation = React.useRef(false);
|
|
@@ -154,6 +155,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
154
155
|
if (willBeHide) {
|
|
155
156
|
setShownFinalState(false);
|
|
156
157
|
setWillBeHide(false);
|
|
158
|
+
onShownChanged(false, shownLocalState.reason);
|
|
157
159
|
}
|
|
158
160
|
};
|
|
159
161
|
const handleOnClose = React.useCallback(()=>{
|
|
@@ -210,6 +212,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
210
212
|
}
|
|
211
213
|
if (shownLocalState.shown) {
|
|
212
214
|
setShownFinalState(true);
|
|
215
|
+
onShownChanged(true, shownLocalState.reason);
|
|
213
216
|
} else if (hasCSSAnimation.current && !willBeHide) {
|
|
214
217
|
setWillBeHide(true);
|
|
215
218
|
} else {
|
|
@@ -221,7 +224,8 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
221
224
|
}, [
|
|
222
225
|
shownLocalState,
|
|
223
226
|
shownFinalState,
|
|
224
|
-
willBeHide
|
|
227
|
+
willBeHide,
|
|
228
|
+
onShownChanged
|
|
225
229
|
]);
|
|
226
230
|
const referencePropsRef = React.useRef({});
|
|
227
231
|
const floatingPropsRef = React.useRef({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown || prevState.reason !== reason) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n // Повторный вызов события фокуса - следствие клика на reference-элемент\n if (shownLocalState.shown) {\n commitShownLocalState(false, 'focus');\n return;\n }\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n // Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов\n if (shownLocalState.reason === 'focus') {\n commitShownLocalState(shownLocalState.shown, 'click');\n return;\n }\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback((event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n hideWithDelay();\n }\n },\n );\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["React","debounce","getWindow","isHTMLElement","useCustomEnsuredControl","useGlobalOnClickOutside","useStableCallback","contains","getActiveElementByAnotherElement","useIsomorphicLayoutEffect","autoUpdateFloatingElement","useFloating","convertFloatingDataToReactCSSProperties","DEFAULT_TRIGGER","useResolveTriggerType","whileElementsMounted","args","elementResize","useFloatingWithInteractions","trigger","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","memoizedValue","useMemo","undefined","shownLocalState","setShownLocalState","value","defaultValue","onChange","reason","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","x","y","strategy","refs","middlewareData","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","currentTarget","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","win","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce, noop } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n onShownChanged: onShownChangedProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const onShownChanged = useStableCallback(onShownChangedProp ? onShownChangedProp : noop);\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown || prevState.reason !== reason) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n // Повторный вызов события фокуса - следствие клика на reference-элемент\n if (shownLocalState.shown) {\n commitShownLocalState(false, 'focus');\n return;\n }\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n // Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов\n if (shownLocalState.reason === 'focus') {\n commitShownLocalState(shownLocalState.shown, 'click');\n return;\n }\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback((event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (willBeHide && event.currentTarget === refs.floating.current) {\n return;\n }\n\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n hideWithDelay();\n }\n },\n );\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n onShownChanged(false, shownLocalState.reason);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n onShownChanged(true, shownLocalState.reason);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide, onShownChanged],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["React","debounce","noop","getWindow","isHTMLElement","useCustomEnsuredControl","useGlobalOnClickOutside","useStableCallback","contains","getActiveElementByAnotherElement","useIsomorphicLayoutEffect","autoUpdateFloatingElement","useFloating","convertFloatingDataToReactCSSProperties","DEFAULT_TRIGGER","useResolveTriggerType","whileElementsMounted","args","elementResize","useFloatingWithInteractions","trigger","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","onShownChanged","onShownChangedProp","memoizedValue","useMemo","undefined","shownLocalState","setShownLocalState","value","defaultValue","onChange","reason","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","x","y","strategy","refs","middlewareData","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","currentTarget","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","win","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"mappings":"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"}
|