/* anim.css — living isometric model. Loaded after style.css.
   States: .sys.on = full motion; .bim.all = calm (--t:2 slower, --k:.5 softer); dimmed = nothing.
   All CSS animations (no SMIL) so prefers-reduced-motion can switch them off. */

.bim :is(.pls,.spr,.sq,.thp,.wv,.blk,.lmp,.fan,.rec,.tgt,.exit){transform-box:fill-box;transform-origin:center}
.bim.all .sys:not(.on){--t:2;--k:.5}

/* ---------- global: scan plane (always on) ---------- */
.bim .scan{pointer-events:none;animation:scan 9s ease-in-out infinite alternate}
.bim .scan-pl{fill:rgba(63,208,255,.06);stroke:rgba(120,225,255,.5);stroke-width:1.2}
@keyframes scan{from{transform:translateY(0)}to{transform:translateY(calc(-1*var(--dy,210px)))}}

/* ---------- global: slabs draw in once on load ---------- */
.bim .slab{animation:slabin 1.4s cubic-bezier(.3,.6,.3,1) calc(var(--f,0)*.38s) backwards}
@keyframes slabin{
  from{stroke-dasharray:100;stroke-dashoffset:100;fill-opacity:0}
  80%{fill-opacity:0}
  to{stroke-dasharray:100;stroke-dashoffset:0;fill-opacity:1}}

/* ---------- flow overlays (.fx) ---------- */
.bim .fx{fill:none;stroke:#fff;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:3 13;--p:16px;opacity:0;pointer-events:none}
.bim .fx.thinfx{stroke-width:1}
.bim .fx.bigfx{stroke-width:1.6}
.bim .fx.dn{stroke:#cfe0ff}
.bim .fx.sig{stroke:var(--c);stroke-width:2.6;stroke-dasharray:3 27;--p:30px;--d:1.8s;--o:1}
.bim .fx.air{stroke-width:3;stroke-dasharray:10 20;--p:30px;--d:1.8s;--o:.3}
.bim .fx.cur{stroke-width:1.6;stroke-dasharray:2 8;--p:10px;--d:.5s;--o:.95}
.bim .fx.thinfx.cur{stroke-width:1.2}
:is(.bim .sys.on,.bim.all .sys) .fx{opacity:calc(var(--o,.85)*var(--k,1));
  animation:fxflow calc(var(--d,1s)*var(--t,1)) linear infinite}
@keyframes fxflow{to{stroke-dashoffset:calc(-1*var(--p))}}
:is(.bim .sys.on,.bim.all .sys) .fx.sig{animation-delay:calc(var(--i,0)*-.35s)}
:is(.bim .sys.on,.bim.all .sys) .fx.air{animation-delay:calc(var(--i,0)*-.4s)}

/* ---------- pulsing marks: sprinkler heads, grilles, ak targets ---------- */
.bim .grille{--d:1.8s;--s:.25s}
:is(.bim .sys.on,.bim.all .sys) .pls{animation:pls calc(var(--d,2.4s)*var(--t,1)) ease-in-out infinite;
  animation-delay:calc(var(--i,0)*var(--s,.14s)*var(--t,1))}
@keyframes pls{0%,55%,100%{transform:scale(1)}28%{transform:scale(1.75)}}

/* ---------- АУПТ: spray ring emitted at the pulse peak ---------- */
.bim .spr{fill:none;stroke:var(--c);stroke-width:1.1;opacity:0}
:is(.bim .sys.on) .spr{animation:spr 2.4s ease-out infinite;animation-delay:calc(var(--i,0)*.14s)}
@keyframes spr{0%,24%{transform:scale(1);opacity:0}26%{opacity:.85}100%{transform:scale(3.6);opacity:0}}

/* ---------- АПС: detectors flash in sequence round the loop ---------- */
:is(.bim .sys.on,.bim.all .sys) .det.sq{animation:sq calc(2.4s*var(--t,1)) ease-out infinite;
  animation-delay:calc(var(--i,0)*.4s*var(--t,1))}
@keyframes sq{0%{fill:var(--c);transform:scale(1.6)}22%{fill:#08111D;transform:scale(1)}100%{fill:#08111D;transform:scale(1)}}

/* ---------- СОУЭ: sound ripples, speaker thump, exit blink ---------- */
:is(.bim .sys.on,.bim.all .sys) .wv{animation:wv calc(1.7s*var(--t,1)) ease-out infinite;
  animation-delay:calc((var(--i,0)*.3s + var(--w,0)*.16s)*var(--t,1))}
@keyframes wv{0%{opacity:0;transform:translateX(-3px)}25%{opacity:1}100%{opacity:0;transform:translateX(5px)}}
:is(.bim .sys.on,.bim.all .sys) .thp{animation:thp calc(1.7s*var(--t,1)) ease-out infinite;
  animation-delay:calc(var(--i,0)*.3s*var(--t,1))}
@keyframes thp{0%{transform:scale(1.3)}25%,100%{transform:scale(1)}}
:is(.bim .sys.on,.bim.all .sys) .blk{animation:blk calc(1.4s*var(--t,1)) ease-in-out infinite;
  animation-delay:calc(var(--i,0)*.2s)}
@keyframes blk{0%,50%{opacity:1}65%,90%{opacity:.18}100%{opacity:1}}

/* ---------- ВПВ: hose cabinets glow bottom-up with the rising water ---------- */
:is(.bim .sys.on,.bim.all .sys) .hose polygon{animation:eqglow calc(1.8s*var(--t,1)) ease-in-out infinite;
  animation-delay:calc(var(--i,0)*.3s*var(--t,1))}
@keyframes eqglow{50%{fill:color-mix(in srgb,var(--c) 62%,#08111D);stroke-width:1.8}}

/* ---------- Планы эвакуации: people running to the stair ---------- */
.bim .runner{fill:#fff;stroke:var(--c);stroke-width:1.6;opacity:0;offset-rotate:0deg}
:is(.bim .sys.on,.bim.all .sys) .runner{animation:run calc(4.2s*var(--t,1)) linear infinite;
  animation-delay:calc(var(--i,0)*.8s*var(--t,1))}
@keyframes run{0%{offset-distance:0%;opacity:0}7%{opacity:1}90%{opacity:1}100%{offset-distance:100%;opacity:0}}

/* ---------- ОВиК: rooftop fan ---------- */
:is(.bim .sys.on,.bim.all .sys) .fan{animation:spin calc(.7s*var(--t,1)) linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- ЭОМ: lamps light up one after another ---------- */
.bim .lmp{opacity:1}
:is(.bim .sys.on,.bim.all .sys) .lmp{animation:lmp calc(3s*var(--t,1)) ease-out infinite;
  animation-delay:calc(var(--i,0)*.17s*var(--t,1))}
@keyframes lmp{0%{opacity:1;fill:#fff3cf;transform:scaleX(1.3)}30%{opacity:1;fill:var(--c);transform:scaleX(1)}
  75%{opacity:1}92%,100%{opacity:.22}}

/* ---------- СС: REC dots + data packets;  АК: packets + target pings ---------- */
.bim .rec{fill:#FF4B4B}
:is(.bim .sys.on,.bim.all .sys) .rec{animation:rec calc(1.2s*var(--t,1)) steps(1) infinite;
  animation-delay:calc(var(--i,0)*.25s)}
@keyframes rec{0%{opacity:1}50%{opacity:.12}}
.bim .pkt{fill:#fff;opacity:0;offset-rotate:0deg}
:is(.bim .sys.on,.bim.all .sys) .pkt{animation:pkt calc(2.4s*var(--t,1)) linear infinite;
  animation-delay:calc(var(--i,0)*.8s*var(--t,1))}
:is(.bim .sys.on,.bim.all .sys) .pkt.alt{animation-duration:calc(1.6s*var(--t,1));animation-direction:alternate;
  animation-timing-function:ease-in-out;animation-delay:calc(var(--i,0)*.35s)}
@keyframes pkt{0%{offset-distance:0%;opacity:0}10%{opacity:1}85%{opacity:1}100%{offset-distance:100%;opacity:0}}
.bim .pkt.alt{fill:var(--c);stroke:#fff;stroke-width:.9}
:is(.bim .sys.on,.bim.all .sys) .tgt{animation:tgt calc(2.4s*var(--t,1)) ease-in-out infinite;
  animation-delay:calc(var(--i,0)*.8s*var(--t,1))}
@keyframes tgt{0%,72%,100%{transform:scale(1)}88%{transform:scale(2.2)}}

/* ---------- reduced motion: everything static, overlays hidden ---------- */
@media (prefers-reduced-motion:reduce){
  .bim *,.bim *::before{animation:none!important;transition:none!important}
  .bim .fx,.bim .runner,.bim .pkt,.bim .spr,.bim .scan{display:none}
  .bim .fan,.bim .scan{transform:none}
}
