Layout 502
standardText Align LeftText Align Center2 ColumnsTabsButtonsMultiple Images

Code
relume-layout502.tsx
import { Button, type ButtonProps } from "@/components/ui/button";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { ChevronRight } from "relume-icons";
type ImageProps = {
src: string;
alt?: string;
};
type Feature = {
tagline: string;
heading: string;
description: string;
buttons: ButtonProps[];
image: ImageProps;
};
type Tab = {
value: string;
trigger: string;
content: Feature[];
};
type Props = {
tagline: string;
heading: string;
description: string;
buttons: ButtonProps[];
defaultTabValue: string;
tabs: Tab[];
};
export type Layout502Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
export const Layout502 = (props: Layout502Props) => {
const { tagline, heading, description, buttons, defaultTabValue, tabs } = {
...Layout502Defaults,
...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 md:w-auto 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 className="mt-6 flex items-center justify-center gap-x-4 md:mt-8">
{buttons.map((button, index) => (
<Button key={index} {...button}>
{button.title}
</Button>
))}
</div>
</div>
<Tabs defaultValue={defaultTabValue}>
<TabsList className="mb-12 items-center gap-6 md:mb-16 md:justify-center">
{tabs.map((tab, index) => (
<TabsTrigger
key={index}
value={tab.value}
className="rounded-none border-0 border-b bg-transparent px-0 py-2 data-[state=active]:bg-transparent data-[state=inactive]:border-transparent"
>
{tab.trigger}
</TabsTrigger>
))}
</TabsList>
{tabs.map((tab, index) => (
<TabsContent key={index} value={tab.value} className="data-[state=active]:animate-tabs">
{tab.content.map((feature, featureIndex) => (
<Feature key={featureIndex} {...feature} />
))}
</TabsContent>
))}
</Tabs>
</div>
</section>
);
};
const Feature = (feature: Feature) => {
return (
<div className="grid grid-cols-1 gap-y-12 md:grid-cols-2 md:items-center md:gap-x-12 lg:gap-x-20">
<div>
<img
src={feature.image.src}
className="w-full rounded-image object-cover"
alt={feature.image.alt}
/>
</div>
<div>
<p className="mb-3 font-semibold md:mb-4">{feature.tagline}</p>
<h2 className="mb-5 text-h3 font-bold md:mb-6">{feature.heading}</h2>
<p>{feature.description}</p>
<div className="mt-6 flex flex-wrap items-center gap-4 md:mt-8">
{feature.buttons.map((button, index) => (
<Button key={index} {...button}>
{button.title}
</Button>
))}
</div>
</div>
</div>
);
};
export const Layout502Defaults: 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.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
defaultTabValue: "tab-one",
tabs: [
{
value: "tab-one",
trigger: "Tab One",
content: [
{
tagline: "Tagline",
heading: "Medium length section 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.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
image: {
src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
alt: "Relume placeholder image 1",
},
},
],
},
{
value: "tab-two",
trigger: "Tab Two",
content: [
{
tagline: "Tagline",
heading: "Medium length section 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.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
image: {
src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
alt: "Relume placeholder image 2",
},
},
],
},
{
value: "tab-three",
trigger: "Tab Three",
content: [
{
tagline: "Tagline",
heading: "Medium length section 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.",
buttons: [
{ title: "Button", variant: "secondary" },
{
title: "Button",
variant: "link",
size: "link",
iconRight: <ChevronRight className="text-scheme-text" />,
},
],
image: {
src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
alt: "Relume placeholder image 3",
},
},
],
},
],
};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


