@ariakit/react-core
Version:
Ariakit React core
165 lines (140 loc) • 5.54 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true});
var _U5MBFBNTcjs = require('./U5MBFBNT.cjs');
var _YM5HDH3Ccjs = require('./YM5HDH3C.cjs');
var _DRXSFB5Ocjs = require('./DRXSFB5O.cjs');
var _DN4TDPKMcjs = require('./DN4TDPKM.cjs');
var _RDNUVX4Vcjs = require('./RDNUVX4V.cjs');
var _SQLDFLTEcjs = require('./SQLDFLTE.cjs');
var _4KGS3DOWcjs = require('./4KGS3DOW.cjs');
// src/menu/menu-list.tsx
var _misc = require('@ariakit/core/utils/misc');
var _react = require('react');
var _jsxruntime = require('react/jsx-runtime');
var TagName = "div";
function useAriaLabelledBy({ store, ...props }) {
const [id, setId] = _react.useState.call(void 0, void 0);
const label = props["aria-label"];
const disclosureElement = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "disclosureElement");
const contentElement = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "contentElement");
_react.useEffect.call(void 0, () => {
const disclosure = disclosureElement;
if (!disclosure) return;
const menu = contentElement;
if (!menu) return;
const menuLabel = label || menu.hasAttribute("aria-label");
if (menuLabel) {
setId(void 0);
} else if (disclosure.id) {
setId(disclosure.id);
}
}, [label, disclosureElement, contentElement]);
return id;
}
var useMenuList = _SQLDFLTEcjs.createHook.call(void 0,
function useMenuList2({ store, alwaysVisible, composite, ...props }) {
const context = _U5MBFBNTcjs.useMenuProviderContext.call(void 0, );
store = store || context;
_misc.invariant.call(void 0,
store,
process.env.NODE_ENV !== "production" && "MenuList must receive a `store` prop or be wrapped in a MenuProvider component."
);
const parentMenu = store.parent;
const parentMenubar = store.menubar;
const hasParentMenu = !!parentMenu;
const id = _4KGS3DOWcjs.useId.call(void 0, props.id);
const onKeyDownProp = props.onKeyDown;
const dir = _RDNUVX4Vcjs.useStoreState.call(void 0,
store,
(state) => state.placement.split("-")[0]
);
const orientation = _RDNUVX4Vcjs.useStoreState.call(void 0,
store,
(state) => state.orientation === "both" ? void 0 : state.orientation
);
const isHorizontal = orientation !== "vertical";
const isMenubarHorizontal = _RDNUVX4Vcjs.useStoreState.call(void 0,
parentMenubar,
(state) => !!state && state.orientation !== "vertical"
);
const onKeyDown = _4KGS3DOWcjs.useEvent.call(void 0, (event) => {
onKeyDownProp == null ? void 0 : onKeyDownProp(event);
if (event.defaultPrevented) return;
if (hasParentMenu || parentMenubar && !isHorizontal) {
const hideMap = {
ArrowRight: () => dir === "left" && !isHorizontal,
ArrowLeft: () => dir === "right" && !isHorizontal,
ArrowUp: () => dir === "bottom" && isHorizontal,
ArrowDown: () => dir === "top" && isHorizontal
};
const action = hideMap[event.key];
if (action == null ? void 0 : action()) {
event.stopPropagation();
event.preventDefault();
return store == null ? void 0 : store.hide();
}
}
if (parentMenubar) {
const keyMap = {
ArrowRight: () => {
if (!isMenubarHorizontal) return;
return parentMenubar.next();
},
ArrowLeft: () => {
if (!isMenubarHorizontal) return;
return parentMenubar.previous();
},
ArrowDown: () => {
if (isMenubarHorizontal) return;
return parentMenubar.next();
},
ArrowUp: () => {
if (isMenubarHorizontal) return;
return parentMenubar.previous();
}
};
const action = keyMap[event.key];
const id2 = action == null ? void 0 : action();
if (id2 !== void 0) {
event.stopPropagation();
event.preventDefault();
parentMenubar.move(id2);
}
}
});
props = _4KGS3DOWcjs.useWrapElement.call(void 0,
props,
(element) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _U5MBFBNTcjs.MenuScopedContextProvider, { value: store, children: element }),
[store]
);
const ariaLabelledBy = useAriaLabelledBy({ store, ...props });
const mounted = _RDNUVX4Vcjs.useStoreState.call(void 0, store, "mounted");
const hidden = _DRXSFB5Ocjs.isHidden.call(void 0, mounted, props.hidden, alwaysVisible);
const style = hidden ? { ...props.style, display: "none" } : props.style;
props = {
"aria-labelledby": ariaLabelledBy,
hidden,
...props,
id,
ref: _4KGS3DOWcjs.useMergeRefs.call(void 0, id ? store.setContentElement : null, props.ref),
style,
onKeyDown
};
const hasCombobox = !!store.combobox;
composite = composite != null ? composite : !hasCombobox;
if (composite) {
props = {
role: "menu",
"aria-orientation": orientation,
...props
};
}
props = _DN4TDPKMcjs.useComposite.call(void 0, { store, composite, ...props });
props = _YM5HDH3Ccjs.useCompositeTypeahead.call(void 0, { store, typeahead: !hasCombobox, ...props });
return props;
}
);
var MenuList = _SQLDFLTEcjs.forwardRef.call(void 0, function MenuList2(props) {
const htmlProps = useMenuList(props);
return _SQLDFLTEcjs.createElement.call(void 0, TagName, htmlProps);
});
exports.useMenuList = useMenuList; exports.MenuList = MenuList;