@zag-js/dismissable 1.43.0 → 2.0.0-next.1

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.
@@ -1,6 +1,6 @@
1
1
  import { InteractOutsideHandlers } from '@zag-js/interact-outside';
2
2
  import { MaybeFunction } from '@zag-js/utils';
3
- import { LayerDismissEvent, LayerStyleTarget, LayerType } from './layer-stack.mjs';
3
+ import { LayerDismissEvent, LayerSnapshot, LayerType } from './layer-stack.mjs';
4
4
 
5
5
  type MaybeElement = HTMLElement | null;
6
6
  type Container = MaybeElement | Array<MaybeElement>;
@@ -25,11 +25,9 @@ interface PersistentElementOptions {
25
25
  }
26
26
  interface DismissableElementOptions extends DismissableElementHandlers, PersistentElementOptions {
27
27
  /**
28
- * Extra elements that receive the same layer stack CSS vars, `data-*`, and `--z-index`
29
- * (from the primary node's computed `z-index`) as the dismissable node
30
- * (e.g. dialog backdrop + positioner when the node is content).
28
+ * Function called when the layer's position or nesting state changes.
31
29
  */
32
- layerStyleTargets?: LayerStyleTarget[] | undefined;
30
+ onLayerChange: (snapshot: LayerSnapshot) => void;
33
31
  /**
34
32
  * Whether to log debug information
35
33
  */
@@ -1,6 +1,6 @@
1
1
  import { InteractOutsideHandlers } from '@zag-js/interact-outside';
2
2
  import { MaybeFunction } from '@zag-js/utils';
3
- import { LayerDismissEvent, LayerStyleTarget, LayerType } from './layer-stack.js';
3
+ import { LayerDismissEvent, LayerSnapshot, LayerType } from './layer-stack.js';
4
4
 
5
5
  type MaybeElement = HTMLElement | null;
6
6
  type Container = MaybeElement | Array<MaybeElement>;
@@ -25,11 +25,9 @@ interface PersistentElementOptions {
25
25
  }
26
26
  interface DismissableElementOptions extends DismissableElementHandlers, PersistentElementOptions {
27
27
  /**
28
- * Extra elements that receive the same layer stack CSS vars, `data-*`, and `--z-index`
29
- * (from the primary node's computed `z-index`) as the dismissable node
30
- * (e.g. dialog backdrop + positioner when the node is content).
28
+ * Function called when the layer's position or nesting state changes.
31
29
  */
32
- layerStyleTargets?: LayerStyleTarget[] | undefined;
30
+ onLayerChange: (snapshot: LayerSnapshot) => void;
33
31
  /**
34
32
  * Whether to log debug information
35
33
  */
@@ -46,7 +46,7 @@ function trackDismissableElementImpl(node, options) {
46
46
  exclude: excludeContainers,
47
47
  debug,
48
48
  type = "dialog",
49
- layerStyleTargets
49
+ onLayerChange
50
50
  } = options;
51
51
  const layer = {
52
52
  dismiss: onDismiss,
@@ -54,10 +54,9 @@ function trackDismissableElementImpl(node, options) {
54
54
  type,
55
55
  pointerBlocking,
56
56
  requestDismiss: onRequestDismiss,
57
- styleTargets: layerStyleTargets
57
+ onLayerChange
58
58
  };
59
59
  import_layer_stack.layerStack.add(layer);
60
- (0, import_pointer_event_outside.assignPointerEventToLayers)();
61
60
  function onPointerDownOutside(event) {
62
61
  const target = (0, import_dom_query.getEventTarget)(event.detail.originalEvent);
63
62
  if (import_layer_stack.layerStack.isBelowPointerBlockingLayer(node) || import_layer_stack.layerStack.isInBranch(target)) return;
@@ -103,8 +102,6 @@ function trackDismissableElementImpl(node, options) {
103
102
  ];
104
103
  return () => {
105
104
  import_layer_stack.layerStack.remove(node);
106
- (0, import_pointer_event_outside.assignPointerEventToLayers)();
107
- (0, import_pointer_event_outside.clearPointerEvent)(node);
108
105
  cleanups.forEach((fn) => fn?.());
109
106
  };
110
107
  }
@@ -6,7 +6,7 @@ import {
6
6
  import { isFunction, warn } from "@zag-js/utils";
7
7
  import { trackEscapeKeydown } from "./escape-keydown.mjs";
8
8
  import { layerStack } from "./layer-stack.mjs";
9
- import { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside } from "./pointer-event-outside.mjs";
9
+ import { disablePointerEventsOutside } from "./pointer-event-outside.mjs";
10
10
  function trackDismissableElementImpl(node, options) {
11
11
  const { warnOnMissingNode = true } = options;
12
12
  if (warnOnMissingNode && !node) {
@@ -23,7 +23,7 @@ function trackDismissableElementImpl(node, options) {
23
23
  exclude: excludeContainers,
24
24
  debug,
25
25
  type = "dialog",
26
- layerStyleTargets
26
+ onLayerChange
27
27
  } = options;
28
28
  const layer = {
29
29
  dismiss: onDismiss,
@@ -31,10 +31,9 @@ function trackDismissableElementImpl(node, options) {
31
31
  type,
32
32
  pointerBlocking,
33
33
  requestDismiss: onRequestDismiss,
34
- styleTargets: layerStyleTargets
34
+ onLayerChange
35
35
  };
36
36
  layerStack.add(layer);
37
- assignPointerEventToLayers();
38
37
  function onPointerDownOutside(event) {
39
38
  const target = getEventTarget(event.detail.originalEvent);
40
39
  if (layerStack.isBelowPointerBlockingLayer(node) || layerStack.isInBranch(target)) return;
@@ -80,8 +79,6 @@ function trackDismissableElementImpl(node, options) {
80
79
  ];
81
80
  return () => {
82
81
  layerStack.remove(node);
83
- assignPointerEventToLayers();
84
- clearPointerEvent(node);
85
82
  cleanups.forEach((fn) => fn?.());
86
83
  };
87
84
  }
package/dist/index.d.mts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { FocusOutsideEvent, InteractOutsideEvent, InteractOutsideHandlers, PointerDownOutsideEvent } from '@zag-js/interact-outside';
2
2
  export { DismissableElementHandlers, DismissableElementOptions, PersistentElementOptions, trackDismissableBranch, trackDismissableElement } from './dismissable-layer.mjs';
3
- export { LayerStyleTarget, LayerType } from './layer-stack.mjs';
3
+ export { DismissableLayerStyle, DismissableLayerStyleOptions, getDismissableLayerAttrs, getDismissableLayerStyle } from './layer-props.mjs';
4
+ export { LayerSnapshot, LayerType } from './layer-stack.mjs';
4
5
  import '@zag-js/utils';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { FocusOutsideEvent, InteractOutsideEvent, InteractOutsideHandlers, PointerDownOutsideEvent } from '@zag-js/interact-outside';
2
2
  export { DismissableElementHandlers, DismissableElementOptions, PersistentElementOptions, trackDismissableBranch, trackDismissableElement } from './dismissable-layer.js';
3
- export { LayerStyleTarget, LayerType } from './layer-stack.js';
3
+ export { DismissableLayerStyle, DismissableLayerStyleOptions, getDismissableLayerAttrs, getDismissableLayerStyle } from './layer-props.js';
4
+ export { LayerSnapshot, LayerType } from './layer-stack.js';
4
5
  import '@zag-js/utils';
package/dist/index.js CHANGED
@@ -18,7 +18,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
18
18
  var index_exports = {};
19
19
  module.exports = __toCommonJS(index_exports);
20
20
  __reExport(index_exports, require("./dismissable-layer.js"), module.exports);
21
+ __reExport(index_exports, require("./layer-props.js"), module.exports);
21
22
  // Annotate the CommonJS export names for ESM import in node:
22
23
  0 && (module.exports = {
23
- ...require("./dismissable-layer.js")
24
+ ...require("./dismissable-layer.js"),
25
+ ...require("./layer-props.js")
24
26
  });
package/dist/index.mjs CHANGED
@@ -1,2 +1,3 @@
1
1
  // src/index.ts
2
2
  export * from "./dismissable-layer.mjs";
3
+ export * from "./layer-props.mjs";
@@ -0,0 +1,30 @@
1
+ import { LayerSnapshot, LayerType } from './layer-stack.mjs';
2
+
3
+ declare function getDismissableLayerAttrs(layer: LayerSnapshot | null | undefined): {
4
+ "data-nested": LayerType | undefined;
5
+ "data-has-nested": LayerType | undefined;
6
+ };
7
+ interface DismissableLayerStyleOptions {
8
+ /**
9
+ * Set `--z-index: var(--layer-index)` on the element that establishes the actual
10
+ * stacking context (backdrop / positioner). Content parts sit inside that stacking
11
+ * context already, so they don't need this.
12
+ */
13
+ zIndex?: boolean;
14
+ /**
15
+ * Set `pointer-events: none` while a pointer-blocking layer sits above this one.
16
+ * Omit for elements (like popper positioners) that already manage their own
17
+ * `pointer-events`.
18
+ */
19
+ pointerEvents?: boolean;
20
+ }
21
+ interface DismissableLayerStyle {
22
+ [key: string]: string | undefined;
23
+ "--layer-index"?: string | undefined;
24
+ "--nested-layer-count"?: string | undefined;
25
+ "--z-index"?: string | undefined;
26
+ pointerEvents?: "none" | "auto" | undefined;
27
+ }
28
+ declare function getDismissableLayerStyle(layer: LayerSnapshot | null | undefined, options?: DismissableLayerStyleOptions): DismissableLayerStyle;
29
+
30
+ export { type DismissableLayerStyle, type DismissableLayerStyleOptions, getDismissableLayerAttrs, getDismissableLayerStyle };
@@ -0,0 +1,30 @@
1
+ import { LayerSnapshot, LayerType } from './layer-stack.js';
2
+
3
+ declare function getDismissableLayerAttrs(layer: LayerSnapshot | null | undefined): {
4
+ "data-nested": LayerType | undefined;
5
+ "data-has-nested": LayerType | undefined;
6
+ };
7
+ interface DismissableLayerStyleOptions {
8
+ /**
9
+ * Set `--z-index: var(--layer-index)` on the element that establishes the actual
10
+ * stacking context (backdrop / positioner). Content parts sit inside that stacking
11
+ * context already, so they don't need this.
12
+ */
13
+ zIndex?: boolean;
14
+ /**
15
+ * Set `pointer-events: none` while a pointer-blocking layer sits above this one.
16
+ * Omit for elements (like popper positioners) that already manage their own
17
+ * `pointer-events`.
18
+ */
19
+ pointerEvents?: boolean;
20
+ }
21
+ interface DismissableLayerStyle {
22
+ [key: string]: string | undefined;
23
+ "--layer-index"?: string | undefined;
24
+ "--nested-layer-count"?: string | undefined;
25
+ "--z-index"?: string | undefined;
26
+ pointerEvents?: "none" | "auto" | undefined;
27
+ }
28
+ declare function getDismissableLayerStyle(layer: LayerSnapshot | null | undefined, options?: DismissableLayerStyleOptions): DismissableLayerStyle;
29
+
30
+ export { type DismissableLayerStyle, type DismissableLayerStyleOptions, getDismissableLayerAttrs, getDismissableLayerStyle };
@@ -0,0 +1,48 @@
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/layer-props.ts
21
+ var layer_props_exports = {};
22
+ __export(layer_props_exports, {
23
+ getDismissableLayerAttrs: () => getDismissableLayerAttrs,
24
+ getDismissableLayerStyle: () => getDismissableLayerStyle
25
+ });
26
+ module.exports = __toCommonJS(layer_props_exports);
27
+ function getDismissableLayerAttrs(layer) {
28
+ return {
29
+ "data-nested": layer?.nested ? layer.type : void 0,
30
+ "data-has-nested": layer?.hasNested ? layer.type : void 0
31
+ };
32
+ }
33
+ function getDismissableLayerStyle(layer, options = {}) {
34
+ const style = {
35
+ "--layer-index": layer ? `${layer.index}` : void 0,
36
+ "--nested-layer-count": layer ? `${layer.nestedCount}` : void 0,
37
+ "--z-index": options.zIndex && layer ? "var(--layer-index)" : void 0
38
+ };
39
+ if (options.pointerEvents) {
40
+ style.pointerEvents = layer?.active ? layer.blocked ? "none" : "auto" : void 0;
41
+ }
42
+ return style;
43
+ }
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ getDismissableLayerAttrs,
47
+ getDismissableLayerStyle
48
+ });
@@ -0,0 +1,22 @@
1
+ // src/layer-props.ts
2
+ function getDismissableLayerAttrs(layer) {
3
+ return {
4
+ "data-nested": layer?.nested ? layer.type : void 0,
5
+ "data-has-nested": layer?.hasNested ? layer.type : void 0
6
+ };
7
+ }
8
+ function getDismissableLayerStyle(layer, options = {}) {
9
+ const style = {
10
+ "--layer-index": layer ? `${layer.index}` : void 0,
11
+ "--nested-layer-count": layer ? `${layer.nestedCount}` : void 0,
12
+ "--z-index": options.zIndex && layer ? "var(--layer-index)" : void 0
13
+ };
14
+ if (options.pointerEvents) {
15
+ style.pointerEvents = layer?.active ? layer.blocked ? "none" : "auto" : void 0;
16
+ }
17
+ return style;
18
+ }
19
+ export {
20
+ getDismissableLayerAttrs,
21
+ getDismissableLayerStyle
22
+ };
@@ -6,14 +6,23 @@ type LayerDismissEventDetail = {
6
6
  targetIndex: number;
7
7
  };
8
8
  type LayerDismissEvent = CustomEvent<LayerDismissEventDetail>;
9
- type LayerStyleTarget = () => HTMLElement | null;
9
+ interface LayerSnapshot {
10
+ active: boolean;
11
+ type: LayerType;
12
+ index: number;
13
+ nested: boolean;
14
+ hasNested: boolean;
15
+ nestedCount: number;
16
+ blocked: boolean;
17
+ }
10
18
  interface Layer {
11
19
  dismiss: VoidFunction;
12
20
  node: HTMLElement;
13
21
  type: LayerType;
14
22
  pointerBlocking?: boolean | undefined;
15
23
  requestDismiss?: ((event: LayerDismissEvent) => void) | undefined;
16
- styleTargets?: LayerStyleTarget[] | undefined;
24
+ onLayerChange?: ((snapshot: LayerSnapshot) => void) | undefined;
25
+ snapshot?: LayerSnapshot | undefined;
17
26
  }
18
27
  declare const layerStack: {
19
28
  layers: Layer[];
@@ -42,4 +51,4 @@ declare const layerStack: {
42
51
  clear(): void;
43
52
  };
44
53
 
45
- export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerStyleTarget, type LayerType, layerStack };
54
+ export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerSnapshot, type LayerType, layerStack };
@@ -6,14 +6,23 @@ type LayerDismissEventDetail = {
6
6
  targetIndex: number;
7
7
  };
8
8
  type LayerDismissEvent = CustomEvent<LayerDismissEventDetail>;
9
- type LayerStyleTarget = () => HTMLElement | null;
9
+ interface LayerSnapshot {
10
+ active: boolean;
11
+ type: LayerType;
12
+ index: number;
13
+ nested: boolean;
14
+ hasNested: boolean;
15
+ nestedCount: number;
16
+ blocked: boolean;
17
+ }
10
18
  interface Layer {
11
19
  dismiss: VoidFunction;
12
20
  node: HTMLElement;
13
21
  type: LayerType;
14
22
  pointerBlocking?: boolean | undefined;
15
23
  requestDismiss?: ((event: LayerDismissEvent) => void) | undefined;
16
- styleTargets?: LayerStyleTarget[] | undefined;
24
+ onLayerChange?: ((snapshot: LayerSnapshot) => void) | undefined;
25
+ snapshot?: LayerSnapshot | undefined;
17
26
  }
18
27
  declare const layerStack: {
19
28
  layers: Layer[];
@@ -42,4 +51,4 @@ declare const layerStack: {
42
51
  clear(): void;
43
52
  };
44
53
 
45
- export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerStyleTarget, type LayerType, layerStack };
54
+ export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerSnapshot, type LayerType, layerStack };
@@ -24,6 +24,7 @@ __export(layer_stack_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(layer_stack_exports);
26
26
  var import_dom_query = require("@zag-js/dom-query");
27
+ var import_utils = require("@zag-js/utils");
27
28
  var LAYER_REQUEST_DISMISS_EVENT = "layer:request-dismiss";
28
29
  var layerStack = {
29
30
  layers: [],
@@ -93,12 +94,9 @@ var layerStack = {
93
94
  const index = this.indexOf(node);
94
95
  if (index < 0) return;
95
96
  const layer = this.layers[index];
96
- layer.styleTargets?.forEach((getTarget) => {
97
- const target = getTarget();
98
- if (target) {
99
- clearLayerStyleMirror(target);
100
- }
101
- });
97
+ if (layer.snapshot) {
98
+ publishSnapshot(layer, { ...layer.snapshot, active: false, blocked: false });
99
+ }
102
100
  this.recentlyRemoved.add(node);
103
101
  (0, import_dom_query.nextTick)(() => this.recentlyRemoved.delete(node));
104
102
  if (index < this.count() - 1) {
@@ -114,14 +112,20 @@ var layerStack = {
114
112
  },
115
113
  syncLayers() {
116
114
  this.layers.forEach((layer, index) => {
117
- applyLayerStackMetadata(layer, index, layer.node);
118
- layer.styleTargets?.forEach((getTarget) => {
119
- const target = getTarget();
120
- if (!target || target === layer.node) return;
121
- applyLayerStackMetadata(layer, index, target);
122
- const { zIndex } = (0, import_dom_query.getComputedStyle)(layer.node);
123
- target.style.setProperty("--z-index", zIndex);
124
- });
115
+ const parentOfSameType = layerStack.getParentLayerOfType(layer.node, layer.type);
116
+ const nestedCount = layerStack.countNestedLayersOfType(layer.node, layer.type);
117
+ const snapshot = {
118
+ active: true,
119
+ type: layer.type,
120
+ index,
121
+ nested: parentOfSameType != null,
122
+ hasNested: nestedCount > 0,
123
+ nestedCount,
124
+ blocked: layerStack.isBelowPointerBlockingLayer(layer.node)
125
+ };
126
+ if (!(0, import_utils.isEqual)(layer.snapshot, snapshot)) {
127
+ publishSnapshot(layer, snapshot);
128
+ }
125
129
  });
126
130
  },
127
131
  indexOf(node) {
@@ -149,26 +153,9 @@ var layerStack = {
149
153
  this.remove(this.layers[0].node);
150
154
  }
151
155
  };
152
- function applyLayerStackMetadata(layer, index, el) {
153
- el.style.setProperty("--layer-index", `${index}`);
154
- el.removeAttribute("data-nested");
155
- el.removeAttribute("data-has-nested");
156
- const parentOfSameType = layerStack.getParentLayerOfType(layer.node, layer.type);
157
- if (parentOfSameType) {
158
- el.setAttribute("data-nested", layer.type);
159
- }
160
- const nestedCount = layerStack.countNestedLayersOfType(layer.node, layer.type);
161
- if (nestedCount > 0) {
162
- el.setAttribute("data-has-nested", layer.type);
163
- }
164
- el.style.setProperty("--nested-layer-count", `${nestedCount}`);
165
- }
166
- function clearLayerStyleMirror(el) {
167
- el.style.removeProperty("--layer-index");
168
- el.style.removeProperty("--nested-layer-count");
169
- el.style.removeProperty("--z-index");
170
- el.removeAttribute("data-nested");
171
- el.removeAttribute("data-has-nested");
156
+ function publishSnapshot(layer, snapshot) {
157
+ layer.snapshot = snapshot;
158
+ layer.onLayerChange?.(snapshot);
172
159
  }
173
160
  function fireCustomEvent(el, type, detail) {
174
161
  const win = el.ownerDocument.defaultView || window;
@@ -1,5 +1,6 @@
1
1
  // src/layer-stack.ts
2
- import { contains, nextTick, getComputedStyle } from "@zag-js/dom-query";
2
+ import { contains, nextTick } from "@zag-js/dom-query";
3
+ import { isEqual } from "@zag-js/utils";
3
4
  var LAYER_REQUEST_DISMISS_EVENT = "layer:request-dismiss";
4
5
  var layerStack = {
5
6
  layers: [],
@@ -69,12 +70,9 @@ var layerStack = {
69
70
  const index = this.indexOf(node);
70
71
  if (index < 0) return;
71
72
  const layer = this.layers[index];
72
- layer.styleTargets?.forEach((getTarget) => {
73
- const target = getTarget();
74
- if (target) {
75
- clearLayerStyleMirror(target);
76
- }
77
- });
73
+ if (layer.snapshot) {
74
+ publishSnapshot(layer, { ...layer.snapshot, active: false, blocked: false });
75
+ }
78
76
  this.recentlyRemoved.add(node);
79
77
  nextTick(() => this.recentlyRemoved.delete(node));
80
78
  if (index < this.count() - 1) {
@@ -90,14 +88,20 @@ var layerStack = {
90
88
  },
91
89
  syncLayers() {
92
90
  this.layers.forEach((layer, index) => {
93
- applyLayerStackMetadata(layer, index, layer.node);
94
- layer.styleTargets?.forEach((getTarget) => {
95
- const target = getTarget();
96
- if (!target || target === layer.node) return;
97
- applyLayerStackMetadata(layer, index, target);
98
- const { zIndex } = getComputedStyle(layer.node);
99
- target.style.setProperty("--z-index", zIndex);
100
- });
91
+ const parentOfSameType = layerStack.getParentLayerOfType(layer.node, layer.type);
92
+ const nestedCount = layerStack.countNestedLayersOfType(layer.node, layer.type);
93
+ const snapshot = {
94
+ active: true,
95
+ type: layer.type,
96
+ index,
97
+ nested: parentOfSameType != null,
98
+ hasNested: nestedCount > 0,
99
+ nestedCount,
100
+ blocked: layerStack.isBelowPointerBlockingLayer(layer.node)
101
+ };
102
+ if (!isEqual(layer.snapshot, snapshot)) {
103
+ publishSnapshot(layer, snapshot);
104
+ }
101
105
  });
102
106
  },
103
107
  indexOf(node) {
@@ -125,26 +129,9 @@ var layerStack = {
125
129
  this.remove(this.layers[0].node);
126
130
  }
127
131
  };
128
- function applyLayerStackMetadata(layer, index, el) {
129
- el.style.setProperty("--layer-index", `${index}`);
130
- el.removeAttribute("data-nested");
131
- el.removeAttribute("data-has-nested");
132
- const parentOfSameType = layerStack.getParentLayerOfType(layer.node, layer.type);
133
- if (parentOfSameType) {
134
- el.setAttribute("data-nested", layer.type);
135
- }
136
- const nestedCount = layerStack.countNestedLayersOfType(layer.node, layer.type);
137
- if (nestedCount > 0) {
138
- el.setAttribute("data-has-nested", layer.type);
139
- }
140
- el.style.setProperty("--nested-layer-count", `${nestedCount}`);
141
- }
142
- function clearLayerStyleMirror(el) {
143
- el.style.removeProperty("--layer-index");
144
- el.style.removeProperty("--nested-layer-count");
145
- el.style.removeProperty("--z-index");
146
- el.removeAttribute("data-nested");
147
- el.removeAttribute("data-has-nested");
132
+ function publishSnapshot(layer, snapshot) {
133
+ layer.snapshot = snapshot;
134
+ layer.onLayerChange?.(snapshot);
148
135
  }
149
136
  function fireCustomEvent(el, type, detail) {
150
137
  const win = el.ownerDocument.defaultView || window;
@@ -1,5 +1,3 @@
1
- declare function assignPointerEventToLayers(): void;
2
- declare function clearPointerEvent(node: HTMLElement): void;
3
1
  declare function disablePointerEventsOutside(node: HTMLElement, persistentElements?: Array<() => Element | null>): () => void;
4
2
 
5
- export { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside };
3
+ export { disablePointerEventsOutside };
@@ -1,5 +1,3 @@
1
- declare function assignPointerEventToLayers(): void;
2
- declare function clearPointerEvent(node: HTMLElement): void;
3
1
  declare function disablePointerEventsOutside(node: HTMLElement, persistentElements?: Array<() => Element | null>): () => void;
4
2
 
5
- export { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside };
3
+ export { disablePointerEventsOutside };
@@ -20,49 +20,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/pointer-event-outside.ts
21
21
  var pointer_event_outside_exports = {};
22
22
  __export(pointer_event_outside_exports, {
23
- assignPointerEventToLayers: () => assignPointerEventToLayers,
24
- clearPointerEvent: () => clearPointerEvent,
25
23
  disablePointerEventsOutside: () => disablePointerEventsOutside
26
24
  });
27
25
  module.exports = __toCommonJS(pointer_event_outside_exports);
28
26
  var import_dom_query = require("@zag-js/dom-query");
29
27
  var import_layer_stack = require("./layer-stack.js");
30
28
  var originalBodyPointerEvents = /* @__PURE__ */ new WeakMap();
31
- var layerObservers = /* @__PURE__ */ new WeakMap();
32
- function getDesiredPointerEvents(node) {
33
- return import_layer_stack.layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
34
- }
35
- function applyPointerEvents(node) {
36
- const desired = getDesiredPointerEvents(node);
37
- if (node.style.pointerEvents !== desired) {
38
- node.style.pointerEvents = desired;
39
- }
40
- }
41
- function ensurePointerEventsObserver(node) {
42
- if (layerObservers.has(node)) return;
43
- const win = (0, import_dom_query.getWindow)(node);
44
- if (typeof win.MutationObserver === "undefined") return;
45
- const observer = new win.MutationObserver(() => {
46
- if (!layerObservers.has(node)) return;
47
- applyPointerEvents(node);
48
- });
49
- observer.observe(node, { attributes: true, attributeFilter: ["style"] });
50
- layerObservers.set(node, observer);
51
- }
52
- function assignPointerEventToLayers() {
53
- import_layer_stack.layerStack.layers.forEach(({ node }) => {
54
- applyPointerEvents(node);
55
- ensurePointerEventsObserver(node);
56
- });
57
- }
58
- function clearPointerEvent(node) {
59
- const observer = layerObservers.get(node);
60
- if (observer) {
61
- observer.disconnect();
62
- layerObservers.delete(node);
63
- }
64
- node.style.pointerEvents = "";
65
- }
66
29
  function disablePointerEventsOutside(node, persistentElements) {
67
30
  const doc = (0, import_dom_query.getDocument)(node);
68
31
  const cleanups = [];
@@ -104,7 +67,5 @@ function disablePointerEventsOutside(node, persistentElements) {
104
67
  }
105
68
  // Annotate the CommonJS export names for ESM import in node:
106
69
  0 && (module.exports = {
107
- assignPointerEventToLayers,
108
- clearPointerEvent,
109
70
  disablePointerEventsOutside
110
71
  });
@@ -1,42 +1,7 @@
1
1
  // src/pointer-event-outside.ts
2
- import { getDocument, getWindow, isHTMLElement, setStyle, waitForElement } from "@zag-js/dom-query";
2
+ import { getDocument, isHTMLElement, setStyle, waitForElement } from "@zag-js/dom-query";
3
3
  import { layerStack } from "./layer-stack.mjs";
4
4
  var originalBodyPointerEvents = /* @__PURE__ */ new WeakMap();
5
- var layerObservers = /* @__PURE__ */ new WeakMap();
6
- function getDesiredPointerEvents(node) {
7
- return layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
8
- }
9
- function applyPointerEvents(node) {
10
- const desired = getDesiredPointerEvents(node);
11
- if (node.style.pointerEvents !== desired) {
12
- node.style.pointerEvents = desired;
13
- }
14
- }
15
- function ensurePointerEventsObserver(node) {
16
- if (layerObservers.has(node)) return;
17
- const win = getWindow(node);
18
- if (typeof win.MutationObserver === "undefined") return;
19
- const observer = new win.MutationObserver(() => {
20
- if (!layerObservers.has(node)) return;
21
- applyPointerEvents(node);
22
- });
23
- observer.observe(node, { attributes: true, attributeFilter: ["style"] });
24
- layerObservers.set(node, observer);
25
- }
26
- function assignPointerEventToLayers() {
27
- layerStack.layers.forEach(({ node }) => {
28
- applyPointerEvents(node);
29
- ensurePointerEventsObserver(node);
30
- });
31
- }
32
- function clearPointerEvent(node) {
33
- const observer = layerObservers.get(node);
34
- if (observer) {
35
- observer.disconnect();
36
- layerObservers.delete(node);
37
- }
38
- node.style.pointerEvents = "";
39
- }
40
5
  function disablePointerEventsOutside(node, persistentElements) {
41
6
  const doc = getDocument(node);
42
7
  const cleanups = [];
@@ -77,7 +42,5 @@ function disablePointerEventsOutside(node, persistentElements) {
77
42
  };
78
43
  }
79
44
  export {
80
- assignPointerEventToLayers,
81
- clearPointerEvent,
82
45
  disablePointerEventsOutside
83
46
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/dismissable",
3
- "version": "1.43.0",
3
+ "version": "2.0.0-next.1",
4
4
  "description": "Dismissable layer utilities for the DOM",
5
5
  "keywords": [
6
6
  "js",
@@ -26,9 +26,9 @@
26
26
  "access": "public"
27
27
  },
28
28
  "dependencies": {
29
- "@zag-js/interact-outside": "1.43.0",
30
- "@zag-js/dom-query": "1.43.0",
31
- "@zag-js/utils": "1.43.0"
29
+ "@zag-js/dom-query": "2.0.0-next.1",
30
+ "@zag-js/utils": "2.0.0-next.1",
31
+ "@zag-js/interact-outside": "2.0.0-next.1"
32
32
  },
33
33
  "devDependencies": {
34
34
  "clean-package": "2.2.0"