/* motion.css — shared motion primitives. Loaded on every page.
   Prefix: .m-. Tokens only. No layout rules. No color beyond tokens. */

/* Reveal */
.m-rv {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity .7s var(--ease-out), transform .7s var(--ease-out);
}
.m-in {
  opacity: 1;
  transform: none;
}

/* Draw (SVG path trace) */
.m-draw path,
.m-draw line,
.m-draw polyline {
  stroke-dasharray: var(--m-draw-len, 1000);
  stroke-dashoffset: var(--m-draw-len, 1000);
  transition: stroke-dashoffset 1s var(--ease-out);
}
.m-draw.m-drawn path,
.m-draw.m-drawn line,
.m-draw.m-drawn polyline {
  stroke-dashoffset: 0;
}

/* Press */
.m-press { transition: transform .12s var(--ease); }
.m-press:active { transform: scale(.96); }

/* Page crossfade — degrades to nothing on unsupported browsers */
@view-transition { navigation: auto; }

/* Calm: everything off */
html.calm .m-rv,
html.calm .m-in {
  opacity: 1 !important;
  transform: none !important;
  transition: none !important;
}
html.calm .m-draw path,
html.calm .m-draw line,
html.calm .m-draw polyline {
  stroke-dashoffset: 0 !important;
  transition: none !important;
}
html.calm .m-press,
html.calm .m-press:active { transform: none !important; }

/* Kill switch + reduced motion: universal off */
html.nm *,
html.nm *::before,
html.nm *::after {
  animation: none !important;
  transition: none !important;
}
html.nm .m-rv,
html.nm .m-in { opacity: 1 !important; transform: none !important; }
html.nm .m-draw path,
html.nm .m-draw line,
html.nm .m-draw polyline { stroke-dashoffset: 0 !important; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
    scroll-behavior: auto !important;
  }
  .m-rv, .m-in { opacity: 1 !important; transform: none !important; }
  .m-draw path, .m-draw line, .m-draw polyline { stroke-dashoffset: 0 !important; }
}