/* Theme-wide blur + slide text reveal (block-level; no word splits).
   Uses `translate` (not `transform`) so Figma absolute centering survives.
   Transition lives on `.is-in` only so the initial hide snaps (no animate-to-hidden). */
.tvl-text-reveal {
  opacity: 0;
  filter: blur(10px);
  translate: 0 18px;
  will-change: opacity, filter, translate;
}

.tvl-text-reveal.is-in {
  opacity: 1;
  filter: blur(0);
  translate: 0 0;
  transition:
    opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
    filter 0.7s cubic-bezier(0.22, 1, 0.36, 1),
    translate 0.7s cubic-bezier(0.22, 1, 0.36, 1);
}

@media (max-width: 768px) {
  html.tvl-mobile .tvl-text-reveal {
    filter: blur(6px);
    translate: 0 8px;
  }

  html.tvl-mobile .tvl-text-reveal.is-in {
    filter: blur(0);
    translate: 0 0;
    transition-duration: 0.45s;
  }
}

@media (prefers-reduced-motion: reduce) {
  .tvl-text-reveal,
  .tvl-text-reveal.is-in {
    opacity: 1 !important;
    filter: none !important;
    translate: none !important;
    transition: none !important;
    will-change: auto !important;
  }
}

html.tvl-test-freeze .tvl-text-reveal,
html.tvl-test-freeze .tvl-text-reveal.is-in {
  opacity: 1 !important;
  filter: none !important;
  translate: none !important;
  transition: none !important;
  will-change: auto !important;
}
