wip bsky client for the web & android bbell.vt3e.cat
at main 40 lines 1.1 kB view raw
1import { ref, onMounted, onUnmounted, type Ref } from 'vue' 2 3export function useReposition(options: { 4 triggerRef: Ref<HTMLElement | null> 5 containerRef: Ref<HTMLElement | null> 6 isOpen: Ref<boolean> 7 isMobile: Ref<boolean> 8 width: Ref<string> 9 align: Ref<'left' | 'right'> 10}) { 11 const popoverPos = ref({ top: 0, left: 0 }) 12 13 const calculatePosition = () => { 14 const trigger = options.triggerRef.value 15 if (!trigger) return 16 const rect = trigger.getBoundingClientRect() 17 const gap = 8 18 const parsedW = parseInt(options.width.value || '200') 19 popoverPos.value = { 20 top: rect.bottom + gap, 21 left: options.align.value === 'right' ? rect.right - parsedW : rect.left, 22 } 23 } 24 25 const handleReposition = () => { 26 if (options.isOpen.value && !options.isMobile.value) calculatePosition() 27 } 28 29 onMounted(() => { 30 window.addEventListener('resize', handleReposition) 31 window.addEventListener('scroll', handleReposition, true) 32 }) 33 34 onUnmounted(() => { 35 window.removeEventListener('resize', handleReposition) 36 window.removeEventListener('scroll', handleReposition, true) 37 }) 38 39 return { popoverPos, calculatePosition } 40}