@react-native-aria/overlays 0.3.5 → 0.3.7

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.
@@ -18,6 +18,8 @@ var _scrollTop = _interopRequireDefault(require("dom-helpers/scrollTop"));
18
18
 
19
19
  var _ownerDocument = _interopRequireDefault(require("dom-helpers/ownerDocument"));
20
20
 
21
+ var _getComputedStyle = _interopRequireDefault(require("dom-helpers/getComputedStyle"));
22
+
21
23
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
24
 
23
25
  // @ts-nocheck
@@ -174,18 +176,24 @@ function computePosition(childOffset, boundaryDimensions, overlaySize, placement
174
176
  position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];
175
177
  }
176
178
  /* else {
177
- the overlay top should match the button top
179
+ the overlay top should match the button top
178
180
  } */
179
181
  // add the crossOffset from props
180
182
 
181
183
 
182
- position[crossAxis] += crossOffset; // this is button center position - the overlay size + half of the button to align bottom of overlay with button center
183
-
184
- let minViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2 - overlaySize[crossSize]; // this is button position of center, aligns top of overlay with button center
185
-
186
- let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2; // clamp it into the range of the min/max positions
187
-
188
- position[crossAxis] = Math.min(Math.max(minViablePosition, position[crossAxis]), maxViablePosition); // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.
184
+ position[crossAxis] += crossOffset; // // this is button center position - the overlay size + half of the button to align bottom of overlay with button center
185
+ // let minViablePosition =
186
+ // childOffset[crossAxis] +
187
+ // childOffset[crossSize] / 2 -
188
+ // overlaySize[crossSize];
189
+ // // this is button position of center, aligns top of overlay with button center
190
+ // let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;
191
+ // // clamp it into the range of the min/max positions
192
+ // position[crossAxis] = Math.min(
193
+ // Math.max(minViablePosition, position[crossAxis]),
194
+ // maxViablePosition
195
+ // );
196
+ // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.
189
197
 
190
198
  if (placement === axis) {
191
199
  // If the container is positioned (non-static), then we use the container's actual
@@ -202,14 +210,14 @@ function computePosition(childOffset, boundaryDimensions, overlaySize, placement
202
210
  }
203
211
 
204
212
  function getMaxHeight(position, boundaryDimensions, containerOffsetWithBoundary, childOffset, margins, padding) {
205
- return position.top != null // We want the distance between the top of the overlay to the bottom of the boundary
206
- ? Math.max(0, boundaryDimensions.height + boundaryDimensions.top + boundaryDimensions.scroll.top - ( // this is the bottom of the boundary
207
- containerOffsetWithBoundary.top + position.top) // this is the top of the overlay
208
- - (margins.top + margins.bottom + padding) // save additional space for margin and padding
209
- ) // We want the distance between the top of the trigger to the top of the boundary
210
- : Math.max(0, childOffset.top + containerOffsetWithBoundary.top - ( // this is the top of the trigger
211
- boundaryDimensions.top + boundaryDimensions.scroll.top) // this is the top of the boundary
212
- - (margins.top + margins.bottom + padding) // save additional space for margin and padding
213
+ return position.top != null ? // We want the distance between the top of the overlay to the bottom of the boundary
214
+ Math.max(0, boundaryDimensions.height + boundaryDimensions.top + boundaryDimensions.scroll.top - ( // this is the bottom of the boundary
215
+ containerOffsetWithBoundary.top + position.top) - ( // this is the top of the overlay
216
+ margins.top + margins.bottom + padding) // save additional space for margin and padding
217
+ ) : // We want the distance between the top of the trigger to the top of the boundary
218
+ Math.max(0, childOffset.top + containerOffsetWithBoundary.top - ( // this is the top of the trigger
219
+ boundaryDimensions.top + boundaryDimensions.scroll.top) - ( // this is the top of the boundary
220
+ margins.top + margins.bottom + padding) // save additional space for margin and padding
213
221
  );
214
222
  }
215
223
 
@@ -305,9 +313,38 @@ function calculatePosition(opts) {
305
313
  }
306
314
 
307
315
  let overlaySize = (0, _offset.default)(overlayNode);
316
+ const matrix = (0, _getComputedStyle.default)(overlayNode).getPropertyValue('transform');
317
+ const transform = matrix;
318
+ const regex = /matrix\((-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+)\)/;
319
+ const matches = transform.match(regex);
320
+ let scaleX = 1;
321
+ let scaleY = 1;
322
+
323
+ if (matches) {
324
+ scaleX = parseFloat(matches[1]);
325
+ scaleY = parseFloat(matches[4]);
326
+
327
+ if (!scaleX || !Number.isFinite(scaleX)) {
328
+ scaleX = 1;
329
+ }
330
+
331
+ if (!scaleY || !Number.isFinite(scaleY)) {
332
+ scaleY = 1;
333
+ }
334
+ }
335
+
308
336
  let margins = getMargins(overlayNode);
309
337
  overlaySize.width += margins.left + margins.right;
310
338
  overlaySize.height += margins.top + margins.bottom;
339
+
340
+ if (scaleX) {
341
+ overlaySize.width = overlaySize.width / scaleX;
342
+ }
343
+
344
+ if (scaleY) {
345
+ overlaySize.height = overlaySize.height / scaleY;
346
+ }
347
+
311
348
  let scrollSize = getScroll(scrollNode);
312
349
  let boundaryDimensions = getContainerDimensions(boundaryElement);
313
350
  let containerOffsetWithBoundary = boundaryElement.tagName === 'BODY' ? (0, _offset.default)(container) : (0, _position.default)(container, boundaryElement);
@@ -1 +1 @@
1
- {"version":3,"sources":["calculatePosition.ts"],"names":["AXIS","top","bottom","left","right","FLIPPED_DIRECTION","CROSS_AXIS","AXIS_SIZE","PARSED_PLACEMENT_CACHE","visualViewport","window","getContainerDimensions","containerNode","width","height","scroll","tagName","document","documentElement","clientWidth","clientHeight","getScroll","node","scrollTop","scrollLeft","scrollWidth","scrollHeight","getDelta","axis","offset","size","containerDimensions","padding","containerScroll","containerHeight","startEdgeOffset","endEdgeOffset","Math","max","getMargins","style","getComputedStyle","parseInt","marginTop","marginBottom","marginLeft","marginRight","parsePlacement","input","placement","crossPlacement","split","crossAxis","crossSize","computePosition","childOffset","boundaryDimensions","overlaySize","placementInfo","crossOffset","containerOffsetWithBoundary","isContainerPositioned","position","minViablePosition","maxViablePosition","min","floor","getMaxHeight","margins","getAvailableSpace","calculatePositionInternal","placementInput","scrollSize","flip","shouldOverlapWithTrigger","normalizedOffset","space","flippedPlacementInfo","flippedPosition","flippedSpace","delta","maxHeight","arrowPosition","arrowOffsetLeft","arrowOffsetTop","calculatePosition","opts","targetNode","overlayNode","scrollNode","shouldFlip","boundaryElement","container","offsetParent","body","isBodyContainer","containerPositionStyle"],"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 {Axis, Placement, PlacementAxis, SizeAxis} from '@react-types/overlays';\nimport getCss from 'dom-helpers/css';\nimport getOffset from 'dom-helpers/offset';\nimport getPosition from 'dom-helpers/position';\nimport getScrollLeft from 'dom-helpers/scrollLeft';\nimport getScrollTop from 'dom-helpers/scrollTop';\nimport ownerDocument from 'dom-helpers/ownerDocument';\n\ninterface Position {\n top?: number,\n left?: number,\n bottom?: number,\n right?: number\n}\n\ninterface Dimensions {\n width: number,\n height: number,\n top: number,\n left: number,\n scroll: Position\n}\n\ninterface ParsedPlacement {\n placement: PlacementAxis,\n crossPlacement: PlacementAxis,\n axis: Axis,\n crossAxis: Axis,\n size: SizeAxis,\n crossSize: SizeAxis\n}\n\ninterface Offset {\n top: number,\n left: number,\n width: number,\n height: number\n}\n\ninterface PositionOpts {\n placement: Placement,\n targetNode: HTMLElement,\n overlayNode: HTMLElement,\n scrollNode: HTMLElement,\n padding: number,\n shouldFlip: boolean,\n boundaryElement: HTMLElement,\n offset: number,\n crossOffset: number,\n shouldOverlapWithTrigger: boolean\n}\n\nexport interface PositionResult {\n position?: Position,\n arrowOffsetLeft?: number,\n arrowOffsetTop?: number,\n maxHeight?: number,\n placement: PlacementAxis\n}\n\nconst AXIS = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left'\n};\n\nconst FLIPPED_DIRECTION = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left'\n};\n\nconst CROSS_AXIS = {\n top: 'left',\n left: 'top'\n};\n\nconst AXIS_SIZE = {\n top: 'height',\n left: 'width'\n};\n\nconst PARSED_PLACEMENT_CACHE = {};\n\n// @ts-ignore\nlet visualViewport = typeof window !== 'undefined' && window.visualViewport;\n\nfunction getContainerDimensions(containerNode: Element): Dimensions {\n let width = 0, height = 0, top = 0, left = 0;\n let scroll: Position = {};\n\n if (containerNode.tagName === 'BODY') {\n width = visualViewport?.width ?? document.documentElement.clientWidth;\n height = visualViewport?.height ?? document.documentElement.clientHeight;\n\n scroll.top =\n getScrollTop(ownerDocument(containerNode).documentElement) ||\n getScrollTop(containerNode);\n scroll.left =\n getScrollLeft(ownerDocument(containerNode).documentElement) ||\n getScrollLeft(containerNode);\n } else {\n ({width, height, top, left} = getOffset(containerNode));\n scroll.top = getScrollTop(containerNode);\n scroll.left = getScrollLeft(containerNode);\n }\n\n return {width, height, scroll, top, left};\n}\n\nfunction getScroll(node: HTMLElement): Offset {\n return {\n top: node.scrollTop,\n left: node.scrollLeft,\n width: node.scrollWidth,\n height: node.scrollHeight\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n let containerScroll = containerDimensions.scroll[axis];\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMargins(node: HTMLElement): Position {\n let style = window.getComputedStyle(node);\n return {\n top: parseInt(style.marginTop, 10) || 0,\n bottom: parseInt(style.marginBottom, 10) || 0,\n left: parseInt(style.marginLeft, 10) || 0,\n right: parseInt(style.marginRight, 10) || 0\n };\n}\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {placement, crossPlacement, axis, crossAxis, size, crossSize};\n return PARSED_PLACEMENT_CACHE[input];\n}\n\nfunction computePosition(\n childOffset: Offset,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n containerOffsetWithBoundary: Offset,\n isContainerPositioned: boolean\n) {\n let {placement, crossPlacement, axis, crossAxis, size, crossSize} = placementInfo;\n let position: Position = {};\n\n // button position\n position[crossAxis] = childOffset[crossAxis];\n if (crossPlacement === 'center') {\n // + (button size / 2) - (overlay size / 2)\n // at this point the overlay center should match the button center\n position[crossAxis] += (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n // + (button size) - (overlay size)\n // at this point the overlay bottom should match the button bottom\n position[crossAxis] += (childOffset[crossSize] - overlaySize[crossSize]);\n }/* else {\n the overlay top should match the button top\n } */\n // add the crossOffset from props\n position[crossAxis] += crossOffset;\n\n // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n let minViablePosition = childOffset[crossAxis] + (childOffset[crossSize] / 2) - overlaySize[crossSize];\n // this is button position of center, aligns top of overlay with button center\n let maxViablePosition = childOffset[crossAxis] + (childOffset[crossSize] / 2);\n\n // clamp it into the range of the min/max positions\n position[crossAxis] = Math.min(Math.max(minViablePosition, position[crossAxis]), maxViablePosition);\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = (isContainerPositioned ? containerOffsetWithBoundary[size] : boundaryDimensions[size]);\n position[FLIPPED_DIRECTION[axis]] = Math.floor(containerHeight - childOffset[axis] + offset);\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number\n) {\n return position.top != null\n // We want the distance between the top of the overlay to the bottom of the boundary\n ? Math.max(0,\n (boundaryDimensions.height + boundaryDimensions.top + boundaryDimensions.scroll.top) // this is the bottom of the boundary\n - (containerOffsetWithBoundary.top + position.top) // this is the top of the overlay\n - (margins.top + margins.bottom + padding) // save additional space for margin and padding\n )\n // We want the distance between the top of the trigger to the top of the boundary\n : Math.max(0,\n (childOffset.top + containerOffsetWithBoundary.top) // this is the top of the trigger\n - (boundaryDimensions.top + boundaryDimensions.scroll.top) // this is the top of the boundary\n - (margins.top + margins.bottom + padding) // save additional space for margin and padding\n );\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let {placement, axis, size} = placementInfo;\n if (placement === axis) {\n return Math.max(0, childOffset[axis] - boundaryDimensions[axis] - boundaryDimensions.scroll[axis] + containerOffsetWithBoundary[axis] - margins[axis] - margins[FLIPPED_DIRECTION[axis]] - padding);\n }\n\n return Math.max(0, boundaryDimensions[size] + boundaryDimensions[axis] + boundaryDimensions.scroll[axis] - containerOffsetWithBoundary[axis] - childOffset[axis] - childOffset[size] - margins[axis] - margins[FLIPPED_DIRECTION[axis]] - padding);\n}\n\nexport function calculatePositionInternal(\n placementInput: Placement,\n childOffset: Offset,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let {size, crossAxis, crossSize, placement, crossPlacement, axis} = placementInfo;\n let position = computePosition(childOffset, boundaryDimensions, overlaySize, placementInfo, offset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n // Check if the scroll size of the overlay is greater than the available space to determine if we need to flip\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(`${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement);\n let flippedPosition = computePosition(childOffset, boundaryDimensions, overlaySize, flippedPlacementInfo, offset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(crossAxis, position[crossAxis], overlaySize[crossSize], boundaryDimensions, padding);\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(childOffset, boundaryDimensions, overlaySize, placementInfo, normalizedOffset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n delta = getDelta(crossAxis, position[crossAxis], overlaySize[crossSize], boundaryDimensions, padding);\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] = (childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2);\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] = position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight: maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement\n };\n}\n\n/**\n * Determines where to place the overlay with regards to the target and the position of an optional indicator.\n */\nexport function calculatePosition(opts: PositionOpts): PositionResult {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger\n } = opts;\n\n let container = overlayNode.offsetParent || document.body;\n let isBodyContainer = container.tagName === 'BODY';\n const containerPositionStyle = window.getComputedStyle(container).position;\n let isContainerPositioned = !!containerPositionStyle && containerPositionStyle !== 'static';\n let childOffset: Offset = isBodyContainer ? getOffset(targetNode) : getPosition(targetNode, container);\n\n if (!isBodyContainer) {\n childOffset.top += parseInt(getCss(targetNode, 'marginTop'), 10) || 0;\n childOffset.left += parseInt(getCss(targetNode, 'marginLeft'), 10) || 0;\n }\n\n let overlaySize: Offset = getOffset(overlayNode);\n let margins = getMargins(overlayNode);\n overlaySize.width += margins.left + margins.right;\n overlaySize.height += margins.top + margins.bottom;\n\n let scrollSize = getScroll(scrollNode);\n let boundaryDimensions = getContainerDimensions(boundaryElement);\n let containerOffsetWithBoundary: Offset = boundaryElement.tagName === 'BODY' ? getOffset(container) : getPosition(container, boundaryElement);\n\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n}\n"]}
1
+ {"version":3,"sources":["calculatePosition.ts"],"names":["AXIS","top","bottom","left","right","FLIPPED_DIRECTION","CROSS_AXIS","AXIS_SIZE","PARSED_PLACEMENT_CACHE","visualViewport","window","getContainerDimensions","containerNode","width","height","scroll","tagName","document","documentElement","clientWidth","clientHeight","getScroll","node","scrollTop","scrollLeft","scrollWidth","scrollHeight","getDelta","axis","offset","size","containerDimensions","padding","containerScroll","containerHeight","startEdgeOffset","endEdgeOffset","Math","max","getMargins","style","getComputedStyle","parseInt","marginTop","marginBottom","marginLeft","marginRight","parsePlacement","input","placement","crossPlacement","split","crossAxis","crossSize","computePosition","childOffset","boundaryDimensions","overlaySize","placementInfo","crossOffset","containerOffsetWithBoundary","isContainerPositioned","position","floor","getMaxHeight","margins","getAvailableSpace","calculatePositionInternal","placementInput","scrollSize","flip","shouldOverlapWithTrigger","normalizedOffset","space","flippedPlacementInfo","flippedPosition","flippedSpace","delta","maxHeight","min","arrowPosition","arrowOffsetLeft","arrowOffsetTop","calculatePosition","opts","targetNode","overlayNode","scrollNode","shouldFlip","boundaryElement","container","offsetParent","body","isBodyContainer","containerPositionStyle","matrix","getPropertyValue","transform","regex","matches","match","scaleX","scaleY","parseFloat","Number","isFinite"],"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 {\n Axis,\n Placement,\n PlacementAxis,\n SizeAxis,\n} from '@react-types/overlays';\nimport getCss from 'dom-helpers/css';\nimport getOffset from 'dom-helpers/offset';\nimport getPosition from 'dom-helpers/position';\nimport getScrollLeft from 'dom-helpers/scrollLeft';\nimport getScrollTop from 'dom-helpers/scrollTop';\nimport ownerDocument from 'dom-helpers/ownerDocument';\nimport getComputedStyle from 'dom-helpers/getComputedStyle';\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface ParsedPlacement {\n placement: PlacementAxis;\n crossPlacement: PlacementAxis;\n axis: Axis;\n crossAxis: Axis;\n size: SizeAxis;\n crossSize: SizeAxis;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\ninterface PositionOpts {\n placement: Placement;\n targetNode: HTMLElement;\n overlayNode: HTMLElement;\n scrollNode: HTMLElement;\n padding: number;\n shouldFlip: boolean;\n boundaryElement: HTMLElement;\n offset: number;\n crossOffset: number;\n shouldOverlapWithTrigger: boolean;\n}\n\nexport interface PositionResult {\n position?: Position;\n arrowOffsetLeft?: number;\n arrowOffsetTop?: number;\n maxHeight?: number;\n placement: PlacementAxis;\n}\n\nconst AXIS = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left',\n};\n\nconst FLIPPED_DIRECTION = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nconst CROSS_AXIS = {\n top: 'left',\n left: 'top',\n};\n\nconst AXIS_SIZE = {\n top: 'height',\n left: 'width',\n};\n\nconst PARSED_PLACEMENT_CACHE = {};\n\n// @ts-ignore\nlet visualViewport = typeof window !== 'undefined' && window.visualViewport;\n\nfunction getContainerDimensions(containerNode: Element): Dimensions {\n let width = 0,\n height = 0,\n top = 0,\n left = 0;\n let scroll: Position = {};\n\n if (containerNode.tagName === 'BODY') {\n width = visualViewport?.width ?? document.documentElement.clientWidth;\n height = visualViewport?.height ?? document.documentElement.clientHeight;\n\n scroll.top =\n getScrollTop(ownerDocument(containerNode).documentElement) ||\n getScrollTop(containerNode);\n scroll.left =\n getScrollLeft(ownerDocument(containerNode).documentElement) ||\n getScrollLeft(containerNode);\n } else {\n ({ width, height, top, left } = getOffset(containerNode));\n scroll.top = getScrollTop(containerNode);\n scroll.left = getScrollLeft(containerNode);\n }\n\n return { width, height, scroll, top, left };\n}\n\nfunction getScroll(node: HTMLElement): Offset {\n return {\n top: node.scrollTop,\n left: node.scrollLeft,\n width: node.scrollWidth,\n height: node.scrollHeight,\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n let containerScroll = containerDimensions.scroll[axis];\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMargins(node: HTMLElement): Position {\n let style = window.getComputedStyle(node);\n return {\n top: parseInt(style.marginTop, 10) || 0,\n bottom: parseInt(style.marginBottom, 10) || 0,\n left: parseInt(style.marginLeft, 10) || 0,\n right: parseInt(style.marginRight, 10) || 0,\n };\n}\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n };\n return PARSED_PLACEMENT_CACHE[input];\n}\n\nfunction computePosition(\n childOffset: Offset,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n containerOffsetWithBoundary: Offset,\n isContainerPositioned: boolean\n) {\n let {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n } = placementInfo;\n let position: Position = {};\n\n // button position\n position[crossAxis] = childOffset[crossAxis];\n\n if (crossPlacement === 'center') {\n // + (button size / 2) - (overlay size / 2)\n // at this point the overlay center should match the button center\n position[crossAxis] +=\n (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n // + (button size) - (overlay size)\n // at this point the overlay bottom should match the button bottom\n position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];\n } /* else {\n the overlay top should match the button top\n } */\n // add the crossOffset from props\n position[crossAxis] += crossOffset;\n\n // // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n // let minViablePosition =\n // childOffset[crossAxis] +\n // childOffset[crossSize] / 2 -\n // overlaySize[crossSize];\n // // this is button position of center, aligns top of overlay with button center\n // let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;\n\n // // clamp it into the range of the min/max positions\n // position[crossAxis] = Math.min(\n // Math.max(minViablePosition, position[crossAxis]),\n // maxViablePosition\n // );\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = isContainerPositioned\n ? containerOffsetWithBoundary[size]\n : boundaryDimensions[size];\n position[FLIPPED_DIRECTION[axis]] = Math.floor(\n containerHeight - childOffset[axis] + offset\n );\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number\n) {\n return position.top != null\n ? // We want the distance between the top of the overlay to the bottom of the boundary\n Math.max(\n 0,\n boundaryDimensions.height +\n boundaryDimensions.top +\n boundaryDimensions.scroll.top - // this is the bottom of the boundary\n (containerOffsetWithBoundary.top + position.top) - // this is the top of the overlay\n (margins.top + margins.bottom + padding) // save additional space for margin and padding\n )\n : // We want the distance between the top of the trigger to the top of the boundary\n Math.max(\n 0,\n childOffset.top +\n containerOffsetWithBoundary.top - // this is the top of the trigger\n (boundaryDimensions.top + boundaryDimensions.scroll.top) - // this is the top of the boundary\n (margins.top + margins.bottom + padding) // save additional space for margin and padding\n );\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let { placement, axis, size } = placementInfo;\n if (placement === axis) {\n return Math.max(\n 0,\n childOffset[axis] -\n boundaryDimensions[axis] -\n boundaryDimensions.scroll[axis] +\n containerOffsetWithBoundary[axis] -\n margins[axis] -\n margins[FLIPPED_DIRECTION[axis]] -\n padding\n );\n }\n\n return Math.max(\n 0,\n boundaryDimensions[size] +\n boundaryDimensions[axis] +\n boundaryDimensions.scroll[axis] -\n containerOffsetWithBoundary[axis] -\n childOffset[axis] -\n childOffset[size] -\n margins[axis] -\n margins[FLIPPED_DIRECTION[axis]] -\n padding\n );\n}\n\nexport function calculatePositionInternal(\n placementInput: Placement,\n childOffset: Offset,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let {\n size,\n crossAxis,\n crossSize,\n placement,\n crossPlacement,\n axis,\n } = placementInfo;\n let position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n // Check if the scroll size of the overlay is greater than the available space to determine if we need to flip\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(\n `${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement\n );\n let flippedPosition = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n flippedPlacementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n normalizedOffset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] =\n childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2;\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] =\n position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight: maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement,\n };\n}\n\n/**\n * Determines where to place the overlay with regards to the target and the position of an optional indicator.\n */\nexport function calculatePosition(opts: PositionOpts): PositionResult {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n } = opts;\n\n let container = overlayNode.offsetParent || document.body;\n let isBodyContainer = container.tagName === 'BODY';\n const containerPositionStyle = window.getComputedStyle(container).position;\n let isContainerPositioned =\n !!containerPositionStyle && containerPositionStyle !== 'static';\n let childOffset: Offset = isBodyContainer\n ? getOffset(targetNode)\n : getPosition(targetNode, container);\n\n if (!isBodyContainer) {\n childOffset.top += parseInt(getCss(targetNode, 'marginTop'), 10) || 0;\n childOffset.left += parseInt(getCss(targetNode, 'marginLeft'), 10) || 0;\n }\n\n let overlaySize: Offset = getOffset(overlayNode);\n const matrix = getComputedStyle(overlayNode).getPropertyValue('transform');\n const transform = matrix;\n const regex = /matrix\\((-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+)\\)/;\n const matches = transform.match(regex);\n let scaleX = 1;\n let scaleY = 1;\n\n if (matches) {\n scaleX = parseFloat(matches[1]);\n scaleY = parseFloat(matches[4]);\n if (!scaleX || !Number.isFinite(scaleX)) {\n scaleX = 1;\n }\n\n if (!scaleY || !Number.isFinite(scaleY)) {\n scaleY = 1;\n }\n }\n\n let margins = getMargins(overlayNode);\n overlaySize.width += margins.left + margins.right;\n overlaySize.height += margins.top + margins.bottom;\n\n if (scaleX) {\n overlaySize.width = overlaySize.width / scaleX;\n }\n if (scaleY) {\n overlaySize.height = overlaySize.height / scaleY;\n }\n\n let scrollSize = getScroll(scrollNode);\n let boundaryDimensions = getContainerDimensions(boundaryElement);\n let containerOffsetWithBoundary: Offset =\n boundaryElement.tagName === 'BODY'\n ? getOffset(container)\n : getPosition(container, boundaryElement);\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["useCloseOnScroll.ts"],"names":["onCloseMap","WeakMap","useCloseOnScroll","opts","triggerRef","isOpen","onClose","onScroll","e","target","current","contains","onCloseHandler","get","window","addEventListener","removeEventListener"],"mappings":";;;;;;;;AAaA;;AAbA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACO,MAAMA,UAA4C,GAAG,IAAIC,OAAJ,EAArD;;;AAQP;AACO,SAASC,gBAAT,CAA0BC,IAA1B,EAAsD;AAC3D,MAAI;AAACC,IAAAA,UAAD;AAAaC,IAAAA,MAAb;AAAqBC,IAAAA;AAArB,MAAgCH,IAApC;AAEA,wBAAU,MAAM;AACd,QAAI,CAACE,MAAL,EAAa;AACX;AACD;;AAED,QAAIE,QAAQ,GAAIC,CAAD,IAAmB;AAChC;AACA,UAAIC,MAAM,GAAGD,CAAC,CAACC,MAAf;;AACA,UAAI,CAACL,UAAU,CAACM,OAAZ,IAAuB,CAACD,MAAM,CAACE,QAAP,CAAgBP,UAAU,CAACM,OAA3B,CAA5B,EAAiE;AAC/D;AACD;;AAED,UAAIE,cAAc,GAAGN,OAAO,IAAIN,UAAU,CAACa,GAAX,CAAeT,UAAU,CAACM,OAA1B,CAAhC;;AACA,UAAIE,cAAJ,EAAoB;AAClBA,QAAAA,cAAc;AACf;AACF,KAXD;;AAaAE,IAAAA,MAAM,CAACC,gBAAP,CAAwB,QAAxB,EAAkCR,QAAlC,EAA4C,IAA5C;AACA,WAAO,MAAM;AACXO,MAAAA,MAAM,CAACE,mBAAP,CAA2B,QAA3B,EAAqCT,QAArC,EAA+C,IAA/C;AACD,KAFD;AAGD,GAtBD,EAsBG,CAACF,MAAD,EAASC,OAAT,EAAkBF,UAAlB,CAtBH;AAuBD","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 {RefObject, useEffect} from 'react';\n\n// This behavior moved from useOverlayTrigger to useOverlayPosition.\n// For backward compatibility, where useOverlayTrigger handled hiding the popover on close,\n// it sets a close function here mapped from the trigger element. This way we can avoid\n// forcing users to pass an onClose function to useOverlayPosition which could be considered\n// a breaking change.\nexport const onCloseMap: WeakMap<HTMLElement, () => void> = new WeakMap();\n\ninterface CloseOnScrollOptions {\n triggerRef: RefObject<HTMLElement>,\n isOpen?: boolean,\n onClose?: () => void\n}\n\n/** @private */\nexport function useCloseOnScroll(opts: CloseOnScrollOptions) {\n let {triggerRef, isOpen, onClose} = opts;\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n let onScroll = (e: MouseEvent) => {\n // Ignore if scrolling an scrollable region outside the trigger's tree.\n let target = e.target as HTMLElement;\n if (!triggerRef.current || !target.contains(triggerRef.current)) {\n return;\n }\n\n let onCloseHandler = onClose || onCloseMap.get(triggerRef.current);\n if (onCloseHandler) {\n onCloseHandler();\n }\n };\n\n window.addEventListener('scroll', onScroll, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [isOpen, onClose, triggerRef]);\n}\n"]}
1
+ {"version":3,"sources":["useCloseOnScroll.ts"],"names":["onCloseMap","WeakMap","useCloseOnScroll","opts","triggerRef","isOpen","onClose","onScroll","e","target","current","contains","onCloseHandler","get","window","addEventListener","removeEventListener"],"mappings":";;;;;;;;AAaA;;AAbA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACO,MAAMA,UAA4C,GAAG,IAAIC,OAAJ,EAArD;;;AAQP;AACO,SAASC,gBAAT,CAA0BC,IAA1B,EAAsD;AAC3D,MAAI;AAAEC,IAAAA,UAAF;AAAcC,IAAAA,MAAd;AAAsBC,IAAAA;AAAtB,MAAkCH,IAAtC;AAEA,wBAAU,MAAM;AACd,QAAI,CAACE,MAAL,EAAa;AACX;AACD;;AAED,QAAIE,QAAQ,GAAIC,CAAD,IAAmB;AAChC;AACA,UAAIC,MAAM,GAAGD,CAAC,CAACC,MAAf;;AACA,UAAI,CAACL,UAAU,CAACM,OAAZ,IAAuB,CAACD,MAAM,CAACE,QAAP,CAAgBP,UAAU,CAACM,OAA3B,CAA5B,EAAiE;AAC/D;AACD;;AAED,UAAIE,cAAc,GAAGN,OAAO,IAAIN,UAAU,CAACa,GAAX,CAAeT,UAAU,CAACM,OAA1B,CAAhC;;AACA,UAAIE,cAAJ,EAAoB;AAClBA,QAAAA,cAAc;AACf;AACF,KAXD;;AAaAE,IAAAA,MAAM,CAACC,gBAAP,CAAwB,QAAxB,EAAkCR,QAAlC,EAA4C,IAA5C;AACA,WAAO,MAAM;AACXO,MAAAA,MAAM,CAACE,mBAAP,CAA2B,QAA3B,EAAqCT,QAArC,EAA+C,IAA/C;AACD,KAFD;AAGD,GAtBD,EAsBG,CAACF,MAAD,EAASC,OAAT,EAAkBF,UAAlB,CAtBH;AAuBD","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 { RefObject, useEffect } from 'react';\n\n// This behavior moved from useOverlayTrigger to useOverlayPosition.\n// For backward compatibility, where useOverlayTrigger handled hiding the popover on close,\n// it sets a close function here mapped from the trigger element. This way we can avoid\n// forcing users to pass an onClose function to useOverlayPosition which could be considered\n// a breaking change.\nexport const onCloseMap: WeakMap<HTMLElement, () => void> = new WeakMap();\n\ninterface CloseOnScrollOptions {\n triggerRef: RefObject<HTMLElement>;\n isOpen?: boolean;\n onClose?: () => void;\n}\n\n/** @private */\nexport function useCloseOnScroll(opts: CloseOnScrollOptions) {\n let { triggerRef, isOpen, onClose } = opts;\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n let onScroll = (e: MouseEvent) => {\n // Ignore if scrolling an scrollable region outside the trigger's tree.\n let target = e.target as HTMLElement;\n if (!triggerRef.current || !target.contains(triggerRef.current)) {\n return;\n }\n\n let onCloseHandler = onClose || onCloseMap.get(triggerRef.current);\n if (onCloseHandler) {\n onCloseHandler();\n }\n };\n\n window.addEventListener('scroll', onScroll, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [isOpen, onClose, triggerRef]);\n}\n"]}
@@ -111,7 +111,27 @@ function useOverlayPosition(props) {
111
111
  triggerRef: targetRef,
112
112
  isOpen,
113
113
  onClose: onClose ? close : undefined
114
- });
114
+ }); // useLayoutEffect(() => {
115
+ // const mutationObserver = new MutationObserver((mutations) => {
116
+ // updatePosition();
117
+ // mutations.forEach((mutation) => {
118
+ // // if (mutation.attributeName === 'style') {
119
+ // // const transform = mutation.target.style.transform;
120
+ // // if (transform) {
121
+ // // const match = transform.match(/scale\((.+)\)/);
122
+ // // if (match) {
123
+ // // const scale = parseFloat(match[1]);
124
+ // // console.log(`Scale: ${scale}`);
125
+ // // // updatePosition();
126
+ // // }
127
+ // // }
128
+ // // }
129
+ // });
130
+ // });
131
+ // mutationObserver.observe(overlayRef?.current, { attributes: true });
132
+ // return () => mutationObserver.disconnect();
133
+ // }, [overlayRef, updatePosition]);
134
+
115
135
  return {
116
136
  rendered: true,
117
137
  overlayProps: {
@@ -1 +1 @@
1
- {"version":3,"sources":["useOverlayPosition.ts"],"names":["visualViewport","window","useOverlayPosition","props","direction","undefined","targetRef","overlayRef","scrollRef","placement","containerPadding","shouldFlip","boundaryElement","document","body","offset","crossOffset","shouldUpdatePosition","isOpen","shouldOverlapWithTrigger","onClose","position","setPosition","arrowOffsetLeft","arrowOffsetTop","maxHeight","deps","current","updatePosition","translateRTL","overlayNode","targetNode","scrollNode","padding","useResize","isResizing","timeout","onResize","clearTimeout","setTimeout","addEventListener","removeEventListener","close","triggerRef","rendered","overlayProps","style","zIndex","arrowProps","left","top","replace"],"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"]}
1
+ {"version":3,"sources":["useOverlayPosition.ts"],"names":["visualViewport","window","useOverlayPosition","props","direction","undefined","targetRef","overlayRef","scrollRef","placement","containerPadding","shouldFlip","boundaryElement","document","body","offset","crossOffset","shouldUpdatePosition","isOpen","shouldOverlapWithTrigger","onClose","position","setPosition","arrowOffsetLeft","arrowOffsetTop","maxHeight","deps","current","updatePosition","translateRTL","overlayNode","targetNode","scrollNode","padding","useResize","isResizing","timeout","onResize","clearTimeout","setTimeout","addEventListener","removeEventListener","close","triggerRef","rendered","overlayProps","style","zIndex","arrowProps","left","top","replace"],"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 // useLayoutEffect(() => {\n // const mutationObserver = new MutationObserver((mutations) => {\n // updatePosition();\n // mutations.forEach((mutation) => {\n // // if (mutation.attributeName === 'style') {\n // // const transform = mutation.target.style.transform;\n // // if (transform) {\n // // const match = transform.match(/scale\\((.+)\\)/);\n // // if (match) {\n // // const scale = parseFloat(match[1]);\n // // console.log(`Scale: ${scale}`);\n // // // updatePosition();\n // // }\n // // }\n // // }\n // });\n // });\n\n // mutationObserver.observe(overlayRef?.current, { attributes: true });\n\n // return () => mutationObserver.disconnect();\n // }, [overlayRef, updatePosition]);\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"]}
@@ -17,6 +17,7 @@ import getPosition from 'dom-helpers/position';
17
17
  import getScrollLeft from 'dom-helpers/scrollLeft';
18
18
  import getScrollTop from 'dom-helpers/scrollTop';
19
19
  import ownerDocument from 'dom-helpers/ownerDocument';
20
+ import getComputedStyle from 'dom-helpers/getComputedStyle';
20
21
  const AXIS = {
21
22
  top: 'top',
22
23
  bottom: 'top',
@@ -158,18 +159,24 @@ function computePosition(childOffset, boundaryDimensions, overlaySize, placement
158
159
  position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];
159
160
  }
160
161
  /* else {
161
- the overlay top should match the button top
162
+ the overlay top should match the button top
162
163
  } */
163
164
  // add the crossOffset from props
164
165
 
165
166
 
166
- position[crossAxis] += crossOffset; // this is button center position - the overlay size + half of the button to align bottom of overlay with button center
167
-
168
- let minViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2 - overlaySize[crossSize]; // this is button position of center, aligns top of overlay with button center
169
-
170
- let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2; // clamp it into the range of the min/max positions
171
-
172
- position[crossAxis] = Math.min(Math.max(minViablePosition, position[crossAxis]), maxViablePosition); // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.
167
+ position[crossAxis] += crossOffset; // // this is button center position - the overlay size + half of the button to align bottom of overlay with button center
168
+ // let minViablePosition =
169
+ // childOffset[crossAxis] +
170
+ // childOffset[crossSize] / 2 -
171
+ // overlaySize[crossSize];
172
+ // // this is button position of center, aligns top of overlay with button center
173
+ // let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;
174
+ // // clamp it into the range of the min/max positions
175
+ // position[crossAxis] = Math.min(
176
+ // Math.max(minViablePosition, position[crossAxis]),
177
+ // maxViablePosition
178
+ // );
179
+ // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.
173
180
 
174
181
  if (placement === axis) {
175
182
  // If the container is positioned (non-static), then we use the container's actual
@@ -186,14 +193,14 @@ function computePosition(childOffset, boundaryDimensions, overlaySize, placement
186
193
  }
187
194
 
188
195
  function getMaxHeight(position, boundaryDimensions, containerOffsetWithBoundary, childOffset, margins, padding) {
189
- return position.top != null // We want the distance between the top of the overlay to the bottom of the boundary
190
- ? Math.max(0, boundaryDimensions.height + boundaryDimensions.top + boundaryDimensions.scroll.top - ( // this is the bottom of the boundary
191
- containerOffsetWithBoundary.top + position.top) // this is the top of the overlay
192
- - (margins.top + margins.bottom + padding) // save additional space for margin and padding
193
- ) // We want the distance between the top of the trigger to the top of the boundary
194
- : Math.max(0, childOffset.top + containerOffsetWithBoundary.top - ( // this is the top of the trigger
195
- boundaryDimensions.top + boundaryDimensions.scroll.top) // this is the top of the boundary
196
- - (margins.top + margins.bottom + padding) // save additional space for margin and padding
196
+ return position.top != null ? // We want the distance between the top of the overlay to the bottom of the boundary
197
+ Math.max(0, boundaryDimensions.height + boundaryDimensions.top + boundaryDimensions.scroll.top - ( // this is the bottom of the boundary
198
+ containerOffsetWithBoundary.top + position.top) - ( // this is the top of the overlay
199
+ margins.top + margins.bottom + padding) // save additional space for margin and padding
200
+ ) : // We want the distance between the top of the trigger to the top of the boundary
201
+ Math.max(0, childOffset.top + containerOffsetWithBoundary.top - ( // this is the top of the trigger
202
+ boundaryDimensions.top + boundaryDimensions.scroll.top) - ( // this is the top of the boundary
203
+ margins.top + margins.bottom + padding) // save additional space for margin and padding
197
204
  );
198
205
  }
199
206
 
@@ -288,9 +295,38 @@ export function calculatePosition(opts) {
288
295
  }
289
296
 
290
297
  let overlaySize = getOffset(overlayNode);
298
+ const matrix = getComputedStyle(overlayNode).getPropertyValue('transform');
299
+ const transform = matrix;
300
+ const regex = /matrix\((-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+),\s*(-?\d*\.?\d+)\)/;
301
+ const matches = transform.match(regex);
302
+ let scaleX = 1;
303
+ let scaleY = 1;
304
+
305
+ if (matches) {
306
+ scaleX = parseFloat(matches[1]);
307
+ scaleY = parseFloat(matches[4]);
308
+
309
+ if (!scaleX || !Number.isFinite(scaleX)) {
310
+ scaleX = 1;
311
+ }
312
+
313
+ if (!scaleY || !Number.isFinite(scaleY)) {
314
+ scaleY = 1;
315
+ }
316
+ }
317
+
291
318
  let margins = getMargins(overlayNode);
292
319
  overlaySize.width += margins.left + margins.right;
293
320
  overlaySize.height += margins.top + margins.bottom;
321
+
322
+ if (scaleX) {
323
+ overlaySize.width = overlaySize.width / scaleX;
324
+ }
325
+
326
+ if (scaleY) {
327
+ overlaySize.height = overlaySize.height / scaleY;
328
+ }
329
+
294
330
  let scrollSize = getScroll(scrollNode);
295
331
  let boundaryDimensions = getContainerDimensions(boundaryElement);
296
332
  let containerOffsetWithBoundary = boundaryElement.tagName === 'BODY' ? getOffset(container) : getPosition(container, boundaryElement);
@@ -1 +1 @@
1
- {"version":3,"sources":["calculatePosition.ts"],"names":["getCss","getOffset","getPosition","getScrollLeft","getScrollTop","ownerDocument","AXIS","top","bottom","left","right","FLIPPED_DIRECTION","CROSS_AXIS","AXIS_SIZE","PARSED_PLACEMENT_CACHE","visualViewport","window","getContainerDimensions","containerNode","width","height","scroll","tagName","document","documentElement","clientWidth","clientHeight","getScroll","node","scrollTop","scrollLeft","scrollWidth","scrollHeight","getDelta","axis","offset","size","containerDimensions","padding","containerScroll","containerHeight","startEdgeOffset","endEdgeOffset","Math","max","getMargins","style","getComputedStyle","parseInt","marginTop","marginBottom","marginLeft","marginRight","parsePlacement","input","placement","crossPlacement","split","crossAxis","crossSize","computePosition","childOffset","boundaryDimensions","overlaySize","placementInfo","crossOffset","containerOffsetWithBoundary","isContainerPositioned","position","minViablePosition","maxViablePosition","min","floor","getMaxHeight","margins","getAvailableSpace","calculatePositionInternal","placementInput","scrollSize","flip","shouldOverlapWithTrigger","normalizedOffset","space","flippedPlacementInfo","flippedPosition","flippedSpace","delta","maxHeight","arrowPosition","arrowOffsetLeft","arrowOffsetTop","calculatePosition","opts","targetNode","overlayNode","scrollNode","shouldFlip","boundaryElement","container","offsetParent","body","isBodyContainer","containerPositionStyle"],"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 {Axis, Placement, PlacementAxis, SizeAxis} from '@react-types/overlays';\nimport getCss from 'dom-helpers/css';\nimport getOffset from 'dom-helpers/offset';\nimport getPosition from 'dom-helpers/position';\nimport getScrollLeft from 'dom-helpers/scrollLeft';\nimport getScrollTop from 'dom-helpers/scrollTop';\nimport ownerDocument from 'dom-helpers/ownerDocument';\n\ninterface Position {\n top?: number,\n left?: number,\n bottom?: number,\n right?: number\n}\n\ninterface Dimensions {\n width: number,\n height: number,\n top: number,\n left: number,\n scroll: Position\n}\n\ninterface ParsedPlacement {\n placement: PlacementAxis,\n crossPlacement: PlacementAxis,\n axis: Axis,\n crossAxis: Axis,\n size: SizeAxis,\n crossSize: SizeAxis\n}\n\ninterface Offset {\n top: number,\n left: number,\n width: number,\n height: number\n}\n\ninterface PositionOpts {\n placement: Placement,\n targetNode: HTMLElement,\n overlayNode: HTMLElement,\n scrollNode: HTMLElement,\n padding: number,\n shouldFlip: boolean,\n boundaryElement: HTMLElement,\n offset: number,\n crossOffset: number,\n shouldOverlapWithTrigger: boolean\n}\n\nexport interface PositionResult {\n position?: Position,\n arrowOffsetLeft?: number,\n arrowOffsetTop?: number,\n maxHeight?: number,\n placement: PlacementAxis\n}\n\nconst AXIS = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left'\n};\n\nconst FLIPPED_DIRECTION = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left'\n};\n\nconst CROSS_AXIS = {\n top: 'left',\n left: 'top'\n};\n\nconst AXIS_SIZE = {\n top: 'height',\n left: 'width'\n};\n\nconst PARSED_PLACEMENT_CACHE = {};\n\n// @ts-ignore\nlet visualViewport = typeof window !== 'undefined' && window.visualViewport;\n\nfunction getContainerDimensions(containerNode: Element): Dimensions {\n let width = 0, height = 0, top = 0, left = 0;\n let scroll: Position = {};\n\n if (containerNode.tagName === 'BODY') {\n width = visualViewport?.width ?? document.documentElement.clientWidth;\n height = visualViewport?.height ?? document.documentElement.clientHeight;\n\n scroll.top =\n getScrollTop(ownerDocument(containerNode).documentElement) ||\n getScrollTop(containerNode);\n scroll.left =\n getScrollLeft(ownerDocument(containerNode).documentElement) ||\n getScrollLeft(containerNode);\n } else {\n ({width, height, top, left} = getOffset(containerNode));\n scroll.top = getScrollTop(containerNode);\n scroll.left = getScrollLeft(containerNode);\n }\n\n return {width, height, scroll, top, left};\n}\n\nfunction getScroll(node: HTMLElement): Offset {\n return {\n top: node.scrollTop,\n left: node.scrollLeft,\n width: node.scrollWidth,\n height: node.scrollHeight\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n let containerScroll = containerDimensions.scroll[axis];\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMargins(node: HTMLElement): Position {\n let style = window.getComputedStyle(node);\n return {\n top: parseInt(style.marginTop, 10) || 0,\n bottom: parseInt(style.marginBottom, 10) || 0,\n left: parseInt(style.marginLeft, 10) || 0,\n right: parseInt(style.marginRight, 10) || 0\n };\n}\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {placement, crossPlacement, axis, crossAxis, size, crossSize};\n return PARSED_PLACEMENT_CACHE[input];\n}\n\nfunction computePosition(\n childOffset: Offset,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n containerOffsetWithBoundary: Offset,\n isContainerPositioned: boolean\n) {\n let {placement, crossPlacement, axis, crossAxis, size, crossSize} = placementInfo;\n let position: Position = {};\n\n // button position\n position[crossAxis] = childOffset[crossAxis];\n if (crossPlacement === 'center') {\n // + (button size / 2) - (overlay size / 2)\n // at this point the overlay center should match the button center\n position[crossAxis] += (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n // + (button size) - (overlay size)\n // at this point the overlay bottom should match the button bottom\n position[crossAxis] += (childOffset[crossSize] - overlaySize[crossSize]);\n }/* else {\n the overlay top should match the button top\n } */\n // add the crossOffset from props\n position[crossAxis] += crossOffset;\n\n // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n let minViablePosition = childOffset[crossAxis] + (childOffset[crossSize] / 2) - overlaySize[crossSize];\n // this is button position of center, aligns top of overlay with button center\n let maxViablePosition = childOffset[crossAxis] + (childOffset[crossSize] / 2);\n\n // clamp it into the range of the min/max positions\n position[crossAxis] = Math.min(Math.max(minViablePosition, position[crossAxis]), maxViablePosition);\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = (isContainerPositioned ? containerOffsetWithBoundary[size] : boundaryDimensions[size]);\n position[FLIPPED_DIRECTION[axis]] = Math.floor(containerHeight - childOffset[axis] + offset);\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number\n) {\n return position.top != null\n // We want the distance between the top of the overlay to the bottom of the boundary\n ? Math.max(0,\n (boundaryDimensions.height + boundaryDimensions.top + boundaryDimensions.scroll.top) // this is the bottom of the boundary\n - (containerOffsetWithBoundary.top + position.top) // this is the top of the overlay\n - (margins.top + margins.bottom + padding) // save additional space for margin and padding\n )\n // We want the distance between the top of the trigger to the top of the boundary\n : Math.max(0,\n (childOffset.top + containerOffsetWithBoundary.top) // this is the top of the trigger\n - (boundaryDimensions.top + boundaryDimensions.scroll.top) // this is the top of the boundary\n - (margins.top + margins.bottom + padding) // save additional space for margin and padding\n );\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let {placement, axis, size} = placementInfo;\n if (placement === axis) {\n return Math.max(0, childOffset[axis] - boundaryDimensions[axis] - boundaryDimensions.scroll[axis] + containerOffsetWithBoundary[axis] - margins[axis] - margins[FLIPPED_DIRECTION[axis]] - padding);\n }\n\n return Math.max(0, boundaryDimensions[size] + boundaryDimensions[axis] + boundaryDimensions.scroll[axis] - containerOffsetWithBoundary[axis] - childOffset[axis] - childOffset[size] - margins[axis] - margins[FLIPPED_DIRECTION[axis]] - padding);\n}\n\nexport function calculatePositionInternal(\n placementInput: Placement,\n childOffset: Offset,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let {size, crossAxis, crossSize, placement, crossPlacement, axis} = placementInfo;\n let position = computePosition(childOffset, boundaryDimensions, overlaySize, placementInfo, offset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n // Check if the scroll size of the overlay is greater than the available space to determine if we need to flip\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(`${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement);\n let flippedPosition = computePosition(childOffset, boundaryDimensions, overlaySize, flippedPlacementInfo, offset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(crossAxis, position[crossAxis], overlaySize[crossSize], boundaryDimensions, padding);\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(childOffset, boundaryDimensions, overlaySize, placementInfo, normalizedOffset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n delta = getDelta(crossAxis, position[crossAxis], overlaySize[crossSize], boundaryDimensions, padding);\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] = (childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2);\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] = position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight: maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement\n };\n}\n\n/**\n * Determines where to place the overlay with regards to the target and the position of an optional indicator.\n */\nexport function calculatePosition(opts: PositionOpts): PositionResult {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger\n } = opts;\n\n let container = overlayNode.offsetParent || document.body;\n let isBodyContainer = container.tagName === 'BODY';\n const containerPositionStyle = window.getComputedStyle(container).position;\n let isContainerPositioned = !!containerPositionStyle && containerPositionStyle !== 'static';\n let childOffset: Offset = isBodyContainer ? getOffset(targetNode) : getPosition(targetNode, container);\n\n if (!isBodyContainer) {\n childOffset.top += parseInt(getCss(targetNode, 'marginTop'), 10) || 0;\n childOffset.left += parseInt(getCss(targetNode, 'marginLeft'), 10) || 0;\n }\n\n let overlaySize: Offset = getOffset(overlayNode);\n let margins = getMargins(overlayNode);\n overlaySize.width += margins.left + margins.right;\n overlaySize.height += margins.top + margins.bottom;\n\n let scrollSize = getScroll(scrollNode);\n let boundaryDimensions = getContainerDimensions(boundaryElement);\n let containerOffsetWithBoundary: Offset = boundaryElement.tagName === 'BODY' ? getOffset(container) : getPosition(container, boundaryElement);\n\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n}\n"]}
1
+ {"version":3,"sources":["calculatePosition.ts"],"names":["getCss","getOffset","getPosition","getScrollLeft","getScrollTop","ownerDocument","getComputedStyle","AXIS","top","bottom","left","right","FLIPPED_DIRECTION","CROSS_AXIS","AXIS_SIZE","PARSED_PLACEMENT_CACHE","visualViewport","window","getContainerDimensions","containerNode","width","height","scroll","tagName","document","documentElement","clientWidth","clientHeight","getScroll","node","scrollTop","scrollLeft","scrollWidth","scrollHeight","getDelta","axis","offset","size","containerDimensions","padding","containerScroll","containerHeight","startEdgeOffset","endEdgeOffset","Math","max","getMargins","style","parseInt","marginTop","marginBottom","marginLeft","marginRight","parsePlacement","input","placement","crossPlacement","split","crossAxis","crossSize","computePosition","childOffset","boundaryDimensions","overlaySize","placementInfo","crossOffset","containerOffsetWithBoundary","isContainerPositioned","position","floor","getMaxHeight","margins","getAvailableSpace","calculatePositionInternal","placementInput","scrollSize","flip","shouldOverlapWithTrigger","normalizedOffset","space","flippedPlacementInfo","flippedPosition","flippedSpace","delta","maxHeight","min","arrowPosition","arrowOffsetLeft","arrowOffsetTop","calculatePosition","opts","targetNode","overlayNode","scrollNode","shouldFlip","boundaryElement","container","offsetParent","body","isBodyContainer","containerPositionStyle","matrix","getPropertyValue","transform","regex","matches","match","scaleX","scaleY","parseFloat","Number","isFinite"],"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 {\n Axis,\n Placement,\n PlacementAxis,\n SizeAxis,\n} from '@react-types/overlays';\nimport getCss from 'dom-helpers/css';\nimport getOffset from 'dom-helpers/offset';\nimport getPosition from 'dom-helpers/position';\nimport getScrollLeft from 'dom-helpers/scrollLeft';\nimport getScrollTop from 'dom-helpers/scrollTop';\nimport ownerDocument from 'dom-helpers/ownerDocument';\nimport getComputedStyle from 'dom-helpers/getComputedStyle';\n\ninterface Position {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\ninterface Dimensions {\n width: number;\n height: number;\n top: number;\n left: number;\n scroll: Position;\n}\n\ninterface ParsedPlacement {\n placement: PlacementAxis;\n crossPlacement: PlacementAxis;\n axis: Axis;\n crossAxis: Axis;\n size: SizeAxis;\n crossSize: SizeAxis;\n}\n\ninterface Offset {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\ninterface PositionOpts {\n placement: Placement;\n targetNode: HTMLElement;\n overlayNode: HTMLElement;\n scrollNode: HTMLElement;\n padding: number;\n shouldFlip: boolean;\n boundaryElement: HTMLElement;\n offset: number;\n crossOffset: number;\n shouldOverlapWithTrigger: boolean;\n}\n\nexport interface PositionResult {\n position?: Position;\n arrowOffsetLeft?: number;\n arrowOffsetTop?: number;\n maxHeight?: number;\n placement: PlacementAxis;\n}\n\nconst AXIS = {\n top: 'top',\n bottom: 'top',\n left: 'left',\n right: 'left',\n};\n\nconst FLIPPED_DIRECTION = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nconst CROSS_AXIS = {\n top: 'left',\n left: 'top',\n};\n\nconst AXIS_SIZE = {\n top: 'height',\n left: 'width',\n};\n\nconst PARSED_PLACEMENT_CACHE = {};\n\n// @ts-ignore\nlet visualViewport = typeof window !== 'undefined' && window.visualViewport;\n\nfunction getContainerDimensions(containerNode: Element): Dimensions {\n let width = 0,\n height = 0,\n top = 0,\n left = 0;\n let scroll: Position = {};\n\n if (containerNode.tagName === 'BODY') {\n width = visualViewport?.width ?? document.documentElement.clientWidth;\n height = visualViewport?.height ?? document.documentElement.clientHeight;\n\n scroll.top =\n getScrollTop(ownerDocument(containerNode).documentElement) ||\n getScrollTop(containerNode);\n scroll.left =\n getScrollLeft(ownerDocument(containerNode).documentElement) ||\n getScrollLeft(containerNode);\n } else {\n ({ width, height, top, left } = getOffset(containerNode));\n scroll.top = getScrollTop(containerNode);\n scroll.left = getScrollLeft(containerNode);\n }\n\n return { width, height, scroll, top, left };\n}\n\nfunction getScroll(node: HTMLElement): Offset {\n return {\n top: node.scrollTop,\n left: node.scrollLeft,\n width: node.scrollWidth,\n height: node.scrollHeight,\n };\n}\n\nfunction getDelta(\n axis: Axis,\n offset: number,\n size: number,\n containerDimensions: Dimensions,\n padding: number\n) {\n let containerScroll = containerDimensions.scroll[axis];\n let containerHeight = containerDimensions[AXIS_SIZE[axis]];\n\n let startEdgeOffset = offset - padding - containerScroll;\n let endEdgeOffset = offset + padding - containerScroll + size;\n\n if (startEdgeOffset < 0) {\n return -startEdgeOffset;\n } else if (endEdgeOffset > containerHeight) {\n return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n } else {\n return 0;\n }\n}\n\nfunction getMargins(node: HTMLElement): Position {\n let style = window.getComputedStyle(node);\n return {\n top: parseInt(style.marginTop, 10) || 0,\n bottom: parseInt(style.marginBottom, 10) || 0,\n left: parseInt(style.marginLeft, 10) || 0,\n right: parseInt(style.marginRight, 10) || 0,\n };\n}\n\nfunction parsePlacement(input: Placement): ParsedPlacement {\n if (PARSED_PLACEMENT_CACHE[input]) {\n return PARSED_PLACEMENT_CACHE[input];\n }\n\n let [placement, crossPlacement] = input.split(' ');\n let axis: Axis = AXIS[placement] || 'right';\n let crossAxis: Axis = CROSS_AXIS[axis];\n\n if (!AXIS[crossPlacement]) {\n crossPlacement = 'center';\n }\n\n let size = AXIS_SIZE[axis];\n let crossSize = AXIS_SIZE[crossAxis];\n PARSED_PLACEMENT_CACHE[input] = {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n };\n return PARSED_PLACEMENT_CACHE[input];\n}\n\nfunction computePosition(\n childOffset: Offset,\n boundaryDimensions: Dimensions,\n overlaySize: Offset,\n placementInfo: ParsedPlacement,\n offset: number,\n crossOffset: number,\n containerOffsetWithBoundary: Offset,\n isContainerPositioned: boolean\n) {\n let {\n placement,\n crossPlacement,\n axis,\n crossAxis,\n size,\n crossSize,\n } = placementInfo;\n let position: Position = {};\n\n // button position\n position[crossAxis] = childOffset[crossAxis];\n\n if (crossPlacement === 'center') {\n // + (button size / 2) - (overlay size / 2)\n // at this point the overlay center should match the button center\n position[crossAxis] +=\n (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n } else if (crossPlacement !== crossAxis) {\n // + (button size) - (overlay size)\n // at this point the overlay bottom should match the button bottom\n position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];\n } /* else {\n the overlay top should match the button top\n } */\n // add the crossOffset from props\n position[crossAxis] += crossOffset;\n\n // // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n // let minViablePosition =\n // childOffset[crossAxis] +\n // childOffset[crossSize] / 2 -\n // overlaySize[crossSize];\n // // this is button position of center, aligns top of overlay with button center\n // let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;\n\n // // clamp it into the range of the min/max positions\n // position[crossAxis] = Math.min(\n // Math.max(minViablePosition, position[crossAxis]),\n // maxViablePosition\n // );\n\n // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n if (placement === axis) {\n // If the container is positioned (non-static), then we use the container's actual\n // height, as `bottom` will be relative to this height. But if the container is static,\n // then it can only be the `document.body`, and `bottom` will be relative to _its_\n // container, which should be as large as boundaryDimensions.\n const containerHeight = isContainerPositioned\n ? containerOffsetWithBoundary[size]\n : boundaryDimensions[size];\n position[FLIPPED_DIRECTION[axis]] = Math.floor(\n containerHeight - childOffset[axis] + offset\n );\n } else {\n position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n }\n\n return position;\n}\n\nfunction getMaxHeight(\n position: Position,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number\n) {\n return position.top != null\n ? // We want the distance between the top of the overlay to the bottom of the boundary\n Math.max(\n 0,\n boundaryDimensions.height +\n boundaryDimensions.top +\n boundaryDimensions.scroll.top - // this is the bottom of the boundary\n (containerOffsetWithBoundary.top + position.top) - // this is the top of the overlay\n (margins.top + margins.bottom + padding) // save additional space for margin and padding\n )\n : // We want the distance between the top of the trigger to the top of the boundary\n Math.max(\n 0,\n childOffset.top +\n containerOffsetWithBoundary.top - // this is the top of the trigger\n (boundaryDimensions.top + boundaryDimensions.scroll.top) - // this is the top of the boundary\n (margins.top + margins.bottom + padding) // save additional space for margin and padding\n );\n}\n\nfunction getAvailableSpace(\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n childOffset: Offset,\n margins: Position,\n padding: number,\n placementInfo: ParsedPlacement\n) {\n let { placement, axis, size } = placementInfo;\n if (placement === axis) {\n return Math.max(\n 0,\n childOffset[axis] -\n boundaryDimensions[axis] -\n boundaryDimensions.scroll[axis] +\n containerOffsetWithBoundary[axis] -\n margins[axis] -\n margins[FLIPPED_DIRECTION[axis]] -\n padding\n );\n }\n\n return Math.max(\n 0,\n boundaryDimensions[size] +\n boundaryDimensions[axis] +\n boundaryDimensions.scroll[axis] -\n containerOffsetWithBoundary[axis] -\n childOffset[axis] -\n childOffset[size] -\n margins[axis] -\n margins[FLIPPED_DIRECTION[axis]] -\n padding\n );\n}\n\nexport function calculatePositionInternal(\n placementInput: Placement,\n childOffset: Offset,\n overlaySize: Offset,\n scrollSize: Offset,\n margins: Position,\n padding: number,\n flip: boolean,\n boundaryDimensions: Dimensions,\n containerOffsetWithBoundary: Offset,\n offset: number,\n crossOffset: number,\n isContainerPositioned: boolean,\n shouldOverlapWithTrigger: boolean\n): PositionResult {\n let placementInfo = parsePlacement(placementInput);\n let {\n size,\n crossAxis,\n crossSize,\n placement,\n crossPlacement,\n axis,\n } = placementInfo;\n let position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n\n let normalizedOffset = offset;\n let space = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n placementInfo\n );\n\n // Check if the scroll size of the overlay is greater than the available space to determine if we need to flip\n if (flip && scrollSize[size] > space) {\n let flippedPlacementInfo = parsePlacement(\n `${FLIPPED_DIRECTION[placement]} ${crossPlacement}` as Placement\n );\n let flippedPosition = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n flippedPlacementInfo,\n offset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n let flippedSpace = getAvailableSpace(\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding + offset,\n flippedPlacementInfo\n );\n\n // If the available space for the flipped position is greater than the original available space, flip.\n if (flippedSpace > space) {\n placementInfo = flippedPlacementInfo;\n position = flippedPosition;\n normalizedOffset = offset;\n }\n }\n\n let delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let maxHeight = getMaxHeight(\n position,\n boundaryDimensions,\n containerOffsetWithBoundary,\n childOffset,\n margins,\n padding\n );\n\n overlaySize.height = Math.min(overlaySize.height, maxHeight);\n\n position = computePosition(\n childOffset,\n boundaryDimensions,\n overlaySize,\n placementInfo,\n normalizedOffset,\n crossOffset,\n containerOffsetWithBoundary,\n isContainerPositioned\n );\n delta = getDelta(\n crossAxis,\n position[crossAxis],\n overlaySize[crossSize],\n boundaryDimensions,\n padding\n );\n position[crossAxis] += delta;\n\n let arrowPosition: Position = {};\n arrowPosition[crossAxis] =\n childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2;\n\n if (shouldOverlapWithTrigger) {\n position[FLIPPED_DIRECTION[placementInfo.placement]] =\n position[FLIPPED_DIRECTION[placementInfo.placement]] - childOffset[size];\n }\n\n return {\n position,\n maxHeight: maxHeight,\n arrowOffsetLeft: arrowPosition.left,\n arrowOffsetTop: arrowPosition.top,\n placement: placementInfo.placement,\n };\n}\n\n/**\n * Determines where to place the overlay with regards to the target and the position of an optional indicator.\n */\nexport function calculatePosition(opts: PositionOpts): PositionResult {\n let {\n placement,\n targetNode,\n overlayNode,\n scrollNode,\n padding,\n shouldFlip,\n boundaryElement,\n offset,\n crossOffset,\n shouldOverlapWithTrigger,\n } = opts;\n\n let container = overlayNode.offsetParent || document.body;\n let isBodyContainer = container.tagName === 'BODY';\n const containerPositionStyle = window.getComputedStyle(container).position;\n let isContainerPositioned =\n !!containerPositionStyle && containerPositionStyle !== 'static';\n let childOffset: Offset = isBodyContainer\n ? getOffset(targetNode)\n : getPosition(targetNode, container);\n\n if (!isBodyContainer) {\n childOffset.top += parseInt(getCss(targetNode, 'marginTop'), 10) || 0;\n childOffset.left += parseInt(getCss(targetNode, 'marginLeft'), 10) || 0;\n }\n\n let overlaySize: Offset = getOffset(overlayNode);\n const matrix = getComputedStyle(overlayNode).getPropertyValue('transform');\n const transform = matrix;\n const regex = /matrix\\((-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+),\\s*(-?\\d*\\.?\\d+)\\)/;\n const matches = transform.match(regex);\n let scaleX = 1;\n let scaleY = 1;\n\n if (matches) {\n scaleX = parseFloat(matches[1]);\n scaleY = parseFloat(matches[4]);\n if (!scaleX || !Number.isFinite(scaleX)) {\n scaleX = 1;\n }\n\n if (!scaleY || !Number.isFinite(scaleY)) {\n scaleY = 1;\n }\n }\n\n let margins = getMargins(overlayNode);\n overlaySize.width += margins.left + margins.right;\n overlaySize.height += margins.top + margins.bottom;\n\n if (scaleX) {\n overlaySize.width = overlaySize.width / scaleX;\n }\n if (scaleY) {\n overlaySize.height = overlaySize.height / scaleY;\n }\n\n let scrollSize = getScroll(scrollNode);\n let boundaryDimensions = getContainerDimensions(boundaryElement);\n let containerOffsetWithBoundary: Offset =\n boundaryElement.tagName === 'BODY'\n ? getOffset(container)\n : getPosition(container, boundaryElement);\n\n return calculatePositionInternal(\n placement,\n childOffset,\n overlaySize,\n scrollSize,\n margins,\n padding,\n shouldFlip,\n boundaryDimensions,\n containerOffsetWithBoundary,\n offset,\n crossOffset,\n isContainerPositioned,\n shouldOverlapWithTrigger\n );\n}\n"]}