UNPKG

@yamada-ui/react

Version:

React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion

1 lines • 29.1 kB
{"version":3,"file":"use-menu.cjs","names":["createDescendants","createContext","useDisclosure","getTriggerProps: PropGetter","getContextTriggerProps: PropGetter","getContentProps: PropGetter","mergeRefs","getSeparatorProps: PropGetter","useControllableState","value"],"sources":["../../../../src/components/menu/use-menu.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent, MouseEvent, RefObject } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport type { Descendant, Descendants } from \"../../hooks/use-descendants\"\nimport type { UseDisclosureProps } from \"../../hooks/use-disclosure\"\nimport { useCallback, useId, useRef } from \"react\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport { useDisclosure } from \"../../hooks/use-disclosure\"\nimport {\n ariaAttr,\n assignRef,\n createContext,\n cx,\n dataAttr,\n handlerAll,\n isArray,\n isString,\n isTruthyDataAttr,\n mergeRefs,\n noop,\n runKeyAction,\n useUpdateEffect,\n} from \"../../utils\"\n\ntype SubMenuDirection = \"end\" | \"start\"\n\ninterface MenuDescendantProps {\n id: string\n}\ntype MenuDescendant = Descendant<HTMLDivElement, MenuDescendantProps>\n\nconst {\n DescendantsContext: MenuDescendantsContext,\n useDescendant: useMenuDescendant,\n useDescendantRegister: useMenuDescendantRegister,\n useDescendants: useMenuDescendants,\n} = createDescendants<HTMLDivElement, MenuDescendantProps>()\n\nexport { MenuDescendantsContext, useMenuDescendant, useMenuDescendants }\n\ninterface MenuContext\n extends Pick<\n UseMenuReturn,\n | \"onActiveDescendant\"\n | \"onClose\"\n | \"onCloseSubMenu\"\n | \"onOpen\"\n | \"onSelect\"\n | \"subMenu\"\n | \"subMenuDirection\"\n > {}\n\nconst [MenuContext, useMenuContext] = createContext<MenuContext>({\n name: \"MenuContext\",\n})\n\ninterface MenuGroupContext extends Pick<UseMenuGroupReturn, \"getLabelProps\"> {}\n\nconst [MenuGroupContext, useMenuGroupContext] = createContext<MenuGroupContext>(\n {\n name: \"MenuGroupContext\",\n },\n)\n\ninterface MainMenuContext {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n onCloseRef: RefObject<() => void>\n onSelect: (value?: string, closeOnSelect?: boolean) => void\n closeOnSelect?: boolean\n}\n\nconst [MainMenuContext, useMainMenuContext] = createContext<MainMenuContext>({\n name: \"MainMenuContext\",\n strict: false,\n})\n\ninterface MenuOptionGroupContext {\n type: \"checkbox\" | \"radio\"\n value: string | string[]\n onChange?: (value: string) => void\n}\n\nconst [MenuOptionGroupContext, useMenuOptionGroupContext] =\n createContext<MenuOptionGroupContext>({\n name: \"MenuOptionGroupContext\",\n })\n\nexport {\n MainMenuContext,\n MenuContext,\n MenuGroupContext,\n MenuOptionGroupContext,\n useMainMenuContext,\n useMenuContext,\n useMenuGroupContext,\n useMenuOptionGroupContext,\n}\n\nexport interface UseMenuProps extends Omit<UseDisclosureProps, \"timing\"> {\n /**\n * If `true`, the menu item will be closed when selected.\n *\n * @default true\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The direction of the sub menu.\n *\n * @default 'end'\n */\n subMenuDirection?: SubMenuDirection\n /**\n * Callback invoked when a menu item is selected.\n */\n onSelect?: (value?: string) => void\n}\n\nexport const useMenu = ({\n closeOnSelect,\n defaultOpen,\n disabled = false,\n open: openProp,\n subMenuDirection = \"end\",\n onClose: onCloseProp,\n onOpen: onOpenProp,\n onSelect: onSelectProp,\n}: UseMenuProps = {}) => {\n const triggerId = useId()\n const contentId = useId()\n const descendants = useMenuDescendants()\n const updateRef = useRef<() => void>(noop)\n const onCloseRef = useRef<() => void>(noop)\n const contentRef = useRef<HTMLDivElement>(null)\n const { open, onClose, onOpen } = useDisclosure({\n defaultOpen,\n open: openProp,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n })\n const onCloseSubMenu = useCallback(() => onCloseRef.current(), [])\n const onActiveDescendant = useCallback(\n (\n descendant?: MenuDescendant,\n options: FocusOptions = { preventScroll: true },\n ) => {\n if (!contentRef.current || !descendant || disabled) return\n\n contentRef.current.setAttribute(\"aria-activedescendant\", descendant.id)\n\n descendants.active(descendant, options)\n },\n [descendants, disabled],\n )\n const { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect } =\n useSubMenu({\n descendants,\n disabled,\n open,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onOpen,\n })\n\n closeOnSelect ??= mainCloseOnSelect ?? true\n\n const onSelect = useCallback(\n (value?: string, closeOnSelectProp = closeOnSelect) => {\n if (disabled) return\n\n onSelectProp?.(value)\n onMainSelect?.(value, closeOnSelectProp)\n\n if (!closeOnSelectProp) return\n\n onClose()\n },\n [closeOnSelect, disabled, onClose, onMainSelect, onSelectProp],\n )\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n\n if (!open) {\n onOpen()\n } else {\n onClose()\n }\n },\n [disabled, onClose, onOpen, open],\n )\n\n const onContextMenu = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n onOpen()\n updateRef.current()\n },\n [disabled, onOpen],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n\n runKeyAction(ev, {\n ArrowDown: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n ArrowUp: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n })\n },\n Enter: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n Space: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n })\n },\n [descendants, disabled, onActiveDescendant, onOpen],\n )\n\n const getTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n ...getSubMenuProps({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"button\",\n tabIndex: disabled ? -1 : 0,\n ...props,\n onClick: handlerAll(props.onClick, onClick),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n }),\n [contentId, disabled, getSubMenuProps, onClick, onKeyDown, open, triggerId],\n )\n\n const getContextTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"application\",\n ...props,\n onContextMenu: handlerAll(props.onContextMenu, onContextMenu),\n }),\n [contentId, disabled, onContextMenu, open, triggerId],\n )\n\n const getContentProps: PropGetter = useCallback(\n ({ ref, \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n id: contentId,\n \"aria-labelledby\": cx(ariaLabelledby, triggerId),\n role: \"menu\",\n ...props,\n ref: mergeRefs(ref, contentRef),\n }),\n [contentId, triggerId],\n )\n\n const getSeparatorProps: PropGetter = useCallback(\n (props) => ({ role: \"separator\", ...props }),\n [],\n )\n\n return {\n closeOnSelect,\n descendants,\n open,\n subMenu,\n subMenuDirection,\n updateRef,\n getContentProps,\n getContextTriggerProps,\n getSeparatorProps,\n getTriggerProps,\n onActiveDescendant,\n onClose,\n onCloseRef,\n onCloseSubMenu,\n onOpen,\n onSelect,\n }\n}\n\nexport type UseMenuReturn = ReturnType<typeof useMenu>\n\nexport interface UseSubMenuProps\n extends Omit<Required<UseDisclosureProps>, \"defaultOpen\" | \"timing\"> {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n disabled?: boolean\n subMenuDirection?: SubMenuDirection\n}\n\nexport const useSubMenu = ({\n descendants,\n disabled = false,\n open,\n subMenuDirection = \"end\",\n onActiveDescendant,\n onClose,\n onOpen,\n}: UseSubMenuProps) => {\n const uuid = useId()\n const {\n closeOnSelect: mainCloseOnSelect,\n descendants: mainDescendants,\n onActiveDescendant: onActiveMainDescendant,\n onCloseRef,\n onSelect: onMainSelect,\n } = useMainMenuContext() ?? {}\n const subMenu = !!mainDescendants && !!onActiveMainDescendant\n const createRegister = useMenuDescendantRegister(mainDescendants)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const dataDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const dataDisabled = isTruthyDataAttr(node.getAttribute(\"data-disabled\"))\n\n return dataDisabled\n }, [])\n\n const ariaDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const ariaDisabled = isTruthyDataAttr(node.getAttribute(\"aria-disabled\"))\n\n return ariaDisabled\n }, [])\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu) return\n\n ev.defaultPrevented = disabled || dataDisabled() || ariaDisabled()\n },\n [ariaDisabled, dataDisabled, disabled, subMenu],\n )\n\n const onMouseEnter = useCallback(() => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n onOpen()\n }, [ariaDisabled, dataDisabled, disabled, onOpen, subMenu])\n\n const onMouseMove = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n const descendant = descendants.value(triggerRef.current)\n\n onActiveMainDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [\n ariaDisabled,\n dataDisabled,\n descendants,\n disabled,\n onActiveMainDescendant,\n subMenu,\n ],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (!subMenu || disabled) return\n\n const currentDescendant = open ? descendants : mainDescendants\n const onActiveCurrentDescendant = open\n ? onActiveDescendant\n : onActiveMainDescendant\n\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = currentDescendant.enabledNextValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n ArrowUp: () => {\n const descendant = currentDescendant.enabledPrevValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n End: () => {\n const descendant = currentDescendant.enabledLastValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n Home: () => {\n const descendant = currentDescendant.enabledFirstValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [subMenuDirection === \"end\" ? \"ArrowRight\" : \"ArrowLeft\"]: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n\n ev.defaultPrevented = true\n },\n })\n },\n [\n subMenu,\n disabled,\n open,\n descendants,\n mainDescendants,\n onActiveDescendant,\n onActiveMainDescendant,\n subMenuDirection,\n onOpen,\n ],\n )\n\n assignRef(onCloseRef, onClose)\n\n const getSubMenuProps: PropGetter = useCallback(\n ({ id = uuid, ref, ...props } = {}) => {\n const getDisabled = (node: HTMLDivElement) =>\n disabled || dataDisabled(node) || ariaDisabled(node)\n const register = createRegister({ id, disabled: getDisabled })\n\n return {\n role: subMenu ? \"menuitem\" : \"button\",\n ...props,\n ref: mergeRefs(ref, triggerRef, register),\n onClick: handlerAll(onClick, props.onClick),\n onKeyDown: handlerAll(onKeyDown, props.onKeyDown),\n onMouseEnter: handlerAll(onMouseEnter, props.onMouseEnter),\n onMouseMove: handlerAll(onMouseMove, props.onMouseMove),\n }\n },\n [\n uuid,\n subMenu,\n createRegister,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseMove,\n disabled,\n dataDisabled,\n ariaDisabled,\n ],\n )\n\n return { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect }\n}\n\nexport type UseSubMenuReturn = ReturnType<typeof useSubMenu>\n\nexport interface UseMenuGroupProps extends HTMLProps {}\n\nexport const useMenuGroup = ({\n \"aria-labelledby\": ariaLabelledbyProp,\n ...rest\n}: UseMenuGroupProps) => {\n const labelId = useId()\n\n const getGroupProps: PropGetter = useCallback(\n ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n \"aria-labelledby\": cx(ariaLabelledbyProp, ariaLabelledby, labelId),\n role: \"group\",\n ...rest,\n ...props,\n }),\n [ariaLabelledbyProp, labelId, rest],\n )\n\n const getLabelProps: PropGetter<\"span\"> = useCallback(\n (props) => ({ id: labelId, role: \"presentation\", ...props }),\n [labelId],\n )\n\n return { getGroupProps, getLabelProps }\n}\n\nexport type UseMenuGroupReturn = ReturnType<typeof useMenuGroup>\n\nexport interface UseMenuItemProps extends HTMLProps {\n /**\n * If `true`, the menu item will be closed when selected.\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The value of the menu item.\n */\n value?: string\n}\n\nexport const useMenuItem = ({\n id,\n \"aria-disabled\": ariaDisabled,\n \"data-disabled\": dataDisabled,\n \"data-trigger\": dataTrigger,\n closeOnSelect,\n disabled = false,\n value,\n ...rest\n}: UseMenuItemProps) => {\n const trigger = isTruthyDataAttr(dataTrigger)\n const {\n subMenu,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onCloseSubMenu,\n onSelect,\n } = useMenuContext()\n const uuid = useId()\n const itemRef = useRef<HTMLDivElement>(null)\n const subMenuTrigger = subMenu && trigger\n\n id ??= uuid\n\n const { descendants, register } = useMenuDescendant({\n id,\n disabled: disabled || subMenuTrigger,\n })\n\n const onActive = useCallback(() => {\n if (disabled) return\n\n const descendant = descendants.value(itemRef.current)\n\n onActiveDescendant(descendant)\n }, [descendants, disabled, onActiveDescendant])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = descendants.enabledNextValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n ArrowUp: () => {\n const descendant = descendants.enabledPrevValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n End: () => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n },\n Enter: () => onSelect(value, closeOnSelect),\n Home: () => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n },\n Space: () => onSelect(value, closeOnSelect),\n [subMenuDirection === \"end\" ? \"ArrowLeft\" : \"ArrowRight\"]: () => {\n if (!subMenu) return\n\n onClose()\n\n const descendant = descendants.firstValue()\n\n descendant?.node.focus()\n },\n })\n },\n [\n closeOnSelect,\n descendants,\n onActiveDescendant,\n onClose,\n onSelect,\n subMenu,\n subMenuDirection,\n value,\n ],\n )\n\n const getItemProps: PropGetter = useCallback(\n ({ ref, ...props } = {}) => ({\n id,\n \"aria-disabled\": ariaDisabled ?? ariaAttr(disabled),\n \"data-disabled\": dataDisabled ?? dataAttr(disabled),\n role: \"menuitem\",\n tabIndex: -1,\n ...rest,\n ...props,\n ref: mergeRefs(ref, rest.ref, itemRef, register),\n onClick: handlerAll(props.onClick, rest.onClick, () =>\n onSelect(value, closeOnSelect),\n ),\n onFocus: handlerAll(props.onFocus, rest.onFocus, onActive),\n onKeyDown: handlerAll(props.onKeyDown, rest.onKeyDown, onKeyDown),\n onMouseMove: handlerAll(props.onMouseMove, rest.onMouseMove, () => {\n onCloseSubMenu()\n onActive()\n }),\n }),\n [\n id,\n ariaDisabled,\n disabled,\n dataDisabled,\n rest,\n register,\n onActive,\n onKeyDown,\n onSelect,\n value,\n closeOnSelect,\n onCloseSubMenu,\n ],\n )\n\n return {\n subMenuTrigger,\n getItemProps,\n }\n}\n\nexport type UseMenuItemReturn = ReturnType<typeof useMenuItem>\n\nexport type MenuOptionGroupType = \"checkbox\" | \"radio\"\nexport type MenuOptionGroupValue<Y extends MenuOptionGroupType> =\n Y extends \"checkbox\" ? string[] : string\n\nexport interface UseMenuOptionGroupProps<\n Y extends MenuOptionGroupType = \"checkbox\",\n M extends MenuOptionGroupValue<Y> = MenuOptionGroupValue<Y>,\n> {\n /**\n * The type of the menu option group.\n */\n type?: Y\n /**\n * The initial value of the menu item group.\n */\n defaultValue?: M\n /**\n * The value of the menu item group.\n */\n value?: M\n /**\n * The callback fired when any children checkbox is checked or unchecked.\n */\n onChange?: (value: M) => void\n}\n\nexport const useMenuOptionGroup = <\n Y extends \"checkbox\" | \"radio\" = \"checkbox\",\n M extends Y extends \"checkbox\" ? string[] : string = Y extends \"checkbox\"\n ? string[]\n : string,\n>({\n type = \"checkbox\" as Y,\n defaultValue = (type === \"checkbox\" ? [] : \"\") as M,\n value: valueProp,\n onChange: onChangeProp,\n}: UseMenuOptionGroupProps<Y, M>) => {\n const [value, setValue] = useControllableState({\n defaultValue,\n value: valueProp,\n onChange: onChangeProp,\n })\n const radio = type === \"radio\"\n\n const onChange = useCallback(\n (selectedValue: string) => {\n setValue((prev) => {\n if (radio && isString(prev)) {\n return selectedValue as M\n } else if (!radio && isArray(prev)) {\n return (\n prev.includes(selectedValue)\n ? prev.filter((value) => value !== selectedValue)\n : prev.concat(selectedValue)\n ) as M\n } else {\n return prev\n }\n })\n },\n [radio, setValue],\n )\n\n useUpdateEffect(() => {\n setValue(valueProp!)\n }, [valueProp])\n\n return {\n type,\n value,\n onChange,\n }\n}\n\nexport type UseMenuOptionGroupReturn = ReturnType<typeof useMenuOptionGroup>\n\nexport interface UseMenuOptionItemProps extends UseMenuItemProps {\n /**\n * The value of the menu option item.\n */\n value: string\n}\n\nexport const useMenuOptionItem = ({\n disabled,\n value,\n ...rest\n}: UseMenuOptionItemProps) => {\n const { type, value: selectedValue, onChange } = useMenuOptionGroupContext()\n const { getItemProps } = useMenuItem({ disabled, value, ...rest })\n const radio = type === \"radio\" && isString(selectedValue)\n const checkbox = type === \"checkbox\" && isArray(selectedValue)\n const selected = radio\n ? value === selectedValue\n : checkbox\n ? selectedValue.includes(value)\n : false\n\n const getIndicatorProps: PropGetter = useCallback(\n ({ style, ...props } = {}) => ({\n style: { opacity: selected ? 1 : 0, ...style },\n ...props,\n }),\n [selected],\n )\n\n const getOptionItemProps: PropGetter = useCallback(\n (props = {}) =>\n getItemProps({\n role: radio ? \"menuitemradio\" : \"menuitemcheckbox\",\n ...props,\n onClick: handlerAll(props.onClick, () =>\n !disabled ? onChange?.(value) : noop,\n ),\n }),\n [disabled, getItemProps, onChange, radio, value],\n )\n\n return {\n type,\n selected,\n getIndicatorProps,\n getOptionItemProps,\n }\n}\n\nexport type UseMenuOptionItemReturn = ReturnType<typeof useMenuOptionItem>\n"],"mappings":"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"}