WebberUI

Hero Parallax Grid

A product/portfolio wall with alternating row parallax — each row sweeps in a different direction as you scroll, with a 3D reveal.

This is a WebberUI Pro component

Free during the launch campaign: sign up or sign in, then hit “Copy install command” in the preview above and it installs straight away — no payment, no credit card. The command below returns 401 while you are signed out.

How to install Pro components →See the plans →

A scroll-driven hero parallax wall: items are split into several rows, adjacent rows shift horizontally in opposite directions, and rotateX plus a fade-in complete within the first 20% of the reveal, producing a sense of moving through depth.

Loading preview…
npx shadcn@latest add "https://webberui.com/r/hero-parallax-grid.json?t=<install token>"

Playground

Tune the props live — the code snippet updates as you go, so you can dial in the look you want before copying it.

3
320
200
150
<HeroParallaxGrid />

Installation

npx shadcn@latest add "https://webberui.com/r/hero-parallax-grid.json?t=<install token>"

Or, once registries are configured in components.json, install it as @webberui/hero-parallax-grid.

Usage

import { HeroParallaxGrid } from "@/components/ui/hero-parallax-grid";

const items = [
  { src: "/work/nova.jpg", alt: "Nova", title: "Nova" },
  { src: "/work/ember.jpg", alt: "Ember", title: "Ember" },
  // 9–15 images recommended
];

<HeroParallaxGrid
  items={items}
  title="Selected work"
  description="Alternating row parallax."
/>;

The height of the outer track container (the h-* in className) determines the scrollable distance; the taller it is, the slower and more complete the parallax sweep. If the scrolling happens inside a nested overflow section, pass that container's ref to container.

Props

PropTypeDefaultDescription
items(string | { src; alt?; title? })[]Product/portfolio items; 9–15 recommended
containerRefObject<HTMLElement>undefinedNested scroll container; the window is the scroll source by default
rowsnumber3How many rows to split into; adjacent rows shift in opposite directions
travelnumber320Horizontal displacement per row (px); larger sweeps faster
titlestringundefinedTitle at the top (not rendered when omitted)
descriptionstringundefinedDescription below the title
cardWidthnumber200Card width (px)
cardHeightnumber150Card height (px)
aria-labelstring"Parallax product wall"Accessible name for the gallery
classNamestringundefinedThe track container; its height determines the scrollable distance
imageClassNamestringundefinedApplied to every card image

Accessibility

  • When the user has "reduce motion" enabled at the system level, a static grid is rendered instead, with no scroll parallax
  • The whole set carries role="group" and aria-label; images without an alt are marked aria-hidden

On this page