@zag-js/aria-hidden 0.78.0 → 0.78.2
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 +110 -2
- package/dist/index.mjs +109 -1
- package/package.json +1 -4
package/dist/index.js
CHANGED
|
@@ -1,6 +1,114 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
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 isIgnoredNode = (node) => {
|
|
19
|
+
if (node.localName === "next-route-announcer") return true;
|
|
20
|
+
if (node.localName === "script") 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 } = 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(keep);
|
|
38
|
+
const deep = (parent) => {
|
|
39
|
+
if (!parent || elementsToStop.has(parent)) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
Array.prototype.forEach.call(parent.children, (node) => {
|
|
43
|
+
if (elementsToKeep.has(node)) {
|
|
44
|
+
deep(node);
|
|
45
|
+
} else {
|
|
46
|
+
try {
|
|
47
|
+
if (isIgnoredNode(node)) return;
|
|
48
|
+
const attr = node.getAttribute(controlAttribute);
|
|
49
|
+
const alreadyHidden = attr !== null && attr !== "false";
|
|
50
|
+
const counterValue = (counterMap.get(node) || 0) + 1;
|
|
51
|
+
const markerValue = (markerCounter.get(node) || 0) + 1;
|
|
52
|
+
counterMap.set(node, counterValue);
|
|
53
|
+
markerCounter.set(node, markerValue);
|
|
54
|
+
hiddenNodes.push(node);
|
|
55
|
+
if (counterValue === 1 && alreadyHidden) {
|
|
56
|
+
uncontrolledNodes.set(node, true);
|
|
57
|
+
}
|
|
58
|
+
if (markerValue === 1) {
|
|
59
|
+
node.setAttribute(markerName, "");
|
|
60
|
+
}
|
|
61
|
+
if (!alreadyHidden) {
|
|
62
|
+
node.setAttribute(controlAttribute, "");
|
|
63
|
+
}
|
|
64
|
+
} catch (e) {
|
|
65
|
+
console.error("[zag-js > ariaHidden] cannot operate on ", node, e);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
deep(parentNode);
|
|
71
|
+
elementsToKeep.clear();
|
|
72
|
+
lockCount++;
|
|
73
|
+
return () => {
|
|
74
|
+
hiddenNodes.forEach((node) => {
|
|
75
|
+
const counterValue = counterMap.get(node) - 1;
|
|
76
|
+
const markerValue = markerCounter.get(node) - 1;
|
|
77
|
+
counterMap.set(node, counterValue);
|
|
78
|
+
markerCounter.set(node, markerValue);
|
|
79
|
+
if (!counterValue) {
|
|
80
|
+
if (!uncontrolledNodes.has(node)) {
|
|
81
|
+
node.removeAttribute(controlAttribute);
|
|
82
|
+
}
|
|
83
|
+
uncontrolledNodes.delete(node);
|
|
84
|
+
}
|
|
85
|
+
if (!markerValue) {
|
|
86
|
+
node.removeAttribute(markerName);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
lockCount--;
|
|
90
|
+
if (!lockCount) {
|
|
91
|
+
counterMap = /* @__PURE__ */ new WeakMap();
|
|
92
|
+
counterMap = /* @__PURE__ */ new WeakMap();
|
|
93
|
+
uncontrolledNodes = /* @__PURE__ */ new WeakMap();
|
|
94
|
+
markerMap = {};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// src/aria-hidden.ts
|
|
100
|
+
var getParentNode = (originalTarget) => {
|
|
101
|
+
const target = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
|
|
102
|
+
return target.ownerDocument.body;
|
|
103
|
+
};
|
|
104
|
+
var hideOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-aria-hidden") => {
|
|
105
|
+
if (!parentNode) return;
|
|
106
|
+
return walkTreeOutside(originalTarget, {
|
|
107
|
+
parentNode,
|
|
108
|
+
markerName,
|
|
109
|
+
controlAttribute: "aria-hidden"
|
|
110
|
+
});
|
|
111
|
+
};
|
|
4
112
|
|
|
5
113
|
// src/index.ts
|
|
6
114
|
var raf = (fn) => {
|
|
@@ -16,7 +124,7 @@ function ariaHidden(targetsOrFn, options = {}) {
|
|
|
16
124
|
const targets = typeof targetsOrFn === "function" ? targetsOrFn() : targetsOrFn;
|
|
17
125
|
const elements = targets.filter(Boolean);
|
|
18
126
|
if (elements.length === 0) return;
|
|
19
|
-
cleanups.push(
|
|
127
|
+
cleanups.push(hideOthers(elements));
|
|
20
128
|
})
|
|
21
129
|
);
|
|
22
130
|
return () => {
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,112 @@
|
|
|
1
|
-
|
|
1
|
+
// src/walk-tree-outside.ts
|
|
2
|
+
var counterMap = /* @__PURE__ */ new WeakMap();
|
|
3
|
+
var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
var markerMap = {};
|
|
5
|
+
var lockCount = 0;
|
|
6
|
+
var unwrapHost = (node) => node && (node.host || unwrapHost(node.parentNode));
|
|
7
|
+
var correctTargets = (parent, targets) => targets.map((target) => {
|
|
8
|
+
if (parent.contains(target)) return target;
|
|
9
|
+
const correctedTarget = unwrapHost(target);
|
|
10
|
+
if (correctedTarget && parent.contains(correctedTarget)) {
|
|
11
|
+
return correctedTarget;
|
|
12
|
+
}
|
|
13
|
+
console.error("[zag-js > ariaHidden] target", target, "in not contained inside", parent, ". Doing nothing");
|
|
14
|
+
return null;
|
|
15
|
+
}).filter((x) => Boolean(x));
|
|
16
|
+
var isIgnoredNode = (node) => {
|
|
17
|
+
if (node.localName === "next-route-announcer") return true;
|
|
18
|
+
if (node.localName === "script") return true;
|
|
19
|
+
if (node.hasAttribute("aria-live")) return true;
|
|
20
|
+
return node.matches("[data-live-announcer]");
|
|
21
|
+
};
|
|
22
|
+
var walkTreeOutside = (originalTarget, props) => {
|
|
23
|
+
const { parentNode, markerName, controlAttribute } = props;
|
|
24
|
+
const targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
|
|
25
|
+
markerMap[markerName] || (markerMap[markerName] = /* @__PURE__ */ new WeakMap());
|
|
26
|
+
const markerCounter = markerMap[markerName];
|
|
27
|
+
const hiddenNodes = [];
|
|
28
|
+
const elementsToKeep = /* @__PURE__ */ new Set();
|
|
29
|
+
const elementsToStop = new Set(targets);
|
|
30
|
+
const keep = (el) => {
|
|
31
|
+
if (!el || elementsToKeep.has(el)) return;
|
|
32
|
+
elementsToKeep.add(el);
|
|
33
|
+
keep(el.parentNode);
|
|
34
|
+
};
|
|
35
|
+
targets.forEach(keep);
|
|
36
|
+
const deep = (parent) => {
|
|
37
|
+
if (!parent || elementsToStop.has(parent)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
Array.prototype.forEach.call(parent.children, (node) => {
|
|
41
|
+
if (elementsToKeep.has(node)) {
|
|
42
|
+
deep(node);
|
|
43
|
+
} else {
|
|
44
|
+
try {
|
|
45
|
+
if (isIgnoredNode(node)) return;
|
|
46
|
+
const attr = node.getAttribute(controlAttribute);
|
|
47
|
+
const alreadyHidden = attr !== null && attr !== "false";
|
|
48
|
+
const counterValue = (counterMap.get(node) || 0) + 1;
|
|
49
|
+
const markerValue = (markerCounter.get(node) || 0) + 1;
|
|
50
|
+
counterMap.set(node, counterValue);
|
|
51
|
+
markerCounter.set(node, markerValue);
|
|
52
|
+
hiddenNodes.push(node);
|
|
53
|
+
if (counterValue === 1 && alreadyHidden) {
|
|
54
|
+
uncontrolledNodes.set(node, true);
|
|
55
|
+
}
|
|
56
|
+
if (markerValue === 1) {
|
|
57
|
+
node.setAttribute(markerName, "");
|
|
58
|
+
}
|
|
59
|
+
if (!alreadyHidden) {
|
|
60
|
+
node.setAttribute(controlAttribute, "");
|
|
61
|
+
}
|
|
62
|
+
} catch (e) {
|
|
63
|
+
console.error("[zag-js > ariaHidden] cannot operate on ", node, e);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
deep(parentNode);
|
|
69
|
+
elementsToKeep.clear();
|
|
70
|
+
lockCount++;
|
|
71
|
+
return () => {
|
|
72
|
+
hiddenNodes.forEach((node) => {
|
|
73
|
+
const counterValue = counterMap.get(node) - 1;
|
|
74
|
+
const markerValue = markerCounter.get(node) - 1;
|
|
75
|
+
counterMap.set(node, counterValue);
|
|
76
|
+
markerCounter.set(node, markerValue);
|
|
77
|
+
if (!counterValue) {
|
|
78
|
+
if (!uncontrolledNodes.has(node)) {
|
|
79
|
+
node.removeAttribute(controlAttribute);
|
|
80
|
+
}
|
|
81
|
+
uncontrolledNodes.delete(node);
|
|
82
|
+
}
|
|
83
|
+
if (!markerValue) {
|
|
84
|
+
node.removeAttribute(markerName);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
lockCount--;
|
|
88
|
+
if (!lockCount) {
|
|
89
|
+
counterMap = /* @__PURE__ */ new WeakMap();
|
|
90
|
+
counterMap = /* @__PURE__ */ new WeakMap();
|
|
91
|
+
uncontrolledNodes = /* @__PURE__ */ new WeakMap();
|
|
92
|
+
markerMap = {};
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// src/aria-hidden.ts
|
|
98
|
+
var getParentNode = (originalTarget) => {
|
|
99
|
+
const target = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
|
|
100
|
+
return target.ownerDocument.body;
|
|
101
|
+
};
|
|
102
|
+
var hideOthers = (originalTarget, parentNode = getParentNode(originalTarget), markerName = "data-aria-hidden") => {
|
|
103
|
+
if (!parentNode) return;
|
|
104
|
+
return walkTreeOutside(originalTarget, {
|
|
105
|
+
parentNode,
|
|
106
|
+
markerName,
|
|
107
|
+
controlAttribute: "aria-hidden"
|
|
108
|
+
});
|
|
109
|
+
};
|
|
2
110
|
|
|
3
111
|
// src/index.ts
|
|
4
112
|
var raf = (fn) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/aria-hidden",
|
|
3
|
-
"version": "0.78.
|
|
3
|
+
"version": "0.78.2",
|
|
4
4
|
"description": "Hide targets from screen readers",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -23,9 +23,6 @@
|
|
|
23
23
|
},
|
|
24
24
|
"clean-package": "../../../clean-package.config.json",
|
|
25
25
|
"main": "dist/index.js",
|
|
26
|
-
"dependencies": {
|
|
27
|
-
"aria-hidden": "1.2.4"
|
|
28
|
-
},
|
|
29
26
|
"devDependencies": {
|
|
30
27
|
"clean-package": "2.2.0"
|
|
31
28
|
},
|