{"mappings":";;;AAAA;;;;;;;;;;CAUC;;AAuBM,SAAS,0CAAe,UAAuB,EAAE,OAAoB,EAAE,OAA2B,CAAC,CAAC;IACzG,IAAI,SAAC,QAAQ,mBAAW,SAAS,WAAU,GAAG;IAE9C,IAAI,eAAe,SAAW;IAE9B,IAAI,IAAI,WAAW,SAAS;IAC5B,IAAI,IAAI,WAAW,UAAU;IAE7B,IAAI,SAAS,QAAQ,qBAAqB;IAC1C,IAAI,OAAO,WAAW,qBAAqB;IAC3C,IAAI,YAAY,OAAO,gBAAgB,CAAC;IACxC,IAAI,YAAY,OAAO,gBAAgB,CAAC;IACxC,IAAI,OAAO,SAAS,gBAAgB,IAAI,SAAS,eAAe;IAEhE,IAAI,UAAU,eAAe,OAAO,IAAI,KAAK,GAAG;IAChD,IAAI,aAAa,eAAe,OAAO,WAAW,YAAY,GAAG,KAAK,MAAM;IAC5E,IAAI,WAAW,eAAe,OAAO,IAAI,KAAK,IAAI;IAClD,IAAI,YAAY,eAAe,OAAO,WAAW,WAAW,GAAG,KAAK,KAAK;IAEzE,IAAI,kBAAkB,SAAS,UAAU,eAAe,EAAE,OAAO;IACjE,IAAI,qBAAqB,SAAS,UAAU,kBAAkB,EAAE,OAAO;IACvE,IAAI,mBAAmB,SAAS,UAAU,gBAAgB,EAAE,OAAO;IACnE,IAAI,oBAAoB,SAAS,UAAU,iBAAiB,EAAE,OAAO;IAErE,IAAI,mBAAmB,SAAS,UAAU,gBAAgB,EAAE,OAAO;IACnE,IAAI,sBAAsB,SAAS,UAAU,mBAAmB,EAAE,OAAO;IACzE,IAAI,oBAAoB,SAAS,UAAU,iBAAiB,EAAE,OAAO;IACrE,IAAI,qBAAqB,SAAS,UAAU,kBAAkB,EAAE,OAAO;IAEvE,IAAI,iBAAiB,SAAS,UAAU,cAAc,EAAE,OAAO;IAC/D,IAAI,oBAAoB,SAAS,UAAU,iBAAiB,EAAE,OAAO;IACrE,IAAI,kBAAkB,SAAS,UAAU,eAAe,EAAE,OAAO;IACjE,IAAI,mBAAmB,SAAS,UAAU,gBAAgB,EAAE,OAAO;IAEnE,IAAI,gBAAgB,OAAO,GAAG,GAAG;IACjC,IAAI,mBAAmB,OAAO,MAAM,GAAG;IACvC,IAAI,iBAAiB,OAAO,IAAI,GAAG;IACnC,IAAI,kBAAkB,OAAO,KAAK,GAAG;IAErC,IAAI,mBAAmB,eAAe,OAAO,IAAI,kBAAkB;IACnE,IAAI,mBAAmB,eAAe,OAAO,IAAI,iBAAiB;IAClE,IAAI,iBAAiB,WAAW,WAAW,GAAG,WAAW,WAAW,GAAG;IACvE,IAAI,kBAAkB,WAAW,YAAY,GAAG,WAAW,YAAY,GAAG;IAE1E,IAAI,gBAAgB,UAAU,iBAAiB;IAC/C,IAAI,mBAAmB,aAAa,oBAAoB,sBAAsB;IAC9E,IAAI,iBAAiB,WAAW,kBAAkB;IAClD,IAAI,kBAAkB,YAAY,mBAAmB;IAErD,4DAA4D;IAC5D,IAAI,UAAU,SAAS,KAAK,SAAS,CAAC,CAAA,GAAA,yCAAI,KACxC,kBAAkB;SAElB,mBAAmB;IAGrB,IAAI,oBAAoB,gBAAgB,iBAAiB,mBAAmB;IAC5E,IAAI,qBAAqB,iBAAiB,kBAAkB,kBAAkB;IAE9E,IAAI,qBAAqB,UAAU,SACjC,KAAK,gBAAgB;SAChB,IAAI,qBAAqB,UAAU,UACxC,KAAK,AAAC,CAAA,gBAAgB,gBAAe,IAAK,IAAI,AAAC,CAAA,gBAAgB,gBAAe,IAAK;SAC9E,IAAI,qBAAqB,UAAU,OACxC,KAAK,mBAAmB;SACnB,IAAI,qBAAqB,UAAU,WAAW;QACnD,IAAI,QAAQ,gBAAgB;QAC5B,IAAI,MAAM,mBAAmB;QAC7B,KAAK,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,OAAO,QAAQ;IAClD;IAEA,IAAI,sBAAsB,WAAW,SACnC,KAAK,iBAAiB;SACjB,IAAI,sBAAsB,WAAW,UAC1C,KAAK,AAAC,CAAA,iBAAiB,eAAc,IAAK,IAAI,AAAC,CAAA,iBAAiB,eAAc,IAAK;SAC9E,IAAI,sBAAsB,WAAW,OAC1C,KAAK,kBAAkB;SAClB,IAAI,sBAAsB,WAAW,WAAW;QACrD,IAAI,QAAQ,iBAAiB;QAC7B,IAAI,MAAM,kBAAkB;QAC5B,KAAK,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,OAAO,QAAQ;IAClD;IAEA,IAAI,QAAQ,GAAG,CAAC,QAAQ,KAAK,QAAQ;QACnC,WAAW,UAAU,GAAG;QACxB,WAAW,SAAS,GAAG;QACvB;IACF;IAEA,WAAW,QAAQ,CAAC;QAAC,MAAM;QAAG,KAAK;IAAC;AACtC;AAOO,SAAS,0CAAmB,aAA6B,EAAE,OAA+B,CAAC,CAAC;IACjG,IAAI,qBAAC,iBAAiB,EAAC,GAAG;IAC1B,IAAI,iBAAiB,cAAc,WAAW,EAAE;QAC9C,IAAI,OAAO,SAAS,gBAAgB,IAAI,SAAS,eAAe;QAChE,IAAI,oBAAoB,OAAO,gBAAgB,CAAC,MAAM,QAAQ,KAAK;QACnE,IAAI,CAAC,mBAAmB;YACtB,IAAI,EAAC,MAAM,YAAY,EAAE,KAAK,WAAW,EAAC,GAAG,cAAc,qBAAqB;YAEhF,0HAA0H;YAC1H,6JAA6J;YAC7J,eAAe,iBAAiB;gBAAC,OAAO;YAAS;YACjD,IAAI,EAAC,MAAM,OAAO,EAAE,KAAK,MAAM,EAAC,GAAG,cAAc,qBAAqB;YACtE,kDAAkD;YAClD,IAAI,AAAC,KAAK,GAAG,CAAC,eAAe,WAAW,KAAO,KAAK,GAAG,CAAC,cAAc,UAAU,GAAI;gBAClF,mBAAmB,iBAAiB;oBAAC,OAAO;oBAAU,QAAQ;gBAAQ;gBACtE,cAAc,cAAc,GAAG;oBAAC,OAAO;gBAAS;YAClD;QACF,OAAO;YACL,IAAI,EAAC,MAAM,YAAY,EAAE,KAAK,WAAW,EAAC,GAAG,cAAc,qBAAqB;YAEhF,+JAA+J;YAC/J,IAAI,gBAAgB,CAAA,GAAA,yCAAe,EAAE,eAAe;YACpD,KAAK,IAAI,gBAAgB,cACvB,0CAAe,cAA6B;YAE9C,IAAI,EAAC,MAAM,OAAO,EAAE,KAAK,MAAM,EAAC,GAAG,cAAc,qBAAqB;YACtE,kDAAkD;YAClD,IAAI,AAAC,KAAK,GAAG,CAAC,eAAe,WAAW,KAAO,KAAK,GAAG,CAAC,cAAc,UAAU,GAAI;gBAClF,gBAAgB,oBAAoB,CAAA,GAAA,yCAAe,EAAE,mBAAmB,QAAQ,EAAE;gBAClF,KAAK,IAAI,gBAAgB,cACvB,0CAAe,cAA6B,mBAAkC;oBAAC,OAAO;oBAAU,QAAQ;gBAAQ;YAEpH;QACF;IACF;AACF","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\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(scrollView: HTMLElement, element: HTMLElement, opts: ScrollIntoViewOpts = {}): void {\n  let {block = 'nearest', inline = 'nearest'} = opts;\n\n  if (scrollView === element) { return; }\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\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 = parseInt(itemStyle.scrollMarginTop, 10) || 0;\n  let scrollMarginBottom = parseInt(itemStyle.scrollMarginBottom, 10) || 0;\n  let scrollMarginLeft = parseInt(itemStyle.scrollMarginLeft, 10) || 0;\n  let scrollMarginRight = parseInt(itemStyle.scrollMarginRight, 10) || 0;\n\n  let scrollPaddingTop = parseInt(viewStyle.scrollPaddingTop, 10) || 0;\n  let scrollPaddingBottom = parseInt(viewStyle.scrollPaddingBottom, 10) || 0;\n  let scrollPaddingLeft = parseInt(viewStyle.scrollPaddingLeft, 10) || 0;\n  let scrollPaddingRight = parseInt(viewStyle.scrollPaddingRight, 10) || 0;\n\n  let borderTopWidth = parseInt(viewStyle.borderTopWidth, 10) || 0;\n  let borderBottomWidth = parseInt(viewStyle.borderBottomWidth, 10) || 0;\n  let borderLeftWidth = parseInt(viewStyle.borderLeftWidth, 10) || 0;\n  let borderRightWidth = parseInt(viewStyle.borderRightWidth, 10) || 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 = scrollView.offsetWidth - scrollView.clientWidth - scrollBarOffsetX;\n  let scrollBarHeight = scrollView.offsetHeight - scrollView.clientHeight - scrollBarOffsetY;\n\n  let scrollPortTop = viewTop + borderTopWidth + scrollPaddingTop;\n  let scrollPortBottom = viewBottom - borderBottomWidth - scrollPaddingBottom - scrollBarHeight;\n  let scrollPortLeft = viewLeft + borderLeftWidth + scrollPaddingLeft;\n  let scrollPortRight = viewRight - 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 `opts.containingElement`\n * that will be centered in the viewport prior to scrolling the targetElement into view. If scrolling is prevented on\n * the body (e.g. targetElement is in a popover), this will only scroll the scroll parents of the targetElement up to but not including the body itself.\n */\nexport function scrollIntoViewport(targetElement: Element | null, opts: ScrollIntoViewportOpts = {}): 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        for (let scrollParent of scrollParents) {\n          scrollIntoView(scrollParent as HTMLElement, containingElement as HTMLElement, {block: 'center', inline: 'center'});\n        }\n      }\n    }\n  }\n}\n"],"names":[],"version":3,"file":"scrollIntoView.mjs.map"}