/* Control Room — curated motion layer (proof).
   Lightweight versions of the pack effects: scramble/decode, count-up, scroll
   reveal, radar sweep, scanline. All animation is gated behind
   prefers-reduced-motion:no-preference, so reduced-motion users get the static page. */

@media (prefers-reduced-motion: no-preference){

  /* faint animated scanline over the whole console */
  body.motion::after{
    content:"";position:fixed;inset:0;pointer-events:none;z-index:9998;opacity:.5;
    background:repeating-linear-gradient(0deg, rgba(87,192,122,.035) 0 1px, transparent 1px 3px);
    animation:cr-scan 7s linear infinite;
  }
  @keyframes cr-scan{to{background-position:0 96px}}

  /* radar sweep on the lead viz */
  .motion .win .viz{position:relative}
  .motion .win .viz::after{
    content:"";position:absolute;inset:-25%;pointer-events:none;
    background:conic-gradient(from 0deg at 50% 50%, transparent 0deg, rgba(87,192,122,.20) 26deg, transparent 60deg);
    animation:cr-sweep 4.2s linear infinite;
  }
  @keyframes cr-sweep{to{transform:rotate(360deg)}}

  /* scroll-reveal for the feed blocks */
  .motion .blk{opacity:0;transform:translateY(16px)}
  .motion .blk.in{opacity:1;transform:none;transition:opacity .55s ease, transform .55s cubic-bezier(.2,.7,.2,1)}

  /* lead panel eases in on load */
  .motion .feature .win{opacity:0;transform:translateY(10px);animation:cr-rise .7s .05s ease forwards}
  @keyframes cr-rise{to{opacity:1;transform:none}}

  /* status LED breathing on the live dot */
  .motion .statusbar .live::before{animation:blink 1.6s steps(1) infinite, cr-glow 2.4s ease-in-out infinite}
  @keyframes cr-glow{50%{text-shadow:0 0 10px var(--conf)}}

  /* decode caret while text scrambles */
  .cr-scrambling::after{content:"▍";color:var(--sig);margin-left:2px;opacity:.8}
}
