Move the cursor to push the dots; click anywhere to fire a shockwave. The mark disperses and recovers — the animation loop exits the moment everything returns to rest.

Technique adapted from Emil Kowalski's Agents with Taste. Dot positions are baked from rasterized shapes at mount; the per-frame loop runs bucketed fillRect passes against typed-array displacements.