Layout 417
standard1 ColumnText Align CenterText Align LeftIcons

Code
relume-layout417.tsx
"use client";
import { useRef } from "react";
import { MotionStyle, motion, useScroll, useTransform } from "motion/react";
import { Card } from "@/components/ui/card";
import { RelumeIcon } from "relume-icons";
type FeatureSectionProps = {
title: string;
description: string;
};
type Props = {
heading: string;
featureSections: FeatureSectionProps[];
};
export type Layout417Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
const MotionCard = motion.create(Card) as any;
export const Layout417 = (props: Layout417Props) => {
const { heading, featureSections } = {
...Layout417Defaults,
...props,
};
const containerRef = useRef<HTMLDivElement>(null);
const { scrollYProgress } = useScroll({
target: containerRef,
});
return (
<section ref={containerRef}>
<div className="container">
<div className="relative h-[300svh] lg:h-[300vh]">
<div className="sticky top-0 grid h-svh grid-cols-1 content-center items-center justify-center px-[5%] md:flex md:content-normal md:px-0 lg:h-screen">
<div className="absolute top-0 right-0 bottom-auto left-0 flex w-full justify-center overflow-hidden pt-20 md:inset-auto md:pt-0">
<h1 className="text-h1 font-bold whitespace-nowrap sm:text-[5.5rem] md:text-[7.5rem] lg:text-[10rem]">
{heading}
</h1>
</div>
<div className="sticky top-0 mx-auto mt-12 flex min-h-[24.5rem] w-full max-w-sm flex-col items-center justify-center sm:mt-24 md:relative lg:mt-0">
{featureSections.map((section, index) => (
<FeatureSection
key={index}
section={section}
index={index}
totalSections={featureSections.length}
scrollYProgress={scrollYProgress}
/>
))}
</div>
</div>
</div>
</div>
<div className="absolute inset-0 -z-10 mt-[100vh]" />
</section>
);
};
const FeatureSection = ({
section,
index,
totalSections,
scrollYProgress,
}: {
section: FeatureSectionProps;
index: number;
totalSections: number;
scrollYProgress: any;
}) => {
const sectionScrollStart = index / totalSections;
const sectionScrollEnd = (index + 1) / totalSections;
const rotate = useTransform(
scrollYProgress,
[sectionScrollStart, sectionScrollEnd],
[0 + index * 3, -30],
);
const translateY = useTransform(
scrollYProgress,
[sectionScrollStart, sectionScrollEnd],
["0vh", "-120vh"],
);
const translateX = useTransform(
scrollYProgress,
[sectionScrollStart, sectionScrollEnd],
["0vw", "-10vw"],
);
return (
<MotionCard
className="absolute mx-6 flex flex-col justify-between p-8 md:mx-0"
style={
{
rotate: index === totalSections - 1 ? "9deg" : rotate,
translateY: index === totalSections - 1 ? undefined : translateY,
translateX: index === totalSections - 1 ? undefined : translateX,
zIndex: totalSections - index,
} as MotionStyle
}
>
<div className="mb-6 md:mb-8">
<RelumeIcon className="size-12 text-scheme-text" />
</div>
<h3 className="mb-3 text-h5 font-bold md:mb-4">{section.title}</h3>
<p>{section.description}</p>
</MotionCard>
);
};
export const Layout417Defaults: Props = {
heading: "Heading here",
featureSections: [
{
title: "Subheading one",
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.",
},
{
title: "Subheading two",
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.",
},
{
title: "Subheading three",
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.",
},
{
title: "Subheading four",
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.",
},
],
};npm i @radix-ui/react-slot class-variance-authority@0.7.1 clsx@^2.1.1 motion@^12.15.0 relume-icons@1.3.0 tailwind-merge@^2.2.2


