/* DIAGNOXAL MOTION SYSTEM - motion-spec.md v2. Embed presentation sits in
   styles.css, outside this budget (s8). No duration exists outside the token
   set; the spec's literals are calc() over tokens. */
/* Reveals s5: hidden only under .js (JS-off stays visible and static).
   Reveal once, then unobserve. Stagger caps: 5 items, 4 cards. */
.js .reveal { opacity: 0; transform: translateY(var(--rise-md)); transition: var(--reveal-t); }
.js .reveal.in { opacity: 1; transform: none; }
.js .reveal-group > *, .js .reveal-cards > * { opacity: 0; transform: translateY(var(--rise-sm)); transition: var(--reveal-t); }
.js .reveal-group.in > *, .js .reveal-cards.in > * { opacity: 1; transform: none; }
.js .reveal-group.in > *:nth-child(2) { transition-delay: var(--stagger-item); }
.js .reveal-group.in > *:nth-child(3) { transition-delay: calc(var(--stagger-item) * 2); }
.js .reveal-group.in > *:nth-child(4) { transition-delay: calc(var(--stagger-item) * 3); }
.js .reveal-group.in > *:nth-child(n+5) { transition-delay: calc(var(--stagger-item) * 4); }
.js .reveal-cards.in > *:nth-child(2) { transition-delay: var(--stagger-card); }
.js .reveal-cards.in > *:nth-child(3) { transition-delay: calc(var(--stagger-card) * 2); }
.js .reveal-cards.in > *:nth-child(n+4) { transition-delay: calc(var(--stagger-card) * 3); }

/* Hero heading mask s3. */
.hero-line { display: block; overflow: hidden; }
.hero-line > span { display: block; }
.js .hero-line > span { transform: translateY(100%); transition: transform var(--motion-story) var(--ease-emphasis); }
.js .hero-mask.in .hero-line > span { transform: none; }
.js .hero-mask.in .hero-line:nth-child(2) > span { transition-delay: var(--stagger-line); }
.js .hero-lag { opacity: 0; transform: translateY(var(--rise-md));
  transition: opacity var(--motion-reveal) var(--ease-out) var(--hero-lag-delay), transform var(--motion-reveal) var(--ease-out) var(--hero-lag-delay); }
.js .hero-lag.in { opacity: 1; transform: none; }

/* Input demo amendment to s4: four beats, play once, then park on the report.
   The long input/run timings are derived from --motion-story in try-demo.js. */
.try-demo-ready .try-demo-beat.is-active {
  animation: try-demo-in var(--motion-reveal) var(--ease-out) both;
}
@keyframes try-demo-in {
  from { opacity: 0; transform: translateY(var(--rise-sm)); }
  to { opacity: 1; transform: none; }
}
.try-demo-tick {
  transition: background-color var(--motion-fast) var(--ease-inout), border-color var(--motion-fast) var(--ease-inout);
}
.try-demo-control,
.try-demo-report-link,
.try-demo-disclosure summary,
.try-demo-analyze {
  transition: var(--micro-t);
}
.try-demo-analyze.is-pressed {
  transform: translateY(1px);
  transition: transform var(--motion-fast) var(--ease-out);
}

/* A live embed owns attention: cancel any in-flight choreography while it is held. */
.js.embed-held .reveal, .js.embed-held .reveal-group > *, .js.embed-held .reveal-cards > *, .js.embed-held .hero-line > span, .js.embed-held .hero-lag { transition: none !important; }
.js.embed-held .try-demo-beat.is-active { animation: none !important; }

/* Micros s6: transform, opacity, colour only; exits at half the entrance. */
.js .btn { transition: var(--micro-t); }
.js .btn:active, .try-demo-control:active { transform: translateY(1px); transition: transform var(--motion-press) var(--ease-out); }
.js .hover-lift { transition: transform var(--motion-base) var(--ease-out); }
.js .hover-lift:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
.js .hover-lift:not(:hover) { transition-duration: var(--motion-exit); }
.js .link-wipe { position: relative; }
.js .link-wipe::after { content: ""; position: absolute; left: 0; right: 0; bottom: -2px; height: 2px; background: currentColor;
  transform: scaleX(0); transform-origin: left center; transition: transform var(--motion-fast) var(--ease-out); }
.js .link-wipe:hover::after, .js .link-wipe:focus-visible::after { transform: scaleX(1); }
/* Chevron. The s6 grid-rows disclosure technique ships with the .rp stage
   disclosures that consume it (012b stage 2). */
.js .disclose-chev { transition: transform var(--motion-base) var(--ease-out); }
.js [aria-expanded="true"] .disclose-chev { transform: rotate(180deg); }
.try-demo-control:focus-visible, .link-wipe:focus-visible { outline: 2px solid var(--color-cta); outline-offset: 2px; }

/* Reduced motion s9: nothing translates, scales or auto-advances. */
@media (prefers-reduced-motion: reduce) {
  .js .reveal, .js .reveal.in, .js .reveal-group > *, .js .reveal-cards > *, .js .hero-lag {
    opacity: 1 !important; transform: none !important; transition: none !important; transition-delay: 0ms !important; }
  .js .hero-line > span { transform: none !important; transition: none !important; }
  .try-demo-ready .try-demo-beat.is-active,
  .try-demo-tick,
  .try-demo-control,
  .try-demo-report-link,
  .try-demo-disclosure summary,
  .try-demo-analyze { animation: none !important; transition: none !important; transform: none !important; }
  .js .btn:active, .try-demo-control:active, .js .hover-lift:hover { transform: none !important; }
  .js .link-wipe::after, .js .disclose-chev { transition: none !important; }
  .case-accordion-item, .case-accordion-header, .case-accordion-header .accordion-icon,
  .case-accordion-content, .case-accordion-item.open .case-accordion-content { transition: none !important; }
  .case-accordion-header .accordion-icon { transform: none !important; }
  * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; }
}
