/* ==========================================================================
   OTOFOL — Animations
   ========================================================================== */

@keyframes pulse-dot{ 0%,100%{ opacity:1; transform:scale(1); } 50%{ opacity:.55; transform:scale(.8); } }
@keyframes pulse-scale{ 0%,100%{ transform:scale(1); opacity:1; } 50%{ transform:scale(1.08); opacity:.75; } }
@keyframes loader-bar{ 0%{ transform:translateX(-120%); } 100%{ transform:translateX(360%); } }
@keyframes ripple{ to{ transform:scale(3); opacity:0; } }
@keyframes float-y{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(-10px); } }
@keyframes spin-slow{ to{ transform: rotate(360deg); } }
@keyframes gradient-shift{ 0%{ background-position:0% 50%; } 50%{ background-position:100% 50%; } 100%{ background-position:0% 50%; } }
@keyframes caret-blink{ 0%,100%{ opacity:1; } 50%{ opacity:0; } }

.float{ animation: float-y 5s ease-in-out infinite; }

/* Scroll reveal — toggled via IntersectionObserver in animations.js */
[data-reveal]{ opacity:0; transition: opacity .8s var(--ease), transform .8s var(--ease); will-change:opacity, transform; }
[data-reveal="up"]{ transform: translateY(28px); }
[data-reveal="left"]{ transform: translateX(-32px); }
[data-reveal="right"]{ transform: translateX(32px); }
[data-reveal="scale"]{ transform: scale(.92); }
[data-reveal="zoom"]{ transform: scale(1.06); }
[data-reveal].is-visible{ opacity:1; transform:none; }

/* Stagger children of a revealed group */
[data-reveal-group] > *{ transition-delay: calc(var(--stagger, 0) * 90ms); }

@media (prefers-reduced-motion: reduce){
  [data-reveal]{ opacity:1 !important; transform:none !important; }
  .float, .loader__mark img{ animation:none !important; }
}
