/* ==========================================================================
   Reveal / mask utility classes (driven by GSAP in animations.js)
   ========================================================================== */

[data-reveal] {
  opacity: 0;
  transform: translateY(28px);
}

[data-reveal].is-revealed {
  opacity: 1;
  transform: translateY(0);
}

.no-js [data-reveal],
.reduced-motion [data-reveal] {
  opacity: 1;
  transform: none;
}

[data-mask-reveal] {
  position: relative;
  overflow: hidden;
}

[data-mask-reveal] img {
  clip-path: inset(0 0 0 0);
}

[data-mask-reveal].mask-pending img {
  clip-path: inset(0 0 100% 0);
}

.no-js [data-mask-reveal].mask-pending img,
.reduced-motion [data-mask-reveal].mask-pending img {
  clip-path: inset(0 0 0 0);
}

[data-tilt] {
  transform-style: preserve-3d;
  will-change: transform;
}

.page-transition-curtain {
  position: fixed;
  inset: 0;
  z-index: 950;
  background: var(--black-950);
  transform: translateY(100%);
  pointer-events: none;
}

.route-line-svg path {
  fill: none;
  stroke: var(--gold-300);
  stroke-width: 1.5;
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
  vector-effect: non-scaling-stroke;
}

.fade-in {
  animation: fadeIn var(--dur-slow) var(--ease-out-soft) forwards;
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}
