@zag-js/dismissable 1.34.1 → 1.35.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,284 +1,24 @@
1
- 'use strict';
2
-
3
- var domQuery = require('@zag-js/dom-query');
4
- var interactOutside = require('@zag-js/interact-outside');
5
- var utils = require('@zag-js/utils');
6
-
7
- // src/dismissable-layer.ts
8
- function trackEscapeKeydown(node, fn) {
9
- const handleKeyDown = (event) => {
10
- if (event.key !== "Escape") return;
11
- if (event.isComposing) return;
12
- fn?.(event);
13
- };
14
- return domQuery.addDomEvent(domQuery.getDocument(node), "keydown", handleKeyDown, { capture: true });
15
- }
16
- var LAYER_REQUEST_DISMISS_EVENT = "layer:request-dismiss";
17
- var layerStack = {
18
- layers: [],
19
- branches: [],
20
- recentlyRemoved: /* @__PURE__ */ new Set(),
21
- count() {
22
- return this.layers.length;
23
- },
24
- pointerBlockingLayers() {
25
- return this.layers.filter((layer) => layer.pointerBlocking);
26
- },
27
- topMostPointerBlockingLayer() {
28
- return [...this.pointerBlockingLayers()].slice(-1)[0];
29
- },
30
- hasPointerBlockingLayer() {
31
- return this.pointerBlockingLayers().length > 0;
32
- },
33
- isBelowPointerBlockingLayer(node) {
34
- const index = this.indexOf(node);
35
- const highestBlockingIndex = this.topMostPointerBlockingLayer() ? this.indexOf(this.topMostPointerBlockingLayer()?.node) : -1;
36
- return index < highestBlockingIndex;
37
- },
38
- isTopMost(node) {
39
- const layer = this.layers[this.count() - 1];
40
- return layer?.node === node;
41
- },
42
- getNestedLayers(node) {
43
- return Array.from(this.layers).slice(this.indexOf(node) + 1);
44
- },
45
- getLayersByType(type) {
46
- return this.layers.filter((layer) => layer.type === type);
47
- },
48
- getNestedLayersByType(node, type) {
49
- const index = this.indexOf(node);
50
- if (index === -1) return [];
51
- return this.layers.slice(index + 1).filter((layer) => layer.type === type);
52
- },
53
- getParentLayerOfType(node, type) {
54
- const index = this.indexOf(node);
55
- if (index <= 0) return void 0;
56
- return this.layers.slice(0, index).reverse().find((layer) => layer.type === type);
57
- },
58
- countNestedLayersOfType(node, type) {
59
- return this.getNestedLayersByType(node, type).length;
60
- },
61
- isInNestedLayer(node, target) {
62
- const inNested = this.getNestedLayers(node).some((layer) => domQuery.contains(layer.node, target));
63
- if (inNested) return true;
64
- if (this.recentlyRemoved.size > 0) return true;
65
- return false;
66
- },
67
- isInBranch(target) {
68
- return Array.from(this.branches).some((branch) => domQuery.contains(branch, target));
69
- },
70
- add(layer) {
71
- this.layers.push(layer);
72
- this.syncLayers();
73
- },
74
- addBranch(node) {
75
- this.branches.push(node);
76
- },
77
- remove(node) {
78
- const index = this.indexOf(node);
79
- if (index < 0) return;
80
- this.recentlyRemoved.add(node);
81
- domQuery.nextTick(() => this.recentlyRemoved.delete(node));
82
- if (index < this.count() - 1) {
83
- const _layers = this.getNestedLayers(node);
84
- _layers.forEach((layer) => layerStack.dismiss(layer.node, node));
85
- }
86
- this.layers.splice(index, 1);
87
- this.syncLayers();
88
- },
89
- removeBranch(node) {
90
- const index = this.branches.indexOf(node);
91
- if (index >= 0) this.branches.splice(index, 1);
92
- },
93
- syncLayers() {
94
- this.layers.forEach((layer, index) => {
95
- layer.node.style.setProperty("--layer-index", `${index}`);
96
- layer.node.removeAttribute("data-nested");
97
- layer.node.removeAttribute("data-has-nested");
98
- const parentOfSameType = this.getParentLayerOfType(layer.node, layer.type);
99
- if (parentOfSameType) {
100
- layer.node.setAttribute("data-nested", layer.type);
101
- }
102
- const nestedCount = this.countNestedLayersOfType(layer.node, layer.type);
103
- if (nestedCount > 0) {
104
- layer.node.setAttribute("data-has-nested", layer.type);
105
- }
106
- layer.node.style.setProperty("--nested-layer-count", `${nestedCount}`);
107
- });
108
- },
109
- indexOf(node) {
110
- return this.layers.findIndex((layer) => layer.node === node);
111
- },
112
- dismiss(node, parent) {
113
- const index = this.indexOf(node);
114
- if (index === -1) return;
115
- const layer = this.layers[index];
116
- addListenerOnce(node, LAYER_REQUEST_DISMISS_EVENT, (event) => {
117
- layer.requestDismiss?.(event);
118
- if (!event.defaultPrevented) {
119
- layer?.dismiss();
120
- }
121
- });
122
- fireCustomEvent(node, LAYER_REQUEST_DISMISS_EVENT, {
123
- originalLayer: node,
124
- targetLayer: parent,
125
- originalIndex: index,
126
- targetIndex: parent ? this.indexOf(parent) : -1
127
- });
128
- this.syncLayers();
129
- },
130
- clear() {
131
- this.remove(this.layers[0].node);
132
- }
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 __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
133
13
  };
134
- function fireCustomEvent(el, type, detail) {
135
- const win = el.ownerDocument.defaultView || window;
136
- const event = new win.CustomEvent(type, { cancelable: true, bubbles: true, detail });
137
- return el.dispatchEvent(event);
138
- }
139
- function addListenerOnce(el, type, callback) {
140
- el.addEventListener(type, callback, { once: true });
141
- }
142
- var originalBodyPointerEvents;
143
- function assignPointerEventToLayers() {
144
- layerStack.layers.forEach(({ node }) => {
145
- node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
146
- });
147
- }
148
- function clearPointerEvent(node) {
149
- node.style.pointerEvents = "";
150
- }
151
- function disablePointerEventsOutside(node, persistentElements) {
152
- const doc = domQuery.getDocument(node);
153
- const cleanups = [];
154
- if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute("data-inert")) {
155
- originalBodyPointerEvents = document.body.style.pointerEvents;
156
- queueMicrotask(() => {
157
- doc.body.style.pointerEvents = "none";
158
- doc.body.setAttribute("data-inert", "");
159
- });
160
- }
161
- persistentElements?.forEach((el) => {
162
- const [promise, abort] = domQuery.waitForElement(
163
- () => {
164
- const node2 = el();
165
- return domQuery.isHTMLElement(node2) ? node2 : null;
166
- },
167
- { timeout: 1e3 }
168
- );
169
- promise.then((el2) => cleanups.push(domQuery.setStyle(el2, { pointerEvents: "auto" })));
170
- cleanups.push(abort);
171
- });
172
- return () => {
173
- if (layerStack.hasPointerBlockingLayer()) return;
174
- queueMicrotask(() => {
175
- doc.body.style.pointerEvents = originalBodyPointerEvents;
176
- doc.body.removeAttribute("data-inert");
177
- if (doc.body.style.length === 0) doc.body.removeAttribute("style");
178
- });
179
- cleanups.forEach((fn) => fn());
180
- };
181
- }
182
-
183
- // src/dismissable-layer.ts
184
- function trackDismissableElementImpl(node, options) {
185
- const { warnOnMissingNode = true } = options;
186
- if (warnOnMissingNode && !node) {
187
- utils.warn("[@zag-js/dismissable] node is `null` or `undefined`");
188
- return;
189
- }
190
- if (!node) {
191
- return;
192
- }
193
- const { onDismiss, onRequestDismiss, pointerBlocking, exclude: excludeContainers, debug, type = "dialog" } = options;
194
- const layer = { dismiss: onDismiss, node, type, pointerBlocking, requestDismiss: onRequestDismiss };
195
- layerStack.add(layer);
196
- assignPointerEventToLayers();
197
- function onPointerDownOutside(event) {
198
- const target = domQuery.getEventTarget(event.detail.originalEvent);
199
- if (layerStack.isBelowPointerBlockingLayer(node) || layerStack.isInBranch(target)) return;
200
- options.onPointerDownOutside?.(event);
201
- options.onInteractOutside?.(event);
202
- if (event.defaultPrevented) return;
203
- if (debug) {
204
- console.log("onPointerDownOutside:", event.detail.originalEvent);
205
- }
206
- onDismiss?.();
207
- }
208
- function onFocusOutside(event) {
209
- const target = domQuery.getEventTarget(event.detail.originalEvent);
210
- if (layerStack.isInBranch(target)) return;
211
- options.onFocusOutside?.(event);
212
- options.onInteractOutside?.(event);
213
- if (event.defaultPrevented) return;
214
- if (debug) {
215
- console.log("onFocusOutside:", event.detail.originalEvent);
216
- }
217
- onDismiss?.();
218
- }
219
- function onEscapeKeyDown(event) {
220
- if (!layerStack.isTopMost(node)) return;
221
- options.onEscapeKeyDown?.(event);
222
- if (!event.defaultPrevented && onDismiss) {
223
- event.preventDefault();
224
- onDismiss();
225
- }
226
- }
227
- function exclude(target) {
228
- if (!node) return false;
229
- const containers = typeof excludeContainers === "function" ? excludeContainers() : excludeContainers;
230
- const _containers = Array.isArray(containers) ? containers : [containers];
231
- const persistentElements = options.persistentElements?.map((fn) => fn()).filter(domQuery.isHTMLElement);
232
- if (persistentElements) _containers.push(...persistentElements);
233
- return _containers.some((node2) => domQuery.contains(node2, target)) || layerStack.isInNestedLayer(node, target);
234
- }
235
- const cleanups = [
236
- pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : void 0,
237
- trackEscapeKeydown(node, onEscapeKeyDown),
238
- interactOutside.trackInteractOutside(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer })
239
- ];
240
- return () => {
241
- layerStack.remove(node);
242
- assignPointerEventToLayers();
243
- clearPointerEvent(node);
244
- cleanups.forEach((fn) => fn?.());
245
- };
246
- }
247
- function trackDismissableElement(nodeOrFn, options) {
248
- const { defer } = options;
249
- const func = defer ? domQuery.raf : (v) => v();
250
- const cleanups = [];
251
- cleanups.push(
252
- func(() => {
253
- const node = utils.isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn;
254
- cleanups.push(trackDismissableElementImpl(node, options));
255
- })
256
- );
257
- return () => {
258
- cleanups.forEach((fn) => fn?.());
259
- };
260
- }
261
- function trackDismissableBranch(nodeOrFn, options = {}) {
262
- const { defer } = options;
263
- const func = defer ? domQuery.raf : (v) => v();
264
- const cleanups = [];
265
- cleanups.push(
266
- func(() => {
267
- const node = utils.isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn;
268
- if (!node) {
269
- utils.warn("[@zag-js/dismissable] branch node is `null` or `undefined`");
270
- return;
271
- }
272
- layerStack.addBranch(node);
273
- cleanups.push(() => {
274
- layerStack.removeBranch(node);
275
- });
276
- })
277
- );
278
- return () => {
279
- cleanups.forEach((fn) => fn?.());
280
- };
281
- }
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
282
16
 
283
- exports.trackDismissableBranch = trackDismissableBranch;
284
- exports.trackDismissableElement = trackDismissableElement;
17
+ // src/index.ts
18
+ var index_exports = {};
19
+ module.exports = __toCommonJS(index_exports);
20
+ __reExport(index_exports, require("./dismissable-layer.cjs"), module.exports);
21
+ // Annotate the CommonJS export names for ESM import in node:
22
+ 0 && (module.exports = {
23
+ ...require("./dismissable-layer.cjs")
24
+ });
package/dist/index.mjs CHANGED
@@ -1,281 +1,2 @@
1
- import { raf, nextTick, contains, getDocument, waitForElement, isHTMLElement, setStyle, addDomEvent, getEventTarget } from '@zag-js/dom-query';
2
- import { trackInteractOutside } from '@zag-js/interact-outside';
3
- import { isFunction, warn } from '@zag-js/utils';
4
-
5
- // src/dismissable-layer.ts
6
- function trackEscapeKeydown(node, fn) {
7
- const handleKeyDown = (event) => {
8
- if (event.key !== "Escape") return;
9
- if (event.isComposing) return;
10
- fn?.(event);
11
- };
12
- return addDomEvent(getDocument(node), "keydown", handleKeyDown, { capture: true });
13
- }
14
- var LAYER_REQUEST_DISMISS_EVENT = "layer:request-dismiss";
15
- var layerStack = {
16
- layers: [],
17
- branches: [],
18
- recentlyRemoved: /* @__PURE__ */ new Set(),
19
- count() {
20
- return this.layers.length;
21
- },
22
- pointerBlockingLayers() {
23
- return this.layers.filter((layer) => layer.pointerBlocking);
24
- },
25
- topMostPointerBlockingLayer() {
26
- return [...this.pointerBlockingLayers()].slice(-1)[0];
27
- },
28
- hasPointerBlockingLayer() {
29
- return this.pointerBlockingLayers().length > 0;
30
- },
31
- isBelowPointerBlockingLayer(node) {
32
- const index = this.indexOf(node);
33
- const highestBlockingIndex = this.topMostPointerBlockingLayer() ? this.indexOf(this.topMostPointerBlockingLayer()?.node) : -1;
34
- return index < highestBlockingIndex;
35
- },
36
- isTopMost(node) {
37
- const layer = this.layers[this.count() - 1];
38
- return layer?.node === node;
39
- },
40
- getNestedLayers(node) {
41
- return Array.from(this.layers).slice(this.indexOf(node) + 1);
42
- },
43
- getLayersByType(type) {
44
- return this.layers.filter((layer) => layer.type === type);
45
- },
46
- getNestedLayersByType(node, type) {
47
- const index = this.indexOf(node);
48
- if (index === -1) return [];
49
- return this.layers.slice(index + 1).filter((layer) => layer.type === type);
50
- },
51
- getParentLayerOfType(node, type) {
52
- const index = this.indexOf(node);
53
- if (index <= 0) return void 0;
54
- return this.layers.slice(0, index).reverse().find((layer) => layer.type === type);
55
- },
56
- countNestedLayersOfType(node, type) {
57
- return this.getNestedLayersByType(node, type).length;
58
- },
59
- isInNestedLayer(node, target) {
60
- const inNested = this.getNestedLayers(node).some((layer) => contains(layer.node, target));
61
- if (inNested) return true;
62
- if (this.recentlyRemoved.size > 0) return true;
63
- return false;
64
- },
65
- isInBranch(target) {
66
- return Array.from(this.branches).some((branch) => contains(branch, target));
67
- },
68
- add(layer) {
69
- this.layers.push(layer);
70
- this.syncLayers();
71
- },
72
- addBranch(node) {
73
- this.branches.push(node);
74
- },
75
- remove(node) {
76
- const index = this.indexOf(node);
77
- if (index < 0) return;
78
- this.recentlyRemoved.add(node);
79
- nextTick(() => this.recentlyRemoved.delete(node));
80
- if (index < this.count() - 1) {
81
- const _layers = this.getNestedLayers(node);
82
- _layers.forEach((layer) => layerStack.dismiss(layer.node, node));
83
- }
84
- this.layers.splice(index, 1);
85
- this.syncLayers();
86
- },
87
- removeBranch(node) {
88
- const index = this.branches.indexOf(node);
89
- if (index >= 0) this.branches.splice(index, 1);
90
- },
91
- syncLayers() {
92
- this.layers.forEach((layer, index) => {
93
- layer.node.style.setProperty("--layer-index", `${index}`);
94
- layer.node.removeAttribute("data-nested");
95
- layer.node.removeAttribute("data-has-nested");
96
- const parentOfSameType = this.getParentLayerOfType(layer.node, layer.type);
97
- if (parentOfSameType) {
98
- layer.node.setAttribute("data-nested", layer.type);
99
- }
100
- const nestedCount = this.countNestedLayersOfType(layer.node, layer.type);
101
- if (nestedCount > 0) {
102
- layer.node.setAttribute("data-has-nested", layer.type);
103
- }
104
- layer.node.style.setProperty("--nested-layer-count", `${nestedCount}`);
105
- });
106
- },
107
- indexOf(node) {
108
- return this.layers.findIndex((layer) => layer.node === node);
109
- },
110
- dismiss(node, parent) {
111
- const index = this.indexOf(node);
112
- if (index === -1) return;
113
- const layer = this.layers[index];
114
- addListenerOnce(node, LAYER_REQUEST_DISMISS_EVENT, (event) => {
115
- layer.requestDismiss?.(event);
116
- if (!event.defaultPrevented) {
117
- layer?.dismiss();
118
- }
119
- });
120
- fireCustomEvent(node, LAYER_REQUEST_DISMISS_EVENT, {
121
- originalLayer: node,
122
- targetLayer: parent,
123
- originalIndex: index,
124
- targetIndex: parent ? this.indexOf(parent) : -1
125
- });
126
- this.syncLayers();
127
- },
128
- clear() {
129
- this.remove(this.layers[0].node);
130
- }
131
- };
132
- function fireCustomEvent(el, type, detail) {
133
- const win = el.ownerDocument.defaultView || window;
134
- const event = new win.CustomEvent(type, { cancelable: true, bubbles: true, detail });
135
- return el.dispatchEvent(event);
136
- }
137
- function addListenerOnce(el, type, callback) {
138
- el.addEventListener(type, callback, { once: true });
139
- }
140
- var originalBodyPointerEvents;
141
- function assignPointerEventToLayers() {
142
- layerStack.layers.forEach(({ node }) => {
143
- node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
144
- });
145
- }
146
- function clearPointerEvent(node) {
147
- node.style.pointerEvents = "";
148
- }
149
- function disablePointerEventsOutside(node, persistentElements) {
150
- const doc = getDocument(node);
151
- const cleanups = [];
152
- if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute("data-inert")) {
153
- originalBodyPointerEvents = document.body.style.pointerEvents;
154
- queueMicrotask(() => {
155
- doc.body.style.pointerEvents = "none";
156
- doc.body.setAttribute("data-inert", "");
157
- });
158
- }
159
- persistentElements?.forEach((el) => {
160
- const [promise, abort] = waitForElement(
161
- () => {
162
- const node2 = el();
163
- return isHTMLElement(node2) ? node2 : null;
164
- },
165
- { timeout: 1e3 }
166
- );
167
- promise.then((el2) => cleanups.push(setStyle(el2, { pointerEvents: "auto" })));
168
- cleanups.push(abort);
169
- });
170
- return () => {
171
- if (layerStack.hasPointerBlockingLayer()) return;
172
- queueMicrotask(() => {
173
- doc.body.style.pointerEvents = originalBodyPointerEvents;
174
- doc.body.removeAttribute("data-inert");
175
- if (doc.body.style.length === 0) doc.body.removeAttribute("style");
176
- });
177
- cleanups.forEach((fn) => fn());
178
- };
179
- }
180
-
181
- // src/dismissable-layer.ts
182
- function trackDismissableElementImpl(node, options) {
183
- const { warnOnMissingNode = true } = options;
184
- if (warnOnMissingNode && !node) {
185
- warn("[@zag-js/dismissable] node is `null` or `undefined`");
186
- return;
187
- }
188
- if (!node) {
189
- return;
190
- }
191
- const { onDismiss, onRequestDismiss, pointerBlocking, exclude: excludeContainers, debug, type = "dialog" } = options;
192
- const layer = { dismiss: onDismiss, node, type, pointerBlocking, requestDismiss: onRequestDismiss };
193
- layerStack.add(layer);
194
- assignPointerEventToLayers();
195
- function onPointerDownOutside(event) {
196
- const target = getEventTarget(event.detail.originalEvent);
197
- if (layerStack.isBelowPointerBlockingLayer(node) || layerStack.isInBranch(target)) return;
198
- options.onPointerDownOutside?.(event);
199
- options.onInteractOutside?.(event);
200
- if (event.defaultPrevented) return;
201
- if (debug) {
202
- console.log("onPointerDownOutside:", event.detail.originalEvent);
203
- }
204
- onDismiss?.();
205
- }
206
- function onFocusOutside(event) {
207
- const target = getEventTarget(event.detail.originalEvent);
208
- if (layerStack.isInBranch(target)) return;
209
- options.onFocusOutside?.(event);
210
- options.onInteractOutside?.(event);
211
- if (event.defaultPrevented) return;
212
- if (debug) {
213
- console.log("onFocusOutside:", event.detail.originalEvent);
214
- }
215
- onDismiss?.();
216
- }
217
- function onEscapeKeyDown(event) {
218
- if (!layerStack.isTopMost(node)) return;
219
- options.onEscapeKeyDown?.(event);
220
- if (!event.defaultPrevented && onDismiss) {
221
- event.preventDefault();
222
- onDismiss();
223
- }
224
- }
225
- function exclude(target) {
226
- if (!node) return false;
227
- const containers = typeof excludeContainers === "function" ? excludeContainers() : excludeContainers;
228
- const _containers = Array.isArray(containers) ? containers : [containers];
229
- const persistentElements = options.persistentElements?.map((fn) => fn()).filter(isHTMLElement);
230
- if (persistentElements) _containers.push(...persistentElements);
231
- return _containers.some((node2) => contains(node2, target)) || layerStack.isInNestedLayer(node, target);
232
- }
233
- const cleanups = [
234
- pointerBlocking ? disablePointerEventsOutside(node, options.persistentElements) : void 0,
235
- trackEscapeKeydown(node, onEscapeKeyDown),
236
- trackInteractOutside(node, { exclude, onFocusOutside, onPointerDownOutside, defer: options.defer })
237
- ];
238
- return () => {
239
- layerStack.remove(node);
240
- assignPointerEventToLayers();
241
- clearPointerEvent(node);
242
- cleanups.forEach((fn) => fn?.());
243
- };
244
- }
245
- function trackDismissableElement(nodeOrFn, options) {
246
- const { defer } = options;
247
- const func = defer ? raf : (v) => v();
248
- const cleanups = [];
249
- cleanups.push(
250
- func(() => {
251
- const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn;
252
- cleanups.push(trackDismissableElementImpl(node, options));
253
- })
254
- );
255
- return () => {
256
- cleanups.forEach((fn) => fn?.());
257
- };
258
- }
259
- function trackDismissableBranch(nodeOrFn, options = {}) {
260
- const { defer } = options;
261
- const func = defer ? raf : (v) => v();
262
- const cleanups = [];
263
- cleanups.push(
264
- func(() => {
265
- const node = isFunction(nodeOrFn) ? nodeOrFn() : nodeOrFn;
266
- if (!node) {
267
- warn("[@zag-js/dismissable] branch node is `null` or `undefined`");
268
- return;
269
- }
270
- layerStack.addBranch(node);
271
- cleanups.push(() => {
272
- layerStack.removeBranch(node);
273
- });
274
- })
275
- );
276
- return () => {
277
- cleanups.forEach((fn) => fn?.());
278
- };
279
- }
280
-
281
- export { trackDismissableBranch, trackDismissableElement };
1
+ // src/index.ts
2
+ export * from "./dismissable-layer.mjs";
@@ -0,0 +1,43 @@
1
+ type LayerType = "dialog" | "popover" | "menu" | "listbox" | (string & {});
2
+ type LayerDismissEventDetail = {
3
+ originalLayer: HTMLElement;
4
+ targetLayer: HTMLElement | undefined;
5
+ originalIndex: number;
6
+ targetIndex: number;
7
+ };
8
+ type LayerDismissEvent = CustomEvent<LayerDismissEventDetail>;
9
+ interface Layer {
10
+ dismiss: VoidFunction;
11
+ node: HTMLElement;
12
+ type: LayerType;
13
+ pointerBlocking?: boolean | undefined;
14
+ requestDismiss?: ((event: LayerDismissEvent) => void) | undefined;
15
+ }
16
+ declare const layerStack: {
17
+ layers: Layer[];
18
+ branches: HTMLElement[];
19
+ recentlyRemoved: Set<HTMLElement>;
20
+ count(): number;
21
+ pointerBlockingLayers(): Layer[];
22
+ topMostPointerBlockingLayer(): Layer | undefined;
23
+ hasPointerBlockingLayer(): boolean;
24
+ isBelowPointerBlockingLayer(node: HTMLElement): boolean;
25
+ isTopMost(node: HTMLElement | null): boolean;
26
+ getNestedLayers(node: HTMLElement): Layer[];
27
+ getLayersByType(type: LayerType): Layer[];
28
+ getNestedLayersByType(node: HTMLElement, type: LayerType): Layer[];
29
+ getParentLayerOfType(node: HTMLElement, type: LayerType): Layer | undefined;
30
+ countNestedLayersOfType(node: HTMLElement, type: LayerType): number;
31
+ isInNestedLayer(node: HTMLElement, target: HTMLElement | EventTarget | null): boolean;
32
+ isInBranch(target: HTMLElement | EventTarget | null): boolean;
33
+ add(layer: Layer): void;
34
+ addBranch(node: HTMLElement): void;
35
+ remove(node: HTMLElement): void;
36
+ removeBranch(node: HTMLElement): void;
37
+ syncLayers(): void;
38
+ indexOf(node: HTMLElement | undefined): number;
39
+ dismiss(node: HTMLElement, parent?: HTMLElement): void;
40
+ clear(): void;
41
+ };
42
+
43
+ export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerType, layerStack };
@@ -0,0 +1,43 @@
1
+ type LayerType = "dialog" | "popover" | "menu" | "listbox" | (string & {});
2
+ type LayerDismissEventDetail = {
3
+ originalLayer: HTMLElement;
4
+ targetLayer: HTMLElement | undefined;
5
+ originalIndex: number;
6
+ targetIndex: number;
7
+ };
8
+ type LayerDismissEvent = CustomEvent<LayerDismissEventDetail>;
9
+ interface Layer {
10
+ dismiss: VoidFunction;
11
+ node: HTMLElement;
12
+ type: LayerType;
13
+ pointerBlocking?: boolean | undefined;
14
+ requestDismiss?: ((event: LayerDismissEvent) => void) | undefined;
15
+ }
16
+ declare const layerStack: {
17
+ layers: Layer[];
18
+ branches: HTMLElement[];
19
+ recentlyRemoved: Set<HTMLElement>;
20
+ count(): number;
21
+ pointerBlockingLayers(): Layer[];
22
+ topMostPointerBlockingLayer(): Layer | undefined;
23
+ hasPointerBlockingLayer(): boolean;
24
+ isBelowPointerBlockingLayer(node: HTMLElement): boolean;
25
+ isTopMost(node: HTMLElement | null): boolean;
26
+ getNestedLayers(node: HTMLElement): Layer[];
27
+ getLayersByType(type: LayerType): Layer[];
28
+ getNestedLayersByType(node: HTMLElement, type: LayerType): Layer[];
29
+ getParentLayerOfType(node: HTMLElement, type: LayerType): Layer | undefined;
30
+ countNestedLayersOfType(node: HTMLElement, type: LayerType): number;
31
+ isInNestedLayer(node: HTMLElement, target: HTMLElement | EventTarget | null): boolean;
32
+ isInBranch(target: HTMLElement | EventTarget | null): boolean;
33
+ add(layer: Layer): void;
34
+ addBranch(node: HTMLElement): void;
35
+ remove(node: HTMLElement): void;
36
+ removeBranch(node: HTMLElement): void;
37
+ syncLayers(): void;
38
+ indexOf(node: HTMLElement | undefined): number;
39
+ dismiss(node: HTMLElement, parent?: HTMLElement): void;
40
+ clear(): void;
41
+ };
42
+
43
+ export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerType, layerStack };