/* ==========================================================================
   Animations & Reveal Effects — Global Property Escape
   All effects respect prefers-reduced-motion (handled in styles.css section 28)
   ========================================================================== */

/* Keyframes */
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(24px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeInDown {
  from { opacity: 0; transform: translateY(-20px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes zoomIn {
  from { opacity: 0; transform: scale(0.96); }
  to { opacity: 1; transform: scale(1); }
}
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes shimmer {
  0% { background-position: 100% 0; }
  100% { background-position: -100% 0; }
}
@keyframes toastIn {
  from { opacity: 0; transform: translateX(40px); }
  to { opacity: 1; transform: translateX(0); }
}
@keyframes toastOut {
  from { opacity: 1; transform: translateX(0); }
  to { opacity: 0; transform: translateX(40px); }
}
@keyframes pulseDot {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.6; transform: scale(0.85); }
}
@keyframes bounceIn {
  0% { opacity: 0; transform: scale(0.5); }
  60% { transform: scale(1.08); }
  100% { opacity: 1; transform: scale(1); }
}
@keyframes floatUp {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
}

/* Reveal on scroll — elements get .reveal, JS adds .in-view */
.reveal {
  opacity: 0;
  transform: translate3d(0, 28px, 0);
  transition: opacity 0.65s ease, transform 0.65s var(--ease-smooth);
  will-change: opacity, transform;
  backface-visibility: hidden;
}
.reveal.in-view { opacity: 1; transform: translate3d(0, 0, 0); }
.reveal-left { transform: translate3d(-32px, 0, 0); }
.reveal-right { transform: translate3d(32px, 0, 0); }
.reveal-zoom { transform: scale(0.94); }
.reveal-left.in-view, .reveal-right.in-view, .reveal-zoom.in-view { transform: none; }

/* Stagger helpers (set transition-delay inline via --d) */
.stagger > * { transition-delay: calc(var(--d, 0) * 1ms); }

/* Property card entrance */
.property-card.enter { animation: fadeInUp 0.5s ease both; }

/* Hero entrance sequence */
.hero .hero-badge-anim { animation: fadeInDown 0.6s ease both; }
.hero .hero-title-anim { animation: fadeInUp 0.7s 0.1s ease both; }
.hero .hero-subtitle-anim { animation: fadeInUp 0.7s 0.2s ease both; }
.hero .hero-actions-anim { animation: fadeInUp 0.7s 0.3s ease both; }
.hero .hero-search-wrap { animation: fadeInUp 0.8s 0.35s ease both; }

/* Gallery transitions */
.gallery-main img.fade-swap { animation: fadeIn 0.4s ease; }

/* Save button heart pop */
.save-btn.saved svg { animation: bounceIn 0.35s ease; }

/* Live badge pulse */
.live-dot { animation: pulseDot 1.6s ease infinite; }

/* Toast container entrance handled per-toast */
