Editorial Image Hero

(Independent studio)

Design that earns its keep, season after season.

We build identities with a long shelf life — type systems, editorial layouts, and quiet motion that still feel sharp three rebrands from now. No trend-chasing, just work that compounds.

Studio desk with printed type specimens and layout sketches
Auralis — Identity, type & motion since 2014
About this block

Editorial Image HeroPRO

Centered editorial hero with eyebrow, large heading, description, dual dark and outline CTAs, and a wide 16:9 image with a mono caption below.

Hero120: Editorial Image Hero

Centered editorial hero: an eyebrow badge, a large rich-text heading with a muted accent phrase, supporting copy, a pair of dark and outline CTA buttons, and a full-width 16:9 photo with an optional caption 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/hero120?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/hero120.tsx, the badge7 eyebrow badge and button12 CTA button it renders through, and its dependencies.

Quick start

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

tsx
import { Hero120, hero120Demo } from "@/components/beste/block/hero120";

export default function Page() {
  return <Hero120 {...hero120Demo} />;
}

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

tsx
import { Hero120 } from "@/components/beste/block/hero120";

export default function Page() {
  return (
    <Hero120
      badge={{ label: "Independent studio" }}
      heading="Design that earns its keep, <strong>season after season.</strong>"
      description="We build identities with a long shelf life: type systems, editorial layouts, and quiet motion."
      buttons={[
        { label: "Start a project", href: "https://beste.co" },
        { label: "See the archive", href: "https://beste.co" },
      ]}
      image="https://images.unsplash.com/photo-1716059492460-5230fda6cefb?w=2000&auto=format&fit=crop"
      imageAlt="Studio desk with printed type specimens and layout sketches"
      labels={{ imageCaption: "Auralis — Identity, type & motion since 2014" }}
    />
  );
}

Props

PropTypeDefaultDescription
labelsHero120Labels{}Caption text shown below the image
badgeBadge–Eyebrow badge above the heading
headingstring–Large heading; supports inline <strong> for the accent phrase
descriptionstring–Supporting copy under the heading
buttonsActionButton[]–CTA row rendered through Button12
imagestring–16:9 image source below the intro
imageAltstring–Alt text for the image
classNamestring–Extra classes for the outer <section>
ts
type Hero120Labels = { imageCaption?: string };
type Badge = { label: string };
type ActionButton = { label: string; href: string };

Behavior notes

  • heading is rendered with dangerouslySetInnerHTML; wrap the accent phrase in <strong> to pick up the muted-foreground styling ([&>strong]:text-muted-foreground), following the shared highlighted-heading pattern.
  • Buttons are rendered through Button12: only the first entry in buttons keeps the component's default dark tone, every later entry is forced to tone="outline" regardless of its position in the array, so a third or fourth button always renders identically to the second.
  • Button12 itself animates on hover, independent of this block: its label slides out the bottom while a duplicate label drops in from the top, and its seal icon exits diagonally while a copy enters from the opposite corner, both via CSS transitions on group-hover/button12.
  • The image sits in a fixed aspect-[16/9] box with object-cover, so source photos of any ratio are cropped to fill it; the labels.imageCaption line only renders when both the image and the caption string are present.

More Hero blocks

View all Hero
PRO

hero145

Editorial Product Hero

FREE

hero7

Centered Hero with Media

PRO

hero125

Hero with Portrait Gallery

Get Pro access