The recipe for a custom cursor has three organs: hide the real cursor and draw a replacement (here, a soft circle that follows with a tiny lag — the lag alone makes it feel alive), let movement shed sparkles, and make presses an event — the circle flinches, then pops into an ember burst and an expanding ring. Press Run, then move over the canvas and click.
On a touch screen there is no resting cursor at all — the circle simply appears under your finger, and the press-pop becomes the whole show. Same code, both worlds, thanks to pointer events.
dt * 12 → dt * 4 (dreamy) → dt * 40 (eager) · squish = 0.45 → 0.15 (dramatic flinch) · the flinch spring's damping 14 → 40 (critically damped: no wobble) → 5 (jelly) · burst count 26 → 80 · ring speed 160 → 420 (real pop) · sparkle threshold moved > 3 → 0 (sheds constantly).Web (DOM): cursor: none plus a position: fixed element following pointermove — and only where a replacement is drawn; never hide the cursor and offer nothing back. In Godot: Input.set_custom_mouse_cursor() for a static image; the living companion — hidden mouse, eased chase, distance-shed sparkles, press-pop — is cursor_sparkle.gd, ready to download. In Unity: Cursor.SetCursor() / Cursor.visible = false + a UI element tracking the pointer. In Unreal: SetMouseCursorWidget() — a full animated UMG widget as the cursor. Chapter 12.