@zag-js/dismissable 2.0.0-next.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.
- package/dist/dismissable-layer.d.mts +3 -5
- package/dist/dismissable-layer.d.ts +3 -5
- package/dist/dismissable-layer.js +2 -5
- package/dist/dismissable-layer.mjs +3 -6
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/index.mjs +1 -0
- package/dist/layer-props.d.mts +30 -0
- package/dist/layer-props.d.ts +30 -0
- package/dist/layer-props.js +48 -0
- package/dist/layer-props.mjs +22 -0
- package/dist/layer-stack.d.mts +12 -3
- package/dist/layer-stack.d.ts +12 -3
- package/dist/layer-stack.js +21 -34
- package/dist/layer-stack.mjs +22 -35
- package/dist/pointer-event-outside.d.mts +1 -3
- package/dist/pointer-event-outside.d.ts +1 -3
- package/dist/pointer-event-outside.js +7 -15
- package/dist/pointer-event-outside.mjs +7 -13
- package/package.json +8 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { InteractOutsideHandlers } from '@zag-js/interact-outside';
|
|
2
2
|
import { MaybeFunction } from '@zag-js/utils';
|
|
3
|
-
import { LayerDismissEvent,
|
|
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
|
-
*
|
|
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
|
-
|
|
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,
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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
|
@@ -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
|
+
};
|
package/dist/layer-stack.d.mts
CHANGED
|
@@ -6,14 +6,23 @@ type LayerDismissEventDetail = {
|
|
|
6
6
|
targetIndex: number;
|
|
7
7
|
};
|
|
8
8
|
type LayerDismissEvent = CustomEvent<LayerDismissEventDetail>;
|
|
9
|
-
|
|
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
|
-
|
|
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
|
|
54
|
+
export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerSnapshot, type LayerType, layerStack };
|
package/dist/layer-stack.d.ts
CHANGED
|
@@ -6,14 +6,23 @@ type LayerDismissEventDetail = {
|
|
|
6
6
|
targetIndex: number;
|
|
7
7
|
};
|
|
8
8
|
type LayerDismissEvent = CustomEvent<LayerDismissEventDetail>;
|
|
9
|
-
|
|
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
|
-
|
|
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
|
|
54
|
+
export { type Layer, type LayerDismissEvent, type LayerDismissEventDetail, type LayerSnapshot, type LayerType, layerStack };
|
package/dist/layer-stack.js
CHANGED
|
@@ -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.
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
118
|
-
layer.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
|
153
|
-
|
|
154
|
-
|
|
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;
|
package/dist/layer-stack.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/layer-stack.ts
|
|
2
|
-
import { contains, nextTick
|
|
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.
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
94
|
-
layer.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
129
|
-
|
|
130
|
-
|
|
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 {
|
|
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 {
|
|
3
|
+
export { disablePointerEventsOutside };
|
|
@@ -20,27 +20,17 @@ 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
|
-
var originalBodyPointerEvents;
|
|
31
|
-
function assignPointerEventToLayers() {
|
|
32
|
-
import_layer_stack.layerStack.layers.forEach(({ node }) => {
|
|
33
|
-
node.style.pointerEvents = import_layer_stack.layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
function clearPointerEvent(node) {
|
|
37
|
-
node.style.pointerEvents = "";
|
|
38
|
-
}
|
|
28
|
+
var originalBodyPointerEvents = /* @__PURE__ */ new WeakMap();
|
|
39
29
|
function disablePointerEventsOutside(node, persistentElements) {
|
|
40
30
|
const doc = (0, import_dom_query.getDocument)(node);
|
|
41
31
|
const cleanups = [];
|
|
42
32
|
if (import_layer_stack.layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute("data-inert")) {
|
|
43
|
-
originalBodyPointerEvents
|
|
33
|
+
originalBodyPointerEvents.set(doc.body, doc.body.style.pointerEvents);
|
|
44
34
|
queueMicrotask(() => {
|
|
45
35
|
const body = doc.body;
|
|
46
36
|
if (!body) return;
|
|
@@ -64,7 +54,11 @@ function disablePointerEventsOutside(node, persistentElements) {
|
|
|
64
54
|
queueMicrotask(() => {
|
|
65
55
|
const body = doc.body;
|
|
66
56
|
if (!body) return;
|
|
67
|
-
|
|
57
|
+
const original = originalBodyPointerEvents.get(body);
|
|
58
|
+
if (original !== void 0) {
|
|
59
|
+
body.style.pointerEvents = original;
|
|
60
|
+
originalBodyPointerEvents.delete(body);
|
|
61
|
+
}
|
|
68
62
|
body.removeAttribute("data-inert");
|
|
69
63
|
if (body.style.length === 0) body.removeAttribute("style");
|
|
70
64
|
});
|
|
@@ -73,7 +67,5 @@ function disablePointerEventsOutside(node, persistentElements) {
|
|
|
73
67
|
}
|
|
74
68
|
// Annotate the CommonJS export names for ESM import in node:
|
|
75
69
|
0 && (module.exports = {
|
|
76
|
-
assignPointerEventToLayers,
|
|
77
|
-
clearPointerEvent,
|
|
78
70
|
disablePointerEventsOutside
|
|
79
71
|
});
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
// src/pointer-event-outside.ts
|
|
2
2
|
import { getDocument, isHTMLElement, setStyle, waitForElement } from "@zag-js/dom-query";
|
|
3
3
|
import { layerStack } from "./layer-stack.mjs";
|
|
4
|
-
var originalBodyPointerEvents;
|
|
5
|
-
function assignPointerEventToLayers() {
|
|
6
|
-
layerStack.layers.forEach(({ node }) => {
|
|
7
|
-
node.style.pointerEvents = layerStack.isBelowPointerBlockingLayer(node) ? "none" : "auto";
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
function clearPointerEvent(node) {
|
|
11
|
-
node.style.pointerEvents = "";
|
|
12
|
-
}
|
|
4
|
+
var originalBodyPointerEvents = /* @__PURE__ */ new WeakMap();
|
|
13
5
|
function disablePointerEventsOutside(node, persistentElements) {
|
|
14
6
|
const doc = getDocument(node);
|
|
15
7
|
const cleanups = [];
|
|
16
8
|
if (layerStack.hasPointerBlockingLayer() && !doc.body.hasAttribute("data-inert")) {
|
|
17
|
-
originalBodyPointerEvents
|
|
9
|
+
originalBodyPointerEvents.set(doc.body, doc.body.style.pointerEvents);
|
|
18
10
|
queueMicrotask(() => {
|
|
19
11
|
const body = doc.body;
|
|
20
12
|
if (!body) return;
|
|
@@ -38,7 +30,11 @@ function disablePointerEventsOutside(node, persistentElements) {
|
|
|
38
30
|
queueMicrotask(() => {
|
|
39
31
|
const body = doc.body;
|
|
40
32
|
if (!body) return;
|
|
41
|
-
|
|
33
|
+
const original = originalBodyPointerEvents.get(body);
|
|
34
|
+
if (original !== void 0) {
|
|
35
|
+
body.style.pointerEvents = original;
|
|
36
|
+
originalBodyPointerEvents.delete(body);
|
|
37
|
+
}
|
|
42
38
|
body.removeAttribute("data-inert");
|
|
43
39
|
if (body.style.length === 0) body.removeAttribute("style");
|
|
44
40
|
});
|
|
@@ -46,7 +42,5 @@ function disablePointerEventsOutside(node, persistentElements) {
|
|
|
46
42
|
};
|
|
47
43
|
}
|
|
48
44
|
export {
|
|
49
|
-
assignPointerEventToLayers,
|
|
50
|
-
clearPointerEvent,
|
|
51
45
|
disablePointerEventsOutside
|
|
52
46
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/dismissable",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.1",
|
|
4
4
|
"description": "Dismissable layer utilities for the DOM",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -14,7 +14,10 @@
|
|
|
14
14
|
"author": "Segun Adebayo <sage@adebayosegun.com>",
|
|
15
15
|
"homepage": "https://github.com/chakra-ui/zag#readme",
|
|
16
16
|
"license": "MIT",
|
|
17
|
-
"repository":
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/chakra-ui/zag/tree/main/packages/utilities/interact-outside"
|
|
20
|
+
},
|
|
18
21
|
"sideEffects": false,
|
|
19
22
|
"files": [
|
|
20
23
|
"dist"
|
|
@@ -23,9 +26,9 @@
|
|
|
23
26
|
"access": "public"
|
|
24
27
|
},
|
|
25
28
|
"dependencies": {
|
|
26
|
-
"@zag-js/
|
|
27
|
-
"@zag-js/
|
|
28
|
-
"@zag-js/
|
|
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"
|
|
29
32
|
},
|
|
30
33
|
"devDependencies": {
|
|
31
34
|
"clean-package": "2.2.0"
|