@kobalte/core
Version:
Unstyled components and primitives for building accessible web apps and design systems with SolidJS.
81 lines (78 loc) • 2.21 kB
JavaScript
import { getDocument } from '@kobalte/utils';
// src/dismissable-layer/layer-stack.tsx
var DATA_TOP_LAYER_ATTR = "data-kb-top-layer";
var originalBodyPointerEvents;
var hasDisabledBodyPointerEvents = false;
var layers = [];
function indexOf(node) {
return layers.findIndex((layer) => layer.node === node);
}
function find(node) {
return layers[indexOf(node)];
}
function isTopMostLayer(node) {
return layers[layers.length - 1].node === node;
}
function getPointerBlockingLayers() {
return layers.filter((layer) => layer.isPointerBlocking);
}
function getTopMostPointerBlockingLayer() {
return [...getPointerBlockingLayers()].slice(-1)[0];
}
function hasPointerBlockingLayer() {
return getPointerBlockingLayers().length > 0;
}
function isBelowPointerBlockingLayer(node) {
const highestBlockingIndex = indexOf(getTopMostPointerBlockingLayer()?.node);
return indexOf(node) < highestBlockingIndex;
}
function addLayer(layer) {
layers.push(layer);
}
function removeLayer(node) {
const index = indexOf(node);
if (index < 0) {
return;
}
layers.splice(index, 1);
}
function assignPointerEventToLayers() {
for (const {
node
} of layers) {
node.style.pointerEvents = isBelowPointerBlockingLayer(node) ? "none" : "auto";
}
}
function disableBodyPointerEvents(node) {
if (hasPointerBlockingLayer() && !hasDisabledBodyPointerEvents) {
const ownerDocument = getDocument(node);
originalBodyPointerEvents = document.body.style.pointerEvents;
ownerDocument.body.style.pointerEvents = "none";
hasDisabledBodyPointerEvents = true;
}
}
function restoreBodyPointerEvents(node) {
if (hasPointerBlockingLayer()) {
return;
}
const ownerDocument = getDocument(node);
ownerDocument.body.style.pointerEvents = originalBodyPointerEvents;
if (ownerDocument.body.style.length === 0) {
ownerDocument.body.removeAttribute("style");
}
hasDisabledBodyPointerEvents = false;
}
var layerStack = {
layers,
isTopMostLayer,
hasPointerBlockingLayer,
isBelowPointerBlockingLayer,
addLayer,
removeLayer,
indexOf,
find,
assignPointerEventToLayers,
disableBodyPointerEvents,
restoreBodyPointerEvents
};
export { DATA_TOP_LAYER_ATTR, layerStack };