react-aria 3.52.0 → 3.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/private/tokenfield/useTokenField.cjs +55 -2
- package/dist/private/tokenfield/useTokenField.cjs.map +1 -1
- package/dist/private/tokenfield/useTokenField.js +55 -2
- package/dist/private/tokenfield/useTokenField.js.map +1 -1
- package/dist/private/tokenfield/useTokenField.mjs +55 -2
- package/dist/private/tokenfield/useTokenField.mjs.map +1 -1
- package/dist/private/utils/scrollIntoView.cjs +6 -2
- package/dist/private/utils/scrollIntoView.cjs.map +1 -1
- package/dist/private/utils/scrollIntoView.js +6 -3
- package/dist/private/utils/scrollIntoView.js.map +1 -1
- package/dist/private/utils/scrollIntoView.mjs +6 -3
- package/dist/private/utils/scrollIntoView.mjs.map +1 -1
- package/dist/types/src/utils/scrollIntoView.d.ts +1 -0
- package/package.json +2 -2
|
@@ -7,6 +7,7 @@ function $parcel$export(e, n, v, s) {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
$parcel$export(module.exports, "scrollIntoView", function () { return $9a1324d6ffd8bbb0$export$53a0910f038337bd; });
|
|
10
|
+
$parcel$export(module.exports, "scrollRectIntoView", function () { return $9a1324d6ffd8bbb0$export$f064fd83a2c6e9ca; });
|
|
10
11
|
$parcel$export(module.exports, "scrollIntoViewport", function () { return $9a1324d6ffd8bbb0$export$c826860796309d1b; });
|
|
11
12
|
/*
|
|
12
13
|
* Copyright 2020 Adobe. All rights reserved.
|
|
@@ -21,11 +22,14 @@ $parcel$export(module.exports, "scrollIntoViewport", function () { return $9a132
|
|
|
21
22
|
*/
|
|
22
23
|
|
|
23
24
|
function $9a1324d6ffd8bbb0$export$53a0910f038337bd(scrollView, element, opts = {}) {
|
|
24
|
-
let { block: block = 'nearest', inline: inline = 'nearest' } = opts;
|
|
25
25
|
if (scrollView === element) return;
|
|
26
|
+
let target = element.getBoundingClientRect();
|
|
27
|
+
$9a1324d6ffd8bbb0$export$f064fd83a2c6e9ca(scrollView, element, target, opts);
|
|
28
|
+
}
|
|
29
|
+
function $9a1324d6ffd8bbb0$export$f064fd83a2c6e9ca(scrollView, element, target, opts = {}) {
|
|
30
|
+
let { block: block = 'nearest', inline: inline = 'nearest' } = opts;
|
|
26
31
|
let y = scrollView.scrollTop;
|
|
27
32
|
let x = scrollView.scrollLeft;
|
|
28
|
-
let target = element.getBoundingClientRect();
|
|
29
33
|
let view = scrollView.getBoundingClientRect();
|
|
30
34
|
let itemStyle = window.getComputedStyle(element);
|
|
31
35
|
let viewStyle = window.getComputedStyle(scrollView);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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, isWebKit} from '../utils/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 // WebKit on iOS always positions the scrollbar on the right ¯\\_(ツ)_/¯\n if ((isIOS() && isWebKit()) || viewStyle.direction === 'ltr') {\n scrollPortRight -= scrollBarWidth;\n } else if (viewStyle.direction === 'rtl') {\n scrollPortLeft += 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"}
|
|
1
|
+
{"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, isWebKit} from '../utils/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 if (scrollView === element) {\n return;\n }\n\n let target = element.getBoundingClientRect();\n scrollRectIntoView(scrollView, element, target, opts);\n}\n\nexport function scrollRectIntoView(\n scrollView: HTMLElement,\n element: HTMLElement,\n target: DOMRect,\n opts: ScrollIntoViewOpts = {}\n) {\n let {block = 'nearest', inline = 'nearest'} = opts;\n let y = scrollView.scrollTop;\n let x = scrollView.scrollLeft;\n\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 // WebKit on iOS always positions the scrollbar on the right ¯\\_(ツ)_/¯\n if ((isIOS() && isWebKit()) || viewStyle.direction === 'ltr') {\n scrollPortRight -= scrollBarWidth;\n } else if (viewStyle.direction === 'rtl') {\n scrollPortLeft += 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"}
|
|
@@ -14,11 +14,14 @@ import {isIOS as $d5a2be505488529f$export$fedb369cb70207f1, isWebKit as $d5a2be5
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
function $6507765bd7f5ad94$export$53a0910f038337bd(scrollView, element, opts = {}) {
|
|
17
|
-
let { block: block = 'nearest', inline: inline = 'nearest' } = opts;
|
|
18
17
|
if (scrollView === element) return;
|
|
18
|
+
let target = element.getBoundingClientRect();
|
|
19
|
+
$6507765bd7f5ad94$export$f064fd83a2c6e9ca(scrollView, element, target, opts);
|
|
20
|
+
}
|
|
21
|
+
function $6507765bd7f5ad94$export$f064fd83a2c6e9ca(scrollView, element, target, opts = {}) {
|
|
22
|
+
let { block: block = 'nearest', inline: inline = 'nearest' } = opts;
|
|
19
23
|
let y = scrollView.scrollTop;
|
|
20
24
|
let x = scrollView.scrollLeft;
|
|
21
|
-
let target = element.getBoundingClientRect();
|
|
22
25
|
let view = scrollView.getBoundingClientRect();
|
|
23
26
|
let itemStyle = window.getComputedStyle(element);
|
|
24
27
|
let viewStyle = window.getComputedStyle(scrollView);
|
|
@@ -129,5 +132,5 @@ function $6507765bd7f5ad94$export$c826860796309d1b(targetElement, opts = {}) {
|
|
|
129
132
|
}
|
|
130
133
|
|
|
131
134
|
|
|
132
|
-
export {$6507765bd7f5ad94$export$53a0910f038337bd as scrollIntoView, $6507765bd7f5ad94$export$c826860796309d1b as scrollIntoViewport};
|
|
135
|
+
export {$6507765bd7f5ad94$export$53a0910f038337bd as scrollIntoView, $6507765bd7f5ad94$export$f064fd83a2c6e9ca as scrollRectIntoView, $6507765bd7f5ad94$export$c826860796309d1b as scrollIntoViewport};
|
|
133
136
|
//# sourceMappingURL=scrollIntoView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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, isWebKit} from '../utils/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 // WebKit on iOS always positions the scrollbar on the right ¯\\_(ツ)_/¯\n if ((isIOS() && isWebKit()) || viewStyle.direction === 'ltr') {\n scrollPortRight -= scrollBarWidth;\n } else if (viewStyle.direction === 'rtl') {\n scrollPortLeft += 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.js.map"}
|
|
1
|
+
{"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, isWebKit} from '../utils/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 if (scrollView === element) {\n return;\n }\n\n let target = element.getBoundingClientRect();\n scrollRectIntoView(scrollView, element, target, opts);\n}\n\nexport function scrollRectIntoView(\n scrollView: HTMLElement,\n element: HTMLElement,\n target: DOMRect,\n opts: ScrollIntoViewOpts = {}\n) {\n let {block = 'nearest', inline = 'nearest'} = opts;\n let y = scrollView.scrollTop;\n let x = scrollView.scrollLeft;\n\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 // WebKit on iOS always positions the scrollbar on the right ¯\\_(ツ)_/¯\n if ((isIOS() && isWebKit()) || viewStyle.direction === 'ltr') {\n scrollPortRight -= scrollBarWidth;\n } else if (viewStyle.direction === 'rtl') {\n scrollPortLeft += 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.js.map"}
|
|
@@ -14,11 +14,14 @@ import {isIOS as $2add3ce32c6007eb$export$fedb369cb70207f1, isWebKit as $2add3ce
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
function $51a3e22a5186a962$export$53a0910f038337bd(scrollView, element, opts = {}) {
|
|
17
|
-
let { block: block = 'nearest', inline: inline = 'nearest' } = opts;
|
|
18
17
|
if (scrollView === element) return;
|
|
18
|
+
let target = element.getBoundingClientRect();
|
|
19
|
+
$51a3e22a5186a962$export$f064fd83a2c6e9ca(scrollView, element, target, opts);
|
|
20
|
+
}
|
|
21
|
+
function $51a3e22a5186a962$export$f064fd83a2c6e9ca(scrollView, element, target, opts = {}) {
|
|
22
|
+
let { block: block = 'nearest', inline: inline = 'nearest' } = opts;
|
|
19
23
|
let y = scrollView.scrollTop;
|
|
20
24
|
let x = scrollView.scrollLeft;
|
|
21
|
-
let target = element.getBoundingClientRect();
|
|
22
25
|
let view = scrollView.getBoundingClientRect();
|
|
23
26
|
let itemStyle = window.getComputedStyle(element);
|
|
24
27
|
let viewStyle = window.getComputedStyle(scrollView);
|
|
@@ -127,5 +130,5 @@ function $51a3e22a5186a962$export$c826860796309d1b(targetElement, opts = {}) {
|
|
|
127
130
|
}
|
|
128
131
|
|
|
129
132
|
|
|
130
|
-
export {$51a3e22a5186a962$export$53a0910f038337bd as scrollIntoView, $51a3e22a5186a962$export$c826860796309d1b as scrollIntoViewport};
|
|
133
|
+
export {$51a3e22a5186a962$export$53a0910f038337bd as scrollIntoView, $51a3e22a5186a962$export$f064fd83a2c6e9ca as scrollRectIntoView, $51a3e22a5186a962$export$c826860796309d1b as scrollIntoViewport};
|
|
131
134
|
//# sourceMappingURL=scrollIntoView.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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, isWebKit} from '../utils/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 // WebKit on iOS always positions the scrollbar on the right ¯\\_(ツ)_/¯\n if ((isIOS() && isWebKit()) || viewStyle.direction === 'ltr') {\n scrollPortRight -= scrollBarWidth;\n } else if (viewStyle.direction === 'rtl') {\n scrollPortLeft += 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.mjs.map"}
|
|
1
|
+
{"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, isWebKit} from '../utils/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 if (scrollView === element) {\n return;\n }\n\n let target = element.getBoundingClientRect();\n scrollRectIntoView(scrollView, element, target, opts);\n}\n\nexport function scrollRectIntoView(\n scrollView: HTMLElement,\n element: HTMLElement,\n target: DOMRect,\n opts: ScrollIntoViewOpts = {}\n) {\n let {block = 'nearest', inline = 'nearest'} = opts;\n let y = scrollView.scrollTop;\n let x = scrollView.scrollLeft;\n\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 // WebKit on iOS always positions the scrollbar on the right ¯\\_(ツ)_/¯\n if ((isIOS() && isWebKit()) || viewStyle.direction === 'ltr') {\n scrollPortRight -= scrollBarWidth;\n } else if (viewStyle.direction === 'rtl') {\n scrollPortLeft += 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.mjs.map"}
|
|
@@ -14,6 +14,7 @@ interface ScrollIntoViewportOpts {
|
|
|
14
14
|
* but doesn't affect parents above `scrollView`.
|
|
15
15
|
*/
|
|
16
16
|
export declare function scrollIntoView(scrollView: HTMLElement, element: HTMLElement, opts?: ScrollIntoViewOpts): void;
|
|
17
|
+
export declare function scrollRectIntoView(scrollView: HTMLElement, element: HTMLElement, target: DOMRect, opts?: ScrollIntoViewOpts): void;
|
|
17
18
|
/**
|
|
18
19
|
* Scrolls the `targetElement` so it is visible in the viewport. Accepts an optional
|
|
19
20
|
* `opts.containingElement` that will be centered in the viewport prior to scrolling the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-aria",
|
|
3
|
-
"version": "3.52.
|
|
3
|
+
"version": "3.52.1",
|
|
4
4
|
"description": "Spectrum UI components in React",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./dist/exports/index.cjs",
|
|
@@ -110,5 +110,5 @@
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
},
|
|
113
|
-
"gitHead": "
|
|
113
|
+
"gitHead": "4dd44e0f400636a87a9ad4390903e78c5ae6113c"
|
|
114
114
|
}
|