a560ec9434
The hide-timer used to fire on a plain phase==="success" timeout, regardless of whether the banner was actually on screen — if the threshold was reached while scrolled away, it could hide itself before the user ever saw it. Gates the timer on continuous IntersectionObserver visibility (useInView, no `once`) instead of a lifetime "ever visible" flag — the latter flips true as soon as the page loads (the banner sits at the top), which defeats the purpose entirely. The timer now only runs while the banner is actually in view, and restarts if the user scrolls away and back before it completes.