UNPKG

@ariakit/react-core

Version:

Ariakit React core

223 lines (203 loc) 8 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _EK4OBMTNcjs = require('../__chunks/EK4OBMTN.cjs'); var _VESZKTSJcjs = require('../__chunks/VESZKTSJ.cjs'); require('../__chunks/RF45TVVP.cjs'); var _U5MBFBNTcjs = require('../__chunks/U5MBFBNT.cjs'); require('../__chunks/UMS7MLRY.cjs'); require('../__chunks/YYY7KD73.cjs'); require('../__chunks/YM5HDH3C.cjs'); require('../__chunks/XPWK4QRC.cjs'); var _6SC6IEJJcjs = require('../__chunks/6SC6IEJJ.cjs'); require('../__chunks/6NFJUQ7Q.cjs'); require('../__chunks/UI5KWBYV.cjs'); require('../__chunks/L634CRNJ.cjs'); require('../__chunks/3PV6Y4XH.cjs'); require('../__chunks/WWNMQZJA.cjs'); require('../__chunks/CXFFS6H4.cjs'); require('../__chunks/W32FX7DM.cjs'); require('../__chunks/ERSQB5XO.cjs'); require('../__chunks/5RIUFRY2.cjs'); require('../__chunks/HMJY2Y4H.cjs'); require('../__chunks/JQCSYNKY.cjs'); require('../__chunks/MXT5U5PP.cjs'); require('../__chunks/JLMLKTUB.cjs'); require('../__chunks/LCWSLOYU.cjs'); require('../__chunks/V7JASX7S.cjs'); require('../__chunks/56NPFF7P.cjs'); require('../__chunks/GASMO7Y4.cjs'); require('../__chunks/O5T5YIJ4.cjs'); require('../__chunks/26P4PLHI.cjs'); require('../__chunks/YVOQ2BCB.cjs'); require('../__chunks/4SKDRUBR.cjs'); require('../__chunks/AQ2LO7WV.cjs'); require('../__chunks/DRXSFB5O.cjs'); require('../__chunks/EM3Q5QVV.cjs'); require('../__chunks/XRHNSFIK.cjs'); require('../__chunks/DN4TDPKM.cjs'); require('../__chunks/2XVCJUVB.cjs'); require('../__chunks/4IRVZ6J3.cjs'); require('../__chunks/7X7JMIHX.cjs'); require('../__chunks/WDV6EJ2U.cjs'); require('../__chunks/VFNUZFXS.cjs'); require('../__chunks/EOGOO37X.cjs'); require('../__chunks/BB34VMZX.cjs'); require('../__chunks/T3QB4FR3.cjs'); var _RDNUVX4Vcjs = require('../__chunks/RDNUVX4V.cjs'); require('../__chunks/ZYZTL3IQ.cjs'); var _SQLDFLTEcjs = require('../__chunks/SQLDFLTE.cjs'); var _4KGS3DOWcjs = require('../__chunks/4KGS3DOW.cjs'); require('../__chunks/TWX5YNTH.cjs'); // src/menu/menu.tsx var _events = require('@ariakit/core/utils/events'); var _focus = require('@ariakit/core/utils/focus'); var _misc = require('@ariakit/core/utils/misc'); var _react = require('react'); var TagName = "div"; var useMenu = _SQLDFLTEcjs.createHook.call(void 0, function useMenu2({ store, modal: modalProp = false, portal = modalProp, hideOnEscape = true, autoFocusOnShow = true, hideOnHoverOutside, alwaysVisible, ...props }) { const context = _U5MBFBNTcjs.useMenuProviderContext.call(void 0, ); store = store || context; _misc.invariant.call(void 0, store, process.env.NODE_ENV !== "production" && "Menu must receive a `store` prop or be wrapped in a MenuProvider component." ); const ref = _react.useRef.call(void 0, null); const parentMenu = store.parent; const parentMenubar = store.menubar; const hasParentMenu = !!parentMenu; const parentIsMenubar = !!parentMenubar && !hasParentMenu; const modal = hasParentMenu ? false : modalProp; props = { ...props, ref: _4KGS3DOWcjs.useMergeRefs.call(void 0, ref, props.ref) }; const { "aria-labelledby": ariaLabelledBy, ...menuListProps } = _EK4OBMTNcjs.useMenuList.call(void 0, { store, alwaysVisible, ...props }); props = menuListProps; const [initialFocusRef, setInitialFocusRef] = _react.useState.call(void 0, ); const autoFocusOnShowState = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "autoFocusOnShow"); const initialFocus = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "initialFocus"); const baseElement = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "baseElement"); const items = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "renderedItems"); _react.useEffect.call(void 0, () => { let cleaning = false; setInitialFocusRef((prevInitialFocusRef) => { var _a, _b, _c; if (cleaning) return; if (modal && ((_a = prevInitialFocusRef == null ? void 0 : prevInitialFocusRef.current) == null ? void 0 : _a.isConnected)) { return prevInitialFocusRef; } if (!autoFocusOnShowState) return; let element; switch (initialFocus) { // TODO: Refactor case "first": element = ((_b = items.find((item) => !item.disabled && item.element)) == null ? void 0 : _b.element) || null; break; case "last": element = ((_c = [...items].reverse().find((item) => !item.disabled && item.element)) == null ? void 0 : _c.element) || null; break; default: element = baseElement; } if (element && element === (prevInitialFocusRef == null ? void 0 : prevInitialFocusRef.current)) { return prevInitialFocusRef; } const ref2 = _react.createRef.call(void 0, ); ref2.current = element; return ref2; }); return () => { cleaning = true; }; }, [store, modal, autoFocusOnShowState, initialFocus, items, baseElement]); const mayAutoFocusOnShow = !!autoFocusOnShow; const canAutoFocusOnShow = !!initialFocusRef || !!props.initialFocus || modal; const contentElement = _RDNUVX4Vcjs.useStoreState.call(void 0, store.combobox || store, "contentElement" ); const parentContentElement = _RDNUVX4Vcjs.useStoreState.call(void 0, (parentMenu == null ? void 0 : parentMenu.combobox) || parentMenu, "contentElement" ); const preserveTabOrderAnchor = _react.useMemo.call(void 0, () => { if (!parentContentElement) return; if (!contentElement) return; const role = contentElement.getAttribute("role"); const parentRole = parentContentElement.getAttribute("role"); const parentIsMenuOrMenubar = parentRole === "menu" || parentRole === "menubar"; if (parentIsMenuOrMenubar && role === "menu") return; return parentContentElement; }, [contentElement, parentContentElement]); if (preserveTabOrderAnchor !== void 0) { props = { preserveTabOrderAnchor, ...props }; } props = _VESZKTSJcjs.useHovercard.call(void 0, { store, alwaysVisible, initialFocus: initialFocusRef, autoFocusOnShow: mayAutoFocusOnShow ? canAutoFocusOnShow && autoFocusOnShow : autoFocusOnShowState || modal, ...props, hideOnEscape(event) { if (_misc.isFalsyBooleanCallback.call(void 0, hideOnEscape, event)) return false; store == null ? void 0 : store.hideAll(); return true; }, hideOnHoverOutside(event) { const disclosureElement = store == null ? void 0 : store.getState().disclosureElement; const getHideOnHoverOutside = () => { if (typeof hideOnHoverOutside === "function") { return hideOnHoverOutside(event); } if (hideOnHoverOutside != null) return hideOnHoverOutside; if (hasParentMenu) return true; if (!parentIsMenubar) return false; if (!disclosureElement) return true; if (_focus.hasFocusWithin.call(void 0, disclosureElement)) return false; return true; }; if (!getHideOnHoverOutside()) return false; if (event.defaultPrevented) return true; if (!hasParentMenu) return true; if (!disclosureElement) return true; _events.fireEvent.call(void 0, disclosureElement, "mouseout", event); if (!_focus.hasFocusWithin.call(void 0, disclosureElement)) return true; requestAnimationFrame(() => { if (_focus.hasFocusWithin.call(void 0, disclosureElement)) return; store == null ? void 0 : store.hide(); }); return false; }, modal, portal, backdrop: hasParentMenu ? false : props.backdrop }); props = { "aria-labelledby": ariaLabelledBy, ...props }; return props; }); var Menu = _6SC6IEJJcjs.createDialogComponent.call(void 0, _SQLDFLTEcjs.forwardRef.call(void 0, function Menu2(props) { const htmlProps = useMenu(props); return _SQLDFLTEcjs.createElement.call(void 0, TagName, htmlProps); }), _U5MBFBNTcjs.useMenuProviderContext ); exports.Menu = Menu; exports.useMenu = useMenu;