/* ============================================================================
   AURORA — liveness.css
   Styles owned by the liveness workstream (cast-scene fire intensity, sleeping
   agents, Mr.Fix's walk between the cast fire and his forge). The world must
   mirror reality: fire off when nothing runs, sleepers unmistakably asleep.
   All state classes are applied by cast-scene.js from REAL polled payloads
   (pulseQuick 15s, fixQuick 3s); every change breathes (~1.2s fire, .8s pose).
   ============================================================================ */

/* ------------------------------------------------------------------------- */
/* THE FIRE — the brain's heartbeat (G1/G2)                                   */
/* dead → banked → lit → roaring; flames scale/fade as a group so the level   */
/* shift breathes rather than pops. The flick keyframes (affordances.css)     */
/* keep animating transform on each path; the GROUP owns level scale.         */
/* ------------------------------------------------------------------------- */
#cast-scene .cs-fire .cs-flames {
  transform-box: fill-box;
  transform-origin: 50% 100%;
  transition: transform 1.2s cubic-bezier(.3,.7,.3,1), opacity 1.2s ease;
}
#cast-scene .cs-fire .cs-flame { transition: opacity 1.2s ease; }
#cast-scene .cs-fire .cs-glow  { transition: opacity 1.2s ease; }
#cast-scene .cs-fire .cs-bed   { transition: opacity 1.2s ease; opacity: .4; }
#cast-scene .cs-fire           { transition: filter 1.2s ease; }

/* DEAD — nobody home: flames out, only a faint pulsing ember bed remains */
#cast-scene .cs-fire.cs-fire-dead { filter: drop-shadow(0 0 8px rgba(255,120,60,.06)); }
#cast-scene .cs-fire-dead .cs-flames { transform: scale(.5, .08); opacity: 0; }
#cast-scene .cs-fire-dead .cs-glow { opacity: .14; }
#cast-scene .cs-fire-dead .cs-bed { animation: cs-bed-pulse 3.6s ease-in-out infinite; }
@keyframes cs-bed-pulse {
  0%, 100% { opacity: .22; }
  50%      { opacity: .55; }
}

/* BANKED — alive but idle: a small slow core flame, modest glow */
#cast-scene .cs-fire.cs-fire-banked { filter: drop-shadow(0 0 14px rgba(255,140,70,.18)); }
#cast-scene .cs-fire-banked .cs-flames { transform: scale(.68, .48); }
#cast-scene .cs-fire-banked .cs-outer { opacity: 0; }
#cast-scene .cs-fire-banked .cs-mid   { opacity: .3;  animation-duration: 1.6s; }
#cast-scene .cs-fire-banked .cs-core  { opacity: .92; animation-duration: 1.15s; }
#cast-scene .cs-fire-banked .cs-glow  { opacity: .45; }
#cast-scene .cs-fire-banked .cs-bed   { opacity: .5; }

/* LIT — 1-2 personas working: mid flames, normal flicker */
#cast-scene .cs-fire.cs-fire-lit { filter: drop-shadow(0 0 24px rgba(255,140,70,.36)); }
#cast-scene .cs-fire-lit .cs-flames { transform: scale(.9, .82); }
#cast-scene .cs-fire-lit .cs-outer { opacity: .55; animation-duration: .9s; }
#cast-scene .cs-fire-lit .cs-mid   { opacity: .95; animation-duration: .68s; }
#cast-scene .cs-fire-lit .cs-core  { opacity: 1;   animation-duration: .48s; }
#cast-scene .cs-fire-lit .cs-glow  { opacity: .8; }

/* ROARING — 3+ working or a hot cognition hour: full triple flame + halo */
#cast-scene .cs-fire.cs-fire-roaring { filter: drop-shadow(0 0 34px rgba(255,150,70,.62)); }
#cast-scene .cs-fire-roaring .cs-flames { transform: scale(1.05, 1.08); }
#cast-scene .cs-fire-roaring .cs-outer { opacity: .92; animation-duration: .58s; }
#cast-scene .cs-fire-roaring .cs-mid   { opacity: 1;   animation-duration: .42s; }
#cast-scene .cs-fire-roaring .cs-core  { opacity: 1;   animation-duration: .3s; }
#cast-scene .cs-fire-roaring .cs-glow  { opacity: 1; }

/* ------------------------------------------------------------------------- */
/* THE FIGURES — asleep / banked / idle / active / failed (G3)                */
/* Pose lives on .cs-pose (the per-frame tick owns el.style.transform);       */
/* ambient loops live on the svg; limbs animate by name. Eased .8s.           */
/* ------------------------------------------------------------------------- */
#cast-scene .cs-fig { transition: opacity .8s ease; }
#cast-scene .cs-fig .cs-pose {
  width: 100%; height: 100%;
  transform-origin: 50% 100%;
  transition: transform .8s cubic-bezier(.4,.08,.2,1), filter .8s ease;
}
#cast-scene .cs-fig svg { transform-origin: 50% 100%; }
#cast-scene .cs-fig .cs-head { transform-box: view-box; transition: transform .8s ease; }

/* ASLEEP — lying down, feet at the ground point, slow 5s breathing, z's */
#cast-scene .cs-asleep .cs-pose { transform: rotate(80deg); }
#cast-scene .cs-asleep svg { animation: cs-breathe 5s ease-in-out infinite; }
@keyframes cs-breathe {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.05, 1.028); }
}
/* the sleeper's name floats just above the lying body, not a body-height up */
#cast-scene .cs-asleep .cs-name { bottom: 34% !important; }

/* BANKED — power off / remote: kneeling-settled, head bowed. Resting, not broken. */
#cast-scene .cs-banked .cs-pose { transform: scaleY(.72) scaleX(1.06); }
#cast-scene .cs-banked .cs-head { transform: translate(1.8px, 3px); }

/* IDLE — upright, the faintest sway */
#cast-scene .cs-idle svg { animation: cs-sway 7.5s ease-in-out infinite; }
@keyframes cs-sway {
  0%, 100% { transform: rotate(-1.1deg); }
  50%      { transform: rotate(1.1deg); }
}

/* ACTIVE — full bright, gentle eager bob, a touch more glow */
#cast-scene .cs-active .cs-pose { filter: brightness(1.18) saturate(1.1); }
#cast-scene .cs-active svg { animation: cs-bob 1.9s ease-in-out infinite; }
@keyframes cs-bob {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-3.5%); }
}

/* FAILED — modifier on any pose: a brief red-tinged flicker (embers via JS) */
#cast-scene .cs-failed .cs-pose { animation: cs-fail-tinge 3.4s linear infinite; }
@keyframes cs-fail-tinge {
  0%, 84%, 100% { filter: brightness(1); }
  88%           { filter: brightness(1.45) drop-shadow(0 0 8px rgba(255,92,60,.9)); }
  93%           { filter: brightness(.85); }
}

/* ------------------------------------------------------------------------- */
/* MR.FIX WALKS — ring ↔ forge, one body (G4/G5/G6)                           */
/* cs-walking: forward lean + leg/arm stride + tiny step-bob; cs-flip mirrors */
/* the lean when travelling left (set per-frame from screen direction).       */
/* cs-hammer: at the forge while a ticket executes — right-arm swing loop.    */
/* ------------------------------------------------------------------------- */
#cast-scene .cs-walking .cs-pose { transform: rotate(7deg); }
#cast-scene .cs-walking.cs-flip .cs-pose { transform: rotate(-7deg) scaleX(-1); }
#cast-scene .cs-walking svg { animation: cs-walk-bob .27s ease-in-out infinite alternate; }
@keyframes cs-walk-bob {
  from { transform: translateY(0); }
  to   { transform: translateY(-1.6%); }
}
#cast-scene .cs-walking .cs-leg,
#cast-scene .cs-walking .cs-arm { transform-box: view-box; }
#cast-scene .cs-walking .cs-leg { transform-origin: 12px 33px; }
#cast-scene .cs-walking .cs-arm { transform-origin: 12px 18px; }
#cast-scene .cs-walking .cs-leg-l { animation: cs-step .54s ease-in-out infinite alternate; }
#cast-scene .cs-walking .cs-leg-r { animation: cs-step .54s ease-in-out infinite alternate-reverse; }
#cast-scene .cs-walking .cs-arm-l { animation: cs-arm-swing .54s ease-in-out infinite alternate-reverse; }
#cast-scene .cs-walking .cs-arm-r { animation: cs-arm-swing .54s ease-in-out infinite alternate; }
@keyframes cs-step {
  from { transform: rotate(-17deg); }
  to   { transform: rotate(17deg); }
}
@keyframes cs-arm-swing {
  from { transform: rotate(-9deg); }
  to   { transform: rotate(9deg); }
}

/* hammering at the forge — slight working lean, right arm swings the hammer */
#cast-scene .cs-hammer .cs-pose { transform: rotate(4deg); filter: brightness(1.2); }
#cast-scene .cs-hammer .cs-arm-r {
  transform-box: view-box; transform-origin: 12px 18px;
  animation: cs-hammer-swing .6s cubic-bezier(.5,0,.6,1) infinite;
}
@keyframes cs-hammer-swing {
  0%, 100% { transform: rotate(-38deg); }
  45%      { transform: rotate(-38deg); }
  60%      { transform: rotate(26deg); }
  78%      { transform: rotate(26deg); }
}

/* the forge's built-in 2D stick figure is RETIRED — the walked 3D cast figure
   is the one body of Mr.Fix (G4/G6). Mouth glow / sparks / labels stay as-is. */
.forge-fig { display: none !important; }

/* ------------------------------------------------------------------------- */
/* reduced motion — still the decorative loops; eased state transitions stay  */
/* (JS independently skips ember / z / spark spawns under the same query)     */
/* ------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  #cast-scene .cs-flame,
  #cast-scene .cs-flames,
  #cast-scene .cs-bed,
  #cast-scene .cs-fig svg,
  #cast-scene .cs-fig .cs-pose,
  #cast-scene .cs-fig .cs-leg,
  #cast-scene .cs-fig .cs-arm { animation: none !important; }
}
