From 687f1ca0295f54adc2ad7fd71b564bd9e2367935 Mon Sep 17 00:00:00 2001 From: gabrieljablonski Date: Mon, 7 Apr 2025 17:56:37 -0300 Subject: [PATCH 1/2] fix: handle hovering tooltip correctly --- src/components/Tooltip/Tooltip.tsx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/components/Tooltip/Tooltip.tsx b/src/components/Tooltip/Tooltip.tsx index 1471e930..db954470 100644 --- a/src/components/Tooltip/Tooltip.tsx +++ b/src/components/Tooltip/Tooltip.tsx @@ -573,19 +573,21 @@ const Tooltip = ({ }) } - const handleMouseEnterTooltip = () => { + const handleMouseOverTooltip = () => { hoveringTooltip.current = true } - const handleMouseLeaveTooltip = () => { + const handleMouseOutTooltip = () => { hoveringTooltip.current = false handleHideTooltip() } - if (clickable && !hasClickEvent) { - // used to keep the tooltip open when hovering content. - // not needed if using click events. - tooltipRef.current?.addEventListener('mouseenter', handleMouseEnterTooltip) - tooltipRef.current?.addEventListener('mouseleave', handleMouseLeaveTooltip) + const addHoveringTooltipListeners = + clickable && (actualCloseEvents.mouseout || actualCloseEvents.mouseleave) + if (addHoveringTooltipListeners) { + // used to keep the tooltip open when hovering from anchor to tooltip. + // only relevant if either `mouseout`/`mouseleave` is in use + tooltipRef.current?.addEventListener('mouseover', handleMouseOverTooltip) + tooltipRef.current?.addEventListener('mouseout', handleMouseOutTooltip) } enabledEvents.forEach(({ event, listener }) => { @@ -611,9 +613,9 @@ const Tooltip = ({ if (actualGlobalCloseEvents.escape) { window.removeEventListener('keydown', handleEsc) } - if (clickable && !hasClickEvent) { - tooltipRef.current?.removeEventListener('mouseenter', handleMouseEnterTooltip) - tooltipRef.current?.removeEventListener('mouseleave', handleMouseLeaveTooltip) + if (addHoveringTooltipListeners) { + tooltipRef.current?.removeEventListener('mouseover', handleMouseOverTooltip) + tooltipRef.current?.removeEventListener('mouseout', handleMouseOutTooltip) } enabledEvents.forEach(({ event, listener }) => { elementRefs.forEach((ref) => { From 53717f841adea4baec8383cccefc91d3f68813c0 Mon Sep 17 00:00:00 2001 From: gabrieljablonski Date: Mon, 7 Apr 2025 18:04:35 -0300 Subject: [PATCH 2/2] fix: clear `mouseover` and `mouseout` when `imperativeModeOnly` is true --- src/components/Tooltip/Tooltip.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/Tooltip/Tooltip.tsx b/src/components/Tooltip/Tooltip.tsx index db954470..20d2e3b8 100644 --- a/src/components/Tooltip/Tooltip.tsx +++ b/src/components/Tooltip/Tooltip.tsx @@ -147,15 +147,17 @@ const Tooltip = ({ if (imperativeModeOnly) { Object.assign(actualOpenEvents, { - mouseenter: false, + mouseover: false, focus: false, + mouseenter: false, click: false, dblclick: false, mousedown: false, }) Object.assign(actualCloseEvents, { - mouseleave: false, + mouseout: false, blur: false, + mouseleave: false, click: false, dblclick: false, mouseup: false,