{"version":3,"file":"menu.mjs","names":["isUndefined","Menubar","ElSubMenu","vClickoutside","ElMenuCollapseTransition"],"sources":["../../../../../../packages/components/menu/src/menu.ts"],"sourcesContent":["import {\n  computed,\n  defineComponent,\n  getCurrentInstance,\n  h,\n  nextTick,\n  onMounted,\n  provide,\n  reactive,\n  ref,\n  watch,\n  watchEffect,\n  withDirectives,\n} from 'vue'\nimport { unrefElement, useResizeObserver } from '@vueuse/core'\nimport { isNil } from 'lodash-unified'\nimport ElIcon from '@element-plus/components/icon'\nimport { More } from '@element-plus/icons-vue'\nimport {\n  buildProps,\n  definePropType,\n  flattedChildren,\n  iconPropType,\n  isArray,\n  isObject,\n  isString,\n  isUndefined,\n  mutable,\n} from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport { ClickOutside as vClickoutside } from '@element-plus/directives'\nimport Menubar from './utils/menu-bar'\nimport ElMenuCollapseTransition from './menu-collapse-transition.vue'\nimport ElSubMenu from './sub-menu'\nimport { useMenuCssVar } from './use-menu-css-var'\nimport { MENU_INJECTION_KEY, SUB_MENU_INJECTION_KEY } from './tokens'\n\nimport type { PopperEffect } from '@element-plus/components/popper'\nimport type { MenuItemClicked, MenuProvider, SubMenuProvider } from './types'\nimport type { NavigationFailure, Router } from 'vue-router'\nimport type {\n  CSSProperties,\n  Component,\n  DirectiveArguments,\n  ExtractPropTypes,\n  ExtractPublicPropTypes,\n  VNode,\n  VNodeArrayChildren,\n} from 'vue'\nimport type { UseResizeObserverReturn } from '@vueuse/core'\n\nexport const menuProps = buildProps({\n  /**\n   * @description menu display mode\n   */\n  mode: {\n    type: String,\n    values: ['horizontal', 'vertical'],\n    default: 'vertical',\n  },\n  /**\n   * @description index of active menu on page load\n   */\n  defaultActive: {\n    type: String,\n    default: '',\n  },\n  /**\n   * @description array that contains indexes of currently active sub-menus\n   */\n  defaultOpeneds: {\n    type: definePropType<string[]>(Array),\n    default: () => mutable([] as const),\n  },\n  /**\n   * @description whether only one sub-menu can be active\n   */\n  uniqueOpened: Boolean,\n  /**\n   * @description whether `vue-router` mode is activated. If true, index will be used as 'path' to activate the route action. Use with `default-active` to set the active item on load.\n   */\n  router: Boolean,\n  /**\n   * @description how sub-menus are triggered, only works when `mode` is 'horizontal'\n   */\n  menuTrigger: {\n    type: String,\n    values: ['hover', 'click'],\n    default: 'hover',\n  },\n  /**\n   * @description whether the menu is collapsed (available only in vertical mode)\n   */\n  collapse: Boolean,\n  /**\n   * @description background color of Menu (hex format) (deprecated, use `--bg-color` instead)\n   * @deprecated use `--bg-color` instead\n   */\n  backgroundColor: String,\n  /**\n   * @description text color of Menu (hex format) (deprecated, use `--text-color` instead)\n   * @deprecated use `--text-color` instead\n   */\n  textColor: String,\n  /**\n   * @description text color of currently active menu item (hex format) (deprecated, use `--active-color` instead)\n   * @deprecated use `--active-color` instead\n   */\n  activeTextColor: String,\n  /**\n   * @description optional, whether menu is collapsed when clicking outside\n   */\n  closeOnClickOutside: Boolean,\n  /**\n   * @description whether to enable the collapse transition\n   */\n  collapseTransition: {\n    type: Boolean,\n    default: true,\n  },\n  /**\n   * @description whether the menu is ellipsis (available only in horizontal mode)\n   */\n  ellipsis: {\n    type: Boolean,\n    default: true,\n  },\n  /**\n   * @description offset of the popper (effective for all submenus)\n   */\n  popperOffset: {\n    type: Number,\n    default: 6,\n  },\n  /**\n   * @description custom ellipsis icon (available only in horizontal mode and ellipsis is true)\n   */\n  ellipsisIcon: {\n    type: iconPropType,\n    default: () => More,\n  },\n  /**\n   * @description Tooltip theme, built-in theme: `dark` / `light` when menu is collapsed\n   */\n  popperEffect: {\n    type: definePropType<PopperEffect>(String),\n    default: 'dark',\n  },\n  /**\n   * @description custom class name for all popup menus\n   */\n  popperClass: String,\n  /**\n   * @description custom style for all popup menus\n   */\n  popperStyle: {\n    type: definePropType<string | CSSProperties>([String, Object]),\n  },\n  /**\n   * @description control timeout for all menus before showing\n   */\n  showTimeout: {\n    type: Number,\n    default: 300,\n  },\n  /**\n   * @description control timeout for all menus before hiding\n   */\n  hideTimeout: {\n    type: Number,\n    default: 300,\n  },\n  /**\n   * @description when menu inactive and `persistent` is `false` , dropdown menu will be destroyed\n   */\n  persistent: {\n    type: Boolean,\n    default: true,\n  },\n} as const)\nexport type MenuProps = ExtractPropTypes<typeof menuProps>\nexport type MenuPropsPublic = ExtractPublicPropTypes<typeof menuProps>\n\nconst checkIndexPath = (indexPath: unknown): indexPath is string[] =>\n  isArray(indexPath) && indexPath.every((path) => isString(path))\n\nexport const menuEmits = {\n  close: (index: string, indexPath: string[]) =>\n    isString(index) && checkIndexPath(indexPath),\n\n  open: (index: string, indexPath: string[]) =>\n    isString(index) && checkIndexPath(indexPath),\n\n  select: (\n    index: string,\n    indexPath: string[],\n    item: MenuItemClicked,\n    routerResult?: Promise<void | NavigationFailure>\n  ) =>\n    isString(index) &&\n    checkIndexPath(indexPath) &&\n    isObject(item) &&\n    (isUndefined(routerResult) || routerResult instanceof Promise),\n}\nexport type MenuEmits = typeof menuEmits\n\nconst DEFAULT_MORE_ITEM_WIDTH = 64\n\nexport default defineComponent({\n  name: 'ElMenu',\n\n  props: menuProps,\n  emits: menuEmits,\n\n  setup(props, { emit, slots, expose }) {\n    const instance = getCurrentInstance()!\n    const router = instance.appContext.config.globalProperties.$router as Router\n    const menu = ref<HTMLUListElement>()\n    const subMenu = ref<HTMLElement>()\n    const nsMenu = useNamespace('menu')\n    const nsSubMenu = useNamespace('sub-menu')\n    let moreItemWidth = DEFAULT_MORE_ITEM_WIDTH\n\n    // data\n    const sliceIndex = ref(-1)\n\n    const openedMenus = ref<MenuProvider['openedMenus']>(\n      props.defaultOpeneds && !props.collapse\n        ? props.defaultOpeneds.slice(0)\n        : []\n    )\n    const activeIndex = ref<MenuProvider['activeIndex']>(props.defaultActive)\n    const items = ref<MenuProvider['items']>({})\n    const subMenus = ref<MenuProvider['subMenus']>({})\n\n    // computed\n    const isMenuPopup = computed<MenuProvider['isMenuPopup']>(\n      () =>\n        props.mode === 'horizontal' ||\n        (props.mode === 'vertical' && props.collapse)\n    )\n\n    // methods\n    const initMenu = () => {\n      const activeItem = activeIndex.value && items.value[activeIndex.value]\n      if (!activeItem || props.mode === 'horizontal' || props.collapse) return\n\n      const indexPath = activeItem.indexPath\n\n      // 展开该菜单项的路径上所有子菜单\n      // expand all subMenus of the menu item\n      indexPath.forEach((index) => {\n        const subMenu = subMenus.value[index]\n        subMenu && openMenu(index, subMenu.indexPath)\n      })\n    }\n\n    const openMenu: MenuProvider['openMenu'] = (index, indexPath) => {\n      if (openedMenus.value.includes(index)) return\n      // 将不在该菜单路径下的其余菜单收起\n      // collapse all menu that are not under current menu item\n      if (props.uniqueOpened) {\n        openedMenus.value = openedMenus.value.filter((index: string) =>\n          indexPath.includes(index)\n        )\n      }\n      openedMenus.value.push(index)\n      emit('open', index, indexPath)\n    }\n\n    const close = (index: string) => {\n      const i = openedMenus.value.indexOf(index)\n      if (i !== -1) {\n        openedMenus.value.splice(i, 1)\n      }\n    }\n\n    const closeMenu: MenuProvider['closeMenu'] = (index, indexPath) => {\n      close(index)\n      emit('close', index, indexPath)\n    }\n\n    const handleSubMenuClick: MenuProvider['handleSubMenuClick'] = ({\n      index,\n      indexPath,\n    }) => {\n      const isOpened = openedMenus.value.includes(index)\n\n      isOpened ? closeMenu(index, indexPath) : openMenu(index, indexPath)\n    }\n\n    const handleMenuItemClick: MenuProvider['handleMenuItemClick'] = (\n      menuItem\n    ) => {\n      if (props.mode === 'horizontal' || props.collapse) {\n        openedMenus.value = []\n      }\n      const { index, indexPath } = menuItem\n      if (isNil(index) || isNil(indexPath)) return\n\n      if (props.router && router) {\n        const route = menuItem.route || index\n        const routerResult = router.push(route).then((res) => {\n          if (!res) activeIndex.value = index\n          return res\n        })\n        emit(\n          'select',\n          index,\n          indexPath,\n          { index, indexPath, route },\n          routerResult\n        )\n      } else {\n        activeIndex.value = index\n        emit('select', index, indexPath, { index, indexPath })\n      }\n    }\n\n    const updateActiveIndex = (val: string) => {\n      const itemsInData = items.value\n      const item =\n        itemsInData[val] ||\n        (activeIndex.value && itemsInData[activeIndex.value]) ||\n        itemsInData[props.defaultActive]\n\n      activeIndex.value = item?.index ?? val\n    }\n\n    const calcMenuItemWidth = (menuItem: HTMLElement) => {\n      const computedStyle = getComputedStyle(menuItem)\n      const marginLeft = Number.parseInt(computedStyle.marginLeft, 10)\n      const marginRight = Number.parseInt(computedStyle.marginRight, 10)\n      return menuItem.offsetWidth + marginLeft + marginRight || 0\n    }\n\n    const calcSliceIndex = () => {\n      if (!menu.value) return -1\n\n      const items = Array.from(menu.value.childNodes).filter(\n        (item) =>\n          item.nodeName !== '#comment' &&\n          (item.nodeName !== '#text' || item.nodeValue)\n      ) as HTMLElement[]\n\n      const computedMenuStyle = getComputedStyle(menu.value)\n      const paddingLeft = Number.parseInt(computedMenuStyle.paddingLeft, 10)\n      const paddingRight = Number.parseInt(computedMenuStyle.paddingRight, 10)\n      const menuWidth = menu.value.clientWidth - paddingLeft - paddingRight\n\n      let calcWidth = 0\n      let sliceIndex = 0\n      items.forEach((item, index) => {\n        calcWidth += calcMenuItemWidth(item)\n        if (calcWidth <= menuWidth - moreItemWidth) {\n          sliceIndex = index + 1\n        }\n      })\n      return sliceIndex === items.length ? -1 : sliceIndex\n    }\n\n    const getIndexPath = (index: string) => subMenus.value[index].indexPath\n\n    // Common computer monitor FPS is 60Hz, which means 60 redraws per second. Calculation formula: 1000ms/60 ≈ 16.67ms, In order to avoid a certain chance of repeated triggering when `resize`, set wait to 16.67 * 2 = 33.34\n    const debounce = (fn: () => void, wait = 33.34) => {\n      let timer: ReturnType<typeof setTimeout> | null\n      return () => {\n        timer && clearTimeout(timer)\n        timer = setTimeout(() => {\n          fn()\n        }, wait)\n      }\n    }\n\n    let isFirstTimeRender = true\n    const handleResize = () => {\n      const el = unrefElement(subMenu)\n      if (el) moreItemWidth = calcMenuItemWidth(el) || DEFAULT_MORE_ITEM_WIDTH\n      if (sliceIndex.value === calcSliceIndex()) return\n      const callback = () => {\n        sliceIndex.value = -1\n        nextTick(() => {\n          sliceIndex.value = calcSliceIndex()\n        })\n      }\n      // execute callback directly when first time resize to avoid shaking\n      isFirstTimeRender ? callback() : debounce(callback)()\n      isFirstTimeRender = false\n    }\n\n    watch(\n      () => props.defaultActive,\n      (currentActive) => {\n        if (!items.value[currentActive]) {\n          activeIndex.value = ''\n        }\n        updateActiveIndex(currentActive)\n      }\n    )\n\n    watch(\n      () => props.collapse,\n      (value) => {\n        if (value) openedMenus.value = []\n      }\n    )\n\n    watch(items.value, initMenu)\n\n    let resizeStopper: UseResizeObserverReturn['stop']\n    watchEffect(() => {\n      if (props.mode === 'horizontal' && props.ellipsis)\n        resizeStopper = useResizeObserver(menu, handleResize).stop\n      else resizeStopper?.()\n    })\n\n    const mouseInChild = ref(false)\n\n    // provide\n    {\n      const addSubMenu: MenuProvider['addSubMenu'] = (item) => {\n        subMenus.value[item.index] = item\n      }\n\n      const removeSubMenu: MenuProvider['removeSubMenu'] = (item) => {\n        delete subMenus.value[item.index]\n      }\n\n      const addMenuItem: MenuProvider['addMenuItem'] = (item) => {\n        items.value[item.index] = item\n      }\n\n      const removeMenuItem: MenuProvider['removeMenuItem'] = (item) => {\n        delete items.value[item.index]\n      }\n\n      provide<MenuProvider>(\n        MENU_INJECTION_KEY,\n        reactive({\n          props,\n          openedMenus,\n          items,\n          subMenus,\n          activeIndex,\n          isMenuPopup,\n\n          addMenuItem,\n          removeMenuItem,\n          addSubMenu,\n          removeSubMenu,\n          openMenu,\n          closeMenu,\n          handleMenuItemClick,\n          handleSubMenuClick,\n        })\n      )\n\n      provide<SubMenuProvider>(`${SUB_MENU_INJECTION_KEY}${instance.uid}`, {\n        addSubMenu,\n        removeSubMenu,\n        mouseInChild,\n        level: 0,\n      })\n    }\n\n    // lifecycle\n    onMounted(() => {\n      if (props.mode === 'horizontal') {\n        new Menubar(instance.vnode.el!, nsMenu.namespace.value)\n      }\n    })\n\n    {\n      const open = (index: string) => {\n        const { indexPath } = subMenus.value[index]\n        indexPath.forEach((i) => openMenu(i, indexPath))\n      }\n\n      expose({\n        open,\n        close,\n        updateActiveIndex,\n        handleResize,\n      })\n    }\n\n    const ulStyle = useMenuCssVar(props, 0)\n\n    return () => {\n      let slot: VNodeArrayChildren = slots.default?.() ?? []\n      const vShowMore: VNode[] = []\n\n      if (props.mode === 'horizontal' && menu.value) {\n        const originalSlot = (\n          flattedChildren(slot) as VNodeArrayChildren\n        ).filter((vnode) => {\n          // Filter text and comment nodes (https://github.com/vuejs/core/blob/c875019d49b4c36a88d929ccadc31ad414747c7b/packages/shared/src/shapeFlags.ts#L5)\n          return (vnode as VNode)?.shapeFlag !== 8\n        })\n        const slotDefault =\n          sliceIndex.value === -1\n            ? originalSlot\n            : originalSlot.slice(0, sliceIndex.value)\n\n        const slotMore =\n          sliceIndex.value === -1 ? [] : originalSlot.slice(sliceIndex.value)\n\n        if (slotMore?.length && props.ellipsis) {\n          slot = slotDefault\n          vShowMore.push(\n            h(\n              ElSubMenu,\n              {\n                ref: subMenu,\n                index: 'sub-menu-more',\n                class: nsSubMenu.e('hide-arrow'),\n                popperOffset: props.popperOffset,\n              },\n              {\n                title: () =>\n                  h(\n                    ElIcon,\n                    {\n                      class: nsSubMenu.e('icon-more'),\n                    },\n                    {\n                      default: () => h(props.ellipsisIcon as Component),\n                    }\n                  ),\n                default: () => slotMore,\n              }\n            )\n          )\n        }\n      }\n\n      const directives: DirectiveArguments = props.closeOnClickOutside\n        ? [\n            [\n              vClickoutside,\n              () => {\n                if (!openedMenus.value.length) return\n\n                if (!mouseInChild.value) {\n                  openedMenus.value.forEach((openedMenu) =>\n                    emit('close', openedMenu, getIndexPath(openedMenu))\n                  )\n\n                  openedMenus.value = []\n                }\n              },\n            ],\n          ]\n        : []\n\n      const vMenu = withDirectives(\n        h(\n          'ul',\n          {\n            key: String(props.collapse),\n            role: 'menubar',\n            ref: menu,\n            style: ulStyle.value,\n            class: {\n              [nsMenu.b()]: true,\n              [nsMenu.m(props.mode)]: true,\n              [nsMenu.m('collapse')]: props.collapse,\n            },\n          },\n          [...slot, ...vShowMore]\n        ),\n        directives\n      )\n\n      if (props.collapseTransition && props.mode === 'vertical') {\n        return h(ElMenuCollapseTransition, () => vMenu)\n      }\n\n      return vMenu\n    }\n  },\n})\n"],"mappings":"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"}