Split-layout hero with interactive dashboard mockup featuring stats cards, line chart, and recent activity feed. Perfect for SaaS and analytics platforms.
Split-layout SaaS hero where the right column is a simulated product screenshot rather than an image: a browser-chrome mock (traffic-light dots, a tab bar, a settings icon) wraps a live stats grid, a real Recharts line chart, and a recent-activity row, with a small floating stat chip bobbing beside the card.
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/hero25?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero25?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero25.tsx, the Badge, Button, Card, and Chart (shadcn ChartContainer/ChartTooltip) primitives it uses, and recharts as an npm dependency.
The installed file exports hero25Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero25, hero25Demo } from "@/components/beste/block/hero25";
export default function Page() {
return <Hero25 {...hero25Demo} />;
}Then replace the demo with your own props. Written out, the same setup looks like this:
import { BarChart3, Users } from "lucide-react";
import { Hero25 } from "@/components/beste/block/hero25";
export default function Page() {
return (
<Hero25
heading="Manage your workflow intelligently"
description="Visualize your data, sync with your team, and accelerate your work."
buttons={[{ label: "Get Started Now", href: "/signup" }]}
stats={[
{ icon: BarChart3, label: "Total Sales", value: "$124,500", change: "+12.5% from last month", variant: "primary" },
{ icon: Users, label: "Active Users", value: "1,204", change: "+4.2% increase" },
]}
chart={{
title: "Weekly Performance",
data: [
{ label: "Mon", value: 186 },
{ label: "Tue", value: 305 },
{ label: "Wed", value: 237 },
],
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string; variant?: "default" | "secondary" | "outline" } | – | Optional pill badge above the heading |
heading | string | – | Main headline (required, no fallback) |
description | string | – | Supporting paragraph |
buttons | HeroButton[] | [] | CTA buttons under the description |
browserTabs | BrowserTab[] | [] | Tab labels shown in the mock browser header |
stats | StatCard[] | [] | Two stat tiles inside the dashboard card |
chart | { title: string; data: ChartDataPoint[]; dataKey?: string } | – | Recharts line chart inside the dashboard card |
recentActivity | RecentActivity | – | Single activity row at the bottom of the card |
floatingCard | FloatingCard | – | Small stat chip floating beside the dashboard card |
displayPosition | "left" | "right" | "left" | Which side the text column renders on |
className | string | – | Extra classes for the outer <section> |
type HeroButton = {
label: string;
href: string;
variant?: "default" | "outline" | "secondary" | "ghost" | "link";
};
type BrowserTab = { label: string; active?: boolean };
type StatCard = {
icon: LucideIcon;
label: string;
value: string;
change: string;
variant?: "primary" | "default";
};
type ChartDataPoint = { label: string; value: number };
type RecentActivity = {
type: "sale" | "signup" | "upgrade";
message: string;
time: string;
};
type FloatingCard = { icon: LucideIcon; label: string; value: string };Card styled to look like a browser window (three colored dots, a tab row where the active tab gets a bg-primary/10 chip, a settings icon), containing a real stats grid, a Recharts LineChart wrapped in the shadcn ChartContainer/ChartTooltip, and an activity row, all driven entirely by props.StatCard with variant: "primary" renders with tinted border-primary/20 bg-primary/5 styling and shows its full change string in primary-tinted text; other stat cards split change on the first space so the leading token (e.g. "+12.5%") renders as a small muted chip and the rest as trailing text.recentActivity.type swaps the leading icon: "sale" uses DollarSign, "signup" uses UserPlus, "upgrade" uses ArrowUpCircle.floatingCard, when present, is positioned with a fixed offset (-right-6 top-44) relative to the dashboard card and bobs continuously via an inline @keyframes float block (defined with <style jsx>), animating translateY by 8px over a 3s loop; this is the only animation in the component.displayPosition: "right" flips the two-column grid using a CSS child-combinator class (lg:[&>*:first-child]:order-2) applied to the grid container rather than an order class on each column individually.grid-cols-2, so passing more than two stats entries will wrap to additional rows rather than reflow into more columns.hero96
50/50 split hero with content left and metric dashboard cards with trend badges over video right
hero61
Two-column hero with announcement banner, social proof metrics, and three floating feature cards with hover animations. Perfect for SaaS product launches.
hero77
Split-layout hero with weekly calendar mockup showing events, attendees, and floating reminder notification. Perfect for scheduling and calendar apps.
hero48
Centered hero with four-column metrics panel showing values and trend indicators below the CTA buttons. Perfect for analytics dashboards and business tools.
hero76
Split-layout hero with interactive kanban board mockup showing tasks with priorities, tags, assignees, and floating completion stats. Perfect for project management tools.
hero35
Two-column hero with playable video (or image), play button overlay, and key stats row. Perfect for product demos and feature announcements.