Skip to content

Commit 93c26d8

Browse files
acr92snowystinger
andauthored
RAC: Fix tooltip stuck on screen when scrolling (#7227)
This commit ports #6984 to react-aria-components. Co-authored-by: Robert Snow <[email protected]>
1 parent cd313a3 commit 93c26d8

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

packages/react-aria-components/src/Tooltip.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: Ref
143143
isOpen: state.isOpen,
144144
arrowSize: arrowWidth,
145145
arrowBoundaryOffset: props.arrowBoundaryOffset,
146-
shouldFlip: props.shouldFlip
146+
shouldFlip: props.shouldFlip,
147+
onClose: () => state.close(true)
147148
});
148149

149150
let isEntering = useEnterAnimation(props.tooltipRef, !!placement) || props.isEntering || false;

packages/react-aria-components/test/Tooltip.test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,41 @@ describe('Tooltip', () => {
132132
act(() => jest.runAllTimers());
133133
});
134134

135+
it('should hide tooltip on scroll', async () => {
136+
let {getByLabelText, getByText, getByTestId} = render(
137+
<div
138+
style={{
139+
display: 'flex',
140+
flexDirection: 'column',
141+
gap: '30px',
142+
overflow: 'scroll',
143+
height: '200px'
144+
}}
145+
data-testid="scroll-container">
146+
{new Array(10).fill().map((_, idx) => (
147+
<TooltipTrigger delay={0} key={idx}>
148+
<Button aria-label={`trigger-${idx}`}><span aria-hidden="true">✏️</span></Button>
149+
<Tooltip>{`Tooltip-${idx}`}</Tooltip>
150+
</TooltipTrigger>
151+
))}
152+
</div>
153+
);
154+
155+
// Tooltip should be visible on focus
156+
let button1 = getByLabelText('trigger-1');
157+
fireEvent.mouseMove(document.body);
158+
await user.hover(button1);
159+
act(() => jest.runAllTimers());
160+
161+
let tooltip1 = getByText('Tooltip-1');
162+
expect(tooltip1).toBeVisible();
163+
164+
// Tooltip should not be visible on scroll
165+
let scrollContainer = getByTestId('scroll-container');
166+
expect(scrollContainer).toBeInTheDocument();
167+
fireEvent.scroll(scrollContainer, {target: {top: 100}});
168+
expect(tooltip1).not.toBeVisible();
169+
});
135170

136171
describe('portalContainer', () => {
137172
function InfoTooltip(props) {

0 commit comments

Comments
 (0)