


.fade-in {
  animation: animFadeIn 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

.slide-up {
  opacity: 0;
  animation: animSlideUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

.slide-in-left {
  opacity: 0;
  animation: animSlideInLeft 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

.slide-in-right {
  opacity: 0;
  animation: animSlideInRight 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}


.reveal {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}

.reveal.active {
  opacity: 1;
  transform: translateY(0);
}


.delay-100 { transition-delay: 100ms; }
.delay-200 { transition-delay: 200ms; }
.delay-300 { transition-delay: 300ms; }
.delay-400 { transition-delay: 400ms; }


@keyframes animFadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes animSlideUp {
  from {
    opacity: 0;
    transform: translateY(40px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes animSlideInLeft {
  from {
    opacity: 0;
    transform: translateX(-40px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

@keyframes animSlideInRight {
  from {
    opacity: 0;
    transform: translateX(40px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}


.pulse-live {
  animation: animLivePulse 1.5s infinite ease-in-out;
}

.dot-pulse {
  width: 8px;
  height: 8px;
  background-color: #FFFFFF;
  border-radius: 50%;
  display: inline-block;
  animation: animDotPulse 1.5s infinite ease-in-out;
}

@keyframes animLivePulse {
  0% {
    box-shadow: 0 0 0 0 rgba(230, 57, 70, 0.7);
  }
  70% {
    box-shadow: 0 0 0 8px rgba(230, 57, 70, 0);
  }
  100% {
    box-shadow: 0 0 0 0 rgba(230, 57, 70, 0);
  }
}

@keyframes animDotPulse {
  0%, 100% {
    transform: scale(0.6);
    opacity: 0.5;
  }
  50% {
    transform: scale(1.2);
    opacity: 1;
  }
}


.float-subtle {
  animation: animFloat 4s ease-in-out infinite;
}

@keyframes animFloat {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-8px); }
}


.skeleton {
  background: linear-gradient(90deg, #F1F3F5 25%, #E9ECEF 50%, #F1F3F5 75%);
  background-size: 200% 100%;
  animation: animSkeleton 1.5s infinite;
}

@keyframes animSkeleton {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}
