Hover the button and embers are born along its edge — not from a fixed point, but anywhere on the perimeter — then rise and fade like real heat. Two overlapping embers brighten each other instead of stacking flatly: the additive blending is what makes it read as fire, not confetti.
The swarm builds up smoothly while you hover and dies down naturally when you leave — particles already born finish their life, nothing cuts off. At rest, a couple of embers smoulder quietly so the button never looks dead.
Two flame colours blend per particle for a richer gradient, and the label keeps a soft glow that intensifies on hover. Still a real button (or link): keyboard reachable, visible focus ring.
Canvas and requestAnimationFrame, no dependencies, nothing loaded from outside. Honours prefers-reduced-motion, and rests quietly on the Framer canvas. Free.
Hover the button and embers are born along its edge — not from a fixed point, but anywhere on the perimeter — then rise and fade like real heat. Two overlapping embers brighten each other instead of stacking flatly: the additive blending is what makes it read as fire, not confetti.
The swarm builds up smoothly while you hover and dies down naturally when you leave — particles already born finish their life, nothing cuts off. At rest, a couple of embers smoulder quietly so the button never looks dead.
Two flame colours blend per particle for a richer gradient, and the label keeps a soft glow that intensifies on hover. Still a real button (or link): keyboard reachable, visible focus ring.
Canvas and requestAnimationFrame, no dependencies, nothing loaded from outside. Honours prefers-reduced-motion, and rests quietly on the Framer canvas. Free.