{"version":3,"file":"useResize.mjs","names":[],"sources":["../../../../../../../packages/components/splitter/src/hooks/useResize.ts"],"sourcesContent":["import { computed, ref, watch } from 'vue'\nimport { clamp } from 'lodash-unified'\nimport { getPct, getPx, isPct, isPx } from './useSize'\nimport { NOOP } from '@element-plus/utils'\n\nimport type { ComputedRef, Ref } from 'vue'\nimport type { PanelItemState } from '../type'\n\nexport function useResize(\n  panels: Ref<PanelItemState[]>,\n  containerSize: ComputedRef<number>,\n  pxSizes: ComputedRef<number[]>,\n  lazy: Ref<boolean>\n) {\n  const ptg2px = (ptg: number) => ptg * containerSize.value || 0\n\n  function getLimitSize(\n    str: string | number | undefined,\n    defaultLimit: number\n  ) {\n    if (isPct(str)) {\n      return ptg2px(getPct(str))\n    } else if (isPx(str)) {\n      return getPx(str)\n    }\n    return str ?? defaultLimit\n  }\n\n  const lazyOffset = ref(0)\n  const movingIndex = ref<{\n    index: number\n    confirmed: boolean\n  } | null>(null)\n\n  let cachePxSizes: number[] = []\n  let updatePanelSizes = NOOP\n\n  const limitSizes = computed(() =>\n    panels.value.map((item) => [item.min, item.max])\n  )\n\n  watch(lazy, () => {\n    if (lazyOffset.value) {\n      const mouseup = new MouseEvent('mouseup', { bubbles: true })\n      window.dispatchEvent(mouseup)\n    }\n  })\n\n  const onMoveStart = (index: number) => {\n    lazyOffset.value = 0\n    movingIndex.value = { index, confirmed: false }\n    cachePxSizes = pxSizes.value\n  }\n\n  const onMoving = (index: number, offset: number) => {\n    let confirmedIndex: number | null = null\n\n    // When overlapping, find the nearest draggable index\n    if ((!movingIndex.value || !movingIndex.value.confirmed) && offset !== 0) {\n      if (offset > 0) {\n        confirmedIndex = index\n        movingIndex.value = { index, confirmed: true }\n      } else {\n        for (let i = index; i >= 0; i -= 1) {\n          if (cachePxSizes[i]! > 0) {\n            confirmedIndex = i\n            movingIndex.value = { index: i, confirmed: true }\n            break\n          }\n        }\n      }\n    }\n    const mergedIndex = confirmedIndex ?? movingIndex.value?.index ?? index\n\n    const numSizes = [...cachePxSizes]\n    const nextIndex = mergedIndex + 1\n\n    // Handle the maximum and minimum edge cases\n    const startMinSize = getLimitSize(limitSizes.value[mergedIndex]![0], 0)\n    const endMinSize = getLimitSize(limitSizes.value[nextIndex]![0], 0)\n    const startMaxSize = getLimitSize(\n      limitSizes.value[mergedIndex]![1],\n      containerSize.value || 0\n    )\n    const endMaxSize = getLimitSize(\n      limitSizes.value[nextIndex]![1],\n      containerSize.value || 0\n    )\n\n    let mergedOffset = offset\n\n    if (numSizes[mergedIndex]! + mergedOffset < startMinSize) {\n      mergedOffset = startMinSize - numSizes[mergedIndex]!\n    }\n    if (numSizes[nextIndex]! - mergedOffset < endMinSize) {\n      mergedOffset = numSizes[nextIndex]! - endMinSize\n    }\n    if (numSizes[mergedIndex]! + mergedOffset > startMaxSize) {\n      mergedOffset = startMaxSize - numSizes[mergedIndex]!\n    }\n    if (numSizes[nextIndex]! - mergedOffset > endMaxSize) {\n      mergedOffset = numSizes[nextIndex]! - endMaxSize\n    }\n\n    numSizes[mergedIndex]! += mergedOffset\n    numSizes[nextIndex]! -= mergedOffset\n    lazyOffset.value = mergedOffset\n\n    updatePanelSizes = () => {\n      panels.value.forEach((panel, index) => {\n        panel.size = numSizes[index]\n      })\n      updatePanelSizes = NOOP\n    }\n\n    if (!lazy.value) {\n      updatePanelSizes()\n    }\n  }\n\n  const onMoveEnd = () => {\n    if (lazy.value) {\n      updatePanelSizes()\n    }\n\n    lazyOffset.value = 0\n    movingIndex.value = null\n    cachePxSizes = []\n  }\n\n  const cacheCollapsedSize: number[] = []\n  const onCollapse = (index: number, type: 'start' | 'end') => {\n    if (!cacheCollapsedSize.length) {\n      cacheCollapsedSize.push(\n        ...pxSizes.value.map((size, i) =>\n          size <= 0 ? getLimitSize(limitSizes.value[i]?.[0], 0) : size\n        )\n      )\n    }\n\n    const currentSizes = pxSizes.value\n\n    const currentIndex = type === 'start' ? index : index + 1\n    const targetIndex = type === 'start' ? index + 1 : index\n\n    const currentSize = currentSizes[currentIndex]\n    const targetSize = currentSizes[targetIndex]\n\n    if (currentSize !== 0 && targetSize !== 0) {\n      currentSizes[currentIndex] = 0\n      currentSizes[targetIndex]! += currentSize\n      cacheCollapsedSize[index] = currentSize\n    } else {\n      const totalSize = currentSize + targetSize\n\n      const targetCacheCollapsedSize = clamp(\n        cacheCollapsedSize[index],\n        0,\n        totalSize\n      )\n      const currentCacheCollapsedSize = totalSize - targetCacheCollapsedSize\n\n      currentSizes[targetIndex] = targetCacheCollapsedSize\n      currentSizes[currentIndex] = currentCacheCollapsedSize\n    }\n\n    panels.value.forEach((panel, index) => {\n      panel.size = currentSizes[index]\n    })\n  }\n\n  return {\n    lazyOffset,\n    onMoveStart,\n    onMoving,\n    onMoveEnd,\n    movingIndex,\n    onCollapse,\n  }\n}\n"],"mappings":"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"}