{"ast":null,"code":"import * as React from 'react';\nimport { canUseDOM } from 'fbjs/lib/ExecutionEnvironment';\nimport View from \"../View\";\nimport createElement from \"../createElement\";\nimport StyleSheet from \"../StyleSheet\";\nimport UIManager from \"../UIManager\";\n\nvar FocusBracket = function FocusBracket() {\n  return createElement('div', {\n    accessibilityRole: 'none',\n    tabIndex: 0,\n    style: styles.focusBracket\n  });\n};\n\nfunction attemptFocus(element) {\n  if (!canUseDOM) {\n    return false;\n  }\n\n  try {\n    element.focus();\n  } catch (e) {}\n\n  return document.activeElement === element;\n}\n\nfunction focusFirstDescendant(element) {\n  for (var i = 0; i < element.childNodes.length; i++) {\n    var child = element.childNodes[i];\n\n    if (attemptFocus(child) || focusFirstDescendant(child)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction focusLastDescendant(element) {\n  for (var i = element.childNodes.length - 1; i >= 0; i--) {\n    var child = element.childNodes[i];\n\n    if (attemptFocus(child) || focusLastDescendant(child)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nvar ModalFocusTrap = function ModalFocusTrap(_ref) {\n  var active = _ref.active,\n      children = _ref.children;\n  var trapElementRef = React.useRef();\n  var focusRef = React.useRef({\n    trapFocusInProgress: false,\n    lastFocusedElement: null\n  });\n  React.useEffect(function () {\n    if (canUseDOM) {\n      var trapFocus = function trapFocus() {\n        if (trapElementRef.current == null || focusRef.current.trapFocusInProgress || !active) {\n          return;\n        }\n\n        try {\n          focusRef.current.trapFocusInProgress = true;\n\n          if (document.activeElement instanceof Node && !trapElementRef.current.contains(document.activeElement)) {\n            var hasFocused = focusFirstDescendant(trapElementRef.current);\n\n            if (focusRef.current.lastFocusedElement === document.activeElement) {\n              hasFocused = focusLastDescendant(trapElementRef.current);\n            }\n\n            if (!hasFocused && trapElementRef.current != null && document.activeElement) {\n              UIManager.focus(trapElementRef.current);\n            }\n          }\n        } finally {\n          focusRef.current.trapFocusInProgress = false;\n        }\n\n        focusRef.current.lastFocusedElement = document.activeElement;\n      };\n\n      trapFocus();\n      document.addEventListener('focus', trapFocus, true);\n      return function () {\n        return document.removeEventListener('focus', trapFocus, true);\n      };\n    }\n  }, [active]);\n  React.useEffect(function () {\n    if (canUseDOM) {\n      var lastFocusedElementOutsideTrap = document.activeElement;\n      return function () {\n        if (lastFocusedElementOutsideTrap && document.contains(lastFocusedElementOutsideTrap)) {\n          UIManager.focus(lastFocusedElementOutsideTrap);\n        }\n      };\n    }\n  }, []);\n  return React.createElement(React.Fragment, null, React.createElement(FocusBracket, null), React.createElement(View, {\n    ref: trapElementRef\n  }, children), React.createElement(FocusBracket, null));\n};\n\nexport default ModalFocusTrap;\nvar styles = StyleSheet.create({\n  focusBracket: {\n    outlineStyle: 'none'\n  }\n});","map":{"version":3,"sources":["/Users/rohitsingh/Documents/projects/new-nativebase-setup/NativeBase/example/node_modules/react-native-web/dist/exports/Modal/ModalFocusTrap.js"],"names":["React","canUseDOM","View","createElement","StyleSheet","UIManager","FocusBracket","accessibilityRole","tabIndex","style","styles","focusBracket","attemptFocus","element","focus","e","document","activeElement","focusFirstDescendant","i","childNodes","length","child","focusLastDescendant","ModalFocusTrap","_ref","active","children","trapElementRef","useRef","focusRef","trapFocusInProgress","lastFocusedElement","useEffect","trapFocus","current","Node","contains","hasFocused","addEventListener","removeEventListener","lastFocusedElementOutsideTrap","Fragment","ref","create","outlineStyle"],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Nicolas Gallagher.\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\nimport * as React from 'react';\nimport { canUseDOM } from 'fbjs/lib/ExecutionEnvironment';\nimport View from '../View';\nimport createElement from '../createElement';\nimport StyleSheet from '../StyleSheet';\nimport UIManager from '../UIManager';\n/**\n * This Component is used to \"wrap\" the modal we're opening\n * so that changing focus via tab will never leave the document.\n *\n * This allows us to properly trap the focus within a modal\n * even if the modal is at the start or end of a document.\n */\n\nvar FocusBracket = function FocusBracket() {\n  return createElement('div', {\n    accessibilityRole: 'none',\n    tabIndex: 0,\n    style: styles.focusBracket\n  });\n};\n\nfunction attemptFocus(element) {\n  if (!canUseDOM) {\n    return false;\n  }\n\n  try {\n    element.focus();\n  } catch (e) {// Do nothing\n  }\n\n  return document.activeElement === element;\n}\n\nfunction focusFirstDescendant(element) {\n  for (var i = 0; i < element.childNodes.length; i++) {\n    var child = element.childNodes[i];\n\n    if (attemptFocus(child) || focusFirstDescendant(child)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction focusLastDescendant(element) {\n  for (var i = element.childNodes.length - 1; i >= 0; i--) {\n    var child = element.childNodes[i];\n\n    if (attemptFocus(child) || focusLastDescendant(child)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nvar ModalFocusTrap = function ModalFocusTrap(_ref) {\n  var active = _ref.active,\n      children = _ref.children;\n  var trapElementRef = React.useRef();\n  var focusRef = React.useRef({\n    trapFocusInProgress: false,\n    lastFocusedElement: null\n  });\n  React.useEffect(function () {\n    if (canUseDOM) {\n      var trapFocus = function trapFocus() {\n        // We should not trap focus if:\n        // - The modal hasn't fully initialized with an HTMLElement ref\n        // - Focus is already in the process of being trapped (e.g., we're refocusing)\n        // - isTrapActive prop being falsey tells us to do nothing\n        if (trapElementRef.current == null || focusRef.current.trapFocusInProgress || !active) {\n          return;\n        }\n\n        try {\n          focusRef.current.trapFocusInProgress = true;\n\n          if (document.activeElement instanceof Node && !trapElementRef.current.contains(document.activeElement)) {\n            // To handle keyboard focusing we can make an assumption here.\n            // If you're tabbing through the focusable elements, the previously\n            // active element will either be the first or the last.\n            // If the previously selected element is the \"first\" descendant\n            // and we're leaving it - this means that we should be looping\n            // around to the other side of the modal.\n            var hasFocused = focusFirstDescendant(trapElementRef.current);\n\n            if (focusRef.current.lastFocusedElement === document.activeElement) {\n              hasFocused = focusLastDescendant(trapElementRef.current);\n            } // If we couldn't focus a new element then we need to focus onto the trap target\n\n\n            if (!hasFocused && trapElementRef.current != null && document.activeElement) {\n              UIManager.focus(trapElementRef.current);\n            }\n          }\n        } finally {\n          focusRef.current.trapFocusInProgress = false;\n        }\n\n        focusRef.current.lastFocusedElement = document.activeElement;\n      }; // Call the trapFocus callback at least once when this modal has been activated.\n\n\n      trapFocus();\n      document.addEventListener('focus', trapFocus, true);\n      return function () {\n        return document.removeEventListener('focus', trapFocus, true);\n      };\n    }\n  }, [active]); // To be fully compliant with WCAG we need to refocus element that triggered opening modal\n  // after closing it\n\n  React.useEffect(function () {\n    if (canUseDOM) {\n      var lastFocusedElementOutsideTrap = document.activeElement;\n      return function () {\n        if (lastFocusedElementOutsideTrap && document.contains(lastFocusedElementOutsideTrap)) {\n          UIManager.focus(lastFocusedElementOutsideTrap);\n        }\n      };\n    }\n  }, []);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FocusBracket, null), /*#__PURE__*/React.createElement(View, {\n    ref: trapElementRef\n  }, children), /*#__PURE__*/React.createElement(FocusBracket, null));\n};\n\nexport default ModalFocusTrap;\nvar styles = StyleSheet.create({\n  focusBracket: {\n    outlineStyle: 'none'\n  }\n});"]},"metadata":{},"sourceType":"module"}