/* =========================================================
   PUSHPANJALI VILLA — ANIMATION SYSTEM
   Base (hidden) states for GSAP-driven reveals live here.
   GSAP (assets/js/animations.js) animates these to their
   visible state on scroll. Keep it subtle — this is a
   luxury hospitality site, not a startup landing page.
   ========================================================= */

@keyframes pvscroll{
  0%{opacity:1;transform:scaleY(.4);transform-origin:top;}
  50%{opacity:1;transform:scaleY(1);transform-origin:top;}
  100%{opacity:0;transform:scaleY(.4);transform-origin:bottom;}
}

/* Reveal base states — GSAP flips these to opacity:1 / translate(0) */
.reveal-up{opacity:0;transform:translateY(36px);}
.reveal-left{opacity:0;transform:translateX(-44px);}
.reveal-right{opacity:0;transform:translateX(44px);}
.reveal-fade{opacity:0;}
.reveal-scale{opacity:0;transform:scale(.94);}

/* Text reveal: each line/word wrapped in a span by animations.js */
.reveal-text{overflow:hidden;display:block;}
.reveal-text .rt-line{display:block;transform:translateY(110%);}

/* No-JS / reduced-motion fallback — content must never be stuck invisible */
.no-js .reveal-up,.no-js .reveal-left,.no-js .reveal-right,.no-js .reveal-fade,.no-js .reveal-scale,
.no-js .rt-line{opacity:1 !important;transform:none !important;}

@media (prefers-reduced-motion: reduce){
  .reveal-up,.reveal-left,.reveal-right,.reveal-fade,.reveal-scale,.rt-line{opacity:1 !important;transform:none !important;transition:none !important;}
  .hero-scroll .line{animation:none;}
}

/* Legacy class kept as an alias so nothing silently breaks */
.fade-up{opacity:0;transform:translateY(28px);transition:opacity .7s ease, transform .7s ease;}
.fade-up.in{opacity:1;transform:translateY(0);}

/* Hover-zoom utility (used outside card components, e.g. inline images) */
.hover-zoom{overflow:hidden;}
.hover-zoom img{transition:transform var(--dur-med) var(--ease-luxury);}
.hover-zoom:hover img{transform:scale(1.07);}
