{"version":3,"file":"menu.vue.mjs","sources":["../../../../../packages/components/cascade-panel/src/menu.vue"],"sourcesContent":["<template>\n  <el-scrollbar\n    :key=\"menuId\"\n    tag=\"ul\"\n    role=\"menu\"\n    class=\"el-cascade-menu\"\n    wrap-class=\"el-cascade-menu__wrap\"\n    :view-class=\"['el-cascade-menu__list', isEmpty && 'is-empty']\"\n    @mousemove=\"handleMouseMove\"\n    @mouseleave=\"clearHoverZone\"\n  >\n    <el-cascade-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=\"el-cascade-menu__empty-text\">\n      <el-icon size=\"14\" class=\"is-loading\">\n        <loading />\n      </el-icon>\n      加载中...\n    </div>\n    <div v-else-if=\"isEmpty\" class=\"el-cascade-menu__empty-text\">\n      无数据\n    </div>\n    <svg\n      v-else-if=\"panel?.isHoverMenu\"\n      ref=\"hoverZone\"\n      class=\"el-cascade-menu__hover-zone\"\n    ></svg>\n  </el-scrollbar>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, getCurrentInstance, inject, ref } from 'vue'\nimport ElScrollbar from '@element-ultra/components/scrollbar'\nimport { generateId } from '@element-ultra/utils'\nimport { Loading } from 'icon-ultra'\nimport ElIcon from '@element-ultra/components/icon'\nimport ElCascadeNode from './node.vue'\nimport { Cascade_PANEL_INJECTION_KEY } from './types'\n\nimport type { default as CascadeNode } from './node'\nimport type { PropType } from 'vue'\nimport type { Nullable } from '@element-ultra/utils'\n\nexport default defineComponent({\n  name: 'ElCascadeMenu',\n\n  components: {\n    Loading,\n    ElIcon,\n    ElScrollbar,\n    ElCascadeNode,\n  },\n\n  props: {\n    nodes: {\n      type: Array as PropType<CascadeNode[]>,\n      required: true,\n    },\n    index: {\n      type: Number,\n      required: true,\n    },\n  },\n\n  setup(props) {\n    const instance = getCurrentInstance()!\n    const id = generateId()\n    let activeNode: Nullable<HTMLElement> = null\n    let hoverTimer: Nullable<number> = null\n\n    const panel = inject(Cascade_PANEL_INJECTION_KEY)!\n\n    const hoverZone = ref<null | SVGSVGElement>(null)\n\n    const isEmpty = computed(() => !props.nodes.length)\n    const isLoading = computed(() => !panel.initialLoaded)\n    const menuId = computed(() => `cascade-menu-${id}-${props.index}`)\n\n    const handleExpand = (e: MouseEvent) => {\n      activeNode = e.target as HTMLElement\n    }\n\n    const 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\n        hoverZone.value.innerHTML = `\n          <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M${startX} ${top} L${offsetWidth} 0 V${top} Z\" />\n          <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M${startX} ${bottom} L${offsetWidth} ${offsetHeight} V${bottom} Z\" />\n        `\n      } else if (!hoverTimer) {\n        hoverTimer = window.setTimeout(\n          clearHoverZone,\n          panel.config.hoverThreshold\n        )\n      }\n    }\n\n    const clearHoverTimer = () => {\n      if (!hoverTimer) return\n      clearTimeout(hoverTimer)\n      hoverTimer = null\n    }\n\n    const clearHoverZone = () => {\n      if (!hoverZone.value) return\n      hoverZone.value.innerHTML = ''\n      clearHoverTimer()\n    }\n    return {\n      panel,\n      hoverZone,\n      isEmpty,\n      isLoading,\n      menuId,\n      handleExpand,\n      handleMouseMove,\n      clearHoverZone,\n    }\n  },\n})\n</script>\n"],"names":["_resolveComponent","_openBlock","_createBlock","_createElementBlock","_Fragment","_renderList","_createVNode","_createTextVNode"],"mappings":";;;;MAkB0B,UAAM,GAAA;AAAA,EAAA,GAAA,EAAA,CAAA;AAAA;;MAMH,UAAM,GAAA;AAAA,EAAA,GAAA,EAAA,CAAA;AAAA;;MAK1B,UAAY,GAAA;AAAA,EACf,GAAK,EAAA,CAAA;AAAA,EAAA,GAAA,EAAA,WAAA;AAAA;;;;;;kCA7BTA,iBA+Be,cAAA,CAAA,CAAA;EA7BT,OAAAC,SAAA,EAAI,EAAAC,WAAA,CAAA,uBAAA,EAAA;AAAA,IACR,KAAI,IAAC,CAAA,MAAA;AAAA,IACL,GAAK,EAAA,IAAA;AAAA,IACL,IAAA,EAAA,MAAA;AAAA,IACC,KAAA,EAAA,iBAAA;AAAA,IACA,YAAW,EAAA,uBAAA;AAAA,IACX,YAAY,EAAA,CAAc,uBAAA,EAAA,IAAA,CAAA,WAAA,UAAA,CAAA;AAAA,IAAA,aAAA,IAAA,CAAA,eAAA;AAAA,IAGJ,cAAA,IAAA,CAAA,cAAA;AAAA,GAAA,EAAA;AAAA;;;SACfD,SAAA,CAAA,IAAK,CAAG,EAAAE,kBAAA;AAAA,UAAAC,QAAA;AAAA,UAAA,IAAA;AAAA,UAAAC,UAAA,CAAA,IAAA,CAAA,KAAA,EAAA,CAAA,IAAA,KAAA;YACP,OAAAJ,SAAA,EAAI,EAAAC,WAAA,CAAA,0BAAA,EAAA;AAAA,cACV,KAAO,IAAA,CAAA,GAAA;AAAA,cACP,IAAA;AAAA,cAAA,WAAA,IAAA,CAAA,MAAA;AAAA;eAEiB,IAAA,EAAA,CAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,UAAA,CAAA,CAAA,CAAA;AAAA,WAAA,CAAA;AAAA;;SAApB;AAAA,QAAA,KACE,wBAAkB,EAAAC,kBAAA,CAAA,OAAA,UAAA,EAAA;AAAA,UAAAG,YAAO,kBAAY,EAAA;AAAA,YAAA,IAAA,EAAA,IAAA;AAAA;;;;;;;;UAKvBC,gBAAO,yBAAA,CAAA;AAAA,SAAA,CAAA,IAAA,IAAA,CAIV,0CADb,CAAA,KAAA,EAIO,UAAA,EAAA,sBAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAAN,WAAA,EAAAE,kBAAA;AAAA;;;;;;;;;;;;;;;;"}