/* THE XTHS — animations.css — keyframes + motion kill-switches.
   New: vibBG / vibTXT (VIBGYOR on the hazard stripe). Removed: ptin.
   glitchA/B kept — the masthead's RGB slice glitch stays by design. */

@keyframes spin{to{transform:rotate(360deg)}}
@keyframes blink{50%{opacity:0}}
@keyframes grain{
  0%,100%{transform:translate(0,0)} 20%{transform:translate(-2%,2%)}
  40%{transform:translate(2%,-1%)} 60%{transform:translate(-1%,-2%)} 80%{transform:translate(1%,2%)}
}

/* VIBGYOR breathing (text stroke + fill) */
@keyframes vib{
  0%,100%{color:#9D4EDD} 14%{color:#5A4FF3} 28%{color:#2D9CFF} 42%{color:#3DDC84}
  57%{color:#FFD60A} 71%{color:#FF8C1A} 85%{color:#FF3B5C}
}
@keyframes vibStroke{
  0%,100%{-webkit-text-stroke-color:#9D4EDD} 14%{-webkit-text-stroke-color:#5A4FF3}
  28%{-webkit-text-stroke-color:#2D9CFF} 42%{-webkit-text-stroke-color:#3DDC84}
  57%{-webkit-text-stroke-color:#FFD60A} 71%{-webkit-text-stroke-color:#FF8C1A}
  85%{-webkit-text-stroke-color:#FF3B5C}
}
@keyframes vibBorder{
  0%,100%{border-color:#9D4EDD} 14%{border-color:#5A4FF3} 28%{border-color:#2D9CFF}
  42%{border-color:#3DDC84} 57%{border-color:#FFD60A} 71%{border-color:#FF8C1A}
  85%{border-color:#FF3B5C}
}

/* hazard-stripe: base color and matching "TRAILER" text, same clock */
@keyframes vibBG{
  0%,100%{background-color:#9D4EDD} 14%{background-color:#5A4FF3} 28%{background-color:#2D9CFF}
  42%{background-color:#3DDC84} 57%{background-color:#FFD60A} 71%{background-color:#FF8C1A}
  85%{background-color:#FF3B5C}
}
@keyframes vibTXT{
  0%,100%{color:#9D4EDD} 14%{color:#5A4FF3} 28%{color:#2D9CFF} 42%{color:#3DDC84}
  57%{color:#FFD60A} 71%{color:#FF8C1A} 85%{color:#FF3B5C}
}

/* masthead glitch — idle ~87%, then hard slice bursts */
@keyframes glitchA{
  0%,86%,100%{transform:translate(0,0);clip-path:inset(0 0 0 0)}
  87%{transform:translate(-.05em,.012em);clip-path:inset(6% 0 64% 0)}
  90%{transform:translate(.038em,-.014em);clip-path:inset(56% 0 8% 0)}
  93%{transform:translate(-.025em,.006em);clip-path:inset(28% 0 42% 0)}
  96%{transform:translate(.042em,-.008em);clip-path:inset(0 0 80% 0)}
}
@keyframes glitchB{
  0%,86%,100%{transform:translate(0,0);clip-path:inset(0 0 0 0)}
  88%{transform:translate(.05em,-.01em);clip-path:inset(62% 0 6% 0)}
  91%{transform:translate(-.036em,.012em);clip-path:inset(10% 0 60% 0)}
  94%{transform:translate(.028em,-.006em);clip-path:inset(40% 0 30% 0)}
  97%{transform:translate(-.044em,.01em);clip-path:inset(76% 0 2% 0)}
}

/* curtain logo — frame 2: scale UP, settle DOWN */
@keyframes ptLogo{
  0%{transform:scale(.55);opacity:0}
  45%{transform:scale(1.22);opacity:1}
  70%{transform:scale(1.16)}
  100%{transform:scale(1);opacity:1}
}
@keyframes trackIn{to{opacity:1;transform:none}}

/* reveal gating */
.js [data-reveal]{opacity:0}
.js.motion-off [data-reveal]{opacity:1}

@media (prefers-reduced-motion: reduce){
  html:not(.motion-force) *,
  html:not(.motion-force) *::before,
  html:not(.motion-force) *::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
  html:not(.motion-force) .js [data-reveal]{opacity:1}
  html:not(.motion-force) .grain{animation:none}
  html:not(.motion-force) .svc-float{display:none !important}
}
html.motion-off *,
html.motion-off *::before,
html.motion-off *::after{
  animation-duration:.01ms !important;
  animation-iteration-count:1 !important;
  transition-duration:.01ms !important;
  scroll-behavior:auto !important;
}
html.motion-off .grain{animation:none}
html.motion-off .svc-float{display:none !important}