@ariakit/react-core
Version:
Ariakit React core
228 lines (198 loc) • 7.64 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true});
var _U5MBFBNTcjs = require('../__chunks/U5MBFBNT.cjs');
require('../__chunks/UMS7MLRY.cjs');
var _RA4ZER5Ucjs = require('../__chunks/RA4ZER5U.cjs');
require('../__chunks/YYY7KD73.cjs');
var _YM5HDH3Ccjs = require('../__chunks/YM5HDH3C.cjs');
var _4OTMDXRRcjs = require('../__chunks/4OTMDXRR.cjs');
require('../__chunks/VKWO5RWC.cjs');
require('../__chunks/7GKSQOUW.cjs');
require('../__chunks/5K46XOEI.cjs');
require('../__chunks/2XVCJUVB.cjs');
var _4IRVZ6J3cjs = require('../__chunks/4IRVZ6J3.cjs');
require('../__chunks/7X7JMIHX.cjs');
require('../__chunks/WDV6EJ2U.cjs');
require('../__chunks/VFNUZFXS.cjs');
require('../__chunks/EOGOO37X.cjs');
require('../__chunks/F6OAWDMC.cjs');
require('../__chunks/HAR6UDZU.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-button.tsx
var _dom = require('@ariakit/core/utils/dom');
var _misc = require('@ariakit/core/utils/misc');
var _react = require('react');
var _jsxruntime = require('react/jsx-runtime');
var TagName = "button";
function getInitialFocus(event, dir) {
const keyMap = {
ArrowDown: dir === "bottom" || dir === "top" ? "first" : false,
ArrowUp: dir === "bottom" || dir === "top" ? "last" : false,
ArrowRight: dir === "right" ? "first" : false,
ArrowLeft: dir === "left" ? "first" : false
};
return keyMap[event.key];
}
function hasActiveItem(items, excludeElement) {
return !!(items == null ? void 0 : items.some((item) => {
if (!item.element) return false;
if (item.element === excludeElement) return false;
return item.element.getAttribute("aria-expanded") === "true";
}));
}
var useMenuButton = _SQLDFLTEcjs.createHook.call(void 0,
function useMenuButton2({
store,
focusable,
accessibleWhenDisabled,
showOnHover,
...props
}) {
const context = _U5MBFBNTcjs.useMenuProviderContext.call(void 0, );
store = store || context;
_misc.invariant.call(void 0,
store,
process.env.NODE_ENV !== "production" && "MenuButton 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 disabled = _misc.disabledFromProps.call(void 0, props);
const isDisabled = (element) => disabled || _misc.disabledFromElement.call(void 0, element);
const showMenu = () => {
const trigger = ref.current;
if (!trigger) return;
store == null ? void 0 : store.setDisclosureElement(trigger);
store == null ? void 0 : store.setAnchorElement(trigger);
store == null ? void 0 : store.show();
};
const onFocusProp = props.onFocus;
const onFocus = _4KGS3DOWcjs.useEvent.call(void 0, (event) => {
onFocusProp == null ? void 0 : onFocusProp(event);
if (isDisabled(event.currentTarget)) return;
if (event.defaultPrevented) return;
store == null ? void 0 : store.setAutoFocusOnShow(false);
store == null ? void 0 : store.setActiveId(null);
if (!parentMenubar) return;
if (!parentIsMenubar) return;
const { items } = parentMenubar.getState();
if (hasActiveItem(items, event.currentTarget)) {
showMenu();
}
});
const dir = _RDNUVX4Vcjs.useStoreState.call(void 0,
store,
(state) => state.placement.split("-")[0]
);
const onKeyDownProp = props.onKeyDown;
const onKeyDown = _4KGS3DOWcjs.useEvent.call(void 0, (event) => {
onKeyDownProp == null ? void 0 : onKeyDownProp(event);
if (isDisabled(event.currentTarget)) return;
if (event.defaultPrevented) return;
const initialFocus = getInitialFocus(event, dir);
if (initialFocus) {
event.preventDefault();
showMenu();
store == null ? void 0 : store.setAutoFocusOnShow(true);
store == null ? void 0 : store.setInitialFocus(initialFocus);
}
});
const onClickProp = props.onClick;
const onClick = _4KGS3DOWcjs.useEvent.call(void 0, (event) => {
onClickProp == null ? void 0 : onClickProp(event);
if (event.defaultPrevented) return;
if (!store) return;
const isKeyboardClick = !event.detail;
const { open } = store.getState();
if (!open || isKeyboardClick) {
if (!hasParentMenu || isKeyboardClick) {
store.setAutoFocusOnShow(true);
}
store.setInitialFocus(isKeyboardClick ? "first" : "container");
}
if (hasParentMenu) {
showMenu();
}
});
props = _4KGS3DOWcjs.useWrapElement.call(void 0,
props,
(element) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _U5MBFBNTcjs.MenuContextProvider, { value: store, children: element }),
[store]
);
if (hasParentMenu) {
props = {
...props,
render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _4IRVZ6J3cjs.Role.div, { render: props.render })
};
}
const id = _4KGS3DOWcjs.useId.call(void 0, props.id);
const parentContentElement = _RDNUVX4Vcjs.useStoreState.call(void 0,
(parentMenu == null ? void 0 : parentMenu.combobox) || parentMenu,
"contentElement"
);
const role = hasParentMenu || parentIsMenubar ? _dom.getPopupItemRole.call(void 0, parentContentElement, "menuitem") : void 0;
const contentElement = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "contentElement");
const hasCombobox = !!store.combobox;
const popupRole = _dom.getPopupRole.call(void 0,
contentElement,
hasCombobox ? "dialog" : "menu"
);
props = {
role,
"aria-haspopup": popupRole,
...props,
id,
ref: _4KGS3DOWcjs.useMergeRefs.call(void 0, ref, props.ref),
onFocus,
onKeyDown,
onClick
};
props = _RA4ZER5Ucjs.useHovercardAnchor.call(void 0, {
store,
focusable,
accessibleWhenDisabled,
...props,
showOnHover: (event) => {
const getShowOnHover = () => {
if (typeof showOnHover === "function") return showOnHover(event);
if (showOnHover != null) return showOnHover;
if (hasParentMenu) return true;
if (!parentMenubar) return false;
const { items } = parentMenubar.getState();
return parentIsMenubar && hasActiveItem(items);
};
const canShowOnHover = getShowOnHover();
if (!canShowOnHover) return false;
const parent = parentIsMenubar ? parentMenubar : parentMenu;
if (!parent) return true;
parent.setActiveId(event.currentTarget.id);
return true;
}
});
props = _4OTMDXRRcjs.usePopoverDisclosure.call(void 0, {
store,
toggleOnClick: !hasParentMenu,
focusable,
accessibleWhenDisabled,
...props
});
props = _YM5HDH3Ccjs.useCompositeTypeahead.call(void 0, {
store,
typeahead: parentIsMenubar,
...props
});
return props;
}
);
var MenuButton = _SQLDFLTEcjs.forwardRef.call(void 0, function MenuButton2(props) {
const htmlProps = useMenuButton(props);
return _SQLDFLTEcjs.createElement.call(void 0, TagName, htmlProps);
});
exports.MenuButton = MenuButton; exports.useMenuButton = useMenuButton;