Progressive Blur
Edge overlay that blurs content progressively using stacked masked backdrop filters.
pnpm dlx @glinui/cli@latest add progressive-blur- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
Installation
pnpm dlx @glinui/cli@latest add progressive-blurCredits. Adapted from Motion Primitives (MIT, (c) 2024 ibelick). motion/react removed (CSS and Web Animations API), tokens, accessibility, reduced motion levels, RTL Attribution details.
Prefer the package?
Usage
Place it inside a `relative` scroll container, or above a sticky header, and size it with `size`. Add `isolate` to a rounded `overflow-hidden` parent so the blur is clipped to its corners. It never receives pointer events.
Each layer is a `backdrop-filter`, which is expensive over large areas. Keep overlays small (under about 160px thick) and use fewer layers on low-end devices.
Variants
All four edges.
- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
<ProgressiveBlur direction="start" size={56} />States
Fewer, stronger layers or many soft ones.
- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
<ProgressiveBlur blurLayers={3} blurIntensity={2} /><ProgressiveBlur blurLayers={8} blurIntensity={0.6} size={96} />In a layout
Content blurs as it slides under a sticky header.
- Activity entry 1: deploy finished in 40s
- Activity entry 2: deploy finished in 43s
- Activity entry 3: deploy finished in 46s
- Activity entry 4: deploy finished in 49s
- Activity entry 5: deploy finished in 52s
- Activity entry 6: deploy finished in 55s
- Activity entry 7: deploy finished in 58s
- Activity entry 8: deploy finished in 61s
- Activity entry 9: deploy finished in 64s
- Activity entry 10: deploy finished in 67s
- Activity entry 11: deploy finished in 70s
- Activity entry 12: deploy finished in 73s
- Activity entry 13: deploy finished in 76s
- Activity entry 14: deploy finished in 79s
<div className="relative overflow-hidden"> <ProgressiveBlur direction="top" size={56} /> <header className="absolute inset-x-0 top-0 z-30">...</header> <List /></div>Accessibility
- Decorative: aria-hidden and pointer-events-none, so links and scrolling underneath keep working.
- Do not rely on it to hide content from users; the text underneath stays readable by assistive tech.
- Hidden under forced-colors.
ARIA Attributes
- `aria-hidden="true"`
- `data-mode` is `blur` or `fade`
Reduced Motion
The blur itself is static. At motion level none the overlay becomes a single gradient fade with no backdrop-filter, which also helps low-power devices.
Affected properties
backdrop-filter layersAPI Reference
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
direction | "top" | "bottom" | "start" | "end" | No | bottom | Edge the overlay hugs. Blur is strongest at that edge. |
blurLayers | number | No | 8 | Stacked blur layers, clamped to 2 through 8. |
blurIntensity | number | No | 1 | Extra blur in pixels per layer. |
size | number | string | No | 6rem | Thickness along the axis. Numbers are pixels. |
variant | "default" | "plain" | "glass" | No | default | Fade color used at motion none. |
Source
Import directly from the package or browse the source on GitHub. Click any file to view it.
Import
import { ProgressiveBlur } from "@glinui/ui"Dependencies
@glinui/ui@glinui/motionclass-variance-authorityGenerated API Snapshot
Beta
Generated API Snapshot
BetaAuto-extracted from TypeScript source in packages/ui/src/components/progressive-blur.tsx. This section is in beta and may lag behind hand-curated docs. Regenerate with pnpm --filter @glinui/docs api:generate.
Generated: 2026-10-08T01:41:21.546Z · Full index: /docs/api-metadata
Primary Props Type
ProgressiveBlurProps
ProgressiveBlurProps
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
blurIntensity | number | No | 1 | Extra blur in pixels added per layer (the strongest layer blurs by `(layers - 1) * blurIntensity`). |
blurLayers | number | No | MAX_LAYERS | Number of stacked backdrop-filter layers, clamped to 2..8. |
direction | "top" | "bottom" | "start" | "end" | No | "bottom" | Variant option from progressiveBlurVariants. |
size | number | string | No | - | Thickness of the overlay along its axis. A number is pixels, a string is any CSS length. |
variant | "default" | "plain" | "glass" | No | "default" | Variant option from progressiveBlurVariants. |