Skip to content
Brok UI

Loading…

No results

Testimonials

Open source

Social-proof sections — grids, a single hero quote, a masonry wall, marquees and a carousel.

Preview

4 of 10

resources/views/blocks/testimonials-marquee.blade.php Blade
@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

terminal
php artisan ui:add blocks/testimonials-marquee

Installs these dependencies automatically:

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

badge marquee quote-card section

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.

testimonials-marquee.md
# 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:

resources/views/welcome.blade.php Blade
<x-blocks.testimonials-marquee />

Built from primitives

Composes <brok:*> Semantic tokens Re-themeable RTL-ready

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.

resources/views/blocks/testimonials-marquee.blade.php Blade
@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