/* Animation helpers */
@keyframes egfb-bounce { 0%,100%{transform:translateY(0)} 50%{transform:translateY(-6px)} }
@keyframes egfb-fade { from{opacity:0} to{opacity:1} }
@keyframes egfb-pulse { 0%,100%{transform:scale(1)} 50%{transform:scale(1.05)} }
@keyframes egfb-slide { from{transform:translateY(12px)} to{transform:translateY(0)} }

.egfb-anim-bounce { animation: egfb-bounce 1.2s ease-in-out; }
.egfb-anim-fade { animation: egfb-fade 0.6s ease-out; }
.egfb-anim-pulse { animation: egfb-pulse 1.2s ease-in-out; }
.egfb-anim-slide { animation: egfb-slide 0.4s ease-out; }

/* looping versions */
.egfb-anim-loop.egfb-anim-bounce { animation-iteration-count: infinite; }
.egfb-anim-loop.egfb-anim-fade { animation-iteration-count: 1; } /* fade doesn't loop nicely */
.egfb-anim-loop.egfb-anim-pulse { animation-iteration-count: infinite; }
.egfb-anim-loop.egfb-anim-slide { animation-iteration-count: 1; }
