@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.
- package/dist/aria-hidden.d.mts +5 -0
- package/dist/aria-hidden.d.ts +5 -0
- package/dist/aria-hidden.js +63 -0
- package/dist/aria-hidden.mjs +36 -0
- package/dist/index.js +27 -123
- package/dist/index.mjs +4 -123
- package/dist/walk-tree-outside.d.mts +10 -0
- package/dist/walk-tree-outside.d.ts +10 -0
- package/dist/walk-tree-outside.js +132 -0
- package/dist/walk-tree-outside.mjs +107 -0
- package/package.json +2 -2
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
|
|
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
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
27
|
+
"@zag-js/dom-query": "1.35.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"clean-package": "2.2.0"
|