/* ==========================================================================
   Carmel Community Church — Design System
   Prototype v1 · HTML phase. Every value here maps 1:1 to an Elementor
   Global Color / Global Font / Theme Style setting at conversion time.
   ========================================================================== */

/* ---------- 1. Tokens ---------- */
:root{
  /* Brand — sampled from ccc.elyvracore.com */
  --teal:#196F8F;
  --teal-dark:#12536B;
  --teal-deep:#0E4155;
  --gold:#C5A059;
  --gold-dark:#A8863F;

  /* Neutrals */
  --ink:#1A252F;
  --ink-deep:#0B1114;
  --muted:#6C757D;
  --medium-blue:#7F9EAA;
  --sky:#F4F9FB;
  --off-white:#F8F9FA;
  --white:#FFFFFF;
  --line:#E3E8EB;

  /* Logo mark (reference only — not used as UI colour) */
  --logo-teal:#335454;
  --logo-grey:#66716A;

  /* Type */
  --font-display:'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --font-body:'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

  --fs-hero:clamp(2.5rem, 5.2vw, 4.25rem);
  --fs-h1:clamp(2.25rem, 4.6vw, 3rem);
  --fs-h2:clamp(1.875rem, 3.4vw, 2.5rem);
  --fs-h3:clamp(1.25rem, 2vw, 1.5rem);
  --fs-h4:1.25rem;
  --fs-lead:clamp(1.125rem, 1.8vw, 1.375rem);
  --fs-body:1.25rem;
  --fs-small:1rem;
  --fs-label:0.8125rem;

  /* Spacing — 8px base */
  --s1:8px;  --s2:16px; --s3:24px; --s4:40px;
  --s5:64px; --s6:96px; --s7:128px;
  --section-y:64px;
  --container:1240px;
  --gutter:24px;
  --measure:64ch;

  /* Form */
  --radius-card:12px;
  --radius-btn:50px;
  --radius-img:8px;

  --shadow-card:0 2px 4px rgba(26,37,47,.04), 0 12px 32px -12px rgba(26,37,47,.14);
  --shadow-lift:0 4px 8px rgba(26,37,47,.06), 0 24px 48px -16px rgba(26,37,47,.22);

  /* Motion — lifted from the colour reference */
  --ease:cubic-bezier(.165,.84,.44,1);
  --t-fast:.25s;
  --t-base:.4s;
  --t-slow:.6s;

  --header-h:88px;
  --topbar-h:44px;
}

/* ---------- 2. Reset ---------- */
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth; -webkit-text-size-adjust:100%}
body{
  margin:0;
  background:var(--white);
  color:var(--ink);
  font-family:var(--font-body);
  font-size:var(--fs-body);
  font-weight:400;
  line-height:1.65;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
img,picture,video{max-width:100%; display:block}
h1,h2,h3,h4,h5{
  font-family:var(--font-display);
  font-weight:700;
  line-height:1.14;
  letter-spacing:-.015em;
  margin:0;
  text-wrap:balance;
}
h1{font-size:var(--fs-h1)}
h2{font-size:var(--fs-h2)}
h3{font-size:var(--fs-h3)}
h4{font-size:var(--fs-h4); font-family:var(--font-body); font-weight:700; letter-spacing:0}
p,figure,blockquote,dl,dd{margin:0}
a{color:inherit; text-decoration:none}
ul{margin:0; padding:0; list-style:none}
button{font:inherit; cursor:pointer; border:0; background:none}
:focus-visible{outline:3px solid var(--gold); outline-offset:3px; border-radius:4px}

/* ---------- 3. Layout ---------- */
.container{width:100%; max-width:var(--container); margin-inline:auto; padding-inline:var(--gutter)}
/* :where() so this contributes no specificity.

   It used to sit at one class, which tied with Elementor's own container
   padding and won on source order — meaning every container wearing this class
   ignored whatever padding was typed into the panel, and the vertical rhythm
   of the whole site was set here rather than where anyone could see it. Now
   this is only the fallback for markup that names no padding of its own, and
   the panel always wins. */
:where(.section){padding-block:var(--section-y)}
.section--tight{padding-block:var(--s5)}
.measure{max-width:var(--measure)}
.center{text-align:center; margin-inline:auto}

.band--sky{background:var(--sky)}
.band--offwhite{background:var(--off-white)}
.band--teal{background:var(--teal); color:var(--white)}
.band--deep{background:var(--ink-deep); color:var(--white)}
.band--teal h1,.band--teal h2,.band--teal h3,
.band--deep h1,.band--deep h2,.band--deep h3{color:var(--white)}

/* ---------- 4. Type utilities ---------- */
.eyebrow{
  font-family:var(--font-display);
  font-size:var(--fs-label);
  font-weight:600;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--teal);
  display:block;
  margin-bottom:var(--s2);
}
.band--teal .eyebrow,.band--deep .eyebrow{color:var(--gold)}
.lead{font-size:var(--fs-lead); font-weight:300; line-height:1.6; color:var(--muted)}
.band--teal .lead,.band--deep .lead{color:rgba(255,255,255,.82)}
/* The container already puts a gap between the heading block and what follows;
   this margin was stacking on top of it, so a 40px gap rendered as 104px. */
.section-head{margin-bottom:var(--s2)}
.section-head p{margin-top:var(--s2)}

/* ---------- 5. Buttons ---------- */
.btn{
  display:inline-flex; align-items:center; gap:10px;
  font-family:var(--font-display); font-size:1rem; font-weight:600;
  letter-spacing:.02em;
  padding:16px 34px;
  border-radius:var(--radius-btn);
  border:1px solid transparent;
  transition:background var(--t-base) var(--ease), color var(--t-base) var(--ease),
             border-color var(--t-base) var(--ease), transform var(--t-fast) var(--ease);
}
.btn:hover{transform:translateY(-2px)}
.btn--primary{background:var(--teal); color:var(--white); border-color:var(--teal)}
.btn--primary:hover{background:var(--teal-dark); border-color:var(--teal-dark)}
.btn--gold{background:var(--gold); color:var(--white); border-color:var(--gold)}
.btn--gold:hover{background:var(--gold-dark); border-color:var(--gold-dark)}
.btn--ghost{background:transparent; color:var(--ink); border-color:currentColor}
.btn--ghost:hover{background:var(--ink); color:var(--white)}
.btn--ghost-light{background:transparent; color:var(--white); border-color:rgba(255,255,255,.6)}
.btn--ghost-light:hover{background:var(--white); color:var(--ink); border-color:var(--white)}
.btn--sm{padding:11px 24px; font-size:.875rem}

/* Arrow link.
   The arrow is drawn by ::after, so it exists once and only once — scoped to
   the <a> itself because in Elementor the same class lands on the widget
   WRAPPER, which would otherwise draw a second arrow beside the button's own.
   Section 23 gives the Elementor version the identical treatment.

   Hover moves the arrow with transform rather than by growing the flex gap:
   gap reflows the line and can nudge neighbouring text, transform does not.
   The rule underneath sweeps out from the left and stops short of the arrow,
   so the two movements read as one gesture. */
a.link-arrow{
  font-family:var(--font-display); font-weight:600; font-size:1rem;
  color:var(--teal); display:inline-block;
  text-decoration:underline;
  text-decoration-color:transparent;
  text-decoration-thickness:1px;
  text-underline-offset:5px;
  transition:color var(--t-base) var(--ease),
             text-decoration-color .35s var(--ease);
}
/* The rule is drawn with text-decoration rather than an absolutely positioned
   bar, so it follows the text's own baseline and cannot land in the wrong
   place when the button's box is taller than its label.
   The link is inline-BLOCK, not inline-flex, on purpose: a flex container
   blockifies its children, and an underline propagates into in-flow blocks —
   which drew a second little rule beneath the arrow. As an atomic
   inline-block the arrow is skipped by the decoration, so the rule stops
   where the words stop. Its offset comes from margin, not flex gap. */
a.link-arrow::after{
  content:"→"; display:inline-block; margin-left:10px;
  transition:transform .4s cubic-bezier(.2,.8,.25,1);
}
@media (hover:hover){
  a.link-arrow:hover{color:var(--teal-dark); text-decoration-color:currentColor}
  a.link-arrow:hover::after{transform:translateX(6px)}
}
a.link-arrow:focus-visible{text-decoration-color:currentColor}
.band--teal a.link-arrow,.band--deep a.link-arrow{color:var(--gold)}
@media (prefers-reduced-motion:reduce){
  a.link-arrow,a.link-arrow::after{transition:none}
}

/* ---------- 6. Header ---------- */
.header{
  position:fixed; inset:0 0 auto 0; z-index:100;
  height:var(--header-h);
  display:flex; align-items:center;
  background:transparent;
  border-bottom:1px solid transparent;
  transition:background var(--t-base) var(--ease), height var(--t-base) var(--ease),
             border-color var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease);
}
.header .container{display:flex; align-items:center; gap:var(--s4); width:100%}
.header__logo{flex:none; display:block}
.header__logo img{height:44px; width:auto; transition:height var(--t-base) var(--ease)}
.header__logo .logo-light{display:block}
.header__logo .logo-dark{display:none}
.header__nav{margin-left:auto; display:flex; align-items:center; gap:var(--s4)}
.header__nav a{
  font-family:var(--font-display); font-weight:500; font-size:1rem;
  color:var(--white); position:relative; padding:6px 0;
  transition:color var(--t-base) var(--ease);
}
.header__nav a::after{
  content:""; position:absolute; left:0; right:100%; bottom:0; height:2px;
  background:var(--gold); transition:right var(--t-base) var(--ease);
}
.header__nav a:hover::after,.header__nav a[aria-current]::after{right:0}
.header__actions{display:flex; align-items:center; gap:var(--s2)}

.header.is-stuck{
  height:72px;
  background:var(--white);
  border-bottom-color:var(--line);
  box-shadow:0 1px 20px rgba(26,37,47,.06);
}
.header.is-stuck .header__logo img{height:38px}
.header.is-stuck .header__logo .logo-light{display:none}
.header.is-stuck .header__logo .logo-dark{display:block}
.header.is-stuck .header__nav a{color:var(--ink)}
.header.is-stuck .header__nav a:hover{color:var(--teal)}
.header.is-stuck .btn--ghost-light{color:var(--ink); border-color:var(--ink)}
.header.is-stuck .btn--ghost-light:hover{background:var(--ink); color:var(--white)}

.burger{display:none !important}
.burger span{
  position:absolute; left:10px; width:24px; height:2px; background:var(--white);
  transition:transform var(--t-base) var(--ease), opacity var(--t-fast) var(--ease), background var(--t-base) var(--ease);
}
.burger span:nth-child(1){top:16px}
.burger span:nth-child(2){top:22px}
.burger span:nth-child(3){top:28px}
.header.is-stuck .burger span{background:var(--ink)}
.burger[aria-expanded="true"] span{background:var(--white)}
.burger[aria-expanded="true"] span:nth-child(1){transform:translateY(6px) rotate(45deg)}
.burger[aria-expanded="true"] span:nth-child(2){opacity:0}
.burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}

.mobile-menu{
  position:fixed; inset:0; z-index:99;
  background:var(--teal-deep);
  display:flex; flex-direction:column; justify-content:center;
  padding:var(--header-h) var(--gutter) var(--s5);
  opacity:0; visibility:hidden;
  transition:opacity var(--t-base) var(--ease), visibility var(--t-base) var(--ease);
}
.mobile-menu.is-open{opacity:1; visibility:visible}
/* (removed: styled the pre-column overlay markup) */


/* ---------- 6b. Header — solid variant for light-hero pages ---------- */
.header--solid{background:var(--white); border-bottom-color:var(--line)}
.header--solid .header__logo .logo-light{display:none}
.header--solid .header__logo .logo-dark{display:block}
.header--solid .header__nav a{color:var(--ink)}
.header--solid .header__nav a:hover{color:var(--teal)}
.header--solid .btn--ghost-light{color:var(--ink); border-color:var(--ink)}
.header--solid .btn--ghost-light:hover{background:var(--ink); color:var(--white)}
.header--solid .burger span{background:var(--ink)}

/* ---------- 7b. Page hero (inner pages) ---------- */
.page-hero{
  position:relative; min-height:clamp(360px, 52vh, 520px);
  display:flex; align-items:flex-end;
  padding-top:var(--header-h); color:var(--white); overflow:hidden;
}
.page-hero img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:0}
.page-hero::after{
  content:""; position:absolute; inset:0; z-index:1;
  background:linear-gradient(180deg, rgba(11,17,20,.7) 0%, rgba(11,17,20,.42) 45%, rgba(11,17,20,.86) 100%);
}
.page-hero .container{position:relative; z-index:2; padding-bottom:var(--s5)}
.page-hero h1{color:var(--white); max-width:18ch}
/* The hero's lead paragraph is styled in section 24, where it is targeted
   without also catching the breadcrumb — see the note there. */
.crumb{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.16em; text-transform:uppercase; color:var(--gold);
  display:flex; gap:10px; margin-bottom:var(--s2);
}
.crumb a{color:rgba(255,255,255,.6)}
.crumb a:hover{color:var(--white)}

/* ---------- 6c. Forms ---------- */
.form{display:flex; flex-direction:column; gap:var(--s3)}
.form__row{display:grid; grid-template-columns:1fr 1fr; gap:var(--s3)}
.field{display:flex; flex-direction:column; gap:8px}
.field label{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.08em; text-transform:uppercase; color:var(--muted);
}
.field label span{text-transform:none; letter-spacing:0; font-weight:400; color:var(--muted)}
.field input,.field textarea,.field select{
  font:inherit; font-size:1rem; font-family:var(--font-body);
  padding:15px 18px; border:1px solid var(--line); border-radius:8px;
  background:var(--white); color:var(--ink); width:100%;
  transition:border-color var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease);
}
.field textarea{resize:vertical; min-height:140px}
.field input::placeholder,.field textarea::placeholder{color:#A9B3B9}
.field input:focus,.field textarea:focus{
  outline:0; border-color:var(--teal); box-shadow:0 0 0 3px rgba(25,111,143,.14);
}
.form__note{font-size:.9375rem; color:var(--muted)}

/* ---------- 14b. Contact blocks ---------- */
.contact-card{
  background:var(--white); border:1px solid var(--line); border-radius:var(--radius-card);
  padding:var(--s4); display:flex; flex-direction:column; gap:var(--s3);
}
.contact-item{display:flex; gap:var(--s2); align-items:flex-start}
.contact-item__icon{
  flex:none; width:44px; height:44px; border-radius:50%;
  background:var(--sky); color:var(--teal); display:grid; place-items:center;
}
.contact-item__icon svg{width:19px; height:19px}
.contact-item dt{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.14em; text-transform:uppercase; color:var(--muted); margin-bottom:3px;
}
.contact-item dd{margin:0; font-size:1.0625rem; line-height:1.5}
.contact-item a:hover{color:var(--teal); text-decoration:underline}

.map-full{height:clamp(320px,42vh,460px); position:relative; background:var(--sky)}
.map-full iframe{position:absolute; inset:0; width:100%; height:100%; border:0; filter:grayscale(.28)}

.times-strip{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:var(--s3);
  border-top:1px solid rgba(255,255,255,.18); padding-top:var(--s3); margin-top:var(--s4);
}
.times-strip dt{font-family:var(--font-display); font-size:var(--fs-label); font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:var(--gold)}
.times-strip dd{margin:0; font-size:1.0625rem; font-weight:300; color:rgba(255,255,255,.9)}


/* ---------- 6d. Nav dropdowns ----------
   About and Ministries carry sub-items. Ministries' three all anchor into a
   single page. Pure CSS — hover on pointer devices, :focus-within for the
   keyboard. Maps directly to Elementor's Nav Menu widget. */
.has-sub{position:relative}
.has-sub > a::before{
  content:""; position:absolute; right:-15px; top:50%; width:6px; height:6px;
  border-right:1.5px solid currentColor; border-bottom:1.5px solid currentColor;
  transform:translateY(-70%) rotate(45deg);
  transition:transform var(--t-base) var(--ease);
  opacity:.7;
}
.has-sub:hover > a::before,.has-sub:focus-within > a::before{transform:translateY(-20%) rotate(225deg)}
.submenu{
  position:absolute; top:100%; left:-20px; min-width:250px;
  margin-top:18px; padding:10px;
  background:var(--white); border:1px solid var(--line); border-radius:12px;
  box-shadow:var(--shadow-lift);
  opacity:0; visibility:hidden; transform:translateY(-8px);
  transition:opacity var(--t-base) var(--ease), transform var(--t-base) var(--ease), visibility var(--t-base);
}
.has-sub::after{content:""; position:absolute; top:100%; left:0; right:0; height:20px}
.has-sub:hover .submenu,.has-sub:focus-within .submenu{opacity:1; visibility:visible; transform:translateY(0)}
.submenu a{
  display:block; padding:11px 14px; border-radius:7px;
  font-family:var(--font-display); font-weight:500; font-size:.9375rem;
  color:var(--ink) !important;
  transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), padding-left var(--t-fast) var(--ease);
}
.submenu a::after{display:none}
.submenu a:hover{background:var(--sky); color:var(--teal) !important; padding-left:19px}
.submenu a small{
  display:block; font-family:var(--font-body); font-weight:400; font-size:.8125rem;
  color:var(--muted); margin-top:2px;
}

/* mobile overlay: sub-items sit under their parent */
/* (removed: styled the pre-column overlay markup) */

/* ---------- 6e. Anchor bar ----------
   For a long single page reached by three menu items. Sticks under the
   header so the sub-navigation stays available the whole way down. */
.anchorbar{
  position:sticky; top:var(--header-h); z-index:60;
  background:var(--white); border-bottom:1px solid var(--line);
}
.anchorbar .container{display:flex; gap:var(--s4); overflow-x:auto; scrollbar-width:none}
.anchorbar .container::-webkit-scrollbar{display:none}
.anchorbar a{
  font-family:var(--font-display); font-size:.9375rem; font-weight:500;
  color:var(--muted); padding:20px 0; white-space:nowrap; position:relative;
  transition:color var(--t-base) var(--ease);
}
.anchorbar a::after{
  content:""; position:absolute; left:0; right:100%; bottom:-1px; height:2px;
  background:var(--teal); transition:right var(--t-base) var(--ease);
}
.anchorbar a:hover{color:var(--ink)}
.anchorbar a.is-active{color:var(--teal)}
.anchorbar a.is-active::after,.anchorbar a:hover::after{right:0}
@media (max-width:1024px){ .anchorbar{top:0} }


/* ---------- 6f. Top utility bar ----------
   Address, phone and email on the left; socials and the live indicator on the
   right. Sits over the hero and scrolls away — the main header is what sticks. */
.topbar{
  position:absolute; inset:0 0 auto 0; z-index:101;
  height:var(--topbar-h);
  background:var(--ink-deep);
  border-bottom:1px solid rgba(255,255,255,.08);
  display:flex; align-items:center;
  font-size:.8125rem; color:rgba(255,255,255,.72);
}
.topbar .container{display:flex; align-items:center; gap:var(--s3); width:100%}
.topbar__info{display:flex; align-items:center; gap:var(--s3); flex-wrap:nowrap; min-width:0}
.topbar__item{display:inline-flex; align-items:center; gap:7px; white-space:nowrap; transition:color var(--t-fast) var(--ease)}
.topbar__item svg{width:14px; height:14px; color:var(--gold); flex:none}
a.topbar__item:hover{color:var(--white)}
.topbar__right{margin-left:auto; display:flex; align-items:center; gap:var(--s2)}
.topbar__socials{display:flex; gap:4px}
.topbar__socials a{
  width:28px; height:28px; border-radius:50%; display:grid; place-items:center;
  color:rgba(255,255,255,.7);
  transition:background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.topbar__socials a:hover{background:rgba(255,255,255,.12); color:var(--white)}
.topbar__socials svg{width:14px; height:14px}

/* header sits below the bar at rest, and takes its place once stuck */
.header{top:var(--topbar-h)}
.header.is-stuck{top:0}
.hero,.page-hero,.error-hero{padding-top:calc(var(--header-h) + var(--topbar-h))}

@media (max-width:1024px){
  .topbar__addr{display:none}
}
@media (max-width:600px){
  :root{--topbar-h:40px}
  .topbar__email{display:none}
  .topbar{font-size:.75rem}
}

/* ---------- 6g. Live indicator ----------
   Hidden until something sets data-live="on" on <html>. See
   elementor/live-status.md for the WordPress endpoint that does it. */
.live-pill{
  display:none; align-items:center; gap:8px;
  background:#C0392B; color:#fff; border-radius:100px;
  padding:5px 13px 5px 10px;
  font-family:var(--font-display); font-size:.6875rem; font-weight:600;
  letter-spacing:.12em; text-transform:uppercase;
  transition:background var(--t-base) var(--ease), transform var(--t-fast) var(--ease);
}
.live-pill:hover{background:#A93226; transform:translateY(-1px)}
.live-pill i{
  width:7px; height:7px; border-radius:50%; background:#fff; flex:none;
  animation:livepulse 1.6s ease-in-out infinite;
}
@keyframes livepulse{0%,100%{opacity:1; box-shadow:0 0 0 0 rgba(255,255,255,.7)}70%{opacity:.85; box-shadow:0 0 0 7px rgba(255,255,255,0)}}
:root[data-live="on"] .live-pill{display:inline-flex}

/* the header button swaps to a live state */
.btn--watch .live-label{display:none}
:root[data-live="on"] .btn--watch{
  background:#C0392B !important; border-color:#C0392B !important; color:#fff !important;
}
:root[data-live="on"] .btn--watch:hover{background:#A93226 !important; border-color:#A93226 !important}
:root[data-live="on"] .btn--watch .idle-label{display:none}
:root[data-live="on"] .btn--watch .live-label{display:inline-flex; align-items:center; gap:8px}
:root[data-live="on"] .btn--watch .live-label i{
  width:7px; height:7px; border-radius:50%; background:#fff;
  animation:livepulse 1.6s ease-in-out infinite;
}
@media (prefers-reduced-motion:reduce){ .live-pill i,.btn--watch .live-label i{animation:none !important} }


/* ---------- 6h. Menu button ----------
   Sits at the far right of the header at every width and opens the full
   overlay. On desktop it is the way to reach the pages the main nav doesn't
   carry — Our Story, Our Team, Our Beliefs, Giving, Privacy. */
.menu-btn{
  margin-left:var(--s2); flex:none;
  display:inline-flex; align-items:center; gap:12px;
  padding:12px 18px; border-radius:14px;
  border:1px solid rgba(255,255,255,.28);
  background:rgba(255,255,255,.08);
  backdrop-filter:blur(6px);
  color:var(--white);
  font-family:var(--font-display); font-size:.8125rem; font-weight:600;
  letter-spacing:.14em; text-transform:uppercase; line-height:1;
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease),
             color var(--t-base) var(--ease), transform var(--t-fast) var(--ease);
}
.menu-btn:hover{background:rgba(255,255,255,.16); border-color:rgba(255,255,255,.5); transform:translateY(-1px)}
.menu-btn__icon{width:18px; height:18px; flex:none; position:relative}
.menu-btn__icon span{
  position:absolute; width:7px; height:7px; border-radius:2.5px;
  border:1.6px solid currentColor;
  transition:transform var(--t-base) var(--ease), opacity var(--t-base) var(--ease), border-radius var(--t-base) var(--ease);
}
.menu-btn__icon span:nth-child(1){top:0; left:0}
.menu-btn__icon span:nth-child(2){top:0; right:0}
.menu-btn__icon span:nth-child(3){bottom:0; left:0}
.menu-btn__icon span:nth-child(4){bottom:0; right:0}
.menu-btn .label-close{display:none}

/* solid header: dark pill */
.header.is-stuck .menu-btn,.header--solid .menu-btn{
  color:var(--ink); border-color:var(--line-2); background:var(--off-white);
}
.header.is-stuck .menu-btn:hover,.header--solid .menu-btn:hover{background:var(--sky); border-color:var(--teal); color:var(--teal)}

/* open: the four squares converge into a cross */
.menu-btn[aria-expanded="true"]{color:var(--white) !important; background:rgba(255,255,255,.14) !important; border-color:rgba(255,255,255,.4) !important}
.menu-btn[aria-expanded="true"] .label-open{display:none}
.menu-btn[aria-expanded="true"] .label-close{display:inline}
.menu-btn[aria-expanded="true"] .menu-btn__icon span{border-radius:1px}
.menu-btn[aria-expanded="true"] .menu-btn__icon span:nth-child(1){transform:translate(3px,3px)}
.menu-btn[aria-expanded="true"] .menu-btn__icon span:nth-child(2){transform:translate(-3px,3px)}
.menu-btn[aria-expanded="true"] .menu-btn__icon span:nth-child(3){transform:translate(3px,-3px)}
.menu-btn[aria-expanded="true"] .menu-btn__icon span:nth-child(4){transform:translate(-3px,-3px)}

/* The overlay is now reached at every width, so it needs a real desktop
   layout: links on the left, practical details on the right, and it must
   scroll rather than crop if the viewport is short. */
.mobile-menu{overflow-y:auto; overscroll-behavior:contain}
.mobile-menu__aside{display:none; color:rgba(255,255,255,.72)}
.mobile-menu__aside h4{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.16em; text-transform:uppercase; color:var(--gold); margin-bottom:10px;
}
.mobile-menu__aside p{font-size:1.0625rem; line-height:1.7; color:rgba(255,255,255,.78)}
.mobile-menu__aside a.plainlink{
  display:block; font-size:1.0625rem; line-height:1.7; padding:0; border-bottom:0;
  color:rgba(255,255,255,.78); opacity:1; transform:none;
}
.mobile-menu__aside a.plainlink:hover{color:var(--gold)}
.mobile-menu__aside > div + div{margin-top:var(--s4)}



/* ---------- 7. Hero ---------- */
.hero{
  position:relative; min-height:100svh;
  display:flex; align-items:flex-end;
  color:var(--white); overflow:hidden;
  padding-top:var(--header-h);
}
.hero__media{position:absolute; inset:-8% 0; z-index:0; will-change:transform}
.hero__media img{width:100%; height:100%; object-fit:cover}
.hero::after{
  content:""; position:absolute; inset:0; z-index:1;
  background:linear-gradient(180deg, rgba(11,17,20,.72) 0%, rgba(11,17,20,.35) 42%, rgba(11,17,20,.88) 100%);
}
.hero .container{position:relative; z-index:2; padding-bottom:var(--s5)}
.hero__inner{max-width:none}
.hero h1{max-width:15ch}
.hero h1{font-size:var(--fs-hero); color:var(--white); letter-spacing:-.03em; max-width:15ch}
.hero__lead{font-size:var(--fs-lead); font-weight:300; color:rgba(255,255,255,.85); margin-top:var(--s3); max-width:52ch}
.hero__cta{display:flex; flex-wrap:wrap; gap:var(--s2); margin-top:var(--s4)}

.hero__times{
  position:relative; z-index:2;
  border-top:1px solid rgba(255,255,255,.18);
  margin-top:var(--s4);
  padding-top:var(--s3);
  display:grid; grid-template-columns:repeat(4,1fr); gap:var(--s3);
}
.hero__times div{display:flex; flex-direction:column; gap:2px}
.hero__times dt{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.14em; text-transform:uppercase; color:var(--gold);
}
.hero__times dd{margin:0; font-size:1.0625rem; color:rgba(255,255,255,.9); font-weight:300}

/* Hero load sequence.
   Was a class flip: JS added .is-ready and a transition carried each element
   in. That put the home page's headline behind a script — and when the flip
   raced the first paint the transition never ran, leaving the copy at
   opacity 0 with nothing to recover it.
   A keyframe animation with `forwards` needs no JS, cannot get stuck, and
   ends in the visible state by definition. The delays are unchanged. */
@keyframes ccc-seq{ to{ opacity:1; transform:none } }
.has-anim .hero [data-seq]{
  opacity:0; transform:translateY(28px);
  animation:ccc-seq .8s var(--ease) both;
}
.has-anim .hero [data-seq="1"]{animation-delay:.35s}
.has-anim .hero [data-seq="2"]{animation-delay:.55s}
.has-anim .hero [data-seq="3"]{animation-delay:.75s}
.has-anim .hero [data-seq="4"]{animation-delay:.95s}

.scroll-hint{
  position:absolute; z-index:2; left:50%; bottom:24px; transform:translateX(-50%);
  font-family:var(--font-display); font-size:.6875rem; letter-spacing:.2em;
  text-transform:uppercase; color:rgba(255,255,255,.6);
  display:flex; flex-direction:column; align-items:center; gap:8px;
}
.scroll-hint::after{content:""; width:1px; height:36px; background:linear-gradient(rgba(255,255,255,.6),transparent); animation:drop 2.2s var(--ease) infinite}
@keyframes drop{0%{transform:scaleY(0); transform-origin:top}50%{transform:scaleY(1); transform-origin:top}51%{transform:scaleY(1); transform-origin:bottom}100%{transform:scaleY(0); transform-origin:bottom}}

/* ---------- 8. Identity band ---------- */
.identity{background:var(--ink-deep); color:var(--white); padding-block:var(--section-y)}
.identity .eyebrow{color:var(--gold)}
.identity__head{max-width:52ch; margin-bottom:var(--s5)}
.identity__grid{display:grid; grid-template-columns:repeat(5,1fr); gap:6px}
.identity__panel{
  position:relative; aspect-ratio:2/3; overflow:hidden;
  display:flex; align-items:flex-end;
  isolation:isolate;
}
.identity__panel img{
  position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-2;
  transition:transform 1.2s var(--ease), filter var(--t-slow) var(--ease);
  filter:grayscale(.35) brightness(.6);
}
.identity__panel::after{
  content:""; position:absolute; inset:0; z-index:-1;
  background:linear-gradient(180deg, rgba(11,17,20,0) 25%, rgba(11,17,20,.92) 100%);
}
.identity__panel:hover img{transform:scale(1.07); filter:grayscale(0) brightness(.9)}
.identity__panel span{
  font-family:var(--font-display); font-weight:700;
  font-size:clamp(1.125rem,1.55vw,1.625rem); line-height:1.12;
  padding:var(--s3); letter-spacing:-.015em;
}
.identity__panel b{
  display:flex; align-items:center; gap:10px;
  color:var(--gold); font-size:.6875rem; letter-spacing:.2em;
  margin-bottom:12px; font-weight:600; font-variant-numeric:tabular-nums;
}
.identity__panel b::after{content:""; flex:1; height:1px; background:rgba(197,160,89,.45)}

/* ---------- 9. Split (image + text) ---------- */
.split{display:grid; grid-template-columns:1fr 1fr; gap:var(--s6); align-items:center}
.split--reverse .split__media{order:2}
.split__media{position:relative; border-radius:var(--radius-img); overflow:hidden}
.split__media img{width:100%; aspect-ratio:4/5; object-fit:cover}
.split__media--wide img{aspect-ratio:3/2}
.split__body h2 + p,.split__body h3 + p,.split__body p + p{margin-top:var(--s3)}
.split__body h2 + ul,.split__body h2 + dl{margin-top:var(--s3)}
.split__body .btn,.split__body .link-arrow{margin-top:var(--s4)}

.stat-strip{display:flex; gap:var(--s5); margin-top:var(--s4); flex-wrap:wrap}
.stat{display:flex; flex-direction:column}
.stat b{
  font-family:var(--font-display); font-weight:700; font-size:2.75rem;
  color:var(--gold); line-height:1; font-variant-numeric:tabular-nums;
}
.stat span{font-size:.9375rem; color:var(--muted); margin-top:6px}
.band--teal .stat span,.band--deep .stat span{color:rgba(255,255,255,.7)}

/* ---------- 10. Cards ---------- */
.grid{display:grid; gap:var(--s3)}
.grid > *{min-width:0}
.grid--2{grid-template-columns:repeat(2,1fr)}
.grid--3{grid-template-columns:repeat(3,1fr)}
.grid--4{grid-template-columns:repeat(4,1fr)}

.card{
  background:var(--white);
  border:1px solid var(--line);
  border-radius:var(--radius-card);
  overflow:hidden;
  display:flex; flex-direction:column;
  transition:transform var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
.card__media{overflow:hidden; aspect-ratio:4/3}
.card__media img{width:100%; height:100%; object-fit:cover; transition:transform .7s var(--ease)}
.card__body{padding:var(--s3); display:flex; flex-direction:column; gap:10px; flex:1}
.card__body h3{font-size:1.25rem}
.card__body p{font-size:1rem; color:var(--muted); line-height:1.6}
.card__body .link-arrow{margin-top:auto; padding-top:var(--s2); font-size:.9375rem}
@media (hover:hover){
  .card:hover{transform:translateY(-2px); box-shadow:var(--shadow-lift); border-color:transparent}
  .card:hover .card__media img{transform:scale(1.04)}
}
.card--flush{border:0; background:transparent}
.card--flush .card__media{border-radius:var(--radius-img)}
.card--flush .card__body{padding:var(--s3) 0 0}

/* A card whose photograph does not exist yet. Deliberately obvious. */
.card__media--todo{
  border:1px dashed var(--gold); border-radius:var(--radius-img);
  background:repeating-linear-gradient(45deg, rgba(197,160,89,.07) 0 12px, transparent 12px 24px);
  display:flex; flex-direction:column; gap:6px; align-items:center; justify-content:center;
  text-align:center; padding:var(--s3);
}
.card__media--todo b{font-family:var(--font-display); font-size:.6875rem; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark)}
.card__media--todo span{font-size:.875rem; color:var(--muted); max-width:26ch}

.pathway{
  position:relative; overflow:hidden; border-radius:var(--radius-card);
  min-height:380px; display:flex; align-items:flex-end; color:var(--white);
  isolation:isolate;
}
.pathway img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-2; transition:transform .8s var(--ease)}
.pathway::after{content:""; position:absolute; inset:0; z-index:-1; background:linear-gradient(180deg, rgba(18,83,107,.15) 0%, rgba(11,17,20,.88) 100%)}
.pathway:hover img{transform:scale(1.05)}
.pathway__body{padding:var(--s4) var(--s3) var(--s3)}
.pathway__body h3{color:var(--white); font-size:1.5rem}
.pathway__body p{font-size:1rem; color:rgba(255,255,255,.8); margin-top:8px}


/* ---------- 10b. Feature card ----------
   Full-bleed photo, pill label, large heading. Used for the homepage
   Connect / Belong / Grow trio and the Contact next-step trio, so the two
   read as the same idea in two places. */
.feature{
  position:relative; overflow:hidden; isolation:isolate;
  border-radius:16px;
  width:100%; min-width:0;
  aspect-ratio:3/4;
  display:flex; flex-direction:column; justify-content:flex-end;
  color:var(--white);
}
.feature img{
  position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-2;
  filter:saturate(.94);
  transition:transform 1s var(--ease), filter var(--t-slow) var(--ease);
}
.feature:hover img{filter:saturate(1)}
.feature::after{
  content:""; position:absolute; inset:0; z-index:-1;
  background:
    linear-gradient(180deg, rgba(11,17,20,.42) 0%, rgba(11,17,20,.18) 30%, rgba(11,17,20,.78) 68%, rgba(11,17,20,.95) 100%),
    linear-gradient(0deg, rgba(11,17,20,.18), rgba(11,17,20,.18));
  transition:opacity var(--t-slow) var(--ease);
}
.feature__body{padding:var(--s4) var(--s3) var(--s3); display:flex; flex-direction:column; gap:var(--s2)}
.feature__tag{
  align-self:flex-start;
  font-family:var(--font-display); font-size:.6875rem; font-weight:600;
  letter-spacing:.16em; text-transform:uppercase;
  color:var(--white);
  border:1px solid rgba(255,255,255,.55); border-radius:100px;
  padding:9px 18px; line-height:1;
  backdrop-filter:blur(4px); background:rgba(255,255,255,.06);
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease), color var(--t-base) var(--ease);
}
.feature h3{
  color:var(--white);
  font-size:clamp(1.5rem, 2.1vw, 2rem);
  font-weight:600; line-height:1.1; letter-spacing:-.02em;
  max-width:14ch;
  transition:transform var(--t-slow) var(--ease);
}
.feature p{
  font-size:1rem; line-height:1.55; color:rgba(255,255,255,.76);
  max-width:34ch;
  transition:transform var(--t-slow) var(--ease);
}
.feature .link-arrow{color:var(--gold); font-size:.9375rem; align-self:flex-start; margin-top:4px}

@media (hover:hover){
  .feature:hover img{transform:scale(1.05)}
  .feature:hover::after{opacity:.88}
  .feature:hover .feature__tag{background:var(--white); border-color:var(--white); color:var(--ink)}
  .feature:hover h3,.feature:hover p{transform:translateY(-4px)}
}


/* ---------- 10c. Icon card ----------
   Six-up grid on New Here ("what to expect"). Deliberately quiet — the row
   is a list of qualities, not six competing calls to action. */
.icon-card{
  background:var(--white); border:1px solid var(--line); border-radius:var(--radius-card);
  padding:var(--s4) var(--s3); display:flex; flex-direction:column; gap:var(--s2);
  transition:transform var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease),
             border-color var(--t-base) var(--ease);
}
.icon-card__icon{
  width:52px; height:52px; border-radius:50%;
  background:var(--sky); color:var(--teal);
  display:grid; place-items:center; flex:none;
  transition:background var(--t-base) var(--ease), color var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.icon-card__icon svg{width:22px; height:22px}
.icon-card h3{font-size:1.125rem; font-weight:600}
.icon-card p{font-size:1rem; color:var(--muted); line-height:1.55}
@media (hover:hover){
  .icon-card:hover{transform:translateY(-2px); box-shadow:var(--shadow-card); border-color:transparent}
  .icon-card:hover .icon-card__icon{background:var(--teal); color:var(--white); transform:scale(1.06)}
}

/* ---------- 10d. Checklist ---------- */
.checklist{display:flex; flex-direction:column; gap:var(--s2); margin-top:var(--s3)}
.checklist li{display:flex; gap:14px; align-items:flex-start; font-size:1.0625rem}
.checklist svg{width:22px; height:22px; flex:none; margin-top:4px; color:var(--gold)}

/* ---------- 3b. Image band ----------
   A section whose background is a photograph. Used once per page at most. */
.band-image{position:relative; isolation:isolate; color:var(--white); overflow:hidden}
.band-image > img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-2}
.band-image::after{
  content:""; position:absolute; inset:0; z-index:-1;
  background:linear-gradient(180deg, rgba(11,17,20,.86), rgba(11,17,20,.78)),
             linear-gradient(90deg, rgba(14,65,85,.4), transparent 60%);
}
.band-image h1,.band-image h2,.band-image h3{color:var(--white)}
.band-image .eyebrow{color:var(--gold)}
.band-image .lead{color:rgba(255,255,255,.82)}

/* ---------- 4b. Pull quote ---------- */
.pullquote{
  border-left:3px solid var(--gold); padding-left:var(--s4);
  font-family:var(--font-display); font-weight:600;
  font-size:clamp(1.375rem,2.4vw,1.875rem); line-height:1.3; letter-spacing:-.015em;
  max-width:26ch;
}

/* ---------- 11. Ministry list ---------- */
.ministry{
  border-top:1px solid var(--line);
  padding-block:var(--s3);
  display:grid; grid-template-columns:220px 1fr auto; gap:var(--s4); align-items:baseline;
  transition:background var(--t-base) var(--ease), padding-inline var(--t-base) var(--ease);
}
.ministry:last-child{border-bottom:1px solid var(--line)}
.ministry h3{font-size:1.25rem}
.ministry p{font-size:1rem; color:var(--muted)}
.ministry__tag{
  font-family:var(--font-display); font-size:.6875rem; font-weight:600;
  letter-spacing:.12em; text-transform:uppercase; color:var(--teal);
  background:var(--sky); padding:5px 12px; border-radius:5px; white-space:nowrap;
}
@media (hover:hover){ .ministry:hover{background:var(--sky); padding-inline:var(--s3)} }


/* ---------- 11b. Doctrine list ----------
   Sixteen statements is a lot of prose. The number does the wayfinding, the
   key phrase gives each one a handle, and the measure stays at 62ch so the
   longer statements don't become a wall. */
.doctrine{display:flex; flex-direction:column}
.doctrine__item{
  display:grid; grid-template-columns:88px 1fr; gap:var(--s4);
  padding-block:var(--s4);
  border-top:1px solid var(--line);
  scroll-margin-top:120px;
  transition:background var(--t-base) var(--ease);
}
.doctrine__item:last-child{border-bottom:1px solid var(--line)}
.doctrine__num{
  font-family:var(--font-display); font-weight:700; font-size:1.5rem;
  color:var(--line); font-variant-numeric:tabular-nums; line-height:1;
  padding-top:4px;
  transition:color var(--t-base) var(--ease);
}
.doctrine__item:hover .doctrine__num,
.doctrine__item.is-active .doctrine__num{color:var(--gold)}
.doctrine__lede{
  font-family:var(--font-display); font-size:.6875rem; font-weight:600;
  letter-spacing:.2em; text-transform:uppercase; color:var(--teal);
  display:block; margin-bottom:10px;
}
.doctrine p{font-size:1.0625rem; line-height:1.65; color:var(--muted); max-width:62ch}
.doctrine p strong{color:var(--ink); font-weight:600}

/* ---------- 11c. Scroll-spy rail ----------
   Desktop only. There is no Elementor equivalent — it stays as a small
   custom script on this one page. */
.spy{display:none}
@media (min-width:1100px){
  .spy-layout{display:grid; grid-template-columns:260px 1fr; gap:var(--s6); align-items:start}
  .spy{display:block; position:sticky; top:120px; max-height:calc(100vh - 180px); overflow-y:auto}
  .spy h4{
    font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
    letter-spacing:.16em; text-transform:uppercase; color:var(--muted); margin-bottom:var(--s3);
  }
  .spy ol{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:1px}
  .spy a{
    display:grid; grid-template-columns:26px 1fr; gap:10px; align-items:baseline;
    font-size:.875rem; line-height:1.35; color:var(--muted);
    padding:7px 10px; border-radius:6px; border-left:2px solid transparent;
    transition:color var(--t-fast) var(--ease), background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
  }
  .spy a span{font-variant-numeric:tabular-nums; color:var(--line-2, #C6CED1)}
  .spy a:hover{color:var(--ink); background:var(--sky)}
  .spy a.is-active{color:var(--teal); background:var(--sky); border-left-color:var(--teal); font-weight:500}
  .spy a.is-active span{color:var(--gold)}
}


/* ---------- 11d. Alternating rows ----------
   Image one side, copy the other, sides swapping row by row. Used for the
   ministry lists, where thirteen cards in a grid read as a catalogue and
   thirteen alternating rows read as a tour. */
.alt-list{display:flex; flex-direction:column; gap:var(--s5)}
.alt-row{display:grid; grid-template-columns:1fr 1fr; gap:var(--s5); align-items:center}
.alt-row:nth-child(even) .alt-row__media{order:2}

.alt-row__media{
  border-radius:var(--radius-card); overflow:hidden; position:relative;
  background:var(--sky);
}
.alt-row__media img{
  width:100%; aspect-ratio:4/3; object-fit:cover; display:block;
  transition:transform .9s var(--ease);
}
@media (hover:hover){ .alt-row:hover .alt-row__media img{transform:scale(1.04)} }

.alt-row__media--todo{
  aspect-ratio:4/3; background:repeating-linear-gradient(45deg, rgba(197,160,89,.08) 0 14px, transparent 14px 28px);
  border:1px dashed var(--gold); display:flex; flex-direction:column;
  align-items:center; justify-content:center; gap:8px; text-align:center; padding:var(--s4);
}
.alt-row__media--todo b{font-family:var(--font-display); font-size:.6875rem; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark)}
.alt-row__media--todo span{font-size:.9375rem; color:var(--muted); max-width:30ch}

.alt-row__body{display:flex; flex-direction:column; gap:var(--s2); max-width:52ch}
.alt-row__meta{display:flex; align-items:center; gap:16px}
.alt-row__num{
  font-family:var(--font-display); font-weight:700; font-size:1rem;
  color:var(--gold); font-variant-numeric:tabular-nums; line-height:1;
}
.alt-row__body h3{font-size:clamp(1.5rem,2.4vw,2rem); line-height:1.12}
.alt-row__body p{font-size:1.0625rem; line-height:1.65; color:var(--muted)}
.alt-row__body .link-arrow{margin-top:var(--s2); align-self:flex-start; font-size:.9375rem}

/* on dark bands the copy inverts */
.band--deep .alt-row__body p,.band--teal .alt-row__body p{color:rgba(255,255,255,.76)}
.band--deep .alt-row__media,.band--teal .alt-row__media{background:rgba(255,255,255,.06)}
.band--deep .alt-row__media--todo span,.band--teal .alt-row__media--todo span{color:rgba(255,255,255,.7)}

@media (max-width:900px){
  .alt-list{gap:var(--s5)}
  .alt-row{grid-template-columns:1fr; gap:var(--s3)}
  .alt-row:nth-child(even) .alt-row__media{order:0}
  .alt-row__body{max-width:none}
  .alt-row__body h3{font-size:1.375rem}
}


/* ---------- 11e. Story block ----------
   A long first-person testimony beside a photograph that stays put while the
   prose scrolls. Two of these on Our Story, mirrored. */
.story{display:grid; grid-template-columns:0.85fr 1.15fr; gap:var(--s6); align-items:start}
.story + .story{margin-top:var(--s7)}
.story--alt{grid-template-columns:1.15fr 0.85fr}
.story--alt .story__media{order:2}
.story__media{
  position:sticky; top:118px;
  border-radius:var(--radius-card); overflow:hidden; background:var(--sky);
}
.story__media img{width:100%; aspect-ratio:4/5; object-fit:cover; display:block; transition:transform 1s var(--ease)}
@media (hover:hover){ .story:hover .story__media img{transform:scale(1.03)} }
.story__caption{
  padding:16px 18px; font-size:.875rem; color:var(--muted); line-height:1.5;
  border-top:1px solid var(--line); background:var(--white);
}
.story__body > * + *{margin-top:var(--s3)}
.story__body p{font-size:1.0625rem; line-height:1.75; color:var(--ink)}
.story__body .pullquote{margin-block:var(--s4)}
.story__name{
  font-family:var(--font-display); font-size:.6875rem; font-weight:600;
  letter-spacing:.2em; text-transform:uppercase; color:var(--teal);
}

.factlist{
  display:grid; grid-template-columns:1fr; gap:0; margin-top:var(--s4);
  border-top:1px solid var(--line);
}
.factlist div{display:grid; grid-template-columns:190px 1fr; gap:var(--s3); padding:16px 0; border-bottom:1px solid var(--line)}
.factlist dt{font-family:var(--font-display); font-size:var(--fs-label); font-weight:600; letter-spacing:.12em; text-transform:uppercase; color:var(--muted)}
.factlist dd{margin:0; font-size:1.0625rem}

@media (max-width:900px){
  .story{grid-template-columns:1fr; gap:var(--s4)}
  .story--alt .story__media{order:0}
  .story__media{position:static}
  .story__media img{aspect-ratio:4/3}
  .story + .story{margin-top:var(--s6)}
  .factlist div{grid-template-columns:1fr; gap:4px}
}


/* ---------- 11f. People ----------
   Portrait grid for Our Team. Where a photograph does not exist yet the tile
   falls back to a monogram — it reads as a considered placeholder rather than
   a hole, and the "photo to come" tag keeps it honest. */
.people{display:grid; grid-template-columns:repeat(4,1fr); gap:var(--s3)}
.person{display:flex; flex-direction:column; gap:0}
.person__media{
  position:relative; aspect-ratio:4/5; overflow:hidden;
  border-radius:var(--radius-card); background:var(--sky);
}
.person__media img{width:100%; height:100%; object-fit:cover; transition:transform .8s var(--ease), filter var(--t-slow) var(--ease)}
@media (hover:hover){ .person:hover .person__media img{transform:scale(1.04)} }

.person__mono{
  position:absolute; inset:0; display:grid; place-items:center;
  background:linear-gradient(160deg, var(--sky), #E7EFF3);
  border:1px solid var(--line);
  border-radius:var(--radius-card);
  transition:background var(--t-slow) var(--ease);
}
.person__mono span{
  font-family:var(--font-display); font-weight:600; font-size:2.5rem;
  letter-spacing:.02em; color:var(--teal); opacity:.55;
  transition:opacity var(--t-slow) var(--ease), transform var(--t-slow) var(--ease);
}
@media (hover:hover){
  .person:hover .person__mono{background:linear-gradient(160deg,#E7EFF3,#DCE8ED)}
  .person:hover .person__mono span{opacity:.8; transform:scale(1.04)}
}
.person__todo{
  position:absolute; left:12px; bottom:12px;
  font-family:var(--font-display); font-size:.625rem; font-weight:600;
  letter-spacing:.14em; text-transform:uppercase; color:var(--gold-dark);
  background:rgba(255,255,255,.9); border:1px solid var(--gold);
  padding:5px 10px; border-radius:5px;
}
.person__body{padding-top:var(--s2)}
.person__body h3{font-size:1.0625rem; font-weight:600}
.person__body p{font-size:.9375rem; color:var(--muted); margin-top:3px}

.lead-pair{display:grid; grid-template-columns:1fr 1fr; gap:var(--s6); align-items:center}
.lead-pair__media{border-radius:var(--radius-card); overflow:hidden}
.lead-pair__media img{width:100%; aspect-ratio:4/3; object-fit:cover; display:block}
.lead-pair__names{display:flex; flex-direction:column; gap:var(--s3); margin-top:var(--s4)}
.lead-pair__names > div{padding-bottom:var(--s3); border-bottom:1px solid var(--line)}
.lead-pair__names h3{font-size:1.25rem}
.lead-pair__names p{font-size:1rem; color:var(--muted); margin-top:4px}

@media (max-width:1024px){ .people{grid-template-columns:repeat(3,1fr)} .lead-pair{grid-template-columns:1fr; gap:var(--s4)} }
@media (max-width:768px){ .people{grid-template-columns:repeat(2,1fr)} }
@media (max-width:480px){ .people{grid-template-columns:1fr 1fr; gap:var(--s2)} .person__mono span{font-size:1.75rem} }


/* ---------- 11g. Giving ---------- */
.give-grid{display:grid; grid-template-columns:1.15fr 1fr; gap:var(--s3); align-items:stretch}
.give-grid > *{min-width:0}
.give-card{
  background:var(--white); border:1px solid var(--line); border-radius:var(--radius-card);
  padding:var(--s4); display:flex; flex-direction:column; gap:var(--s3);
}
.give-card--primary{border-color:var(--teal); box-shadow:0 0 0 3px rgba(25,111,143,.08)}
.give-card__head{display:flex; align-items:center; gap:14px}
.give-card__icon{
  width:48px; height:48px; border-radius:12px; flex:none;
  background:var(--sky); color:var(--teal); display:grid; place-items:center;
}
.give-card__icon svg{width:22px; height:22px}
.give-card h3{font-size:1.25rem}
.give-card p{font-size:1rem; color:var(--muted); line-height:1.6}

.qr-block{display:flex; gap:var(--s4); align-items:center; flex-wrap:wrap}
.qr-block > div{min-width:0; flex:1}
.qr-block img{
  width:190px; height:190px; flex:none;
  border:1px solid var(--line); border-radius:12px; padding:10px; background:var(--white);
}
.qr-block__note{font-size:.9375rem; color:var(--muted); max-width:30ch}

.copyfield{display:flex; min-width:0; align-items:stretch; border:1px solid var(--line); border-radius:10px; overflow:hidden; background:var(--surface-2, #F8F9FA)}
.copyfield code{
  flex:1; min-width:0; padding:14px 16px; font-family:ui-monospace,Menlo,monospace;
  font-size:.875rem; color:var(--ink); overflow-x:auto; white-space:nowrap; background:none;
}
.copyfield button{
  flex:none; padding:0 20px; background:var(--teal); color:var(--white);
  font-family:var(--font-display); font-weight:600; font-size:.8125rem;
  letter-spacing:.06em; text-transform:uppercase;
  transition:background var(--t-base) var(--ease);
}
.copyfield button:hover{background:var(--teal-dark)}
.copyfield button.is-done{background:var(--ok, #2C6650)}

/* the app-scheme button only exists where an app can answer it */
.upi-app{display:none}
@media (hover:none) and (pointer:coarse){
  .upi-app{display:inline-flex}
  .qr-block img{width:150px; height:150px}
}
.upi-desktop-note{font-size:.9375rem; color:var(--muted)}
@media (hover:none) and (pointer:coarse){ .upi-desktop-note{display:none} }

.applist{display:flex; flex-wrap:wrap; gap:8px}
.applist span{
  font-family:var(--font-display); font-size:.8125rem; font-weight:500;
  color:var(--ink); background:var(--sky); border:1px solid var(--line);
  padding:7px 14px; border-radius:100px;
}

@media (max-width:900px){ .give-grid{grid-template-columns:1fr} }


/* ---------- 11h. Error page ---------- */
.error-hero{
  min-height:72svh; display:flex; align-items:center;
  padding-top:var(--header-h); position:relative; isolation:isolate;
  color:var(--white); overflow:hidden;
}
.error-hero > img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-2}
.error-hero::after{content:""; position:absolute; inset:0; z-index:-1; background:linear-gradient(120deg, rgba(11,17,20,.92), rgba(14,65,85,.82))}
.error-hero h1{color:var(--white); font-size:clamp(2.25rem,4.6vw,3.25rem); max-width:18ch}
.error-code{
  font-family:var(--font-display); font-weight:700; line-height:.9;
  font-size:clamp(5rem,16vw,11rem); color:rgba(255,255,255,.13);
  letter-spacing:-.04em; margin-bottom:-.12em;
}
.error-links{display:flex; flex-wrap:wrap; gap:10px; margin-top:var(--s4)}
.error-links a{
  font-family:var(--font-display); font-weight:500; font-size:.9375rem;
  padding:10px 18px; border-radius:100px; color:var(--white);
  border:1px solid rgba(255,255,255,.35);
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease), color var(--t-base) var(--ease);
}
.error-links a:hover{background:var(--white); color:var(--ink); border-color:var(--white)}

/* ---------- 11i. Legal / long-form document ---------- */
.legal{max-width:70ch}
.legal h2{font-size:1.375rem; margin-top:var(--s5)}
.legal h2:first-child{margin-top:0}
.legal h3{font-size:1.0625rem; margin-top:var(--s4); font-family:var(--font-body); font-weight:700}
.legal p,.legal li{font-size:1.0625rem; line-height:1.7; color:var(--ink)}
.legal p + p,.legal h2 + p,.legal h3 + p,.legal p + ul,.legal ul + p{margin-top:var(--s2)}
.legal ul{list-style:disc; padding-left:22px; margin-top:var(--s2); display:flex; flex-direction:column; gap:8px}
.legal a{color:var(--teal); text-decoration:underline; text-underline-offset:3px}
.legal .fill{background:var(--flag-soft,#FAEFE0); border-bottom:1px dashed var(--gold); padding:1px 5px; border-radius:3px; color:var(--flag,#9C5C15); font-weight:500}
.legal__meta{font-size:.9375rem; color:var(--muted); padding-bottom:var(--s3); border-bottom:1px solid var(--line); margin-bottom:var(--s5)}

/* ---------- 12. Video card ---------- */
.video-card{
  position:relative; border-radius:var(--radius-card); overflow:hidden;
  aspect-ratio:16/9; display:grid; place-items:center; isolation:isolate;
}
.video-card img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-2; filter:brightness(.55)}
.video-card::after{content:""; position:absolute; inset:0; z-index:-1; background:rgba(11,17,20,.25)}
.video-card__play{
  width:88px; height:88px; border-radius:50%;
  background:rgba(255,255,255,.14); backdrop-filter:blur(6px);
  border:1px solid rgba(255,255,255,.5);
  display:grid; place-items:center; color:var(--white);
  transition:transform var(--t-base) var(--ease), background var(--t-base) var(--ease);
}
.video-card:hover .video-card__play{transform:scale(1.08); background:var(--teal)}
.video-card__play svg{width:26px; height:26px; margin-left:4px}

/* ---------- 13. Events ---------- */
.event{position:relative; border-radius:var(--radius-card); overflow:hidden; isolation:isolate; min-height:300px; display:flex; align-items:flex-end; color:var(--white)}
.event img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-2; transition:transform .8s var(--ease)}
.event::after{content:""; position:absolute; inset:0; z-index:-1; background:linear-gradient(180deg,rgba(11,17,20,.1),rgba(11,17,20,.9))}
.event:hover img{transform:scale(1.05)}
.event__body{padding:var(--s3)}
.event__date{font-family:var(--font-display); font-size:.75rem; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--gold)}
.event__body h3{color:var(--white); font-size:1.25rem; margin-top:8px}

/* ---------- 14. Visit ---------- */
.visit{display:grid; grid-template-columns:1fr 1fr; gap:0; align-items:stretch}
.visit__map{min-height:460px; position:relative; background:var(--sky)}
.visit__map iframe{position:absolute; inset:0; width:100%; height:100%; border:0; filter:grayscale(.3)}
.visit__body{padding:var(--s6) var(--s5); display:flex; flex-direction:column; justify-content:center; background:var(--teal); color:var(--white)}
.visit__details{margin-top:var(--s4); display:flex; flex-direction:column; gap:var(--s3)}
.visit__details div{display:flex; flex-direction:column; gap:2px}
.visit__details dt{font-family:var(--font-display); font-size:var(--fs-label); font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:var(--gold)}
.visit__details dd{margin:0; font-size:1.0625rem; color:rgba(255,255,255,.92); font-weight:300}
.visit__details a:hover{text-decoration:underline}

/* ---------- 15. Footer ---------- */
/* The footer is the one place on the site that carries a gradient rather than a
   flat band. It runs from the brand teal down into the same ink the dark
   sections use, so the page settles rather than stopping dead — and on the home
   page, where the Visit band above it is already a deep teal (#0E4155), the two
   read as one closing movement instead of two unrelated blocks.

   The bottom stays at the ink because a footer that ends on a mid-tone floats:
   the darkest value belongs at the very bottom of the page, under the copyright
   line, where it anchors everything above it. */
.footer{
  background:var(--ink-deep);
  background:linear-gradient(180deg, #17698A 0%, #0F4A61 48%, var(--ink-deep) 100%);
  /* Raised from .72. Muted white over the teal at the top of the gradient came
     out at about 3:1, which is below the 4.5:1 that body text needs; .85 puts it
     back over the line without making the secondary text shout. */
  color:rgba(255,255,255,.85);
  padding-block:var(--s6) 0; font-size:1rem;
}
.footer__grid{display:grid; grid-template-columns:1.5fr 1fr 1fr 1.45fr; gap:var(--s5)}
.footer__brand img{height:52px; width:auto; margin-bottom:var(--s3)}
.footer__brand p{font-size:1rem; line-height:1.65; max-width:38ch}
/* Column headings in gold. On the teal-to-ink gradient the gold is the only
   accent that holds its value from the top of the footer to the bottom, and it
   separates the three headings from the links under them without needing a
   rule or a size jump. */
.footer h4{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.16em; text-transform:uppercase; color:var(--gold); margin-bottom:var(--s3);
}
.footer__links{display:flex; flex-direction:column; gap:12px}
.footer__links a{transition:color var(--t-fast) var(--ease), padding-left var(--t-fast) var(--ease)}
.footer__links a:hover{color:var(--gold); padding-left:5px}

/* Visit Us is the one column that is not a list of links, so it is grouped
   instead: a small white sub-label naming each group, then icon-led rows. The
   sub-label is white rather than gold so it reads as a level below the gold
   column heading rather than competing with it. */
.footer__sub{
  font-family:var(--font-display); font-size:.75rem; font-weight:700;
  letter-spacing:.14em; text-transform:uppercase; color:var(--white);
  margin:0 0 10px;
}
.footer__sub + .footer__contact{margin-bottom:var(--s3)}
.footer__visit .footer__sub:not(:first-of-type){margin-top:2px}
.footer__contact{display:flex; flex-direction:column; gap:10px}
.footer__contact li{display:grid; grid-template-columns:20px 1fr; gap:12px; align-items:start}
.footer__ic{
  display:inline-flex; align-items:center; justify-content:center;
  width:20px; height:1.6em; color:var(--gold); flex:none;
}
.footer__ic svg{width:15px; height:15px; stroke-width:1.9}
.footer__contact a{transition:color var(--t-fast) var(--ease)}
.footer__contact a:hover{color:var(--gold)}
.socials{display:flex; gap:12px; margin-top:var(--s3)}
.socials a{
  width:42px; height:42px; border-radius:50%; border:1px solid rgba(255,255,255,.2);
  display:grid; place-items:center; color:var(--white);
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
/* On teal, the brand teal hover would vanish into the ground; gold is the
   accent that still reads at the top of the gradient. */
.socials a:hover{background:var(--gold); border-color:var(--gold); color:var(--ink); transform:translateY(-2px)}
.socials svg{width:18px; height:18px}
.footer__bottom{
  margin-top:var(--s6); padding-block:var(--s3);
  border-top:1px solid rgba(255,255,255,.1);
  display:flex; flex-wrap:wrap; gap:var(--s2) var(--s4); justify-content:space-between;
  font-size:.9375rem; color:rgba(255,255,255,.62);
}
/* The build credit sits at the right-hand end of the bottom bar. Quieter than
   the copyright and the privacy link, because it is the one line on the page
   that is about us rather than about the church. */
.footer__credit{margin-left:auto; color:rgba(255,255,255,.5)}
.footer__credit a{
  color:rgba(255,255,255,.72);
  text-decoration:underline; text-decoration-color:transparent;
  text-underline-offset:4px;
  transition:color var(--t-fast) var(--ease), text-decoration-color var(--t-fast) var(--ease);
}
.footer__credit a:hover{color:var(--gold); text-decoration-color:var(--gold)}
@media (max-width:640px){ .footer__credit{margin-left:0} }

/* ---------- 16. Placeholder (approved-asset gaps) ---------- */
.placeholder{
  border:1px dashed var(--gold);
  background:repeating-linear-gradient(45deg, rgba(197,160,89,.06) 0 10px, transparent 10px 20px);
  border-radius:var(--radius-img);
  padding:var(--s3);
  display:flex; flex-direction:column; gap:6px; justify-content:center;
  min-height:120px;
}
.placeholder b{font-family:var(--font-display); font-size:.75rem; font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:var(--gold-dark)}
.placeholder span{font-size:.9375rem; color:var(--muted)}

/* ==========================================================================
   17. MOTION
   Two halves: entrance (once, on scroll into view) and hover (continuous).
   Entrance is opt-in per element via data-anim, and gated behind .has-anim
   which JS sets on <html> — so with JS off or broken, everything is visible.
   ========================================================================== */

/* ---- 17a. Entrance ---- */
.has-anim [data-anim]{
  opacity:0;
  transition:opacity .75s var(--ease), transform .75s var(--ease), clip-path .9s var(--ease);
  transition-delay:var(--d,0ms);
  will-change:opacity, transform;
}
/* Release the compositor layer once the element has arrived — on a long page
   leaving will-change on 60+ elements costs more than it saves. */
.has-anim [data-anim].is-in{will-change:auto}
.has-anim [data-anim="up"]      {transform:translateY(30px)}
.has-anim [data-anim="down"]    {transform:translateY(-26px)}
.has-anim [data-anim="left"]    {transform:translateX(-36px)}
.has-anim [data-anim="right"]   {transform:translateX(36px)}
.has-anim [data-anim="scale"]   {transform:scale(.93)}
.has-anim [data-anim="fade"]    {transform:none}
.has-anim [data-anim="clip"]    {clip-path:inset(100% 0 0 0 round var(--clip-r,0px)); opacity:1}
.has-anim .split__media[data-anim="clip"]{--clip-r:var(--radius-img)}
.has-anim .pathway[data-anim="clip"],
.has-anim .event[data-anim="clip"],
.has-anim .video-card[data-anim="clip"]{--clip-r:var(--radius-card)}
.has-anim [data-anim="clip"] img{transform:scale(1.14); transition:transform 1.3s var(--ease); transition-delay:var(--d,0ms)}
.has-anim [data-anim="blur"]    {transform:translateY(20px); filter:blur(8px); transition-property:opacity,transform,filter}

.has-anim [data-anim].is-in{
  opacity:1;
  transform:none;
  clip-path:inset(0 0 0 0 round var(--clip-r,0px));
  filter:none;
}
.has-anim [data-anim="clip"].is-in img{transform:scale(1)}

/* Heading mask — JS wraps the heading in .mask, the heading rises from behind it */
.has-anim .mask{overflow:hidden; display:block; padding-bottom:.12em; margin-bottom:-.12em}
.has-anim .mask > [data-anim="mask"]{
  display:block; transform:translateY(108%); opacity:1;
  transition:transform .9s var(--ease); transition-delay:var(--d,0ms);
}
.has-anim .mask > [data-anim="mask"].is-in{transform:translateY(0)}

/* Rule that draws itself in */
.has-anim [data-anim="rule"]{
  opacity:1; transform-origin:left center; transform:scaleX(0);
  transition:transform .9s var(--ease); transition-delay:var(--d,0ms);
}
.has-anim [data-anim="rule"].is-in{transform:scaleX(1)}

/* Legacy hooks kept so older markup still animates */
.has-anim [data-reveal]{opacity:0; transform:translateY(28px); transition:opacity .7s var(--ease), transform .7s var(--ease)}
.has-anim [data-reveal].is-in{opacity:1; transform:none}

/* ---- 17b. Hover ---- */
/* Buttons: lift plus a light sweep across the face */
.btn{position:relative; overflow:hidden; isolation:isolate}
.btn::before{
  content:""; position:absolute; inset:0; z-index:-1;
  background:linear-gradient(110deg, transparent 20%, rgba(255,255,255,.22) 50%, transparent 80%);
  transform:translateX(-120%);
  transition:transform .7s var(--ease);
}
.btn:hover::before{transform:translateX(120%)}
.btn:active{transform:translateY(0)}

/* Contact icons fill on hover */
.contact-item{transition:transform var(--t-base) var(--ease)}
.contact-item__icon{transition:background var(--t-base) var(--ease), color var(--t-base) var(--ease), transform var(--t-base) var(--ease)}
.contact-item:hover .contact-item__icon{background:var(--teal); color:var(--white); transform:scale(1.06) rotate(-4deg)}

/* Pathway + event: gold rule grows along the bottom edge */
.pathway,.event{position:relative}
.pathway::before,.event::before{
  content:""; position:absolute; left:0; right:0; bottom:0; height:3px; z-index:3;
  background:var(--gold); transform:scaleX(0); transform-origin:left;
  transition:transform var(--t-slow) var(--ease);
}
.pathway:hover::before,.event:hover::before{transform:scaleX(1)}
.pathway__body h3,.event__body h3{transition:transform var(--t-base) var(--ease)}
.pathway:hover .pathway__body h3,.event:hover .event__body h3{transform:translateX(6px)}

/* Identity panel label lifts as the image warms up */
.identity__panel span{transition:transform var(--t-slow) var(--ease)}
.identity__panel:hover span{transform:translateY(-6px)}

/* Card heading takes the teal on hover */
.card__body h3{transition:color var(--t-base) var(--ease)}
@media (hover:hover){ .card:hover .card__body h3{color:var(--teal)} }

/* Video play button pulses at rest */
@media (hover:hover){
  .video-card__play{animation:pulse 2.8s var(--ease) infinite}
  .video-card:hover .video-card__play{animation:none}
}
@keyframes pulse{
  0%,100%{box-shadow:0 0 0 0 rgba(255,255,255,.28)}
  70%{box-shadow:0 0 0 22px rgba(255,255,255,0)}
}

/* Stat figures nudge up together */
.stat b{transition:transform var(--t-base) var(--ease)}
.stat:hover b{transform:translateY(-3px)}

/* ---------- 18. Responsive — Elementor's own breakpoints ---------- */
@media (max-width:1024px){
  :root{--section-y:50px; --fs-body:1.125rem}
  .feature{aspect-ratio:4/5}
  .header__nav{display:none}
  .header__actions{display:none}
  .submenu{display:none}
  .menu-btn{margin-left:auto}
  .burger{display:block}
  .split{grid-template-columns:1fr; gap:var(--s4)}
  .split--reverse .split__media{order:0}
  .split__media img{aspect-ratio:3/2}
  .identity__grid{grid-template-columns:repeat(3,1fr)}
  .identity__panel:nth-child(4),.identity__panel:nth-child(5){aspect-ratio:16/10}
  .grid--4{grid-template-columns:repeat(2,1fr)}
  .grid--3.grid--expect{grid-template-columns:repeat(2,1fr)}
  .visit{grid-template-columns:1fr}
  .visit__body{padding:var(--s5) var(--gutter)}
  .footer__grid{grid-template-columns:1fr 1fr; gap:var(--s4)}
  .hero__times{grid-template-columns:repeat(2,1fr); gap:var(--s3) var(--s4)}
}
@media (max-width:768px){
  :root{--section-y:40px; --gutter:20px; --header-h:72px}
  .grid--3,.grid--2{grid-template-columns:1fr}
  .feature{aspect-ratio:4/3}
  .identity__grid{grid-template-columns:repeat(2,1fr)}
  .identity__panel{aspect-ratio:1}
  .ministry{grid-template-columns:1fr; gap:8px}
  .doctrine__item{grid-template-columns:1fr; gap:8px}
  .doctrine__num{font-size:1.125rem; padding-top:0}
  .ministry__tag{justify-self:start}
  .stat-strip{gap:var(--s4)}
  .stat b{font-size:2.25rem}
  .form__row{grid-template-columns:1fr}
}
@media (max-width:480px){
  :root{--fs-body:1.0625rem}
  .grid--4{grid-template-columns:1fr}
  .identity__grid{grid-template-columns:1fr}
  .identity__panel{aspect-ratio:16/10}
  .hero__times{grid-template-columns:1fr}
  .hero__cta .btn{width:100%; justify-content:center}
  .footer__grid{grid-template-columns:1fr}
}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important}
  [data-reveal],[data-stagger] > *,[data-anim]{opacity:1 !important; transform:none !important; clip-path:none !important; filter:none !important}
  [data-anim="clip"] img{transform:none !important}
  .mask > [data-anim="mask"]{transform:none !important}
  .video-card__play{animation:none !important}
  .btn::before{display:none}
  .hero [data-seq]{opacity:1 !important; transform:none !important; animation:none !important}
  .hero__media{transform:none !important}
}

/* ==========================================================================
   19. ELEMENTOR THEME BUILDER BRIDGE
   Only needed because the chrome now renders inside Elementor's own wrappers.
   Nothing here changes the approved design — it removes wrapper side effects.
   ========================================================================== */

/* The top bar is position:absolute and expects the page as its containing
   block. Elementor containers are position:relative by default, which would
   trap it inside the header template instead. Neutralise the whole chain. */
.elementor-location-header,
.elementor-location-header .e-con,
.elementor-location-header .e-con-inner,
.elementor-location-header .elementor-element,
.elementor-location-header .elementor-widget-container{
  position:static;
}

/* Elementor containers ship their own padding, width cap and gap. The header
   and footer bring their own .container, so strip the outer ones to zero. */
.elementor-location-header .e-con,
.elementor-location-header .e-con-inner,
.elementor-location-footer .e-con,
.elementor-location-footer .e-con-inner{
  padding:0; margin:0; max-width:none; --gap:0px;
}
.elementor-location-header .elementor-widget:not(:last-child),
.elementor-location-footer .elementor-widget:not(:last-child){
  margin-bottom:0;
}

/* The header location itself must not create a stacking context that sits
   under the page, or the fixed header disappears behind hero imagery. */
.elementor-location-header{z-index:100}

/* Hello Elementor reserves space for a static header; ours is fixed and the
   hero paints underneath it, so that reservation has to go. */
.site-header{display:none}
.elementor-location-footer{position:relative; z-index:1}

/* Elementor's shortcode widget wraps output in a div. The footer grid and the
   header flex row both expect to be direct children of their own .container,
   which they still are — but the wrapper must not add its own box. */
.elementor-widget-shortcode > .elementor-widget-container,
.elementor-widget-shortcode .elementor-shortcode{
  display:contents;
}

/* Link colour for editor-built content only.
   Elementor's Theme Style would set this globally as `.elementor-kit-N a`,
   which outranks a single class and repaints the chrome — the Give button
   came out teal on teal. So the kit leaves links alone and content links
   are scoped to the widgets that actually hold prose. */
.elementor-widget-text-editor a,
.elementor-widget-theme-post-content a,
.elementor-widget-heading a{
  color:var(--teal);
  transition:color var(--t-fast) var(--ease);
}
.elementor-widget-text-editor a:hover,
.elementor-widget-theme-post-content a:hover,
.elementor-widget-heading a:hover{color:var(--teal-dark)}

/* Logged-in only: WordPress's fixed admin bar sits over the top utility bar,
   which is absolutely positioned at the document top. Nudge both down so the
   chrome is legible while editing. Visitors never load the admin bar. */
.admin-bar .topbar{top:32px}
.admin-bar .header{top:calc(var(--topbar-h) + 32px)}
.admin-bar .header.is-stuck{top:32px}
@media screen and (max-width:782px){
  .admin-bar .topbar{top:46px}
  .admin-bar .header{top:calc(var(--topbar-h) + 46px)}
  .admin-bar .header.is-stuck{top:46px}
}

/* Contact form result banner. Success and failure need to be told apart
   without relying on colour alone, so each carries its own left rule weight
   and the text states the outcome plainly. */
.form__result{
  padding:16px 20px; border-radius:var(--radius-card);
  font-size:1rem; line-height:1.5; margin-bottom:var(--s3);
  border-left:4px solid;
}
.form__result--ok{background:var(--sky); border-left-color:var(--teal); color:var(--teal-deep)}
.form__result--bad{background:#FDF3F2; border-left-color:#B03A2E; color:#8C2E24}

/* ==========================================================================
   20. MOBILE REFINEMENTS
   From a sweep of all ten pages at 320 / 360 / 390 / 430 / 768 / 1024.
   Every rule here fixes something the sweep measured, not something guessed.
   ========================================================================== */

/* --- 20a. "What to expect" grid never collapsed -------------------------
   .grid--3.grid--expect set two columns at <=1024. The .grid--3 single-column
   rule at <=768 is one class less specific, so it never won: at 320px the six
   cards were still two abreast in 78px columns and their headings spilled out
   of them. Restated at matching specificity, and stepped down twice. */
@media (max-width:768px){
  .grid--3.grid--expect{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:600px){
  .grid--3.grid--expect{grid-template-columns:1fr}
}

/* --- 20b. Touch targets -------------------------------------------------
   Footer links measured 17px tall, top-bar links 20px. WCAG 2.2 asks for at
   least 24px; 44px is what a thumb actually wants. Gated on a coarse pointer
   so the desktop layout keeps its tighter rhythm, and the list gap is traded
   for padding so the spacing stays where it was. */
@media (pointer:coarse){
  .footer__links{gap:0}
  .footer__links a{
    display:inline-flex; align-items:center;
    min-height:44px; padding-block:2px;
  }
  .footer__contact{gap:4px}
  .footer__contact li{align-items:center}
  .footer__contact a{display:inline-flex; align-items:center; min-height:44px}
  .footer__contact li:has(a) .footer__ic{height:44px}
  .footer__bottom{gap:var(--s1) var(--s4)}
  .footer__bottom a{display:inline-flex; align-items:center; min-height:44px}
  .topbar__item{min-height:var(--topbar-h)}
  .crumb a{display:inline-flex; align-items:center; min-height:44px}
  .crumb{align-items:center}
  .link-arrow{min-height:44px}
  .topbar__socials a{width:34px; height:34px}
  .mobile-menu__aside a.plainlink{min-height:40px; display:inline-flex; align-items:center}
  .applist span{min-height:36px; display:inline-flex; align-items:center}
}

/* --- 20c. Giving: the QR row crushed its own caption --------------------
   .qr-block is a wrap flex row, but the text column was flex:1 with min-width:0,
   so instead of wrapping under the 190px code it shrank to 38px and the caption
   went one word per line. A flex-basis gives it a width to refuse to go below,
   which forces the wrap it should always have taken. */
.qr-block > div{flex:1 1 220px; min-width:min(100%, 220px)}

/* --- 20d. Small labels ---------------------------------------------------
   Tag and label text sat at 10-11px on phones. Lifted to 12px, which is the
   floor for comfortable reading; the uppercase tracking is what carries the
   style, not the smallness. */
@media (max-width:768px){
  .feature__tag,
  .ministry__tag,
  .doctrine__lede,
  .story__name,
  .alt-row__media--todo b,
  .person__todo{font-size:.75rem}
}

/* --- 20e. Long headings -------------------------------------------------
   Nothing in a heading should reach past its column on a narrow screen. */
h1,h2,h3,h4{overflow-wrap:break-word}

/* --- 20f. The anchor bar scrolls, so say so ------------------------------
   On Ministries the three anchors overflow a phone screen. The row already
   scrolls; a fade on the trailing edge is what tells the reader that. */
@media (max-width:768px){
  .anchorbar{position:sticky; -webkit-overflow-scrolling:touch}
  .anchorbar::after{
    content:""; position:absolute; top:0; right:0; bottom:0; width:36px;
    background:linear-gradient(90deg, rgba(255,255,255,0), var(--white));
    pointer-events:none;
  }
  .anchorbar .container{padding-right:36px}
}

/* --- 20g. The 320px screen ----------------------------------------------
   At 320 the header row — logo, then the Menu pill — needed 327px inside a
   320px screen and pushed the whole page sideways. The gap and the logo both
   come down; nothing else about the header changes. */
@media (max-width:400px){
  .header .container{gap:var(--s2)}
  .header__logo img{height:36px}
  .header.is-stuck .header__logo img{height:32px}
  .topbar{font-size:.6875rem}
  .topbar .container{gap:var(--s2)}
  .topbar__item{gap:5px}
}

/* Breadcrumbs wrap instead of running past the screen edge. */
.crumb{flex-wrap:wrap; row-gap:4px}

/* A grid or flex child defaults to a min-content floor, so one long word or a
   wide media box can hold a column open and shove the page sideways. These
   layouts are all single-column on a phone, so none of them needs that floor. */
.split > *,
.alt-row > *,
.give-grid > *,
.visit > *,
.contact-grid > *,
.qr-block > *{min-width:0}

/* --- 20h. Correction to 20g ---------------------------------------------
   Shrinking the top bar to 11px to make it fit traded one problem for
   another. The row is tight at 320 because the four social buttons take the
   space, so those give way instead and the text stays at a readable 12px. */
@media (max-width:400px){
  .topbar{font-size:.75rem}
  .topbar__socials{gap:2px}
  .topbar__socials a{width:30px; height:30px}
}

/* The "photo to come" labels on placeholder cards were the last 11px text. */
@media (max-width:1024px){
  .card__media--todo b,
  .alt-row__media--todo b{font-size:.75rem}
}

/* --- 20i. Last two -------------------------------------------------------
   The identity panel numerals were the final sub-12px text on a phone. */
@media (max-width:768px){
  .identity__panel span b{font-size:.75rem}
}

/* The fixed header measured a sub-pixel over the viewport at exactly 768 and
   put a 1px horizontal scroll on the page. Clipping the chrome's own overflow
   removes it; the desktop dropdowns are already display:none at this width,
   so there is nothing here that needs to escape its box. */
@media (max-width:1024px){
  .header,
  .topbar{overflow-x:clip}
}

/* --- 20j. Hero cleared the header but not the top bar --------------------
   Section 6f added the top utility bar and extended the hero's padding-top to
   cover both. Section 7 then sets .hero{padding-top:var(--header-h)} — same
   specificity, later in the file, so it won, and the hero reserved 72px for
   112px of chrome. On desktop nothing showed: the hero is taller than its
   content and the copy sits at the bottom. On a phone the headline wraps to
   four lines, the hero grows to fit, the copy starts at the padding edge —
   and the gold "New Delhi" eyebrow landed on top of the logo.

   Restated here, at the end of the cascade, with a little breathing room
   above the eyebrow so the copy is not flush against the header. */
.hero,
.page-hero,
.error-hero{
  padding-top:calc(var(--header-h) + var(--topbar-h));
}
@media (max-width:768px){
  .hero,
  .page-hero,
  .error-hero{
    padding-top:calc(var(--header-h) + var(--topbar-h) + var(--s3));
  }
}

/* --- 20k. Entrance transforms must not widen the page -------------------
   Elements waiting to animate in from the side sit at translateX() with
   opacity 0. Off the right edge, that lengthens the document: on Team and
   Contact a phone could be scrolled sideways by 16px before the entrance
   had fired. Nothing is visible there — it is an invisible element pushing
   the page.

   overflow-x:clip rather than hidden on purpose: clip does not create a
   scroll container, so the sticky anchor bar on Ministries keeps working.
   Vertical scrolling is untouched. */
html{overflow-x:clip}
body{overflow-x:clip}

/* The overlay's base rule sizes every <a> inside it, and the Watch Live and
   Give buttons were never excluded — so they rendered at 35px and swelled to
   fill the row. Buttons get their own size back. */
.mobile-menu__actions .btn{
  font-size:.9375rem;
  padding:13px 24px;
  flex:0 0 auto;
}
@media (max-width:1024px){
  .mobile-menu__actions{gap:10px}
  .mobile-menu__actions .btn{font-size:.9375rem; padding:12px 22px}
}

/* Logged-in only: the admin bar pushes the fixed header down, so the overlay
   has to start lower too or the first item lands on the logo. Visitors never
   load the admin bar and never see this offset. */
@media (max-width:1024px){
  .admin-bar .mobile-menu{
    padding-top:calc(var(--header-h) + var(--topbar-h) + 32px + var(--s1));
  }
}
@media screen and (max-width:782px){
  .admin-bar .mobile-menu{
    padding-top:calc(var(--header-h) + var(--topbar-h) + 46px + var(--s1));
  }
}

/* ==========================================================================
   21. MENU OVERLAY
   Rebuilt as a panel of columns. A single tall list left most of a desktop
   screen empty and forced a phone to scroll; grouping the navigation into
   columns fills the space on one and shortens the list on the other.
   ========================================================================== */

.mobile-menu{
  position:fixed; inset:0; z-index:99;
  background:var(--teal-deep);
  display:flex; flex-direction:column;
  /* The original overlay centred its single list. A panel of columns wants to
     start under the header instead, or it floats with a gap above it. */
  justify-content:flex-start;
  padding:calc(var(--header-h) + var(--topbar-h) + var(--s5)) var(--gutter) var(--s4);
  opacity:0; visibility:hidden;
  overflow-y:auto; overscroll-behavior:contain;
  transition:opacity var(--t-base) var(--ease), visibility var(--t-base) var(--ease);
}
.mobile-menu.is-open{opacity:1; visibility:visible}

.mobile-menu .navpanel{
  width:100%; max-width:var(--container); margin-inline:auto;
  display:grid; gap:var(--s6) var(--s5);
  grid-template-columns:1.1fr 1fr 1fr minmax(250px, 1fr);
  align-items:start;
}

/* A column heading. Where the heading is itself a page it stays a link and
   picks up the gold underline the rest of the site uses for that. */
.mobile-menu .navcol{display:flex; flex-direction:column; min-width:0}
.mobile-menu .navcol__label{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.16em; text-transform:uppercase; color:var(--gold);
  padding-bottom:var(--s2); margin-bottom:var(--s3);
  border-bottom:1px solid rgba(255,255,255,.14);
}
.mobile-menu a.navcol__label--link{position:relative; width:fit-content; transition:color var(--t-fast) var(--ease)}
.mobile-menu a.navcol__label--link::after{
  content:""; position:absolute; left:0; right:100%; bottom:-1px; height:1px;
  background:var(--gold); transition:right var(--t-base) var(--ease);
}
.mobile-menu a.navcol__label--link:hover{color:var(--white)}
.mobile-menu a.navcol__label--link:hover::after{right:0}

.mobile-menu .navcol__link{
  font-family:var(--font-display); font-weight:500;
  font-size:1.375rem; line-height:1.25; color:var(--white);
  padding:13px 0; display:flex; flex-direction:column; gap:3px;
  transition:color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.mobile-menu .navcol__link small{
  font-family:var(--font-body); font-size:.875rem; font-weight:400;
  color:rgba(255,255,255,.5); line-height:1.4;
}
@media (hover:hover){
  .mobile-menu .navcol__link:hover{color:var(--gold); transform:translateX(4px)}
  .mobile-menu .navcol__link:hover small{color:rgba(255,255,255,.65)}
}

/* The practical column: address, times, and a way to get in touch. */
.mobile-menu .navcol--aside{color:rgba(255,255,255,.72); font-size:1rem; line-height:1.65}
.mobile-menu .navaside__line{margin-bottom:var(--s3)}
.mobile-menu .navaside__line--times{color:rgba(255,255,255,.86)}
.mobile-menu .navaside__contact{
  display:inline-flex; align-items:center; gap:9px;
  color:rgba(255,255,255,.86); padding:9px 0;
  transition:color var(--t-fast) var(--ease);
}
.mobile-menu .navaside__contact svg{width:15px; height:15px; color:var(--gold); flex:none}
.mobile-menu .navaside__contact:hover{color:var(--gold)}
.mobile-menu .navaside__socials{display:flex; gap:10px; margin-top:var(--s3)}
.mobile-menu .navaside__socials a{
  width:38px; height:38px; border-radius:50%;
  border:1px solid rgba(255,255,255,.2);
  display:grid; place-items:center; color:var(--white);
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.mobile-menu .navaside__socials svg{width:16px; height:16px}
.mobile-menu .navaside__socials a:hover{background:var(--teal); border-color:var(--teal); transform:translateY(-2px)}

.mobile-menu .navpanel__actions{
  width:100%; max-width:var(--container); margin:var(--s5) auto 0;
  display:flex; gap:var(--s2); flex-wrap:wrap;
  padding-top:var(--s3); border-top:1px solid rgba(255,255,255,.12);
}
.mobile-menu .navpanel__actions .btn{font-size:.9375rem; padding:13px 26px; flex:0 0 auto}

/* Entrance: columns arrive together, links cascade within them. */
.mobile-menu .navcol{opacity:0; transform:translateY(14px); transition:opacity .5s var(--ease), transform .5s var(--ease)}
.mobile-menu.is-open .navcol{opacity:1; transform:none}
.mobile-menu.is-open .navcol:nth-child(2){transition-delay:.06s}
.mobile-menu.is-open .navcol:nth-child(3){transition-delay:.12s}
.mobile-menu.is-open .navcol:nth-child(4){transition-delay:.18s}
.mobile-menu .navpanel__actions{opacity:0; transition:opacity .5s var(--ease) .24s}
.mobile-menu.is-open .navpanel__actions{opacity:1}

/* ---------- Tablet: three columns, the aside becomes a strip beneath -----
   Three columns still read well down here; the practical details work better
   as one row under them than as a fourth column squeezed to nothing. */
@media (max-width:1100px){
  .mobile-menu .navpanel{grid-template-columns:1fr 1fr 1fr; gap:var(--s3)}
  .mobile-menu .navcol--aside{
    grid-column:1 / -1;
    display:flex; flex-direction:row; flex-wrap:wrap; align-items:center;
    gap:10px var(--s3);
    padding-top:var(--s2); border-top:1px solid rgba(255,255,255,.12);
  }
  .mobile-menu .navcol--aside .navcol__label{border-bottom:0; padding:0; margin:0}
  .mobile-menu .navaside__line{margin-bottom:0}
  .mobile-menu .navaside__line--times{display:none}
  .mobile-menu .navaside__socials{margin-top:0; margin-left:auto}
}

/* ---------- Phone: one column, tight ----------
   Rows are compact but never below 44px of touch area, and the aside
   collapses to a single contact strip rather than four stacked blocks. */
@media (max-width:768px){
  .mobile-menu{
    padding:calc(var(--header-h) + var(--topbar-h) + var(--s1)) var(--gutter) var(--s2);
  }
  .mobile-menu .navpanel{
    grid-template-columns:1fr;
    gap:clamp(8px, 1.4vh, 17px);
  }
  .mobile-menu .navcol__label{
    font-size:.6875rem; padding-bottom:6px; margin-bottom:4px;
  }
  .mobile-menu .navcol__link{
    font-size:clamp(1.0625rem, 2.15vh, 1.25rem);
    padding:clamp(6px, 1.05vh, 11px) 0;
  }
  .mobile-menu .navcol__link small{display:none}
  /* The first column needs no heading on a phone — these are simply the
     pages, and the label costs a row the menu would rather spend on fitting. */
  .mobile-menu .navcol--primary .navcol__label{display:none}
  .mobile-menu .navpanel__actions{margin-top:var(--s2); padding-top:var(--s2)}
  /* On a phone the aside becomes one contact strip. The address and the
     service times are on every footer and on the Contact page, so repeating
     them here only costs the menu the space it needs to fit on one screen. */
  .mobile-menu .navcol--aside{
    grid-column:auto; display:flex; flex-direction:row; flex-wrap:wrap;
    align-items:center; gap:6px 14px; font-size:.9375rem;
    padding-top:var(--s1); border-top:1px solid rgba(255,255,255,.1);
  }
  .mobile-menu .navcol--aside .navcol__label{display:none}
  .mobile-menu .navaside__line{display:none}
  .mobile-menu .navaside__contact{padding:4px 0; font-size:.875rem}
  .mobile-menu .navaside__socials{gap:8px; margin-top:0; margin-left:auto}
  .mobile-menu .navaside__socials a{width:32px; height:32px}
  .mobile-menu .navaside__socials svg{width:14px; height:14px}
  .mobile-menu .navpanel__actions{margin-top:var(--s3); padding-top:var(--s2); gap:10px}
  .mobile-menu .navpanel__actions .btn{flex:1 1 auto; justify-content:center; padding:12px 18px}
}

/* Very short phones give up the address block before anything is cut off. */
@media (max-width:768px) and (max-height:700px){
  .mobile-menu .navcol__link{font-size:1rem; padding:6px 0}
  .mobile-menu .navpanel{gap:clamp(10px, 1.8vh, 18px)}
}

/* The original overlay rule styled every <a> inside it — including a divider
   and a large size that the column layout does not want. Reset explicitly
   rather than relying on source order. */
.mobile-menu .navpanel a{border-bottom:0}
.mobile-menu .navcol__link{border-bottom:0}
@media (max-width:768px){
  /* On a phone the dividers earn their place: they keep a tight list legible. */
  .mobile-menu .navcol--primary .navcol__link + .navcol__link,
  .mobile-menu .navcol:not(.navcol--aside) .navcol__link + .navcol__link{
    border-top:1px solid rgba(255,255,255,.08);
  }
}

/* ==========================================================================
   22. GRAVITY FORMS
   The contact form is a Gravity Form so submissions become entries the church
   can search and notifications are editable without code. Gravity 2.9 ships
   the "Orbital" theme — the wrapper carries gform-theme--framework, not the
   older gravity-theme class — and it brings its own button and field styling.
   This maps it onto the approved design so the page looks as it was signed off.
   ========================================================================== */

/* Gravity exposes a custom-property API; set what it honours, then override
   the rest directly. Belt and braces, because the property names move between
   versions and the design should not depend on which ones landed. */
/* Gravity 2.9 styles its controls through custom properties, not through
   rules a stylesheet can outrank — the submit button's colour comes from
   --gf-ctrl-btn-bg-color-primary, so no selector, however specific, will
   change it. Setting the variables is the supported route and needs no
   !important anywhere. */
.form--gf .gform_wrapper,
.form--gf .gform-theme--framework{
  --gf-color-primary:var(--teal);
  --gf-color-primary-rgb:25, 111, 143;
  --gf-color-primary-darker:var(--teal-dark);
  --gf-color-primary-lighter:var(--teal);
  --gf-color-primary-contrast:var(--white);

  --gf-ctrl-btn-bg-color-primary:var(--teal);
  --gf-ctrl-btn-bg-color-hover-primary:var(--teal-dark);
  --gf-ctrl-btn-bg-color-focus-primary:var(--teal-dark);
  --gf-ctrl-btn-border-color-primary:var(--teal);
  --gf-ctrl-btn-border-color-hover-primary:var(--teal-dark);
  --gf-ctrl-btn-color-primary:var(--white);
  --gf-ctrl-btn-color-hover-primary:var(--white);
  --gf-ctrl-btn-border-radius:var(--radius-btn);
  --gf-ctrl-btn-padding-x:34px;
  --gf-ctrl-btn-padding-y:16px;
  --gf-ctrl-btn-font-size:16px;
  --gf-ctrl-btn-font-family:var(--font-display);
  --gf-ctrl-btn-font-weight:600;
  --gf-ctrl-btn-size:auto;

  --gf-ctrl-border-color:var(--line);
  --gf-ctrl-border-color-focus:var(--teal);
  --gf-ctrl-border-radius:8px;
  --gf-ctrl-bg-color:var(--white);
  --gf-ctrl-color:var(--ink);
  --gf-ctrl-font-family:var(--font-body);
  --gf-ctrl-font-size:16px;
  --gf-ctrl-padding-x:18px;
  --gf-ctrl-padding-y:15px;
  --gf-ctrl-placeholder-color:#A9B3B9;

  --gf-ctrl-label-color-primary:var(--ink);
  --gf-ctrl-label-font-family:var(--font-display);
  --gf-ctrl-label-font-size:15px;
  --gf-ctrl-label-font-weight:600;
  --gf-ctrl-desc-color:var(--muted);
  --gf-ctrl-desc-font-size:14px;

  --gf-field-gap-y:var(--s3);
  --gf-form-gap-y:var(--s3);
}

.form--gf .gform_wrapper .gform_fields{gap:var(--s3)}
.form--gf .gform_wrapper .gfield{padding:0; display:flex; flex-direction:column; gap:8px}

.form--gf .gform_wrapper .gfield_label{
  font-family:var(--font-display); font-size:.9375rem; font-weight:600;
  color:var(--ink); margin:0; padding:0;
}
.form--gf .gform_wrapper .gfield_required{color:var(--gold-dark); margin-left:3px; font-weight:500}
.form--gf .gform_wrapper .gfield_description{font-size:.875rem; color:var(--muted); padding:0; margin:0}

.form--gf .gform_wrapper input[type=text],
.form--gf .gform_wrapper input[type=email],
.form--gf .gform_wrapper input[type=tel],
.form--gf .gform_wrapper textarea{
  font-family:var(--font-body); font-size:1rem; line-height:1.5;
  padding:15px 18px; border:1px solid var(--line); border-radius:8px;
  background:var(--white); color:var(--ink); width:100%; box-shadow:none;
  transition:border-color var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease);
}
.form--gf .gform_wrapper textarea{resize:vertical; min-height:140px}
.form--gf .gform_wrapper input::placeholder,
.form--gf .gform_wrapper textarea::placeholder{color:#A9B3B9; opacity:1}
.form--gf .gform_wrapper input:focus,
.form--gf .gform_wrapper textarea:focus{
  outline:0; border-color:var(--teal); box-shadow:0 0 0 3px rgba(25,111,143,.14);
}

/* The submit button is the site's primary button. Gravity's framework styles
   it with its own class, so match that reach rather than reaching for
   !important. */
.form--gf .gform_wrapper .gform_footer{padding:0; margin:var(--s2) 0 0}
.form--gf .gform_wrapper .gform_footer button.gform_button,
.form--gf .gform_wrapper .gform_footer input.gform_button{
  display:inline-flex; align-items:center; justify-content:center; gap:10px;
  font-family:var(--font-display); font-size:1rem; font-weight:600; letter-spacing:.02em;
  padding:16px 34px; height:auto; min-height:0; width:auto;
  border-radius:var(--radius-btn);
  border:1px solid var(--teal); background:var(--teal); color:var(--white);
  cursor:pointer; box-shadow:none;
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease), transform var(--t-fast) var(--ease);
}
.form--gf .gform_wrapper .gform_footer button.gform_button:hover,
.form--gf .gform_wrapper .gform_footer input.gform_button:hover{
  background:var(--teal-dark); border-color:var(--teal-dark); transform:translateY(-2px);
}
.form--gf .gform_wrapper .gform_footer button.gform_button:focus-visible{
  outline:2px solid var(--gold); outline-offset:3px;
}

/* Validation and confirmation, in the site's voice rather than Gravity's. */
.form--gf .gform_wrapper .gform_validation_errors,
.form--gf .gform_confirmation_message{
  padding:16px 20px; border-radius:var(--radius-card);
  font-size:1rem; line-height:1.5; margin-bottom:var(--s3);
  border:0; border-left:4px solid; box-shadow:none;
}
.form--gf .gform_wrapper .gform_validation_errors{background:#FDF3F2; border-left-color:#B03A2E; color:#8C2E24}
.form--gf .gform_wrapper .gform_validation_errors h2,
.form--gf .gform_wrapper .gform_validation_errors .gform_submission_error{
  font-family:var(--font-display); font-size:1rem; font-weight:600; color:inherit; margin:0;
}
.form--gf .gform_confirmation_message{background:var(--sky); border-left-color:var(--teal); color:var(--teal-deep)}
.form--gf .gform_wrapper .gfield_error input,
.form--gf .gform_wrapper .gfield_error textarea{border-color:#B03A2E}
.form--gf .gform_wrapper .gfield_validation_message{
  background:none; border:0; padding:0; color:#B03A2E; font-size:.875rem;
}

@media (max-width:768px){
  .form--gf .gform_wrapper .gfield--width-half{grid-column:1 / -1}
  .form--gf .gform_wrapper .gform_footer button.gform_button,
  .form--gf .gform_wrapper .gform_footer input.gform_button{width:100%}
}

/* Colour, font and hover all come from the variables above. Radius, padding
   and size do not — Gravity sets those in a rule that loads after the theme's
   stylesheet, so no selector here can outrank it by order or specificity.
   These three declarations are the only place the design overrides Gravity by
   force, and they are scoped to this one button. */
.form--gf .gform_wrapper .gform_footer button.gform_button,
.form--gf .gform_wrapper .gform_footer input.gform_button{
  border-radius:var(--radius-btn) !important;
  padding:16px 34px !important;
  font-size:1rem !important;
  height:auto !important;
  width:auto !important;
}
@media (max-width:768px){
  .form--gf .gform_wrapper .gform_footer button.gform_button,
  .form--gf .gform_wrapper .gform_footer input.gform_button{width:100% !important}
}

/* ==========================================================================
   23. ELEMENTOR-NATIVE PAGES
   Pages built from real containers and widgets, so the church can edit every
   heading, paragraph, image and button. A design-system class applied through
   Elementor's CSS Classes field lands on the widget WRAPPER, not on the text
   inside it — these rules bridge that gap so the same class produces the same
   result either way.
   ========================================================================== */

/* THE BRIDGE — read this before touching anything below.

   Elementor's Typography panel writes its rules onto the widget WRAPPER
   (.elementor-NN .elementor-element.elementor-element-xxxxx). The words the
   visitor reads are in a <p> inside that wrapper, and a <p> normally just
   inherits — which is why changing typography in the panel usually "just
   works".

   It stopped working here because the design system, written for the
   hand-built prototype, carries descendant rules like `.page-hero p` and
   `.story__body p`. Those sit at 0,1,1 and pin the paragraph's size and
   colour, so the panel could set the wrapper to 190px and the paragraph
   would calmly stay at 22px. That is the bug the church kept hitting.

   This rule restores inheritance for every Elementor text widget: the
   paragraph takes whatever the widget's own settings say, so the panel is
   once again the single place text is styled. Do not add a `p` rule below
   that is more specific than this one. */
.elementor-widget-text-editor p{
  font:inherit; color:inherit; letter-spacing:inherit; text-transform:inherit;
  margin:0;
}
/* A church editor pasting several paragraphs into one widget still gets
   spacing between them. */
.elementor-widget-text-editor p + p{margin-top:1em}

/* The breadcrumb's separators sit on one line with even gaps. Layout only —
   nothing here touches type. */
.elementor-widget-text-editor.crumb p{display:flex; gap:10px; flex-wrap:wrap}
.elementor-widget-text-editor.pullquote{max-width:none}

/* Elementor containers are flex; our component classes assume grid in the
   hand-built markup. Where both apply, the container's own layout wins. */
.e-con.story,
.e-con.split,
.e-con.section,
.e-con.section-head,
.e-con.measure,
.e-con.story__body,
.e-con.story__media{display:flex}
.e-con.measure{max-width:var(--measure)}
.e-con.section-head.center{margin-inline:auto; text-align:center; align-items:center}

/* Page hero, native version. The photograph is the container's background
   rather than an <img>, so the gradient that keeps the type legible has to be
   drawn here instead of over the image. */
.e-con.page-hero--el{
  position:relative; isolation:isolate; color:var(--white);
  min-height:clamp(380px, 54vh, 540px);
}
/* ::after, not ::before — Elementor already uses ::before on .e-con for its
   own background overlay, so a ::before here never paints. */
.e-con.page-hero--el::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background:linear-gradient(180deg, rgba(11,17,20,.7) 0%, rgba(11,17,20,.42) 45%, rgba(11,17,20,.86) 100%);
}
.e-con.page-hero--el > *{position:relative; z-index:1}
.e-con.page-hero--el .elementor-heading-title{max-width:18ch}

/* Heading colour is deliberately NOT set here.
   Elementor emits `.elementor-widget-heading .elementor-heading-title {color:
   var(--e-global-color-primary)}` for every heading. An override at the same
   specificity only wins by load order — and the order is reversed between the
   editor and the front end, which is exactly why headings were teal in one and
   black in the other. Leaving it to Elementor's global makes both agree, and
   puts the colour where the church can change it: Site Settings > Global
   Colors > Primary. Dark bands still need white, and those are stated below. */


/* Section 19 gives links inside text widgets the content teal, which is
   unreadable on the hero photograph. Breadcrumb links instead take the
   widget's own text colour, so whatever colour the church sets on the crumb
   in the panel carries the links with it. Kept to a single class so a panel
   setting still outranks it.

   Everything else about the crumb and the hero lead — size, weight, case,
   letter-spacing, colour — is now the widget's OWN typography setting (see
   ccc_style() in elementor-build.php). It used to be stated here at
   `.e-con.page-hero--el .crumb`, three classes deep, which no panel setting
   could ever beat: that is why setting the breadcrumb to 190px did nothing. */
.crumb a{color:inherit; text-decoration:none}
.crumb a:hover{color:var(--white); opacity:.75}

/* Story rows: the media column keeps its rounded frame and hover zoom. */
.e-con.story__media{border-radius:var(--radius-card); overflow:visible}
.e-con.story__media .elementor-widget-image img{
  border-radius:var(--radius-card); width:100%; display:block;
}
.e-con.story__body h2{margin:0}

/* The simple three-up card used to close a page. */
.e-con.ccc-card{
  background:var(--white); border:1px solid var(--line);
  border-radius:var(--radius-card); padding:var(--s4);
  transition:transform var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
.e-con.ccc-card h3{font-size:var(--fs-h3); color:var(--ink)}
.e-con.ccc-card p{color:var(--muted); font-size:1rem; line-height:1.6}
@media (hover:hover){
  .e-con.ccc-card:hover{transform:translateY(-3px); box-shadow:var(--shadow-card); border-color:transparent}
}

/* Elementor's button widget wearing our button classes.

   The wrapper is a positioning box and nothing more; every part of the button
   a person can see — padding, radius, border, type — lives on the <a> inside.
   That matters because Elementor's own Style panel writes to the <a>: with the
   look split across the two, half the panel's fields did nothing, the padding
   was applied twice over, and the widget looked broken to whoever was editing
   it. Every variant is moved, not just the ones the home page happens to use —
   leaving one behind is how a button on some other page silently loses its
   background.

   The variant class sits inside :where(), which contributes no specificity, so
   these rules land at two classes: the reset below them cannot outrank them,
   and anything typed into the panel beats them both, whichever order the
   stylesheets happen to load in. They are the default a button falls back to,
   not a floor it cannot rise above. */
.elementor-widget-button:where(.btn, .link-arrow){padding:0; border:0; background:none}
.elementor-widget-button:where(.btn, .link-arrow) .elementor-button{
  background:none; padding:0; border:0; border-radius:0; box-shadow:none;
}
.elementor-widget-button:where(.btn) .elementor-button{
  display:inline-flex; align-items:center; gap:10px;
  font-family:var(--font-display); font-size:1rem; font-weight:600; letter-spacing:.02em;
  padding:16px 34px; border-radius:var(--radius-btn); border:1px solid transparent;
  transition:background var(--t-base) var(--ease), color var(--t-base) var(--ease),
             border-color var(--t-base) var(--ease), transform var(--t-fast) var(--ease);
}
.elementor-widget-button:where(.btn) .elementor-button:hover{transform:translateY(-2px)}
.elementor-widget-button:where(.btn--primary) .elementor-button{
  background:var(--teal); color:var(--white); border-color:var(--teal);
}
.elementor-widget-button:where(.btn--primary) .elementor-button:hover{
  background:var(--teal-dark); border-color:var(--teal-dark);
}
.elementor-widget-button:where(.btn--gold) .elementor-button{
  background:var(--gold); color:var(--white); border-color:var(--gold);
}
.elementor-widget-button:where(.btn--gold) .elementor-button:hover{
  background:var(--gold-dark); border-color:var(--gold-dark);
}
.elementor-widget-button:where(.btn--ghost) .elementor-button{
  background:transparent; color:var(--ink); border-color:currentColor;
}
.elementor-widget-button:where(.btn--ghost) .elementor-button:hover{
  background:var(--ink); color:var(--white);
}
.elementor-widget-button:where(.btn--ghost-light) .elementor-button{
  background:transparent; color:var(--white); border-color:rgba(255,255,255,.6);
}
.elementor-widget-button:where(.btn--ghost-light) .elementor-button:hover{
  background:var(--white); color:var(--ink); border-color:var(--white);
}
.elementor-widget-button.link-arrow .elementor-button{
  font-family:var(--font-display); font-weight:600; font-size:1rem;
  color:var(--teal); display:inline-block; text-decoration:none;
  transition:color var(--t-base) var(--ease);
}
/* Elementor wraps the label in a flex container and leaves whitespace either
   side of it. The rule goes on that wrapper rather than on the <a>, so it
   measures the words and not the stray space before the arrow. */
.elementor-widget-button.link-arrow .elementor-button-content-wrapper{
  display:inline;
  text-decoration:underline;
  text-decoration-color:transparent;
  text-decoration-thickness:1px;
  text-underline-offset:5px;
  transition:text-decoration-color .35s var(--ease);
}
.elementor-widget-button.link-arrow .elementor-button::after{
  content:"\2192"; display:inline-block; margin-left:10px;
  transition:transform .4s cubic-bezier(.2,.8,.25,1);
}
@media (hover:hover){
  .elementor-widget-button.link-arrow .elementor-button:hover{color:var(--teal-dark)}
  .elementor-widget-button.link-arrow .elementor-button:hover .elementor-button-content-wrapper{
    text-decoration-color:currentColor;
  }
  .elementor-widget-button.link-arrow .elementor-button:hover::after{transform:translateX(6px)}
}
.elementor-widget-button.link-arrow .elementor-button:focus-visible .elementor-button-content-wrapper{
  text-decoration-color:currentColor;
}
/* Elementor's kit sets a button's hover background at `.elementor-button:hover`
   — one class plus a pseudo-class, the same 0,2,0 as the reset further up, so
   the reset cannot win it on weight and load order decides. The link-arrow is a
   text link, not a filled button, so its hover has to be cancelled at the
   weight of the rule that sets it: two real classes plus the pseudo-class.
   Focus and active go with it, or the box comes back on a keyboard tab and on
   the moment of the tap. */
.elementor-widget-button.link-arrow .elementor-button:hover,
.elementor-widget-button.link-arrow .elementor-button:focus,
.elementor-widget-button.link-arrow .elementor-button:focus-visible,
.elementor-widget-button.link-arrow .elementor-button:active{
  background:none; box-shadow:none; border-color:transparent;
}

@media (prefers-reduced-motion:reduce){
  .elementor-widget-button.link-arrow .elementor-button,
  .elementor-widget-button.link-arrow .elementor-button-content-wrapper,
  .elementor-widget-button.link-arrow .elementor-button::after{transition:none}
}

/* Phone: the two-column rows stack, as the hand-built ones already do. */
@media (max-width:1024px){
  .e-con.story,
  .e-con.split{flex-direction:column !important}
  .e-con.story > .e-con,
  .e-con.split > .e-con{width:100% !important}
}
@media (max-width:768px){
  .e-con.page-hero--el{min-height:clamp(300px, 46vh, 420px)}
}

/* --- 23b. Typography lives in Elementor, not here ------------------------
   These classes used to carry font size, weight, case and colour at a
   specificity that beat Elementor's per-widget rules — which meant changing a
   widget's typography in the panel did nothing at all. Text styling now ships
   as the widget's OWN settings (see ccc_text() in elementor-build.php), so it
   renders identically in the editor and on the front end AND the church can
   change it in the panel, where their change wins.

   What is left here is only what Elementor cannot express as a widget
   setting: the pull-quote's rule, kept at a single class so any panel setting
   still overrides it. */
.pullquote{
  border-left:3px solid var(--gold);
  padding-left:var(--s3);
}


/* ==========================================================================
   24. PAGE HERO — one treatment on every page
   Every inner page opens the same way: photograph, breadcrumb, title, one
   line of lead. Nine of them are built from the theme's own markup and one
   (Our Story) from Elementor containers, so this section states the shared
   metrics once and lets both kinds pick them up.

   Kept to two classes deep on purpose. That is enough to beat the earlier
   sections, and still less than the three classes Elementor writes from the
   widget panel — so anything the church sets on the Our Story hero by hand
   continues to win.
   ========================================================================== */

.page-hero,
.e-con.page-hero--el{
  min-height:clamp(460px, 60vh, 620px);
}

.page-hero{
  display:flex; align-items:flex-end;
  padding-top:calc(var(--header-h) + var(--topbar-h) + var(--s4));
}
.page-hero .container{padding-bottom:80px}

/* The breadcrumb and the lead are BOTH <p> inside the hero, so the old
   `.page-hero p` rule blew the breadcrumb up to lead size — 22px white
   instead of 12px caps — on every page except Our Story. Excluding .crumb
   is what keeps the two apart. */
.page-hero .container > p:not(.crumb){
  margin-top:14px; max-width:52ch;
  font-size:var(--fs-lead); font-weight:300; color:rgba(255,255,255,.88);
}

.page-hero .crumb{
  margin:0 0 18px;
  font-family:var(--font-display);
  font-size:12px; font-weight:400; line-height:1.1;
  letter-spacing:.11em; text-transform:uppercase;
  color:var(--sky);
}
.page-hero .crumb a{color:rgba(255,255,255,.62); text-decoration:none}
.page-hero .crumb a:hover{color:var(--white)}
/* The hero title is the brand teal on every page, matching Our Story.
   Teal is darker than white, so the gradient beneath it is carried a little
   further (see the ::after override below) — otherwise the title lands on a
   bright patch of photograph on the lighter heroes and stops reading. */
.page-hero h1{margin:0; color:var(--teal); max-width:18ch}

@media (max-width:768px){
  .page-hero,
  .e-con.page-hero--el{min-height:clamp(360px, 52vh, 470px)}
  .page-hero .container{padding-bottom:56px}
  .page-hero .crumb{margin-bottom:14px}
}

/* Legibility floor for a teal title on a photograph. The mid-stop is the one
   that matters: it sits behind the headline. */
.page-hero::after,
.e-con.page-hero--el::after{
  background:linear-gradient(180deg,
    rgba(11,17,20,.72) 0%,
    rgba(11,17,20,.58) 45%,
    rgba(11,17,20,.88) 100%);
}


/* ==========================================================================
   25. OUR TEAM — native Elementor blocks
   The same components as the hand-built page, re-skinned for Elementor's
   container markup. Nothing here sets type size or colour on a widget: that
   lives in the widget's own settings so the church can change it in the
   panel. These rules do layout and skin only.
   ========================================================================== */

/* --- Senior leadership -------------------------------------------------- */
.e-con.lead-pair--el{align-items:flex-start}
.e-con.namecard{
  padding-bottom:var(--s3); border-bottom:1px solid var(--line);
}
.e-con.namecard:last-of-type{border-bottom:0; padding-bottom:0}
.e-con.namecard h3{font-size:1.25rem; margin:0}

/* --- The portrait grid ---------------------------------------------------
   Grid rather than Elementor's flex, so five tiles share the row evenly and
   a sixth wraps into place on its own. Adding a person is a matter of
   duplicating one container in the editor — nothing here counts them. */
/* A boxed Elementor container puts its children in a .e-con-inner, so the
   grid has to go on that wrapper — putting it on .e-con leaves the wrapper as
   the only grid item and every tile collapses to the width of one letter.
   The second selector covers a full-width container, which has no wrapper. */
.e-con.people--el > .e-con-inner,
.e-con.people--el.e-con-full{
  display:grid;
  grid-template-columns:repeat(5, minmax(0,1fr));
  gap:var(--s3);
}
/* Elementor gives every container a default padding; the portrait tiles and
   their rows want none, so the photograph meets the tile edge. */
.e-con.person--el,
.e-con.person__media--el,
.e-con.person__body--el,
.e-con.people--el,
.e-con.factlist--el,
.e-con.factrow,
.e-con.btnrow,
.e-con.lead-pair--el,
.e-con.split--el,
.e-con.story__media{padding:0}
.e-con.person--el{gap:0}
.e-con.person__media--el > .e-con-inner{width:100%; height:100%}
.e-con.person__media--el{
  position:relative; aspect-ratio:4/5; overflow:hidden;
  border-radius:var(--radius-card);
  background:linear-gradient(160deg, var(--sky), #E7EFF3);
  border:1px solid var(--line);
  transition:background var(--t-slow) var(--ease);
}
.e-con.person__media--el .mono{
  font-family:var(--font-display); font-size:2rem; font-weight:700;
  letter-spacing:.06em; color:var(--teal); opacity:.5;
  transition:opacity var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.e-con.person__media--el .photo-todo{
  position:absolute; left:12px; bottom:12px;
  font-family:var(--font-display); font-size:.625rem; font-weight:600;
  letter-spacing:.14em; text-transform:uppercase; color:var(--gold-dark);
}
.e-con.person__media--el .photo-todo p{margin:0}
@media (hover:hover){
  .e-con.person--el:hover .person__media--el{background:linear-gradient(160deg,#EAF3F7,#DCE9EF)}
  .e-con.person--el:hover .mono{opacity:.72; transform:scale(1.04)}
}
.e-con.person__body--el{padding-top:14px}
.e-con.person__body--el h3{font-size:1.0625rem; margin:0}

/* --- The "still needed" note -------------------------------------------- */
.e-con.placeholder--el{
  border:1px dashed var(--gold);
  background:repeating-linear-gradient(45deg, rgba(197,160,89,.06) 0 10px, transparent 10px 20px);
  border-radius:var(--radius-img);
  padding:var(--s3); max-width:76ch;
}

/* --- The photographer's brief ------------------------------------------- */
.e-con.factlist--el{border-top:1px solid var(--line)}
.e-con.factrow{
  padding:16px 0; border-bottom:1px solid var(--line); align-items:baseline;
}
.e-con.factrow > .e-con-inner > .factrow__label{flex:0 0 170px}
.e-con.factrow > .e-con-inner > .factrow__value{flex:1 1 auto}

/* --- Feature card, native ------------------------------------------------
   The prototype's full-bleed photo card, rebuilt on Elementor containers.
   Three layers stack inside one 3:4 tile:
     z-index 0  the photograph (an Image widget, absolutely placed)
     z-index 1  the legibility gradient, drawn on ::after because Elementor
                already uses ::before on .e-con for its own overlay
     z-index 2  the copy
   .e-con-inner is deliberately left at z-index auto: it is positioned but
   creates no stacking context, so the body's z-index:2 is still measured
   against the ::after directly. */
.e-con.features--el > .e-con-inner,
.e-con.features--el.e-con-full{
  display:grid;
  grid-template-columns:repeat(3, minmax(0,1fr));
  gap:var(--s3);
}
.e-con.feature--el{
  position:relative; overflow:hidden; isolation:isolate;
  border-radius:16px; aspect-ratio:3/4; padding:0;
  color:var(--white);
}
.e-con.feature--el > .e-con-inner{
  position:relative; height:100%; padding:0;
  display:flex; flex-direction:column; justify-content:flex-end;
}
.e-con.feature--el .feature__img{
  position:absolute; inset:0; z-index:0; margin:0;
}
.e-con.feature--el .feature__img img{
  width:100%; height:100%; object-fit:cover; display:block;
  border-radius:0; filter:saturate(.94);
  transition:transform 1s var(--ease), filter var(--t-slow) var(--ease);
}
.e-con.feature--el::after{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:
    linear-gradient(180deg, rgba(11,17,20,.42) 0%, rgba(11,17,20,.18) 30%, rgba(11,17,20,.78) 68%, rgba(11,17,20,.95) 100%),
    linear-gradient(0deg, rgba(11,17,20,.18), rgba(11,17,20,.18));
  transition:opacity var(--t-slow) var(--ease);
}
.e-con.feature__body--el{
  position:relative; z-index:2;
  padding:var(--s4) var(--s3) var(--s3);
  align-items:flex-start;
}
.e-con.feature--el .feature__tag--el{
  align-self:flex-start;
  border:1px solid rgba(255,255,255,.55); border-radius:100px;
  padding:9px 18px; line-height:1;
  backdrop-filter:blur(4px); background:rgba(255,255,255,.06);
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease), color var(--t-base) var(--ease);
}
.e-con.feature--el .feature__tag--el p{line-height:1}
.e-con.feature--el h3{
  font-size:clamp(1.5rem, 2.1vw, 2rem);
  font-weight:600; line-height:1.1; letter-spacing:-.02em;
  max-width:14ch; margin:0;
  transition:transform var(--t-slow) var(--ease);
}
.e-con.feature--el .feature__copy{
  max-width:34ch;
  transition:transform var(--t-slow) var(--ease);
}
/* The arrow link goes gold on a photograph, where teal disappears. */
.elementor-widget-button.link-arrow--gold .elementor-button{color:var(--gold); font-size:.9375rem}
.elementor-widget-button.link-arrow--gold .elementor-button:hover{color:var(--white)}

@media (hover:hover){
  .e-con.feature--el:hover .feature__img img{transform:scale(1.05); filter:saturate(1)}
  .e-con.feature--el:hover::after{opacity:.88}
  .e-con.feature--el:hover .feature__tag--el{background:var(--white); border-color:var(--white)}
  .e-con.feature--el:hover .feature__tag--el p{color:var(--ink)}
  .e-con.feature--el:hover h3,
  .e-con.feature--el:hover .feature__copy{transform:translateY(-4px)}
}

/* --- Buttons sitting side by side --------------------------------------- */
.e-con.btnrow{flex-wrap:wrap; margin-top:var(--s2)}

/* --- Phone -------------------------------------------------------------- */
@media (max-width:1024px){
  .e-con.features--el > .e-con-inner,
  .e-con.features--el.e-con-full{grid-template-columns:repeat(2, minmax(0,1fr))}
  .e-con.people--el > .e-con-inner,
  .e-con.people--el.e-con-full{grid-template-columns:repeat(3, minmax(0,1fr))}
  .e-con.lead-pair--el > .e-con-inner,
  .e-con.split--el > .e-con-inner{flex-direction:column !important}
  .e-con.lead-pair--el > .e-con-inner > .e-con,
  .e-con.split--el > .e-con-inner > .e-con{width:100% !important}
}
@media (max-width:640px){
  .e-con.features--el > .e-con-inner,
  .e-con.features--el.e-con-full{grid-template-columns:1fr}
  .e-con.people--el > .e-con-inner,
  .e-con.people--el.e-con-full{grid-template-columns:repeat(2, minmax(0,1fr)); gap:var(--s2)}
  .e-con.factrow > .e-con-inner{flex-direction:column !important; gap:4px}
  .e-con.factrow > .e-con-inner > .factrow__label{flex:none}
}


/* ==========================================================================
   26. CONTACT — native Elementor blocks
   ========================================================================== */

/* --- The details card beside the form ------------------------------------ */
.e-con.contact-card--el{
  background:var(--white); border:1px solid var(--line);
  border-radius:var(--radius-card); padding:var(--s4);
}
.e-con.contact-item--el,
.e-con.contact-item__text,
.e-con.contact-card__follow,
.e-con.time-cell,
.e-con.times-strip--el,
.e-con.map-full--el{padding:0}
.e-con.contact-item--el > .e-con-inner{align-items:flex-start}
.e-con.contact-item--el .contact-item__icon--el{
  flex:0 0 44px; width:44px; height:44px; border-radius:50%;
  background:var(--sky); color:var(--teal);
  display:grid; place-items:center;
  transition:background var(--t-base) var(--ease), color var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.e-con.contact-item--el .contact-item__icon--el p{margin:0; line-height:0}
.e-con.contact-item--el .contact-item__icon--el svg{width:19px; height:19px}
.e-con.contact-item--el .contact-item__value a{color:inherit; text-decoration:none}
.e-con.contact-item--el .contact-item__value a:hover{color:var(--teal); text-decoration:underline}
@media (hover:hover){
  .e-con.contact-item--el:hover .contact-item__icon--el{
    background:var(--teal); color:var(--white); transform:scale(1.06) rotate(-4deg);
  }
}
.e-con.contact-card__follow{border-top:1px solid var(--line); padding-top:var(--s3)}

/* The shared socials row, on a white card rather than the dark footer. */
.socials--ink p{display:flex; gap:12px; margin:0}
.socials--ink a{
  width:42px; height:42px; border-radius:50%;
  border:1px solid var(--line); color:var(--ink);
  display:grid; place-items:center;
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease),
             color var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.socials--ink a:hover{background:var(--teal); border-color:var(--teal); color:var(--white); transform:translateY(-2px)}
.socials--ink svg{width:18px; height:18px; display:block}

/* --- The map ------------------------------------------------------------- */
.e-con.map-full--el .elementor-widget-google_maps iframe{
  filter:grayscale(.28); display:block; width:100%;
}

/* --- Service times on the teal band -------------------------------------- */
.e-con.times-strip--el > .e-con-inner{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));
  gap:var(--s3);
  border-top:1px solid rgba(255,255,255,.18);
  padding-top:var(--s3);
}
@media (max-width:640px){
  .e-con.times-strip--el > .e-con-inner{grid-template-columns:1fr 1fr; gap:var(--s2)}
}

/* The media column on a native split: the container's sky background was
   showing as a pale ring around the rounded photograph. The frame belongs to
   the image, not to the container behind it. */
.e-con.story__media{background:none; border-radius:var(--radius-card); overflow:hidden}
.e-con.story__media .elementor-widget-image img{border-radius:var(--radius-card)}


/* ==========================================================================
   27. MINISTRIES — native Elementor blocks
   ========================================================================== */

/* --- The sticky section bar ---------------------------------------------
   The scroll-spy in carmel-motion.js looks for [data-spy] and the anchors
   inside it, and puts .is-active on the <a>. Elementor's Button widget
   renders exactly that <a>, so the script needs no change. */
.e-con.anchorbar--el{
  position:sticky; top:var(--header-h); z-index:60;
  background:var(--white); border-bottom:1px solid var(--line);
  padding:0;
}
@media (max-width:1024px){ .e-con.anchorbar--el{top:0} }
.e-con.anchorbar__inner{padding:0; overflow-x:auto; scrollbar-width:none}
.e-con.anchorbar__inner::-webkit-scrollbar{display:none}
.elementor-widget-button.anchor-link .elementor-button{
  background:none; border:0; border-radius:0; box-shadow:none;
  font-family:var(--font-display); font-size:.9375rem; font-weight:500;
  color:var(--muted); padding:20px 0; white-space:nowrap;
  position:relative; text-decoration:none;
  transition:color var(--t-base) var(--ease);
}
.elementor-widget-button.anchor-link .elementor-button::after{
  content:""; position:absolute; left:0; right:100%; bottom:-1px; height:2px;
  background:var(--teal); transition:right var(--t-base) var(--ease);
}
.elementor-widget-button.anchor-link .elementor-button:hover{color:var(--ink)}
.elementor-widget-button.anchor-link .elementor-button.is-active{color:var(--teal)}
.elementor-widget-button.anchor-link .elementor-button.is-active::after,
.elementor-widget-button.anchor-link .elementor-button:hover::after{right:0}

/* Anchored sections clear the fixed header when jumped to. */
.e-con#church, .e-con#outreach, .e-con#serve{scroll-margin-top:150px}

/* --- Alternating numbered rows ------------------------------------------
   Every second row swaps its photograph to the right. Done with nth-child so
   the pattern survives the church adding, deleting or reordering rows —
   nothing has to be set per row. */
.e-con.alt-list--el,
.e-con.alt-row--el,
.e-con.alt-row__media--el,
.e-con.alt-row__body--el,
.e-con.alt-row__meta--el,
.e-con.stat-strip--el{padding:0}
.e-con.alt-list--el > .e-con-inner > .e-con:nth-child(even) > .e-con-inner > .alt-row__media--el,
.e-con.alt-list--el > .e-con-inner > .e-con:nth-child(even) > .e-con-inner > .alt-row__todo--el{order:2}

.e-con.alt-row__media--el{
  border-radius:var(--radius-card); overflow:hidden; background:var(--sky);
}
.e-con.alt-row__media--el img{
  width:100%; aspect-ratio:4/3; object-fit:cover; display:block;
  border-radius:0;
  transition:transform .9s var(--ease);
}
@media (hover:hover){
  .e-con.alt-row--el:hover .alt-row__media--el img{transform:scale(1.04)}
}
.e-con.alt-row__todo--el{
  aspect-ratio:4/3; border:1px dashed var(--gold); border-radius:var(--radius-card);
  background:repeating-linear-gradient(45deg, rgba(197,160,89,.08) 0 14px, transparent 14px 28px);
  text-align:center; padding:var(--s4);
}
/* The inner wrapper has to fill the tile, or the centred text sits at the
   top of a 4:3 box instead of the middle of it. */
.e-con.alt-row__todo--el > .e-con-inner{
  height:100%; justify-content:center; align-items:center;
}
.e-con.alt-row__todo--el .todo__note{max-width:30ch}
/* On the near-black outreach band the muted note needs to come up. */
.band--deep .e-con.alt-row__todo--el{border-color:rgba(197,160,89,.6)}
.band--deep .e-con.alt-row__todo--el .todo__note{color:rgba(255,255,255,.66)}
.e-con.alt-row__body--el{max-width:52ch}
.e-con.alt-row__body--el h3{font-size:clamp(1.5rem, 2.4vw, 2rem); line-height:1.12; margin:0}
.e-con.alt-row__meta--el .ministry__tag--el{
  background:var(--sky); padding:5px 12px; border-radius:5px; white-space:nowrap;
}
.band--deep .e-con.alt-row__meta--el .ministry__tag--el{background:rgba(255,255,255,.08)}
/* The dark band's headings and copy carry their colour as widget settings
   (see $rows($outreach, true) in elementor-build.php), so nothing is stated
   here that the panel could not override. */

/* --- Figures on the outreach band ---------------------------------------
   Elementor's Counter widget, so the number, suffix and caption are panel
   settings rather than data attributes on a <b>. */
.e-con.stat-strip--el > .e-con-inner{flex-wrap:wrap}
.elementor-widget-counter.stat--el .elementor-counter-number-wrapper{
  font-family:var(--font-display); font-weight:700; font-size:2.75rem;
  color:var(--gold); line-height:1; font-variant-numeric:tabular-nums;
  justify-content:flex-start;
}
.elementor-widget-counter.stat--el .elementor-counter-title{
  font-family:var(--font-body); font-size:.9375rem; font-weight:400;
  color:rgba(255,255,255,.7); margin-top:6px; text-align:left;
}

@media (max-width:900px){
  .e-con.alt-row--el > .e-con-inner{flex-direction:column !important}
  .e-con.alt-row--el > .e-con-inner > .e-con{width:100% !important}
  .e-con.alt-list--el > .e-con-inner > .e-con:nth-child(even) > .e-con-inner > .alt-row__media--el,
  .e-con.alt-list--el > .e-con-inner > .e-con:nth-child(even) > .e-con-inner > .alt-row__todo--el{order:0}
}


/* ==========================================================================
   28. THE REMAINING PAGES — native Elementor blocks
   New Here, Beliefs, Giving, Privacy, 404 and Home. Layout and skin only:
   every size and colour that a person would plausibly change is a widget
   setting, so nothing here outranks the panel.
   ========================================================================== */

/* --- Shared: rows of buttons, and a photograph used as a band ------------ */
.e-con.btnrow--center > .e-con-inner{justify-content:center}
.e-con.band-image--el{position:relative; isolation:isolate; overflow:hidden; color:var(--white)}
.e-con.band-image--el::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background:linear-gradient(180deg, rgba(11,17,20,.86), rgba(11,17,20,.78)),
             linear-gradient(90deg, rgba(14,65,85,.4), transparent 60%);
}
.e-con.band-image--el > .e-con-inner{position:relative; z-index:1}
.pullquote--light{border-left-color:var(--gold)}
.e-con.placeholder--light{
  background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.4);
}
.e-con.times-strip--plain > .e-con-inner{border-top:0; padding-top:0}

/* --- New Here: the six things ------------------------------------------- */
.e-con.icon-grid--el > .e-con-inner{
  display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:var(--s3);
}
.e-con.icon-card--el{
  background:var(--white); border:1px solid var(--line); border-radius:var(--radius-card);
  padding:var(--s4) var(--s3);
  transition:transform var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease),
             border-color var(--t-base) var(--ease);
}
.e-con.icon-card--el .icon-card__icon--el{
  width:52px; height:52px; border-radius:50%;
  background:var(--sky); color:var(--teal);
  display:grid; place-items:center; flex:none;
  transition:background var(--t-base) var(--ease), color var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.e-con.icon-card--el .icon-card__icon--el p{margin:0; line-height:0}
.e-con.icon-card--el .icon-card__icon--el svg{width:22px; height:22px}
.e-con.icon-card--el h3{font-size:1.125rem; font-weight:600; margin:0}
@media (hover:hover){
  .e-con.icon-card--el:hover{transform:translateY(-2px); box-shadow:var(--shadow-card); border-color:transparent}
  .e-con.icon-card--el:hover .icon-card__icon--el{background:var(--teal); color:var(--white); transform:scale(1.06)}
}

/* --- New Here: the tick list -------------------------------------------- */
.e-con.checklist--el,
.e-con.check-row{padding:0}
.e-con.check-row .check-row__tick{flex:0 0 22px; color:var(--gold)}
.e-con.check-row .check-row__tick p{margin:0; line-height:0}
.e-con.check-row .check-row__tick svg{width:22px; height:22px; display:block}

/* --- Beliefs ------------------------------------------------------------- */
.e-con.spy-layout--el > .e-con-inner{align-items:flex-start}
.e-con.spy--el{position:sticky; top:calc(var(--header-h) + var(--s3)); padding:0}
.spy__rail h4{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.14em; text-transform:uppercase; color:var(--muted); margin:0 0 var(--s2);
}
.spy__rail ol{list-style:none; margin:0; padding:0; display:flex; flex-direction:column}
.spy__rail li{margin:0}
.spy__rail a{
  display:flex; gap:12px; align-items:baseline; padding:7px 0;
  font-size:.9375rem; color:var(--muted); text-decoration:none;
  border-left:2px solid transparent; padding-left:14px;
  transition:color var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
.spy__rail a span{
  font-family:var(--font-display); font-weight:600; font-size:.75rem;
  color:var(--medium-blue, #7F9EAA); font-variant-numeric:tabular-nums;
}
.spy__rail a:hover{color:var(--ink)}
.spy__rail a.is-active{color:var(--teal); border-left-color:var(--gold)}
.spy__rail a.is-active span{color:var(--gold)}

.e-con.doctrine--el,
.e-con.doctrine__item--el,
.e-con.doctrine__text{padding:0}
.e-con.doctrine__item--el{
  padding-bottom:var(--s4); border-bottom:1px solid var(--line);
}
.e-con.doctrine__item--el .doctrine__num--el{flex:0 0 46px}
.e-con.doctrine__item--el .doctrine__copy{max-width:62ch}
.e-con.doctrine__item--el.is-active .doctrine__num--el{color:var(--gold)}
.display-xl .elementor-heading-title,
h2.display-xl{font-size:clamp(2rem, 4.4vw, 3.25rem)}

/* --- Privacy: one long document, one widget ------------------------------ */
.e-con.measure-wide{max-width:74ch; padding:0}

/* --- 404 ----------------------------------------------------------------- */
.e-con.error-hero--el .error-code--el{
  font-family:var(--font-display); font-weight:700; font-size:clamp(3rem, 9vw, 6rem);
  line-height:1; letter-spacing:-.04em;
}
.e-con.error-links--el{padding:0}
.e-con.error-links--el > .e-con-inner{flex-wrap:wrap}
.elementor-widget-button.error-link .elementor-button{
  background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.32);
  border-radius:100px; padding:9px 18px; color:var(--white);
  font-family:var(--font-display); font-size:.9375rem; font-weight:500;
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease), color var(--t-base) var(--ease);
}
.elementor-widget-button.error-link .elementor-button:hover{
  background:var(--white); border-color:var(--white); color:var(--ink);
}

/* --- Giving -------------------------------------------------------------- */
.e-con.give-grid--el{padding:0}
.e-con.give-card--el{
  background:var(--white); border:1px solid var(--line);
  border-radius:var(--radius-card); padding:var(--s4);
}
.e-con.give-card--primary--el{border-color:var(--teal); box-shadow:var(--shadow-card)}
.e-con.give-card--el h3{font-size:1.375rem; margin:0}
.e-con.give-card--el .give-card__flag{color:#9C5C15; font-weight:500}
.e-con.give-card--el .give-card__foot{
  margin-top:auto; padding-top:var(--s3); border-top:1px solid var(--line);
}
.e-con.give-card--el .give-card__foot a{color:var(--teal); font-weight:500}
.upi-idblock{margin-top:var(--s3)}
.upi-idblock__label{
  font-family:var(--font-display); font-size:var(--fs-label); font-weight:600;
  letter-spacing:.14em; text-transform:uppercase; color:var(--muted);
  display:block; margin-bottom:8px;
}

/* Two funds side by side. Each card carries a QR, so the pair needs equal
   halves rather than the 55/45 the single-fund page used. */
.e-con.give-grid--el > .e-con-inner > .e-con{min-width:0}
.e-con.give-card--el .qr-block img{width:170px; height:170px}

/* On a phone the deep-link button is the useful control and the QR is not —
   you cannot scan your own screen — so the column flips: button first, code
   underneath for someone holding a second phone. `column-reverse` reorders
   the painted result without moving anything in the markup, which keeps the
   reading order (code, then its explanation) intact for a screen reader. */
.upi-app-note{display:none}
@media (hover:none) and (pointer:coarse){
  .qr-block{flex-direction:column-reverse; align-items:flex-start; gap:var(--s3)}
  .qr-block > div{flex:0 0 auto; width:100%}
  .upi-app-note{display:block; font-size:.875rem; color:var(--muted); margin-top:10px}
  .upi-app{width:100%; justify-content:center}
  .e-con.give-card--el .qr-block img{width:140px; height:140px}
}

/* Bank transfer: folded away by default. Most givers use the QR, and a wall
   of account numbers under each fund makes the simple route look harder than
   it is. <details> is the whole mechanism — no script, works before hydration,
   and the browser handles the keyboard for us. */
.bankblock{
  margin-top:var(--s3); border-top:1px solid var(--line); padding-top:var(--s3);
}
.bankblock > summary{
  cursor:pointer; list-style:none; display:flex; align-items:center; gap:8px;
  font-family:var(--font-display); font-size:.9375rem; font-weight:500;
  color:var(--teal);
}
.bankblock > summary::-webkit-details-marker{display:none}
.bankblock > summary::after{
  content:"+"; margin-left:auto; font-size:1.1rem; line-height:1; color:var(--muted);
}
.bankblock[open] > summary::after{content:"–"}
.bankblock > summary:hover{color:var(--teal-dark)}
.bankblock > summary:focus-visible{outline:2px solid var(--teal); outline-offset:3px; border-radius:4px}
.bankblock__body{padding-top:var(--s3)}
.bankblock__note{
  margin-top:var(--s3); font-size:.875rem; line-height:1.6; color:var(--muted);
}
.bankblock__note a{color:var(--teal); font-weight:500}

.bankrows{display:grid; grid-template-columns:auto 1fr; gap:10px var(--s3); margin:0}
.bankrows dt{
  font-size:.8125rem; letter-spacing:.06em; text-transform:uppercase;
  color:var(--muted); align-self:center;
}
.bankrows dd{margin:0; min-width:0; font-size:.9375rem; align-self:center}
@media (max-width:520px){
  .bankrows{grid-template-columns:1fr; gap:4px}
  .bankrows dd{margin-bottom:10px}
}

/* An account number is a string to be copied exactly, never retyped, so it
   gets the same copy affordance as the UPI ID at a size that sits inside a
   table row. */
.copyfield--sm{display:inline-flex; max-width:100%; border-radius:8px}
.copyfield--sm code{padding:6px 10px; font-size:.875rem; letter-spacing:.02em}
.copyfield--sm button{padding:6px 12px; font-size:.8125rem}

/* --- Home: hero ---------------------------------------------------------- */
.e-con.hero--el{
  position:relative; isolation:isolate; color:var(--white);
  min-height:clamp(600px, 88vh, 900px);
  /* With a background VIDEO on this container, Elementor writes the fallback
     photograph out as a plain background-image and offers no size or position
     control for it — those two panel fields only appear for a classic
     background. Without this the fallback tiles at its natural size behind the
     video, which is what a visitor sees on every phone and on the first paint
     of every desktop load. Two classes, so a panel setting still outranks it. */
  background-size:cover; background-position:center center; background-repeat:no-repeat;
}
/* The video layer sits at z-index 0, and so does the gradient ::after below.
   A tie is broken by paint order and a pseudo-element paints after its
   element's children, so the gradient lands on top of the video exactly as it
   lands on top of the photo — the headline keeps its contrast either way. */
.e-con.hero--el .elementor-background-video-container{border-radius:inherit}
.e-con.hero--el .elementor-background-video-embed,
.e-con.hero--el .elementor-background-video-hosted{
  /* Elementor sizes the iframe itself in JS; this is the belt for the frame it
     takes to run, so a letterboxed player never flashes at the wrong size. */
  object-fit:cover;
}
.e-con.hero--el::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  /* Matches the prototype exactly. The 42% stop is the one that matters: the
     headline sits there, and anything lighter puts white type over faces. */
  background:linear-gradient(180deg, rgba(11,17,20,.72) 0%, rgba(11,17,20,.35) 42%, rgba(11,17,20,.88) 100%);
}
/* The hero is a full-width container with one boxed child. A flex child
   stretches by default, so justify-content on the parent had nothing to push
   — the copy filled the whole 88vh instead of sitting at the bottom. */
.e-con.hero--el > .e-con{align-self:flex-end}
.e-con.hero--el > .e-con,
.e-con.hero--el > .e-con > .e-con-inner{position:relative; z-index:1}
.e-con.hero__times--el > .e-con-inner{
  border-top:1px solid rgba(255,255,255,.18); padding-top:var(--s3);
}
/* Size and letter-spacing moved onto the widget itself, where the church can
   see and change them. Only the measure stays here — Elementor has no
   max-width field for a heading, and this one is in ch so it re-wraps in step
   with whatever size they set rather than at a fixed pixel width. */
.e-con.hero--el .hero__title .elementor-heading-title{max-width:20ch}

/* The four words the church describes itself by.
   They are marked up as <strong> rather than with a class of their own, so the
   church can add or remove emphasis from the ordinary bold button in the
   editor and the styling follows — no class to remember, nothing to break.
   The gold rule is drawn with a background gradient rather than
   text-decoration because a decoration's thickness cannot be animated, and
   this one wipes in after the line has settled. */
.e-con.hero--el .hero__lead strong{
  font-weight:600; color:#fff;
  background-image:linear-gradient(var(--gold), var(--gold));
  background-repeat:no-repeat;
  background-position:0 100%;
  background-size:100% 2px;
  padding-bottom:3px;
}
/* Gated behind has-anim: with JS off, or reduced motion, the rules are simply
   there from the first paint. The animation can only ever add the wipe, never
   be the reason a rule is missing. */
.has-anim .e-con.hero--el .hero__lead strong{
  background-size:0 2px;
  animation:ccc-underline .55s var(--ease) both;
}
.has-anim .e-con.hero--el .hero__lead strong:nth-of-type(1){animation-delay:1.05s}
.has-anim .e-con.hero--el .hero__lead strong:nth-of-type(2){animation-delay:1.18s}
.has-anim .e-con.hero--el .hero__lead strong:nth-of-type(3){animation-delay:1.31s}
.has-anim .e-con.hero--el .hero__lead strong:nth-of-type(4){animation-delay:1.44s}
@keyframes ccc-underline{ to{ background-size:100% 2px } }
.e-con.hero__times--el{margin-top:var(--s1)}

/* --- Home: the newest message -------------------------------------------- */
/* The second colour in the heading. A <span> inside the heading widget rather
   than a second widget, so the two halves stay on one baseline grid and the
   church edits one field, not two. */
.e-con.watch--el .head-hl{color:var(--teal)}

/* Elementor draws the player into a wrapper of its own; the rounded corner and
   the shadow go there, because putting them on the iframe leaves square
   corners poking out underneath. */
.e-con.watch__player--el{padding:0; background:none}
.ytlatest__frame{
  position:relative; aspect-ratio:16/9; border-radius:var(--radius-img);
  overflow:hidden; background:#0B1114;
  box-shadow:0 24px 60px -28px rgba(11,17,20,.45);
}
.ytlatest__frame iframe{position:absolute; inset:0; width:100%; height:100%; border:0}
/* The date is the proof the section is live rather than a still someone
   pasted in months ago — small, quiet, and it disappears on its own if the
   feed ever comes back without one. */
.ytlatest__meta{
  margin-top:12px; font-size:.8125rem; letter-spacing:.02em; color:var(--muted);
}
.ytlatest__fallback{margin:0}
.e-con.watch--el .watch__points{margin-top:4px}
.e-con.watch--el .watch__points .elementor-icon-list-text{
  font-family:var(--font-body); font-size:1rem; font-weight:500; color:var(--ink);
}
/* Stacking on tablet and below is already handled by the shared split rule. */

/* --- Home: identity panels ----------------------------------------------- */
.e-con.identity--el .eyebrow{color:var(--gold)}
.e-con.identity-grid--el{padding:0}
.e-con.identity-grid--el > .e-con-inner{
  display:grid; grid-template-columns:repeat(5, minmax(0,1fr)); gap:6px;
}
.e-con.identity__panel--el{
  position:relative; overflow:hidden; border-radius:var(--radius-img);
  aspect-ratio:3/4; padding:0; justify-content:flex-end;
}
.e-con.identity__panel--el > .e-con-inner{position:relative; height:100%; justify-content:flex-end; padding:0}
.e-con.identity__panel--el .identity__img{position:absolute; inset:0; z-index:0; margin:0}
.e-con.identity__panel--el .identity__img img{
  width:100%; height:100%; object-fit:cover; border-radius:0;
  filter:grayscale(.35) brightness(.78);
  transition:transform 1s var(--ease), filter var(--t-slow) var(--ease);
}
.e-con.identity__panel--el::after{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:linear-gradient(180deg, transparent 40%, rgba(11,17,20,.85) 100%);
}
.e-con.identity__panel--el .identity__caption{
  position:relative; z-index:2; padding:var(--s3);
}
.e-con.identity__panel--el .identity__caption p{
  margin:0; font-family:var(--font-display); font-weight:600; font-size:1.0625rem;
  color:var(--white); display:flex; flex-direction:column; gap:8px;
}
.e-con.identity__panel--el .identity__caption b{
  font-size:.75rem; letter-spacing:.18em; color:var(--gold);
  display:flex; align-items:center; gap:10px;
}
.e-con.identity__panel--el .identity__caption b::after{content:""; flex:1; height:1px; background:rgba(197,160,89,.45)}
@media (hover:hover){
  .e-con.identity__panel--el:hover .identity__img img{transform:scale(1.07); filter:grayscale(0) brightness(.9)}
}

/* --- Home: events and ministry mini-cards -------------------------------- */
.e-con.events--el > .e-con-inner,
.e-con.minicards--el > .e-con-inner{display:grid; gap:var(--s3)}
.e-con.events--el > .e-con-inner{grid-template-columns:repeat(3, minmax(0,1fr))}
.e-con.minicards--el > .e-con-inner{grid-template-columns:repeat(4, minmax(0,1fr))}
.e-con.event--el{
  position:relative; overflow:hidden; border-radius:var(--radius-card);
  aspect-ratio:16/11; padding:0; isolation:isolate; justify-content:flex-end;
}
.e-con.event--el > .e-con-inner{position:relative; height:100%; justify-content:flex-end; padding:0}
.e-con.event--el .event__img{position:absolute; inset:0; z-index:0; margin:0}
.e-con.event--el .event__img img{
  width:100%; height:100%; object-fit:cover; border-radius:0;
  transition:transform .8s var(--ease);
}
.e-con.event--el::after{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:linear-gradient(180deg, rgba(11,17,20,.15) 30%, rgba(11,17,20,.9) 100%);
}
.e-con.event--el .event__body--el{position:relative; z-index:2; padding:var(--s3)}
.e-con.event--el h3{font-size:1.25rem; margin:0}
@media (hover:hover){ .e-con.event--el:hover .event__img img{transform:scale(1.05)} }

.e-con.minicard--el{padding:0}
.e-con.minicard--el .minicard__img img{
  width:100%; aspect-ratio:4/3; object-fit:cover; display:block;
  border-radius:var(--radius-img);
  transition:transform .7s var(--ease);
}
.e-con.minicard--el .minicard__body{padding:var(--s3) 0 0}
.e-con.minicard--el h3{font-size:1.125rem; margin:0}
.e-con.minicard--el{overflow:hidden}
@media (hover:hover){ .e-con.minicard--el:hover .minicard__img img{transform:scale(1.04)} }

/* --- Home: the closing visit band ---------------------------------------- */
.e-con.visit--el{padding:0; background:var(--teal-deep, #0E4155); color:var(--white)}
.e-con.visit--el > .e-con-inner{padding:0; align-items:stretch}
.e-con.visit__map--el .elementor-widget-google_maps,
.e-con.visit__map--el .elementor-widget-google_maps > div,
.e-con.visit__map--el .elementor-widget-google_maps iframe{height:100%; min-height:420px}
.e-con.visit__map--el .elementor-widget-google_maps iframe{filter:grayscale(.28); width:100%; display:block}
.e-con.visit__body--el{padding:var(--s6) var(--gutter)}
.e-con.video-card--el{position:relative}

/* --- Phone --------------------------------------------------------------- */
@media (max-width:1024px){
  .e-con.icon-grid--el > .e-con-inner{grid-template-columns:repeat(2, minmax(0,1fr))}
  .e-con.identity-grid--el > .e-con-inner{grid-template-columns:repeat(3, minmax(0,1fr))}
  .e-con.minicards--el > .e-con-inner{grid-template-columns:repeat(2, minmax(0,1fr))}
  .e-con.spy--el{display:none}
  .e-con.spy-layout--el > .e-con-inner{flex-direction:column !important}
  .e-con.spy-layout--el > .e-con-inner > .e-con{width:100% !important}
  .e-con.give-grid--el > .e-con-inner{flex-direction:column !important}
  .e-con.give-grid--el > .e-con-inner > .e-con{width:100% !important}
  .e-con.visit--el > .e-con-inner{flex-direction:column !important}
  .e-con.visit--el > .e-con-inner > .e-con{width:100% !important}
}
@media (max-width:640px){
  .e-con.icon-grid--el > .e-con-inner{grid-template-columns:1fr}
  .e-con.identity-grid--el > .e-con-inner{grid-template-columns:repeat(2, minmax(0,1fr))}
  .e-con.events--el > .e-con-inner{grid-template-columns:1fr}
  .e-con.doctrine__item--el > .e-con-inner{flex-direction:column !important; gap:8px}
}

/* ==========================================================================
   29. Sermons — the library of past services
   ==========================================================================
   Dark, because a room full of video thumbnails on a white ground reads as a
   contact sheet; on a dark ground the stills carry the page. The palette is
   the site's own deep ink, not a second black. */

.e-con.sermons--el{background:var(--ink-deep, #0B1114); display:flex}
/* The masthead replaces the photographic banner: breadcrumb and title on one
   quiet line, so the player is the first thing anyone looks at. */
.e-con.sermons__masthead{padding:0; margin-bottom:var(--s2)}
.e-con.sermons--el .crumb a{color:rgba(255,255,255,.72)}
.e-con.sermons--el .crumb a:hover{color:#fff}
.e-con.sermons--el .crumb span{color:rgba(255,255,255,.38); margin:0 6px}

.sermons{color:#fff}

/* --- the stage ----------------------------------------------------------- */
.sermons__player{
  position:relative; aspect-ratio:16/9; border-radius:var(--radius-img);
  overflow:hidden; background:#000;
  box-shadow:0 40px 90px -40px rgba(0,0,0,.85);
}
.sermons__player iframe{position:absolute; inset:0; width:100%; height:100%; border:0}
.sermons__caption{margin-top:var(--s3)}
.sermons__eyebrow{
  font-family:var(--font-display); font-size:.6875rem; font-weight:600;
  letter-spacing:.16em; text-transform:uppercase; color:var(--gold); margin:0 0 8px;
}
.sermons__title{
  font-family:var(--font-display); font-size:clamp(1.125rem, 2.2vw, 1.5rem);
  font-weight:600; line-height:1.3; color:#fff; margin:0; max-width:44ch;
}
.sermons__date{margin:6px 0 0; font-size:.9375rem; color:rgba(255,255,255,.62)}

.sermons__heading{
  margin:var(--s6) 0 var(--s3);
  font-family:var(--font-display); font-size:1rem; font-weight:600;
  letter-spacing:.02em; color:rgba(255,255,255,.9);
  padding-bottom:var(--s2); border-bottom:1px solid rgba(255,255,255,.14);
}

/* --- the grid ------------------------------------------------------------ */
.sermons__grid{
  display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:var(--s3);
}
@media (max-width:900px){ .sermons__grid{grid-template-columns:repeat(2, minmax(0,1fr))} }
@media (max-width:560px){ .sermons__grid{grid-template-columns:1fr} }

.sermon{
  display:flex; flex-direction:column; gap:10px;
  text-decoration:none; color:inherit; min-width:0;
}
.sermon__thumb{
  position:relative; display:block; aspect-ratio:16/9; overflow:hidden;
  border-radius:12px; background:#12191d;
  /* A still frame from a service is often dark already; the ring is what keeps
     one card from bleeding into the next on this ground. */
  box-shadow:0 0 0 1px rgba(255,255,255,.10);
  transition:box-shadow var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.sermon__thumb img{
  width:100%; height:100%; object-fit:cover; display:block;
  transition:transform 1s var(--ease), filter var(--t-base) var(--ease);
  filter:brightness(.9);
}
/* The play badge marks these as video without covering the artwork — most of
   these thumbnails are designed posters with the title already on them. */
.sermon__play{
  position:absolute; left:12px; bottom:12px; width:34px; height:34px;
  border-radius:50%; background:rgba(11,17,20,.72);
  backdrop-filter:blur(4px);
  box-shadow:0 0 0 1px rgba(255,255,255,.22);
  transition:background var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.sermon__play::after{
  content:""; position:absolute; top:50%; left:calc(50% + 1.5px);
  transform:translate(-50%,-50%);
  border-style:solid; border-width:6px 0 6px 10px;
  border-color:transparent transparent transparent #fff;
}
.sermon__title{
  font-family:var(--font-display); font-size:.9375rem; font-weight:500;
  line-height:1.4; color:rgba(255,255,255,.92);
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.sermon__date{font-size:.8125rem; color:rgba(255,255,255,.55)}

@media (hover:hover){
  .sermon:hover .sermon__thumb{
    box-shadow:0 0 0 1px rgba(255,255,255,.28), 0 18px 40px -22px rgba(0,0,0,.9);
    transform:translateY(-3px);
  }
  .sermon:hover .sermon__thumb img{transform:scale(1.04); filter:brightness(1)}
  .sermon:hover .sermon__play{background:var(--teal); transform:scale(1.06)}
  .sermon:hover .sermon__title{color:#fff}
}
.sermon:focus-visible{outline:none}
.sermon:focus-visible .sermon__thumb{outline:2px solid var(--gold); outline-offset:3px}

.sermon.is-playing .sermon__thumb{box-shadow:0 0 0 2px var(--teal)}
.sermon.is-playing .sermon__play{background:var(--teal)}

.sermons__morewrap{margin:var(--s5) 0 0; text-align:center}
.sermons__empty{color:rgba(255,255,255,.75)}
.sermons__empty a{color:var(--gold)}

/* Present to a screen reader and to a crawler, absent to the eye. Clipped
   rather than display:none, because a hidden element is skipped by assistive
   technology entirely — which would defeat the point. */
.u-visually-hidden{
  position:absolute !important; width:1px; height:1px; margin:-1px;
  padding:0; overflow:hidden; clip:rect(0 0 0 0); clip-path:inset(50%);
  white-space:nowrap; border:0;
}

/* ==========================================================================
   30. Events — cards the church fills in themselves
   ==========================================================================
   The same card as the built-in version it replaces, rewritten as plain
   markup: the contents now come from the database rather than from the page
   builder, so the shape has to live here instead of in a container's
   settings. */

.evgrid{display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:var(--s3)}
@media (max-width:900px){ .evgrid{grid-template-columns:repeat(2, minmax(0,1fr))} }
@media (max-width:600px){ .evgrid{grid-template-columns:1fr} }

.ev{
  position:relative; display:flex; flex-direction:column; justify-content:flex-end;
  aspect-ratio:16/11; overflow:hidden; isolation:isolate;
  border-radius:var(--radius-card); background:#0B1114;
  text-decoration:none; color:inherit;
}
/* aspect-ratio alone gives the box a definite height, and anything taller than
   that gets clipped by the overflow:hidden above — which for a card carrying a
   long title, a date, a time and a button means the button silently
   disappearing. min-height:fit-content keeps the 16:11 shape as the floor and
   lets the card grow past it when the content needs the room. */
.ev{min-height:fit-content}
.ev__img{
  position:absolute; inset:0; width:100%; height:100%; object-fit:cover;
  z-index:0; border-radius:0;
  transition:transform .8s var(--ease);
}
/* Elementor's blanket `.elementor img{height:auto}` sits at the same weight as
   a single class, so the height above needs the extra class to survive it. */
.ev .ev__img{height:100%}
.ev::after{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:linear-gradient(180deg, rgba(11,17,20,.15) 30%, rgba(11,17,20,.9) 100%);
}
.ev__body{position:relative; z-index:2; padding:var(--s3); display:flex; flex-direction:column; gap:6px}
.ev__when{
  margin:0; font-family:var(--font-display); font-size:var(--fs-label);
  font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:#fff;
}
.ev__title{margin:0; font-size:1.25rem; color:#fff; line-height:1.25}

.ev__meta{
  margin:2px 0 0; font-size:.875rem; line-height:1.45;
  color:rgba(255,255,255,.82);
}

/* The button — and the invisible sheet that makes the rest of the card click
   through to the same place.

   One link per card, so a screen reader announces one control rather than a
   link inside a link. The sheet is the button's own ::after, blown out well
   past the card on every side and then clipped by the card's overflow:hidden.
   The usual trick — inset:0 against a positioned card — cannot be used here,
   because the card's body is itself positioned (it has to sit above the
   gradient) and would become the containing block, leaving the top half of the
   card dead to the pointer. */
.ev__cta{
  align-self:flex-start; margin-top:12px;
  display:inline-flex; align-items:center; gap:8px;
  padding:8px 18px; border-radius:var(--radius-btn);
  background:var(--teal); color:#fff; border:1px solid var(--teal);
  font-family:var(--font-display); font-size:.8125rem; font-weight:600; letter-spacing:.03em;
  text-decoration:none;
  transition:background var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
.ev__cta::after{content:""; position:absolute; inset:-2000px; z-index:1}

/* A link with no wording of its own: the card is clickable, nothing is drawn. */
.ev__cta--bare{
  position:absolute; inset:0; margin:0; padding:0; border:0; background:none;
  font-size:0; border-radius:inherit; overflow:hidden; text-indent:-9999px;
}
.ev__cta--bare::after{display:none}

@media (hover:hover){
  .ev--linked:hover .ev__img{transform:scale(1.05)}
  .ev--linked:hover .ev__title{text-decoration:underline; text-underline-offset:4px}
  .ev__cta:not(.ev__cta--bare):hover{background:var(--teal-dark); border-color:var(--teal-dark)}
}
.ev__cta:focus-visible{outline:2px solid var(--gold); outline-offset:3px}
.ev__cta--bare:focus-visible{outline-offset:-3px}

.evgrid__empty{
  padding:var(--s3); border:1px dashed var(--line-2, #C4CDD0); border-radius:10px;
  color:var(--muted); font-size:.9375rem;
}

/* ==========================================================================
   31. Home — ministries, as a split
   ========================================================================== */

.e-con.mins-split--el > .e-con-inner{align-items:center}

/* The four names, two up. Elementor lays the container out as a flex row, so
   the 48% basis on each tile plus wrap is what makes the 2×2 — a grid here
   would fight the panel's own width fields. */
.e-con.mintiles--el{padding:0; margin-top:var(--s2)}
/* Grid rather than a width on each tile: this build of Elementor does not emit
   a container's width setting, so every "48%" child came out full width and the
   2×2 collapsed into a stack. The same grid pattern the events and feature
   rows already use. */
.e-con.mintiles--el > .e-con-inner{
  display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:14px;
}
.e-con.mintile--el{
  padding:14px 16px; border-radius:10px;
  background:var(--off-white, #F8F9FA);
  border-left:3px solid var(--teal);
  transition:background var(--t-base) var(--ease);
}
.e-con.mintile--el .mintile__name .elementor-heading-title{margin:0}
.e-con.mintile--el .mintile__note p{margin:0; font-size:.8125rem; line-height:1.45}

/* The mosaic. The second column starts a third of a card lower, which is what
   stops four group photographs reading as a contact sheet. */
.e-con.minmosaic--el{padding:0}
.e-con.minmosaic--el > .e-con-inner{
  display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:20px; align-items:start;
}
.e-con.minmosaic__col--el{padding:0; flex:1 1 0; min-width:0}
.e-con.minmosaic__col--drop--el{margin-top:var(--s5)}
.e-con.minmosaic--el .minmosaic__img{margin:0}
.e-con.minmosaic--el .minmosaic__img img{
  width:100%; aspect-ratio:4/3; object-fit:cover; display:block;
  border-radius:var(--radius-img);
  box-shadow:0 18px 40px -28px rgba(11,17,20,.45);
  transition:transform .7s var(--ease);
}
@media (hover:hover){
  .e-con.minmosaic--el .minmosaic__img img:hover{transform:scale(1.03)}
}

@media (max-width:1024px){
  .e-con.mins-split--el > .e-con-inner{flex-direction:column !important}
  .e-con.mins-split--el > .e-con-inner > .e-con{width:100% !important}
  /* The drop is a desktop refinement; stacked, it just looks like a mistake. */
  .e-con.minmosaic__col--drop--el{margin-top:0}
}
@media (max-width:560px){
  .e-con.mintiles--el > .e-con-inner{grid-template-columns:1fr}
}
