UNPKG

@kobalte/core

Version:

Unstyled components and primitives for building accessible web apps and design systems with SolidJS.

81 lines (78 loc) 2.21 kB
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 };