Photo-free hero that runs a display statement across the full width, drops the paragraph and pill CTAs onto one baseline beneath it, and closes with a ruled four-column row of studio facts.
Photo-free hero built entirely from type: the statement runs across the full width, the paragraph and the pill CTAs drop onto one baseline beneath it, and a ruled four-column row of studio facts closes the fold.
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.
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
npx shadcn add "https://ui.beste.co/r/hero148?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero148?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero148.tsx plus the badge7 eyebrow and button12 pill button it uses.
The installed file exports hero148Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero148, hero148Demo } from "@/components/beste/block/hero148";
export default function Page() {
return <Hero148 {...hero148Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero148 } from "@/components/beste/block/hero148";
export default function Page() {
return (
<Hero148
badge={{ label: "Working openly" }}
heading="Everything we know, on the table by the second meeting."
description="You see the drafts we would normally hide, including the ones that failed."
buttons={[
{ label: "See how we work", href: "/process", tone: "dark" },
{ label: "Read a case file", href: "/work", tone: "outline" },
]}
facts={[
{ title: "Founded", value: "2014" },
{ title: "Projects shipped", value: "212" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Full-width display statement, rendered as the page h1 |
description | string | – | Supporting paragraph on the baseline row |
buttons | ActionButton[] | [] | Pill CTAs rendered as Button12, right-aligned from md up |
facts | HeroFact[] | [] | Ruled figures closing the section |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
tone?: "dark" | "outline";
};
type HeroFact = {
title: string;
value: string;
};max-w-5xl and set in leading-[0.92], so at lg:text-8xl it breaks into two or three dense lines instead of running edge to edge as a single thin band.md:items-end grid, which lands the CTAs on the last line of the paragraph rather than centring them against it.tone="dark", so an array with no tones renders every pill solid; the demo sets the second one to "outline" for contrast.dt/dd pair inside a dl, so the label and figure are associated for screen readers rather than being two loose paragraphs.grid-cols-2 on mobile and md:grid-cols-4, so four entries read as two tidy rows on a phone.hero149
Full-bleed photographic hero with a tinted scrim, the statement and paragraph pinned to the lower half, an outline pill CTA on the same baseline and a ruled three-column fact rail closing the fold.
hero119
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.
hero139
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.
hero121
Split hero with a big headline and CTA on the left, a divided vertical stat rail on the right, and a full-width wide image strip below.