tween
ComponentsTemplatesShowcaseContact

Command Palette

Search for a command to run...

Getting Started
  • Introduction
  • Installation
  • StoryNew
Guides
  • Motion Principles
  • Scroll and Smooth Scroll
  • Performance and Accessibility
Scroll Animations
  • Sticky Cards Scroll
  • Rise Fan Cards Scroll
  • Rotate Stack Scroll
  • Doodle Lens ScrollNew
  • Slit Open Hero ScrollNew
  • Logo Mask Zoom ScrollNew
  • ASCII Dissolve ScrollNew
  • Lottie Flight ScrollNew
  • Inline Icon Text ScrollNew
  • Starfield ScrollNew
  • Name Swap ScrollNew
  • Spotlight Gallery HeroNew
  • Slit Rotate Hero ScrollNew
  • Stroke Cover ScrollNew
  • Stroke Rows ScrollNew
Text Animations
  • Text Skew Reveal
  • Block Text Reveal
Hover & Cursor
  • Image Trail Cursor
  • Cursor Depth Logo
  • Physics Tag Drop
  • Elastic Card ListNew
  • Magnetic Cards SpringNew
Sliders & Carousels
  • Wheel Fullscreen Carousel
  • Ripple Displacement Slider
  • Three.js Blend Slider
  • Stacked Deck Slider
  • Orbit Cylinder SliderNew
  • Fan Stack SliderNew
  • Exponential Strip SliderNew
  • Dual Column SliderNew
Galleries & Grids
  • Scroll Wave Gallery
Menus & Navigation
  • Shrink Page MenuNew
Preloaders & Intros
  • Floating Items RevealNew
  • Word Cycle RevealNew
  • Tile Grid LoaderNew
Page Transitions
  • Panel Assembly TransitionNew
3D & WebGL
  • Fractal Glass Hero
  • Fluid Cursor Canvas
  • Fluid Portrait Hero
  • Fluid Gradient Canvas
  • Inversion Lens HoverNew
UI Elements
  • Circular Widgets
  • Vinyl Cover
  • Image Explosion Footer
  • Accordion Image FramesNew

(Tween) — Motion registry

Animated components & full sites, one command away.

Product

  • Components
  • Templates
  • Installation
  • Guides
  • Blog
  • Contact

Categories

  • Scroll Animations
  • Text Animations
  • Hover & Cursor
  • Sliders & Carousels
  • Galleries & Grids
  • Menus & Navigation
  • Preloaders & Intros
  • Page Transitions
  • 3D & WebGL
  • UI Elements
TWEEN
ease: power2.inOut0.00s
© 2026 TweenBack to topBuilt by mohammad
  1. Docs/
  2. Components/
  3. Scroll Wave Gallery

Scroll Wave Gallery

PreviousNext

A vertical column of images that drift horizontally on a combined three-sine-wave path and clip in from their edges as the scroller passes them.

Open in
scroll-wave-gallery-demo

Tideline

Fog settling over a wide beach below a grassy dune
Dune slope and sand fence above a misty shoreline
Marram grass running down to a pale, flat sea
Bleached dunes stretching toward distant hills
Low dunes and wet sand under a soft blue sky
Wind-flattened sand at the foot of a white dune ridge
Aerial view of surf lines along a long pale coast
Sepia dune crest with a tuft of grass in the wind
Black and white dune line under an empty sky
A lone figure on the shore as the light goes

Slack Water

components/ui/scroll-wave-gallery-demo.tsx
import { ScrollWaveGallery } from "@/registry/tween/scroll-wave-gallery"

export function ScrollWaveGalleryDemo() {
  return <ScrollWaveGallery />
}

Installation

pnpm dlx shadcn@latest add https://tweenui.dev/r/scroll-wave-gallery.json

Usage

import { ScrollWaveGallery } from "@/components/ui/scroll-wave-gallery"
<ScrollWaveGallery
  intro="Tideline"
  outro="Slack Water"
  images={[
    {
      src: "https://images.unsplash.com/photo-1789169164965-6bab155e7861?q=80&w=1200&h=900&fit=crop&crop=center&auto=format",
      alt: "Fog settling over a wide beach below a grassy dune",
    },
    {
      src: "https://images.unsplash.com/photo-1649331713080-eeb544bd901c?q=80&w=1200&h=900&fit=crop&crop=center&auto=format",
      alt: "Black and white dune line under an empty sky",
    },
  ]}
/>

The images stack in a single column between an intro and outro heading. Each image gets its own ScrollTrigger (start: "top bottom", end: "bottom top"); on update its progress feeds three independent sine waves (base, flow, detail) that sum into a horizontal offset, while a clip-path inset opens from both edges toward the center of its travel and the last quarter of images shrink. The trigger resolves its scroller via usePreviewScroller, so it works in the docs preview and on a real page; a ResizeObserver recomputes image sizes and refreshes the triggers on layout change. When prefers-reduced-motion: reduce is set the images render centered and unclipped without scroll motion.

Props

PropTypeDefaultDescription
imagesScrollWaveImage[]10 defaultsEach image is { src, alt? }.
introReact.ReactNode"Tideline"Heading shown before the gallery.
outroReact.ReactNode"Slack Water"Heading shown after the gallery.
backgroundstring"#e4e2d9"Section background color.
foregroundstring"#1b1d1a"Heading text color.
baseHeightnumber375Base image height in px before responsive and shrink scaling.
scrollerHTMLElement | string | null—Optional ScrollTrigger scroller; defaults to the preview scroller.
classNamestring—Extra classes on the outer container.
Dual Column SliderShrink Page Menu

On This Page

InstallationUsageProps

Contribute

  • Report an issue
  • Request a feature
  • Edit this page