Fullscreen split hero with content left and realistic terminal/CLI card right over inset background video
Fullscreen split hero: heading, description, and CTAs on the left, a realistic dark-themed terminal window on the right whose command/output lines type themselves in on load, all layered over an inset background video panel.
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/hero101?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero101?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero101.tsx and its dependencies: the badge and button shadcn/ui primitives.
The installed file exports hero101Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero101, hero101Demo } from "@/components/beste/block/hero101";
export default function Page() {
return <Hero101 {...hero101Demo} />;
}Then replace the demo with your own props. Written out, the same setup looks like this:
import { Hero101 } from "@/components/beste/block/hero101";
export default function Page() {
return (
<Hero101
badge={{ label: "Developer First", variant: "secondary" }}
heading="Deploy in seconds, not hours"
description="One command to go from local to global."
buttons={[
{ label: "Get Started", href: "/signup", variant: "default" },
{ label: "Read Docs", href: "/docs", variant: "outline" },
]}
backgroundMedia={{ type: "video", src: "/videos/hero.mp4" }}
terminalTitle="Terminal — zsh"
terminalLines={[
{ type: "command", text: "npx create-app my-project" },
{ type: "output", text: "Installing dependencies..." },
{ type: "success", text: "✓ Project created successfully" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | Badge | – | Pill shown above the heading |
heading | string | – | Main headline |
description | string | – | Supporting copy under the heading |
buttons | ButtonItem[] | [] | CTA buttons under the description |
backgroundMedia | BackgroundMedia | – | Video or image behind the whole section |
terminalLines | TerminalLine[] | [] | Lines rendered inside the terminal card, in order |
terminalTitle | string | "Terminal" | Text centered in the terminal's title bar |
invertColor | boolean | true | Light-on-dark treatment (white text, black overlay) vs. dark-on-light |
className | string | – | Extra classes for the outer <section> |
type Badge = { label: string; variant?: "default" | "secondary" | "outline" };
type ButtonItem = { label: string; href: string; variant?: "default" | "outline" };
type BackgroundMedia = { type: "image" | "video"; src: string; alt?: string };
type TerminalLine = { type: "command" | "output" | "success" | "comment"; text: string };bg-gray-950) that ignores invertColor; only the hero's own text and the background overlay respond to that prop.terminalLines entry types itself in via a CSS keyframe (hero101-type), animating max-width from 0 to 600px over 0.6s with a steps(40, end) timing function so the text reveals character-by-character rather than fading. Lines are staggered 0.8s apart (delay = index * 0.8), so the whole block plays out sequentially on mount, not on scroll or hover.type: "command" lines are prefixed with a green $ and rendered in light gray; output lines are dimmer gray; success lines render in emerald; comment lines are the dimmest gray. Colors are fixed per type, not configurable per line.animate-pulse) fades in via a second keyframe (hero101-fadein) timed to start exactly when the last line's animation would complete (terminalLines.length * 0.8), simulating a live, ready-for-input prompt.inset-x-6 top-6 bottom-6, wider on lg) rather than full-bleed, matching the panel treatment used across this hero set.hero91
50/50 split hero with muted content panel and feature list left, video/image right
hero84
50/50 split hero with content left and edge-to-edge video/image right with checklist items
hero102
50/50 split hero with content left and vertical numbered timeline overlay on video right
hero92
50/50 split hero with content left and bento feature grid 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.
hero89
50/50 split hero with video/image left and content with testimonial quote right