All components
Hero Parallax
heroesAceternity UI component.
responsive · 660px
Install
Same command in any shadcn project — React (Vite/CRA), Next.js, Remix, Astro, and more:
$
npx shadcn@latest add https://your-domain/r/hero-parallax.jsonUsage
"use client";
import { HeroParallax } from "@/registry/aceternity-ui/hero-parallax";
export default function Demo() {
const products = [
{
title: "Moonbeam",
link: "https://gomoonbeam.com",
thumbnail: "https://picsum.photos/seed/moonbeam/600/600",
},
{
title: "Cursor",
link: "https://cursor.so",
thumbnail: "https://picsum.photos/seed/cursor/600/600",
},
{
title: "Rogue",
link: "https://userogue.com",
thumbnail: "https://picsum.photos/seed/rogue/600/600",
},
{
title: "Editorially",
link: "https://editorially.org",
thumbnail: "https://picsum.photos/seed/editorially/600/600",
},
{
title: "Editrix AI",
link: "https://editrix.ai",
thumbnail: "https://picsum.photos/seed/editrix/600/600",
},
{
title: "Pixel Perfect",
link: "https://app.pixelperfect.quest",
thumbnail: "https://picsum.photos/seed/pixel/600/600",
},
{
title: "Algochurn",
link: "https://algochurn.com",
thumbnail: "https://picsum.photos/seed/algochurn/600/600",
},
{
title: "Aceternity UI",
link: "https://ui.aceternity.com",
thumbnail: "https://picsum.photos/seed/aceternity/600/600",
},
{
title: "Tailwind Master Kit",
link: "https://tailwindmasterkit.com",
thumbnail: "https://picsum.photos/seed/tailwind/600/600",
},
{
title: "SmartBridge",
link: "https://smartbridgetech.com",
thumbnail: "https://picsum.photos/seed/smartbridge/600/600",
},
{
title: "Renderwork Studio",
link: "https://renderwork.studio",
thumbnail: "https://picsum.photos/seed/renderwork/600/600",
},
{
title: "Creme Digital",
link: "https://cremedigital.com",
thumbnail: "https://picsum.photos/seed/cremedigital/600/600",
},
{
title: "Golden Bells Academy",
link: "https://goldenbellsacademy.com",
thumbnail: "https://picsum.photos/seed/goldenbells/600/600",
},
{
title: "Invoker Labs",
link: "https://invoker.lol",
thumbnail: "https://picsum.photos/seed/invoker/600/600",
},
{
title: "E Free Invoice",
link: "https://efreeinvoice.com",
thumbnail: "https://picsum.photos/seed/efreeinvoice/600/600",
},
];
return (
<div className="w-full">
<HeroParallax products={products} />
</div>
);
}Component source
"use client";
import React from "react";
import {
motion,
useScroll,
useTransform,
useSpring,
MotionValue,
} from "motion/react";
export const HeroParallax = ({
products,
}: {
products: {
title: string;
link: string;
thumbnail: string;
}[];
}) => {
const firstRow = products.slice(0, 5);
const secondRow = products.slice(5, 10);
const thirdRow = products.slice(10, 15);
const ref = React.useRef(null);
const { scrollYProgress } = useScroll({
target: ref,
offset: ["start start", "end start"],
});
const springConfig = { stiffness: 300, damping: 30, bounce: 100 };
const translateX = useSpring(
useTransform(scrollYProgress, [0, 1], [0, 1000]),
springConfig
);
const translateXReverse = useSpring(
useTransform(scrollYProgress, [0, 1], [0, -1000]),
springConfig
);
const rotateX = useSpring(
useTransform(scrollYProgress, [0, 0.2], [15, 0]),
springConfig
);
const opacity = useSpring(
useTransform(scrollYProgress, [0, 0.2], [0.2, 1]),
springConfig
);
const rotateZ = useSpring(
useTransform(scrollYProgress, [0, 0.2], [20, 0]),
springConfig
);
const translateY = useSpring(
useTransform(scrollYProgress, [0, 0.2], [-700, 500]),
springConfig
);
return (
<div
ref={ref}
className="h-[300vh] py-40 overflow-hidden antialiased relative flex flex-col self-auto [perspective:1000px] [transform-style:preserve-3d]"
>
<Header />
<motion.div
style={{
rotateX,
rotateZ,
translateY,
opacity,
}}
className=""
>
<motion.div className="flex flex-row-reverse space-x-reverse space-x-20 mb-20">
{firstRow.map((product) => (
<ProductCard
product={product}
translate={translateX}
key={product.title}
/>
))}
</motion.div>
<motion.div className="flex flex-row mb-20 space-x-20 ">
{secondRow.map((product) => (
<ProductCard
product={product}
translate={translateXReverse}
key={product.title}
/>
))}
</motion.div>
<motion.div className="flex flex-row-reverse space-x-reverse space-x-20">
{thirdRow.map((product) => (
<ProductCard
product={product}
translate={translateX}
key={product.title}
/>
))}
</motion.div>
</motion.div>
</div>
);
};
export const Header = () => {
return (
<div className="max-w-7xl relative mx-auto py-20 md:py-40 px-4 w-full left-0 top-0">
<h1 className="text-2xl md:text-7xl font-bold dark:text-white">
The Ultimate <br /> development studio
</h1>
<p className="max-w-2xl text-base md:text-xl mt-8 dark:text-neutral-200">
We build beautiful products with the latest technologies and frameworks.
We are a team of passionate developers and designers that love to build
amazing products.
</p>
</div>
);
};
export const ProductCard = ({
product,
translate,
}: {
product: {
title: string;
link: string;
thumbnail: string;
};
translate: MotionValue<number>;
}) => {
return (
<motion.div
style={{
x: translate,
}}
whileHover={{
y: -20,
}}
key={product.title}
className="group/product h-96 w-[30rem] relative shrink-0"
>
<a
href={product.link}
className="block group-hover/product:shadow-2xl "
>
<img
src={product.thumbnail}
height="600"
width="600"
className="object-cover object-left-top absolute h-full w-full inset-0"
alt={product.title}
/>
</a>
<div className="absolute inset-0 h-full w-full opacity-0 group-hover/product:opacity-80 bg-black pointer-events-none"></div>
<h2 className="absolute bottom-4 left-4 opacity-0 group-hover/product:opacity-100 text-white">
{product.title}
</h2>
</motion.div>
);
};Dependencies
motion
Source: Aceternity UI