/* ==========================================================================
   Animation layer — entrances, parallax, floats, micro-interactions.
   Everything animates transform/opacity only. Fully disabled under
   prefers-reduced-motion (see the block at the bottom of this file).
   ========================================================================== */

/* ------------------------------------------------- scroll-in entrances */
[data-anim]{
  opacity:0;
  will-change:transform,opacity;
  transition:
    opacity 760ms var(--ease-out),
    transform 760ms var(--ease-out);
  transition-delay:var(--d,0ms);
}
[data-anim="up"]     {transform:translate3d(0,28px,0) scale(.985)}
[data-anim="down"]   {transform:translate3d(0,-24px,0)}
[data-anim="left"]   {transform:translate3d(34px,0,0)}
[data-anim="right"]  {transform:translate3d(-34px,0,0)}
[data-anim="zoom"]   {transform:scale(.93)}
[data-anim="blur"]   {transform:translate3d(0,20px,0);filter:blur(9px)}
[data-anim].is-in{
  opacity:1;
  transform:translate3d(0,0,0) scale(1);
  filter:blur(0);
}
/* release the compositor hint once the entrance has played */
[data-anim].is-done{will-change:auto}

/* --------------------------------------------- hero headline mask reveal */
.reveal-line{display:block;overflow:hidden}
.reveal-line>span{
  display:block;
  transform:translate3d(0,105%,0);
  transition:transform 980ms var(--ease-out);
  transition-delay:var(--d,0ms);
}
.is-hero-in .reveal-line>span{transform:translate3d(0,0,0)}

.hero-fade{
  opacity:0;transform:translate3d(0,22px,0);
  transition:opacity 700ms var(--ease-out),transform 700ms var(--ease-out);
  transition-delay:var(--d,0ms);
}
.is-hero-in .hero-fade{opacity:1;transform:translate3d(0,0,0)}

/* ------------------------------------------------------------- floating */
@keyframes floatY{
  0%,100%{transform:translate3d(0,0,0)}
  50%    {transform:translate3d(0,-11px,0)}
}
@keyframes floatYz{ /* preserves the translateZ on 3D badges */
  0%,100%{transform:translateZ(60px) translateY(0)}
  50%    {transform:translateZ(60px) translateY(-10px)}
}
.float      {animation:floatY 7s var(--ease-io) infinite}
.float--z   {animation:floatYz 7s var(--ease-io) infinite}
.float--d1  {animation-delay:-1.6s}
.float--d2  {animation-delay:-3.2s}
.float--d3  {animation-delay:-4.8s}
.float--slow{animation-duration:9.5s}

/* drifting ambient orbs */
@keyframes drift{
  0%,100%{transform:translate3d(0,0,0) scale(1)}
  33%    {transform:translate3d(3%,-4%,0) scale(1.07)}
  66%    {transform:translate3d(-3%,3%,0) scale(.95)}
}
.orb{animation:drift 26s var(--ease-io) infinite}
.orb--cool{animation-duration:34s;animation-delay:-8s}

/* -------------------------------------------------------- 3D tilt stage */
.tilt{
  transition:transform 480ms var(--ease-out);
  transform-style:preserve-3d;
}
.tilt.is-tilting{transition:transform 90ms linear}

/* --------------------------------------------------------- scroll cue */
@keyframes cueRun{
  0%  {transform:translateY(-100%)}
  100%{transform:translateY(100%)}
}
.scroll-cue__bar::after{
  content:"";display:block;width:100%;height:50%;
  background:var(--frost);
  animation:cueRun 1.9s var(--ease-io) infinite;
}

/* ------------------------------------------------------------- spinner */
@keyframes spin{to{transform:rotate(360deg)}}
.btn__spin{animation:spin .72s linear infinite}

/* ------------------------------------------------------- pulse on call */
@keyframes pulseRing{
  0%  {opacity:.85;transform:scale(1)}
  70% {opacity:0;transform:scale(1.13)}
  100%{opacity:0;transform:scale(1.13)}
}
.mbar__pulse::before{animation:pulseRing 2.4s var(--ease-out) infinite;animation-delay:3s}

/* ------------------------------------------------------- drawer stagger */
@keyframes drawerIn{
  to{opacity:1;transform:translateX(0)}
}
.drawer.is-open .drawer__nav li:nth-child(1){animation-delay:.06s}
.drawer.is-open .drawer__nav li:nth-child(2){animation-delay:.11s}
.drawer.is-open .drawer__nav li:nth-child(3){animation-delay:.16s}
.drawer.is-open .drawer__nav li:nth-child(4){animation-delay:.21s}
.drawer.is-open .drawer__nav li:nth-child(5){animation-delay:.26s}
.drawer.is-open .drawer__nav li:nth-child(6){animation-delay:.31s}
.drawer.is-open .drawer__nav li:nth-child(7){animation-delay:.36s}
.drawer.is-open .drawer__nav li:nth-child(8){animation-delay:.41s}

/* --------------------------------------------- process connector draw-in */
.proc__line path{transition:stroke-dashoffset 1.5s var(--ease-io)}
.proc__line.is-in path{stroke-dashoffset:0}

/* --------------------------------------------------------- review swap */
.rcard{
  animation:cardIn .5s var(--ease-out) both;
  animation-delay:var(--d,0ms);
}
@keyframes cardIn{
  from{opacity:0;transform:translate3d(0,16px,0) scale(.98)}
  to  {opacity:1;transform:translate3d(0,0,0) scale(1)}
}
.rev-grid.is-swapping .rcard{opacity:0;transform:translate3d(0,-10px,0);transition:opacity .18s linear,transform .18s var(--ease-io)}

/* ------------------------------------------------------- custom cursor */
.cursor-dot{
  position:fixed;top:0;left:0;z-index:var(--z-toast);
  width:8px;height:8px;border-radius:50%;
  background:var(--signal-orange);pointer-events:none;
  transform:translate3d(-50%,-50%,0);
  transition:width .25s var(--ease-out),height .25s var(--ease-out),
             background .25s linear,opacity .25s linear;
  opacity:0;mix-blend-mode:screen;
  display:none;
}
@media(hover:hover) and (pointer:fine) and (min-width:1024px){
  .cursor-dot{display:block}
}
.cursor-dot.is-on{opacity:.9}
.cursor-dot.is-hot{
  width:42px;height:42px;background:rgba(245,129,31,.22);
  border:1px solid rgba(245,129,31,.65);
}

/* -------------------------------------------------------- lightbox pop */
@keyframes lbIn{
  from{opacity:0;transform:scale(.94)}
  to  {opacity:1;transform:scale(1)}
}
.lb.is-open img{animation:lbIn .34s var(--ease-out)}

/* ====================================================================== */
/*  REDUCED MOTION — hard stop on every non-essential animation.          */
/* ====================================================================== */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
  html{scroll-behavior:auto}

  /* content must be visible, never stuck in its pre-animation state */
  [data-anim]{opacity:1 !important;transform:none !important;filter:none !important}
  .reveal-line>span{transform:none !important}
  .hero-fade{opacity:1 !important;transform:none !important}
  .rcard{animation:none !important;opacity:1 !important;transform:none !important}
  .proc__line path{stroke-dashoffset:0 !important}

  /* kill perpetual + positional motion outright */
  .float,.float--z,.orb,.scroll-cue__bar::after,.mbar__pulse::before{animation:none !important}
  .float--z{transform:translateZ(60px) !important}
  .hero__layer{transform:none !important}
  .tilt{transform:none !important}
  .cursor-dot{display:none !important}
  .btn::after{display:none}
}
