/* ============================================
   动效
   ============================================ */

@keyframes orbFloat {
  0%, 100% { transform: translate(0, 0) rotate(0); }
  50% { transform: translate(-8px, -12px) rotate(2deg); }
}

@keyframes orbMorph {
  0%, 100% {
    border-radius: 50% 50% 50% 50%;
    transform: rotate(0deg) scale(1);
  }
  25% {
    border-radius: 55% 45% 60% 40%;
    transform: rotate(3deg) scale(1.02);
  }
  50% {
    border-radius: 45% 55% 40% 60%;
    transform: rotate(-2deg) scale(0.98);
  }
  75% {
    border-radius: 50% 60% 45% 55%;
    transform: rotate(2deg) scale(1.01);
  }
}

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

@keyframes dotBounce {
  0%, 80%, 100% { transform: translateY(0); opacity: 0.5; }
  40% { transform: translateY(-6px); opacity: 1; }
}

@keyframes iconPulse {
  0%, 100% { opacity: 0.3; }
  50% { opacity: 0.7; }
}

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

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

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

@keyframes thinkingBounce {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.05); }
}

/* 减少动效偏好（无障碍） */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}
