--> /* ================ Firebase ================= */ /* ================ Utils ================= */ img.onerror = () => { slide.remove(); }; // broken = gone // overflow-based px/sec (bigger overflow => faster) // one transition duration from avg slide width // Speed factor: smaller => faster overall feel (1.4 ~ 40% faster) // Seamless marquee (loop) speed: clamp(SPEED_MS, 800, 10000), // ✅ BUG FIX: proper clamp // 2–3 logos: Bounce mode (no clones, no loop) // cleanup previous observers & instances // Pause/resume when tab hidden/visible // Pause autoplay when marquee is offscreen /* ================ Main ================= */ // sort + de-dup // render slides // wait for images; some slides may be removed if broken // EFFECTIVE count after broken removals // init // re-init on resize (debounced)