/* =========================================================================
   Tidal Church — Shared Stylesheet
   Ocean / wave theme. Plain CSS, no build step, responsive, dark-aware.
   Edit the color variables below to re-brand the whole site at once.
   ========================================================================= */

:root {
  /* Brand palette */
  --navy:      #0a2540;   /* deep sea */
  --navy-2:    #0d2f52;
  --teal:      #0fa3a3;   /* tidal teal */
  --teal-2:    #14c7c7;
  --aqua:      #7fe3d8;   /* foam */
  --sand:      #f4efe6;   /* warm neutral */
  --ink:       #14232f;   /* body text */
  --muted:     #5a6b78;   /* secondary text */
  --line:      #e3e8ec;   /* hairlines */
  --bg:        #ffffff;
  --bg-soft:   #f6f9fb;
  --white:     #ffffff;

  /* Accent per campus (overridden on campus pages) */
  --accent:    var(--teal);
  --accent-2:  var(--teal-2);

  --shadow-sm: 0 1px 3px rgba(10, 37, 64, .08), 0 1px 2px rgba(10, 37, 64, .06);
  --shadow-md: 0 10px 30px rgba(10, 37, 64, .12);
  --shadow-lg: 0 24px 60px rgba(10, 37, 64, .18);

  --radius:    16px;
  --radius-sm: 10px;
  --maxw:      1120px;

  --font-sans: "Montserrat", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
               Helvetica, Arial, sans-serif;
  --font-head: "Montserrat", var(--font-sans);
}

/* ---------- Base ---------- */
* { box-sizing: border-box; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; overflow-x: hidden; }
body {
  margin: 0;
  overflow-x: hidden;   /* one overflowing element shouldn't stretch/scroll the whole page */
  font-family: var(--font-sans);
  color: var(--ink);
  background: var(--bg);
  line-height: 1.6;
  font-size: 17px;
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; display: block; }
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }

h1, h2, h3, h4 {
  font-family: var(--font-head);
  color: var(--navy);
  line-height: 1.15;
  margin: 0 0 .5em;
  font-weight: 700;
  letter-spacing: -0.02em;
}
h1 { font-size: clamp(2.2rem, 6vw, 3.6rem); }
h2 { font-size: clamp(1.7rem, 4vw, 2.4rem); }
h3 { font-size: 1.3rem; }
p  { margin: 0 0 1em; }

.container { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 24px; }
section[id] { scroll-margin-top: 96px; }   /* keep anchored sections clear of the sticky header */

/* Visually hidden but present for screen readers and search engines — used for
   the homepage's h1, since its visual hero title is a rotating series image. */
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
.section { padding: 88px 0; }
.section--soft { background: var(--bg-soft); }
.eyebrow {
  text-transform: uppercase;
  letter-spacing: .16em;
  font-size: .78rem;
  font-weight: 700;
  color: var(--accent);
  margin: 0 0 .6em;
}
.lead { font-size: 1.15rem; color: var(--muted); max-width: 60ch; }
.center { text-align: center; }
.center .lead { margin-left: auto; margin-right: auto; }

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex; align-items: center; gap: .5em;
  font-family: var(--font-head);
  font-weight: 600; font-size: 1rem;
  padding: 14px 26px; border-radius: 999px;
  border: 2px solid transparent; cursor: pointer;
  transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
  text-decoration: none; line-height: 1;
}
.btn:hover { text-decoration: none; transform: translateY(-2px); }
.btn--primary {
  background: linear-gradient(135deg, var(--accent), var(--accent-2));
  color: #fff; box-shadow: var(--shadow-sm);
}
.btn--primary:hover { box-shadow: var(--shadow-md); }
.btn--ghost { background: transparent; color: var(--navy); border-color: var(--line); }
.btn--ghost:hover { border-color: var(--accent); color: var(--accent); }
.btn--light { background: rgba(255,255,255,.14); color: #fff; border-color: rgba(255,255,255,.4); backdrop-filter: blur(4px); }
.btn--light:hover { background: rgba(255,255,255,.24); }

/* ---------- Header / Nav ---------- */
.site-header {
  position: sticky; top: 0; z-index: 50;
  background: rgba(255,255,255,.85);
  backdrop-filter: saturate(180%) blur(12px);
  border-bottom: 1px solid var(--line);
}
.nav { display: flex; align-items: center; justify-content: space-between; height: 84px; }
.brand { display: inline-flex; align-items: center; gap: 12px; line-height: 0; color: var(--navy); text-decoration: none;
  /* Item flex que podía encogerse: con width:auto el <img> se aplastaba
     (26% de deformación a 1440px, 75% a 985px) en vez de escalar. */
  flex: none; }
.brand:hover { text-decoration: none; }
.brand__mark { width: 34px; height: 34px; }

/* Wordmark logo images. Two variants swap by header state / theme:
   --dark  = navy logo (RGB) for light bars; --light = white logo (reverse). */
.brand__logo { height: 42px; width: auto; display: block; flex: none; }
.brand__logo--light { display: none; }     /* default light bar → show navy logo */
.brand__campus { font-family: var(--font-head); font-weight: 600; font-size: 1.05rem; color: var(--muted); line-height: 1; padding-left: 4px; border-left: 1px solid var(--line); }

/* Home, transparent over the hero → white logo */
.home .site-header:not(.is-solid) .brand__logo--light { display: block; }
.home .site-header:not(.is-solid) .brand__logo--dark  { display: none; }
@media (max-width: 720px) { .brand__logo { height: 34px; } }
.nav__links { display: flex; align-items: center; gap: 30px; list-style: none; margin: 0; padding: 0; }
.nav__links a { color: var(--navy); font-weight: 500; font-size: .95rem; letter-spacing: .01em; }

/* Desktop nav. The header now gets its own 1150px container (see
   site-chrome.css), so this fires at 1141px — below that, the hamburger.
   :hover is gated here too (not just for layout) — unguarded, iOS eats the
   first tap on any :hover-matched element to simulate hover, so every nav
   link would need a double tap to navigate on mobile. */
@media (min-width: 1141px) {
  .nav__links a:hover { color: var(--accent); text-decoration: none; }
  .nav__links > li:not(.nav__cta) a { position: relative; padding: 6px 1px; }
  .nav__links > li:not(.nav__cta) a::after {
    content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2px;
    background: currentColor; border-radius: 2px; opacity: .85;
    transform: scaleX(0); transform-origin: left;
    transition: transform .28s cubic-bezier(.2,.7,.2,1);
  }
  .nav__links > li:not(.nav__cta) a:hover::after { transform: scaleX(1); }
}
.nav__cta { margin-left: 8px; }
/* Reducir el espaciado antes que dejar que algo se comprima. */
@media (max-width: 1240px) { .nav__links { gap: 20px; } }

/* Dropdown submenu (e.g. under "I'm New") */
.has-submenu { position: relative; }
.has-submenu > a { display: inline-flex; align-items: center; gap: 5px; }
.has-submenu > a .caret { width: 13px; height: 13px; transition: transform .2s ease; }
.has-submenu:focus-within > a .caret { transform: rotate(180deg); }
.submenu {
  position: absolute; top: 100%; left: 0; margin: 12px 0 0; padding: 8px;
  min-width: 220px; list-style: none; display: grid; gap: 2px; z-index: 60;
  background: var(--bg); border: 1px solid var(--line); border-radius: 14px; box-shadow: var(--shadow-md);
  opacity: 0; visibility: hidden; transform: translateY(6px);
  transition: opacity .2s ease, transform .2s ease, visibility .2s;
}
.submenu::before { content: ""; position: absolute; top: -14px; left: 0; right: 0; height: 14px; }
.has-submenu:focus-within .submenu { opacity: 1; visibility: visible; transform: none; }
.submenu li { width: 100%; }
.submenu .submenu__sep { margin-top: 6px; padding-top: 8px; border-top: 1px solid var(--line); }
.submenu a { display: block; padding: 10px 14px; border-radius: 9px; font-size: .92rem; font-weight: 500; white-space: nowrap; }
/* #navLinks id keeps these colors winning over the home header's transparent/solid link rules */
#navLinks .submenu a { color: var(--navy); text-shadow: none; }
/* :hover gated to real pointers — see the note by .has-submenu:hover below;
   an unguarded :hover here made every submenu link need two taps to open. */
@media (min-width: 1141px) {
  .has-submenu:hover > a .caret { transform: rotate(180deg); }
  .has-submenu:hover .submenu { opacity: 1; visibility: visible; transform: none; }
  #navLinks .submenu a:hover { background: var(--bg-soft); color: var(--accent); text-decoration: none; }
}
.submenu a::after { display: none !important; }   /* cancel the desktop underline effect */

/* Mobile: submenu shows as an indented list inside the dropdown panel */
@media (max-width: 1140px) {
  .submenu {
    position: static; opacity: 1; visibility: visible; transform: none;
    background: transparent; border: 0; box-shadow: none; border-radius: 0;
    margin: 0; padding: 0 0 8px;
  }
  .submenu::before { display: none; }
  #navLinks .submenu a { padding: 11px 24px 11px 42px; color: var(--muted); font-size: .9rem; }
  .has-submenu > a .caret { display: none; }
}
.nav__toggle {
  display: none; background: none; border: 0; cursor: pointer;
  width: 44px; height: 44px; padding: 10px; color: var(--navy);
}
.nav__toggle span, .nav__toggle span::before, .nav__toggle span::after {
  content: ""; display: block; height: 2px; background: currentColor; border-radius: 2px;
  transition: transform .25s ease, opacity .2s ease;
}
.nav__toggle span { position: relative; }
.nav__toggle span::before { position: absolute; top: -7px; width: 100%; }
.nav__toggle span::after  { position: absolute; top: 7px;  width: 100%; }
.nav.is-open .nav__toggle span { background: transparent; }
.nav.is-open .nav__toggle span::before { transform: translateY(7px) rotate(45deg); }
.nav.is-open .nav__toggle span::after  { transform: translateY(-7px) rotate(-45deg); }

/* ---------- Hero ---------- */
.hero {
  position: relative; overflow: hidden;
  background: linear-gradient(160deg, var(--navy) 0%, var(--navy-2) 45%, #0e3b5e 100%);
  color: #fff; padding: 110px 0 0;
}
.hero h1 { color: #fff; }
.hero p { color: rgba(255,255,255,.82); }
.hero__inner { position: relative; z-index: 2; max-width: 720px; }
.hero__actions { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 28px; }
.hero .eyebrow { color: var(--aqua); }
.hero__glow {
  position: absolute; z-index: 1; width: 620px; height: 620px; border-radius: 50%;
  background: radial-gradient(circle, rgba(20,199,199,.35), transparent 62%);
  top: -180px; right: -120px; filter: blur(10px);
}
/* Photo background for campus heroes (with a tidal-blue scrim for legibility) */
.hero__photo { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; }
/* Multi-photo hero (Missions, Prayer): several stacked .hero__photo elements
   cross-fade the same slow Ken Burns way as the card slideshows above —
   reusing cardKenIn/cardKenOut rather than one static background photo.
   N photos x 8s stagger = one full loop; each stays fully visible well past
   the next one's handoff, so there's never a moment with nothing showing.
   Duration must scale with photo count (see the -2/-4 card variants above
   for the same reasoning) — a 3-photo hero run at the 4-photo timing would
   leave a gap while the loop waits out the missing 4th slide. */
.hero--slides-2 .hero__photo, .hero--slides-3 .hero__photo, .hero--slides-4 .hero__photo {
  opacity: 0; will-change: opacity, transform; backface-visibility: hidden;
  animation-timing-function: linear; animation-iteration-count: infinite; animation-fill-mode: both;
}
/* 2 photos: same 50%-hold reasoning as .card__media--slides-2 — cardKenIn's
   34% fade-out-complete point can't reach an 8s-away handoff at only 2
   slides, so this reuses the wider cardKenIn2/cardKenOut2 keyframes instead. */
.hero--slides-2 .hero__photo { animation-duration: 16s; }
.hero--slides-2 .hero__photo:nth-of-type(1) { animation-name: cardKenIn2;  animation-delay: 0s; transform-origin: 50% 40%; }
.hero--slides-2 .hero__photo:nth-of-type(2) { animation-name: cardKenOut2; animation-delay: 8s; transform-origin: 60% 50%; }
.hero--slides-3 .hero__photo { animation-duration: 24s; }
.hero--slides-3 .hero__photo:nth-of-type(1) { animation-name: cardKenIn;  animation-delay: 0s;  transform-origin: 50% 40%; }
.hero--slides-3 .hero__photo:nth-of-type(2) { animation-name: cardKenOut; animation-delay: 8s;  transform-origin: 60% 50%; }
.hero--slides-3 .hero__photo:nth-of-type(3) { animation-name: cardKenIn;  animation-delay: 16s; transform-origin: 40% 55%; }
.hero--slides-4 .hero__photo { animation-duration: 32s; }
.hero--slides-4 .hero__photo:nth-of-type(1) { animation-name: cardKenIn;  animation-delay: 0s;  transform-origin: 50% 40%; }
.hero--slides-4 .hero__photo:nth-of-type(2) { animation-name: cardKenOut; animation-delay: 8s;  transform-origin: 60% 50%; }
.hero--slides-4 .hero__photo:nth-of-type(3) { animation-name: cardKenIn;  animation-delay: 16s; transform-origin: 40% 55%; }
.hero--slides-4 .hero__photo:nth-of-type(4) { animation-name: cardKenOut; animation-delay: 24s; transform-origin: 55% 45%; }
@media (prefers-reduced-motion: reduce) {
  .hero--slides-2 .hero__photo, .hero--slides-3 .hero__photo, .hero--slides-4 .hero__photo { animation: none !important; opacity: 0; }
  .hero--slides-2 .hero__photo:nth-of-type(1), .hero--slides-3 .hero__photo:nth-of-type(1), .hero--slides-4 .hero__photo:nth-of-type(1) { opacity: 1; }
}
.hero__scrim {
  position: absolute; inset: 0; z-index: 1;
  /* Tidal blue gradient over the campus photo */
  background:
    linear-gradient(180deg, rgba(0,61,99,.82) 0%, rgba(0,61,99,.58) 42%, rgba(0,45,74,.90) 100%),
    linear-gradient(125deg, rgba(95,207,223,.26) 0%, rgba(58,190,172,.12) 45%, rgba(0,61,99,0) 72%);
}
.hero--photo .hero__glow { opacity: .5; }
/* Decorative wave at the bottom of any hero */
.wave { display: block; width: 100%; height: auto; margin-top: 48px; position: relative; z-index: 2; }
.wave path { fill: var(--bg); }
.section--soft + .wave path { fill: var(--bg-soft); }

/* ---------- Grid / Cards ---------- */
.grid { display: grid; gap: 24px; }
.grid--3 { grid-template-columns: repeat(3, 1fr); }
.grid--2 { grid-template-columns: repeat(2, 1fr); }

.card {
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 28px; box-shadow: var(--shadow-sm);
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); border-color: transparent; }
.card h3 { margin-bottom: .3em; }
.card__meta { font-size: .82rem; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--accent); margin-bottom: .8em; }

/* Partner-list cards (Missions page): a plain bullet list of bare links read
   as unfinished next to the photo cards above them on the page — an icon
   badge plus row-style links (hover highlight + arrow) brings them in line. */
.partner-card__icon {
  width: 46px; height: 46px; border-radius: 12px; margin-bottom: 18px;
  display: grid; place-items: center;
  background: color-mix(in srgb, var(--accent) 12%, white); color: var(--accent);
}
.partner-card__icon svg { width: 24px; height: 24px; }
.partner-list { list-style: none; padding: 0; margin: 10px -14px 0; display: flex; flex-direction: column; gap: 2px; }
.partner-list a {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 12px 14px; border-radius: 10px; color: var(--navy); font-weight: 600;
  text-decoration: none; transition: background .15s ease, color .15s ease;
}
.partner-list a:hover { background: var(--bg-soft); color: var(--accent); text-decoration: none; }
.partner-list a svg { width: 15px; height: 15px; flex: none; color: var(--muted); transition: transform .15s ease, color .15s ease; }
.partner-list a:hover svg { color: var(--accent); transform: translate(2px, -2px); }
.partner-card__note { margin: 14px 0 0; color: var(--muted); font-size: .92rem; line-height: 1.55; }

/* Card with a photo header (used by the Grow cards on next.html). The padding
   moves off .card and onto .card__body so the image can run edge to edge. */
.card--photo { padding: 0; overflow: hidden; display: flex; flex-direction: column; }
.card--photo .card__body { padding: 24px 28px 26px; display: flex; flex-direction: column; flex: 1; }
.card__media { position: relative; aspect-ratio: 16 / 9; overflow: hidden; background: var(--bg-soft); }
.card__media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .35s ease; }
.card--photo:hover .card__media:not(.card__media--slides) img { transform: scale(1.045); }
/* Placeholder panel for cards still waiting on a real photo: same proportions as
   the image so the grid stays even. Swap in a <img> and it disappears. */
/* Rotating photos inside a card header: same cross-fade + slow zoom as the
   Young Adults hero, but a gentler scale range since the frame is much smaller.
   6s per photo on an 18s loop, alternating zoom-in / zoom-out. */
.card__media--slides .card-slide {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; opacity: 0;
  will-change: opacity, transform; backface-visibility: hidden;
  animation: cardKenIn 18s linear infinite both;
}
.card__media--slides .card-slide--1 { animation-name: cardKenIn;  animation-delay: 0s;  transform-origin: 50% 45%; }
.card__media--slides .card-slide--2 { animation-name: cardKenOut; animation-delay: 6s;  transform-origin: 34% 56%; }
.card__media--slides .card-slide--3 { animation-name: cardKenIn;  animation-delay: 12s; transform-origin: 66% 44%; }
@keyframes cardKenIn {
  0%   { opacity: 0; transform: scale(1.02); }
  6%   { opacity: 1; }
  28%  { opacity: 1; }
  34%  { opacity: 0; transform: scale(1.11); }
  100% { opacity: 0; transform: scale(1.02); }
}
@keyframes cardKenOut {
  0%   { opacity: 0; transform: scale(1.11); }
  6%   { opacity: 1; }
  28%  { opacity: 1; }
  34%  { opacity: 0; transform: scale(1.02); }
  100% { opacity: 0; transform: scale(1.11); }
}
/* 2-photo variant (GriefShare): the 3-photo timing above holds each slide for
   only ~34% of an 18s loop, which is right for a 6s-staggered handoff between
   3 slides but leaves a gap with only 2 — each needs ~50% of the loop instead. */
.card__media--slides-2 .card-slide { animation-duration: 12s; }
.card__media--slides-2 .card-slide--1 { animation-name: cardKenIn2;  animation-delay: 0s; transform-origin: 50% 45%; }
.card__media--slides-2 .card-slide--2 { animation-name: cardKenOut2; animation-delay: 6s; transform-origin: 34% 56%; }
@keyframes cardKenIn2 {
  0%   { opacity: 0; transform: scale(1.02); }
  8%   { opacity: 1; }
  42%  { opacity: 1; }
  50%  { opacity: 0; transform: scale(1.11); }
  100% { opacity: 0; transform: scale(1.11); }
}
@keyframes cardKenOut2 {
  0%   { opacity: 0; transform: scale(1.11); }
  8%   { opacity: 1; }
  42%  { opacity: 1; }
  50%  { opacity: 0; transform: scale(1.02); }
  100% { opacity: 0; transform: scale(1.02); }
}
/* 4-photo variant (Missions trip cards): the original 6%/28%/34% keyframes
   scale fine to a 24s/4-slide loop (each slide's visible window still covers
   more than the 6s handoff to the next one), so this just widens the timing
   and delays — no new keyframes needed. */
.card__media--slides-4 .card-slide { animation-duration: 24s; }
.card__media--slides-4 .card-slide--1 { animation-name: cardKenIn;  animation-delay: 0s;  transform-origin: 50% 45%; }
.card__media--slides-4 .card-slide--2 { animation-name: cardKenOut; animation-delay: 6s;  transform-origin: 34% 56%; }
.card__media--slides-4 .card-slide--3 { animation-name: cardKenIn;  animation-delay: 12s; transform-origin: 66% 44%; }
.card__media--slides-4 .card-slide--4 { animation-name: cardKenOut; animation-delay: 18s; transform-origin: 40% 60%; }
@media (prefers-reduced-motion: reduce) {
  .card__media--slides .card-slide { animation: none !important; transform: none !important; opacity: 0; }
  .card__media--slides .card-slide--1 { opacity: 1; }
}
.card__media--ph { display: flex; align-items: center; justify-content: center;
  /* Literal brand values on purpose: --navy / --navy-2 invert to near-white under
     prefers-color-scheme: dark, which would turn this panel pale. It must read as
     a deep-sea panel in both themes. */
  background: linear-gradient(135deg, #0a2540 0%, #0d2f52 52%, #10596b 100%); }
.card__media--ph svg { width: 44px; height: 44px; color: #7fe3d8; opacity: .55; }

/* Campus selector cards */
.campus-card {
  position: relative; overflow: hidden; color: #fff; border: 0; padding: 0;
  border-radius: var(--radius); box-shadow: var(--shadow-md); min-height: 320px;
  display: flex; align-items: flex-end; text-decoration: none;
}
/* It's an <a>, so the global a:hover{text-decoration:underline} would
   otherwise underline the heading/body text on hover. */
.campus-card:hover, .campus-card:focus-visible { text-decoration: none; }
.campus-card__bg { position: absolute; inset: 0; z-index: 0; }
.campus-card__bg svg { width: 100%; height: 100%; }
/* One smooth gradient over the whole photo (same approach as .mtile__scrim
   on the mosaic tiles) instead of a flat dim layered under a second,
   separately-bounded gradient on the body — stacking those two created a
   visible hard seam where the body block's top edge cut across the photo. */
.campus-card__bg::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(6,22,38,.05) 0%, rgba(6,22,38,.12) 38%, rgba(6,22,38,.58) 65%, rgba(6,22,38,.93) 100%);
}
.campus-card__body { position: relative; z-index: 2; padding: 28px; width: 100%; }
.campus-card h3 { color: #fff; font-size: 1.6rem; margin-bottom: .1em; text-shadow: 0 1px 12px rgba(0,0,0,.4); }
.campus-card p { color: rgba(255,255,255,.9); margin-bottom: 1em; font-size: .95rem; text-shadow: 0 1px 10px rgba(0,0,0,.35); }
.campus-card .btn { pointer-events: none; }
.campus-card:hover { transform: translateY(-6px); }
.campus-card:hover .btn--light { background: rgba(255,255,255,.28); }

/* Announcement list */
.announce { display: grid; gap: 18px; }
.announce__item {
  display: grid; grid-template-columns: 92px 1fr; gap: 20px; align-items: start;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-sm);
  padding: 22px 24px; transition: box-shadow .18s ease, border-color .18s ease;
}
.announce__item:hover { box-shadow: var(--shadow-sm); border-color: var(--accent); }
.announce__date {
  text-align: center; border-right: 1px solid var(--line); padding-right: 18px;
}
.announce__date .d { font-family: var(--font-head); font-size: 1.8rem; font-weight: 700; color: var(--navy); line-height: 1; }
.announce__date .m { text-transform: uppercase; letter-spacing: .1em; font-size: .72rem; color: var(--accent); font-weight: 700; }
.announce__body h3 { font-size: 1.15rem; margin-bottom: .25em; }
.announce__body p { margin: 0; color: var(--muted); font-size: .96rem; }
.tag { display: inline-block; font-size: .72rem; font-weight: 700; letter-spacing: .05em;
  text-transform: uppercase; color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, white);
  padding: 3px 10px; border-radius: 999px; margin-bottom: 8px; }

/* Link / forms hub */
.linkhub { display: grid; grid-template-columns: repeat(3,1fr); gap: 18px; }
.linkhub a {
  display: flex; align-items: center; gap: 14px; padding: 20px 22px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-sm);
  color: var(--navy); font-weight: 600; text-decoration: none;
  transition: transform .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.linkhub a:hover { transform: translateY(-3px); border-color: var(--accent); box-shadow: var(--shadow-sm); text-decoration: none; }
.linkhub .ico {
  flex: none; width: 44px; height: 44px; border-radius: 12px; display: grid; place-items: center;
  background: color-mix(in srgb, var(--accent) 14%, white); color: var(--accent);
}
.linkhub .ico svg { width: 22px; height: 22px; }
.linkhub small { display: block; font-weight: 400; color: var(--muted); font-size: .82rem; }

/* Info rows (campus details) */
.info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 40px; align-items: center; }
.detail-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 18px; }
.detail-list li { display: flex; gap: 14px; align-items: flex-start; }
.detail-list .ico { flex: none; width: 40px; height: 40px; border-radius: 12px; display: grid; place-items: center;
  background: color-mix(in srgb, var(--accent) 14%, white); color: var(--accent); }
.detail-list .ico svg { width: 20px; height: 20px; }
.detail-list strong { display: block; color: var(--navy); font-family: var(--font-head); }
.detail-list span { color: var(--muted); }

.map-embed { border: 0; width: 100%; height: 380px; border-radius: var(--radius); box-shadow: var(--shadow-md); }

/* Times pills */
.times { display: flex; flex-wrap: wrap; gap: 12px; margin: 18px 0 0; }
.times .pill { background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.3);
  color: #fff; padding: 10px 18px; border-radius: 999px; font-weight: 600; font-size: .95rem; }

/* CTA band */
.cta-band { background: linear-gradient(135deg, var(--accent), var(--accent-2)); color: #fff; text-align: center; }
.cta-band h2 { color: #fff; }
.cta-band p { color: rgba(255,255,255,.9); }
/* .lead carries max-width:60ch, so inside a centred band it needs auto margins
   too — text-align alone only centres the lines inside a box still flush left. */
.cta-band .lead { margin-inline: auto; }

/* Photo variant: same accent gradient, now translucent over a photo instead
   of flat — keeps the band reading as "on-brand teal", not just "a photo". */
.cta-band--photo { position: relative; overflow: hidden; background: #0a2540; }
.cta-band__photo { position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%; object-fit: cover; }
.cta-band--photo::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(135deg, rgba(15,163,163,.90), rgba(58,190,172,.90));
}
.cta-band--photo .container { position: relative; z-index: 2; }

/* ---------- Campus calendar (our own markup) ----------
   Rendered by js/campus-calendar.js from api/pc-calendar.php. Unlike the Church
   Center iframe, every part of this is ours to style. */
.cal__loading, .cal__empty { color: var(--muted); margin: 0; padding: 22px 0; }

/* This week: one card per day that actually has something on it */
.cal-week { display: grid; grid-template-columns: repeat(auto-fill, minmax(232px, 1fr)); gap: 16px; }
.cal-day {
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow-sm); padding: 18px 18px 14px;
  display: flex; flex-direction: column;
}
.cal-day.is-today { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent), var(--shadow-md); }
.cal-day__head { display: flex; align-items: baseline; gap: 9px; margin-bottom: 14px; }
.cal-day__dow {
  font-family: var(--font-head); font-weight: 700; font-size: .78rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--muted);
}
.cal-day__num { font-family: var(--font-head); font-weight: 800; font-size: 1.45rem; line-height: 1; color: var(--ink); }
.cal-day__today {
  margin-left: auto; font-size: .66rem; font-weight: 800; letter-spacing: .1em;
  text-transform: uppercase; color: #fff; background: var(--accent);
  padding: 3px 8px; border-radius: 999px;
}
.cal-day__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.cal-ev {
  display: block; text-decoration: none; border-left: 2px solid var(--accent);
  padding: 2px 0 2px 12px; transition: border-color .15s ease;
}
a.cal-ev:hover { border-left-color: var(--ink); }
.cal-ev__time { display: block; font-size: .8rem; font-weight: 600; color: var(--accent); letter-spacing: .01em; }
.cal-ev__name { display: block; font-family: var(--font-head); font-weight: 600; font-size: 1rem; line-height: 1.3; color: var(--ink); margin-top: 1px; }

/* Everything past the next seven days, kept compact on purpose */
.cal-later { margin-top: 34px; }
.cal-later__label {
  font-family: var(--font-head); font-weight: 700; font-size: .78rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--muted); margin: 0 0 12px;
}
.cal-later__list { list-style: none; margin: 0; padding: 0; }
.cal-later__row {
  display: grid; grid-template-columns: 88px 1fr auto; gap: 16px; align-items: baseline;
  padding: 12px 2px; border-top: 1px solid var(--line);
}
.cal-later__row:last-child { border-bottom: 1px solid var(--line); }
.cal-later__date { font-weight: 700; font-size: .85rem; color: var(--accent); letter-spacing: .02em; }
.cal-later__name { font-family: var(--font-head); font-weight: 600; color: var(--ink); }
.cal-later__time { font-size: .85rem; color: var(--muted); white-space: nowrap; }
@media (max-width: 560px) {
  .cal-later__row { grid-template-columns: 1fr auto; }
  .cal-later__date { grid-column: 1 / -1; }
}

/* ---------- Church Center calendar embed ----------
   The embed is a cross-origin iframe, so its type, colours and layout belong to
   Church Center and cannot be restyled from here. What we control is the frame:
   the card it sits in, its width, and the context around it. */
.cc-calendar {
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow-sm);
  padding: 10px; overflow: hidden;
}
/* Applied to the iframe itself via the embed's data-class attribute. The script
   writes width/height inline, so only properties it does not set are styled here.
   The background is a literal white because the calendar's own page is white —
   a themed token would flash the wrong colour before the frame paints. */
.cc-calendar__frame {
  display: block; width: 100%; border: 0;
  border-radius: calc(var(--radius) - 6px);
  min-height: 460px; background: #fff;
}
/* Small label above each of the two calendar blocks */
.cc-week { margin-bottom: 30px; }
.cc-week__label {
  font-family: var(--font-head); font-weight: 700; font-size: .8rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--accent);
  margin: 0 0 12px;
}
/* The week block is the highlight: a slightly stronger surface than the month grid. */
.cc-calendar--week { box-shadow: var(--shadow-md); }
.cc-calendar--week .cc-calendar__frame--week { min-height: 380px; }
.cc-calendar__foot {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 12px; margin-top: 14px; font-size: .92rem; color: var(--muted);
}
.cc-calendar__foot a { font-weight: 600; }
@media (max-width: 600px) {
  .cc-calendar { padding: 6px; }
  .cc-calendar__frame { min-height: 560px; }
}

/* Footer styles live only in site-chrome.css now (single source of truth for
   the shared header+footer) — this file used to carry an identical copy,
   which is exactly how the mobile nav's :hover bug hid for a while: a
   forgotten duplicate silently drifting out of sync with the real one. */

/* Reveal on scroll */
.reveal { opacity: 0; transform: translateY(24px); transition: opacity .6s ease, transform .6s ease; }
.reveal.is-visible { opacity: 1; transform: none; }

/* ---------- Responsive ---------- */
@media (max-width: 900px) {
  .grid--3, .linkhub { grid-template-columns: 1fr 1fr; }
  .info-grid { grid-template-columns: 1fr; }
}
/* Collapse the menu into a dropdown before it can crowd. Nine items need
   1086px of room, so this has to fire well before the old 900px. */
@media (max-width: 1140px) {
  .nav__links {
    position: fixed; inset: 84px 0 auto 0; flex-direction: column; gap: 0;
    background: var(--bg); border-bottom: 1px solid var(--line); padding: 8px 0;
    transform: translateY(-120%); transition: transform .28s ease; box-shadow: var(--shadow-md);
  }
  .nav.is-open .nav__links { transform: translateY(0); }
  .nav__links li { width: 100%; }
  .nav__links a { display: block; padding: 14px 24px; }
  .nav__cta { margin: 12px 24px; }
  .nav__cta .btn { width: 100%; justify-content: center; }
  .nav__toggle { display: block; }
}

@media (max-width: 720px) {
  .section { padding: 64px 0; }
  .grid--3, .grid--2, .linkhub { grid-template-columns: 1fr; }
  .announce__item { grid-template-columns: 70px 1fr; gap: 14px; }
}

/* ---------- Dark mode ---------- */
@media (prefers-color-scheme: dark) {
  :root {
    --bg: #0b1a26; --bg-soft: #0e2130; --white: #12283a;
    --ink: #e6eef4; --navy: #eaf3f9; --navy-2: #cfe0ec;
    --muted: #9fb2c0; --line: #203645;
  }
  body { background: var(--bg); }
  .site-header { background: rgba(11,26,38,.85); border-bottom-color: #1c3243; }
  .home .site-header.is-solid {
    background: rgba(11,26,38,.5); border-bottom-color: rgba(255,255,255,.1);
    box-shadow: 0 8px 32px rgba(0,0,0,.38);
  }
  /* Dark theme: headers are dark, so always use the white logo */
  .brand__logo--dark { display: none; }
  .brand__logo--light { display: block; }
  .card, .announce__item, .linkhub a { background: var(--white); border-color: #203645; }
  .brand, .nav__links a { color: #eaf3f9; }
  /* Mobile dropdown border in dark mode (background comes from --bg) */
  @media (max-width: 900px) { .nav__links { border-bottom-color: #203645; } }
  h1,h2,h3,h4 { color: #eaf3f9; }
  .wave path { fill: var(--bg); }
  .btn--ghost { color: #eaf3f9; }
}

/* =========================================================================
   HERO VERTICAL SLIDER (homepage)
   Full-viewport-height slider that moves vertically. Each slide can hold
   series artwork or a YouTube video. See index.html + js/main.js.
   ========================================================================= */

/* On the homepage the header floats transparently over the slider and
   becomes solid once you scroll past it (toggled by JS: .is-solid). */
.home .site-header {
  position: fixed; top: 0; left: 0; right: 0;
  background: transparent;
  border-bottom-color: transparent;
  box-shadow: none;
  transition: background .35s ease, border-color .35s ease, box-shadow .35s ease;
}
.home .site-header .nav { transition: height .35s ease; }

/* Transparent state (over the hero) — minimalist, white on dark, no frosting */
.home .site-header:not(.is-solid) {
  -webkit-backdrop-filter: none; backdrop-filter: none;
}
.home .site-header:not(.is-solid) .brand,
.home .site-header:not(.is-solid) .nav__toggle { color: #fff; }
.home .site-header:not(.is-solid) .brand__logo { filter: drop-shadow(0 2px 10px rgba(0,0,0,.28)); }
@media (min-width: 1141px) {
  .home .site-header:not(.is-solid) .nav__links a {
    color: rgba(255,255,255,.92); font-weight: 500; text-shadow: 0 1px 10px rgba(0,0,0,.22);
  }
  .home .site-header:not(.is-solid) .nav__links a:hover { color: #fff; }
}
/* CTA becomes a clean outline over the hero */
.home .site-header:not(.is-solid) .nav__cta .btn {
  background: transparent; color: #fff; border-color: rgba(255,255,255,.55); box-shadow: none;
}
.home .site-header:not(.is-solid) .nav__cta .btn:hover { background: rgba(255,255,255,.14); }

/* Solid state (fixed frosted-glass bar after scrolling past the hero) */
/* Fixed state → DARK glassmorphism (frosted tidal-blue bar) */
.home .site-header.is-solid {
  background: rgba(3,36,60,.55);
  -webkit-backdrop-filter: blur(22px) saturate(160%);
  backdrop-filter: blur(22px) saturate(160%);
  border-bottom: 1px solid rgba(255,255,255,.12);
  box-shadow: 0 8px 30px rgba(0,0,0,.28);
}
.home .site-header.is-solid .nav { height: 68px; }
/* Keep white logo + white text on the dark glass bar */
.home .site-header.is-solid .brand__logo--light { display: block; }
.home .site-header.is-solid .brand__logo--dark { display: none; }
.home .site-header.is-solid .brand,
.home .site-header.is-solid .nav__toggle { color: #fff; }
.home .site-header.is-solid .nav__links a { color: rgba(255,255,255,.9); }
@media (min-width: 1141px) {
  .home .site-header.is-solid .nav__links a:hover { color: #fff; }
}

.hero-slider {
  position: relative;
  height: 100vh;
  height: 100svh;              /* better mobile behavior where supported */
  overflow: hidden;
  background: var(--navy);
}
.hero-slider__track { position: absolute; inset: 0; }

/* Slides are stacked; only one is active. Transitions are choreographed:
   the leaving slide's elements fade + drop while its background shrinks away,
   and the entering slide's elements animate in (staggered). */
.hero-slide {
  position: absolute; inset: 0;
  display: flex; align-items: center; overflow: hidden;
  visibility: hidden;
}
.hero-slide.is-active,
.hero-slide.is-leaving { visibility: visible; }
.hero-slide.is-active  { z-index: 2; }
.hero-slide.is-leaving { z-index: 3; }   /* leaving sits on top, shrinking to reveal the next */

/* Individual elements — entrance (fade up, staggered by --i) */
.anim-item {
  opacity: 0; transform: translateY(34px);
  transition: opacity .6s ease, transform .7s cubic-bezier(.2,.7,.2,1);
  transition-delay: calc(var(--i, 0) * 90ms);
}
.hero-slide.is-active .anim-item { opacity: 1; transform: none; }
/* Exit — fade + move down */
.hero-slide.is-leaving .anim-item {
  opacity: 0; transform: translateY(64px);
  transition: opacity .45s ease, transform .55s cubic-bezier(.4,0,.6,1);
  transition-delay: calc(var(--i, 0) * 40ms);
}

/* Backgrounds — grow-in on enter, shrink away on exit */
.anim-bg {
  opacity: 0; transform: scale(1.08); transform-origin: center;
  transition: opacity .6s ease, transform .75s cubic-bezier(.3,0,.2,1);
}
.hero-slide.is-active  .anim-bg { opacity: 1; transform: scale(1); }
.hero-slide.is-leaving .anim-bg { opacity: 0; transform: scale(.45); }

/* Slide background (artwork / gradient) */
.hero-slide__bg { position: absolute; inset: 0; z-index: 0; }
.hero-slide__bg img { width: 100%; height: 100%; object-fit: cover; }
.hero-slide__scrim {
  position: absolute; inset: 0; z-index: 1;
  background:
    radial-gradient(120% 90% at 80% 8%, rgba(20,199,199,.20), transparent 55%),
    linear-gradient(180deg, rgba(8,22,38,.55) 0%, rgba(8,22,38,.35) 45%, rgba(7,20,34,.82) 100%);
}
.hero-slide__content {
  position: relative; z-index: 2; width: 100%; min-width: 0; color: #fff;
  padding-top: 84px;          /* clear the floating header */
}
.hero-slide__content h1 { color: #fff; }
.hero-slide__content .lead { color: rgba(255,255,255,.85); }
.hero-slide .eyebrow { color: var(--aqua); }
.hero-slide__content .hero__actions { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 28px; }

/* Decorative wave pinned to the bottom of the slider */
.hero-slider .wave {
  position: absolute; left: 0; bottom: -1px; z-index: 3; margin: 0; pointer-events: none;
}

/* Video slide */
.hero-slide--video .hero-slide__content { text-align: center; }
.video-frame {
  position: relative; width: min(100%, 940px); margin: 0 auto; aspect-ratio: 16 / 9;
  border-radius: var(--radius); overflow: hidden; background: #000;
  box-shadow: var(--shadow-lg); border: 1px solid rgba(255,255,255,.18);
}
.video-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.hero-slide--video h2 { color: #fff; margin-bottom: .6em; }

/* Horizontal dot navigation (bottom center) */
.hero-dots {
  position: absolute; left: 50%; bottom: 26px; transform: translateX(-50%);
  z-index: 6; display: flex; flex-direction: row; gap: 12px;
}
.hero-dots button {
  width: 12px; height: 12px; border-radius: 50%; padding: 0; cursor: pointer;
  border: 2px solid rgba(255,255,255,.7); background: transparent;
  transition: transform .2s ease, background .2s ease;
}
.hero-dots button:hover { background: rgba(255,255,255,.5); }
.hero-dots button.is-active { background: #fff; transform: scale(1.3); }

/* Prev / next arrows (left / right) */
.hero-nav {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 6;
  width: 48px; height: 48px; border-radius: 50%; cursor: pointer;
  display: grid; place-items: center; color: #fff;
  background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.3);
  backdrop-filter: blur(4px); transition: background .2s ease, opacity .2s ease;
}
.hero-nav:hover { background: rgba(255,255,255,.28); }
.hero-nav svg { width: 24px; height: 24px; }
.hero-nav--prev { left: 22px; }
.hero-nav--next { right: 22px; }
.hero-nav[disabled] { opacity: .2; cursor: default; pointer-events: none; }

/* Single-slide hero: no arrows, no dots. JS sets .is-single when the track
   holds only one slide, so adding a second slide restores them by itself. */
.hero-slider.is-single .hero-nav,
.hero-slider.is-single .hero-dots { display: none; }

@media (max-width: 720px) {
  .hero-nav { display: none; }       /* rely on swipe + dots on mobile */
  .hero-dots { bottom: 18px; }
}
@media (prefers-reduced-motion: reduce) {
  .anim-item, .anim-bg { transition-duration: .01ms !important; transition-delay: 0 !important; }
}

/* =========================================================================
   GLASSMORPHISM + MODERN HERO CONTENT
   Minimalist glass panels; the series slide shows small video previews.
   ========================================================================= */

/* Reusable frosted-glass surface */
.glass {
  background: rgba(255,255,255,.07);
  -webkit-backdrop-filter: blur(18px) saturate(140%);
  backdrop-filter: blur(18px) saturate(140%);
  border: 1px solid rgba(255,255,255,.16);
  border-radius: 22px;
  box-shadow: 0 10px 40px rgba(4,14,26,.38), inset 0 1px 0 rgba(255,255,255,.10);
}

/* Minimalist type rhythm inside the hero */
.hero-slide__content h1 { font-weight: 700; letter-spacing: -.03em; margin-bottom: .35em; }
.hero-slide__content .lead { max-width: 46ch; }

/* Two-column split: copy on the left, glass panel on the right */
.hero-split { display: grid; grid-template-columns: 1.05fr .95fr; gap: 52px; align-items: center; }

/* Small "chip" (e.g. service times) — glass, minimalist */
.hero-chip {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 9px 16px; border-radius: 999px; margin-bottom: 22px;
  background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.18);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  color: #fff; font-size: .9rem; font-weight: 500;
}
.hero-chip .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--aqua); box-shadow: 0 0 0 4px rgba(127,227,216,.25); }

/* --- Glass video rail (mini video previews on the series slide) --- */
.video-rail { padding: 20px; }
.video-rail__title {
  display: flex; align-items: center; gap: 9px; margin: 2px 4px 16px;
  color: #fff; font-family: var(--font-head); font-weight: 600; font-size: .98rem; letter-spacing: -.01em;
}
.video-rail__title svg { width: 18px; height: 18px; color: var(--aqua); }
.mini-videos { display: grid; gap: 10px; }

.mini-video {
  display: grid; grid-template-columns: 128px 1fr; gap: 14px; align-items: center;
  padding: 8px; border: 0; border-radius: 14px; cursor: pointer; text-align: left;
  background: rgba(255,255,255,.04); color: #fff;
  transition: background .2s ease, transform .2s ease;
}
.mini-video:hover, .mini-video:focus-visible {
  background: rgba(255,255,255,.13); transform: translateY(-2px); outline: none;
}
.mini-video__thumb-wrap {
  position: relative; width: 128px; aspect-ratio: 16 / 9; flex: none;
  border-radius: 10px; overflow: hidden;
  background: linear-gradient(135deg, #0e4d6e, #0fa3a3);
}
.mini-video__thumb { width: 100%; height: 100%; object-fit: cover; }
.mini-video__play {
  position: absolute; inset: 0; display: grid; place-items: center;
  background: rgba(6,18,30,.20); transition: background .2s ease;
}
.mini-video:hover .mini-video__play { background: rgba(6,18,30,.05); }
.mini-video__play span {
  width: 34px; height: 34px; border-radius: 50%; display: grid; place-items: center;
  background: rgba(255,255,255,.9); color: #0a2540;
  box-shadow: 0 4px 14px rgba(0,0,0,.35);
}
.mini-video__play svg { width: 15px; height: 15px; margin-left: 2px; }
.mini-video__meta strong { display: block; font-family: var(--font-head); font-size: .95rem; font-weight: 600; }
.mini-video__meta span { color: rgba(255,255,255,.65); font-size: .82rem; }

/* --- Light modal (forms — e.g. Job Applications "Apply" popup) ---
   Same fixed-overlay/is-open pattern as .vlightbox below, but a white card
   suited to a form instead of a black video frame. */
.modal {
  position: fixed; inset: 0; z-index: 200; display: none; place-items: center; padding: 24px;
  background: rgba(10,37,64,.5);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  opacity: 0; transition: opacity .25s ease; overflow-y: auto;
}
.modal.is-open { display: grid; opacity: 1; }
.modal__dialog {
  width: min(100%, 640px); max-height: calc(100vh - 48px); overflow-y: auto;
  background: var(--white); border-radius: var(--radius); box-shadow: var(--shadow-lg);
  padding: 40px; position: relative; margin: 24px 0;
}
.modal__close {
  position: absolute; top: 16px; right: 16px; width: 38px; height: 38px; border-radius: 50%;
  display: grid; place-items: center; cursor: pointer; color: var(--muted);
  background: var(--bg-soft); border: 1px solid var(--line); transition: background .15s ease, color .15s ease;
}
.modal__close:hover { background: var(--line); color: var(--ink); }
.modal__close svg { width: 18px; height: 18px; }
.modal__note { font-size: .8rem; color: var(--muted); margin-top: -8px; margin-bottom: 16px; }

/* --- Video lightbox (opens when a mini video is clicked) --- */
.vlightbox {
  position: fixed; inset: 0; z-index: 200; display: none; place-items: center; padding: 24px;
  background: rgba(5,15,26,.62);
  -webkit-backdrop-filter: blur(14px) saturate(120%); backdrop-filter: blur(14px) saturate(120%);
  opacity: 0; transition: opacity .25s ease;
}
.vlightbox.is-open { display: grid; opacity: 1; }
.vlightbox__dialog { width: min(100%, 980px); position: relative; }
.vlightbox__frame {
  position: relative; aspect-ratio: 16 / 9; border-radius: 20px; overflow: hidden; background: #000;
  border: 1px solid rgba(255,255,255,.18); box-shadow: 0 30px 90px rgba(0,0,0,.6);
}
.vlightbox__frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.vlightbox__close {
  position: absolute; top: -54px; right: 0; width: 44px; height: 44px; border-radius: 50%;
  display: grid; place-items: center; cursor: pointer; color: #fff;
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.25);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
}
.vlightbox__close:hover { background: rgba(255,255,255,.24); }
.vlightbox__close svg { width: 20px; height: 20px; }

/* Quick campus links on the third slide */
.campus-quick { display: grid; gap: 10px; padding: 22px; }
.campus-quick a {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 15px 18px; border-radius: 14px; color: #fff; text-decoration: none;
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.12);
  transition: background .2s ease, transform .2s ease;
}
.campus-quick a:hover { background: rgba(255,255,255,.14); transform: translateX(3px); text-decoration: none; }
.campus-quick strong { font-family: var(--font-head); font-weight: 600; }
.campus-quick span { color: rgba(255,255,255,.7); font-size: .88rem; }
.campus-quick .arrow { color: var(--aqua); }

@media (max-width: 900px) {
  .hero-split { grid-template-columns: 1fr; gap: 26px; }
  .video-rail { padding: 16px; }
  .mini-videos { max-height: 40vh; overflow-y: auto; }
}
@media (max-width: 480px) {
  .mini-video { grid-template-columns: 96px 1fr; gap: 10px; }
  .mini-video__thumb-wrap { width: 96px; }
  .vlightbox__close { top: 0; right: 0; transform: translate(-8px, 8px); }
}

/* =========================================================================
   PARALLAX ART SLIDE (e.g. "Heroes of the Faith")
   Two layered images: background (slow) + title lockup (faster), on top.
   The differential movement during the vertical transition = parallax.
   ========================================================================= */
.hero-slide--art { align-items: center; }

.parallax-layer { position: absolute; inset: 0; z-index: 0; overflow: hidden; pointer-events: none; }
.parallax-layer img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transform: scale(1.15);            /* headroom so the parallax shift never shows edges */
  will-change: transform;
}

/* Gradient scrim: dark on the LEFT (title legibility), clear on the RIGHT
   so the artwork/statue keeps showing through, plus a soft base. */
.hero-slide__scrim--art {
  background:
    linear-gradient(90deg,
      rgba(6,14,24,.94) 0%,
      rgba(6,14,24,.80) 26%,
      rgba(6,14,24,.42) 52%,
      rgba(6,14,24,.10) 78%,
      rgba(6,14,24,.02) 100%),
    linear-gradient(180deg, rgba(6,14,24,.30) 0%, rgba(6,14,24,0) 40%, rgba(6,14,24,.45) 100%);
}

.hero-slide--art .hero-slide__content { z-index: 4; padding-top: 72px; }

/* Desktop two-column: title + CTA on the left, videos on the right */
.hero-art-grid {
  display: grid; grid-template-columns: 1.05fr .95fr; gap: 52px; align-items: center;
}
/* Grid items default to min-width:auto, which refuses to shrink below the
   item's own content width — on the video rail that's wide enough (video
   thumbnails) to force the whole grid wider than the viewport on phones,
   pushing the title/buttons column past the edge along with it. */
.hero-art-grid > * { min-width: 0; }
.hero-art-title .eyebrow { margin-bottom: 18px; }
.series-title-img {
  width: min(100%, 560px); height: auto; display: block;
  filter: drop-shadow(0 8px 30px rgba(0,0,0,.55));
  will-change: transform;
}
.hero-art-title .hero__actions { margin-top: 30px; }

/* ---------- Mobile hero slider: series + 3 campuses, one swipeable strip ----------
   Replaces the desktop hero-slider + campus-dock entirely on phones (nothing
   here depends on hover, so nothing is hidden behind an interaction phones
   can't do). Native CSS scroll-snap, no library — see the ".mhs-track" scroll
   listener in main.js for the dots. See the "MOBILE HERO SLIDER" markup in
   index.html. */
.mobile-hero-slider { display: none; }
@media (max-width: 900px) {
  .hero-slider, .hero-campus-dock { display: none; }
  .mobile-hero-slider {
    position: relative; display: block; background: var(--navy); padding: 0;
    height: 100vh; height: 100svh;   /* full screen, like the desktop hero */
  }
  .mhs-track {
    /* Full-bleed: no gap, no side padding — slides run edge-to-edge with
       nothing but image between them, no strip of background showing. */
    display: flex; gap: 0; height: 100%; overflow-x: auto; scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch; scrollbar-width: none;
  }
  .mhs-track::-webkit-scrollbar { display: none; }
  .mhs-slide {
    flex: 0 0 100%; height: 100%; scroll-snap-align: start;
    position: relative; display: block; overflow: hidden;
    color: #fff; text-decoration: none;
  }
  .mhs-slide:hover, .mhs-slide:focus-visible, .mhs-slide:active { color: #fff; text-decoration: none; }
  .mhs-slide__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
  .mhs-slide__scrim {
    position: absolute; inset: 0;
    /* Text is centered now (not bottom-anchored), so the darkening needs to
       cover the middle of the frame, not just the bottom edge. */
    background: linear-gradient(180deg, rgba(0,45,74,.30) 0%, rgba(0,45,74,.58) 50%, rgba(0,45,74,.82) 100%);
  }
  .mhs-slide__body {
    position: absolute; z-index: 2; left: 0; right: 0; top: 50%;
    transform: translateY(-50%); padding: 0 28px; text-align: center;
  }
  .mhs-slide__eyebrow {
    display: block; color: var(--aqua);
    font-size: .8rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
    margin-bottom: .4em;
  }
  .mhs-slide__name { display: block; font-weight: 800; font-size: 2.1rem; line-height: 1.15; }
  /* Series slide only: the dashboard-uploaded title graphic, standing in for
     the plain-text .mhs-slide__name the other (campus) slides still use. */
  .mhs-slide__title-img {
    display: block; margin: 0 auto; width: min(80%, 320px); height: auto;
    filter: drop-shadow(0 6px 20px rgba(0,0,0,.55));
  }
  .mhs-slide__time { display: block; font-size: 1.05rem; color: rgba(255,255,255,.88); margin-top: .4em; }
  .mhs-slide__cta {
    display: inline-flex; align-items: center; gap: 7px; margin-top: .8em;
    color: var(--aqua); font-weight: 700; font-size: 1rem;
  }
  .mhs-slide__cta svg { width: 18px; height: 18px; }

  /* Prev/next arrows, floating over the image (same glass-circle look as the
     desktop hero-nav) instead of dots below it. */
  .mhs-nav {
    position: absolute; top: 50%; transform: translateY(-50%); z-index: 6;
    width: 40px; height: 40px; border-radius: 50%; cursor: pointer;
    display: grid; place-items: center; color: #fff;
    background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.3);
    -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
    transition: background .2s ease, opacity .2s ease;
  }
  .mhs-nav svg { width: 20px; height: 20px; }
  .mhs-nav--prev { left: 12px; }
  .mhs-nav--next { right: 12px; }

  /* "Scroll down" cue — the slider is now a full screen, so nothing below it
     hints that the page continues until the visitor scrolls by accident. */
  .mhs-scrolldown {
    position: absolute; z-index: 4; left: 50%; bottom: 20px; transform: translateX(-50%);
    width: 44px; height: 44px; border: 0; background: none; cursor: pointer;
    display: grid; place-items: center; color: rgba(255,255,255,.85);
    animation: mhsBounce 1.8s ease-in-out infinite;
  }
  .mhs-scrolldown svg { width: 26px; height: 26px; filter: drop-shadow(0 2px 8px rgba(0,0,0,.45)); }
  @keyframes mhsBounce {
    0%, 100% { transform: translateX(-50%) translateY(0); }
    50% { transform: translateX(-50%) translateY(10px); }
  }
  @media (prefers-reduced-motion: reduce) {
    .mhs-scrolldown { animation: none; }
  }
}

@media (max-width: 900px) {
  .hero-art-grid { grid-template-columns: 1fr; gap: 22px; }
  .hero-slide--art .hero-slide__content { padding-bottom: clamp(24px, 5vh, 48px); }
  .series-title-img { width: min(78%, 420px); }
  /* On stacked mobile, darken the bottom instead of the left */
  .hero-slide__scrim--art {
    background: linear-gradient(180deg, rgba(6,14,24,.35) 0%, rgba(6,14,24,.05) 30%, rgba(6,14,24,.55) 70%, rgba(6,14,24,.88) 100%);
  }
}

@media (prefers-reduced-motion: reduce) {
  .parallax-layer img { transform: scale(1.02); }
  .series-title-img { transform: none !important; }
}

/* =========================================================================
   MINISTRIES (kids.html / youth.html) — full-height segments
   Every section fills the viewport and centres its content vertically, and
   the hero's decorative wave divider is gone (removed from the markup on
   those two pages; .wave itself stays for the six pages still using it).
   min-height, never height: if a section's content is taller than the screen
   (long copy on a phone) it grows instead of clipping.
   ========================================================================= */
body.ministry {
  --hdr: 84px;                       /* .site-header .nav height — it is sticky,
                                        so it takes 84px of flow at the top */
}

/* ============================================================
   Campus pages — full-height hero, no wave divider
   Mirrors the ministry hero treatment, but deliberately does NOT
   make every .section full-height: only the hero is a full screen.
   ============================================================ */
body.campus { --hdr: 84px; }
body.campus .hero {
  display: flex; align-items: center;
  min-height: calc(70vh - var(--hdr));
  min-height: calc(70svh - var(--hdr));   /* avoids the mobile URL-bar jump */
  padding: 48px 0;                         /* replaces .hero's 110px top padding */
}
body.campus .hero > .container { width: 100%; }
/* Staff review (Sep 2026): full-height sections left too much empty space,
   and people missed content further down (the Care page's food help).
   Sections now size to their content; only the hero keeps a tall first
   screen — 80%, so the start of the next section peeks in and invites a scroll. */
body.ministry .hero {
  display: flex; align-items: center;
  min-height: calc(80vh - var(--hdr));
  min-height: calc(80svh - var(--hdr));   /* avoids the mobile URL-bar jump */
  padding: 48px 0;                         /* replaces .hero's 110px top padding */
}
body.ministry .section { display: block; min-height: 0; }
/* .container is the flex item now: keep it full width so its own max-width
   and auto margins still do the centring. */
body.ministry .hero > .container,
body.ministry .section > .container { width: 100%; }

/* The closing CTA band on every ministry page ("Questions? Get in touch")
   is short, static content — a heading, a line, one button. Forcing it to
   fill the screen like the sections above just leaves a wall of empty
   color under it. Let it size to its content instead (falls back to
   .section's own 88px 0 padding, same as every non-ministry page). */
body.ministry .section.cta-band { display: block; min-height: 0; }

/* ============================================================
   Job Openings — its own arrangement, not the .ministry full-screen
   treatment: a listing can be one job or a dozen, so forcing every
   section to fill the viewport left tall, mostly-empty screens on a
   short list. Sections here just size to their content instead.
   ============================================================ */
body.jobs .hero,
body.jobs .section { min-height: 0; display: block; }
/* .hero/.hero--bold only pad the top (the old min-height:100vh + flex-center
   rule was doing the bottom spacing); replace that here so content doesn't
   run straight into the next section. */
body.jobs .hero { padding-bottom: 72px; }

/* Contact — same reasoning: five short, information-dense sections
   (office info, service times, rentals, CTA) don't need a full screen
   each. Sections size to their content instead. */
body.contact .hero,
body.contact .section { min-height: 0; display: block; }
body.contact .hero { padding-bottom: 72px; }

/* Give — same reasoning as Contact: short, information-dense sections
   (ways to give, e-Transfer instructions, CTA) don't need a full screen
   each. Sections size to their content instead. */
body.give .hero,
body.give .section { min-height: 0; display: block; }
body.give .hero { padding-bottom: 72px; }

/* Team — .hero/.hero--bold only pad the top; with the wave divider removed
   (the buttons were landing flush against the slider below), this replaces
   the bottom spacing the wave used to provide. */
body.team .hero { padding-bottom: 72px; }

/* Locations — same reasoning as Contact/Give: a hero, one grid of campus
   cards, and a CTA don't need a full screen each. */
body.locations .hero,
body.locations .section { min-height: 0; display: block; }
body.locations .hero { padding-bottom: 72px; }

/* Privacy Policy — a single long block of legal text has no business
   filling the screen either. */
body.privacy .hero,
body.privacy .section { min-height: 0; display: block; }
body.privacy .hero { padding-bottom: 72px; }

/* Missions — "Where We Serve" map (missions.html)
   .missions-map__bg carries the border-radius + overflow:hidden now (just
   the SVG backdrop) instead of .missions-map itself, so a pin's popover
   card can open past the map's edge without being clipped by the same
   rounding that keeps the SVG's corners clean. */
.missions-map { position: relative; box-shadow: var(--shadow-md); border-radius: 24px; aspect-ratio: 1000 / 500; }
/* The map's Congo/Bahamas pins link to these cards directly (not just their
   section) — cards aren't in the section[id]{scroll-margin-top} rule's
   selector, so they need their own to clear the sticky header on jump. */
#trip-congo, #trip-bahamas { scroll-margin-top: 100px; }
.missions-map__bg { position: absolute; inset: 0; border-radius: 24px; overflow: hidden; z-index: 0; }
.missions-map__bg svg { display: block; width: 100%; height: auto; }
/* Labels as HTML, positioned at the same %-of-box as the SVG dots below them
   (left/top set inline per pin) — normal responsive text instead of SVG
   <text>, which shrinks with the viewBox until it's unreadable on phones.
   Each non-home pin is a positioning wrapper (.map-pin, holding the
   above/below/left/right transform) around two siblings — .map-pin__trigger
   (a <button>) and .map-pin__card (its popover) — rather than the card
   nested inside the button, since a <button> can't legally contain the
   <a> the card links out with. */
.map-pin { position: absolute; z-index: 2; font-family: var(--font-sans); font-weight: 600; }
.map-pin.is-open { z-index: 5; }
.map-pin--above { transform: translate(-50%, calc(-100% - 10px)); }
.map-pin--below { transform: translate(-50%, 10px); }
.map-pin--left  { transform: translate(calc(-100% - 8px), -50%); }
.map-pin--right { transform: translate(8px, -50%); }
.map-pin__label { display: block; white-space: nowrap; font-size: clamp(10px, 2.6vw, 13px); color: rgba(255,255,255,.92); transition: color .15s ease; }
.map-pin__label--home { font-weight: 700; color: #fff; font-size: clamp(12px, 3.2vw, 15px); }
.map-pin__trigger {
  display: block; font: inherit; background: none; border: 0; padding: 6px; margin: -6px;
  cursor: pointer; -webkit-tap-highlight-color: transparent;
}
.map-pin__trigger:hover .map-pin__label, .map-pin.is-open .map-pin__label { color: #fff; }

/* Popover card — tap/click the pin's button to toggle it open (see
   js/missions-map.js), which sets .is-open on the shared .map-pin wrapper. */
.map-pin__card {
  position: absolute; left: 50%; width: max-content; max-width: min(240px, 78vw);
  background: #0e2f4d; border: 1px solid rgba(255,255,255,.14); border-radius: 12px;
  padding: 14px 16px; box-shadow: 0 16px 40px rgba(0,0,0,.35);
  opacity: 0; visibility: hidden; transform: translate(-50%, 4px); transition: opacity .15s ease, transform .15s ease;
  text-align: left; white-space: normal; pointer-events: none;
}
.map-pin__card--open-up   { bottom: calc(100% + 14px); }
.map-pin__card--open-down { top: calc(100% + 14px); }
.map-pin.is-open .map-pin__card { opacity: 1; visibility: visible; transform: translate(-50%, 0); pointer-events: auto; }
.map-pin__card strong { display: block; color: #fff; font-size: .92rem; margin-bottom: 4px; }
.map-pin__card p { color: rgba(255,255,255,.82); font-size: .82rem; font-weight: 400; line-height: 1.5; margin: 0; }
.map-pin__card a { display: inline-block; margin-top: 8px; color: var(--aqua); font-size: .82rem; font-weight: 700; }
.map-pin__card a:hover { text-decoration: underline; }

/* Map motion: flight paths "draw" from Moncton on scroll-into-view (stroke
   length measured + animated by js/missions-map.js), then loop into a slow
   dash-flow. Destination dots glow/grow on hover or focus of their HTML
   trigger (matched by data-dest, since the dot lives in the SVG background
   layer while the trigger is an HTML overlay — see missions-map.js). */
@keyframes flightFlow { to { stroke-dashoffset: -24; } }
.flight-paths path.is-flowing { animation: flightFlow 1.6s linear infinite; }
.dest-dot { transition: r .2s ease, opacity .2s ease; }
.dest-dot.is-hovered { r: 9; filter: drop-shadow(0 0 7px rgba(127,227,216,.85)); }
@media (prefers-reduced-motion: reduce) {
  .pulse-ring { display: none; }
  .flight-paths path.is-flowing { animation: none; }
}

/* =========================================================================
   HERO CAMPUS DOCK + CAMPUS TAKEOVER
   Replaces the old full-screen campuses slide. A labelled dock of three photo
   cards sits in the lower-left of the series slide, clear of the messages rail
   in column 2. All three cards are identical until one is active; hovering or
   keyboard-focusing one expands it (wider and taller) and "opens" that campus
   in the hero behind it — the campus photo cross-fades over the artwork and the
   campus panel replaces the series lockup (see js/main.js).
   Leaving does not close immediately: js keeps it open for a grace period so
   the panel's buttons are reachable, and holds it while the panel is hovered.
   Touch / narrow screens: equal cards, names only, no expansion, no takeover.
   ========================================================================= */

/* One source of truth for the dock's footprint, so the content column above
   can reserve exactly the right amount of room.
   Hosted on .hero-slider because the dock sits OUTSIDE the slide, and both
   the dock and the slide's content need to read these.
   The dock is capped at 50% so it never reaches the messages rail: at every
   width from 901px up it ends clear of column 2. */
.hero-stack {
  position: relative;
  --dock-h: clamp(150px, 20vh, 200px);
  --dock-bottom: clamp(34px, 5.5vh, 68px);
  --card-drop: 24px;                 /* headroom the active card rises into */
}

/* --- Campus background layers (one per campus, stacked over the artwork) --- */
.campus-bg {
  position: absolute; inset: 0; z-index: 1; overflow: hidden;
  opacity: 0; pointer-events: none;
  transition: opacity .7s ease, transform .9s cubic-bezier(.2,.7,.2,1);
  transform: scale(1.06);
}
.campus-bg img { width: 100%; height: 100%; object-fit: cover; display: block; }
.campus-bg.is-showing { opacity: 1; transform: scale(1); }

/* While a campus is open the scrim deepens: campus photos are brighter and
   busier than the artwork, so the left column needs more cover. */
.hero-slide--art .hero-slide__scrim--art { transition: opacity .6s ease; }
.hero-slide--art.is-campus-open .hero-slide__scrim--art {
  background:
    linear-gradient(90deg,
      rgba(4,26,42,.95) 0%,
      rgba(4,26,42,.86) 30%,
      rgba(4,26,42,.58) 58%,
      rgba(4,26,42,.26) 82%,
      rgba(4,26,42,.14) 100%),
    linear-gradient(180deg, rgba(4,26,42,.40) 0%, rgba(4,26,42,.10) 40%, rgba(4,26,42,.72) 100%);
}
/* The artwork fades back while a campus is showing */
.hero-slide--art .parallax-layer { transition: opacity .7s ease; }
.hero-slide--art.is-campus-open .parallax-layer { opacity: .16; }

/* --- Series lockup vs campus panel: one stacked cell, cross-faded ---
   Both blocks toggle `visibility` as well as opacity: an invisible block must
   not keep its links in the tab order. Transitions treat visibility specially
   (the element stays visible for the whole duration), so the fade still plays. */
.hero-art-stage { display: grid; grid-template-columns: 1fr; min-width: 0; }
.hero-art-title,
.hero-campus-panel { grid-area: 1 / 1; min-width: 0; }

.hero-art-title {
  transition: opacity .5s ease, transform .6s cubic-bezier(.2,.7,.2,1), visibility .5s;
}
.is-campus-open .hero-art-title {
  opacity: 0; transform: translateY(-18px); visibility: hidden; pointer-events: none;
}

/* The messages rail belongs to the series too, so it leaves with the lockup.
   Note the two-class selector on the slide: the rail is an .anim-item, and its
   entrance rule (.hero-slide.is-active .anim-item) carries the same 3-class
   specificity — so this needs to match that weight AND stay after it in the
   file. transition-delay is zeroed because the rail's --i would otherwise hold
   it back ~270ms and it would trail the lockup on the way out. */
.hero-slide--art.is-campus-open .video-rail {
  opacity: 0; transform: translateY(-18px); visibility: hidden; pointer-events: none;
  transition: opacity .5s ease, transform .6s cubic-bezier(.2,.7,.2,1), visibility .5s;
  transition-delay: 0s;
}

.hero-campus-panel {
  opacity: 0; transform: translateY(22px); visibility: hidden; pointer-events: none;
  transition: opacity .5s ease .08s, transform .6s cubic-bezier(.2,.7,.2,1) .08s, visibility .58s;
}
.is-campus-open .hero-campus-panel {
  opacity: 1; transform: none; visibility: visible; pointer-events: auto;
}
.hero-campus-panel .eyebrow { color: var(--aqua); margin-bottom: 14px; }
.hero-campus-panel__name {
  color: #fff; font-weight: 800; letter-spacing: -.03em; line-height: .95;
  font-size: clamp(2.4rem, 5vw, 4.4rem); margin-bottom: .18em;
}
.hero-campus-panel__time {
  color: #fff; font-weight: 600; font-size: clamp(1rem, 1.4vw, 1.2rem); margin-bottom: .5em;
}
.hero-campus-panel__note {
  color: rgba(255,255,255,.82); max-width: 38ch; margin-bottom: 4px;
}
.hero-campus-panel__note:empty { display: none; }

/* --- The dock: label + card row, floating above the bottom edge --- */
.hero-campus-dock {
  position: absolute; z-index: 5;
  /* Lines up with the title/eyebrow above it instead of hugging the browser
     edge: same math as .container's own centering (mirrors max-width +
     auto margins + 24px padding), so on wide screens the dock sits under
     the title column instead of drifting off toward the left edge alone. */
  left: max(24px, calc((100% - var(--maxw)) / 2 + 24px)); bottom: var(--dock-bottom);
  /* Narrower cap than before: the dock now starts under the title column
     instead of near the browser edge, so it needs less runway to stay clear
     of column 2 (the messages rail) — see the sizing note above .hero-stack. */
  width: min(46%, 520px);
  /* Its own entrance: the .anim-item mechanism only reveals elements inside an
     .is-active slide, and the dock deliberately sits outside the slide. */
  animation: dockIn .75s cubic-bezier(.2,.7,.2,1) .3s both;
}
@keyframes dockIn {
  from { opacity: 0; transform: translateY(26px); }
  to   { opacity: 1; transform: none; }
}
/* Small caption with a hairline that runs out to the right — anchors the
   cards in a composition instead of leaving them floating. */
.hero-campus-dock__label {
  display: flex; align-items: center; gap: 14px;
  margin: 0 0 12px 2px;
  color: rgba(255,255,255,.72);
  font-size: .7rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase;
}
.hero-campus-dock__label::after {
  content: ""; flex: 1; height: 1px;
  background: linear-gradient(90deg, rgba(255,255,255,.32), rgba(255,255,255,0));
}

.hero-campus-row {
  display: flex; align-items: flex-end; gap: 12px;
  height: var(--dock-h);
  padding-top: var(--card-drop);     /* headroom for the active card */
}

/* At rest every card is identical — same size, same baseline. The only card
   that ever differs is the one being hovered or focused. */
.hcard {
  position: relative; flex: 1 1 0; min-width: 0; overflow: hidden;
  height: calc(100% - var(--card-drop));
  display: flex; align-items: flex-end;
  border-radius: 0;
  color: #fff; text-decoration: none; cursor: pointer;
  background: var(--navy);
  box-shadow: 0 16px 40px rgba(0,0,0,.5);
  transition: flex-grow .55s cubic-bezier(.2,.7,.2,1),
              height .55s cubic-bezier(.2,.7,.2,1),
              box-shadow .45s ease;
}
.hcard:hover, .hcard:focus-visible { color: #fff; text-decoration: none; outline: none; }
.hcard:focus-visible { box-shadow: 0 0 0 3px var(--aqua), 0 20px 46px rgba(0,0,0,.55); }

/* Hairline that reads as glass against the photo */
.hcard::after {
  content: ""; position: absolute; inset: 0; z-index: 3; pointer-events: none;
  box-shadow: inset 0 0 0 1px rgba(255,255,255,.16);
  transition: box-shadow .35s ease;
}

.hcard__img {
  position: absolute; inset: 0; z-index: 0;
  width: 100%; height: 100%; object-fit: cover;
  transform: scale(1.12); filter: saturate(.55) brightness(.6);
  transition: transform .65s cubic-bezier(.2,.7,.2,1), filter .45s ease;
}
.hcard__scrim {
  position: absolute; inset: 0; z-index: 1;
  background:
    linear-gradient(180deg, rgba(0,45,74,.05) 0%, rgba(0,45,74,.26) 42%, rgba(0,45,74,.94) 100%),
    linear-gradient(145deg, rgba(95,207,223,.16) 0%, rgba(0,61,99,0) 65%);
}

/* Index number, top-left — editorial texture, and it gives the inactive
   cards something of their own. */
.hcard__num {
  position: absolute; z-index: 3; top: 10px; left: clamp(12px, 1.2vw, 18px);
  font-size: .66rem; font-weight: 700; letter-spacing: .14em;
  color: rgba(255,255,255,.6);
  transition: color .3s ease;
}
.hcard__body {
  position: relative; z-index: 2; display: block; width: 100%;
  padding: 0 clamp(12px, 1.2vw, 18px) clamp(13px, 1.5vh, 18px);
}
.hcard__eyebrow {
  display: block; color: var(--aqua);
  font-size: .62rem; font-weight: 700; letter-spacing: .18em; text-transform: uppercase;
  opacity: 0; max-height: 0; overflow: hidden;
  transition: opacity .35s ease, max-height .45s ease, margin-bottom .45s ease;
}
.hcard__name {
  display: block; font-weight: 700; line-height: 1.1; letter-spacing: -.01em;
  font-size: clamp(1rem, 1.3vw, 1.3rem);
}
.hcard__time {
  display: block; max-height: 0; opacity: 0; overflow: hidden;
  font-size: .82rem; font-weight: 500; color: rgba(255,255,255,.9);
  transition: max-height .5s cubic-bezier(.2,.7,.2,1), opacity .4s ease, margin-top .5s ease;
}

/* Corner arrow chip — appears on the active card */
.hcard__go {
  position: absolute; z-index: 3; top: 9px; right: 9px;
  width: 28px; height: 28px; border-radius: 50%;
  display: grid; place-items: center; color: #fff;
  background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.34);
  backdrop-filter: blur(6px);
  opacity: 0; transform: translate(6px, -6px) scale(.9);
  transition: opacity .35s ease, transform .45s cubic-bezier(.2,.7,.2,1), background .25s ease;
}
.hcard__go svg { width: 13px; height: 13px; }
.hcard:hover .hcard__go { background: rgba(255,255,255,.32); }

/* --- Hover-capable, wide screens: the ACTIVE card ---
   `.is-active` is set by JS and is what keeps the card expanded during the
   grace period after the pointer leaves — otherwise the card would snap back
   while the hero behind it still shows that campus. :hover/:focus-visible are
   kept so the card still responds if JS never runs. */
@media (hover: hover) and (min-width: 901px) {
  .hero-campus-row .hcard.is-active,
  .hero-campus-row .hcard:hover,
  .hero-campus-row .hcard:focus-visible {
    flex-grow: 1.9; height: 100%; z-index: 2;
    box-shadow: 0 22px 54px rgba(0,0,0,.6), 0 0 0 1px rgba(127,227,216,.18);
  }
  .hero-campus-row .hcard.is-active::after,
  .hero-campus-row .hcard:hover::after,
  .hero-campus-row .hcard:focus-visible::after {
    box-shadow: inset 0 0 0 1px rgba(255,255,255,.34), inset 0 3px 0 0 var(--aqua);
  }
  .hero-campus-row .hcard.is-active .hcard__img,
  .hero-campus-row .hcard:hover .hcard__img,
  .hero-campus-row .hcard:focus-visible .hcard__img { transform: scale(1); filter: none; }

  .hero-campus-row .hcard.is-active .hcard__num,
  .hero-campus-row .hcard:hover .hcard__num,
  .hero-campus-row .hcard:focus-visible .hcard__num { color: var(--aqua); }

  .hero-campus-row .hcard.is-active .hcard__eyebrow,
  .hero-campus-row .hcard:hover .hcard__eyebrow,
  .hero-campus-row .hcard:focus-visible .hcard__eyebrow { opacity: 1; max-height: 1.4em; margin-bottom: .4em; }

  .hero-campus-row .hcard.is-active .hcard__time,
  .hero-campus-row .hcard:hover .hcard__time,
  .hero-campus-row .hcard:focus-visible .hcard__time { max-height: 3em; opacity: 1; margin-top: .4em; }

  .hero-campus-row .hcard.is-active .hcard__go,
  .hero-campus-row .hcard:hover .hcard__go,
  .hero-campus-row .hcard:focus-visible .hcard__go { opacity: 1; transform: none; }
}

/* The content column reserves the dock's full footprint (label included) so
   neither the series lockup nor the messages rail collides with the cards. */
@media (min-width: 901px) {
  .hero-slide--art .hero-slide__content {
    padding-bottom: calc(var(--dock-h) + var(--dock-bottom) + 44px);
  }
}
/* Short laptop screens */
@media (min-width: 901px) and (max-height: 800px) {
  .hero-stack { --dock-h: clamp(132px, 17.5vh, 168px); --dock-bottom: clamp(24px, 4vh, 44px); --card-drop: 20px; }
  .series-title-img { width: min(100%, 420px); }
  .hero-campus-dock__label { margin-bottom: 9px; }
}

/* --- Touch / narrow: no hover, so equal cards with names only --- */
@media (hover: none), (max-width: 900px) {
  .hcard__img { transform: scale(1); filter: saturate(.85) brightness(.86); }
}
@media (max-width: 900px) {
  /* The hero's own content (title + CTAs + messages rail) already fills a phone
     screen, so the dock is NOT pinned inside it here — it flows underneath as a
     band. That leaves the hero itself exactly as it was on phones. It needs its
     own dark background because the page background is light in light mode. */
  .hero-stack { --dock-h: clamp(134px, 19vh, 174px); --card-drop: 0px; }
  .hero-campus-dock {
    position: static; width: auto; animation: none;
    padding: 22px 14px 28px; background: var(--navy);
    border-top: 1px solid rgba(255,255,255,.14);
    box-shadow: 0 -18px 30px -18px rgba(0,0,0,.5) inset;
  }
  .hero-campus-row { gap: 8px; padding-top: 0; height: var(--dock-h); }
  .hcard { height: 100%; box-shadow: 0 10px 26px rgba(0,0,0,.45); }
  .hcard__go, .hcard__num { display: none; }   /* save room on phones */
  .hcard__eyebrow { opacity: 1; max-height: 1.4em; margin-bottom: .3em; }
  .hcard__time { max-height: 2.4em; opacity: 1; margin-top: .3em; }
  .hcard__name { font-size: 1.05rem; }
  .hero-campus-dock__label { margin-bottom: 12px; font-size: .7rem; }
}

@media (prefers-reduced-motion: reduce) {
  .hcard, .hcard__img, .hcard__time, .hcard__eyebrow, .hcard__go,
  .campus-bg, .hero-art-title, .hero-campus-panel { transition-duration: .01ms !important; }
  .hero-campus-dock { animation: none; }
}

/* =========================================================================
   ANNOUNCEMENTS MOSAIC (bento — 6 tiles)
   Each tile is a clickable link. Drop in an <img class="mtile__img"> to use a
   real photo, or keep the tidal-blue gradient (set via --m1 / --m2).
   ========================================================================= */
.mosaic {
  display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 210px; gap: 18px;
}
.mtile {
  /* <figure> trae margin:1em 40px del navegador: sin este reset cada tile
     quedaba 34px más bajo y 80px más angosto que su celda del grid. */
  margin: 0;
  position: relative; overflow: hidden; border-radius: 20px; display: flex; align-items: flex-end;
  color: #fff; text-decoration: none; box-shadow: var(--shadow-sm);
}
.mtile--feature { grid-column: span 2; grid-row: span 2; }
.mtile--wide    { grid-column: span 2; }
.mtile--small   { grid-column: span 1; }

/* Mosaico para fuentes VERTICALES (Miramichi). La geometría compartida de
   .mosaic asume fotos horizontales, y recorta estos cuadros de 2400px de alto
   a una franja: el tile ancho mostraba sólo el 18% de su imagen. Filas más
   altas y ninguna celda ancha dejan las caras dentro del encuadre.
   kids.html y youth.html usan fotos horizontales y no se tocan. */
.mosaic--portrait { grid-auto-rows: 300px; }
.mosaic--portrait > :nth-child(1) { grid-column: 1 / span 2; grid-row: 1 / span 2; }
.mosaic--portrait > :nth-child(2) { grid-column: 3;          grid-row: 1 / span 2; }
.mosaic--portrait > :nth-child(3) { grid-column: 4;          grid-row: 1; }
.mosaic--portrait > :nth-child(4) { grid-column: 4;          grid-row: 2; }
/* Las caras suelen caer en el tercio superior. */
.mosaic--portrait .mtile__img { object-position: center 28%; }

.mtile__bg { position: absolute; inset: 0; z-index: 0; background: linear-gradient(150deg, var(--m1, #0a4b74), var(--m2, #0fa3a3)); transition: transform .5s cubic-bezier(.2,.7,.2,1); }
.mtile__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; transition: transform .5s cubic-bezier(.2,.7,.2,1); }
.mtile:hover .mtile__bg, .mtile:hover .mtile__img { transform: scale(1.06); }
.mtile__scrim {
  position: absolute; inset: 0; z-index: 1;
  /* Nada de velo en la mitad superior: sólo el degradado que el texto necesita. */
  background: linear-gradient(180deg, rgba(0,45,74,0) 0%, rgba(0,45,74,0) 46%, rgba(0,45,74,.34) 70%, rgba(0,45,74,.82) 100%);
}
.mtile__body { position: relative; z-index: 2; padding: 22px 24px; width: 100%; }
.mtile__tag {
  display: inline-block; font-size: .68rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: #fff; background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.32);
  padding: 4px 11px; border-radius: 999px; margin-bottom: 12px;
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.mtile h3 { color: #fff; font-size: 1.15rem; line-height: 1.2; margin: 0 0 .3em; }
.mtile--feature h3 { font-size: clamp(1.5rem, 2.4vw, 2rem); }
.mtile p { color: rgba(255,255,255,.86); font-size: .92rem; margin: 0; max-width: 42ch; }
.mtile__arrow { margin-top: 12px; display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-head); font-weight: 600; font-size: .9rem; }
.mtile__arrow svg { width: 16px; height: 16px; transition: transform .2s ease; }
.mtile:hover .mtile__arrow { color: var(--aqua); }
.mtile:hover .mtile__arrow svg { transform: translateX(4px); }

@media (max-width: 900px) {
  .mosaic { grid-template-columns: repeat(2, 1fr); grid-auto-rows: 190px; }
  .mtile--feature { grid-column: span 2; grid-row: span 1; }
  .mtile--wide { grid-column: span 2; }
  .mtile--small { grid-column: span 1; }
}
@media (max-width: 600px) {
  .mosaic { grid-template-columns: 1fr; grid-auto-rows: 170px; }
  .mtile--feature, .mtile--wide, .mtile--small { grid-column: span 1; grid-row: span 1; }
}

/* These two blocks MUST come after the generic .mosaic responsive rules
   above: .mosaic--portrait and .mosaic are both plain single-class
   selectors (equal specificity), so whichever is later in the file wins
   at each breakpoint where both match — putting the generic rules first
   is what lets these actually override them, instead of silently losing
   to a smaller grid-auto-rows and cropping the tall side of every tile
   away (this exact bug shipped once already: Miramichi's photos showed
   almost none of the actual subject on phones because of it). */
@media (max-width: 900px) {
  .mosaic--portrait { grid-template-columns: repeat(2, 1fr); grid-auto-rows: 260px; }
  .mosaic--portrait > :nth-child(1) { grid-column: 1 / span 2; grid-row: auto; }
  .mosaic--portrait > :nth-child(2),
  .mosaic--portrait > :nth-child(3),
  .mosaic--portrait > :nth-child(4) { grid-column: auto; grid-row: auto; }
}
@media (max-width: 560px) {
  .mosaic--portrait { grid-template-columns: 1fr; grid-auto-rows: 300px; }
  .mosaic--portrait > :nth-child(1) { grid-column: 1; }
  /* Single-column tiles are much wider relative to their height than the
     desktop grid, so more of each portrait photo shows here — but that also
     means 28% crops straight through foreheads that sat safely in-frame at
     the desktop crop ratio. Shift the visible window up. */
  .mosaic--portrait .mtile__img { object-position: center 12%; }
}

/* =========================================================================
   RE-TRIGGERING entrance animation ([data-reanim] sections).
   Replays every time the section scrolls into view. Stagger via --i.
   ========================================================================= */
[data-reanim] .ranim {
  opacity: 0; transform: translateY(30px);
  transition: opacity .5s ease, transform .6s cubic-bezier(.2,.7,.2,1);
  transition-delay: 0ms;
}
[data-reanim].in-view .ranim {
  opacity: 1; transform: none;
  transition-delay: calc(var(--i, 0) * 85ms);
}
@media (prefers-reduced-motion: reduce) {
  [data-reanim] .ranim { opacity: 1 !important; transform: none !important; transition: none !important; }
}

/* =========================================================================
   "I'M NEW" PAGE — bold, modern components (shared / reusable)
   Dark tidal band, bold gradient hero, marquee strip, stat row, section
   heading, beliefs accordion. Fixed tidal-blue values are used where a
   surface must stay dark in BOTH light and dark themes (the :root vars
   invert --navy to a light ink color in dark mode).
   ========================================================================= */

/* Dark tidal band — stays dark in both themes */
.section--dark {
  background: linear-gradient(160deg, #0a2540 0%, #0d2f52 52%, #0e3b5e 100%);
  color: #fff;
}
.section--dark h1, .section--dark h2, .section--dark h3, .section--dark h4 { color: #fff; }
.section--dark .lead { color: rgba(255,255,255,.80); }
.section--dark .eyebrow { color: var(--aqua); }
/* White cards keep their dark heading text when placed on a dark band */
.section--dark .card h3 { color: var(--navy); }
/* Brand sub-logo used as a section heading (e.g. Tidal Kids) */
.section-logo { display: block; height: 52px; width: auto; margin-bottom: 16px; }

/* Bold intro hero (gradient, oversized headline) — used on I'm New */
.hero--bold {
  background: linear-gradient(150deg, #041f38 0%, #0a2540 40%, #0e4d6e 100%);
  padding: clamp(120px, 16vh, 190px) 0 0;
}
.hero--bold h1 { font-size: clamp(2.7rem, 7.4vw, 5.2rem); letter-spacing: -.035em; line-height: 1.02; margin-bottom: .35em; }
.hero--bold h1 .accent { color: var(--aqua); }
.hero--bold .lead { max-width: 54ch; font-size: 1.22rem; }
.hero--bold .times { margin-top: 26px; }

/* Darker tidal overlay when the bold hero uses a background photo */
.hero--bold .hero__scrim {
  background:
    linear-gradient(180deg, rgba(3,15,28,.90) 0%, rgba(5,22,38,.82) 45%, rgba(2,11,22,.96) 100%),
    linear-gradient(125deg, rgba(15,163,163,.16) 0%, rgba(0,45,74,0) 60%);
}

/* Parallax background photo: drifts slower than the page on scroll (JS-driven),
   fades in on load; the text rises in with a small stagger. Extra height gives
   headroom so the drift never reveals the edges. */
.hero--parallax .hero__photo { height: 128%; top: -14%; will-change: transform; animation: heroFadeIn 1.1s ease both; }
.hero--parallax .hero__inner > * { animation: heroRise .8s cubic-bezier(.2,.7,.2,1) both; }
.hero--parallax .hero__inner > *:nth-child(1) { animation-delay: .05s; }
.hero--parallax .hero__inner > *:nth-child(2) { animation-delay: .14s; }
.hero--parallax .hero__inner > *:nth-child(3) { animation-delay: .23s; }
.hero--parallax .hero__inner > *:nth-child(4) { animation-delay: .32s; }
.hero--parallax .hero__inner > *:nth-child(5) { animation-delay: .41s; }
@keyframes heroFadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes heroRise { from { opacity: 0; transform: translateY(26px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) {
  .hero--parallax .hero__photo,
  .hero--parallax .hero__inner > * { animation: none !important; }
  .hero--parallax .hero__photo { transform: none !important; }
}

/* Young Adults hero slideshow: three photos cross-fade on a 21s loop, each one
   slowly zooming while it is on screen. Consecutive frames alternate zoom-in /
   zoom-out so the movement never repeats in the same direction, and each has its
   own transform-origin so the drift lands somewhere different every time.
   Slides deliberately avoid the .hero__photo class: that one is driven by the
   scroll-parallax in main.js, which sets transform and would cancel the zoom. */
/* ---- Reusable hero photo slideshow (Young Adults, Youth) -------------------
   Photos cross-fade on a loop, each slowly zooming while on screen. Consecutive
   frames alternate zoom-in / zoom-out and each gets its own transform-origin, so
   the drift never repeats in the same direction or lands in the same place.
   Slides are plain <img> children selected by :nth-child, and they deliberately
   avoid the .hero__photo class: that one is driven by the scroll-parallax in
   main.js, which writes transform and would cancel the zoom.
   Scale never dips below 1, so the frame edges are never exposed mid-zoom. */
.hero-slides { position: absolute; inset: 0; z-index: 0; overflow: hidden; }
.hero-slides img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; opacity: 0;
  will-change: opacity, transform; backface-visibility: hidden;
}
/* The stock bold-hero scrim sits at .90 opacity, which flattens the photos into
   texture and hides the zoom. Lighter here; heroes without a slideshow keep theirs.
   Checked against the white h1 and the .82-alpha lead for contrast. */
.hero--slides .hero__scrim {
  background:
    linear-gradient(180deg, rgba(3,15,28,.72) 0%, rgba(5,22,38,.60) 45%, rgba(2,11,22,.88) 100%),
    linear-gradient(125deg, rgba(15,163,163,.14) 0%, rgba(0,45,74,0) 60%);
}

/* 2 photos — 7s each, 14s loop */
.hero-slides--2 img { animation: heroKen2In 14s linear infinite both; }
.hero-slides--2 img:nth-child(1) { animation-delay: 0s; transform-origin: 50% 45%; }
.hero-slides--2 img:nth-child(2) { animation-name: heroKen2Out; animation-delay: 7s; transform-origin: 36% 56%; }
@keyframes heroKen2In {
  0%   { opacity: 0; transform: scale(1.04); }
  6%   { opacity: 1; }
  44%  { opacity: 1; }
  54%  { opacity: 0; transform: scale(1.17); }
  100% { opacity: 0; transform: scale(1.04); }
}
@keyframes heroKen2Out {
  0%   { opacity: 0; transform: scale(1.17); }
  6%   { opacity: 1; }
  44%  { opacity: 1; }
  54%  { opacity: 0; transform: scale(1.04); }
  100% { opacity: 0; transform: scale(1.17); }
}

/* 3 photos — 7s each, 21s loop */
.hero-slides--3 img { animation: heroKen3In 21s linear infinite both; }
.hero-slides--3 img:nth-child(1) { animation-delay:  0s; transform-origin: 50% 45%; }
.hero-slides--3 img:nth-child(2) { animation-name: heroKen3Out; animation-delay: 7s; transform-origin: 32% 58%; }
.hero-slides--3 img:nth-child(3) { animation-delay: 14s; transform-origin: 68% 42%; }
@keyframes heroKen3In {
  0%   { opacity: 0; transform: scale(1.04); }
  6%   { opacity: 1; }
  28%  { opacity: 1; }
  34%  { opacity: 0; transform: scale(1.17); }
  100% { opacity: 0; transform: scale(1.04); }
}
@keyframes heroKen3Out {
  0%   { opacity: 0; transform: scale(1.17); }
  6%   { opacity: 1; }
  28%  { opacity: 1; }
  34%  { opacity: 0; transform: scale(1.04); }
  100% { opacity: 0; transform: scale(1.17); }
}

/* 4 photos — 6.5s each, 26s loop */
.hero-slides--4 img { animation: heroKen4In 26s linear infinite both; }
.hero-slides--4 img:nth-child(1) { animation-delay:   0s;  transform-origin: 50% 45%; }
.hero-slides--4 img:nth-child(2) { animation-name: heroKen4Out; animation-delay: 6.5s;  transform-origin: 30% 56%; }
.hero-slides--4 img:nth-child(3) { animation-delay: 13s;  transform-origin: 70% 44%; }
.hero-slides--4 img:nth-child(4) { animation-name: heroKen4Out; animation-delay: 19.5s; transform-origin: 45% 62%; }
@keyframes heroKen4In {
  0%   { opacity: 0; transform: scale(1.04); }
  6%   { opacity: 1; }
  21%  { opacity: 1; }
  28%  { opacity: 0; transform: scale(1.16); }
  100% { opacity: 0; transform: scale(1.04); }
}
@keyframes heroKen4Out {
  0%   { opacity: 0; transform: scale(1.16); }
  6%   { opacity: 1; }
  21%  { opacity: 1; }
  28%  { opacity: 0; transform: scale(1.04); }
  100% { opacity: 0; transform: scale(1.16); }
}
/* 7 photos — 6.5s each, 45.5s loop. Same cadence as --4, scaled:
   fade in by 3.4%, hold to 12%, out by 16% (7.28s visible, 0.78s cross-fade). */
.hero-slides--7 img { animation: heroKen7In 45.5s linear infinite both; }
.hero-slides--7 img:nth-child(1) { animation-delay:  0s;    transform-origin: 50% 45%; }
.hero-slides--7 img:nth-child(2) { animation-name: heroKen7Out; animation-delay:  6.5s; transform-origin: 30% 56%; }
.hero-slides--7 img:nth-child(3) { animation-delay: 13s;    transform-origin: 70% 44%; }
.hero-slides--7 img:nth-child(4) { animation-name: heroKen7Out; animation-delay: 19.5s; transform-origin: 45% 62%; }
.hero-slides--7 img:nth-child(5) { animation-delay: 26s;    transform-origin: 62% 38%; }
.hero-slides--7 img:nth-child(6) { animation-name: heroKen7Out; animation-delay: 32.5s; transform-origin: 38% 50%; }
.hero-slides--7 img:nth-child(7) { animation-delay: 39s;    transform-origin: 55% 58%; }
@keyframes heroKen7In {
  0%    { opacity: 0; transform: scale(1.04); }
  3.4%  { opacity: 1; }
  12%   { opacity: 1; }
  16%   { opacity: 0; transform: scale(1.16); }
  100%  { opacity: 0; transform: scale(1.04); }
}
@keyframes heroKen7Out {
  0%    { opacity: 0; transform: scale(1.16); }
  3.4%  { opacity: 1; }
  12%   { opacity: 1; }
  16%   { opacity: 0; transform: scale(1.04); }
  100%  { opacity: 0; transform: scale(1.16); }
}
@media (prefers-reduced-motion: reduce) {
  /* Hold the first frame, perfectly still */
  .hero-slides img { animation: none !important; transform: none !important; opacity: 0; }
  .hero-slides img:first-child { opacity: 1; }
}

/* Section heading row: title on the left, supporting lead on the right */
.sec-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 28px; flex-wrap: wrap; margin-bottom: 46px; }
.sec-head > div { min-width: 0; }
.sec-head h2 { margin-bottom: 0; max-width: 20ch; }
.sec-head .lead { margin: 0; max-width: 40ch; }

/* Numbered "step" accent for cards (reuses .card / .card__meta) */
.card__num { font-family: var(--font-head); font-weight: 800; font-size: 1rem; letter-spacing: .02em;
  color: var(--accent); margin-bottom: .7em; }
a.card { display: flex; flex-direction: column; color: inherit; text-decoration: none; }
a.card:hover { text-decoration: none; }
a.card p { color: var(--muted); }
.card__arrow { margin-top: auto; padding-top: 20px; display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--font-head); font-weight: 600; color: var(--navy); }
.card__arrow svg { width: 17px; height: 17px; transition: transform .2s ease; }
a.card:hover .card__arrow { color: var(--accent); }
a.card:hover .card__arrow svg { transform: translateX(4px); }

/* Marquee strip (scrolling brand phrases) */
.marquee { background: linear-gradient(135deg, var(--accent), var(--accent-2)); color: #fff; overflow: hidden; padding: 16px 0; }
.marquee__track { display: flex; width: max-content; animation: marq 30s linear infinite; }
.marquee__group { display: flex; align-items: center; }
.marquee__group span {
  font-family: var(--font-head); font-weight: 700; font-size: 1.3rem; text-transform: uppercase;
  letter-spacing: .02em; padding: 0 26px; display: inline-flex; align-items: center; gap: 26px; white-space: nowrap;
}
.marquee__group span::after { content: "\2726"; font-size: .8em; color: rgba(255,255,255,.7); }
@keyframes marq { to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) { .marquee__track { animation: none; } }

/* Stat row (used inside .section--dark) */
.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 28px; }
.stat__num { font-family: var(--font-head); font-weight: 800; font-size: clamp(2.4rem, 5vw, 3.7rem);
  line-height: 1; color: #fff; letter-spacing: -.02em; }
.stat__num em { font-style: normal; color: var(--aqua); }
.stat__label { text-transform: uppercase; letter-spacing: .1em; font-size: .74rem; font-weight: 700;
  color: rgba(255,255,255,.62); margin-top: 12px; }
@media (max-width: 720px) { .stats { grid-template-columns: 1fr 1fr; gap: 34px; } }

/* Beliefs accordion */
.accordion { border-top: 1px solid var(--line); }
.accordion details { border-bottom: 1px solid var(--line); }
.accordion summary {
  cursor: pointer; list-style: none; padding: 24px 0; gap: 20px;
  display: flex; justify-content: space-between; align-items: center;
  font-family: var(--font-head); font-weight: 700; color: var(--navy);
  font-size: clamp(1.15rem, 2.4vw, 1.6rem); letter-spacing: -.01em;
}
.accordion summary::-webkit-details-marker { display: none; }
.accordion summary::after { content: "+"; color: var(--accent); font-weight: 400; font-size: 1.7rem; line-height: 1; flex: none; }
.accordion details[open] summary::after { content: "\2013"; }
.accordion p { padding: 0 0 24px; color: var(--muted); max-width: 72ch; margin: 0; }
.accordion .job-meta {
  font-family: var(--font-sans); font-weight: 600; font-size: .78rem; color: var(--muted);
  text-transform: uppercase; letter-spacing: .04em; white-space: nowrap;
}

/* ---------- Forms (public site — Job Applications, etc.) ---------- */
.field { display: flex; flex-direction: column; gap: 6px; margin-bottom: 16px; }
.field label { font-size: .85rem; font-weight: 600; color: var(--ink); }
.field input, .field textarea, .field select {
  font: inherit; font-size: .95rem; padding: 12px 14px; border: 1.5px solid var(--line);
  border-radius: var(--radius-sm); background: var(--white); color: var(--ink);
  width: 100%; box-sizing: border-box; transition: border-color .15s ease, box-shadow .15s ease;
}
.field input:focus, .field textarea:focus, .field select:focus {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(15,163,163,.15);
}
.field textarea { resize: vertical; min-height: 100px; }
.field input[type="file"] { padding: 9px 14px; cursor: pointer; }
.field select { cursor: pointer; }
.form-status { margin-top: 12px; font-size: .9rem; color: var(--muted); }
.form-status--error { color: #c0392b; }

/* Checkbox groups (e.g. the rental form's "Food required" / "Equipment
   needed") — a row of labeled checkboxes, not a single field. */
.check-group { display: flex; flex-wrap: wrap; gap: 10px 20px; }
.check-group label {
  display: flex; align-items: center; gap: 8px;
  font-size: .9rem; font-weight: 500; color: var(--ink); cursor: pointer;
}
.check-group input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--accent); cursor: pointer; }

/* Photo support for the campus selector cards (bg holds an <img>) */
.campus-card__bg img { width: 100%; height: 100%; object-fit: cover; }
.campus-card__body .btn { transition: background .2s ease, transform .2s ease; }
.campus-card:hover .btn { transform: translateX(3px); }

/* Team / Board member grid */
.team-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 26px; }
.member { text-align: left; }

/* #team shows only the staff-cover slider now — the grid + campus filter
   bar stay in the DOM (hidden, not removed) because js/staff-cover.js reads
   #team .team-grid .member at load to build the slider; deleting the
   markup would leave it with no photos to show. The Board section below
   keeps its own plain grid — this only hides #team's. */
#team .team-grid, #teamFilter { display: none; }

/* Image frame: holds the photo (or initials) + the blue overlay */
.member__frame {
  position: relative; isolation: isolate; overflow: hidden;
  aspect-ratio: 4 / 5; border-radius: var(--radius); box-shadow: var(--shadow-sm);
  display: grid; place-items: center;
  background: linear-gradient(150deg, color-mix(in srgb, var(--accent) 24%, var(--bg-soft)), var(--bg-soft));
}
.member__photo {
  width: 100%; height: 100%; object-fit: cover; object-position: center top; display: block;
  transition: transform .55s cubic-bezier(.2,.7,.2,1), filter .45s ease;
}
/* Full colour photos (no grayscale). No colour tint — ::after disabled. */
.member__frame--photo::after { content: none; }
/* Soft neutral dark gradient at the bottom for depth (subtler on hover) */
.member__frame--photo::before {
  content: ""; position: absolute; inset: 0; z-index: 3; pointer-events: none;
  background: linear-gradient(180deg, rgba(0,0,0,0) 55%, rgba(0,0,0,.44));
  opacity: .85; transition: opacity .45s ease;
}
.member:hover .member__frame--photo::after { opacity: 0; }
.member:hover .member__frame--photo::before { opacity: .32; }
.member:hover .member__photo { filter: none; transform: scale(1.05); }
.member:hover .member__frame { box-shadow: var(--shadow-md); }

.member__initials { font-family: var(--font-head); font-weight: 700; font-size: clamp(1.7rem, 4vw, 2.3rem);
  letter-spacing: .02em; color: color-mix(in srgb, var(--accent) 60%, var(--muted)); }
.member h3 { margin: 16px 0 1px; font-size: 1.12rem; }
.member__role { color: var(--accent); font-weight: 600; font-size: .9rem; letter-spacing: .01em; }
.member p { color: var(--muted); font-size: .92rem; margin: .55em 0 0; }
@media (max-width: 900px) { .team-grid { grid-template-columns: repeat(2, 1fr); gap: 22px; } }
@media (max-width: 480px) { .team-grid { grid-template-columns: 1fr; max-width: 320px; margin-inline: auto; } }

/* Campus filter bar (staff) */
.filterbar { display: flex; flex-wrap: wrap; gap: 10px; margin: -8px 0 34px; }
.filter-btn {
  font-family: var(--font-head); font-weight: 600; font-size: .92rem; line-height: 1;
  padding: 10px 20px; border-radius: 999px; cursor: pointer;
  background: transparent; color: var(--navy); border: 1.5px solid var(--line);
  transition: background .2s ease, color .2s ease, border-color .2s ease;
}
.filter-btn:hover { border-color: var(--accent); color: var(--accent); }
.filter-btn.is-active {
  background: linear-gradient(135deg, var(--accent), var(--accent-2));
  color: #fff; border-color: transparent; box-shadow: var(--shadow-sm);
}
.member.is-hidden { display: none; }

/* Chips (e.g. group types) */
.chips { display: flex; flex-wrap: wrap; gap: 10px; }
.chip {
  display: inline-flex; align-items: center; gap: 9px; padding: 11px 18px; border-radius: 999px;
  background: var(--white); border: 1px solid var(--line); color: var(--navy);
  font-weight: 600; font-size: .95rem;
}
.chip::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); flex: none; }
.chip small { color: var(--muted); font-weight: 500; }

/* Callout card (highlighted note, e.g. Group Kickoff) */
.callout {
  background: var(--white); border: 1px solid var(--line); border-left: 4px solid var(--accent);
  border-radius: var(--radius); padding: 24px 28px; box-shadow: var(--shadow-sm);
}
.callout .card__meta { margin-bottom: .5em; }
.callout p { margin: 0; color: var(--muted); }

/* A callout that should stand out from a plain informational one next to it
   (e.g. "Stay Connected" paired with "Check-In") — same gradient as
   .cta-band, so it reads as the more actionable one of the pair. */
.callout--highlight {
  background: linear-gradient(135deg, var(--accent), var(--accent-2));
  border-left-color: transparent;
}
.callout--highlight .card__meta { color: #fff; }
.callout--highlight p { color: rgba(255,255,255,.92); }

/* Inline social icon links (for light backgrounds) */
.social-inline { display: flex; gap: 12px; margin-top: 16px; }
.social-inline a {
  width: 42px; height: 42px; border-radius: 50%; display: grid; place-items: center;
  border: 1px solid var(--line); color: var(--navy);
  transition: background .2s ease, color .2s ease, border-color .2s ease, transform .2s ease;
}
.social-inline a:hover { background: var(--accent); border-color: transparent; color: #fff; transform: translateY(-2px); }
.social-inline svg { width: 20px; height: 20px; }
/* On a colored/gradient card (e.g. .callout--highlight), solid white circles
   read far better than the default outline-only style, which all but
   disappeared against a busy or dark background. */
.callout--highlight .social-inline a {
  width: 46px; height: 46px; background: #fff; border-color: transparent; color: var(--accent);
  box-shadow: 0 4px 14px rgba(0,0,0,.18);
}
.callout--highlight .social-inline a:hover { background: var(--navy); color: #fff; }
.callout--highlight .social-inline svg { width: 22px; height: 22px; }

/* Re-triggering entrance/exit — replays every time an element scrolls into view
   (used for team/board cards). Stagger via --i. Toggled by JS (.is-in). */
.scroll-anim {
  opacity: 0; transform: translateY(30px) scale(.97);
  transition: opacity .55s ease, transform .6s cubic-bezier(.2,.7,.2,1);
  transition-delay: calc(var(--i, 0) * 45ms);
}
.scroll-anim.is-in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .scroll-anim { opacity: 1 !important; transform: none !important; transition: none !important; }
}

/* Scripture pull-quote (bold dark card on a light section) */
.scripture {
  position: relative; max-width: 900px; margin: 48px auto; overflow: hidden;
  padding: clamp(40px, 6vw, 60px) clamp(28px, 5vw, 64px); text-align: center;
  background: linear-gradient(150deg, #0a2540 0%, #0d2f52 52%, #0e4d6e 100%);
  color: #fff; border-radius: var(--radius); box-shadow: var(--shadow-md);
}
.scripture::before {
  content: "\201C"; position: absolute; top: 6px; left: 26px;
  font-family: Georgia, "Times New Roman", serif; font-size: 8rem; line-height: 1;
  color: rgba(127,227,216,.26); pointer-events: none;
}
.scripture blockquote {
  position: relative; margin: 0; font-family: var(--font-head); font-weight: 600;
  font-size: clamp(1.3rem, 2.9vw, 1.95rem); line-height: 1.42; letter-spacing: -.01em; color: #fff;
}
.scripture figcaption { margin-top: 22px; text-transform: uppercase; letter-spacing: .16em; font-size: .8rem; font-weight: 700; color: var(--aqua); }

/* Simple readable prose column */
.prose { max-width: 760px; margin: 0 auto; }
.prose p { color: var(--muted); font-size: 1.08rem; }
.prose p + p { margin-top: 1.1em; }

/* Editorial media + text split (e.g. Our Mission) */
.split { display: grid; grid-template-columns: 1.05fr 1fr; gap: clamp(32px, 5vw, 60px); align-items: stretch; }
.split--rev { direction: rtl; }
.split--rev > * { direction: ltr; }
.split__media { width: 100%; height: 100%; min-height: 440px; object-fit: cover; border-radius: var(--radius); box-shadow: var(--shadow-md); }
/* Retrato de pastor: las fotos del equipo son cuadradas (1000x1000) y el
   .split estira la columna de la imagen al alto del texto, lo que recortaba
   los costados. Con proporción propia se ve el cuadro completo. */
.split__media--portrait {
  aspect-ratio: 1 / 1; height: auto; min-height: 0; align-self: center;
}
.split__text { align-self: center; }
.split__text h2 { margin-top: .12em; }
.split__text p { color: var(--muted); }
.split__text p + p { margin-top: 1.05em; }
.section--dark .split__text p { color: rgba(255,255,255,.80); }
/* For a long-form .split__text body (several paragraphs): flows the prose
   into two columns instead of one tall stack. break-inside:avoid keeps each
   <p> whole rather than splitting mid-paragraph across the column break. */
.split__text-cols { column-count: 2; column-gap: 28px; }
.split__text-cols p { break-inside: avoid; }
/* Gives the text column more room than the default 1.05fr/1fr split, so the
   two sub-columns above aren't too narrow to read comfortably. */
.split--text-wide { grid-template-columns: .75fr 1.25fr; }

/* 3-step process list (e.g. kids.html Parent-Child Dedication) — a sequence
   reads faster as short scannable steps than as one more paragraph in the
   wall of text above it. */
.dedication-steps__lead { color: rgba(255,255,255,.80); margin-top: 28px; }
.dedication-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; margin-top: 16px; }
.dedication-steps__item { display: flex; gap: 14px; align-items: flex-start; }
.dedication-steps__num {
  flex: none; width: 34px; height: 34px; border-radius: 50%;
  background: var(--aqua); color: #06202f; font-weight: 800; font-size: .95rem;
  display: grid; place-items: center;
}
.dedication-steps__item h3 { margin: 0 0 4px; font-size: 1rem; color: #fff; }
.dedication-steps__item p { margin: 0; font-size: .86rem; color: rgba(255,255,255,.75); line-height: 1.5; }
@media (max-width: 860px) {
  .dedication-steps { grid-template-columns: 1fr; gap: 18px; }
}
@media (max-width: 860px) {
  .split { grid-template-columns: 1fr; gap: 28px; align-items: start; }
  .split--rev { direction: ltr; }
  /* :not() here matters — same specificity as .split__media--portrait, so
     without it this was winning on source order alone and force-cropping
     the square pastor portraits (shediac/miramichi) top and bottom via the
     16:9 ratio meant for the regular (non-square) split photos. */
  .split__media:not(.split__media--portrait) { min-height: 0; aspect-ratio: 16 / 9; }
  .split__text-cols { column-count: 1; }
}

/* ============================================================
   Staff coverflow — 3D perspective carousel (team.html)
   ============================================================ */
/* Bottom strip grew from 50px to 96px to fit the "Send a Message" button
   under the caption — the clamp() grows by the same ~46px so the stage
   itself doesn't shrink to make room. */
.staff-cover { position: relative; width: 100%; height: clamp(426px, 46vw, 586px); margin: 8px 0 56px; perspective: 1700px; overflow: hidden; }
.staff-cover__stage { position: absolute; left: 0; right: 0; top: 0; bottom: 96px; transform-style: preserve-3d; }
.staff-cover__item {
  position: absolute; top: 50%; left: 50%; width: clamp(200px, 20vw, 300px); aspect-ratio: 3 / 4;
  margin: 0; padding: 0; border: 0; background: #0a2540; border-radius: 20px; overflow: hidden; cursor: grab;
  box-shadow: 0 24px 60px rgba(0,0,0,.34); will-change: transform, opacity;
  transition: transform .55s cubic-bezier(.2,.7,.2,1), opacity .5s ease, box-shadow .4s ease;
}
.staff-cover__item img {
  width: 100%; height: 100%; object-fit: cover; object-position: center top; display: block;
  filter: brightness(.62) saturate(.9);   /* side cards dimmed */
  transition: filter .45s ease;
  user-select: none; -webkit-user-drag: none; -webkit-user-select: none;
}
.staff-cover__item.is-active img { filter: none; }                 /* centre in full colour */
.staff-cover__item.is-active { box-shadow: 0 32px 80px rgba(10,37,64,.45); }
/* Grab cursor while dragging */
.staff-cover.dragging, .staff-cover.dragging .staff-cover__item { cursor: grabbing; }
.staff-cover.dragging .staff-cover__item img { user-select: none; -webkit-user-drag: none; pointer-events: none; }
.staff-cover__caption { position: absolute; left: 0; right: 0; bottom: 46px; text-align: center; margin: 0; }
.staff-cover__caption strong { display: block; font-family: var(--font-head); color: var(--navy); font-size: clamp(1.1rem, 2vw, 1.4rem); line-height: 1.1; }
.staff-cover__caption span { color: var(--accent); font-weight: 600; font-size: .9rem; }
.staff-cover__contact {
  position: absolute; left: 50%; bottom: 0; transform: translateX(-50%);
  background: none; border: 1px solid var(--line); border-radius: 999px; cursor: pointer;
  padding: 8px 20px; font-family: inherit; font-size: .85rem; font-weight: 600; color: var(--accent);
  transition: background .2s ease, color .2s ease, border-color .2s ease;
}
.staff-cover__contact:hover { background: var(--accent); color: #fff; border-color: transparent; }
.staff-cover__nav {
  position: absolute; top: calc(50% - 46px); z-index: 200; width: 44px; height: 44px; border-radius: 50%;
  border: 1px solid var(--line); background: var(--bg); color: var(--navy); cursor: pointer;
  display: grid; place-items: center; box-shadow: var(--shadow-sm);
  transition: background .2s ease, color .2s ease, transform .2s ease, border-color .2s ease;
}
.staff-cover__nav:hover { background: var(--accent); color: #fff; border-color: transparent; transform: translateY(-2px); }
.staff-cover__nav svg { width: 20px; height: 20px; }
.staff-cover__nav--prev { left: clamp(6px, 3vw, 36px); }
.staff-cover__nav--next { right: clamp(6px, 3vw, 36px); }
@media (max-width: 640px) {
  .staff-cover__item { width: 48vw; }
  .staff-cover__nav { width: 38px; height: 38px; }
}

/* ============================================================
   "I'm New" page — full-height segments + parallax media
   ============================================================ */
body.imnew .hero { min-height: 70vh; }
body.imnew .wave { display: none; }   /* remove the wave divider between segments */
/* Centered hero content on I'm New */
body.imnew .hero__inner { margin-inline: auto; text-align: center; align-items: center; }
body.imnew .hero .times, body.imnew .hero__actions { justify-content: center; }
body.imnew .section { min-height: 70vh; display: flex; align-items: center; }
body.imnew .section > .container { width: 100%; }

/* Mission & Vision: two glassmorphism cards that stack as you scroll */
/* ── Mission & Vision ──────────────────────────────────────────────────
   Antes: dos tarjetas de glassmorphism con position:sticky que se
   deslizaban una sobre otra. Medido en un laptop de 1400x900 (813px
   útiles), la tarjeta pinneada de Mission se pasaba 19px del viewport y
   la de Vision 75px, así que el párrafo de cierre de cada una quedaba
   cortado mientras estaba fija. Y las fotos horizontales (1280x720)
   iban en cajas verticales de 469x694: sólo se veía el 38% del cuadro.
   Ahora fluyen en orden, sobre el degradado de marca, sin backdrop-filter
   y con las fotos en una proporción que respeta el original.            */
body.imnew .pin-stack {
  position: relative;
  background:
    radial-gradient(62% 55% at 14% 16%, rgba(15,163,163,.24), transparent 64%),
    radial-gradient(58% 52% at 90% 84%, rgba(95,207,223,.17), transparent 64%),
    linear-gradient(168deg, #04182a 0%, #0a3355 56%, #0c4a6e 100%);
}
/* Sin pinning: las dos se leen completas y en orden. */
body.imnew .pin-stack #mission,
body.imnew .pin-stack #vision { position: static; z-index: auto; background: transparent; }
body.imnew .pin-stack .section {
  min-height: 0; display: block;
  padding-top: clamp(64px, 7vw, 104px); padding-bottom: clamp(64px, 7vw, 104px);
}
/* Separador tenue entre las dos, en lugar de que una tape a la otra. */
body.imnew .pin-stack #vision { border-top: 1px solid rgba(255,255,255,.10); }

/* .mv-card es el mismo nodo que .split: ahora sólo maquetación, sin vidrio. */
body.imnew .mv-card {
  padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none;
  -webkit-backdrop-filter: none; backdrop-filter: none;
  grid-template-columns: 1.15fr 1fr; align-items: center;
}
body.imnew .mv-card::before { content: none; }

/* La foto en su propia proporción, no estirada a la altura del texto. */
body.imnew .mv-card .split__media-wrap {
  min-height: 0; aspect-ratio: 4 / 3; height: auto;
  border-radius: 22px;
  box-shadow: 0 30px 70px rgba(0,0,0,.45), 0 0 0 1px rgba(255,255,255,.10);
}
body.imnew .mv-card h2, body.imnew .mv-card h3 { color: #fff; }
body.imnew .mv-card .eyebrow { color: var(--aqua); }
body.imnew .mv-card .split__text { max-width: 58ch; }
body.imnew .mv-card .split__text p { color: rgba(255,255,255,.84); }

/* Cita bíblica como componente, en vez de estilos inline. */
body.imnew .mv-quote {
  margin: 0 0 .35em; padding: 0; border: 0;
  font-family: var(--font-head); font-weight: 600; font-style: italic;
  color: var(--aqua); font-size: clamp(1.15rem, 2.4vw, 1.5rem); line-height: 1.45;
}
body.imnew .mv-ref {
  margin: 0 0 1.5em; text-transform: uppercase; letter-spacing: .16em;
  font-size: .78rem; font-weight: 700; color: rgba(255,255,255,.6);
}

@media (max-width: 860px) {
  body.imnew .mv-card { grid-template-columns: 1fr; }
}

/* Split photo wrapper — clips the scaled image so it can parallax within */
.split__media-wrap {
  width: 100%; height: 100%; min-height: 440px; overflow: hidden;
  border-radius: var(--radius); box-shadow: var(--shadow-md);
}
.split__media-wrap .split__media {
  width: 100%; height: 100%; min-height: 0; object-fit: cover; display: block;
  border-radius: 0; box-shadow: none; transform: scale(1.16); will-change: transform;
}
@media (max-width: 820px) {
  /* The hero's content is centered in a min-height:100vh box, and with the
     wave divider removed on this page (see above), the last button ended up
     flush against the next section's edge — this guarantees breathing room
     below it regardless of how tall the centered content stack gets. */
  body.imnew .hero { padding-bottom: 56px; }
  body.imnew .section { min-height: 0; }        /* stacked content flows naturally on mobile */
  body.imnew .pin-stack #mission,
  body.imnew .pin-stack #vision { position: static; }   /* no pinning on mobile */
  body.imnew .pin-stack .section { min-height: 0; }
  .split__media-wrap { min-height: 0; aspect-ratio: 16 / 9; }
}
@media (prefers-reduced-motion: reduce) {
  .split__media-wrap .split__media { transform: none; }
}

/* ============================================================
   "Next" page — full-height segments
   ============================================================ */
/* Unlike body.ministry's hero (which centers vertically, same as its
   sections), this one never did — short content (no buttons, before they
   were added) just sat under the top padding with all the leftover 100vh
   dumped below it as dead space. Centering alone left the opposite problem:
   .hero's own default padding-top (110px, meant to clear the sticky header
   for non-centered layouts) doesn't shrink away once centered — it just
   stacks on top of the centering, pushing content low enough to leave a
   lopsided gap up top. body.ministry avoids this the same way: swap that
   110px for a small even padding and take the header's height off the
   centering box instead (--hdr), so the box being centered is exactly the
   visible viewport under the header. */
body.nextpage { --hdr: 84px; }
body.nextpage .hero {
  display: flex; align-items: center;
  min-height: calc(70vh - var(--hdr));
  min-height: calc(70svh - var(--hdr));
  padding: 48px 0;
}
body.nextpage .wave { display: none; }   /* remove the wave divider */
body.nextpage .hero__inner { margin-inline: auto; text-align: center; align-items: center; }
body.nextpage .hero__actions { justify-content: center; }
/* Sections size to their content (same staff review as the ministry pages) */
body.nextpage .section { min-height: 0; display: block; }

/* ── Fotos de la página I'm New ───────────────────────────────────────
   Regla del bloque: NADA se recorta. Cada imagen va con height:auto en
   su proporción original. El set mezcla 16:9 horizontales con 9:16
   verticales, así que cualquier caja de proporción fija (bandas, tiles)
   necesariamente recortaba a unas o a otras — que fue el problema del
   intento anterior, donde las bandas mostraban entre 52% y 71%.        */
.photo-feature { margin: 0; }
.photo-feature img {
  display: block; width: 100%; height: auto;
  border-radius: 20px; box-shadow: var(--shadow-md);
}
.photo-feature figcaption {
  margin-top: 14px; font-size: .92rem; color: var(--muted);
}
.section--dark .photo-feature figcaption { color: rgba(255,255,255,.72); }

/* Muro tipo masonry con columnas CSS: cada foto conserva su alto
   natural, así que horizontales y verticales conviven sin recorte. */
.photo-wall { columns: 3; column-gap: 16px; }
.photo-wall figure { break-inside: avoid; margin: 0 0 16px; }
.photo-wall img {
  display: block; width: 100%; height: auto;
  border-radius: 14px; box-shadow: var(--shadow-sm);
}

@media (max-width: 900px) { .photo-wall { columns: 2; } }
@media (max-width: 560px) { .photo-wall { columns: 1; } .photo-feature img { border-radius: 14px; } }

/* Collapsed state: show only the first 8 photos until "Show more" is clicked
   (js/main.js removes the modifier class and the button on click). */
.photo-wall--collapsible figure:nth-child(n+9) { display: none; }
.photo-wall-group__more { display: flex; justify-content: center; margin-top: 22px; }

/* Site search button styles live in site-chrome.css now (it's part of the
   shared header, injected everywhere by js/site-chrome.js — including
   watch/index.html, which doesn't load this file at all). */

.ss[hidden] { display: none; }
.ss { position: fixed; inset: 0; z-index: 1200; display: flex; justify-content: center; }
.ss__backdrop {
  position: absolute; inset: 0; background: rgba(2,12,20,.72);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.ss__panel {
  position: relative; z-index: 1; width: min(680px, 94vw);
  margin-top: min(12vh, 110px); align-self: flex-start;
  background: #fff; border-radius: 18px; overflow: hidden;
  box-shadow: 0 40px 90px rgba(0,0,0,.45);
  display: flex; flex-direction: column; max-height: 74vh;
}
.ss__bar {
  display: flex; align-items: center; gap: 12px;
  padding: 16px 18px; border-bottom: 1px solid #e8eef2;
}
.ss__icon { width: 20px; height: 20px; flex: none; color: #5a6b78; }
.ss__input {
  flex: 1; min-width: 0; border: 0; outline: 0; background: none;
  font: inherit; font-size: 1.05rem; color: #0a2540;
}
.ss__input::placeholder { color: #9bacb8; }
.ss__close {
  border: 0; background: none; cursor: pointer; font-size: 26px; line-height: 1;
  color: #8a9aa6; padding: 0 4px;
}
.ss__close:hover { color: #0a2540; }

.ss__status { margin: 0; padding: 18px; color: #5a6b78; font-size: .94rem; }
.ss__results { overflow-y: auto; }
.ss__hit {
  display: block; padding: 14px 18px; border-bottom: 1px solid #f1f5f7;
  text-decoration: none; color: inherit;
}
.ss__hit:last-child { border-bottom: 0; }
.ss__hit:hover, .ss__hit.is-active { background: #f2f8fa; text-decoration: none; }
.ss__hit-page {
  display: block; font-size: .7rem; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: #0fa3a3;
}
.ss__hit-title { display: block; font-weight: 650; color: #0a2540; margin-top: 3px; }
.ss__hit-text { display: block; font-size: .88rem; color: #5a6b78; margin-top: 4px; line-height: 1.45; }
.ss__hit mark { background: #d8f1f1; color: inherit; padding: 0 1px; border-radius: 2px; }

.ss__group {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  margin: 0; padding: 10px 18px; background: #f7fbfc;
  border-top: 1px solid #eef3f6; border-bottom: 1px solid #eef3f6;
  font-size: .7rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: #5a6b78;
}
.ss__results > .ss__group:first-child { border-top: 0; }
.ss__group-all { font-size: .7rem; font-weight: 700; color: #0fa3a3; text-decoration: none; letter-spacing: .06em; }
.ss__group-all:hover { text-decoration: underline; }

.ss__hint {
  margin: 0; padding: 10px 18px; border-top: 1px solid #eef3f6;
  font-size: .76rem; color: #8a9aa6;
}
.ss__hint kbd {
  font: inherit; background: #f1f5f7; border: 1px solid #e0e8ed;
  border-radius: 4px; padding: 1px 5px; margin: 0 1px;
}
/* Empty state — before anything's typed (or after clearing), the results
   list is just blank. Only shows when there's no status message either
   (a "No results for…" already covers the no-matches case). */
.ss__status[hidden] + .ss__results:empty::before {
  content: "Start typing to search pages, sermons, and more.";
  display: block; padding: 15vh 28px 24px; text-align: center;
  color: #9bacb8; font-size: .95rem;
}
html.ss-open { overflow: hidden; }

@media (max-width: 860px) {
  .ss__panel { margin-top: 0; width: 100vw; max-height: 100vh; border-radius: 0; height: 100%; }
  /* Keyboard hints (Esc/↑↓/Enter) don't apply on touch — drop the row. */
  .ss__hint { display: none; }
  /* The "×" alone read as easy to miss full-screen — bigger target, visible
     as a button rather than a stray character. */
  .ss__close {
    width: 40px; height: 40px; margin: -6px -6px -6px 0; border-radius: 50%;
    background: #f1f5f7; font-size: 22px;
  }
  .ss__close:hover { background: #e5edf1; }
}
@media (prefers-color-scheme: dark) {
  .ss__panel { background: #12283a; }
  .ss__bar { border-bottom-color: #203645; }
  .ss__input { color: #eaf3f9; }
  .ss__hit { border-bottom-color: #1b3547; }
  .ss__hit:hover, .ss__hit.is-active { background: #1b3547; }
  .ss__hit-title { color: #eaf3f9; }
  .ss__hit-text, .ss__status, .ss__hint { color: #9fb2c0; }
  .ss__hit mark { background: #17575c; color: #eaf3f9; }
  .ss__hint { border-top-color: #203645; }
  .ss__group { background: #0f2231; border-color: #203645; color: #9fb2c0; }
  .ss__hint kbd { background: #1b3547; border-color: #203645; }
  .ss__status[hidden] + .ss__results:empty::before { color: #6f8494; }
}
@media (max-width: 860px) and (prefers-color-scheme: dark) {
  .ss__close { background: #1b3547; }
  .ss__close:hover { background: #23415a; }
}
