import { isClient } from '@vueuse/core'; export const isInContainer = (el?: Element, container?: Element | Window): boolean => { if (!isClient || !el || !container) return false; const elRect = el.getBoundingClientRect(); let containerRect: Pick; if (container instanceof Element) { containerRect = container.getBoundingClientRect(); } else { containerRect = { top: 0, right: window.innerWidth, bottom: window.innerHeight, left: 0, }; } return ( elRect.top < containerRect.bottom && elRect.bottom > containerRect.top && elRect.right > containerRect.left && elRect.left < containerRect.right ); }; export const getOffsetTop = (el: HTMLElement) => { let offset = 0; let parent = el; while (parent) { offset += parent.offsetTop; parent = parent.offsetParent as HTMLElement; } return offset; }; export const getOffsetTopDistance = (el: HTMLElement, containerEl: HTMLElement) => { return Math.abs(getOffsetTop(el) - getOffsetTop(containerEl)); }; export const getClientXY = (event: MouseEvent | TouchEvent) => { let clientX: number; let clientY: number; if (event.type === 'touchend') { clientY = (event as TouchEvent).changedTouches[0].clientY; clientX = (event as TouchEvent).changedTouches[0].clientX; } else if (event.type.startsWith('touch')) { clientY = (event as TouchEvent).touches[0].clientY; clientX = (event as TouchEvent).touches[0].clientX; } else { clientY = (event as MouseEvent).clientY; clientX = (event as MouseEvent).clientX; } return { clientX, clientY, }; };