/* NINJA TRADES — site-wide full-viewport plasma/wavy backdrop.
   Adapted from APEX-UI ShaderBackground.jsx (MIT; 21st.dev via APEX CREDITS).
   Stacking: fixed canvas at z-index:-1 inside isolated body — do NOT blanket
   z-index:1 on topbar+desk siblings (that trapped dropdowns under Status). */

body {
  isolation: isolate;
}

body #wave-bg.wave-bg,
body #studio-wave-bg.studio-wave-bg,
body #studio-wave-bg.wave-bg {
  position: fixed;
  inset: 0;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  max-width: none;
  max-height: none;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  z-index: -1;
  pointer-events: none;
  opacity: 0.16;
  transition: opacity 0.5s ease;
  display: block;
}

/* Modals / overlays above page chrome */
body > .au-backdrop,
body > .toast-host,
body > .tour-root,
body > [data-tour-root] {
  position: relative;
  z-index: 50;
}

/* Studio voice intensity — only when those classes exist */
body:has(.ai-desk.is-speaking) #wave-bg,
body:has(.ai-desk[data-state="speaking"]) #wave-bg,
body:has(.ai-desk[data-state="listening"]) #wave-bg,
body:has(.ai-desk[data-state="working"]) #wave-bg,
body:has(.ai-desk[data-state="interpreting"]) #wave-bg,
body:has(.ai-desk.is-speaking) #studio-wave-bg,
body:has(.ai-desk[data-state="speaking"]) #studio-wave-bg,
body:has(.ai-desk[data-state="listening"]) #studio-wave-bg,
body:has(.ai-desk[data-state="working"]) #studio-wave-bg,
body:has(.ai-desk[data-state="interpreting"]) #studio-wave-bg {
  opacity: 0.24;
}

html[data-theme="light"] body #wave-bg.wave-bg,
html[data-theme="light"] body #studio-wave-bg.studio-wave-bg,
html[data-theme="light"] body #studio-wave-bg.wave-bg {
  opacity: 0.08;
}

@media (prefers-reduced-motion: reduce) {
  body #wave-bg.wave-bg,
  body #studio-wave-bg.studio-wave-bg,
  body #studio-wave-bg.wave-bg {
    opacity: 0.06;
  }
}
