Hero — Split with Image
Split hero with content on the left and image/screenshot on the right.
Hero buttonbadge
Installation
npx shadcn@latest add @saastro/hero-02Preview
New release
Ship faster with pre-built blocks
A collection of landing page blocks built with shadcn/ui. Copy and paste into your Astro project.
Screenshot
Source Code
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
type Hero02Props = {
badge?: string;
title: string;
description: string;
primaryCta: { label: string; href: string };
secondaryCta?: { label: string; href: string };
imageSrc?: string;
imageAlt?: string;
className?: string;
};
export function Hero02({
badge,
title,
description,
primaryCta,
secondaryCta,
imageSrc,
imageAlt = '',
className,
}: Hero02Props) {
return (
<section className={cn('w-full px-6 py-24 md:py-32', className)}>
<div className="mx-auto grid max-w-6xl items-center gap-12 lg:grid-cols-2">
<div>
{badge && (
<Badge variant="secondary" className="mb-4">
{badge}
</Badge>
)}
<h1 className="text-4xl font-bold tracking-tight sm:text-5xl">{title}</h1>
<p className="mt-6 text-lg text-muted-foreground">{description}</p>
<div className="mt-10 flex items-center gap-4">
<Button size="lg" asChild>
<a href={primaryCta.href}>{primaryCta.label}</a>
</Button>
{secondaryCta && (
<Button variant="outline" size="lg" asChild>
<a href={secondaryCta.href}>{secondaryCta.label}</a>
</Button>
)}
</div>
</div>
<div className="relative aspect-video overflow-hidden rounded-xl border bg-muted">
{imageSrc ? (
<img src={imageSrc} alt={imageAlt} className="h-full w-full object-cover" />
) : (
<div className="flex h-full w-full items-center justify-center bg-gradient-to-br from-primary/20 to-primary/5">
<span className="text-4xl text-muted-foreground/30">Screenshot</span>
</div>
)}
</div>
</div>
</section>
);
}
Registry Setup
Add the Saastro registry to your components.json:
{
"registries": {
"@saastro": "https://ui.saastro.io/r/{name}.json"
}
}