/* Shared scanner presentation; only transient light and text overlays. */
.zuno-arriving{animation:zuno-arrival .7s ease-out both}@keyframes zuno-arrival{from{opacity:0}to{opacity:1}}
zuno-cipher{display:inline;opacity:1;transition:opacity .1s}body.zuno-scan-armed zuno-cipher:not(.zuno-decoded){opacity:.025}body.zuno-scan-running zuno-cipher.zuno-decoded{animation:zuno-text-settle .28s ease-out both}
.zuno-noise-layer{position:fixed;inset:0;z-index:100;pointer-events:none;overflow:hidden;user-select:none}.zuno-noise-line{position:absolute;display:block;white-space:pre;overflow:hidden;opacity:.65;pointer-events:none;user-select:none}
.zuno-page-sweep{position:fixed;inset:0;z-index:110;pointer-events:none;width:100%;height:100%;opacity:0;overflow:hidden}
.zuno-scanner-announcement{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
.zuno-optics{position:absolute;inset:0;width:100%;height:100%;opacity:0;pointer-events:none;overflow:visible;fill:none;stroke:#ffe1a3;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 2px #ffd28c66);transition:opacity .12s}
:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) .zuno-optics{opacity:1}
.zuno-sleeping-face,.zuno-optics .zuno-optical-face,.zuno-head-working,.zuno-head-success{opacity:0}
.zuno-scan-armed:not(.zuno-scan-running) .zuno-sleeping-face{animation:zuno-sleep-breathe 3s ease-in-out infinite}
.zuno-scan-running .zuno-optical-face{opacity:1}
.zuno-scan-running .zuno-scan-eye{transform-box:fill-box;transform-origin:center;animation:zuno-optical-lock .42s ease-out both}
.zuno-scan-running .zuno-head-working{animation:zuno-display-on .12s .48s ease-out both}
.zuno-antenna-beacon{opacity:0}.zuno-scan-running .zuno-antenna-beacon{animation:zuno-scan-beacon .65s ease-in-out infinite}.zuno-optics-terminal{position:fixed;z-index:3;inset:auto;filter:none}
.zuno-scan-armed:not(.zuno-scan-running) .station-antenna{opacity:.3;animation:none}
.zuno-sleep-z{opacity:0;animation:zuno-sleep-drift 2.8s var(--z-delay,0s) ease-out infinite}
.zuno-head-message{fill:#f5e5b5;stroke:none;paint-order:fill}.zuno-scan-ack .zuno-head-success{opacity:1;animation:zuno-ready-blink .22s ease-in-out 1 both}
/* Hide both SVG use instances together, including the glow, during display messages. */
:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) :is(.library-face,.station-original-face,.observation-normal-face){opacity:0!important;visibility:hidden}
:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) .intro-visor .visor-expression,:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) .station-face-eyes,:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) .station-face-smile,:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) .library-eye,:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) .library-smile{opacity:0!important}.zuno-scan-running .station-antenna{opacity:1;animation:none;filter:drop-shadow(0 0 7px #ffbf6b88)}:is(.zuno-scan-armed,.zuno-scan-running,.zuno-scan-ack) .library-gaze{animation-play-state:paused}
@keyframes zuno-optical-lock{0%{transform:rotate(-55deg) scale(.8)}20%{transform:rotate(8deg) scale(1.08)}38%,100%{transform:rotate(0) scale(1)}}@keyframes zuno-visor-sweep{0%{transform:translateY(-9px);opacity:0}16%{opacity:.6}80%{opacity:.6}100%{transform:translateY(15px);opacity:0}}@keyframes zuno-scan-beacon{0%,100%{opacity:.45}50%{opacity:1}}@keyframes zuno-text-settle{0%{filter:brightness(1.3);text-shadow:0 0 7px #e6c18b40}100%{filter:brightness(1);text-shadow:none}}
@keyframes zuno-ready-blink{0%,100%{opacity:1}50%{opacity:.22}}
@keyframes zuno-sleep-breathe{0%,100%{opacity:.48}50%{opacity:.82}}
@keyframes zuno-sleep-drift{0%{opacity:0;transform:translate(0,0)}20%,55%{opacity:.9}100%{opacity:0;transform:translate(var(--z-drift-x),var(--z-drift-y))}}
@keyframes zuno-display-on{from{opacity:0}to{opacity:1}}
@media(prefers-reduced-motion:reduce){.zuno-optics,.zuno-page-sweep{display:none!important}zuno-cipher{opacity:1!important;animation:none!important;transition:none!important}.zuno-noise-layer{display:none!important}}

/* Boarding is an independent face state: no scan or decrypted text can remain. */
.zuno-head-boarding{opacity:0}
.zuno-boarding .zuno-optics,.zuno-boarding .zuno-head-boarding{opacity:1}
.zuno-boarding .intro-visor{visibility:hidden}
.zuno-boarding .entry-screen{pointer-events:none}
.zuno-head-boarding .zuno-head-message{opacity:0}
.zuno-boarding .zuno-head-boarding .zuno-head-message{animation:zuno-boarding-message .24s .6s ease-out both}
.zuno-boarding .zuno-boarding-smile{animation:zuno-boarding-smile .6s ease-out both}
.zuno-boarding .zuno-boarding-reflection{animation:zuno-boarding-reflection .75s cubic-bezier(.25,.6,.35,1) both}
.zuno-boarding .zuno-antenna-beacon{animation:zuno-boarding-beacon 1.95s ease-out both;filter:drop-shadow(0 0 5px #ffb358) drop-shadow(0 0 12px #ff8b3870)}
.orbital-intro.is-boarding-fade{opacity:0;visibility:hidden;transition:opacity .6s ease,visibility .6s}
@keyframes zuno-boarding-message{from{opacity:0;filter:brightness(1.6)}to{opacity:1;filter:brightness(1)}}
@keyframes zuno-boarding-smile{0%,55%{opacity:1}100%{opacity:0}}
@keyframes zuno-boarding-reflection{0%{transform:translateX(-30px);opacity:0}12%{opacity:1}85%{opacity:1}100%{transform:translateX(185px);opacity:0}}
@keyframes zuno-boarding-beacon{0%{opacity:.25}18%{opacity:1}32%{opacity:.7}50%,100%{opacity:1}}
