/* ============================================================
   Pack — luxury / motion.css

   Reveal vocabulary for the data-reveal-* contract declared by
   the signature structure. Editorial-luxury favours
   continuous scroll-driven per-word fills (the --p variable
   driven by motion.js) for the about manifesto and one-shot
   IntersectionObserver reveals for everything else.

   MOTION-BBOX RULE: every animated element has non-zero bbox
   at rest. Color and transform-based reveals only.
   ============================================================ */

@layer pack {
  /* Hairline divider below section eyebrows — scaleX reveal. */
  .hd-divider {
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform 0.7s var(--ease-standard);
  }
  .hd-divider.is-visible { transform: scaleX(1); }

  /* Per-word color fill on the about manifesto. motion.js drives
     --p (0..1) per word from scroll position. The base color is
     a muted blend with --ink-dim; full --p resolves to --ink. */
  .hd-statement .hd-word {
    transition: color 0.16s linear;
    /* color is computed in style.css using var(--p) via color-mix
       so this layer only carries the transition timing. */
  }

  /* Generic fade-up reveal — opacity + translateY. Used by stats,
     hero badge, anywhere data-reveal-fade is emitted. */
  [data-reveal-fade] {
    opacity: 0;
    transform: translateY(16px);
    transition: opacity 0.6s var(--ease-standard),
                transform 0.6s var(--ease-standard);
  }
  [data-reveal-fade].is-revealed {
    opacity: 1;
    transform: translateY(0);
  }
  [data-reveal-fade][data-reveal-delay="1"] { transition-delay: 0.08s; }
  [data-reveal-fade][data-reveal-delay="2"] { transition-delay: 0.16s; }
  [data-reveal-fade][data-reveal-delay="3"] { transition-delay: 0.24s; }
  [data-reveal-fade][data-reveal-delay="4"] { transition-delay: 0.32s; }
}
