stream/ui
Browse the library

Testimonials

Three customer quotes with names and roles.

Built withAvatar

Preview

TestimonialsSection.tsx

Customers

Teams that stopped asking “what changed?”

  • We cut our incident review time in half. Everyone reads the same timeline now.

    PRPriya RamanEngineering Manager, Northwind
  • Preview links on every PR changed how design reviews work here. No more screenshots in Slack.

    MLMarcus LeeDesign Lead, Fabrikam
  • Setup took an afternoon. The performance budgets caught a regression the next morning.

    SASofia AlvarezStaff Engineer, Contoso

Notes

  • Each quote is a figure with blockquote and figcaption.
  • Replace the sample quotes with real ones before shipping.

Source

src/components/sections/TestimonialsSection.tsx
import { Avatar } from "@streamui/react";

const quotes = [
  {
    body: "We cut our incident review time in half. Everyone reads the same timeline now.",
    name: "Priya Raman",
    role: "Engineering Manager, Northwind",
    initials: "PR",
    tone: "lime",
  },
  {
    body: "Preview links on every PR changed how design reviews work here. No more screenshots in Slack.",
    name: "Marcus Lee",
    role: "Design Lead, Fabrikam",
    initials: "ML",
    tone: "pink",
  },
  {
    body: "Setup took an afternoon. The performance budgets caught a regression the next morning.",
    name: "Sofia Alvarez",
    role: "Staff Engineer, Contoso",
    initials: "SA",
    tone: "blue",
  },
] as const;

/** Three quotes in ruled columns. */
export function TestimonialsSection() {
  return (
    <section className="@container bg-paper">
      <header className="border-b-2 border-ink p-8 @3xl:p-12">
        <p className="font-mono text-xs font-bold tracking-widest text-ink-muted uppercase">Customers</p>
        <h2 className="mt-4 max-w-xl font-display text-3xl leading-tight tracking-tight text-balance @3xl:text-4xl">
          Teams that stopped asking “what changed?”
        </h2>
      </header>
      <ul className="grid grid-cols-1 gap-0.5 bg-ink @3xl:grid-cols-3">
        {quotes.map((q) => (
          <li key={q.name} className="bg-paper p-8">
            <figure className="flex h-full flex-col gap-6">
              <blockquote className="flex-1 text-lg leading-relaxed">
                <p>
                  <span aria-hidden className="font-display text-3xl leading-none">“</span>
                  {q.body}
                </p>
              </blockquote>
              <figcaption className="flex items-center gap-3 border-t-2 border-dashed border-ink-faint pt-5">
                <Avatar initials={q.initials} tone={q.tone} size="sm" />
                <span>
                  <span className="block font-bold">{q.name}</span>
                  <span className="block text-sm text-ink-muted">{q.role}</span>
                </span>
              </figcaption>
            </figure>
          </li>
        ))}
      </ul>
    </section>
  );
}