Editorial hero with twin vertical image marquees scrolling in opposite directions beside the headline.
Editorial split hero with copy, a CTA and a stat row on one side and two vertical image marquees scrolling in opposite directions on the other. The marquee columns interleave the supplied images (even indexes in one column, odd in the other) rather than splitting the list in half.
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/hero116?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero116?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero116.tsx, the badge6 component it uses for the eyebrow label, the button1 component it uses for the CTA pill, and their dependencies.
The installed file exports hero116Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero116, hero116Demo } from "@/components/beste/block/hero116";
export default function Page() {
return <Hero116 {...hero116Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero116 } from "@/components/beste/block/hero116";
export default function Page() {
return (
<Hero116
label="Northwind Studio"
heading="Brand work that <strong>keeps compounding.</strong>"
description="An independent practice crafting identities, sites and launch films."
button={{ label: "See the reel", href: "https://beste.co" }}
stats={[
{ value: "80+", label: "Brands shipped" },
{ value: "6x", label: "Avg. launch lift" },
]}
images={[
{
src: "https://images.unsplash.com/photo-1558655146-9f40138edfeb?w=600&h=800&fit=crop",
alt: "Brand layout pinned to a studio desk",
},
{
src: "https://images.unsplash.com/photo-1561070791-2526d30994b5?w=600&h=800&fit=crop",
alt: "Designer sketching wireframes",
},
{
src: "https://images.unsplash.com/photo-1626785774573-4b799315345d?w=600&h=800&fit=crop",
alt: "Moodboard with color swatches",
},
{
src: "https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=600&h=800&fit=crop",
alt: "Developer building an interface",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
label | string | – | Eyebrow text rendered through Badge6 |
heading | string | – | Headline HTML; wrap a phrase in <strong> to highlight it in the primary color |
description | string | – | Supporting paragraph, capped at max-w-xl |
button | ActionLink | – | Single CTA rendered through Button1 |
stats | StatItem[] | [] | Value/label pairs shown in a row under a top border |
images | ImageItem[] | [] | Source images for the two marquee columns |
className | string | – | Extra classes for the outer <section> |
type ActionLink = {
label: string;
href: string;
};
type StatItem = {
value: string;
label: string;
};
type ImageItem = {
src: string;
alt: string;
};images is split by index parity, not in half: even indexes go to the left column, odd indexes to the right, so consecutive images interleave between columns rather than one column getting the first N images.[...column, ...column]) and animated with a scoped styled-jsx keyframe (hero116-scroll) that translates it from 0 to -50%; because the two halves are identical, the loop point is seamless. The left column runs 30s linear, the right column runs 34s linear in reverse, and the right column is offset with -mt-16 so the two never line up.group/hero116) pauses both columns via animation-play-state: paused on [data-hero116-col]; the animation is disabled outright under prefers-reduced-motion: reduce.aria-hidden="true" with an empty alt, so screen readers only announce each image once.bg-gradient-to-b/to-t from background to transparent) mask where the marquee tiles enter and exit the visible area.hero112
Two-column studio hero with a two-tone headline, dual CTAs, tall image and a client wordmark strip.
hero90
Vertical split hero with video/image on top and content section below
hero113
Centered big-type studio hero with start and watch-the-film actions over a cinematic banner.
hero80
Centered hero with inset background media and overlapping product image
hero117
Editorial studio hero with a vertical parenthetical side label, monospace corner links, an oversized centered wordmark with tagline, and a full-bleed strip of rounded portrait tiles below.