{"version":3,"file":"Menu.cjs","sources":["../../../src/components/Menu/Menu.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useDidUpdate, useUncontrolled } from '@raikou/hooks';\nimport {\n  ExtendComponent,\n  Factory,\n  getContextItemIndex,\n  StylesApiProps,\n  useHovered,\n  useProps,\n  useResolvedStylesApi,\n  useStyles,\n} from '../../core';\nimport { useDelayedHover } from '../Floating';\nimport { __PopoverProps, Popover, PopoverStylesNames } from '../Popover';\nimport { MenuContextProvider } from './Menu.context';\nimport { MenuDivider } from './MenuDivider/MenuDivider';\nimport { MenuDropdown } from './MenuDropdown/MenuDropdown';\nimport { MenuItem } from './MenuItem/MenuItem';\nimport { MenuLabel } from './MenuLabel/MenuLabel';\nimport { MenuTarget } from './MenuTarget/MenuTarget';\nimport {\n  MenuDividerStyle,\n  MenuDropdownStyle,\n  MenuItemLabelStyle,\n  MenuItemSectionStyle,\n  MenuItemStyle,\n  MenuLabelStyle,\n} from './Menu.css';\n\nexport type MenuStylesNames =\n  | 'item'\n  | 'itemLabel'\n  | 'itemSection'\n  | 'label'\n  | 'divider'\n  | PopoverStylesNames;\n\nexport type MenuFactory = Factory<{\n  props: MenuProps;\n  ref: HTMLDivElement;\n  stylesNames: MenuStylesNames;\n}>;\n\nexport interface MenuProps extends __PopoverProps, StylesApiProps<MenuFactory> {\n  variant?: string;\n\n  /** Menu content */\n  children?: React.ReactNode;\n\n  /** Controlled menu opened state */\n  opened?: boolean;\n\n  /** Uncontrolled menu initial opened state */\n  defaultOpened?: boolean;\n\n  /** Determines whether dropdown should trap focus of keyboard events */\n  trapFocus?: boolean;\n\n  /** Called when menu opened state changes */\n  onChange?: (opened: boolean) => void;\n\n  /** Called when Menu is opened */\n  onOpen?: () => void;\n\n  /** Called when Menu is closed */\n  onClose?: () => void;\n\n  /** Determines whether Menu should be closed when item is clicked */\n  closeOnItemClick?: boolean;\n\n  /** Determines whether arrow key presses should loop though items (first to last and last to first) */\n  loop?: boolean;\n\n  /** Determines whether dropdown should be closed when Escape key is pressed */\n  closeOnEscape?: boolean;\n\n  /** Event which should open menu */\n  trigger?: 'click' | 'hover' | 'click-hover';\n\n  /** Open delay in ms, applicable only to trigger=\"hover\" variant */\n  openDelay?: number;\n\n  /** Close delay in ms, applicable only to trigger=\"hover\" variant */\n  closeDelay?: number;\n\n  /** Determines whether dropdown should be closed on outside clicks */\n  closeOnClickOutside?: boolean;\n\n  /** Events that trigger outside clicks */\n  clickOutsideEvents?: string[];\n\n  /** Id base to create accessibility connections */\n  id?: string;\n\n  /** Set the `tabindex` on all menu items. Defaults to -1 */\n  menuItemTabIndex?: -1 | 0;\n}\n\nconst defaultProps: Partial<MenuProps> = {\n  trapFocus: true,\n  closeOnItemClick: true,\n  clickOutsideEvents: ['mousedown', 'touchstart', 'keydown'],\n  loop: true,\n  trigger: 'click',\n  openDelay: 0,\n  closeDelay: 100,\n  menuItemTabIndex: -1,\n};\n\nexport function Menu(_props: MenuProps) {\n  const props = useProps('Menu', defaultProps, _props);\n  const {\n    children,\n    onOpen,\n    onClose,\n    opened,\n    defaultOpened,\n    trapFocus,\n    onChange,\n    closeOnItemClick,\n    loop,\n    closeOnEscape,\n    trigger,\n    openDelay,\n    closeDelay,\n    classNames,\n    styles,\n    unstyled,\n    variant,\n    vars,\n    menuItemTabIndex,\n    keepMounted,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<MenuFactory>({\n    name: 'Menu',\n    classes: {\n      dropdown: MenuDropdownStyle,\n      item: MenuItemStyle,\n      itemLabel: MenuItemLabelStyle,\n      itemSection: MenuItemSectionStyle,\n      label: MenuLabelStyle,\n      divider: MenuDividerStyle,\n    },\n    props,\n    classNames,\n    styles,\n    unstyled,\n  });\n\n  const [hovered, { setHovered, resetHovered }] = useHovered();\n  const [_opened, setOpened] = useUncontrolled({\n    value: opened,\n    defaultValue: defaultOpened,\n    finalValue: false,\n    onChange,\n  });\n  const [openedViaClick, setOpenedViaClick] = useState(false);\n\n  const close = () => {\n    setOpened(false);\n    setOpenedViaClick(false);\n    _opened && onClose?.();\n  };\n\n  const open = () => {\n    setOpened(true);\n    !_opened && onOpen?.();\n  };\n\n  const toggleDropdown = () => {\n    _opened ? close() : open();\n  };\n\n  const { openDropdown, closeDropdown } = useDelayedHover({ open, close, closeDelay, openDelay });\n\n  const getItemIndex = (node: HTMLButtonElement) =>\n    getContextItemIndex('[data-menu-item]', '[data-menu-dropdown]', node);\n\n  const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<MenuFactory>({\n    classNames,\n    styles,\n    props,\n  });\n\n  useDidUpdate(() => {\n    resetHovered();\n  }, [_opened]);\n\n  return (\n    <MenuContextProvider\n      value={{\n        getStyles,\n        opened: _opened,\n        toggleDropdown,\n        getItemIndex,\n        hovered,\n        setHovered,\n        openedViaClick,\n        setOpenedViaClick,\n        closeOnItemClick,\n        closeDropdown: trigger === 'click' ? close : closeDropdown,\n        openDropdown: trigger === 'click' ? open : openDropdown,\n        closeDropdownImmediately: close,\n        loop,\n        trigger,\n        unstyled,\n        menuItemTabIndex,\n      }}\n    >\n      <Popover\n        {...others}\n        opened={_opened}\n        onChange={toggleDropdown}\n        defaultOpened={defaultOpened}\n        trapFocus={keepMounted ? false : trapFocus}\n        closeOnEscape={closeOnEscape}\n        __staticSelector=\"Menu\"\n        classNames={resolvedClassNames}\n        styles={resolvedStyles}\n        unstyled={unstyled}\n        variant={variant}\n        keepMounted={keepMounted}\n      >\n        {children}\n      </Popover>\n    </MenuContextProvider>\n  );\n}\n\nMenu.extend = (input: ExtendComponent<MenuFactory>) => input;\nMenu.displayName = '@raikou/core/Menu';\nMenu.Item = MenuItem;\nMenu.Label = MenuLabel;\nMenu.Dropdown = MenuDropdown;\nMenu.Target = MenuTarget;\nMenu.Divider = MenuDivider;\n"],"names":["useProps","useStyles","MenuDropdownStyle","MenuItemStyle","MenuItemLabelStyle","MenuItemSectionStyle","MenuLabelStyle","MenuDividerStyle","useHovered","useUncontrolled","useState","useDelayedHover","getContextItemIndex","useResolvedStylesApi","useDidUpdate","jsx","MenuContextProvider","Popover","MenuItem","MenuLabel","MenuDropdown","MenuTarget","MenuDivider"],"mappings":"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"}