/* Keep the signal geometry intact; the ridge provides depth only behind its entrance. */
.signal-stage .signal-art{z-index:1}
.signal-foreground{position:absolute;z-index:0;left:-7%;bottom:0;width:114%;max-width:none;height:52%;object-fit:fill;pointer-events:none;opacity:.78;-webkit-mask-image:linear-gradient(to right,transparent,#000 15%,#000 85%,transparent),linear-gradient(to bottom,#000 80%,transparent);-webkit-mask-composite:source-in;mask-image:linear-gradient(to right,transparent,#000 15%,#000 85%,transparent),linear-gradient(to bottom,#000 80%,transparent);mask-composite:intersect}
.lens-flight{position:absolute;z-index:4;inset:0;pointer-events:none}
.lens-flight .signal-lens{pointer-events:auto}
.lens-awaiting .signal-lens{opacity:0;visibility:hidden;pointer-events:none}
.lens-arriving .signal-lens{animation:lens-rise 2800ms cubic-bezier(.3,0,.3,1) both;pointer-events:none;will-change:transform,opacity}
.lens-arrival-paused .signal-lens{animation-play-state:paused}
.lens-flight.is-emerging{-webkit-mask-image:linear-gradient(#fff,#fff),url('./assets/appalachian-foreground-v41.webp');-webkit-mask-size:100% 100%,114% 52%;-webkit-mask-position:center,center bottom;-webkit-mask-repeat:no-repeat;-webkit-mask-composite:source-out;mask-image:linear-gradient(#fff,#fff),url('./assets/appalachian-foreground-v41.webp');mask-size:100% 100%,114% 52%;mask-position:center,center bottom;mask-repeat:no-repeat;mask-composite:subtract;mask-mode:alpha}
@keyframes lens-rise{0%{opacity:0;transform:translate(-50%,calc(-50% + var(--lens-rise,180px))) scale(.88)}22%{opacity:.24}65%{opacity:.88}100%{opacity:1;transform:translate(-50%,-50%) scale(1)}}
/* One warm accent on the compass after it settles; the glass and ambient timing stay independent. */
.lens-arrival-pulse .lens-compass{animation:lens-arrival-glint 1250ms ease-in-out 1}
.lens-arrival-pulse.lens-ambient-paused .lens-compass{animation-play-state:paused}
@keyframes lens-arrival-glint{0%,100%{transform:translate(-50%,-50%) scale(1);filter:brightness(1) drop-shadow(0 1px 1px #091d17)}42%{transform:translate(-50%,-50%) scale(1.04);filter:brightness(1.35) drop-shadow(0 1px 1px #091d17) drop-shadow(0 0 5px #f4d59580)}}
/* After arrival: 4s present, 4s fading out, 11s clear forest, 5s fading in. */
.lens-ambient .lens-flight{animation:lens-forest-rest 24s ease-in-out infinite}
.lens-ambient .signal-lens{animation:lens-rest-hit-area 24s steps(1,end) infinite}
.lens-ambient-paused .lens-flight,.lens-ambient-paused .signal-lens{animation-play-state:paused}
.lens-ambient.lens-engaged .lens-flight,.lens-ambient.is-dragging .lens-flight,.lens-ambient .lens-flight:focus-within{animation:none;opacity:1}
.lens-ambient.lens-engaged .signal-lens,.lens-ambient.is-dragging .signal-lens,.lens-ambient .signal-lens:focus{animation:none;pointer-events:auto}
@media(hover:hover) and (pointer:fine){.lens-ambient .lens-flight:has(.signal-lens:hover){animation:none;opacity:1}.lens-ambient .signal-lens:hover{animation:none;pointer-events:auto}}
@keyframes lens-forest-rest{0%,16.666667%,100%{opacity:1}33.333333%,79.166667%{opacity:0}}
/* Keep the invisible lens out of pointer hit testing; keyboard focus still reveals it. */
@keyframes lens-rest-hit-area{0%,79.166667%,100%{pointer-events:auto}33.333333%{pointer-events:none}}
@media(prefers-reduced-motion:reduce){.lens-arriving .signal-lens{animation:none;opacity:1;transform:translate(-50%,-50%)}.lens-flight.is-emerging{mask:none;-webkit-mask:none}}
@media(prefers-reduced-motion:reduce){.lens-ambient .lens-flight{animation:none;opacity:1}.lens-ambient .signal-lens{animation:none;pointer-events:auto}}
@media(prefers-reduced-motion:reduce){.lens-arrival-pulse .lens-compass{animation:none}}
