/* 90 · motion states shared across the page.
   The pull: sections arrive as the reader reaches them; after stillness one thing in view invites them back.
   Honest pulls only: curiosity and real progress, never a fake timer, count, scarcity or guilt. */

/* off stage: a looping part out of view holds still (module.phase) */
.is-asleep,.is-asleep *,.is-asleep::before,.is-asleep::after,.is-asleep *::before,.is-asleep *::after{animation-play-state:paused!important}

.is-reveal{opacity:.4;translate:0 14px;transition:opacity var(--t3) var(--e),translate var(--t3) var(--e)}
.is-reveal.is-in{opacity:1;translate:none}

/* a state change lives in the shape: the outline flares in its gem, then settles */
.rw-engine.is-lit .rw-radar__outline{animation:rw-lit 1.3s var(--e)}
@keyframes rw-lit{0%{filter:none}22%{filter:drop-shadow(0 0 7px var(--gem-3)) drop-shadow(0 0 2px var(--gem-1))}100%{filter:none}}

/* nudges: one at a time, never more than one every few beats */
.rw-engine.is-nudge{border-color:var(--pc)}
.rw-engine.is-nudge .rw-radar{animation:rw-pulse 1.4s var(--e)}
@keyframes rw-pulse{0%,100%{scale:1}35%{scale:1.035}}
.rw-card.is-nudge .rw-card__body{animation:rw-lift 1.6s var(--e)}
@keyframes rw-lift{0%,100%{translate:0 0}30%{translate:0 -7px}}
.rw-card.is-nudge .rw-card__face--cover .rw-gloss{animation:rw-sweep 1.6s var(--e)}
@keyframes rw-sweep{0%{transform:translate(55%,40%);opacity:0}25%{opacity:.75}100%{transform:translate(-30%,-30%);opacity:0}}
.rw-btn.is-nudge{animation:rw-glint 1.6s var(--e)}
@keyframes rw-glint{40%{text-shadow:0 0 14px color-mix(in srgb,var(--rw-cta-ink) 85%,transparent)}}

@media (prefers-reduced-motion:reduce){
  .is-reveal{opacity:1;translate:none}
  .rw-engine.is-lit .rw-radar__outline,.rw-engine.is-nudge .rw-radar,.rw-card.is-nudge .rw-card__body,.rw-card.is-nudge .rw-gloss,.rw-btn.is-nudge{animation:none}
}
