/* Exact approved bitmap; light is a separate backing, never a filter on the face. */
.trade001-frank-portrait{position:relative;display:block;inline-size:100%;block-size:100%;aspect-ratio:190/150;isolation:isolate;pointer-events:none;overflow:visible}
.trade001-frank-portrait>img{position:relative;z-index:1;display:block;width:100%;height:100%;object-fit:contain;border-radius:9% / 11.4%}
.trade001-frank-portrait>svg{position:absolute;z-index:2;inset:0;width:100%;height:100%;overflow:hidden;pointer-events:none}
.frank-presence-halo{position:absolute;z-index:0;inset:-3% -5%;border-radius:12%;background:#4d9fed;box-shadow:0 0 0 .035em #4d9fed;filter:blur(9px);opacity:var(--frank-rest);pointer-events:none;transition:opacity .2s}
.trade001-frank-portrait[data-presence=listening]>.frank-presence-halo{opacity:calc(var(--frank-rest)*1.27)}
.trade001-frank-portrait[data-presence=inactive]>.frank-presence-halo{opacity:calc(var(--frank-rest)*.35)}
.trade001-frank-portrait[data-animate=true][data-presence=idle]>.frank-presence-halo{animation:frank-breathe 3.5s ease-in-out infinite}
.trade001-frank-portrait[data-animate=true][data-presence=processing]>.frank-presence-halo{animation:frank-process 4.5s ease-in-out infinite}
.trade001-frank-portrait[data-low=true]>.frank-presence-halo{animation:none;transition:none;opacity:var(--frank-rest)}
.frank-ambient-eyes,.frank-ambient-mouth{opacity:0;transform-box:view-box;transform-origin:0 0}
@keyframes frank-breathe{0%,100%{opacity:calc(var(--frank-rest)*.8537)}50%{opacity:calc(var(--frank-rest)*1.0488)}}
@keyframes frank-process{0%,100%{opacity:calc(var(--frank-rest)*.85)}50%{opacity:var(--frank-rest)}}
@media(prefers-reduced-motion:reduce){.trade001-frank-portrait>svg{display:none!important}.frank-presence-halo{animation:none!important;transition:none!important;opacity:var(--frank-rest)!important}}

.trade001-frank-portrait[data-presence=speaking]>.frank-presence-halo{opacity:calc(var(--frank-rest)*var(--frank-speech-glow,1.6))}
