diff --git a/web/app.js b/web/app.js index 4bbd38a..d1ee8e4 100644 --- a/web/app.js +++ b/web/app.js @@ -155,6 +155,7 @@ let recordings = []; let recordingsFetchInFlight = false; let showDebugOverlay = localStorage.getItem('spectre.debugOverlay') !== '0'; let hoveredSignal = null; +let popoverHideTimer = null; const GAIN_MAX = 60; const timelineWindowMs = 5 * 60 * 1000; @@ -1293,7 +1294,7 @@ window.addEventListener('mousemove', (ev) => { hoveredSignal = hoverHit.signal; renderSignalPopover(hoverHit, hoverHit.signal); } else { - hideSignalPopover(); + scheduleHideSignalPopover(); } if (isDraggingSpectrum) { const dx = ev.clientX - dragStartX; diff --git a/web/style.css b/web/style.css index 2e74798..65f15f7 100644 --- a/web/style.css +++ b/web/style.css @@ -217,9 +217,9 @@ canvas { display: block; width: 100%; height: 100%; border-radius: var(--r-sm); position: absolute; z-index: 8; pointer-events: none; min-width: 180px; max-width: 220px; padding: 10px 12px; border-radius: 10px; border: 1px solid var(--line-hi); background: rgba(6, 10, 18, 0.94); box-shadow: 0 18px 50px rgba(0,0,0,0.38); - font-size: 0.72rem; color: var(--text); display: none; + font-size: 0.72rem; color: var(--text); display: none; opacity: 0; transform: translateY(4px); } -.signal-popover.open { display: block; } +.signal-popover.open { display: block; opacity: 1; transform: translateY(0); transition: opacity 90ms ease, transform 90ms ease; } .signal-popover__title { font-family: var(--mono); font-weight: 700; margin-bottom: 4px; color: var(--accent); } .signal-popover__meta { color: var(--text-mute); margin-bottom: 6px; } .signal-popover__scores { display: grid; gap: 4px; }