@zag-js/aria-hidden 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.
@@ -0,0 +1,5 @@
1
+ declare const hideOthers: (originalTarget: Element | Element[], parentNode?: HTMLElement | null, markerName?: string, followControlledElements?: boolean) => VoidFunction | undefined;
2
+ declare const inertOthers: (originalTarget: Element | Element[], parentNode?: HTMLElement | null, markerName?: string, followControlledElements?: boolean) => VoidFunction | undefined;
3
+ declare const suppressOthers: (originalTarget: Element | Element[], parentNode?: HTMLElement, markerName?: string, followControlledElements?: boolean) => VoidFunction | undefined;
4
+
5
+ export { hideOthers, inertOthers, suppressOthers };
@@ -0,0 +1,5 @@
1
+ declare const hideOthers: (originalTarget: Element | Element[], parentNode?: HTMLElement | null, markerName?: string, followControlledElements?: boolean) => VoidFunction | undefined;
2
+ declare const inertOthers: (originalTarget: Element | Element[], parentNode?: HTMLElement | null, markerName?: string, followControlledElements?: boolean) => VoidFunction | undefined;
3
+ declare const suppressOthers: (originalTarget: Element | Element[], parentNode?: HTMLElement, markerName?: string, followControlledElements?: boolean) => VoidFunction | undefined;
4
+
5
+ export { hideOthers, inertOthers, suppressOthers };
@@ -0,0 +1,63 @@
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/aria-hidden.ts
21
+ var aria_hidden_exports = {};
22
+ __export(aria_hidden_exports, {
23
+ hideOthers: () => hideOthers,
24
+ inertOthers: () => inertOthers,
25
+ suppressOthers: () => suppressOthers
26
+ });
27
+ module.exports = __toCommonJS(aria_hidden_exports);
28
+ var import_walk_tree_outside = require("./walk-tree-outside.cjs");
29
+ var getParentNode = (originalTarget) => {
30
+ const target = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
31
+ return target.ownerDocument.body;
32
+ };
33
+ var hideOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-aria-hidden", followControlledElements = true) => {
34
+ if (!parentNode) return;
35
+ return (0, import_walk_tree_outside.walkTreeOutside)(originalTarget, {
36
+ parentNode,
37
+ markerName,
38
+ controlAttribute: "aria-hidden",
39
+ explicitBooleanValue: true,
40
+ followControlledElements
41
+ });
42
+ };
43
+ var inertOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-inerted", followControlledElements = true) => {
44
+ if (!parentNode) return;
45
+ return (0, import_walk_tree_outside.walkTreeOutside)(originalTarget, {
46
+ parentNode,
47
+ markerName,
48
+ controlAttribute: "inert",
49
+ explicitBooleanValue: false,
50
+ followControlledElements
51
+ });
52
+ };
53
+ var supportsInert = () => typeof HTMLElement !== "undefined" && HTMLElement.prototype.hasOwnProperty("inert");
54
+ var suppressOthers = (originalTarget, parentNode, markerName = "data-suppressed", followControlledElements = true) => {
55
+ const fn = supportsInert() ? inertOthers : hideOthers;
56
+ return fn(originalTarget, parentNode, markerName, followControlledElements);
57
+ };
58
+ // Annotate the CommonJS export names for ESM import in node:
59
+ 0 && (module.exports = {
60
+ hideOthers,
61
+ inertOthers,
62
+ suppressOthers
63
+ });
@@ -0,0 +1,36 @@
1
+ // src/aria-hidden.ts
2
+ import { walkTreeOutside } from "./walk-tree-outside.mjs";
3
+ var getParentNode = (originalTarget) => {
4
+ const target = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
5
+ return target.ownerDocument.body;
6
+ };
7
+ var hideOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-aria-hidden", followControlledElements = true) => {
8
+ if (!parentNode) return;
9
+ return walkTreeOutside(originalTarget, {
10
+ parentNode,
11
+ markerName,
12
+ controlAttribute: "aria-hidden",
13
+ explicitBooleanValue: true,
14
+ followControlledElements
15
+ });
16
+ };
17
+ var inertOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-inerted", followControlledElements = true) => {
18
+ if (!parentNode) return;
19
+ return walkTreeOutside(originalTarget, {
20
+ parentNode,
21
+ markerName,
22
+ controlAttribute: "inert",
23
+ explicitBooleanValue: false,
24
+ followControlledElements
25
+ });
26
+ };
27
+ var supportsInert = () => typeof HTMLElement !== "undefined" && HTMLElement.prototype.hasOwnProperty("inert");
28
+ var suppressOthers = (originalTarget, parentNode, markerName = "data-suppressed", followControlledElements = true) => {
29
+ const fn = supportsInert() ? inertOthers : hideOthers;
30
+ return fn(originalTarget, parentNode, markerName, followControlledElements);
31
+ };
32
+ export {
33
+ hideOthers,
34
+ inertOthers,
35
+ suppressOthers
36
+ };
package/dist/index.js CHANGED
@@ -1,127 +1,29 @@
1
- 'use strict';
2
-
3
- var domQuery = require('@zag-js/dom-query');
4
-
5
- // src/walk-tree-outside.ts
6
- var counterMap = /* @__PURE__ */ new WeakMap();
7
- var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
8
- var markerMap = {};
9
- var lockCount = 0;
10
- var unwrapHost = (node) => node && (node.host || unwrapHost(node.parentNode));
11
- var correctTargets = (parent, targets) => targets.map((target) => {
12
- if (parent.contains(target)) return target;
13
- const correctedTarget = unwrapHost(target);
14
- if (correctedTarget && parent.contains(correctedTarget)) {
15
- return correctedTarget;
16
- }
17
- console.error("[zag-js > ariaHidden] target", target, "in not contained inside", parent, ". Doing nothing");
18
- return null;
19
- }).filter((x) => Boolean(x));
20
- var ignoreableNodes = /* @__PURE__ */ new Set(["script", "output", "status", "next-route-announcer"]);
21
- var isIgnoredNode = (node) => {
22
- if (ignoreableNodes.has(node.localName)) return true;
23
- if (node.role === "status") return true;
24
- if (node.hasAttribute("aria-live")) return true;
25
- return node.matches("[data-live-announcer]");
26
- };
27
- var walkTreeOutside = (originalTarget, props) => {
28
- const { parentNode, markerName, controlAttribute, followControlledElements = true } = props;
29
- const targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
30
- markerMap[markerName] || (markerMap[markerName] = /* @__PURE__ */ new WeakMap());
31
- const markerCounter = markerMap[markerName];
32
- const hiddenNodes = [];
33
- const elementsToKeep = /* @__PURE__ */ new Set();
34
- const elementsToStop = new Set(targets);
35
- const keep = (el) => {
36
- if (!el || elementsToKeep.has(el)) return;
37
- elementsToKeep.add(el);
38
- keep(el.parentNode);
39
- };
40
- targets.forEach((target) => {
41
- keep(target);
42
- if (followControlledElements && domQuery.isHTMLElement(target)) {
43
- domQuery.findControlledElements(target, (controlledElement) => {
44
- keep(controlledElement);
45
- });
46
- }
47
- });
48
- const deep = (parent) => {
49
- if (!parent || elementsToStop.has(parent)) {
50
- return;
51
- }
52
- Array.prototype.forEach.call(parent.children, (node) => {
53
- if (elementsToKeep.has(node)) {
54
- deep(node);
55
- } else {
56
- try {
57
- if (isIgnoredNode(node)) return;
58
- const attr = node.getAttribute(controlAttribute);
59
- const alreadyHidden = attr === "true" ;
60
- const counterValue = (counterMap.get(node) || 0) + 1;
61
- const markerValue = (markerCounter.get(node) || 0) + 1;
62
- counterMap.set(node, counterValue);
63
- markerCounter.set(node, markerValue);
64
- hiddenNodes.push(node);
65
- if (counterValue === 1 && alreadyHidden) {
66
- uncontrolledNodes.set(node, true);
67
- }
68
- if (markerValue === 1) {
69
- node.setAttribute(markerName, "");
70
- }
71
- if (!alreadyHidden) {
72
- node.setAttribute(controlAttribute, "true" );
73
- }
74
- } catch (e) {
75
- console.error("[zag-js > ariaHidden] cannot operate on ", node, e);
76
- }
77
- }
78
- });
79
- };
80
- deep(parentNode);
81
- elementsToKeep.clear();
82
- lockCount++;
83
- return () => {
84
- hiddenNodes.forEach((node) => {
85
- const counterValue = counterMap.get(node) - 1;
86
- const markerValue = markerCounter.get(node) - 1;
87
- counterMap.set(node, counterValue);
88
- markerCounter.set(node, markerValue);
89
- if (!counterValue) {
90
- if (!uncontrolledNodes.has(node)) {
91
- node.removeAttribute(controlAttribute);
92
- }
93
- uncontrolledNodes.delete(node);
94
- }
95
- if (!markerValue) {
96
- node.removeAttribute(markerName);
97
- }
98
- });
99
- lockCount--;
100
- if (!lockCount) {
101
- counterMap = /* @__PURE__ */ new WeakMap();
102
- counterMap = /* @__PURE__ */ new WeakMap();
103
- uncontrolledNodes = /* @__PURE__ */ new WeakMap();
104
- markerMap = {};
105
- }
106
- };
107
- };
108
-
109
- // src/aria-hidden.ts
110
- var getParentNode = (originalTarget) => {
111
- const target = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
112
- return target.ownerDocument.body;
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 });
113
9
  };
114
- var hideOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-aria-hidden", followControlledElements = true) => {
115
- if (!parentNode) return;
116
- return walkTreeOutside(originalTarget, {
117
- parentNode,
118
- markerName,
119
- controlAttribute: "aria-hidden",
120
- followControlledElements
121
- });
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;
122
17
  };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
123
19
 
124
20
  // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ariaHidden: () => ariaHidden
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+ var import_aria_hidden = require("./aria-hidden.cjs");
125
27
  var raf = (fn) => {
126
28
  const frameId = requestAnimationFrame(() => fn());
127
29
  return () => cancelAnimationFrame(frameId);
@@ -135,12 +37,14 @@ function ariaHidden(targetsOrFn, options = {}) {
135
37
  const targets = typeof targetsOrFn === "function" ? targetsOrFn() : targetsOrFn;
136
38
  const elements = targets.filter(Boolean);
137
39
  if (elements.length === 0) return;
138
- cleanups.push(hideOthers(elements));
40
+ cleanups.push((0, import_aria_hidden.hideOthers)(elements));
139
41
  })
140
42
  );
141
43
  return () => {
142
44
  cleanups.forEach((fn) => fn?.());
143
45
  };
144
46
  }
145
-
146
- exports.ariaHidden = ariaHidden;
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {
49
+ ariaHidden
50
+ });
package/dist/index.mjs CHANGED
@@ -1,125 +1,5 @@
1
- import { isHTMLElement, findControlledElements } from '@zag-js/dom-query';
2
-
3
- // src/walk-tree-outside.ts
4
- var counterMap = /* @__PURE__ */ new WeakMap();
5
- var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
6
- var markerMap = {};
7
- var lockCount = 0;
8
- var unwrapHost = (node) => node && (node.host || unwrapHost(node.parentNode));
9
- var correctTargets = (parent, targets) => targets.map((target) => {
10
- if (parent.contains(target)) return target;
11
- const correctedTarget = unwrapHost(target);
12
- if (correctedTarget && parent.contains(correctedTarget)) {
13
- return correctedTarget;
14
- }
15
- console.error("[zag-js > ariaHidden] target", target, "in not contained inside", parent, ". Doing nothing");
16
- return null;
17
- }).filter((x) => Boolean(x));
18
- var ignoreableNodes = /* @__PURE__ */ new Set(["script", "output", "status", "next-route-announcer"]);
19
- var isIgnoredNode = (node) => {
20
- if (ignoreableNodes.has(node.localName)) return true;
21
- if (node.role === "status") return true;
22
- if (node.hasAttribute("aria-live")) return true;
23
- return node.matches("[data-live-announcer]");
24
- };
25
- var walkTreeOutside = (originalTarget, props) => {
26
- const { parentNode, markerName, controlAttribute, followControlledElements = true } = props;
27
- const targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
28
- markerMap[markerName] || (markerMap[markerName] = /* @__PURE__ */ new WeakMap());
29
- const markerCounter = markerMap[markerName];
30
- const hiddenNodes = [];
31
- const elementsToKeep = /* @__PURE__ */ new Set();
32
- const elementsToStop = new Set(targets);
33
- const keep = (el) => {
34
- if (!el || elementsToKeep.has(el)) return;
35
- elementsToKeep.add(el);
36
- keep(el.parentNode);
37
- };
38
- targets.forEach((target) => {
39
- keep(target);
40
- if (followControlledElements && isHTMLElement(target)) {
41
- findControlledElements(target, (controlledElement) => {
42
- keep(controlledElement);
43
- });
44
- }
45
- });
46
- const deep = (parent) => {
47
- if (!parent || elementsToStop.has(parent)) {
48
- return;
49
- }
50
- Array.prototype.forEach.call(parent.children, (node) => {
51
- if (elementsToKeep.has(node)) {
52
- deep(node);
53
- } else {
54
- try {
55
- if (isIgnoredNode(node)) return;
56
- const attr = node.getAttribute(controlAttribute);
57
- const alreadyHidden = attr === "true" ;
58
- const counterValue = (counterMap.get(node) || 0) + 1;
59
- const markerValue = (markerCounter.get(node) || 0) + 1;
60
- counterMap.set(node, counterValue);
61
- markerCounter.set(node, markerValue);
62
- hiddenNodes.push(node);
63
- if (counterValue === 1 && alreadyHidden) {
64
- uncontrolledNodes.set(node, true);
65
- }
66
- if (markerValue === 1) {
67
- node.setAttribute(markerName, "");
68
- }
69
- if (!alreadyHidden) {
70
- node.setAttribute(controlAttribute, "true" );
71
- }
72
- } catch (e) {
73
- console.error("[zag-js > ariaHidden] cannot operate on ", node, e);
74
- }
75
- }
76
- });
77
- };
78
- deep(parentNode);
79
- elementsToKeep.clear();
80
- lockCount++;
81
- return () => {
82
- hiddenNodes.forEach((node) => {
83
- const counterValue = counterMap.get(node) - 1;
84
- const markerValue = markerCounter.get(node) - 1;
85
- counterMap.set(node, counterValue);
86
- markerCounter.set(node, markerValue);
87
- if (!counterValue) {
88
- if (!uncontrolledNodes.has(node)) {
89
- node.removeAttribute(controlAttribute);
90
- }
91
- uncontrolledNodes.delete(node);
92
- }
93
- if (!markerValue) {
94
- node.removeAttribute(markerName);
95
- }
96
- });
97
- lockCount--;
98
- if (!lockCount) {
99
- counterMap = /* @__PURE__ */ new WeakMap();
100
- counterMap = /* @__PURE__ */ new WeakMap();
101
- uncontrolledNodes = /* @__PURE__ */ new WeakMap();
102
- markerMap = {};
103
- }
104
- };
105
- };
106
-
107
- // src/aria-hidden.ts
108
- var getParentNode = (originalTarget) => {
109
- const target = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
110
- return target.ownerDocument.body;
111
- };
112
- var hideOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-aria-hidden", followControlledElements = true) => {
113
- if (!parentNode) return;
114
- return walkTreeOutside(originalTarget, {
115
- parentNode,
116
- markerName,
117
- controlAttribute: "aria-hidden",
118
- followControlledElements
119
- });
120
- };
121
-
122
1
  // src/index.ts
2
+ import { hideOthers } from "./aria-hidden.mjs";
123
3
  var raf = (fn) => {
124
4
  const frameId = requestAnimationFrame(() => fn());
125
5
  return () => cancelAnimationFrame(frameId);
@@ -140,5 +20,6 @@ function ariaHidden(targetsOrFn, options = {}) {
140
20
  cleanups.forEach((fn) => fn?.());
141
21
  };
142
22
  }
143
-
144
- export { ariaHidden };
23
+ export {
24
+ ariaHidden
25
+ };
@@ -0,0 +1,10 @@
1
+ interface WalkTreeOutsideOptions {
2
+ parentNode: HTMLElement;
3
+ markerName: string;
4
+ controlAttribute: string;
5
+ explicitBooleanValue: boolean;
6
+ followControlledElements?: boolean;
7
+ }
8
+ declare const walkTreeOutside: (originalTarget: Element | Element[], props: WalkTreeOutsideOptions) => VoidFunction;
9
+
10
+ export { walkTreeOutside };
@@ -0,0 +1,10 @@
1
+ interface WalkTreeOutsideOptions {
2
+ parentNode: HTMLElement;
3
+ markerName: string;
4
+ controlAttribute: string;
5
+ explicitBooleanValue: boolean;
6
+ followControlledElements?: boolean;
7
+ }
8
+ declare const walkTreeOutside: (originalTarget: Element | Element[], props: WalkTreeOutsideOptions) => VoidFunction;
9
+
10
+ export { walkTreeOutside };
@@ -0,0 +1,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 __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/walk-tree-outside.ts
21
+ var walk_tree_outside_exports = {};
22
+ __export(walk_tree_outside_exports, {
23
+ walkTreeOutside: () => walkTreeOutside
24
+ });
25
+ module.exports = __toCommonJS(walk_tree_outside_exports);
26
+ var import_dom_query = require("@zag-js/dom-query");
27
+ var counterMap = /* @__PURE__ */ new WeakMap();
28
+ var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
29
+ var markerMap = {};
30
+ var lockCount = 0;
31
+ var unwrapHost = (node) => node && (node.host || unwrapHost(node.parentNode));
32
+ var correctTargets = (parent, targets) => targets.map((target) => {
33
+ if (parent.contains(target)) return target;
34
+ const correctedTarget = unwrapHost(target);
35
+ if (correctedTarget && parent.contains(correctedTarget)) {
36
+ return correctedTarget;
37
+ }
38
+ console.error("[zag-js > ariaHidden] target", target, "in not contained inside", parent, ". Doing nothing");
39
+ return null;
40
+ }).filter((x) => Boolean(x));
41
+ var ignoreableNodes = /* @__PURE__ */ new Set(["script", "output", "status", "next-route-announcer"]);
42
+ var isIgnoredNode = (node) => {
43
+ if (ignoreableNodes.has(node.localName)) return true;
44
+ if (node.role === "status") return true;
45
+ if (node.hasAttribute("aria-live")) return true;
46
+ return node.matches("[data-live-announcer]");
47
+ };
48
+ var walkTreeOutside = (originalTarget, props) => {
49
+ const { parentNode, markerName, controlAttribute, explicitBooleanValue, followControlledElements = true } = props;
50
+ const targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
51
+ markerMap[markerName] || (markerMap[markerName] = /* @__PURE__ */ new WeakMap());
52
+ const markerCounter = markerMap[markerName];
53
+ const hiddenNodes = [];
54
+ const elementsToKeep = /* @__PURE__ */ new Set();
55
+ const elementsToStop = new Set(targets);
56
+ const keep = (el) => {
57
+ if (!el || elementsToKeep.has(el)) return;
58
+ elementsToKeep.add(el);
59
+ keep(el.parentNode);
60
+ };
61
+ targets.forEach((target) => {
62
+ keep(target);
63
+ if (followControlledElements && (0, import_dom_query.isHTMLElement)(target)) {
64
+ (0, import_dom_query.findControlledElements)(target, (controlledElement) => {
65
+ keep(controlledElement);
66
+ });
67
+ }
68
+ });
69
+ const deep = (parent) => {
70
+ if (!parent || elementsToStop.has(parent)) {
71
+ return;
72
+ }
73
+ Array.prototype.forEach.call(parent.children, (node) => {
74
+ if (elementsToKeep.has(node)) {
75
+ deep(node);
76
+ } else {
77
+ try {
78
+ if (isIgnoredNode(node)) return;
79
+ const attr = node.getAttribute(controlAttribute);
80
+ const alreadyHidden = explicitBooleanValue ? attr === "true" : attr !== null && attr !== "false";
81
+ const counterValue = (counterMap.get(node) || 0) + 1;
82
+ const markerValue = (markerCounter.get(node) || 0) + 1;
83
+ counterMap.set(node, counterValue);
84
+ markerCounter.set(node, markerValue);
85
+ hiddenNodes.push(node);
86
+ if (counterValue === 1 && alreadyHidden) {
87
+ uncontrolledNodes.set(node, true);
88
+ }
89
+ if (markerValue === 1) {
90
+ node.setAttribute(markerName, "");
91
+ }
92
+ if (!alreadyHidden) {
93
+ node.setAttribute(controlAttribute, explicitBooleanValue ? "true" : "");
94
+ }
95
+ } catch (e) {
96
+ console.error("[zag-js > ariaHidden] cannot operate on ", node, e);
97
+ }
98
+ }
99
+ });
100
+ };
101
+ deep(parentNode);
102
+ elementsToKeep.clear();
103
+ lockCount++;
104
+ return () => {
105
+ hiddenNodes.forEach((node) => {
106
+ const counterValue = counterMap.get(node) - 1;
107
+ const markerValue = markerCounter.get(node) - 1;
108
+ counterMap.set(node, counterValue);
109
+ markerCounter.set(node, markerValue);
110
+ if (!counterValue) {
111
+ if (!uncontrolledNodes.has(node)) {
112
+ node.removeAttribute(controlAttribute);
113
+ }
114
+ uncontrolledNodes.delete(node);
115
+ }
116
+ if (!markerValue) {
117
+ node.removeAttribute(markerName);
118
+ }
119
+ });
120
+ lockCount--;
121
+ if (!lockCount) {
122
+ counterMap = /* @__PURE__ */ new WeakMap();
123
+ counterMap = /* @__PURE__ */ new WeakMap();
124
+ uncontrolledNodes = /* @__PURE__ */ new WeakMap();
125
+ markerMap = {};
126
+ }
127
+ };
128
+ };
129
+ // Annotate the CommonJS export names for ESM import in node:
130
+ 0 && (module.exports = {
131
+ walkTreeOutside
132
+ });
@@ -0,0 +1,107 @@
1
+ // src/walk-tree-outside.ts
2
+ import { findControlledElements, isHTMLElement } from "@zag-js/dom-query";
3
+ var counterMap = /* @__PURE__ */ new WeakMap();
4
+ var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
5
+ var markerMap = {};
6
+ var lockCount = 0;
7
+ var unwrapHost = (node) => node && (node.host || unwrapHost(node.parentNode));
8
+ var correctTargets = (parent, targets) => targets.map((target) => {
9
+ if (parent.contains(target)) return target;
10
+ const correctedTarget = unwrapHost(target);
11
+ if (correctedTarget && parent.contains(correctedTarget)) {
12
+ return correctedTarget;
13
+ }
14
+ console.error("[zag-js > ariaHidden] target", target, "in not contained inside", parent, ". Doing nothing");
15
+ return null;
16
+ }).filter((x) => Boolean(x));
17
+ var ignoreableNodes = /* @__PURE__ */ new Set(["script", "output", "status", "next-route-announcer"]);
18
+ var isIgnoredNode = (node) => {
19
+ if (ignoreableNodes.has(node.localName)) return true;
20
+ if (node.role === "status") return true;
21
+ if (node.hasAttribute("aria-live")) return true;
22
+ return node.matches("[data-live-announcer]");
23
+ };
24
+ var walkTreeOutside = (originalTarget, props) => {
25
+ const { parentNode, markerName, controlAttribute, explicitBooleanValue, followControlledElements = true } = props;
26
+ const targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
27
+ markerMap[markerName] || (markerMap[markerName] = /* @__PURE__ */ new WeakMap());
28
+ const markerCounter = markerMap[markerName];
29
+ const hiddenNodes = [];
30
+ const elementsToKeep = /* @__PURE__ */ new Set();
31
+ const elementsToStop = new Set(targets);
32
+ const keep = (el) => {
33
+ if (!el || elementsToKeep.has(el)) return;
34
+ elementsToKeep.add(el);
35
+ keep(el.parentNode);
36
+ };
37
+ targets.forEach((target) => {
38
+ keep(target);
39
+ if (followControlledElements && isHTMLElement(target)) {
40
+ findControlledElements(target, (controlledElement) => {
41
+ keep(controlledElement);
42
+ });
43
+ }
44
+ });
45
+ const deep = (parent) => {
46
+ if (!parent || elementsToStop.has(parent)) {
47
+ return;
48
+ }
49
+ Array.prototype.forEach.call(parent.children, (node) => {
50
+ if (elementsToKeep.has(node)) {
51
+ deep(node);
52
+ } else {
53
+ try {
54
+ if (isIgnoredNode(node)) return;
55
+ const attr = node.getAttribute(controlAttribute);
56
+ const alreadyHidden = explicitBooleanValue ? attr === "true" : attr !== null && attr !== "false";
57
+ const counterValue = (counterMap.get(node) || 0) + 1;
58
+ const markerValue = (markerCounter.get(node) || 0) + 1;
59
+ counterMap.set(node, counterValue);
60
+ markerCounter.set(node, markerValue);
61
+ hiddenNodes.push(node);
62
+ if (counterValue === 1 && alreadyHidden) {
63
+ uncontrolledNodes.set(node, true);
64
+ }
65
+ if (markerValue === 1) {
66
+ node.setAttribute(markerName, "");
67
+ }
68
+ if (!alreadyHidden) {
69
+ node.setAttribute(controlAttribute, explicitBooleanValue ? "true" : "");
70
+ }
71
+ } catch (e) {
72
+ console.error("[zag-js > ariaHidden] cannot operate on ", node, e);
73
+ }
74
+ }
75
+ });
76
+ };
77
+ deep(parentNode);
78
+ elementsToKeep.clear();
79
+ lockCount++;
80
+ return () => {
81
+ hiddenNodes.forEach((node) => {
82
+ const counterValue = counterMap.get(node) - 1;
83
+ const markerValue = markerCounter.get(node) - 1;
84
+ counterMap.set(node, counterValue);
85
+ markerCounter.set(node, markerValue);
86
+ if (!counterValue) {
87
+ if (!uncontrolledNodes.has(node)) {
88
+ node.removeAttribute(controlAttribute);
89
+ }
90
+ uncontrolledNodes.delete(node);
91
+ }
92
+ if (!markerValue) {
93
+ node.removeAttribute(markerName);
94
+ }
95
+ });
96
+ lockCount--;
97
+ if (!lockCount) {
98
+ counterMap = /* @__PURE__ */ new WeakMap();
99
+ counterMap = /* @__PURE__ */ new WeakMap();
100
+ uncontrolledNodes = /* @__PURE__ */ new WeakMap();
101
+ markerMap = {};
102
+ }
103
+ };
104
+ };
105
+ export {
106
+ walkTreeOutside
107
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/aria-hidden",
3
- "version": "1.34.1",
3
+ "version": "1.35.0",
4
4
  "description": "Hide targets from screen readers",
5
5
  "keywords": [
6
6
  "js",
@@ -24,7 +24,7 @@
24
24
  "clean-package": "../../../clean-package.config.json",
25
25
  "main": "dist/index.js",
26
26
  "dependencies": {
27
- "@zag-js/dom-query": "1.34.1"
27
+ "@zag-js/dom-query": "1.35.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "clean-package": "2.2.0"