/* ==========================================================================
   S2 Homes — Animation helpers
   (AOS + GSAP handle most scroll reveals; these are supporting keyframes)
   ========================================================================== */

@keyframes floatY {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-14px); }
}
.float-anim { animation: floatY 5s ease-in-out infinite; }

@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(30px); }
  to { opacity: 1; transform: translateY(0); }
}
.fade-in-up { animation: fadeInUp 0.8s ease forwards; }

@keyframes textReveal {
  from { transform: translateY(110%); }
  to { transform: translateY(0); }
}
.hero h1 .reveal-text { animation: textReveal 0.9s cubic-bezier(0.65, 0, 0.35, 1) both; }
.hero h1 .line:nth-child(1) .reveal-text { animation-delay: 0.15s; }
.hero h1 .line:nth-child(2) .reveal-text { animation-delay: 0.32s; }
.hero h1 .line:nth-child(3) .reveal-text { animation-delay: 0.48s; }
.hero-sub { animation: fadeInUp 0.8s ease 0.7s both; }
.hero-actions { animation: fadeInUp 0.8s ease 0.9s both; }
.hero-eyebrow { animation: fadeInUp 0.8s ease 0.05s both; }
.scroll-cue { animation: fadeInUp 0.8s ease 1.2s both; }

/* Gradient text shimmer for gold accents (used sparingly) */
@keyframes shimmer {
  0% { background-position: 0% 50%; }
  100% { background-position: 200% 50%; }
}

/* Card entrance stagger driven by AOS delay attributes in HTML */

/* Loading spinner (form submit) */
.spin-loader {
  width: 18px; height: 18px;
  border: 2px solid rgba(255,255,255,0.4);
  border-top-color: currentColor;
  border-radius: 50%;
  animation: spin 0.7s linear infinite;
  display: inline-block;
}

/* Number counter pop */
@keyframes countPop {
  0% { transform: scale(0.85); opacity: 0; }
  100% { transform: scale(1); opacity: 1; }
}
.stat-number.counted { animation: countPop 0.4s ease; }
