A hero that opens on an oversized light heading, then drops a hairline into a narrow copy column with one action and a wide image tile floating a live horizontal step tracker.
A hero that opens on an oversized light heading, then drops a hairline into a narrow copy column carrying one action and a reassurance note, beside a wide image tile floating a live horizontal step tracker.
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/hero158?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero158?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero158.tsx, the progress16 step-tracker piece it floats on the tile (installed to components/beste/piece/progress16.tsx), and the badge23 and button21 components it uses for the eyebrow and the action.
The installed file exports hero158Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero158, hero158Demo } from "@/components/beste/block/hero158";
export default function Page() {
return <Hero158 {...hero158Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero158 } from "@/components/beste/block/hero158";
import { Progress16 } from "@/components/beste/piece/progress16";
export default function Page() {
return (
<Hero158
badge={{ label: "Switching over" }}
heading="Move your practice across without closing for a week"
description="Export what you have, map it once, and watch the workspace fill in."
button={{ label: "Start a migration", href: "/migrate" }}
note="No card required. We stay on the call until your first booking lands."
media={
<Progress16
title="Migration"
steps={["Export", "Map fields", "Review", "Go live"]}
activeIndex={2}
caption="Review finishes today, and go live is booked for Friday morning."
/>
}
image={{ src: "/backdrops/blue.jpg", alt: "Soft blue gradient backdrop" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the heading, rendered through Badge23 |
heading | string | – | Display heading, rendered as the page h1 |
description | string | – | Opening paragraph in the narrow left column |
button | { label: string; href: string } | – | Single action under the paragraph |
note | string | – | Small reassurance line, separated by its own hairline |
media | ReactNode | – | Live asset layered on the tile, progress16 in the demo |
image | { src: string; alt: string } | – | Backdrop behind the media tile |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type TileImage = {
src: string;
alt: string;
};max-w-4xl while scaling text-4xl through lg:text-7xl. It is the only element allowed the full container width, which is what makes the hairline underneath read as a rule rather than a divider.md:grid-cols-3 split where the copy takes one column and the media tile takes two through md:col-span-2. Below md both stack in source order, so the copy always precedes the tile.flex flex-col items-start, so the action never stretches to the column width. Removing items-start here would let Button21 inflate, since flex children default to align-items: stretch.note carries its own border-t and top padding, which means the second hairline only appears when a note is actually passed.h-64, then md:h-72) with the image absolutely positioned behind and the piece layered at z-10. The piece centers itself inside its own root, so any piece from the catalogue drops in without extra wrapping.image renders only when media is present, since the tile itself is gated on media. Passing an image with no media leaves the row empty rather than showing a bare photograph.hero168
A hero pairing a light display heading with an offset paragraph and action, then a wide image tile floating a live search results panel over four hairline columns explaining what the search covers.
hero162
A hero that sets a light display heading and one action against a column of numbered hairline rows, then closes on a full-bleed image band with a live approval request pinned into its corner.
hero133
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.
hero137
Full-bleed monochrome hero that crossfades across a set of slides, navigated by explicit previous/next arrows and clickable dots with an auto-loop, plus a caption linking the active slide.