/* =========================================================
   DOC WASH — animations.css
   Keyframes + AOS-style scroll reveal (no external lib)
   ========================================================= */

/* ---------- Keyframes ---------- */
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes popIn { from { opacity: 0; transform: translateY(20px) scale(.94); } to { opacity: 1; transform: none; } }
@keyframes slowZoom { from { transform: scale(1); } to { transform: scale(1.12); } }
@keyframes marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@keyframes scrollDot { 0% { opacity: 0; top: 7px; } 40% { opacity: 1; } 80% { opacity: 0; top: 22px; } 100% { opacity: 0; } }
@keyframes pulseRing { 0% { transform: scale(1); opacity: .55; } 100% { transform: scale(1.9); opacity: 0; } }
@keyframes floatY { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-14px); } }
@keyframes shimmer { 0% { background-position: -400px 0; } 100% { background-position: 400px 0; } }
@keyframes bob { 0%,100% { transform: translateY(0) rotate(0); } 50% { transform: translateY(-8px) rotate(3deg); } }

/* ---------- Floating decor ---------- */
.float-slow { animation: floatY 6s ease-in-out infinite; }
.float-fast { animation: bob 4s ease-in-out infinite; }

/* Decorative blobs */
.blob { position: absolute; border-radius: 50%; filter: blur(60px); z-index: 0; pointer-events: none; opacity: .5; }
.blob--accent { background: radial-gradient(circle, rgba(71,215,196,.55), transparent 70%); }
.blob--primary { background: radial-gradient(circle, rgba(29,78,137,.4), transparent 70%); }

/* ---------- Scroll reveal (AOS-style, driven by main.js) ---------- */
[data-aos] {
  opacity: 0;
  transition: opacity .7s var(--ease-out), transform .7s var(--ease-out);
  will-change: opacity, transform;
}
[data-aos="fade-up"] { transform: translateY(40px); }
[data-aos="fade-down"] { transform: translateY(-40px); }
[data-aos="fade-left"] { transform: translateX(50px); }
[data-aos="fade-right"] { transform: translateX(-50px); }
[data-aos="zoom-in"] { transform: scale(.9); }
[data-aos="flip-up"] { transform: perspective(800px) rotateX(14deg) translateY(30px); }
[data-aos].aos-in { opacity: 1; transform: none; }

/* Stagger via delay attribute handled in JS; small helpers */
[data-aos-delay="100"] { transition-delay: .1s; }
[data-aos-delay="200"] { transition-delay: .2s; }
[data-aos-delay="300"] { transition-delay: .3s; }
[data-aos-delay="400"] { transition-delay: .4s; }
[data-aos-delay="500"] { transition-delay: .5s; }

/* Hover micro-interactions */
.hover-lift { transition: transform var(--t) var(--ease), box-shadow var(--t); }
.hover-lift:hover { transform: translateY(-6px); }

/* Underline sweep */
.link-sweep { position: relative; }
.link-sweep::after { content:""; position: absolute; left: 0; bottom: -3px; width: 100%; height: 2px; background: var(--c-accent); transform: scaleX(0); transform-origin: right; transition: transform var(--t) var(--ease); }
.link-sweep:hover::after { transform: scaleX(1); transform-origin: left; }

/* Skeleton shimmer for lazy images */
.lazy-img { background: linear-gradient(90deg, #e9f1f7 25%, #f4f9fc 37%, #e9f1f7 63%); background-size: 800px 100%; animation: shimmer 1.5s infinite linear; }
.lazy-img.loaded { animation: none; background: none; }

/* Count-up hidden state avoids flash */
.counter .n { transition: color var(--t); }

/* Page-load fade */
.page-fade { animation: fadeIn .6s ease both; }
