{"mappings":"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","sources":["packages/react-aria/src/utils/scrollIntoView.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 {getScrollParents} from './getScrollParents';\nimport {isIOS} from './platform';\n\ninterface ScrollIntoViewOpts {\n  /** The position to align items along the block axis in. */\n  block?: ScrollLogicalPosition;\n  /** The position to align items along the inline axis in. */\n  inline?: ScrollLogicalPosition;\n}\n\ninterface ScrollIntoViewportOpts {\n  /** The optional containing element of the target to be centered in the viewport. */\n  containingElement?: Element | null;\n}\n\n/**\n * Scrolls `scrollView` so that `element` is visible.\n * Similar to `element.scrollIntoView({block: 'nearest'})` (not supported in Edge),\n * but doesn't affect parents above `scrollView`.\n */\nexport function scrollIntoView(\n  scrollView: HTMLElement,\n  element: HTMLElement,\n  opts: ScrollIntoViewOpts = {}\n): void {\n  let {block = 'nearest', inline = 'nearest'} = opts;\n\n  if (scrollView === element) {\n    return;\n  }\n\n  let y = scrollView.scrollTop;\n  let x = scrollView.scrollLeft;\n\n  let target = element.getBoundingClientRect();\n  let view = scrollView.getBoundingClientRect();\n  let itemStyle = window.getComputedStyle(element);\n  let viewStyle = window.getComputedStyle(scrollView);\n  let root = document.scrollingElement || document.documentElement;\n  let isRoot = scrollView === root;\n\n  let viewTop = scrollView === root ? 0 : view.top;\n  let viewBottom = scrollView === root ? scrollView.clientHeight : view.bottom;\n  let viewLeft = scrollView === root ? 0 : view.left;\n  let viewRight = scrollView === root ? scrollView.clientWidth : view.right;\n\n  let scrollMarginTop = parseFloat(itemStyle.scrollMarginTop) || 0;\n  let scrollMarginBottom = parseFloat(itemStyle.scrollMarginBottom) || 0;\n  let scrollMarginLeft = parseFloat(itemStyle.scrollMarginLeft) || 0;\n  let scrollMarginRight = parseFloat(itemStyle.scrollMarginRight) || 0;\n\n  let scrollPaddingTop = parseFloat(viewStyle.scrollPaddingTop) || 0;\n  let scrollPaddingBottom = parseFloat(viewStyle.scrollPaddingBottom) || 0;\n  let scrollPaddingLeft = parseFloat(viewStyle.scrollPaddingLeft) || 0;\n  let scrollPaddingRight = parseFloat(viewStyle.scrollPaddingRight) || 0;\n\n  let borderTopWidth = parseFloat(viewStyle.borderTopWidth) || 0;\n  let borderBottomWidth = parseFloat(viewStyle.borderBottomWidth) || 0;\n  let borderLeftWidth = parseFloat(viewStyle.borderLeftWidth) || 0;\n  let borderRightWidth = parseFloat(viewStyle.borderRightWidth) || 0;\n\n  let scrollAreaTop = target.top - scrollMarginTop;\n  let scrollAreaBottom = target.bottom + scrollMarginBottom;\n  let scrollAreaLeft = target.left - scrollMarginLeft;\n  let scrollAreaRight = target.right + scrollMarginRight;\n\n  let scrollBarOffsetX = scrollView === root ? 0 : borderLeftWidth + borderRightWidth;\n  let scrollBarOffsetY = scrollView === root ? 0 : borderTopWidth + borderBottomWidth;\n  let scrollBarWidth =\n    scrollView === root ? 0 : scrollView.offsetWidth - scrollView.clientWidth - scrollBarOffsetX;\n  let scrollBarHeight =\n    scrollView === root ? 0 : scrollView.offsetHeight - scrollView.clientHeight - scrollBarOffsetY;\n\n  let scrollPortTop = viewTop + (isRoot ? 0 : borderTopWidth) + scrollPaddingTop;\n  let scrollPortBottom =\n    viewBottom - (isRoot ? 0 : borderBottomWidth) - scrollPaddingBottom - scrollBarHeight;\n  let scrollPortLeft = viewLeft + (isRoot ? 0 : borderLeftWidth) + scrollPaddingLeft;\n  let scrollPortRight = viewRight - (isRoot ? 0 : borderRightWidth) - scrollPaddingRight;\n\n  // IOS always positions the scrollbar on the right ¯\\_(ツ)_/¯\n  if (viewStyle.direction === 'rtl' && !isIOS()) {\n    scrollPortLeft += scrollBarWidth;\n  } else {\n    scrollPortRight -= scrollBarWidth;\n  }\n\n  let shouldScrollBlock = scrollAreaTop < scrollPortTop || scrollAreaBottom > scrollPortBottom;\n  let shouldScrollInline = scrollAreaLeft < scrollPortLeft || scrollAreaRight > scrollPortRight;\n\n  if (shouldScrollBlock && block === 'start') {\n    y += scrollAreaTop - scrollPortTop;\n  } else if (shouldScrollBlock && block === 'center') {\n    y += (scrollAreaTop + scrollAreaBottom) / 2 - (scrollPortTop + scrollPortBottom) / 2;\n  } else if (shouldScrollBlock && block === 'end') {\n    y += scrollAreaBottom - scrollPortBottom;\n  } else if (shouldScrollBlock && block === 'nearest') {\n    let start = scrollAreaTop - scrollPortTop;\n    let end = scrollAreaBottom - scrollPortBottom;\n    y += Math.abs(start) <= Math.abs(end) ? start : end;\n  }\n\n  if (shouldScrollInline && inline === 'start') {\n    x += scrollAreaLeft - scrollPortLeft;\n  } else if (shouldScrollInline && inline === 'center') {\n    x += (scrollAreaLeft + scrollAreaRight) / 2 - (scrollPortLeft + scrollPortRight) / 2;\n  } else if (shouldScrollInline && inline === 'end') {\n    x += scrollAreaRight - scrollPortRight;\n  } else if (shouldScrollInline && inline === 'nearest') {\n    let start = scrollAreaLeft - scrollPortLeft;\n    let end = scrollAreaRight - scrollPortRight;\n    x += Math.abs(start) <= Math.abs(end) ? start : end;\n  }\n\n  if (process.env.NODE_ENV === 'test') {\n    scrollView.scrollLeft = x;\n    scrollView.scrollTop = y;\n    return;\n  }\n\n  scrollView.scrollTo({left: x, top: y});\n}\n\n/**\n * Scrolls the `targetElement` so it is visible in the viewport. Accepts an optional\n * `opts.containingElement` that will be centered in the viewport prior to scrolling the\n * targetElement into view. If scrolling is prevented on the body (e.g. targetElement is in a\n * popover), this will only scroll the scroll parents of the targetElement up to but not including\n * the body itself.\n */\nexport function scrollIntoViewport(\n  targetElement: Element | null,\n  opts: ScrollIntoViewportOpts = {}\n): void {\n  let {containingElement} = opts;\n  if (targetElement && targetElement.isConnected) {\n    let root = document.scrollingElement || document.documentElement;\n    let isScrollPrevented = window.getComputedStyle(root).overflow === 'hidden';\n    if (!isScrollPrevented) {\n      let {left: originalLeft, top: originalTop} = targetElement.getBoundingClientRect();\n\n      // use scrollIntoView({block: 'nearest'}) instead of .focus to check if the element is fully in view or not since .focus()\n      // won't cause a scroll if the element is already focused and doesn't behave consistently when an element is partially out of view horizontally vs vertically\n      targetElement?.scrollIntoView?.({block: 'nearest'});\n      let {left: newLeft, top: newTop} = targetElement.getBoundingClientRect();\n      // Account for sub pixel differences from rounding\n      if (Math.abs(originalLeft - newLeft) > 1 || Math.abs(originalTop - newTop) > 1) {\n        containingElement?.scrollIntoView?.({block: 'center', inline: 'center'});\n        targetElement.scrollIntoView?.({block: 'nearest'});\n      }\n    } else {\n      let {left: originalLeft, top: originalTop} = targetElement.getBoundingClientRect();\n\n      // If scrolling is prevented, we don't want to scroll the body since it might move the overlay partially offscreen and the user can't scroll it back into view.\n      let scrollParents = getScrollParents(targetElement, true);\n      for (let scrollParent of scrollParents) {\n        scrollIntoView(scrollParent as HTMLElement, targetElement as HTMLElement);\n      }\n      let {left: newLeft, top: newTop} = targetElement.getBoundingClientRect();\n      // Account for sub pixel differences from rounding\n      if (Math.abs(originalLeft - newLeft) > 1 || Math.abs(originalTop - newTop) > 1) {\n        scrollParents = containingElement ? getScrollParents(containingElement, true) : [];\n        // scroll containing element into view first, then rescroll target element into view like the non chrome flow above\n        for (let scrollParent of scrollParents) {\n          scrollIntoView(scrollParent as HTMLElement, containingElement as HTMLElement, {\n            block: 'center',\n            inline: 'center'\n          });\n        }\n        for (let scrollParent of getScrollParents(targetElement, true)) {\n          scrollIntoView(scrollParent as HTMLElement, targetElement as HTMLElement);\n        }\n      }\n    }\n  }\n}\n"],"names":[],"version":3,"file":"scrollIntoView.cjs.map"}