/* ==========================================================================
   Dudley Redhead United FC — Design System
   Black & white heritage, beachside warmth, a sparing red accent.
   ========================================================================== */

:root {
  /* Palette */
  --ink: #0F0F10;
  --ink-soft: #1C1C1F;
  --ink-700: #2A2A2D;
  --paper: #FFFFFF;
  --paper-warm: #FBF8F2;
  --sand: #F4EEE4;
  --sand-deep: #E7DFD0;
  --line: #E2DED5;
  --line-strong: #C9C4B8;
  --muted: #5A5A5C;
  --muted-soft: #8A8985;
  /* Notice/announcement date labels sit on white — needs AA 4.5:1, so a darker
     grey than --muted-soft (#8A8985 is only ~3.5:1). #6E6D6A ≈ 5.2:1. */
  --nb-date: #6E6D6A;
  /* "red-*" tokens are retained for backwards compatibility but now resolve to
     grey values so the whole palette is black / white / grey only. */
  --red: #2A2A2D;
  --red-deep: #0F0F10;
  --red-soft: #A8A6A1;

  /* Type */
  --font-display: "Oswald", "Arial Narrow", "Helvetica Neue", sans-serif;
  --font-body: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;

  /* Spacing scale (8px-based) */
  --s-1: 0.25rem;
  --s-2: 0.5rem;
  --s-3: 0.75rem;
  --s-4: 1rem;
  --s-5: 1.5rem;
  --s-6: 2rem;
  --s-7: 2.5rem;
  --s-8: 3rem;
  --s-9: 4rem;
  --s-10: 5rem;
  --s-11: 6rem;
  --s-12: 8rem;

  /* Layout */
  --container: 1200px;
  --container-narrow: 880px;
  --radius-sm: 4px;
  --radius: 8px;
  --radius-lg: 16px;

  /* Effects */
  --shadow-sm: 0 2px 6px rgba(15, 15, 16, 0.06);
  --shadow: 0 8px 30px rgba(15, 15, 16, 0.08);
  --shadow-strong: 0 20px 60px rgba(15, 15, 16, 0.18);
  --ease: cubic-bezier(0.2, 0.7, 0.2, 1);
}

/* ==========================================================================
   Reset & Base
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; padding: 0; }
html { scroll-behavior: smooth; scroll-padding-top: 80px; -webkit-text-size-adjust: 100%; overflow-x: clip; }
body {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.55;
  color: var(--ink);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* clip, NOT hidden: `overflow-x: hidden` makes overflow-y compute to `auto`, turning
     <body> into a scroll container — which breaks the sticky <header> (it pins to <body>
     and scrolls away) and the anchor scroll-padding. `clip` blocks horizontal scroll the
     same way without creating a scroll container. (html already has overflow-x: clip.) */
  overflow-x: clip;
}
img, svg, video { display: block; max-width: 100%; height: auto; }
a { color: inherit; text-decoration: none; transition: color 0.2s var(--ease); }
button { font: inherit; cursor: pointer; border: 0; background: none; color: inherit; }
ul, ol { list-style: none; }
input, textarea, select { font: inherit; color: inherit; }
::selection { background: var(--ink); color: var(--paper); }

/* ==========================================================================
   Typography
   ========================================================================== */

h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-display);
  font-weight: 600;
  line-height: 1.05;
  letter-spacing: -0.01em;
  text-transform: uppercase;
}
h1 { font-size: clamp(2.5rem, 7vw, 5.5rem); letter-spacing: -0.02em; }
h2 { font-size: clamp(1.75rem, 4vw, 3rem); }
h3 { font-size: clamp(1.25rem, 2.5vw, 1.75rem); }
h4 { font-size: 1.125rem; letter-spacing: 0.04em; }
h5 { font-size: 0.875rem; letter-spacing: 0.12em; }

/* Skip-to-content link (WCAG 2.4.1) — visually off-screen until keyboard-focused. */
.skip-link { position: absolute; left: -9999px; top: 0; z-index: 2000; background: var(--ink); color: var(--paper); padding: 0.6rem 1rem; border-bottom-right-radius: 6px; font-family: var(--font-display); font-weight: 600; letter-spacing: 0.02em; text-decoration: none; }
.skip-link:focus { left: 0; }

p { margin-bottom: var(--s-4); }
p:last-child { margin-bottom: 0; }

.eyebrow {
  font-family: var(--font-display);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--red);
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
}
.eyebrow::before {
  content: "";
  width: 32px;
  height: 2px;
  background: var(--red);
}
.eyebrow.on-dark { color: var(--paper); }
.eyebrow.on-dark::before { background: var(--paper); }

.lead {
  font-size: clamp(1.125rem, 1.6vw, 1.375rem);
  line-height: 1.5;
  color: var(--ink-soft);
}

.display {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(3.5rem, 12vw, 9rem);
  line-height: 0.9;
  letter-spacing: -0.03em;
  text-transform: uppercase;
}

.script-quote {
  font-style: italic;
  font-family: Georgia, "Times New Roman", serif;
  font-size: clamp(1.25rem, 2vw, 1.625rem);
  line-height: 1.4;
  color: var(--ink-soft);
}

/* ==========================================================================
   Layout
   ========================================================================== */

.container {
  width: 100%;
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 var(--s-5);
}
.container.narrow { max-width: var(--container-narrow); }

.section { padding: var(--s-8) 0; }
.section.tight { padding: var(--s-6) 0; }
.section.loose { padding: var(--s-10) 0; }

.section.dark {
  background: var(--ink);
  color: var(--paper);
}
.section.dark p { color: rgba(255, 255, 255, 0.78); }
.section.dark .lead { color: rgba(255, 255, 255, 0.85); }

.section.sand { background: var(--sand); }
.section.warm { background: var(--paper-warm); }

@media (min-width: 768px) {
  .section { padding: var(--s-9) 0; }
  .section.loose { padding: var(--s-10) 0 calc(var(--s-10) + var(--s-5)); }
}

/* Section header pattern */
.section-head {
  max-width: 760px;
  margin-bottom: var(--s-6);
}
.section-head .eyebrow { margin-bottom: var(--s-4); }
.section-head h2 { margin-bottom: var(--s-4); }
.section-head.center { margin-left: auto; margin-right: auto; text-align: center; }
.section-head.center .eyebrow { justify-content: center; }

/* On-this-page jump nav (pills) — shared across club pages (About, Voices,
   Contact, Life Members, Game day). Sits in the dark hero. */
.jump-nav {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3);
  margin-top: var(--s-6);
  padding: var(--s-5);
  background: rgba(255, 255, 255, 0.05);
  border-radius: var(--radius);
}
.jump-nav a {
  font-family: var(--font-display);
  font-size: 0.8125rem;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.85);
  padding: var(--s-2) var(--s-4);
  border: 1px solid rgba(255, 255, 255, 0.2);
  border-radius: 999px;
  text-decoration: none;
  transition: background 0.2s, color 0.2s, border-color 0.2s;
}
.jump-nav a:hover {
  background: var(--paper);
  color: var(--ink);
  border-color: var(--paper);
}

/* ==========================================================================
   Header / Nav
   ========================================================================== */

.site-header {
  position: sticky;
  top: 0;   /* nav pins to the very top; the ground-status banner now sits BELOW it */
  z-index: 100;
  background: rgba(244, 238, 228, 0.94);   /* --sand, translucent */
  backdrop-filter: saturate(180%) blur(14px);
  -webkit-backdrop-filter: saturate(180%) blur(14px);
  border-bottom: 1px solid var(--line);
}
.site-header.on-dark {
  background: rgba(15, 15, 16, 0.85);
  border-bottom-color: rgba(255, 255, 255, 0.08);
  color: var(--paper);
}

.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-4);
  height: 72px;
}
.nav-brand {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  flex: none;
  font-family: var(--font-display);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-size: 0.875rem;
  line-height: 1.1;
}
.nav-brand .badge {
  width: 44px;
  height: 44px;
  flex: none;
  object-fit: contain;
  object-position: center;
}
.nav-brand small {
  display: inline-block;
  font-size: 0.6875rem;
  color: var(--muted);
  letter-spacing: 0.18em;
  font-weight: 400;
}
.nav-brand .brand-thistles {
  display: inline-block;
  margin-left: 0.5rem;
  font-family: 'Segoe Script', 'Brush Script MT', 'Snell Roundhand', cursive;
  font-size: 0.9rem;
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0.01em;
  color: var(--ink);
  vertical-align: baseline;
}

.nav-menu {
  display: none;
  align-items: center;
  justify-content: center;
  flex: 1 1 auto;
  gap: clamp(var(--s-2), 1vw, var(--s-4));
}
.nav-menu li { flex: none; }
.nav-menu a {
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  padding: var(--s-2) 0;
  position: relative;
  white-space: nowrap;
}
.nav-menu a:hover { color: var(--red); }
.nav-menu a.current {
  color: var(--ink);
}
.nav-menu a.current::after {
  content: "";
  position: absolute;
  bottom: -2px;
  left: 0;
  right: 0;
  height: 2px;
  background: var(--red);
}

.nav .nav-cta { display: none; }   /* 0,2,0 so it beats .btn (0,1,0) on mobile */
.nav-cta .btn { padding: 0.625rem 1.125rem; font-size: 0.8125rem; }

.nav-toggle {
  width: 44px;
  height: 44px;
  flex: none;   /* never crushed when the row is tight */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
}
.nav-toggle:hover { border-color: var(--ink); }
.nav-toggle span {
  display: block;
  width: 18px;
  height: 2px;
  background: var(--ink);
  position: relative;
  transition: transform 0.25s var(--ease), opacity 0.25s var(--ease);
}
.nav-toggle span::before,
.nav-toggle span::after {
  content: "";
  position: absolute;
  left: 0;
  width: 18px;
  height: 2px;
  background: var(--ink);
  transition: transform 0.25s var(--ease);
}
.nav-toggle span::before { top: -6px; }
.nav-toggle span::after { top: 6px; }
.nav-toggle[aria-expanded="true"] span { transform: rotate(45deg); }
.nav-toggle[aria-expanded="true"] span::before { transform: translateY(6px) rotate(-90deg); }
.nav-toggle[aria-expanded="true"] span::after { opacity: 0; }

.mobile-menu {
  display: none;
  background: var(--paper);
  border-bottom: 1px solid var(--line);
  padding: var(--s-5) 0 var(--s-6);
}
.mobile-menu.open { display: block; }
.mobile-menu ul { display: grid; gap: var(--s-1); }
.mobile-menu a {
  display: block;
  padding: var(--s-3) 0;
  font-family: var(--font-display);
  font-size: 1.5rem;
  text-transform: uppercase;
  border-bottom: 1px solid var(--line);
}
.mobile-menu a.current { color: var(--red); }
.mobile-menu .btn { width: 100%; margin-top: var(--s-5); justify-content: center; }

/* Below the desktop-menu breakpoint the brand must be able to SHRINK — its base
   flex:none held it at max-content (the club-name line alone is ~340px; the
   community pages' letter-spaced subtitle ~370px), which dragged every page wider
   than a phone screen and let phones pan sideways. min-width:0 on the flex chain
   lets the text lines wrap inside the 72px bar instead. */
@media (max-width: 1239.98px) {
  .nav > .nav-brand { flex: 0 1 auto; min-width: 0; }
  .nav-brand > span { min-width: 0; }
}
@media (max-width: 520px) {
  .nav-brand { font-size: 0.75rem; }
  .nav-brand small { letter-spacing: 0.1em; }
  .nav-brand .brand-thistles { font-size: 0.8rem; }
}

@media (min-width: 1240px) {
  /* Three balanced segments: brand (left) · menu (true centre) · actions (right).
     Brand and actions are equal flexible side columns, so the natural-width menu
     sits dead-centre in the viewport; each action group hugs the container edge,
     mirroring the brand on the opposite side. */
  .nav > .nav-brand { flex: 1 1 0; min-width: 0; }
  .nav-menu { display: flex; flex: 0 1 auto; }
  .nav-actions { flex: 1 1 0; justify-content: flex-end; }
  .nav .nav-cta { display: inline-flex; }
  .nav .nav-side { display: inline-grid; }
  .nav .nav-signed-in { display: inline-flex; }
  .nav-toggle { display: none; }
  .mobile-menu { display: none !important; }
}

/* ==========================================================================
   Buttons
   ========================================================================== */

.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: 0.875rem 1.5rem;
  font-family: var(--font-display);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  background: var(--ink);
  color: var(--paper);
  border-radius: var(--radius-sm);
  transition: background 0.2s var(--ease), color 0.2s var(--ease), transform 0.2s var(--ease);
  white-space: nowrap;
}
.btn:hover { background: var(--red); }
.btn .arrow { transition: transform 0.2s var(--ease); }
.btn:hover .arrow { transform: translateX(4px); }

.btn.ghost {
  background: transparent;
  color: var(--ink);
  border: 1px solid var(--ink);
}
.btn.ghost:hover { background: var(--ink); color: var(--paper); }

.btn.ghost-light {
  background: transparent;
  color: var(--paper);
  border: 1px solid rgba(255, 255, 255, 0.4);
}
.btn.ghost-light:hover { background: var(--paper); color: var(--ink); border-color: var(--paper); }

.btn.red {
  background: var(--red);
}
.btn.red:hover { background: var(--ink); }

.btn.lg { padding: 1.125rem 2rem; font-size: 1rem; }
.btn.sm { padding: 0.625rem 1rem; font-size: 0.75rem; }
@media (max-width: 520px) {
  /* long CTA labels wrap rather than overflow the viewport on phones */
  .btn { white-space: normal; max-width: 100%; text-align: center; }
}

.btn-link {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-family: var(--font-display);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink);
  padding-bottom: 4px;
  border-bottom: 2px solid var(--ink);
  transition: color 0.2s var(--ease), border-color 0.2s var(--ease);
}
.btn-link:hover { color: var(--red); border-color: var(--red); }
.btn-link.on-dark { color: var(--paper); border-color: var(--paper); }
.btn-link.on-dark:hover { color: var(--red-soft); border-color: var(--red-soft); }

/* ==========================================================================
   Hero
   ========================================================================== */

.hero {
  position: relative;
  background: var(--ink);
  color: var(--paper);
  overflow: hidden;
  padding: var(--s-8) 0 var(--s-9);
}
.hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.05), transparent 50%),
    radial-gradient(circle at 10% 90%, rgba(255, 255, 255, 0.03), transparent 40%);
  pointer-events: none;
}
.hero::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
  background-size: 56px 56px;
  pointer-events: none;
  mask-image: radial-gradient(ellipse at center, black 30%, transparent 80%);
}
.hero > * { position: relative; z-index: 1; }

.hero .container { display: grid; gap: var(--s-5); }
.hero h1 { color: var(--paper); }
.hero .lead { max-width: 640px; color: rgba(255,255,255,0.82); }

.hero-actions {
  display: flex;
  gap: var(--s-4);
  flex-wrap: wrap;
  margin-top: var(--s-3);
}

@media (min-width: 768px) {
  .hero { padding: var(--s-10) 0; }
}

.hero.home {
  min-height: 78vh;
  display: flex;
  align-items: center;
}
.hero.home h1 {
  font-size: clamp(3rem, 10vw, 7.5rem);
  line-height: 0.92;
}
.hero.home .since-tag {
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
  font-family: var(--font-display);
  font-size: 0.875rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.6);
}
.hero.home .since-tag .year {
  color: var(--paper);
  border: 1px solid rgba(255,255,255,0.3);
  padding: 0.25rem 0.625rem;
  border-radius: var(--radius-sm);
}

.hero.page {
  padding: var(--s-8) 0 var(--s-9);
}
.hero.page h1 {
  font-size: clamp(2.5rem, 7vw, 5rem);
}

/* ==========================================================================
   Marquee (subtle moving strip)
   ========================================================================== */

.marquee {
  background: var(--ink);
  color: var(--paper);
  border-top: 1px solid rgba(255,255,255,0.06);
  border-bottom: 1px solid rgba(255,255,255,0.06);
  overflow: hidden;
  padding: var(--s-4) 0;
}
.marquee-track {
  display: flex;
  width: max-content;
  animation: marquee 64s linear infinite;
  white-space: nowrap;
  font-family: var(--font-display);
  font-size: 0.9375rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
/* trailing margin (not flex gap) on every item so the duplicated track tiles
   exactly at translateX(-50%) — a seamless loop, no stutter at the wrap. */
.marquee-track span {
  display: inline-flex;
  align-items: center;
  gap: var(--s-9);
  margin-right: var(--s-9);
}
.marquee-track span::after {
  content: "★";
  color: var(--red);
  font-size: 0.75rem;
}
@keyframes marquee {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

/* Sponsor logo strip — a calm auto-scrolling marquee of sponsor logos
   (community home page). Logos injected by js/sponsor-strip.js. */
.sponsor-marquee {
  overflow: hidden;
  margin-top: var(--s-6);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}
.sponsor-marquee__track {
  display: flex;
  align-items: center;
  width: max-content;
  animation: sponsorScroll 110s linear infinite;
}
/* (no hover pause — the logos are decorative, so the marquee keeps scrolling) */
/* trailing margin (not flex gap) so the duplicated track tiles exactly at -50% */
.sponsor-marquee__item { flex: none; display: inline-flex; align-items: center; margin-right: var(--s-8); }
.sponsor-marquee__item img {
  height: 54px;
  width: auto;
  max-width: 160px;
  object-fit: contain;
  opacity: 0.82;
  transition: opacity 0.2s var(--ease);
}
.sponsor-marquee__item img:hover { opacity: 1; }
@keyframes sponsorScroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
  .sponsor-marquee { -webkit-mask-image: none; mask-image: none; }
  .sponsor-marquee__track {
    animation: none; width: 100%;
    flex-wrap: wrap;
    justify-content: center;
    gap: var(--s-5) var(--s-7);
  }
  .sponsor-marquee__item { margin-right: 0; }
}

/* ==========================================================================
   Stat strip
   ========================================================================== */

.stats {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
}
.stat {
  background: var(--paper);
  padding: var(--s-6) var(--s-5);
  text-align: center;
}
.stat .num {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2.5rem, 5vw, 4rem);
  line-height: 1;
  color: var(--ink);
}
.stat .num .red { color: var(--red); }
.stat .label {
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-top: var(--s-2);
}
@media (min-width: 768px) {
  .stats { grid-template-columns: repeat(4, 1fr); }
}

.stats.dark { background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.08); }
.stats.dark .stat { background: var(--ink); }
.stats.dark .stat .num { color: var(--paper); }
.stats.dark .stat .label { color: rgba(255,255,255,0.5); }

/* ==========================================================================
   Club split (Community / Seniors selector cards on Home)
   ========================================================================== */

.club-split { padding: var(--s-9) 0; }
.club-split-head {
  text-align: center;
  max-width: 640px;
  margin: 0 auto var(--s-7);
}
.club-split-head .eyebrow { justify-content: center; margin-bottom: var(--s-3); }
.club-split-head h2 { margin-bottom: var(--s-3); }
.club-split-head p { color: var(--muted); }

.club-split-grid {
  display: grid;
  gap: var(--s-5);
  grid-template-columns: 1fr;
}
@media (min-width: 880px) {
  .club-split-grid { grid-template-columns: 1fr 1fr; gap: var(--s-6); }
}

.club-card {
  position: relative;
  background: var(--ink);
  color: var(--paper);
  border-radius: var(--radius-lg);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
  text-decoration: none;
}
.club-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-strong);
}
.club-card-media {
  position: relative;
  aspect-ratio: 5 / 3;
  overflow: hidden;
  background: var(--ink-soft);
}
.club-card-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: brightness(0.6) grayscale(0.3) contrast(1.05);
  transition: filter 0.5s var(--ease), transform 0.7s var(--ease);
}
.club-card:hover .club-card-media img {
  filter: brightness(0.78) grayscale(0.05) contrast(1.05);
  transform: scale(1.04);
}
.club-card-media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 30%, rgba(15,15,16,0.55) 100%);
  pointer-events: none;
}
.club-card-tag {
  position: absolute;
  top: var(--s-5);
  left: var(--s-5);
  z-index: 1;
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--paper);
  padding: 0.3125rem 0.75rem;
  background: rgba(255,255,255,0.12);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border-radius: 999px;
}
.club-card-body {
  padding: var(--s-7) var(--s-6) var(--s-7);
  flex: 1;
  display: flex;
  flex-direction: column;
}
.club-card-body h2 {
  color: var(--paper);
  font-size: clamp(1.75rem, 3.5vw, 2.5rem);
  line-height: 1;
  margin: 0 0 var(--s-4);
}
.club-card-body p {
  color: rgba(255,255,255,0.72);
  font-size: 0.9375rem;
  margin: 0 0 var(--s-6);
  flex: 1;
}
.club-card-meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-4) var(--s-5);
  padding-top: var(--s-5);
  margin-bottom: var(--s-5);
  border-top: 1px solid rgba(255,255,255,0.1);
}
.club-card-meta div strong {
  display: block;
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 0.22em;
  color: rgba(255,255,255,0.45);
  margin-bottom: 4px;
  font-weight: 400;
  text-transform: uppercase;
}
.club-card-meta div {
  font-size: 0.875rem;
  color: rgba(255,255,255,0.85);
}
.club-card-cta {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-family: var(--font-display);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--paper);
  padding-bottom: 4px;
  border-bottom: 2px solid rgba(255,255,255,0.4);
  align-self: flex-start;
  transition: border-color 0.2s var(--ease);
}
.club-card:hover .club-card-cta {
  border-color: var(--paper);
}
.club-card-cta .arrow {
  transition: transform 0.2s var(--ease);
}
.club-card:hover .club-card-cta .arrow {
  transform: translateX(6px);
}

/* ==========================================================================
   Cards
   ========================================================================== */

.card-grid {
  display: grid;
  gap: var(--s-5);
  grid-template-columns: 1fr;
}
@media (min-width: 640px) { .card-grid.cols-2 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 960px) {
  .card-grid.cols-3 { grid-template-columns: repeat(3, 1fr); }
  .card-grid.cols-4 { grid-template-columns: repeat(4, 1fr); }
}
/* Charity page: keep CR4K the tall, dominant cell (spans both rows of the left
   column) while Pink Sock Day + Charlie Carr Cup stack in the right column and fill
   that height — evening out the gap the short card used to leave. "Watch this space"
   then spans full width below. Only at 2-up widths; on phones everything stacks. */
@media (min-width: 640px) {
  .card-grid.cols-2 .charity-hero { grid-row: span 2; }
  .card-grid.cols-2 .charity-span { grid-column: 1 / -1; }
}

/* Full-width subheading inside a .card-grid — e.g. Executive / General Committee. */
.committee-subhead {
  grid-column: 1 / -1;
  margin: var(--s-5) 0 0;
  padding-bottom: var(--s-3);
  border-bottom: 1px solid var(--line);
  font-family: var(--font-display);
  font-size: 1.15rem;
  letter-spacing: 0.01em;
  color: var(--ink);
}
.committee-subhead:first-child { margin-top: 0; }

.card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
  display: flex;
  flex-direction: column;
}
.card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow);
  border-color: var(--line-strong);
}

.card-media {
  aspect-ratio: 16 / 10;
  background: var(--sand);
  position: relative;
  overflow: hidden;
}
.card-media.tall { aspect-ratio: 4 / 5; }
.card-media .placeholder {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(15,15,16,0.4);
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.card-media img,
.card-media svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.card-body { padding: var(--s-5) var(--s-5) var(--s-6); flex: 1; display: flex; flex-direction: column; }
.card-body .meta {
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: var(--s-3);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-3);
}
.card-body .meta .dot { width: 4px; height: 4px; border-radius: 50%; background: var(--line-strong); }
.card-body h3 { margin-bottom: var(--s-3); }
/* Committee role titles are semantic <h4> (nested under the <h3> group subheads)
   but keep the visual weight/size of a card <h3>. */
.card-body h4.role-title { font-size: clamp(1.25rem, 2.5vw, 1.75rem); letter-spacing: -0.01em; margin-bottom: var(--s-3); overflow-wrap: break-word; word-break: break-word; }
/* Long unbreakable strings (emails, URLs, PDF names) must wrap inside the cell
   instead of overflowing it — e.g. drufc.registrar@gmail.com in the quick-contact
   cards. Applies to every card/tile/hub heading and body. */
.card-body h3, .gd-hub__card h3, .tile h3, .honour-card h3, .dl-card h3,
.card-body p, .gd-hub__card p, .tile p { overflow-wrap: break-word; word-break: break-word; }
.card-body p { color: var(--muted); font-size: 0.9375rem; }
.card-body .btn-link { margin-top: var(--s-4); align-self: flex-start; }

.card.feature {
  background: var(--ink);
  color: var(--paper);
  border-color: var(--ink);
}
.card.feature p { color: rgba(255,255,255,0.72); }
.card.feature .meta { color: rgba(255,255,255,0.5); }
.card.feature .btn-link { color: var(--paper); border-color: var(--paper); }
.card.feature .btn-link:hover { color: var(--red-soft); border-color: var(--red-soft); }
.card.feature .card-media { background: var(--ink-700); }

/* ==========================================================================
   Fixture / Next match
   ========================================================================== */

.next-match {
  background: var(--ink);
  color: var(--paper);
  border-radius: var(--radius-lg);
  padding: var(--s-6) var(--s-5);
  display: grid;
  gap: var(--s-5);
  position: relative;
  overflow: hidden;
}
.next-match::before {
  content: "NEXT FIXTURE";
  position: absolute;
  top: var(--s-5);
  right: var(--s-5);
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 0.24em;
  color: rgba(255,255,255,0.4);
}
.next-match .teams {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: var(--s-5);
  align-items: center;
}
.next-match .team {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: var(--s-3);
}
.next-match .team-badge {
  width: 64px;
  height: 64px;
  background: rgba(255,255,255,0.06);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: 1.25rem;
  letter-spacing: 0.05em;
  color: var(--paper);
}
.next-match .team-badge.us { background: var(--red); }
.next-match .team-name {
  font-family: var(--font-display);
  font-size: 0.9375rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.next-match .vs {
  font-family: var(--font-display);
  font-size: 1.5rem;
  color: rgba(255,255,255,0.4);
  font-weight: 300;
}
.next-match .meta-row {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: var(--s-4) var(--s-6);
  padding-top: var(--s-5);
  border-top: 1px solid rgba(255,255,255,0.08);
  font-size: 0.875rem;
  color: rgba(255,255,255,0.72);
}
.next-match .meta-row strong {
  display: block;
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 0.22em;
  color: rgba(255,255,255,0.4);
  margin-bottom: 4px;
  font-weight: 400;
}

@media (min-width: 768px) {
  .next-match { padding: var(--s-7) var(--s-7); }
}

/* ==========================================================================
   Split (50/50) layouts
   ========================================================================== */

.split {
  display: grid;
  gap: var(--s-7);
  align-items: center;
}
@media (min-width: 880px) {
  .split { grid-template-columns: 1fr 1fr; gap: var(--s-9); }
  .split.tilt { grid-template-columns: 5fr 7fr; }
  .split.tilt-r { grid-template-columns: 7fr 5fr; }
}

.media-block {
  aspect-ratio: 4 / 5;
  background: var(--sand);
  border-radius: var(--radius);
  position: relative;
  overflow: hidden;
}
.media-block.wide { aspect-ratio: 5 / 4; }
.media-block .placeholder {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(15,15,16,0.35);
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.media-block img,
.media-block svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ==========================================================================
   Timeline
   ========================================================================== */

.timeline {
  position: relative;
  padding-left: var(--s-7);
  border-left: 2px solid var(--line);
  display: grid;
  gap: var(--s-7);
}
.timeline-item { position: relative; }
.timeline-item::before {
  content: "";
  position: absolute;
  top: 6px;
  left: calc(var(--s-7) * -1 - 1px);
  width: 14px;
  height: 14px;
  background: var(--paper);
  border: 2px solid var(--ink);
  border-radius: 50%;
  margin-left: -6px;
}
.timeline-item .year {
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 600;
  color: var(--red);
  margin-bottom: var(--s-2);
  letter-spacing: 0.02em;
}
.timeline-item h3 { margin-bottom: var(--s-2); }
.timeline-item p { color: var(--muted); max-width: 560px; }

/* ==========================================================================
   Values / Feature grid
   ========================================================================== */

.feature {
  padding: var(--s-6) 0;
  border-top: 1px solid var(--line);
}
.feature:last-child { border-bottom: 1px solid var(--line); }
.feature-grid { display: grid; gap: var(--s-5); }
@media (min-width: 768px) {
  .feature { display: grid; grid-template-columns: 160px 1fr; gap: var(--s-7); align-items: start; }
  .feature .index {
    font-family: var(--font-display);
    font-size: 3rem;
    font-weight: 600;
    color: var(--red);
    line-height: 1;
  }
}
.feature .index {
  font-family: var(--font-display);
  font-size: 2.5rem;
  font-weight: 600;
  color: var(--red);
  line-height: 1;
  margin-bottom: var(--s-2);
}
.feature h3 { margin-bottom: var(--s-3); }
.feature p { color: var(--muted); max-width: 640px; }

/* ==========================================================================
   Tables (fixtures)
   ========================================================================== */

.fixtures-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.9375rem;
}
.fixtures-table caption {
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--muted);
  text-align: left;
  padding-bottom: var(--s-3);
}
.fixtures-table th {
  text-align: left;
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 500;
  padding: var(--s-3) var(--s-4);
  border-bottom: 1px solid var(--line);
}
.fixtures-table td {
  padding: var(--s-4);
  border-bottom: 1px solid var(--line);
  vertical-align: middle;
}
.fixtures-table tr:hover td { background: var(--sand); }
.fixtures-table .date {
  font-family: var(--font-display);
  letter-spacing: 0.04em;
}
.fixtures-table .matchup { font-weight: 500; }
.fixtures-table .result {
  font-family: var(--font-display);
  font-weight: 600;
  letter-spacing: 0.04em;
}
.fixtures-table .result.win { color: var(--red); }
.fixtures-table .result.loss { color: var(--muted); }
.fixtures-table .result.draw { color: var(--ink); }
.fixtures-table .grade {
  display: inline-block;
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding: 2px 8px;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  color: var(--muted);
}

.table-scroll { overflow-x: auto; }

/* Tab strip */
.tabs {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
  margin-bottom: var(--s-6);
  padding-bottom: var(--s-4);
  border-bottom: 1px solid var(--line);
}
.tabs button {
  padding: 0.625rem 1.125rem;
  font-family: var(--font-display);
  font-size: 0.8125rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--muted);
  border-radius: var(--radius-sm);
  transition: all 0.2s var(--ease);
}
.tabs button:hover { color: var(--ink); }
.tabs button.active {
  background: var(--ink);
  color: var(--paper);
}

/* ==========================================================================
   Forms
   ========================================================================== */

.form {
  display: grid;
  gap: var(--s-5);
}
.form-row { display: grid; gap: var(--s-5); }
@media (min-width: 640px) {
  .form-row.cols-2 { grid-template-columns: 1fr 1fr; }
}

.field {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
}
.field label {
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink);
}
/* On a dark section the form labels must be light — otherwise they're ink-on-dark
   (invisible). Fixes the contact form and any form inside a .section.dark. */
.section.dark .field label { color: rgba(255, 255, 255, 0.82); }
.field input,
.field textarea,
.field select {
  background: var(--paper);
  color: var(--ink);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  padding: 0.875rem 1rem;
  font-size: 1rem;
  transition: border-color 0.2s var(--ease);
}
.field input:focus,
.field textarea:focus,
.field select:focus {
  outline: none;
  border-color: var(--ink);
}
.field textarea { resize: vertical; min-height: 140px; }

/* ==========================================================================
   Sponsor wall
   ========================================================================== */

.sponsor-wall {
  display: grid;
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
}
.sponsor-wall .slot {
  background: var(--paper);
  aspect-ratio: 2 / 1;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: 0.875rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
  text-align: center;
  padding: var(--s-4);
  transition: background 0.2s var(--ease);
  overflow: hidden;
}
.sponsor-wall .slot:hover { background: var(--sand); }
.sponsor-wall .slot img {
  max-width: 88%;
  max-height: 88%;
  width: auto;
  height: auto;
  object-fit: contain;
  filter: grayscale(0.12);
  transition: filter 0.25s var(--ease), transform 0.4s var(--ease);
}
.sponsor-wall .slot:hover img {
  filter: grayscale(0) contrast(1.04);
  transform: scale(1.04);
}
/* For logos designed white-on-transparent (only readable on dark backgrounds). */
.sponsor-wall .slot.dark-bg {
  background: var(--ink);
}
.sponsor-wall .slot.dark-bg:hover {
  background: var(--ink-soft);
}
.sponsor-wall .slot.dark-bg img {
  filter: grayscale(0);
}
/* For white-on-transparent logos where we want a clean white slot instead of a
   dark backing — flip the logo colour with CSS. Used for Shiels+Co. */
.sponsor-wall .slot.invert img {
  filter: invert(1) hue-rotate(180deg);
}
.sponsor-wall .slot.invert:hover img {
  filter: invert(1) hue-rotate(180deg) contrast(1.05);
}
/* Placeholder slot for sponsors whose logo we don't yet have. */
.sponsor-wall .slot.tbd {
  background: var(--paper-warm);
  border: 1px dashed var(--line-strong);
  color: var(--muted);
  font-size: 0.6875rem;
  letter-spacing: 0.18em;
  line-height: 1.4;
}
.sponsor-wall .slot.tbd:hover { background: var(--sand); }
/* Name+suburb placeholder shown inside a slot when an (admin-added) sponsor has no logo yet. */
.sponsor-wall .slot .slot-ph {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
  padding: 0.5rem; text-align: center; line-height: 1.2;
  font-family: var(--font-display); font-weight: 600; font-size: 0.85rem; color: var(--ink);
}
.sponsor-wall .slot .slot-ph small { font-weight: 400; font-size: 0.72rem; color: var(--muted); letter-spacing: 0; }
.sponsor-wall.cols-3 { grid-template-columns: repeat(2, 1fr); }
@media (min-width: 768px) {
  .sponsor-wall.cols-3 { grid-template-columns: repeat(3, 1fr); }
  .sponsor-wall.cols-4 { grid-template-columns: repeat(4, 1fr); }
}

.sponsor-tier {
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--muted);
  text-align: center;
  margin-bottom: var(--s-5);
  display: flex;
  align-items: center;
  gap: var(--s-4);
  justify-content: center;
}
.sponsor-tier::before, .sponsor-tier::after {
  content: "";
  flex: 1;
  max-width: 80px;
  height: 1px;
  background: var(--line);
}

/* ==========================================================================
   Sponsor detail modal
   ========================================================================== */

.sponsor-modal {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(15, 15, 16, 0.7);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  padding: var(--s-4);
  opacity: 0;
  transition: opacity 0.25s var(--ease);
}
.sponsor-modal.open {
  display: flex;
  opacity: 1;
}
.sponsor-modal-card {
  background: var(--paper);
  border-radius: var(--radius-lg);
  max-width: 560px;
  width: 100%;
  max-height: 90vh;
  overflow: auto;
  position: relative;
  transform: translateY(12px);
  transition: transform 0.25s var(--ease);
  box-shadow: var(--shadow-strong);
}
.sponsor-modal.open .sponsor-modal-card {
  transform: translateY(0);
}
.sponsor-modal-close {
  position: absolute;
  top: var(--s-4);
  right: var(--s-4);
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.92);
  color: var(--ink);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.5rem;
  font-family: var(--font-display);
  font-weight: 300;
  line-height: 1;
  z-index: 1;
  cursor: pointer;
  transition: background 0.2s var(--ease), transform 0.2s var(--ease);
}
.sponsor-modal-close:hover {
  background: var(--ink);
  color: var(--paper);
  transform: rotate(90deg);
}
.sponsor-modal-logo {
  background: var(--paper);
  min-height: 220px;
  max-height: 320px;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  border-bottom: 1px solid var(--line);
  padding: var(--s-5);
}
.sponsor-modal-logo img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
}
.sponsor-modal-body {
  padding: var(--s-6) var(--s-6) var(--s-6);
}
.sponsor-modal-body .meta {
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: var(--s-3);
}
.sponsor-modal-body h2 {
  font-size: clamp(1.5rem, 3vw, 1.875rem);
  margin-bottom: var(--s-2);
}
.sponsor-modal-body .subtitle {
  font-size: 1rem;
  color: var(--muted);
  margin-bottom: var(--s-5);
}
.sponsor-modal-info {
  display: grid;
  gap: var(--s-3);
  border-top: 1px solid var(--line);
  padding-top: var(--s-5);
  margin-bottom: var(--s-5);
}
.sponsor-modal-info .row {
  display: grid;
  grid-template-columns: 90px 1fr;
  align-items: baseline;
  gap: var(--s-4);
  font-size: 0.9375rem;
}
.sponsor-modal-info .label {
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--muted);
}
.sponsor-modal-info .value {
  color: var(--ink);
  word-break: break-word;
}
.sponsor-modal-info .value a {
  color: var(--ink);
  border-bottom: 1px solid var(--line-strong);
  transition: border-color 0.2s var(--ease);
}
.sponsor-modal-info .value a:hover { border-color: var(--ink); }
.sponsor-modal-info .value.muted { color: var(--muted-soft); font-style: italic; }
.sponsor-modal-actions {
  display: flex;
  gap: var(--s-3);
  flex-wrap: wrap;
}
.sponsor-modal-tag {
  display: inline-flex;
  align-items: center;
  font-family: var(--font-display);
  font-size: 0.625rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--muted);
  padding: 0.25rem 0.625rem;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  margin-bottom: var(--s-4);
}
body.modal-open { overflow: hidden; }

/* ==========================================================================
   Steps (1-2-3)
   ========================================================================== */

.steps {
  display: grid;
  gap: var(--s-5);
  counter-reset: step;
}
@media (min-width: 768px) { .steps { grid-template-columns: repeat(3, 1fr); } }
.step {
  background: var(--paper-warm);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--s-6) var(--s-5);
  counter-increment: step;
  position: relative;
}
.step::before {
  content: "0" counter(step);
  display: block;
  font-family: var(--font-display);
  font-size: 2.5rem;
  font-weight: 700;
  color: var(--red);
  line-height: 1;
  margin-bottom: var(--s-4);
}
.step h3 { margin-bottom: var(--s-3); }
.step p { color: var(--muted); }

/* ==========================================================================
   FAQ
   ========================================================================== */

.faq-list { display: grid; gap: 0; }
.faq-item {
  border-top: 1px solid var(--line);
}
.faq-item:last-child { border-bottom: 1px solid var(--line); }
.faq-item summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-4);
  padding: var(--s-5) 0;
  font-family: var(--font-display);
  font-size: 1.125rem;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  transition: color 0.2s var(--ease);
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary:hover { color: var(--red); }
.faq-item summary::after {
  content: "+";
  font-family: var(--font-display);
  font-size: 1.75rem;
  font-weight: 300;
  transition: transform 0.25s var(--ease);
  color: var(--red);
}
.faq-item[open] summary::after { transform: rotate(45deg); }
.faq-item p {
  color: var(--muted);
  padding-bottom: var(--s-5);
  max-width: 720px;
}

/* ==========================================================================
   Pull quote
   ========================================================================== */

.pullquote {
  border-left: 4px solid var(--red);
  padding-left: var(--s-5);
  max-width: 780px;
}
.pullquote q {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(1.5rem, 3vw, 2.25rem);
  line-height: 1.2;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  quotes: none;
  margin-bottom: var(--s-4);
}
.pullquote q::before, .pullquote q::after { content: none; }
.pullquote cite {
  font-style: normal;
  font-family: var(--font-display);
  font-size: 0.8125rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
}

/* ==========================================================================
   CR4K banner
   ========================================================================== */

.cr4k-banner {
  background: var(--red);
  color: var(--paper);
  border-radius: var(--radius-lg);
  padding: var(--s-7) var(--s-5);
  display: grid;
  gap: var(--s-5);
  position: relative;
  overflow: hidden;
}
.cr4k-banner::after {
  content: "";
  position: absolute;
  top: -20%;
  right: -10%;
  width: 360px;
  height: 360px;
  background: rgba(255,255,255,0.05);
  border-radius: 50%;
  pointer-events: none;
}
.cr4k-banner .eyebrow { color: rgba(255,255,255,0.8); }
.cr4k-banner .eyebrow::before { background: rgba(255,255,255,0.6); }
.cr4k-banner h2 { color: var(--paper); max-width: 720px; }
.cr4k-banner p { color: rgba(255,255,255,0.85); max-width: 600px; }
.cr4k-banner .btn-link { color: var(--paper); border-color: var(--paper); }

@media (min-width: 768px) {
  .cr4k-banner { padding: var(--s-8); }
}

/* ==========================================================================
   Footer
   ========================================================================== */

.site-footer {
  background: var(--ink);
  color: var(--paper);
  padding: var(--s-8) 0 var(--s-6);
}
.footer-grid {
  display: grid;
  gap: var(--s-7);
  grid-template-columns: 1fr;
  margin-bottom: var(--s-8);
}
@media (min-width: 768px) {
  .footer-grid { grid-template-columns: 2fr 1fr 1fr 1fr; }
}
.footer-brand .nav-brand { color: var(--paper); margin-bottom: var(--s-4); }
.footer-brand .nav-brand small { color: rgba(255,255,255,0.5); }
.footer-brand p { color: rgba(255,255,255,0.7); max-width: 320px; font-size: 0.9375rem; }

.footer-col h5 {
  font-size: 0.75rem;
  letter-spacing: 0.22em;
  color: rgba(255,255,255,0.5);
  margin-bottom: var(--s-4);
}
.footer-col ul { display: grid; gap: var(--s-2); }
.footer-col a {
  color: rgba(255,255,255,0.8);
  font-size: 0.9375rem;
  transition: color 0.2s var(--ease);
}
.footer-col a:hover { color: var(--red-soft); }

/* "One club, two sides" footer used on the overall/club pages: the brand sits on
   the LEFT with the club links nested beneath it, then Community League (centre)
   and Premier League (right). Side pages keep the default 4-track grid. */
.footer-grid.footer-grid--club { grid-template-columns: 1fr; }
@media (min-width: 768px) {
  .footer-grid.footer-grid--club { grid-template-columns: 2fr 1fr 1fr; align-items: start; }
}
.footer-col--brandsub { margin-top: var(--s-6); }

/* External-link cue — one consistent icon for links that open off-site, replacing
   the inconsistent ↗ glyph (which renders as a coloured emoji on some systems).
   Skips buttons (they carry their own → arrow), the nav side-switch CTAs, resource
   tiles (already badged "External"), social icons, and anything marked .no-ext. */
a[target="_blank"]:not(.btn):not(.nav-cta):not(.tile):not(.map-link):not(.nb__fbcard):not(.nb__igcard):not(.no-ext)::after {
  content: "";
  display: inline-block;
  width: 0.62em; height: 0.62em;
  margin-left: 0.3em;
  vertical-align: -0.02em;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 18 18 6'/%3E%3Cpath d='M9 6h9v9'/%3E%3C/svg%3E") center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 18 18 6'/%3E%3Cpath d='M9 6h9v9'/%3E%3C/svg%3E") center / contain no-repeat;
  opacity: 0.7;
}
/* Links that already carry their own glyph (social icons, map pins, live-feed
   cards) shouldn't get a second one. */
.footer-socials a::after,
.nb a[target="_blank"]::after { content: none; }

.footer-socials { display: flex; gap: var(--s-3); margin-top: var(--s-4); }
.footer-socials a {
  width: 40px;
  height: 40px;
  border: 1px solid rgba(255,255,255,0.15);
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: all 0.2s var(--ease);
}
.footer-socials a:hover {
  background: var(--red);
  border-color: var(--red);
  transform: translateY(-2px);
}
.footer-socials svg { width: 16px; height: 16px; }

.footer-bottom {
  display: grid;
  gap: var(--s-3);
  padding-top: var(--s-5);
  border-top: 1px solid rgba(255,255,255,0.08);
  font-size: 0.8125rem;
  color: rgba(255,255,255,0.5);
}
.footer-bottom .row {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--s-3);
}
.footer-bottom .acknowledge {
  font-style: italic;
  max-width: 720px;
  line-height: 1.5;
}
/* Long unbreakable strings (emails, filenames) must never escape a card. */
.card, .gd-hub__card, .tile, .dl-card, .perk-card, .honour-card { overflow-wrap: anywhere; }

.footer-powered {
  display: inline-flex;
  align-items: center;
  gap: 0.55em;
  white-space: nowrap;
}
.footer-powered img {
  height: 26px;
  width: auto;
  display: block;
}

/* ==========================================================================
   Utilities
   ========================================================================== */

.muted { color: var(--muted); }
.center { text-align: center; }
.mt-1 { margin-top: var(--s-1); }
.mt-2 { margin-top: var(--s-2); }
.mt-3 { margin-top: var(--s-3); }
.mt-4 { margin-top: var(--s-4); }
.mt-5 { margin-top: var(--s-5); }
.mt-6 { margin-top: var(--s-6); }
.mt-7 { margin-top: var(--s-7); }
.mt-8 { margin-top: var(--s-8); }
.mb-3 { margin-bottom: var(--s-3); }
.mb-4 { margin-bottom: var(--s-4); }
.mb-5 { margin-bottom: var(--s-5); }
.mb-6 { margin-bottom: var(--s-6); }
.hide-mobile { display: none; }
.hide-desktop { display: block; }
@media (min-width: 768px) {
  .hide-mobile { display: block; }
  .hide-desktop { display: none; }
}

/* Reveal on scroll */
.reveal {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
}
.reveal.visible {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .reveal, .reveal.visible { opacity: 1; transform: none; transition: none; }
  .marquee-track { animation: none; }
}

/* ==========================================================================
   Ground-status banner — rendered by js/site-banner.js across every page.
   green = grounds open · red = a closure · orange = pending review.
   A solid coloured bar with one clear, static status line (no scrolling).
   ========================================================================== */
#site-status-banner { display: none; }
#site-status-banner.fsb--visible {
  display: block;        /* sits in normal flow, directly BELOW the nav bar and
                            above the page content (no longer a top strip) */
}

.fsb {
  overflow: hidden;
  color: #fff;
  border-bottom: 1px solid rgba(0, 0, 0, 0.15);
}
.fsb--open    { background: #157f3c; }   /* green  */
.fsb--closed  { background: #c0331d; }   /* red    */
.fsb--pending { background: #c2760c; }   /* orange */

/* one clear, static status line — centred on the solid coloured bar */
.fsb__static {
  text-align: center;
  padding: 0.4rem 1.2rem;
  font-family: var(--font-display);
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  font-size: 0.75rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Split status bar — one coloured segment per ground (js/site-banner.js builds
   .fsb__seg--{open|closed|pending}); each block is painted by its OWN status, so
   a mix of open/closed/pending shows as coloured thirds. */
.fsb__track { display: flex; }
/* Each field + its status text is centred (horizontally AND vertically) inside its
   own colour block — the segment is a flex container so the text sits dead-centre. */
.fsb__seg {
  flex: 1 1 0;
  min-width: 0;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  /* subtle live "glow / pulse" so the status quietly draws the eye */
  animation: fsb-pulse 2.6s ease-in-out infinite;
}
.fsb__seg .fsb__static { min-width: 0; animation: fsb-glow 2.6s ease-in-out infinite; }
.fsb__seg + .fsb__seg { border-left: 2px solid #fff; }   /* clear white break between blocks */
.fsb__seg--open    { background: #157f3c; }   /* green  */
.fsb__seg--closed  { background: #c0331d; }   /* red    */
.fsb__seg--pending { background: #c2760c; }   /* orange */
/* tap a field block to open its competition-field pink highlight (js/site-banner.js) */
.fsb__seg--tap { cursor: pointer; }
.fsb__seg--tap:focus-visible { outline: 2px solid #fff; outline-offset: -3px; }
.fsb__zoom { margin-left: 0.4em; opacity: 0.72; font-size: 0.92em; }
.fsb__seg--tap:hover .fsb__zoom { opacity: 1; }

/* the block gently "breathes" brighter with a soft inner glow… */
@keyframes fsb-pulse {
  0%, 100% { filter: brightness(1);    box-shadow: inset 0 0 0 0 rgba(255, 255, 255, 0); }
  50%      { filter: brightness(1.18); box-shadow: inset 0 0 22px 0 rgba(255, 255, 255, 0.30); }
}
/* …and the text picks up a matching halo on the beat. */
@keyframes fsb-glow {
  0%, 100% { text-shadow: 0 0 0 rgba(255, 255, 255, 0); }
  50%      { text-shadow: 0 0 9px rgba(255, 255, 255, 0.55); }
}
/* respect users who prefer no motion */
@media (prefers-reduced-motion: reduce) {
  .fsb__seg, .fsb__seg .fsb__static { animation: none; }
}

@media (max-width: 560px) {
  .fsb__seg .fsb__static { padding: 0.4rem 0.5rem; letter-spacing: 0.06em; font-size: 0.68rem; }
}

/* ============================================================
   Liles Oval fixtures board (.lof) — this week's home games.
   Monochrome, fed by data/fixtures-liles.json.
   ============================================================ */
.lof { margin-top: var(--s-7); }
.lof__head { text-align: center; margin-bottom: var(--s-7); }
.lof__eyebrow {
  display: inline-block;
  font-family: var(--font-display);
  font-size: 0.6875rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: var(--s-2);
}
.lof__date {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(1.5rem, 3.4vw, 2.1rem);
  line-height: 1.1;
  margin: 0 0 var(--s-2);
}
.lof__meta { color: var(--muted); font-size: 0.9rem; margin: 0; }
/* Squadi-is-the-source notice (Cade 2026-07-15) — a calm, clearly-visible line under the board
   heading: Squadi owns the draw, this board shows which of our pitches each home game is on. */
.lof__source {
  margin: var(--s-3) 0 0;
  padding: var(--s-3);
  border: 1px solid var(--line);
  border-left: 3px solid var(--ink);
  border-radius: 8px;
  background: var(--sand, #f6f3ec);
  color: var(--muted);
  font-size: 0.85rem;
  line-height: 1.5;
}
.lof__source strong { color: var(--ink); }

.lof__slot { margin-top: var(--s-6); }
.lof__slot:first-child { margin-top: 0; }
.lof__time {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.05rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  margin: 0 0 var(--s-4);
  padding-bottom: var(--s-2);
  border-bottom: 1px solid var(--line-strong);
}
.lof__games {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: var(--s-3);
}
.lof__games li { display: contents; }
.lof__game {
  width: 100%;
  font: inherit;
  color: inherit;
  text-align: left;
  cursor: pointer;
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--s-4);
  padding: var(--s-3) var(--s-4);
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  transition: border-color 0.15s var(--ease), box-shadow 0.15s var(--ease);
}
.lof__game:hover { border-color: var(--line-strong); box-shadow: var(--shadow-sm); }
.lof__game:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
/* Forfeited / cancelled game (Cade 2026-07-14) — struck through on the public board, "the line, not
   removal". Set on the Edit-fixtures page; DARK (no push). */
.lof__game--off .lof__teams { text-decoration: line-through; opacity: 0.55; }
.lof__game--off .lof__field { opacity: 0.5; }
.lof__badge { display: inline-block; margin-left: 0.4rem; padding: 0.05rem 0.4rem; border-radius: 5px; background: #ececec; color: #8a2f27; font-size: 0.66rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; vertical-align: middle; }
.lof__go {
  color: var(--muted-soft);
  font-size: 1.3rem;
  line-height: 1;
  transition: transform 0.15s var(--ease), color 0.15s var(--ease);
}
.lof__game:hover .lof__go { color: var(--ink); transform: translateX(2px); }
.lof__field {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.95rem;
  letter-spacing: 0.02em;
  background: var(--ink);
  color: var(--paper);
  border-radius: var(--radius-sm);
  min-width: 2.6em;
  height: 2.6em;
  padding: 0 0.4em;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.lof__detail { min-width: 0; }
.lof__age {
  display: block;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 0.15rem;
}
.lof__teams {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4em;
  font-size: 0.95rem;
  line-height: 1.35;
}
.lof__team { color: var(--ink-700); }
.lof__team--us { color: var(--ink); font-weight: 700; }
.lof__vs {
  font-size: 0.65rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted-soft);
}
.lof__foot {
  margin-top: var(--s-7);
  text-align: center;
  color: var(--muted);
  font-size: 0.875rem;
}
.lof__none { text-align: center; color: var(--muted); padding: var(--s-8) 0; }
.lof__squadi {
  color: var(--ink);
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 2px;
  white-space: nowrap;
}
.lof__squadi:hover { color: var(--muted); }
.lof--loading .lof__none { padding: var(--s-7) 0; }

@media (max-width: 520px) {
  .lof__game { gap: var(--s-3); padding: var(--s-3); }
  .lof__field { min-width: 2.3em; height: 2.3em; font-size: 0.85rem; }
  .lof__squadi { white-space: normal; }   /* the Squadi link must wrap on phones */
}

/* Day tabs (Fri / Sat / Sun) for the fixtures board */
.lof__tabs {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-1);
  border-bottom: 1px solid var(--line);
  margin-bottom: var(--s-6);
}
.lof__tab {
  appearance: none;
  background: none;
  border: 0;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  cursor: pointer;
  padding: var(--s-3) var(--s-4);
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.05rem;
  letter-spacing: 0.02em;
  color: var(--muted);
  transition: color 0.15s var(--ease), border-color 0.15s var(--ease);
}
.lof__tab span {
  font-family: var(--font-body);
  font-size: 0.7rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--muted-soft);
}
.lof__tab:hover { color: var(--ink); }
.lof__tab.is-active { color: var(--ink); border-bottom-color: var(--ink); }
.lof__tab.is-active span { color: var(--muted); }
.lof__panel[hidden] { display: none; }

@media (max-width: 520px) {
  .lof__tabs { gap: 0; flex-wrap: nowrap; }
  .lof__tab {
    flex: 1 1 0;
    min-width: 0;
    align-items: center;
    text-align: center;
    padding: var(--s-3) var(--s-1);
    font-size: 0.95rem;
  }
  .lof__tab span { font-size: 0.625rem; line-height: 1.2; }
}

/* Game detail modal + grounds-map highlight */
.lof-modal {
  position: fixed;
  inset: 0;
  width: 100vw;          /* pin to the visual viewport, not the page scrollWidth */
  overflow: hidden;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--s-4);
}
.lof-modal[hidden] { display: none; }
.lof-modal__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(15, 15, 16, 0.55);
}
.lof-modal__card {
  position: relative;
  z-index: 1;
  width: 100%;
  min-width: 0;
  /* Single-column card (text at top, dominant map below) — narrower than the old two-column
     layout so the text block reads well and the map still dominates. */
  max-width: min(94vw, 860px);
  max-height: 92vh;
  overflow: auto;
  background: var(--paper);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-strong);
  padding: var(--s-6);
}
.lof-modal__close {
  position: absolute;
  top: var(--s-3);
  right: var(--s-4);
  background: none;
  border: 0;
  cursor: pointer;
  font-size: 1.75rem;
  line-height: 1;
  color: var(--muted);
}
.lof-modal__close:hover { color: var(--ink); }
.lof-modal__age {
  display: inline-block;
  font-family: var(--font-display);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: var(--s-2);
}
.lof-modal__teams {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4em;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.15rem;
  margin: 0 0 var(--s-2);
}
.lof-modal__when { color: var(--muted); font-size: 0.9rem; margin: 0; }
/* Detail modal — ONE column (Cade 2026-07-15): all the text (grade, teams, when, referee, field
   name) sits neatly at the TOP, then the field MAP is the dominant element beneath it. This
   REPLACED a two-column grid (details left | field right) whose short text column left a large
   empty space beside the tall map. */
.lof-modal__grid { display: block; }
.lof-modal__info, .lof-modal__field { min-width: 0; }
.lof-modal__info { margin-bottom: var(--s-4); }
.lof-modal__field .lof-map { margin: 0 0 var(--s-3); }
/* The map is the point of the card — let it fill the width, bounded so the card still fits the
   viewport without a long scroll. */
.lof-modal__field .lof-map__img { width: 100%; height: auto; max-height: 62vh; object-fit: contain; }
.lof-modal__field .lof-modal__map { margin-top: var(--s-2); }
.lof-map {
  position: relative;
  margin: var(--s-5) 0 var(--s-4);
  background: var(--sand);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  cursor: zoom-in;
}
.lof-map:focus-visible { outline: 2px solid #157f3c; outline-offset: 2px; }
.lof-map svg, .lof-map img { display: block; width: 100%; height: auto; max-width: 100%; }
.lof-map__hint {
  position: absolute;
  right: var(--s-2);
  top: var(--s-2);
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 9px;
  font-family: var(--font-display);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  color: #fff;
  background: rgba(15, 15, 16, 0.6);
  border-radius: 999px;
  pointer-events: none;
}
.lof-map:hover .lof-map__hint { background: rgba(15, 15, 16, 0.8); }
.lof-map .lof-zone { transition: opacity 0.25s var(--ease); }
.lof-map[data-active] .lof-zone { opacity: 0.3; }
.lof-map[data-active="1"] [data-zone="1"],
.lof-map[data-active="2"] [data-zone="2"],
.lof-map[data-active="3"] [data-zone="3"] { opacity: 1; }
.lof-map[data-active="1"] [data-zone="1"] .lof-zone__field,
.lof-map[data-active="2"] [data-zone="2"] .lof-zone__field,
.lof-map[data-active="3"] [data-zone="3"] .lof-zone__field {
  stroke: #157f3c;
  stroke-width: 5;
}
/* Enlarged field-map lightbox — layered above the detail modal (z-index 200) */
.lof-zoom {
  position: fixed;
  inset: 0;
  z-index: 300;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0.5rem;
  background: rgba(15, 15, 16, 0.9);
  cursor: zoom-out;
}
.lof-zoom[hidden] { display: none; }
/* Enlarge AS LARGE AS THE SCREEN ALLOWS. The ground maps are vector SVGs, so upscaling
   past their natural size stays crisp: fill the viewport height on wide screens (width
   auto keeps aspect), and fill the width instead on portrait/narrow screens (below). */
.lof-zoom__img {
  height: calc(100vh - 1rem);
  width: auto;
  max-width: calc(100vw - 1rem);
  border-radius: var(--radius);
  box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.7);
}
@media (max-aspect-ratio: 3 / 2) {
  .lof-zoom__img { height: auto; width: calc(100vw - 1rem); max-width: none; }
}
.lof-zoom__close {
  position: absolute;
  top: var(--s-3);
  right: var(--s-4);
  background: none;
  border: 0;
  color: #fff;
  font-size: 2.2rem;
  line-height: 1;
  cursor: pointer;
}
.lof-modal__where {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4em;
  margin: 0;
  font-size: 1rem;
}
.lof-modal__where strong { font-family: var(--font-display); }
.lof-modal__where > span { color: var(--muted); font-size: 0.85rem; flex-basis: 100%; }

@media (max-width: 520px) {
  .lof-modal { padding: 0; align-items: flex-end; }
  .lof-modal__card {
    max-width: none;
    max-height: 92vh;
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  }
}

/* ==========================================================================
   Community noticeboard (admin-pinned notices + live Facebook feed)
   ========================================================================== */
.nb {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr));
  gap: var(--s-6);
  margin-top: var(--s-7);
  align-items: start;
}
.nb__colhead {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-3);
  margin-bottom: var(--s-4);
  padding-bottom: var(--s-2);
  border-bottom: 1px solid var(--line);
}
.nb__kicker {
  font-family: var(--font-display);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--muted);
}
.nb__more { font-size: 0.8125rem; color: var(--muted); }
.nb__more:hover { color: var(--ink); }
.nb__col--notices { display: flex; flex-direction: column; gap: var(--s-4); }
/* Vertical announcement scroller — the latest two sit in view; older ones scroll
   up into place (touch on mobile, wheel/trackpad on desktop). */
.nb__col--notices--scroll {
  max-height: 460px;   /* fallback (mobile / when FB+IG feeds are short); JS matches the
                          exact depth to the FB/IG columns when they sit side-by-side */
  overflow-y: auto;
  scroll-snap-type: y proximity;
  padding-right: 6px;
  scrollbar-width: thin;
  scrollbar-color: rgba(255,255,255,0.35) transparent;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
.nb .nb__col--notices--scroll { scrollbar-color: rgba(0,0,0,0.3) transparent; }
.nb__col--notices--scroll .nb__notice { scroll-snap-align: start; }
.nb__col--notices--scroll::-webkit-scrollbar { width: 8px; }
.nb__col--notices--scroll::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.28); border-radius: 8px; }
.nb__col--notices--scroll::-webkit-scrollbar-track { background: transparent; }
.nb__notice {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--s-5);
  box-shadow: var(--shadow-sm);
}
.nb__tag {
  display: inline-block;
  font-family: var(--font-display);
  font-size: 0.6875rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--paper);
  background: var(--red);
  padding: 2px 8px;
  border-radius: 3px;
  margin-bottom: var(--s-3);
}
.nb__img { display: block; width: 100%; max-height: 104px; object-fit: cover; border-radius: var(--radius-sm); margin-bottom: var(--s-3); }
.nb-modal__img { display: block; width: 100%; max-height: 320px; object-fit: contain; border-radius: var(--radius-sm); margin: 0 0 var(--s-4); background: rgba(0,0,0,0.04); }
.nb__title { margin: 0 0 var(--s-2); font-size: 1.15rem; }
.nb__body { margin: 0 0 var(--s-3); color: var(--muted); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.nb__date { font-family: var(--font-display); font-size: 0.75rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--nb-date); }
.nb__empty { color: var(--muted); }
/* Notice cards use the light --paper background but sit inside the dark noticeboard
   section, so their title/body would inherit the section's white text and vanish.
   Re-assert dark text, scoped under .nb with enough specificity to win the cascade. */
.nb .nb__notice { color: var(--ink); }
.nb .nb__notice .nb__title { color: var(--ink) !important; }
.nb .nb__notice .nb__body  { color: var(--ink) !important; }
.nb .nb__notice .nb__date  { color: var(--nb-date) !important; }
/* Clickable notice cards → tap to expand the full announcement in a modal. */
.nb .nb__notice { cursor: pointer; transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease; }
.nb .nb__notice:hover, .nb .nb__notice:focus-visible { border-color: var(--ink); box-shadow: 0 8px 24px rgba(0,0,0,0.18); transform: translateY(-2px); outline: none; }
.nb__more { display: inline-block; margin-top: 0.4rem; font-family: var(--font-display); font-size: 0.72rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; }
.nb .nb__notice .nb__more { color: var(--red) !important; }
/* Announcement detail modal */
.nb-modal { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; padding: var(--s-5); }
.nb-modal[hidden] { display: none; }
.nb-modal__backdrop { position: absolute; inset: 0; background: rgba(0,0,0,0.6); }
.nb-modal__dialog { position: relative; width: 100%; max-width: 560px; max-height: 85vh; overflow-y: auto; background: var(--paper); color: var(--ink); border-radius: var(--radius); padding: var(--s-7) var(--s-6) var(--s-6); box-shadow: 0 24px 60px rgba(0,0,0,0.4); }
.nb-modal__close { position: absolute; top: var(--s-3); right: var(--s-3); width: 2rem; height: 2rem; display: flex; align-items: center; justify-content: center; border: 0; border-radius: 999px; background: rgba(0,0,0,0.06); color: var(--ink); font-size: 1.5rem; line-height: 1; cursor: pointer; }
.nb-modal__close:hover { background: rgba(0,0,0,0.12); }
.nb-modal__tag { display: inline-block; font-family: var(--font-display); font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--paper); background: var(--red); padding: 2px 8px; border-radius: 3px; margin-bottom: var(--s-3); }
.nb-modal__title { margin: 0 0 var(--s-2); font-size: 1.5rem; color: var(--ink); }
.nb-modal__date { display: block; font-family: var(--font-display); font-size: 0.75rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--nb-date); margin-bottom: var(--s-4); }
.nb-modal__body { color: var(--ink); line-height: 1.6; }
.nb-modal__body p { margin: 0 0 var(--s-3); }
.nb-modal__body p:last-child { margin-bottom: 0; }
.nb-modal__body h4 { margin: var(--s-4) 0 var(--s-2); font-family: var(--font-display); font-size: 1.0625rem; color: var(--ink); }
.nb-modal__body ul, .nb-modal__body ol { margin: 0 0 var(--s-3); padding-left: 1.4rem; }
.nb-modal__body ul { list-style: disc; }
.nb-modal__body ol { list-style: decimal; }
.nb-modal__body li { margin: 0 0 0.25rem; display: list-item; list-style-position: outside; }
.nb-modal__body a { color: var(--red); text-decoration: underline; }
.nb-modal__body a:hover { text-decoration: none; }
.nb-modal__body img { max-width: 100%; height: auto; border-radius: 8px; margin: var(--s-3) 0; }
.nb-modal__body strong, .nb-modal__body b { font-weight: 700; }
.nb-modal__link { display: inline-block; margin-top: var(--s-5); font-family: var(--font-display); font-weight: 600; color: var(--red); text-decoration: none; }
.nb-modal__link:hover { text-decoration: underline; }
/* Compact title cards: clamp the title to 2 lines + a single footer row (date · Read more). */
.nb .nb__notice .nb__title { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.nb__cardfoot { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); margin-top: var(--s-3); }
.nb__cardfoot .nb__date, .nb__cardfoot .nb__more { margin: 0; }
.nb__fb {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}
.nb__fb iframe { display: block; width: 100%; border: 0; }
/* Noticeboard Instagram column — live post grid (/api/instagram) + follow card */
.nb__col--ig { display: flex; flex-direction: column; gap: var(--s-4); }
.nb__iggrid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 4px;
  border-radius: var(--radius);
  overflow: hidden;
}
.nb__iggrid[hidden] { display: none; }
.nb__igitem { display: block; aspect-ratio: 1; overflow: hidden; background: var(--ink-soft); }
.nb__igitem img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.3s var(--ease); }
.nb__igitem:hover img { transform: scale(1.06); }
/* Reusable Instagram post grid (Community page "Community updates" section) */
.ig-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; border-radius: var(--radius); overflow: hidden; margin-bottom: var(--s-5); }
.ig-grid[hidden] { display: none; }
.ig-grid__item { display: block; aspect-ratio: 1; overflow: hidden; background: var(--ink-soft); }
.ig-grid__item img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.3s var(--ease); }
.ig-grid__item:hover img { transform: scale(1.06); }
.nb__igcard {
  display: flex;
  align-items: center;
  gap: var(--s-4);
  background: linear-gradient(135deg, #833ab4 0%, #fd1d1d 50%, #fcb045 100%);
  color: var(--paper);
  text-decoration: none;
  border-radius: var(--radius);
  padding: var(--s-5) var(--s-6);
  box-shadow: var(--shadow-sm);
  transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease);
}
.nb__igcard:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
.nb__igcard svg { flex: none; }
.nb__igtext { display: flex; flex-direction: column; line-height: 1.25; }
.nb__igtext strong { font-family: var(--font-display); font-size: 1.0625rem; letter-spacing: 0.5px; }
.nb__igtext > span { font-size: 0.8125rem; opacity: 0.92; margin-top: 2px; }
/* Facebook post grid + follow card — mirrors the Instagram grid, FB-blue card. */
.nb__fbgrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; border-radius: var(--radius); overflow: hidden; }
.nb__fbgrid[hidden] { display: none; }
.nb__fbitem { display: block; aspect-ratio: 1; overflow: hidden; background: var(--ink-soft); }
.nb__fbitem img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.3s var(--ease); }
.nb__fbitem:hover img { transform: scale(1.06); }
.nb__fbcard {
  display: flex;
  align-items: center;
  gap: var(--s-4);
  background: linear-gradient(135deg, #1877F2 0%, #0a52c7 100%);
  color: var(--paper);
  text-decoration: none;
  border-radius: var(--radius);
  padding: var(--s-5) var(--s-6);
  box-shadow: var(--shadow-sm);
  transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease);
}
.nb__fbcard:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
.nb__fbcard svg { flex: none; }

/* Split noticeboard — Community league | Senior league (coming soon) */
.nb__league { display: flex; flex-direction: column; gap: var(--s-4); }
.nb__leaguehead {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding-bottom: var(--s-3);
  margin-bottom: var(--s-2);
  border-bottom: 2px solid var(--ink);
}
.nb__leaguename {
  font-family: var(--font-display);
  font-size: 1.0625rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink);
}
.nb__badge {
  font-family: var(--font-display);
  font-size: 0.625rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  padding: 2px 9px;
  border-radius: 999px;
}
.nb__badge--live { color: var(--paper); background: var(--ink); }
.nb__badge--soon { color: var(--muted); background: transparent; border: 1px solid var(--line); }
.nb__cells { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s-3); }
.nb__cell {
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--s-4);
  box-shadow: var(--shadow-sm);
  min-height: 88px;
}
.nb__cell .nb__tag { align-self: flex-start; margin-bottom: 2px; }
.nb__celltitle { font-family: var(--font-display); font-size: 0.95rem; font-weight: 600; line-height: 1.2; color: var(--ink); }
.nb__celldate { margin-top: auto; font-family: var(--font-display); font-size: 0.6875rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--nb-date); }
.nb__social { display: flex; flex-direction: column; gap: var(--s-4); }
.nb__league--soon { opacity: 0.7; }
.nb__league--soon .nb__leaguename { color: var(--muted); }
/* On the dark home board the league title + divider must be light to be visible. */
.section.dark .nb__leaguename { color: var(--paper); }
.section.dark .nb__leaguehead { border-bottom-color: rgba(255, 255, 255, 0.22); }
.nb__cell--soon { min-height: 88px; border-style: dashed; background: transparent; box-shadow: none; }
.nb__soon {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  border: 1px dashed var(--line);
  border-radius: var(--radius);
  padding: var(--s-6);
  min-height: 140px;
  color: var(--muted-soft);
  font-size: 0.875rem;
}

/* Rotating announcement gallery (one big dominant cell per league) */
.nb__gallery { position: relative; background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-sm); padding: var(--s-5) 2.5rem; overflow: hidden; }
.nb__gallery--empty { padding: var(--s-6); display: flex; align-items: center; justify-content: center; min-height: 120px; text-align: center; }
/* The gallery is a white (--paper) card; inside .section.dark the theme colours its
   text light, which is invisible on the card. Restore the card's own dark text. */
.section.dark .nb__gallery .nb__slidetitle { color: var(--ink); }
.section.dark .nb__gallery .nb__slidebody,
.section.dark .nb__gallery .nb__empty,
.section.dark .nb__gallery .nb__slidecap { color: var(--muted); }
.section.dark .nb__gallery .nb__slidedate { color: var(--muted-soft); }
.nb__slides { position: relative; min-height: 172px; }
.nb__slide { position: absolute; inset: 0; display: flex; flex-direction: column; opacity: 0; visibility: hidden; transition: opacity 0.4s var(--ease); }
.nb__slide.is-active { opacity: 1; visibility: visible; }
.nb__slide .nb__tag { align-self: flex-start; }
.nb__slidetitle { margin: 0 0 var(--s-2); font-size: 1.35rem; line-height: 1.2; }
.nb__slidebody { margin: 0 0 var(--s-3); color: var(--muted); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.nb__slidedate { margin-top: auto; font-family: var(--font-display); font-size: 0.75rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted-soft); }
.nb__dots { display: flex; gap: 7px; justify-content: center; margin-top: var(--s-4); }
.nb__dot { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 50%; background: var(--line); cursor: pointer; transition: background 0.2s var(--ease); }
.nb__dot.is-active { background: var(--ink); }
.nb__arw { position: absolute; top: 50%; transform: translateY(-50%); width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--line); border-radius: 50%; background: var(--paper); color: var(--ink); font-size: 1.2rem; line-height: 1; cursor: pointer; z-index: 2; }
.nb__arw:hover { border-color: var(--muted); }
.nb__arw--prev { left: 6px; }
.nb__arw--next { right: 6px; }
/* Social feeds: rotating gallery of the latest posts (image cards), reusing the
   announcements carousel mechanics (one dominant cell, dots/arrows, auto-rotate). */
.nb__gallery--media { padding: 0; }
.nb__slides--media { min-height: 0; aspect-ratio: 1 / 1.18; }
.nb__slide--media { display: flex; flex-direction: column; }
.nb__slide--media img { width: 100%; flex: 1 1 0; min-height: 0; object-fit: contain; display: block; }
.nb__slidecap { flex: none; margin: 0; padding: 7px 11px 9px; font-size: 0.78rem; line-height: 1.35; color: var(--muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.nb__gallery--media .nb__arw { box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); }
.nb__gallery--media .nb__dots { margin: 8px 0 4px; }
.nb__gallery--media .nb__dot { background: rgba(255, 255, 255, 0.5); }
.nb__gallery--media .nb__dot.is-active { background: #fff; }
/* Community-page noticeboard (single league): condense the announcements,
   Facebook and Instagram into a side-by-side row instead of a tall narrow
   stack. The league head spans the full width above the three columns, which
   collapse to 2-up then 1-up on smaller screens. */
.nb--solo { grid-template-columns: minmax(0, 1fr); }
.nb--solo .nb__league {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr));
  gap: var(--s-5);
  align-items: start;
}
.nb--solo .nb__league .nb__leaguehead { grid-column: 1 / -1; }


/* Game-day popup: directions link */
.lof-modal__map {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  margin-top: var(--s-4);
  font-family: var(--font-display);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--paper);
  background: var(--ink);
  padding: 0.625rem 1.125rem;
  border-radius: var(--radius-sm);
}
.lof-modal__map:hover { background: #157f3c; }

/* Expandable card detail (native <details>) — community events cells */
.card-more { margin-top: var(--s-3); }
.card-more > summary {
  cursor: pointer;
  font-family: var(--font-display);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink);
  list-style: none;
  padding: 0.5rem 0; min-height: 44px;   /* a comfortable tap height on phones */
}
.card-more > summary::-webkit-details-marker { display: none; }
.card-more > summary::after { content: "  +"; color: var(--muted); }
.card-more[open] > summary::after { content: "  −"; }
.card-more > summary:hover { color: var(--red); }
.card-more p { margin-top: var(--s-3); color: var(--muted); font-size: 0.9375rem; }

/* =========================================================================
   Weekly rosters board (.rb) — canteen / MiniRoo game leaders / setup & pack-up.
   Rendered by js/rosters-board.js from /api/rosters (or data/rosters.json).
   Each roster is a card with a sand header + a simple columns/rows table.
   ========================================================================= */
.rb {
  display: grid;
  gap: var(--s-6);
  margin-top: var(--s-7);
  grid-template-columns: 1fr; /* always single column — rosters stack vertically, never side by side */
  align-items: start;
}
.rb--empty, .rb--loading { display: block; }
.rb__none { text-align: center; color: var(--muted); margin: 0; padding: var(--s-8) 0; }
.rb--loading .rb__none { padding: var(--s-7) 0; }
.rb__card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
}
.rb__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-2) var(--s-4);
  padding: var(--s-5) var(--s-6);
  background: var(--sand);
  border-bottom: 1px solid var(--line);
}
.rb__title { margin: 0; font-size: 1.125rem; }
.rb__week {
  font-family: var(--font-display);
  font-size: 0.8125rem;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--muted);
}
.rb__note { margin: 0; padding: var(--s-4) var(--s-6) 0; color: var(--muted); font-size: 0.9rem; }
.rb__scroll { overflow-x: auto; padding: var(--s-4) var(--s-6) var(--s-6); }
.rb__table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
.rb__table th, .rb__table td {
  text-align: left;
  padding: var(--s-3) var(--s-4);
  border-bottom: 1px solid var(--line);
  vertical-align: top;
}
.rb__table th {
  font-family: var(--font-display);
  font-size: 0.6875rem;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--muted);
  white-space: nowrap;
}
.rb__table td { color: var(--ink-soft); }
.rb__table tbody tr:last-child td { border-bottom: 0; }
/* Game Leaders / Club Referees sub-heading row inside the game-leader roster — shown
   only on a mixed weekend (both MiniRoos and competition games present). */
.rb__table tbody tr.rb__group td {
  background: var(--sand);
  color: var(--ink);
  font-family: var(--font-display);
  font-size: 0.68rem;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  font-weight: 700;
  white-space: nowrap;
}
/* Game-leader roster: click a row to open its pitch map (fixtures-style popup) */
.rb__click { cursor: pointer; }
.rb__click td:first-child { position: relative; padding-left: calc(var(--s-4) + 14px); }
.rb__click td:first-child::before { content: "\203A"; position: absolute; left: var(--s-4); color: var(--muted); }
.rb__click:hover td, .rb__click:focus-visible td { background: var(--sand); }

/* Roster controls — the default-ON "My Roster" filter + the game-leader time filter */
.rb__controls { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-3) var(--s-5); padding: var(--s-4) var(--s-6) 0; }
.rb__myroster { display: inline-flex; align-items: center; gap: 0.45rem; font-family: var(--font-display); font-size: 0.8rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink); cursor: pointer; }
.rb__myroster input { width: auto; margin: 0; accent-color: #e995b8; transform: scale(1.1); }
.rb__myroster-note { margin: var(--s-3) var(--s-6) 0; color: var(--muted); font-size: 0.875rem; }
.rb__filter { display: flex; align-items: center; gap: var(--s-3); padding: 0; }
.rb__filter label { font-family: var(--font-display); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); }
.rb__filter select { font: inherit; font-size: 1rem;   /* <16px triggers iOS focus auto-zoom */ padding: 0.4rem 0.6rem; border: 1px solid var(--line-strong); border-radius: 6px; background: var(--paper); color: var(--ink); }

/* "This is my slot" — the signed-in Game Leader's own row(s), so a parent/child can
   find their table at a glance (js/rosters-board.js namesMatch() against the roster's
   "leader" column). */
.rb__mine td { background: #fbe1ec; }
.rb__mine.rb__click:hover td, .rb__mine.rb__click:focus-visible td { background: #f6cddf; }

/* "Your games this week" — a leader with MORE THAN ONE game gets their own rows
   pulled to the front of the card, above the full table (which is untouched below).
   Page auto-scrolls here on a plain landing — see js/rosters-board.js. */
.rb__mine-box { margin: var(--s-4) var(--s-6) 0; padding: var(--s-4) var(--s-5); background: #fbe1ec; border-left: 4px solid #e995b8; border-radius: 0 var(--radius) var(--radius) 0; }
.rb__mine-title { margin: 0 0 var(--s-2); font-family: var(--font-display); font-size: 0.8125rem; letter-spacing: 1px; text-transform: uppercase; color: var(--ink); }
.rb__table--mine { background: transparent; }
.rb__table--mine td { border-bottom-color: rgba(0, 0, 0, 0.08); }

/* =========================================================================
   Nav dropdown (.nav-dd) — the "Game day" menu. Lives in both the desktop
   .nav-menu (opens on hover or click) and the .mobile-menu (tap to expand).
   The trigger is a <button> so it only opens the menu — it never navigates.
   ========================================================================= */
.nav-dd { position: relative; flex: none; }
.nav-dd__btn {
  font-family: inherit;
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: inherit;
  background: none;
  border: 0;
  padding: var(--s-2) 0;
  cursor: pointer;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.nav-dd__btn:hover { color: var(--red); }
.nav-dd--current > .nav-dd__btn { color: var(--ink); }
.nav-dd__caret { font-size: 0.7em; transition: transform 0.2s var(--ease); }
.nav-dd:hover .nav-dd__caret,
.nav-dd.open .nav-dd__caret { transform: rotate(180deg); }

/* Hover bridge across the gap between the button and the menu card. */
.nav-dd::after {
  content: "";
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  height: 10px;
}

.nav-dd__menu {
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  margin-top: 8px;
  min-width: 214px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: var(--s-2);
  display: grid;
  gap: 2px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.18s var(--ease);
  z-index: 200;
}
.nav-dd:hover .nav-dd__menu,
.nav-dd:focus-within .nav-dd__menu,
.nav-dd.open .nav-dd__menu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}
.nav-dd__menu a {
  display: block;
  padding: var(--s-2) var(--s-3);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  white-space: nowrap;
  border-radius: var(--radius-sm);
}
.nav-dd__menu a:hover { background: var(--sand); color: var(--red); }
.nav-dd__menu a.current { color: var(--red); }

/* On phones the members/admin section bar becomes ONE horizontally-scrollable row
   (instead of a squashed multi-row wrap), and its dropdowns anchor to the BAR, not
   the button — a centre-anchored 214px menu under an edge item escaped the viewport.
   The menus escape the scroller because their containing block is .members-nav
   (position:relative), which sits OUTSIDE the overflow:auto list. */
@media (max-width: 767.98px) {
  .members-nav { position: relative; }
  /* .members-nav prefix beats the pages' inline .members-nav__list{flex-wrap:wrap} */
  .members-nav .members-nav__list {
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .members-nav .members-nav__list::-webkit-scrollbar { display: none; }
  .members-nav .members-nav__list > li { flex: none; }
  .members-nav .nav-dd { position: static; }
  .members-nav .nav-dd__menu {
    left: var(--s-4);
    right: var(--s-4);
    transform: none;
    min-width: 0;
    width: auto;
  }
  .members-nav .nav-dd__btn {
    min-width: 44px;
    min-height: 44px;
    justify-content: center;
    padding: var(--s-2) var(--s-3);
  }
  .members-nav .nav-dd__link { padding: var(--s-3) 0; }
}

/* Mobile menu: the dropdown becomes an inline, tap-to-expand accordion. */
.mobile-menu .nav-dd { position: static; }
.mobile-menu .nav-dd::after { content: none; }
.mobile-menu .nav-dd__btn {
  width: 100%;
  justify-content: space-between;
  padding: var(--s-3) 0;
  font-family: var(--font-display);
  font-size: 1.5rem;
  text-transform: uppercase;
  border-bottom: 1px solid var(--line);
}
.mobile-menu .nav-dd__caret { font-size: 0.8em; }
.mobile-menu .nav-dd__menu {
  position: static;
  transform: none;
  margin: 0;
  min-width: 0;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  padding: 0 0 0 var(--s-4);
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  display: none;
}
.mobile-menu .nav-dd.open .nav-dd__menu { display: grid; }
.mobile-menu .nav-dd__menu a {
  font-family: var(--font-display);
  font-size: 1.0625rem;
  text-transform: uppercase;
  padding: var(--s-3) 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
}
.mobile-menu .nav-dd__menu a:hover { background: none; }

/* Link-style dropdown variant — the tab stays a clickable link to its page, and
   a small caret reveals in-page section jumps (Home, Community, Sponsors, Life
   Members). Game day, which has no page of its own, keeps the button trigger. */
.nav-dd--link { display: inline-flex; align-items: center; gap: 1px; }
.nav-dd--link .nav-dd__btn { padding: var(--s-2) 2px; }

.mobile-menu .nav-dd--link { display: flex; flex-wrap: wrap; align-items: center; }
.mobile-menu .nav-dd--link .nav-dd__link { flex: 1 1 auto; }
.mobile-menu .nav-dd--link .nav-dd__btn {
  width: auto;
  flex: 0 0 auto;
  padding: var(--s-3);
  justify-content: center;
}
.mobile-menu .nav-dd--link .nav-dd__menu { flex-basis: 100%; }

/* =========================================================================
   Generic content tiles, tables + callouts — Resources, Upcoming events,
   Honour board and Trophy room pages.
   ========================================================================= */
.tile-grid { display: grid; gap: var(--s-5); grid-template-columns: 1fr; margin-top: var(--s-7); }
@media (min-width: 640px) { .tile-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 980px) { .tile-grid--3 { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 880px) { .tile-grid--4 { grid-template-columns: repeat(4, 1fr); } }
.tile { display: block; background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: var(--s-5) var(--s-6); box-shadow: var(--shadow-sm); }
a.tile { color: inherit; transition: transform .15s var(--ease), box-shadow .15s var(--ease), border-color .15s var(--ease); }
a.tile:hover { transform: translateY(-2px); box-shadow: var(--shadow); border-color: var(--line-strong); }
.tile h3 { margin: 0 0 var(--s-3); }
.tile p { margin: 0; color: var(--muted); font-size: 0.9375rem; }
.tile p + p { margin-top: var(--s-3); }
.tile__meta { display: block; font-family: var(--font-display); font-size: 0.75rem; letter-spacing: 1.5px; text-transform: uppercase; color: var(--red); margin-bottom: var(--s-2); }
.club-table-wrap { overflow-x: auto; margin-top: var(--s-6); border: 1px solid var(--line); border-radius: var(--radius-lg); }
.club-table { width: 100%; border-collapse: collapse; font-size: 0.9375rem; }
.club-table th, .club-table td { text-align: left; padding: var(--s-3) var(--s-4); border-bottom: 1px solid var(--line); }
.club-table thead th { font-family: var(--font-display); font-size: 0.6875rem; letter-spacing: 1.5px; text-transform: uppercase; color: var(--muted); background: var(--sand); white-space: nowrap; }
.club-table tbody td { color: var(--ink-soft); }
.club-table tbody tr:last-child td { border-bottom: 0; }
.note-callout { margin-top: var(--s-6); padding: var(--s-5) var(--s-6); background: var(--sand); border-left: 4px solid var(--red); border-radius: 0 var(--radius) var(--radius) 0; color: var(--ink-soft); font-size: 0.9375rem; }
.note-callout a { color: var(--red); }

/* Hub cards — slim card grid linking to standalone sub-pages (shared by the
   Game-day, Community and Resources hubs). */
.gd-hub { display:grid; gap: var(--s-5); grid-template-columns: 1fr; }
@media (min-width:680px){ .gd-hub{ grid-template-columns: repeat(2,1fr);} }
@media (min-width:1000px){ .gd-hub{ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));} }
/* Placeholder "your logo here" cells (premier sponsor strip — senior sponsors TBD) */
.sponsor-tbd { width: 124px; height: 50px; display: inline-flex; align-items: center; justify-content: center; border: 1px dashed var(--line-strong); border-radius: var(--radius-sm); color: var(--muted-soft); font-family: var(--font-display); font-size: 0.72rem; letter-spacing: 0.14em; text-transform: uppercase; background: var(--paper); }
.gd-hub__card { position:relative; display:block; background:var(--paper); border:1px solid var(--line); border-radius:var(--radius-lg); padding: var(--s-6); box-shadow:var(--shadow-sm); transition: transform .15s var(--ease), box-shadow .15s var(--ease), border-color .15s var(--ease); }
.gd-hub__card:hover { transform: translateY(-2px); box-shadow: var(--shadow); border-color: var(--line-strong); }
.gd-hub__card h3 { margin:0 0 var(--s-2); }
.gd-hub__card p { margin:0; color:var(--muted); font-size:0.9375rem; }
.gd-hub__go { position:absolute; top:var(--s-5); right:var(--s-6); color:var(--red); font-weight:700; }

/* About — numbered value headings */
.value-num {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.125rem;
  line-height: 1.05;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  margin: 0;
}

/* About — "Four things the club cares about": a spacious 2-up values grid (was a
   squashed 4-across card row). Big number + kicker + heading + body, room to breathe. */
.values-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-6);
  margin-top: var(--s-8);
}
@media (min-width: 760px) {
  .values-grid { grid-template-columns: repeat(2, 1fr); gap: var(--s-7); }
}
.value-card {
  display: flex;
  flex-direction: column;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow);
  transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
}
.value-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-strong); }
.value-card__img { width: 100%; aspect-ratio: 16 / 10; object-fit: cover; display: block; }
.value-card__row { display: flex; gap: var(--s-5); align-items: flex-start; padding: var(--s-7) var(--s-7) var(--s-8); }
.value-card__num {
  flex: none;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2.5rem, 6vw, 3.75rem);
  line-height: 0.85;
  color: var(--ink);
}
.value-card__body { display: flex; flex-direction: column; }
.value-card__kicker {
  font-family: var(--font-display);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: 0.8125rem;
  color: var(--muted);
  margin: 0 0 var(--s-2);
}
.value-card__body h3 {
  font-size: clamp(1.3rem, 2.4vw, 1.6rem);
  line-height: 1.15;
  margin: 0 0 var(--s-3);
}
.value-card__body p { color: var(--muted); font-size: 1rem; line-height: 1.65; margin: 0; }

/* Numbered "what to do" lists (Duty Officers role, tips, etc.) */
.do-list { display: grid; gap: var(--s-3); margin-top: var(--s-6); padding-left: var(--s-6); max-width: 760px; }
.do-list li { line-height: 1.6; padding-left: var(--s-2); }
.do-list li::marker { color: var(--red); font-weight: 600; font-family: var(--font-display); }

/* Registration "what's included" bullet lists */
.incl-list { display: grid; gap: var(--s-2); margin-top: var(--s-4); padding-left: var(--s-5); font-size: 0.9375rem; color: var(--ink-soft); line-height: 1.5; }
.incl-list li::marker { color: var(--red); }

/* Click-to-enlarge image lightbox (field markup, goals & pack-up) — js/lightbox.js */
.lightbox { position: fixed; inset: 0; z-index: 1000; background: rgba(0,0,0,0.9); display: flex; align-items: center; justify-content: center; padding: var(--s-5); cursor: zoom-out; animation: lightboxIn 0.15s var(--ease); }
.lightbox img { max-width: 96vw; max-height: 92vh; width: auto; height: auto; border-radius: var(--radius); box-shadow: 0 24px 70px rgba(0,0,0,0.6); background: var(--paper); }
/* Hide the floating LeadConnector chat bubble while any modal / lightbox / mobile-nav
   overlay is open — it otherwise floats above full-screen content. Covers both signals
   the site uses: the .modal-open class (sponsor modal) and the inline scroll-lock
   (lightbox, fixtures, rosters, nav). The widget is the <chat-widget> custom element. */
body.modal-open chat-widget,
body[style*="overflow: hidden"] chat-widget,
body[style*="overflow:hidden"] chat-widget { display: none !important; }
.lightbox__close { position: absolute; top: var(--s-3); right: var(--s-4); width: 44px; height: 44px; background: none; border: none; color: #fff; font-size: 2.25rem; line-height: 1; cursor: pointer; }
@keyframes lightboxIn { from { opacity: 0; } to { opacity: 1; } }

/* Ground-status map (opened from the status bar) — base markup + each competition
   field OUTLINED in its live status colour, pulsing. Scoped above .lightbox img. */
.fmap-shell { display: flex; flex-direction: column; align-items: center; gap: var(--s-4); max-width: 96vw; cursor: default; }
.fmap { position: relative; display: inline-block; line-height: 0; max-width: 96vw; }
.fmap .fmap__base { display: block; width: auto; height: auto; max-width: 96vw; max-height: 82vh; border-radius: var(--radius); box-shadow: 0 24px 70px rgba(0,0,0,0.6); background: var(--paper); }
.fmap .fmap__ov { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }
.fmap-field { fill: none; }
.fmap-field path { fill: none; stroke: currentColor; stroke-linejoin: round; stroke-linecap: round; }
.fmap-field--open { color: #1fbf4c; }
.fmap-field--closed { color: #ff2f3b; }
.fmap-field--pending { color: #f7a20b; }
.fmap__cap { margin: 0; color: #fff; font-family: var(--font-display); font-size: 0.9rem; letter-spacing: 0.02em; text-align: center; }
@keyframes fmap-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.38; } }
.fmap-field { animation: fmap-pulse 2.6s ease-in-out infinite; }

/* The status bar is one big button → opens the map above. Deliberately no "Map"
   pill/icon on the bar (removed 2026-07-02) — the whole bar is the tap target. */
.fsb--clickable { cursor: pointer; position: relative; }

@media (prefers-reduced-motion: reduce) { .fmap-field { animation: none; } }

/* Player rotator — cross-fading action shots (about-story). Stays hidden until at
   least one photo actually loads (js/player-rotator.js), so nothing breaks publicly. */
.player-rotator { position: relative; width: 100%; max-width: 480px; margin: 0 auto; aspect-ratio: 4 / 5; border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); background: var(--ink-soft); }
.player-rotator[hidden] { display: none; }
.pr-slide { position: absolute; inset: 0; margin: 0; opacity: 0; transition: opacity 0.8s var(--ease); }
.pr-slide.is-active { opacity: 1; }
.pr-slide img { width: 100%; height: 100%; object-fit: contain; display: block; }
.pr-slide figcaption { position: absolute; left: 0; right: 0; bottom: 0; padding: var(--s-7) var(--s-5) var(--s-4); color: #fff; font-family: var(--font-display); font-size: 0.95rem; background: linear-gradient(transparent, rgba(0,0,0,0.82)); }
.pr-credit { display: block; font-size: 0.68rem; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.8; margin-top: 4px; }

/* "Around the club" photo gallery + highlights video */
.club-video { width: 100%; max-width: 900px; aspect-ratio: 16 / 9; object-fit: cover; display: block; margin: var(--s-7) auto 0; border-radius: var(--radius); box-shadow: var(--shadow); background: #000; }
.photo-gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: var(--s-3); margin-top: var(--s-6); }
.photo-gallery img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: var(--radius); box-shadow: var(--shadow-sm); cursor: zoom-in; transition: transform 0.2s var(--ease); display: block; }
.photo-gallery img:hover { transform: scale(1.03); box-shadow: var(--shadow); }
@media (min-width: 700px) { .photo-gallery { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); } }

/* Game Leader game-day availability & claim board (members portal) */
.gla { margin-top: var(--s-7); }
.gla__cols { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-5); margin-top: var(--s-5); }
@media (max-width: 720px) { .gla__cols { grid-template-columns: 1fr; } }
.gla__h { margin: 0 0 var(--s-3); font-size: 1.05rem; display: flex; align-items: center; gap: 0.5rem; }
.gla__badge { display: inline-flex; min-width: 1.4em; height: 1.4em; padding: 0 0.4em; align-items: center; justify-content: center; border-radius: 999px; background: #c1272d; color: #fff; font-size: 0.72rem; font-weight: 700; line-height: 1; }
.gla__list { display: flex; flex-direction: column; gap: var(--s-3); }
.gla__empty { margin: 0; font-size: 0.9rem; }
.gla__alert { margin-top: var(--s-4); padding: var(--s-3) var(--s-4); border-radius: var(--radius); background: #fdecec; border-left: 4px solid #c1272d; color: #7a1a1a; font-weight: 600; font-size: 0.92rem; }
.gla-card { display: flex; align-items: center; justify-content: space-between; gap: var(--s-4); padding: var(--s-4) var(--s-5); border: 1px solid var(--line); border-left: 4px solid var(--line); border-radius: var(--radius); background: var(--paper); }
.gla-card--open { border-left-color: #c8892a; }
.gla-card--mine { border-left-color: #157f3c; }
.gla-card__when { font-weight: 700; }
.gla-card__what { color: var(--muted, #5a5650); font-size: 0.9rem; margin-top: 2px; }
.gla-card__note { font-size: 0.82rem; margin-top: 3px; }
.gla-card__metaline { font-size: 0.78rem; color: var(--muted, #5a5650); margin-top: 4px; }
.gla-card__action { flex: none; display: flex; flex-direction: column; gap: var(--s-2); align-items: stretch; }
.gla-card__btn { white-space: nowrap; }
.gla-clash { color: #c1272d; font-weight: 600; }
.gla-confirm-needed { color: #b06a00; font-weight: 700; }
.gla-confirmed { color: #2e7d32; font-weight: 700; }
/* Phones: the claim button can't shrink (nowrap), so on narrow screens stack the
   card — details on top, a full-width action button below — instead of squashing. */
@media (max-width: 520px) {
  .gla-card { flex-direction: column; align-items: stretch; gap: var(--s-3); }
  .gla-card__action, .gla-card__btn { width: 100%; }
}

/* Community Lost & Found gallery (public community-lost-found.html) */
.lf-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: var(--s-5); margin-top: var(--s-6); }
.lf-item { margin: 0; background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow-sm); }
.lf-item__img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block; cursor: zoom-in; }
.lf-item__cap { padding: var(--s-4) var(--s-5); font-size: 0.9rem; color: var(--ink); }
.lf-empty { grid-column: 1 / -1; }
@media (min-width: 700px) { .lf-grid { grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); } }
.gla__status { margin-top: var(--s-4); padding: var(--s-3) var(--s-4); border-radius: var(--radius); font-size: 0.9rem; }
.gla__status--sending { background: #f3efe8; }
.gla__status--ok { background: #eef6ee; }
.gla__status--error { background: #fdecec; }
.gla__all { margin-top: var(--s-5); }
.gla__all > summary { cursor: pointer; font-size: 0.9rem; color: var(--muted, #5a5650); }
.gla__all .gla__list { margin-top: var(--s-3); }

/* Game-day availability TABLE (2026-07-09 redesign) — the WHOLE roster, colour-coded
   (Cade 2026-07-09): allocated/awaiting = PINK · confirmed = GREEN · available = YELLOW.
   NB the class names below stay --grey/--red for compatibility with gl-availability.js +
   gl-games-panel.js (which set state='grey'/'red'); only the COLOURS changed. Shared by the
   member board AND the admin GL panel legend, so both recolour together. */
.glt-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-3) var(--s-5); margin: var(--s-4) 0 var(--s-2); }
.glt-filters { display: flex; flex-wrap: wrap; gap: var(--s-4); }
.glt-fbox { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 0.85rem; font-weight: 600; color: var(--ink); cursor: pointer; }
.glt-fbox input { width: auto; margin: 0; }
.glt-legend { display: flex; flex-wrap: wrap; gap: var(--s-2); }
.glt-key { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; padding: 2px 9px; border-radius: 4px; }
.glt-key--grey { background: #fbe0ec; color: #b0286a; }   /* allocated → PINK */
.glt-key--green { background: #dcecdd; color: #157f3c; }  /* confirmed → GREEN (unchanged) */
.glt-key--red { background: #fbf1c9; color: #866a00; }    /* available → YELLOW */
.glt-wrap { overflow-x: auto; margin-top: var(--s-3); border: 1px solid var(--line); border-radius: var(--radius); }
.glt { width: 100%; border-collapse: collapse; font-size: 0.9rem; background: var(--paper); }
.glt thead th { text-align: left; padding: 0.5rem 0.75rem; background: var(--ink); color: var(--paper); font-family: var(--font-display); font-size: 0.68rem; letter-spacing: 0.06em; text-transform: uppercase; white-space: nowrap; }
.glt td { padding: 0.55rem 0.75rem; border-bottom: 1px solid var(--line); vertical-align: middle; }
.glt tbody tr:last-child td { border-bottom: 0; }
.glt-when { white-space: nowrap; font-weight: 700; }
.glt-note { color: var(--muted, #5a5650); font-size: 0.8rem; margin-top: 2px; }
.glt-sub { color: var(--muted, #5a5650); font-size: 0.82rem; }
.glt-avail { color: #866a00; font-weight: 700; }   /* matches the YELLOW "available" state */
.glt-act { white-space: nowrap; text-align: right; }
.glt-act .btn { white-space: nowrap; }
.glt-row--grey  { background: #fdeef5; }   /* allocated → PINK */
.glt-row--green { background: #eef6ee; }   /* confirmed → GREEN (unchanged) */
.glt-row--red   { background: #fdfae8; }   /* available → YELLOW */
.glt-row--grey  td:first-child { box-shadow: inset 4px 0 0 #d94f8f; }
.glt-row--green td:first-child { box-shadow: inset 4px 0 0 #157f3c; }
.glt-row--red   td:first-child { box-shadow: inset 4px 0 0 #d9b400; }

/* Featured event with a poster (upcoming events) */
.event-feature { display: grid; grid-template-columns: minmax(0, 300px) 1fr; gap: var(--s-7); align-items: center; margin-top: var(--s-7); background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: var(--s-6); box-shadow: var(--shadow-sm); }
.event-feature__poster img { width: 100%; height: auto; display: block; border-radius: var(--radius); box-shadow: var(--shadow); cursor: zoom-in; }
.event-feature__body h2 { margin: var(--s-2) 0 var(--s-3); }
.event-feature__body .tile__meta { color: var(--red); }
/* A featured event with no poster: single full-width column (no empty poster slot). */
.event-feature--textonly { grid-template-columns: 1fr; }
@media (max-width: 640px) { .event-feature { grid-template-columns: 1fr; } }
/* Any lightbox-enabled image (incl. admin-managed event posters added after load). */
img[data-lightbox] { cursor: zoom-in; }
.event-feature + .event-feature { margin-top: var(--s-6); }
/* Passed events — kept on the Upcoming board as promo, but clearly marked done: greyed
   back + struck through, with an "Event passed" pill (rendered by js/events-board.js). */
.ev--past { opacity: 0.6; }
.ev--past h3, .ev--past .tile__meta { text-decoration: line-through; }
.ev--past .btn-link { text-decoration: none; }
.ev-passed-tag { display: inline-block; font-family: var(--font-display); font-size: 0.6875rem; letter-spacing: 1.5px; text-transform: uppercase; color: #6E6D6A; background: rgba(15, 15, 16, 0.06); border-radius: 999px; padding: 3px 9px; margin-bottom: var(--s-2); }

/* Members' DRUFC video library — link-out cards (js/videos-board.js). */
.vid-grid { display: grid; gap: var(--s-5); grid-template-columns: 1fr; margin-top: var(--s-6); }
@media (min-width: 640px) { .vid-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 980px) { .vid-grid { grid-template-columns: repeat(3, 1fr); } }
.vid-card { display: flex; flex-direction: column; background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-sm); text-decoration: none; color: inherit;
  transition: transform .15s var(--ease), box-shadow .15s var(--ease), border-color .15s var(--ease); }
.vid-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); border-color: var(--line-strong); }
.vid-card__thumb { position: relative; aspect-ratio: 16 / 9; background: var(--ink); display: block; }
.vid-card__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.vid-card__play { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }
.vid-card__play::after { content: "\25B6"; color: #fff; font-size: 1.2rem; line-height: 1;
  width: 54px; height: 54px; border-radius: 50%; background: rgba(0,0,0,0.55);
  display: flex; align-items: center; justify-content: center; padding-left: 4px; }
.vid-card:hover .vid-card__play::after { background: rgba(0,0,0,0.72); }
.vid-card__body { padding: var(--s-5); display: flex; flex-direction: column; gap: var(--s-2); }
.vid-card__meta { font-family: var(--font-display); font-size: 0.72rem; letter-spacing: 1.5px; text-transform: uppercase; color: var(--red); }
.vid-card h3 { margin: 0; font-size: 1.1rem; }
.vid-card p { margin: 0; color: var(--muted); font-size: 0.9rem; line-height: 1.5; }

/* "Perk" callout — the members-only DRUFC video library entry point (stands out from
   the white external-resource tiles: a solid dark card). */
.perk-card { display: flex; gap: var(--s-5); align-items: center; margin-top: var(--s-5);
  background: var(--ink); color: var(--paper); border-radius: var(--radius-lg);
  padding: var(--s-6) var(--s-7); box-shadow: var(--shadow); text-decoration: none;
  transition: transform .2s var(--ease), box-shadow .2s var(--ease); }
.perk-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-strong); }
.perk-card__icon { flex: none; font-size: 1.8rem; line-height: 1; }
.perk-card__body { flex: 1 1 auto; }
.perk-card__kicker { font-family: var(--font-display); font-size: 0.7rem; letter-spacing: 0.2em; text-transform: uppercase; color: rgba(255,255,255,0.6); }
.perk-card h3 { color: #fff; margin: 0.25rem 0 0.35rem; font-size: 1.25rem; }
.perk-card p { color: rgba(255,255,255,0.82); margin: 0; font-size: 0.95rem; line-height: 1.5; }
.perk-card__go { flex: none; margin-left: auto; color: #fff; font-weight: 700; font-size: 1.2rem; }
@media (max-width: 560px) { .perk-card { flex-wrap: wrap; } .perk-card__go { margin-left: 0; } }

/* Rotating photo backdrop for a hero header — js/hero-rotate.js */
.hero-rotate > .hero-rotate__bg { position: absolute; inset: 0; z-index: 0; }
.hero-rotate__slide { position: absolute; inset: 0; background-size: cover; background-position: center; opacity: 0; transition: opacity 1.4s ease; }
.hero-rotate__slide.is-active { opacity: 1; }
.hero-rotate__bg::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(15,15,16,0.62) 0%, rgba(15,15,16,0.80) 100%); }
.hero-rotate { min-height: 56vh; display: flex; align-items: center; }

/* Forms & documents download/resource cells */
.dl-card { padding-right: 2.6rem; }
.dl-card__meta { display:block; font-family: var(--font-display); font-size:0.72rem; font-weight:600; letter-spacing:0.12em; text-transform:uppercase; color:var(--muted); margin-bottom:var(--s-2); }

/* Members login — a small clickable in the top-right of the header (not a nav tab);
   on mobile it lives in the slide-out menu instead. */
/* Members — a ghost button matching the side CTAs (text inside a black border) */
.nav-login { display: none; align-items: center; gap: 6px; font-family: var(--font-display); font-size: 0.72rem; font-weight: 500; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink); background: transparent; border: 1px solid var(--ink); border-radius: var(--radius-sm); padding: 0.55rem 0.72rem; white-space: nowrap; transition: background 0.2s var(--ease), color 0.2s var(--ease); }
.nav-login svg { width: 13px; height: 13px; flex: none; }
.nav-login:hover { background: var(--ink); color: var(--paper); }
@media (min-width: 1240px) { .nav-login { display: inline-flex; } }
/* The right-hand segment: Members + the side-switch / Register buttons, kept as
   one evenly-spaced unit so the whole group aligns to the container's right edge.
   (Its flex sizing is set in the >=1240px block — a flexible side column equal to
   the brand's, so the centre menu lands dead-centre. No flex here, or this later
   rule would override that.) */
.nav-actions { display: flex; align-items: center; gap: var(--s-3); }

/* Side-switch pill in nav-actions (Community | Premier). Consistent across the
   club, community and premier headers; the current side is filled black so a
   visitor can see — and switch — which side they're on. Hidden on mobile (the
   hamburger menu carries the side links); shown in the >=1240px block. */
.nav-side { display: none; grid-template-columns: 1fr 1fr; align-items: stretch; background: var(--paper); border: 1px solid var(--line); border-radius: 999px; box-shadow: var(--shadow-sm); overflow: hidden; }
.nav-side__btn { display: inline-flex; align-items: center; justify-content: center; font-family: var(--font-display); font-weight: 600; font-size: 0.72rem; letter-spacing: 0.05em; text-transform: uppercase; padding: 0.5rem 1.3rem; color: var(--muted); white-space: nowrap; transition: background 0.2s var(--ease), color 0.2s var(--ease); }
.nav-side__btn + .nav-side__btn { border-left: 2px solid var(--line-strong); }
.nav-side__btn:hover { color: var(--ink); }
.nav-side__btn.is-current, .nav-side__btn.is-current:hover { background: var(--ink); color: var(--paper); }
/* Premier shelved — the side-switch Premier button is inert + "coming soon" */
.nav-side__btn--soon, .nav-side__btn--soon:hover { color: var(--muted); cursor: default; opacity: 0.55; }
.footer-soon { color: var(--muted); }

/* "Signed in" indicator — hidden until js/member-status.js confirms a live member
   session, then revealed (desktop only). */
.nav-signed-in { display: none; align-items: center; gap: 0.4rem; font-family: var(--font-display); font-weight: 600; font-size: 0.72rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink); white-space: nowrap; }
.nav-signed-in::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: #2e9e5b; flex: none; }
.nav-signed-in[hidden] { display: none !important; }

/* The overall/club header carries the widest action group (Members + the two
   side-switch buttons). Because .container caps the nav's content box at the
   same ~1152px for EVERY viewport >=1248px, the roomy default spacing never
   fits that six-tab + three-button row — so the tighter gaps/buttons below
   apply across all desktop widths, not just a narrow band (the old
   max-width:1399 bound let wider screens fall back to the overflowing spacing). */
@media (min-width: 1240px) {
  .nav { gap: var(--s-3); }
  .nav-menu { gap: var(--s-2); }
  .nav-actions { gap: var(--s-2); }
  .nav-cta.sm { padding: 0.55rem 0.72rem; font-size: 0.72rem; letter-spacing: 0; }
}

/* Two-sides switcher (Community League | Premier League) — a CSS-only radio
   toggle reused on the Honour Board and Committee pages. One switch per page;
   the standard radio IDs are #side-community / #side-premier. Panels switch on
   the reliable DIRECT-sibling :checked selector (works with no JS); the active
   button highlight is applied by js/side-switch.js via .is-active, because the
   sibling-DESCENDANT ":checked ~ .bar .btn" form doesn't reliably re-invalidate
   on toggle in some engines. The community label ships with .is-active so the
   default state is correct before JS runs. */
.side-switch { position: relative; }
.side-switch > .side-input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.side-bar { text-align: center; padding: var(--s-6) 0 var(--s-2); }
.side-toggle { display: inline-flex; gap: 4px; padding: 5px; background: var(--paper); border: 1px solid var(--line); border-radius: 999px; box-shadow: var(--shadow-sm); }
.side-toggle__btn { display: inline-flex; align-items: center; cursor: pointer; font-family: var(--font-display); font-weight: 600; font-size: 0.85rem; letter-spacing: 0.06em; text-transform: uppercase; padding: 0.65rem 1.5rem; border-radius: 999px; color: var(--muted); transition: background 0.2s var(--ease), color 0.2s var(--ease); white-space: nowrap; }
.side-toggle__btn:hover { color: var(--ink); }
.side-toggle__btn.is-active { background: var(--ink); color: var(--paper); }
.side-toggle__btn.is-focus { outline: 2px solid var(--red); outline-offset: 2px; }
.side-bar__hint { color: var(--muted); font-size: 0.85rem; margin: var(--s-4) 0 0; }
.side-panel--premier { display: none; }
#side-premier:checked ~ .side-panel--community { display: none; }
#side-premier:checked ~ .side-panel--premier { display: block; }
.side-panel > .card-grid { margin-top: var(--s-6); }
/* Pull the first panel section up close to the toggle — the default section top
   padding left the Community/Premier switch floating too far above the tables. */
.side-panel > .section:first-child { padding-top: var(--s-3); }

/* ===== Honour Board (life-members + honour-* pages) ===================== */
.lm-roll { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--s-3) var(--s-4); margin-top: var(--s-7); }
.lm-person { display: flex; align-items: center; gap: var(--s-4); padding: var(--s-3) var(--s-4); background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-sm); }
.lm-badge { flex: none; width: 52px; height: 52px; object-fit: contain; }
.lm-person h3 { margin: 0; font-size: 1.0625rem; font-family: var(--font-display); font-weight: 500; }
.lm-person .lm-yr { display: block; font-family: var(--font-display); font-size: 0.72rem; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted); margin-top: 2px; }
.lm-person.placeholder .lm-badge { opacity: 0.4; }
.lm-person.placeholder h3 { color: var(--muted); }
.lm-feature { background: linear-gradient(135deg, var(--ink) 0%, #1a1a1c 100%); color: var(--paper); border-radius: var(--radius-lg); padding: var(--s-7); display: grid; grid-template-columns: minmax(140px, 200px) 1fr; gap: var(--s-7); align-items: center; margin-top: var(--s-7); }
.lm-feature .badge-circle { aspect-ratio: 1; border-radius: 50%; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.12); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: var(--s-5); }
.lm-feature .badge-circle .num { font-family: var(--font-display); font-size: clamp(2.5rem, 5vw, 3.5rem); font-weight: 700; line-height: 1; color: var(--paper); }
.lm-feature .badge-circle .lbl { font-family: var(--font-display); font-size: 0.6875rem; letter-spacing: 0.2em; color: rgba(255,255,255,0.55); margin-top: var(--s-3); }
.lm-feature .body .role { font-family: var(--font-display); font-size: 0.75rem; letter-spacing: 2px; text-transform: uppercase; color: rgba(255,255,255,0.55); margin-bottom: var(--s-3); }
.lm-feature .body h3 { color: var(--paper); font-size: clamp(1.5rem, 3vw, 2rem); margin: 0 0 var(--s-4); }
.lm-feature .body p { color: rgba(255,255,255,0.85); margin: 0 0 var(--s-3); line-height: 1.55; }
@media (max-width: 600px) { .lm-feature { grid-template-columns: 1fr; text-align: center; } .lm-feature .badge-circle { max-width: 180px; margin: 0 auto; } }

/* Office bearers — current-committee cards (summary teaser; rectangular, distinct
   from the shield crests) */
.ob-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: var(--s-5); margin-top: var(--s-7); }
.ob-card { background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); padding: var(--s-6) var(--s-5); text-align: center; }
.ob-card .ob-year { display: block; font-family: var(--font-display); font-weight: 700; font-size: 1rem; letter-spacing: 0.03em; color: var(--ink); }
.ob-card .ob-role { display: block; font-family: var(--font-display); font-size: 0.7rem; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); margin: 2px 0 var(--s-3); }
.ob-card h3 { margin: 0; font-size: 1.15rem; font-family: var(--font-display); font-weight: 600; }

/* Life members — outlined medallions (summary teaser; circular, a lighter
   presentation than the shield crests) */
.medallions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-5) var(--s-6); margin-top: var(--s-7); }
.medallion { width: 96px; display: flex; flex-direction: column; align-items: center; gap: var(--s-3); transition: transform 0.18s var(--ease); }
.medallion__disc { flex: none; width: 62px; height: 62px; border-radius: 50%; border: 2px solid var(--ink); background: var(--paper); display: flex; align-items: center; justify-content: center; font-family: var(--font-display); font-weight: 700; font-size: 1.15rem; letter-spacing: 0.02em; color: var(--ink); }
.medallion__disc.placeholder { border-color: #b9b0a3; color: rgba(31,31,33,0.4); }
.medallion__name { font-size: 0.8rem; text-align: center; line-height: 1.2; color: var(--ink); font-family: var(--font-display); font-weight: 500; }
/* hover to enlarge — life-member cards + office-bearer cards (same action as the crests) */
.lm-person { transition: transform 0.18s var(--ease), box-shadow 0.18s var(--ease); }
.lm-person:hover { transform: scale(1.06); box-shadow: var(--shadow); position: relative; z-index: 2; }
.ob-card { transition: transform 0.18s var(--ease), box-shadow 0.18s var(--ease); }
.ob-card:hover { transform: scale(1.05); box-shadow: var(--shadow); position: relative; z-index: 2; }
/* Office bearers — expandable year rows (executive in the row; open for the full committee) */
.ob-list { min-width: 640px; border: 1px solid var(--line); border-radius: 12px; overflow: hidden; background: var(--paper); margin-top: var(--s-6); }
.ob-list__head, .ob-yr summary, .ob-yr__row { display: grid; grid-template-columns: 64px 1fr 1fr 1fr 1fr 30px; gap: var(--s-3); align-items: center; padding: 0.6rem 0.9rem; }
.ob-list__head { background: var(--ink); color: var(--paper); font-family: var(--font-display); font-size: 0.7rem; letter-spacing: 0.07em; text-transform: uppercase; }
.ob-yr { border-top: 1px solid var(--line); }
.ob-yr summary, .ob-yr__row { font-size: 0.9rem; }
.ob-yr__y { font-weight: 600; font-family: var(--font-display); }
.ob-yr summary { cursor: pointer; list-style: none; transition: background 0.15s var(--ease); }
.ob-yr summary::-webkit-details-marker { display: none; }
.ob-yr summary:hover { background: var(--sand); }
.ob-yr .ob-caret { justify-self: end; color: var(--muted); font-size: 1.15rem; line-height: 1; }
.ob-yr .ob-caret::before { content: "+"; }
.ob-yr[open] .ob-caret::before { content: "2"; }
.ob-yr[open] summary { background: var(--sand); }
.ob-yr__body { padding: var(--s-4) 0.9rem var(--s-5); border-top: 1px dashed var(--line); background: #fbf9f5; }
.ob-yr__body h4 { margin: 0; font-size: 0.75rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
.ob-roles { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: var(--s-2) var(--s-5); list-style: none; margin: var(--s-3) 0 0; padding: 0; font-size: 0.9rem; }
.ob-roles b { display: block; font-family: var(--font-display); font-weight: 600; font-size: 0.72rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); margin-bottom: 2px; }
.ob-roles li { line-height: 1.35; }
/* life-members carousel (summary) — a window of cards that slowly fades through the whole roll */
[data-carousel].is-carousel { transition: opacity 0.9s var(--ease); }
[data-carousel].is-carousel > * { display: none; }
[data-carousel].is-carousel > .is-shown { display: flex; }
[data-carousel].is-carousel.is-fading { opacity: 0; }
.lm-roll[data-carousel].is-carousel { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-4); }

/* Trophy crest — the DRUFC shield-crest emblem wearing the club-logo text
   treatment: the GRADE big & bold above the thistle (the "DUDLEY REDHEAD UNITED"
   slot); below the thistle the OUTCOME big & bold with the YEAR as the small date
   line under it (the "FOOTBALL CLUB / Est. 1896" slot). Text scales with the crest
   via container units; per-crest grade/outcome sizes are set inline so long names
   stay within two lines (build-honour-board-page.py). */
/* bump the ?v on crest-emblem.svg whenever build-crest-emblem.py regenerates it
   (it's in styles.css, which bump-version.py doesn't rewrite, so cache it by hand). */
.crest { flex: 0 0 auto; aspect-ratio: 1096 / 1118; container-type: inline-size; background: url("/images/brand/crest-emblem.svg?v=2") center/100% 100% no-repeat; }
/* The shield TAPERS toward the top curve and the bottom point, so text is placed in
   the two WIDE white bands only — grade centred above the thistle (~21%), outcome
   centred below it (~72%, clear of the narrowing point). Per-zone left/right insets
   match the shield's interior width there so nothing runs off the emblem. The year
   is NOT drawn on the crest — it heads each group (see .trophy-year). */
.crest__in { position: relative; height: 100%; text-align: center; }
.crest__grade { position: absolute; left: 17%; right: 17%; top: 24%; transform: translateY(-50%); font-family: var(--font-display); font-weight: 700; text-transform: uppercase; letter-spacing: 0.01em; line-height: 1.0; color: var(--ink); font-size: 7cqi; }
.crest__honour { position: absolute; left: 21%; right: 21%; top: 71%; transform: translateY(-50%); font-family: var(--font-display); font-weight: 700; text-transform: uppercase; letter-spacing: 0.01em; line-height: 1.0; color: var(--ink); font-size: 6.2cqi; }

/* Trophy banner (summary) — two rows scrolling opposite ways, no JS, no hover pause */
.crest-banner { margin-top: var(--s-7); display: flex; flex-direction: column; gap: var(--s-4); }
.crest-marquee { overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent); mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent); }
.crest-marquee__track { display: flex; align-items: center; width: max-content; animation: crestScroll 240s linear infinite; }
.crest-marquee--rev .crest-marquee__track { animation-direction: reverse; }
@keyframes crestScroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.crest-marquee .crest { width: 178px; margin-right: var(--s-4); }

/* Trophy wall (trophy-room page) — large crests, hover to enlarge */
.crest-grid { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-3) var(--s-5); margin-top: var(--s-7); }
.crest-grid .crest { width: clamp(160px, 18vw, 200px); transition: transform 0.18s var(--ease); }
.crest-grid .crest:hover, .crest-grid .crest:focus-within { transform: scale(1.2); position: relative; z-index: 3; }
/* Year subheadings — each year's crests sit under their own heading (the year is
   no longer drawn inside the crest). */
.trophy-year { width: 100%; display: flex; align-items: baseline; justify-content: center; gap: var(--s-3); margin: var(--s-8) 0 0; padding-bottom: var(--s-3); border-bottom: 1px solid var(--line); }
.trophy-year:first-child { margin-top: var(--s-6); }
.trophy-year__y { font-family: var(--font-display); font-weight: 700; font-size: 1.55rem; line-height: 1; color: var(--ink); margin: 0; }
.trophy-year__n { font-family: var(--font-display); font-size: 0.72rem; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }
.crest-grid--grouped { margin-top: var(--s-5); }

/* Club awards page — club honours (cards) + perpetual award shields (year rolls) */
.club-honours { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--s-5); margin-top: var(--s-7); }
.honour-card { background: var(--paper); border: 1px solid var(--line); border-left: 4px solid var(--ink); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); padding: var(--s-6); transition: transform 0.18s var(--ease), box-shadow 0.18s var(--ease); }
.honour-card:hover { transform: scale(1.04); box-shadow: var(--shadow); }
.honour-card__yr { font-family: var(--font-display); font-weight: 700; font-size: 1.4rem; line-height: 1; color: var(--ink); }
.honour-card h3 { margin: var(--s-3) 0; font-family: var(--font-display); font-weight: 600; font-size: 1.1rem; line-height: 1.2; }
.honour-card__body { color: var(--muted); font-size: 0.85rem; line-height: 1.4; }
.awards { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: var(--s-6); margin-top: var(--s-7); align-items: start; }
.award { background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); padding: var(--s-6); }
.award__sub { display: block; font-family: var(--font-display); font-size: 0.68rem; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }
.award h3 { margin: 2px 0 var(--s-3); font-family: var(--font-display); font-weight: 600; font-size: 1.18rem; line-height: 1.15; }
.award__desc { color: var(--muted); font-size: 0.85rem; line-height: 1.5; margin: 0 0 var(--s-5); }
.award__roll { list-style: none; margin: 0; padding: var(--s-4) 0 0; border-top: 1px solid var(--line); display: flex; flex-direction: column; }
.award__roll li { display: grid; grid-template-columns: 3em 1fr; gap: var(--s-3); align-items: baseline; padding: 4px var(--s-3); border-radius: var(--radius); }
.award__roll li:nth-child(even) { background: rgba(15,15,16,0.035); }
.award__yr { font-family: var(--font-display); font-weight: 700; font-size: 0.9rem; color: var(--ink); }
.award__who { font-size: 0.9rem; line-height: 1.35; color: var(--ink); }
.award__note { color: var(--muted); font-size: 0.78rem; }

@media (prefers-reduced-motion: reduce) {
  .crest-marquee { -webkit-mask-image: none; mask-image: none; }
  .crest-marquee__track { animation: none; flex-wrap: wrap; justify-content: center; }
  .crest-grid .crest { transition: none; }
  .lm-person, .medallion, .ob-card, .honour-card { transition: none; }
}
