/* ==========================================================================
   Keyframes — consolidated from every page of the original prototype.
   Kept distinct where the source pages used slightly different easing/values.
   ========================================================================== */

@keyframes pulseDot        { 0%, 100% { opacity: 1; }     50% { opacity: 0.35; } }
@keyframes pulseDotScale   { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .4; transform: scale(.7); } }
@keyframes pulseDotSoft    { 0%, 100% { opacity: 1; }     50% { opacity: .3; } }

@keyframes gridPan   { 0% { background-position: 0 0; }   100% { background-position: 40px 40px; } }
@keyframes fadeUp    { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: translateY(0); } }
@keyframes fadeIn    { from { opacity: 0; }                to { opacity: 1; } }
@keyframes pingRing  { 0% { transform: scale(1); opacity: 0.5; } 100% { transform: scale(2.4); opacity: 0; } }

@keyframes floatA { 0%, 100% { transform: translate(0,0); } 33% { transform: translate(6px,-10px); } 66% { transform: translate(-5px,7px); } }
@keyframes floatB { 0%, 100% { transform: translate(0,0); } 33% { transform: translate(-7px,8px); } 66% { transform: translate(5px,-6px); } }
@keyframes floatC { 0%, 100% { transform: translate(0,0); } 33% { transform: translate(4px,9px); }  66% { transform: translate(-6px,-5px); } }
@keyframes floatY { 0%, 100% { transform: translateY(0); }  50% { transform: translateY(-10px); } }

@keyframes orbitDot { 0% { transform: rotate(0deg) translateX(38px); } 100% { transform: rotate(360deg) translateX(38px); } }

@keyframes slideUp       { from { opacity: 0; transform: translateY(6px); }   to { opacity: 1; transform: translateY(0); } }
@keyframes scaleInX      { from { transform: scaleX(0); }                     to { transform: scaleX(1); } }
@keyframes slideMsg      { from { opacity: 0; transform: translateX(14px); }  to { opacity: 1; transform: translateX(0); } }
@keyframes slideUserMsg  { from { opacity: 0; transform: translateX(-14px); } to { opacity: 1; transform: translateX(0); } }
@keyframes typingBlink   { 0%, 100% { opacity: 1; }  50% { opacity: .2; } }
@keyframes borderPulse   { 0%, 100% { box-shadow: 0 0 0 0 rgba(52,214,161,0.4); } 50% { box-shadow: 0 0 0 6px rgba(52,214,161,0); } }
@keyframes flowPulse     { 0% { transform: translateY(0); opacity: .8; } 100% { transform: translateY(100%); opacity: 0; } }
@keyframes gradShift     { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }

@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
}
