/* ONLYDROP v48 — motion-performance budget.
   Keep the visual language, stop expensive perpetual repaints and avoid
   allocating GPU layers for every decorative element on the page. */

/* Animated filter, hue-rotation and gradient-position force repaints.
   Leave the textured overlay in place but keep it static. */
#home .category-visual::before {
  animation: none !important;
}
#home .category-slide.is-active img {
  /* Keep the slow cinematic drift; drop the infinite animated hue filter. */
  animation: demoImageDrift 7.5s ease-in-out both !important;
}

/* Static large background textures no longer require continuous transforms. */
#home .od-city { animation: none !important; }
#home .deco-hud-frame { animation: none !important; }
#home .deco-hud-radar { animation: none !important; }
#home .deco-hud-cross { animation: none !important; }

/* Category transforms are still interactive on hover, but no longer
   levitate forever (which kept all five cards in GPU compositor layers). */
#home .category-card {
  animation: none !important;
  will-change: auto !important;
}
#home .category-card .type-lettering,
#home .category-card .collage-piece,
#home .collage-deco,
#home .od-collage > * {
  will-change: auto !important;
}

/* WebGL canvas and particle canvases use JS-controlled motion only. */
#hero3d, #particleCanvas { will-change: auto !important; }

/* Pause CSS motion when content cannot be seen. The page view controller
   updates od-home-inactive; the shared motion controller handles tab state. */
html.od-home-inactive #home *,
html.od-home-inactive #home *::before,
html.od-home-inactive #home *::after,
html.od-tab-hidden *,
html.od-tab-hidden *::before,
html.od-tab-hidden *::after,
html.motion-paused *,
html.motion-paused *::before,
html.motion-paused *::after {
  animation-play-state: paused !important;
}

/* Soften the permanently running decorative motion in the secondary pages
   without removing the original compositions and entrance transitions. */
#work .section-decor img,
#about .section-decor img,
#contact .section-decor img {
  animation: none !important;
}

/* Lighter fallback on slow hardware. */
html[data-od-lite="true"] #home .od-helmet,
html[data-od-lite="true"] #home .od-slash,
html[data-od-lite="true"] #home .od-cross,
html[data-od-lite="true"] #home .od-spark {
  animation: none !important;
}

@media (prefers-reduced-motion: reduce) {
  #home .category-slide.is-active img { animation: none !important; }
  #home .od-helmet,
  #home .od-slash,
  #home .od-cross,
  #home .od-spark { animation: none !important; }
}

/* These two full-screen blurred color fields are expensive to animate because
   every frame requires processing a large filtered surface. The colors remain. */
#home.index-panel::before,
#home.index-panel::after {
  animation: none !important;
}

/* Full-page blend/filter on moving canvas requires an extra compositing pass.
   Keep the noise texture and the particles without those continuous passes. */
.grain { mix-blend-mode: normal !important; opacity: .07 !important; }
#home .particle-canvas { mix-blend-mode: normal !important; filter: none !important; }
#home .index-3d-stage { filter: none !important; }

/* The fallback illustration should still be visible but doesn't need to spin
   offscreen or when WebGL isn't available. */
html.od-home-inactive .index-3d-fallback *,
html.od-tab-hidden .index-3d-fallback * { animation-play-state: paused !important; }

html.motion-paused .od-dot,
html.motion-paused .od-ring,
html.od-tab-hidden .od-dot,
html.od-tab-hidden .od-ring { opacity: 0 !important; }
