/* Reveal (fade/slide/zoom/rotate) */
.reveal { opacity: 0; transition: all 0.7s cubic-bezier(.22,1,.36,1); will-change: opacity, transform; }
.reveal.fade-up { transform: translateY(40px); }
.reveal.fade-down { transform: translateY(-40px); }
.reveal.slide-left { transform: translateX(-40px); }
.reveal.slide-right { transform: translateX(40px); }
.reveal.zoom-in { transform: scale(0.8); }
.reveal.zoom-out { transform: scale(1.2); }
.reveal.rotate-in { transform: rotate(-8deg) scale(0.9); }
.reveal.active { opacity: 1; transform: none; }

/* Delay helpers */
.delay-1 { transition-delay: 0.2s !important; }
.delay-2 { transition-delay: 0.4s !important; }
.delay-3 { transition-delay: 0.6s !important; }
.delay-4 { transition-delay: 0.8s !important; }

/* Hover effects */
.card:hover { box-shadow: 0 8px 40px 0 #7c3aed88; transform: scale(1.03) translateY(-4px); }
.btn:hover { filter: brightness(1.1) drop-shadow(0 2px 8px #ec4899cc); transform: scale(1.07); }
.img-hover-zoom { transition: transform 0.4s cubic-bezier(.22,1,.36,1); }
.img-hover-zoom:hover { transform: scale(1.08) rotate(-2deg); }

/* Pulse, bounce, shake */
.pulse { animation: pulse 1.5s infinite; }
@keyframes pulse { 0%,100%{transform:scale(1);} 50%{transform:scale(1.08);} }
.bounce { animation: bounce 1.2s infinite; }
@keyframes bounce { 0%,100%{transform:translateY(0);} 50%{transform:translateY(-12px);} }
.shake { animation: shake 0.7s; }
@keyframes shake { 10%,90%{transform:translateX(-2px);} 20%,80%{transform:translateX(4px);} 30%,50%,70%{transform:translateX(-8px);} 40%,60%{transform:translateX(8px);} }

/* Animated underline nav */
.navbar a.underline-anim::after {
  content: '';
  display: block;
  height: 2px;
  width: 0;
  background: linear-gradient(90deg,#7c3aed,#ec4899 80%);
  transition: width 0.3s;
}
.navbar a.underline-anim:hover::after, .navbar a.underline-anim.active::after { width: 100%; } 