/* ==========================================================================
   Property Poker Network
   Shared visual system for every public marketing page.
   ========================================================================== */

/*
  "The Seasons" (Bold) is PPN's licensed display serif (brand-reference.md
  §2), not self-hosted yet, since the licensed webfont files haven't been
  obtained from the foundry. --display already lists "The Seasons" first
  below, so there is nothing else to change once it's ready: with no
  matching @font-face registered, browsers silently skip it and fall
  through to the next name in the stack.

  Until then, every page loads Google's "Playfair Display" (see the
  <link> tags in each page's <head>) as an interim stand-in, a bold,
  high-contrast editorial serif in the same spirit as The Seasons,
  rather than every headline sitewide quietly falling all the way back
  to plain Georgia. It sits second in --display below, so it's a no-op
  the moment the real licensed font is dropped in.

  When the licensed .woff2 files are in hand: drop them in site/fonts/,
  uncomment this block, confirm the filenames/weights match, and remove
  the Playfair Display <link> tags from each page's <head>.

  @font-face {
    font-family: "The Seasons";
    src: url("fonts/TheSeasons-Bold.woff2") format("woff2");
    font-weight: 700;
    font-style: normal;
    font-display: swap;
  }
*/

:root {
  --paper: #f8f5ef;
  --paper-deep: #eee8de;
  --white: #fffdf9;
  --ink: #22191a;
  --ink-soft: #655b5b;
  --wine: #751515;
  --wine-dark: #2a1114;
  --wine-mid: #4b1115;
  --red: #cf5153;
  --gold: #e9c46d;
  --gold-light: #f5e6b3;
  --brown: #715734;
  --line: rgba(42, 17, 20, 0.15);
  --line-light: rgba(255, 255, 255, 0.16);
  --nicky-cyan: #47ded8;
  --nicky-orange: #ffc228;
  --nicky-red: #ff4f58;
  --display: "The Seasons", "Playfair Display", Georgia, "Iowan Old Style", "Palatino Linotype", ui-serif, serif;
  --body: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
  --container: 1200px;
  --side: clamp(20px, 4vw, 56px);
  --section: clamp(76px, 9vw, 132px);
  --shadow: 0 30px 80px rgba(28, 8, 11, 0.2);
  /* Soft pastel tints for info-card backgrounds only, mixed from existing brand tokens,
     deliberately distinct from the Nicky charity sub-palette (brand-reference.md §1c),
     which stays reserved for charity-pillar content. */
  --tint-wine: color-mix(in srgb, var(--red) 14%, var(--white));
  --tint-gold: color-mix(in srgb, var(--gold) 22%, var(--white));
  --tint-brown: color-mix(in srgb, var(--brown) 16%, var(--white));
  --tint-neutral: var(--paper-deep);
}

/* Reset and accessibility */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  overflow-x: hidden;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--body);
  font-size: 16px;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
}

body.menu-is-open {
  overflow: hidden;
}

img,
svg {
  display: block;
  max-width: 100%;
}

button,
input,
textarea,
select {
  font: inherit;
}

a {
  color: inherit;
}

h1,
h2,
h3,
h4,
p,
figure,
blockquote,
dl,
dd {
  margin: 0;
}

ul,
ol {
  margin: 0;
  padding: 0;
}

h1,
h2,
h3 {
  font-family: var(--display);
  font-weight: 700;
  line-height: 0.98;
  letter-spacing: -0.035em;
}

h1 {
  font-size: clamp(3.6rem, 8vw, 7.8rem);
}

h2 {
  font-size: clamp(2.6rem, 5vw, 5.35rem);
}

h3 {
  font-size: clamp(1.45rem, 2vw, 2rem);
}

::selection {
  background: var(--gold);
  color: var(--wine-dark);
}

:focus-visible {
  outline: 3px solid var(--gold);
  outline-offset: 4px;
}

.skip-link {
  position: fixed;
  left: 16px;
  top: 12px;
  z-index: 200;
  padding: 10px 16px;
  background: var(--gold);
  color: var(--wine-dark);
  font-weight: 800;
  transform: translateY(-150%);
}

.skip-link:focus {
  transform: translateY(0);
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.container {
  width: min(100%, var(--container));
  margin-inline: auto;
  padding-inline: var(--side);
}

.section {
  padding-block: var(--section);
}

.eyebrow {
  margin-bottom: 22px;
  color: var(--wine);
  font-size: 0.73rem;
  font-weight: 800;
  letter-spacing: 0.16em;
  line-height: 1.25;
  text-transform: uppercase;
}

.eyebrow--light {
  color: var(--gold);
}

.section-heading {
  max-width: 760px;
  margin-bottom: clamp(42px, 6vw, 72px);
}

.section-heading h2 {
  margin-bottom: 24px;
}

.section-heading > p:last-child {
  max-width: 590px;
  color: var(--ink-soft);
  font-size: clamp(1rem, 1.6vw, 1.16rem);
}

.section-heading--center {
  margin-inline: auto;
  text-align: center;
}

.section-heading--center > p:last-child {
  margin-inline: auto;
}

.button-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 22px;
  margin-top: 36px;
}

.button {
  display: inline-flex;
  min-height: 54px;
  align-items: center;
  justify-content: center;
  padding: 14px 25px;
  border: 1px solid transparent;
  border-radius: 100px;
  font-size: 0.83rem;
  font-weight: 800;
  letter-spacing: 0.04em;
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  transition: transform 180ms ease, background-color 180ms ease, color 180ms ease;
}

.button:hover {
  transform: translateY(-2px);
}

.button--small {
  min-height: 42px;
  padding: 12px 19px;
}

.button--gold {
  background: var(--gold);
  color: var(--wine-dark);
}

.button--gold:hover {
  background: var(--gold-light);
}

.button--light {
  background: var(--white);
  color: var(--wine-dark);
}

.button--ink {
  background: var(--wine-dark);
  color: var(--white);
}

.button--ink:hover {
  background: var(--wine);
}

.button--outline {
  background: transparent;
  border-color: rgba(255, 255, 255, 0.45);
  color: var(--white);
}

.button--outline:hover {
  background: rgba(255, 255, 255, 0.12);
  border-color: var(--white);
}

.button--block {
  width: 100%;
}

.text-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding-bottom: 3px;
  border-bottom: 1px solid currentColor;
  color: var(--wine);
  font-size: 0.86rem;
  font-weight: 800;
  text-decoration: none;
  transition: gap 180ms ease;
}

.text-link:hover {
  gap: 12px;
}

.text-link--light {
  color: var(--white);
}

.empty-state {
  padding: 28px;
  border: 1px dashed var(--line);
  color: var(--ink-soft);
}

/* Header */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  min-height: 84px;
  border-bottom: 1px solid rgba(233, 196, 109, 0.24);
  color: var(--white);
}

/* The header's blur/background lives on a pseudo-element rather than the
   header itself. backdrop-filter (like transform/filter) makes the element
   it's applied to a containing block for position:fixed descendants -
   with it on .site-header directly, the mobile nav's position:fixed
   dropdown was sizing itself against the ~84px header box instead of the
   viewport, collapsing to a sliver with no backdrop behind most of its
   content. Keeping the visual effect on ::before instead avoids that. */
.site-header::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background-color: #2a1114;
  background-image: linear-gradient(90deg, #2a1114 0%, #3a1217 58%, #241012 100%);
  backdrop-filter: blur(16px);
}

.site-header-inner {
  width: min(100%, var(--container));
  min-height: 84px;
  margin-inline: auto;
  padding-inline: var(--side);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 34px;
}

.site-brand {
  display: inline-flex;
  flex: none;
  align-items: center;
  gap: 13px;
  color: var(--white);
  text-decoration: none;
}

.brand-monogram {
  color: var(--red);
  font-family: var(--body);
  font-size: 1.45rem;
  font-weight: 900;
  letter-spacing: -0.06em;
}

.brand-name {
  padding-left: 13px;
  border-left: 1px solid var(--line-light);
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.11em;
  line-height: 1.25;
  text-transform: uppercase;
}

.site-navigation {
  display: flex;
  align-items: center;
  gap: 30px;
}

.site-navigation ul {
  display: flex;
  align-items: center;
  gap: 28px;
  list-style: none;
}

.site-navigation ul a {
  position: relative;
  padding-block: 8px;
  color: rgba(255, 253, 249, 0.82);
  font-family: Arial, Helvetica, sans-serif;
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.01em;
  text-decoration: none;
}

.site-navigation ul a::after {
  content: "";
  position: absolute;
  right: 0;
  bottom: 3px;
  left: 0;
  height: 1px;
  background: var(--gold);
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 180ms ease;
}

.site-navigation ul a:hover,
.site-navigation ul a.is-active {
  color: var(--white);
}

.site-navigation ul a:hover::after,
.site-navigation ul a.is-active::after {
  transform: scaleX(1);
  transform-origin: left;
}

/* Four CTA pills (Join the Community, Become a sponsor, Donate a prize,
   Next event) plus five nav links don't fit one row in the 1200px
   container without overflowing - even with white-space: nowrap forcing
   each pill to stay on one line, there simply isn't room for four pills.
   Per brand-reference.md §7a ("one accent leads per screen" - never two
   interactive accents competing at once), the fix is restraint, not a
   width hack: above the mobile breakpoint, only the single highest-
   priority CTA (Next event - ticket sales) stays a filled pill, and the
   other three drop back to plain text links, same treatment the old
   "Member sign in" link used. Below 820px the nav stacks vertically (see
   .site-navigation's mobile rules) where there's no width pressure, so
   all four stay full buttons there. */
@media (min-width: 821px) {
  .site-navigation .join-community-link,
  .site-navigation .sponsor-link,
  .site-navigation .donate-prize-link {
    min-height: auto;
    padding: 0;
    border: 0;
    border-radius: 0;
    background: transparent;
    color: var(--gold);
    font-family: Arial, Helvetica, sans-serif;
    font-size: 0.76rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    white-space: nowrap;
  }

  .site-navigation .join-community-link:hover,
  .site-navigation .sponsor-link:hover,
  .site-navigation .donate-prize-link:hover {
    background: transparent;
    border-color: transparent;
    color: var(--gold-light);
    transform: none;
  }
}

/* Between the mobile hamburger breakpoint (820px) and desktop (~1150px),
   five nav links plus three secondary CTA links (demoted to plain text
   above) still don't fit the 1200px container's available width, even
   with the existing Tablet breakpoint's gap reduction below. Isolated to
   its own range/rules rather than widening the Tablet breakpoint, so it
   doesn't also pull in that block's unrelated grid-column rules early. */
@media (min-width: 821px) and (max-width: 1150px) {
  /* The "Property Poker Network" wordmark next to the PPN monogram is the
     single biggest reclaimable chunk of header width in this range - the
     monogram alone still identifies the brand, same tradeoff already made
     below 520px (see .brand-name's other display:none rule). */
  .brand-name {
    display: none;
  }

  .site-header-inner {
    gap: 14px;
    padding-inline: 20px;
  }

  .site-navigation {
    gap: 10px;
  }

  .site-navigation ul {
    gap: 9px;
  }

  .site-navigation ul a {
    font-size: 0.7rem;
  }

  .site-navigation .join-community-link,
  .site-navigation .sponsor-link,
  .site-navigation .donate-prize-link {
    font-size: 0.62rem;
    letter-spacing: 0.03em;
  }

  .site-navigation .button--light {
    min-height: 38px;
    padding: 10px 16px;
  }
}

.menu-button {
  display: none;
  width: 46px;
  height: 46px;
  padding: 0;
  border: 1px solid var(--line-light);
  border-radius: 50%;
  background: transparent;
  color: var(--white);
}

.menu-button > span:not(.visually-hidden) {
  display: block;
  width: 19px;
  height: 1px;
  margin: 5px auto;
  background: currentColor;
  transition: transform 180ms ease;
}

.menu-button[aria-expanded="true"] > span:nth-last-child(2) {
  transform: translateY(3px) rotate(45deg);
}

.menu-button[aria-expanded="true"] > span:last-child {
  transform: translateY(-3px) rotate(-45deg);
}

/* Home hero */
.home-hero {
  position: relative;
  overflow: hidden;
  background:
    radial-gradient(circle at 82% 22%, rgba(207, 81, 83, 0.18), transparent 29%),
    var(--wine-dark);
  color: var(--white);
}

.home-hero-copy {
  position: relative;
  z-index: 2;
  padding-top: clamp(72px, 9vw, 128px);
  max-width: 1040px;
}

.home-hero h1 {
  max-width: 980px;
  font-size: clamp(5.4rem, 10.5vw, 10.8rem);
  letter-spacing: -0.055em;
}

.home-hero h1 em {
  color: var(--gold);
  font-weight: inherit;
}

.home-hero-lead {
  max-width: 610px;
  margin-top: 32px;
  color: rgba(255, 255, 255, 0.73);
  font-size: clamp(1.05rem, 1.5vw, 1.25rem);
  line-height: 1.65;
}

/* The hero's two stories, side by side: past events (fan, left) and the
   next-event invitation (right). "Discover our journey. Receive your
   invitation. Join the next table." */
.hero-story {
  position: relative;
  z-index: 2;
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  align-items: start;
  gap: clamp(32px, 5vw, 72px);
  margin-top: clamp(56px, 9vw, 104px);
  padding-bottom: clamp(48px, 7vw, 88px);
}

/* Signature Playing Card Gallery, a fanned "hand" of past PPN events, the
   homepage's signature visual. Cards show real photography or, lacking
   that, an illustrated card back, never a broken/generic image. */
.event-fan {
  position: relative;
}

.event-fan-list {
  display: flex;
  align-items: flex-end;
  justify-content: flex-start;
  list-style: none;
}

.event-fan-card {
  --fan-rotate: 0deg;
  --fan-lift: 0px;
  position: relative;
  flex: none;
  width: clamp(160px, 16vw, 224px);
  aspect-ratio: 3 / 4.3;
  overflow: hidden;
  border-radius: 1.2rem;
  border: 1px solid rgba(255, 255, 255, 0.16);
  box-shadow: var(--shadow);
  background: var(--wine-mid);
  transform: translateY(var(--fan-lift)) rotate(var(--fan-rotate));
  transform-origin: bottom center;
  transition: transform 320ms cubic-bezier(0.2, 0.7, 0.2, 1), box-shadow 320ms ease;
}

.event-fan-card + .event-fan-card {
  margin-left: -30px;
}

.event-fan-card:nth-child(1) {
  --fan-rotate: -18deg;
  --fan-lift: 10px;
  z-index: 1;
}

.event-fan-card:nth-child(2) {
  --fan-rotate: -1deg;
  --fan-lift: -10px;
  z-index: 2;
}

.event-fan-card:nth-child(3) {
  --fan-rotate: 16deg;
  --fan-lift: 12px;
  z-index: 3;
}

/* Photo/back-card hover only deepens the shadow, the flip itself (on the
   .event-fan-flip button inside) is the hover feedback, so the outer card
   doesn't also lift/rotate on top of it (one effect per element). */
.event-fan-card--photo:hover,
.event-fan-card--back:hover,
.event-fan-card--photo:has(.is-flipped),
.event-fan-card--back:has(.is-flipped) {
  z-index: 9;
  box-shadow: 0 40px 90px rgba(28, 8, 11, 0.34);
}

/* Flip mechanism: a real <button> so hover (mouse), click (touch) and
   Enter/Space (keyboard) all work with one handler, see
   initialisePpnEventFanFlip() in site.js for the click/tap toggle.
   Deliberately 2D, not a true rotateY/backface-visibility 3D flip: every
   browser tested renders a bright hairline seam right at the edge-on 90°
   point of a real 3D flip (a well-known CSS 3D-transform rendering
   artifact, confirmed here even after backface-visibility vendor
   prefixes, translateZ layer separation, perspective tuning and removing
   will-change/overflow, none of which eliminated it). The stats face sits
   fully rendered underneath the whole time; the front face's own scaleX
   shrinks to reveal it. Visually reads as a flip, with zero 3D rasterising
   and so nothing to glitch. */
.event-fan-flip {
  display: block;
  position: relative;
  width: 100%;
  height: 100%;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: inherit;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.event-fan-face {
  position: absolute;
  inset: 0;
}

.event-fan-face--front {
  z-index: 2;
  transform: scaleX(1);
  transform-origin: center;
  transition: transform 480ms cubic-bezier(0.65, 0, 0.35, 1);
}

.event-fan-flip.is-flipped .event-fan-face--front {
  transform: scaleX(0);
}

@media (hover: hover) and (pointer: fine) {
  .event-fan-flip:hover .event-fan-face--front,
  .event-fan-flip:focus-visible .event-fan-face--front {
    transform: scaleX(0);
  }
}

.event-fan-face--stats {
  z-index: 1;
  display: flex;
  flex-direction: column;
  padding: 16px;
  background: var(--wine-dark);
  color: var(--white);
}

.event-fan-face--front img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(0.8) contrast(1.05);
}

.event-fan-caption {
  position: absolute;
  inset: auto 0 0 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 14px;
  background: linear-gradient(to top, rgba(20, 6, 8, 0.82), transparent);
  color: var(--white);
  font-size: 0.68rem;
}

.event-fan-caption strong {
  font-family: var(--display);
  font-size: 0.95rem;
}

.event-fan-stats-eyebrow {
  margin-bottom: 12px;
  color: var(--gold);
  font-size: 0.6rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.event-fan-stats-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  overflow: hidden;
}

.event-fan-stats-list > div {
  padding-top: 7px;
  border-top: 1px solid rgba(255, 255, 255, 0.16);
}

.event-fan-stats-list > div:first-child {
  padding-top: 0;
  border-top: 0;
}

.event-fan-stats-list dt {
  margin-bottom: 2px;
  color: rgba(255, 255, 255, 0.55);
  font-size: 0.56rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.event-fan-stats-list dd {
  margin: 0;
  font-family: var(--display);
  font-size: 0.82rem;
  font-weight: 700;
  line-height: 1.2;
}

.event-fan-face--illustrated {
  display: flex;
  align-items: center;
  justify-content: center;
  background:
    radial-gradient(circle at center, rgba(233, 196, 109, 0.14), transparent 60%),
    var(--wine-mid);
}

.event-fan-back-monogram {
  font-family: var(--display);
  font-size: 1.4rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--gold);
  border: 1px solid rgba(233, 196, 109, 0.5);
  border-radius: 50%;
  width: 58px;
  height: 58px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.event-fan-back-pip {
  position: absolute;
  color: rgba(233, 196, 109, 0.55);
  font-size: 1.1rem;
}

.event-fan-back-pip--tl {
  top: 14px;
  left: 14px;
}

.event-fan-back-pip--br {
  right: 14px;
  bottom: 14px;
}

.event-fan-card--back .event-fan-caption {
  background: linear-gradient(to top, rgba(20, 6, 8, 0.9), transparent);
}

/* Next-Event Invitation, the hero's second story, deliberately distinct
   from the paper-toned site elsewhere: a dark, gold-foil "invitation"
   register drawn from luxury hospitality rather than a standard event
   card. The seal reuses .event-fan-back-monogram's own visual language so
   the two hero stories read as one system. */
.event-invitation {
  position: relative;
  padding: clamp(28px, 3vw, 38px);
  border-radius: 1.4rem;
  border: 1px solid rgba(233, 196, 109, 0.28);
  background:
    radial-gradient(circle at 78% 14%, rgba(233, 196, 109, 0.16), transparent 55%),
    var(--wine-mid);
  box-shadow: var(--shadow);
  color: var(--white);
  text-align: center;
  transition: transform 320ms cubic-bezier(0.2, 0.7, 0.2, 1), box-shadow 320ms ease;
}

.event-invitation:hover,
.event-invitation:focus-within {
  transform: translateY(-6px);
  box-shadow: 0 44px 100px rgba(28, 8, 11, 0.4);
}

.event-invitation-eyebrow {
  margin-bottom: 10px;
  color: var(--gold);
  font-size: 0.68rem;
  font-weight: 800;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.event-invitation-city {
  font-family: var(--display);
  font-size: clamp(2.3rem, 3.6vw, 3.1rem);
  font-weight: 700;
  letter-spacing: -0.04em;
  line-height: 1;
}

.event-invitation-date {
  margin-top: 8px;
  color: rgba(255, 255, 255, 0.62);
  font-size: 0.86rem;
  font-weight: 700;
}

.event-invitation-details {
  margin-top: 6px;
  color: rgba(255, 255, 255, 0.5);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.01em;
}

.event-invitation-seal {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 60px;
  height: 60px;
  margin: 22px auto;
  border: 1px solid rgba(233, 196, 109, 0.5);
  border-radius: 50%;
  font-family: var(--display);
  font-size: 1.2rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--gold);
  transition: transform 320ms ease;
}

.event-invitation:hover .event-invitation-seal {
  transform: scale(1.08) rotate(-4deg);
}

.event-invitation-copy {
  padding-top: 22px;
  border-top: 1px solid rgba(255, 255, 255, 0.16);
  color: rgba(255, 255, 255, 0.72);
  font-size: 0.92rem;
  line-height: 1.55;
}

.event-invitation .button {
  margin-top: 24px;
}

/* Curved divider, an architectural transition from the hero into the paper
   background below, not a decorative flourish. */
.hero-curve {
  position: relative;
  z-index: 1;
  line-height: 0;
  margin-top: -1px;
}

.hero-curve svg {
  display: block;
  width: 100%;
  height: clamp(44px, 6.5vw, 92px);
}

.hero-curve path {
  fill: var(--paper);
}

.hero-proof {
  position: relative;
  z-index: 4;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  border-top: 1px solid var(--line-light);
}

.hero-proof > div {
  padding: 26px clamp(12px, 2vw, 28px);
  border-right: 1px solid var(--line-light);
}

.hero-proof > div:first-child {
  padding-left: 0;
}

.hero-proof > div:last-child {
  border-right: 0;
}

.hero-proof strong,
.hero-proof span {
  display: block;
}

.hero-proof strong {
  color: var(--gold);
  font-family: var(--display);
  font-size: clamp(1.6rem, 3vw, 2.35rem);
  line-height: 1;
}

.hero-proof span {
  margin-top: 8px;
  color: rgba(255, 255, 255, 0.55);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

/* Home sections */

/* New pillar info-card row, directly beneath the hero's curved divider.
   Content is sourced entirely from content.pillars, no new copy here. */
.section--pillars {
  padding-top: clamp(16px, 3vw, 32px);
  padding-bottom: clamp(56px, 8vw, 96px);
  background: var(--paper);
}

.info-card-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 20px;
}

.info-card {
  padding: 34px 28px;
  border-radius: 1.2rem;
  background: var(--tint-neutral);
  transition: transform 180ms ease, box-shadow 180ms ease;
}

.info-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow);
}

.info-card:nth-child(1) {
  background: var(--tint-wine);
}

.info-card:nth-child(3) {
  background: var(--tint-brown);
}

.info-card:nth-child(4) {
  background: var(--tint-gold);
}

.info-card-icon {
  display: block;
  margin-bottom: 20px;
  color: var(--wine);
  font-size: 1.7rem;
  line-height: 1;
}

.info-card h3 {
  margin-bottom: 10px;
  font-size: 1.22rem;
}

.info-card > p:last-child {
  color: var(--ink-soft);
  font-size: 0.95rem;
  line-height: 1.55;
}

.section--statement {
  background: var(--white);
}

.statement-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.08fr) minmax(300px, 0.62fr);
  gap: clamp(54px, 10vw, 150px);
}

.statement-grid h2 {
  color: var(--wine-dark);
}

.statement-copy {
  padding-top: 49px;
  color: var(--ink-soft);
  font-size: clamp(1.02rem, 1.6vw, 1.2rem);
}

.statement-copy p + p {
  margin-top: 24px;
}

.section--process {
  background: var(--paper-deep);
}

.process-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  border-top: 1px solid var(--line);
  list-style: none;
}

.process-grid li {
  min-height: 340px;
  padding: 34px 34px 20px 0;
  border-right: 1px solid var(--line);
}

.process-grid li + li {
  padding-left: 34px;
}

.process-grid li:last-child {
  border-right: 0;
}

/* Oversized, hollow numerals bleeding into the heading below, the bold,
   editorial counterweight to the section's otherwise-quiet type. Solid at
   rest in browsers without text-stroke support (always legible), hollow
   where supported, filling in solid on hover as the one premium detail. */
.process-number {
  display: block;
  margin-bottom: 6px;
  font-family: var(--display);
  font-size: clamp(5.2rem, 8.5vw, 8.4rem);
  font-weight: 700;
  line-height: 0.85;
  letter-spacing: -0.03em;
  color: var(--wine);
  transition: color 320ms ease, -webkit-text-stroke-color 320ms ease;
}

@supports (-webkit-text-stroke: 1px black) {
  .process-number {
    color: transparent;
    -webkit-text-stroke: 1.5px var(--wine);
  }

  .process-grid li:hover .process-number {
    color: var(--wine);
    -webkit-text-stroke: 1.5px transparent;
  }
}

.process-grid h3 {
  margin-bottom: 16px;
}

.process-grid p {
  max-width: 290px;
  color: var(--ink-soft);
  font-size: 0.91rem;
}

.charity-feature {
  position: relative;
  overflow: hidden;
  background:
    radial-gradient(ellipse 70% 60% at 12% 8%, color-mix(in srgb, var(--nicky-cyan) 55%, white) 0%, transparent 60%),
    linear-gradient(160deg, color-mix(in srgb, var(--nicky-cyan) 92%, white) 0%, var(--nicky-cyan) 45%, color-mix(in srgb, var(--nicky-cyan) 88%, black) 100%);
}

.charity-feature::after {
  content: "";
  position: absolute;
  top: -110px;
  right: -60px;
  width: 320px;
  height: 320px;
  border: 80px solid rgba(255, 194, 40, 0.72);
  border-radius: 50%;
  box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15);
}

.charity-feature-grid {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(330px, 0.72fr);
  align-items: end;
  gap: clamp(70px, 10vw, 150px);
}

.charity-feature-copy h2 {
  max-width: 760px;
  margin-bottom: 28px;
}

.charity-feature-copy > p:not(.eyebrow) {
  max-width: 720px;
  margin-bottom: 32px;
  color: rgba(34, 25, 26, 0.78);
}

.charity-impact {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  border-top: 1px solid rgba(34, 25, 26, 0.25);
}

.charity-impact > div {
  padding: 28px 28px 28px 0;
}

.charity-impact > div + div {
  padding-left: 28px;
  border-left: 1px solid rgba(34, 25, 26, 0.25);
}

.charity-impact strong,
.charity-impact span {
  display: block;
}

.charity-impact strong {
  font-family: var(--display);
  font-size: clamp(2.8rem, 5vw, 4.6rem);
  line-height: 1;
}

.charity-impact span {
  margin-top: 10px;
  font-size: 0.75rem;
  font-weight: 800;
  line-height: 1.4;
  text-transform: uppercase;
}

.charity-impact blockquote {
  grid-column: 1 / -1;
  padding-top: 36px;
  border-top: 1px solid rgba(34, 25, 26, 0.25);
  font-family: var(--display);
  font-size: clamp(1.6rem, 3vw, 2.6rem);
  font-weight: 700;
  line-height: 1.1;
}

.section--photo-story {
  background: var(--wine-dark);
  color: var(--white);
}

.section--photo-story .section-heading > p:last-child {
  color: rgba(255, 255, 255, 0.55);
}

.section--photo-story .text-link {
  color: var(--gold);
}

.photo-story-heading {
  display: flex;
  align-items: end;
  justify-content: space-between;
  gap: 28px;
  margin-bottom: clamp(42px, 6vw, 72px);
}

/* One collage per event, stacked, richer/larger than a single shared grid,
   and each city keeps its own real photos and real guest count rather than
   forcing two events to share one collage. */
.photo-story-block + .photo-story-block {
  margin-top: clamp(56px, 8vw, 96px);
}

.photo-story-block-label {
  margin-bottom: 20px;
  color: var(--gold);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.photo-story-grid {
  display: grid;
  grid-template-columns: 1.45fr 0.78fr 0.78fr;
  grid-template-rows: 240px 240px;
  gap: 12px;
}

.photo-story-grid figure {
  overflow: hidden;
}

.photo-story-grid img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(0.8);
  transition: transform 500ms ease, filter 500ms ease;
}

.photo-story-grid figure:hover img {
  transform: scale(1.03);
  filter: saturate(1);
}

.photo-story-wide {
  grid-row: 1 / -1;
}

.photo-story-tall {
  grid-row: 1 / -1;
}

.photo-story-note {
  display: flex;
  flex-direction: column;
  justify-content: end;
  padding: 24px;
  background: var(--gold);
  color: var(--wine-dark);
}

.photo-story-note strong {
  font-family: var(--display);
  font-size: 4.7rem;
  letter-spacing: -0.06em;
  line-height: 0.8;
}

.photo-story-note span {
  margin-top: 16px;
  font-size: 0.72rem;
  font-weight: 800;
  line-height: 1.35;
  text-transform: uppercase;
}

/* community.html's "you're already in the room" proof section: six real
   guest photos (picked for genuinely happy/excited faces, not just room
   shots), all the same size in an even grid, same image treatment as
   .photo-story-grid, then supporting copy underneath rather than a stat
   card, since the point here is belonging, not a number. */
.community-proof-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
  margin-top: clamp(36px, 5vw, 56px);
}

.community-proof-grid figure {
  overflow: hidden;
  aspect-ratio: 4 / 3;
}

.community-proof-grid img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(0.85);
  transition: transform 500ms ease, filter 500ms ease;
}

.community-proof-grid figure:hover img {
  transform: scale(1.03);
  filter: saturate(1);
}

.community-proof-copy {
  max-width: 640px;
  margin: clamp(28px, 4vw, 40px) auto 0;
  color: var(--ink-soft);
  font-size: clamp(1.05rem, 1.5vw, 1.2rem);
  line-height: 1.65;
  text-align: center;
}

.section--sponsors {
  background: var(--white);
}

.section-after-link {
  margin-top: 38px;
  text-align: center;
}

.section--faq {
  background: var(--paper);
}

.faq-layout,
.faq-page-layout {
  display: grid;
  grid-template-columns: minmax(270px, 0.58fr) minmax(0, 1fr);
  gap: clamp(60px, 10vw, 150px);
}

.faq-intro h2,
.faq-contact h2 {
  margin-bottom: 25px;
}

.faq-intro > p:not(.eyebrow),
.faq-contact > p:not(.eyebrow) {
  margin-bottom: 28px;
  color: var(--ink-soft);
}

.faq-list {
  border-top: 1px solid var(--line);
}

.faq-item {
  border-bottom: 1px solid var(--line);
}

.faq-item summary {
  padding: 24px 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 22px;
  cursor: pointer;
  font-family: var(--display);
  font-size: clamp(1.15rem, 2vw, 1.45rem);
  font-weight: 700;
  line-height: 1.25;
  list-style: none;
  transition: color 180ms ease;
}

.faq-item summary:hover {
  color: var(--wine);
}

.faq-item summary::-webkit-details-marker {
  display: none;
}

.faq-icon {
  position: relative;
  width: 26px;
  height: 26px;
  flex: none;
  border: 1px solid var(--line);
  border-radius: 50%;
}

.faq-icon::before,
.faq-icon::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 10px;
  height: 1px;
  background: var(--wine);
  transform: translate(-50%, -50%);
}

.faq-icon::after {
  transform: translate(-50%, -50%) rotate(90deg);
  transition: transform 180ms ease;
}

.faq-item[open] .faq-icon::after {
  transform: translate(-50%, -50%) rotate(0);
}

.faq-answer {
  max-width: 680px;
  padding: 0 54px 28px 0;
  color: var(--ink-soft);
}

.final-callout-section {
  background: var(--paper);
}

.final-callout {
  padding: clamp(44px, 8vw, 92px);
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: 45px;
  background:
    radial-gradient(circle at 90% 20%, rgba(207, 81, 83, 0.24), transparent 28%),
    var(--wine-dark);
  color: var(--white);
}

.final-callout .eyebrow {
  grid-column: 1 / -1;
  margin-bottom: -12px;
}

.final-callout h2 {
  max-width: 860px;
}

/* Shared page hero */
.page-hero {
  padding-block: clamp(90px, 12vw, 160px);
  overflow: hidden;
  background:
    linear-gradient(90deg, transparent 68%, rgba(207, 81, 83, 0.13) 68%),
    var(--wine-dark);
  color: var(--white);
}

.page-hero-inner {
  position: relative;
}

.page-hero h1 {
  position: relative;
  z-index: 1;
  max-width: 980px;
  font-size: clamp(4rem, 8vw, 8.2rem);
}

.page-hero-copy {
  position: relative;
  z-index: 1;
  max-width: 690px;
  margin-top: 30px;
  color: rgba(255, 255, 255, 0.66);
  font-size: clamp(1.05rem, 1.7vw, 1.26rem);
}

/* When a hero passes real content (see renderPpnPageHero's asideHtml
   param), that content takes the top-right space, so the heading's own
   max-width (980px, see .page-hero h1 above) is narrowed here to keep
   clear of it. */
.page-hero--has-aside h1 {
  max-width: 700px;
}

.page-hero h1 em {
  color: var(--gold);
  font-weight: inherit;
  font-style: normal;
}

/* .page-hero's own padding-block puts equal padding above AND below its
   content, so a .hero-curve div (last child, meant to sit flush against
   the section's true bottom edge, matching home's .home-hero treatment)
   ends up with a band of plain dark padding beneath it instead - the
   "broken" gap between the curve and the next section. This modifier
   moves that bottom spacing onto the inner content instead, so the curve
   is genuinely the last visible thing in the section. */
.page-hero--curved {
  padding-bottom: 0;
}

.page-hero--curved .page-hero-inner {
  padding-bottom: clamp(90px, 12vw, 160px);
}

/* Solid gold, not outlined - this is the one place brand-reference.md §7a
   reserves gold for ("prize/highlight/impact moments... the £10,000+
   figure"), so it should read as a bold claim, not a quiet decoration. */
.hero-stat-card {
  position: absolute;
  top: -74px;
  right: var(--side);
  z-index: 1;
  width: 300px;
  padding: 32px 30px;
  background: var(--gold);
  box-shadow: var(--shadow);
  transform: rotate(5deg);
}

.hero-stat-card > div {
  padding-top: 16px;
  border-top: 1px solid rgba(42, 17, 20, 0.18);
}

.hero-stat-card > div:first-child {
  padding-top: 0;
  border-top: 0;
}

.hero-stat-card dt {
  margin-bottom: 6px;
  color: rgba(42, 17, 20, 0.66);
  font-size: 0.62rem;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.hero-stat-card dd {
  margin: 0;
  font-family: var(--display);
  font-weight: 700;
  line-height: 1;
  color: var(--wine-dark);
}

/* The headline claim - everything else on the card supports this number. */
.hero-stat-primary dd {
  font-size: 3.2rem;
  white-space: nowrap;
}

.hero-stat-secondary dd {
  font-size: 1.5rem;
}

/* About */
.origin-grid {
  display: grid;
  grid-template-columns: minmax(330px, 0.82fr) minmax(0, 1fr);
  align-items: center;
  gap: clamp(60px, 11vw, 150px);
}

.origin-image {
  position: relative;
}

.origin-image::after {
  content: "";
  position: absolute;
  right: -20px;
  bottom: -20px;
  width: 55%;
  height: 52%;
  border-right: 1px solid var(--red);
  border-bottom: 1px solid var(--red);
}

.origin-image img {
  width: 100%;
  min-height: 520px;
  object-fit: cover;
}

.origin-copy h2 {
  margin-bottom: 28px;
}

.origin-copy > p:not(.eyebrow) {
  color: var(--ink-soft);
}

.origin-copy > p + p {
  margin-top: 20px;
}

.inline-proof {
  margin-top: 38px;
  padding-top: 26px;
  display: flex;
  gap: 46px;
  border-top: 1px solid var(--line);
}

.inline-proof span {
  color: var(--ink-soft);
  font-size: 0.78rem;
  font-weight: 700;
}

.inline-proof strong {
  display: block;
  color: var(--wine);
  font-family: var(--display);
  font-size: 2.3rem;
  line-height: 1;
}

.pillar-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
}

.pillar-card {
  min-height: 320px;
  padding: 30px;
  display: flex;
  flex-direction: column;
  background: var(--white);
  border-top: 3px solid var(--gold);
  box-shadow: 0 16px 34px rgba(28, 8, 11, 0.12);
}

.pillar-card:nth-child(3) {
  background: var(--wine);
  color: var(--white);
}

.pillar-card:nth-child(3) p {
  color: rgba(255, 255, 255, 0.68);
}

.pillar-label {
  margin-bottom: auto;
  color: var(--wine);
  font-size: 0.67rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.pillar-card h3 {
  margin-bottom: 16px;
}

.pillar-card > p:last-child {
  color: var(--ink-soft);
  font-size: 0.86rem;
}

.charity-feature--about .charity-feature-grid {
  align-items: center;
}

.charity-meta {
  margin: 36px 0;
  display: flex;
  flex-wrap: wrap;
  gap: 26px 46px;
  list-style: none;
  font-size: 0.83rem;
  font-weight: 700;
}

.charity-meta span {
  display: block;
  color: rgba(34, 25, 26, 0.6);
  font-size: 0.65rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.charity-impact--large {
  grid-template-columns: 1fr;
  border-top: 0;
}

.charity-impact--large > div {
  padding: 28px 0;
  border-top: 1px solid rgba(34, 25, 26, 0.25);
}

.charity-impact--large > div + div {
  padding-left: 0;
  border-left: 0;
}

.charity-impact--large strong {
  font-size: clamp(3.8rem, 6vw, 6rem);
}

/* Sponsors - compact event fact-strip (date/name/venue only, no logos;
   replaces what used to be a heading + scrolling marquee per event). */
.sponsor-timeline-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(30px, 5vw, 60px);
}

.sponsor-timeline-item {
  padding-top: 22px;
  border-top: 1px solid var(--line);
}

.sponsor-timeline-item .eyebrow {
  margin-bottom: 10px;
}

.sponsor-timeline-item h3 {
  margin: 0 0 8px;
  font-family: var(--display);
  font-size: clamp(1.7rem, 2.6vw, 2.3rem);
}

.sponsor-timeline-venue {
  margin: 0;
  color: var(--ink-soft);
  font-size: 0.95rem;
}

/* Sponsor logo wall - animated, clickable partner grid (site/pages.js:
   renderPpnSponsorLogoWall / initPpnSponsorLogoWall). Used full-size in
   its own section on sponsors.html, and again in compact form embedded
   in the homepage's "Good company" section (.sponsor-wall-grid--compact).
   Self-contained: no rules here are shared with .event-fan (the
   homepage's flip carousel). Desktop: 6 columns x 3 rows (18 tiles, all
   visible). Narrower breakpoints below reduce to 12 visible tiles via
   nth-child hiding rather than re-rendering markup, reflowing into 4x3
   then 3x4. */
.sponsor-wall-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 16px;
  margin-top: clamp(36px, 5vw, 56px);
}

/* Compact variant (homepage): same 6x3 layout, smaller logos within the
   same tile footprint - extra face padding shrinks the visible logo
   without shrinking the grid itself, same trick the old static homepage
   grid used. */
.sponsor-wall-grid--compact {
  margin-top: clamp(40px, 6vw, 64px);
}

.sponsor-wall-grid--compact .sponsor-wall-tile-face {
  padding: clamp(24px, 4vw, 36px);
}

.sponsor-wall-grid:focus-visible {
  outline: none;
}

.sponsor-wall-tile {
  aspect-ratio: 4 / 3;
  perspective: 1000px;
  transition: transform 220ms ease;
}

.sponsor-wall-tile:hover,
.sponsor-wall-tile:focus-visible {
  transform: translateY(-3px);
}

.sponsor-wall-tile-inner {
  position: relative;
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
  transition: transform 700ms cubic-bezier(0.65, 0, 0.35, 1);
  will-change: transform;
}

.sponsor-wall-tile-face {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(16px, 3vw, 26px);
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: 14px;
  backface-visibility: hidden;
  transition: border-color 220ms ease, box-shadow 220ms ease;
}

.sponsor-wall-tile-face--back {
  transform: rotateY(180deg);
}

/* Faces are real links now (see renderPpnSponsorLogoWallFace) - a face
   without an href just isn't focusable/clickable, no separate styling
   needed for that case. */
.sponsor-wall-tile:hover .sponsor-wall-tile-face,
.sponsor-wall-tile:focus-visible .sponsor-wall-tile-face,
.sponsor-wall-tile-face:focus-visible {
  border-color: var(--gold);
  box-shadow: var(--shadow);
}

.sponsor-wall-tile-face img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  /* Same trick as .sponsor-marquee-logo: multiply blend on a white tile
     hides a white/near-white logo background without needing a
     transparent asset for every sponsor. */
  mix-blend-mode: multiply;
}

/* Motion-safe fallback: no 3D flip, a gentle crossfade between faces
   instead. The JS keeps running exactly the same (still swaps images,
   still toggles .is-flipped) - only the visual transition changes here. */
@media (prefers-reduced-motion: reduce) {
  .sponsor-wall-tile-inner {
    transition: none;
    transform: none !important;
  }

  .sponsor-wall-tile-face {
    transition: opacity 500ms ease, border-color 220ms ease, box-shadow 220ms ease;
  }

  .sponsor-wall-tile-face--back {
    transform: none;
    opacity: 0;
  }

  .sponsor-wall-tile.is-flipped .sponsor-wall-tile-face--front {
    opacity: 0;
  }

  .sponsor-wall-tile.is-flipped .sponsor-wall-tile-face--back {
    opacity: 1;
  }
}

@media (max-width: 1020px) {
  .sponsor-wall-grid {
    grid-template-columns: repeat(4, 1fr);
  }

  .sponsor-wall-tile:nth-child(n + 13) {
    display: none;
  }
}

@media (max-width: 780px) {
  .sponsor-wall-grid {
    grid-template-columns: repeat(3, 1fr);
    gap: 12px;
  }
}

.sponsor-enquiry {
  background: var(--wine);
  color: var(--white);
}

.sponsor-enquiry-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(320px, 0.55fr);
  align-items: end;
  gap: clamp(60px, 10vw, 140px);
}

.sponsor-enquiry h2 {
  max-width: 750px;
  margin-bottom: 20px;
}

.sponsor-enquiry-grid > div:last-child > p {
  margin-bottom: 30px;
  color: rgba(255, 255, 255, 0.7);
}

/* Gallery, one collective grid, not grouped by event. Sits inside the
   normal .container (see renderPpnGalleryPage) rather than running
   edge to edge, matching every other section on the site. */
.gallery-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-flow: dense;
  grid-auto-rows: 185px;
  gap: 20px;
}

.gallery-item {
  overflow: hidden;
  border-radius: 10px;
  background: var(--paper-deep);
}

/* Every source photo is one of two native shapes: landscape (~3:2) or
   portrait (~2:3). A plain 1x1 cell at this grid's column width and row
   height (see above) lands within a few percent of the landscape ratio
   already - it's this tall variant, for the portrait photos, that needs
   its own span: one column but two rows, which at these dimensions
   comes out close to 2:3 too. Both shapes crop only a sliver either
   way, not enough to risk cropping a person out of frame. */
.gallery-item--tall {
  grid-row: span 2;
}

.gallery-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(0.82);
  transition: transform 450ms ease, filter 450ms ease;
}

.gallery-item:hover img {
  transform: scale(1.035);
  filter: saturate(1);
}

/* FAQ page */
.faq-contact {
  position: sticky;
  top: 130px;
  align-self: start;
}

.faq-list--large .faq-item summary {
  padding-block: 30px;
  font-size: clamp(1.3rem, 2.3vw, 1.8rem);
}

/* Tickets */
.ticket-hero {
  padding-block: clamp(80px, 10vw, 130px);
  background: var(--wine-dark);
  color: var(--white);
}

.ticket-hero-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(340px, 0.48fr);
  align-items: center;
  gap: clamp(60px, 10vw, 140px);
}

.ticket-hero h1 {
  font-size: clamp(5rem, 11vw, 10rem);
}

.ticket-hero-date {
  margin-top: 16px;
  color: var(--gold);
  font-family: var(--display);
  font-size: clamp(1.8rem, 4vw, 3.2rem);
  font-weight: 700;
  line-height: 1;
}

.ticket-hero-copy {
  max-width: 660px;
  margin-top: 30px;
  color: rgba(255, 255, 255, 0.64);
  font-size: 1.08rem;
}

.ticket-status-card {
  padding: 36px;
  background: var(--paper);
  color: var(--ink);
}

.ticket-status-card > p:first-of-type {
  display: inline;
  color: var(--wine);
  font-size: 0.68rem;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.status-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  margin-right: 8px;
  border-radius: 50%;
  background: var(--red);
}

.ticket-status-card h2 {
  margin: 34px 0 20px;
  font-size: clamp(2.4rem, 4vw, 3.4rem);
}

.ticket-status-card > p:not(:first-of-type) {
  margin-bottom: 28px;
  color: var(--ink-soft);
  font-size: 0.9rem;
}

.ticket-details-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(360px, 0.75fr);
  gap: clamp(70px, 12vw, 160px);
}

/* No "What we know" fact list alongside it anymore (removed - date, city,
   and time now live in the hero instead) - the prize panel stands alone,
   centred rather than stretching to the old two-column width. */
.ticket-details-grid--single {
  grid-template-columns: minmax(0, 1fr);
  justify-items: center;
}

.ticket-details-grid--single .prize-panel {
  width: 100%;
  max-width: 620px;
}

.ticket-details-grid h2 {
  margin-bottom: 36px;
}

.prize-panel {
  padding: clamp(32px, 5vw, 52px);
  background: var(--gold);
}

.prize-panel h2 {
  font-size: clamp(2.6rem, 5vw, 4rem);
}

.prize-panel-intro {
  margin: 14px 0 22px;
  color: rgba(34, 25, 26, 0.66);
  font-size: 0.95rem;
}

.prize-list {
  display: grid;
  gap: 0;
  border-top: 1px solid rgba(34, 25, 26, 0.25);
  list-style: none;
}

.prize-list li {
  padding: 17px 0;
  display: grid;
  grid-template-columns: 25px 1fr;
  gap: 8px;
  border-bottom: 1px solid rgba(34, 25, 26, 0.25);
  font-size: 0.88rem;
  font-weight: 700;
}

.prize-list li span {
  color: var(--wine);
}

.prize-note {
  margin-top: 26px;
  color: rgba(34, 25, 26, 0.66);
  font-size: 0.72rem;
}

/* Recent-prizes showcase under the At Stake block - dark, full-bleed,
   deliberately its own moment rather than a footnote to the gold prize
   panel above it (site/pages.js: renderPpnWinnersSection). Photo and
   prize only, no names - see the "no winner names" note in content.js.
   A literal three-tile podium (1st/2nd/3rd) leads the section, with
   every other photographed prize underneath in one uniform grid. */
.winners-section {
  background: var(--wine-dark);
  color: var(--white);
}

.winners-section .eyebrow {
  color: var(--gold);
}

.winners-section .section-heading h2 {
  color: var(--white);
}

.winners-section .section-heading p:not(.eyebrow) {
  color: rgba(255, 255, 255, 0.62);
}

/* Podium: 2nd/1st/3rd left to right (HTML order), bottom-aligned so
   each tile's plinth sits on one shared baseline. Tile width follows
   the photo's own orientation (portrait vs landscape - see
   renderPpnPodiumTile), not rank, so a landscape photo gets the wider
   box it needs to show in full rather than being squeezed into a
   portrait frame and cropped. Rank is read from the plinth height
   (tallest under 1st) rather than a badge over the photo, so the image
   itself stays clear for the prize title. */
.winners-podium {
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: clamp(14px, 3vw, 28px);
  margin-top: clamp(36px, 5vw, 56px);
}

.podium-tile {
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

.podium-tile--portrait {
  width: 250px;
}

.podium-tile--landscape {
  width: 330px;
}

.podium-plinth {
  width: 100%;
  margin-top: -1px;
  border-radius: 0 0 10px 10px;
  background: linear-gradient(180deg, rgba(233, 196, 109, 0.22), rgba(233, 196, 109, 0.06));
  border: 1px solid rgba(233, 196, 109, 0.28);
  border-top: none;
  display: flex;
  align-items: center;
  justify-content: center;
}

.podium-plinth span {
  font-family: var(--display);
  font-weight: 700;
  font-size: 0.8rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--gold);
}

.podium-plinth--1 {
  height: 64px;
}

.podium-plinth--2 {
  height: 46px;
}

.podium-plinth--3 {
  height: 34px;
}

/* Support grid: every other photographed prize, stacked as one row of
   portrait cards then one row of landscape cards (see
   renderPpnWinnersSection) rather than one mixed grid - each row wraps
   only cards that share a shape, so no row forces a shorter card to
   either stretch or leave dead space under a taller neighbour. */
.winners-grid {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 16px;
  margin-top: clamp(28px, 4vw, 40px);
}

.winners-grid-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 16px;
}

.winner-card {
  position: relative;
  overflow: hidden;
  border-radius: 16px;
  background: var(--paper-deep);
}

/* Aspect-ratio matches each photo's real shape (content.js
   winner.orientation, checked against the actual file dimensions) so
   object-fit:cover only trims a sliver instead of cropping someone out
   of frame. Sizing (flex-basis below) is scoped to the grid row context
   only - inside a podium tile the figure just stretches to the tile's
   own width (set on .podium-tile) and lets aspect-ratio compute height. */
.winner-card--portrait {
  aspect-ratio: 2 / 3;
}

.winner-card--landscape {
  aspect-ratio: 3 / 2;
}

.winners-grid-row .winner-card--portrait {
  flex: 0 1 220px;
}

.winners-grid-row .winner-card--landscape {
  flex: 0 1 320px;
}

.winner-card--podium {
  border-radius: 16px 16px 0 0;
}

.winner-card img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 20%;
  display: block;
  transition: transform 500ms ease;
}

.winner-card:hover img {
  transform: scale(1.045);
}

/* Scrim so the prize name stays legible over any photo, bright or dark */
.winner-card::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(10, 6, 7, 0.92) 0%, rgba(10, 6, 7, 0.32) 48%, transparent 74%);
  pointer-events: none;
}

.winner-card figcaption {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1;
  padding: 18px;
}

.winner-card-position {
  display: block;
  margin-bottom: 4px;
  color: var(--gold);
  font-size: 0.66rem;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.winner-card strong {
  display: block;
  font-family: var(--display);
  font-size: 1.15rem;
  line-height: 1.18;
  color: var(--white);
}

.winner-card--podium strong {
  font-size: clamp(1.05rem, 1.6vw, 1.3rem);
}

.podium-tile--1 .winner-card--podium strong {
  font-size: clamp(1.5rem, 2.4vw, 2.1rem);
}

.winner-card figcaption span {
  display: block;
  margin-top: 6px;
  color: rgba(255, 255, 255, 0.58);
  font-size: 0.78rem;
}

.inclusion-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
}

.inclusion-grid > div {
  min-height: 260px;
  padding: 26px;
  display: flex;
  flex-direction: column;
  background: var(--white);
}

.inclusion-grid > div:nth-child(2) {
  background: var(--wine);
  color: var(--white);
}

.inclusion-grid > div > span {
  margin-bottom: auto;
  color: var(--red);
  font-size: 0.7rem;
  font-weight: 800;
}

.inclusion-grid h3 {
  margin-bottom: 12px;
}

.inclusion-grid p {
  color: var(--ink-soft);
  font-size: 0.82rem;
}

.inclusion-grid > div:nth-child(2) p {
  color: rgba(255, 255, 255, 0.68);
}

/* Contact */
.contact-form-layout {
  align-items: start;
  display: grid;
  gap: clamp(2rem, 7vw, 6rem);
  grid-template-columns: minmax(0, .8fr) minmax(22rem, 1.2fr);
}

.contact-form-intro h2 {
  font-family: var(--display);
  font-size: clamp(2.2rem, 4vw, 4rem);
  font-weight: 400;
  letter-spacing: -.04em;
  line-height: 1;
  margin: 0 0 1.2rem;
}

.contact-form-intro > p:not(.eyebrow) {
  color: var(--ink-soft);
  line-height: 1.7;
}

.contact-form-intro a {
  color: var(--wine);
  font-weight: 700;
}

.contact-form {
  background: var(--wine-dark);
  border-radius: 1.2rem;
  color: var(--white);
  display: grid;
  gap: 1rem;
  padding: clamp(1.4rem, 4vw, 2.5rem);
}

.contact-form label {
  display: grid;
  font-size: .72rem;
  font-weight: 800;
  gap: .45rem;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.contact-form input,
.contact-form select,
.contact-form textarea {
  background: rgba(255,255,255,.08);
  border: 1px solid rgba(255,255,255,.22);
  border-radius: .45rem;
  color: var(--white);
  font: inherit;
  min-height: 3rem;
  padding: .75rem .85rem;
  text-transform: none;
}

.contact-form select option {
  color: var(--ink);
}

.contact-form input:focus,
.contact-form select:focus,
.contact-form textarea:focus {
  border-color: var(--gold);
  outline: 3px solid rgba(216,176,91,.2);
}

.contact-form-row {
  display: grid;
  gap: 1rem;
  grid-template-columns: 1fr 1fr;
}

.contact-form .contact-form-consent {
  align-items: start;
  display: grid;
  font-size: .78rem;
  font-weight: 400;
  grid-template-columns: auto 1fr;
  letter-spacing: 0;
  line-height: 1.5;
  text-transform: none;
}

.contact-form-consent input {
  accent-color: var(--gold);
  min-height: auto;
  width: 1rem;
}

.contact-form-trap {
  left: -10000px;
  position: absolute;
}

.contact-form-privacy {
  color: rgba(255,255,255,.58);
  font-size: .7rem;
  line-height: 1.5;
  margin: 0;
}

.contact-form-status:empty {
  display: none;
}

.contact-form-status {
  border-left: 3px solid var(--gold);
  padding: .75rem 1rem;
}

.contact-form-status.is-success {
  background: rgba(81,174,125,.13);
}

.contact-form-status.is-error {
  background: rgba(197,69,69,.14);
}

@media (max-width: 760px) {
  .contact-form-layout,
  .contact-form-row {
    grid-template-columns: 1fr;
  }
}
.contact-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
}

.contact-card {
  min-height: 360px;
  padding: clamp(30px, 5vw, 54px);
  display: flex;
  flex-direction: column;
  background: var(--paper-deep);
  color: var(--ink);
  text-decoration: none;
  transition: transform 200ms ease, background-color 200ms ease;
}

.contact-card:hover {
  transform: translateY(-4px);
  background: var(--gold-light);
}

.contact-card--primary {
  grid-row: span 2;
  min-height: 734px;
  background: var(--wine);
  color: var(--white);
}

.contact-card--primary:hover {
  background: var(--wine-mid);
}

.contact-card-label {
  margin-bottom: auto;
  font-size: 0.7rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.contact-card h2 {
  max-width: 620px;
  margin-bottom: 22px;
  font-size: clamp(2.5rem, 5vw, 5rem);
}

.contact-card p {
  max-width: 480px;
  margin-bottom: 30px;
  color: var(--ink-soft);
}

.contact-card--primary p {
  color: rgba(255, 255, 255, 0.68);
}

.contact-card-link {
  align-self: flex-start;
  padding-bottom: 3px;
  border-bottom: 1px solid currentColor;
  font-size: 0.8rem;
  font-weight: 800;
}

.contact-note {
  padding-top: 0;
}

.contact-note-inner {
  padding-top: 30px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 30px;
  border-top: 1px solid var(--line);
}

.contact-note-inner p {
  color: var(--ink-soft);
}

.contact-note-inner a {
  color: var(--wine);
  font-family: var(--display);
  font-size: clamp(1.2rem, 3vw, 2.1rem);
  font-weight: 700;
}

/* Footer */
.site-footer {
  background: #190b0d;
  color: var(--white);
}

.footer-main {
  padding-block: 76px;
}

.footer-grid {
  display: grid;
  grid-template-columns: minmax(280px, 1fr) 0.46fr 0.58fr;
  gap: clamp(40px, 8vw, 120px);
}

.site-brand--footer {
  margin-bottom: 26px;
}

.footer-intro > p {
  max-width: 430px;
  color: rgba(255, 255, 255, 0.74);
  font-size: 0.9rem;
}

.social-links {
  display: flex;
  gap: 14px;
}

.footer-intro .social-links {
  margin-top: 22px;
}

.social-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--gold);
  transition: color 0.15s ease, transform 0.15s ease;
}

.social-link:hover,
.social-link:focus-visible {
  color: var(--gold-light);
  transform: translateY(-1px);
}

.footer-label {
  margin-bottom: 20px;
  color: var(--gold);
  font-size: 0.65rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.footer-cta-row {
  display: flex;
  flex-wrap: wrap;
  gap: 22px;
  margin-bottom: 22px;
}

.footer-links {
  display: grid;
  gap: 10px;
  list-style: none;
}

.footer-links a {
  color: rgba(255, 255, 255, 0.84);
  font-size: 0.81rem;
  text-decoration: none;
}

.footer-links a:hover {
  color: var(--white);
}

.footer-base {
  padding-block: 24px;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
}

.footer-base-inner {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 50px;
  color: rgba(255, 255, 255, 0.68);
  font-size: 0.65rem;
}

.footer-legal {
  max-width: 850px;
  justify-self: end;
  text-align: right;
}

/* One coordinated reveal sequence. Siblings that carry --reveal-i (set inline
   from pages.js, e.g. style="--reveal-i:2") stagger ~90ms apart so grouped
   content (hero copy lines, card grids, fan cards) deals in rather than
   appearing as one block, see brand-reference.md §7c. */
.has-reveal-motion [data-reveal] {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 700ms ease, transform 700ms cubic-bezier(0.2, 0.7, 0.2, 1);
  transition-delay: calc(var(--reveal-i, 0) * 90ms);
}

.has-reveal-motion [data-reveal].is-revealed {
  opacity: 1;
  transform: translateY(0);
}

/* The event fan deals in with rotation + a larger drop, on the same
   confirmed reveal curve, rather than the generic fade-up above. */
.has-reveal-motion .event-fan-card[data-reveal] {
  opacity: 0;
  transform: rotate(var(--fan-rotate)) translateY(70px) scale(0.94);
  transition: opacity 550ms ease, transform 550ms cubic-bezier(0.2, 0.7, 0.2, 1);
  transition-delay: calc(var(--reveal-i, 0) * 110ms);
}

.has-reveal-motion .event-fan-card[data-reveal].is-revealed {
  opacity: 1;
  transform: rotate(var(--fan-rotate)) translateY(0) scale(1);
}

/* Tablet */
@media (max-width: 1020px) {
  /* Real width (unlike the empty decoration it replaces), so it risks
     overlapping the heading text once the hero narrows - simplest to hide
     it below desktop rather than chase a responsive reflow for two stats. */
  .hero-stat-card {
    display: none;
  }

  .site-navigation {
    gap: 18px;
  }

  .site-navigation ul {
    gap: 17px;
  }

  .hero-story {
    grid-template-columns: 1fr 0.85fr;
  }

  .event-fan-card {
    width: clamp(135px, 17vw, 185px);
  }

  .pillar-grid,
  .inclusion-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .info-card-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .gallery-grid {
    grid-template-columns: repeat(3, 1fr);
  }

  .winners-grid-row .winner-card--portrait {
    flex-basis: 190px;
  }

  .winners-grid-row .winner-card--landscape {
    flex-basis: 260px;
  }

  .podium-tile--portrait {
    width: 210px;
  }

  .podium-tile--landscape {
    width: 270px;
  }
}

/* Mobile navigation and layouts */
@media (max-width: 820px) {
  :root {
    --section: 76px;
  }

  h2 {
    font-size: clamp(2.5rem, 12vw, 4.2rem);
  }

  .site-header,
  .site-header-inner {
    min-height: 72px;
  }

  .menu-button {
    display: block;
  }

  .site-navigation {
    position: fixed;
    inset: 72px 0 0;
    padding: 34px var(--side);
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 30px;
    background: var(--wine-dark);
    opacity: 0;
    pointer-events: none;
    transform: translateY(-10px);
    transition: opacity 180ms ease, transform 180ms ease;
  }

  .site-navigation.is-open {
    opacity: 1;
    pointer-events: auto;
    transform: translateY(0);
  }

  .site-navigation ul {
    display: grid;
    align-items: stretch;
    gap: 0;
  }

  .site-navigation ul a {
    padding-block: 16px;
    display: block;
    border-bottom: 1px solid var(--line-light);
    font-family: var(--display);
    font-size: 1.8rem;
  }

  .site-navigation ul a::after {
    display: none;
  }

  .home-hero-copy {
    padding-top: 64px;
  }

  .home-hero h1 {
    font-size: clamp(4.3rem, 22vw, 7rem);
  }

  .home-hero-lead {
    margin-top: 24px;
  }

  .hero-story {
    grid-template-columns: 1fr;
    gap: 40px;
  }

  .event-fan-card {
    width: clamp(108px, 23vw, 150px);
  }

  .event-fan-card + .event-fan-card {
    margin-left: -22px;
  }

  /* Smaller fan cards can't fit stacked label/value pairs for 4 stats,
     switch to compact single-line rows so nothing gets clipped. */
  .event-fan-face--stats {
    padding: 10px;
  }

  .event-fan-stats-eyebrow {
    margin-bottom: 6px;
    font-size: 0.52rem;
  }

  .event-fan-stats-list {
    gap: 6px;
  }

  .event-fan-stats-list > div {
    padding-top: 5px;
  }

  .event-fan-stats-list dt {
    font-size: 0.46rem;
  }

  .event-fan-stats-list dd {
    font-size: 0.66rem;
    line-height: 1.15;
  }

  /* At this width there isn't room to show all 4 stats legibly, keep the
     two most essential (venue, date) and let the rest go on larger
     viewports rather than clipping or wrapping everything illegibly. */
  .event-fan-stats-list > div:nth-child(n + 3) {
    display: none;
  }

  .info-card-grid {
    grid-template-columns: 1fr;
  }

  .hero-proof {
    grid-template-columns: repeat(2, 1fr);
  }

  .hero-proof > div {
    border-bottom: 1px solid var(--line-light);
  }

  .hero-proof > div:nth-child(2) {
    border-right: 0;
  }

  .hero-proof > div:first-child {
    padding-left: clamp(12px, 2vw, 28px);
  }

  .statement-grid,
  .charity-feature-grid,
  .origin-grid,
  .sponsor-enquiry-grid,
  .faq-layout,
  .faq-page-layout,
  .ticket-hero-grid,
  .ticket-details-grid,
  .footer-grid {
    grid-template-columns: 1fr;
  }

  .statement-grid,
  .charity-feature-grid,
  .origin-grid,
  .faq-layout,
  .faq-page-layout,
  .ticket-hero-grid,
  .ticket-details-grid {
    gap: 50px;
  }

  .statement-copy {
    padding-top: 0;
  }

  .process-grid {
    grid-template-columns: 1fr;
  }

  .process-grid li,
  .process-grid li + li {
    min-height: auto;
    padding: 28px 0;
    border-right: 0;
    border-bottom: 1px solid var(--line);
  }

  .process-number {
    font-size: 4.6rem;
    margin-bottom: 4px;
  }

  .charity-feature::after {
    opacity: 0.5;
  }

  .charity-impact {
    grid-template-columns: 1fr 1fr;
  }

  .photo-story-heading {
    margin-bottom: 36px;
    align-items: flex-start;
    flex-direction: column;
  }

  .photo-story-heading .section-heading {
    margin-bottom: 0;
  }

  .photo-story-grid {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 260px 180px 180px;
  }

  .photo-story-wide {
    grid-column: 1 / -1;
    grid-row: auto;
  }

  .photo-story-tall {
    grid-row: span 2;
  }

  .community-proof-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .final-callout {
    grid-template-columns: 1fr;
    align-items: start;
  }

  .final-callout .eyebrow {
    margin-bottom: -18px;
  }

  .origin-image img {
    min-height: 390px;
  }

  .sponsor-timeline-grid {
    grid-template-columns: 1fr;
    gap: 26px;
  }

  .gallery-grid {
    grid-template-columns: repeat(2, 1fr);
    grid-auto-rows: 180px;
  }

  .winners-grid,
  .winners-grid-row {
    gap: 12px;
  }

  .winners-grid-row .winner-card--portrait {
    flex-basis: 150px;
  }

  .winners-grid-row .winner-card--landscape {
    flex-basis: 210px;
  }

  .winners-podium {
    gap: 12px;
  }

  .podium-tile--portrait {
    width: 160px;
  }

  .podium-tile--landscape {
    width: 220px;
  }

  .faq-contact {
    position: static;
  }

  .contact-grid {
    grid-template-columns: 1fr;
  }

  .contact-card,
  .contact-card--primary {
    grid-row: auto;
    min-height: 380px;
  }

  .contact-note-inner {
    align-items: flex-start;
    flex-direction: column;
  }

  .footer-base-inner {
    grid-template-columns: 1fr;
    gap: 16px;
  }

  .footer-legal {
    justify-self: start;
    text-align: left;
  }
}

@media (max-width: 520px) {
  .brand-name {
    display: none;
  }

  .brand-monogram {
    font-size: 1.65rem;
  }

  .button-row {
    align-items: flex-start;
    flex-direction: column;
  }

  .event-fan-card {
    width: clamp(88px, 25vw, 120px);
    border-radius: .8rem;
  }

  .event-fan-card:nth-child(1) {
    --fan-rotate: -14deg;
    --fan-lift: 6px;
  }

  .event-fan-card:nth-child(2) {
    --fan-lift: -6px;
  }

  .event-fan-card:nth-child(3) {
    --fan-rotate: 12deg;
    --fan-lift: 8px;
  }

  .winners-podium {
    gap: 8px;
  }

  .podium-tile--portrait {
    width: 116px;
  }

  .podium-tile--landscape {
    width: 156px;
  }

  .winner-card--podium figcaption {
    padding: 10px;
  }

  .winner-card--podium strong,
  .podium-tile--1 .winner-card--podium strong {
    font-size: 0.72rem;
    line-height: 1.2;
  }

  .winner-card--podium figcaption span {
    font-size: 0.6rem;
    margin-top: 3px;
  }

  .podium-plinth span {
    font-size: 0.6rem;
  }

  .event-invitation {
    padding: 24px;
  }

  .event-invitation-seal {
    width: 50px;
    height: 50px;
    margin: 16px auto;
  }

  .hero-proof span {
    font-size: 0.57rem;
  }

  .charity-impact {
    grid-template-columns: 1fr;
  }

  .charity-impact > div + div {
    padding-left: 0;
    border-top: 1px solid rgba(34, 25, 26, 0.25);
    border-left: 0;
  }

  .charity-impact blockquote {
    font-size: 1.8rem;
  }

  .photo-story-grid {
    grid-template-columns: 1fr;
    grid-template-rows: 260px 330px 220px 170px;
  }

  .photo-story-wide,
  .photo-story-tall {
    grid-column: auto;
    grid-row: auto;
  }

  .pillar-grid,
  .inclusion-grid {
    grid-template-columns: 1fr;
  }

  /* .pillar-label / .inclusion-grid > div > span use margin-bottom: auto
     to pin the number/label to the top and push the heading + copy to the
     bottom of a tall fixed-height card - on desktop's 4-column grid that
     reads as a deliberate layout; stacked full-width on mobile it just
     shows as a large dead gap between the number and its heading, so both
     switch to normal top-to-bottom flow with a proportional min-height. */
  .pillar-card,
  .inclusion-grid > div {
    min-height: 0;
  }

  .pillar-label,
  .inclusion-grid > div > span {
    margin-bottom: 14px;
  }

  .gallery-grid {
    grid-auto-rows: 150px;
  }

  .inline-proof {
    gap: 25px;
  }

  .contact-card,
  .contact-card--primary {
    min-height: 340px;
  }
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  *,
  *::before,
  *::after {
    scroll-behavior: auto !important;
    transition-duration: 0.01ms !important;
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
  }
}

/* ==========================================================================
   House of Cards - About-hero poker-chip field
   PPN's "House of Cards" campaign motif: expanded copy on the right of the
   About hero, plus a field of CSS-drawn poker chips spanning the full
   hero (both the "Why PPN exists" and "House of Cards" columns) as ambient
   texture. It sits directly on the page-hero's existing dark surface (no
   separate panel/background of its own) and is drawn entirely from CSS
   using brand tokens already in :root above, no image assets exist for
   the chips. Interaction lives in house-of-cards.js, loaded only on
   about.html.
   ========================================================================== */

/* .page-hero's default background is a hard-edged two-tone split
   (transparent to 68%, a faint red tint after) tuned for the single-
   column hero everywhere else, on this split layout that seam lands
   almost exactly on the column boundary and reads as "two separate
   boxes". Replacing it with one soft glow centered on the House of
   Cards side, bleeding left across the seam into the copy column, ties
   both halves to the same light source instead. */
.page-hero--split {
  position: relative;
  background:
    radial-gradient(ellipse 60% 75% at 76% 48%, rgba(207, 81, 83, 0.28), transparent 68%),
    radial-gradient(ellipse 40% 50% at 8% 85%, rgba(233, 196, 109, 0.08), transparent 70%),
    var(--wine-dark);
}

.page-hero-inner--split {
  display: grid;
  grid-template-columns: minmax(0, 1.3fr) minmax(240px, 0.7fr);
  align-items: center;
  gap: clamp(40px, 6vw, 90px);
}

.page-hero-inner--split h1 {
  font-size: clamp(2.6rem, 4.6vw, 4.6rem);
}

.hoc-feature {
  position: relative;
  z-index: 1;
}

.hoc-feature-label {
  margin-bottom: 8px;
}

.hoc-feature-copy {
  max-width: 360px;
  margin-bottom: 16px;
  color: rgba(255, 255, 255, 0.62);
  font-size: 0.94rem;
  line-height: 1.6;
}

/* The campaign's own visual tagline, set apart as a pull-quote rather
   than folded into the body copy, it's the one line meant to be
   remembered. */
.hoc-feature-quote {
  max-width: 320px;
  margin: 20px 0 12px;
  padding-left: 16px;
  border-left: 2px solid rgba(233, 196, 109, 0.55);
  font-family: var(--display);
  font-style: italic;
  font-size: 1.05rem;
  line-height: 1.4;
  color: var(--white);
}

.hoc-feature-tagline {
  font-family: var(--body);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--gold);
}

/* A field of CSS-drawn poker chips spanning the full hero surface (not
   just the copy column), the "give it a nudge" texture that ties the
   "Why PPN exists" and "House of Cards" halves into one scene. Sits
   behind the copy (z-index below .page-hero-inner--split's implicit
   stacking) and never intercepts pointer events, so it reads as ambient
   light on the felt rather than a competing interactive element. */
.hoc-chip-field {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}

/* A real casino-chip look, a dashed gold edge, a raised centre disc
   with a glossy highlight, and an engraved suit pip, rather than a flat
   coloured dot. Fixed scatter layout across the full hero;
   house-of-cards.js layers pointer-repulsion and an idle float on top
   via inline transforms. */
.hoc-chip {
  position: absolute;
  aspect-ratio: 1 / 1;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background:
    radial-gradient(circle at 32% 26%, rgba(255, 255, 255, 0.32), transparent 42%),
    repeating-conic-gradient(var(--gold) 0deg 9deg, #1c0d0d 9deg 18deg);
  box-shadow: 0 5px 9px rgba(0, 0, 0, 0.4), inset 0 0 0 3px var(--gold);
  will-change: transform;
}

.hoc-chip::before {
  content: "";
  position: absolute;
  inset: 24%;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 28%, #3a1a1e, var(--wine-dark) 55%, #0c0403 100%);
  box-shadow: inset 0 0 0 1px rgba(233, 196, 109, 0.4);
}

.hoc-chip::after {
  content: "♠";
  position: relative;
  z-index: 1;
  font-size: 42%;
  line-height: 1;
  color: var(--gold);
}

.hoc-chip-2::after { content: "♥"; }
.hoc-chip-3::after { content: "♦"; }
.hoc-chip-4::after { content: "♣"; }
.hoc-chip-5::after { content: "♠"; }
.hoc-chip-6::after { content: "♥"; }
.hoc-chip-7::after { content: "♦"; }
.hoc-chip-8::after { content: "♣"; }

/* Spread across the full hero, but kept to the margins either side of the
   grid and the gutter between its two columns, the copy column is
   1.3fr/0.7fr with its own gap, so the safe "empty" bands are the outer
   edges (left of ~12%, right of ~90%) and the seam around 58-62%, not a
   flat 50%. Positioned to clear both text blocks at every breakpoint
   above 780px, ties the "Why PPN exists" and "House of Cards" halves
   together without ever sitting on the words. */
.hoc-chip-1 { top: 4%;  left: 2%;  width: 40px; opacity: 0.22; }
.hoc-chip-2 { top: 82%; left: 5%;  width: 32px; opacity: 0.2; }
.hoc-chip-3 { top: 10%; left: 58%; width: 28px; opacity: 0.28; }
.hoc-chip-4 { top: 48%; left: 58%; width: 40px; opacity: 0.35; }
.hoc-chip-5 { top: 86%; left: 58%; width: 24px; opacity: 0.2; }
.hoc-chip-6 { top: 6%;  left: 92%; width: 44px; opacity: 0.28; }
.hoc-chip-7 { top: 72%; left: 95%; width: 32px; opacity: 0.24; }
.hoc-chip-8 { top: 40%; left: 97%; width: 26px; opacity: 0.16; }

@media (max-width: 780px) {
  .page-hero-inner--split {
    grid-template-columns: 1fr;
    gap: 50px;
  }

  .hoc-feature {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }

  /* Fewer, smaller, fainter chips on the stacked mobile layout, the
     hero is taller and narrower here, so a full 8-chip field would
     crowd the now-longer text column. */
  .hoc-chip-4,
  .hoc-chip-6 {
    display: none;
  }

  .hoc-chip {
    transform: scale(0.75);
  }
}
