/* ============================================================
   utilities.css — helpers, scroll-reveal, text utilities
   ============================================================ */

/* Text */
.text-center { text-align: center; }
.text-balance { text-wrap: balance; }
.text-mono { font-family: var(--f-mono); }
.text-brand { color: var(--c-brand-ink); }
.text-muted { color: var(--c-muted); }
.uppercase { text-transform: uppercase; letter-spacing: var(--tracking-label); }
.nowrap { white-space: nowrap; }

/* Flow / spacing helpers */
.flow-sm { --flow: .6rem; }
.flow-lg { --flow: 1.8rem; }
.mt-0 { margin-top: 0; }
.mt-md { margin-top: var(--sp-md); }
.mt-lg { margin-top: var(--sp-lg); }
.mt-xl { margin-top: var(--sp-xl); }
.mb-lg { margin-bottom: var(--sp-lg); }
.center-x { margin-inline: auto; }

/* Display */
.flex { display: flex; }
.grid { display: grid; }
.items-center { align-items: center; }
.justify-between { justify-content: space-between; }
.gap-sm { gap: var(--sp-sm); }
.gap-md { gap: var(--sp-md); }
.wrap { flex-wrap: wrap; }
.full { width: 100%; }

@media (max-width: 560px) {
  .hide-mobile { display: none !important; }
}

/* ---- Scroll-reveal (IntersectionObserver adds .in-view) ---- */
.reveal {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity var(--dur-4) var(--ease-out), transform var(--dur-4) var(--ease-out);
  transition-delay: calc(var(--i, 0) * 80ms);
  will-change: opacity, transform;
}
.reveal.in-view { opacity: 1; transform: none; }

.reveal-fade { opacity: 0; transition: opacity var(--dur-4) var(--ease-out); transition-delay: calc(var(--i, 0) * 80ms); }
.reveal-fade.in-view { opacity: 1; }

.reveal-scale { opacity: 0; transform: scale(.94); transition: opacity var(--dur-4) var(--ease-out), transform var(--dur-4) var(--ease-out); transition-delay: calc(var(--i, 0) * 80ms); }
.reveal-scale.in-view { opacity: 1; transform: none; }

/* Hero on-load line mask reveal */
.reveal-line > span {
  transform: translateY(110%);
  transition: transform var(--dur-4) var(--ease-out);
  transition-delay: calc(var(--i, 0) * 90ms + 120ms);
}
.is-loaded .reveal-line > span { transform: none; }

/* Reduced motion: show everything immediately, no offsets left hanging */
@media (prefers-reduced-motion: reduce) {
  .reveal, .reveal-fade, .reveal-scale { opacity: 1 !important; transform: none !important; }
  .reveal-line > span { transform: none !important; }
  .orbit__spin, .marquee__track { animation: none !important; }
}
