An infinitely scrolling ticker built on CSS animations — no JavaScript. Works with any content: text, logos, cards, images. Pauses on hover and fades edges by default.
The simplest use — inline text items separated by custom spacing. Hover to pause, edge fade included by default.
<x-ui::marquee gap="2rem">
<span class="text-sm font-medium">🚀 New release v2.0</span>
<span class="text-sm font-medium">✨ Dark mode support</span>
<span class="text-sm font-medium">📦 50+ components</span>
<span class="text-sm font-medium">🎨 Fully customisable</span>
<span class="text-sm font-medium">⚡ Livewire-ready</span>
</x-ui::marquee>
A common "trusted by" or "built with" section. Items start grayscale and reveal colour on hover while the marquee pauses.
<x-ui::marquee :speed="20" gap="3rem" class="py-6">
@foreach($brands as $brand)
<div class="flex items-center gap-2 text-zinc-400 dark:text-zinc-500 grayscale hover:grayscale-0 hover:text-zinc-700 dark:hover:text-zinc-200 transition-all">
<x-ui::icon :name="$brand['icon']" class="w-6 h-6" />
<span class="text-sm font-semibold tracking-tight">{{ $brand['name'] }}</span>
</div>
@endforeach
</x-ui::marquee>
Rich card content — testimonials, product features, or media. Set a fixed width on each card so they don't stretch. Two rows scrolling in opposite directions create depth.
<x-ui::marquee gap="1rem" :speed="35" class="py-2">
@foreach($testimonials as $t)
<div class="w-72 shrink-0 rounded-xl border border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-900 p-4 shadow-sm">
<p class="text-sm text-zinc-600 dark:text-zinc-300">"{{ $t['quote'] }}"</p>
<div class="mt-3 flex items-center gap-2">
<div class="w-7 h-7 rounded-full bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center text-xs font-bold text-primary-700 dark:text-primary-300">
{{ $t['initials'] }}
</div>
<span class="text-xs font-medium text-zinc-700 dark:text-zinc-200">{{ $t['name'] }}</span>
</div>
</div>
@endforeach
</x-ui::marquee>
Control scroll direction with the direction prop. Pair left and right rows for a visually dynamic section.
direction="left" (default)
direction="right"
<x-ui::marquee direction="left">...</x-ui::marquee> {{-- default --}}
<x-ui::marquee direction="right">...</x-ui::marquee>
The :speed prop is the animation duration in seconds — lower = faster. Default is 30.
Fast (8s)
Default (25s)
Slow (55s)
<x-ui::marquee :speed="10">...</x-ui::marquee> {{-- fast --}}
<x-ui::marquee :speed="30">...</x-ui::marquee> {{-- default --}}
<x-ui::marquee :speed="60">...</x-ui::marquee> {{-- slow --}}
Use direction="up" or direction="down" for a vertical ticker. Set an explicit height on the component — the mask fade also flips to vertical.
direction="up"
direction="down"
<x-ui::marquee direction="up" class="h-48" gap="0.75rem">
<div class="text-sm text-zinc-600 dark:text-zinc-300">✅ 99.9% uptime SLA</div>
<div class="text-sm text-zinc-600 dark:text-zinc-300">🔒 SOC 2 Type II certified</div>
<div class="text-sm text-zinc-600 dark:text-zinc-300">🌍 200+ edge locations</div>
<div class="text-sm text-zinc-600 dark:text-zinc-300">⚡ <50ms response time</div>
</x-ui::marquee>
Set :fade="false" to remove the gradient edge mask. Combine with :pause-on-hover="false" for a non-stop ticker.
<x-ui::marquee :fade="false">...</x-ui::marquee>
{{-- No fade + no pause on hover --}}
<x-ui::marquee :fade="false" :pause-on-hover="false">...</x-ui::marquee>