/** * Shared ResizeObserver singleton for all ECharts instances. * * Instead of creating 100+ individual ResizeObserver instances (one per chart), * this module provides a single shared observer that efficiently handles resize * callbacks for all registered elements. */ type ResizeCallback = () => void const callbacks = new Map() let observer: ResizeObserver | null = null function getObserver(): ResizeObserver { observer ??= new ResizeObserver((entries) => { for (const entry of entries) { const callback = callbacks.get(entry.target) callback?.() } }) return observer } export function observeResize( element: Element, callback: ResizeCallback, ): () => void { callbacks.set(element, callback) getObserver().observe(element) return () => { callbacks.delete(element) getObserver().unobserve(element) } } /** Reset the shared observer (for testing only). */ export function resetSharedResizeObserver(): void { if (observer) { observer.disconnect() observer = null } callbacks.clear() }