Skip to content

Commit f0c9a59

Browse files
authored
Remove dom-helpers dependency from @react-aria/overlays (#3291)
1 parent 700ad3b commit f0c9a59

File tree

3 files changed

+43
-23
lines changed

3 files changed

+43
-23
lines changed

packages/@react-aria/overlays/package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@
2626
"@react-stately/overlays": "^3.3.1",
2727
"@react-types/button": "^3.5.1",
2828
"@react-types/overlays": "^3.6.1",
29-
"@react-types/shared": "^3.13.1",
30-
"dom-helpers": "^5.2.1",
31-
"react-transition-group": "^4.4.2"
29+
"@react-types/shared": "^3.13.1"
3230
},
3331
"peerDependencies": {
3432
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",

packages/@react-aria/overlays/src/calculatePosition.ts

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@
1111
*/
1212

1313
import {Axis, Placement, PlacementAxis, SizeAxis} from '@react-types/overlays';
14-
import getCss from 'dom-helpers/css';
15-
import getOffset from 'dom-helpers/offset';
16-
import getPosition from 'dom-helpers/position';
17-
import getScrollLeft from 'dom-helpers/scrollLeft';
18-
import getScrollTop from 'dom-helpers/scrollTop';
19-
import ownerDocument from 'dom-helpers/ownerDocument';
2014

2115
interface Position {
2216
top?: number,
@@ -104,19 +98,16 @@ function getContainerDimensions(containerNode: HTMLElement): Dimensions {
10498
let scroll: Position = {};
10599

106100
if (containerNode.tagName === 'BODY') {
107-
width = visualViewport?.width ?? document.documentElement.clientWidth;
108-
height = visualViewport?.height ?? document.documentElement.clientHeight;
109-
110-
scroll.top =
111-
getScrollTop(ownerDocument(containerNode).documentElement) ||
112-
getScrollTop(containerNode);
113-
scroll.left =
114-
getScrollLeft(ownerDocument(containerNode).documentElement) ||
115-
getScrollLeft(containerNode);
101+
let documentElement = document.documentElement;
102+
width = visualViewport?.width ?? documentElement.clientWidth;
103+
height = visualViewport?.height ?? documentElement.clientHeight;
104+
105+
scroll.top = documentElement.scrollTop || containerNode.scrollTop;
106+
scroll.left = documentElement.scrollLeft || containerNode.scrollLeft;
116107
} else {
117108
({width, height, top, left} = getOffset(containerNode));
118-
scroll.top = getScrollTop(containerNode);
119-
scroll.left = getScrollLeft(containerNode);
109+
scroll.top = containerNode.scrollTop;
110+
scroll.left = containerNode.scrollLeft;
120111
}
121112

122113
return {width, height, scroll, top, left};
@@ -380,8 +371,7 @@ export function calculatePosition(opts: PositionOpts): PositionResult {
380371
let childOffset: Offset = isBodyContainer ? getOffset(targetNode) : getPosition(targetNode, container);
381372

382373
if (!isBodyContainer) {
383-
let marginTop = String(getCss(targetNode, 'marginTop'));
384-
let marginLeft = String(getCss(targetNode, 'marginLeft'));
374+
let {marginTop, marginLeft} = window.getComputedStyle(targetNode);
385375
childOffset.top += parseInt(marginTop, 10) || 0;
386376
childOffset.left += parseInt(marginLeft, 10) || 0;
387377
}
@@ -411,3 +401,35 @@ export function calculatePosition(opts: PositionOpts): PositionResult {
411401
maxHeight
412402
);
413403
}
404+
405+
function getOffset(node: Element): Offset {
406+
let {top, left, width, height} = node.getBoundingClientRect();
407+
let {scrollTop, scrollLeft, clientTop, clientLeft} = document.documentElement;
408+
return {
409+
top: top + scrollTop - clientTop,
410+
left: left + scrollLeft - clientLeft,
411+
width,
412+
height
413+
};
414+
}
415+
416+
function getPosition(node: Element, parent: Element): Offset {
417+
let style = window.getComputedStyle(node);
418+
let offset: Offset;
419+
if (style.position === 'fixed') {
420+
let {top, left, width, height} = node.getBoundingClientRect();
421+
offset = {top, left, width, height};
422+
} else {
423+
offset = getOffset(node);
424+
let parentOffset = getOffset(parent);
425+
let parentStyle = window.getComputedStyle(parent);
426+
parentOffset.top += (parseInt(parentStyle.borderTopWidth, 10) || 0) - parent.scrollTop;
427+
parentOffset.left += (parseInt(parentStyle.borderLeftWidth, 10) || 0) - parent.scrollLeft;
428+
offset.top -= parentOffset.top;
429+
offset.left -= parentOffset.left;
430+
}
431+
432+
offset.top -= parseInt(style.marginTop, 10) || 0;
433+
offset.left -= parseInt(style.marginLeft, 10) || 0;
434+
return offset;
435+
}

yarn.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9392,7 +9392,7 @@ dom-helpers@^3.4.0:
93929392
dependencies:
93939393
"@babel/runtime" "^7.1.2"
93949394

9395-
dom-helpers@^5.0.1, dom-helpers@^5.2.1:
9395+
dom-helpers@^5.0.1:
93969396
version "5.2.1"
93979397
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
93989398
integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==

0 commit comments

Comments
 (0)