Portrait and Long Quote

Portrait of a client

A longer story

Icameforsixsessionstogetoverabreakup.Thatwasthreeyearsago.SomewhereinthesecondyearIrealisedIwasnotcomingtogetoveranythinganymore.IwascomingbecauseitwastheonehouraweekwhereIdidnothavetoperform.

Jonny Greenwood

Individual therapy, since 2023

Read the whole story
About this block

Portrait and Long QuotePRO

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.

Testimonial53: Portrait and Long Quote

One long story: a portrait drifting inside its frame beside a quote that settles in word by word, closed by a ruled foot carrying the name and context on one side and a pill on the other.

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/testimonial53?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/testimonial53.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.

Quick start

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

tsx
import { Testimonial53, testimonial53Demo } from "@/components/beste/block/testimonial53";

export default function Page() {
  return <Testimonial53 {...testimonial53Demo} />;
}

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

tsx
import { Testimonial53 } from "@/components/beste/block/testimonial53";

export default function Page() {
  return (
    <Testimonial53
      eyebrow="A longer story"
      quote="I came for six sessions to get over a breakup. That was three years ago."
      name="Jonny Greenwood"
      context="Individual therapy, since 2023"
      image={{ src: "/people/jonny.jpg", alt: "Portrait of a client" }}
      button={{ label: "Read the whole story", href: "/stories/jonny", tone: "outline" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringSmall-caps line above the quote
quotestringThe quote, rendered as a blockquote through Text1
namestringName in the ruled foot
contextstringContext line under the name
image{ src: string; alt: string }Portrait in the left column
buttonActionButtonPill action opposite the name
classNamestringExtra classes for the outer <section>
ts
type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

Behavior notes

  • The stagger is tightened all the way to 0.02s, the fastest in the set, because this quote is several sentences long and anything slower would still be arriving after the reader has finished.
  • The foot waits on 0.2 + quote.split(" ").length * 0.02, the same arithmetic, so the attribution lands as the last word settles however long the story runs.
  • name and context are separate top-level props rather than an author object, which suits a block built around one quote: there is nothing to group them against.
  • The foot is one border-t row that stacks below sm and splits to justify-between above it, so the attribution and the action never crowd each other on a phone.
  • The portrait drifts -10% to 10% against a 1.2 scale and clears from blur(24px) on decode, with a complete check on mount for cached files.
  • The two columns are vertically centred, so the portrait stays level with a quote of any length.
  • Without image the quote column keeps its grid position rather than stretching across the section.

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

testimonial51

Single Voice

One centred testimonial: a long serif quote that settles in word by word, the speaker's portrait, name and context beneath it, and a sliding-marker pill.

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

testimonial54

Three Ruled Quotes

Three short testimonials in ruled columns, each a serif quote with a name and context, under a serif heading that settles in word by word and a sliding-marker pill.

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

testimonial41

Editorial Quote Proof

An editorial testimonial with an eyebrow, a large light quote and author on the left, an image tile floating a proof stat on the right, and a centered trust cluster below a hairline rule.