{"version":3,"file":"useResizable.mjs","sources":["../../../../../../../../packages/components/drawer/src/composables/useResizable.ts"],"sourcesContent":["import { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { addUnit } from '@hd-front-end/utils'\nimport { clamp, useEventListener, useWindowSize } from '@vueuse/core'\n\nimport type { Ref } from 'vue'\nimport type { DrawerProps } from '../drawer'\n\nexport function useResizable(\n  props: DrawerProps,\n  target: Ref<HTMLElement | undefined>\n) {\n  const { width, height } = useWindowSize()\n\n  const isHorizontal = computed(() => ['ltr', 'rtl'].includes(props.direction))\n  const sign = computed(() =>\n    ['ltr', 'ttb'].includes(props.direction) ? 1 : -1\n  )\n  const windowSize = computed(() =>\n    isHorizontal.value ? width.value : height.value\n  )\n  const getSize = computed(() => {\n    return clamp(\n      startSize.value + sign.value * offset.value,\n      4,\n      windowSize.value\n    )\n  })\n\n  const startSize = ref(0)\n  const offset = ref(0)\n  const isResizing = ref(false)\n  const hasStartedDragging = ref(false)\n  let startPos: number[] = []\n  let cleanups: (() => void)[] = []\n\n  const getActualSize = () => {\n    const drawerEl = target.value?.closest('[aria-modal=\"true\"]') as HTMLElement\n    if (drawerEl) {\n      return isHorizontal.value ? drawerEl.offsetWidth : drawerEl.offsetHeight\n    }\n    return 100\n  }\n\n  watch(\n    () => [props.size, props.resizable] as const,\n    () => {\n      hasStartedDragging.value = false\n      startSize.value = 0\n      offset.value = 0\n      onMouseUp()\n    }\n  )\n\n  const onMousedown = (e: MouseEvent) => {\n    if (!props.resizable) return\n\n    if (!hasStartedDragging.value) {\n      startSize.value = getActualSize()\n      hasStartedDragging.value = true\n    }\n\n    startPos = [e.pageX, e.pageY]\n    isResizing.value = true\n    cleanups.push(\n      useEventListener(window, 'mouseup', onMouseUp),\n      useEventListener(window, 'mousemove', onMouseMove)\n    )\n  }\n\n  const onMouseMove = (e: MouseEvent) => {\n    const { pageX, pageY } = e\n    const offsetX = pageX - startPos[0]\n    const offsetY = pageY - startPos[1]\n    offset.value = isHorizontal.value ? offsetX : offsetY\n  }\n\n  const onMouseUp = () => {\n    startPos = []\n    startSize.value = getSize.value\n    offset.value = 0\n    isResizing.value = false\n    cleanups.forEach((cleanup) => cleanup?.())\n    cleanups = []\n  }\n\n  const cleanup = useEventListener(target, 'mousedown', onMousedown)\n\n  onBeforeUnmount(() => {\n    cleanup()\n    onMouseUp()\n  })\n\n  return {\n    size: computed(() => {\n      return hasStartedDragging.value\n        ? `${getSize.value}px`\n        : addUnit(props.size)\n    }),\n    isResizing,\n    isHorizontal,\n  }\n}\n"],"names":["cleanup"],"mappings":"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"}