/* The overlay is created only by the guarded inline script.
   It never traps focus, blocks pointer interaction or modifies page scrolling.
   Discrete CSS-only deadlines protect access even if JS timers/RAF fail. */
.brand-intro {
  position: fixed;
  inset: 0;
  z-index: 10000;
  display: grid;
  place-items: center;
  padding: 2rem;
  background: #f8f5ee;
  pointer-events: none;
  opacity: 1;
  animation: gerober-intro-pending-expire 3000ms step-end forwards;
}
.brand-intro-logo {
  display: block;
  width: min(21rem, 72vw);
  height: auto;
  aspect-ratio: 2051 / 610;
  animation: gerober-intro-reveal 160ms ease-out both;
}
.brand-intro.is-leaving {
  opacity: 0;
  transition: opacity 250ms ease-out;
  animation: none;
}
.brand-intro.is-ready:not(.is-leaving) {
  animation: gerober-intro-expire 2750ms step-end forwards;
}
.brand-intro.is-ready .brand-intro-logo {
  /* Start only after the script has observed the original full-opacity paint.
     Pulse the inner logo continuously; the overlay exit remains separate. */
  animation: gerober-intro-pulse 1000ms ease-in-out infinite;
}
@keyframes gerober-intro-reveal {
  from { opacity: 0; }
  to { opacity: 1; }
}
@keyframes gerober-intro-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: .45; }
}
@keyframes gerober-intro-pending-expire {
  0% { visibility: visible; }
  100% { visibility: hidden; }
}
@keyframes gerober-intro-expire {
  0% { visibility: visible; }
  100% { visibility: hidden; }
}
@media (prefers-reduced-motion: reduce) {
  /* Override the site's blanket animation reset only for discrete emergency
     visibility expiry: no interpolation, fading or movement in reduced mode. */
  .brand-intro { animation: gerober-intro-pending-expire 3000ms step-end forwards !important; }
  .brand-intro.is-ready:not(.is-leaving) { animation: gerober-intro-expire 2750ms step-end forwards !important; }
  .brand-intro-logo { animation: none; }
  .brand-intro.is-ready .brand-intro-logo { animation: none; }
  .brand-intro.is-leaving { transition: none; }
}
