Docs·Progressive Blur

Progressive Blur

A lightweight scroll-edge primitive that dissolves content into its surface with a continuous, layered backdrop blur.

Installation

$pnpm dlx shadcn@latest add @spiderui/progressive-blur

Usage

Make the scroll container relative, then render ProgressiveBlurafter its content so the edge stays on top.

API Reference

PropTypeDefault
positionChoose the edge where scrolling content should dissolve.
"top" | "bottom" | "both""bottom"
heightCSS height of each edge treatment.
string"30%"
backgroundColorMatch this to the scroll container background for a seamless fade.
string"transparent"
blurLevelsBlur radii in pixels, ordered from content side to edge.
readonly number[][0.5, 1, 2, 4, 8, 16, 32, 64]
classNameAdditional classes applied to the absolute overlay.
string—

Surface matching

Set backgroundColor to the scrolling surface color. The fade then absorbs the final blurred pixels without a visible edge.

Click on the icon in the top right of the example preview to view the source code for specific variants.

Keep in mind

This component is inspired by various open-source projects and patterns. Please verify licenses and implementation details before using in production.

Have any questions?
Contact on@ctrlcat0x

Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, reiciendis eum vitae nostrum, temporibus repudiandae voluptatibus, natus iure ipsa velit odit quibusdam illum. Quaerat cumque laudantium libero reprehenderit perferendis quo nulla voluptate? Repellat tenetur labore exercitationem dicta libero voluptate suscipit, iusto ea assumenda. Ipsa enim, quidem atque modi error eaque, debitis perferendis, hic iste libero dignissimos ea! Quod inventore beatae aspernatur nulla rem perferendis aperiam at debitis delectus odit quia animi ex mollitia vero molestias itaque deleniti, quos exercitationem consequatur assumenda dolor?

Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, reiciendis eum vitae nostrum, temporibus repudiandae voluptatibus, natus iure ipsa velit odit quibusdam illum. Quaerat cumque laudantium libero reprehenderit perferendis quo nulla voluptate? Repellat tenetur labore exercitationem dicta libero voluptate suscipit, iusto ea assumenda. Ipsa enim, quidem atque modi error eaque, debitis perferendis, hic iste libero dignissimos ea! Quod inventore beatae aspernatur nulla rem perferendis aperiam at debitis delectus odit quia animi ex mollitia vero molestias itaque deleniti, quos exercitationem consequatur assumenda dolor?

Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, reiciendis eum vitae nostrum, temporibus repudiandae voluptatibus, natus iure ipsa velit odit quibusdam illum. Quaerat cumque laudantium libero reprehenderit perferendis quo nulla voluptate? Repellat tenetur labore exercitationem dicta libero voluptate suscipit, iusto ea assumenda. Ipsa enim, quidem atque modi error eaque, debitis perferendis, hic iste libero dignissimos ea! Quod inventore beatae aspernatur nulla rem perferendis aperiam at debitis delectus odit quia animi ex mollitia vero molestias itaque deleniti, quos exercitationem consequatur assumenda dolor?

import { ProgressiveBlur } from "@/components/ui/progressive-blur"
export default function Page() {
  return (
    <div className="relative h-[400px] overflow-y-auto bg-background">
      <div className="mx-auto max-w-lg space-y-6 px-6 py-12 text-muted-foreground">
        <p>Scrollable content</p>
        <p>Content remains clear until it reaches the edge.</p>
        <p>The blur creates a softer handoff to the container.</p>
      </div>

      <ProgressiveBlur
        position="both"
        height="28%"
        backgroundColor="var(--background)"
      />
    </div>
  )
}