Portrait Customer Story

Customer story

Brightwell Group, twelve sites, one quarter

A group practice that moved every location onto the same workflow without pausing a single clinic day.

Portrait of Elena Rourke

Elena Rourke

Group practice manager, Brightwell Group

We stopped holding the day together with reminders. Twelve sites now open the same screen, and the only thing that travels between them is the member's record, not a spreadsheet.

12

Sites on one workflow

1 quarter

From first site to last

31%

Fewer no-shows across the group

Read the full story
About this block

Portrait Customer StoryPRO

A single customer story that sets a tall portrait with a gradient name card beside an oversized light quote, a hairline row of three proof figures, and a link into the full write-up.

Testimonial44: Portrait Customer Story

Single customer story that sets a tall portrait with a gradient name card beside an oversized light quote, a hairline row of three proof figures underneath, and a link into the full write-up.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/testimonial44?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/testimonial44?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/testimonial44.tsx plus the badge23 component it uses for the eyebrow.

Quick start

The installed file exports testimonial44Demo alongside the block: the exact props behind the preview above. Spread it to get a working story in one line.

tsx
import { Testimonial44, testimonial44Demo } from "@/components/beste/block/testimonial44";

export default function Page() {
  return <Testimonial44 {...testimonial44Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Testimonial44 } from "@/components/beste/block/testimonial44";

export default function Page() {
  return (
    <Testimonial44
      badge={{ label: "Customer story" }}
      heading="Brightwell Group, twelve sites, one quarter"
      description="A group practice that moved every location onto the same workflow."
      person={{
        image: { src: "/images/elena.jpg", alt: "Portrait of Elena Rourke" },
        name: "Elena Rourke",
        role: "Group practice manager",
      }}
      quote="Twelve sites now open the same screen, and the only thing that travels between them is the member's record."
      metrics={[
        { value: "12", label: "Sites on one workflow" },
        { value: "1 quarter", label: "From first site to last" },
        { value: "31%", label: "Fewer no-shows" },
      ]}
      link={{ label: "Read the full story", href: "/customers/brightwell" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Monospace eyebrow above the hairline rule, rendered via Badge23
headingstringSection heading in the left column
descriptionstringSupporting paragraph, right-aligned from md up
personPersonPortrait column with the name card over a gradient
quotestringThe story itself, set at display size
metricsMetric[][]Three proof figures under a rule
link{ label: string; href: string }Link into the full write-up
classNamestringExtra classes for the outer <section>
ts
type Person = {
  image: { src: string; alt: string };
  name: string;
  role: string;
};

type Metric = { value: string; label: string };

Behavior notes

  • The quote is a <blockquote> set unquoted at display size with the attribution living on the portrait, which is what makes the section read as one story rather than as a card in a testimonial grid.
  • The right column is justify-between, so the quote sits at the top and the metrics and link stay anchored to the bottom of the portrait's height on desktop.
  • The portrait takes lg:h-auto and stretches to the content beside it, while below lg it falls back to a fixed h-80, sm:h-96 band so a tall crop never dominates a phone screen.
  • The name card is fixed dark over a gradient scrim, so its two lines use the fixed text-background tokens rather than the adaptive ones.
  • The metrics row is sm:grid-cols-3 and takes whatever it is given, so passing two leaves a gap on the right. Three is the shape it is drawn for.
  • Metric values are strings, so 1 quarter and 31% sit in the same row without a unit prop or any formatting in the block.

More Testimonial blocks

View all Testimonial
PRO

testimonial48

Client Stories

Long-form testimonials told as stories: a serif heading settling in word by word beside the intro and a pill action, then alternating rows that pair a drifting portrait photograph with a story title, a serif quote, the person, and a link to the full account.

PRO

testimonial31

Stats With Testimonial Gallery

Centered header above a stats rail beside an expanding portrait gallery — hovering a person widens their frame and reveals their quote while the others contract.

PRO

testimonial53

Portrait and Long Quote

One long testimonial beside a portrait: the photograph drifts inside its frame on the left while a serif quote settles in word by word on the right, closed by a ruled row with the speaker's name, context and a sliding-marker pill.

PRO

testimonial25

Testimonial Carousel

Horizontally scrollable testimonial cards with full-bleed portraits, overlaid quote and author.

PRO

testimonial50

Three Voices

A rotating testimonial: a portrait on the left and a large serif quote on the right blur out and in together every six seconds, pause on hover, and can be chosen directly from a row of round portrait buttons, with a pill action beneath.

PRO

testimonial14

Stats and Quote

Key statistics row followed by a centered testimonial quote with author avatar. Perfect for combining social proof metrics with executive endorsements.