import { writable } from "svelte/store"; export default ( sizes = { phone: 0, tablet: 768, desktop: 1024, xxl: 1749 }, ) => { const defaultValue = { name: null, width: null, nodeWidth: null, rect: null }; const { subscribe, unsubscribe, set } = writable(defaultValue); let ro = null; let node = null; const unobserve = () => { if (!node) return; ro.unobserve(node); node = null; }; const observe = (nodeToObserve) => { if (!nodeToObserve) return null; if (node) unobserve(); node = nodeToObserve; let lastWidth = null; ro = new ResizeObserver(() => { const rect = node.getBoundingClientRect(); const nodeWidth = rect.width; if (lastWidth === nodeWidth) return; lastWidth = nodeWidth; set( Object.entries(sizes) .sort((a, b) => a[1] - b[1]) .reduce( (cum, item) => item[1] <= nodeWidth ? { name: item[0], width: item[1], nodeWidth, rect } : cum, defaultValue, ), ); }); ro.observe(node); return node; }; return { subscribe, unsubscribe, observe, unobserve, }; };