{"version":3,"sources":["../src/menu.tsx"],"sourcesContent":["import type { FC, ThemeProps } from \"@yamada-ui/core\"\nimport type { PopoverProps } from \"@yamada-ui/popover\"\nimport { omitThemeProps, useComponentMultiStyle } from \"@yamada-ui/core\"\nimport { Popover } from \"@yamada-ui/popover\"\nimport { useDisclosure } from \"@yamada-ui/use-disclosure\"\nimport { funcAll, useUnmountEffect, useUpdateEffect } from \"@yamada-ui/utils\"\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\"\nimport {\n  DescendantsContextProvider,\n  MenuProvider,\n  UpstreamMenuProvider,\n  useContextMenu,\n  useDescendants,\n  useUpstreamMenu,\n  useUpstreamMenuItem,\n} from \"./menu-context\"\n\nexport interface MenuOptions {\n  /**\n   * If `true`, the list element will be closed when value is selected.\n   *\n   * @default true\n   */\n  closeOnSelect?: boolean\n}\n\nexport interface MenuProps\n  extends ThemeProps<\"Menu\">,\n    Omit<PopoverProps, \"closeOnButton\" | \"relatedRef\">,\n    MenuOptions {}\n\n/**\n * `Menu` is a component that displays a common dropdown menu.\n *\n * @see Docs https://yamada-ui.com/components/overlay/menu\n */\nexport const Menu: FC<MenuProps> = (props) => {\n  const { styles: contextMenuStyles } = useContextMenu() ?? {}\n  const [styles, mergedProps] = useComponentMultiStyle(\"Menu\", props, {\n    isProcessSkip: !!contextMenuStyles,\n    styles: contextMenuStyles,\n  })\n  const { relatedRef, onDownstreamCloseMapRef, onUpstreamClose } =\n    useUpstreamMenu() ?? {}\n  const nested = !!relatedRef\n  const {\n    closeOnBlur = !nested,\n    closeOnSelect = true,\n    duration = 0.2,\n    initialFocusRef,\n    offset = nested ? [-8, 8] : undefined,\n    placement = nested ? \"right-start\" : \"bottom-start\",\n    onClose: onCloseProp,\n    onOpen: onOpenProp,\n    ...rest\n  } = omitThemeProps(mergedProps)\n  const { hasDownstreamRef, setDownstreamOpen } = useUpstreamMenuItem() ?? {}\n  const descendants = useDescendants()\n  const [focusedIndex, setFocusedIndex] = useState<number>(-1)\n  const menuRef = useRef<HTMLDivElement>(null)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n  const timeoutIds = useRef<Set<any>>(new Set([]))\n  const requestAnimationFrameId = useRef<null | number>(null)\n  const onCloseMapRef = useRef<Map<string, () => void>>(new Map())\n\n  const onFocusMenu = useCallback(() => {\n    requestAnimationFrame(() =>\n      menuRef.current?.focus({ preventScroll: false }),\n    )\n  }, [])\n\n  const onFocusFirstItem = useCallback(() => {\n    const id = setTimeout(() => {\n      if (initialFocusRef) return\n\n      const first = descendants.enabledFirstValue()\n\n      if (first) setFocusedIndex(first.index)\n    })\n\n    timeoutIds.current.add(id)\n  }, [descendants, initialFocusRef])\n\n  const onFocusLastItem = useCallback(() => {\n    const id = setTimeout(() => {\n      if (initialFocusRef) return\n\n      const last = descendants.enabledLastValue()\n\n      if (last) setFocusedIndex(last.index)\n    })\n\n    timeoutIds.current.add(id)\n  }, [descendants, initialFocusRef])\n\n  const onOpenInternal = useCallback(() => {\n    onOpenProp?.()\n\n    if (!nested) onFocusMenu()\n  }, [onOpenProp, nested, onFocusMenu])\n\n  const onCloseInternal = useCallback(() => {\n    onCloseProp?.()\n\n    for (const onClose of onCloseMapRef.current.values()) {\n      onClose()\n    }\n  }, [onCloseProp])\n\n  const id = useId()\n  const { open, onClose, onOpen } = useDisclosure({\n    ...props,\n    onClose: onCloseInternal,\n    onOpen: onOpenInternal,\n  })\n\n  useEffect(() => {\n    const onCloseMap = onDownstreamCloseMapRef?.current\n\n    onCloseMap?.set(id, onClose)\n\n    return () => {\n      onCloseMap?.delete(id)\n    }\n  }, [id, onClose, onDownstreamCloseMapRef])\n\n  useEffect(() => {\n    if (setDownstreamOpen) setDownstreamOpen(open)\n  }, [setDownstreamOpen, open])\n\n  useEffect(() => {\n    if (hasDownstreamRef) hasDownstreamRef.current = true\n\n    return () => {\n      if (hasDownstreamRef) hasDownstreamRef.current = false\n    }\n  })\n\n  useUpdateEffect(() => {\n    if (!open) setFocusedIndex(-1)\n  }, [open])\n\n  useUnmountEffect(() => {\n    timeoutIds.current.forEach((id) => clearTimeout(id))\n    timeoutIds.current.clear()\n  })\n\n  return (\n    <DescendantsContextProvider value={descendants}>\n      <UpstreamMenuProvider\n        value={{\n          relatedRef: menuRef,\n          onDownstreamCloseMapRef: onCloseMapRef,\n          onUpstreamClose: funcAll(onUpstreamClose, onClose),\n        }}\n      >\n        <MenuProvider\n          value={{\n            buttonRef,\n            closeOnSelect,\n            focusedIndex,\n            menuRef,\n            nested,\n            open,\n            requestAnimationFrameId,\n            setFocusedIndex,\n            styles,\n            onClose,\n            onFocusFirstItem,\n            onFocusLastItem,\n            onOpen,\n            onUpstreamClose,\n          }}\n        >\n          <Popover\n            {...{\n              trigger: nested ? \"hover\" : \"click\",\n              ...rest,\n              closeOnBlur,\n              closeOnButton: false,\n              duration,\n              initialFocusRef,\n              offset,\n              open,\n              placement,\n              relatedRef,\n              onClose,\n              onOpen,\n            }}\n          />\n        </MenuProvider>\n      </UpstreamMenuProvider>\n    </DescendantsContextProvider>\n  )\n}\n\nMenu.__ui__ = \"Menu\"\n"],"mappings":"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","names":["_a","id","onClose"]}