Fullscreen bottom-aligned hero with vertical stack cards and inset background video with gradient overlay
Fullscreen hero whose content sits pinned to the bottom of the viewport rather than centered or split, over an inset, rounded video or image panel with a gradient that darkens toward the bottom where the text sits. The bottom row itself splits into heading/description/button text on the left and a vertical stack of clickable link cards on the right.
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/hero97?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero97?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero97.tsx and the shadcn/ui primitives it depends on: Badge and Button.
The installed file exports hero97Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero97, hero97Demo } from "@/components/beste/block/hero97";
export default function Page() {
return <Hero97 {...hero97Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Cpu, Layers } from "lucide-react";
import { Hero97 } from "@/components/beste/block/hero97";
export default function Page() {
return (
<Hero97
badge={{ label: "Tech Stack", variant: "secondary" }}
heading="The modern stack for ambitious teams"
description="Modular building blocks that work together seamlessly."
buttons={[{ label: "Explore Stack", href: "/stack", variant: "default" }]}
backgroundMedia={{ type: "image", src: "/hero/stack.jpg", alt: "Server racks" }}
stackCards={[
{ icon: Layers, title: "Frontend SDK", description: "Build with what you love", href: "/docs/frontend" },
{ icon: Cpu, title: "Compute Engine", description: "Serverless at the edge", href: "/docs/compute" },
]}
invertColor
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | Badge | – | Small pill above the heading |
heading | string | – | Main headline |
description | string | – | Supporting paragraph under the heading |
buttons | Button[] | [] | CTA buttons, rendered in order |
backgroundMedia | BackgroundMedia | – | Media in the inset frame behind the bottom-aligned content |
stackCards | StackCard[] | [] | Clickable link cards stacked on the right |
invertColor | boolean | true | Switches text and card colors between dark-media and light-media treatments |
className | string | – | Extra classes for the outer <section> |
type Badge = { label: string; variant?: "default" | "secondary" | "outline" };
type Button = { label: string; href: string; variant?: "default" | "outline" };
type BackgroundMedia = { type: "image" | "video"; src: string; alt?: string };
type StackCard = { icon: LucideIcon; title: string; description: string; href: string };flex min-h-screen flex-col justify-end, so all content is pinned to the bottom of the viewport rather than centered, unlike the other fullscreen heroes in this set.inset-x-6 top-6 bottom-6, lg:inset-x-8 lg:top-8 lg:bottom-8) and clipped to a rounded-md border. Its overlay is a bg-gradient-to-t that runs from strongest at the bottom (black/80 when invertColor) to weakest at the top (black/20), so the pinned text stays legible against the darkest part of the media.stackCards render as full <Link> rows (icon, title, description, trailing arrow) rather than static cards; each link brightens on hover and the arrow shifts right (translate-x-1) via a scoped group/hero97 class.invertColor (default true) switches both the text colors (white variants vs. default foreground/text-muted-foreground) and the stack card surface (white/5 bordered vs. background/40 bordered), a consistent light/dark pairing applied across every element in the bottom row.backgroundMedia.type: "video" renders autoPlay loop muted playsInline with no poster fallback; "image" renders a plain <img>.hero83
Bottom-aligned fullscreen hero with inset background media and right-side quick link cards
hero82
Left-aligned fullscreen hero with inset background media and directional gradient overlay
hero90
Vertical split hero with video/image on top and content section below
hero85
Cinematic fullscreen hero with inset background video and floating glassmorphism testimonial cards
hero81
Cinematic fullscreen hero with inset background media and glassmorphism quick-access cards
hero87
Fullscreen hero with centered glassmorphism card floating over inset background video