64 lines
2.0 KiB
JavaScript
64 lines
2.0 KiB
JavaScript
import { isSVGElement } from '../utils/is-svg-element.mjs';
|
|
import { resolveElements } from '../utils/resolve-elements.mjs';
|
|
|
|
const resizeHandlers = new WeakMap();
|
|
let observer;
|
|
const getSize = (borderBoxAxis, svgAxis, htmlAxis) => (target, borderBoxSize) => {
|
|
if (borderBoxSize && borderBoxSize[0]) {
|
|
return borderBoxSize[0][(borderBoxAxis + "Size")];
|
|
}
|
|
else if (isSVGElement(target) && "getBBox" in target) {
|
|
return target.getBBox()[svgAxis];
|
|
}
|
|
else {
|
|
return target[htmlAxis];
|
|
}
|
|
};
|
|
const getWidth = /*@__PURE__*/ getSize("inline", "width", "offsetWidth");
|
|
const getHeight = /*@__PURE__*/ getSize("block", "height", "offsetHeight");
|
|
function notifyTarget({ target, borderBoxSize }) {
|
|
resizeHandlers.get(target)?.forEach((handler) => {
|
|
handler(target, {
|
|
get width() {
|
|
return getWidth(target, borderBoxSize);
|
|
},
|
|
get height() {
|
|
return getHeight(target, borderBoxSize);
|
|
},
|
|
});
|
|
});
|
|
}
|
|
function notifyAll(entries) {
|
|
entries.forEach(notifyTarget);
|
|
}
|
|
function createResizeObserver() {
|
|
if (typeof ResizeObserver === "undefined")
|
|
return;
|
|
observer = new ResizeObserver(notifyAll);
|
|
}
|
|
function resizeElement(target, handler) {
|
|
if (!observer)
|
|
createResizeObserver();
|
|
const elements = resolveElements(target);
|
|
elements.forEach((element) => {
|
|
let elementHandlers = resizeHandlers.get(element);
|
|
if (!elementHandlers) {
|
|
elementHandlers = new Set();
|
|
resizeHandlers.set(element, elementHandlers);
|
|
}
|
|
elementHandlers.add(handler);
|
|
observer?.observe(element);
|
|
});
|
|
return () => {
|
|
elements.forEach((element) => {
|
|
const elementHandlers = resizeHandlers.get(element);
|
|
elementHandlers?.delete(handler);
|
|
if (!elementHandlers?.size) {
|
|
observer?.unobserve(element);
|
|
}
|
|
});
|
|
};
|
|
}
|
|
|
|
export { resizeElement };
|