UNPKG

@ariakit/react-core

Version:

Ariakit React core

164 lines (161 loc) 5 kB
"use client"; import { MenuScopedContextProvider, useMenuProviderContext } from "./SPU3NB66.js"; import { useCompositeTypeahead } from "./WXLNFAIL.js"; import { isHidden } from "./HAX24JB7.js"; import { useComposite } from "./E7PWFDGB.js"; import { useStoreState } from "./Q3KUZPD7.js"; import { createElement, createHook, forwardRef } from "./ILRXHV7V.js"; import { useEvent, useId, useMergeRefs, useWrapElement } from "./K2XTQB3X.js"; // src/menu/menu-list.tsx import { invariant } from "@ariakit/core/utils/misc"; import { useEffect, useState } from "react"; import { jsx } from "react/jsx-runtime"; var TagName = "div"; function useAriaLabelledBy({ store, ...props }) { const [id, setId] = useState(void 0); const label = props["aria-label"]; const disclosureElement = useStoreState(store, "disclosureElement"); const contentElement = useStoreState(store, "contentElement"); useEffect(() => { 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 = createHook( function useMenuList2({ store, alwaysVisible, composite, ...props }) { const context = useMenuProviderContext(); store = store || context; invariant( 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 = useId(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 = useStoreState( parentMenubar, (state) => !!state && state.orientation !== "vertical" ); const onKeyDown = useEvent((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 = useWrapElement( props, (element) => /* @__PURE__ */ jsx(MenuScopedContextProvider, { value: store, children: element }), [store] ); const ariaLabelledBy = useAriaLabelledBy({ store, ...props }); const mounted = store.useState("mounted"); const hidden = isHidden(mounted, props.hidden, alwaysVisible); const style = hidden ? { ...props.style, display: "none" } : props.style; props = { id, "aria-labelledby": ariaLabelledBy, hidden, ...props, ref: useMergeRefs(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 = useComposite({ store, composite, ...props }); props = useCompositeTypeahead({ store, typeahead: !hasCombobox, ...props }); return props; } ); var MenuList = forwardRef(function MenuList2(props) { const htmlProps = useMenuList(props); return createElement(TagName, htmlProps); }); export { useMenuList, MenuList };