Testimonials
Social-proof sections — grids, a single hero quote, a masonry wall, marquees and a carousel.
Preview
@props([
'eyebrow' => 'Loved by teams',
'heading' => 'What our customers say',
'subheading' => 'Thousands of teams ship faster with a UI system they fully own.',
'rows' => null,
])
@php
$rows ??= [
[
['quote' => 'We replaced three half-finished design systems with this in a weekend. Owning the Blade source changed everything.', 'name' => 'Amara Okafor', 'role' => 'Staff Engineer', 'initials' => 'AO'],
['quote' => 'The token model means our brand refresh was a CSS variable change, not a six-week migration.', 'name' => 'Lukas Meyer', 'role' => 'Design Lead', 'initials' => 'LM'],
['quote' => 'Updates produce a clean diff on the files I edited. No more fear of pulling upstream.', 'name' => 'Priya Nair', 'role' => 'Frontend Architect', 'initials' => 'PN'],
['quote' => 'Accessibility came for free. Keyboard, focus, RTL — all handled out of the box.', 'name' => 'Diego Fernández', 'role' => 'Product Engineer', 'initials' => 'DF'],
],
[
['quote' => 'Copy-into-your-app beats yet another runtime dependency. Our bundle stayed tiny.', 'name' => 'Sofia Rossi', 'role' => 'Tech Lead', 'initials' => 'SR'],
['quote' => 'The blocks are a genuine head start — production-grade markup, not toy demos.', 'name' => 'Kenji Tanaka', 'role' => 'Engineering Manager', 'initials' => 'KT'],
['quote' => 'Dark mode and per-surface theming worked on the first try. Rare and delightful.', 'name' => 'Hannah Schmidt', 'role' => 'UX Engineer', 'initials' => 'HS'],
['quote' => 'Onboarding new devs is trivial now — it is just Blade and tokens they already know.', 'name' => 'Omar Haddad', 'role' => 'CTO', 'initials' => 'OH'],
],
];
$directions = ['left', 'right'];
@endphp
<x-ui.section space="xl" class="overflow-hidden" {{ $attributes }}>
<div class="mx-auto max-w-3xl px-4 text-center">
@if ($eyebrow)
<x-ui.badge variant="secondary" class="mb-4">{{ __($eyebrow) }}</x-ui.badge>
@endif
<h2 class="text-3xl font-bold tracking-tight sm:text-4xl">{{ __($heading) }}</h2>
@if ($subheading)
<p class="mx-auto mt-4 max-w-2xl text-pretty text-lg text-muted-foreground">{{ __($subheading) }}</p>
@endif
</div>
<div class="mt-12 flex flex-col gap-6">
@foreach ($rows as $rowIndex => $row)
<x-ui.marquee :direction="$directions[$rowIndex % 2]" :pause-on-hover="true" :duration="55" gap="1.5rem">
@foreach ($row as $item)
<x-ui.quote-card
glyph="none"
:divider="false"
:quote="__($item['quote'])"
:name="$item['name']"
:role="__($item['role'])"
:initials="$item['initials']"
class="w-80 shrink-0 text-start"
/>
@endforeach
</x-ui.marquee>
@endforeach
</div>
</x-ui.section>
Installation
php artisan ui:add blocks/testimonials-marquee
Registry contract
Install confidence
php artisan ui:add blocks/testimonials-marquee
writes only the generated targets below. The CLI validates each file hash before writing and
prompts before replacing local changes unless --force is used.
- Version
- 1.0.5
- License
- open
- Stability
- stable
- Contract
- v1
- Foundation
- ≥ 1.0.0
| Type | Generated target |
|---|---|
| blade | resources/views/blocks/testimonials-marquee.blade.php |
Registry dependencies
Package dependencies
composer: jml/brok:^0.2
Use with AI
A brief for your coding agent: what the block is, the install command, how to render it, its props and the rules. Copy it, or open a prompt about this block in an assistant.
# Brok UI block: Testimonials Marquee (`testimonials-marquee`)
A heading over two infinite marquee rows scrolling in opposite directions, each made of fixed-width testimonial cards with a quote, avatar, and name.
Brok UI is a Laravel Blade registry. `ui:add` copies this block into the app as plain Blade the app owns; it composes installed `<brok:*>` primitives and semantic design tokens.
## Install
```bash
php artisan ui:add blocks/testimonials-marquee
```
## Render it
```blade
<x-blocks.testimonials-marquee />
```
## Props
- `eyebrow` (string, default `Loved by teams`) — Small label shown above the heading.
- `heading` (string, default `What our customers say`) — Section heading.
- `subheading` (string, default `Thousands of teams ship faster with a UI system they fully own.`) — Supporting copy under the heading.
- `rows` (mixed|null, default `null`) — Two rows of quote entries, one per marquee direction; null falls back to sample data.
## Use when
- Running two infinite marquee rows of testimonial cards scrolling in opposite directions.
- Wanting a continuously moving, ambient social-proof section.
## Avoid when
- Wanting a static, user-controlled layout instead of auto-scrolling; use testimonials-grid or testimonials-carousel instead.
## Rules
- Render the installed block with `<x-blocks.testimonials-marquee />` and pass data through its props; edit the copied file only for structural changes.
- Keep the semantic design tokens (`bg-background`, `text-muted-foreground`); never swap in raw colour utilities.
- Keep the `data-slot` attributes and the logical (start/end) spacing so the markup still mirrors under `dir="rtl"`.
## Links
- Docs: https://brokui.dev/blocks/testimonials-marquee
- Registry JSON (files, props, contract): https://brokui.dev/r/open/blocks/testimonials-marquee.json
Working in Claude Code, Cursor or Codex? Give the agent the whole registry through the MCP server or the Brok UI skill.
Guidance
Use when
- Running two infinite marquee rows of testimonial cards scrolling in opposite directions.
- Wanting a continuously moving, ambient social-proof section.
Avoid when
- Wanting a static, user-controlled layout instead of auto-scrolling; use testimonials-grid or testimonials-carousel instead.
Anti-patterns
- Do not replace semantic props with conflicting utility classes.
- Do not remove labels, focus styles, or state attributes.
Usage
Render the block as a component, passing data where useful:
<x-blocks.testimonials-marquee />
Built from primitives
This block composes installed <brok:*> primitives and semantic design
tokens only — it does not reimplement any primitive. Re-theme it (light, dark, admin, customer) by
editing CSS variables; flip the preview to RTL to confirm it mirrors.
Source
The exact, editable file ui:add writes
into your app. The preview above renders this same source — there are no preview-only blocks.
@props([
'eyebrow' => 'Loved by teams',
'heading' => 'What our customers say',
'subheading' => 'Thousands of teams ship faster with a UI system they fully own.',
'rows' => null,
])
@php
$rows ??= [
[
['quote' => 'We replaced three half-finished design systems with this in a weekend. Owning the Blade source changed everything.', 'name' => 'Amara Okafor', 'role' => 'Staff Engineer', 'initials' => 'AO'],
['quote' => 'The token model means our brand refresh was a CSS variable change, not a six-week migration.', 'name' => 'Lukas Meyer', 'role' => 'Design Lead', 'initials' => 'LM'],
['quote' => 'Updates produce a clean diff on the files I edited. No more fear of pulling upstream.', 'name' => 'Priya Nair', 'role' => 'Frontend Architect', 'initials' => 'PN'],
['quote' => 'Accessibility came for free. Keyboard, focus, RTL — all handled out of the box.', 'name' => 'Diego Fernández', 'role' => 'Product Engineer', 'initials' => 'DF'],
],
[
['quote' => 'Copy-into-your-app beats yet another runtime dependency. Our bundle stayed tiny.', 'name' => 'Sofia Rossi', 'role' => 'Tech Lead', 'initials' => 'SR'],
['quote' => 'The blocks are a genuine head start — production-grade markup, not toy demos.', 'name' => 'Kenji Tanaka', 'role' => 'Engineering Manager', 'initials' => 'KT'],
['quote' => 'Dark mode and per-surface theming worked on the first try. Rare and delightful.', 'name' => 'Hannah Schmidt', 'role' => 'UX Engineer', 'initials' => 'HS'],
['quote' => 'Onboarding new devs is trivial now — it is just Blade and tokens they already know.', 'name' => 'Omar Haddad', 'role' => 'CTO', 'initials' => 'OH'],
],
];
$directions = ['left', 'right'];
@endphp
<x-ui.section space="xl" class="overflow-hidden" {{ $attributes }}>
<div class="mx-auto max-w-3xl px-4 text-center">
@if ($eyebrow)
<x-ui.badge variant="secondary" class="mb-4">{{ __($eyebrow) }}</x-ui.badge>
@endif
<h2 class="text-3xl font-bold tracking-tight sm:text-4xl">{{ __($heading) }}</h2>
@if ($subheading)
<p class="mx-auto mt-4 max-w-2xl text-pretty text-lg text-muted-foreground">{{ __($subheading) }}</p>
@endif
</div>
<div class="mt-12 flex flex-col gap-6">
@foreach ($rows as $rowIndex => $row)
<x-ui.marquee :direction="$directions[$rowIndex % 2]" :pause-on-hover="true" :duration="55" gap="1.5rem">
@foreach ($row as $item)
<x-ui.quote-card
glyph="none"
:divider="false"
:quote="__($item['quote'])"
:name="$item['name']"
:role="__($item['role'])"
:initials="$item['initials']"
class="w-80 shrink-0 text-start"
/>
@endforeach
</x-ui.marquee>
@endforeach
</div>
</x-ui.section>
Ownership & lifecycle
Owner, release state, review evidence and adoption for this item.
- Owner
- Platform UI (@JoshJML)
- Current version
-
1.0.5 - Status
- Stable
- License
-
open - Deprecation
- Not deprecated
- Contract
-
v1 - Foundation
-
≥ 1.0.0