UNPKG

@zag-js/dismissable

Version:

Dismissable layer utilities for the DOM

136 lines (134 loc) 5.58 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/dismissable-layer.ts var dismissable_layer_exports = {}; __export(dismissable_layer_exports, { trackDismissableBranch: () => trackDismissableBranch, trackDismissableElement: () => trackDismissableElement }); module.exports = __toCommonJS(dismissable_layer_exports); var import_dom_query = require("@zag-js/dom-query"); var import_interact_outside = require("@zag-js/interact-outside"); var import_utils = require("@zag-js/utils"); var import_escape_keydown = require("./escape-keydown.js"); var import_layer_stack = require("./layer-stack.js"); var import_pointer_event_outside = require("./pointer-event-outside.js"); function trackDismissableElementImpl(node, options) { const { warnOnMissingNode = true } = options; if (warnOnMissingNode && !node) { (0, import_utils.warn)("[@zag-js/dismissable] node is `null` or `undefined`"); return; } if (!node) { return; } const { onDismiss, onRequestDismiss, pointerBlocking, exclude: excludeContainers, debug, type = "dialog" } = options; const layer = { dismiss: onDismiss, node, type, pointerBlocking, requestDismiss: onRequestDismiss }; import_layer_stack.layerStack.add(layer); (0, import_pointer_event_outside.assignPointerEventToLayers)(); function onPointerDownOutside(event) { const target = (0, import_dom_query.getEventTarget)(event.detail.originalEvent); if (import_layer_stack.layerStack.isBelowPointerBlockingLayer(node) || import_layer_stack.layerStack.isInBranch(target)) return; options.onPointerDownOutside?.(event); options.onInteractOutside?.(event); if (event.defaultPrevented) return; if (debug) { console.log("onPointerDownOutside:", event.detail.originalEvent); } onDismiss?.(); } function onFocusOutside(event) { const target = (0, import_dom_query.getEventTarget)(event.detail.originalEvent); if (import_layer_stack.layerStack.isInBranch(target)) return; options.onFocusOutside?.(event); options.onInteractOutside?.(event); if (event.defaultPrevented) return; if (debug) { console.log("onFocusOutside:", event.detail.originalEvent); } onDismiss?.(); } function onEscapeKeyDown(event) { if (!import_layer_stack.layerStack.isTopMost(node)) return; options.onEscapeKeyDown?.(event); if (!event.defaultPrevented && onDismiss) { event.preventDefault(); onDismiss(); } } function exclude(target) { if (!node) return false; const containers = typeof excludeContainers === "function" ? excludeContainers() : excludeContainers; const _containers = Array.isArray(containers) ? containers : [containers]; const persistentElements = options.persistentElements?.map((fn) => fn()).filter(import_dom_query.isHTMLElement); if (persistentElements) _containers.push(...persistentElements); return _containers.some((node2) => (0, import_dom_query.contains)(node2, target)) || import_layer_stack.layerStack.isInNestedLayer(node, target); } const cleanups = [ pointerBlocking ? (0, import_pointer_event_outside.disablePointerEventsOutside)(node, options.persistentElements) : void 0, (0, import_escape_keydown.trackEscapeKeydown)(node, onEscapeKeyDown), (0, import_interact_outside.trackInteractOutside)(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer }) ]; return () => { import_layer_stack.layerStack.remove(node); (0, import_pointer_event_outside.assignPointerEventToLayers)(); (0, import_pointer_event_outside.clearPointerEvent)(node); cleanups.forEach((fn) => fn?.()); }; } function trackDismissableElement(nodeOrFn, options) { const { defer } = options; const func = defer ? import_dom_query.raf : (v) => v(); const cleanups = []; cleanups.push( func(() => { const node = (0, import_utils.isFunction)(nodeOrFn) ? nodeOrFn() : nodeOrFn; cleanups.push(trackDismissableElementImpl(node, options)); }) ); return () => { cleanups.forEach((fn) => fn?.()); }; } function trackDismissableBranch(nodeOrFn, options = {}) { const { defer } = options; const func = defer ? import_dom_query.raf : (v) => v(); const cleanups = []; cleanups.push( func(() => { const node = (0, import_utils.isFunction)(nodeOrFn) ? nodeOrFn() : nodeOrFn; if (!node) { (0, import_utils.warn)("[@zag-js/dismissable] branch node is `null` or `undefined`"); return; } import_layer_stack.layerStack.addBranch(node); cleanups.push(() => { import_layer_stack.layerStack.removeBranch(node); }); }) ); return () => { cleanups.forEach((fn) => fn?.()); }; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { trackDismissableBranch, trackDismissableElement });