{"version":3,"file":"menu.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/menu.vue"],"sourcesContent":["<template>\n  <el-scrollbar\n    :key=\"menuId\"\n    tag=\"ul\"\n    role=\"menu\"\n    :class=\"ns.b()\"\n    :wrap-class=\"ns.e('wrap')\"\n    :view-class=\"[ns.e('list'), ns.is('empty', isEmpty)]\"\n    @mousemove=\"handleMouseMove\"\n    @mouseleave=\"clearHoverZone\"\n  >\n    <el-cascader-node\n      v-for=\"node in nodes\"\n      :key=\"node.uid\"\n      :node=\"node\"\n      :menu-id=\"menuId\"\n      @expand=\"handleExpand\"\n    />\n    <div v-if=\"isLoading\" :class=\"ns.e('empty-text')\">\n      <el-icon size=\"14\" :class=\"ns.is('loading')\">\n        <loading />\n      </el-icon>\n      {{ t('el.cascader.loading') }}\n    </div>\n    <div v-else-if=\"isEmpty\" :class=\"ns.e('empty-text')\">\n      <slot name=\"empty\">{{ t('el.cascader.noData') }}</slot>\n    </div>\n    <!-- eslint-disable vue/html-self-closing -->\n    <svg\n      v-else-if=\"panel?.isHoverMenu\"\n      ref=\"hoverZone\"\n      :class=\"ns.e('hover-zone')\"\n    ></svg>\n    <!-- eslint-enable vue/html-self-closing -->\n  </el-scrollbar>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, getCurrentInstance, inject, ref } from 'vue'\nimport ElScrollbar from '@element-plus/components/scrollbar'\nimport { useId, useLocale, useNamespace } from '@element-plus/hooks'\nimport { Loading } from '@element-plus/icons-vue'\nimport ElIcon from '@element-plus/components/icon'\nimport ElCascaderNode from './node.vue'\nimport { CASCADER_PANEL_INJECTION_KEY } from './types'\n\nimport type { CascaderNode } from './types'\nimport type { PropType } from 'vue'\n\ndefineOptions({\n  name: 'ElCascaderMenu',\n})\n\nconst props = defineProps({\n  nodes: {\n    type: Array as PropType<CascaderNode[]>,\n    required: true,\n  },\n  index: {\n    type: Number,\n    required: true,\n  },\n})\n\nconst instance = getCurrentInstance()!\nconst ns = useNamespace('cascader-menu')\n\nconst { t } = useLocale()\nconst id = useId()\nlet activeNode: HTMLElement\nlet hoverTimer: number | undefined\n\nconst panel = inject(CASCADER_PANEL_INJECTION_KEY)!\n\nconst hoverZone = ref<SVGSVGElement>()\n\nconst isEmpty = computed(() => !props.nodes.length)\nconst isLoading = computed(() => !panel.initialLoaded)\nconst menuId = computed(() => `${id.value}-${props.index}`)\n\nconst handleExpand = (e: MouseEvent) => {\n  activeNode = e.target as HTMLElement\n}\n\nconst handleMouseMove = (e: MouseEvent) => {\n  if (!panel.isHoverMenu || !activeNode || !hoverZone.value) return\n\n  if (activeNode.contains(e.target as HTMLElement)) {\n    clearHoverTimer()\n\n    const el = instance.vnode.el as HTMLElement\n    const { left } = el.getBoundingClientRect()\n    const { offsetWidth, offsetHeight } = el\n    const startX = e.clientX - left\n    const top = activeNode.offsetTop\n    const bottom = top + activeNode.offsetHeight\n    const scrollTop = el.querySelector(`.${ns.e('wrap')}`)?.scrollTop || 0\n\n    hoverZone.value.innerHTML = `\n          <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M${startX} ${top} L${offsetWidth} ${scrollTop} V${top} Z\" />\n          <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M${startX} ${bottom} L${offsetWidth} ${offsetHeight + scrollTop} V${bottom} Z\" />\n        `\n  } else if (!hoverTimer) {\n    hoverTimer = window.setTimeout(clearHoverZone, panel.config.hoverThreshold)\n  }\n}\n\nconst clearHoverTimer = () => {\n  if (!hoverTimer) return\n  clearTimeout(hoverTimer)\n  hoverTimer = undefined\n}\n\nconst clearHoverZone = () => {\n  if (!hoverZone.value) return\n  hoverZone.value.innerHTML = ''\n  clearHoverTimer()\n}\n</script>\n"],"mappings":""}