@charset "UTF-8";

/* Google Fonts used by the landing page (Oswald for the HEARTS·HANDS·CLT
   wordmark, Fraunces for serif headlines, Inter for body/UI). Loaded here
   instead of in <head> so this stylesheet is self-sufficient — header_base.php
   does not need to know which fonts the landing page wants. Other pages
   harmlessly receive the same fonts (cached by the browser thereafter). */
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600;9..144,700;9..144,900&family=Inter:wght@300;400;500;600;700&family=Oswald:wght@200;300;400;500;600;700&display=swap');

/* ==========================================================================
   Hearts to Hands CLT — Main-Site Stylesheet
   --------------------------------------------------------------------------
   Public marketing site styles only (home, about, contact, privacy, terms).
   Layered on top of styles-base.css (which provides typography, glass cards,
   portal-header, hero-sub, etc.). Anything section-specific lives HERE.
   ========================================================================== */


/* ── Policy pages (privacy, terms) ───────────────────────────────────────── */

.policy-section { margin-bottom: 2.5rem; }
.policy-section h2 {
  font-size: 1.1rem; font-weight: 700;
  color: var(--h2h-gold, #E2BB80);
  border-bottom: 1px solid rgba(226,187,128,.20);
  padding-bottom: .5rem; margin-bottom: 1rem;
}
.policy-section p,
.policy-section li {
  font-size: .92rem; line-height: 1.75;
  color: rgba(233,238,247,.80);
}
.policy-section ul { padding-left: 1.25rem; }
.policy-section li { margin-bottom: .35rem; }

.policy-intro {
  background: rgba(226,187,128,.06);
  border: 1px solid rgba(226,187,128,.18);
  border-radius: 10px;
  padding: 1.25rem 1.5rem;
  margin-bottom: 2rem;
  font-size: .88rem; line-height: 1.7;
  color: rgba(233,238,247,.75);
}

.policy-meta {
  font-size: .78rem;
  color: rgba(233,238,247,.40);
  border-top: 1px solid rgba(255,255,255,.08);
  padding-top: 1.5rem; margin-top: 2.5rem;
}

.section-main .policy-section a,
.section-main .policy-intro a,
.section-main .policy-meta a { color: var(--h2h-gold, #E2BB80); }
.section-main .policy-section a:hover,
.section-main .policy-intro a:hover,
.section-main .policy-meta a:hover { color: #f5dfa0; }


/* ── Quill-generated DB content (admin-editable docs) ────────────────────── */

.ql-db-content { color: rgba(233,238,247,.82); font-size: .92rem; line-height: 1.75; }
.ql-db-content h2 {
  font-size: 1.05rem; font-weight: 700;
  color: var(--h2h-gold, #E2BB80);
  border-bottom: 1px solid rgba(226,187,128,.20);
  padding-bottom: .5rem; margin: 2rem 0 1rem;
}
.ql-db-content h3 {
  font-size: .95rem; font-weight: 700;
  color: rgba(233,238,247,.90);
  margin: 1.5rem 0 .75rem;
}
.ql-db-content p { margin-bottom: .85rem; }
.ql-db-content ul,
.ql-db-content ol { padding-left: 1.35rem; margin-bottom: .85rem; }
.ql-db-content li { margin-bottom: .3rem; }
.ql-db-content a { color: var(--h2h-gold, #E2BB80); }
.ql-db-content strong { color: rgba(233,238,247,.95); }


/* ── Terms-specific: SMS box + keyword pills ─────────────────────────────── */

.sms-box {
  background: rgba(1,174,240,.06);
  border: 1px solid rgba(1,174,240,.22);
  border-radius: 10px;
  padding: 1.25rem 1.5rem;
  margin: 1.25rem 0;
}
.sms-box p,
.sms-box li {
  font-size: .88rem; line-height: 1.75;
  color: rgba(233,238,247,.80);
}
.sms-box ul { padding-left: 1.25rem; margin-bottom: 0; }

.keyword {
  display: inline-block;
  background: rgba(255,255,255,.10);
  border: 1px solid rgba(255,255,255,.20);
  border-radius: 6px;
  padding: 2px 10px;
  font-weight: 800;
  font-family: monospace;
  font-size: 1rem;
  color: #fff;
  letter-spacing: .04em;
}


/* ── Main-site footer ──────────────────────────────────────────────────────
   Footer styles moved to styles-base.css so the shared site footer
   (partials/footer_base.php) renders identically across main, fundraiser, and
   portal. See the ".main-footer" section in styles-base.css. */


/* ── Policy page heading (used in privacy/terms — consolidates the inline style) ── */

.policy-page-title {
  font-size: 1.5rem; font-weight: 800;
  color: #fff;
  margin-bottom: .35rem;
}
.policy-page-meta {
  font-size: .8rem;
  color: rgba(233,238,247,.40);
  margin-bottom: 2rem;
}
.policy-intro strong { color: var(--h2h-gold, #E2BB80); }


/* ==========================================================================
   Homepage (index.php)
   ========================================================================== */

/* ── Universal: section heading (gold Bebas Neue, uppercase) ─────────────── */
.section-h {
  font-family: 'Bebas Neue', sans-serif;
  font-size: clamp(1.6rem, 4.5vw, 2.4rem);
  color: var(--h2h-gold, #E2BB80);
  letter-spacing: .04em;
  line-height: 1;
  text-align: center;
  margin-bottom: .35rem;
}
.section-sub {
  text-align: center;
  font-size: .85rem;
  color: rgba(233,238,247,.45);
  letter-spacing: .14em;
  text-transform: uppercase;
  margin-bottom: 2.5rem;
}
.section-divider {
  width: 60px; height: 3px;
  background: linear-gradient(90deg, transparent, var(--h2h-gold, #E2BB80), transparent);
  margin: 0 auto 2.5rem;
  border-radius: 2px;
}

/* ── Reveal-on-scroll (fade + lift) ───────────────────────────────────── */
.reveal-on-scroll {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity .8s cubic-bezier(.22,.61,.36,1), transform .8s cubic-bezier(.22,.61,.36,1);
  will-change: opacity, transform;
}
.reveal-on-scroll.is-visible {
  opacity: 1;
  transform: translateY(0);
}
@media (prefers-reduced-motion: reduce) {
  .reveal-on-scroll { opacity: 1; transform: none; transition: none; }
}

/* ── Section: About Us (#about) ────────────────────────────────────────── */
/* Section kicker — small, letter-spaced, sits under the rule. Contrasts with
   the big condensed title. (Reusable: .section-kicker on any section.) */
.section-kicker {
  font-family: 'DM Sans', sans-serif;
  font-weight: 700;
  font-size: .85rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  margin: 0 0 1.1rem;
}
.section-kicker-muted { color: rgba(233, 238, 247, .6); }

.about-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 1rem;
  margin: 2.5rem 0;
}
.about-stat {
  text-align: center;
  padding: 1.5rem 1rem;
  border-radius: 16px;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
}
.about-stat-num {
  font-family: 'Bebas Neue', 'Barlow Condensed', sans-serif;
  font-size: 2.9rem;
  line-height: 1;
  color: #fff;
  letter-spacing: .01em;
}
.about-stat-label {
  margin-top: .55rem;
  font-size: .82rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .07em;
}
/* Brand-coloured stat tones (number + label + top accent) */
.about-stat { border-top: 3px solid rgba(255,255,255,.12); }
.about-stat--red   { border-top-color: var(--h2h-red,   #EF0037); }
.about-stat--blue  { border-top-color: var(--h2h-blue,  #01AEF0); }
.about-stat--green { border-top-color: var(--h2h-green, #22C55E); }
.about-stat--gold  { border-top-color: var(--h2h-gold,  #E2BB80); }
.about-stat--red   .about-stat-num, .about-stat--red   .about-stat-label { color: var(--h2h-red,   #EF0037); }
.about-stat--blue  .about-stat-num, .about-stat--blue  .about-stat-label { color: var(--h2h-blue,  #01AEF0); }
.about-stat--green .about-stat-num, .about-stat--green .about-stat-label { color: var(--h2h-green, #22C55E); }
.about-stat--gold  .about-stat-num, .about-stat--gold  .about-stat-label { color: var(--h2h-gold,  #E2BB80); }

.about-founders {
  display: grid;
  grid-template-columns: 0.9fr 1.1fr;
  gap: 2rem;
  align-items: center;
  padding: 1.5rem;
  margin-top: 1rem;
}
@media (max-width: 760px) { .about-founders { grid-template-columns: 1fr; } }
.about-founders.no-photo { grid-template-columns: 1fr; }
.about-founders.no-photo .about-founders-photo { display: none; }
.about-founders-photo img {
  width: 100%;
  height: 100%;
  max-height: 380px;
  object-fit: cover;
  border-radius: 14px;
  display: block;
}
.about-founders-text h3 { color: #fff; font-size: 1.5rem; margin: .4rem 0 .75rem; }
.about-founders-text p { color: rgba(233,238,247,.78); line-height: 1.7; margin-bottom: 1rem; }

.about-partners { margin-top: 2.75rem; text-align: center; }
.about-partners-label {
  font-size: .75rem;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--h2h-gold, #E2BB80);
  margin-bottom: 1.25rem;
}
/* Draggable scroll carousel — auto-scrolls (JS), pauses on hover, and can be
   grabbed/flicked left or right. Native horizontal scroll, scrollbar hidden. */
.partner-marquee {
  position: relative;
  overflow-x: auto;
  overflow-y: hidden;
  cursor: grab;
  touch-action: pan-y;              /* horizontal handled by the drag JS */
  scrollbar-width: none;            /* Firefox */
  -ms-overflow-style: none;         /* old Edge */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent);
}
.partner-marquee::-webkit-scrollbar { display: none; }   /* WebKit */
.partner-marquee.is-dragging { cursor: grabbing; }
.partner-track {
  display: flex;
  align-items: center;
  width: max-content;
  user-select: none;
}
/* No tile background. Each logo sits in a fixed, INVISIBLE box (so they stay
   evenly sized) and is recoloured to solid white at rest, then shows its full
   colour on hover. Upload BASIC transparent-background logos. */
/* Logos display in their natural colours on a clean white "chip" so mixed
   logos (white-background, transparent, or full-colour) look uniform and stay
   legible on the dark band. */
.partner-marquee .partner-logo {
  flex: 0 0 auto;
  margin-right: 2.25rem;     /* gap between logos */
  height: 110px;             /* fits a 90px-tall image + 10px padding top/bottom */
  display: flex;
  align-items: center;
  justify-content: center;
  background: #fff;
  border-radius: 12px;
  padding: 10px 18px;
  transition: transform .2s ease, box-shadow .2s ease;
}
.partner-marquee .partner-logo:hover { transform: translateY(-3px); box-shadow: 0 8px 22px rgba(0,0,0,.30); }
/* Anchor logos link to the partner's site; keep them identical to the plain
   chips and stop native image-drag from hijacking the carousel grab gesture. */
a.partner-logo { text-decoration: none; -webkit-user-drag: none; }
.partner-logo img {
  height: 90px;              /* uniform HEIGHT; width follows the logo's shape (300x180 ⇒ ~150px wide) */
  width: auto;
  max-width: 260px;          /* guard against an unusually wide logo */
  object-fit: contain;
  -webkit-user-drag: none;
  user-select: none;
  pointer-events: none;      /* let drags fall through to the track */
}

/* ── Section: Hero (#home) ─────────────────────────────────────────────── */
.hero-home {
  position: relative;
  text-align: center;
  padding: 4rem 1rem 3rem;
  overflow: hidden;
}
.hero-home::before {
  content: '';
  position: absolute; inset: 0;
  background:
    radial-gradient(ellipse 60% 50% at 50% 35%, rgba(226,187,128,.15), transparent 70%),
    radial-gradient(ellipse 40% 30% at 50% 70%, rgba(1,174,240,.08), transparent 70%);
  pointer-events: none;
  z-index: 0;
}
.hero-home > * { position: relative; z-index: 1; }

.hero-logo {
  max-width: 200px; height: auto;
  margin: 0 auto 1.5rem;
  display: block;
  filter: drop-shadow(0 6px 24px rgba(0,0,0,.4));
}
@media (min-width: 768px) {
  .hero-logo { max-width: 280px; }
}

.hero-wordmark {
  font-family: 'Bebas Neue', sans-serif;
  font-size: clamp(2.2rem, 7vw, 4rem);
  letter-spacing: .04em;
  background: linear-gradient(135deg, #E2BB80 0%, #f5dfa0 50%, #E2BB80 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  line-height: 1;
  margin-bottom: .75rem;
  text-shadow: 0 0 60px rgba(226,187,128,.30);
}
.hero-tagline {
  font-size: clamp(.95rem, 2vw, 1.15rem);
  color: rgba(233,238,247,.70);
  font-style: italic;
  margin-bottom: 2.25rem;
}
.hero-tagline strong { color: #ef0037; font-style: normal; }
.hero-tagline em { color: #01aef0; font-style: normal; }
.hero-cta-row {
  display: flex;
  justify-content: center;
  gap: 1rem;
  flex-wrap: wrap;
}
.hero-cta {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .85rem 1.75rem;
  border-radius: 999px;
  font-weight: 700;
  font-size: .92rem;
  text-decoration: none;
  letter-spacing: .02em;
  transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
  border: 1.5px solid;
  white-space: nowrap;
}
.hero-cta-primary {
  background: var(--h2h-gold, #E2BB80);
  color: #070b14;
  border-color: var(--h2h-gold, #E2BB80);
}
.hero-cta-primary:hover {
  background: #f5dfa0; border-color: #f5dfa0;
  transform: translateY(-2px);
  box-shadow: 0 8px 22px rgba(226,187,128,.30);
  color: #070b14;
}
.hero-cta-secondary {
  background: transparent;
  color: var(--h2h-gold, #E2BB80);
  border-color: rgba(226,187,128,.45);
}
.hero-cta-secondary:hover {
  background: rgba(226,187,128,.10);
  border-color: var(--h2h-gold, #E2BB80);
  transform: translateY(-2px);
  color: #f5dfa0;
}

.hero-scroll-cue {
  display: inline-flex;
  flex-direction: column; align-items: center;
  gap: .25rem;
  margin-top: 3rem;
  color: rgba(233,238,247,.40);
  text-decoration: none;
  font-size: .75rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  transition: color .2s ease;
}
.hero-scroll-cue:hover { color: var(--h2h-gold, #E2BB80); }
.hero-scroll-cue .bi {
  font-size: 1.4rem;
  animation: bobDown 1.8s ease-in-out infinite;
}
@keyframes bobDown {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(6px); }
}
@media (prefers-reduced-motion: reduce) {
  .hero-scroll-cue .bi { animation: none; }
}

/* ── Section: About (#about) — mission + stats + founders ────────────── */
.about-mission {
  text-align: center;
  max-width: 760px;
  margin: 0 auto 3rem;
  font-size: clamp(.95rem, 2vw, 1.08rem);
  line-height: 1.85;
  color: rgba(233,238,247,.80);
}
.about-mission strong { color: var(--h2h-gold, #E2BB80); font-weight: 700; }

.home-stat-cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.25rem;
  margin: 0 auto 3.5rem;
  max-width: 760px;
}
@media (max-width: 600px) {
  .home-stat-cards { grid-template-columns: 1fr; gap: 1rem; }
}
.home-stat {
  text-align: center;
  padding: 1.75rem 1rem;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  position: relative;
  overflow: hidden;
  transition: transform .25s ease, border-color .25s ease;
}
.home-stat:hover {
  transform: translateY(-4px);
  border-color: rgba(226,187,128,.30);
}
.home-stat-icon {
  font-size: 1.5rem;
  margin-bottom: .5rem;
  opacity: .85;
}
.home-stat-icon.red { color: #ef0037; }
.home-stat-icon.gold { color: var(--h2h-gold, #E2BB80); }
.home-stat-icon.blue { color: #01aef0; }
.home-stat-num {
  font-family: 'Bebas Neue', sans-serif;
  font-size: clamp(2.2rem, 6vw, 2.8rem);
  color: #fff;
  line-height: 1;
  margin-bottom: .35rem;
  letter-spacing: .03em;
}
.home-stat-label {
  font-size: .75rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: rgba(233,238,247,.55);
}

.founders-row {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1.5rem;
  max-width: 760px;
  margin: 0 auto;
}
@media (max-width: 600px) {
  .founders-row { grid-template-columns: 1fr; }
}
.founder-card {
  display: flex;
  gap: 1.25rem;
  align-items: center;
  padding: 1.25rem;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  transition: transform .25s ease, border-color .25s ease;
}
.founder-card:hover {
  transform: translateY(-3px);
  border-color: rgba(226,187,128,.30);
}
.founder-photo {
  width: 86px; height: 86px;
  border-radius: 50%;
  object-fit: cover;
  border: 2px solid rgba(226,187,128,.35);
  flex-shrink: 0;
}
.founder-info { min-width: 0; }
.founder-name {
  font-weight: 700;
  font-size: 1rem;
  color: #fff;
  margin-bottom: .15rem;
}
.founder-role {
  font-size: .8rem;
  color: var(--h2h-gold, #E2BB80);
  margin-bottom: .5rem;
}
.founder-links {
  display: flex; gap: .65rem;
  font-size: 1rem;
}
.founder-links a {
  color: rgba(233,238,247,.55);
  text-decoration: none;
  transition: color .15s ease;
}
.founder-links a:hover { color: var(--h2h-gold, #E2BB80); }
.founder-phone {
  font-size: .8rem;
  color: rgba(233,238,247,.70);
  margin-bottom: .35rem;
}

/* ── Section: Partners (#partners) — marquee of logos ─────────────────── */
.partner-marquee-wrap {
  margin: 0 -1rem;
  padding: 1.5rem 0;
  position: relative;
}
.partner-marquee-wrap::before,
.partner-marquee-wrap::after {
  content: '';
  position: absolute;
  top: 0; bottom: 0;
  width: 80px;
  pointer-events: none;
  z-index: 2;
}
.partner-marquee-wrap::before { left: 0;  background: linear-gradient(90deg,  #070b14, transparent); }
.partner-marquee-wrap::after  { right: 0; background: linear-gradient(270deg, #070b14, transparent); }

.partner-swiper { padding: .5rem 0; }
.partner-swiper .swiper-wrapper { transition-timing-function: linear !important; }
.partner-swiper .swiper-slide {
  width: auto !important;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 1.25rem;
}
.partner-logo {
  max-height: 60px;
  width: auto;
  filter: grayscale(70%) brightness(1.4) contrast(.9);
  opacity: .75;
  transition: filter .25s ease, opacity .25s ease, transform .25s ease;
}
.partner-logo:hover {
  filter: none;
  opacity: 1;
  transform: scale(1.08);
}
@media (max-width: 600px) {
  .partner-logo { max-height: 48px; }
}

/* ── Section: Donate (#donate) — three cards ──────────────────────────── */
.donate-cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
  margin: 0 auto 2.5rem;
}
@media (max-width: 900px) { .donate-cards { grid-template-columns: 1fr; } }
.donate-card {
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  padding: 2rem 1.5rem;
  transition: transform .25s ease, border-color .25s ease, background .25s ease, box-shadow .25s ease;
  display: flex; flex-direction: column;
}
.donate-cards .donate-card:hover {
  transform: translateY(-6px);
  border-color: rgba(226,187,128,.45);
  background: rgba(255,255,255,.07);
  box-shadow: 0 16px 38px rgba(0,0,0,.36);
}
.donate-card-cta i { transition: transform .2s ease; }
.donate-card:hover .donate-card-cta i { transform: translateX(4px); }
.donate-card-icon {
  width: 56px; height: 56px;
  border-radius: 14px;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.6rem;
  margin-bottom: 1rem;
}
.donate-card-icon.red  { background: rgba(239,0,55,.12);   color: #ef5570; border: 1px solid rgba(239,0,55,.25); }
.donate-card-icon.gold { background: rgba(226,187,128,.12); color: var(--h2h-gold, #E2BB80); border: 1px solid rgba(226,187,128,.30); }
.donate-card-icon.blue { background: rgba(1,174,240,.12);  color: #01aef0; border: 1px solid rgba(1,174,240,.25); }
.donate-card-icon.green{ background: rgba(34,197,94,.12); color: var(--h2h-green, #22C55E); border: 1px solid rgba(34,197,94,.30); }
.donate-card h3 {
  font-size: 1.1rem;
  font-weight: 700;
  color: #fff;
  margin-bottom: .65rem;
}
.donate-card p {
  font-size: .88rem;
  line-height: 1.7;
  color: rgba(233,238,247,.70);
  margin-bottom: 1.25rem;
}
/* The CTA's margin-top:auto pins it to the card bottom, so paragraphs just
   stack naturally (no flex-grow spreading them apart). */
.donate-ein {
  font-weight: 700;
  color: rgba(233,238,247,.85);
  letter-spacing: .03em;
}
.donate-card-cta {
  display: inline-flex;
  align-items: center; gap: .35rem;
  padding: .55rem 1.1rem;
  border-radius: 0.375rem;   /* squared-off to match the fundraiser/portal buttons */
  font-size: .85rem;
  font-weight: 600;
  text-decoration: none;
  border: 1px solid;
  transition: all .15s ease;
  align-self: flex-start;
  margin-top: auto;   /* pin the CTA to the card bottom so buttons align
                         even when blurbs differ in length */
}
/* The Donate Funding CTA is a <button> (opens the modal) — strip native button
   chrome so it matches the anchor CTAs exactly. Use font-family:inherit (not the
   `font` shorthand, which would reset font-size and make this button larger than
   the "See the Needs" / "Volunteer" links); size/weight come from .donate-card-cta. */
button.donate-card-cta {
  background: transparent;
  cursor: pointer;
  font-family: inherit;
  font-size: .85rem;
  font-weight: 600;
  line-height: 1.2;
}
.donate-card-cta.red  { color: #ef5570; border-color: rgba(239,0,55,.35); }
.donate-card-cta.gold { color: var(--h2h-gold, #E2BB80); border-color: rgba(226,187,128,.40); }
.donate-card-cta.blue { color: #01aef0; border-color: rgba(1,174,240,.35); }
.donate-card-cta.green{ color: var(--h2h-green, #22C55E); border-color: rgba(34,197,94,.40); }
.donate-card-cta.red:hover  { background: rgba(239,0,55,.10); border-color: #ef5570; }
.donate-card-cta.gold:hover { background: rgba(226,187,128,.10); border-color: var(--h2h-gold, #E2BB80); color: #f5dfa0; }
.donate-card-cta.blue:hover { background: rgba(1,174,240,.10); border-color: #01aef0; }
.donate-card-cta.green:hover{ background: rgba(34,197,94,.10); border-color: var(--h2h-green, #22C55E); }

.mission-dates-strip {
  text-align: center;
  margin-top: 1.5rem;
  padding: 1.5rem;
  background: rgba(226,187,128,.04);
  border: 1px solid rgba(226,187,128,.18);
  border-radius: 12px;
}
.mission-dates-strip .label {
  font-size: .72rem;
  text-transform: uppercase;
  letter-spacing: .15em;
  color: var(--h2h-gold, #E2BB80);
  margin-bottom: .75rem;
}
.mission-dates-strip .dates {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .5rem;
}
.mission-date-pill {
  display: inline-block;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.12);
  border-radius: 8px;
  padding: .35rem .75rem;
  font-size: .85rem;
  font-weight: 600;
  color: rgba(233,238,247,.85);
  letter-spacing: .02em;
}

/* ── Section: Missions (#missions) — recent list + quotes carousel ───── */
.mission-list {
  list-style: none;
  padding: 0;
  margin: 0 auto 2rem;
  max-width: 720px;
}
.mission-list li {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1rem 1.25rem;
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 10px;
  margin-bottom: .65rem;
  background: rgba(255,255,255,.03);
  transition: background .15s ease, border-color .15s ease, transform .15s ease;
}
.mission-list li:hover {
  background: rgba(255,255,255,.05);
  border-color: rgba(226,187,128,.25);
  transform: translateX(3px);
}
.mission-list a {
  color: #fff;
  text-decoration: none;
  font-weight: 600;
  font-size: .95rem;
  flex-grow: 1;
}
.mission-list a:hover { color: var(--h2h-gold, #E2BB80); }
.mission-list .date {
  font-size: .8rem;
  color: rgba(233,238,247,.50);
  white-space: nowrap;
}

.missions-cta-row {
  text-align: center;
  margin-top: 2rem;
}

.quote-swiper-wrap {
  margin-top: 3.5rem;
  padding: 2.5rem 1.5rem;
  background: rgba(1,174,240,.04);
  border: 1px solid rgba(1,174,240,.18);
  border-radius: 14px;
  text-align: center;
}
.quote-swiper { max-width: 700px; margin: 0 auto; }
.quote-text {
  font-size: clamp(1rem, 2.2vw, 1.15rem);
  line-height: 1.75;
  color: rgba(233,238,247,.85);
  font-style: italic;
  margin-bottom: .85rem;
}
.quote-cite {
  font-size: .85rem;
  color: var(--h2h-gold, #E2BB80);
  font-weight: 600;
  letter-spacing: .04em;
}

/* ── Section: Contact (#contact) — info + form ───────────────────────── */
.contact-grid {
  display: grid;
  grid-template-columns: 1fr 1.4fr;
  gap: 2.5rem;
  max-width: 980px;
  margin: 0 auto;
}
@media (max-width: 768px) {
  .contact-grid { grid-template-columns: 1fr; gap: 2rem; }
}

.contact-info-card {
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  padding: 1.75rem 1.5rem;
}
.contact-info-row {
  display: flex; align-items: flex-start; gap: .85rem;
  margin-bottom: 1.5rem;
}
.contact-info-row:last-child { margin-bottom: 0; }
.contact-info-icon {
  width: 38px; height: 38px;
  border-radius: 10px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(226,187,128,.10);
  color: var(--h2h-gold, #E2BB80);
  font-size: 1.05rem;
  border: 1px solid rgba(226,187,128,.22);
  flex-shrink: 0;
}
.contact-info-label {
  font-size: .7rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: rgba(233,238,247,.45);
  margin-bottom: .15rem;
}
.contact-info-value {
  font-size: .92rem;
  color: rgba(233,238,247,.92);
  line-height: 1.45;
  font-weight: 500;
}
.contact-info-value a { color: rgba(233,238,247,.92); text-decoration: none; }
.contact-info-value a:hover { color: var(--h2h-gold, #E2BB80); }

.contact-form-card {
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  padding: 1.75rem 1.5rem;
}
.contact-form-card .form-floating { margin-bottom: 1rem; }
.contact-form-card textarea.form-control { min-height: 130px; resize: vertical; }
.contact-submit {
  display: inline-flex;
  align-items: center; gap: .5rem;
  padding: .75rem 1.6rem;
  border-radius: 999px;
  font-weight: 700;
  font-size: .9rem;
  background: var(--h2h-gold, #E2BB80);
  color: #070b14;
  border: 1.5px solid var(--h2h-gold, #E2BB80);
  cursor: pointer;
  transition: all .15s ease;
}
.contact-submit:hover:not(:disabled) {
  background: #f5dfa0; border-color: #f5dfa0;
  transform: translateY(-2px);
  box-shadow: 0 8px 22px rgba(226,187,128,.30);
}
.contact-submit:disabled { opacity: .55; cursor: not-allowed; }
.contact-hp { position: absolute; left: -9999px; opacity: 0; pointer-events: none; }

/* ── Sticky header on scroll (main site) ──────────────────────────────── */
/* Contain the full-bleed header bar (the ::before below uses 100vw). 'clip'
   prevents a horizontal scrollbar WITHOUT turning the body into a scroll
   container — so it doesn't break position:sticky (unlike overflow:hidden). */
body.section-main { overflow-x: clip; }

.section-main .portal-header { transition: background .25s ease, border-color .25s ease; }
.section-main.header-scrolled .portal-header {
  position: sticky;
  top: 0; z-index: 1020;
  padding: .6rem 0;
  margin: -.6rem 0 0;
  /* IMPORTANT: do NOT add backdrop-filter, filter, or transform to
     .portal-header itself — any of those create a containing block that traps
     the position:fixed offcanvas drawer inside the header. The full-width bar
     is drawn by the ::before pseudo instead (its own transform-free). */
}
/* Full-viewport-width background bar, while the logo/nav stay aligned to the
   centered container. left:50% + margin-left:-50vw spans the whole viewport. */
.section-main.header-scrolled .portal-header::before {
  content: '';
  position: absolute;
  top: 0; bottom: 0;
  left: 50%;
  margin-left: -50vw;
  width: 100vw;
  z-index: -1;
  background: rgba(7, 11, 20, .96);
  border-bottom: 1px solid rgba(255, 255, 255, .06);
}


/* ==========================================================================
   Landing Page — Door Experience + Site (index.php)
   --------------------------------------------------------------------------
   Cinematic intro with sliding doors over photo collages, then the main
   site is revealed underneath. Brand palette: red #EF0037, blue #01AEF0,
   gold #E2BB80, black #444655.

   Scoping: post-door selectors that could collide with Bootstrap (.btn,
   .nav, etc.) or with global element styles (section) are prefixed with
   `body.page-landing` so they only apply on this page. Inner wrappers use
   `.landing-wrap` (not `.container`) to avoid colliding with the outer
   Bootstrap container emitted by header_main.php. The door experience
   itself uses uniquely-named selectors (.door-*, .door-experience) so it
   needs no scoping.
   ========================================================================== */

:root {
  /* Official Hearts to Hands CLT brand palette */
  --red: #EF0037;
  --red-deep: #C8002E;
  --blue: #01AEF0;
  --blue-deep: #0089BD;
  --gold: #E2BB80;
  --gold-warm: #C99860;
  --black: #444655;
  --black-deep: #2D2E38;

  --cream: #F7F2EA;
  --paper: #FBF8F2;
  --ink: #444655;
  --ink-soft: #5E6070;
  --ink-mute: #9094A1;
  --line: rgba(68,70,85,0.1);
}

* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  background:
    radial-gradient(ellipse 60% 50% at 0%   0%,   rgba(239,0,55,.07),  transparent),
    radial-gradient(ellipse 60% 50% at 100% 100%, rgba(1,174,240,.07), transparent),
    linear-gradient(180deg, #070b14, #0b1220);
  color: var(--text, #c8d0df);
  font-family: 'Inter', 'Plus Jakarta Sans', sans-serif;
  line-height: 1.6;
  overflow-x: hidden;
}

/* ========================================================
   THE DOOR EXPERIENCE
   Full-viewport intro that "opens" to reveal the site.
   ======================================================== */
.door-experience {
  position: fixed;
  inset: 0;
  z-index: 1000;
  overflow: hidden;
  background: #0F1015;
  /* Shudder fires when the doors meet (1.1s). The whole experience
     jolts as if the doors physically slammed together — horizontal
     emphasis matches the slide direction, with a small vertical
     component for weight. No fill-mode: the keyframe returns to
     translate(0,0) so there's no held offset afterward. */
  animation: doorShudder 0.3s ease 1.1s;
}

/* When user enters, this class triggers the door-opening sequence */
.door-experience.opened {
  pointer-events: none;
}

.door-experience.gone {
  display: none;
}

@keyframes doorShudder {
  0%   { transform: translate(0,    0);   }
  35%  { transform: translate(0,    2px); }
  70%  { transform: translate(0,   -1px); }
  100% { transform: translate(0,    0);   }
}


/* Opening flash mirrors the closing impact */
.door-experience.opened .door-flash {
  animation: openingFlash 0.6s ease forwards;
}

@keyframes openingFlash {
  0% { opacity: 0; transform: scale(1); }
  40% { opacity: 0.5; transform: scale(0.9); }
  100% { opacity: 0; transform: scale(1.6); }
}

/* Subtle flash at center when doors meet.
   IMPORTANT: delay (1.65s) is set just AFTER the door slide-in finishes
   at 1.6s. If the flash fires while doors are still closing it appears
   in the gap between them and reads as the doors briefly parting —
   which is exactly the "bounce" effect we don't want. */
.door-flash {
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at center,
    rgba(226,187,128,0.35) 0%,
    rgba(255,255,255,0.15) 20%,
    transparent 55%);
  opacity: 0;
  z-index: 4;
  pointer-events: none;
  mix-blend-mode: screen;
  animation: none;
}

@keyframes impactFlash {
  0% { opacity: 0; transform: scale(0.6); }
  40% { opacity: 0.4; transform: scale(1); }
  100% { opacity: 0; transform: scale(1.3); }
}

/* The two doors */
.door {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 50%;
  overflow: hidden;
  /* No transform transition here. We previously had:
       transition: transform 1.4s cubic-bezier(.76,0,.24,1);
     but it conflicts with the slide-in animation's `forwards` fill —
     when control hands off from the animation to the held value,
     some WebKit builds briefly fire the transition, which reads as
     the doors bouncing back open a crack after they meet. The
     animation handles all the motion we need on its own. */
  will-change: transform;
}

.door-left {
  left: 0;
  animation: doorSlideInLeft 1.0s cubic-bezier(0.45, 0, 0.55, 1) .1s both;
  box-shadow: 30px 0 80px rgba(0,0,0,0.5);
  /* Brand red gradient — dark at outer edge, full red at seam.
     Subtle radial highlight adds depth near the upper seam. */
  background:
    radial-gradient(ellipse 70% 45% at 85% 20%, rgba(255,120,120,0.18) 0%, transparent 65%),
    linear-gradient(to right, #2D0008 0%, #8B001C 40%, #EF0037 100%);
}

.door-right {
  right: 0;
  animation: doorSlideInRight 1.0s cubic-bezier(0.45, 0, 0.55, 1) .1s both;
  box-shadow: -30px 0 80px rgba(0,0,0,0.5);
  /* Brand blue gradient — dark at outer edge, full blue at seam.
     Subtle radial highlight mirrors the left door. */
  background:
    radial-gradient(ellipse 70% 45% at 15% 20%, rgba(100,210,255,0.18) 0%, transparent 65%),
    linear-gradient(to left, #001524 0%, #003D5C 40%, #01AEF0 100%);
}

@keyframes doorSlideInLeft {
  0% {
    transform: translateX(-110%);
    filter: brightness(0.7);
  }
  100% {
    transform: translateX(0);
    filter: brightness(1);
  }
}

@keyframes doorSlideInRight {
  0% {
    transform: translateX(110%);
    filter: brightness(0.7);
  }
  100% {
    transform: translateX(0);
    filter: brightness(1);
  }
}

/* When doors open - exact reverse of entrance */
.door-experience.opened .door-left {
  animation: doorSlideOutLeft 1.4s cubic-bezier(.64,0,.78,0) forwards;
}

.door-experience.opened .door-right {
  animation: doorSlideOutRight 1.4s cubic-bezier(.64,0,.78,0) forwards;
}

@keyframes doorSlideOutLeft {
  0% {
    transform: translateX(0);
    filter: brightness(1);
  }
  100% {
    transform: translateX(-110%);
    filter: brightness(0.7);
  }
}

@keyframes doorSlideOutRight {
  0% {
    transform: translateX(0);
    filter: brightness(1);
  }
  100% {
    transform: translateX(110%);
    filter: brightness(0.7);
  }
}

/* Photo collage backgrounds — built as a responsive grid of individual
   <img> elements rather than a single baked collage image. This lets the
   layout reflow fluidly across viewport sizes (4-col on desktop, 2-col
   on mobile) so no photo ever gets cropped off the edges the way a
   monolithic image would. object-fit: contain on each img keeps every
   photo fully visible within its cell, with subtle letterbox space
   filled by the dark background of the grid container — which the tint
   layer above then colors to the door's red or blue character. */
.door-image {
  /* Safari-compatible positioning — explicit top/right/bottom/left
     longhand plus explicit width/height. Safari handles `inset: 0`
     correctly but its grid sizing algorithm sometimes fails to derive
     a definite height from just positioning. Explicit 100% ensures
     the grid distribution works in both Chrome and Safari. */
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: grid;
  /* GRID TEMPLATE SET BY JS — see scripts-main.js fitDoorGrid().
     JS picks cols × rows so cells are as close to square as possible
     given the current door dimensions, then uses 1fr × 1fr so the
     grid fills the door exactly — no empty bands ever. Cells end up
     within ~5% of perfect square on common displays (perceptually
     square). Photos at 1:1 in these near-square cells crop 1-4% on
     one axis via object-fit: cover. */
  gap: 2px;
  background: #15161A;
  /* Photo brightness — adjusted to improve subject visibility:
       grayscale 1.0 → 0.5  : retains partial color (subjects easier to read)
       opacity   0.85 → 0.95: less dark bg bleed through photos
       contrast  1.1        : kept (helps photos pop against tint above)
     The door-tint, door-darken, door-vignette layers above still
     provide the red/blue branded mood — but the underlying photos
     are now ~25% brighter perceptually. */
  /* The grayscale/contrast wash now lives on each .door-image img (not here)
     so a woken cell can drop grayscale to 0 and bloom to its natural colour
     while its neighbours stay washed. See .door-image img + .cell-alive. */
  /* Starts invisible — JS fades this to 0.95 after the wordmark
     animation settles, once photos have had time to download. */
  opacity: 0;
  transition: opacity 2.5s ease;
  /* Clip any imgs that overflow the JS-computed grid (rare, but
     possible if the user has more photos than cells × rows). Without
     this, extra imgs would render in implicit grid rows below the
     visible area. */
  overflow: hidden;
}

.door-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
  min-width: 0;
  min-height: 0;
  /* Resting wash — heavily desaturated AND defocused (blur) so individual
     photos aren't readable at rest; brightness is kept up so it stays light
     rather than dark. The red/blue .door-tint overlay above adds the colour
     cast. A woken cell's clone (.door-pop img) is sharp + full colour, so the
     pop "brings it into focus" as a surprise reveal. */
  filter: grayscale(0.95) brightness(1.06) contrast(1.05) blur(1px);
}

/* Living mosaic — woken photos bloom in .door-pop, ONE layer scripts-main.js
   appends as the experience's last child. A cloned photo shows its TRUE colour
   with no wash, then a gentle zoom + soft brand glow, while the washed original
   stays in place underneath.
   z-index:4 sits ABOVE the doors + red/blue wash (so blooms reveal true colour)
   but BELOW the wordmark (z-index:5) and Enter button (z-index:6) — the title
   stays crisp on top, and photos may bloom behind the Enter button without ever
   covering it. */
.door-pop {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 4;
}
.door-pop img {
  position: absolute;
  object-fit: cover;
  object-position: center;
  opacity: 0;
  /* Bloom = fade in + a gentle rise (translate). We deliberately DON'T animate
     scale: scaling a raster photo up softens it mid-animation. A translate keeps
     the photo crisp the whole time, at its full integer-pixel size. */
  transform: translateY(12px);
  transition: opacity .85s ease, transform 1s ease, box-shadow .9s ease;
  will-change: opacity, transform;
}
.door-pop img.show { opacity: 1; transform: translateY(0); }
.door-pop img.pop-red.show  { box-shadow: 0 0 0 2px rgba(239, 0, 55, .5), 0 8px 24px rgba(0, 0, 0, .55); }
.door-pop img.pop-blue.show { box-shadow: 0 0 0 2px rgba(1, 174, 240, .5), 0 8px 24px rgba(0, 0, 0, .55); }

/* Door open: any photo still in bloom must LEAVE WITH ITS DOOR rather than
   linger centre-stage while the panels part. Left-side blooms (pop-red) sweep
   left, right-side blooms (pop-blue) sweep right — same direction and easing as
   the door slide — and fade as they go. Higher specificity than `.show` so it
   wins. Timed to finish (~1.4s) just before the overlay is hidden at 1.6s. */
.door-experience.opened .door-pop img {
  transition: transform 1.4s cubic-bezier(.64,0,.78,0), opacity 1.1s ease;
  opacity: 0;
}
.door-experience.opened .door-pop img.pop-red  { transform: translateX(-75vw); }
.door-experience.opened .door-pop img.pop-blue { transform: translateX(75vw); }
@media (prefers-reduced-motion: reduce) {
  .door-pop { display: none; }
}

/* Mobile: JS computes cols × rows the same way it does on desktop —
   the dynamic sizing handles mobile naturally (typical phone gets
   2 cols × 8-9 rows of cells around 90-100px each). No need for
   media-query overrides. */

/* Color overlay tints */
.door-tint {
  position: absolute;
  inset: 0;
  mix-blend-mode: color;
  opacity: 0.75;
}

.door-left .door-tint {
  background: linear-gradient(135deg,
    rgba(239,0,55,1) 0%,
    rgba(200,0,46,0.9) 100%);
  /* Starts at 0 — JS reveals this alongside the photo mosaic. */
  opacity: 0;
  transition: opacity 2.5s ease;
}

.door-right .door-tint {
  background: linear-gradient(225deg,
    rgba(1,174,240,1) 0%,
    rgba(0,137,189,0.9) 100%);
  /* Starts at 0 — JS reveals this alongside the photo mosaic. */
  opacity: 0;
  transition: opacity 2.5s ease;
}

/* Secondary darken pass for legibility behind wordmark */
.door-darken {
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at center,
    rgba(15,16,21,0.55) 0%,
    rgba(15,16,21,0.25) 40%,
    rgba(15,16,21,0.1) 100%);
  pointer-events: none;
}

.door-left .door-darken {
  /* Reduced darken (was 0.55 / 0.20) — when the photo's dark areas
     pass through mix-blend-mode: color with a red tint, those dark
     pixels inevitably read as wine/burgundy (red hue + low lightness
     = wine, by blend-mode math). Lifting the darken at the source
     keeps fewer pixels in that wine-prone zone. Still preserves the
     inner-edge "doorway shadow" feel, just less dramatic. */
  background: radial-gradient(ellipse at 75% center,
    rgba(15,16,21,0.30) 0%,
    rgba(15,16,21,0.10) 50%,
    transparent 100%);
}

.door-right .door-darken {
  /* Reduced darken to match left side (was 0.55 / 0.20). Photo
     visibility was uneven between left and right doors; the right
     was meaningfully darker. Matched values give consistent
     readability on both sides. */
  background: radial-gradient(ellipse at 25% center,
    rgba(15,16,21,0.30) 0%,
    rgba(15,16,21,0.1) 50%,
    transparent 100%);
}

/* Vignettes — pull eye toward center seam */
.door-vignette {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.door-left .door-vignette {
  background: linear-gradient(to right,
    rgba(15,16,21,0.5) 0%,
    rgba(15,16,21,0.15) 30%,
    transparent 100%);
}

.door-right .door-vignette {
  background: linear-gradient(to left,
    rgba(15,16,21,0.5) 0%,
    rgba(15,16,21,0.15) 30%,
    transparent 100%);
}

/* Edge glow on the inner door edge */
.door-edge {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 1px;
}

.door-left .door-edge {
  right: 0;
  /* Reduced further from the previous 0.5/12px setup — user feedback
     was still too obvious. Peak now 0.3 opacity (was 0.5), halo
     halved again from 12px/0.3 to 6px/0.18. The seam now reads as
     a delicate gold thread rather than a solid line. */
  background: linear-gradient(to bottom,
    transparent 0%,
    rgba(226,187,128,0.3) 20%,
    rgba(226,187,128,0.3) 80%,
    transparent 100%);
  box-shadow: 0 0 6px rgba(226,187,128,0.18);
}

.door-right .door-edge {
  left: 0;
  /* Mirrored to match the left door edge — same 0.3 peak opacity
     and 6px/0.18 halo. The two edges combined form a delicate gold
     thread at the seam rather than the previous more solid band. */
  background: linear-gradient(to bottom,
    transparent 0%,
    rgba(226,187,128,0.3) 20%,
    rgba(226,187,128,0.3) 80%,
    transparent 100%);
  box-shadow: 0 0 6px rgba(226,187,128,0.18);
}

/* The wordmark sits center over both doors */
.door-wordmark {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 5;
  width: min(94vw, 1100px);
  text-align: center;
  transition: opacity 0.8s ease, transform 1.2s cubic-bezier(.76,0,.24,1);
}

.door-experience.opened .door-wordmark {
  opacity: 0;
  transform: translate(-50%, -50%) scale(1.2);
  transition: opacity 0.6s ease, transform 1s cubic-bezier(.7,0,.84,0);
}

.wordmark-svg {
  width: 100%;
  overflow: visible;
  display: block;
  /* Legibility halo — stacked drop-shadows give the wordmark visual
     separation from the brighter photo backgrounds underneath. Two
     layers:
       (1) tight 3px shadow → crisp letterform edge against any color
       (2) diffuse 16px shadow → soft dark halo that radiates out a
           short distance so letters don't fight busy photo content
     This is the standard "text-over-imagery" technique on modern
     editorial/fashion sites. The shadows only render around the
     visible filled letters/rules, not around the SVG bounding box,
     so there's no rectangular shadow artifact. */
  filter:
    drop-shadow(0 1px 3px rgba(0, 0, 0, 0.7))
    drop-shadow(0 4px 16px rgba(0, 0, 0, 0.55));
}

/* SVG trace + fill animation */
.trace {
  fill: none;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-dasharray: 2200;
  stroke-dashoffset: 2200;
}

.trace-red {
  stroke: var(--red);
  filter:
    drop-shadow(0 0 4px var(--red))
    drop-shadow(0 0 12px var(--red));
  animation: traceReveal 0.9s cubic-bezier(.65,0,.35,1) 1.8s forwards;
}

.trace-blue {
  stroke: var(--blue);
  filter:
    drop-shadow(0 0 4px var(--blue))
    drop-shadow(0 0 12px var(--blue));
  animation: traceReveal 0.9s cubic-bezier(.65,0,.35,1) 3.2s forwards;
}

@keyframes traceReveal { to { stroke-dashoffset: 0; } }

.word-fill {
  font-family: 'Oswald', sans-serif;
  /* Bumped from 400 to 500 for slightly fatter HEARTS/HANDS strokes
     while still feeling skinny relative to the original 700.
     IMPORTANT: this CSS rule has higher specificity than the SVG
     font-weight attribute, so it controls the actual rendered weight
     of the fill text. The trace and fill MUST use the same weight
     or they visually misalign — keep this value in sync with the
     SVG font-weight="..." attribute on the trace and fill elements. */
  font-weight: 500;
  opacity: 0;
}

.hearts-fill {
  fill: #B0002B;
  /* Darker version of brand red (#C8002E / --red-deep) — keeps full
     saturation and zero green so it reads as the brand red color,
     just at a lower lightness so it isn't as bright/loud. Earlier
     attempts at wine-toned reds with reduced saturation read as
     too brown/purple. Tspan and keyframes match. */
  animation: fillReveal .4s ease 2.5s forwards;
}

.hands-fill {
  fill: var(--blue);
  /* See .hearts-fill — same pattern for HANDS. */
  animation: fillReveal .4s ease 3.9s forwards;
}

/* --- Alternating wordmark pulse ---
   HEARTS and HANDS each breathe on a 5-second cycle. HEARTS begins at
   5.8s (right after the intro completes); HANDS begins at 8.3s — a
   2.5-second offset, exactly half the cycle. The result is alternation:
   HEARTS' active phase falls during HANDS' rest, then HANDS' active
   falls during HEARTS' rest, repeating indefinitely.

   Peak times work out roughly:
     HEARTS peak at  8.3s, 13.3s, 18.3s, …
     HANDS peak at  10.8s, 15.8s, 20.8s, …
   So one bloom every 2.5 seconds, always on one word at a time. */

.hearts-fill tspan {
  /* No animation — HEARTS stays static after the fillReveal completes.
     The intro sequence (doors → trace → fill) provides the dramatic
     motion; the wordmark settles into a confident static state. The
     Enter button's pulse rings supply the only ongoing motion. */
  fill: #B0002B;
}

.hands-fill tspan {
  /* No animation — matches HEARTS. Static after fillReveal. */
  fill: #01AEF0;
}

/* The previous @keyframes heartsWordPulse and handsWordPulse have been
   removed — the wordmark now stays static after fillReveal completes
   for a more confident, finished feel. The Enter button's pulse rings
   supply the only ongoing motion on the landing experience. */

/* CSS @keyframes heartsGlow / handsGlow are kept below as documentation
   of the previous breathing-pulse effect but no longer drive anything —
   the light-sweep sheen replaces them. */

/* Breathing glow that begins when each word's fill animation
   completes (HEARTS at 3.2s, HANDS at 5.2s) and runs until the doors open.
   The 0% / 100% keyframes match the static filter so the transition into
   the loop is invisible. At peak (50%) the colored halos roughly TRIPLE
   in blur radius and reach full opacity — should be unmistakably visible
   pulsing. The base black drop-shadow is held constant so depth doesn't
   pulse. */
@keyframes heartsGlow {
  0%, 100% {
    filter:
      drop-shadow(0 0 12px rgba(239,0,55,0.85))
      drop-shadow(0 0 32px rgba(239,0,55,0.45))
      drop-shadow(0 2px 6px rgba(0,0,0,0.7));
  }
  50% {
    filter:
      drop-shadow(0 0 30px rgba(239,0,55,1))
      drop-shadow(0 0 85px rgba(239,0,55,0.95))
      drop-shadow(0 2px 6px rgba(0,0,0,0.7));
  }
}

@keyframes handsGlow {
  0%, 100% {
    filter:
      drop-shadow(0 0 12px rgba(1,174,240,0.85))
      drop-shadow(0 0 32px rgba(1,174,240,0.45))
      drop-shadow(0 2px 6px rgba(0,0,0,0.7));
  }
  50% {
    filter:
      drop-shadow(0 0 30px rgba(1,174,240,1))
      drop-shadow(0 0 85px rgba(1,174,240,0.95))
      drop-shadow(0 2px 6px rgba(0,0,0,0.7));
  }
}

/* Honor reduced-motion preference — keep the fill reveal but skip the
   continuous pulse. */
@media (prefers-reduced-motion: reduce) {
  .hearts-fill { animation: fillReveal .4s ease 2.5s forwards; }
  .hands-fill  { animation: fillReveal .4s ease 3.9s forwards; }
}

/* Tall skinny white center text - TO between words, CLT in caption */
.center-text {
  fill: rgba(255,255,255,0.95);
  font-family: 'Oswald', sans-serif;
  font-weight: 200;
  letter-spacing: .06em;
  opacity: 0;
  filter: drop-shadow(0 1px 3px rgba(0,0,0,0.8));
}

.connector-fill {
  /* Override the white fill from .center-text — TO is gold to match
     the gold caption rules flanking CLT, tying the supporting elements
     together visually. CLT stays white via .clt-fill below. Also
     overrides the .center-text default letter-spacing (.06em) with
     -.02em — slight negative tracking that pulls TO's two letters
     closer together for visual compactness. */
  fill: var(--gold);
  letter-spacing: -.02em;
  animation: fillIn .3s ease 2.9s forwards;
}

.clt-fill {
  letter-spacing: .35em;
  font-weight: 400;
  animation: fillIn .3s ease 4.3s forwards;
}

/* Gold caption rules flanking CLT */
.caption-rule {
  opacity: 0;
  transform-origin: center;
  filter: drop-shadow(0 0 4px rgba(226,187,128,0.4));
}

.rule-left {
  transform: scaleX(0);
  transform-origin: right center;
  animation: ruleGrow .3s cubic-bezier(.22,1,.36,1) 4.3s forwards;
  /* Brand-gold glow renders BEFORE the parent .wordmark-svg's dark
     halo, so the final look is: bright gold line → soft gold radiance
     → dark separation halo. Same depth treatment as the wordmark
     letters, but warm-toned to match the rule's color. */
  filter:
    drop-shadow(0 0 3px rgba(226, 187, 128, 0.8))
    drop-shadow(0 0 10px rgba(226, 187, 128, 0.4));
}

.rule-right {
  transform: scaleX(0);
  transform-origin: left center;
  animation: ruleGrow .3s cubic-bezier(.22,1,.36,1) 4.3s forwards;
  filter:
    drop-shadow(0 0 3px rgba(226, 187, 128, 0.8))
    drop-shadow(0 0 10px rgba(226, 187, 128, 0.4));
}

@keyframes ruleGrow {
  to {
    opacity: 1;
    transform: scaleX(1);
  }
}

@keyframes fillIn {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Pure opacity fade for HEARTS/HANDS fills — no translate, so the colored
   letters stay exactly co-aligned with the trace outline they overlay.
   (The trace has no transform, so any translate on the fill would offset
   them relative to each other during/after the animation.) */
@keyframes fillReveal {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes fadeUp {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Enter prompt */
.door-enter {
  position: absolute;
  bottom: 3rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 6;
  display: none;
  cursor: pointer;
  background: none;
  border: none;
  color: white;
  font-family: 'Inter', sans-serif;
  text-align: center;
  padding: .5rem 1rem;
}

.door-enter.active {
  display: block;
}

.door-enter-label {
  /* inline-block so the background hugs the text width instead of
     stretching to fill the parent button's width. */
  display: inline-block;
  font-size: 1rem;
  letter-spacing: .38em;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 1.5rem;
  font-weight: 700;
  /* Frosted pill behind the label — gives the text its own clear
     container against any photo background. Modern UI pattern
     (think Apple's floating action bars). The backdrop-filter blurs
     whatever photos are directly behind, the dark fill darkens them
     for contrast, and the gold border ties it to the button below. */
  padding: 0.55rem 1.5rem;
  background: rgba(15, 16, 21, 0.55);
  backdrop-filter: blur(14px) saturate(1.3);
  -webkit-backdrop-filter: blur(14px) saturate(1.3);
  border: 1px solid rgba(226, 187, 128, 0.4);
  border-radius: 100px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.35);
  /* Lighter text shadow now that the pill provides contrast. */
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}

.door-enter-button {
  position: relative;
  /* Larger button — was 78×78. Now meatier so it reads as a clear
     CTA against the brighter doors. */
  width: 92px;
  height: 92px;
  /* Thicker border — was 2px. Gives the button more presence. */
  border: 3px solid var(--gold);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto;
  transition: all .35s ease;
  background: linear-gradient(135deg, rgba(226,187,128,0.3), rgba(226,187,128,0.12));
  /* Box-shadow stack — shadows render in source order, FIRST is ON
     TOP. The result reads outward as: button → tight gold glow →
     wider gold halo → soft dark halo dimming the surrounding photos.
     The dark halo is the key fix for "button gets lost in photos"
     on PC — it carves out a circle of slightly-darkened photo area
     for the button to sit in, instead of relying on glow alone. */
  box-shadow:
    0 0 40px rgba(226, 187, 128, 0.55),    /* tight gold glow */
    0 0 90px rgba(226, 187, 128, 0.3),     /* wider gold halo */
    0 0 60px 12px rgba(0, 0, 0, 0.4),      /* dark halo dimming photos */
    inset 0 0 24px rgba(226, 187, 128, 0.2);
  backdrop-filter: blur(8px);
}

.door-enter-button::before {
  content: '';
  position: absolute;
  inset: -8px;
  /* Thicker, brighter, glowing — was 1.5px @ opacity 0.5 with no
     glow. The box-shadow gives the ring its own halo so it stays
     visible even as it expands into the dark moat and photos beyond. */
  border: 3px solid rgba(226, 187, 128, 0.95);
  border-radius: 50%;
  box-shadow:
    0 0 14px rgba(226, 187, 128, 0.55),
    inset 0 0 8px rgba(226, 187, 128, 0.3);
  animation: pulseRing 1.8s cubic-bezier(0.16, 1, 0.3, 1) infinite;
  animation-play-state: paused;
}

.door-enter-button::after {
  content: '';
  position: absolute;
  inset: -8px;
  /* Same inset as ::before — both rings emerge from the same spot
     but staggered 0.6s apart, creating continuous radar-style waves
     rolling outward. */
  border: 2.25px solid rgba(226, 187, 128, 0.75);
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(226, 187, 128, 0.4);
  animation: pulseRing 1.8s cubic-bezier(0.16, 1, 0.3, 1) infinite 0.6s;
  animation-play-state: paused;
}

/* Start pulses only after button has appeared */
.door-enter.active .door-enter-button::before,
.door-enter.active .door-enter-button::after {
  animation-play-state: running;
}

@keyframes pulseRing {
  0% {
    transform: scale(1);
    opacity: 1;
  }
  100% {
    /* Reaches 1.75x — nearly double the button's size — so the ring
       sweeps well into the surrounding dark halo, making it
       unmistakably visible. Fades to 0 at the same time, so the
       next ring (or this one's next cycle) starts fresh at scale 1. */
    transform: scale(1.75);
    opacity: 0;
  }
}

.door-enter:hover .door-enter-button {
  background: linear-gradient(135deg, rgba(226,187,128,0.45), rgba(226,187,128,0.22));
  transform: scale(1.05);
  /* Hover punches up both the gold glow and the dark halo for
     stronger interaction feedback. */
  box-shadow:
    0 0 50px rgba(226, 187, 128, 0.7),
    0 0 100px rgba(226, 187, 128, 0.4),
    0 0 70px 16px rgba(0, 0, 0, 0.5),
    inset 0 0 28px rgba(226, 187, 128, 0.3);
}

.door-enter-arrows {
  width: 32px;
  height: 14px;
  stroke: white;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
  fill: none;
}

/* Subtle outward translation on the chevrons when the button is hovered —
   left chevron drifts left, right chevron drifts right, mirroring the
   actual door-open motion that's about to happen. The transition runs in
   both directions, so chevrons ease back smoothly when hover ends. */
.door-enter-arrows polyline {
  transition: transform 0.3s cubic-bezier(.65,0,.35,1);
}
.door-enter:hover .door-enter-arrows polyline:first-child {
  transform: translateX(-4px);
}
.door-enter:hover .door-enter-arrows polyline:last-child {
  transform: translateX(4px);
}

/* Decorative center seam line */
/* The separate .door-seam element is intentionally hidden.
   Each door's .door-edge already provides a 1px gold gradient on its
   inner edge with a soft box-shadow glow — when the two doors meet
   at the center, those edges form a clean 2px gold band naturally,
   in perfect sync with the doors themselves. The previous animated
   seam (scaleY(0) → scaleY(1) at 1.7s, just after doors closed)
   was being read visually as the doors bouncing open. */
.door-seam {
  display: none;
}

@keyframes seamGrow {
  to { transform: translateX(-50%) scaleY(1); }
}

.door-experience.opened .door-seam {
  opacity: 0;
  transition: opacity 0.4s ease;
}

.door-experience.opened .door-enter {
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.4s ease;
}


/* ==========================================================================
   Main Site Sections — Dark Glass Aesthetic
   Matches the portal and fundraiser pages: dark bg, glass cards,
   brand palette (red #EF0037, blue #01AEF0, gold #E2BB80).
   All sections use .landing-bleed to span full viewport width;
   .landing-wrap re-constrains content to max-width: 1100px.
   ========================================================================== */

.landing-wrap { max-width: 1100px; margin: 0 auto; }

/* Shared section rhythm */
body.page-landing section { padding: 5.5rem 2rem; position: relative; }

/* ── Section bands ──────────────────────────────────────────────────────────
   Clear separation: alternating panel tone (raised vs. base), a soft brand
   glow at the top, and a short brand-coloured accent bar that marks where each
   section begins. */
body.page-landing section.landing-bleed { --band-accent: rgba(255,255,255,.4); }

/* Accent-bar colour cycles by section POSITION — red → gold → blue, repeating —
   so inserting or reordering .landing-bleed sections recolours them all
   automatically. New sections just need class="landing-bleed". */
body.page-landing section.landing-bleed:nth-of-type(3n+1) { --band-accent: var(--h2h-red,  #EF0037); }
body.page-landing section.landing-bleed:nth-of-type(3n+2) { --band-accent: var(--h2h-gold, #E2BB80); }
body.page-landing section.landing-bleed:nth-of-type(3n)   { --band-accent: var(--h2h-blue, #01AEF0); }

body.page-landing section.landing-bleed::before {
  content: "";
  position: absolute; top: 0; left: 50%; transform: translateX(-50%);
  width: 64px; height: 4px; border-radius: 0 0 4px 4px;
  background: var(--band-accent);
}

/* Per-section background glow (independent of the accent-bar colour). */
body.page-landing #about   { background: radial-gradient(1100px circle at 50% -8%, rgba(226,187,128,.12), transparent 60%), rgba(255,255,255,.015); }
body.page-landing #donate  { background: radial-gradient(1100px circle at 50% -8%, rgba(34,197,94,.11),   transparent 60%), rgba(255,255,255,.055); }
body.page-landing #events  { background: radial-gradient(1100px circle at 50% -8%, rgba(1,174,240,.11),   transparent 60%), rgba(255,255,255,.015); }
body.page-landing #impact  {
  background:
    radial-gradient(1100px circle at 50% -8%, rgba(239,0,55,.11), transparent 60%),
    radial-gradient(rgba(255,255,255,.05) 1px, transparent 1px),
    rgba(255,255,255,.055);
  background-size: auto, 22px 22px, auto;
}
body.page-landing #contact { background: radial-gradient(1100px circle at 50% -8%, rgba(1,174,240,.10), transparent 60%), rgba(255,255,255,.015); }

/* Footer connects flush to the last section (the old 4rem gap read as a second
   divider after Contact). */
body.page-landing .main-footer { margin-top: 0; }

/* Keep page content above the parallax glow layer (glows are body-level, z:0). */
body.section-main .container { position: relative; z-index: 1; }

/* Parallax depth glows — injected by scripts-main.js, drift on scroll. */
.h2h-glow {
  position: fixed;
  z-index: 0;
  pointer-events: none;
  border-radius: 50%;
  filter: blur(60px);   /* lighter blur — large blurred layers are memory/GPU heavy */
  will-change: transform;
}
@media (prefers-reduced-motion: reduce) { .h2h-glow { display: none; } }

/* ── Shared section header ─────────────────────────────────────────────── */
.main-section-header {
  text-align: center;
  margin-bottom: 2.5rem;
}
/* Section heading system — used by every section (About, Donate, Events, …):
   a bold condensed gold title (echoes the HEARTS TO HANDS wordmark) + a
   brand-gradient underline that draws in when the section reveals + a small
   colored kicker. Lives on .main-section-header (a .reveal-on-scroll block). */
.main-section-title {
  font-family: 'Bebas Neue', 'Barlow Condensed', sans-serif;
  font-size: clamp(2.8rem, 8vw, 5rem);
  font-weight: 400;
  color: var(--h2h-gold, #E2BB80);
  line-height: .95;
  margin: .25rem 0 0;
  letter-spacing: .03em;
  text-transform: uppercase;
  text-shadow: 0 2px 16px rgba(0, 0, 0, .4);
}
.main-section-rule {
  width: 88px;
  height: 3px;
  border-radius: 3px;
  margin: 16px auto 18px;
  background: linear-gradient(90deg, var(--h2h-red, #EF0037), var(--h2h-gold, #E2BB80), var(--h2h-blue, #01AEF0));
  transform: scaleX(0);
  transform-origin: center;
  transition: transform 1s cubic-bezier(.22, .61, .36, 1) .2s;
}
.main-section-header.is-visible .main-section-rule { transform: scaleX(1); }
@media (prefers-reduced-motion: reduce) {
  .main-section-rule { transform: scaleX(1); transition: none; }
}
.main-section-sub {
  font-size: .98rem;
  color: rgba(200,208,223,.55);
  margin-top: .4rem;
}

/* ── Shared buttons ────────────────────────────────────────────────────── */
.main-btn {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .85rem 1.75rem;
  border-radius: 999px;
  font-weight: 700;
  font-size: .88rem;
  text-decoration: none;
  letter-spacing: .02em;
  transition: all .22s ease;
  border: 1.5px solid;
  white-space: nowrap;
}
.main-btn-red {
  background: rgba(239,0,55,.15);
  border-color: rgba(239,0,55,.45);
  color: #ff4d6a;
}
.main-btn-red:hover {
  background: rgba(239,0,55,.28);
  border-color: #EF0037;
  color: #ff4d6a;
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(239,0,55,.22);
  text-decoration: none;
}
.main-btn-blue {
  background: rgba(1,174,240,.12);
  border-color: rgba(1,174,240,.40);
  color: #01AEF0;
}
.main-btn-blue:hover {
  background: rgba(1,174,240,.25);
  border-color: #01AEF0;
  color: #01AEF0;
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(1,174,240,.18);
  text-decoration: none;
}
.main-btn-lg { padding: 1rem 2.25rem; font-size: .95rem; }

/* ── HERO ──────────────────────────────────────────────────────────────── */
.main-hero {
  padding: 5rem 2rem 4rem;
  text-align: center;
}
.main-hero-inner {
  max-width: 720px;
  margin: 0 auto;
}
.main-hero-heading {
  font-size: clamp(2.6rem, 6vw, 4rem);
  font-weight: 800;
  color: #fff;
  line-height: 1.1;
  letter-spacing: -.03em;
  margin: 1rem 0 1.25rem;
}
.main-hero-heading .accent-red  { color: var(--h2h-red,  #EF0037); }
.main-hero-heading .accent-blue { color: var(--h2h-blue, #01AEF0); }
.main-hero-sub {
  font-size: 1.1rem;
  color: rgba(200,208,223,.70);
  max-width: 560px;
  margin: 0 auto 2.25rem;
  line-height: 1.75;
}
.main-hero-actions {
  display: flex;
  justify-content: center;
  gap: .85rem;
  flex-wrap: wrap;
  margin-bottom: 3rem;
}
/* Stat cards row — reuse .stat-cards from styles-base.css */
.main-hero .stat-cards { margin-top: 0; max-width: 600px; margin-left: auto; margin-right: auto; }

/* ── EVENTS ────────────────────────────────────────────────────────────── */
.main-events { background: rgba(255,255,255,.018); }
.main-events-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.25rem;
  margin-bottom: 2.25rem;
}
.main-event-card {
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
}
.main-event-date-badge {
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  font-size: .68rem;
  font-weight: 700;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--h2h-gold, #E2BB80);
  background: rgba(226,187,128,.10);
  border: 1px solid rgba(226,187,128,.22);
  border-radius: 6px;
  padding: .22rem .55rem;
  width: fit-content;
  margin-bottom: .85rem;
}
.main-event-title {
  font-size: 1rem;
  font-weight: 700;
  color: #fff;
  line-height: 1.3;
  margin-bottom: 1rem;
  flex-grow: 1;
}
.main-event-shifts { display: flex; flex-direction: column; gap: .35rem; }
.main-shift-row {
  display: flex;
  align-items: center;
  gap: .65rem;
  padding: .4rem 0;
  border-top: 1px solid rgba(255,255,255,.06);
  flex-wrap: wrap;
}
.main-shift-time {
  display: flex;
  align-items: center;
  gap: .3rem;
  font-size: .78rem;
  color: rgba(200,208,223,.68);
  white-space: nowrap;
}
.main-shift-fill { flex: 1; min-width: 60px; }
.main-shift-spots {
  font-size: .7rem;
  color: rgba(200,208,223,.38);
  white-space: nowrap;
}
.main-events-cta { text-align: center; }
.main-events-empty {
  text-align: center;
  color: rgba(200,208,223,.35);
  padding: 2.5rem 0;
  font-size: .9rem;
}

/* ── PROGRAMS ──────────────────────────────────────────────────────────── */
.main-programs-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.25rem;
}
.main-program-card { padding: 2rem 1.5rem; }
.main-program-icon {
  width: 50px; height: 50px;
  border-radius: 14px;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.4rem;
  margin-bottom: 1rem;
}
.main-program-clothing .main-program-icon { background: rgba(239,0,55,.12);   color: var(--h2h-red,  #EF0037); }
.main-program-food     .main-program-icon { background: rgba(1,174,240,.12);  color: var(--h2h-blue, #01AEF0); }
.main-program-hygiene  .main-program-icon { background: rgba(226,187,128,.12); color: var(--h2h-gold, #E2BB80); }
.main-program-card h3 {
  font-size: 1.1rem; font-weight: 700; color: #fff; margin-bottom: .55rem;
}
.main-program-card p {
  font-size: .87rem; color: rgba(200,208,223,.62); line-height: 1.65; margin-bottom: .85rem;
}
.main-program-list { list-style: none; padding: 0; margin: 0; }
.main-program-list li {
  font-size: .82rem;
  color: rgba(200,208,223,.50);
  padding: .38rem 0;
  border-top: 1px solid rgba(255,255,255,.06);
  display: flex; align-items: center; gap: .5rem;
}
.main-program-list li::before {
  content: ''; width: 4px; height: 4px; border-radius: 50%; flex-shrink: 0;
}
.main-program-clothing li::before { background: var(--h2h-red,  #EF0037); }
.main-program-food     li::before { background: var(--h2h-blue, #01AEF0); }
.main-program-hygiene  li::before { background: var(--h2h-gold, #E2BB80); }

/* ── MISSION ───────────────────────────────────────────────────────────── */
.main-mission { background: rgba(255,255,255,.018); }
.main-mission-card {
  max-width: 780px; margin: 0 auto; padding: 2.5rem 2rem;
}
.main-mission-card h2 {
  font-size: clamp(1.5rem, 3.5vw, 2.2rem);
  font-weight: 800; color: #fff; line-height: 1.2; margin-bottom: .9rem;
}
.main-mission-card h2 span { color: var(--h2h-gold, #E2BB80); }
.main-mission-card p {
  font-size: 1rem; color: rgba(200,208,223,.72); line-height: 1.8; margin-bottom: 1.25rem;
}
.main-mission-meta {
  display: flex; gap: 1.5rem; flex-wrap: wrap;
  font-size: .8rem; color: rgba(200,208,223,.38);
}
.main-mission-meta span { display: flex; align-items: center; gap: .4rem; }

/* ── GET INVOLVED ──────────────────────────────────────────────────────── */
.main-cta-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 1.25rem;
}
.main-cta-card {
  padding: 2.5rem 2rem;
  border-radius: 20px;
  display: flex; flex-direction: column;
  min-height: 300px;
  position: relative; overflow: hidden;
  transition: transform .25s ease;
}
.main-cta-card:hover { transform: translateY(-4px); }
.main-cta-volunteer {
  background: linear-gradient(135deg, rgba(239,0,55,.18), rgba(239,0,55,.06));
  border: 1px solid rgba(239,0,55,.28);
}
.main-cta-donate {
  background: linear-gradient(135deg, rgba(1,174,240,.18), rgba(1,174,240,.06));
  border: 1px solid rgba(1,174,240,.28);
}
.main-cta-tag {
  font-size: .7rem; font-weight: 700; letter-spacing: .14em;
  text-transform: uppercase; margin-bottom: .65rem;
}
.main-cta-volunteer .main-cta-tag { color: rgba(239,0,55,.75); }
.main-cta-donate    .main-cta-tag { color: rgba(1,174,240,.75); }
.main-cta-card h3 {
  font-size: 1.75rem; font-weight: 800; color: #fff;
  margin-bottom: .75rem; line-height: 1.15;
}
.main-cta-card p {
  font-size: .9rem; color: rgba(200,208,223,.62);
  line-height: 1.65; margin-bottom: 1.75rem; flex-grow: 1;
}
.main-cta-card .main-btn { align-self: flex-start; }

/* ── Responsive ────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
  body.page-landing section { padding: 3.5rem 1.5rem; }
  .main-events-grid,
  .main-programs-grid,
  .main-cta-grid { grid-template-columns: 1fr; }
  .main-hero .stat-cards { grid-template-columns: repeat(3,1fr); }
  /* Door experience tablet adjustments */
  .door-wordmark { width: min(96vw, 1100px); }
  .door-enter { bottom: 2rem; }
  .door-enter-button { width: 68px; height: 68px; }
}
@media (max-width: 600px) {
  .main-hero .stat-cards { grid-template-columns: 1fr; }
  .main-hero-heading { font-size: clamp(2rem, 8vw, 2.8rem); }
  .main-hero-actions { flex-direction: column; align-items: center; }
}

/* LEGACY HERO (post-door) — replaced, keeping selector as dead stub */
body.page-landing .hero {
  position: relative;
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background: linear-gradient(to bottom, #FBF8F2 0%, #F2EBDE 100%);
}

body.page-landing .hero-collage {
  position: absolute;
  inset: 0;
  background-image: url('/assets/images/main/collage-red.jpg');
  background-size: cover;
  background-position: center;
  filter: grayscale(1) contrast(1.05);
  opacity: 0.18;
}

body.page-landing .hero-content {
  position: relative;
  z-index: 5;
  text-align: center;
  padding: 2rem;
  max-width: 1000px;
}

body.page-landing .hero-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: .6rem;
  font-size: .78rem;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--ink-mute);
  font-weight: 500;
  margin-bottom: 2rem;
}

body.page-landing .hero-eyebrow::before,
body.page-landing .hero-eyebrow::after {
  content: '';
  width: 24px;
  height: 1px;
  background: var(--gold-warm);
}

body.page-landing .hero-headline {
  font-family: 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(2.5rem, 6vw, 4.8rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--ink);
  margin-bottom: 1.5rem;
}

body.page-landing .hero-headline em {
  font-style: italic;
  color: var(--red);
  font-weight: 500;
}

body.page-landing .hero-headline .blue-accent {
  color: var(--blue);
  font-style: italic;
  font-weight: 500;
}

body.page-landing .hero-sub {
  font-size: 1.2rem;
  color: var(--ink-soft);
  max-width: 580px;
  margin: 0 auto 2.5rem;
  line-height: 1.65;
}

body.page-landing .hero-actions {
  display: flex;
  gap: 1rem;
  justify-content: center;
  flex-wrap: wrap;
}

body.page-landing .btn {
  padding: 1rem 1.8rem;
  border-radius: 999px;
  text-decoration: none;
  font-size: .85rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  transition: all .25s ease;
  display: inline-flex;
  align-items: center;
  gap: .6rem;
}

body.page-landing .btn-primary {
  background: var(--red);
  color: white;
  box-shadow: 0 6px 24px rgba(239,0,55,0.25);
}

body.page-landing .btn-primary:hover {
  background: var(--red-deep);
  transform: translateY(-2px);
  box-shadow: 0 10px 30px rgba(239,0,55,0.4);
}

body.page-landing .btn-secondary {
  background: transparent;
  color: var(--ink);
  border: 1.5px solid var(--ink);
}

body.page-landing .btn-secondary:hover {
  background: var(--ink);
  color: var(--paper);
  transform: translateY(-2px);
}

body.page-landing .btn-arrow { transition: transform .25s ease; }
body.page-landing .btn:hover .btn-arrow { transform: translateX(3px); }

/* SECTIONS */
body.page-landing section { padding: 7rem 2.5rem; position: relative; }
.landing-wrap { max-width: 1200px; margin: 0 auto; }

body.page-landing .eyebrow {
  display: inline-block;
  font-size: .78rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--red);
  font-weight: 600;
  margin-bottom: 1rem;
}

body.page-landing .section-title {
  font-family: 'Fraunces', serif;
  font-weight: 500;
  font-size: clamp(2rem, 4.5vw, 3.5rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--ink);
  margin-bottom: 1.5rem;
}

body.page-landing .section-title em {
  font-style: italic;
  color: var(--red);
  font-weight: 400;
}

body.page-landing .section-lead {
  font-size: 1.15rem;
  color: var(--ink-soft);
  max-width: 640px;
  line-height: 1.7;
}

body.page-landing .reveal {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity .8s ease, transform .8s ease;
}

body.page-landing .reveal.visible { opacity: 1; transform: translateY(0); }

/* MISSION */
body.page-landing .mission { background: var(--paper); }

body.page-landing .mission-grid {
  display: grid;
  grid-template-columns: 1fr 1.2fr;
  gap: 5rem;
  align-items: center;
}

body.page-landing .mission-statement {
  font-family: 'Fraunces', serif;
  font-weight: 400;
  font-size: clamp(1.5rem, 2.5vw, 2.1rem);
  line-height: 1.4;
  color: var(--ink);
  letter-spacing: -0.01em;
}

body.page-landing .mission-statement .highlight {
  background: linear-gradient(120deg, transparent 0%, transparent 5%, rgba(226,187,128,0.45) 5%, rgba(226,187,128,0.45) 95%, transparent 95%);
  padding: 0 .2em;
}

body.page-landing .mission-statement em {
  font-style: italic;
  color: var(--red);
}

/* IMPACT */
body.page-landing .impact {
  background: var(--black-deep);
  color: var(--paper);
  position: relative;
  overflow: hidden;
}

body.page-landing .impact-collage {
  position: absolute;
  inset: 0;
  background-image: url('/assets/images/main/collage-blue.jpg');
  background-size: cover;
  background-position: center;
  filter: grayscale(1);
  opacity: 0.18;
  mix-blend-mode: luminosity;
}

body.page-landing .impact::before {
  content: '';
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse at 20% 0%, rgba(239,0,55,0.18), transparent 50%),
    radial-gradient(ellipse at 80% 100%, rgba(1,174,240,0.15), transparent 50%);
  pointer-events: none;
}

body.page-landing .impact .landing-wrap { position: relative; z-index: 2; }
body.page-landing .impact .eyebrow { color: var(--gold); }
body.page-landing .impact .section-title { color: var(--paper); }
body.page-landing .impact .section-title em { color: var(--gold); }

body.page-landing .stats-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 2rem;
  margin-top: 4rem;
}

body.page-landing .stat { position: relative; padding: 2rem 0; }

body.page-landing .stat:not(:last-child)::after {
  content: '';
  position: absolute;
  right: -1rem;
  top: 20%;
  bottom: 20%;
  width: 1px;
  background: rgba(226,187,128,0.2);
}

body.page-landing .stat-number {
  font-family: 'Fraunces', serif;
  font-weight: 500;
  font-size: clamp(2.8rem, 5vw, 4rem);
  line-height: 1;
  color: var(--gold);
  margin-bottom: .8rem;
  letter-spacing: -0.02em;
}

body.page-landing .stat-number sup {
  font-size: .5em;
  color: var(--gold-warm);
  margin-left: 2px;
}

body.page-landing .stat-label {
  font-size: .85rem;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: rgba(247,242,234,0.7);
  font-weight: 500;
}

/* PROGRAMS */
body.page-landing .programs { background: var(--cream); }

body.page-landing .programs-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2rem;
  margin-top: 4rem;
}

body.page-landing .program-card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 16px;
  padding: 2.5rem;
  transition: all .35s ease;
  position: relative;
  overflow: hidden;
}

body.page-landing .program-card::before {
  content: '';
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: var(--red);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .4s ease;
}

body.page-landing .program-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 20px 50px rgba(68,70,85,0.12);
  border-color: transparent;
}

body.page-landing .program-card:hover::before { transform: scaleX(1); }
body.page-landing .program-card:nth-child(2)::before { background: var(--blue); }
body.page-landing .program-card:nth-child(3)::before { background: var(--gold-warm); }

body.page-landing .program-icon {
  width: 56px;
  height: 56px;
  border-radius: 14px;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 1.5rem;
  background: rgba(239,0,55,0.08);
  color: var(--red);
}

body.page-landing .program-card:nth-child(2) .program-icon {
  background: rgba(1,174,240,0.10);
  color: var(--blue);
}

body.page-landing .program-card:nth-child(3) .program-icon {
  background: rgba(226,187,128,0.18);
  color: var(--gold-warm);
}

body.page-landing .program-title {
  font-family: 'Fraunces', serif;
  font-weight: 600;
  font-size: 1.4rem;
  margin-bottom: .8rem;
  color: var(--ink);
}

body.page-landing .program-text {
  color: var(--ink-soft);
  font-size: .98rem;
  line-height: 1.65;
  margin-bottom: 1.2rem;
}

body.page-landing .program-list { list-style: none; padding: 0; }

body.page-landing .program-list li {
  font-size: .88rem;
  color: var(--ink-mute);
  padding: .4rem 0;
  border-top: 1px solid var(--line);
  display: flex;
  align-items: center;
  gap: .6rem;
}

body.page-landing .program-list li::before {
  content: '';
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--gold-warm);
}

/* GET INVOLVED */
body.page-landing .involved {
  background: linear-gradient(135deg, #FAF5EC 0%, #F2E8D5 100%);
  position: relative;
}

body.page-landing .involved-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2rem;
  margin-top: 4rem;
}

body.page-landing .involved-card {
  padding: 3rem;
  border-radius: 24px;
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  min-height: 380px;
  transition: transform .35s ease;
}

body.page-landing .involved-card:hover { transform: translateY(-6px); }

body.page-landing .involved-card.volunteer {
  background: var(--red);
  color: white;
}

body.page-landing .involved-card.donate {
  background: var(--black-deep);
  color: var(--paper);
}

body.page-landing .involved-card::before {
  content: '';
  position: absolute;
  top: -50%; right: -20%;
  width: 60%; height: 200%;
  background: radial-gradient(circle, rgba(255,255,255,0.08), transparent 60%);
  pointer-events: none;
}

body.page-landing .involved-tag {
  font-size: .75rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  opacity: 0.7;
  margin-bottom: 1rem;
  font-weight: 500;
}

body.page-landing .involved-title {
  font-family: 'Fraunces', serif;
  font-weight: 500;
  font-size: clamp(1.8rem, 3vw, 2.4rem);
  line-height: 1.15;
  margin-bottom: 1rem;
  letter-spacing: -0.01em;
}

body.page-landing .involved-text {
  font-size: 1rem;
  line-height: 1.65;
  opacity: 0.85;
  margin-bottom: 2rem;
  flex-grow: 1;
}

body.page-landing .involved-btn {
  align-self: flex-start;
  background: white;
  color: var(--ink);
  padding: 1rem 1.6rem;
  border-radius: 999px;
  text-decoration: none;
  font-size: .85rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  display: inline-flex;
  align-items: center;
  gap: .6rem;
  transition: all .25s ease;
}

body.page-landing .involved-card.donate .involved-btn {
  background: var(--gold);
  color: var(--ink);
}

body.page-landing .involved-btn:hover {
  transform: translateX(4px);
  box-shadow: 0 8px 24px rgba(0,0,0,0.15);
}
/* RESPONSIVE */
@media (max-width: 900px) {
  body.page-landing section { padding: 5rem 1.5rem; }

  body.page-landing .mission-grid,
  body.page-landing .involved-grid {
    grid-template-columns: 1fr;
    gap: 3rem;
  }

  body.page-landing .stats-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
  }

  body.page-landing .stat:not(:last-child)::after { display: none; }

  body.page-landing .programs-grid { grid-template-columns: 1fr; }

  body.page-landing .hero-actions { flex-direction: column; max-width: 280px; margin: 0 auto; }
  body.page-landing .btn { justify-content: center; }

  /* Door experience adjustments for tablets/small screens */
  .door-wordmark { width: min(96vw, 1100px); }
  .door-enter { bottom: 2rem; }
  .door-enter-button { width: 68px; height: 68px; }
}

/* Very narrow viewports */
@media (max-width: 480px) {
  .door-wordmark { width: 98vw; }
  .door-enter-button { width: 60px; height: 60px; }
  .door-enter-label { font-size: .75rem; letter-spacing: .25em; }
}

/* REDUCED MOTION */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}


/* ============================================================
   Landing page integration with header_main.php / footer_main.php
   ============================================================ */

/* Lock body scroll until the user enters the site */
body.page-landing { overflow: hidden; }
body.page-landing.doors-opened { overflow: auto; }

/* Hide the chrome (skip link, main-footer) until the doors open. */
body.page-landing > .skip-to-content,
body.page-landing > .main-footer {
  opacity: 0;
  pointer-events: none;
  transition: opacity .8s ease .3s;
}

/* Hide everything inside the .container (portal-header, my sections, etc.)
   EXCEPT the door experience itself. The .container element stays opaque so
   the door experience inside it stays visible — only the OTHER children of
   .container get hidden during the intro. */
body.page-landing > .container > *:not(.door-experience) {
  opacity: 0;
  pointer-events: none;
  transition: opacity .8s ease .3s;
}

body.page-landing.doors-opened > .skip-to-content,
body.page-landing.doors-opened > .main-footer,
body.page-landing.doors-opened > .container > *:not(.door-experience) {
  opacity: 1;
  pointer-events: auto;
}

/* The .container from header_main.php is max-width:1100px, which constrains
   our landing sections. Break sections out to full viewport width so the
   photo backgrounds and dark/cream section colors fill the screen. The inner
   .landing-wrap then re-constrains the content. */
body.page-landing section.landing-bleed {
  width: 100vw;
  position: relative;
  left: 50%;
  margin-left: -50vw;
  margin-right: -50vw;
}

/* ======================================================================
   HEADER DONATE BUTTON — solid gold pill, top-right of the main-site header
   ====================================================================== */
.section-main .portal-nav { align-items: center; gap: .6rem; }
.header-donate-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  height: 42px;                    /* match the hamburger height */
  padding: 0 1.2rem;
  border-radius: 12px;             /* mirror the hamburger's rounded corners */
  background: var(--h2h-gold, #E2BB80);
  border: 1px solid rgba(226,187,128,.85);
  color: #2a1d08;                  /* deep gold-brown — darkest of the gold family */
  font-weight: 700;
  font-size: .8rem;
  letter-spacing: .09em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  box-shadow: 0 2px 10px rgba(226,187,128,.20);
  transition: background .18s ease, border-color .18s ease, box-shadow .18s ease, transform .18s ease;
}
.header-donate-btn:hover,
.header-donate-btn:focus-visible {
  background: #ecca94;             /* a touch lighter for lift */
  border-color: var(--h2h-gold, #E2BB80);
  box-shadow: 0 5px 16px rgba(226,187,128,.32);
  transform: translateY(-1px);
  color: #2a1d08;
}
.header-donate-btn:active {
  transform: translateY(0);
  box-shadow: 0 2px 8px rgba(226,187,128,.20);
}
.header-donate-btn i { font-size: .95em; }
@media (max-width: 480px) {
  .header-donate-btn {
    height: 38px;
    padding: 0 .95rem;
    font-size: .74rem;
    letter-spacing: .07em;
  }
}

/* ======================================================================
   DONATE MODAL (.dm-*) — year-round Stripe giving overlay
   ====================================================================== */
.dm-overlay {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding: 4vh 1rem;
  overflow-y: auto;
}
.dm-overlay.is-open { display: flex; }
body.dm-locked { overflow: hidden; }

.dm-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(6, 10, 18, .72);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}

.dm-dialog {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 460px;
  background: #0e1420;
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 18px;
  box-shadow: 0 30px 80px rgba(0,0,0,.55);
  padding: 1.75rem 1.6rem 1.6rem;
  color: #e9eef7;
  transform: translateY(14px);
  opacity: 0;
  transition: transform .28s ease, opacity .28s ease;
}
.dm-overlay.is-open .dm-dialog { transform: translateY(0); opacity: 1; }

.dm-close {
  position: absolute;
  top: .85rem; right: .9rem;
  width: 34px; height: 34px;
  border-radius: 10px;
  border: 1px solid rgba(255,255,255,.14);
  background: rgba(255,255,255,.05);
  color: rgba(233,238,247,.75);
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: background .15s ease, color .15s ease;
}
.dm-close:hover { background: rgba(255,255,255,.10); color: #fff; }

.dm-head { margin-bottom: 1.1rem; }
.dm-title {
  font-family: 'Bebas Neue', sans-serif;
  font-size: 2rem;
  letter-spacing: .02em;
  color: var(--h2h-gold, #E2BB80);
  line-height: 1;
}
.dm-progress { display: flex; gap: .4rem; margin-top: .7rem; }
.dm-dot {
  width: 26px; height: 4px; border-radius: 999px;
  background: rgba(255,255,255,.14);
  transition: background .25s ease;
}
.dm-dot.is-active { background: var(--h2h-gold, #E2BB80); }

/* Steps: only the active one shows */
.dm-step { display: none; }
.dm-step.is-active { display: block; animation: dmFade .25s ease; }
@keyframes dmFade { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }

.dm-step-h {
  font-size: 1.05rem;
  font-weight: 700;
  color: #fff;
  margin-bottom: .5rem;
}
.dm-sub, .dm-trust {
  font-size: .82rem;
  line-height: 1.55;
  color: rgba(233,238,247,.6);
  margin-bottom: 1rem;
}
.dm-amt-echo { color: var(--h2h-gold, #E2BB80); font-weight: 700; }

/* Amount grid */
.dm-amounts {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: .6rem;
  margin-bottom: 1rem;
}
.dm-amt {
  padding: .8rem .4rem;
  border-radius: 12px;
  border: 1px solid rgba(255,255,255,.16);
  background: rgba(255,255,255,.04);
  color: #e9eef7;
  font-weight: 700;
  font-size: 1rem;
  cursor: pointer;
  transition: border-color .15s ease, background .15s ease, color .15s ease;
}
.dm-amt:hover { border-color: rgba(226,187,128,.55); }
.dm-amt.selected {
  border-color: var(--h2h-gold, #E2BB80);
  background: rgba(226,187,128,.14);
  color: #f5dfa0;
}

.dm-custom { margin-bottom: 1rem; }
.dm-custom label, .dm-field label {
  display: block;
  font-size: .76rem;
  font-weight: 600;
  letter-spacing: .02em;
  color: rgba(233,238,247,.7);
  margin-bottom: .3rem;
}
.dm-optional { color: rgba(233,238,247,.4); font-weight: 400; }
.dm-custom-field { position: relative; }
.dm-custom-dollar {
  position: absolute; left: .8rem; top: 50%; transform: translateY(-50%);
  color: rgba(233,238,247,.5); font-weight: 700;
}
.dm-custom-field input { padding-left: 1.7rem !important; }

.dm-field { margin-bottom: .8rem; }
.dm-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: .7rem; }
.dm-step input[type="text"],
.dm-step input[type="email"],
.dm-step input[type="tel"],
.dm-step input[type="number"] {
  width: 100%;
  padding: .7rem .8rem;
  border-radius: 10px;
  border: 1px solid rgba(255,255,255,.16);
  background: rgba(255,255,255,.05);
  color: #e9eef7;
  font-size: .95rem;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.dm-step input:focus {
  outline: none;
  border-color: rgba(226,187,128,.6);
  box-shadow: 0 0 0 3px rgba(226,187,128,.14);
}
.dm-step input.is-invalid { border-color: var(--h2h-red, #EF0037); }

#dm-payment-element { margin: .25rem 0 1rem; min-height: 40px; }

.dm-err {
  background: rgba(239,0,55,.12);
  border: 1px solid rgba(239,0,55,.4);
  color: #ff9bb0;
  border-radius: 10px;
  padding: .6rem .8rem;
  font-size: .82rem;
  margin-bottom: .9rem;
}

.dm-actions { display: flex; gap: .6rem; margin-top: .4rem; }
.dm-btn {
  flex: 1;
  padding: .8rem 1rem;
  border-radius: 999px;
  border: 1px solid transparent;
  font-weight: 700;
  font-size: .9rem;
  cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; gap: .4rem;
  transition: filter .15s ease, background .15s ease, border-color .15s ease, opacity .15s ease;
}
.dm-next {
  background: var(--h2h-gold, #E2BB80);
  color: #1a1206;
}
.dm-next:hover { filter: brightness(1.07); }
.dm-next:disabled { opacity: .45; cursor: not-allowed; }
.dm-ghost {
  flex: 0 0 auto;
  background: transparent;
  border-color: rgba(255,255,255,.2);
  color: rgba(233,238,247,.8);
}
.dm-ghost:hover { background: rgba(255,255,255,.06); }

.dm-secure {
  text-align: center;
  margin-top: .9rem;
  font-size: .68rem;
  color: rgba(233,238,247,.32);
}

.dm-spin {
  display: inline-block;
  width: 1em; height: 1em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  vertical-align: -.15em;
  animation: dmSpin .7s linear infinite;
}
@keyframes dmSpin { to { transform: rotate(360deg); } }

@media (max-width: 420px) {
  .dm-amounts { grid-template-columns: repeat(2, 1fr); }
}

/* ======================================================================
   DONATION THANK-YOU PAGE (/donation_success.php)
   ====================================================================== */
.donate-thanks {
  max-width: 640px;
  margin: 3rem auto;
  text-align: center;
}
.donate-thanks-title {
  font-family: 'Bebas Neue', sans-serif;
  font-size: clamp(3rem, 9vw, 5rem);
  color: var(--h2h-gold, #E2BB80);
  line-height: 1;
}
.donate-thanks-amount {
  font-size: 2.4rem;
  font-weight: 800;
  color: #fff;
  margin: .4rem 0 1rem;
}
.donate-thanks-sub {
  font-size: 1.02rem;
  line-height: 1.6;
  color: rgba(233,238,247,.78);
}
.donate-thanks-note {
  margin-top: 1rem;
  font-size: .82rem;
  color: rgba(233,238,247,.45);
}
.donate-thanks-actions {
  margin-top: 2rem;
  display: flex;
  gap: .8rem;
  justify-content: center;
  flex-wrap: wrap;
}
.donate-thanks-card {
  margin-top: 2.5rem;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 16px;
  padding: 1.6rem;
}
.donate-thanks-error {
  max-width: 520px;
  margin: 3rem auto;
  text-align: center;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 16px;
  padding: 2rem;
}

/* ======================================================================
   CONTACT SECTION (#contact)
   ====================================================================== */
#contact .contact-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2.5rem;
  align-items: start;
  max-width: 980px;
  margin: 0 auto;
}
@media (max-width: 820px) {
  #contact .contact-grid { grid-template-columns: 1fr; gap: 2rem; }
}
.contact-left { display: flex; flex-direction: column; gap: 1.75rem; }

.contact-founders {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.5rem;
}
.contact-founder { text-align: center; }
.contact-founder-photo {
  position: relative;
  width: 100%;
  aspect-ratio: 1 / 1;
  border-radius: 16px;
  overflow: hidden;
  background: rgba(255,255,255,.05);
  border: 1px solid rgba(255,255,255,.10);
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: .85rem;
  transition: transform .25s ease, border-color .25s ease, box-shadow .25s ease;
}
.contact-founder:hover .contact-founder-photo {
  transform: translateY(-6px);
  border-color: rgba(226,187,128,.45);
  box-shadow: 0 16px 38px rgba(0,0,0,.36);
}
.contact-founder-photo img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.contact-founder-placeholder {
  font-size: 3.2rem;
  color: rgba(233,238,247,.22);
}
.contact-founder-name {
  font-weight: 700;
  color: #fff;
  font-size: 1rem;
}
.contact-founder-title {
  font-size: .82rem;
  color: var(--h2h-gold, #E2BB80);
  letter-spacing: .03em;
}

.contact-methods-label {
  font-family: 'DM Sans', sans-serif;
  font-weight: 700;
  font-size: .8rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(233,238,247,.5);
  margin-bottom: 1rem;
}
.contact-method {
  display: flex;
  align-items: center;
  gap: .9rem;
  padding: .85rem 1rem;
  border-radius: 12px;
  border: 1px solid rgba(255,255,255,.10);
  background: rgba(255,255,255,.04);
  text-decoration: none;
  margin-bottom: .8rem;
  transition: transform .25s ease, border-color .25s ease, background .25s ease, box-shadow .25s ease;
}
.contact-method:hover { transform: translateY(-6px); border-color: rgba(226,187,128,.45); background: rgba(255,255,255,.07); box-shadow: 0 16px 38px rgba(0,0,0,.36); }
.contact-method-icon {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  border-radius: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.25rem;
}
.contact-method-icon.red  { background: rgba(239,0,55,.12);    color: #ef5570; border: 1px solid rgba(239,0,55,.25); }
.contact-method-icon.blue { background: rgba(1,174,240,.12);   color: #01aef0; border: 1px solid rgba(1,174,240,.25); }
.contact-method-icon.gold { background: rgba(226,187,128,.12); color: var(--h2h-gold, #E2BB80); border: 1px solid rgba(226,187,128,.30); }
.contact-method-text { display: flex; flex-direction: column; min-width: 0; }
.contact-method-title { font-weight: 700; color: #fff; font-size: .95rem; }
.contact-method-sub { font-size: .82rem; color: rgba(233,238,247,.6); word-break: break-word; }

/* ── Contact form ─────────────────────────────────────────────────────── */
.contact-form-wrap {
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 16px;
  padding: 1.6rem;
}
.contact-form-title {
  font-weight: 700;
  color: #fff;
  font-size: 1.05rem;
  margin-bottom: 1.1rem;
}
/* Form fields use the shared .form-floating / .form-control styling from
   styles-base.css (same as the fundraiser & portal), so only the bits unique
   to this form live here. */
.cf-field { margin-bottom: 1rem; }
.cf-toggle-label {
  display: block;
  font-size: .76rem;
  font-weight: 600;
  letter-spacing: .02em;
  color: rgba(233,238,247,.7);
  margin-bottom: .35rem;
}

/* Email / phone toggle */
.cf-toggle {
  display: inline-flex;
  border: 1px solid rgba(255,255,255,.16);
  border-radius: 10px;
  overflow: hidden;
}
.cf-toggle-btn {
  padding: .5rem 1.1rem;
  background: transparent;
  border: 0;
  color: rgba(233,238,247,.7);
  font-weight: 600;
  font-size: .85rem;
  cursor: pointer;
  transition: background .15s ease, color .15s ease;
}
.cf-toggle-btn + .cf-toggle-btn { border-left: 1px solid rgba(255,255,255,.16); }
.cf-toggle-btn.is-active { background: rgba(226,187,128,.16); color: #f5dfa0; }

/* Honeypot — keep in the DOM but out of sight and off the tab order */
.cf-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.cf-status {
  border-radius: 10px;
  padding: .6rem .8rem;
  font-size: .85rem;
  margin-bottom: .9rem;
}
.cf-status.is-ok    { background: rgba(34,197,94,.12);  border: 1px solid rgba(34,197,94,.4);  color: #86efac; }
.cf-status.is-error { background: rgba(239,0,55,.12);   border: 1px solid rgba(239,0,55,.4);   color: #ff9bb0; }

/* Submit reuses the shared .btn-gold; just give it room and full width here. */
.contact-form .cf-submit { width: 100%; justify-content: center; margin-top: .25rem; }

/* ======================================================================
   EVENTS SECTION (#events)
   ====================================================================== */
#events .landing-wrap { max-width: 1040px; }

/* Spotlight — most recent event */
.event-spotlight {
  display: grid;
  grid-template-columns: 1.35fr 1fr;
  gap: 2rem;
  align-items: stretch;
  margin-bottom: 2.5rem;
}
@media (max-width: 860px) { .event-spotlight { grid-template-columns: 1fr; gap: 1.5rem; } }

.event-spotlight-media {
  border-radius: 18px;
  overflow: hidden;
  border: 1px solid rgba(255,255,255,.10);
  background: #0a0e18;
  min-height: 240px;
}
.event-video { width: 100%; height: 100%; display: block; background: #000; aspect-ratio: 16 / 9; }
.event-spotlight-photo {
  width: 100%; height: 100%; min-height: 240px;
  background-size: cover; background-position: center;
}
.event-photo-empty {
  display: flex; align-items: center; justify-content: center;
  color: rgba(233,238,247,.25); font-size: 3.5rem;
}

.event-spotlight-info { display: flex; flex-direction: column; }
.event-eyebrow {
  font-family: 'DM Sans', sans-serif;
  font-weight: 700; font-size: .76rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--h2h-gold, #E2BB80);
  margin-bottom: .5rem;
}
.event-spotlight-title {
  font-size: clamp(1.5rem, 3.2vw, 2.1rem);
  font-weight: 800; color: #fff; line-height: 1.1; margin-bottom: .6rem;
}
.event-meta {
  display: flex; flex-wrap: wrap; gap: 1rem;
  font-size: .85rem; color: rgba(233,238,247,.6); margin-bottom: .9rem;
}
.event-meta i { color: var(--h2h-gold, #E2BB80); margin-right: .25rem; }
.event-desc { font-size: .92rem; line-height: 1.65; color: rgba(233,238,247,.72); margin-bottom: 1.1rem; }

.event-stats { display: flex; gap: 1.5rem; margin-bottom: 1.1rem; }
.event-stat { display: flex; flex-direction: column; }
.event-stat-num { font-size: 1.9rem; font-weight: 800; color: var(--h2h-green, #22C55E); line-height: 1; }
.event-stat-label { font-size: .78rem; color: rgba(233,238,247,.55); margin-top: .2rem; }

.event-partners-row { margin-top: auto; }
.event-partners-label {
  display: block; font-size: .72rem; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(233,238,247,.45); margin-bottom: .55rem;
}
.event-partner-logos { display: flex; flex-wrap: wrap; align-items: center; gap: .8rem; }
/* Natural-colour logos on white chips, matching the partner carousel. */
.event-partner-logos img {
  height: 34px; width: auto; max-width: 130px; object-fit: contain;
  background: #fff; border-radius: 8px; padding: 6px 10px;
  transition: transform .2s ease, box-shadow .2s ease;
}
.event-partner-logos img:hover { transform: translateY(-2px); box-shadow: 0 6px 16px rgba(0,0,0,.3); }

/* Subheads + grid */
.event-subhead {
  font-family: 'DM Sans', sans-serif;
  font-weight: 700; font-size: .82rem; letter-spacing: .14em; text-transform: uppercase;
  color: rgba(233,238,247,.5);
  margin: 1.75rem 0 1rem;
}
.event-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 1.25rem;
}
.event-card {
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 14px;
  overflow: hidden;
  display: flex; flex-direction: column;
  transition: transform .25s ease, border-color .25s ease, box-shadow .25s ease;
}
.event-grid .event-card:hover { transform: translateY(-6px); border-color: rgba(226,187,128,.45); box-shadow: 0 16px 38px rgba(0,0,0,.36); }
.event-card-media {
  position: relative;
  aspect-ratio: 1 / 1;            /* hero images are square (500×500) — show them uncropped */
  background: #0a0e18 center/cover no-repeat;
  display: flex; align-items: center; justify-content: center;
}
.event-card-icon { font-size: 2.2rem; color: rgba(233,238,247,.2); }
.event-card-tag {
  position: absolute; top: .6rem; left: .6rem;
  font-size: .68rem; font-weight: 700; letter-spacing: .04em;
  padding: .2rem .55rem; border-radius: 999px;
  display: inline-flex; align-items: center; gap: .25rem;
}
.event-card-tag.upcoming { background: rgba(1,174,240,.18); color: #7cc6ff; border: 1px solid rgba(1,174,240,.4); }
.event-card-tag.open     { background: rgba(34,197,94,.18); color: #86efac; border: 1px solid rgba(34,197,94,.4); }
.event-card-tag.recap    { background: rgba(0,0,0,.55); color: #fff; }
.event-card-body { padding: .9rem 1rem 1.05rem; display: flex; flex-direction: column; gap: .3rem; flex-grow: 1; }
.event-card-date { font-size: .75rem; letter-spacing: .03em; color: var(--h2h-gold, #E2BB80); font-weight: 600; }
.event-card-title { font-weight: 700; color: #fff; font-size: 1rem; line-height: 1.25; }
.event-card-loc { font-size: .8rem; color: rgba(233,238,247,.6); }
.event-card-loc i { color: var(--h2h-gold, #E2BB80); }
.event-card-stat { font-size: .8rem; color: rgba(233,238,247,.6); margin-top: .15rem; }
.event-card-stat i { color: var(--h2h-green, #22C55E); }
.event-card-cta {
  margin-top: auto; padding-top: .5rem;
  font-size: .82rem; font-weight: 700; text-decoration: none;
  color: #01aef0; display: inline-flex; align-items: center; gap: .3rem;
}
.event-card-cta:hover { color: #7cc6ff; }
.event-card-desc {
  font-size: .85rem;
  line-height: 1.55;
  color: rgba(233,238,247,.72);
  margin: .3rem 0 .15rem;
}
.event-readmore {
  align-self: flex-start;
  background: none; border: 0; padding: 0;
  color: #01aef0; font-weight: 600; font-size: .82rem;
  cursor: pointer; display: inline-flex; align-items: center; gap: .3rem;
  margin-bottom: .15rem;
}
.event-readmore:hover { color: #7cc6ff; }

/* "Want to see more?" → Events Portfolio call-out */
.impact-cta {
  margin: 2.5rem auto 0;
  max-width: 720px;
  text-align: center;
  background: linear-gradient(160deg, rgba(226,187,128,.10), rgba(255,255,255,.03));
  border: 1px solid rgba(226,187,128,.30);
  border-radius: 18px;
  padding: 2rem 1.75rem;
}
.impact-cta-head {
  font-family: 'Bebas Neue', sans-serif;
  font-size: clamp(1.6rem, 4vw, 2.2rem);
  letter-spacing: .02em;
  color: var(--h2h-gold, #E2BB80);
  line-height: 1;
}
.impact-cta-text {
  font-size: .94rem;
  line-height: 1.65;
  color: rgba(233,238,247,.78);
  margin: .8rem auto 1.4rem;
  max-width: 600px;
}
.impact-cta-btn { font-size: .95rem; padding: .6rem 1.4rem; }

/* ── "Save the date" vertical timeline (future events, no hero) ───────── */
.event-timeline-note { font-size: .85rem; color: rgba(233,238,247,.55); margin: -.4rem 0 1.25rem; }
.event-timeline {
  position: relative;
  display: flex; flex-direction: column; gap: 1.1rem;
  max-width: 720px;
}
/* vertical spine */
.event-timeline::before {
  content: ""; position: absolute; left: 27px; top: 8px; bottom: 8px;
  width: 2px; background: linear-gradient(var(--h2h-gold, #E2BB80), rgba(226,187,128,.15));
}
.evt-tl-item { position: relative; display: flex; gap: 1.1rem; align-items: flex-start; }
.evt-tl-marker {
  flex: 0 0 auto; width: 56px; height: 56px; z-index: 1;
  border-radius: 14px;
  background: rgba(226,187,128,.12);
  border: 1px solid rgba(226,187,128,.35);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  line-height: 1;
  transition: transform .25s ease, box-shadow .25s ease, background .25s ease;
}
.evt-tl-item:hover .evt-tl-marker {
  transform: scale(1.08);
  background: rgba(226,187,128,.2);
  box-shadow: 0 0 22px rgba(226,187,128,.35);
}
.evt-tl-mon { font-size: .66rem; letter-spacing: .08em; text-transform: uppercase; color: var(--h2h-gold, #E2BB80); font-weight: 700; }
.evt-tl-day { font-size: 1.4rem; font-weight: 800; color: #fff; margin-top: .1rem; }
.evt-tl-body {
  flex: 1 1 auto;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 14px;
  padding: 1rem 1.15rem;
  transition: transform .25s ease, border-color .25s ease, box-shadow .25s ease;
}
.evt-tl-item:hover .evt-tl-body {
  transform: translateY(-6px);
  border-color: rgba(226,187,128,.45);
  box-shadow: 0 16px 38px rgba(0,0,0,.36);
}
.evt-tl-title { font-weight: 700; color: #fff; font-size: 1.05rem; }
.evt-tl-date { font-size: .85rem; color: var(--h2h-gold, #E2BB80); margin-top: .15rem; }
.evt-tl-loc { font-size: .82rem; color: rgba(233,238,247,.6); margin-top: .25rem; }
.evt-tl-loc i { color: var(--h2h-gold, #E2BB80); }
.evt-tl-shifts { list-style: none; margin: .7rem 0 .2rem; padding: 0; display: flex; flex-direction: column; gap: .35rem; }
.evt-tl-shifts li { font-size: .82rem; color: rgba(233,238,247,.78); display: flex; align-items: baseline; gap: .45rem; flex-wrap: wrap; }
.evt-tl-shifts i { color: var(--h2h-blue, #01AEF0); }
.evt-tl-shift-name { font-weight: 600; color: #fff; }
.evt-tl-shift-when { color: rgba(233,238,247,.6); }
.evt-tl-reminder { margin-top: .9rem; }
@media (max-width: 520px) {
  .event-timeline::before { left: 23px; }
  .evt-tl-marker { width: 48px; height: 48px; }
}

/* Scroll progress bar — thin tri-colour line at the very top that fills as the
   visitor scrolls. A subtle, modern "alive" cue. */
.scroll-progress {
  position: fixed; top: 0; left: 0;
  width: 100%; height: 3px;
  z-index: 3000; pointer-events: none; background: transparent;
}
.scroll-progress-fill {
  display: block; height: 100%; width: 0;
  background: linear-gradient(90deg, var(--h2h-red, #EF0037), var(--h2h-gold, #E2BB80), var(--h2h-blue, #01AEF0));
}

/* Main-nav pip (gold dot): rendered on every item, shown only on the active one
   so it follows the highlight as the scrollspy moves it. Scoped to the main
   drawer so the portal/admin navs are unaffected. */
#mainNavDrawer .pnav-item-pip { display: none; }
#mainNavDrawer .pnav-item--active .pnav-item-pip { display: block; }

/* ── Staggered card reveals ─────────────────────────────────────────────────
   A grid tagged .stagger (alongside .reveal-on-scroll) fades its children in
   one-by-one when the grid scrolls into view, instead of all at once. */
.reveal-on-scroll.stagger { opacity: 1; transform: none; transition: none; }
.stagger > * {
  opacity: 0; transform: translateY(18px);
  transition: opacity .55s cubic-bezier(.22,.61,.36,1), transform .55s cubic-bezier(.22,.61,.36,1);
  will-change: opacity, transform;
}
.stagger.is-visible > * { opacity: 1; transform: none; }
.stagger.is-visible > *:nth-child(1) { transition-delay: .04s; }
.stagger.is-visible > *:nth-child(2) { transition-delay: .11s; }
.stagger.is-visible > *:nth-child(3) { transition-delay: .18s; }
.stagger.is-visible > *:nth-child(4) { transition-delay: .25s; }
.stagger.is-visible > *:nth-child(5) { transition-delay: .32s; }
.stagger.is-visible > *:nth-child(6) { transition-delay: .39s; }
@media (prefers-reduced-motion: reduce) { .stagger > * { opacity: 1; transform: none; transition: none; } }

/* ── Hover micro-motion: stat cards + donate icons ──────────────────────── */
.about-stat { transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease; }
.about-stat:hover { transform: translateY(-8px) scale(1.03); box-shadow: 0 16px 36px rgba(0,0,0,.30); }
.about-stat--red:hover   { border-color: rgba(239,0,55,.55);   box-shadow: 0 16px 36px rgba(239,0,55,.20); }
.about-stat--blue:hover  { border-color: rgba(1,174,240,.55);  box-shadow: 0 16px 36px rgba(1,174,240,.20); }
.about-stat--gold:hover  { border-color: rgba(226,187,128,.6); box-shadow: 0 16px 36px rgba(226,187,128,.20); }
.about-stat--green:hover { border-color: rgba(34,197,94,.55);  box-shadow: 0 16px 36px rgba(34,197,94,.20); }
.about-stat-num { position: relative; display: inline-block; }
.about-stat-num::after {
  content: ""; position: absolute; left: 12%; right: 12%; bottom: -5px; height: 2px;
  background: currentColor; border-radius: 2px; opacity: .85;
  transform: scaleX(0); transform-origin: center; transition: transform .35s ease;
}
.about-stat:hover .about-stat-num::after { transform: scaleX(1); }

.donate-card-icon { transition: transform .25s ease; }
.donate-card:hover .donate-card-icon { transform: translateY(-3px) scale(1.07); }

/* ── Gentle float on the spotlight media frame ──────────────────────────── */
@keyframes h2hFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-7px); } }
.event-spotlight-media { animation: h2hFloat 6.5s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) { .event-spotlight-media { animation: none; } }
