/* ==========================================================================
   ANIMATIONS — transform/opacity only
   ========================================================================== */

/* Entrance primitives, driven by IntersectionObserver adding .is-in */
[data-anim]{will-change:transform,opacity}
[data-anim="fade-up"]{opacity:0;transform:translate3d(0,38px,0);
  transition:opacity 760ms var(--ease-out),transform 760ms var(--ease-frame)}
[data-anim="fade"]{opacity:0;transition:opacity 860ms var(--ease-out)}
[data-anim="fade-left"]{opacity:0;transform:translate3d(-42px,0,0);
  transition:opacity 760ms var(--ease-out),transform 760ms var(--ease-frame)}
[data-anim="fade-right"]{opacity:0;transform:translate3d(42px,0,0);
  transition:opacity 760ms var(--ease-out),transform 760ms var(--ease-frame)}
[data-anim="zoom"]{opacity:0;transform:scale(.93);
  transition:opacity 760ms var(--ease-out),transform 860ms var(--ease-frame)}
[data-anim="wipe"]{clip-path:inset(0 100% 0 0);
  transition:clip-path 1000ms var(--ease-frame)}

[data-anim].is-in{opacity:1;transform:translate3d(0,0,0) scale(1);clip-path:inset(0 0 0 0)}
[data-anim]{transition-delay:calc(var(--stagger-index,0) * 78ms)}
[data-anim].is-in{will-change:auto}

/* Split-text headline mask reveal */
.split-line{display:block;overflow:hidden}
.split-word{display:inline-block;transform:translateY(105%);
  transition:transform 900ms var(--ease-frame);
  transition-delay:calc(var(--w,0) * 62ms)}
.is-in .split-word,.split-ready.is-in .split-word{transform:translateY(0)}

/* Particles */
.particles{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:2}
.particle{
  position:absolute;width:3px;height:3px;border-radius:50%;
  background:var(--gilt);opacity:.34;will-change:transform;
  animation:particleRise var(--pd,20s) linear infinite;animation-delay:var(--pdelay,0s)
}
@keyframes particleRise{
  0%{transform:translate3d(0,0,0);opacity:0}
  12%{opacity:.4}
  88%{opacity:.28}
  100%{transform:translate3d(var(--px,22px),-108vh,0);opacity:0}
}

/* Magnetic buttons */
.magnetic{will-change:transform;transition:transform 340ms var(--ease-out)}

/* Tab panel cross-fade */
.tab-panel{display:none}
.tab-panel.is-active{display:block;animation:panelIn 460ms var(--ease-out)}
@keyframes panelIn{from{opacity:0;transform:translate3d(0,14px,0)}to{opacity:1;transform:none}}

/* Count-up guards against CLS */
[data-count]{font-variant-numeric:tabular-nums}

/* ==========================================================================
   REDUCED MOTION — disable parallax, tilt, particles, cursor, drift
   ========================================================================== */
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    transition-delay:0ms !important;
    scroll-behavior:auto !important
  }
  [data-anim]{opacity:1 !important;transform:none !important;clip-path:none !important}
  .split-word{transform:none !important}
  .particles,.custom-cursor,.hero__glow{display:none !important}
  .float-frame{animation:none !important;transform:none !important}
  .hero__bg{transform:none !important}
  .btn::after{display:none}
  .sticky-bar__call{animation:none}
  /* Preloader must never remain over the page when motion is reduced */
  .preloader{display:none !important;visibility:hidden !important}
}
