Layout 503
cardText Align LeftText Align CenterImage/Video Right2 ColumnsTabsButtons

Code
relume-layout503.tsx
import { Button, type ButtonProps } from "@/components/ui/button";
import { Card } from "@/components/ui/card";
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[];
tabs: Tab[];
defaultTabValue: string;
};
export type Layout503Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
export const Layout503 = (props: Layout503Props) => {
const { tagline, heading, description, buttons, tabs, defaultTabValue } = {
...Layout503Defaults,
...props,
};
return (
<section className="px-[5%] py-16 md:py-24 lg:py-28">
<div className="container">
<div className="mb-12 md:mb-18 lg:mb-20">
<div className="mx-auto max-w-lg text-center">
<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>
</div>
<Tabs defaultValue={defaultTabValue} className="flex flex-col items-center">
<TabsList className="relative mb-12 scrollbar-none flex w-screen flex-nowrap items-center gap-x-6 overflow-auto px-[5vw] md:mb-16 md:w-auto md:max-w-full md:px-0">
{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 (
<Card className="grid grid-cols-1 md:grid-cols-2 md:items-center">
<div className="p-6 md:p-8 lg:p-12">
<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 items-center gap-x-4 md:mt-8">
{feature.buttons.map((button, index) => (
<Button key={index} {...button}>
{button.title}
</Button>
))}
</div>
</div>
<div className="aspect-square">
<img src={feature.image.src} className="size-full object-cover" alt={feature.image.alt} />
</div>
</Card>
);
};
export const Layout503Defaults: 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


