The lightbox opens on the first frame.
Tap an image and it is already open — showing the thumbnail the browser has cached, blurred, until the full-resolution file decodes and takes its place. Pinch to zoom, swipe to dismiss, 7 kB gzipped, no dependencies.
Every behaviour is a prop
// every default is already what you want
<BlurstImage src={thumb} full={full} alt="…" />Seven ways to wire it up
Big images too
When the trigger is already large, there is nothing to blur past — the image flies straight to the fitted rect and the full file swaps in behind it. The same component covers both ends.
Two lines
npm i blurst
# pnpm add blurst
# yarn add blurst
# bun add blurstimport { BlurstImage } from "blurst";
export function Photo() {
return <BlurstImage src="/thumb.jpg" full="/full.jpg" />;
}React 18 or 19. Works in the Next.js App Router without a "use client" boundary of your own — the package ships one.
Options
Set them per image, per group, or once on BlurstProvider. The nearest one wins.