/* V24 · Lightweight chapter traveller, shared V23 choreography. */
.v24-traveller{--v24-accent:#e7cc93;--v24-dx:calc(43px - 69vw);--v24-dy:16vh;position:fixed;inset:0;z-index:93;pointer-events:none;overflow:hidden;opacity:0;visibility:hidden;contain:layout paint;transition:opacity .3s ease,visibility .3s}
.v24-traveller.v24-live{opacity:1;visibility:visible}
.v24-traveller.v24-hidden{opacity:0!important;visibility:hidden!important}
.v24-frame{position:absolute;left:calc(100vw - 43px);top:34vh;width:clamp(220px,26vw,360px);height:clamp(220px,26vw,360px);color:var(--v24-accent);transform:translate(-50%,-50%) scale(.34);opacity:.75;transform-origin:center;backface-visibility:hidden}
.v24-outer-ring,.v24-inner-ring{position:absolute;inset:1%;border:2px solid currentColor;border-radius:50%;opacity:.36}
.v24-outer-ring{border-style:dashed;opacity:.17;inset:-9%}
.v24-inner-ring{inset:12%;opacity:.27;transform:rotate(-27deg) scaleY(.68)}
.v24-prism-core{position:absolute;left:50%;top:50%;width:63%;height:63%;transform:translate(-50%,-50%) rotate(45deg);border:1px solid currentColor;background:linear-gradient(140deg,rgba(255,255,255,.09),transparent 72%);opacity:.12}
.v24-shape{position:absolute;inset:10%;display:grid;place-items:center;opacity:0;transform:scale(.8) rotate(-15deg);transition:opacity .27s ease,transform .42s cubic-bezier(.18,.8,.22,1);visibility:hidden}
.v24-shape.v24-current{opacity:1;transform:scale(1) rotate(0deg);visibility:visible}
.v24-shape svg{display:block;width:100%;height:100%;overflow:visible;color:inherit}
.v24-mark{position:relative;width:75%;height:75%;border:2px solid currentColor;border-radius:50%;display:grid;place-items:center}
.v24-mark img{display:block;width:55%;height:65%;object-fit:contain}
.v24-mark-ring{position:absolute;inset:13%;border:1px dashed currentColor;border-radius:50%;opacity:.37}
.v24-portal{box-shadow:0 0 0 15px rgba(230,200,150,.06);border-width:3px}
.v24-device{width:63%;height:93%;border:3px solid currentColor;background:#0b0f17;border-radius:22px;padding:8px;box-shadow:0 10px 35px rgba(0,0,0,.6);transform:rotate(-6deg);overflow:hidden}
.v24-device-top{height:21px;display:flex;gap:4px;align-items:center}
.v24-device-top i{width:5px;height:5px;border-radius:50%;background:currentColor}
.v24-device-top span{margin-left:auto;color:#b5c0bd;font-size:6px;font-weight:700;letter-spacing:.08em}
.v24-device img{display:block;width:100%;height:calc(100% - 21px);object-fit:cover;object-position:top;border-radius:12px}
.v24-pulse-dot{position:absolute;width:8px;height:8px;background:#fff4d0;border-radius:50%;right:14%;top:17%;box-shadow:0 0 0 7px rgba(232,201,150,.12)}
.v24-caption{position:absolute;right:clamp(8px,1.2vw,20px);top:calc(34vh + 81px);color:#e4d8bd;display:flex;gap:8px;align-items:center;max-width:230px;white-space:nowrap;letter-spacing:.17em;font:700 9px system-ui;opacity:.68}
.v24-caption-number{color:var(--v24-accent);font:inherit}.v24-caption i{height:12px;width:1px;background:currentColor;opacity:.6}
.v24-trail{position:absolute;width:30vw;max-width:450px;height:2px;top:50vh;left:10vw;background:linear-gradient(90deg,transparent,var(--v24-accent),transparent);opacity:0;transform:rotate(-18deg) scaleX(.35)}
.v24-traveller.v24-traveling .v24-frame{animation:v24TravellerMove 1.04s cubic-bezier(.2,.74,.24,1) both}
.v24-traveller.v24-traveling .v24-outer-ring{animation:v24RingTurn 1.03s ease-in-out both}
.v24-traveller.v24-traveling .v24-trail{animation:v24TrailFlash .84s ease-out both}
.v24-traveller.v24-traveling .v24-caption{animation:v24CaptionOut 1.05s ease both}
@keyframes v24TravellerMove{
 0%{opacity:.58;transform:translate(-50%,-50%) scale(.34) rotate(-11deg)}
 18%{opacity:1;transform:translate(-50%,-50%) translate3d(-8vw,-2vh,0) scale(.52) rotate(-17deg)}
 35%{opacity:1;transform:translate(-50%,-50%) translate3d(var(--v24-dx),var(--v24-dy),0) scale(1.08) rotate(8deg)}
 57%{opacity:1;transform:translate(-50%,-50%) translate3d(var(--v24-dx),var(--v24-dy),0) scale(.98) rotate(0)}
 76%{opacity:.88;transform:translate(-50%,-50%) translate3d(-14vw,-2vh,0) scale(.53) rotate(-8deg)}
 100%{opacity:.75;transform:translate(-50%,-50%) scale(.34) rotate(0)}
}
@keyframes v24RingTurn{0%{transform:rotate(-10deg)}55%{transform:rotate(85deg)}100%{transform:rotate(110deg)}}
@keyframes v24TrailFlash{0%,100%{opacity:0;transform:rotate(-18deg) scaleX(.35)}37%{opacity:.85;transform:rotate(-18deg) scaleX(1)}65%{opacity:.4}}
@keyframes v24CaptionOut{0%,100%{opacity:.68}22%,65%{opacity:0}}
/* V23 shutter, typography, and chapter entrances remain, but V24 provides
   the single physical object so there are not two competing hero objects. */
body.v24-active .v23-stage .v23-visual{visibility:hidden!important;animation:none!important}
body.v24-active .v23-corner{display:none!important}
body.modal-open .v24-traveller{opacity:0!important;visibility:hidden!important}
@media(max-width:760px){
  .v24-traveller{--v24-dx:calc(31px - 50vw);--v24-dy:21vh}
  .v24-frame{left:calc(100vw - 31px);top:29vh;width:245px;height:245px;opacity:.48;transform:translate(-50%,-50%) scale(.30)}
  .v24-caption,.v24-trail{display:none}
  .v24-traveller.v24-traveling .v24-frame{animation-name:v24TravellerMobile;animation-duration:.74s}
  @keyframes v24TravellerMobile{
   0%{opacity:.45;transform:translate(-50%,-50%) scale(.30)}
   37%{opacity:.92;transform:translate(-50%,-50%) translate3d(var(--v24-dx),var(--v24-dy),0) scale(.75) rotate(9deg)}
   59%{opacity:.92;transform:translate(-50%,-50%) translate3d(var(--v24-dx),var(--v24-dy),0) scale(.78)}
   100%{opacity:.48;transform:translate(-50%,-50%) scale(.30)}
  }
}
@media(prefers-reduced-motion:reduce){.v24-traveller{display:none!important}.v24-traveller *{animation:none!important;transition:none!important}}
