{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/text-ellipsis/src/index.ts"],"sourcesContent":["import {\n  computed,\n  defineComponent,\n  h,\n  nextTick,\n  onActivated,\n  onMounted,\n  ref,\n  watch,\n} from 'vue'\nimport { ElTooltip, useNamespace } from 'element-plus'\nimport { useWindowSize } from '@element-plus/hooks'\nimport { DIV_TAG, SPAN_TAG } from '@element-plus/constants'\nimport { textEllipsisEmits, textEllipsisProps } from './text-ellipsis'\n\nexport default defineComponent({\n  name: 'ElTextEllipsis',\n\n  props: textEllipsisProps,\n\n  emits: textEllipsisEmits,\n\n  setup(props, { attrs, emit, slots, expose }) {\n    const ns = useNamespace('text-ellipsis')\n    const { width } = useWindowSize()\n    const text = ref(props.content)\n    const expanded = ref(false)\n    const hasAction = ref(false)\n    const root = ref<HTMLElement>()\n    const actionRef = ref<HTMLElement>()\n    let needRecalculate = false\n\n    const actionText = computed(() =>\n      expanded.value ? props.collapseText : props.expandText\n    )\n\n    const pxToNum = (value: string | null) => {\n      if (!value) return 0\n      const match = value.match(/^\\d*(\\.\\d*)?/)\n      return match ? Number(match[0]) : 0\n    }\n\n    const cloneContainer = () => {\n      if (!root.value || !root.value.isConnected) return\n\n      const originStyle = window.getComputedStyle(root.value)\n      const container = document.createElement('div')\n      const styleNames: string[] = Array.prototype.slice.apply(originStyle)\n\n      styleNames.forEach((name) => {\n        container.style.setProperty(name, originStyle.getPropertyValue(name))\n      })\n\n      container.style.position = 'fixed'\n      container.style.zIndex = '-9999'\n      container.style.top = '-9999px'\n      container.style.height = 'auto'\n      container.style.minHeight = 'auto'\n      container.style.maxHeight = 'auto'\n\n      container.innerText = props.content\n      document.body.appendChild(container)\n\n      return container\n    }\n\n    const calcEllipsisText = (container: HTMLDivElement, maxHeight: number) => {\n      const { content, position, dots } = props\n      const end = content.length\n      const middle = (0 + end) >> 1\n      const actionHTML = slots.action\n        ? actionRef.value?.outerHTML ?? ''\n        : props.expandText\n\n      const calcEllipse = () => {\n        // calculate the former or later content\n        const tail = (left: number, right: number): string => {\n          if (right - left <= 1) {\n            if (position === 'end') {\n              return content.slice(0, left) + dots\n            }\n            return dots + content.slice(right, end)\n          }\n\n          const middle = Math.round((left + right) / 2)\n\n          // Set the interception location\n          if (position === 'end') {\n            container.innerText = content.slice(0, middle) + dots\n          } else {\n            container.innerText = dots + content.slice(middle, end)\n          }\n\n          container.innerHTML += actionHTML\n\n          // The height after interception still does not match the rquired height\n          if (container.offsetHeight > maxHeight) {\n            if (position === 'end') {\n              return tail(left, middle)\n            }\n            return tail(middle, right)\n          }\n\n          if (position === 'end') {\n            return tail(middle, right)\n          }\n\n          return tail(left, middle)\n        }\n\n        return tail(0, end)\n      }\n\n      const middleTail = (\n        leftPart: [number, number],\n        rightPart: [number, number]\n      ): string => {\n        if (\n          leftPart[1] - leftPart[0] <= 1 &&\n          rightPart[1] - rightPart[0] <= 1\n        ) {\n          return (\n            content.slice(0, leftPart[0]) +\n            dots +\n            content.slice(rightPart[1], end)\n          )\n        }\n\n        const leftMiddle = Math.floor((leftPart[0] + leftPart[1]) / 2)\n        const rightMiddle = Math.ceil((rightPart[0] + rightPart[1]) / 2)\n\n        container.innerText =\n          props.content.slice(0, leftMiddle) +\n          props.dots +\n          props.content.slice(rightMiddle, end)\n        container.innerHTML += actionHTML\n\n        if (container.offsetHeight >= maxHeight) {\n          return middleTail(\n            [leftPart[0], leftMiddle],\n            [rightMiddle, rightPart[1]]\n          )\n        }\n\n        return middleTail(\n          [leftMiddle, leftPart[1]],\n          [rightPart[0], rightMiddle]\n        )\n      }\n\n      return props.position === 'middle'\n        ? middleTail([0, middle], [middle, end])\n        : calcEllipse()\n    }\n\n    const calcEllipsised = () => {\n      // Calculate the interceptional text\n      const container = cloneContainer()\n\n      if (!container) {\n        needRecalculate = true\n        return\n      }\n\n      const { paddingBottom, paddingTop, lineHeight } = container.style\n      const maxHeight = Math.ceil(\n        (Number(props.rows) + 0.5) * pxToNum(lineHeight) +\n          pxToNum(paddingTop) +\n          pxToNum(paddingBottom)\n      )\n\n      if (maxHeight < container.offsetHeight) {\n        hasAction.value = true\n        text.value = calcEllipsisText(container, maxHeight)\n      } else {\n        hasAction.value = false\n        text.value = props.content\n      }\n\n      document.body.removeChild(container)\n    }\n\n    const toggle = (isExpanded = !expanded.value) => {\n      expanded.value = isExpanded\n    }\n\n    const onClickAction = (event: MouseEvent) => {\n      toggle()\n      emit('clickAction', event)\n    }\n\n    const renderAction = () => {\n      const action = slots.action\n        ? slots.action({ expanded: expanded.value })\n        : actionText.value\n      return h(\n        'span',\n        {\n          ref: actionRef,\n          class: ns.e('action'),\n          onClick: onClickAction,\n        },\n        action\n      )\n    }\n\n    onMounted(() => {\n      calcEllipsised()\n\n      if (slots.action) {\n        nextTick(calcEllipsised)\n      }\n    })\n\n    onActivated(() => {\n      if (needRecalculate) {\n        needRecalculate = false\n        calcEllipsised()\n      }\n    })\n\n    watch(\n      () => [props.content, props.rows, props.position, width.value],\n      calcEllipsised\n    )\n\n    const renderContent = () => {\n      return h(\n        ElTooltip,\n        {\n          disabled: !hasAction.value,\n          ...props.tooltipOptions,\n        },\n        {\n          default: () => {\n            return h(DIV_TAG, { ref: root, class: [ns.b(), attrs.class] }, [\n              text.value,\n            ])\n          },\n          content: () =>\n            slots.content?.({ content: props.content, text: text.value }) ??\n            h(SPAN_TAG, props.content),\n        }\n      )\n    }\n\n    expose({ toggle })\n\n    return () =>\n      props.showOverflowTooltip\n        ? renderContent()\n        : h(DIV_TAG, { ref: root, class: ns.b() }, [\n            expanded.value ? props.content : text.value,\n            hasAction.value ? renderAction() : null,\n          ])\n  },\n})\n"],"names":["middle"],"mappings":"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"}