diff --git a/packages/react/src/tooltip/provider/TooltipProvider.test.tsx b/packages/react/src/tooltip/provider/TooltipProvider.test.tsx index 8424bd0bf6..cf01097812 100644 --- a/packages/react/src/tooltip/provider/TooltipProvider.test.tsx +++ b/packages/react/src/tooltip/provider/TooltipProvider.test.tsx @@ -25,7 +25,7 @@ describe('', () => { , ); - const trigger = document.querySelector('button')!; + const trigger = screen.getByRole('button'); fireEvent.mouseEnter(trigger); fireEvent.mouseMove(trigger); @@ -42,6 +42,30 @@ describe('', () => { expect(screen.queryByText('Content')).not.to.equal(null); }); + + it('respects delay=0', async () => { + await render( + + + + + + Content + + + + , + ); + + const trigger = screen.getByRole('button'); + + fireEvent.mouseEnter(trigger); + fireEvent.mouseMove(trigger); + + clock.tick(0); + + expect(screen.queryByText('Content')).not.to.equal(null); + }); }); describe('prop: closeDelay', () => { @@ -61,7 +85,7 @@ describe('', () => { , ); - const trigger = document.querySelector('button')!; + const trigger = screen.getByRole('button'); fireEvent.mouseEnter(trigger); fireEvent.mouseMove(trigger); diff --git a/packages/react/src/tooltip/provider/TooltipProvider.tsx b/packages/react/src/tooltip/provider/TooltipProvider.tsx index bfb2a82e93..a25feca31c 100644 --- a/packages/react/src/tooltip/provider/TooltipProvider.tsx +++ b/packages/react/src/tooltip/provider/TooltipProvider.tsx @@ -12,7 +12,7 @@ import { FloatingDelayGroup } from '@floating-ui/react'; const TooltipProvider: React.FC = function TooltipProvider(props) { const { delay, closeDelay, timeout = 400 } = props; return ( - + {props.children} ); diff --git a/packages/react/src/tooltip/root/TooltipRoot.test.tsx b/packages/react/src/tooltip/root/TooltipRoot.test.tsx index c2071bb6e2..a415f1696f 100644 --- a/packages/react/src/tooltip/root/TooltipRoot.test.tsx +++ b/packages/react/src/tooltip/root/TooltipRoot.test.tsx @@ -330,7 +330,7 @@ describe('', () => { describe('prop: delay', () => { clock.withFakeTimers(); - it('should open after delay with rest type by default', async () => { + it('should open after rest delay', async () => { await render( diff --git a/packages/react/src/tooltip/root/useTooltipRoot.ts b/packages/react/src/tooltip/root/useTooltipRoot.ts index 875a969ec4..7ce5fe257e 100644 --- a/packages/react/src/tooltip/root/useTooltipRoot.ts +++ b/packages/react/src/tooltip/root/useTooltipRoot.ts @@ -104,15 +104,17 @@ export function useTooltipRoot(params: useTooltipRoot.Parameters): useTooltipRoo }); const { delay: groupDelay, isInstantPhase, currentId } = useDelayGroup(context); - const openGroupDelay = typeof groupDelay === 'object' ? groupDelay.open : groupDelay; - const closeGroupDelay = typeof groupDelay === 'object' ? groupDelay.close : groupDelay; + // We only pass an object to `FloatingDelayGroup`. A number means the Provider is not + // present, so we should ignore the value by using `undefined`. + const openGroupDelay = typeof groupDelay === 'object' ? groupDelay.open : undefined; + const closeGroupDelay = typeof groupDelay === 'object' ? groupDelay.close : undefined; let instantType = isInstantPhase ? ('delay' as const) : instantTypeState; if (!open && context.floatingId === currentId) { instantType = instantTypeState; } - const computedRestMs = openGroupDelay || delayWithDefault; + const computedRestMs = openGroupDelay ?? delayWithDefault; let computedCloseDelay: number | undefined = closeDelayWithDefault; // A provider is present and the close delay is not set.