/* Document-world overlay: one character chases scrolling without affecting layout.
   min-height (not height) is 100%: roamer.js sets an explicit pixel height equal
   to the full document height on every measure. <body> is statically positioned,
   so this absolute layer's containing block is the initial containing block —
   one viewport tall — and with overflow:clip a fixed 100% height clipped the
   character away at the first viewport boundary. */
.roamer-viewport{position:absolute;inset:0;width:100%;min-height:100%;z-index:20;overflow:clip;pointer-events:none;contain:paint;display:block}
.roamer{position:absolute;top:0;left:0;width:88px;height:88px;opacity:1;transition:opacity .7s ease,filter .7s ease;will-change:transform,opacity}
.roamer[hidden],.roamer-viewport[hidden]{display:none!important}
.roamer--edge-hidden,.roamer--soft{opacity:0;filter:blur(2px)}
.roamer__sprite{display:block;width:88px;height:88px;object-fit:contain;image-rendering:pixelated;opacity:1;transition:opacity .36s ease;filter:drop-shadow(2px 2px 0 rgba(23,23,20,.35))}
.roamer__effect{position:absolute;inset:0;pointer-events:none;transition:opacity .5s ease}
.roamer__effect::before,.roamer__effect::after{position:absolute;display:block;font-weight:900;color:var(--bau-black)}
.roamer__effect--case::after{content:"▰";right:-2px;bottom:10px;color:var(--bau-purple)}.roamer__effect--look-left::before{content:"◀";left:0;top:18px;color:var(--bau-blue)}.roamer__effect--look-right::before{content:"▶";right:0;top:18px;color:var(--bau-blue)}.roamer__effect--phone::before{content:"☎";right:3px;top:5px;color:var(--bau-red);animation:roamer-pulse .7s ease-in-out infinite}.roamer__effect--scan::after{content:"";left:5px;right:5px;top:22px;border-top:3px solid var(--bau-yellow);animation:roamer-scan 1s linear infinite}.roamer__effect--alert::before{content:"!";right:8px;top:0;color:var(--bau-red);font-size:30px;animation:roamer-pulse .6s infinite}.roamer__effect--notes::after{content:"≡";right:0;bottom:6px;color:var(--bau-blue);font-size:26px}.roamer__effect--coffee::after{content:"☕";right:-3px;bottom:5px}.roamer__effect--stretch::before{content:"↕";right:2px;top:3px;color:var(--bau-purple);animation:roamer-stretch .8s alternate infinite}.roamer__effect--victory::before{content:"★";right:0;top:0;color:var(--bau-yellow);animation:roamer-spin 2s linear infinite}
.roamer-controls{display:flex;justify-content:flex-end;margin:8px 0 16px}.roamer-toggle{min-width:148px;min-height:44px;border:2px solid var(--bau-black);background:var(--bau-cream);color:var(--bau-black);font:inherit;font-weight:800;box-shadow:3px 3px 0 var(--bau-black);cursor:pointer}.roamer-toggle:hover{background:var(--bau-yellow)}.roamer-toggle:focus-visible{outline:3px solid var(--focus);outline-offset:3px}.roamer-toggle:disabled{cursor:not-allowed;opacity:.75}
@keyframes roamer-pulse{50%{transform:scale(1.2)}}@keyframes roamer-scan{50%{transform:translateY(42px)}}@keyframes roamer-bob{50%{transform:translateY(-4px)}}@keyframes roamer-stretch{to{transform:scaleY(1.06);transform-origin:bottom}}@keyframes roamer-spin{to{transform:rotate(1turn)}}
@media(prefers-reduced-motion:reduce){.roamer,.roamer__sprite,.roamer__effect,.roamer__effect::before,.roamer__effect::after{animation:none!important;transition:none!important}.roamer{will-change:auto}}
@media(forced-colors:active){.roamer-viewport{display:none!important}.roamer-toggle{background:Canvas;color:CanvasText;border-color:CanvasText;box-shadow:none}}
@media print{.roamer-viewport,.roamer-controls{display:none!important}}
