@keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
@keyframes pulse-soft { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } }
@keyframes draw-stroke { from { stroke-dashoffset: var(--len, 1000); } to { stroke-dashoffset: 0; } }
@keyframes wiggle { 0%, 100% { transform: rotate(0deg); } 25% { transform: rotate(-2deg); } 75% { transform: rotate(2deg); } }
@keyframes pop { 0% { transform: scale(0); opacity: 0; } 60% { transform: scale(1.15); opacity: 1; } 100% { transform: scale(1); } }
@keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }

.fx-float { animation: float 3s ease-in-out infinite; }
.fx-pulse { animation: pulse-soft 2s ease-in-out infinite; }
.fx-pop { animation: pop 360ms cubic-bezier(0.22, 1, 0.36, 1) both; }
.fx-wiggle { animation: wiggle 600ms ease-in-out; }
.shimmer-bg {
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.6), transparent);
  background-size: 200% 100%;
  animation: shimmer 1.4s infinite;
}

/* SVG drawing helper */
.draw-on { stroke-dasharray: var(--len, 1000); stroke-dashoffset: var(--len, 1000); }
.draw-on.go { animation: draw-stroke 900ms var(--ease-out, ease-out) forwards; }
