All loaders
Geometric2.8s loop

Cascade

A pulse crosses a grid of cells on the diagonal.

Pauses off screen

The prompt

Build a fullscreen preloader called Cascade.

Centre a five by five grid of white squares on a near-black stage. Each cell is about 6.5% of the stage's smaller dimension with a soft 1.4% corner radius, separated by 2.6% gaps.

Give every cell the same 2.8s ease-in-out animation: scale 0.38 at 20% opacity for most of the cycle, peaking at scale 1 and full opacity at 26% of the timeline, then settling back by 58% and resting until the loop restarts. The rest gap matters, since without it the grid never returns to a calm state and the wave has nothing to arrive into.

The whole effect comes from the delay. Set each cell's animation-delay to its row index plus its column index, multiplied by 75ms. Cells sharing a diagonal then fire together, and the pulse sweeps from the top-left corner to the bottom-right one, taking about 600ms to cross a 2.8s loop.

Derive the row and column from the cell's position in the list, never from a random number. A random stagger changes between the server render and the browser render and will cause a hydration mismatch; an index is stable, and it also makes the wave direction something you can deliberately reverse later.

Loop forever. Under prefers-reduced-motion, hold every cell at full size.
Made with Modulify