@zag-js/dismissable
Version:
Dismissable layer utilities for the DOM
49 lines (48 loc) • 1.62 kB
JavaScript
// src/pointer-event-outside.ts
import { getDocument, isHTMLElement, setStyle, waitForElement } from "@zag-js/dom-query";
import { layerStack } from "./layer-stack.mjs";
var originalBodyPointerEvents;
function assignPointerEventToLayers() {
layerStack.layers.forEach(({ node }) => {
node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
});
}
function clearPointerEvent(node) {
node.style.pointerEvents = "";
}
function disablePointerEventsOutside(node, persistentElements) {
const doc = getDocument(node);
const cleanups = [];
if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute("data-inert")) {
originalBodyPointerEvents = document.body.style.pointerEvents;
queueMicrotask(() => {
doc.body.style.pointerEvents = "none";
doc.body.setAttribute("data-inert", "");
});
}
persistentElements?.forEach((el) => {
const [promise, abort] = waitForElement(
() => {
const node2 = el();
return isHTMLElement(node2) ? node2 : null;
},
{ timeout: 1e3 }
);
promise.then((el2) => cleanups.push(setStyle(el2, { pointerEvents: "auto" })));
cleanups.push(abort);
});
return () => {
if (layerStack.hasPointerBlockingLayer()) return;
queueMicrotask(() => {
doc.body.style.pointerEvents = originalBodyPointerEvents;
doc.body.removeAttribute("data-inert");
if (doc.body.style.length === 0) doc.body.removeAttribute("style");
});
cleanups.forEach((fn) => fn());
};
}
export {
assignPointerEventToLayers,
clearPointerEvent,
disablePointerEventsOutside
};