/* ============================================================
   Animation-ready state classes
   Elements start "hidden" via CSS; GSAP tweens them in.
   These defaults also act as a no-JS graceful fallback (visible).
   ============================================================ */

[data-reveal]{
  opacity:0;
  transform:translateY(36px);
}
[data-reveal="fade"]{ transform:none; }
[data-reveal="mask"]{ opacity:1; }

.js-ready [data-reveal]{ opacity:0; }
.no-js [data-reveal]{ opacity:1 !important; transform:none !important; }

.mask-wrap{ overflow:hidden; display:block; }

.split-line{ overflow:hidden; }
.split-line > span{ display:inline-block; }

/* Page load veil */
.veil{
  position:fixed; inset:0; z-index:999;
  background:var(--navy-950);
  display:flex; align-items:center; justify-content:center;
  flex-direction: column;
  gap: 18px;
}
.veil-word{
  font-family:var(--f-display); font-style:italic; font-weight:400;
  color:var(--paper); font-size:1.4rem; letter-spacing:.02em;
  overflow:hidden;
}
.veil-bar{ width:200px; height:1px; background:rgba(247,245,239,.2); position:relative; overflow:hidden; }
.veil-bar i{ position:absolute; inset:0; width:0%; background:var(--gold-400); }

/* Custom cursor dot for magnetic buttons / gallery */
.cursor-dot{
  position:fixed; top:0; left:0; z-index:998; pointer-events:none;
  width:10px; height:10px; border-radius:50%;
  background:var(--gold-400); mix-blend-mode:difference;
  transform:translate(-50%,-50%);
  opacity:0; transition:opacity .3s;
}
.cursor-dot.active{ opacity:1; }

/* Fade-in image utility used with ScrollTrigger scrub scale */
.scale-img{ overflow:hidden; }
.scale-img img{ will-change:transform; }

@keyframes softFloat{
  0%,100%{ transform:translateY(0); }
  50%{ transform:translateY(-14px); }
}
.floaty{ animation:softFloat 6s ease-in-out infinite; }
