Marquee
An infinite strip — logos, taglines — that pauses on hover.
scrollvars·one rAF in·
CSS variables out·
<div class="sv-marquee [--sv-marquee-duration:24s] [--sv-gap:64px] py-8">
<div class="sv-marquee-track">
{logos}{/* duplicate once, aria-hidden */}
</div>
</div>
<div class="sv-marquee">
<div class="sv-marquee-track">
…content… …content again (aria-hidden)…
</div>
</div>
/* the preset (styles/ui.css): */
.sv-marquee { overflow: hidden; display: flex; }
.sv-marquee-track { display: flex; gap: var(--sv-gap, 48px); width: max-content;
padding-right: var(--sv-gap, 48px);
animation: sv-marquee var(--sv-marquee-duration, 30s) linear infinite; }
.sv-marquee:hover .sv-marquee-track { animation-play-state: paused; }
@keyframes sv-marquee { to { translate: -50% 0; } }
<Marquee speed={24}>
{logos.map(l => <img key={l.id} src={l.src} alt={l.name} className="h-8" />)}
</Marquee>