/* Diagonal entry-reveal utility. Pairs with js/anim.js — see js/charts/API.md.
 *
 * Scoped entirely to .anim-el, a class js/anim.js adds itself right before it
 * starts observing an element. If JS never runs, this class is never added,
 * so the hidden state never applies — failure mode is "no animation", never
 * "blank page". No bare-element or `*` rules here.
 */

.anim-el{
  opacity:0;
  transform:translate3d(calc(var(--t, 6px) * -1), calc(var(--t, 6px) * -1), 0);
  transition:
    opacity .26s var(--ease, cubic-bezier(.22,.61,.36,1)) var(--d, 0ms),
    transform .26s var(--ease, cubic-bezier(.22,.61,.36,1)) var(--d, 0ms);
  will-change:opacity, transform;
}

.anim-el.is-in{
  opacity:1;
  transform:none;
}

/* Reduced motion / no-IntersectionObserver fallback path: shown immediately,
   no transition, no transform. */
.anim-el.anim-instant{
  opacity:1;
  transform:none;
  transition:none;
  will-change:auto;
}

@media (prefers-reduced-motion: reduce){
  .anim-el{
    opacity:1;
    transform:none;
    transition:none;
    will-change:auto;
  }
}
