UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

126 lines (125 loc) 3.85 kB
"use client"; import { getContextItemIndex } from "../../core/utils/get-context-item-index/get-context-item-index.mjs"; import { useProps } from "../../core/MantineProvider/use-props/use-props.mjs"; 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 { factory } from "../../core/factory/factory.mjs"; import { useDelayedHover } from "../../utils/Floating/use-delayed-hover.mjs"; import { Popover } from "../Popover/Popover.mjs"; import { MenuContextProvider } from "./Menu.context.mjs"; import Menu_module_default from "./Menu.module.mjs"; import { MenuDivider } from "./MenuDivider/MenuDivider.mjs"; import { MenuDropdown } from "./MenuDropdown/MenuDropdown.mjs"; import { MenuItem } from "./MenuItem/MenuItem.mjs"; import { MenuLabel } from "./MenuLabel/MenuLabel.mjs"; import { MenuSub } from "./MenuSub/MenuSub.mjs"; import { MenuTarget } from "./MenuTarget/MenuTarget.mjs"; import { useState } from "react"; import { useUncontrolled } from "@mantine/hooks"; import { jsx } from "react/jsx-runtime"; //#region packages/@mantine/core/src/components/Menu/Menu.tsx const defaultProps = { trapFocus: true, closeOnItemClick: true, withInitialFocusPlaceholder: true, clickOutsideEvents: [ "mousedown", "touchstart", "keydown" ], loop: true, trigger: "click", openDelay: 0, closeDelay: 100, menuItemTabIndex: -1 }; const Menu = factory((_props) => { const props = useProps("Menu", defaultProps, _props); const { children, onOpen, onClose, opened, defaultOpened, trapFocus, onChange, closeOnItemClick, loop, closeOnEscape, trigger, openDelay, closeDelay, classNames, styles, unstyled, variant, vars, menuItemTabIndex, keepMounted, withInitialFocusPlaceholder, attributes, ...others } = props; const getStyles = useStyles({ name: "Menu", classes: Menu_module_default, props, classNames, styles, unstyled, attributes }); const [_opened, setOpened] = useUncontrolled({ value: opened, defaultValue: defaultOpened, finalValue: false, onChange }); const [openedViaClick, setOpenedViaClick] = useState(false); const close = () => { setOpened(false); setOpenedViaClick(false); _opened && onClose?.(); }; const open = () => { setOpened(true); !_opened && onOpen?.(); }; const toggleDropdown = () => { _opened ? close() : open(); }; const { openDropdown, closeDropdown } = useDelayedHover({ open, close, closeDelay, openDelay }); const getItemIndex = (node) => getContextItemIndex("[data-menu-item]", "[data-menu-dropdown]", node); const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi({ classNames, styles, props }); return /* @__PURE__ */ jsx(MenuContextProvider, { value: { getStyles, opened: _opened, toggleDropdown, getItemIndex, openedViaClick, setOpenedViaClick, closeOnItemClick, closeDropdown: trigger === "click" ? close : closeDropdown, openDropdown: trigger === "click" ? open : openDropdown, closeDropdownImmediately: close, loop, trigger, unstyled, menuItemTabIndex, withInitialFocusPlaceholder }, children: /* @__PURE__ */ jsx(Popover, { returnFocus: true, ...others, opened: _opened, onChange: toggleDropdown, defaultOpened, trapFocus: keepMounted ? false : trapFocus, closeOnEscape, __staticSelector: "Menu", classNames: resolvedClassNames, styles: resolvedStyles, unstyled, variant, keepMounted, children }) }); }); Menu.displayName = "@mantine/core/Menu"; Menu.classes = Menu_module_default; Menu.Item = MenuItem; Menu.Label = MenuLabel; Menu.Dropdown = MenuDropdown; Menu.Target = MenuTarget; Menu.Divider = MenuDivider; Menu.Sub = MenuSub; //#endregion export { Menu }; //# sourceMappingURL=Menu.mjs.map