UNPKG

@base-ui-components/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

113 lines (112 loc) 4.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.usePreviewCardRoot = usePreviewCardRoot; var React = _interopRequireWildcard(require("react")); var ReactDOM = _interopRequireWildcard(require("react-dom")); var _react2 = require("@floating-ui/react"); var _useControlled = require("../../utils/useControlled"); var _useTransitionStatus = require("../../utils/useTransitionStatus"); var _useEventCallback = require("../../utils/useEventCallback"); var _useFocusExtended = require("../utils/useFocusExtended"); var _constants = require("../utils/constants"); var _translateOpenChangeReason = require("../../utils/translateOpenChangeReason"); var _useAfterExitAnimation = require("../../utils/useAfterExitAnimation"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function usePreviewCardRoot(params) { const { open: externalOpen, onOpenChange: onOpenChangeProp = () => {}, defaultOpen = false, delay, closeDelay } = params; const delayWithDefault = delay ?? _constants.OPEN_DELAY; const closeDelayWithDefault = closeDelay ?? _constants.CLOSE_DELAY; const [triggerElement, setTriggerElement] = React.useState(null); const [positionerElement, setPositionerElement] = React.useState(null); const [instantTypeState, setInstantTypeState] = React.useState(); const popupRef = React.useRef(null); const [open, setOpenUnwrapped] = (0, _useControlled.useControlled)({ controlled: externalOpen, default: defaultOpen, name: 'PreviewCard', state: 'open' }); const onOpenChange = (0, _useEventCallback.useEventCallback)(onOpenChangeProp); const { mounted, setMounted, transitionStatus } = (0, _useTransitionStatus.useTransitionStatus)(open); const setOpen = (0, _useEventCallback.useEventCallback)((nextOpen, event, reason) => { onOpenChange(nextOpen, event, reason); setOpenUnwrapped(nextOpen); }); (0, _useAfterExitAnimation.useAfterExitAnimation)({ open, animatedElementRef: popupRef, onFinished: () => setMounted(false) }); const context = (0, _react2.useFloatingRootContext)({ elements: { reference: triggerElement, floating: positionerElement }, open, onOpenChange(openValue, eventValue, reasonValue) { const isHover = reasonValue === 'hover' || reasonValue === 'safe-polygon'; const isFocusOpen = openValue && reasonValue === 'focus'; const isDismissClose = !openValue && (reasonValue === 'reference-press' || reasonValue === 'escape-key'); function changeState() { setOpen(openValue, eventValue, (0, _translateOpenChangeReason.translateOpenChangeReason)(reasonValue)); } if (isHover) { // If a hover reason is provided, we need to flush the state synchronously. This ensures // `node.getAnimations()` knows about the new state. ReactDOM.flushSync(changeState); } else { changeState(); } if (isFocusOpen || isDismissClose) { setInstantTypeState(isFocusOpen ? 'focus' : 'dismiss'); } else if (reasonValue === 'hover') { setInstantTypeState(undefined); } } }); const instantType = instantTypeState; const computedRestMs = delayWithDefault; const hover = (0, _react2.useHover)(context, { mouseOnly: true, move: false, handleClose: (0, _react2.safePolygon)(), restMs: computedRestMs, delay: { close: closeDelayWithDefault } }); const focus = (0, _useFocusExtended.useFocusExtended)(context); const dismiss = (0, _react2.useDismiss)(context); const { getReferenceProps: getRootTriggerProps, getFloatingProps: getRootPopupProps } = (0, _react2.useInteractions)([hover, focus, dismiss]); return React.useMemo(() => ({ open, setOpen, mounted, setMounted, setTriggerElement, positionerElement, setPositionerElement, popupRef, getRootTriggerProps, getRootPopupProps, floatingRootContext: context, instantType, transitionStatus }), [mounted, open, setMounted, setOpen, positionerElement, getRootTriggerProps, getRootPopupProps, context, instantType, transitionStatus]); }