.elementor-kit-17{--e-global-color-primary:#022968;--e-global-color-secondary:#3582E2;--e-global-color-text:#12203F;--e-global-color-accent:#FFC830;--e-global-color-c9d7fce:#022968;--e-global-color-a751710:#021A44;--e-global-color-79febb9:#3582E2;--e-global-color-5d98d99:#E7F0FB;--e-global-color-3b17eff:#FFC830;--e-global-color-ea15eb4:#FFE9A8;--e-global-color-7034f28:#FFFFFF;--e-global-color-d6eba6a:#FBFBFC;--e-global-color-e20feb5:#E6E7E9;--e-global-color-ecca3ce:#F3F1EC;--e-global-color-7634415:#12203F;--e-global-color-775ac2c:#36405A;--e-global-color-07a7a00:#7A8298;--e-global-color-e77be08:#FFFFFF;--e-global-color-f6a3728:#DDE6F5;--e-global-color-5dd3f1a:#9BB0D6;--e-global-color-b3acd09:#E6A700;--e-global-typography-primary-font-family:"Oswald";--e-global-typography-primary-text-transform:uppercase;--e-global-typography-secondary-font-family:"Oswald";--e-global-typography-secondary-text-transform:uppercase;--e-global-typography-text-font-family:"Mulish";--e-global-typography-text-text-transform:none;--e-global-typography-accent-font-family:"Mulish";--e-global-typography-accent-text-transform:none;--e-global-typography-140f928a-font-family:"Oswald";--e-global-typography-140f928a-font-size:clamp(3rem, calc(4.375vw + 2.125rem), 5.625rem);--e-global-typography-140f928a-text-transform:uppercase;--e-global-typography-140f928a-line-height:0.92;--e-global-typography-fe703ec1-font-family:"Oswald";--e-global-typography-fe703ec1-font-size:clamp(3rem, calc(2.5vw + 2.5rem), 4.5rem);--e-global-typography-fe703ec1-text-transform:uppercase;--e-global-typography-fe703ec1-line-height:0.96;--e-global-typography-871cee50-font-family:"Oswald";--e-global-typography-871cee50-font-size:clamp(2.25rem, calc(2.917vw + 1.667rem), 4rem);--e-global-typography-871cee50-text-transform:uppercase;--e-global-typography-871cee50-line-height:1.0;--e-global-typography-28974bbc-font-family:"Oswald";--e-global-typography-28974bbc-font-size:clamp(1.75rem, calc(1.875vw + 1.375rem), 2.875rem);--e-global-typography-28974bbc-text-transform:uppercase;--e-global-typography-28974bbc-line-height:1.1;--e-global-typography-5b935e52-font-family:"Oswald";--e-global-typography-5b935e52-font-size:1.625rem;--e-global-typography-5b935e52-text-transform:uppercase;--e-global-typography-5b935e52-line-height:1.1;--e-global-typography-5b935e52-letter-spacing:0.01em;--e-global-typography-c78f4e7c-font-family:"Oswald";--e-global-typography-c78f4e7c-font-size:0.75rem;--e-global-typography-c78f4e7c-text-transform:uppercase;--e-global-typography-c78f4e7c-letter-spacing:0.28em;--e-global-typography-32e05c6c-font-family:"Oswald";--e-global-typography-32e05c6c-font-size:0.75rem;--e-global-typography-32e05c6c-text-transform:uppercase;--e-global-typography-32e05c6c-letter-spacing:0.24em;--e-global-typography-41cd4fd5-font-family:"Oswald";--e-global-typography-41cd4fd5-font-size:0.75rem;--e-global-typography-41cd4fd5-text-transform:uppercase;--e-global-typography-41cd4fd5-letter-spacing:0.14em;--e-global-typography-d6f780b2-font-family:"Mulish";--e-global-typography-d6f780b2-font-size:1.1875rem;--e-global-typography-d6f780b2-line-height:1.55;--e-global-typography-50e5e013-font-family:"Mulish";--e-global-typography-50e5e013-font-size:1.125rem;--e-global-typography-50e5e013-line-height:1.6;--e-global-typography-d6c2c0f2-font-family:"Mulish";--e-global-typography-d6c2c0f2-font-size:1rem;--e-global-typography-d6c2c0f2-line-height:1.55;--e-global-typography-33351576-font-family:"Mulish";--e-global-typography-33351576-font-size:0.875rem;--e-global-typography-33351576-line-height:1.55;--e-global-typography-a49f954a-font-family:"Ms Madi";--e-global-typography-a49f954a-font-size:clamp(2.25rem, calc(2.083vw + 1.833rem), 3.5rem);--e-global-typography-a49f954a-font-weight:400;--e-global-typography-a49f954a-line-height:1;--e-global-typography-9d8a32be-font-family:"Ms Madi";--e-global-typography-9d8a32be-font-size:clamp(3rem, calc(2.708vw + 2.458rem), 4.625rem);--e-global-typography-9d8a32be-font-weight:400;--e-global-typography-9d8a32be-line-height:1;--e-global-typography-9fad0952-font-family:"Oswald";--e-global-typography-9fad0952-font-size:0.75rem;--e-global-typography-9fad0952-text-transform:uppercase;--e-global-typography-9fad0952-letter-spacing:0.14em;font-family:"Mulish", Sans-serif;font-size:18px;line-height:1.55;}.elementor-kit-17 button,.elementor-kit-17 input[type="button"],.elementor-kit-17 input[type="submit"],.elementor-kit-17 .elementor-button{background-color:var( --e-global-color-accent );font-family:"Oswald", Sans-serif;font-size:16px;text-transform:none;text-decoration:none;letter-spacing:0.14em;color:var( --e-global-color-primary );border-radius:8px 8px 8px 8px;padding:12px 24px 12px 24px;}.elementor-kit-17 button:hover,.elementor-kit-17 button:focus,.elementor-kit-17 input[type="button"]:hover,.elementor-kit-17 input[type="button"]:focus,.elementor-kit-17 input[type="submit"]:hover,.elementor-kit-17 input[type="submit"]:focus,.elementor-kit-17 .elementor-button:hover,.elementor-kit-17 .elementor-button:focus{background-color:var( --e-global-color-b3acd09 );color:var( --e-global-color-primary );}.elementor-kit-17 e-page-transition{background-color:#FFBC7D;}.elementor-kit-17 a{color:var( --e-global-color-primary );text-decoration:none;}.elementor-kit-17 a:hover{color:var( --e-global-color-primary );text-decoration:none;}.elementor-kit-17 h1{font-family:"Oswald", Sans-serif;font-weight:700;}.elementor-kit-17 h2{font-family:"Oswald", Sans-serif;font-weight:600;}.elementor-kit-17 h3{font-family:"Oswald", Sans-serif;font-weight:600;}.elementor-kit-17 h4{font-family:"Oswald", Sans-serif;font-weight:500;}.elementor-kit-17 h5{font-family:"Oswald", Sans-serif;font-weight:500;}.elementor-kit-17 h6{font-family:"Oswald", Sans-serif;font-weight:500;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1440px;}.e-con{--container-max-width:1440px;}.elementor-widget:not(:last-child){--kit-widget-spacing:20px;}.elementor-element{--widgets-spacing:20px 20px;--widgets-spacing-row:20px;--widgets-spacing-column:20px;}{}h1.entry-title{display:var(--page-title-display);}@media(max-width:1024px){.elementor-kit-17{font-size:15px;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1024px;}.e-con{--container-max-width:1024px;}}@media(max-width:767px){.elementor-kit-17{font-size:15px;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:767px;}.e-con{--container-max-width:767px;}}:root { --brand-navy:#022968; --brand-navy-deep:#021A44; --brand-blue:#3582E2; --brand-blue-tint:#E7F0FB; --brand-yellow:#FFC830; --brand-yellow-soft:#FFE9A8; --surface-white:#FFFFFF; --surface-page:#FBFBFC; --surface-grey:#E6E7E9; --surface-grey-warm:#F3F1EC; --text-ink:#12203F; --text-ink-soft:#36405A; --text-muted:#7A8298; --text-inverse:#FFFFFF; --text-inverse-soft:#DDE6F5; --text-inverse-muted:#9BB0D6; --font-display:Oswald; --font-body:Mulish; --font-script:Ms Madi; --font-mono:Oswald; --text-2xs:0.625rem; --text-xs:0.75rem; --text-s:0.875rem; --text-m:1rem; --text-l:1.125rem; --text-xl:1.1875rem; --text-2xl:1.5rem; --heading-s:1.625rem; --heading-m:clamp(1.75rem, calc(1.875vw + 1.375rem), 2.875rem); --heading-l:clamp(2.25rem, calc(2.917vw + 1.667rem), 4rem); --heading-xl:clamp(3rem, calc(2.5vw + 2.5rem), 4.5rem); --heading-hero:clamp(3rem, calc(4.375vw + 2.125rem), 5.625rem); --script-m:clamp(2.25rem, calc(2.083vw + 1.833rem), 3.5rem); --script-l:clamp(3rem, calc(2.708vw + 2.458rem), 4.625rem); --script-xl:clamp(3.75rem, calc(6.25vw + 2.5rem), 7.5rem); --space-3xs:0.25rem; --space-2xs:0.5rem; --space-xs:0.75rem; --space-s:1rem; --space-m:1.5rem; --space-l:2rem; --space-xl:3rem; --space-2xl:4rem; --space-3xl:5.5rem; --space-4xl:7rem; --width-prose:50rem; --width-narrow:70rem; --width-content:80rem; --width-wide:90rem; --brand-gold-hover:#E6A700; --heading-xs:1.25rem; --link-accent:#2075DE; }
/* Start custom CSS *//* sanctum-ported */
/* ============================================================ */
/* SPM PARISH HEADER - Custom CSS (Site Settings > Custom CSS)   */
/* Central: stored in the active Kit, loads site-wide.          */
/* Each rule documents WHY code is needed and how fragile it is. */
/* Goal: keep this block as small as possible.                  */
/* ============================================================ */

/* [1] MOBILE NAV ROW - keep logo + hamburger on ONE row on phones. */
/*     Why CSS: the off-canvas trigger renders full-width on mobile  */
/*     and drops the logo onto its own line; this forces a nowrap    */
/*     row with the trigger right-aligned.                           */
/*     Fragility LOW: stable .elementor-element-<id> + standard flex. */
@media(max-width:767px){.elementor-224 .elementor-element-6c800137{flex-direction:row!important;flex-wrap:nowrap!important;align-items:center!important;justify-content:space-between!important;}.elementor-224 .elementor-element-ocbtn01{width:auto!important;flex:0 0 auto!important;}.elementor-224 .elementor-element-548bc031{flex:0 0 auto!important;max-width:55%!important;}}

/* [2] NAV SEARCH ICON - force the toggle icon white.              */
/*     Why CSS: EP free Search Form has NO toggle colour control,   */
/*     and the icon is an inline SVG (needs fill, not just color).  */
/*     Fragility MEDIUM: reaches EP class elementor-search-form__toggle. */
/*     Becomes native in the V4 rebuild.                           */
.elementor-224 .elementor-element-utSearch .elementor-search-form__toggle,.elementor-224 .elementor-element-utSearch .elementor-search-form__toggle i,.elementor-224 .elementor-element-utSearch .elementor-search-form__toggle svg{color:#fff!important;fill:#fff!important;}

/* [3] OFF-CANVAS SEARCH FIELD - readable dark text on light field. */
/*     Why CSS: EP free Search Form (minimal) has NO text colour    */
/*     control.                                                     */
/*     Fragility LOW: input tag .elementor-kit-17 inside a stable id wrapper. */
.elementor-element-ocSearch input,.elementor-element-ocSearch .elementor-search-form__input{color:var(--text-ink)!important;}
.elementor-element-ocSearch input::placeholder{color:#7a7f87!important;}

/* [5] UTILITY-BAR TEXT SIZE - slightly smaller secondary text. Fragility LOW: scoped to utility-bar container. */
.elementor-224 .elementor-element-693720cb .elementor-icon-list-text,.elementor-224 .elementor-element-693720cb .elementor-item{font-size:13px!important;}

/* [6] UTILITY-BAR no-wrap: keep School + Donate on one line on resize. */
/*     Why CSS: HFE nav menu exposes no flex-wrap control. Fragility LOW. */
.elementor-224 .elementor-element-693720cb,.elementor-224 .elementor-element-utLoginMnu .hfe-nav-menu{flex-wrap:nowrap!important;}

/* [7] Hero heading accent: persistent gold italic on Sacred Place. */
.s-hero h1 span{color:#FFC830;}

/* [8] Hero heading mobile/tablet center. */
@media (max-width:1024px){[data-interaction-id="1a19f60a"]{text-align:center!important;max-width:100%!important;}}
/* SPM header-logo fix: Elementor conditional asset loading skips widget-image.min.css on pages without a content image widget, so the header logo link/img fall back to inline+baseline and add a descender gap (~6.6px taller header). Replicate the missing widget-image.min.css declarations, scoped to the header, for consistent header height on all pages. */
#masthead .elementor-widget-image a{display:inline-block}
#masthead .elementor-widget-image img{display:inline-block;vertical-align:middle}

/* st-therese final overrides */
.boxed-content{max-width:90rem;}

.elementor-element-c4e0322 .menu-item a.hfe-menu-item{color:#FFFFFF!important;}
.elementor-element-c4e0322 .menu-item a.hfe-menu-item:hover,.elementor-element-c4e0322 .menu-item.current-menu-item a.hfe-menu-item{color:#FFC830!important;}
.elementor-element-c4e0322 .elementor-nav-menu{flex-wrap:nowrap!important;}
.elementor-element-693720cb .elementor-nav-menu,.elementor-element-a585abf .elementor-nav-menu{flex-wrap:nowrap!important;}

/* spm-hero-bg */
/* ===== HERO OVERLAY OPACITY: edit the rgba(...) alpha values on the .s-hero line below ===== */
.s-hero{background-image:linear-gradient(100deg,rgba(2,41,104,0.72) 0%,rgba(2,41,104,0.40) 40%,rgba(2,41,104,0.10) 72%,rgba(2,41,104,0) 100%),url('https://st-therese.org/wp-content/uploads/2026/07/hero-frandrie-980.jpg');background-size:cover;background-position:center right, right center;background-repeat:no-repeat;}
@media(max-width:767px){.s-hero{background-image:linear-gradient(180deg,rgba(2,41,104,0.92),rgba(2,41,104,0.92)),url('https://st-therese.org/wp-content/uploads/2026/07/hero-frandrie-980.jpg');}}
/* ===== TEMP CSS — pending native conversion (rose, hero left-half, mass heading row) ===== */
@media(min-width:768px){.s-hero .elementor-element-hero-inner > *{max-width:50%;}}
.elementor-element-masshdrow{display:flex;flex-direction:row;justify-content:space-between;align-items:flex-end;width:100%;gap:24px;flex-wrap:wrap;}
.elementor-element-masstimes{position:relative;overflow:hidden;}
.elementor-element-masstimes::after{content:'';position:absolute;right:-100px;top:50%;transform:translateY(-50%);width:560px;height:560px;background:url('https://st-therese.org/wp-content/uploads/2026/06/rose-white.png') no-repeat center center;background-size:contain;opacity:0.10;pointer-events:none;z-index:0;}
.elementor-element-masstimes > *{position:relative;z-index:1;}

/* Utility-bar Give Online — flush CTA (class-based, kit-portable) */
.elementor-element-utLoginMnu .hfe-nav-menu{align-items:center;}
.elementor-element-utLoginMnu .spm-util-cta{align-self:stretch;display:flex;align-items:stretch;}
.elementor-element-utLoginMnu .spm-util-cta > a{background:#FFC830;color:#022968!important;display:flex;align-items:center;height:100%;min-height:40px;padding:0 18px;font-weight:600;border-radius:0;}
.elementor-element-utLoginMnu .spm-util-cta > a:hover{background:var(--e-global-color-primary);color:var(--e-global-color-7034f28)!important;}

/* Primary nav + search pinned right; gap falls between logo and nav (flex push) */
.spm-primary-nav{margin-left:auto;}

/* ===== HEADER V2 (post 331) — native rebuild; scoped copies of still-needed rules. At flip: retire .elementor-224 versions. ===== */
.elementor-331 .elementor-element-utLoginMnu .elementor-nav-menu{align-items:center;}
@media(max-width:1024px){.elementor-331 .elementor-element-693720cb .elementor-item{font-size:13px!important;}}

/* HEADER V2: dropdown panels get a generous fixed minimum width instead of hugging content (Craig) */
.elementor-331 .elementor-element-c4e0322 .elementor-nav-menu--dropdown{min-width:340px;}


/* L-003 Pattern A overlay card (Spotlight/Events) — scrim + type helpers, class-keyed/portable */
.spm-ov-card-title{text-transform:uppercase;}
.spm-ov-card-desc{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;}

/* L-005 Pattern B editorial (News + Ministry, M63C) — 16:9 media, non-root child */
.spm-ed-media-169, .elementor-element-news-card-media, .elementor-element-ministry-card-media{aspect-ratio:16/9;width:100%;background-size:cover;background-position:center center;flex-shrink:0;}


/* L-019 Phase 2: float the transparent hero header so hero pages need no negative pull. Class-keyed to #331 (hero header only); #607 solid header stays in flow. */
header.elementor-331 {
	position: absolute;
	top: var(--wp-admin--admin-bar--height, 0px);
	left: 0;
	right: 0;
	z-index: 100;
}
/* SPM: View All link hover (Item 4) */
.spm-viewall a:hover, .spm-viewall a:focus-visible { color: var(--e-global-color-secondary); }

/* SPM: Item 1 button weight parity (Elementor omits font-weight for V3 button widget) */
.elementor-widget-button .elementor-button { font-weight: 600; }

/* SPM R2: Item 8 quote mark visibility (no native control for quotation-skin ::before) */
.elementor-widget-blockquote.elementor-blockquote--skin-quotation .elementor-blockquote::before { color: var(--e-global-color-accent); }

/* SPM R2-closeout D2: inline field labels (label-caps treatment) */
.spm-field-label { font-family: var(--font-display, 'Oswald'), sans-serif; font-weight: 500; font-size: var(--text-xs, 0.75rem); letter-spacing: 0.14em; text-transform: uppercase; color: var(--e-global-color-primary); }


/* Editor-preview only: WP emits --wp-admin--admin-bar--height:32px for logged-in
   sessions, but Elementor's preview iframe renders no admin bar — so the absolutely
   positioned header drops 32px away from the hero while editing. Front end is
   unaffected (logged-out visitors get 0px). Added 2026-07-23, Craig signed off.
   NOTE: keyed to .elementor-editor-active (not .elementor-editor-preview) — the
   latter is not emitted by this Elementor version; live DevTools capture confirmed
   .elementor-editor-active is the editor-iframe-only body class and is absent on the
   logged-in front end, so the logged-in admin-bar offset stays correct. */
body.elementor-editor-active .elementor-location-header { top: 0; }

/* [OEB-M11-A1] BAND RHYTHM - even the vertical rhythm BETWEEN adjacent bands. */
/*     `band` carries space-2xl (4rem) on BOTH block edges, so two adjacent    */
/*     bands produced 8rem. Round 1 cut only the TOP of the following band,    */
/*     which made the asymmetry WORSE, not better: a coloured band's padding   */
/*     sits inside its background and does not read as whitespace, so the eye  */
/*     saw 32px above a photo band and 96px below it.                          */
/*     Round 2 trims BOTH sides of every interior seam, so the space below a   */
/*     band matches the space above it whatever follows. Interior seam is now  */
/*     2rem + 2rem = 4rem, symmetric. The page's FIRST band keeps its full     */
/*     4rem top and the LAST band its full 4rem bottom, so the outer page      */
/*     margins are untouched.                                                  */
/*     Class-keyed and portable - no post-ID, no element-instance scope (D6).  */
/*     Pre-authorised by Craig, Mission 11 A1.                                 */
/*     THREE traps, all deliberate:                                            */
/*     (1) The leading `.elementor` is REQUIRED. Elementor emits               */
/*         `.elementor .band` at 0,2,0 and loads it AFTER this file, so a bare */
/*         `.band + .band` silently loses and nothing changes (O-53).          */
/*     (2) `:has()` is the only way CSS can express "a band FOLLOWED BY a      */
/*         band". There is no native Elementor control for it.                */
/*     (3) Elementor rewrites the bare word s-e-l-e-c-t-o-r anywhere in kit    */
/*         custom CSS, INCLUDING inside comments. Avoid it here (O-52).        */
.elementor .band + .band { padding-block-start: var(--space-l); }
.elementor .band:has(+ .band):not(:has(> .e-ts2-s)) { padding-block-end: var(--space-l); }
/* [OEB-M23-A1] TITLE BANDS ARE EXCLUDED FROM THE BOTTOM TRIM ABOVE.
   Mechanism, measured 2026-07-30 on prod AND dev (identical 64/32, +16px):
   the band class gives 4rem/4rem; the trim below cuts the bottom to 2rem
   whenever another band follows. While the eyebrow existed the asymmetry
   read as a text composition; after the M19 eyebrow removal the Standard
   title band holds a lone h1 and the 2:1 padding reads as an off-center
   title. The Hero band self-centers (fixed 416px min-height, centered
   content) and needs no exclusion. The key .e-ts2-s is the Standard
   title band component's own compiled inner-container class, stable
   across installs because component-internal element ids travel.
   Consequence, deliberate: the seam below a Standard title band becomes
   64+32=96px, matching what Hero pages already show. Interior content
   seams keep M11-A1's even 64px. Component definitions untouched. */


/* [O-71] FORM SUBMIT BUTTON OVERFLOWS ITS FIELD GROUP AT TABLET WIDTHS.
   Why CSS: the Elementor form submit button carries an intrinsic width
   (105px measured) larger than its flex field group (54px measured), so it
   escapes the container and pushes document scrollWidth past the viewport,
   causing sideways scroll on every page at around 900px. Elementor exposes
   no native control for the button's shrink behaviour in a submit field group.
   Keyed to Elementor's own form classes; no post-ID scoping; portable.
   Measured before the fix: 900px viewport, 908px scrollWidth, 8px overflow.
   Added 2026-07-29, OEB Mission 18, Craig-authorised under D6. */
.elementor .elementor-form .elementor-field-type-submit{min-width:0;}
.elementor .elementor-form .elementor-field-type-submit .elementor-button{max-width:100%;}

/* [OEB-M22-P5] BODY-COPY LINKS - bold, underlined, link-accent.
   Craig-approved, Mission 22. Token link-accent resolves to a darkened brand-blue
   at 4.5057:1 on white, derived by holding the brand-blue hue and reducing
   lightness only until AA passes. The value lives in the kit variable, not here.
   SCOPE IS PROSE ONLY, and that is a deliberate narrowing by Craig:
   an earlier draft also matched links inside component text props, whose
   dominant effect was restyling all 25 Staff Directory contact lines.
   That arm is intentionally absent - do not reinstate it without a ruling.
   Class-keyed, portable, zero post-ID scoping (D6). Colour is a var() only (R-022).
   The leading .elementor is REQUIRED for cascade weight (O-53). */
.elementor .elementor-widget-text-editor a:not([class*="btn"]):not([class*="e-button"]):not([class*="elementor-button"]){font-weight:700;text-decoration:underline;color:var(--link-accent);}

/* [OEB-M42-B] SECTION INTRO LINKS - the arm M22 deliberately left out, now RULED IN.
   Craig's ruling 2026-08-01, Mission 42. This satisfies the M22 comment above:
   'do not reinstate it without a ruling'. It is NOT that arm reinstated - that one
   matched links inside ALL component text props and would have repainted the 25
   Staff Directory contact lines. This one is keyed to the Section Intro component's
   rendered class only.
   MEASURED BEFORE WRITING, live on all 44 candidate surfaces: this .elementor-kit-17 matches
   exactly ONE anchor site-wide - the Staff Directory prose intro email. The 12 staff
   cards (card-feature), the 4 info-card emails on Contact Us and Baptism, and the
   Capital Campaign FAQ accordion email are all OUTSIDE .section-intro and are
   provably unreachable by this rule.
   Class-keyed, portable, zero post-ID scoping (D6). Colour is a var() only (R-022).
   The leading .elementor is REQUIRED for cascade weight (O-53). */
.elementor .section-intro a:not([class*="btn"]):not([class*="e-button"]):not([class*="elementor-button"]){font-weight:700;text-decoration:underline;color:var(--link-accent);}

/* [OEB-M22-P4] GRAVITY FORMS SUBMIT - carry the yellow CTA treatment.
   Why CSS: Gravity Forms exposes no control to put a design-system class on
   its submit control, and the theme leaves it unstyled (transparent, weight 400).
   Keyed to the form cssClass set on form 1 plus GF own classes; no post-ID.
   All colours are var() tokens - zero raw literals (R-022). */
/* NOTE added after measuring on the live page: Gravity Forms 2.10 ships the
   'orbital' theme framework, which paints the submit control with its own
   high-specificity rules (measured winning value rgb(32,76,229), radius 3px,
   weight 500). Its theme custom properties are not exposed on the wrapper's
   computed style, so re-theming them natively would mean guessing property
   names. !important is used deliberately here, matching the convention the
   rules above already use for third-party widgets that expose no control.
   Colours remain var() tokens - the override is on weight, not on values. */
.elementor .spm-contact-form .gform_footer input[type="submit"],.elementor .spm-contact-form input.gform_button[type="submit"]{background-color:var(--brand-yellow)!important;color:var(--brand-navy)!important;font-weight:600!important;border:0!important;border-radius:0!important;padding:14px 28px!important;cursor:pointer;inline-size:auto!important;}
.elementor .spm-contact-form .gform_footer input[type="submit"]:hover,.elementor .spm-contact-form .gform_footer input[type="submit"]:focus-visible{background-color:var(--brand-gold-hover)!important;}

/* [OEB-M23-E] CATEGORY HEADINGS - short gold rule beneath each category
   heading, per Craig's request for stronger visual separation on the
   Ministries page. Role-named class, applied per element; the colour and
   spacing bind existing tokens (R-022, D4). Class-keyed, zero post-ID
   scoping (D6); portable to dev and hub with the same class name. */
.elementor .heading-category::after{content:"";display:block;inline-size:48px;block-size:3px;background-color:var(--brand-yellow);margin-block-start:var(--space-xs);}

/* [OEB-M25-B] Fr. Andrie message band on the Capital Campaign page: equalize the two split columns. The split-media and split-body classes carry unequal flex bases (20rem vs 14rem); these two page-local style hooks pin both columns to the same basis so the photo column equals the text column. Child-combinator keeps this rule ahead of the class shorthand in the cascade. */
@media (min-width: 768px) { .elementor .split > .e-fra2-s, .elementor .split > .e-fra3-s { flex-basis: calc(50% - (var(--space-xl) / 2)); } }

/* [OEB-M30-B] Capital Campaign pillar grid: five projects read 3 across with the final two centred beneath. The shared card-grid class auto-fits to four at desktop, so this page-local hook overrides only the column track, at desktop width only. Six equal tracks with each card spanning two gives three per row; starting card four at track two centres the second row. Compound class keeps this ahead of the shared class in the cascade. Below desktop the shared auto-fit behaviour is untouched. */
@media (min-width: 1025px) {
.elementor .card-grid.campaign-pillar-grid { grid-template-columns: repeat(6, 1fr); }
.elementor .card-grid.campaign-pillar-grid > * { grid-column: span 2; }
.elementor .card-grid.campaign-pillar-grid > :nth-child(4) { grid-column: 2 / span 2; }
}

/* [OEB-M49-A] INFO CARD LINKS - the third carrier arm. Craig's ruling 2026-08-01,
   Mission 49, approving the arm drafted in Mission 48 Part A (O-140).
   WHY AN ARM AT ALL: this site delivers link styling entirely through carrier-scoped
   kit rules - [OEB-M22-P5] for text-editor prose and [OEB-M42-B] for section intros.
   An Info Card is neither, so its links were never matched. That is O-114's finding
   exactly: not excluded, never matched. There is NO element-level route - a class on
   a component instance is forbidden by R-045(c) and local styles are house-forbidden.
   MEASURED LIVE BEFORE WRITING: component 797 has 33 instances across 15 documents
   (revisions excluded). Exactly FIVE carry an anchor and only FOUR are reachable by a
   visitor - Contact Us q022/q023 and Baptism q014/q015, all four mailto. The fifth is
   in library template 812 (t014, a placeholder address); that template redirects to
   the home page and renders nowhere.
   Staff Directory cards are card-feature, NOT info-card, and stay unstyled - that is
   Craig's M22 ruling and this arm is provably unable to reach them.
   Declarations are byte-identical to the two arms above, deliberately: one look.
   NO hover rule, also deliberately - measured on this site, zero hover rules match a
   styled link, so the two arms above have none either. Adding one here would make
   Info Card links the only links on the site that move on hover.
   Class-keyed, portable, zero post-ID scoping (D6). Colour is a var() only (R-022).
   The leading .elementor is REQUIRED for cascade weight (O-53). */
.elementor .info-card a:not([class*="btn"]):not([class*="e-button"]):not([class*="elementor-button"]){font-weight:700;text-decoration:underline;color:var(--link-accent);}


/* [OEB-P9-A] CLASSIC BODY-COPY LINKS - the fourth carrier arm. Craig-directed
   2026-08-14 (Part 9): stick to the established carrier model, do not reinvent.
   WHY: theme-post-content output is a carrier no existing arm matches - O-114's
   pattern again (not excluded, never matched). Posts authored in the classic
   editor (Reclaiming Sundays, CSA, all Bible studies) render their body through
   the Post Content widget on SPM - Post Single (1142) and News Single (592),
   so their anchors carried no styling while text-editor prose did (M22-P5).
   SCOPE - THE :has() EXCLUSION IS THE WHOLE POINT: the same widget also renders
   entire nested Elementor page documents on templates 522/605/825. A bare
   .elementor-widget-theme-post-content arm would therefore repaint links inside
   ALL page content - component text props, the 25 Staff Directory contact lines -
   which is precisely the arm M22 deliberately left absent. Classic content is
   distinguishable: it never contains a nested .elementor document; page renders
   always do. :not(:has(.elementor)) keys the arm to classic content only.
   :has() precedent: M11-A1 band rhythm. MEASURED BEFORE WRITING: 247 anchors
   across 36 published classic posts are reachable; zero anchors inside nested
   Elementor documents can match.
   Declarations byte-identical to M22-P5/M42-B/M49-A, deliberately: one look.
   NO hover rule, matching the three arms above. Class-keyed, portable, zero
   post-ID scoping (D6). Colour is a var() only (R-022). The leading .elementor
   is REQUIRED for cascade weight (O-53). */
.elementor .elementor-widget-theme-post-content:not(:has(.elementor)) a:not([class*="btn"]):not([class*="e-button"]):not([class*="elementor-button"]){font-weight:700;text-decoration:underline;color:var(--link-accent);}


/* [OEB-M67-A] BUTTON BREATHING ROOM - the systemic button-spacing mechanism.
   Craig-directed 2026-08-14 (M67): buttons crowd the content below them; per-page
   spacing patches are RETIRED as a class - three existed (Give v004, Bulletin w002,
   Careers y003, all 2.5rem on the FOLLOWING heading) and all are removed this mission.
   MEASURED BEFORE WRITING: the approved give-online seam rendered 56px total
   (2.5rem hand margin + the prose-zone's 1rem space-s gap). The systemic rhythm
   converges on ONE total seam of space-xl (3rem) in every context - the only token
   adjacent to both the 40px patch value and the 56px rendered seam.
   TWO RULES, ONE RHYTHM, deliberately: prose carriers have NO flex gap, so the
   margin IS the seam (space-xl); prose-zone flex contexts already carry a space-s
   gap, so a space-l margin COMPOSES with it to the same space-xl total. Do not
   equalize the two margins - the totals are what match.
   MEASURED SCOPE: zero btn-class anchors exist in prose today (rules 1-2 are the
   forward guarantee); rule 3 reaches exactly four pages live - Give, Bulletin,
   Careers (the three unwound patches) and Livestream (three seams, previously
   crowded at 16px, now correct - the systemic rule fixing an unreported instance).
   :not(:last-child) keeps a zone-ending button flush - card CTAs and end-of-zone
   buttons gain nothing. Widget-in-container cases (FF Single 550) converge on the
   parent gap instead - see that template; a margin there would stack (the doubling
   this comment exists to forbid).
   Class-keyed, portable, zero post-ID scoping (D6). Values are var() only (R-022).
   The leading .elementor is REQUIRED for cascade weight (O-53). */
.elementor .elementor-widget-theme-post-content:not(:has(.elementor)) a[class*="btn"],.elementor .elementor-widget-text-editor a[class*="btn"]{display:inline-block;margin-block-end:var(--space-xl);}
.elementor .prose-zone > a[class*="btn"]:not(:last-child){margin-block-end:var(--space-l);}

/* [OEB-M67-B] TWO-COLUMN DROPDOWN PANEL - role-named, menu-editable.
   Craig-directed 2026-08-14 (M67 item 3): the Faith Formation dropdown holds 12
   items after the M66/M67 nav work - too tall as a single column. Mechanism: the
   WP menu-item CSS class spm-menu-cols-2 on the PARENT item (Craig can move or
   remove it in Appearance > Menus - no menu-item-ID scoping, portable), plus this
   one rule. Elementor Pro Mega Menu deliberately NOT adopted (both-headers rebuild;
   separate mission if ever wanted).
   MEASURED MARKUP: the desktop nav is .elementor-nav-menu--layout-horizontal; the
   off-canvas drawer's nav is --layout-vertical, so this rule CANNOT reach the
   mobile accordion - single column there is correct and untouched. CSS columns
   (not grid) so the item count never needs restating; break-inside guards mid-item
   splits. min-width doubles the existing 340px panel rule (Craig, Header V2).
   Desktop media query matches the site's own 1025px breakpoint convention. */
@media (min-width:1025px){
.elementor-nav-menu--layout-horizontal li.spm-menu-cols-2 > ul.sub-menu{columns:2;column-gap:0;min-width:680px;}
.elementor-nav-menu--layout-horizontal li.spm-menu-cols-2 > ul.sub-menu > li{break-inside:avoid;}
}

/* [OEB-M68-A] LIST BOTTOM RHYTHM IN PROSE - lists end flush against what follows.
   Craig item 1, 2026-08-14 (M68). MEASURED BEFORE WRITING on the FF Registration
   content and a classic post: ul/ol inside the prose carriers compute
   margin-block-end 0 (theme reset) while paragraphs carry ~14.4px (0.8em at 18px),
   so a list's last item touches the next element (measured seam: 0px).
   ol is INCLUDED - the same reset zeroes it identically (Craig: 'and OL if
   necessary'; measurement says necessary).
   Token: space-s (1rem) - the token nearest the measured 14.4px paragraph rhythm;
   lists close like paragraphs close, no more.
   Scope is the two prose carriers ONLY, deliberately parallel to the link-arm and
   M67-A architecture; the :has() exclusion keeps nested Elementor page renders
   out, exactly as P9-A does. Lists inside flex/gap contexts are spaced by their
   container and are not matched. Class-keyed, portable, zero post-ID scoping (D6).
   Value is a var() only (R-022). Leading .elementor REQUIRED (O-53). */
.elementor .elementor-widget-text-editor ul,.elementor .elementor-widget-text-editor ol,.elementor .elementor-widget-theme-post-content:not(:has(.elementor)) ul,.elementor .elementor-widget-theme-post-content:not(:has(.elementor)) ol{margin-block-end:var(--space-s);}

/* [OEB-M68-B] RSS WIDGET LIST INDENT - the core WP RSS widget's ul keeps the
   40px user-agent padding-inline-start, pushing feed items 40px right of the
   column edge while the column headings sit at 0 (MEASURED on /parish-news/,
   all three columns identical). No native control exists on the wrapped WP
   widget. space-m (1.5rem/24px) keeps room for the bullet marker while pulling
   items to the design system's list indent. Class-keyed to the widget wrapper,
   portable, zero post-ID scoping (D6). Value is a var() only (R-022).
   Leading .elementor REQUIRED (O-53). */
.elementor .elementor-widget-wp-widget-rss ul{padding-inline-start:var(--space-m);}

/* Off-canvas drawer: submenus expand inline (accordion) instead of absolute flyout — portable, any nav-menu in any off-canvas. */
.elementor-widget-off-canvas .elementor-nav-menu .sub-menu{position:static!important;width:100%!important;box-shadow:none!important;padding-left:16px!important;}

/* [OEB-M78-A] GRAVITY FORMS 3.0.2 SUBMIT CONTROL - .elementor-kit-17 extension, not a new rule.
   WHY: the [spm-contact-form] arm above was written and measured against GF 2.10, which
   rendered the submit as <input type="submit">. GF 3.0.2 renders <button type="submit"
   class="gform_button button"> instead, so neither existing .elementor-kit-17 matches and all four
   parish forms silently reverted to the orbital theme's own blue control. Measured on
   /contact-us/ 2026-08-17 before this arm was added.
   This extends the SAME rule to the renamed element - declarations are byte-identical to
   the input rule above, deliberately: one look. Zero new tokens, zero raw literals (R-022).
   Same !important convention as the arm above, for the same reason (third-party control
   with high-specificity theme rules and no exposed control). Class-keyed, no post-ID (D6).
   Precedent for extending an existing arm's .elementor-kit-17 list rather than adding a rule: M63C. */
.elementor .spm-contact-form button.gform_button,.elementor .spm-contact-form .gform_footer button[type="submit"]{background-color:var(--brand-yellow)!important;color:var(--brand-navy)!important;font-weight:600!important;border:0!important;border-radius:0!important;padding:14px 28px!important;cursor:pointer;inline-size:auto!important;}
.elementor .spm-contact-form button.gform_button:hover,.elementor .spm-contact-form button.gform_button:focus-visible{background-color:var(--brand-gold-hover)!important;}

/* [OEB-M80-A] PROSE BUTTON IN CLASSIC POST CONTENT - Craig-authorized (M80 rider R2).
   WHY: classic-editor posts render through the Post Content widget, where no house
   button mechanism exists - the only arm reaching those anchors is [OEB-P9-A], which
   paints them as bold underlined body links. A registration call-to-action needs the
   primary button treatment instead.
   NO SPECIFICITY FIGHT BY DESIGN: the class is named with 'btn' so P9-A's own
   :not([class*="btn"]) exclusion - written precisely so prose buttons are not
   repainted as links - excludes it automatically. This arm therefore adds styling
   rather than overriding any, and needs no !important.
   VALUES MEASURED from the reference primary button (VIEW LIVESTREAM, home 37
   element ba4e4c1) on 2026-08-17: bg rgb(255,200,48), colour rgb(2,41,104),
   Oswald 16px/600, letter-spacing 2.24px, padding 12px 24px, radius 8px,
   no underline, inline-block. All three colours and the display face bind existing
   tokens (R-022); geometry is literal because the reference button itself carries
   literal geometry, not tokens. Hover binds --brand-gold-hover, matching the
   reference's own hover binding. Class-keyed, zero post-ID scoping (D6). */
.elementor .elementor-widget-theme-post-content a.spm-prose-btn{display:inline-block;background-color:var(--brand-yellow);color:var(--brand-navy);font-family:var(--font-display);font-size:16px;font-weight:600;letter-spacing:2.24px;line-height:16px;text-transform:none;text-decoration:none;padding:12px 24px;border:0;border-radius:8px;}
.elementor .elementor-widget-theme-post-content a.spm-prose-btn:hover,.elementor .elementor-widget-theme-post-content a.spm-prose-btn:focus-visible{background-color:var(--brand-gold-hover);color:var(--brand-navy);}

/* [OEB-M90-A] STAFF DIRECTORY CARD EMAIL LINKS - the fifth carrier arm.
   Craig's ruling 2026-08-21, closing BugHerd #160 (parked by M90 Phase 3).
   WHY AN ARM AT ALL: O-114's pattern for the fourth time - not excluded, never
   matched. The Staff Directory contact line is a V4 atomic paragraph inside
   component 791 (Person Card Core), which is neither text-editor prose, nor a
   section intro, nor an info-card, nor classic post content. M90 measured the
   template-layer route live and it CANNOT deliver colour: .elementor-kit-17 a sets
   the anchor's colour DIRECTLY, and a colour set on the parent paragraph is
   inheritance, which always loses to a direct rule. There is no widget-heading-style
   'a { color: inherit }' rule for a V4 atomic paragraph, and there is NO element-level
   route - a class on a component instance is forbidden by R-045(c) and local styles
   are house-forbidden.
   THIS SUPERSEDES THE M22 EXCLUSION BY RULING, AND ONLY BY HALF. The M22-P5 comment
   says the Staff-Directory arm is 'intentionally absent - do not reinstate it without
   a ruling'; M49-A restates it. That ruling arrived 2026-08-21, and it is DELIBERATELY
   NARROWER than the arm M22 rejected: EMAIL ONLY. Craig's ruling is explicit that
   tel: links stay exactly as they are - navy, no underline, weight 400.
   WHY EMAIL-ONLY IS DELIVERABLE HERE BUT WAS NOT FROM THE TEMPLATE LAYER: measured
   live, the tel: and mailto: anchors SHARE ONE <p> parent, separated by <br>. Any rule
   painting the paragraph underlines BOTH, because a child cannot cancel a decoration
   painted by its parent (the M89 mechanism). This arm paints the ANCHOR directly and
   keys on the href scheme, so the phone anchor beside it is untouched.
   MEASURED BEFORE WRITING, live in the browser: this .elementor-kit-17 matches exactly FIFTEEN
   anchors site-wide, all on /staff-directory/ (883), and provably nothing else.
   .card-feature (global class gc-17db483708ac2e7d) is carried by components 791 and 779
   and by pages 1921 and 1847 (draft). Published carriers checked: 876 Capital Campaign
   has 3 card-feature blocks with ZERO anchors inside them (both its mailtos sit outside
   the class); 1921 Reclaiming Sundays has 12 blocks with ZERO anchors. The 15 tel:
   anchors on 883 are excluded by the href prefix, not by luck.
   Declarations byte-identical to M22-P5/M42-B/M49-A/P9-A, deliberately: one look.
   NO hover rule, matching all four arms above.
   Class-keyed, portable, zero post-ID scoping (D6). Colour is a var() only (R-022).
   The leading .elementor is REQUIRED for cascade weight (O-53). */
.elementor .card-feature a[href^="mailto:"]:not([class*="btn"]):not([class*="e-button"]):not([class*="elementor-button"]){font-weight:700;text-decoration:underline;color:var(--link-accent);}


/* [OEB-2026-09-01-A] ACCORDION CONTENT LINKS - ruled in by Craig 2026-09-01
   ("Hyperlinks in accordions have to be styled too"). Mirrors the M22 body-copy
   link system exactly: bold, underlined, var(--link-accent). Same guard chain,
   same cascade weight pattern as O-53. Scope: V3 accordion tab content only. */
.elementor .elementor-widget-accordion .elementor-tab-content a:not([class*="btn"]):not([class*="e-button"]):not([class*="elementor-button"]){font-weight:700;text-decoration:underline;color:var(--link-accent);}

/* [OEB-2026-09-01-B] NO LINE BREAKS INSIDE MAILTO/TEL LINKS - ruled by Craig 2026-09-01.
   Email addresses and phone numbers never wrap mid-link. Deliberately NOT applied
   to all anchors: long multi-word prose links must wrap or they overflow mobile
   viewports. Named long links can be nowrapped individually on Craig's ruling. */
a[href^="mailto:"],a[href^="tel:"]{white-space:nowrap;}

/* [OEB-2026-09-02-C] FLOATED IMAGE INSIDE PROSE - Craig's ruling 2026-09-02 (BugHerd #203).
   Fr. Andrie's letter on the Capital Campaign staging page runs as one text-editor block with
   the portrait floated right and the text wrapping. Keyed to WP core's alignright/alignleft
   image classes inside the text-editor prose carrier only; no post-ID (D6). Spacing is var()
   tokens (R-022). Stacks to full width below 768px. The earlier [OEB-M25-B] split-equalizer
   for .e-fra2-s/.e-fra3-s is now unreferenced on that page and left in place as dead. */
.elementor .elementor-widget-text-editor img.alignright{float:right;max-width:40%;height:auto;margin:0 0 var(--space-s) var(--space-l);}
.elementor .elementor-widget-text-editor img.alignleft{float:left;max-width:40%;height:auto;margin:0 var(--space-l) var(--space-s) 0;}
@media(max-width:767px){.elementor .elementor-widget-text-editor img.alignright,.elementor .elementor-widget-text-editor img.alignleft{float:none;display:block;max-width:100%;margin:0 0 var(--space-s) 0;}}

/* [OEB-2026-09-02-D] HOME MISSION LINE NEVER WRAPS AT DESKTOP - Craig's ruling 2026-09-02 (BugHerd #204).
   The Ms Madi mission line on Home (37, element mvscript) must stay on one line. white-space is not an
   atomic style prop (Elementor drops it on save, measured), so it lives here. MEASURED with the Ms Madi
   font file before writing: the line is 990px at 56px and fits its column down to a 900px viewport; below
   that it must be allowed to wrap or it overflows. Gate is therefore min-width:900px, not the 1025px
   convention. Keyed to the element's own local style class (precedent: [OEB-M25-B]). */
@media (min-width:900px){.elementor .e-mvscript-s{white-space:nowrap;}}

/* [OEB-2026-09-02-E] CASE STATEMENT RULE - Craig's ruling 2026-09-02 (BugHerd #202): a simple horizontal
   line above the Case Statement heading on the Capital Campaign staging page so the band reads as its own
   section below Fr. Andrie's message. Atomic border props on a heading were rejected on save (measured:
   the whole local style block was dropped), and the V3 divider widget is stripped inside an atomic flexbox
   (measured), so the rule lives here, keyed to the heading's own local class (precedent: [OEB-M25-B]).
   Colour and spacing are var() tokens (R-022). */
/* 2026-09-02 revision (Craig): line lightened to surface-grey; the heading now sits inside the Fr. Andrie band as a second prose zone, so the space above the line is the band-inner gap. */
.elementor .e-cshead-s{width:100%;border-block-start:1px solid var(--surface-grey);padding-block-start:var(--space-m);} /* 2026-09-02 second revision (Craig): surface-grey was invisible on white; text-muted #7A8298 is the mid-grey token. */

/* [OEB-2026-09-04-F] PAGINATION - ruling by Craig 2026-09-04: current page filled navy; one style for the whole site;
   tokens only; no post-ID scoping. Styles every Loop Grid numbers pagination (nav.elementor-pagination > .page-numbers)
   on Mass Reflections, Parish News, News & Events, Fr. Andrie Series, Adult Faith Formation, Bible Studies,
   Wedding Listings, Funeral Listings and the Category Archive template. */
.elementor .elementor-pagination{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:var(--space-2xs);margin-block-start:var(--space-l);}
.elementor .elementor-pagination .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:2.75rem;min-height:2.75rem;padding:0 var(--space-xs);border:1px solid var(--surface-grey);border-radius:8px;font-family:var(--font-display);font-weight:600;font-size:var(--text-s);letter-spacing:0.06em;color:var(--brand-navy);background:transparent;text-decoration:none;transition:background .2s,color .2s,border-color .2s;}
.elementor .elementor-pagination a.page-numbers:hover,.elementor .elementor-pagination a.page-numbers:focus-visible{background:var(--brand-blue-tint);border-color:var(--brand-blue-tint);}
.elementor .elementor-pagination .page-numbers.current{background:var(--brand-navy);border-color:var(--brand-navy);color:var(--text-inverse);}
.elementor .elementor-pagination .page-numbers.dots{border-color:transparent;}/* End custom CSS */
/* Start Custom Fonts CSS */@font-face {
	font-family: 'Oswald';
	font-display: auto;
	src: url('https://st-therese.org/wp-content/uploads/2026/06/Oswald-VariableFont_wght.ttf') format('truetype');
}
/* End Custom Fonts CSS */
/* Start Custom Fonts CSS */@font-face {
	font-family: 'Mulish';
	font-display: auto;
	src: url('https://st-therese.org/wp-content/uploads/2026/06/Mulish-VariableFont_wght.ttf') format('truetype');
}
/* End Custom Fonts CSS */
/* Start Custom Fonts CSS */@font-face {
	font-family: 'Ms Madi';
	font-style: normal;
	font-weight: normal;
	font-display: auto;
	src: url('https://st-therese.org/wp-content/uploads/2026/06/MsMadi-Regular.ttf') format('truetype');
}
/* End Custom Fonts CSS */