/* Configurator poster stack (see poster-stack.js). Every card is a cached vector poster sized to the
   exact box fitPoster() gives that design; the active one hides behind the real #poster at rest
   and takes its place (same size, same scene) the moment a swipe starts. Positions/scales come
   from JS transforms (finger-follow + rAF settle), so no CSS transition runs on transform: a new
   touch takes over from wherever the row is, with no jump. The stack is clipped to the stage
   (no horizontal document overflow) and is its own stacking context below the figure. */
/* Equal vertical bleed keeps the 50% card/perspective centre unchanged while preventing
   shadows from being sliced into a visible horizontal panel edge during staging. Horizontal
   clipping stays intact; fitSize still uses the original gallery-stage dimensions. */
.poster-stack{position:absolute;inset:-96px 0;z-index:0;overflow:hidden;pointer-events:none;perspective:1400px;perspective-origin:50% 50%;transform-style:preserve-3d}
.poster-stack-card{position:absolute;left:50%;top:50%;width:0;height:0;transform-origin:50% 50%;opacity:0;box-shadow:0 12px 36px #00000038,0 4px 12px #00000024;background:transparent;will-change:transform,opacity;backface-visibility:hidden;transition:filter .2s ease}
.poster-stack-card:not(.is-ready){visibility:hidden}
.poster-stack-card svg{display:block;width:100%;height:100%;pointer-events:none}
/* Side cards read as recessed; the centre card (only visible while staging) is the poster itself. */
.poster-stack-card{filter:brightness(.84) saturate(.92)}
.poster-stack.is-staging .poster-stack-card{filter:none}
/* While staging, the figure steps aside but remains the gesture surface for poster-zoom.js. */
.poster.is-stacked{opacity:0!important;box-shadow:none;background:transparent}
/* Invisible while the entry animation hides the poster, revealed on the same 600ms fade. */
.poster-stack{opacity:0;visibility:hidden;transition:opacity 600ms ease-in}
/* Gate the whole composited 3D layer, not only visibility: transformed children can otherwise
   flash through during Safari's initial paint. Remain revealed after the intro classes clear,
   so completing the main poster fade cannot restart or remove the side-card fade. */
.gallery-stage:has(.poster:not(.intro-pending):not(.intro-sky)) .poster-stack{opacity:1;visibility:visible}
.jewelry-preview .poster-stack{display:none}
@media(prefers-reduced-motion:reduce){.poster-stack-card{transition:none;will-change:auto}.poster-stack{transition:none}}
