/* ponytail: shared motion, transform/opacity only */

/* default reveal: CSS transitions; .in added by shell.js (GSAP removed 2026-07-02 - it blocked first paint) */
.reveal {
  opacity: 0; transform: translateY(18px);
  transition: opacity 0.55s cubic-bezier(0.16, 1, 0.3, 1), transform 0.55s cubic-bezier(0.16, 1, 0.3, 1);
}
.reveal.in { opacity: 1; transform: none; }
.reveal.d1 { transition-delay: 0.08s; }
.reveal.d2 { transition-delay: 0.16s; }
.reveal.d3 { transition-delay: 0.24s; }
.reveal.d4 { transition-delay: 0.32s; }
.reveal.d5 { transition-delay: 0.40s; }

/* hero entrance: auto-reveal on load */
.hero-minimal .reveal-auto {
  opacity: 0; transform: translateY(24px);
  transition: opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1), transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
.hero-minimal .reveal-auto.in { opacity: 1; transform: none; }

/* press interaction on interactive cards */
.card:active { transform: none; box-shadow: none; }
.btn:active { transform: none; box-shadow: none; }

.type-cursor::after {
  content: "▋"; animation: eps-blink 1s step-end infinite; margin-left: 2px;
  color: var(--accent);
}
@keyframes eps-blink { 50% { opacity: 0; } }

.scanlines::before {
  content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 100;
  background: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,.12) 2px, rgba(0,0,0,.12) 4px);
  opacity: 0.35;
}

/* --- 2026-07-13 animation pass (travel.html patterns, ported) ------------ */

/* hover-lift for surfaces that aren't .btn/.card (tiles, result cards) */
.lift { transition: transform 0.18s ease, border-color 0.18s ease; }
.lift:hover { transform: none; box-shadow: none; }
.lift:active { transform: none; box-shadow: none; }

/* v27 nav underline sweep (headmaster + primes use .v27-nav-links) */
.v27-nav-links a { position: relative; }
.v27-nav-links a::after {
  content: ""; position: absolute; bottom: -4px; left: 0; width: 0; height: 2px;
  background: var(--btn-bg, #7dd3fc); transition: width 0.25s ease;
}
.v27-nav-links a:hover::after { width: 100%; }

/* dashboard/queue: row entrance (JS adds .row-in + per-row animation-delay) */
@keyframes row-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.row-in { animation: row-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) both; }

/* dashboard/queue: loading placeholders pulse instead of sitting frozen */
@keyframes skel-pulse { 50% { opacity: 0.45; } }
.skel-pulse, .qskel { animation: skel-pulse 1.2s ease-in-out infinite; }

/* dashboard: tab panel eases in on switch */
@keyframes tab-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
.tab-in { animation: tab-in 0.28s cubic-bezier(0.16, 1, 0.3, 1) both; }

@media (prefers-reduced-motion: reduce) {
  .reveal, .hero-minimal .reveal-auto { opacity: 1; transform: none; transition: none; }
  .type-cursor::after { animation: none; }
  .card { transition: none; }
  .card:hover { transform: none; box-shadow: none; }
  .card:active { transform: none; box-shadow: none; }
  .btn, .hamburger { transition: none; }
  .btn:hover, .hamburger:hover { transform: none; box-shadow: none; }
  /* 2026-07-13 pass: freeze the new effects too (+ .demo-dot blink, which
     rides eps-blink on travel.html and was missed by the original block) */
  .lift { transition: none; }
  .lift:hover, .lift:active { transform: none; box-shadow: none; }
  .v27-nav-links a::after { transition: none; }
  .row-in, .tab-in { animation: none; }
  .skel-pulse, .qskel { animation: none; }
  .demo-dot { animation: none; }
}
