← All Pull Requests

Broaden the tooltip guard: suppress over any open popover, not just the same card's #4

Closed opened by Ray 2026-09-02

Closes adom/adom-shotlog#3.

0.28.2 already guards this case, and the comment quotes Ray verbatim:

// A card whose info overlay is REVEALED (compact mode ⓘ) is being read:
// no tooltip may float over it (Ray: "the tooltip obscures the popover").
if (el.closest && el.closest(".shot-card")?.querySelector(".card-info.show")) return;

The guard is card-scoped: it only fires when the hovered element sits inside a .shot-card whose OWN .card-info is open. Ray hit the same complaint again with a different surface open, and that path is unguarded, so a .hover-popover.show elsewhere still gets covered by the 600ms tooltip.

Change

Keep the existing card-scoped check, add a global one:

if (document.querySelector(".hover-popover.show, .card-info.show")) return;

Nothing incidental covers something the human deliberately opened. Both surfaces are explicitly opened by a click or a deliberate hover, so suppressing an automatic tooltip while either is up matches the intent already encoded at index.html:1219, where the ⓘ hover calls window._hideTip().

Verified

  • node --check on the main script block: OK.
  • cargo build --release clean, 7 warnings, identical to baseline; confirmed the new selector is present in the rebuilt binary (the HTML is include_str!-embedded).

I could NOT reproduce Ray's original screenshot on 0.28.2 to prove the exact path, so treat this as closing the obvious hole rather than a confirmed repro. If the compact-ⓘ case was the whole complaint, this is still harmless: it only ever suppresses a tooltip while a popover is genuinely open.

Not merging this myself, adom-shotlog is yours.

Diff Skip to comments (1)

--- a/src/html/index.html+++ b/src/html/index.html@@ -1,2078 +1,2086 @@⋯ 286 unchanged lines ⋯ .shot-card-img { display: block; width: 100%; height: 220px; flex-shrink: 0; background: #111;   object-fit: contain; object-position: center top; transition: opacity .15s; } .shot-card:active .shot-card-img { opacity: .85; }-/* Direct-to-fullscreen shortcut: a ⛶ button on the thumbnail (hover-revealed)-   that skips the modal and fills the window in ONE click. The image itself-   still opens the modal on click — this is purely additional. */+/* Fullscreen affordance: a ⛶ button on the thumbnail (hover-revealed).+   The thumbnail IMAGE also fills the window in one click (see the click+   handler on img, "ONE click on a thumbnail goes STRAIGHT to fill-window"),+   so this button is the discoverable, keyboard-focusable route to the same+   thing rather than a separate shortcut past the modal. */ .card-img-wrap { position: relative; } .card-fill-btn { position: absolute; top: 10px; right: 10px; width: 32px; height: 32px;   display: inline-flex; align-items: center; justify-content: center;⋯ 626 unchanged lines ⋯     const tip = $('global-tooltip'); let cx=0, cy=0, timer=null;     document.addEventListener('mousemove', e => { cx=e.clientX; cy=e.clientY; }, true);     function show(el) {-      // A card whose info overlay is REVEALED (compact mode ⓘ) is being read:-      // no tooltip may float over it (Ray: "the tooltip obscures the popover").+      // Nothing incidental may cover something the human deliberately opened.+      // This started as a card-scoped check for the compact-mode ⓘ overlay+      // (Ray: "the tooltip obscures the popover"), but the same complaint came+      // back with a DIFFERENT surface open: the guard only fired when the+      // hovered element sat inside a .shot-card whose OWN overlay was showing,+      // so any other open popover still got covered. Suppress over any of them.       if (el.closest && el.closest('.shot-card')?.querySelector('.card-info.show')) return;+      if (document.querySelector('.hover-popover.show, .card-info.show')) return;       // Rich (authored, trusted) HTML via el._ttHtml; else plain text. Dynamic       // values interpolated into _ttHtml are escaped by the builders below.       if (el._ttHtml) { tip.innerHTML = el._ttHtml; }⋯ 1145 unchanged lines ⋯ </script> </body> </html>+

Comments

John Lauer · 1mo ago

Applied in 0.28.3: the global document.querySelector('.hover-popover.show, .card-info.show') guard sits right after the card-scoped one, credited to you in the comment. Verified in pup that a tooltip stays hidden while the brand hover card is open and returns once it closes. Closing rather than merging because the diff is against an older whole file; the change itself is in. Thanks.

Log in to comment.