Scroll Morph Blob
A gradient blob that morphs between several organic shapes as the scroll progresses.
This is a WebberUI Pro component
The install command below needs a licence to run; without one it returns 401.
useScroll tracks scroll progress and useTransform interpolates between several structurally identical SVG paths, so the blob morphs between organic shapes like a liquid while multiple gradient layers cross-fade to shift its color — a good decorative background for long pages or scroll-driven storytelling.
Bring this into your project
Run this command in your project folder. The CLI adds the source and dependencies; then follow the usage example below.
npx webberui@latest add "https://webberui.com/r/scroll-morph-blob.en.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.
<ScrollMorphBlob/>
The complete example includes the preview layout and data. Install the component first, then paste this file into your project.
Installation
npx webberui@latest add "https://webberui.com/r/scroll-morph-blob.en.json?t=<install token>"Or, once registries are configured in components.json, install it as @webberui/scroll-morph-blob.
Usage
import * as React from "react";
import { ScrollMorphBlob } from "@/components/ui/scroll-morph-blob";
function ScrollStory() {
const containerRef = React.useRef<HTMLDivElement>(null);
return (
<div ref={containerRef} className="relative h-[400px] overflow-y-auto">
<div className="pointer-events-none sticky top-0 flex h-[400px] items-center justify-center">
<ScrollMorphBlob containerRef={containerRef} size={240} />
</div>
<div className="relative -mt-[400px]">{/* scrolling content sections… */}</div>
</div>
);
}When containerRef is omitted, the blob tracks the scroll progress of the whole page (the viewport) instead.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
containerRef | React.RefObject<HTMLElement | null> | — | Ref of the scroll container; when omitted, whole-page scroll progress is tracked |
paths | string[] | 4 built in | The sequence of blob paths (at least 2; the SVG command structure must be identical for interpolation to work) |
colors | Array<[string, string]> | 4 built in | The two gradient colors for each shape stage; reused cyclically when there are not enough |
size | number | 280 | Blob edge length (px); the SVG scales proportionally from a 200×200 viewBox |
rotate | number | 60 | Total rotation accumulated across the whole scroll (degrees); set to 0 to disable rotation |
glow | boolean | true | Whether to layer a Gaussian-blurred glow behind the blob |
className | string | — | Forwarded to the outer container |
Accessibility
- The blob is purely decorative, so the outer container is marked
aria-hiddenand assistive technology skips it entirely - When the user has "reduce motion" enabled at the system level, a static blob using the first shape and gradient is rendered instead, with no morphing, rotation, or scaling
- The animation is driven entirely by scroll progress, with nothing playing automatically, so what changes on screen stays in sync with user input
pointer-events-nonemakes sure the blob never intercepts clicks or scrolling
Scroll Spy Dots
Fixed side dots that track the current section, jump smoothly on click, and expand a label.
Exploded View Scroll
A scroll-driven exploded view — once the section pins, the product's cut-out layers blow apart along the Z axis, the specs annotated on each layer reveal in order, and at the end of the scroll everything collapses back into the complete product and releases into the next section.