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.