/* =========================================================================
   ANIMATION UTILITIES
   -------------------------------------------------------------------------
   "Luxury through restraint": short, deliberate reveals, no perpetual
   motion. Every rule here is opt-in via a data attribute so components
   stay declarative. No-JS visitors see full, static content — the hidden
   starting state only applies once .js-enabled is present (see the inline
   script in <head>), and prefers-reduced-motion collapses everything to
   an instant, non-animated state (see tokens.css durations + the query
   below).
   ========================================================================= */

/* ---- Scroll reveal ------------------------------------------------------*/

[data-reveal] {
  opacity: 1;
  transform: none;
}

.js-enabled [data-reveal] {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity var(--dur-reveal) var(--ease-luxe),
              transform var(--dur-reveal) var(--ease-luxe);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}

.js-enabled [data-reveal].is-revealed {
  opacity: 1;
  transform: none;
}

@media (prefers-reduced-motion: reduce) {
  .js-enabled [data-reveal] {
    opacity: 1;
    transform: none;
  }
}

/* ---- Parallax -------------------------------------------------------
   Elements move via a transform set in JS (translate3d) so this class
   only needs to promise a compositor layer + smoothing. */

[data-parallax] {
  will-change: transform;
}

@media (prefers-reduced-motion: reduce) {
  [data-parallax] {
    transform: none !important;
  }
}

/* ---- Shared micro-interactions ------------------------------------------*/

.hoverzoom { overflow: hidden; }
.hoverzoom img {
  transition: transform var(--dur-slow) var(--ease-out-soft);
}
.hoverzoom:hover img,
.hoverzoom:focus-within img {
  transform: scale(1.045);
}

@media (prefers-reduced-motion: reduce) {
  .hoverzoom img { transition: none; }
  .hoverzoom:hover img, .hoverzoom:focus-within img { transform: none; }
}

.fade-in {
  animation: opulence-fade-in var(--dur-med) var(--ease-out-soft) both;
}

@keyframes opulence-fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

.rise-in {
  animation: opulence-rise-in var(--dur-med) var(--ease-luxe) both;
}

@keyframes opulence-rise-in {
  from { opacity: 0; transform: translateY(16px); }
  to { opacity: 1; transform: none; }
}
