123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.suppressOthers = exports.supportsInert = exports.inertOthers = exports.hideOthers = void 0;
- var getDefaultParent = function (originalTarget) {
- if (typeof document === 'undefined') {
- return null;
- }
- var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
- return sampleTarget.ownerDocument.body;
- };
- var counterMap = new WeakMap();
- var uncontrolledNodes = new WeakMap();
- var markerMap = {};
- var lockCount = 0;
- var unwrapHost = function (node) {
- return node && (node.host || unwrapHost(node.parentNode));
- };
- var correctTargets = function (parent, targets) {
- return targets
- .map(function (target) {
- if (parent.contains(target)) {
- return target;
- }
- var correctedTarget = unwrapHost(target);
- if (correctedTarget && parent.contains(correctedTarget)) {
- return correctedTarget;
- }
- console.error('aria-hidden', target, 'in not contained inside', parent, '. Doing nothing');
- return null;
- })
- .filter(function (x) { return Boolean(x); });
- };
- /**
- * Marks everything except given node(or nodes) as aria-hidden
- * @param {Element | Element[]} originalTarget - elements to keep on the page
- * @param [parentNode] - top element, defaults to document.body
- * @param {String} [markerName] - a special attribute to mark every node
- * @param {String} [controlAttribute] - html Attribute to control
- * @return {Undo} undo command
- */
- var applyAttributeToOthers = function (originalTarget, parentNode, markerName, controlAttribute) {
- var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
- if (!markerMap[markerName]) {
- markerMap[markerName] = new WeakMap();
- }
- var markerCounter = markerMap[markerName];
- var hiddenNodes = [];
- var elementsToKeep = new Set();
- var elementsToStop = new Set(targets);
- var keep = function (el) {
- if (!el || elementsToKeep.has(el)) {
- return;
- }
- elementsToKeep.add(el);
- keep(el.parentNode);
- };
- targets.forEach(keep);
- var deep = function (parent) {
- if (!parent || elementsToStop.has(parent)) {
- return;
- }
- Array.prototype.forEach.call(parent.children, function (node) {
- if (elementsToKeep.has(node)) {
- deep(node);
- }
- else {
- var attr = node.getAttribute(controlAttribute);
- var alreadyHidden = attr !== null && attr !== 'false';
- var counterValue = (counterMap.get(node) || 0) + 1;
- var markerValue = (markerCounter.get(node) || 0) + 1;
- counterMap.set(node, counterValue);
- markerCounter.set(node, markerValue);
- hiddenNodes.push(node);
- if (counterValue === 1 && alreadyHidden) {
- uncontrolledNodes.set(node, true);
- }
- if (markerValue === 1) {
- node.setAttribute(markerName, 'true');
- }
- if (!alreadyHidden) {
- node.setAttribute(controlAttribute, 'true');
- }
- }
- });
- };
- deep(parentNode);
- elementsToKeep.clear();
- lockCount++;
- return function () {
- hiddenNodes.forEach(function (node) {
- var counterValue = counterMap.get(node) - 1;
- var markerValue = markerCounter.get(node) - 1;
- counterMap.set(node, counterValue);
- markerCounter.set(node, markerValue);
- if (!counterValue) {
- if (!uncontrolledNodes.has(node)) {
- node.removeAttribute(controlAttribute);
- }
- uncontrolledNodes.delete(node);
- }
- if (!markerValue) {
- node.removeAttribute(markerName);
- }
- });
- lockCount--;
- if (!lockCount) {
- // clear
- counterMap = new WeakMap();
- counterMap = new WeakMap();
- uncontrolledNodes = new WeakMap();
- markerMap = {};
- }
- };
- };
- /**
- * Marks everything except given node(or nodes) as aria-hidden
- * @param {Element | Element[]} originalTarget - elements to keep on the page
- * @param [parentNode] - top element, defaults to document.body
- * @param {String} [markerName] - a special attribute to mark every node
- * @return {Undo} undo command
- */
- var hideOthers = function (originalTarget, parentNode, markerName) {
- if (markerName === void 0) { markerName = 'data-aria-hidden'; }
- var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
- var activeParentNode = parentNode || getDefaultParent(originalTarget);
- if (!activeParentNode) {
- return function () { return null; };
- }
- // we should not hide ariaLive elements - https://github.com/theKashey/aria-hidden/issues/10
- targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll('[aria-live]')));
- return applyAttributeToOthers(targets, activeParentNode, markerName, 'aria-hidden');
- };
- exports.hideOthers = hideOthers;
- /**
- * Marks everything except given node(or nodes) as inert
- * @param {Element | Element[]} originalTarget - elements to keep on the page
- * @param [parentNode] - top element, defaults to document.body
- * @param {String} [markerName] - a special attribute to mark every node
- * @return {Undo} undo command
- */
- var inertOthers = function (originalTarget, parentNode, markerName) {
- if (markerName === void 0) { markerName = 'data-inert-ed'; }
- var activeParentNode = parentNode || getDefaultParent(originalTarget);
- if (!activeParentNode) {
- return function () { return null; };
- }
- return applyAttributeToOthers(originalTarget, activeParentNode, markerName, 'inert');
- };
- exports.inertOthers = inertOthers;
- /**
- * @returns if current browser supports inert
- */
- var supportsInert = function () {
- return typeof HTMLElement !== 'undefined' && HTMLElement.prototype.hasOwnProperty('inert');
- };
- exports.supportsInert = supportsInert;
- /**
- * Automatic function to "suppress" DOM elements - _hide_ or _inert_ in the best possible way
- * @param {Element | Element[]} originalTarget - elements to keep on the page
- * @param [parentNode] - top element, defaults to document.body
- * @param {String} [markerName] - a special attribute to mark every node
- * @return {Undo} undo command
- */
- var suppressOthers = function (originalTarget, parentNode, markerName) {
- if (markerName === void 0) { markerName = 'data-suppressed'; }
- return ((0, exports.supportsInert)() ? exports.inertOthers : exports.hideOthers)(originalTarget, parentNode, markerName);
- };
- exports.suppressOthers = suppressOthers;
|