Layout 505
cardText Align LeftText Align Center2 ColumnsTabsButtonsMultiple Images

Code
relume-layout505.tsx
import { ChevronRight, RelumeIcon } from "relume-icons";
import { Button, type ButtonProps } from "@/components/ui/button";
import { Card } from "@/components/ui/card";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
type Feature = {
heading: string;
description: string;
buttons: ButtonProps[];
};
type Tab = {
value: string;
trigger: string;
content: Feature;
};
type Props = {
tagline: string;
heading: string;
description: string;
tabs: Tab[];
defaultTabValue: string;
};
export type Layout505Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
export const Layout505 = (props: Layout505Props) => {
const { tagline, heading, description, tabs, defaultTabValue } = {
...Layout505Defaults,
...props,
};
return (
<section className="px-[5%] py-16 md:py-24 lg:py-28">
<div className="container">
<div className="mx-auto mb-12 w-full max-w-lg text-center md:mb-18 lg:mb-20">
<p className="mb-3 font-semibold md:mb-4">{tagline}</p>
<h1 className="mb-5 text-h2 font-bold md:mb-6">{heading}</h1>
<p className="text-medium">{description}</p>
</div>
<Card>
<Tabs
defaultValue={defaultTabValue}
orientation="vertical"
className="relative grid auto-cols-fr grid-cols-1 md:grid-cols-[1fr_1.5fr]"
>
<TabsList className="relative grid h-full auto-cols-fr grid-cols-1 border-b border-scheme-border md:border-r md:border-b-0">
{tabs.map((tab, index) => (
<TabsTrigger
key={index}
value={tab.value}
className="items-start justify-start rounded-none border-0 border-b p-6 text-h5 font-bold last-of-type:border-0 data-[state=active]:border-b-transparent data-[state=inactive]:border-scheme-border data-[state=inactive]:bg-scheme-background md:px-8"
>
{tab.trigger}
</TabsTrigger>
))}
</TabsList>
{tabs.map((tab) => (
<TabsContent
key={tab.value}
value={tab.value}
className="data-[state=active]:animate-tabs"
>
<FeatureCard tab={tab} />
</TabsContent>
))}
</Tabs>
</Card>
</div>
</section>
);
};
const FeatureCard = ({ tab }: { tab: Tab }) => {
return (
<div className="flex h-full flex-col justify-center p-6 md:p-8 lg:p-16">
<div className="mb-5 md:mb-6">
<RelumeIcon className="size-12 text-scheme-text" />
</div>
<h2 className="mb-5 text-h3 font-bold md:mb-6">{tab.content.heading}</h2>
<p>{tab.content.description}</p>
<div className="mt-6 flex flex-wrap items-center gap-4 md:mt-8">
{tab.content.buttons.map((button, index) => (
<Button key={index} {...button}>
{button.title}
</Button>
))}
</div>
</div>
);
};
export const Layout505Defaults: Props = {
tagline: "Tagline",
heading: "Short heading goes here",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat.",
defaultTabValue: "tab-1",
tabs: [
{
value: "tab-1",
trigger: "Tab one",
content: {
heading: "Medium length section heading goes here",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
},
},
{
value: "tab-2",
trigger: "Tab two",
content: {
heading: "Medium length section heading goes here",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
},
},
{
value: "tab-3",
trigger: "Tab three",
content: {
heading: "Medium length section heading goes here",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
},
},
{
value: "tab-4",
trigger: "Tab four",
content: {
heading: "Medium length section heading goes here",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
},
},
{
value: "tab-5",
trigger: "Tab five",
content: {
heading: "Medium length section heading goes here",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
},
},
{
value: "tab-6",
trigger: "Tab six",
content: {
heading: "Medium length section heading goes here",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
},
},
],
};npm i @radix-ui/react-dialog @radix-ui/react-slot @radix-ui/react-tabs class-variance-authority@0.7.1 clsx@^2.1.1 motion@^12.15.0 relume-icons@1.3.0 tailwind-merge@^2.2.2


