/* ── Shared reveal rules for js/motion.js ─────────────────────────────────
   Loaded BLOCKING (a plain <link>, never the preload→swap pattern used for
   the non-critical styles): an opacity:0 rule arriving after first paint
   would flash content in and then hide it.

   Everything is scoped under .motion-on, which motion.js adds to <html> only
   after its reduced-motion/support guards pass — so the hiding rule exists
   only while the script that reverses it is running, and it outranks bare
   page-level class rules that land later in the cascade. With JS off,
   nothing on the page is ever hidden.

   One definition for every surface: modern-layout.html and the standalone
   dashboard both link this file. Duplicating these rules inline is how the
   timing forked the last time. */
.motion-on .reveal {
    opacity: 0;
    transform: translateY(14px);
    transition: opacity var(--dur-focal) var(--ease-out),
                transform var(--dur-focal) var(--ease-out);
}
.motion-on .reveal.in { opacity: 1; transform: none; }

/* A reveal that never fires must never be the reason content is invisible —
   on paper (the report is printed and filed) or for a reduced-motion
   visitor. */
@media (prefers-reduced-motion: reduce) {
    .motion-on .reveal {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }
}
@media print {
    .motion-on .reveal {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }
}
