Installation
Usage
import { SalesAiHero } from "@/components/ruixen/sales-ai-hero";
export default function Page() {
return (
<SalesAiHero
announcement={{
label: "New — AI replies that sound like your best rep",
href: "#",
}}
title={
<>
Turn every conversation <br className="hidden md:block" />
into your next closed deal.
</>
}
description="Sales AI that drafts replies, scores intent, and surfaces the next best action — so your team spends time selling, not searching."
leftMedia={
<img
src="/hero/portrait.jpg"
alt="Customer portrait"
className="size-full object-cover"
/>
}
rightMedia={
<img
src="/hero/dashboard.png"
alt="Product dashboard"
className="size-full object-cover"
/>
}
trustedBy={{
prefix: "Trusted by revenue teams at ",
highlight: "fast-growing",
suffix: " companies",
logos: [
{ name: "Northwind" },
{ name: "Lumina" },
{ name: "Apex" },
{ name: "Cobalt" },
{ name: "Meridian" },
],
}}
/>
);
}Props
| Prop | Type | Default | Description |
|---|---|---|---|
title | ReactNode | Required | Centered headline content. Use <br /> to force a line break on desktop. |
description | ReactNode | - | Muted subhead rendered under the title. |
announcement | Announcement | - | Floating pill above the title. Renders as a link when href is provided. |
leftMedia | ReactNode | - | Content for the left (portrait) media tile. Falls back to a labelled placeholder. |
rightMedia | ReactNode | - | Content for the right (landscape) media tile with a subtle themed placeholder fallback. |
trustedBy | TrustedBy | false | - | Divider-flanked headline plus logo strip below the media. Pass false to hide. |
className | string | - | Extra classes appended to the outer <section>. |
Types
interface Announcement {
label: string;
href?: string;
icon?: React.ReactNode;
}
interface LogoItem {
name: string;
src?: string;
logo?: React.ReactNode;
href?: string;
}
interface TrustedBy {
prefix?: string;
highlight?: string;
suffix?: string;
logos: LogoItem[];
}Features
- Floating announcement pill — soft elevated card with a lightning glyph, copy, and filled arrow chip; converts to a
Linkwhenhrefis supplied. - Oversized display headline — scales from
text-[44px]on mobile totext-[88px]onlg, withtracking-[-0.04em]and a tight1.02line-height to mimic editorial SaaS hero typography. - Paired media tiles — a 1:3 split: a portrait tile on the left and a 16:9 landscape tile on the right with a built-in subtle themed gradient placeholder. Both accept any
ReactNode, so drop in<img>,<video>, or a custom inline mock. - Divider-flanked trusted-by line — two
bg-borderrules pinch a centered headline, with a bold highlight slot for stats like "10,000+". - Logo strip with vertical separators — auto-inserted
h-6 w-px bg-borderrules between logos atmd+; logos are desaturated with[filter:brightness(0)_saturate(0)](inverted in dark mode) to feel uniform. - Theme adaptive — every surface uses shadcn tokens (
bg-background,bg-card,bg-muted,text-foreground,text-muted-foreground,border-border), so the block inherits your theme without overrides.

