/* ============================================================
   animations.css — scroll-reveal, keyframes, motion primitives
   ============================================================ */

/* Keyframes */
@keyframes fadeUp { from { opacity: 0; transform: translateY(28px); } to { opacity: 1; transform: translateY(0); } }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes slideLeft { from { opacity: 0; transform: translateX(-40px); } to { opacity: 1; transform: translateX(0); } }
@keyframes slideRight { from { opacity: 0; transform: translateX(40px); } to { opacity: 1; transform: translateX(0); } }
@keyframes pop { 0% { transform: scale(0.6); opacity: 0; } 60% { transform: scale(1.08); } 100% { transform: scale(1); opacity: 1; } }
@keyframes floaty { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-12px); } }

/* ---- Scroll-reveal primitives ----
   Add .reveal (optionally .reveal--left / --right / --fade) to any element.
   Stagger with inline style="--delay: 0.1s".

   IMPORTANT: the hidden state is gated behind `html.js`, which main.js sets as its
   first action. Content is therefore visible by default and only ever hidden when we
   know JS is running to un-hide it again. Without this gate, no-JS visitors, crawlers,
   print output and screenshot tools all render blank bands where these blocks should be.
   (Same safe-default pattern as .hero-slide__content in sections.css.) */
.js .reveal { opacity: 0; transform: translateY(34px); transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out); transition-delay: var(--delay, 0s); will-change: opacity, transform; }
.js .reveal--left { transform: translateX(-44px); }
.js .reveal--right { transform: translateX(44px); }
.js .reveal--fade { transform: none; }
.js .reveal--scale { transform: scale(0.94); }
.js .reveal.in-view { opacity: 1; transform: none; }

/* Reduced-motion: show everything immediately */
@media (prefers-reduced-motion: reduce) {
  .reveal, .js .reveal { opacity: 1 !important; transform: none !important; transition: none !important; }
  .hero-slide__content > * { opacity: 1 !important; transform: none !important; animation: none !important; }
}

/* Print / PDF: never ship a half-transitioned page to paper. */
@media print {
  .reveal, .js .reveal { opacity: 1 !important; transform: none !important; transition: none !important; }
  .hero-slide__content > * { opacity: 1 !important; transform: none !important; animation: none !important; }
}

/* Decorative floating accent (used on hero visuals) */
.floaty { animation: floaty 6s ease-in-out infinite; }