-->
/* ================ 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)