{"version":3,"file":"useTagScroll.mjs","sources":["../../../../components/tag-input/hooks/useTagScroll.ts"],"sourcesContent":["/**\n * 当标签数量过多时，输入框显示不下，则需要滚动查看，以下为滚动逻辑\n * 如果标签过多时的处理方式，是标签省略，则不需要此功能\n */\n\nimport { isFunction } from 'lodash-es';\nimport { onMounted, onUnmounted, ref, toRefs } from 'vue';\nimport { usePrefixClass } from '@tdesign/shared-hooks';\nimport { TdTagInputProps } from '../type';\n\nexport function useTagScroll(props: TdTagInputProps) {\n  const tagInputRef = ref();\n  const classPrefix = usePrefixClass();\n  const { excessTagsDisplayType, readonly, disabled } = toRefs(props);\n  // 允许向右滚动的最大距离\n  const scrollDistance = ref(0);\n  const scrollElement = ref<HTMLElement>();\n  const mouseEnterTimer = ref();\n  const isScrollable = ref(false); // 设置可滚动\n\n  const updateScrollElement = (element: HTMLElement) => {\n    // 获取 .t-input__prefix 元素，这是真正需要滚动的容器\n    const prefixElement = element.querySelector(`.${classPrefix.value}-input__prefix`) as HTMLElement;\n    scrollElement.value = prefixElement;\n  };\n\n  const updateScrollDistance = () => {\n    scrollDistance.value = scrollElement.value.scrollWidth - scrollElement.value.clientWidth;\n  };\n\n  const scrollTo = (distance: number) => {\n    if (!isFunction(scrollElement.value?.scroll)) return;\n    scrollElement.value.scroll({ left: distance, behavior: 'smooth' });\n  };\n\n  const scrollToRight = () => {\n    // 重新获取滚动元素，确保元素引用是最新的\n    const element = tagInputRef.value?.$el;\n    if (element) {\n      updateScrollElement(element);\n    }\n    if (!scrollElement.value) return;\n\n    // 使用 setTimeout 确保 DOM 布局完成后再计算滚动距离\n    setTimeout(() => {\n      updateScrollDistance();\n      scrollTo(scrollDistance.value);\n      setTimeout(() => {\n        isScrollable.value = true;\n      }, 200);\n    }, 0);\n  };\n\n  const scrollToLeft = () => {\n    scrollTo(0);\n  };\n\n  // MAC 电脑横向滚动使用 deltaX，Windows 纵向滚动使用 deltaY\n  const onWheel = ({ e }: { e: WheelEvent }) => {\n    if (readonly.value || disabled.value) return;\n    if (!scrollElement.value) return;\n    // 使用 deltaX 或 deltaY 来判断滚动方向，优先使用绝对值更大的\n    const delta = Math.abs(e.deltaX) >= Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n    if (delta > 0) {\n      updateScrollDistance();\n      const distance = Math.min(scrollElement.value.scrollLeft + 120, scrollDistance.value);\n      scrollTo(distance);\n    } else if (delta < 0) {\n      const distance = Math.max(scrollElement.value.scrollLeft - 120, 0);\n      scrollTo(distance);\n    }\n  };\n\n  // 鼠标 hover，自动滑动到最右侧，以便输入新标签\n  const scrollToRightOnEnter = () => {\n    if (excessTagsDisplayType.value !== 'scroll') return;\n    // 一闪而过的 mousenter 不需要执行\n    mouseEnterTimer.value = setTimeout(() => {\n      scrollToRight();\n      clearTimeout(mouseEnterTimer.value);\n    }, 100);\n  };\n\n  const scrollToLeftOnLeave = () => {\n    if (excessTagsDisplayType.value !== 'scroll') return;\n    isScrollable.value = false; // 离开焦点不可滚动\n    scrollTo(0);\n    clearTimeout(mouseEnterTimer.value);\n  };\n\n  const init = () => {\n    const element = tagInputRef.value?.$el;\n    if (!element) return;\n    updateScrollElement(element);\n  };\n\n  const clear = () => {\n    clearTimeout(mouseEnterTimer.value);\n  };\n\n  onMounted(init);\n\n  onUnmounted(clear);\n\n  return {\n    tagInputRef,\n    scrollElement,\n    scrollDistance,\n    scrollTo,\n    scrollToRight,\n    scrollToLeft,\n    updateScrollElement,\n    updateScrollDistance,\n    onWheel,\n    scrollToRightOnEnter,\n    scrollToLeftOnLeave,\n    isScrollable,\n  };\n}\n"],"names":["useTagScroll","props","tagInputRef","ref","classPrefix","usePrefixClass","_toRefs","toRefs","excessTagsDisplayType","readonly","disabled","scrollDistance","scrollElement","mouseEnterTimer","isScrollable","updateScrollElement","element","prefixElement","querySelector","concat","value","updateScrollDistance","scrollWidth","clientWidth","scrollTo","distance","_scrollElement$value","isFunction","scroll","left","behavior","scrollToRight","_tagInputRef$value","$el","setTimeout","scrollToLeft","onWheel","_ref","e","delta","Math","abs","deltaX","deltaY","min","scrollLeft","max","scrollToRightOnEnter","clearTimeout","scrollToLeftOnLeave","init","_tagInputRef$value2","clear","onMounted","onUnmounted"],"mappings":"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"}