/* ════════════════════════════════════════════════════════════════════
   perf.css — rendering-performance hints ONLY. Zero visual change.
   View-switch smoothness: containment + compositor promotion so the
   .48s opacity/transform view transition and fkViewIn never re-layout
   the rest of the app. (fkViewIn itself lives in finish-kit.css —
   intentionally NOT duplicated here.)
   ════════════════════════════════════════════════════════════════════ */

/* Each view is an isolated layout island — switching views never
   invalidates layout/style outside the incoming/outgoing sections. */
.view{contain:layout style}

/* The stage hosts every view transition — keep it on the compositor.
   (No position:fixed descendants live inside .view-stage, so the
   containing-block side effect is inert.) */
.view-stage{will-change:transform}

/* Promote the incoming view for its opacity/transform entrance;
   the outgoing view is auto-promoted by the running transition. */
.view.is-active{will-change:opacity,transform}

/* Heavy blended/blurred home-atmosphere layers: pin to their own
   GPU layers so their slow drift never rasterizes per frame.
   (Their keyframes fully specify transform, so a translateZ(0) base
   changes nothing visually.) */
.home-leafshade,
.orbit-home-canopy{transform:translateZ(0);backface-visibility:hidden}

/* ────────────────────────────────────────────────────────────────
   Hidden-view animation freeze. Inactive views stay in the DOM at
   opacity:0 (they are NOT display:none), so every infinite CSS
   animation inside them — home energy flow-pulses, leaves, halo
   glint, orb breathe, spinners, etc. — keeps burning compositor +
   main-thread work off-screen. Freeze animations on every non-active
   view (generalises finish-kit's home-only rule).

   Scope notes:
   · ONLY animations are paused — transitions are untouched, so the
     .48s view enter/exit opacity/transform transitions keep working.
   · animation-play-state is NOT inherited, so pseudo-elements need
     explicit selectors (both the view's own and every descendant's).
   · #intro and the download gate are .screen, not .view — untouched.
   · The rule drops the instant a view gains .is-active, so its
     entrance choreography (incl. home's replayed .home-motion arc)
     runs normally on becoming active.
   · !important is required: many source animations are themselves
     declared with !important.
   · content-visibility:auto deliberately NOT applied — inactive views
     sit within the on-screen view-stage, so it would yield ~zero skip
     while risking a layout shift on switch. Design is sacred. */
.view:not(.is-active),
.view:not(.is-active) *,
.view:not(.is-active)::before,
.view:not(.is-active)::after,
.view:not(.is-active) *::before,
.view:not(.is-active) *::after{animation-play-state:paused!important}
