@zag-js/dismissable 0.53.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,263 @@
1
- "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);var src_exports={};__export(src_exports,{trackDismissableBranch:()=>trackDismissableBranch,trackDismissableElement:()=>trackDismissableElement});module.exports=__toCommonJS(src_exports);var import_dom_query4=require("@zag-js/dom-query");var import_interact_outside=require("@zag-js/interact-outside");var import_utils=require("@zag-js/utils");var import_dom_event=require("@zag-js/dom-event");var import_dom_query=require("@zag-js/dom-query");function trackEscapeKeydown(node,fn){const handleKeyDown=event=>{if(event.key!=="Escape")return;if(event.isComposing)return;fn?.(event)};return(0,import_dom_event.addDomEvent)((0,import_dom_query.getDocument)(node),"keydown",handleKeyDown,{capture:true})}var import_dom_query2=require("@zag-js/dom-query");var layerStack={layers:[],branches:[],count(){return this.layers.length},pointerBlockingLayers(){return this.layers.filter(layer=>layer.pointerBlocking)},topMostPointerBlockingLayer(){return[...this.pointerBlockingLayers()].slice(-1)[0]},hasPointerBlockingLayer(){return this.pointerBlockingLayers().length>0},isBelowPointerBlockingLayer(node){const index=this.indexOf(node);const highestBlockingIndex=this.topMostPointerBlockingLayer()?this.indexOf(this.topMostPointerBlockingLayer()?.node):-1;return index<highestBlockingIndex},isTopMost(node){const layer=this.layers[this.count()-1];return layer?.node===node},getNestedLayers(node){return Array.from(this.layers).slice(this.indexOf(node)+1)},isInNestedLayer(node,target){return this.getNestedLayers(node).some(layer=>(0,import_dom_query2.contains)(layer.node,target))},isInBranch(target){return Array.from(this.branches).some(branch=>(0,import_dom_query2.contains)(branch,target))},add(layer){const num=this.layers.push(layer);layer.node.style.setProperty("--layer-index",`${num}`)},addBranch(node){this.branches.push(node)},remove(node){const index=this.indexOf(node);if(index<0)return;if(index<this.count()-1){const _layers=this.getNestedLayers(node);_layers.forEach(layer=>layer.dismiss())}this.layers.splice(index,1);node.style.removeProperty("--layer-index")},removeBranch(node){const index=this.branches.indexOf(node);if(index>=0)this.branches.splice(index,1)},indexOf(node){return this.layers.findIndex(layer=>layer.node===node)},dismiss(node){this.layers[this.indexOf(node)]?.dismiss()},clear(){this.remove(this.layers[0].node)}};var import_dom_query3=require("@zag-js/dom-query");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,peristentElements){const doc=(0,import_dom_query3.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","")})}if(peristentElements){const persistedCleanup=(0,import_dom_query3.waitForElements)(peristentElements,el=>{cleanups.push((0,import_dom_query3.setStyle)(el,{pointerEvents:"auto"}))});cleanups.push(persistedCleanup)}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())}}function trackDismissableElementImpl(node,options){if(!node){(0,import_utils.warn)("[@zag-js/dismissable] node is `null` or `undefined`");return}const{onDismiss,pointerBlocking,exclude:excludeContainers,debug}=options;const layer={dismiss:onDismiss,node,pointerBlocking};layerStack.add(layer);assignPointerEventToLayers();function onPointerDownOutside(event){const target=(0,import_dom_query4.getEventTarget)(event.detail.originalEvent);if(layerStack.isBelowPointerBlockingLayer(node)||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_query4.getEventTarget)(event.detail.originalEvent);if(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(!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_query4.isHTMLElement);if(persistentElements)_containers.push(...persistentElements);return _containers.some(node2=>(0,import_dom_query4.contains)(node2,target))||layerStack.isInNestedLayer(node,target)}const cleanups=[pointerBlocking?disablePointerEventsOutside(node,options.persistentElements):void 0,trackEscapeKeydown(node,onEscapeKeyDown),(0,import_interact_outside.trackInteractOutside)(node,{exclude,onFocusOutside,onPointerDownOutside,defer:options.defer})];return()=>{layerStack.remove(node);assignPointerEventToLayers();clearPointerEvent(node);cleanups.forEach(fn=>fn?.())}}function trackDismissableElement(nodeOrFn,options){const{defer}=options;const func=defer?import_dom_query4.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_query4.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}layerStack.addBranch(node);cleanups.push(()=>{layerStack.removeBranch(node)})}));return()=>{cleanups.forEach(fn=>fn?.())}}0&&(module.exports={trackDismissableBranch,trackDismissableElement});
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ trackDismissableBranch: () => trackDismissableBranch,
24
+ trackDismissableElement: () => trackDismissableElement
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/dismissable-layer.ts
29
+ var import_dom_query4 = require("@zag-js/dom-query");
30
+ var import_interact_outside = require("@zag-js/interact-outside");
31
+ var import_utils = require("@zag-js/utils");
32
+
33
+ // src/escape-keydown.ts
34
+ var import_dom_event = require("@zag-js/dom-event");
35
+ var import_dom_query = require("@zag-js/dom-query");
36
+ function trackEscapeKeydown(node, fn) {
37
+ const handleKeyDown = (event) => {
38
+ if (event.key !== "Escape")
39
+ return;
40
+ if (event.isComposing)
41
+ return;
42
+ fn?.(event);
43
+ };
44
+ return (0, import_dom_event.addDomEvent)((0, import_dom_query.getDocument)(node), "keydown", handleKeyDown, { capture: true });
45
+ }
46
+
47
+ // src/layer-stack.ts
48
+ var import_dom_query2 = require("@zag-js/dom-query");
49
+ var layerStack = {
50
+ layers: [],
51
+ branches: [],
52
+ count() {
53
+ return this.layers.length;
54
+ },
55
+ pointerBlockingLayers() {
56
+ return this.layers.filter((layer) => layer.pointerBlocking);
57
+ },
58
+ topMostPointerBlockingLayer() {
59
+ return [...this.pointerBlockingLayers()].slice(-1)[0];
60
+ },
61
+ hasPointerBlockingLayer() {
62
+ return this.pointerBlockingLayers().length > 0;
63
+ },
64
+ isBelowPointerBlockingLayer(node) {
65
+ const index = this.indexOf(node);
66
+ const highestBlockingIndex = this.topMostPointerBlockingLayer() ? this.indexOf(this.topMostPointerBlockingLayer()?.node) : -1;
67
+ return index < highestBlockingIndex;
68
+ },
69
+ isTopMost(node) {
70
+ const layer = this.layers[this.count() - 1];
71
+ return layer?.node === node;
72
+ },
73
+ getNestedLayers(node) {
74
+ return Array.from(this.layers).slice(this.indexOf(node) + 1);
75
+ },
76
+ isInNestedLayer(node, target) {
77
+ return this.getNestedLayers(node).some((layer) => (0, import_dom_query2.contains)(layer.node, target));
78
+ },
79
+ isInBranch(target) {
80
+ return Array.from(this.branches).some((branch) => (0, import_dom_query2.contains)(branch, target));
81
+ },
82
+ add(layer) {
83
+ const num = this.layers.push(layer);
84
+ layer.node.style.setProperty("--layer-index", `${num}`);
85
+ },
86
+ addBranch(node) {
87
+ this.branches.push(node);
88
+ },
89
+ remove(node) {
90
+ const index = this.indexOf(node);
91
+ if (index < 0)
92
+ return;
93
+ if (index < this.count() - 1) {
94
+ const _layers = this.getNestedLayers(node);
95
+ _layers.forEach((layer) => layer.dismiss());
96
+ }
97
+ this.layers.splice(index, 1);
98
+ node.style.removeProperty("--layer-index");
99
+ },
100
+ removeBranch(node) {
101
+ const index = this.branches.indexOf(node);
102
+ if (index >= 0)
103
+ this.branches.splice(index, 1);
104
+ },
105
+ indexOf(node) {
106
+ return this.layers.findIndex((layer) => layer.node === node);
107
+ },
108
+ dismiss(node) {
109
+ this.layers[this.indexOf(node)]?.dismiss();
110
+ },
111
+ clear() {
112
+ this.remove(this.layers[0].node);
113
+ }
114
+ };
115
+
116
+ // src/pointer-event-outside.ts
117
+ var import_dom_query3 = require("@zag-js/dom-query");
118
+ var originalBodyPointerEvents;
119
+ function assignPointerEventToLayers() {
120
+ layerStack.layers.forEach(({ node }) => {
121
+ node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
122
+ });
123
+ }
124
+ function clearPointerEvent(node) {
125
+ node.style.pointerEvents = "";
126
+ }
127
+ function disablePointerEventsOutside(node, peristentElements) {
128
+ const doc = (0, import_dom_query3.getDocument)(node);
129
+ const cleanups = [];
130
+ if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute("data-inert")) {
131
+ originalBodyPointerEvents = document.body.style.pointerEvents;
132
+ queueMicrotask(() => {
133
+ doc.body.style.pointerEvents = "none";
134
+ doc.body.setAttribute("data-inert", "");
135
+ });
136
+ }
137
+ if (peristentElements) {
138
+ const persistedCleanup = (0, import_dom_query3.waitForElements)(peristentElements, (el) => {
139
+ cleanups.push((0, import_dom_query3.setStyle)(el, { pointerEvents: "auto" }));
140
+ });
141
+ cleanups.push(persistedCleanup);
142
+ }
143
+ return () => {
144
+ if (layerStack.hasPointerBlockingLayer())
145
+ return;
146
+ queueMicrotask(() => {
147
+ doc.body.style.pointerEvents = originalBodyPointerEvents;
148
+ doc.body.removeAttribute("data-inert");
149
+ if (doc.body.style.length === 0)
150
+ doc.body.removeAttribute("style");
151
+ });
152
+ cleanups.forEach((fn) => fn());
153
+ };
154
+ }
155
+
156
+ // src/dismissable-layer.ts
157
+ function trackDismissableElementImpl(node, options) {
158
+ if (!node) {
159
+ (0, import_utils.warn)("[@zag-js/dismissable] node is `null` or `undefined`");
160
+ return;
161
+ }
162
+ const { onDismiss, pointerBlocking, exclude: excludeContainers, debug } = options;
163
+ const layer = { dismiss: onDismiss, node, pointerBlocking };
164
+ layerStack.add(layer);
165
+ assignPointerEventToLayers();
166
+ function onPointerDownOutside(event) {
167
+ const target = (0, import_dom_query4.getEventTarget)(event.detail.originalEvent);
168
+ if (layerStack.isBelowPointerBlockingLayer(node) || layerStack.isInBranch(target))
169
+ return;
170
+ options.onPointerDownOutside?.(event);
171
+ options.onInteractOutside?.(event);
172
+ if (event.defaultPrevented)
173
+ return;
174
+ if (debug) {
175
+ console.log("onPointerDownOutside:", event.detail.originalEvent);
176
+ }
177
+ onDismiss?.();
178
+ }
179
+ function onFocusOutside(event) {
180
+ const target = (0, import_dom_query4.getEventTarget)(event.detail.originalEvent);
181
+ if (layerStack.isInBranch(target))
182
+ return;
183
+ options.onFocusOutside?.(event);
184
+ options.onInteractOutside?.(event);
185
+ if (event.defaultPrevented)
186
+ return;
187
+ if (debug) {
188
+ console.log("onFocusOutside:", event.detail.originalEvent);
189
+ }
190
+ onDismiss?.();
191
+ }
192
+ function onEscapeKeyDown(event) {
193
+ if (!layerStack.isTopMost(node))
194
+ return;
195
+ options.onEscapeKeyDown?.(event);
196
+ if (!event.defaultPrevented && onDismiss) {
197
+ event.preventDefault();
198
+ onDismiss();
199
+ }
200
+ }
201
+ function exclude(target) {
202
+ if (!node)
203
+ return false;
204
+ const containers = typeof excludeContainers === "function" ? excludeContainers() : excludeContainers;
205
+ const _containers = Array.isArray(containers) ? containers : [containers];
206
+ const persistentElements = options.persistentElements?.map((fn) => fn()).filter(import_dom_query4.isHTMLElement);
207
+ if (persistentElements)
208
+ _containers.push(...persistentElements);
209
+ return _containers.some((node2) => (0, import_dom_query4.contains)(node2, target)) || layerStack.isInNestedLayer(node, target);
210
+ }
211
+ const cleanups = [
212
+ pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : void 0,
213
+ trackEscapeKeydown(node, onEscapeKeyDown),
214
+ (0, import_interact_outside.trackInteractOutside)(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer })
215
+ ];
216
+ return () => {
217
+ layerStack.remove(node);
218
+ assignPointerEventToLayers();
219
+ clearPointerEvent(node);
220
+ cleanups.forEach((fn) => fn?.());
221
+ };
222
+ }
223
+ function trackDismissableElement(nodeOrFn, options) {
224
+ const { defer } = options;
225
+ const func = defer ? import_dom_query4.raf : (v) => v();
226
+ const cleanups = [];
227
+ cleanups.push(
228
+ func(() => {
229
+ const node = (0, import_utils.isFunction)(nodeOrFn) ? nodeOrFn() : nodeOrFn;
230
+ cleanups.push(trackDismissableElementImpl(node, options));
231
+ })
232
+ );
233
+ return () => {
234
+ cleanups.forEach((fn) => fn?.());
235
+ };
236
+ }
237
+ function trackDismissableBranch(nodeOrFn, options = {}) {
238
+ const { defer } = options;
239
+ const func = defer ? import_dom_query4.raf : (v) => v();
240
+ const cleanups = [];
241
+ cleanups.push(
242
+ func(() => {
243
+ const node = (0, import_utils.isFunction)(nodeOrFn) ? nodeOrFn() : nodeOrFn;
244
+ if (!node) {
245
+ (0, import_utils.warn)("[@zag-js/dismissable] branch node is `null` or `undefined`");
246
+ return;
247
+ }
248
+ layerStack.addBranch(node);
249
+ cleanups.push(() => {
250
+ layerStack.removeBranch(node);
251
+ });
252
+ })
253
+ );
254
+ return () => {
255
+ cleanups.forEach((fn) => fn?.());
256
+ };
257
+ }
258
+ // Annotate the CommonJS export names for ESM import in node:
259
+ 0 && (module.exports = {
260
+ trackDismissableBranch,
261
+ trackDismissableElement
262
+ });
2
263
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/dismissable-layer.ts","../src/escape-keydown.ts","../src/layer-stack.ts","../src/pointer-event-outside.ts"],"sourcesContent":["export type {\n FocusOutsideEvent,\n InteractOutsideEvent,\n InteractOutsideHandlers,\n PointerDownOutsideEvent,\n} from \"@zag-js/interact-outside\"\nexport * from \"./dismissable-layer\"\n","import { contains, getEventTarget, isHTMLElement, raf } from \"@zag-js/dom-query\"\nimport {\n trackInteractOutside,\n type FocusOutsideEvent,\n type InteractOutsideHandlers,\n type PointerDownOutsideEvent,\n} from \"@zag-js/interact-outside\"\nimport { isFunction, warn, type MaybeFunction } from \"@zag-js/utils\"\nimport { trackEscapeKeydown } from \"./escape-keydown\"\nimport { layerStack, type Layer } from \"./layer-stack\"\nimport { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside } from \"./pointer-event-outside\"\n\ntype MaybeElement = HTMLElement | null\ntype Container = MaybeElement | Array<MaybeElement>\ntype NodeOrFn = MaybeFunction<MaybeElement>\n\nexport interface DismissableElementHandlers extends InteractOutsideHandlers {\n /**\n * Function called when the escape key is pressed\n */\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n}\n\nexport interface PersistentElementOptions {\n /**\n * Returns the persistent elements that:\n * - should not have pointer-events disabled\n * - should not trigger the dismiss event\n */\n persistentElements?: Array<() => Element | null>\n}\n\nexport interface DismissableElementOptions extends DismissableElementHandlers, PersistentElementOptions {\n /**\n * Whether to log debug information\n */\n debug?: boolean\n /**\n * Whether to block pointer events outside the dismissable element\n */\n pointerBlocking?: boolean\n /**\n * Function called when the dismissable element is dismissed\n */\n onDismiss: VoidFunction\n /**\n * Exclude containers from the interact outside event\n */\n exclude?: MaybeFunction<Container>\n /**\n * Defer the interact outside event to the next frame\n */\n defer?: boolean\n}\n\nfunction trackDismissableElementImpl(node: MaybeElement, options: DismissableElementOptions) {\n if (!node) {\n warn(\"[@zag-js/dismissable] node is `null` or `undefined`\")\n return\n }\n\n const { onDismiss, pointerBlocking, exclude: excludeContainers, debug } = options\n\n const layer: Layer = { dismiss: onDismiss, node, pointerBlocking }\n\n layerStack.add(layer)\n assignPointerEventToLayers()\n\n function onPointerDownOutside(event: PointerDownOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isBelowPointerBlockingLayer(node!) || layerStack.isInBranch(target)) return\n options.onPointerDownOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onPointerDownOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onFocusOutside(event: FocusOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isInBranch(target)) return\n options.onFocusOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onFocusOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onEscapeKeyDown(event: KeyboardEvent) {\n if (!layerStack.isTopMost(node!)) return\n options.onEscapeKeyDown?.(event)\n if (!event.defaultPrevented && onDismiss) {\n event.preventDefault()\n onDismiss()\n }\n }\n\n function exclude(target: Element) {\n if (!node) return false\n const containers = typeof excludeContainers === \"function\" ? excludeContainers() : excludeContainers\n const _containers = Array.isArray(containers) ? containers : [containers]\n const persistentElements = options.persistentElements?.map((fn) => fn()).filter(isHTMLElement)\n if (persistentElements) _containers.push(...persistentElements)\n return _containers.some((node) => contains(node, target)) || layerStack.isInNestedLayer(node, target)\n }\n\n const cleanups = [\n pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : undefined,\n trackEscapeKeydown(node, onEscapeKeyDown),\n trackInteractOutside(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer }),\n ]\n\n return () => {\n layerStack.remove(node!)\n // re-assign pointer event to remaining layers\n assignPointerEventToLayers()\n // remove pointer event from removed layer\n clearPointerEvent(node!)\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableElement(nodeOrFn: NodeOrFn, options: DismissableElementOptions) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n cleanups.push(trackDismissableElementImpl(node, options))\n }),\n )\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableBranch(nodeOrFn: NodeOrFn, options: { defer?: boolean } = {}) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n if (!node) {\n warn(\"[@zag-js/dismissable] branch node is `null` or `undefined`\")\n return\n }\n layerStack.addBranch(node)\n cleanups.push(() => {\n layerStack.removeBranch(node)\n })\n }),\n )\n\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n","import { addDomEvent } from \"@zag-js/dom-event\"\nimport { getDocument } from \"@zag-js/dom-query\"\n\nexport function trackEscapeKeydown(node: HTMLElement, fn?: (event: KeyboardEvent) => void) {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n if (event.isComposing) return\n fn?.(event)\n }\n\n return addDomEvent(getDocument(node), \"keydown\", handleKeyDown, { capture: true })\n}\n","import { contains } from \"@zag-js/dom-query\"\n\nexport interface Layer {\n dismiss: VoidFunction\n node: HTMLElement\n pointerBlocking?: boolean\n}\n\nexport const layerStack = {\n layers: [] as Layer[],\n branches: [] as HTMLElement[],\n count(): number {\n return this.layers.length\n },\n pointerBlockingLayers(): Layer[] {\n return this.layers.filter((layer) => layer.pointerBlocking)\n },\n topMostPointerBlockingLayer(): Layer | undefined {\n return [...this.pointerBlockingLayers()].slice(-1)[0]\n },\n hasPointerBlockingLayer(): boolean {\n return this.pointerBlockingLayers().length > 0\n },\n isBelowPointerBlockingLayer(node: HTMLElement) {\n const index = this.indexOf(node)\n const highestBlockingIndex = this.topMostPointerBlockingLayer()\n ? this.indexOf(this.topMostPointerBlockingLayer()?.node)\n : -1\n return index < highestBlockingIndex\n },\n isTopMost(node: HTMLElement | null) {\n const layer = this.layers[this.count() - 1]\n return layer?.node === node\n },\n getNestedLayers(node: HTMLElement) {\n return Array.from(this.layers).slice(this.indexOf(node) + 1)\n },\n isInNestedLayer(node: HTMLElement, target: HTMLElement | EventTarget | null) {\n return this.getNestedLayers(node).some((layer) => contains(layer.node, target))\n },\n isInBranch(target: HTMLElement | EventTarget | null) {\n return Array.from(this.branches).some((branch) => contains(branch, target))\n },\n add(layer: Layer) {\n const num = this.layers.push(layer)\n layer.node.style.setProperty(\"--layer-index\", `${num}`)\n },\n addBranch(node: HTMLElement) {\n this.branches.push(node)\n },\n remove(node: HTMLElement) {\n const index = this.indexOf(node)\n if (index < 0) return\n\n // dismiss nested layers\n if (index < this.count() - 1) {\n const _layers = this.getNestedLayers(node)\n _layers.forEach((layer) => layer.dismiss())\n }\n // remove this layer\n this.layers.splice(index, 1)\n node.style.removeProperty(\"--layer-index\")\n },\n removeBranch(node: HTMLElement) {\n const index = this.branches.indexOf(node)\n if (index >= 0) this.branches.splice(index, 1)\n },\n indexOf(node: HTMLElement | undefined) {\n return this.layers.findIndex((layer) => layer.node === node)\n },\n dismiss(node: HTMLElement) {\n this.layers[this.indexOf(node)]?.dismiss()\n },\n clear() {\n this.remove(this.layers[0].node)\n },\n}\n","import { getDocument, setStyle, waitForElements } from \"@zag-js/dom-query\"\nimport { layerStack } from \"./layer-stack\"\n\nlet originalBodyPointerEvents: string\n\nexport function assignPointerEventToLayers() {\n layerStack.layers.forEach(({ node }) => {\n node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? \"none\" : \"auto\"\n })\n}\n\nexport function clearPointerEvent(node: HTMLElement) {\n node.style.pointerEvents = \"\"\n}\n\nexport function disablePointerEventsOutside(node: HTMLElement, peristentElements?: Array<() => Element | null>) {\n const doc = getDocument(node)\n\n const cleanups: VoidFunction[] = []\n\n if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute(\"data-inert\")) {\n originalBodyPointerEvents = document.body.style.pointerEvents\n queueMicrotask(() => {\n doc.body.style.pointerEvents = \"none\"\n doc.body.setAttribute(\"data-inert\", \"\")\n })\n }\n\n if (peristentElements) {\n const persistedCleanup = waitForElements(peristentElements, (el) => {\n cleanups.push(setStyle(el, { pointerEvents: \"auto\" }))\n })\n cleanups.push(persistedCleanup)\n }\n\n return () => {\n if (layerStack.hasPointerBlockingLayer()) return\n queueMicrotask(() => {\n doc.body.style.pointerEvents = originalBodyPointerEvents\n doc.body.removeAttribute(\"data-inert\")\n if (doc.body.style.length === 0) doc.body.removeAttribute(\"style\")\n })\n cleanups.forEach((fn) => fn())\n }\n}\n"],"mappings":"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","names":["import_dom_query","import_dom_query","import_dom_query","node"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/dismissable-layer.ts","../src/escape-keydown.ts","../src/layer-stack.ts","../src/pointer-event-outside.ts"],"sourcesContent":["export type {\n FocusOutsideEvent,\n InteractOutsideEvent,\n InteractOutsideHandlers,\n PointerDownOutsideEvent,\n} from \"@zag-js/interact-outside\"\nexport * from \"./dismissable-layer\"\n","import { contains, getEventTarget, isHTMLElement, raf } from \"@zag-js/dom-query\"\nimport {\n trackInteractOutside,\n type FocusOutsideEvent,\n type InteractOutsideHandlers,\n type PointerDownOutsideEvent,\n} from \"@zag-js/interact-outside\"\nimport { isFunction, warn, type MaybeFunction } from \"@zag-js/utils\"\nimport { trackEscapeKeydown } from \"./escape-keydown\"\nimport { layerStack, type Layer } from \"./layer-stack\"\nimport { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside } from \"./pointer-event-outside\"\n\ntype MaybeElement = HTMLElement | null\ntype Container = MaybeElement | Array<MaybeElement>\ntype NodeOrFn = MaybeFunction<MaybeElement>\n\nexport interface DismissableElementHandlers extends InteractOutsideHandlers {\n /**\n * Function called when the escape key is pressed\n */\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n}\n\nexport interface PersistentElementOptions {\n /**\n * Returns the persistent elements that:\n * - should not have pointer-events disabled\n * - should not trigger the dismiss event\n */\n persistentElements?: Array<() => Element | null>\n}\n\nexport interface DismissableElementOptions extends DismissableElementHandlers, PersistentElementOptions {\n /**\n * Whether to log debug information\n */\n debug?: boolean\n /**\n * Whether to block pointer events outside the dismissable element\n */\n pointerBlocking?: boolean\n /**\n * Function called when the dismissable element is dismissed\n */\n onDismiss: VoidFunction\n /**\n * Exclude containers from the interact outside event\n */\n exclude?: MaybeFunction<Container>\n /**\n * Defer the interact outside event to the next frame\n */\n defer?: boolean\n}\n\nfunction trackDismissableElementImpl(node: MaybeElement, options: DismissableElementOptions) {\n if (!node) {\n warn(\"[@zag-js/dismissable] node is `null` or `undefined`\")\n return\n }\n\n const { onDismiss, pointerBlocking, exclude: excludeContainers, debug } = options\n\n const layer: Layer = { dismiss: onDismiss, node, pointerBlocking }\n\n layerStack.add(layer)\n assignPointerEventToLayers()\n\n function onPointerDownOutside(event: PointerDownOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isBelowPointerBlockingLayer(node!) || layerStack.isInBranch(target)) return\n options.onPointerDownOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onPointerDownOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onFocusOutside(event: FocusOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isInBranch(target)) return\n options.onFocusOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onFocusOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onEscapeKeyDown(event: KeyboardEvent) {\n if (!layerStack.isTopMost(node!)) return\n options.onEscapeKeyDown?.(event)\n if (!event.defaultPrevented && onDismiss) {\n event.preventDefault()\n onDismiss()\n }\n }\n\n function exclude(target: Element) {\n if (!node) return false\n const containers = typeof excludeContainers === \"function\" ? excludeContainers() : excludeContainers\n const _containers = Array.isArray(containers) ? containers : [containers]\n const persistentElements = options.persistentElements?.map((fn) => fn()).filter(isHTMLElement)\n if (persistentElements) _containers.push(...persistentElements)\n return _containers.some((node) => contains(node, target)) || layerStack.isInNestedLayer(node, target)\n }\n\n const cleanups = [\n pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : undefined,\n trackEscapeKeydown(node, onEscapeKeyDown),\n trackInteractOutside(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer }),\n ]\n\n return () => {\n layerStack.remove(node!)\n // re-assign pointer event to remaining layers\n assignPointerEventToLayers()\n // remove pointer event from removed layer\n clearPointerEvent(node!)\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableElement(nodeOrFn: NodeOrFn, options: DismissableElementOptions) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n cleanups.push(trackDismissableElementImpl(node, options))\n }),\n )\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableBranch(nodeOrFn: NodeOrFn, options: { defer?: boolean } = {}) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n if (!node) {\n warn(\"[@zag-js/dismissable] branch node is `null` or `undefined`\")\n return\n }\n layerStack.addBranch(node)\n cleanups.push(() => {\n layerStack.removeBranch(node)\n })\n }),\n )\n\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n","import { addDomEvent } from \"@zag-js/dom-event\"\nimport { getDocument } from \"@zag-js/dom-query\"\n\nexport function trackEscapeKeydown(node: HTMLElement, fn?: (event: KeyboardEvent) => void) {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n if (event.isComposing) return\n fn?.(event)\n }\n\n return addDomEvent(getDocument(node), \"keydown\", handleKeyDown, { capture: true })\n}\n","import { contains } from \"@zag-js/dom-query\"\n\nexport interface Layer {\n dismiss: VoidFunction\n node: HTMLElement\n pointerBlocking?: boolean\n}\n\nexport const layerStack = {\n layers: [] as Layer[],\n branches: [] as HTMLElement[],\n count(): number {\n return this.layers.length\n },\n pointerBlockingLayers(): Layer[] {\n return this.layers.filter((layer) => layer.pointerBlocking)\n },\n topMostPointerBlockingLayer(): Layer | undefined {\n return [...this.pointerBlockingLayers()].slice(-1)[0]\n },\n hasPointerBlockingLayer(): boolean {\n return this.pointerBlockingLayers().length > 0\n },\n isBelowPointerBlockingLayer(node: HTMLElement) {\n const index = this.indexOf(node)\n const highestBlockingIndex = this.topMostPointerBlockingLayer()\n ? this.indexOf(this.topMostPointerBlockingLayer()?.node)\n : -1\n return index < highestBlockingIndex\n },\n isTopMost(node: HTMLElement | null) {\n const layer = this.layers[this.count() - 1]\n return layer?.node === node\n },\n getNestedLayers(node: HTMLElement) {\n return Array.from(this.layers).slice(this.indexOf(node) + 1)\n },\n isInNestedLayer(node: HTMLElement, target: HTMLElement | EventTarget | null) {\n return this.getNestedLayers(node).some((layer) => contains(layer.node, target))\n },\n isInBranch(target: HTMLElement | EventTarget | null) {\n return Array.from(this.branches).some((branch) => contains(branch, target))\n },\n add(layer: Layer) {\n const num = this.layers.push(layer)\n layer.node.style.setProperty(\"--layer-index\", `${num}`)\n },\n addBranch(node: HTMLElement) {\n this.branches.push(node)\n },\n remove(node: HTMLElement) {\n const index = this.indexOf(node)\n if (index < 0) return\n\n // dismiss nested layers\n if (index < this.count() - 1) {\n const _layers = this.getNestedLayers(node)\n _layers.forEach((layer) => layer.dismiss())\n }\n // remove this layer\n this.layers.splice(index, 1)\n node.style.removeProperty(\"--layer-index\")\n },\n removeBranch(node: HTMLElement) {\n const index = this.branches.indexOf(node)\n if (index >= 0) this.branches.splice(index, 1)\n },\n indexOf(node: HTMLElement | undefined) {\n return this.layers.findIndex((layer) => layer.node === node)\n },\n dismiss(node: HTMLElement) {\n this.layers[this.indexOf(node)]?.dismiss()\n },\n clear() {\n this.remove(this.layers[0].node)\n },\n}\n","import { getDocument, setStyle, waitForElements } from \"@zag-js/dom-query\"\nimport { layerStack } from \"./layer-stack\"\n\nlet originalBodyPointerEvents: string\n\nexport function assignPointerEventToLayers() {\n layerStack.layers.forEach(({ node }) => {\n node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? \"none\" : \"auto\"\n })\n}\n\nexport function clearPointerEvent(node: HTMLElement) {\n node.style.pointerEvents = \"\"\n}\n\nexport function disablePointerEventsOutside(node: HTMLElement, peristentElements?: Array<() => Element | null>) {\n const doc = getDocument(node)\n\n const cleanups: VoidFunction[] = []\n\n if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute(\"data-inert\")) {\n originalBodyPointerEvents = document.body.style.pointerEvents\n queueMicrotask(() => {\n doc.body.style.pointerEvents = \"none\"\n doc.body.setAttribute(\"data-inert\", \"\")\n })\n }\n\n if (peristentElements) {\n const persistedCleanup = waitForElements(peristentElements, (el) => {\n cleanups.push(setStyle(el, { pointerEvents: \"auto\" }))\n })\n cleanups.push(persistedCleanup)\n }\n\n return () => {\n if (layerStack.hasPointerBlockingLayer()) return\n queueMicrotask(() => {\n doc.body.style.pointerEvents = originalBodyPointerEvents\n doc.body.removeAttribute(\"data-inert\")\n if (doc.body.style.length === 0) doc.body.removeAttribute(\"style\")\n })\n cleanups.forEach((fn) => fn())\n }\n}\n"],"mappings":"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","names":["import_dom_query","import_dom_query","import_dom_query","node"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,237 @@
1
- import{contains as contains2,getEventTarget,isHTMLElement,raf}from"@zag-js/dom-query";import{trackInteractOutside}from"@zag-js/interact-outside";import{isFunction,warn}from"@zag-js/utils";import{addDomEvent}from"@zag-js/dom-event";import{getDocument}from"@zag-js/dom-query";function trackEscapeKeydown(node,fn){const handleKeyDown=event=>{if(event.key!=="Escape")return;if(event.isComposing)return;fn?.(event)};return addDomEvent(getDocument(node),"keydown",handleKeyDown,{capture:true})}import{contains}from"@zag-js/dom-query";var layerStack={layers:[],branches:[],count(){return this.layers.length},pointerBlockingLayers(){return this.layers.filter(layer=>layer.pointerBlocking)},topMostPointerBlockingLayer(){return[...this.pointerBlockingLayers()].slice(-1)[0]},hasPointerBlockingLayer(){return this.pointerBlockingLayers().length>0},isBelowPointerBlockingLayer(node){const index=this.indexOf(node);const highestBlockingIndex=this.topMostPointerBlockingLayer()?this.indexOf(this.topMostPointerBlockingLayer()?.node):-1;return index<highestBlockingIndex},isTopMost(node){const layer=this.layers[this.count()-1];return layer?.node===node},getNestedLayers(node){return Array.from(this.layers).slice(this.indexOf(node)+1)},isInNestedLayer(node,target){return this.getNestedLayers(node).some(layer=>contains(layer.node,target))},isInBranch(target){return Array.from(this.branches).some(branch=>contains(branch,target))},add(layer){const num=this.layers.push(layer);layer.node.style.setProperty("--layer-index",`${num}`)},addBranch(node){this.branches.push(node)},remove(node){const index=this.indexOf(node);if(index<0)return;if(index<this.count()-1){const _layers=this.getNestedLayers(node);_layers.forEach(layer=>layer.dismiss())}this.layers.splice(index,1);node.style.removeProperty("--layer-index")},removeBranch(node){const index=this.branches.indexOf(node);if(index>=0)this.branches.splice(index,1)},indexOf(node){return this.layers.findIndex(layer=>layer.node===node)},dismiss(node){this.layers[this.indexOf(node)]?.dismiss()},clear(){this.remove(this.layers[0].node)}};import{getDocument as getDocument2,setStyle,waitForElements}from"@zag-js/dom-query";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,peristentElements){const doc=getDocument2(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","")})}if(peristentElements){const persistedCleanup=waitForElements(peristentElements,el=>{cleanups.push(setStyle(el,{pointerEvents:"auto"}))});cleanups.push(persistedCleanup)}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())}}function trackDismissableElementImpl(node,options){if(!node){warn("[@zag-js/dismissable] node is `null` or `undefined`");return}const{onDismiss,pointerBlocking,exclude:excludeContainers,debug}=options;const layer={dismiss:onDismiss,node,pointerBlocking};layerStack.add(layer);assignPointerEventToLayers();function onPointerDownOutside(event){const target=getEventTarget(event.detail.originalEvent);if(layerStack.isBelowPointerBlockingLayer(node)||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=getEventTarget(event.detail.originalEvent);if(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(!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(isHTMLElement);if(persistentElements)_containers.push(...persistentElements);return _containers.some(node2=>contains2(node2,target))||layerStack.isInNestedLayer(node,target)}const cleanups=[pointerBlocking?disablePointerEventsOutside(node,options.persistentElements):void 0,trackEscapeKeydown(node,onEscapeKeyDown),trackInteractOutside(node,{exclude,onFocusOutside,onPointerDownOutside,defer:options.defer})];return()=>{layerStack.remove(node);assignPointerEventToLayers();clearPointerEvent(node);cleanups.forEach(fn=>fn?.())}}function trackDismissableElement(nodeOrFn,options){const{defer}=options;const func=defer?raf:v=>v();const cleanups=[];cleanups.push(func(()=>{const node=isFunction(nodeOrFn)?nodeOrFn():nodeOrFn;cleanups.push(trackDismissableElementImpl(node,options))}));return()=>{cleanups.forEach(fn=>fn?.())}}function trackDismissableBranch(nodeOrFn,options={}){const{defer}=options;const func=defer?raf:v=>v();const cleanups=[];cleanups.push(func(()=>{const node=isFunction(nodeOrFn)?nodeOrFn():nodeOrFn;if(!node){warn("[@zag-js/dismissable] branch node is `null` or `undefined`");return}layerStack.addBranch(node);cleanups.push(()=>{layerStack.removeBranch(node)})}));return()=>{cleanups.forEach(fn=>fn?.())}}export{trackDismissableBranch,trackDismissableElement};
1
+ // src/dismissable-layer.ts
2
+ import { contains as contains2, getEventTarget, isHTMLElement, raf } from "@zag-js/dom-query";
3
+ import {
4
+ trackInteractOutside
5
+ } from "@zag-js/interact-outside";
6
+ import { isFunction, warn } from "@zag-js/utils";
7
+
8
+ // src/escape-keydown.ts
9
+ import { addDomEvent } from "@zag-js/dom-event";
10
+ import { getDocument } from "@zag-js/dom-query";
11
+ function trackEscapeKeydown(node, fn) {
12
+ const handleKeyDown = (event) => {
13
+ if (event.key !== "Escape")
14
+ return;
15
+ if (event.isComposing)
16
+ return;
17
+ fn?.(event);
18
+ };
19
+ return addDomEvent(getDocument(node), "keydown", handleKeyDown, { capture: true });
20
+ }
21
+
22
+ // src/layer-stack.ts
23
+ import { contains } from "@zag-js/dom-query";
24
+ var layerStack = {
25
+ layers: [],
26
+ branches: [],
27
+ count() {
28
+ return this.layers.length;
29
+ },
30
+ pointerBlockingLayers() {
31
+ return this.layers.filter((layer) => layer.pointerBlocking);
32
+ },
33
+ topMostPointerBlockingLayer() {
34
+ return [...this.pointerBlockingLayers()].slice(-1)[0];
35
+ },
36
+ hasPointerBlockingLayer() {
37
+ return this.pointerBlockingLayers().length > 0;
38
+ },
39
+ isBelowPointerBlockingLayer(node) {
40
+ const index = this.indexOf(node);
41
+ const highestBlockingIndex = this.topMostPointerBlockingLayer() ? this.indexOf(this.topMostPointerBlockingLayer()?.node) : -1;
42
+ return index < highestBlockingIndex;
43
+ },
44
+ isTopMost(node) {
45
+ const layer = this.layers[this.count() - 1];
46
+ return layer?.node === node;
47
+ },
48
+ getNestedLayers(node) {
49
+ return Array.from(this.layers).slice(this.indexOf(node) + 1);
50
+ },
51
+ isInNestedLayer(node, target) {
52
+ return this.getNestedLayers(node).some((layer) => contains(layer.node, target));
53
+ },
54
+ isInBranch(target) {
55
+ return Array.from(this.branches).some((branch) => contains(branch, target));
56
+ },
57
+ add(layer) {
58
+ const num = this.layers.push(layer);
59
+ layer.node.style.setProperty("--layer-index", `${num}`);
60
+ },
61
+ addBranch(node) {
62
+ this.branches.push(node);
63
+ },
64
+ remove(node) {
65
+ const index = this.indexOf(node);
66
+ if (index < 0)
67
+ return;
68
+ if (index < this.count() - 1) {
69
+ const _layers = this.getNestedLayers(node);
70
+ _layers.forEach((layer) => layer.dismiss());
71
+ }
72
+ this.layers.splice(index, 1);
73
+ node.style.removeProperty("--layer-index");
74
+ },
75
+ removeBranch(node) {
76
+ const index = this.branches.indexOf(node);
77
+ if (index >= 0)
78
+ this.branches.splice(index, 1);
79
+ },
80
+ indexOf(node) {
81
+ return this.layers.findIndex((layer) => layer.node === node);
82
+ },
83
+ dismiss(node) {
84
+ this.layers[this.indexOf(node)]?.dismiss();
85
+ },
86
+ clear() {
87
+ this.remove(this.layers[0].node);
88
+ }
89
+ };
90
+
91
+ // src/pointer-event-outside.ts
92
+ import { getDocument as getDocument2, setStyle, waitForElements } from "@zag-js/dom-query";
93
+ var originalBodyPointerEvents;
94
+ function assignPointerEventToLayers() {
95
+ layerStack.layers.forEach(({ node }) => {
96
+ node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
97
+ });
98
+ }
99
+ function clearPointerEvent(node) {
100
+ node.style.pointerEvents = "";
101
+ }
102
+ function disablePointerEventsOutside(node, peristentElements) {
103
+ const doc = getDocument2(node);
104
+ const cleanups = [];
105
+ if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute("data-inert")) {
106
+ originalBodyPointerEvents = document.body.style.pointerEvents;
107
+ queueMicrotask(() => {
108
+ doc.body.style.pointerEvents = "none";
109
+ doc.body.setAttribute("data-inert", "");
110
+ });
111
+ }
112
+ if (peristentElements) {
113
+ const persistedCleanup = waitForElements(peristentElements, (el) => {
114
+ cleanups.push(setStyle(el, { pointerEvents: "auto" }));
115
+ });
116
+ cleanups.push(persistedCleanup);
117
+ }
118
+ return () => {
119
+ if (layerStack.hasPointerBlockingLayer())
120
+ return;
121
+ queueMicrotask(() => {
122
+ doc.body.style.pointerEvents = originalBodyPointerEvents;
123
+ doc.body.removeAttribute("data-inert");
124
+ if (doc.body.style.length === 0)
125
+ doc.body.removeAttribute("style");
126
+ });
127
+ cleanups.forEach((fn) => fn());
128
+ };
129
+ }
130
+
131
+ // src/dismissable-layer.ts
132
+ function trackDismissableElementImpl(node, options) {
133
+ if (!node) {
134
+ warn("[@zag-js/dismissable] node is `null` or `undefined`");
135
+ return;
136
+ }
137
+ const { onDismiss, pointerBlocking, exclude: excludeContainers, debug } = options;
138
+ const layer = { dismiss: onDismiss, node, pointerBlocking };
139
+ layerStack.add(layer);
140
+ assignPointerEventToLayers();
141
+ function onPointerDownOutside(event) {
142
+ const target = getEventTarget(event.detail.originalEvent);
143
+ if (layerStack.isBelowPointerBlockingLayer(node) || layerStack.isInBranch(target))
144
+ return;
145
+ options.onPointerDownOutside?.(event);
146
+ options.onInteractOutside?.(event);
147
+ if (event.defaultPrevented)
148
+ return;
149
+ if (debug) {
150
+ console.log("onPointerDownOutside:", event.detail.originalEvent);
151
+ }
152
+ onDismiss?.();
153
+ }
154
+ function onFocusOutside(event) {
155
+ const target = getEventTarget(event.detail.originalEvent);
156
+ if (layerStack.isInBranch(target))
157
+ return;
158
+ options.onFocusOutside?.(event);
159
+ options.onInteractOutside?.(event);
160
+ if (event.defaultPrevented)
161
+ return;
162
+ if (debug) {
163
+ console.log("onFocusOutside:", event.detail.originalEvent);
164
+ }
165
+ onDismiss?.();
166
+ }
167
+ function onEscapeKeyDown(event) {
168
+ if (!layerStack.isTopMost(node))
169
+ return;
170
+ options.onEscapeKeyDown?.(event);
171
+ if (!event.defaultPrevented && onDismiss) {
172
+ event.preventDefault();
173
+ onDismiss();
174
+ }
175
+ }
176
+ function exclude(target) {
177
+ if (!node)
178
+ return false;
179
+ const containers = typeof excludeContainers === "function" ? excludeContainers() : excludeContainers;
180
+ const _containers = Array.isArray(containers) ? containers : [containers];
181
+ const persistentElements = options.persistentElements?.map((fn) => fn()).filter(isHTMLElement);
182
+ if (persistentElements)
183
+ _containers.push(...persistentElements);
184
+ return _containers.some((node2) => contains2(node2, target)) || layerStack.isInNestedLayer(node, target);
185
+ }
186
+ const cleanups = [
187
+ pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : void 0,
188
+ trackEscapeKeydown(node, onEscapeKeyDown),
189
+ trackInteractOutside(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer })
190
+ ];
191
+ return () => {
192
+ layerStack.remove(node);
193
+ assignPointerEventToLayers();
194
+ clearPointerEvent(node);
195
+ cleanups.forEach((fn) => fn?.());
196
+ };
197
+ }
198
+ function trackDismissableElement(nodeOrFn, options) {
199
+ const { defer } = options;
200
+ const func = defer ? raf : (v) => v();
201
+ const cleanups = [];
202
+ cleanups.push(
203
+ func(() => {
204
+ const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn;
205
+ cleanups.push(trackDismissableElementImpl(node, options));
206
+ })
207
+ );
208
+ return () => {
209
+ cleanups.forEach((fn) => fn?.());
210
+ };
211
+ }
212
+ function trackDismissableBranch(nodeOrFn, options = {}) {
213
+ const { defer } = options;
214
+ const func = defer ? raf : (v) => v();
215
+ const cleanups = [];
216
+ cleanups.push(
217
+ func(() => {
218
+ const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn;
219
+ if (!node) {
220
+ warn("[@zag-js/dismissable] branch node is `null` or `undefined`");
221
+ return;
222
+ }
223
+ layerStack.addBranch(node);
224
+ cleanups.push(() => {
225
+ layerStack.removeBranch(node);
226
+ });
227
+ })
228
+ );
229
+ return () => {
230
+ cleanups.forEach((fn) => fn?.());
231
+ };
232
+ }
233
+ export {
234
+ trackDismissableBranch,
235
+ trackDismissableElement
236
+ };
2
237
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dismissable-layer.ts","../src/escape-keydown.ts","../src/layer-stack.ts","../src/pointer-event-outside.ts"],"sourcesContent":["import { contains, getEventTarget, isHTMLElement, raf } from \"@zag-js/dom-query\"\nimport {\n trackInteractOutside,\n type FocusOutsideEvent,\n type InteractOutsideHandlers,\n type PointerDownOutsideEvent,\n} from \"@zag-js/interact-outside\"\nimport { isFunction, warn, type MaybeFunction } from \"@zag-js/utils\"\nimport { trackEscapeKeydown } from \"./escape-keydown\"\nimport { layerStack, type Layer } from \"./layer-stack\"\nimport { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside } from \"./pointer-event-outside\"\n\ntype MaybeElement = HTMLElement | null\ntype Container = MaybeElement | Array<MaybeElement>\ntype NodeOrFn = MaybeFunction<MaybeElement>\n\nexport interface DismissableElementHandlers extends InteractOutsideHandlers {\n /**\n * Function called when the escape key is pressed\n */\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n}\n\nexport interface PersistentElementOptions {\n /**\n * Returns the persistent elements that:\n * - should not have pointer-events disabled\n * - should not trigger the dismiss event\n */\n persistentElements?: Array<() => Element | null>\n}\n\nexport interface DismissableElementOptions extends DismissableElementHandlers, PersistentElementOptions {\n /**\n * Whether to log debug information\n */\n debug?: boolean\n /**\n * Whether to block pointer events outside the dismissable element\n */\n pointerBlocking?: boolean\n /**\n * Function called when the dismissable element is dismissed\n */\n onDismiss: VoidFunction\n /**\n * Exclude containers from the interact outside event\n */\n exclude?: MaybeFunction<Container>\n /**\n * Defer the interact outside event to the next frame\n */\n defer?: boolean\n}\n\nfunction trackDismissableElementImpl(node: MaybeElement, options: DismissableElementOptions) {\n if (!node) {\n warn(\"[@zag-js/dismissable] node is `null` or `undefined`\")\n return\n }\n\n const { onDismiss, pointerBlocking, exclude: excludeContainers, debug } = options\n\n const layer: Layer = { dismiss: onDismiss, node, pointerBlocking }\n\n layerStack.add(layer)\n assignPointerEventToLayers()\n\n function onPointerDownOutside(event: PointerDownOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isBelowPointerBlockingLayer(node!) || layerStack.isInBranch(target)) return\n options.onPointerDownOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onPointerDownOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onFocusOutside(event: FocusOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isInBranch(target)) return\n options.onFocusOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onFocusOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onEscapeKeyDown(event: KeyboardEvent) {\n if (!layerStack.isTopMost(node!)) return\n options.onEscapeKeyDown?.(event)\n if (!event.defaultPrevented && onDismiss) {\n event.preventDefault()\n onDismiss()\n }\n }\n\n function exclude(target: Element) {\n if (!node) return false\n const containers = typeof excludeContainers === \"function\" ? excludeContainers() : excludeContainers\n const _containers = Array.isArray(containers) ? containers : [containers]\n const persistentElements = options.persistentElements?.map((fn) => fn()).filter(isHTMLElement)\n if (persistentElements) _containers.push(...persistentElements)\n return _containers.some((node) => contains(node, target)) || layerStack.isInNestedLayer(node, target)\n }\n\n const cleanups = [\n pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : undefined,\n trackEscapeKeydown(node, onEscapeKeyDown),\n trackInteractOutside(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer }),\n ]\n\n return () => {\n layerStack.remove(node!)\n // re-assign pointer event to remaining layers\n assignPointerEventToLayers()\n // remove pointer event from removed layer\n clearPointerEvent(node!)\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableElement(nodeOrFn: NodeOrFn, options: DismissableElementOptions) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n cleanups.push(trackDismissableElementImpl(node, options))\n }),\n )\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableBranch(nodeOrFn: NodeOrFn, options: { defer?: boolean } = {}) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n if (!node) {\n warn(\"[@zag-js/dismissable] branch node is `null` or `undefined`\")\n return\n }\n layerStack.addBranch(node)\n cleanups.push(() => {\n layerStack.removeBranch(node)\n })\n }),\n )\n\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n","import { addDomEvent } from \"@zag-js/dom-event\"\nimport { getDocument } from \"@zag-js/dom-query\"\n\nexport function trackEscapeKeydown(node: HTMLElement, fn?: (event: KeyboardEvent) => void) {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n if (event.isComposing) return\n fn?.(event)\n }\n\n return addDomEvent(getDocument(node), \"keydown\", handleKeyDown, { capture: true })\n}\n","import { contains } from \"@zag-js/dom-query\"\n\nexport interface Layer {\n dismiss: VoidFunction\n node: HTMLElement\n pointerBlocking?: boolean\n}\n\nexport const layerStack = {\n layers: [] as Layer[],\n branches: [] as HTMLElement[],\n count(): number {\n return this.layers.length\n },\n pointerBlockingLayers(): Layer[] {\n return this.layers.filter((layer) => layer.pointerBlocking)\n },\n topMostPointerBlockingLayer(): Layer | undefined {\n return [...this.pointerBlockingLayers()].slice(-1)[0]\n },\n hasPointerBlockingLayer(): boolean {\n return this.pointerBlockingLayers().length > 0\n },\n isBelowPointerBlockingLayer(node: HTMLElement) {\n const index = this.indexOf(node)\n const highestBlockingIndex = this.topMostPointerBlockingLayer()\n ? this.indexOf(this.topMostPointerBlockingLayer()?.node)\n : -1\n return index < highestBlockingIndex\n },\n isTopMost(node: HTMLElement | null) {\n const layer = this.layers[this.count() - 1]\n return layer?.node === node\n },\n getNestedLayers(node: HTMLElement) {\n return Array.from(this.layers).slice(this.indexOf(node) + 1)\n },\n isInNestedLayer(node: HTMLElement, target: HTMLElement | EventTarget | null) {\n return this.getNestedLayers(node).some((layer) => contains(layer.node, target))\n },\n isInBranch(target: HTMLElement | EventTarget | null) {\n return Array.from(this.branches).some((branch) => contains(branch, target))\n },\n add(layer: Layer) {\n const num = this.layers.push(layer)\n layer.node.style.setProperty(\"--layer-index\", `${num}`)\n },\n addBranch(node: HTMLElement) {\n this.branches.push(node)\n },\n remove(node: HTMLElement) {\n const index = this.indexOf(node)\n if (index < 0) return\n\n // dismiss nested layers\n if (index < this.count() - 1) {\n const _layers = this.getNestedLayers(node)\n _layers.forEach((layer) => layer.dismiss())\n }\n // remove this layer\n this.layers.splice(index, 1)\n node.style.removeProperty(\"--layer-index\")\n },\n removeBranch(node: HTMLElement) {\n const index = this.branches.indexOf(node)\n if (index >= 0) this.branches.splice(index, 1)\n },\n indexOf(node: HTMLElement | undefined) {\n return this.layers.findIndex((layer) => layer.node === node)\n },\n dismiss(node: HTMLElement) {\n this.layers[this.indexOf(node)]?.dismiss()\n },\n clear() {\n this.remove(this.layers[0].node)\n },\n}\n","import { getDocument, setStyle, waitForElements } from \"@zag-js/dom-query\"\nimport { layerStack } from \"./layer-stack\"\n\nlet originalBodyPointerEvents: string\n\nexport function assignPointerEventToLayers() {\n layerStack.layers.forEach(({ node }) => {\n node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? \"none\" : \"auto\"\n })\n}\n\nexport function clearPointerEvent(node: HTMLElement) {\n node.style.pointerEvents = \"\"\n}\n\nexport function disablePointerEventsOutside(node: HTMLElement, peristentElements?: Array<() => Element | null>) {\n const doc = getDocument(node)\n\n const cleanups: VoidFunction[] = []\n\n if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute(\"data-inert\")) {\n originalBodyPointerEvents = document.body.style.pointerEvents\n queueMicrotask(() => {\n doc.body.style.pointerEvents = \"none\"\n doc.body.setAttribute(\"data-inert\", \"\")\n })\n }\n\n if (peristentElements) {\n const persistedCleanup = waitForElements(peristentElements, (el) => {\n cleanups.push(setStyle(el, { pointerEvents: \"auto\" }))\n })\n cleanups.push(persistedCleanup)\n }\n\n return () => {\n if (layerStack.hasPointerBlockingLayer()) return\n queueMicrotask(() => {\n doc.body.style.pointerEvents = originalBodyPointerEvents\n doc.body.removeAttribute(\"data-inert\")\n if (doc.body.style.length === 0) doc.body.removeAttribute(\"style\")\n })\n cleanups.forEach((fn) => fn())\n }\n}\n"],"mappings":"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","names":["contains","getDocument","getDocument","node","contains"]}
1
+ {"version":3,"sources":["../src/dismissable-layer.ts","../src/escape-keydown.ts","../src/layer-stack.ts","../src/pointer-event-outside.ts"],"sourcesContent":["import { contains, getEventTarget, isHTMLElement, raf } from \"@zag-js/dom-query\"\nimport {\n trackInteractOutside,\n type FocusOutsideEvent,\n type InteractOutsideHandlers,\n type PointerDownOutsideEvent,\n} from \"@zag-js/interact-outside\"\nimport { isFunction, warn, type MaybeFunction } from \"@zag-js/utils\"\nimport { trackEscapeKeydown } from \"./escape-keydown\"\nimport { layerStack, type Layer } from \"./layer-stack\"\nimport { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside } from \"./pointer-event-outside\"\n\ntype MaybeElement = HTMLElement | null\ntype Container = MaybeElement | Array<MaybeElement>\ntype NodeOrFn = MaybeFunction<MaybeElement>\n\nexport interface DismissableElementHandlers extends InteractOutsideHandlers {\n /**\n * Function called when the escape key is pressed\n */\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n}\n\nexport interface PersistentElementOptions {\n /**\n * Returns the persistent elements that:\n * - should not have pointer-events disabled\n * - should not trigger the dismiss event\n */\n persistentElements?: Array<() => Element | null>\n}\n\nexport interface DismissableElementOptions extends DismissableElementHandlers, PersistentElementOptions {\n /**\n * Whether to log debug information\n */\n debug?: boolean\n /**\n * Whether to block pointer events outside the dismissable element\n */\n pointerBlocking?: boolean\n /**\n * Function called when the dismissable element is dismissed\n */\n onDismiss: VoidFunction\n /**\n * Exclude containers from the interact outside event\n */\n exclude?: MaybeFunction<Container>\n /**\n * Defer the interact outside event to the next frame\n */\n defer?: boolean\n}\n\nfunction trackDismissableElementImpl(node: MaybeElement, options: DismissableElementOptions) {\n if (!node) {\n warn(\"[@zag-js/dismissable] node is `null` or `undefined`\")\n return\n }\n\n const { onDismiss, pointerBlocking, exclude: excludeContainers, debug } = options\n\n const layer: Layer = { dismiss: onDismiss, node, pointerBlocking }\n\n layerStack.add(layer)\n assignPointerEventToLayers()\n\n function onPointerDownOutside(event: PointerDownOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isBelowPointerBlockingLayer(node!) || layerStack.isInBranch(target)) return\n options.onPointerDownOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onPointerDownOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onFocusOutside(event: FocusOutsideEvent) {\n const target = getEventTarget(event.detail.originalEvent)\n if (layerStack.isInBranch(target)) return\n options.onFocusOutside?.(event)\n options.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n if (debug) {\n console.log(\"onFocusOutside:\", event.detail.originalEvent)\n }\n onDismiss?.()\n }\n\n function onEscapeKeyDown(event: KeyboardEvent) {\n if (!layerStack.isTopMost(node!)) return\n options.onEscapeKeyDown?.(event)\n if (!event.defaultPrevented && onDismiss) {\n event.preventDefault()\n onDismiss()\n }\n }\n\n function exclude(target: Element) {\n if (!node) return false\n const containers = typeof excludeContainers === \"function\" ? excludeContainers() : excludeContainers\n const _containers = Array.isArray(containers) ? containers : [containers]\n const persistentElements = options.persistentElements?.map((fn) => fn()).filter(isHTMLElement)\n if (persistentElements) _containers.push(...persistentElements)\n return _containers.some((node) => contains(node, target)) || layerStack.isInNestedLayer(node, target)\n }\n\n const cleanups = [\n pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : undefined,\n trackEscapeKeydown(node, onEscapeKeyDown),\n trackInteractOutside(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer }),\n ]\n\n return () => {\n layerStack.remove(node!)\n // re-assign pointer event to remaining layers\n assignPointerEventToLayers()\n // remove pointer event from removed layer\n clearPointerEvent(node!)\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableElement(nodeOrFn: NodeOrFn, options: DismissableElementOptions) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n cleanups.push(trackDismissableElementImpl(node, options))\n }),\n )\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n\nexport function trackDismissableBranch(nodeOrFn: NodeOrFn, options: { defer?: boolean } = {}) {\n const { defer } = options\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n\n cleanups.push(\n func(() => {\n const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn\n if (!node) {\n warn(\"[@zag-js/dismissable] branch node is `null` or `undefined`\")\n return\n }\n layerStack.addBranch(node)\n cleanups.push(() => {\n layerStack.removeBranch(node)\n })\n }),\n )\n\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n","import { addDomEvent } from \"@zag-js/dom-event\"\nimport { getDocument } from \"@zag-js/dom-query\"\n\nexport function trackEscapeKeydown(node: HTMLElement, fn?: (event: KeyboardEvent) => void) {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n if (event.isComposing) return\n fn?.(event)\n }\n\n return addDomEvent(getDocument(node), \"keydown\", handleKeyDown, { capture: true })\n}\n","import { contains } from \"@zag-js/dom-query\"\n\nexport interface Layer {\n dismiss: VoidFunction\n node: HTMLElement\n pointerBlocking?: boolean\n}\n\nexport const layerStack = {\n layers: [] as Layer[],\n branches: [] as HTMLElement[],\n count(): number {\n return this.layers.length\n },\n pointerBlockingLayers(): Layer[] {\n return this.layers.filter((layer) => layer.pointerBlocking)\n },\n topMostPointerBlockingLayer(): Layer | undefined {\n return [...this.pointerBlockingLayers()].slice(-1)[0]\n },\n hasPointerBlockingLayer(): boolean {\n return this.pointerBlockingLayers().length > 0\n },\n isBelowPointerBlockingLayer(node: HTMLElement) {\n const index = this.indexOf(node)\n const highestBlockingIndex = this.topMostPointerBlockingLayer()\n ? this.indexOf(this.topMostPointerBlockingLayer()?.node)\n : -1\n return index < highestBlockingIndex\n },\n isTopMost(node: HTMLElement | null) {\n const layer = this.layers[this.count() - 1]\n return layer?.node === node\n },\n getNestedLayers(node: HTMLElement) {\n return Array.from(this.layers).slice(this.indexOf(node) + 1)\n },\n isInNestedLayer(node: HTMLElement, target: HTMLElement | EventTarget | null) {\n return this.getNestedLayers(node).some((layer) => contains(layer.node, target))\n },\n isInBranch(target: HTMLElement | EventTarget | null) {\n return Array.from(this.branches).some((branch) => contains(branch, target))\n },\n add(layer: Layer) {\n const num = this.layers.push(layer)\n layer.node.style.setProperty(\"--layer-index\", `${num}`)\n },\n addBranch(node: HTMLElement) {\n this.branches.push(node)\n },\n remove(node: HTMLElement) {\n const index = this.indexOf(node)\n if (index < 0) return\n\n // dismiss nested layers\n if (index < this.count() - 1) {\n const _layers = this.getNestedLayers(node)\n _layers.forEach((layer) => layer.dismiss())\n }\n // remove this layer\n this.layers.splice(index, 1)\n node.style.removeProperty(\"--layer-index\")\n },\n removeBranch(node: HTMLElement) {\n const index = this.branches.indexOf(node)\n if (index >= 0) this.branches.splice(index, 1)\n },\n indexOf(node: HTMLElement | undefined) {\n return this.layers.findIndex((layer) => layer.node === node)\n },\n dismiss(node: HTMLElement) {\n this.layers[this.indexOf(node)]?.dismiss()\n },\n clear() {\n this.remove(this.layers[0].node)\n },\n}\n","import { getDocument, setStyle, waitForElements } from \"@zag-js/dom-query\"\nimport { layerStack } from \"./layer-stack\"\n\nlet originalBodyPointerEvents: string\n\nexport function assignPointerEventToLayers() {\n layerStack.layers.forEach(({ node }) => {\n node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? \"none\" : \"auto\"\n })\n}\n\nexport function clearPointerEvent(node: HTMLElement) {\n node.style.pointerEvents = \"\"\n}\n\nexport function disablePointerEventsOutside(node: HTMLElement, peristentElements?: Array<() => Element | null>) {\n const doc = getDocument(node)\n\n const cleanups: VoidFunction[] = []\n\n if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute(\"data-inert\")) {\n originalBodyPointerEvents = document.body.style.pointerEvents\n queueMicrotask(() => {\n doc.body.style.pointerEvents = \"none\"\n doc.body.setAttribute(\"data-inert\", \"\")\n })\n }\n\n if (peristentElements) {\n const persistedCleanup = waitForElements(peristentElements, (el) => {\n cleanups.push(setStyle(el, { pointerEvents: \"auto\" }))\n })\n cleanups.push(persistedCleanup)\n }\n\n return () => {\n if (layerStack.hasPointerBlockingLayer()) return\n queueMicrotask(() => {\n doc.body.style.pointerEvents = originalBodyPointerEvents\n doc.body.removeAttribute(\"data-inert\")\n if (doc.body.style.length === 0) doc.body.removeAttribute(\"style\")\n })\n cleanups.forEach((fn) => fn())\n }\n}\n"],"mappings":"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","names":["contains","getDocument","getDocument","node","contains"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/dismissable",
3
- "version": "0.53.0",
3
+ "version": "0.55.0",
4
4
  "description": "Dismissable layer utilities for the DOM",
5
5
  "keywords": [
6
6
  "js",
@@ -24,10 +24,10 @@
24
24
  "access": "public"
25
25
  },
26
26
  "dependencies": {
27
- "@zag-js/interact-outside": "0.53.0",
28
- "@zag-js/dom-query": "0.53.0",
29
- "@zag-js/dom-event": "0.53.0",
30
- "@zag-js/utils": "0.53.0"
27
+ "@zag-js/interact-outside": "0.55.0",
28
+ "@zag-js/dom-query": "0.55.0",
29
+ "@zag-js/dom-event": "0.55.0",
30
+ "@zag-js/utils": "0.55.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "clean-package": "2.2.0"