/* =========================================================================
   ROSIE — Global keyframe animations
   All @keyframes live here so they are defined exactly once, load early,
   and are available to every component without duplication.
   ========================================================================= */

/* Fade + slide in — used by log entries and alert cards */
@keyframes fadeSlide {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Pulse — live indicator dot (opacity + scale shrink, matches sim2Rec) */
@keyframes pulseDot {
  0%, 100% { opacity: 1;    transform: scale(1);    }
  50%       { opacity: 0.35; transform: scale(0.55); }
}

/* Ring pulse — hangup / training hangup call buttons */
@keyframes pulseRing {
  0%   { box-shadow: 0 0 0 0   rgba(249, 117, 96, 0.45); }
  70%  { box-shadow: 0 0 0 18px rgba(249, 117, 96, 0); }
  100% { box-shadow: 0 0 0 0   rgba(249, 117, 96, 0); }
}

/* Spinner — processing overlay */
@keyframes spin {
  to { transform: rotate(360deg); }
}

/* QA item entrance — staggered fade+slide for evaluation list rows */
@keyframes qaItemEnter {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Chip entrance — spring pop for attribution chips */
@keyframes chipEnter {
  from { opacity: 0; transform: scale(0.7); }
  to   { opacity: 1; transform: scale(1); }
}

/* Bar fill — speaking-time segments grow from left */
@keyframes barFillIn {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}

/* Shimmer sweep — looping highlight over filled bar */
@keyframes shimmerSweep {
  from { transform: translateX(-100%); }
  to   { transform: translateX(100%); }
}

/* Pop + ring — criterion completion celebration */
@keyframes criterionPop {
  0%   { transform: scale(1.1); }
  40%  { transform: scale(1.6); text-shadow: 0 0 12px rgba(60, 165, 154, 0.65); }
  100% { transform: scale(1.1); text-shadow: none; }
}
@keyframes criterionRing {
  0%   { box-shadow: 0 0 0 0    rgba(60, 165, 154, 0.55); }
  70%  { box-shadow: 0 0 0 14px rgba(60, 165, 154, 0); }
  100% { box-shadow: 0 0 0 0    rgba(60, 165, 154, 0); }
}

/* Dispute confirmation — checkmark message pops in after Send */
@keyframes disputeConfirm {
  0%   { opacity: 0; transform: translateX(8px) scale(0.9); }
  60%  { opacity: 1; transform: translateX(0)   scale(1.04); }
  100% { opacity: 1; transform: translateX(0)   scale(1); }
}

/* =========================================================================
   Reduced-motion — collapse all decorative animations
   ========================================================================= */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration:        0.01ms !important;
    animation-iteration-count: 1      !important;
    transition-duration:       0.01ms !important;
  }
}
