import { useState, useRef, useLayoutEffect } from 'react'; export function useDOMRect(): [ React.HTMLProps, DOMRectReadOnly ] { const [rect, setRect] = useState( () => new DOMRectReadOnly() ); const ref = useRef(null); const observer = useRef(null); if (observer.current === null) { observer.current = new ResizeObserver((entry) => { setRect(entry[0].contentRect); }); } useLayoutEffect(() => { if (ref.current) { const el = ref.current; observer.current?.observe(ref.current); return () => { observer.current?.unobserve(el); }; } }, []); return [{ ref }, rect]; }