Fullscreen hero stacked vertically rather than split side by side: a video or image fills the top half of the viewport with a gradient fade into the bottom half, which holds a centered heading, description, and buttons on a solid background. There is no horizontal split at any breakpoint, only a top-to-bottom layout.
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/hero90?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero90?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero90.tsx and the shadcn/ui Button primitive it depends on.
The installed file exports hero90Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero90, hero90Demo } from "@/components/beste/block/hero90";
export default function Page() {
return <Hero90 {...hero90Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { ArrowRight } from "lucide-react";
import { Hero90 } from "@/components/beste/block/hero90";
export default function Page() {
return (
<Hero90
heading="A new way to build for the modern web"
description="Visual development meets production-grade code."
buttons={[
{ label: "Join the Waitlist", href: "/signup", variant: "default", icon: ArrowRight },
{ label: "Learn More", href: "/about", variant: "outline" },
]}
backgroundMedia={{ type: "image", src: "/hero/skyline.jpg", alt: "City skyline" }}
invertColor
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
heading | string | – | Main headline |
description | string | – | Supporting paragraph under the heading |
buttons | Button[] | [] | CTA buttons, rendered in order |
backgroundMedia | BackgroundMedia | – | Media filling the top half |
invertColor | boolean | true | Switches the media's gradient overlay from dark to background-tinted |
className | string | – | Extra classes for the outer <section> |
type Button = { label: string; href: string; variant?: "default" | "outline"; icon?: LucideIcon };
type BackgroundMedia = { type: "image" | "video"; src: string; alt?: string };backgroundMedia.type: "video" renders a <video> with autoPlay loop muted playsInline and no poster attribute; "image" renders a plain <img>. Both fill the top min-h-[50vh] panel with object-cover.bg-gradient-to-b), fading from transparent in the middle to darker at both edges. When invertColor is true (the default) it fades to black/30 and black/60; when false it fades to background/30 and background/60 instead, matching the page's own background color.icon (a LucideIcon component reference, not an element); when present it renders after the label inside the button.bg-background, independent of invertColor; only the media's overlay gradient responds to that prop.min-h-screen and stacks with plain flex-col, so there is no lg:flex-row breakpoint like the split-layout heroes in this set.hero97
Fullscreen bottom-aligned hero with vertical stack cards and inset background video with gradient overlay
hero84
50/50 split hero with content left and edge-to-edge video/image right with checklist items
hero92
50/50 split hero with content left and bento feature grid overlay on video right
hero102
50/50 split hero with content left and vertical numbered timeline overlay on video right
hero35
Two-column hero with playable video (or image), play button overlay, and key stats row. Perfect for product demos and feature announcements.
hero80
Centered hero with inset background media and overlapping product image