/* Shared interaction and pagination; layouts keep their existing proportions. */
.image-carousel-track{display:flex;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory!important;scroll-behavior:auto;scrollbar-width:none;overscroll-behavior-x:contain;cursor:grab;user-select:none;min-width:0}
/* Inline tracks use native touch scrolling on both axes; only the dialog owns gestures. */
.image-carousel-track:not(.photo-dialog__track){touch-action:pan-x pan-y pinch-zoom}
.image-carousel-track::-webkit-scrollbar{display:none}
.image-carousel-track>*{scroll-snap-align:start;scroll-snap-stop:always;min-width:0}
.image-carousel-track.is-dragging,.image-carousel-track.is-settling{scroll-snap-type:none!important}
.image-carousel-track.is-dragging{cursor:grabbing}
.image-carousel-track img{ -webkit-user-drag:none }
/* The placeholder lives in server HTML too, before React enhances the gallery. */
[data-photo-loading]{position:relative;isolation:isolate}
.photo-loading{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;overflow:hidden;background:radial-gradient(ellipse at 50% 42%,#54321c80,transparent 65%),#1c1611;color:#d8b18b;pointer-events:none;text-align:center;padding:16px}
.photo-loading::before{content:"";position:absolute;inset:-50%;background:linear-gradient(110deg,transparent 40%,#ffc47708 50%,transparent 60%);animation:photo-loading-shimmer 3s ease-in-out infinite}
.photo-loading__ring{position:relative;width:52px;height:52px;border:1px solid #d8b18b33;border-radius:50%;box-shadow:inset 0 0 0 8px #d8b18b08,0 0 32px #ff9b2510}
.photo-loading__ring::after{content:"";position:absolute;inset:-2px;border:2px solid transparent;border-top-color:#ffb354;border-right-color:#ffb35450;border-radius:50%;animation:photo-loading-spin 1.2s linear infinite}
.photo-loading__text,.photo-loading__error{position:relative;font:500 12px/1.5 Arial,sans-serif;letter-spacing:.04em}
.photo-loading__error{display:none}
.photo-loading__error>span{display:block;margin-top:8px;color:#ffb354;text-decoration:underline;text-underline-offset:4px;font-size:11px}
[data-photo-state="ready"]>.photo-loading{display:none}
[data-photo-state="error"]>.photo-loading .photo-loading__text,[data-photo-state="error"]>.photo-loading .photo-loading__ring{display:none}
[data-photo-state="error"]>.photo-loading .photo-loading__error{display:block}
[data-photo-state="error"]>.photo-loading::before{animation:none}
@keyframes photo-loading-spin{to{transform:rotate(360deg)}}
@keyframes photo-loading-shimmer{from{transform:translateX(-35%)}to{transform:translateX(35%)}}
@media(prefers-reduced-motion:reduce){.photo-loading::before,.photo-loading__ring::after{animation:none}}
.image-carousel-dots{display:flex;justify-content:center;align-items:center;gap:5px;padding:10px 12px;max-width:100%;overflow:hidden;pointer-events:none}
.image-carousel-dots[hidden]{display:none}
.image-carousel-dots span{width:6px;height:6px;flex:0 0 6px;border-radius:50%;background:#a29b91;box-shadow:0 0 2px #0005}
.image-carousel-dots .active{background:#ff9b25}
.festival-gallery>.image-carousel-dots{position:absolute;bottom:0;left:0;right:0}
.festival-slide>img:not([src]){position:absolute;visibility:hidden}
.festival-track:not([data-carousel-visible="true"]) .photo-loading::before,.festival-track:not([data-carousel-visible="true"]) .photo-loading__ring::after{animation-play-state:paused}
.hero-photo-carousel>.image-carousel-dots{position:absolute;bottom:0;left:0;right:0;z-index:20}
/* A single banner needs no scrollport; keep its offset countdown fully visible. */
.hero-photo-carousel .image-carousel-track:has(> :only-child){overflow:visible}
.photo-carousel{min-width:0;max-width:100%;position:relative}
.photo-carousel-track>*{flex:0 0 100%;width:100%}
.photo-dialog{position:fixed;inset:0;width:100vw;height:100dvh;max-width:none;max-height:none;margin:0;padding:0;border:0;background:#080706;color:#fff;overflow:hidden}
.photo-dialog::backdrop{background:#080706}
.photo-dialog[open]{display:flex;flex-direction:column}
.photo-dialog__track{flex:1;min-height:0;width:100%;align-items:stretch;touch-action:pinch-zoom;transform:translateY(var(--carousel-dismiss-y,0px));transition:transform .18s ease-out}
.photo-dialog__track.is-swiping-up{transition:none}
.photo-dialog__slide{box-sizing:border-box;flex:0 0 100%;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:24px 20px 0}
.photo-dialog__slide img{display:block;width:100%;height:100%;object-fit:contain;pointer-events:none}
.photo-dialog__close{position:absolute;z-index:2;right:max(16px,env(safe-area-inset-right));top:max(16px,env(safe-area-inset-top));width:52px;height:52px;border-radius:50%;border:1px solid #ffffff70;background:#000b;color:#fff;font:38px/1 Arial;cursor:pointer}
.photo-dialog__details{flex-shrink:0;max-height:30dvh;overflow-y:auto;text-align:center;padding:4px 22px max(16px,env(safe-area-inset-bottom));font:14px/1.5 Arial,sans-serif}
.photo-dialog__details p{margin:4px 0;white-space:pre-line}
.photo-dialog__details strong{color:#ff9b25;margin-right:16px}
.photo-dialog__details>div:first-child a{color:#fff;text-decoration:underline;display:inline-block;margin-top:8px}
.photo-dialog__close:focus-visible,.image-carousel-track:focus-visible{outline:2px solid #ff9b25;outline-offset:-2px}
@media(prefers-reduced-motion:reduce){.photo-dialog__track{transition:none}}
