/* ==========================================================================
   Creative Church College — styles.css
   --------------------------------------------------------------------------
   Foundation stylesheet. Organized in sections:
     1. Design tokens (:root)
     2. Modern CSS reset
     3. Base typography
     4. Layout primitives (.container, sections, rhythm)
     5. Buttons (.btn, .btn-primary, .btn-secondary)
     6. Media placeholders (.media-ph + 5 variants)
     7. Site header (sticky; overlay + scrolled states; responsive nav)
     8. Site footer (navy, 3-col grid -> stacked)
     9. Utilities
    10. Home page (hero, scripture, why, quick-links, formation,
        curriculum, leadership, testimonials carousel, partners, CTA)

   Fonts are loaded in HTML <head> via Google Fonts:
     <link rel="preconnect" href="https://fonts.googleapis.com">
     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
     <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
   ========================================================================== */

/* ==========================================================================
   1. DESIGN TOKENS
   Hex values sampled directly from assets/logos/CCC-Color_Palette.png
   ========================================================================== */
:root {
  /* Primary */
  --navy:        #19212B;  /* text, dark sections */
  --indigo:      #55479D;  /* sparing accent */

  /* Secondary */
  --taupe:       #5F5652;
  --blush:       #F0E8E4;
  --clay:        #C68C78;  /* sparing warm accent */

  /* Accent */
  --cream:       #F1EAD9;  /* page background */
  --offwhite:    #F8F4EC;  /* contrast blocks */
  --bronze:      #9C7A4B;  /* primary buttons, dividers, the "bowl" mark */
  --gold:        #C9A95F;  /* hover / highlight */
  --white:       #FFFFFF;

  /* Semantic aliases */
  --bg:          var(--cream);
  --text:        var(--navy);
  --text-muted:  var(--taupe);
  --rule:        rgba(156, 122, 75, 0.28);   /* bronze @ low alpha — hairline dividers */

  /* Typography */
  --font-display: 'Cormorant Garamond', Georgia, 'Times New Roman', serif;
  --font-body:    'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif;

  /* Fluid type scale (1.250 major-third-ish, fluid via clamp) */
  --fs-xs:   0.8125rem;                                   /* 13px  — eyebrow / labels */
  --fs-sm:   0.9375rem;                                   /* 15px  — fine print */
  --fs-base: clamp(1rem, 0.96rem + 0.20vw, 1.125rem);     /* 16–18 — body */
  --fs-lg:   clamp(1.125rem, 1.05rem + 0.38vw, 1.375rem); /* 18–22 — lead */
  --fs-h4:   clamp(1.375rem, 1.25rem + 0.6vw, 1.75rem);
  --fs-h3:   clamp(1.75rem, 1.5rem + 1.1vw, 2.5rem);
  --fs-h2:   clamp(2.25rem, 1.8rem + 2.1vw, 3.5rem);
  --fs-h1:   clamp(2.85rem, 2.1rem + 3.6vw, 5.25rem);

  --lh-tight:   1.08;
  --lh-snug:    1.2;
  --lh-body:    1.65;

  --tracking-eyebrow: 0.22em;
  --tracking-wide:    0.04em;

  /* Spacing scale (rem-based, harmonic) */
  --space-2:  0.5rem;
  --space-3:  0.75rem;
  --space-4:  1rem;
  --space-6:  1.5rem;
  --space-8:  2rem;
  --space-12: 3rem;
  --space-16: 4rem;
  --space-20: 5rem;
  --space-24: 6rem;
  --section-y: clamp(4rem, 3rem + 6vw, 8.5rem);   /* generous section rhythm */

  /* Layout */
  --maxw:   1200px;
  --gutter: clamp(1.25rem, 0.5rem + 4vw, 4rem);
  --radius: 4px;
  --radius-lg: 8px;

  /* Shadows — soft, warm-tinted */
  --shadow-sm: 0 1px 2px rgba(25, 33, 43, 0.06);
  --shadow-md: 0 12px 32px -12px rgba(25, 33, 43, 0.18);
  --shadow-lg: 0 28px 64px -24px rgba(25, 33, 43, 0.28);

  /* Motion */
  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
  --dur:  0.28s;
}

/* ==========================================================================
   2. MODERN CSS RESET
   ========================================================================== */
*,
*::before,
*::after { box-sizing: border-box; }

* { margin: 0; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* Offset for the fixed overlay header so non-click navigation
     (deep links, refresh-on-hash) doesn't land under the header. */
  scroll-padding-top: 6rem;
}

body {
  min-height: 100vh;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

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

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

button { background: none; border: none; cursor: pointer; }

p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }

ul[role="list"], ol[role="list"] { list-style: none; padding: 0; }

a { color: inherit; }

:focus-visible {
  outline: 2px solid var(--bronze);
  outline-offset: 3px;
  border-radius: 2px;
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* ==========================================================================
   3. BASE TYPOGRAPHY
   ========================================================================== */
body {
  font-family: var(--font-body);
  font-size: var(--fs-base);
  line-height: var(--lh-body);
  font-weight: 400;
  color: var(--text);
  background-color: var(--bg);
  /* faint warm grain/atmosphere via layered radial washes */
  background-image:
    radial-gradient(120% 80% at 100% 0%, rgba(201, 169, 95, 0.06), transparent 55%),
    radial-gradient(90% 70% at 0% 100%, rgba(198, 140, 120, 0.05), transparent 55%);
  background-attachment: fixed;
}

h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: 600;
  line-height: var(--lh-tight);
  letter-spacing: -0.01em;
  color: var(--text);
  text-wrap: balance;
}

h1 { font-size: var(--fs-h1); font-weight: 500; line-height: var(--lh-tight); }
h2 { font-size: var(--fs-h2); }
h3 { font-size: var(--fs-h3); line-height: var(--lh-snug); }
h4 { font-size: var(--fs-h4); line-height: var(--lh-snug); }

/* Italic emphasis echoes the logo wordmark ("College" set in italic) */
h1 em, h2 em, h3 em, .display-em {
  font-style: italic;
  font-weight: 500;
  color: var(--bronze);
}

p { max-width: 68ch; text-wrap: pretty; }
.lead { font-size: var(--fs-lg); color: var(--text-muted); line-height: 1.55; }

a { text-decoration: none; transition: color var(--dur) var(--ease); }

strong, b { font-weight: 600; }

/* Eyebrow / kicker label — small caps tracking above headings */
.eyebrow {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--tracking-eyebrow);
  color: var(--bronze);
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
}
/* small bronze tick that precedes an eyebrow when given the mark */
.eyebrow--mark::before {
  content: "";
  width: 1.75rem;
  height: 1px;
  background: var(--bronze);
  display: inline-block;
}

/* ==========================================================================
   4. LAYOUT PRIMITIVES
   ========================================================================== */
.container {
  width: 100%;
  max-width: var(--maxw);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

/* a narrower measure for prose-heavy blocks */
.container--narrow { max-width: 760px; }

/* Section vertical rhythm — generous, invitational whitespace */
.section { padding-block: var(--section-y); }
.section--tight { padding-block: clamp(2.5rem, 2rem + 3vw, 4.5rem); }

/* Tonal section variants */
.section--cream    { background-color: var(--cream); }
.section--offwhite { background-color: var(--offwhite); }
.section--navy {
  background-color: var(--navy);
  color: var(--blush);
}
.section--navy h1,
.section--navy h2,
.section--navy h3,
.section--navy h4 { color: var(--offwhite); }
.section--navy .lead { color: rgba(240, 232, 228, 0.72); }
.section--navy .eyebrow { color: var(--gold); }
.section--navy .eyebrow--mark::before { background: var(--gold); }

/* Hairline divider in the brand bronze */
.rule {
  border: 0;
  height: 1px;
  background: var(--rule);
  margin-block: var(--space-12);
}

/* ==========================================================================
   5. BUTTONS
   Primary  = bronze fill, offwhite text, gold on hover
   Secondary = text-link with bronze underline-on-hover (parent-church restraint)
   ========================================================================== */
.btn {
  --_btn-bg: var(--bronze);
  --_btn-fg: var(--offwhite);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: var(--tracking-wide);
  line-height: 1;
  text-transform: uppercase;
  padding: 1.05em 1.9em;
  border-radius: var(--radius);
  cursor: pointer;
  transition:
    background-color var(--dur) var(--ease),
    color var(--dur) var(--ease),
    transform var(--dur) var(--ease),
    box-shadow var(--dur) var(--ease);
  will-change: transform;
}

.btn-primary {
  background-color: var(--_btn-bg);
  color: var(--_btn-fg);
  box-shadow: var(--shadow-sm);
}
.btn-primary:hover {
  background-color: var(--gold);
  color: var(--navy);
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}
.btn-primary:active { transform: translateY(0); box-shadow: var(--shadow-sm); }

/* On navy sections the primary button keeps its bronze→gold logic but reads brighter */
.section--navy .btn-primary { color: var(--offwhite); }
.section--navy .btn-primary:hover { color: var(--navy); }

/* Secondary = quiet text-link; bronze underline grows in on hover */
.btn-secondary {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: var(--tracking-wide);
  text-transform: uppercase;
  color: var(--navy);
  padding: 0.25em 0;
  background-image: linear-gradient(var(--bronze), var(--bronze));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 0% 1.5px;
  transition: background-size var(--dur) var(--ease), color var(--dur) var(--ease);
}
.btn-secondary:hover { background-size: 100% 1.5px; color: var(--bronze); }
.section--navy .btn-secondary { color: var(--offwhite); }
.section--navy .btn-secondary:hover { color: var(--gold); }
.section--navy .btn-secondary { background-image: linear-gradient(var(--gold), var(--gold)); }

/* ==========================================================================
   6. MEDIA PLACEHOLDERS
   Bronze-dashed cream/offwhite box with centered muted label.
   Every slot is obvious & trivial to swap. Variants control aspect/scale.
   ========================================================================== */
.media-ph {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  width: 100%;
  aspect-ratio: 16 / 9;             /* default; variants override */
  padding: var(--space-6);
  background-color: var(--offwhite);
  /* subtle diagonal weave so placeholders read as "to be filled" */
  background-image:
    repeating-linear-gradient(
      135deg,
      transparent 0,
      transparent 14px,
      rgba(156, 122, 75, 0.045) 14px,
      rgba(156, 122, 75, 0.045) 15px
    );
  border: 2px dashed var(--bronze);
  border-radius: var(--radius-lg);
  color: var(--taupe);
  overflow: hidden;
}

.media-ph > span {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  line-height: 1.5;
  color: var(--taupe);
  max-width: 32ch;
}

/* corner registration ticks for a "placeholder spec sheet" feel */
.media-ph::before,
.media-ph::after {
  content: "";
  position: absolute;
  width: 14px;
  height: 14px;
  border: 2px solid var(--bronze);
  opacity: 0.5;
}
.media-ph::before { top: 10px;    left: 10px;  border-right: 0; border-bottom: 0; }
.media-ph::after  { bottom: 10px; right: 10px; border-left: 0;  border-top: 0; }

/* --- variants --- */

/* Hero: full-bleed, tall, slightly darker so overlaid text would be legible */
.media-ph--hero {
  aspect-ratio: auto;
  min-height: clamp(22rem, 60vh, 44rem);
  border-radius: 0;
  background-color: var(--blush);
}

/* Wide: standard 16:9 (explicit for clarity) */
.media-ph--wide { aspect-ratio: 16 / 9; }

/* Portrait: 3:4 headshots */
.media-ph--portrait { aspect-ratio: 3 / 4; }

/* Square: 1:1 */
.media-ph--square { aspect-ratio: 1 / 1; }

/* Video: 16:9 with a centered play-icon hint */
.media-ph--video {
  aspect-ratio: 16 / 9;
  background-color: var(--blush);
}
/* push the caption below the centered play hint */
.media-ph--video > span { position: relative; z-index: 2; margin-top: 6rem; }
/* ::before = the ring, ::after = the play triangle (overrides default corner ticks) */
.media-ph--video::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -80%);
  width: 4.25rem;
  height: 4.25rem;
  border: 2px solid var(--bronze);
  border-radius: 50%;
  background: rgba(248, 244, 236, 0.6);
  opacity: 0.9;
}
.media-ph--video::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 0;
  height: 0;
  border-top: 0.78rem solid transparent;
  border-bottom: 0.78rem solid transparent;
  border-left: 1.25rem solid var(--bronze);
  border-right: 0;
  transform: translate(-30%, -80%);
  opacity: 0.95;
}

/* ==========================================================================
   7. SITE HEADER
   Sticky top bar with two visual states:
     • Overlay  (.site-header--overlay)  — sits over a dark hero; white logo,
       light nav text, transparent background. Set on pages WITH a dark hero.
     • Scrolled (.site-header--scrolled) — solid offwhite bar, navy nav text,
       Tan logo. Toggled by JS (initHeaderScroll) once the page is scrolled.
   Logo swap is CSS-only: both horizontal logos are in the DOM; we fade the
   White one in overlay state and the Tan one otherwise.
   ========================================================================== */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-6);
  padding-block: var(--space-4);
  padding-inline: var(--gutter);
  background-color: var(--offwhite);
  border-bottom: 1px solid var(--rule);
  transition:
    background-color var(--dur) var(--ease),
    border-color var(--dur) var(--ease),
    box-shadow var(--dur) var(--ease),
    padding-block var(--dur) var(--ease);
}

/* --- Brand / logo lockup ---
   Both horizontal logos are stacked in one grid cell so the opacity swap
   between overlay/solid states causes no layout shift. */
.brand {
  display: inline-grid;
  align-items: center;
  flex-shrink: 0;
  line-height: 0;
}
.brand-logo {
  grid-area: 1 / 1;
  height: clamp(2.1rem, 1.8rem + 1vw, 2.75rem);
  width: auto;
  transition: opacity var(--dur) var(--ease), height var(--dur) var(--ease);
}
/* By default (solid bar): show the Tan logo, hide the White one. */
.brand-logo--light { opacity: 0; }
.brand-logo--dark  { opacity: 1; }

/* --- Navigation --- */
.site-nav {
  display: flex;
  align-items: center;
  gap: clamp(var(--space-6), 2.2vw, var(--space-12));
}
.site-nav > a {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 500;
  letter-spacing: var(--tracking-wide);
  color: var(--navy);
  position: relative;
  padding-block: 0.35em;
}
/* underline grows from the link's start on hover/focus */
.site-nav > a:not(.btn)::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -2px;
  height: 1.5px;
  width: 100%;
  background: var(--bronze);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--dur) var(--ease);
}
.site-nav > a:not(.btn):hover,
.site-nav > a:not(.btn):focus-visible { color: var(--bronze); }
.site-nav > a:not(.btn):hover::after,
.site-nav > a:not(.btn):focus-visible::after { transform: scaleX(1); }

/* Active page — "you are here": persistent bronze underline + bolder weight. */
.site-nav > a:not(.btn)[aria-current="page"] { font-weight: 600; color: var(--bronze); }
.site-nav > a:not(.btn)[aria-current="page"]::after { transform: scaleX(1); }

/* the Apply button stays a bronze .btn .btn-primary; keep it compact in the bar */
.site-nav .btn-primary { padding: 0.85em 1.5em; }

/* --- Hamburger (mobile only) --- */
.nav-toggle {
  display: none;
  font-size: 1.6rem;
  line-height: 1;
  color: var(--navy);
  padding: 0.25em 0.4em;
  border-radius: var(--radius);
  transition: color var(--dur) var(--ease);
}

/* ----------------------------------------------------------------------
   OVERLAY STATE — header floats over a dark hero (homepage default)
   ---------------------------------------------------------------------- */
.site-header--overlay {
  /* fixed positioning is declared once, below, for both overlay states */
  background-color: transparent;
  border-bottom-color: transparent;
  /* gentle top scrim so light nav stays legible over busy imagery */
  background-image: linear-gradient(
    to bottom,
    rgba(25, 33, 43, 0.45),
    rgba(25, 33, 43, 0)
  );
}
.site-header--overlay .brand-logo--light { opacity: 1; }
.site-header--overlay .brand-logo--dark  { opacity: 0; }
.site-header--overlay .site-nav > a { color: var(--offwhite); }
.site-header--overlay .site-nav > a:not(.btn):hover,
.site-header--overlay .site-nav > a:not(.btn):focus-visible { color: var(--gold); }
.site-header--overlay .site-nav > a:not(.btn)::after { background: var(--gold); }
.site-header--overlay .site-nav > a:not(.btn)[aria-current="page"] { color: var(--gold); }
.site-header--overlay .nav-toggle { color: var(--offwhite); }

/* ----------------------------------------------------------------------
   SCROLLED STATE — solid bar (JS toggles this once scrolled past threshold).
   Overrides the overlay state so the same markup transitions smoothly.

   Positioning note: the default .site-header is `position: sticky`, which
   reserves layout space. Only OVERLAY headers are taken out of flow
   (`position: fixed`) because they float over a full-bleed hero that has no
   reserved space for them. A plain (non-overlay) header must stay STICKY in
   its scrolled state too — otherwise flipping sticky->fixed mid-scroll would
   yank the page content upward by the header's height. So the solid-bar
   *styling* (background / shadow / padding) applies to any scrolled header,
   but the fixed *positioning* is scoped to .site-header--overlay only.
   ---------------------------------------------------------------------- */
.site-header--scrolled {
  background-color: var(--offwhite);
  background-image: none;
  border-bottom-color: var(--rule);
  box-shadow: var(--shadow-md);
  padding-block: var(--space-3);
}
/* Only overlay headers leave the flow — in both their transparent and
   scrolled states — since the hero underneath reserves no space for them. */
.site-header--overlay,
.site-header--overlay.site-header--scrolled {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
}
.site-header--scrolled .brand-logo--light { opacity: 0; }
.site-header--scrolled .brand-logo--dark  { opacity: 1; }
.site-header--scrolled .site-nav > a { color: var(--navy); }
.site-header--scrolled .site-nav > a:not(.btn):hover,
.site-header--scrolled .site-nav > a:not(.btn):focus-visible { color: var(--bronze); }
.site-header--scrolled .site-nav > a:not(.btn)::after { background: var(--bronze); }
.site-header--scrolled .nav-toggle { color: var(--navy); }

/* ----------------------------------------------------------------------
   RESPONSIVE NAV  (< 768px): hamburger + collapsible panel
   ---------------------------------------------------------------------- */
@media (max-width: 767.98px) {
  .nav-toggle { display: inline-flex; }

  .site-nav {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    padding: var(--space-4) var(--gutter) var(--space-6);
    background-color: var(--offwhite);
    border-bottom: 1px solid var(--rule);
    box-shadow: var(--shadow-md);
    /* collapsed by default */
    transform-origin: top;
    transform: scaleY(0);
    opacity: 0;
    visibility: hidden;
    transition:
      transform var(--dur) var(--ease),
      opacity var(--dur) var(--ease),
      visibility var(--dur) var(--ease);
  }
  .site-nav.is-open {
    transform: scaleY(1);
    opacity: 1;
    visibility: visible;
  }

  /* inside the panel, nav text is always navy regardless of header state */
  .site-nav > a,
  .site-header--overlay .site-nav > a,
  .site-header--scrolled .site-nav > a {
    color: var(--navy);
    padding-block: var(--space-3);
    border-bottom: 1px solid var(--rule);
  }
  .site-nav > a:not(.btn)::after { display: none; }

  .site-nav .btn-primary {
    margin-top: var(--space-4);
    width: 100%;
    padding: 1em 1.5em;
  }
}

/* ==========================================================================
   8. SITE FOOTER
   Navy block, white vertical logo, 3-col grid that stacks on mobile.
   Light links with a gold hover; quiet legal line.
   ========================================================================== */
.site-footer {
  background-color: var(--navy);
  color: var(--blush);
  padding-block: var(--section-y) var(--space-12);
  padding-inline: var(--gutter);
  /* faint warm wash echoing the body atmosphere */
  background-image:
    radial-gradient(80% 120% at 0% 0%, rgba(201, 169, 95, 0.08), transparent 55%),
    radial-gradient(70% 100% at 100% 100%, rgba(198, 140, 120, 0.06), transparent 55%);
}

.footer-grid {
  max-width: var(--maxw);
  margin-inline: auto;
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr;
  gap: clamp(var(--space-8), 4vw, var(--space-20));
  align-items: start;
}

/* --- Brand column --- */
.footer-brand { max-width: 22rem; }
.footer-logo {
  height: clamp(5.5rem, 4.5rem + 4vw, 7.5rem);
  width: auto;
}
.footer-scripture {
  margin-top: var(--space-6);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-lg);
  line-height: 1.4;
  color: var(--gold);
}

/* --- Link columns --- */
.footer-col {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.footer-col h4 {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--tracking-eyebrow);
  color: var(--gold);
  margin-bottom: var(--space-2);
}
.footer-col a {
  color: rgba(240, 232, 228, 0.78);
  font-size: var(--fs-sm);
  width: fit-content;
  transition: color var(--dur) var(--ease);
}
.footer-col a:hover,
.footer-col a:focus-visible { color: var(--gold); }
/* Active page "you are here" affordance in the footer Explore nav. */
.footer-col a[aria-current="page"] {
  color: var(--gold);
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 0.3em;
}

/* --- Social placeholder row (future: Instagram / YouTube / Facebook) --- */
.footer-social { margin-top: var(--space-4); }
.footer-social__label {
  display: block;
  font-size: var(--fs-xs);
  letter-spacing: var(--tracking-wide);
  color: rgba(240, 232, 228, 0.55);
  margin-bottom: var(--space-3);
}
.footer-social__icons { display: inline-flex; gap: var(--space-3); }
.footer-social__chip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.25rem;
  height: 2.25rem;
  border: 1px solid rgba(201, 169, 95, 0.5);
  border-radius: 50%;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--gold);
  transition: background-color var(--dur) var(--ease), color var(--dur) var(--ease);
}
.footer-social__chip:hover {
  background-color: var(--gold);
  color: var(--navy);
}

/* --- Legal line --- */
.footer-legal {
  max-width: var(--maxw);
  margin-inline: auto;
  margin-top: var(--space-16);
  padding-top: var(--space-6);
  border-top: 1px solid rgba(240, 232, 228, 0.12);
  font-size: var(--fs-xs);
  letter-spacing: var(--tracking-wide);
  color: rgba(240, 232, 228, 0.5);
}

@media (max-width: 767.98px) {
  .footer-grid { grid-template-columns: 1fr; }
  .footer-brand { max-width: none; }
}

/* ==========================================================================
   9. UTILITIES
   ========================================================================== */
.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0);
  white-space: nowrap; border: 0;
}

/* Skip link — hidden offscreen until focused, then pinned visibly top-left
   above the (z-index:100) header. Bronze on navy for clear contrast. */
.skip-link {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 1000;
  transform: translateY(-200%);   /* fully clear the top edge — margin below was letting the bronze border peek */
  margin: var(--space-3);
  padding: 0.65em 1.1em;
  background-color: var(--navy);
  color: var(--offwhite);
  border: 2px solid var(--bronze);
  border-radius: var(--radius);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: var(--tracking-wide);
  transition: transform var(--dur) var(--ease);
}
.skip-link:focus {
  transform: translateY(0);
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}

.text-center { text-align: center; }
.mx-auto    { margin-inline: auto; }
.mt-6  { margin-top: var(--space-6); }
.mt-8  { margin-top: var(--space-8); }
.mt-12 { margin-top: var(--space-12); }

/* Scroll-reveal: elements fade/slide in when scrolled into view.
   Robustness: content is VISIBLE by default. It is only hidden when the <html>
   element carries the `js` class (set at the top of main.js) AND motion is
   allowed. So: no JS, JS failure, or reduced-motion => everything is visible.
   JS adds `.is-visible` (via IntersectionObserver) to animate elements in. */
@media (prefers-reduced-motion: no-preference) {
  .js .reveal {
    opacity: 0;
    transform: translateY(14px);
    transition:
      opacity 0.8s var(--ease),
      transform 0.8s var(--ease);
    transition-delay: var(--reveal-delay, 0s);
    will-change: opacity, transform;
  }
  .js .reveal.is-visible {
    opacity: 1;
    transform: none;
  }
}

/* Stagger delays — reusable classes replacing inline animation-delay styles. */
.reveal--d1 { --reveal-delay: 0.08s; }
.reveal--d2 { --reveal-delay: 0.16s; }
.reveal--d3 { --reveal-delay: 0.24s; }

/* ==========================================================================
   10. HOME PAGE
   --------------------------------------------------------------------------
   Sections in document order:
     10.1  Hero (full-bleed)
     10.2  Scripture band
     10.3  Why we exist
     10.4  Quick-link cards
     10.5  Formation columns (grow / good fit)
     10.6  Curriculum grid
     10.7  Leadership + contributing lecturers
     10.8  Testimonials carousel
     10.9  Accreditation partners
     10.10 CTA band
   ========================================================================== */

/* eyebrow on dark imagery (hero) reads gold for contrast */
.eyebrow--on-dark { color: var(--gold); }
.eyebrow--on-dark.eyebrow--mark::before { background: var(--gold); }
.btn-secondary--on-dark {
  color: var(--offwhite);
  background-image: linear-gradient(var(--gold), var(--gold));
}
.btn-secondary--on-dark:hover { color: var(--gold); }

/* --------------------------------------------------------------------------
   10.1  HERO
   Full-bleed media with a layered scrim; content pinned bottom-left, editorial.
   The fixed overlay header floats over this, so we add top padding via flow.
   -------------------------------------------------------------------------- */
.hero-shell {
  position: relative;
  isolation: isolate;
  min-height: clamp(34rem, 92vh, 56rem);
  display: flex;
  align-items: flex-end;
  overflow: hidden;
}
.hero-media {
  position: absolute;
  inset: 0;
  z-index: -2;
  min-height: 100%;
  border-radius: 0;
}
/* video background fills + crops to the hero box */
.hero-video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}
/* dual scrim: bottom-up for text legibility + a faint warm vignette */
.hero-overlay {
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(to top, rgba(25, 33, 43, 0.82) 0%, rgba(25, 33, 43, 0.42) 38%, rgba(25, 33, 43, 0.30) 64%, rgba(25, 33, 43, 0.46) 100%),
    radial-gradient(120% 90% at 80% 10%, rgba(156, 122, 75, 0.28), transparent 60%);
}
.hero-inner {
  padding-block: clamp(3rem, 6vw, 6rem) clamp(4rem, 8vw, 7rem);
  max-width: 1100px;
}
.hero-title {
  color: var(--white);
  font-size: var(--fs-h1);
  font-weight: 500;
  letter-spacing: -0.015em;
  max-width: 16ch;
  margin-top: var(--space-4);
  text-shadow: 0 2px 24px rgba(25, 33, 43, 0.35);
}
.hero-title em { color: var(--gold); }
.hero-sub {
  color: rgba(248, 244, 236, 0.92);
  font-size: var(--fs-lg);
  font-family: var(--font-body);
  margin-top: var(--space-6);
  max-width: 46ch;
  text-shadow: 0 1px 12px rgba(25, 33, 43, 0.35);
}
.hero-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-6) var(--space-8);
  margin-top: var(--space-8);
}
/* scroll cue — a thin dropping line, bottom center */
.hero-scroll {
  position: absolute;
  bottom: var(--space-6);
  left: 50%;
  transform: translateX(-50%);
  z-index: 1;
  display: grid;
  place-items: center;
  width: 2rem;
  height: 3rem;
}
.hero-scroll__line {
  width: 1px;
  height: 2.25rem;
  background: linear-gradient(to bottom, rgba(248,244,236,0.1), var(--gold));
}
@media (prefers-reduced-motion: no-preference) {
  .hero-scroll__line { animation: hero-scroll-pulse 2.4s var(--ease) infinite; transform-origin: top; }
  @keyframes hero-scroll-pulse {
    0%, 100% { transform: scaleY(0.5); opacity: 0.45; }
    50%      { transform: scaleY(1);   opacity: 1; }
  }
}

/* --------------------------------------------------------------------------
   10.2  SCRIPTURE BAND
   -------------------------------------------------------------------------- */
.scripture-band {
  background-color: var(--navy);
  color: var(--gold);
  text-align: center;
  padding-block: var(--space-6);
  padding-inline: var(--gutter);
  border-bottom: 1px solid rgba(201, 169, 95, 0.18);
}
.scripture-band__refs {
  max-width: none;
  margin-inline: auto;
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-lg);
  letter-spacing: 0.02em;
  display: inline-flex;
  align-items: center;
  gap: var(--space-6);
  color: var(--gold);
}
.scripture-band__sep { opacity: 0.55; font-style: normal; }

/* --------------------------------------------------------------------------
   10.3  WHY WE EXIST  (asymmetric editorial split)
   -------------------------------------------------------------------------- */
.why-grid {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
  gap: clamp(var(--space-8), 5vw, var(--space-24));
  align-items: start;
}
.why-heading {
  font-size: var(--fs-h2);
  margin-top: var(--space-4);
  line-height: 1.05;
}
.why-mission { color: var(--text); max-width: 60ch; }
.why-media { margin-top: var(--space-12); }
@media (max-width: 859.98px) {
  .why-grid { grid-template-columns: 1fr; gap: var(--space-8); }
}

/* --------------------------------------------------------------------------
   10.4  QUICK-LINK CARDS
   -------------------------------------------------------------------------- */
.quicklink-grid {
  margin-top: var(--space-8);
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(var(--space-6), 2.5vw, var(--space-8));
}
.quicklink {
  position: relative;
  display: grid;
  grid-template-rows: auto auto 1fr auto;
  gap: var(--space-3);
  padding: var(--space-6) var(--space-6) var(--space-8);
  background: var(--cream);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
}
.quicklink__media {
  margin-bottom: var(--space-4);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.quicklink__label {
  font-family: var(--font-display);
  font-size: var(--fs-h4);
  font-weight: 600;
  color: var(--navy);
  line-height: 1.1;
  transition: color var(--dur) var(--ease);
}
.quicklink__blurb { font-size: var(--fs-sm); color: var(--text-muted); line-height: 1.5; }
.quicklink__arrow {
  font-size: 1.25rem;
  color: var(--bronze);
  transform: translateX(0);
  transition: transform var(--dur) var(--ease);
}
.quicklink:hover .quicklink__media,
.quicklink:focus-visible .quicklink__media {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
}
.quicklink:hover .quicklink__label,
.quicklink:focus-visible .quicklink__label { color: var(--bronze); }
.quicklink:hover .quicklink__arrow,
.quicklink:focus-visible .quicklink__arrow { transform: translateX(6px); }
@media (max-width: 859.98px) {
  .quicklink-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 479.98px) {
  .quicklink-grid { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------------------
   10.5  FORMATION COLUMNS
   -------------------------------------------------------------------------- */
.formation-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(var(--space-8), 5vw, var(--space-20));
}
.formation-col--fit { position: relative; }
/* hairline divider between the two columns on wide screens */
@media (min-width: 860px) {
  .formation-col--fit::before {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: calc(clamp(var(--space-8), 5vw, var(--space-20)) / -2);
    width: 1px;
    background: var(--rule);
  }
}
.formation-heading { margin-top: var(--space-4); font-size: var(--fs-h3); }
.formation-list {
  list-style: none;
  padding: 0;
  margin-top: var(--space-8);
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}
.formation-list li {
  position: relative;
  padding-left: var(--space-8);
  font-size: var(--fs-base);
  line-height: 1.55;
  color: var(--text);
  max-width: 52ch;
}
/* small bronze diamond marker echoing the brand "bowl/flame" geometry */
.formation-list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.55em;
  width: 0.55rem;
  height: 0.55rem;
  background: var(--bronze);
  transform: rotate(45deg);
}
.formation-col--fit .formation-list li::before { background: var(--clay); }
@media (max-width: 859.98px) {
  .formation-grid { grid-template-columns: 1fr; gap: var(--space-16); }
}

/* --------------------------------------------------------------------------
   10.6  CURRICULUM GRID
   -------------------------------------------------------------------------- */
.curriculum-head { max-width: 30ch; margin-bottom: var(--space-12); }
.curriculum-heading { margin-top: var(--space-4); }
.curriculum-grid {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1px;
  background: var(--rule);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
  overflow: hidden;
}
.course {
  background: var(--offwhite);
  padding: var(--space-6);
  min-height: 9rem;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: var(--space-4);
  transition: background-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.course:hover { background: var(--cream); }
.course__num {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-lg);
  color: var(--bronze);
  line-height: 1;
}
.course__title {
  font-family: var(--font-display);
  font-size: var(--fs-h4);
  font-weight: 500;
  line-height: 1.12;
  color: var(--navy);
  letter-spacing: -0.01em;
}
.course--more {
  background: var(--navy);
  align-items: flex-start;
  justify-content: flex-end;
}
.course--more .course__title {
  color: var(--gold);
  font-style: italic;
}
@media (max-width: 1023.98px) {
  .curriculum-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 639.98px) {
  .curriculum-grid { grid-template-columns: repeat(2, 1fr); }
  .course { min-height: 7.5rem; padding: var(--space-4); }
}
@media (max-width: 379.98px) {
  .curriculum-grid { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------------------
   10.7  LEADERSHIP
   -------------------------------------------------------------------------- */
.leadership-head { max-width: 26ch; margin-bottom: var(--space-12); }
.leadership-heading { margin-top: var(--space-4); }
.leader-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(var(--space-8), 4vw, var(--space-16));
  max-width: 820px;
}
.leader__photo {
  transition: box-shadow var(--dur) var(--ease);
}
.leader:hover .leader__photo { box-shadow: var(--shadow-md); }
.leader__name {
  margin-top: var(--space-6);
  font-size: var(--fs-h4);
}
.leader__role {
  margin-top: var(--space-2);
  font-size: var(--fs-sm);
  letter-spacing: var(--tracking-wide);
  text-transform: uppercase;
  color: var(--bronze);
  font-weight: 600;
}
.lecturers {
  margin-top: clamp(var(--space-12), 5vw, var(--space-20));
  padding-top: var(--space-12);
  border-top: 1px solid var(--rule);
  max-width: 78ch;
}
.lecturers__body {
  margin-top: var(--space-4);
  font-size: var(--fs-lg);
  line-height: 1.6;
  color: var(--text);
}
@media (max-width: 559.98px) {
  .leader-grid { grid-template-columns: 1fr; gap: var(--space-12); max-width: 24rem; }
}

/* --------------------------------------------------------------------------
   10.8  TESTIMONIALS CAROUSEL
   Track is a flexbox; JS sets a translateX. One slide visible; wraps around.
   -------------------------------------------------------------------------- */
.testimonials-head { margin-bottom: var(--space-12); }
.testimonials-heading { margin-top: var(--space-4); }
.carousel { position: relative; }
.carousel__viewport {
  overflow: hidden;
  border-radius: var(--radius-lg);
}
.carousel__track {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  transition: transform 0.5s var(--ease);
  will-change: transform;
}
.carousel__slide {
  flex: 0 0 100%;
  min-width: 0;
}
/* slightly recolor the dashed media in the navy section so it stays legible */
.testimonials .media-ph--video {
  background-color: rgba(240, 232, 228, 0.06);
  border-color: var(--gold);
}
.testimonials .media-ph--video > span { color: var(--blush); }
.testimonials .media-ph--video::before { border-color: var(--gold); background: rgba(248,244,236,0.12); }
.testimonials .media-ph--video::after  { border-left-color: var(--gold); }

.carousel__controls {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-6);
  margin-top: var(--space-8);
}
.carousel__btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  border: 1px solid rgba(201, 169, 95, 0.5);
  border-radius: 50%;
  color: var(--gold);
  font-size: 1.2rem;
  transition: background-color var(--dur) var(--ease), color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.carousel__btn:hover { background-color: var(--gold); color: var(--navy); transform: translateY(-2px); }
.carousel__btn:active { transform: translateY(0); }
.carousel__dots {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
}
.carousel__dot {
  width: 0.6rem;
  height: 0.6rem;
  padding: 0;
  border-radius: 50%;
  background: rgba(201, 169, 95, 0.35);
  transition: background-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.carousel__dot:hover { background: rgba(201, 169, 95, 0.6); }
.carousel__dot[aria-current="true"] {
  background: var(--gold);
  transform: scale(1.25);
}

/* --------------------------------------------------------------------------
   10.9  ACCREDITATION PARTNERS
   -------------------------------------------------------------------------- */
.partners-head { max-width: 40ch; margin-bottom: var(--space-12); }
.partners-heading { margin-top: var(--space-4); }
.partners-intro { margin-top: var(--space-6); }
.partner-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: clamp(var(--space-6), 3vw, var(--space-12));
}
.partner {
  padding: clamp(var(--space-6), 3vw, var(--space-12));
  background: var(--cream);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
  border-top: 3px solid var(--bronze);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.partner:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.partner__name { font-size: var(--fs-h4); }
.partner__desc { margin-top: var(--space-4); color: var(--text-muted); }
@media (max-width: 639.98px) {
  .partner-grid { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------------------
   10.10  CTA BAND
   -------------------------------------------------------------------------- */
.cta-band { text-align: center; }
.cta-inner { display: flex; flex-direction: column; align-items: center; }
.cta-heading {
  margin-top: var(--space-4);
  font-size: var(--fs-h1);
}
.cta-text {
  margin-top: var(--space-6);
  font-size: var(--fs-lg);
  color: rgba(240, 232, 228, 0.85);
  max-width: 46ch;
}
.cta-actions { margin-top: var(--space-8); }

/* ==========================================================================
   11. ABOUT PAGE
   --------------------------------------------------------------------------
   Page-specific layout only; everything else reuses shared components
   (.section, .eyebrow, .media-ph--*, .leader*, .lecturers*, .formation*,
   .btn*). Sections in document order:
     11.1  Page hero (title block + adjacent wide media)
     11.2  Mission & vision (aside + lead body)
     11.3  Leadership bio extension (.leader__bio)
     11.4  Contributing lecturers standalone block
     11.5  Graduate outcomes (numbered editorial list)
     11.6  Spiritual focus closing band
   The header here is the SOLID sticky bar (no --overlay), so it stays in
   flow and the hero naturally sits below it — no overlap handling needed.
   ========================================================================== */

/* --------------------------------------------------------------------------
   11.1  PAGE HERO — stacked: title block, then a full-width banner photo.
   -------------------------------------------------------------------------- */
.about-hero {
  padding-block: clamp(3rem, 2rem + 5vw, 6.5rem) clamp(3rem, 2.5rem + 4vw, 6rem);
}
.about-hero__inner {
  display: block;
}
.about-hero__title {
  margin-top: var(--space-4);
  font-size: var(--fs-h1);
  line-height: 1.02;
  max-width: 20ch;
  overflow-wrap: normal;   /* wrap only at spaces — never mid-word */
  word-break: keep-all;
  hyphens: none;
}
.about-hero__media {
  margin-top: clamp(var(--space-8), 5vw, var(--space-16));
  height: clamp(20rem, 42vw, 34rem);   /* wide cinematic banner */
}
.about-hero__title { padding-bottom: 0.12em; }   /* room for descenders */
@media (max-width: 859.98px) {
  .about-hero__media { height: clamp(15rem, 56vw, 24rem); }
}

/* --------------------------------------------------------------------------
   11.2  MISSION & VISION — narrow eyebrow/scripture aside + lead paragraph.
   -------------------------------------------------------------------------- */
.mission-grid {
  display: grid;
  grid-template-columns: minmax(0, 0.55fr) minmax(0, 1fr);
  gap: clamp(var(--space-8), 5vw, var(--space-20));
  align-items: start;
}
.mission-aside { position: sticky; top: 6rem; }
.mission-scripture {
  margin-top: var(--space-6);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-lg);
  line-height: 1.4;
  color: var(--bronze);
}
.mission-body {
  color: var(--text);
  font-size: clamp(1.3rem, 1.1rem + 1vw, 1.9rem);
  font-family: var(--font-display);
  line-height: 1.42;
  max-width: 34ch;
}
@media (max-width: 859.98px) {
  .mission-grid { grid-template-columns: 1fr; gap: var(--space-8); }
  .mission-aside { position: static; }
  .mission-body { max-width: 46ch; }
}

/* --------------------------------------------------------------------------
   11.3  LEADERSHIP — extends shared .leader cards with a bio paragraph.
   -------------------------------------------------------------------------- */
.leader-grid--bios { max-width: 920px; }
.leader__bio {
  margin-top: var(--space-4);
  font-size: var(--fs-base);
  line-height: 1.6;
  color: var(--text-muted);
  max-width: 46ch;
}

/* --------------------------------------------------------------------------
   11.4  CONTRIBUTING LECTURERS — standalone block (no top divider needed
   since it sits in its own section).
   -------------------------------------------------------------------------- */
.lecturers--standalone {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
  max-width: 80ch;
  margin-inline: auto;
}
.lecturers--standalone .lecturers__body { text-wrap: pretty; }

/* --------------------------------------------------------------------------
   11.5  GRADUATE OUTCOMES — numbered editorial rows with bronze indices.
   -------------------------------------------------------------------------- */
.outcomes-head { max-width: 28ch; margin-bottom: var(--space-12); }
.outcomes-heading { margin-top: var(--space-4); }
.outcomes-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
}
.outcome {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: clamp(var(--space-6), 3vw, var(--space-12));
  align-items: baseline;
  padding-block: clamp(var(--space-6), 2.5vw, var(--space-8));
  border-top: 1px solid var(--rule);
}
.outcome:last-child { border-bottom: 1px solid var(--rule); }
.outcome__num {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-h3);
  line-height: 1;
  color: var(--bronze);
  min-width: 2.5ch;
}
.outcome__text {
  font-family: var(--font-display);
  font-size: var(--fs-h4);
  font-weight: 500;
  line-height: 1.28;
  color: var(--navy);
  letter-spacing: -0.01em;
  max-width: 60ch;
}
@media (max-width: 559.98px) {
  .outcome { grid-template-columns: 1fr; gap: var(--space-3); }
}

/* --------------------------------------------------------------------------
   11.6  SPIRITUAL FOCUS — centered navy closing band with CTA pair.
   Reuses .section--navy tokens; mirrors the home CTA band's centered layout.
   -------------------------------------------------------------------------- */
.focus-band { text-align: center; }
.focus-inner { display: flex; flex-direction: column; align-items: center; }
.focus-heading {
  margin-top: var(--space-4);
  font-size: var(--fs-h1);
}
.focus-text {
  margin-top: var(--space-6);
  font-size: var(--fs-lg);
  color: rgba(240, 232, 228, 0.85);
  max-width: 52ch;
}
.focus-actions {
  margin-top: var(--space-8);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--space-6) var(--space-8);
}

/* ==========================================================================
   12. REQUEST INFO / FORMS
   --------------------------------------------------------------------------
   Page-specific layout for request-info.html (editorial split: photo +
   form) and thanks.html (centered confirmation). Reuses shared tokens,
   .section, .eyebrow, .media-ph--*, .lead, .btn*. The form inputs inherit
   the global :focus-visible bronze ring; only the resting border is styled
   here. The .hidden-field honeypot is positioned offscreen (NOT display:none)
   so it stays in the DOM and submittable for Netlify spam filtering.
   ========================================================================== */

/* --------------------------------------------------------------------------
   12.1  REQUEST INFO — split: portrait photo left, form panel right.
   -------------------------------------------------------------------------- */
.request-grid {
  display: grid;
  grid-template-columns: minmax(0, 0.8fr) minmax(0, 1fr);
  gap: clamp(var(--space-8), 5vw, var(--space-20));
  align-items: start;
}
.request-media { position: sticky; top: 6rem; }
.request-title {
  margin-top: var(--space-6);
  font-size: var(--fs-h1);
  max-width: 14ch;
  overflow-wrap: normal;
  word-break: keep-all;
  hyphens: none;
}
.request-intro {
  margin-top: var(--space-6);
  max-width: 42ch;
}

/* The form itself */
.request-form {
  margin-top: var(--space-8);
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}
.form-note {
  font-size: var(--fs-sm);
  color: var(--text-muted);
  margin: 0;
}
.req-mark { color: var(--bronze); font-weight: 600; }

.field {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.field__label {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: var(--tracking-wide);
  color: var(--text);
}
.request-form input,
.request-form select,
.request-form textarea {
  width: 100%;
  font-family: var(--font-body);
  font-size: var(--fs-base);
  color: var(--text);
  background: var(--white);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: 0.7rem 0.85rem;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.request-form textarea { resize: vertical; line-height: var(--lh-body); }
.request-form input:hover,
.request-form select:hover,
.request-form textarea:hover { border-color: var(--bronze); }
/* Soft bronze ring on focus, layered with the global :focus-visible outline */
.request-form input:focus,
.request-form select:focus,
.request-form textarea:focus {
  border-color: var(--bronze);
  box-shadow: 0 0 0 3px rgba(156, 122, 75, 0.16);
  outline: none;
}
.request-form select {
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%239C7A4B' d='M6 8 0 0h12z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.95rem center;
  padding-right: 2.4rem;
}
.request-form .btn { align-self: flex-start; margin-top: var(--space-2); }

.request-email {
  margin-top: var(--space-6);
  font-size: var(--fs-sm);
  color: var(--text-muted);
}
.request-email a {
  color: var(--bronze);
  background-image: linear-gradient(var(--bronze), var(--bronze));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 0% 1px;
  transition: background-size var(--dur) var(--ease);
}
.request-email a:hover { background-size: 100% 1px; }

/* Honeypot — offscreen, present in the DOM, still submittable. */
.hidden-field {
  position: absolute;
  left: -9999px;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

@media (max-width: 859.98px) {
  .request-grid { grid-template-columns: 1fr; gap: var(--space-12); }
  .request-media { position: static; }
  .request-title { max-width: 20ch; }
}

/* --------------------------------------------------------------------------
   12.2  THANK YOU — centered confirmation panel.
   -------------------------------------------------------------------------- */
.thanks { display: flex; }
.thanks-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  max-width: 60ch;
}
.thanks-title {
  margin-top: var(--space-4);
  font-size: var(--fs-h1);
}
.thanks-text {
  margin-top: var(--space-6);
  max-width: 52ch;
}
.thanks-actions {
  margin-top: var(--space-8);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--space-6) var(--space-8);
}

/* ==========================================================================
   13. APPLICATION PAGE
   --------------------------------------------------------------------------
   Page-specific layout for application.html. Reuses shared components
   (.section, .eyebrow, .media-ph--*, .btn*, navy band) and brand tokens only;
   no hardcoded colors. Sections in document order:
     13.1  Page hero (eyebrow/title/intro + primary CTA + wide media)
     13.2  Requirements (bronze-marked checklist)
     13.3  Weekly schedule (same checklist treatment)
     13.4  Key dates (editorial timeline with bronze date label)
     13.5  Tuition (centered card with highlighted early-discount note)
     13.6  Application process (numbered editorial steps)
     13.7  FAQ accordion (button trigger + collapsible panel)
     13.8  Final CTA band (navy closing band, reuses .cta-* layout)
   The header here is the SOLID sticky bar (no --overlay).
   ========================================================================== */

/* --------------------------------------------------------------------------
   13.1  PAGE HERO — title block + primary CTA, with adjacent wide media.
   -------------------------------------------------------------------------- */
.apply-hero {
  padding-block: clamp(2.5rem, 2rem + 4vw, 5.5rem) clamp(3rem, 2.5rem + 4vw, 6rem);
}
.apply-hero__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(var(--space-8), 5vw, var(--space-20));
  align-items: center;
}
.apply-hero__title {
  margin-top: var(--space-6);
  font-size: var(--fs-h1);
  max-width: 14ch;
  overflow-wrap: normal;
  word-break: keep-all;
  hyphens: none;
}
.apply-hero__intro {
  margin-top: var(--space-6);
  max-width: 44ch;
}
.apply-hero__cta { margin-top: var(--space-8); }
.apply-hero__media {
  aspect-ratio: 3 / 2;   /* preserve the full-height group photo without cropping heads/feet */
}
@media (max-width: 859.98px) {
  .apply-hero__inner { grid-template-columns: 1fr; gap: var(--space-12); }
  .apply-hero__title { max-width: 20ch; }
}

/* --------------------------------------------------------------------------
   13.2 / 13.3  CHECKLISTS — requirements & weekly schedule.
   Bronze diamond markers echo the .formation-list brand geometry.
   -------------------------------------------------------------------------- */
.apply-head { max-width: 34ch; margin-bottom: var(--space-12); }
.apply-head--center { text-align: center; margin-inline: auto; }
.apply-heading { margin-top: var(--space-4); }
.checklist {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-6) clamp(var(--space-8), 5vw, var(--space-16));
  max-width: 960px;
}
.checklist li {
  position: relative;
  padding-left: var(--space-8);
  padding-bottom: var(--space-6);
  font-size: var(--fs-lg);
  font-family: var(--font-display);
  line-height: 1.35;
  color: var(--text);
  border-bottom: 1px solid var(--rule);
}
.checklist li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.5em;
  width: 0.55rem;
  height: 0.55rem;
  background: var(--bronze);
  transform: rotate(45deg);
}
@media (max-width: 639.98px) {
  .checklist { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------------------
   13.4  KEY DATES — editorial timeline; italic bronze date + plain label.
   -------------------------------------------------------------------------- */
.dates-list {
  list-style: none;
  padding: 0;
  margin: 0;
  max-width: 760px;
}
.date-row {
  display: grid;
  grid-template-columns: minmax(7ch, auto) 1fr;
  gap: clamp(var(--space-6), 3vw, var(--space-12));
  align-items: baseline;
  padding-block: clamp(var(--space-4), 2vw, var(--space-6));
  border-top: 1px solid var(--rule);
}
.date-row:last-child { border-bottom: 1px solid var(--rule); }
.date-row__when {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-h4);
  line-height: 1.1;
  color: var(--bronze);
}
.date-row__what {
  font-size: var(--fs-lg);
  color: var(--navy);
  line-height: 1.35;
}
@media (max-width: 559.98px) {
  .date-row { grid-template-columns: 1fr; gap: var(--space-2); }
  .date-row__when { font-size: var(--fs-h3); }
}

/* --------------------------------------------------------------------------
   13.5  TUITION — centered card with a highlighted early-discount note.
   -------------------------------------------------------------------------- */
.tuition-card {
  max-width: 560px;
  margin-inline: auto;
  margin-top: var(--space-12);
  text-align: center;
  padding: clamp(var(--space-12), 5vw, var(--space-20)) clamp(var(--space-8), 5vw, var(--space-16));
  background: var(--white);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
}
.tuition-card__price {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(2.5rem, 2rem + 3vw, 4rem);
  line-height: 1;
  color: var(--navy);
}
.tuition-card__plan {
  display: block;
  margin-top: var(--space-3);
  font-family: var(--font-body);
  font-size: var(--fs-base);
  color: var(--text-muted);
}
.tuition-card__note {
  margin-top: var(--space-8);
  display: inline-block;
  padding: 0.75em 1.4em;
  background: var(--cream);
  border: 1px solid var(--rule);
  border-left: 4px solid var(--bronze);
  border-radius: var(--radius);
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--navy);
}

/* --------------------------------------------------------------------------
   13.6  APPLICATION PROCESS — numbered editorial steps (mirrors .outcome).
   -------------------------------------------------------------------------- */
.steps-list {
  list-style: none;
  counter-reset: step;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  max-width: 820px;
}
.step {
  counter-increment: step;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: clamp(var(--space-6), 3vw, var(--space-12));
  align-items: baseline;
  padding-block: clamp(1.25rem, 2.5vw, var(--space-8));
  border-top: 1px solid var(--rule);
}
.step:last-child { border-bottom: 1px solid var(--rule); }
.step::before {
  content: counter(step, decimal-leading-zero);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-h3);
  line-height: 1;
  color: var(--bronze);
  min-width: 2.5ch;
}
.step__text {
  font-family: var(--font-display);
  font-size: var(--fs-h4);
  font-weight: 500;
  line-height: 1.28;
  color: var(--navy);
  letter-spacing: -0.01em;
}
@media (max-width: 559.98px) {
  .step { grid-template-columns: 1fr; gap: var(--space-3); }
}

/* --------------------------------------------------------------------------
   13.7  FAQ ACCORDION — button trigger toggles a collapsible answer panel.
   Panels are open-by-default in HTML (no-JS safe); JS collapses them on init.
   -------------------------------------------------------------------------- */
.accordion {
  max-width: 820px;
  border-top: 1px solid var(--rule);
}
.accordion__item { border-bottom: 1px solid var(--rule); }
.accordion__trigger {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-6);
  padding: clamp(1.25rem, 2.5vw, var(--space-6)) 0;
  text-align: left;
  font-family: var(--font-display);
  font-size: var(--fs-h4);
  font-weight: 500;
  line-height: 1.25;
  color: var(--navy);
  letter-spacing: -0.01em;
  transition: color var(--dur) var(--ease);
}
.accordion__trigger:hover { color: var(--bronze); }
/* Plus → minus indicator; the vertical bar collapses on expand. */
.accordion__icon {
  position: relative;
  flex: none;
  width: 1.25rem;
  height: 1.25rem;
  transition: transform var(--dur) var(--ease);
}
.accordion__icon::before,
.accordion__icon::after {
  content: "";
  position: absolute;
  inset: 50% 0 auto 0;
  height: 2px;
  background: var(--bronze);
  transform: translateY(-50%);
  transition: opacity var(--dur) var(--ease);
}
.accordion__icon::after { transform: translateY(-50%) rotate(90deg); }
.accordion__trigger[aria-expanded="true"] .accordion__icon::after { opacity: 0; }
.accordion__trigger[aria-expanded="true"] .accordion__icon { transform: rotate(180deg); }
.accordion__panel {
  padding: 0 0 var(--space-6);
  max-width: 66ch;
}
.accordion__panel p {
  font-size: var(--fs-base);
  line-height: 1.6;
  color: var(--text-muted);
}
.accordion__panel[hidden] { display: none; }

/* --------------------------------------------------------------------------
   13.8  FINAL CTA BAND — reuses the shared .cta-* navy band layout.
   -------------------------------------------------------------------------- */
.apply-cta .cta-text { max-width: 54ch; }

/* ==========================================================================
   14. MOTION / EFFECTS LAYER
   --------------------------------------------------------------------------
   Library-free, vanilla-CSS/JS ports of "React Bits"-style effects:
     14.1  Hero arrival   — word-stagger headline + Ken Burns media zoom
     14.2  Premium card hover — overlay slide-up, media zoom, cursor spotlight
     14.3  CTA flourish   — gold fill sweep + diagonal shine on .btn-primary
     14.4  ScrollFloat    — word-by-word blur-in for mission paragraphs/headings
     14.5  Glare sweep     — skewed light pass on portraits / key images
     14.6  Grain + mesh    — drifting warm mesh behind the scripture band

   ROBUSTNESS CONTRACT (applies to every effect below):
     • Anything that HIDES content does so only under `.js` (set at the top of
       main.js) AND `(prefers-reduced-motion: no-preference)`. So no-JS,
       JS-failure, or reduced-motion always shows the final state.
     • Motion is gated inside `@media (prefers-reduced-motion: no-preference)`.
     • Hover effects are pointer-gated where they could otherwise stick on
       touch devices.
   Tokens only (no hardcoded colors); the established cubic-bezier(.16,1,.3,1)
   "rise" feel is captured in --ease-rise; medium-paced (~0.3–0.85s).
   ========================================================================== */
:root {
  --ease-rise: cubic-bezier(0.16, 1, 0.3, 1);
}

/* --------------------------------------------------------------------------
   14.1  HERO ARRIVAL — word-stagger headline
   The hero <h1> words are pre-split into .word-line > .word spans in markup
   (cleanest for no-JS). Each line clips; words rise from translateY(110%)→0.
   The plain words are real text in the DOM, so no-JS shows the full headline.
   Interior heros get a lighter fade/short-rise treatment.
   -------------------------------------------------------------------------- */
.word-line {
  display: inline-block;
  overflow: hidden;
  vertical-align: top;
  /* small bottom pad so descenders/italics aren't clipped by overflow:hidden */
  padding-bottom: 0.12em;
  margin-bottom: -0.12em;
}
.word-line .word { display: inline-block; will-change: transform; }

@media (prefers-reduced-motion: no-preference) {
  .js .hero-title .word {
    transform: translateY(110%);
    transition: transform 0.85s var(--ease-rise);
    transition-delay: var(--word-delay, 0s);
  }
  /* Plays on LOAD (above the fold): .is-in is added by JS right after paint. */
  .js .hero-title.is-in .word { transform: translateY(0); }

  /* Interior page heros — lighter: a simple fade + short rise on the title. */
  .js .about-hero__title,
  .js .apply-hero__title,
  .js .request-title {
    opacity: 0;
    transform: translateY(16px);
    transition: opacity 0.7s var(--ease-rise), transform 0.7s var(--ease-rise);
  }
  .js .about-hero__title.is-in,
  .js .apply-hero__title.is-in,
  .js .request-title.is-in { opacity: 1; transform: none; }
}

/* Ken Burns zoom on hero media — applied via .kenburns so it works on the
   placeholder now and on a real <img>/<video> dropped in later. Clipped by
   .hero-shell { overflow:hidden }. Scale 1.08→1 on load, then a very slow
   infinite drift. The element itself is the media box (already inset:0). */
@media (prefers-reduced-motion: no-preference) {
  .js .kenburns {
    transform: scale(1.08);
    animation:
      kenburns-in 1.6s var(--ease-rise) forwards,
      kenburns-drift 26s ease-in-out 1.6s infinite alternate;
    transform-origin: 60% 40%;
  }
  @keyframes kenburns-in {
    from { transform: scale(1.08); }
    to   { transform: scale(1); }
  }
  @keyframes kenburns-drift {
    from { transform: scale(1) translate(0, 0); }
    to   { transform: scale(1.06) translate(-1.5%, -1%); }
  }
}

/* --------------------------------------------------------------------------
   14.2  PREMIUM CARD HOVER — quicklink + partner cards
   (a) bronze overlay slides up from below (::before, translateY(101%)→0)
   (b) inner media zooms ~1.04
   (c) text shifts to light over the overlay
   (d) cursor spotlight follows --mx/--my (fine-pointer only; JS-driven)
   Touch-safe: the overlay/text-light effects live in @media (hover:hover).
   -------------------------------------------------------------------------- */
@media (hover: hover) and (pointer: fine) {
  .quicklink,
  .partner {
    isolation: isolate;
    overflow: hidden;
  }
  /* the rising tonal overlay */
  .quicklink::before,
  .partner::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 0;
    background:
      radial-gradient(
        16rem 16rem at var(--mx, 50%) var(--my, 0%),
        rgba(201, 169, 95, 0.35),
        transparent 60%),
      linear-gradient(to top, var(--navy), rgba(25, 33, 43, 0.92));
    transform: translateY(101%);
    transition: transform 0.5s var(--ease-rise);
    pointer-events: none;
  }
  .quicklink:hover::before,
  .quicklink:focus-within::before,
  .partner:hover::before,
  .partner:focus-within::before { transform: translateY(0); }

  /* lift the real content above the overlay */
  .quicklink > *,
  .partner > * { position: relative; z-index: 1; }

  /* media zoom (quicklink media already transitions transform) */
  .quicklink:hover .quicklink__media,
  .quicklink:focus-within .quicklink__media { transform: translateY(-4px); }

  /* text → light over the overlay */
  .quicklink:hover .quicklink__label,
  .quicklink:focus-within .quicklink__label { color: var(--offwhite); }
  .quicklink:hover .quicklink__blurb,
  .quicklink:focus-within .quicklink__blurb { color: rgba(240, 232, 228, 0.8); }
  .quicklink:hover .quicklink__arrow,
  .quicklink:focus-within .quicklink__arrow { color: var(--gold); transform: translateX(6px); }

  .partner { transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease); }
  .partner:hover .partner__name,
  .partner:focus-within .partner__name { color: var(--offwhite); }
  .partner:hover .partner__desc,
  .partner:focus-within .partner__desc { color: rgba(240, 232, 228, 0.82); }
  .partner__name,
  .partner__desc { transition: color var(--dur) var(--ease); }
}

/* CURRICULUM COURSE CELLS — SUBTLE only (no heavy overlay; it would fight the
   seamless gridlines design). Gentle bronze/cream wash + number/title shift. */
.course { transition: background-color var(--dur) var(--ease), transform var(--dur) var(--ease); }
.course:not(.course--more):hover {
  background: var(--cream);
  background-image: radial-gradient(120% 140% at 0% 0%, rgba(156, 122, 75, 0.10), transparent 60%);
}
.course:not(.course--more) .course__num,
.course:not(.course--more) .course__title { transition: color var(--dur) var(--ease); }
.course:not(.course--more):hover .course__num { color: var(--gold); }
.course:not(.course--more):hover .course__title { color: var(--bronze); }

/* --------------------------------------------------------------------------
   14.3  CTA FLOURISH — shared .btn-primary
   A gold fill sweeps in from the left (::before) and a quick diagonal shine
   pass (::after) crosses on hover. Text stays above both (z-index) and legible.
   The hero "Apply Today" CTA optionally gets a slow, restrained periodic shine.
   -------------------------------------------------------------------------- */
.btn-primary {
  position: relative;
  isolation: isolate;
  overflow: hidden;
}
/* gold fill sweep — sits above the bronze bg, below the label */
.btn-primary::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(90deg, var(--gold), var(--clay));
  transform: translateX(-101%);
  transition: transform 0.45s var(--ease-rise);
}
.btn-primary:hover::before,
.btn-primary:focus-visible::before { transform: translateX(0); }
/* diagonal shine pass */
.btn-primary::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
  width: 45%;
  height: 100%;
  background: linear-gradient(
    100deg,
    transparent,
    rgba(248, 244, 236, 0.5),
    transparent);
  transform: translateX(-260%) skewX(-18deg);
}
@media (prefers-reduced-motion: no-preference) {
  .btn-primary:hover::after,
  .btn-primary:focus-visible::after {
    animation: btn-shine 0.85s var(--ease) forwards;
  }
  @keyframes btn-shine {
    to { transform: translateX(360%) skewX(-18deg); }
  }
  /* restrained periodic shine on the hero primary CTA only */
  .hero-actions .btn-primary::after {
    animation: btn-shine-loop 6.5s var(--ease) 2s infinite;
  }
  .hero-actions .btn-primary:hover::after,
  .hero-actions .btn-primary:focus-visible::after {
    animation: btn-shine 0.85s var(--ease) forwards;
  }
  @keyframes btn-shine-loop {
    0%        { transform: translateX(-260%) skewX(-18deg); }
    12%, 100% { transform: translateX(360%)  skewX(-18deg); }
  }
}

/* --------------------------------------------------------------------------
   14.4  SCROLLFLOAT — word-by-word blur-in (used SPARINGLY)
   initScrollFloat() splits a target's text into .sf-word spans with --i, then
   an IntersectionObserver adds .is-in. No-JS / reduced-motion: full text shows
   (the hidden state is gated by both `.js` and motion-allowed; reduced-motion
   reveals immediately via JS too).
   -------------------------------------------------------------------------- */
.sf-word { display: inline-block; will-change: transform, filter, opacity; }
@media (prefers-reduced-motion: no-preference) {
  .js .scrollfloat .sf-word {
    opacity: 0;
    filter: blur(6px);
    transform: translateY(0.5em);
    transition:
      opacity 0.65s var(--ease-rise),
      filter 0.65s var(--ease-rise),
      transform 0.65s var(--ease-rise);
    transition-delay: calc(var(--i, 0) * 42ms);
  }
  .js .scrollfloat.is-in .sf-word {
    opacity: 1;
    filter: blur(0);
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   14.5  GLARE SWEEP — skewed light pass on hover (portraits + key images)
   Pure CSS ::after on a .glare wrapper element. Used only on leadership
   portraits and the About hero image, not everywhere.
   -------------------------------------------------------------------------- */
.glare { position: relative; overflow: hidden; isolation: isolate; }
.glare::after {
  content: "";
  position: absolute;
  top: -50%;
  left: -75%;
  z-index: 3;
  width: 50%;
  height: 200%;
  background: linear-gradient(
    100deg,
    transparent,
    rgba(248, 244, 236, 0.55),
    transparent);
  transform: translateX(0) skewX(-18deg);
  pointer-events: none;
  opacity: 0;
}
@media (hover: hover) and (pointer: fine) {
  @media (prefers-reduced-motion: no-preference) {
    .glare:hover::after,
    .glare:focus-within::after {
      animation: glare-sweep 0.85s var(--ease) forwards;
    }
    @keyframes glare-sweep {
      0%   { transform: translateX(0) skewX(-18deg); opacity: 0; }
      12%  { opacity: 1; }
      100% { transform: translateX(420%) skewX(-18deg); opacity: 0; }
    }
  }
}

/* --------------------------------------------------------------------------
   14.6  GRAIN + GRADIENT-MESH DRIFT behind the scripture band
   A warm radial mesh layer + a faint SVG feTurbulence grain slowly drift,
   low opacity, behind the scripture refs. Whisper-quiet so text stays crisp.
   The scripture content sits above both via z-index.
   -------------------------------------------------------------------------- */
.scripture-band { position: relative; isolation: isolate; overflow: hidden; }
.scripture-band > * { position: relative; z-index: 2; }
/* warm gradient mesh */
.scripture-band::before {
  content: "";
  position: absolute;
  inset: -20%;
  z-index: 0;
  background:
    radial-gradient(40% 80% at 18% 30%, rgba(201, 169, 95, 0.16), transparent 60%),
    radial-gradient(45% 90% at 82% 70%, rgba(198, 140, 120, 0.13), transparent 62%),
    radial-gradient(50% 70% at 50% 120%, rgba(85, 71, 157, 0.10), transparent 60%);
  pointer-events: none;
}
/* faint feTurbulence grain (inline SVG data-URI; no external request) */
.scripture-band::after {
  content: "";
  position: absolute;
  inset: -20%;
  z-index: 1;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
  background-size: 160px 160px;
  opacity: 0.05;
  mix-blend-mode: overlay;
  pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
  .scripture-band::before { animation: mesh-drift 28s ease-in-out infinite alternate; }
  .scripture-band::after  { animation: grain-drift 28s ease-in-out infinite alternate; }
  @keyframes mesh-drift {
    from { transform: translate(0, 0) scale(1); }
    to   { transform: translate(2.5%, -2%) scale(1.08); }
  }
  @keyframes grain-drift {
    from { transform: translate(0, 0); }
    to   { transform: translate(-3%, 2%); }
  }
}

/* ============================================================================
   15. PHOTOGRAPHY (real images)
   A real <img> dropped into a media slot. The frame clips (overflow:hidden)
   so card hover-zoom and glare stay inside the box; the <img> covers + crops
   via object-fit. Aspect modifiers mirror the .media-ph variants they replace.
   ============================================================================ */
.img-frame {
  position: relative;
  display: block;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--blush);            /* warm tint while the photo loads */
}
.img-frame--square   { aspect-ratio: 1 / 1; }
.img-frame--wide     { aspect-ratio: 16 / 9; }
.img-frame--portrait { aspect-ratio: 3 / 4; }
.img-frame > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.7s var(--ease);
}
/* quick-link card: the frame lifts (handled on .quicklink__media), the photo
   zooms inside it. Only where a real hover pointer exists. */
@media (hover: hover) and (pointer: fine) {
  .quicklink:hover .quicklink__media > img,
  .quicklink:focus-within .quicklink__media > img { transform: scale(1.06); }
}
