/* The render surface must already cover the space a retracting toolbar exposes.
   dvh can lag an entire gesture; it is only a no-script control-position fallback.
   Camera framing uses the stable safe frame, independently of this overscan. */
@media screen {
 body:not(.static-journey) .journey{height:calc(var(--journey-travel) + var(--journey-maximum-height,100lvh))}
 body:not(.static-journey) .journey-stage{height:var(--journey-maximum-height,100lvh);--journey-controls-offset:max(0px,calc(100lvh - 100dvh))}
 .journey-safe-frame{position:absolute;inset:0 0 auto;height:var(--journey-safe-height,100svh);visibility:hidden;pointer-events:none;contain:strict}
 body:not(.static-journey)[data-layout] .journey-footer{bottom:calc(var(--journey-controls-offset) + max(10px,env(safe-area-inset-bottom)))}
 body:not(.static-journey)[data-layout] .parallel-caption{bottom:calc(var(--journey-controls-offset) + var(--caption-bottom))}
 /* Compact inspection borrows the same visible footer edge. Keep its buttons
    stage-relative too, so a separate fixed viewport cannot reintroduce drift. */
 body:not(.static-journey)[data-inspection-compact=true] .inspection-actions{position:absolute;left:calc(var(--layout-gap) - var(--model-x));top:calc(var(--journey-maximum-height,100lvh) - var(--journey-controls-offset) - var(--model-y) - max(10px,env(safe-area-inset-bottom)));bottom:auto;transform:translateY(-100%)}
 body.capture-art .journey,body.capture-art .journey-stage{height:100vh;height:100dvh}
}
