{"ast":null,"code":"import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nimport { calculatePosition } from \"./calculatePosition\";\nimport { useCallback, useRef, useState } from 'react';\nimport { useCloseOnScroll } from \"./useCloseOnScroll\";\nimport { isRTL, useLayoutEffect } from '@react-native-aria/utils';\nvar visualViewport = typeof window !== 'undefined' && window.visualViewport;\nexport function useOverlayPosition(props) {\n  var direction = isRTL() ? 'rtl' : undefined;\n  var targetRef = props.targetRef,\n      overlayRef = props.overlayRef,\n      _props$scrollRef = props.scrollRef,\n      scrollRef = _props$scrollRef === void 0 ? overlayRef : _props$scrollRef,\n      _props$placement = props.placement,\n      placement = _props$placement === void 0 ? 'bottom' : _props$placement,\n      _props$containerPaddi = props.containerPadding,\n      containerPadding = _props$containerPaddi === void 0 ? 12 : _props$containerPaddi,\n      _props$shouldFlip = props.shouldFlip,\n      shouldFlip = _props$shouldFlip === void 0 ? true : _props$shouldFlip,\n      _props$boundaryElemen = props.boundaryElement,\n      boundaryElement = _props$boundaryElemen === void 0 ? typeof document !== 'undefined' ? document.body : null : _props$boundaryElemen,\n      _props$offset = props.offset,\n      offset = _props$offset === void 0 ? 0 : _props$offset,\n      _props$crossOffset = props.crossOffset,\n      crossOffset = _props$crossOffset === void 0 ? 0 : _props$crossOffset,\n      _props$shouldUpdatePo = props.shouldUpdatePosition,\n      shouldUpdatePosition = _props$shouldUpdatePo === void 0 ? true : _props$shouldUpdatePo,\n      _props$isOpen = props.isOpen,\n      isOpen = _props$isOpen === void 0 ? true : _props$isOpen,\n      _props$shouldOverlapW = props.shouldOverlapWithTrigger,\n      shouldOverlapWithTrigger = _props$shouldOverlapW === void 0 ? false : _props$shouldOverlapW,\n      onClose = props.onClose;\n\n  var _useState = useState({\n    position: {},\n    arrowOffsetLeft: undefined,\n    arrowOffsetTop: undefined,\n    maxHeight: undefined,\n    placement: undefined\n  }),\n      _useState2 = _slicedToArray(_useState, 2),\n      position = _useState2[0],\n      setPosition = _useState2[1];\n\n  var deps = [shouldUpdatePosition, placement, overlayRef.current, targetRef.current, scrollRef.current, containerPadding, shouldFlip, boundaryElement, offset, crossOffset, isOpen, direction, shouldOverlapWithTrigger];\n  var updatePosition = useCallback(function () {\n    if (shouldUpdatePosition === false || !isOpen || !overlayRef.current || !targetRef.current || !scrollRef.current || !boundaryElement) {\n      return;\n    }\n\n    setPosition(calculatePosition({\n      placement: translateRTL(placement, direction),\n      overlayNode: overlayRef.current,\n      targetNode: targetRef.current,\n      scrollNode: scrollRef.current,\n      padding: containerPadding,\n      shouldFlip: shouldFlip,\n      boundaryElement: boundaryElement,\n      offset: offset,\n      crossOffset: crossOffset,\n      shouldOverlapWithTrigger: shouldOverlapWithTrigger\n    }));\n  }, deps);\n  useLayoutEffect(updatePosition, deps);\n  useResize(updatePosition);\n  var isResizing = useRef(false);\n  useLayoutEffect(function () {\n    var timeout;\n\n    var onResize = function onResize() {\n      isResizing.current = true;\n      clearTimeout(timeout);\n      timeout = setTimeout(function () {\n        isResizing.current = false;\n      }, 500);\n      updatePosition();\n    };\n\n    visualViewport === null || visualViewport === void 0 ? void 0 : visualViewport.addEventListener('resize', onResize);\n    return function () {\n      visualViewport === null || visualViewport === void 0 ? void 0 : visualViewport.removeEventListener('resize', onResize);\n    };\n  }, [updatePosition]);\n  var close = useCallback(function () {\n    if (!isResizing.current) {\n      onClose();\n    }\n  }, [onClose, isResizing]);\n  useCloseOnScroll({\n    triggerRef: targetRef,\n    isOpen: isOpen,\n    onClose: onClose ? close : undefined\n  });\n  return {\n    rendered: true,\n    overlayProps: {\n      style: _objectSpread(_objectSpread({\n        position: 'absolute',\n        zIndex: 100000\n      }, position.position), {}, {\n        maxHeight: position.maxHeight\n      })\n    },\n    placement: position.placement,\n    arrowProps: {\n      style: {\n        left: position.arrowOffsetLeft,\n        top: position.arrowOffsetTop\n      }\n    },\n    updatePosition: updatePosition\n  };\n}\n\nfunction useResize(onResize) {\n  useLayoutEffect(function () {\n    window.addEventListener('resize', onResize, false);\n    return function () {\n      window.removeEventListener('resize', onResize, false);\n    };\n  }, [onResize]);\n}\n\nfunction translateRTL(position, direction) {\n  if (direction === 'rtl') {\n    return position.replace('start', 'right').replace('end', 'left');\n  }\n\n  return position.replace('start', 'left').replace('end', 'right');\n}","map":{"version":3,"sources":["useOverlayPosition.ts"],"names":["visualViewport","window","direction","isRTL","scrollRef","placement","containerPadding","shouldFlip","boundaryElement","document","offset","crossOffset","shouldUpdatePosition","isOpen","shouldOverlapWithTrigger","onClose","useState","position","arrowOffsetLeft","arrowOffsetTop","maxHeight","undefined","deps","overlayRef","targetRef","updatePosition","useCallback","setPosition","calculatePosition","translateRTL","overlayNode","targetNode","scrollNode","padding","useLayoutEffect","useResize","isResizing","useRef","onResize","clearTimeout","timeout","setTimeout","close","useCloseOnScroll","triggerRef","rendered","overlayProps","style","zIndex","arrowProps","left","top"],"mappings":"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","sourcesContent":["//@ts-nocheck\n/*\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 { calculatePosition, PositionResult } from './calculatePosition';\nimport {\n  HTMLAttributes,\n  RefObject,\n  useCallback,\n  useRef,\n  useState,\n} from 'react';\nimport { Placement, PlacementAxis, PositionProps } from '@react-types/overlays';\nimport { useCloseOnScroll } from './useCloseOnScroll';\nimport { isRTL, useLayoutEffect } from '@react-native-aria/utils';\n\ninterface AriaPositionProps extends PositionProps {\n  /**\n   * Element that that serves as the positioning boundary.\n   * @default document.body\n   */\n  boundaryElement?: HTMLElement;\n  /**\n   * The ref for the element which the overlay positions itself with respect to.\n   */\n  targetRef: RefObject<HTMLElement>;\n  /**\n   * The ref for the overlay element.\n   */\n  overlayRef: RefObject<HTMLElement>;\n  /**\n   * A ref for the scrollable region within the overlay.\n   * @default overlayRef\n   */\n  scrollRef?: RefObject<HTMLElement>;\n  /**\n   * Whether the overlay should update its position automatically.\n   * @default true\n   */\n  shouldUpdatePosition?: boolean;\n  /** Handler that is called when the overlay should close. */\n  onClose?: () => void;\n  /** Determines whether the overlay should overlap with the trigger */\n  shouldOverlapWithTrigger?: boolean;\n}\n\ninterface PositionAria {\n  /** Props for the overlay container element. */\n  overlayProps: HTMLAttributes<Element>;\n  /** Props for the overlay tip arrow if any. */\n  arrowProps: HTMLAttributes<Element>;\n  /** Placement of the overlay with respect to the overlay trigger. */\n  placement: PlacementAxis;\n  /** Updates the position of the overlay. */\n  updatePosition(): void;\n}\n\n// @ts-ignore\nlet visualViewport = typeof window !== 'undefined' && window.visualViewport;\n\n/**\n * Handles positioning overlays like popovers and menus relative to a trigger\n * element, and updating the position when the window resizes.\n */\nexport function useOverlayPosition(props: AriaPositionProps): PositionAria {\n  const direction = isRTL() ? 'rtl' : undefined;\n  let {\n    targetRef,\n    overlayRef,\n    scrollRef = overlayRef,\n    placement = 'bottom' as Placement,\n    containerPadding = 12,\n    shouldFlip = true,\n    boundaryElement = typeof document !== 'undefined' ? document.body : null,\n    offset = 0,\n    crossOffset = 0,\n    shouldUpdatePosition = true,\n    isOpen = true,\n    shouldOverlapWithTrigger = false,\n    onClose,\n  } = props;\n  let [position, setPosition] = useState<PositionResult>({\n    position: {},\n    arrowOffsetLeft: undefined,\n    arrowOffsetTop: undefined,\n    maxHeight: undefined,\n    placement: undefined,\n  });\n\n  let deps = [\n    shouldUpdatePosition,\n    placement,\n    overlayRef.current,\n    targetRef.current,\n    scrollRef.current,\n    containerPadding,\n    shouldFlip,\n    boundaryElement,\n    offset,\n    crossOffset,\n    isOpen,\n    direction,\n    shouldOverlapWithTrigger\n  ];\n\n  let updatePosition = useCallback(() => {\n    if (\n      shouldUpdatePosition === false ||\n      !isOpen ||\n      !overlayRef.current ||\n      !targetRef.current ||\n      !scrollRef.current ||\n      !boundaryElement\n    ) {\n      return;\n    }\n\n    setPosition(\n      calculatePosition({\n        placement: translateRTL(placement, direction),\n        overlayNode: overlayRef.current,\n        targetNode: targetRef.current,\n        scrollNode: scrollRef.current,\n        padding: containerPadding,\n        shouldFlip,\n        boundaryElement,\n        offset,\n        crossOffset,\n        shouldOverlapWithTrigger,\n      })\n    );\n  }, deps);\n\n  // Update position when anything changes\n  useLayoutEffect(updatePosition, deps);\n\n  // Update position on window resize\n  useResize(updatePosition);\n\n  // Reposition the overlay and do not close on scroll while the visual viewport is resizing.\n  // This will ensure that overlays adjust their positioning when the iOS virtual keyboard appears.\n  let isResizing = useRef(false);\n  useLayoutEffect(() => {\n    let timeout: NodeJS.Timeout;\n    let onResize = () => {\n      isResizing.current = true;\n      clearTimeout(timeout);\n\n      timeout = setTimeout(() => {\n        isResizing.current = false;\n      }, 500);\n\n      updatePosition();\n    };\n\n    visualViewport?.addEventListener('resize', onResize);\n\n    return () => {\n      visualViewport?.removeEventListener('resize', onResize);\n    };\n  }, [updatePosition]);\n\n  let close = useCallback(() => {\n    if (!isResizing.current) {\n      onClose();\n    }\n  }, [onClose, isResizing]);\n\n  // When scrolling a parent scrollable region of the trigger (other than the body),\n  // we hide the popover. Otherwise, its position would be incorrect.\n  useCloseOnScroll({\n    triggerRef: targetRef,\n    isOpen,\n    onClose: onClose ? close : undefined,\n  });\n\n  return {\n    rendered: true,\n    overlayProps: {\n      style: {\n        position: 'absolute',\n        zIndex: 100000, // should match the z-index in ModalTrigger\n        ...position.position,\n        maxHeight: position.maxHeight,\n      },\n    },\n    placement: position.placement,\n    arrowProps: {\n      style: {\n        left: position.arrowOffsetLeft,\n        top: position.arrowOffsetTop,\n      },\n    },\n    updatePosition,\n  };\n}\n\nfunction useResize(onResize) {\n  useLayoutEffect(() => {\n    window.addEventListener('resize', onResize, false);\n    return () => {\n      window.removeEventListener('resize', onResize, false);\n    };\n  }, [onResize]);\n}\n\nfunction translateRTL(position, direction) {\n  if (direction === 'rtl') {\n    return position.replace('start', 'right').replace('end', 'left');\n  }\n  return position.replace('start', 'left').replace('end', 'right');\n}\n"]},"metadata":{},"sourceType":"module"}