/* NEXUS V0.7. Les animations habillent uniquement l'état confirmé.
   Transform/opacity, ombres fixes ; aucune boucle JS ni nouveaux assets. */
.living-avatar:not(.portrait){animation:hero-breathe var(--tempo-hero) ease-in-out infinite;transform-origin:50% 94%;will-change:auto}
@keyframes hero-breathe{0%,12%,100%{transform:translate(0,0) rotate(0) scaleY(1)}35%{transform:translate(.6px,-1.5px) rotate(.18deg) scaleY(1.003)}52%,62%{transform:translate(.3px,-.7px) rotate(.08deg) scaleY(1.001)}82%{transform:translate(-.5px,-1px) rotate(-.12deg) scaleY(1.002)}}
.quiet-avatar .living-avatar,.passage-layers[data-quiet="true"] .living-avatar{animation:hero-quiet var(--tempo-quietHero) ease-in-out infinite}
@keyframes hero-quiet{0%,18%,100%{transform:none}52%,66%{transform:translateY(-.7px) scaleY(1.0015)}}
.hero-action{transform-origin:50% 94%}
[data-hero="observe"] .hero-action,[data-hero="glasses"] .hero-action{animation:hero-observe var(--tempo-heroAction) var(--tempo-ease) both}
[data-hero="surprise"] .hero-action{animation:hero-surprise var(--tempo-heroAction) var(--tempo-ease) both}
[data-hero="glove"] .hero-action{animation:hero-impulse var(--tempo-world) var(--tempo-ease) both}
[data-hero="pen"] .hero-action{animation:hero-write var(--tempo-world) var(--tempo-ease) both}
[data-hero="victory"] .hero-action{animation:hero-positive var(--tempo-major) ease-out both}
[data-hero="capsule"] .hero-action{animation:hero-observe var(--tempo-heroAction) ease-out both}
[data-hero="curious"] .hero-action{animation:hero-curious var(--tempo-creature) ease-in-out both}
@keyframes hero-observe{0%{transform:none}45%,72%{transform:translateX(2px) rotate(.65deg)}100%{transform:rotate(.25deg)}}
@keyframes hero-surprise{0%{transform:none}22%{transform:translateX(-4px) rotate(-1deg)}65%{transform:rotate(.4deg)}100%{transform:none}}
@keyframes hero-impulse{0%{transform:none}22%{transform:translateX(3px) rotate(1.1deg)}60%{transform:translateX(1px) rotate(.4deg)}100%{transform:none}}
@keyframes hero-write{0%{transform:none}24%{transform:rotate(.7deg) scaleY(1.004)}100%{transform:none}}
@keyframes hero-positive{0%,100%{transform:none}28%{transform:rotate(-.55deg) scaleY(1.008)}58%{transform:rotate(.4deg)}}
@keyframes hero-curious{0%{transform:none}12%{transform:translateX(-3px) rotate(-.65deg)}30%,58%{transform:translateX(2px) rotate(.7deg)}78%,100%{transform:rotate(.25deg)}}
.hero-shadow,.boss-shadow{filter:none;background:radial-gradient(ellipse,#02091088,transparent 72%)}
/* Assemblages : le corps, les yeux et la plaque restent solidaires au repos. */
.boss-machine,.relay-machine{position:absolute;inset:0;transform-origin:50% 91%}
.boss-machine{animation:boss-steady var(--tempo-bossIdle) ease-in-out infinite}
.phase-2 .boss-machine{animation-name:boss-fault;animation-duration:7.1s}
.phase-3 .boss-machine{animation-name:boss-unstable;animation-duration:5.9s}
.phase-4 .boss-machine{animation:boss-stop var(--tempo-major) ease-out both}
.boss-eyes{animation:machine-gaze 8.3s ease-in-out infinite}
.boss-core{animation:machine-core 9.7s ease-in-out infinite;animation-delay:-2.7s}
.phase-2 .boss-eyes{animation-duration:6.9s}.phase-3 .boss-eyes{animation-name:machine-fault;animation-duration:5.3s}
.phase-3 .boss-core{animation-duration:6.1s}
.mechanical-response .boss-machine,.mechanical-response .boss-machine *{animation-play-state:paused!important}
.mechanical-response .boss-eyes{opacity:1}.mechanical-response .boss-core{opacity:1}
.phase-4 .boss-eyes,.phase-4 .boss-core{animation:none;transition:opacity var(--tempo-major);opacity:.1}
@keyframes boss-steady{0%,17%,100%{transform:none}44%,57%{transform:translateY(1.5px) rotate(.18deg)}79%{transform:translateY(.4px) rotate(-.12deg)}}
@keyframes boss-fault{0%,20%,100%{transform:none}38%{transform:translate(1px,2px) rotate(.3deg)}43%{transform:translate(-.7px,1px) rotate(-.2deg)}57%,70%{transform:translateY(1.2px)}85%{transform:rotate(.2deg)}}
@keyframes boss-unstable{0%,12%,100%{transform:none}27%{transform:translate(-1px,1.5px) rotate(-.35deg)}33%{transform:rotate(.3deg)}52%,65%{transform:translateY(2px) rotate(.2deg)}78%{transform:translateX(1px) rotate(-.25deg)}}
@keyframes boss-stop{0%{transform:rotate(-.7deg)}25%{transform:rotate(.6deg) translateY(2px)}55%{transform:rotate(-.2deg) translateY(3px)}100%{transform:translateY(4px)}}
@keyframes machine-gaze{0%,61%,72%,100%{opacity:.9}66%{opacity:.55}}
@keyframes machine-core{0%,25%,100%{opacity:.35}57%,68%{opacity:.7}}
@keyframes machine-fault{0%,27%,45%,70%,100%{opacity:1}33%,40%{opacity:.45}78%,84%{opacity:.6}}
/* Le Relais gagne en régularité, sans devenir un deuxième ennemi. */
.relay-machine{animation:relay-irregular var(--tempo-relayIdle) ease-in-out infinite}
[data-relay="aligning"] .relay-machine{animation:relay-align 9.3s ease-in-out infinite}
[data-relay="stable"] .relay-machine{animation:relay-stable 10.7s ease-in-out infinite}
.resonator-light{animation:resonator-wave 7.7s ease-in-out infinite;animation-delay:-1.7s}
[data-relay="stable"] .resonator-light{animation:resonator-calm 10.1s ease-in-out infinite}
.relay-response .relay-machine,.relay-response .resonator-light{animation-play-state:paused!important}
@keyframes relay-irregular{0%,16%,100%{transform:none}31%{transform:rotate(-.3deg)}38%{transform:rotate(.22deg)}61%,75%{transform:translateY(1.7px) rotate(.12deg)}}
@keyframes relay-align{0%,15%,100%{transform:none}42%{transform:rotate(.14deg) translateY(.9px)}73%{transform:rotate(-.08deg)}}
@keyframes relay-stable{0%,16%,100%{transform:none}52%,65%{transform:scaleY(1.0015)}}
@keyframes resonator-wave{0%,18%,100%{opacity:.15}29%{opacity:.48}35%{opacity:.25}59%,67%{opacity:.6}82%{opacity:.3}}
@keyframes resonator-calm{0%,15%,100%{opacity:.55}50%,66%{opacity:.8}}
[data-power="0"] .resonator-light{animation:none;opacity:.08}
/* Une acquisition devient un moment lisible : 350 entrée + 1800 maintien + 450 sortie. */
.object-reveal{animation:reveal-envelope var(--tempo-objectReveal) ease both;inset:3% 18% 16%}
.object-reveal>.object-art{animation:reveal-presence var(--tempo-objectReveal) ease-in-out both;transform-origin:center}
.reveal-light{animation:reveal-glow var(--tempo-objectReveal) ease both}
@keyframes reveal-envelope{0%{opacity:0;transform:scale(.94)}13.46%,82.69%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(1.015)}}
@keyframes reveal-presence{0%{transform:translateY(7px) rotate(-1deg)}12%{transform:none}45%{transform:translateY(-3px) rotate(.4deg)}72%{transform:translateY(-1px) rotate(-.3deg)}100%{transform:none}}
@keyframes reveal-glow{0%{opacity:0}16%{opacity:.75}53%{opacity:1}83%{opacity:.75}100%{opacity:0}}
[data-focus="discovery"] .world-object{opacity:0;animation:none}
[data-focus="discovery"] :is(.depth-haze,.ambient-leaf,.distant-light,.boss-machine,.boss-eyes,.boss-core,.relay-machine,.resonator-light){animation-play-state:paused}
/* Une seule illustration de créature : entrée, regard vivant, retrait, dernier regard. */
.creature-presence{height:100%;width:100%;animation:creature-visit var(--tempo-creature) ease-in-out both}
.first-creature{animation:creature-breathe 3.7s ease-in-out infinite;transform-origin:50% 86%}
@keyframes creature-visit{0%{opacity:0;transform:translate(43%,10%)}11%,57%{opacity:1;transform:none}70%,76%{opacity:1;transform:translate(55%,3%) rotate(2deg)}83%,93%{opacity:1;transform:translate(23%,0) rotate(-2deg)}100%{opacity:0;transform:translate(86%,4%)}}
@keyframes creature-breathe{0%,12%,100%{transform:none}32%{transform:translateY(-1px) rotate(-.8deg) scaleY(1.008)}53%,63%{transform:rotate(.4deg) scaleY(1.003)}82%{transform:translateX(.8px) rotate(-.35deg)}}
/* Profondeur locale seulement : ne pas déplacer le décor peint et ses points de contact. */
.depth-haze{animation:quality-depth var(--tempo-depth) ease-in-out infinite alternate}
@keyframes quality-depth{from{opacity:.13;transform:translate(-5px,0) scale(1.015)}to{opacity:.19;transform:translate(6px,-2px) scale(1.025)}}
.station-light{animation:station-breath 17s ease-in-out infinite}
@keyframes station-breath{0%,20%,100%{transform:scale(1)}56%,72%{transform:scale(1.025)}}
.frequency-trace i{animation:frequency-beacon 5.7s ease-in-out infinite}.frequency-trace i:nth-child(2){animation-delay:-1.9s}.frequency-trace i:nth-child(3){animation-delay:-3.8s}
@keyframes frequency-beacon{0%,30%,100%{opacity:.3}55%,66%{opacity:1}}
[data-quiet="true"] :is(.depth-haze,.station-light,.frequency-trace i,.resonator-light){animation:none}
[data-quiet="true"] .boss-machine{animation-duration:12s}[data-quiet="true"] .relay-machine{animation-duration:15s}
/* La Base reste un lieu calme ; les objets reposent sur une surface, leur halo seul vit. */
.base-fragment{left:58%;bottom:43%;width:6%;height:15%;isolation:isolate}
.base-fragment:before{content:'';position:absolute;inset:15%;background:radial-gradient(#85d9ff44,transparent 70%);animation:fragment-light 11.9s ease-in-out infinite}
.base-fragment:after{content:'';position:absolute;left:18%;bottom:5%;width:68%;height:10%;background:radial-gradient(#001320aa,transparent 72%);z-index:-1}
@keyframes fragment-light{0%,25%,100%{opacity:.2}60%,72%{opacity:.7}}
.returned-object:after{bottom:14%;left:15%;width:72%;height:10%}
.capsule-station:after{content:'';position:absolute;bottom:8%;left:13%;width:74%;height:10%;background:radial-gradient(#01101ab0,transparent 72%);z-index:-1}.capsule-station{isolation:isolate}
/* UI : pas de nouveau délai d'action, seulement une entrée de panneau. */
.home-panel,.decoration-panel{animation:quality-panel var(--tempo-ui) var(--tempo-ease) both}
@keyframes quality-panel{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
button{transition:background-color var(--tempo-micro),border-color var(--tempo-micro),opacity var(--tempo-micro)}
button:focus-visible{outline:3px solid #d7fb83;outline-offset:3px}
button:disabled{cursor:default}
.passage-land,.world-object,.echo-relay,.hatch-focus{animation-name:quality-enter;animation-duration:var(--tempo-ui);animation-timing-function:ease-out}
@keyframes quality-enter{from{opacity:.25}to{opacity:1}}
/* Ces éléments portent déjà leurs propres animations : ne pas les remplacer. */
.echo-relay.relay-response{animation:relay-respond var(--tempo-world) var(--tempo-ease)}
.world-object{animation:object-arrival var(--tempo-move) var(--tempo-ease) both}
/* Filet CSS si getAnimations({subtree:true}) manque (anciens Safari). */
[data-motion-paused="true"] *,[data-motion-paused="true"] *:before,[data-motion-paused="true"] *:after{animation-play-state:paused!important}
[data-motion-paused="true"] *{transition-duration:0s!important}
@media(max-width:700px){.object-reveal{inset:3% 2% auto;height:470px}.object-reveal>.object-art{width:min(65vw,290px);height:min(65vw,290px)}.object-reveal strong{font-size:25px}.object-reveal>span:last-child{font-size:14px}.base-fragment{left:59%;bottom:51%;height:13%;width:9%}}
@media(prefers-reduced-motion:reduce){
 .living-avatar,.hero-action,.boss-machine,.boss-eyes,.boss-core,.relay-machine,.resonator-light,.creature-presence,.first-creature,.object-reveal,.object-reveal>.object-art,.reveal-light,.depth-haze,.station-light,.frequency-trace i,.base-fragment:before,.home-panel,.decoration-panel{animation:none!important;transition:none!important}
 .object-reveal,.creature-presence,.first-creature{opacity:1;transform:none}
 .hatch-focus{animation:none}.home-world *{animation:none!important}
 .boss-machine,.hero-action{transform:none}.phase-4 .boss-machine{transform:translateY(4px)}
 .crossing-veil{display:none}
}

/* Les pics de mouvement coïncident avec les cues de PresentationClock. */
@keyframes arc-first-knocks{0%,9%,29%,57%,80%,100%{transform:rotate(0)}13.08%,40%,66.54%{transform:rotate(-3deg)}19%,46%,72%{transform:rotate(2deg)}}
@keyframes hatch-shell{0%,10%,23%,39%,54%{transform:rotate(0);opacity:1}15.48%,29.76%,45.24%{transform:rotate(-2deg)}19%,34%,50%{transform:rotate(2deg)}65%{opacity:1;transform:scale(1.025)}77%,100%{opacity:0;transform:scale(1.04)}}
/* Capsule ouverte : même position durant ouverture et rencontre, contact au sol. */
.hatch-focus .hatch-open{left:25%;width:65%;top:12%}
.hatch-focus:after{left:32%;bottom:8%;width:53%;height:6%}
/* Une surface composite par personnage/machine visible, jamais tout le décor. */
.living-avatar:not(.portrait),.boss-machine,.relay-machine,.creature-presence{will-change:transform}
@media(prefers-reduced-motion:reduce){.living-avatar,.boss-machine,.relay-machine,.creature-presence{will-change:auto}}
@media(min-width:601px){.shelf-decoration{top:41.5%}}
/* Ancien Safari : une représentation statique vaut mieux qu'un reveal invisible. */
[data-presentation-static="true"] :is(.object-reveal,.reveal-light,.object-reveal>.object-art,.hatch-open,.creature-presence){animation:none!important;opacity:1;transform:none}
[data-presentation-static="true"] .hatch-cracked{opacity:0}
