Skip to content

Commit f2b3617

Browse files
rcourtmanclaude
andcommitted
fix: resolve stuck tooltip issue with improved event handling
- Fixed handleMouseOut to properly detect when leaving tooltip triggers - Added document mouseleave handler to hide tooltips when mouse leaves viewport - Added scroll event handler to prevent tooltips getting stuck during scrolling - Improved event handling to prevent premature tooltip hiding from child element bubbling 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 4a340ab commit f2b3617

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

src/public/js/tooltips.js

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ PulseApp.tooltips = (() => {
2222
document.body.addEventListener('mouseout', handleMouseOut);
2323
document.body.addEventListener('mousemove', handleMouseMove);
2424

25+
// Hide tooltip when mouse leaves the document
26+
document.addEventListener('mouseleave', hideTooltip);
27+
28+
// Hide tooltip on scroll to prevent stuck tooltips
29+
window.addEventListener('scroll', hideTooltip, true);
30+
2531
document.addEventListener('mouseup', hideSliderTooltip);
2632
document.addEventListener('touchend', hideSliderTooltip);
2733
}
@@ -51,21 +57,28 @@ PulseApp.tooltips = (() => {
5157
}
5258

5359
function handleMouseOut(event) {
54-
const target = event.target.closest('.metric-tooltip-trigger, .storage-tooltip-trigger');
55-
if (target && tooltipElement) {
60+
const target = event.target.closest('[data-tooltip], .metric-tooltip-trigger, .storage-tooltip-trigger, .truncate');
61+
if (!target) return;
62+
63+
// Check if we're actually leaving the tooltip trigger element
64+
const relatedTarget = event.relatedTarget;
65+
if (relatedTarget && target.contains(relatedTarget)) {
66+
return; // We're still within the same tooltip trigger
67+
}
68+
69+
if (tooltipElement) {
5670
tooltipElement.classList.add('hidden', 'opacity-0');
5771
tooltipElement.classList.remove('opacity-100');
5872
}
5973
}
6074

6175
function handleMouseMove(event) {
62-
const target = event.target.closest('.metric-tooltip-trigger, .storage-tooltip-trigger');
63-
if (tooltipElement && !tooltipElement.classList.contains('hidden') && target) {
64-
positionTooltip(event);
65-
} else if (tooltipElement && !tooltipElement.classList.contains('hidden') && !target) {
66-
// Optional: Hide if moving away from a trigger element while tooltip is still visible
67-
// tooltipElement.classList.add('hidden', 'opacity-0');
68-
// tooltipElement.classList.remove('opacity-100');
76+
if (tooltipElement && !tooltipElement.classList.contains('hidden')) {
77+
const target = event.target.closest('[data-tooltip], .metric-tooltip-trigger, .storage-tooltip-trigger, .truncate');
78+
if (target) {
79+
positionTooltip(event);
80+
}
81+
// Don't hide on mousemove - let mouseout handle it properly
6982
}
7083
}
7184

0 commit comments

Comments
 (0)