/* Art and local limbs travel together; the name stays legible and the shadow stays grounded. */
.forest-resident{transform:translate(-50%,-50%) translate(var(--wander-x,0px),var(--wander-y,0px));will-change:transform}
.resident-character{position:absolute;inset:0;display:block;transform:translateY(var(--hop-y,0px)) scaleX(var(--face-dir,1)) scale(.93);transform-origin:50% 50%;pointer-events:none}
.resident-character>img,.resident-character>canvas{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;pointer-events:auto;clip-path:inset(var(--art-hit))}
.resident-character>canvas{opacity:0;pointer-events:none}
.resident-character>canvas.ready{opacity:1;pointer-events:auto}
.resident-character:has(canvas.ready)>img{opacity:0;pointer-events:none}
.resident-contact-shadow{position:absolute;top:var(--art-bottom);left:50%;width:59%;height:5%;border-radius:50%;background:#0d162a;filter:blur(4px);opacity:.24;transform:translate(-50%,-20%) scale(var(--shadow-scale,1));pointer-events:none}
.resident-name{z-index:2}
.forest-resident:focus-visible{outline:3px solid var(--coral);outline-offset:4px}
.sanctuary-stage.is-map .forest-resident{will-change:auto}
body[data-motion=off] .forest-resident{will-change:auto}
@media(prefers-reduced-motion:reduce){.forest-resident{will-change:auto}}
@media(min-width:768px){.forest-resident[data-resident=london-primrose] .resident-name{top:calc(var(--art-top) - 34px)}}
/* All names live above the character layer; they remain native, stable-focus controls. */
.forest-name-controls{position:absolute;inset:0;z-index:5;pointer-events:none}
.forest-resident .resident-name{visibility:hidden;pointer-events:none}
.forest-name-control{position:absolute;left:0;top:0;transform:translate(var(--label-x,0px),var(--label-y,0px)) translateX(-50%);padding:5px 12px;border-radius:20px;background:#302238e6;color:var(--paper);font:500 22px/1 Caveat,cursive;white-space:nowrap;pointer-events:none;min-height:30px;opacity:0;transition:opacity .18s var(--entrance)}
.forest-name-control.is-route-xray,.sanctuary-stage.is-map .forest-name-control:focus-visible{opacity:1;pointer-events:auto}
.forest-name-control[aria-pressed=true]{background:var(--paper);color:#743348}
.forest-name-control::before{content:'';position:absolute;left:-6px;right:-6px;top:50%;height:44px;transform:translateY(-50%)}
.forest-name-control:focus-visible{outline:3px solid var(--coral);outline-offset:4px}
body[data-motion=off] .forest-name-control{transition:none}
@media(prefers-reduced-motion:reduce){.forest-name-control{transition:none}}
.forest-resident[data-resident=london-thistle] .resident-name{top:calc(var(--art-top) - 34px)}
.resident-contact-shadow{inset:0;width:100%;height:100%;left:0;top:0;background:none;filter:none;transform:none}
.resident-contact-shadow i{position:absolute;width:10%;height:3%;border-radius:50%;background:#071521;filter:blur(2.5px);transform:translate(-50%,-20%) scale(var(--shadow-scale,1));pointer-events:none}
@media(max-width:767px){.forest-name-control{font-size:18px;padding:4px 9px;min-height:28px}.forest-resident[data-resident=london-winnie] .resident-name{top:calc(var(--art-top) - 32px)}.forest-resident[data-resident=london-asha] .resident-name{top:calc(var(--art-top) - 34px)}}
