Valentine
The Button That Runs Away
Playful Valentine's Day proposal app with a runaway "No" button and animated success states.
Interaction design as mischief. The premise is simple: a proposal question, a "Yes" button, and a "No" button that runs away when you try to click it.
I built the No button to track cursor proximity and touch start events, relocating to safe coordinates within the viewport before the click can land. The calculation accounts for screen edges so it never clips off-screen on mobile or on narrow desktop windows. Each near-miss adds a new persuasion phrase above the buttons, escalating the emotional stakes through increasingly dramatic text. The phrases update on every hover count so there is a small narrative arc built into the failed attempts.
The "Yes" path is the reward for persistence: canvas-confetti bursts across the screen while the Gemini API generates a custom four-line love poem. The poem is not generic. It is written in response to the specific moment, which means no two acceptances produce the same verse. That personalization is the detail that makes the success state feel like an achievement rather than just a screen change.
I built this for one person. But the behavior is universally legible because the gap between wanting to click a button and having it escape is a frustration everyone has felt, and turning that frustration into a mechanic makes it immediately funny. The delight comes from the mischief being obvious: you can see exactly what is happening and you still cannot stop it.
React and Vite keep the build small. The touch start listener blocks default click behavior on mobile so the escape works correctly on phones. The whole thing runs in the browser without a server.