element-plus
Version:
A Component Library for Vue 3
1 lines • 6.55 kB
Source Map (JSON)
{"version":3,"file":"useResizable.mjs","sources":["../../../../../../../packages/components/drawer/src/composables/useResizable.ts"],"sourcesContent":["import { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { addUnit } from '@element-plus/utils'\nimport { clamp, useEventListener, useWindowSize } from '@vueuse/core'\n\nimport type { Ref, SetupContext } from 'vue'\nimport type { DrawerEmits, DrawerProps } from '../drawer'\n\nexport function useResizable(\n props: DrawerProps,\n target: Ref<HTMLElement | undefined>,\n emit: SetupContext<DrawerEmits>['emit']\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 emit('resize-start', e, startSize.value)\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 emit('resize', e, getSize.value)\n }\n\n const onMouseUp = (e?: MouseEvent) => {\n // premature interruption\n // avoid triggering meaningless execution due to watch size/resizable constraints.\n if (!isResizing.value) return\n\n startPos = []\n startSize.value = getSize.value\n offset.value = 0\n isResizing.value = false\n cleanups.forEach((cleanup) => cleanup?.())\n cleanups = []\n if (e) {\n emit('resize-end', e, startSize.value)\n }\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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"}