Rotating Quote Hero

Sunlight falling across a quiet mountain ridge
(Voices)

Light, on record.

Auralis gave our whole catalogue one calm voice. Nothing shouts, and yet every page holds attention from the first line.
Mara VossCreative Director, Northpeak
About this block

Rotating Quote HeroPRO

Full-bleed monochrome hero with a giant display heading over a static image, paired with a card that auto-cycles through testimonials and click-to-select dots.

Hero139: Rotating Quote Hero

Full-bleed hero built on a static background photograph washed in a dark gradient scrim, topped with a giant multi-line display heading and closed with a bottom testimonial card that auto-rotates through quotes on a timer, with click-to-jump dots underneath.

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

Base UI flavor

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

This installs the block to components/beste/block/hero139.tsx, the badge7 component it uses to render the eyebrow label, and its dependencies.

Quick start

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

tsx
import { Hero139, hero139Demo } from "@/components/beste/block/hero139";

export default function Page() {
  return <Hero139 {...hero139Demo} />;
}

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

tsx
import { Hero139 } from "@/components/beste/block/hero139";

export default function Page() {
  return (
    <Hero139
      badge={{ label: "Voices" }}
      heading="Trusted by teams who ship."
      backgroundImage={{
        src: "https://images.unsplash.com/photo-1497436072909-60f360e1d4b1?w=1920&h=1200&fit=crop",
        alt: "Sunlight falling across a quiet mountain ridge",
      }}
      quotes={[
        {
          quote: "The clearest tool we have used all year.",
          name: "Jordan Ames",
          role: "VP Engineering, Fenwick",
          href: "https://beste.co",
        },
        {
          quote: "Set up in an afternoon, kept for the long run.",
          name: "Priya Nair",
          role: "Head of Design, Loom & Co",
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow label rendered as a Badge7
headingstringGiant display heading
backgroundImage{ src: string; alt: string }Full-bleed background photo
quotesQuote[][]Testimonials cycled through in the bottom card
classNamestringExtra classes for the outer <section>
ts
type Quote = {
  quote: string;
  name: string;
  role: string;
  href?: string;
};

Behavior notes

  • A setInterval advances the active quote index every 5 seconds; the effect returns early and never starts a timer when there is one quote or none.
  • All quotes are mounted in the DOM at all times, not conditionally rendered: the inactive ones sit absolute inset-0 opacity-0 pointer-events-none with aria-hidden, while the active one is relative opacity-100, cross-fading over a 700ms transition.
  • Clicking a dot jumps active straight to that quote's index (aria-current reflects the selection) and the interval keeps counting from there, so a manual click does not pause or reset the rotation.
  • The background photo sits behind a bg-gradient-to-t from-foreground/70 via-foreground/20 to-foreground/40 scrim so the light heading and badge stay legible over any image.
  • The heading scales from text-6xl at mobile up to text-9xl at lg, intentionally dominating the viewport at desktop widths; the quote name links out via next/link only when href is set on that quote, otherwise it renders as plain text.

More Hero blocks

View all Hero
PRO

hero130

Monochrome Hero with Rotating Announcement Ticker

Full-bleed hero with a static background image, a giant display heading, and a slim bordered bar that auto-rotates through short, clickable announcement messages with position dots.

PRO

hero119

Full-Bleed Display Hero

Full-bleed image hero with an oversized three-word display heading, a row of monospace meta labels, a bold sub-headline, and a featured card with thumbnail, category, paginated index, and title.

PRO

hero133

Kinetic Rotating-Word Hero

Full-bleed monochrome hero with a giant headline whose final word auto-cycles through a list, plus clickable chips to pick a word and pause the rotation.

PRO

hero141

Capability Marquee Hero

Full-bleed monochrome hero with a giant display heading, short description, and a continuous bottom marquee of capability chips that pauses on hover.

PRO

hero38

Split Hero with Testimonial Card

Two-column hero with prominent testimonial quote card featuring author avatar and company info. Perfect for building trust and social proof.

PRO

hero85

Fullscreen Hero with Floating Testimonials

Cinematic fullscreen hero with inset background video and floating glassmorphism testimonial cards