import { Directive, type DirectiveBinding, type VNode } from 'vue' import elementResizeDetectorMaker from 'element-resize-detector' import type { Erd } from 'element-resize-detector' import { emitter } from '@/utils/mitt' const erd: Erd = elementResizeDetectorMaker({ strategy: 'scroll' }) export const resize: Directive = { mounted(el: HTMLElement, binding?: DirectiveBinding, vnode?: VNode) { erd.listenTo(el, elem => { const width = elem.offsetWidth const height = elem.offsetHeight if (binding?.instance) { emitter.emit('resize', { detail: { width, height } }) } else { vnode.el.dispatchEvent( new CustomEvent('resize', { detail: { width, height } }) ) } }) }, unmounted(el: HTMLElement) { erd.uninstall(el) } }