{"mappings":"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","sources":["packages/react-aria/src/overlays/ariaHideOutside.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {createShadowTreeWalker} from '../utils/shadowdom/ShadowTreeWalker';\n\nimport {getOwnerDocument, getOwnerWindow} from '../utils/domHelpers';\nimport {nodeContains} from '../utils/shadowdom/DOMFunctions';\nimport {shadowDOM} from 'react-stately/private/flags/flags';\n\nconst supportsInert = typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\n\nfunction isAlwaysVisibleNode(node: HTMLElement | SVGElement): boolean {\n  return node.dataset.liveAnnouncer === 'true' || node.dataset.reactAriaTopLayer !== undefined;\n}\n\ninterface AriaHideOutsideOptions {\n  root?: Element,\n  shouldUseInert?: boolean\n}\n\n// Keeps a ref count of all hidden elements. Added to when hiding an element, and\n// subtracted from when showing it again. When it reaches zero, aria-hidden is removed.\nlet refCountMap = new WeakMap<Element, number>();\ninterface ObserverWrapper {\n  visibleNodes: Set<Element>,\n  hiddenNodes: Set<Element>,\n  observe: () => void,\n  disconnect: () => void\n}\nlet observerStack: Array<ObserverWrapper> = [];\n\n/**\n * Hides all elements in the DOM outside the given targets from screen readers using aria-hidden,\n * and returns a function to revert these changes. In addition, changes to the DOM are watched\n * and new elements outside the targets are automatically hidden.\n * @param targets - The elements that should remain visible.\n * @param root - Nothing will be hidden above this element.\n * @returns - A function to restore all hidden elements.\n */\nexport function ariaHideOutside(targets: Element[], options?: AriaHideOutsideOptions | Element) {\n  let windowObj = getOwnerWindow(targets?.[0]);\n  let opts = options instanceof windowObj.Element ? {root: options} : options;\n  let root = opts?.root ?? document.body;\n  let shouldUseInert = opts?.shouldUseInert && supportsInert;\n  let visibleNodes = new Set<Element>(targets);\n  let hiddenNodes = new Set<Element>();\n\n  let getHidden = (element: Element) => {\n    return shouldUseInert && element instanceof windowObj.HTMLElement ? element.inert : element.getAttribute('aria-hidden') === 'true';\n  };\n\n  let setHidden = (element: Element, hidden: boolean) => {\n    if (shouldUseInert && element instanceof windowObj.HTMLElement) {\n      element.inert = hidden;\n    } else if (hidden) {\n      element.setAttribute('aria-hidden', 'true');\n    } else {\n      element.removeAttribute('aria-hidden');\n      if (element instanceof windowObj.HTMLElement) {\n        // We only ever call setHidden with hidden = false when the nodeCount is 1 aka\n        // we are trying to make the element visible to screen readers again, so remove inert as well\n        element.inert = false;\n      }\n    }\n  };\n\n  let shadowRootsToWatch = new Set<ShadowRoot>();\n  if (shadowDOM()) {\n    // find all shadow roots that are ancestors of the targets\n    // traverse upwards until the root is reached\n    for (let target of targets) {\n      let node = target;\n      while (node && node !== root) {\n        let root = node.getRootNode();\n        if ('shadowRoot' in root) {\n          shadowRootsToWatch.add(root.shadowRoot as ShadowRoot);\n        }\n        node = root.parentNode as Element;\n      }\n    }\n  }\n\n  let walk = (root: Element) => {\n    // Keep live announcer and top layer elements (e.g. toasts) visible.\n    for (let element of root.querySelectorAll('[data-live-announcer], [data-react-aria-top-layer]')) {\n      visibleNodes.add(element);\n    }\n\n    let acceptNode = (node: Element) => {\n      // Skip this node and its children if it is one of the target nodes, or a live announcer.\n      // Also skip children of already hidden nodes, as aria-hidden is recursive. An exception is\n      // made for elements with role=\"row\" since VoiceOver on iOS has issues hiding elements with role=\"row\".\n      // For that case we want to hide the cells inside as well (https://bugs.webkit.org/show_bug.cgi?id=222623).\n      if (\n        hiddenNodes.has(node) ||\n        visibleNodes.has(node) ||\n        (node.parentElement && hiddenNodes.has(node.parentElement) && node.parentElement.getAttribute('role') !== 'row')\n      ) {\n        return NodeFilter.FILTER_REJECT;\n      }\n\n      // Skip this node but continue to children if one of the targets is inside the node.\n      for (let target of visibleNodes) {\n        if (nodeContains(node, target)) {\n          return NodeFilter.FILTER_SKIP;\n        }\n      }\n\n      return NodeFilter.FILTER_ACCEPT;\n    };\n\n    let walker = createShadowTreeWalker(\n      getOwnerDocument(root),\n      root,\n      NodeFilter.SHOW_ELEMENT,\n      {acceptNode}\n    );\n\n    // TreeWalker does not include the root.\n    let acceptRoot = acceptNode(root);\n    if (acceptRoot === NodeFilter.FILTER_ACCEPT) {\n      hide(root);\n    }\n\n    if (acceptRoot !== NodeFilter.FILTER_REJECT) {\n      let node = walker.nextNode() as Element;\n      while (node != null) {\n        hide(node);\n        node = walker.nextNode() as Element;\n      }\n    }\n  };\n\n  let hide = (node: Element) => {\n    let refCount = refCountMap.get(node) ?? 0;\n\n    // If already aria-hidden, and the ref count is zero, then this element\n    // was already hidden and there's nothing for us to do.\n    if (getHidden(node) && refCount === 0) {\n      return;\n    }\n\n    if (refCount === 0) {\n      setHidden(node, true);\n    }\n\n    hiddenNodes.add(node);\n    refCountMap.set(node, refCount + 1);\n  };\n\n  // If there is already a MutationObserver listening from a previous call,\n  // disconnect it so the new on takes over.\n  if (observerStack.length) {\n    observerStack[observerStack.length - 1].disconnect();\n  }\n\n  walk(root);\n\n  let observer = new MutationObserver(changes => {\n    for (let change of changes) {\n      if (change.type !== 'childList') {\n        continue;\n      }\n\n      // If the parent element of the added nodes is not within one of the targets,\n      // and not already inside a hidden node, hide all of the new children.\n      if (\n        change.target.isConnected &&\n        ![...visibleNodes, ...hiddenNodes].some((node) =>\n          nodeContains(node, change.target)\n        )\n      ) {\n        for (let node of change.addedNodes) {\n          if (\n            (node instanceof HTMLElement || node instanceof SVGElement) &&\n            isAlwaysVisibleNode(node)\n          ) {\n            visibleNodes.add(node);\n          } else if (node instanceof Element) {\n            walk(node);\n          }\n        }\n      }\n\n      if (shadowDOM()) {\n        // if any of the observed shadow roots were removed, stop observing them\n        for (let shadowRoot of shadowRootsToWatch) {\n          if (!shadowRoot.isConnected) {\n            observer.disconnect();\n            break;\n          }\n        }\n      }\n    }\n  });\n\n  observer.observe(root, {childList: true, subtree: true});\n  let shadowObservers = new Set<MutationObserver>();\n  if (shadowDOM()) {\n    for (let shadowRoot of shadowRootsToWatch) {\n      // Disconnect single target instead of all https://github.com/whatwg/dom/issues/126\n      let shadowObserver = new MutationObserver(changes => {\n        for (let change of changes) {\n          if (change.type !== 'childList') {\n            continue;\n          }\n\n          // If the parent element of the added nodes is not within one of the targets,\n          // and not already inside a hidden node, hide all of the new children.\n          if (\n            change.target.isConnected &&\n            ![...visibleNodes, ...hiddenNodes].some((node) =>\n              nodeContains(node, change.target)\n            )\n          ) {\n            for (let node of change.addedNodes) {\n              if (\n                (node instanceof HTMLElement || node instanceof SVGElement) &&\n                isAlwaysVisibleNode(node)\n              ) {\n                visibleNodes.add(node);\n              } else if (node instanceof Element) {\n                walk(node);\n              }\n            }\n          }\n\n          if (shadowDOM()) {\n            // if any of the observed shadow roots were removed, stop observing them\n            for (let shadowRoot of shadowRootsToWatch) {\n              if (!shadowRoot.isConnected) {\n                observer.disconnect();\n                break;\n              }\n            }\n          }\n        }\n      });\n      shadowObserver.observe(shadowRoot, {childList: true, subtree: true});\n      shadowObservers.add(shadowObserver);\n    }\n  }\n\n  let observerWrapper: ObserverWrapper = {\n    visibleNodes,\n    hiddenNodes,\n    observe() {\n      observer.observe(root, {childList: true, subtree: true});\n    },\n    disconnect() {\n      observer.disconnect();\n    }\n  };\n\n  observerStack.push(observerWrapper);\n\n  return (): void => {\n    observer.disconnect();\n    if (shadowDOM()) {\n      for (let shadowObserver of shadowObservers) {\n        shadowObserver.disconnect();\n      }\n    }\n\n    for (let node of hiddenNodes) {\n      let count = refCountMap.get(node);\n      if (count == null) {\n        continue;\n      }\n      if (count === 1) {\n        setHidden(node, false);\n        refCountMap.delete(node);\n      } else {\n        refCountMap.set(node, count - 1);\n      }\n    }\n\n    // Remove this observer from the stack, and start the previous one.\n    if (observerWrapper === observerStack[observerStack.length - 1]) {\n      observerStack.pop();\n      if (observerStack.length) {\n        observerStack[observerStack.length - 1].observe();\n      }\n    } else {\n      observerStack.splice(observerStack.indexOf(observerWrapper), 1);\n    }\n  };\n}\n\nexport function keepVisible(element: Element): (() => void) | undefined {\n  let observer = observerStack[observerStack.length - 1];\n  if (observer && !observer.visibleNodes.has(element)) {\n    observer.visibleNodes.add(element);\n    return () => {\n      observer.visibleNodes.delete(element);\n    };\n  }\n}\n"],"names":[],"version":3,"file":"ariaHideOutside.cjs.map"}