/* ============================================================
   FOREVER IN FRAME — ANIMATION LAYER
   Restraint is the brief (§43). Nothing bounces, nothing spins
   for its own sake.
   ============================================================ */

/* ---------- boot ------------------------------------------ */
body.is-loading .hero-content,
body.is-loading .hero-marks{opacity:0}
body:not(.is-loading) .hero-content{
  animation:fifRise 1s var(--ease-out) .15s both;
}
body:not(.is-loading) .hero-marks{
  animation:fifFade 1s var(--ease-out) .55s both;
}
@keyframes fifRise{from{opacity:0;transform:translateY(22px)}to{opacity:1;transform:none}}
@keyframes fifFade{from{opacity:0}to{opacity:1}}

/* ---------- scroll cue ------------------------------------ */
.cue-arrow{
  display:block;font-size:.9rem;line-height:1;
  animation:cueDrift 2.6s var(--ease) infinite;
}
@keyframes cueDrift{
  0%,100%{transform:translateY(-3px);opacity:.55}
  50%    {transform:translateY(3px); opacity:1}
}

/* ---------- neon breathing (§43) -------------------------- */
.cta-halo{animation:halo 9s ease-in-out infinite}
@keyframes halo{
  0%,100%{opacity:.75;transform:translate(-50%,-50%) scale(1)}
  50%    {opacity:1;  transform:translate(-50%,-50%) scale(1.06)}
}
.orbit-path{animation:orbitDash 26s linear infinite}
@keyframes orbitDash{to{stroke-dashoffset:-400}}

/* ---------- generic reveal (driven by ScrollTrigger) ------ */
[data-reveal]{
  opacity:0;
  transform:translateY(26px);
  will-change:opacity,transform;
}
[data-reveal].is-in{
  opacity:1;transform:none;
  transition:opacity .9s var(--ease-out),transform .9s var(--ease-out);
}
/* stagger children of a revealed group */
[data-reveal].is-in{transition-delay:var(--rd,0ms)}

/* ---------- mask reveal for section titles ---------------- */
.section-head .display .line{
  display:block;
  clip-path:inset(0 0 110% 0);
  transform:translateY(.18em);
  transition:clip-path .95s var(--ease-out),transform .95s var(--ease-out);
}
.section-head .display.is-in .line{clip-path:inset(0 0 -20% 0);transform:none}
.section-head .display.is-in .line:nth-child(2){transition-delay:.09s}
.section-head .display.is-in .line:nth-child(3){transition-delay:.18s}

/* ---------- photo-booth flash (§25) ----------------------- */
.flash-layer.is-firing{animation:boothFlash .65s var(--ease) 1}
@keyframes boothFlash{
  0%  {opacity:0}
  7%  {opacity:.92}
  18% {opacity:.10}
  26% {opacity:.55}
  100%{opacity:0}
}

/* ---------- LED cabin glow -------------------------------- */
.cabin-media.is-inside .cabin-glow{opacity:.85}

/* ---------- menu entrance --------------------------------- */
.mobile-menu:not([hidden]){animation:menuIn .5s var(--ease-out) both}
.mobile-menu:not([hidden]) ul li{animation:menuItem .55s var(--ease-out) both}
.mobile-menu:not([hidden]) ul li:nth-child(1){animation-delay:.06s}
.mobile-menu:not([hidden]) ul li:nth-child(2){animation-delay:.12s}
.mobile-menu:not([hidden]) ul li:nth-child(3){animation-delay:.18s}
.mobile-menu:not([hidden]) ul li:nth-child(4){animation-delay:.24s}
.mobile-menu:not([hidden]) ul li:nth-child(5){animation-delay:.30s}
@keyframes menuIn{from{opacity:0}to{opacity:1}}
@keyframes menuItem{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
