UNPKG

@ariakit/react-core

Version:

Ariakit React core

169 lines (140 loc) 5.97 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _5NYO4PEPcjs = require('./5NYO4PEP.cjs'); var _ZBFMPPGZcjs = require('./ZBFMPPGZ.cjs'); var _I3ICHD5Kcjs = require('./I3ICHD5K.cjs'); var _W6NEGVNAcjs = require('./W6NEGVNA.cjs'); var _76LCMKUIcjs = require('./76LCMKUI.cjs'); var _6TI3NXX6cjs = require('./6TI3NXX6.cjs'); var _L5A2ID7Scjs = require('./L5A2ID7S.cjs'); var _7EQBAZ46cjs = require('./7EQBAZ46.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(_a) { var _b = _a, { store } = _b, props = _7EQBAZ46cjs.__objRest.call(void 0, _b, ["store"]); const [id, setId] = _react.useState.call(void 0, void 0); const label = props["aria-label"]; const disclosureElement = _76LCMKUIcjs.useStoreState.call(void 0, store, "disclosureElement"); const contentElement = _76LCMKUIcjs.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 = _6TI3NXX6cjs.createHook.call(void 0, function useMenuList2(_a) { var _b = _a, { store, alwaysVisible, composite } = _b, props = _7EQBAZ46cjs.__objRest.call(void 0, _b, ["store", "alwaysVisible", "composite"]); const context = _5NYO4PEPcjs.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 = _L5A2ID7Scjs.useId.call(void 0, props.id); const onKeyDownProp = props.onKeyDown; const dir = store.useState( (state) => state.placement.split("-")[0] ); const orientation = store.useState( (state) => state.orientation === "both" ? void 0 : state.orientation ); const isHorizontal = orientation !== "vertical"; const isMenubarHorizontal = _76LCMKUIcjs.useStoreState.call(void 0, parentMenubar, (state) => !!state && state.orientation !== "vertical" ); const onKeyDown = _L5A2ID7Scjs.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 = _L5A2ID7Scjs.useWrapElement.call(void 0, props, (element) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _5NYO4PEPcjs.MenuScopedContextProvider, { value: store, children: element }), [store] ); const ariaLabelledBy = useAriaLabelledBy(_7EQBAZ46cjs.__spreadValues.call(void 0, { store }, props)); const mounted = store.useState("mounted"); const hidden = _I3ICHD5Kcjs.isHidden.call(void 0, mounted, props.hidden, alwaysVisible); const style = hidden ? _7EQBAZ46cjs.__spreadProps.call(void 0, _7EQBAZ46cjs.__spreadValues.call(void 0, {}, props.style), { display: "none" }) : props.style; props = _7EQBAZ46cjs.__spreadProps.call(void 0, _7EQBAZ46cjs.__spreadValues.call(void 0, { id, "aria-labelledby": ariaLabelledBy, hidden }, props), { ref: _L5A2ID7Scjs.useMergeRefs.call(void 0, id ? store.setContentElement : null, props.ref), style, onKeyDown }); const hasCombobox = !!store.combobox; composite = composite != null ? composite : !hasCombobox; if (composite) { props = _7EQBAZ46cjs.__spreadValues.call(void 0, { role: "menu", "aria-orientation": orientation }, props); } props = _W6NEGVNAcjs.useComposite.call(void 0, _7EQBAZ46cjs.__spreadValues.call(void 0, { store, composite }, props)); props = _ZBFMPPGZcjs.useCompositeTypeahead.call(void 0, _7EQBAZ46cjs.__spreadValues.call(void 0, { store, typeahead: !hasCombobox }, props)); return props; } ); var MenuList = _6TI3NXX6cjs.forwardRef.call(void 0, function MenuList2(props) { const htmlProps = useMenuList(props); return _6TI3NXX6cjs.createElement.call(void 0, TagName, htmlProps); }); exports.useMenuList = useMenuList; exports.MenuList = MenuList;