export default function (node: HTMLElement) {
const setHeight = (detail: HTMLDetailsElement, open = false) => {
detail.open = open;
const rect = detail.getBoundingClientRect();
detail.dataset.width = `${rect.width}`;
detail.style.setProperty(open ? `--expanded` : `--collapsed`, `${rect.height}px`);
};
const RO = new ResizeObserver((entries) => {
return entries.forEach((entry) => {
const detail: HTMLDetailsElement = entry.target;
const width: number = parseInt(detail.dataset.width, 10);
if (width !== parseInt(entry.contentRect.width, 10)) {
detail.removeAttribute('style');
setHeight(detail);
setHeight(detail, true);
detail.open = false;
}
});
});
RO.observe(node);
return {
destroy() {
RO.unobserve(node);
}
};
}