How it works
A requestAnimationFrame loop is the heart. While dragging, per-frame velocity is simply the difference between the current and previous x position; on release, that same velocity feeds a small inertial model decaying each frame. The blur radius is velocity times a gain factor, clamped to a hard ceiling around ten pixels, then written to the card's filter. The ghost copies read the same velocity and offset themselves opposite to the motion with staggered multipliers, their opacity scaling with speed so they exist only while things move fast. Because every value derives from one velocity number per frame, the effect is continuous by construction - no state machine, no thresholds.
How to use this prompt
Use it on anything a user can flick: sortable drag lists, fast carousels, pull-out drawers, flung panels. Send the prompt with the element and its driver (pointer drag versus inertial scroll), plus one instruction amateurs skip: recompute velocity inside requestAnimationFrame, never inside pointermove handlers, or the blur stutters at input frequency instead of display frequency.
Tips for better results
Clamp the blur radius hard - past roughly ten pixels the element becomes an unreadable blob. Interpolate the blur value per frame rather than stepping it by speed tiers, or it flickers. Keep two or three ghost layers max with will-change: transform for compositing; more reads as double-exposure meddling. Vertical lists can reuse the same mapping, but apply the filter to the content layer, never the scroller itself, or the whole viewport smears.