/* ── Manifesto / Party Rules — full-screen scroll-snap poster sequence ── */
/* Reuses the poster engine (assets/js/poster.js) blown up to fill the viewport.
   Shared by manifesto.html (currently a content-gap placeholder — see that
   file's comments) and rules.html (the standalone Party Rules page, item #5
   of the sitemap-gap build) so the slideshow styling doesn't get duplicated. */

body.page-manifesto,
body.page-rules {
  background: var(--black);
}

.manifesto-scroll {
  scrollbar-width: none;
}

.manifesto-scroll::-webkit-scrollbar { display: none; }

@media (prefers-reduced-motion: no-preference) {
  .manifesto-scroll {
    height: 100dvh;
    overflow-y: scroll;
    scroll-snap-type: y mandatory;
  }
  .manifesto-slide {
    scroll-snap-align: start;
    scroll-snap-stop: always;
  }
}

.manifesto-slide {
  min-height: 100dvh;
  display: flex;
}

.manifesto-slide .poster {
  min-height: 100dvh;
  width: 100%;
  border-radius: 0;
  padding: clamp(24px, 5vw, 72px);
}

/* Blow the rule poster's type up to full-screen scale */
.manifesto-slide .poster-wordmark--rule {
  font-size: clamp(40px, 8.5vw, 140px);
  line-height: 0.94;
}

.manifesto-slide .poster-kicker { font-size: clamp(12px, 1.4vw, 18px); }
.manifesto-slide .poster-tickets,
.manifesto-slide .poster-venue-name { font-size: clamp(12px, 1.4vw, 18px); }
.manifesto-slide .poster-starburst { width: clamp(84px, 9vw, 150px); }
.manifesto-slide .poster-script { font-size: clamp(20px, 2.2vw, 32px); }
.manifesto-slide .poster-logo span { width: clamp(22px, 2.6vw, 34px); height: clamp(22px, 2.6vw, 34px); font-size: clamp(8px, 1vw, 12px); }
.manifesto-slide .poster-footer-line { font-size: clamp(9px, 1vw, 13px); }

/* ── Progress rail ── */
.manifesto-progress {
  position: fixed;
  top: 50%;
  right: clamp(10px, 2vw, 22px);
  transform: translateY(-50%);
  display: flex;
  flex-direction: column;
  gap: 6px;
  z-index: 20;
}

.manifesto-progress-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.25);
  transition: background 0.2s, transform 0.2s;
}

.manifesto-progress-dot--active {
  background: var(--white);
  transform: scale(1.4);
}

/* ── Artist-contract closing slide ── */
.poster--contract {
  background: var(--black);
  color: var(--white);
  align-items: stretch;
  justify-content: space-between;
}

.poster--contract .poster-starburst { fill: var(--white); }
.poster--contract .poster-footer { border-top-color: rgba(255, 255, 255, 0.2); }

.contract-split {
  display: flex;
  gap: clamp(24px, 6vw, 80px);
  margin-top: auto;
}

.contract-side {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.contract-side--label { opacity: 0.55; }

.contract-num {
  font-family: var(--font-main);
  font-weight: 600;
  font-size: clamp(60px, 14vw, 220px);
  line-height: 0.86;
  letter-spacing: -0.03em;
}

@media (max-width: 640px) {
  .contract-split { gap: 32px; }

  /* A phone-height slide left the poster's `space-between` gap as most of the
     screen: meta row at the top, rule text pinned to the bottom, and ~60% dead
     colour in between. Centre the rule and cap the void instead. */
  .manifesto-slide .poster {
    justify-content: center;
    gap: 20px;
    padding: 20px;
  }
  .manifesto-slide .poster-top { position: absolute; top: 20px; left: 20px; right: 20px; }
  .manifesto-slide .poster-footer { position: absolute; bottom: 20px; left: 20px; right: 20px; }
  /* `.poster-mid` carries `margin-top: auto` to bottom-anchor the copy on a
     wall tile. In a flex column an auto margin absorbs all free space and
     beats `justify-content`, so the rule stayed pinned low — and, with the
     meta rows now out of flow, ran off the bottom of the slide. */
  .manifesto-slide .poster-mid { margin-top: 0; }
  .manifesto-slide .poster-wordmark--rule { font-size: clamp(38px, 12vw, 60px); }

  /* The rail sat ~10px from the edge, inside the thumb's swipe zone. */
  .manifesto-progress { right: 12px; gap: 8px; }
  .manifesto-progress-dot { width: 7px; height: 7px; }
}

@media (prefers-reduced-motion: no-preference) {
  /* Keeps a swipe past the last slide from scroll-chaining into the document
     behind it (and triggering iOS pull-to-refresh). */
  .manifesto-scroll { overscroll-behavior-y: contain; }
}
