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
badgeBadgeEyebrow badge above the heading
headingstringLarge heading; supports inline <strong> for the accent phrase
descriptionstringSupporting copy under the heading
buttonsActionButton[]CTA row rendered through Button12
imagestring16:9 image source below the intro
imageAltstringAlt text for the image
classNamestringExtra 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

An editorial hero with an eyebrow and an oversized full-width light heading, then a lower row pairing a paragraph and two accent buttons with an image tile that floats a live app window frame.

PRO

hero125

Hero with Portrait Gallery

Centered eyebrow, oversized heading and CTA above a responsive 3-up portrait gallery with monospace captions.

PRO

hero122

Typographic Card Hero

Centered typographic hero on a muted card with an oversized heading, inline CTA, and a bottom monospace meta row of three labels.

FREE

hero7

Centered Hero with Media

Centered hero with optional badge, heading, description, dual action buttons, and a featured image below. Perfect for product launches and landing pages.

PRO

hero159

Photo Collage Hero

A centered hero with an eyebrow, light display heading, and two actions above a staggered three-photo collage whose raised middle tile floats a live booking confirmation.

PRO

hero185

Logos Hero

A centred hero with an eyebrow, a serif headline that settles in word by word, an intro and a sliding-marker pill, closed by a ruled row where greyscale partner logos drift right to left behind soft edge fades, next to a small-caps label.