@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
258 lines (255 loc) • 7.66 kB
JavaScript
'use client';
import { jsxs, jsx } from 'react/jsx-runtime';
import { useRef, useState, useCallback } from 'react';
import { useId, useClickOutside } from '@mantine/hooks';
import { getDefaultZIndex } from '../../core/utils/get-default-z-index/get-default-z-index.mjs';
import { getRadius, getShadow } from '../../core/utils/get-size/get-size.mjs';
import { createVarsResolver } from '../../core/styles-api/create-vars-resolver/create-vars-resolver.mjs';
import 'clsx';
import { useResolvedStylesApi } from '../../core/styles-api/use-resolved-styles-api/use-resolved-styles-api.mjs';
import { useStyles } from '../../core/styles-api/use-styles/use-styles.mjs';
import { useMantineEnv } from '../../core/MantineProvider/Mantine.context.mjs';
import '../../core/MantineProvider/default-theme.mjs';
import '../../core/MantineProvider/MantineProvider.mjs';
import '../../core/MantineProvider/MantineThemeProvider/MantineThemeProvider.mjs';
import { useProps } from '../../core/MantineProvider/use-props/use-props.mjs';
import '../../core/MantineProvider/MantineCssVariables/MantineCssVariables.mjs';
import '../../core/Box/Box.mjs';
import { useDirection } from '../../core/DirectionProvider/DirectionProvider.mjs';
import '@floating-ui/react';
import { getFloatingPosition } from '../Floating/get-floating-position/get-floating-position.mjs';
import '../Floating/FloatingArrow/FloatingArrow.mjs';
import { Overlay } from '../Overlay/Overlay.mjs';
import '../Portal/Portal.mjs';
import { OptionalPortal } from '../Portal/OptionalPortal.mjs';
import { Transition } from '../Transition/Transition.mjs';
import { PopoverContextProvider } from './Popover.context.mjs';
import { PopoverDropdown } from './PopoverDropdown/PopoverDropdown.mjs';
import { PopoverTarget } from './PopoverTarget/PopoverTarget.mjs';
import { usePopover } from './use-popover.mjs';
import classes from './Popover.module.css.mjs';
const defaultProps = {
position: "bottom",
offset: 8,
positionDependencies: [],
transitionProps: { transition: "fade", duration: 150 },
middlewares: { flip: true, shift: true, inline: false },
arrowSize: 7,
arrowOffset: 5,
arrowRadius: 0,
arrowPosition: "side",
closeOnClickOutside: true,
withinPortal: true,
closeOnEscape: true,
trapFocus: false,
withRoles: true,
returnFocus: false,
withOverlay: false,
hideDetached: true,
clickOutsideEvents: ["mousedown", "touchstart"],
zIndex: getDefaultZIndex("popover"),
__staticSelector: "Popover",
width: "max-content"
};
const varsResolver = createVarsResolver((_, { radius, shadow }) => ({
dropdown: {
"--popover-radius": radius === void 0 ? void 0 : getRadius(radius),
"--popover-shadow": getShadow(shadow)
}
}));
function Popover(_props) {
const props = useProps("Popover", defaultProps, _props);
const {
children,
position,
offset,
onPositionChange,
positionDependencies,
opened,
transitionProps,
onExitTransitionEnd,
onEnterTransitionEnd,
width,
middlewares,
withArrow,
arrowSize,
arrowOffset,
arrowRadius,
arrowPosition,
unstyled,
classNames,
styles,
closeOnClickOutside,
withinPortal,
portalProps,
closeOnEscape,
clickOutsideEvents,
trapFocus,
onClose,
onDismiss,
onOpen,
onChange,
zIndex,
radius,
shadow,
id,
defaultOpened,
__staticSelector,
withRoles,
disabled,
returnFocus,
variant,
keepMounted,
vars,
floatingStrategy,
withOverlay,
overlayProps,
hideDetached,
...others
} = props;
const getStyles = useStyles({
name: __staticSelector,
props,
classes,
classNames,
styles,
unstyled,
rootSelector: "dropdown",
vars,
varsResolver
});
const { resolvedStyles } = useResolvedStylesApi({ classNames, styles, props });
const arrowRef = useRef(null);
const [targetNode, setTargetNode] = useState(null);
const [dropdownNode, setDropdownNode] = useState(null);
const { dir } = useDirection();
const env = useMantineEnv();
const uid = useId(id);
const popover = usePopover({
middlewares,
width,
position: getFloatingPosition(dir, position),
offset: typeof offset === "number" ? offset + (withArrow ? arrowSize / 2 : 0) : offset,
arrowRef,
arrowOffset,
onPositionChange,
positionDependencies,
opened,
defaultOpened,
onChange,
onOpen,
onClose,
onDismiss,
strategy: floatingStrategy
});
useClickOutside(
() => {
if (closeOnClickOutside) {
popover.onClose();
onDismiss?.();
}
},
clickOutsideEvents,
[targetNode, dropdownNode]
);
const reference = useCallback(
(node) => {
setTargetNode(node);
popover.floating.refs.setReference(node);
},
[popover.floating.refs.setReference]
);
const floating = useCallback(
(node) => {
setDropdownNode(node);
popover.floating.refs.setFloating(node);
},
[popover.floating.refs.setFloating]
);
const onExited = useCallback(() => {
transitionProps?.onExited?.();
onExitTransitionEnd?.();
}, [transitionProps?.onExited, onExitTransitionEnd]);
const onEntered = useCallback(() => {
transitionProps?.onEntered?.();
onEnterTransitionEnd?.();
}, [transitionProps?.onEntered, onEnterTransitionEnd]);
return /* @__PURE__ */ jsxs(
PopoverContextProvider,
{
value: {
returnFocus,
disabled,
controlled: popover.controlled,
reference,
floating,
x: popover.floating.x,
y: popover.floating.y,
arrowX: popover.floating?.middlewareData?.arrow?.x,
arrowY: popover.floating?.middlewareData?.arrow?.y,
opened: popover.opened,
arrowRef,
transitionProps: { ...transitionProps, onExited, onEntered },
width,
withArrow,
arrowSize,
arrowOffset,
arrowRadius,
arrowPosition,
placement: popover.floating.placement,
trapFocus,
withinPortal,
portalProps,
zIndex,
radius,
shadow,
closeOnEscape,
onDismiss,
onClose: popover.onClose,
onToggle: popover.onToggle,
getTargetId: () => `${uid}-target`,
getDropdownId: () => `${uid}-dropdown`,
withRoles,
targetProps: others,
__staticSelector,
classNames,
styles,
unstyled,
variant,
keepMounted,
getStyles,
resolvedStyles,
floatingStrategy,
referenceHidden: hideDetached && env !== "test" ? popover.floating.middlewareData.hide?.referenceHidden : false
},
children: [
children,
withOverlay && /* @__PURE__ */ jsx(
Transition,
{
transition: "fade",
mounted: popover.opened,
duration: transitionProps?.duration || 250,
exitDuration: transitionProps?.exitDuration || 250,
children: (transitionStyles) => /* @__PURE__ */ jsx(OptionalPortal, { withinPortal, children: /* @__PURE__ */ jsx(
Overlay,
{
...overlayProps,
...getStyles("overlay", {
className: overlayProps?.className,
style: [transitionStyles, overlayProps?.style]
})
}
) })
}
)
]
}
);
}
Popover.Target = PopoverTarget;
Popover.Dropdown = PopoverDropdown;
Popover.displayName = "@mantine/core/Popover";
Popover.extend = (input) => input;
export { Popover };
//# sourceMappingURL=Popover.mjs.map