/*
Theme Name: Veto Child Theme
Theme URI: https://veto.axiomthemes.com/
Description: Veto is a Premium WordPress theme that has built-in support for popular Page Builders, slider with swipe gestures, and is SEO- and Retina-ready. The unique system of inheritance and override options allows setting up individual parameters for different sections of your site and supported plugins.
Author: AxiomThemes
Author URI: https://axiomthemes.com/
Version: 1.14.0
Tested up to: 6.8
Requires at least: 5.5
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, e-commerce, portfolio, grid-layout, one-column, two-columns, three-columns, four-columns, left-sidebar, right-sidebar, custom-background, custom-colors, custom-header, custom-logo, custom-menu, editor-style, featured-image-header, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, sticky-post, theme-options, threaded-comments, translation-ready, block-styles, wide-blocks
Text Domain: veto
Template: veto
*/


/* =Child-Theme customization starts here
------------------------------------------------------------ */


/* =Custom site footer
   Markup: veto-child/skins/default/templates/footer-custom.php

   Three bands stacked: the navy columns block, the light electorate/
   authorisation panel, and the navy copyright bar. `.mfr-footer__inner`
   centres each band's content on the same measure; the bands themselves run
   full width so their backgrounds reach the edges of the viewport.
------------------------------------------------------------ */

.mfr-footer {
	--mfr-bg: #2A184A;
	--mfr-gold: #F2C230;
	--mfr-gold-hover: #ffd24d;
	--mfr-ink: #ffffff;
	--mfr-body: rgba(255, 255, 255, 0.82);
	/* Column headings and the electorate panel share the campaign's light
	   blue; the panel needs the text on it to stay dark, hence --mfr-band-ink. */
	--mfr-heading: #8fb8f2;
	--mfr-band: #8fb4e6;
	--mfr-band-ink: #071c42;
	--mfr-rule: rgba(255, 255, 255, 0.16);
	--mfr-ring: rgba(255, 255, 255, 0.22);
	--mfr-max: 1480px;

	background-color: var(--mfr-bg);
	color: var(--mfr-body);
	font-size: 17px;
	line-height: 1.6;
}

.mfr-footer__inner {
	box-sizing: border-box;
	margin: 0 auto;
	max-width: var(--mfr-max);
	padding: 0 24px;
	width: 100%;
}

.mfr-footer__main {
	padding: 62px 0 58px;
}

.mfr-footer__grid {
	/* Stretch, not start: the dividers below are column borders, so they only
	   run the full height of the block if every column does. */
	align-items: stretch;
	display: grid;
	gap: 40px 56px;
	/* Track ratios mirror the approved comp: brand / two link columns / contact.
	   The minmax floors stop the headline, the longest menu label and the email
	   address from wrapping before the 2-column breakpoint kicks in. */
	grid-template-columns: minmax(340px, 3.4fr) minmax(170px, 1.5fr) minmax(170px, 1.5fr) minmax(290px, 2.6fr);
}

.mfr-footer__col {
	min-width: 0;
}

/* A rule to the left of every column except the brand and the first link
   column — matching the comp, which groups the brand with the menu beside it.
   Written against nth-child so adding a link column to the config keeps the
   pattern without touching this file. */
.mfr-footer__grid > .mfr-footer__col:nth-child(n + 3) {
	border-left: 1px solid var(--mfr-rule);
	padding-left: 56px;
}

/* Screen-reader-only label. */
.mfr-footer__sr {
	border: 0;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	height: 1px;
	overflow: hidden;
	position: absolute;
	white-space: nowrap;
	width: 1px;
}

/* --- Brand column -------------------------------------------------- */

.mfr-footer__logo {
	display: inline-block;
	max-width: 250px;
	width: 100%;
}

.mfr-footer__logo img {
	display: block;
	height: auto;
	width: 100%;
}

/* Sized to clear "Putting Richmond First" on one line inside the brand track,
   which bottoms out at its 300px floor between 1280px and 1326px and grows from
   there. Measured in Manrope 800: the string is 357px at 27px (so it wrapped,
   and a two-line headline was the biggest single contributor to the footer's
   height) and 288px at 22px. Dropping letter-spacing buys back another ~3px. */
.mfr-footer__headline {
	color: var(--mfr-ink);
	font-size: 22px;
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1.2;
	margin: 16px 0 10px;
	text-transform: uppercase;
}

.mfr-footer__headline-dot {
	color: var(--mfr-gold);
}

.mfr-footer__intro {
	margin: 0;
	max-width: 26em;
}

/* --- Column headings ------------------------------------------------ */

.mfr-footer__title {
	color: var(--mfr-heading);
	font-size: 21px;
	font-weight: 700;
	letter-spacing: 0.05em;
	line-height: 1.2;
	margin: 0;
	padding-bottom: 12px;
	position: relative;
	text-transform: uppercase;
}

.mfr-footer__title::after {
	background-color: var(--mfr-gold);
	bottom: 0;
	content: "";
	height: 3px;
	left: 0;
	position: absolute;
	width: 46px;
}

/* --- Link columns ---------------------------------------------------- */

.mfr-footer__menu {
	list-style: none;
	margin: 22px 0 0;
	padding: 0;
}

.mfr-footer__menu li + li {
	margin-top: 14px;
}

.mfr-footer__menu a {
	color: var(--mfr-ink);
	display: inline-block;
	transition: color 0.2s ease, transform 0.2s ease;
}

.mfr-footer__menu a:hover,
.mfr-footer__menu a:focus-visible {
	color: var(--mfr-gold);
	transform: translateX(3px);
}

/* --- Contact column -------------------------------------------------- */

.mfr-footer__contact {
	list-style: none;
	margin: 22px 0 0;
	padding: 0;
}

.mfr-footer__contact li {
	align-items: center;
	display: flex;
	gap: 16px;
}

.mfr-footer__contact li + li {
	margin-top: 14px;
}

.mfr-footer__contact-icon {
	color: var(--mfr-gold);
	flex: 0 0 auto;
	line-height: 0;
}

.mfr-footer__contact-icon svg {
	height: 22px;
	width: 22px;
}

.mfr-footer__contact-body {
	min-width: 0;
}

.mfr-footer__contact-line {
	color: var(--mfr-ink);
	display: block;
	overflow-wrap: anywhere;
	transition: color 0.2s ease;
}

a.mfr-footer__contact-line:hover,
a.mfr-footer__contact-line:focus-visible {
	color: var(--mfr-gold);
}

/* Sits under the contact rows, flush with their icons: the icons used to close
   out the brand column, where they left a tall gap under the intro paragraph
   while the contact column ran out of content early. One block of dead space
   instead of two, and a shorter footer. */
.mfr-footer__socials {
	display: flex;
	flex-wrap: wrap;
	gap: 14px;
	justify-content: flex-start;
	list-style: none;
	/* Same step the contact list takes off its own heading. */
	margin: 22px 0 0;
	padding: 0;
}

.mfr-footer__social {
	align-items: center;
	border: 1px solid var(--mfr-ring);
	border-radius: 50%;
	color: var(--mfr-ink);
	display: flex;
	height: 50px;
	justify-content: center;
	transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
	width: 50px;
}

.mfr-footer__social svg {
	height: 17px;
	width: auto;
}

/* The mail glyph is a stroke icon sized by its box, not by its glyph height
   like the social marks, so it needs both dimensions to sit at the same
   optical weight as its neighbours. */
.mfr-footer__social svg[stroke] {
	height: 20px;
	width: 20px;
}

a.mfr-footer__social:hover,
a.mfr-footer__social:focus-visible {
	background-color: var(--mfr-gold);
	border-color: var(--mfr-gold);
	color: var(--mfr-bg);
}

/* --- Stay connected -------------------------------------------------- */

.mfr-footer__connect {
	border-top: 1px solid var(--mfr-rule);
	margin-top: 30px;
	padding-top: 28px;
}

/* The secondary heading inside a column that already has one — same treatment,
   one step down in size. */
.mfr-footer__title--sub {
	font-size: 19px;
}

.mfr-footer__connect-list {
	display: flex;
	flex-wrap: wrap;
	list-style: none;
	margin: 24px 0 0;
	padding: 0;
}

.mfr-footer__connect-list li {
	color: var(--mfr-ink);
}

/* Gold separator carried by the item that follows it, so a wrapped row never
   starts with an orphaned dot. */
.mfr-footer__connect-list li + li::before {
	color: var(--mfr-gold);
	content: "•";
	padding: 0 12px;
}

.mfr-footer__connect-list a {
	color: var(--mfr-ink);
	transition: color 0.2s ease;
}

.mfr-footer__connect-list a:hover,
.mfr-footer__connect-list a:focus-visible {
	color: var(--mfr-gold);
}

/* --- Electorate / authorisation band --------------------------------- */

.mfr-footer__band {
	background-color: var(--mfr-band);
	border-bottom: 2px solid var(--mfr-gold);
	color: var(--mfr-band-ink);
}

.mfr-footer__band-inner {
	align-items: center;
	display: flex;
	gap: 26px;
	padding-bottom: 26px;
	padding-top: 26px;
}

.mfr-footer__band-icon {
	flex: 0 0 auto;
	line-height: 0;
}

.mfr-footer__band-icon svg {
	height: 52px;
	width: 52px;
}

.mfr-footer__band-body {
	min-width: 0;
}

.mfr-footer__band-area {
	font-size: 22px;
	font-weight: 800;
	line-height: 1.25;
	margin: 0 0 6px;
	text-transform: uppercase;
}

.mfr-footer__band-auth {
	font-size: 16px;
	line-height: 1.4;
	margin: 0;
}

/* --- Markup the current template still emits -------------------------
   footer-custom.php puts a call-to-action column between the brand and the
   menu, and a chevron bullet inside every menu link. The rules above were
   rewritten for a footer that has neither, which left the two gold buttons as
   bare links and every chevron at its intrinsic SVG size — the state in the
   screenshot. These restore both to the approved comp. Remove this block when
   the template is rewritten to the markup the rules above assume.
--------------------------------------------------------------------- */

/* The block's vertical rhythm now lives on `.mfr-footer__main`, a wrapper this
   template has no equivalent of, so the columns sat flush against the band above
   them — the logo touching the footer's top edge. Put it back on the element
   that does the wrapping here. */
.mfr-footer__inner:has(.mfr-footer__col--cta) {
	padding-bottom: 0;
	padding-top: 44px;
}

/* H. The copyright line sat in a band of dead space; this closes it up.
   `align-items: start` overrides the `stretch` above, which is what made the
   contact column's border-left run the full height of the row and trail well
   below the phone number. Each column's divider now ends with its own content.
   The CTA column keeps its own `align-self: center`, so the buttons stay on the
   block's centre line. */
.mfr-footer__grid:has(.mfr-footer__col--cta) {
	align-items: start;
	padding-bottom: 14px;
}

/* Room for the buttons: the track above gives this column 170px, which is a
   list's width, not a panel's. The contact track is widened with it, or the
   email address is squeezed until it breaks mid-word. Scoped with :has() so the
   grid returns to the sizing above the moment the CTA column goes away.
   Browsers without :has() keep the narrower tracks — cramped, not broken.

   The media query is load-bearing, not decoration. :has() adds the specificity
   of its argument, so this selector scores 0-2-0 against the 0-1-0 of the
   `.mfr-footer__grid` rules in the responsive section below — it outranks both
   of them, and without a query of its own it applied at every width. On a 393px
   viewport the four floors still resolved to `300px 380px 150px 330px`, a
   1268px-wide grid inside a 393px viewport: the CTA column was clipped after
   33px and the menu and contact columns sat entirely off-screen, taking the
   phone number, email and address with them. `overflow-x: hidden` on body meant
   this was silently cropped rather than scrollable, so it read as a footer that
   simply had no contact details on a phone.

   1280px is where the floors below fit: they still total 1060, plus 3 x 56px of
   gap and 2 x 24px of inner padding = 1276. (20px moved to the brand floor so
   the one-line headline clears its track at this width — 15px off the CTA floor,
   whose content wants 381px and is compressed at any of these values, and 5px
   off the menu floor, which carries no divider padding and measures 123px.) They are ~40px under the comp's
   original floors for that reason; above ~1376px the fr ratios take over and
   the floors stop binding, so the wide layout is unchanged. */
@media (min-width: 1280px) {
	.mfr-footer__grid:has(.mfr-footer__col--cta) {
		grid-template-columns: minmax(300px, 3fr) minmax(335px, 3.8fr) minmax(125px, 1.3fr) minmax(300px, 3fr);
	}
}

/* Same specificity as the rule above, so the responsive section below — which
   is a specificity step lower — is not what has to win here. */
@media (max-width: 1279px) {
	.mfr-footer__grid:has(.mfr-footer__col--cta) {
		grid-template-columns: 1fr 1fr;
	}
}

@media (max-width: 767px) {
	.mfr-footer__grid:has(.mfr-footer__col--cta) {
		grid-template-columns: 1fr;
	}

	/* The 767px rule below sets this on `.mfr-footer__main`, which is one of the
	   elements this template has no equivalent of, so the block kept its 62px
	   desktop opening on phones. */
	.mfr-footer__inner:has(.mfr-footer__col--cta) {
		padding-top: 44px;
	}
}

/* The divider rule starts at the contact column. Beside a panel of buttons a
   vertical line reads as a stray mark, and the comp has none there. */
.mfr-footer__grid:has(.mfr-footer__col--cta) > .mfr-footer__col--menu {
	border-left: 0;
	padding-left: 0;
}

.mfr-footer__col--cta {
	align-self: center;
	display: flex;
	flex-direction: column;
	gap: 18px;
}

.mfr-footer__cta {
	align-items: center;
	background-color: var(--mfr-gold);
	border-radius: 10px;
	color: var(--mfr-bg);
	display: flex;
	font-size: 19px;
	font-weight: 800;
	gap: 16px;
	letter-spacing: 0.01em;
	line-height: 1.2;
	padding: 15px 22px;
	text-transform: uppercase;
	transition: background-color 0.2s ease, transform 0.2s ease;
}

.mfr-footer__cta:hover,
.mfr-footer__cta:focus-visible {
	background-color: var(--mfr-gold-hover);
	color: var(--mfr-bg);
	transform: translateY(-2px);
}

.mfr-footer__cta-icon svg {
	display: block;
	height: 28px;
	width: 28px;
}

.mfr-footer__cta-arrow svg {
	display: block;
	height: 20px;
	width: 20px;
}

/* Takes the middle so both labels centre on the same axis whatever the icon
   and the arrow beside them measure. */
.mfr-footer__cta-label {
	flex: 1 1 auto;
	text-align: center;
}

/* Bullet beside its label rather than stacked above it, at text size. */
.mfr-footer__menu a {
	align-items: center;
	display: flex;
	gap: 12px;
}

.mfr-footer__menu-bullet {
	color: var(--mfr-gold);
	flex: 0 0 auto;
	line-height: 0;
}

.mfr-footer__menu-bullet svg {
	height: 14px;
	width: 14px;
}


/* --- Bottom bar ------------------------------------------------------ */

.mfr-footer__bottom {
	padding: 14px 0 16px;
	text-align: center;
}

.mfr-footer__bottom p {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	font-size: 16px;
	gap: 4px 0;
	justify-content: center;
	margin: 0;
}

.mfr-footer__bottom a {
	color: var(--mfr-body);
	transition: color 0.2s ease;
}

.mfr-footer__bottom a:hover,
.mfr-footer__bottom a:focus-visible {
	color: var(--mfr-gold);
}

/* Keeps the "|" glued to the link it precedes so it never orphans on a wrap. */
.mfr-footer__legal {
	display: inline-block;
	white-space: nowrap;
}

.mfr-footer__sep {
	color: var(--mfr-gold);
	margin: 0 18px;
}

/* --- Responsive ------------------------------------------------------ */

@media (max-width: 1279px) {
	.mfr-footer__grid {
		gap: 44px;
		grid-template-columns: 1fr 1fr;
	}

	/* The dividers separated columns standing side by side; once the grid wraps
	   they would cut across the middle of the block instead. */
	.mfr-footer__grid > .mfr-footer__col:nth-child(n + 3) {
		border-left: 0;
		padding-left: 0;
	}
}

@media (max-width: 767px) {
	.mfr-footer {
		font-size: 16px;
	}

	.mfr-footer__main {
		padding: 44px 0 40px;
	}

	.mfr-footer__grid {
		gap: 36px;
		grid-template-columns: 1fr;
	}

	.mfr-footer__logo {
		display: flex;
		margin: 0 auto 24px;
	}

	.mfr-footer__headline {
		font-size: 21px;
		margin-top: 20px;
		text-align: center;
	}

	.mfr-footer__intro {
		text-align: center;
	}

	.mfr-footer__social {
		height: 46px;
		width: 46px;
	}

	.mfr-footer__title {
		font-size: 19px;
	}

	.mfr-footer__title--sub {
		font-size: 17px;
	}

	.mfr-footer__band-inner {
		align-items: flex-start;
		gap: 16px;
		padding-bottom: 22px;
		padding-top: 22px;
	}

	.mfr-footer__band-icon svg {
		height: 38px;
		width: 38px;
	}

	.mfr-footer__band-area {
		font-size: 18px;
	}

	.mfr-footer__band-auth {
		font-size: 14px;
	}

	.mfr-footer__bottom {
		padding-bottom: 24px;
	}

	/* Stacked on small screens, so the pipes would orphan at line starts. */
	.mfr-footer__bottom p {
		gap: 4px 14px;
	}

	.mfr-footer__sep {
		display: none;
	}
}

/* --- Small phones ------------------------------------------------------
   Written against a 375 x 667 viewport — the iPhone SE / 8 class of screen,
   and the narrowest this site is built for. Everything wider is untouched.

   One thing here is repair rather than polish: the call-to-action labels.
   At the 767px tier a button spends 44px on its own padding, 48px on the icon
   and the chevron and 32px on the gaps between them, which leaves 203px of a
   375px screen for the label — and "WILL YOU SUPPORT DAVID" measures 257px in
   Inter 800 at 19px. Both buttons wrapped to two lines, the second to three
   below ~330px. Trimming that furniture returns 48px, and a fluid label size
   clears what is left at every width the page has to survive:

       320px   13.8px label, wants 186px, has 196px
       375px   16px   label, wants 216px, has 251px

   The rest is compression, not repair. The footer measured 1195px against a
   667px screen — nearly two full screens of it — so the logo, the column gaps
   and the bottom bar each come in a notch. Nothing tappable drops below 40px.

   480px, not 375px, is the ceiling: every phone between the two has the same
   problem in a milder form, and the fluid sizes below already resolve to the
   767px values as the query's upper edge approaches.
   -------------------------------------------------------------------- */

@media (max-width: 479px) {

	/* 18px of gutter instead of 24px — the 12px goes to the buttons below. */
	.mfr-footer__inner {
		padding-left: 18px;
		padding-right: 18px;
	}

	/* Written against `:has()` for the same reason the 767px tier is: the
	   `:has()` rule up there scores 0-2-0 and would outrank a plain
	   `.mfr-footer__inner` here whatever the source order. */
	.mfr-footer__inner:has(.mfr-footer__col--cta) {
		padding-top: 32px;
	}

	.mfr-footer__grid {
		gap: 28px;
	}

	/* --- Brand ------------------------------------------------------- */

	.mfr-footer__logo {
		margin-bottom: 16px;
		max-width: 200px;
	}

	.mfr-footer__headline {
		font-size: 20px;
		margin-top: 14px;
	}

	.mfr-footer__intro {
		font-size: 15px;
	}

	/* --- Call-to-action buttons -------------------------------------- */

	.mfr-footer__col--cta {
		gap: 12px;
	}

	.mfr-footer__cta {
		border-radius: 12px;
		/* Fluid so the longer label still clears the button at 320px, where a
		   flat 16px wraps. The cap means nothing above ~372px grows, so the
		   button reads the same on a 375px screen as on a 430px one. */
		font-size: clamp(13px, 4.3vw, 16px);
		gap: 10px;
		padding: 14px;
	}

	.mfr-footer__cta-icon svg {
		height: 24px;
		width: 24px;
	}

	.mfr-footer__cta-arrow svg {
		height: 16px;
		width: 16px;
	}

	/* --- Menu and contact -------------------------------------------- */

	.mfr-footer__title {
		font-size: 18px;
	}

	/* The 22px step below each heading is a desktop interval; 16px still
	   separates the heading from its list at this size. */
	.mfr-footer__menu,
	.mfr-footer__contact,
	.mfr-footer__socials {
		margin-top: 16px;
	}

	/* 12px rather than 14px. With the 25.6px line box that is still a 38px
	   row — the 767px tier's own pitch is 40px — and the links are the only
	   thing in this column there is to hit. */
	.mfr-footer__menu li + li {
		margin-top: 12px;
	}

	/* The email address is the longest unbreakable string in the footer, and
	   at this width it is what would push the column past the viewport. */
	.mfr-footer__contact-line {
		overflow-wrap: anywhere;
	}

	.mfr-footer__social {
		height: 42px;
		width: 42px;
	}

	/* --- Bottom bar --------------------------------------------------- */

	.mfr-footer__bottom {
		padding-bottom: 20px;
	}

	.mfr-footer__bottom p {
		font-size: 14px;
	}
}


/* =Donation form embed
   Markup: veto-child/inc/mfr-donation-form.php ([mfr_donation_form])
------------------------------------------------------------ */

.mfr-donate {
	margin-left: auto;
	margin-right: auto;
	max-width: var(--mfr-donate-max, none);
	width: 100%;
}

/* full="yes" — break out of the theme's centred content column (1290px) so the
   embed spans the viewport. Only the form's own background sits in the extra
   space, so if a classic scrollbar trims a few px off the edge nothing legible
   is lost. */
.mfr-donate--full {
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	max-width: none;
	width: auto;
}

/* mode="link" — the stopgap CTA that opens the donation form at top level,
   because Linky's checkout does not complete inside a cross-site frame. */
.mfr-donate-cta {
	background-color: #eef5fc;
	box-sizing: border-box;
	padding: 96px 24px;
	text-align: center;
}

.mfr-donate-cta__inner {
	margin: 0 auto;
	max-width: 640px;
}

.mfr-donate-cta__title {
	color: #08245f;
	font-size: 36px;
	font-weight: 700;
	line-height: 1.2;
	margin: 0 0 16px;
}

.mfr-donate-cta__text {
	color: #29466f;
	font-size: 18px;
	line-height: 1.6;
	margin: 0 0 36px;
}

.mfr-donate-cta__button {
	align-items: center;
	background-color: #f5c12f;
	border-radius: 8px;
	color: #00173a;
	display: inline-flex;
	font-size: 19px;
	font-weight: 700;
	gap: 16px;
	justify-content: center;
	line-height: 1.2;
	min-width: 320px;
	padding: 23px 28px;
	text-transform: uppercase;
	transition: background-color 0.2s ease, transform 0.2s ease;
}

.mfr-donate-cta__button:hover,
.mfr-donate-cta__button:focus-visible {
	background-color: #ffd24d;
	color: #00173a;
	transform: translateY(-2px);
}

.mfr-donate-cta__label {
	flex: 1 1 auto;
}

.mfr-donate-cta__icon svg {
	display: block;
	height: 30px;
	width: 30px;
}

.mfr-donate-cta__arrow svg {
	display: block;
	height: 20px;
	width: 20px;
}

.mfr-donate-cta__note {
	color: #5a6b88;
	font-size: 15px;
	margin: 20px 0 0;
}

@media (max-width: 600px) {
	.mfr-donate-cta {
		padding: 64px 20px;
	}

	.mfr-donate-cta__title {
		font-size: 28px;
	}

	.mfr-donate-cta__button {
		font-size: 16px;
		min-width: 0;
		padding: 18px 20px;
		width: 100%;
	}
}

/* Collapse the theme's 144px content padding so the embed sits flush between
   header and footer. The theme uses `header_position_over` (the header is
   absolutely positioned over the content), so the top padding has to match the
   header height instead of going to zero — otherwise the form slides under it.
   --mfr-header-h is measured at runtime; 86px is the desktop fallback. */
.mfr-donate-full-page .page_content_wrap {
	padding-bottom: 0;
	padding-top: var(--mfr-header-h, 86px);
}

/* Artwork behind an embedded form — set by the shortcode, see
   mfr_linky_form_background(). It shows because the Linky form pages paint no
   background of their own when they are framed, which leaves the iframe
   transparent; the form card keeps its white fill and shadow, so it stays
   legible on top. Nothing here styles the form itself — that page is a
   different origin and out of reach.

   Bottom-anchored because the artwork is a streetscape: its detail is along
   the bottom edge and its upper half is near-empty wash, so that is the half
   to give away when the box does not match the image's proportions. */
.mfr-donate--bg {
	background-color: var(--mfr-donate-bg-color, #f4f1f7);
	background-image: var(--mfr-donate-bg);
	background-position: center bottom;
	background-repeat: no-repeat;
	background-size: cover;
}

/* Phones get the artwork fitted to the width instead of covering the box.
   The frame is ~375x1260 there, and `cover` on those proportions scales the
   image about 3x to reach the height and then crops away everything but a
   narrow strip of its middle — which is the empty wash, so the streetscape
   is lost entirely. Fitting the width keeps the whole picture and lets the
   fill colour carry the space above it. */
@media (max-width: 767px) {
	.mfr-donate--bg {
		background-size: 100% auto;
	}
}

.mfr-donate__frame {
	border: 0;
	display: block;
	height: var(--mfr-donate-h, 1000px);
	width: 100%;
}

/* 767px, not the theme's usual 600px: the breakpoint that matters here belongs
   to the embedded page, which drops from its 600px-wide card to a 330px one
   below 768px and gets taller doing it. Switching at 600px left the 601-767px
   range on the desktop height, one card layout out of step with its frame. */
@media (max-width: 767px) {
	.mfr-donate__frame {
		height: var(--mfr-donate-h-sm, 1120px);
	}
}


/* =Homepage overflow fixes (not footer-related)
   Both sections are custom HTML/CSS authored inside Elementor widgets.
   html and body are overflow-x:hidden, so anything wider than the viewport
   is silently clipped rather than scrollable — these two were being cut off
   on the right. Overrides live here so they survive edits to those widgets.
------------------------------------------------------------ */

/* Hero portrait (.richmond-first-hero).
   The widget's base rule carries `height: 860px !important`, which outranks
   its own responsive rule (480px at <=1100px). The image therefore stayed
   860px tall on tablets and ran past the viewport. Restoring the authored
   size; !important is required to beat the original. The phone size is set
   in the mobile-stack block below. */
@media (max-width: 1100px) {
	.richmond-first-hero .rf-person {
		height: 480px !important;
	}
}

/* Hero mobile stack (.richmond-first-hero).
   Below 700px the widget leaves both the portrait and the values bar
   absolutely positioned, and on a phone-width viewport they land on top of
   the text column rather than beside and below it. Measured at 393px: the
   portrait (bottom: 280px, 380px tall) sits at y 191-571, straight over the
   title, description and signature, while the values bar — one column, ~420px
   tall once its four rows stack — covers y 487-906 and hides both CTA
   buttons. The 60px top padding is also shorter than the 86px header, which
   the theme positions over the content (`header_position_over`), so the
   eyebrow is clipped by it.

   Making the hero a flex column and returning those two to flow stacks the
   section text -> portrait -> values bar, with nothing overlapping. They keep
   `position: relative` rather than going static, because .rf-background and
   .rf-text-fade stay absolute at z-index 1 and 2 and would otherwise paint
   over them.

   David-Mug.png is a cut-out whose figure is flush with the left, right and
   bottom edges of its 1200x1200 canvas (the only transparent margin is the
   98px above his head), so it is drawn to run full-bleed and sit on top of
   whatever follows it. The portrait therefore spans the full viewport and the
   values bar goes edge to edge directly beneath it, with no gap and no side
   gutter: any inset would leave the figure's flat bottom cut showing as a hard
   line against the background.

   Every selector here is one step more specific than the widget's own: its
   stylesheet is printed inside the body, so on equal specificity it wins on
   source order. */
@media (max-width: 700px) {
	section.richmond-first-hero {
		display: flex;
		flex-direction: column;
		min-height: 0;
		padding-bottom: 0;
	}

	.richmond-first-hero .rf-inner {
		min-height: 0;
		order: 1;
		/* 86px header + 30px of clearance under it. */
		padding: 116px 20px 0;
	}

	/* Full-bleed: width, not height, so the square canvas keeps its ratio and
	   the figure's edges land on the viewport's. */
	.richmond-first-hero .rf-person {
		align-self: stretch;
		bottom: auto;
		height: auto !important;
		margin-top: 28px;
		max-width: none;
		order: 2;
		position: relative;
		right: auto;
		width: 100%;
		z-index: 3;
	}

	/* margin-top: 0 puts the blue band against the bottom of the portrait. */
	.richmond-first-hero .rf-values-wrapper {
		bottom: auto;
		left: auto;
		margin-top: 0;
		order: 3;
		padding: 0;
		position: relative;
		right: auto;
	}

	.richmond-first-hero .rf-values-bar {
		border-radius: 0;
	}

	/* The widget drops .rf-actions to display:block here, which leaves the
	   primary as a full-width button and "See our progress" as a bare inline
	   link crowded under it. Pairing them: same height, same width, same
	   radius, one outlined instead of filled, and both labels centred. */
	.richmond-first-hero .rf-actions {
		margin-top: 30px;
	}

	.richmond-first-hero .rf-primary-button {
		justify-content: center;
	}

	.richmond-first-hero .rf-secondary-button {
		align-items: center;
		border: 2px solid #175fc5;
		border-radius: 6px;
		display: flex;
		gap: 15px;
		justify-content: center;
		margin-top: 14px;
		min-height: 55px;
		padding: 0 30px;
	}
}

/* Priorities grid (.rp-section).
   `repeat(4, 300px)` plus 22px gaps needs 1266px of track but only collapses
   to one column at <=650px, so between 651px and 1265px the centred row was
   clipped on both sides. Let the columns wrap instead. Bounded below at
   651px so the widget's own single-column mobile rule still applies. */
@media (min-width: 651px) and (max-width: 1265px) {
	.rp-section .rp-grid {
		grid-template-columns: repeat(auto-fit, minmax(280px, 300px));
	}
}


/* =Mobile home page
   Markup, copy and reasoning: veto-child/inc/mfr-mobile-home.php

   Below 700px the phone gets a home page written for one narrow column and the
   Elementor page is stood down; above 700px the reverse, so desktop and tablet
   render exactly as they did before this section existed. Everything here is
   inside the media query except the one rule that keeps .mfr-mhome out of the
   document by default.
------------------------------------------------------------ */

/* Off by default. Stated as its own rule rather than as a min-width query so
   that any context the query cannot reach — print, a mail client — also gets
   one home page rather than two. */
.mfr-mhome {
	display: none;
}

@media (max-width: 700px) {

	/* Take the Elementor page away.

	   Matched through .mfr-mhome rather than stated on its own, so the desktop
	   page can only be hidden when the replacement is actually printed: if the
	   PHP ever stops running, the phone falls back to the old page rather than
	   to a blank one. `~ .elementor` because .mfr-mhome is prepended to
	   `.entry-content` and the builder wrapper is the sibling beside it, and
	   `> .e-con` so it is the five top-level containers that go, not the
	   widgets inside them — no generated element id appears here, so rebuilding
	   a section in Elementor cannot silently unhide it.

	   `display: none` and not removal: inc/mfr-commitments-modal.php gives up
	   and deletes itself when it cannot find `.kc-grid`, and the phone's
	   commitment rows open that very modal. */
	.mfr-mhome ~ .elementor > .e-con {
		display: none;
	}

	.mfr-mhome {
		--mfr-mhome-navy: #2A184A;
		--mfr-mhome-deep: #241a5e;
		--mfr-mhome-purple: #5b34b5;
		--mfr-mhome-gold: #ffc42e;
		/* Behind the two elements that sit directly on the streetscape — the
		   eyebrow and the ghost button. Translucent rather than flat, so the
		   plate still reads through them and they stay part of the photograph
		   instead of becoming two panels laid on top of it. */
		--mfr-mhome-scrim: rgba(28, 17, 70, .62);
		--mfr-mhome-ink: #4a5878;
		--mfr-mhome-line: #e3e8f2;
		--mfr-mhome-page: #f7f8fc;

		/* Full-bleed the same way the widgets are, because the page is printed
		   inside `.entry-content` and would otherwise sit in its gutter. */
		background: var(--mfr-mhome-page);
		display: block;
		left: 50%;
		margin-left: -50vw;
		position: relative;
		width: 100vw;
	}

	.mfr-mhome *,
	.mfr-mhome *::before,
	.mfr-mhome *::after {
		box-sizing: border-box;
	}

	.mfr-mhome p {
		margin: 0;
	}

	.mfr-mhome ul {
		list-style: none;
		margin: 0;
		padding: 0;
	}

	.mfr-mhome .mfr-mhome__icon {
		display: block;
		flex: none;
	}

	/* =Buttons
	   52px is the floor for a thumb; the gold one is the primary everywhere it
	   appears and never shares a section with another gold one. */
	.mfr-mhome__btn {
		align-items: center;
		border: 2px solid transparent;
		border-radius: 7px;
		display: flex;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 13.5px;
		font-weight: 800;
		gap: 11px;
		justify-content: center;
		letter-spacing: .04em;
		min-height: 52px;
		padding: 0 14px;
		text-align: center;
		text-decoration: none !important;
		text-transform: uppercase;
	}

	/* The two "Coming soon" controls are buttons, not links — there is nowhere
	   for them to point. A button brings a UA background, border and font that
	   an anchor does not. */
	button.mfr-mhome__btn {
		cursor: pointer;
		width: 100%;
	}

	.mfr-mhome__btn--gold {
		background: var(--mfr-mhome-gold);
		border-color: var(--mfr-mhome-gold);
		color: var(--mfr-mhome-navy) !important;
	}

	.mfr-mhome__btn--solid {
		background: var(--mfr-mhome-purple);
		border-color: var(--mfr-mhome-purple);
		color: #ffffff !important;
	}

	.mfr-mhome__btn--ghost {
		background: #ffffff;
		border-color: var(--mfr-mhome-purple);
		color: var(--mfr-mhome-purple) !important;
	}

	.mfr-mhome__btn--ghost .mfr-mhome__icon {
		stroke: var(--mfr-mhome-purple);
	}

	/* Not transparent: over the lit part of the streetscape the label lost its
	   ground and the outline was the only thing holding the button together. */
	.mfr-mhome__btn--ghost-light {
		background: var(--mfr-mhome-scrim);
		border-color: rgba(255, 255, 255, .6);
		color: #ffffff !important;
	}

	/* =Hero
	   Three layers: the streetscape plate, a wash that carries it down into the
	   purple, then the copy.

	   The picture is the desktop hero's "Because I care" poster. It sits on
	   the right beside the headline, where the old cut-out stood, inside
	   `__hero-head` with the eyebrow, headline and lead; that block is held at
	   least as tall as the poster, so the buttons always start below its
	   banner and run the full width. Every size is a share of the screen
	   width so the face-clear spacing holds from 320px to 400px.
	   `--mfr-header-h` is published at runtime by the script in
	   inc/mfr-mobile-home.php because the theme draws the header over the
	   content; 91px is the measured fallback. */
	.mfr-mhome__hero {
		background: var(--mfr-mhome-deep);
		overflow: hidden;
		position: relative;
	}

	.mfr-mhome__hero::before {
		background: url("/wp-content/uploads/2026/08/image-2-768x432.png") center top / cover no-repeat;
		content: "";
		height: 58%;
		left: 0;
		position: absolute;
		right: 0;
		top: 0;
	}

	/* Solid by 54%, short of the plate's 58% edge — later than that and the
	   bottom of the streetscape shows as a hard line above the poster. */
	.mfr-mhome__wash {
		background: linear-gradient(
			180deg,
			rgba(36, 26, 94, .12) 0%,
			rgba(36, 26, 94, .48) 18%,
			rgba(36, 26, 94, .88) 40%,
			#241a5e 54%
		);
		inset: 0;
		position: absolute;
	}

	/* `--mfr-mhome-poster` is the poster's width. The poster's banner ends at
	   87% of its width and his hair starts at 24%, so pulling it 11% past the
	   right edge (plus the 20px gutter) keeps the whole banner on screen and
	   puts his hair at about 52% of the screen — clear of the headline and
	   lead, which are sized below to stop short of that. Check both at 320px
	   and 375px before changing any of these numbers. */
	.mfr-mhome__hero-head {
		--mfr-mhome-poster: min(74vw, 300px);
		display: flex;
		flex-direction: column;
		gap: 14px;
		min-height: calc(40px + var(--mfr-mhome-poster) * .85);
		position: relative;
	}

	.mfr-mhome__hero-head > * {
		position: relative;
	}

	/* Top level with the headline. `.97`: the file has a strip of empty
	   transparency under the banner, which the buttons may overlap. */
	.mfr-mhome__hero-head > .mfr-mhome__portrait--hero {
		height: auto;
		position: absolute;
		right: calc(var(--mfr-mhome-poster) * -.11 - 20px);
		top: 0;
		width: var(--mfr-mhome-poster);
	}

	.mfr-mhome__hero-copy {
		display: flex;
		flex-direction: column;
		gap: 14px;
		padding: calc(var(--mfr-header-h, 91px) + 24px) 20px 28px;
		position: relative;
	}

	.mfr-mhome__eyebrow {
		align-self: flex-start;
		background: var(--mfr-mhome-scrim);
		border: 2px solid var(--mfr-mhome-gold);
		color: var(--mfr-mhome-gold);
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 14.5px;
		font-weight: 800;
		letter-spacing: 1.2px;
		line-height: 1.3;
		padding: 8px 12px;
		text-transform: uppercase;
	}

	.mfr-mhome__eyebrow span,
	.mfr-mhome__title span,
	.mfr-mhome__pull span {
		display: block;
	}

	/* One word per line, as written. Sized with the screen so RICHMOND stops
	   short of his hair at every phone width. */
	.mfr-mhome__title {
		color: #ffffff;
		font-size: min(40px, 8.5vw);
		font-weight: 800;
		letter-spacing: -1.4px;
		line-height: .95;
		margin: 0;
		text-transform: uppercase;
	}

	/* One point per line; each point is its own span. Scaled for the same
	   reason as the title: "Stronger local businesses." runs beside his hair. */
	.mfr-mhome__lead {
		color: rgba(255, 255, 255, .92);
		font-size: min(15.5px, 3.5vw);
		line-height: 1.45;
	}

	.mfr-mhome__lead span {
		display: block;
	}

	.mfr-mhome__cta {
		display: flex;
		flex-direction: column;
		gap: 10px;
		padding-top: 6px;
	}

	/* =Sections */
	.mfr-mhome__section {
		display: flex;
		flex-direction: column;
		gap: 16px;
		padding: 34px 20px 36px;
	}

	.mfr-mhome__section--priorities,
	.mfr-mhome__section--story,
	.mfr-mhome__section--support {
		background: #ffffff;
	}

	.mfr-mhome__heading {
		color: var(--mfr-mhome-navy);
		font-size: 23px;
		font-weight: 800;
		letter-spacing: -.2px;
		line-height: 1.15;
		margin: 0;
		text-align: center;
		text-transform: uppercase;
	}

	.mfr-mhome__sub {
		color: var(--mfr-mhome-ink);
		font-size: 13.5px;
		line-height: 1.5;
		text-align: center;
		text-wrap: pretty;
	}

	/* After both bases, not before them. These modifiers and the rules they
	   override score the same 0-1-0, so source order is the whole contest —
	   written above `.mfr-mhome__sub` this lost, and "This campaign is powered
	   by people like you." stayed centred under a left-aligned heading. */
	.mfr-mhome__heading--left,
	.mfr-mhome__sub--left {
		text-align: left;
	}

	/* =Priority cards
	   The accent is set per card from the data array, so a colour change is an
	   edit to the array and not to this file. */
	.mfr-mhome__cards {
		display: flex;
		flex-direction: column;
		gap: 13px;
		padding-top: 4px;
	}

	.mfr-mhome__card-link {
		align-items: center;
		background: var(--mfr-mhome-accent, #1552c4);
		border-radius: 10px;
		display: flex;
		gap: 14px;
		padding: 18px 16px;
		text-decoration: none !important;
	}

	.mfr-mhome__disc {
		align-items: center;
		background: #ffffff;
		border-radius: 50%;
		display: flex;
		flex: 0 0 46px;
		height: 46px;
		justify-content: center;
		width: 46px;
	}

	.mfr-mhome__card-text {
		display: flex;
		flex-direction: column;
		flex-grow: 1;
		gap: 6px;
	}

	.mfr-mhome__card-title {
		color: #ffffff;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 15px;
		font-weight: 800;
		letter-spacing: .2px;
		line-height: 1.2;
		text-transform: uppercase;
	}

	/* One sentence, one span, and a span never breaks — so the only break a
	   title can take is the space between two sentences. "Keep shops open.
	   Protect jobs." sets as one line where it fits and as
	   "KEEP SHOPS OPEN. / PROTECT JOBS." where it does not, instead of the
	   browser's own break after "PROTECT". See mfr_mobile_home_sentences(). */
	.mfr-mhome__card-part {
		white-space: nowrap;
	}

	.mfr-mhome__card-copy {
		color: rgba(255, 255, 255, .92);
		font-size: 12.5px;
		line-height: 1.45;
	}

	/* =Commitment cards
	   Each card is an anchor to #commitment-N, which is what opens the detail
	   modal — see inc/mfr-mobile-home.php.

	   Two stacked rows rather than one line: the commitment, then the promise
	   behind it. The wording of that second line is not held here or in the
	   phone page's own array — it is the `tagline` from mfr_commitments_data(),
	   the same string the desktop card and the dialog print. */
	.mfr-mhome__rows {
		display: flex;
		flex-direction: column;
		gap: 10px;
		padding-top: 2px;
	}

	/* The accent band across the top is a border, not a pseudo-element, so it
	   follows the card's own corner radius without a second radius to keep in
	   step. `overflow: hidden` is what stops the square-cornered band poking
	   out past the rounded corners on the browsers that round it late. */
	.mfr-mhome__row-link {
		background: #ffffff;
		border: 1px solid var(--mfr-mhome-line);
		border-top: 5px solid var(--mfr-mhome-accent, #1552c4);
		border-radius: 11px;
		box-shadow: 0 1px 3px rgba(42, 24, 74, .06);
		display: flex;
		flex-direction: column;
		overflow: hidden;
		text-decoration: none !important;
	}

	/* The faintest wash of the card's own colour, top to bottom, as the design
	   has it. Behind @supports because color-mix is the only way to tint an
	   arbitrary accent that arrives as a custom property — without it the card
	   is plain white, which is the previous design and perfectly fine. */
	@supports (background: color-mix(in srgb, red 5%, white)) {
		.mfr-mhome__row-link {
			background: linear-gradient(
				180deg,
				color-mix(in srgb, var(--mfr-mhome-accent, #1552c4) 7%, #ffffff) 0%,
				#ffffff 60%
			);
		}
	}

	.mfr-mhome__row-head {
		align-items: flex-start;
		display: flex;
		gap: 12px;
		justify-content: space-between;
		padding: 14px 14px 12px;
	}

	.mfr-mhome__row-title {
		color: var(--mfr-mhome-navy);
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 15px;
		font-weight: 800;
		letter-spacing: -.1px;
		line-height: 1.2;
		text-transform: uppercase;
	}

	.mfr-mhome__num {
		align-items: center;
		background: var(--mfr-mhome-accent, #1552c4);
		border-radius: 50%;
		color: #ffffff;
		display: flex;
		flex: 0 0 30px;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 13px;
		font-weight: 800;
		height: 30px;
		justify-content: center;
		width: 30px;
	}

	/* The rule above the promise is this row's own top border, so it starts and
	   ends with the padding rather than running the full width of the card. */
	.mfr-mhome__row-foot {
		align-items: center;
		border-top: 1px solid var(--mfr-mhome-line);
		display: flex;
		gap: 12px;
		justify-content: space-between;
		margin: 0 14px;
		padding: 11px 0 13px;
	}

	.mfr-mhome__row-tagline {
		color: var(--mfr-mhome-accent, #1552c4);
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 12.5px;
		font-weight: 700;
		line-height: 1.35;
	}

	.mfr-mhome__row-foot .mfr-mhome__icon {
		flex: 0 0 auto;
	}

	/* =First 100 days */
	.mfr-mhome__section--days {
		background: linear-gradient(165deg, #2A184A 0%, #3a2478 55%, #4a2f8f 100%);
		gap: 18px;
		padding: 36px 20px 38px;
	}

	.mfr-mhome__days-title {
		display: flex;
		flex-direction: column;
		gap: 2px;
		margin: 0;
	}

	.mfr-mhome__days-title span {
		color: #ffffff;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 29px;
		font-weight: 800;
		letter-spacing: -.6px;
		line-height: 1.05;
		text-transform: uppercase;
	}

	.mfr-mhome__days-count {
		color: var(--mfr-mhome-gold) !important;
		font-size: 40px !important;
		letter-spacing: -1.2px !important;
		line-height: 1.02 !important;
	}

	.mfr-mhome__kicker {
		color: #ffffff;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 14px;
		font-weight: 800;
		letter-spacing: .6px;
		text-transform: uppercase;
	}

	.mfr-mhome__days-lead {
		color: rgba(255, 255, 255, .88);
		font-size: 14px;
		line-height: 1.55;
	}

	.mfr-mhome__checks {
		display: flex;
		flex-direction: column;
		gap: 14px;
		padding: 4px 0 2px;
	}

	.mfr-mhome__checks li {
		align-items: center;
		color: #ffffff;
		display: flex;
		font-size: 13.5px;
		font-weight: 500;
		gap: 13px;
	}

	.mfr-mhome__tick {
		align-items: center;
		background: #ffffff;
		border-radius: 50%;
		display: flex;
		flex: 0 0 26px;
		height: 26px;
		justify-content: center;
		width: 26px;
	}

	/* =Why I'm running
	   Same composition as the hero, one section down: heading across the full
	   width, the figure entering from the right, and a copy column narrow
	   enough to clear his face. The button closes the section under both. */
	.mfr-mhome__section--story {
		overflow: hidden;
		position: relative;
	}

	.mfr-mhome__portrait--story {
		bottom: 96px;
		height: auto;
		position: absolute;
		right: -46px;
		width: 214px;
	}

	.mfr-mhome__story-copy {
		display: flex;
		flex-direction: column;
		gap: 15px;
		position: relative;
		width: 198px;
	}

	.mfr-mhome__story-copy p {
		color: var(--mfr-mhome-ink);
		font-size: 13.5px;
		line-height: 1.6;
	}

	.mfr-mhome__pull {
		color: var(--mfr-mhome-purple) !important;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 14px !important;
		font-weight: 800;
		line-height: 1.35 !important;
	}

	.mfr-mhome__rule {
		background: var(--mfr-mhome-gold);
		display: block;
		height: 3px;
		width: 74px;
	}

	.mfr-mhome__section--story .mfr-mhome__btn {
		position: relative;
	}

	/* =Get involved */
	.mfr-mhome__tiles {
		display: flex;
		flex-direction: column;
		gap: 12px;
		padding-top: 4px;
	}

	.mfr-mhome__tile-link {
		align-items: center;
		background: #ffffff;
		border: 1px solid var(--mfr-mhome-line);
		border-radius: 10px;
		box-shadow: 0 1px 3px rgba(42, 24, 74, .06);
		display: flex;
		gap: 14px;
		padding: 16px 14px;
		text-decoration: none !important;
	}

	.mfr-mhome__badge {
		align-items: center;
		border-radius: 12px;
		display: flex;
		flex: 0 0 46px;
		height: 46px;
		justify-content: center;
		width: 46px;
	}

	.mfr-mhome__tile-text {
		display: flex;
		flex-direction: column;
		flex-grow: 1;
		gap: 5px;
	}

	.mfr-mhome__tile-title {
		color: var(--mfr-mhome-navy);
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 13.5px;
		font-weight: 800;
		letter-spacing: .4px;
		text-transform: uppercase;
	}

	.mfr-mhome__tile-copy {
		color: var(--mfr-mhome-ink);
		font-size: 12.5px;
		line-height: 1.45;
	}

	/* =Latest updates
	   The thumbnail is optional — see the `updates` block in
	   inc/mfr-mobile-home.php — so the row is a flex line and not a two-column
	   grid: with no image the text simply takes the whole width. */
	.mfr-mhome__updates {
		display: flex;
		flex-direction: column;
		gap: 12px;
		padding-top: 2px;
	}

	.mfr-mhome__update {
		align-items: center;
		background: #ffffff;
		border: 1px solid var(--mfr-mhome-line);
		border-radius: 10px;
		box-shadow: 0 1px 2px rgba(42, 24, 74, .05);
		display: flex;
		gap: 12px;
		overflow: hidden;
		padding: 10px;
	}

	.mfr-mhome__update-thumb {
		border-radius: 7px;
		flex: 0 0 84px;
		height: 72px;
		object-fit: cover;
		width: 84px;
	}

	.mfr-mhome__update-text {
		display: flex;
		flex-direction: column;
		gap: 3px;
		min-width: 0;
	}

	.mfr-mhome__update-title {
		color: var(--mfr-mhome-navy);
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 13.5px;
		font-weight: 800;
		line-height: 1.25;
	}

	.mfr-mhome__update-copy {
		color: var(--mfr-mhome-ink);
		font-size: 12.5px;
		line-height: 1.4;
	}

	.mfr-mhome__update-date {
		color: #8794ae;
		font-size: 11.5px;
		padding-top: 2px;
	}

	/* =Endorsed by locals
	   Two across. The tiles hold names of very different lengths — "Victorian
	   Small Business Association" against "Local Business Owners" — so they are
	   a grid with `1fr` rows, which makes every tile in a row as tall as the
	   tallest, rather than a flex wrap where each finds its own height. */
	.mfr-mhome__endorse {
		display: grid;
		gap: 10px;
		grid-auto-rows: 1fr;
		grid-template-columns: repeat(2, minmax(0, 1fr));
		padding-top: 2px;
	}

	.mfr-mhome__endorser {
		align-items: center;
		background: #ffffff;
		border: 1px solid var(--mfr-mhome-line);
		border-radius: 10px;
		box-shadow: 0 1px 2px rgba(42, 24, 74, .05);
		display: flex;
		flex-direction: column;
		gap: 8px;
		justify-content: center;
		min-height: 84px;
		padding: 14px 10px;
		text-align: center;
	}

	.mfr-mhome__endorser-logo {
		height: auto;
		max-height: 34px;
		max-width: 100%;
		object-fit: contain;
	}

	.mfr-mhome__endorser-name {
		color: var(--mfr-mhome-navy);
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 12px;
		font-weight: 700;
		line-height: 1.3;
	}

	/* Unhidden by the script when a button with nowhere to go is pressed. */
	.mfr-mhome__soon {
		color: var(--mfr-mhome-purple);
		font-size: 13px;
		font-weight: 700;
		margin-top: -8px;
		text-align: center;
	}

	/* =Support David */
	.mfr-mhome__section--support {
		gap: 18px;
	}

	/* Three across, two rows — six tiles, and three is the most that fits the
	   longest label ("$500") at a size a thumb can hit on a 320px screen.
	   `minmax(0, 1fr)` rather than `1fr` so the tiles share the row evenly
	   instead of the widest one setting the track. */
	.mfr-mhome__amounts {
		display: grid;
		gap: 10px;
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}

	.mfr-mhome__amount {
		background: #ffffff;
		border: 2px solid var(--mfr-mhome-gold);
		border-radius: 9px;
		color: var(--mfr-mhome-navy);
		cursor: pointer;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 15px;
		font-weight: 800;
		/* 48px, not the buttons' 52px: six of these stacked two deep would
		   otherwise push the donate button off the first screen. */
		min-height: 48px;
		padding: 0 6px;
	}

	/* Filled, not merely outlined harder: the chosen figure has to be legible
	   at a glance from the donate button, which sits below the grid. */
	.mfr-mhome__amount[aria-pressed="true"] {
		background: var(--mfr-mhome-gold);
		border-color: var(--mfr-mhome-gold);
	}

	/* The tiles are the only keyboard controls in this section that are not
	   links, and the theme draws no focus ring on a button. */
	.mfr-mhome__amount:focus-visible {
		outline: 2px solid var(--mfr-mhome-purple);
		outline-offset: 2px;
	}

	/* Unhidden by the script when donate is pressed with nothing chosen. Red
	   against the section's white, and centred on the grid it belongs to. */
	.mfr-mhome__amount-error {
		color: #c62828;
		font-size: 13px;
		font-weight: 700;
		line-height: 1.4;
		margin-top: -8px;
		text-align: center;
	}

	.mfr-mhome__secure {
		align-items: center;
		color: var(--mfr-mhome-purple);
		display: flex;
		font-family: "Manrope", "Helvetica Neue", Arial, sans-serif;
		font-size: 14px;
		font-weight: 700;
		gap: 8px;
		justify-content: center;
	}

	.mfr-mhome__fine {
		color: #8794ae;
		font-size: 12px;
		line-height: 1.5;
		text-align: center;
	}

	/* =Acknowledgement of Country
	   Carried over from the Elementor band this page hides. It closes the page,
	   above the site footer, which is unchanged. */
	.mfr-mhome__section--acknowledge {
		background: var(--mfr-mhome-page);
		border-top: 1px solid var(--mfr-mhome-line);
		padding: 26px 20px 30px;
	}

	/* The two flags, above the words rather than beside them as they are on the
	   desktop band: at 375px a 732x260 image set next to a four-line paragraph
	   leaves both too small to read. Held well short of the full width so they
	   stay a mark against the text and do not become the loudest thing in the
	   section. */
	.mfr-mhome__flags {
		height: auto;
		margin: 0 auto 4px;
		max-width: 148px;
		width: 100%;
	}

	.mfr-mhome__section--acknowledge p {
		color: var(--mfr-mhome-ink);
		font-size: 12px;
		line-height: 1.6;
		text-align: center;
	}
}


/* =My Plan sticky demo notice
   Behaviour and reasoning: veto-child/inc/mfr-sticky-notice.php
   The script adds `mfr-sticky-notice--stuck` while the notice is pinned and
   writes `top` inline, because the offset depends on whether the theme's
   fixed header row is showing (80px), the admin bar is (32px), or neither.
------------------------------------------------------------ */

/* Holds the notice's space in the layout while it is pinned. Collapsed to
   nothing the rest of the time, and never display:none — its position is what
   the script measures to know where the notice belongs. */
.mfr-sticky-notice__placeholder {
	height: 0;
}

/* Beats the widget's own `#road-commitment-full .road-demo-notice` rule on
   specificity (that stylesheet is printed after this one, inside the body). */
#road-commitment-full .road-demo-notice.mfr-sticky-notice--stuck {
	box-shadow: 0 6px 18px rgba(8, 45, 101, 0.18);
	left: 0;
	position: fixed;
	right: 0;
	width: 100%;
	/* Under the theme's fixed header row (100002), above page content. */
	z-index: 8000;
}


/* =Key commitments cards (.kc-section, home page)
   The widget pins every card to `height: 235px` with `grid-template-rows: 1fr 60px`,
   so wherever the text needed more room than that — three narrow columns between
   ~1050px and ~1350px, or any card with the badge and a long body — the wrapped
   title, body and tagline spilled past the card's clipped edge and collided.
   The taglines also carried hard `<br>`s, forcing two lines even where one fits.
   Let the cards grow to their content and let the taglines wrap on their own.
   These beat the widget's own `.kc-card` rules on specificity (that stylesheet is
   printed after this one, inside the body).
------------------------------------------------------------ */

.kc-grid .kc-card {
	grid-template-rows: 1fr auto;
	height: auto;
	min-height: 235px;
}

.kc-grid .kc-content {
	padding-bottom: 10px;
	padding-top: 6px;
}

/* Two lines' worth, so the rule above the tagline sits at the same height on
   every card in a row whether that card's tagline wraps or not. */
.kc-grid .kc-footer {
	min-height: 64px;
}

.kc-grid .kc-footer span {
	max-width: 100%;
	/* Two even lines rather than a full line plus an orphan word. */
	text-wrap: balance;
}

/* Editorial line breaks that only ever suited the widest layout. */
.kc-grid .kc-footer span br {
	display: none;
}

/* The non-negotiable badge. The widget hard-codes it purple, which was fine
   while commitment 4 was the only card carrying one — purple is that card's
   own accent. Now that commitment 2 carries one too, take each card's accent
   so the badge belongs to the card it sits on. Which cards are badged is set in
   mfr-commitments-modal.php. The padding is the widget's 0px 5px opened up,
   which was tight enough that the label crowded its own edges. */
.kc-grid .kc-card .kc-badge {
	background: var(--accent);
	padding: 3px 9px;
	letter-spacing: 0.4px;
}

/* Restores the height the widget's own single-column rule sets. */
@media (max-width: 700px) {
	.kc-grid .kc-card {
		min-height: 230px;
	}
}


/* =Key commitments modal (.mfr-cm, home page)
   Behaviour, content and reasoning: veto-child/inc/mfr-commitments-modal.php
   One dialog holds all nine commitment panels; the script shows the one whose
   card was clicked and swaps `is-active` from there. Each panel sets its own
   `--cm-accent`, `--cm-ink` and `--cm-soft` inline, taken from the accent the
   widget's stylesheet already gives that card, so the modal reads as that card
   opening. `--cm-ink` is that accent darkened, and it is what everything
   carrying text or an icon uses: the gold and pink accents cannot hold white
   text or a small icon at a readable contrast. The plain accent is left to the
   one decorative mark, the rule under the tagline.
------------------------------------------------------------ */

/* The card is the modal's trigger, so it should look like one. The widget
   already lifts the card on hover; this only adds the cursor and the keyboard
   ring the script's role="button" implies. */
.kc-grid .kc-card--interactive {
	cursor: pointer;
}

.kc-grid .kc-card--interactive:focus-visible {
	outline: 3px solid var(--accent);
	outline-offset: 3px;
}

/* The lock that freezes the page behind this dialog is shared with the other
   popups and lives in "Background scroll lock" at the end of this file, driven
   by veto-child/inc/mfr-scroll-lock.php. */

/* Declared for the subtree rather than assumed from the theme, the way the
   widget resets its own (`.kc-section, .kc-section *`). The medallion is the
   case that needs it: a 100%-wide image with padding inside a fixed-size circle
   only stays inside the circle under border-box. */
.mfr-cm,
.mfr-cm *,
.mfr-cm *::before,
.mfr-cm *::after {
	box-sizing: border-box;
}

.mfr-cm {
	--cm-navy: #082760;
	--cm-text: #304A73;
	--cm-muted: #52627C;
	--cm-line: #E2E9F3;

	/* The accent of whichever commitment is showing. Written to this element by
	   the script, not to the panel, because the nav bar is outside the panels
	   and takes the accent too. */
	--cm-accent: #1769D2;
	--cm-ink: #0F55AC;
	--cm-soft: #E8F1FF;

	position: fixed;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 26px 20px;
	opacity: 0;
	transition: opacity 0.2s ease;
	/* The theme's fixed header row sits at 100002. */
	z-index: 100010;
	font-family: Manrope, Inter, Arial, Helvetica, sans-serif;
	-webkit-font-smoothing: antialiased;
}

.mfr-cm.is-open {
	opacity: 1;
}

/* The rule above beats the user-agent's `[hidden] { display: none }` — author
   styles win over the UA sheet at equal specificity — so the closed dialog
   would otherwise sit over the page. */
.mfr-cm[hidden] {
	display: none;
}

.mfr-cm__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(8, 39, 96, 0.55);
	backdrop-filter: blur(3px);
}

.mfr-cm__dialog {
	position: relative;
	display: flex;
	flex-direction: column;
	width: 100%;
	max-width: 1180px;
	/* Same reason as the panels below: never wider than the space it is given. */
	min-width: 0;
	max-height: 100%;
	background: #FFFFFF;
	border-radius: 18px;
	box-shadow: 0 30px 80px rgba(8, 39, 96, 0.35);
	overflow: hidden;
	transform: translateY(14px) scale(0.99);
	transition: transform 0.22s ease;
}

.mfr-cm.is-open .mfr-cm__dialog {
	transform: none;
}

.mfr-cm__dialog:focus {
	outline: none;
}

.mfr-cm__close {
	position: absolute;
	top: 14px;
	right: 14px;
	width: 42px;
	height: 42px;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	background: #FFFFFF;
	color: var(--cm-navy);
	border: 1px solid var(--cm-line);
	border-radius: 50%;
	box-shadow: 0 4px 14px rgba(8, 39, 96, 0.12);
	cursor: pointer;
	font-size: 18px;
	line-height: 1;
	/* Above the panel it overlaps. */
	z-index: 3;
	transition: 0.18s ease;
}

.mfr-cm__close:hover,
.mfr-cm__close:focus-visible {
	background: var(--cm-navy);
	color: #FFFFFF;
}

.mfr-cm__sr {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	border: 0;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
}


/* =Panels
   Each panel scrolls on its own so the nav bar below never scrolls away.
------------------------------------------------------------ */

.mfr-cm__viewport {
	display: flex;
	flex: 1;
	min-height: 0;
	min-width: 0;
}

/* Only the active panel is in the layout. Without JavaScript no panel is
   active, and the dialog is `hidden` anyway, so the copy stays in the document
   for crawlers without ever being shown half-built. */
.mfr-cm__panel {
	display: none;
	width: 100%;
	/* A flex item's automatic minimum is its min-content width, which for a
	   panel of uppercase headlines and letter-spaced kickers is wide. Let it
	   shrink to the dialog and wrap instead. */
	min-width: 0;
	overflow: auto;
	-webkit-overflow-scrolling: touch;
}

.mfr-cm__panel.is-active {
	display: block;
	animation: mfr-cm-panel-in 0.26s ease both;
}

@keyframes mfr-cm-panel-in {
	from {
		opacity: 0;
		transform: translateY(8px);
	}
}

@media (prefers-reduced-motion: reduce) {
	.mfr-cm,
	.mfr-cm__dialog,
	.mfr-cm__panel.is-active {
		animation: none;
		transition: none;
	}
}

/* Two columns, as the design has them: the argument on the left — title,
   tagline, intro, the four steps, the result — and the evidence on the right —
   the headline card, the artwork, and the four outcomes beneath it.
   `align-items: stretch` (the default) is what lets the artwork take the height
   the rest of the right column does not use, so that column is never part
   empty. The left column is the wider of the two because it carries the prose. */
.mfr-cm__body {
	display: grid;
	grid-template-columns: minmax(0, 1.04fr) minmax(0, 1fr);
	column-gap: 34px;
	/* No right padding: the artwork and the outcomes run to the dialog's edge,
	   so the inset they need is applied to them, not to the whole panel. */
	padding: 28px 0 24px 38px;
}

.mfr-cm__main {
	display: flex;
	flex-direction: column;
	min-width: 0;
}

/* The result box closes the left column, so it sits at the bottom however
   short the copy above it runs. */
.mfr-cm__result {
	margin-top: auto;
}


/* =Panel header
------------------------------------------------------------ */

.mfr-cm__head {
	display: grid;
	grid-template-columns: 104px minmax(0, 1fr);
	align-items: start;
	gap: 22px;
}

.mfr-cm__medallion {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 110px;
	height: 110px;
	/* background: var(--cm-soft); */
	border-radius: 50%;
	overflow: hidden;
}

.mfr-cm__medallion img {
	width: 100%;
	height: 100%;
	/* padding: 16px; */
	object-fit: contain;
}

/* Artwork that draws its own circular plate — the shield on commitment 1 — needs
   neither the tinted circle nor the inset, or it reads as a plate inside a
   plate. Set by `icon_plain` in mfr-commitments-modal.php. */
.mfr-cm__medallion--plain {
	background: none;
}

.mfr-cm__medallion--plain img {
	padding: 0;
	object-fit: contain;
}

.mfr-cm__eyebrow {
	display: inline-block;
	margin: 4px 0 12px;
	padding: 4px 10px;
	background: var(--cm-soft);
	color: var(--cm-ink);
	border-radius: 5px;
	font-size: 12px;
	font-weight: 800;
	letter-spacing: 2px;
	text-transform: uppercase;
}

.mfr-cm__title {
	/* Wider than the dialog's own gutters allow for, so the close button in the
	   top-right corner never lands on a word. */
	margin: 0;
	padding-right: 46px;
	color: var(--cm-navy);
	font-size: 37px;
	line-height: 1.06;
	font-weight: 900;
	letter-spacing: -1.4px;
	text-transform: uppercase;
	text-wrap: balance;
}

.mfr-cm__badge {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	margin-left: 8px;
	padding: 5px 11px;
	background: var(--cm-ink);
	color: #FFFFFF;
	border-radius: 999px;
	font-size: 11px;
	font-weight: 900;
	letter-spacing: 1px;
	/* Sits with the last line of the title rather than stretching it. */
	vertical-align: 4px;
	white-space: nowrap;
}

/* The accent rule under the title, matching the cards' own divider. */
.mfr-cm__tagline::before {
	content: "";
	display: block;
	width: 74px;
	height: 4px;
	margin: 18px 0 16px;
	background: var(--cm-accent);
	border-radius: 2px;
}

.mfr-cm__tagline {
	margin: 0;
	color: var(--cm-ink);
	font-size: 20px;
	line-height: 1.3;
	font-weight: 800;
}

.mfr-cm__intro {
	margin: 16px 0 18px;
	padding-bottom: 18px;
	border-bottom: 1px solid var(--cm-line);
	color: var(--cm-text);
	font-size: 15px;
	line-height: 1.6;
}


/* =How I'll deliver
------------------------------------------------------------ */

.mfr-cm__subhead {
	margin: 0 0 12px;
	color: var(--cm-ink);
	font-size: 19px;
	font-weight: 900;
	letter-spacing: 0.4px;
	text-transform: uppercase;
}

.mfr-cm__deliver {
	margin: 0;
	padding: 0;
	list-style: none;
}

.mfr-cm__deliver li {
	display: grid;
	grid-template-columns: 40px minmax(0, 1fr);
	gap: 14px;
	padding: 13px 0;
	border-bottom: 1px solid var(--cm-line);
}

.mfr-cm__deliver li:first-child {
	padding-top: 0;
}

.mfr-cm__deliver li:last-child {
	border-bottom: 0;
}

.mfr-cm__step {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 32px;
	background: var(--cm-ink);
	color: #FFFFFF;
	border-radius: 7px;
	font-size: 14px;
	font-weight: 900;
}

.mfr-cm__step-copy h4 {
	margin: 0 0 4px;
	color: var(--cm-navy);
	font-size: 16px;
	line-height: 1.25;
	font-weight: 800;
}

.mfr-cm__step-copy p {
	margin: 0;
	color: var(--cm-text);
	font-size: 14px;
	line-height: 1.5;
}


/* =The result
------------------------------------------------------------ */

.mfr-cm__result {
	display: grid;
	grid-template-columns: 44px minmax(0, 1fr);
	align-items: center;
	gap: 16px;
	padding: 16px 20px;
	background: var(--cm-soft);
	border-radius: 12px;
}

/* The artwork named in the commitment's `result_img`. Being a PNG it cannot
   take `--cm-ink`, so each commitment wants a file drawn in its own accent. */
.mfr-cm__result-icon {
	display: block;
	height: auto;
	justify-self: center;
	width: 40px;
}

/* The stand-in until a commitment has artwork. `fa-bullseye` is rings with no
   arrow: the design's mark is a target with an arrow struck into it, which is
   `fa-bullseye-arrow`, a Font Awesome Pro glyph, and the site loads Elementor's
   Font Awesome Free 5.15.3. Unlike the artwork it does take the panel accent. */
.mfr-cm__result > i {
	color: var(--cm-ink);
	font-size: 36px;
	text-align: center;
}

.mfr-cm__result h3 {
	margin: 0 0 3px;
	color: var(--cm-ink);
	font-size: 19px;
	font-weight: 900;
	letter-spacing: 0.4px;
	text-transform: uppercase;
}

.mfr-cm__result p {
	margin: 0;
	color: var(--cm-navy);
	font-size: 15px;
	line-height: 1.45;
	font-weight: 600;
}


/* =Right column — highlight, artwork, outcomes
------------------------------------------------------------ */

/* Runs to the dialog's right edge, because the artwork bleeds off it. Anything
   in here that should not touch the edge asks for its own inset. */
.mfr-cm__aside {
	display: flex;
	flex-direction: column;
	gap: 18px;
	min-width: 0;
}


/* The hairlines inside the highlight are the accent thinned into its own tint.
   Each is declared twice: browsers without `color-mix()` keep the neutral line
   from the first declaration rather than dropping the border entirely. */
.mfr-cm__highlight {
	/* Held off the dialog's right edge, and wide enough of it to clear the close
	   button floating over this corner. It is always the first thing in the
	   column, so there is no case where it sits lower and could be tighter. */
	margin-right: 62px;
	padding: 20px 22px;
	background: var(--cm-soft);
	border: 1px solid var(--cm-line);
	border-color: color-mix(in srgb, var(--cm-accent) 24%, var(--cm-soft));
	border-radius: 14px;
}

.mfr-cm__highlight-kicker {
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 0;
	color: var(--cm-ink);
	font-size: 13px;
	font-weight: 900;
	letter-spacing: 1.6px;
	text-transform: uppercase;
}

.mfr-cm__highlight-kicker i {
	font-size: 22px;
	letter-spacing: 0;
}

.mfr-cm__highlight-head {
	margin-top: 12px;
}

.mfr-cm__highlight-value {
	display: block;
	color: var(--cm-ink);
	font-size: 34px;
	line-height: 1.05;
	font-weight: 900;
	letter-spacing: -1px;
	text-transform: uppercase;
}

.mfr-cm__highlight-sub {
	display: block;
	margin-top: 5px;
	color: var(--cm-navy);
	font-size: 13px;
	font-weight: 700;
	letter-spacing: 0.3px;
	text-transform: uppercase;
}

.mfr-cm__highlight-items {
	display: flex;
	flex-wrap: wrap;
	gap: 8px 22px;
	margin: 14px 0 0;
	padding: 14px 0 0;
	border-top: 1px solid var(--cm-line);
	border-top-color: color-mix(in srgb, var(--cm-accent) 24%, var(--cm-soft));
	list-style: none;
}

.mfr-cm__highlight-items li {
	display: flex;
	align-items: center;
	gap: 8px;
	color: var(--cm-navy);
	font-size: 14px;
	font-weight: 700;
}

.mfr-cm__highlight-items i {
	color: var(--cm-ink);
	font-size: 15px;
}

.mfr-cm__highlight-note {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	margin: 14px 0 0;
	padding-top: 13px;
	border-top: 1px solid var(--cm-line);
	border-top-color: color-mix(in srgb, var(--cm-accent) 24%, var(--cm-soft));
	color: var(--cm-navy);
	font-size: 14px;
	line-height: 1.45;
	font-weight: 600;
}

.mfr-cm__highlight-note i {
	color: var(--cm-ink);
	font-size: 16px;
	/* Optical alignment with the first line of the note. */
	margin-top: 2px;
}

/* The artwork. `flex: 1` is the whole trick behind the right column: it takes
   every pixel the highlight and the outcomes leave, so the column is full at any
   panel height, and the picture crops rather than letterboxes. */
.mfr-cm__media {
	position: relative;
	flex: 1;
	min-height: 200px;
	margin: 0;
	/* Only the left edge is rounded — the other side runs off the dialog. */
	border-radius: 14px 0 0 14px;
	overflow: hidden;
}

/* With no highlight above it the artwork reaches the top of the dialog too, and
   has to pick up the dialog's own corner radius to do it cleanly. */
.mfr-cm__media:first-child {
	margin-top: -28px;
	border-radius: 0 18px 0 14px;
}

/* Taken out of the flow, so the photograph contributes no height of its own and
   the figure keeps exactly what `flex: 1` leaves it. Left in the flow, a portrait
   photo grows the panel to its own aspect the moment it loads and pushes the
   outcomes below the fold — which is a layout that changes after first paint,
   the hardest kind to catch. */
.mfr-cm__media img {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Standing in until the nine illustrations exist: the commitment's own medallion,
   centred on its accent tint, rather than a gap where a picture will go. Drop a
   URL into `image` in mfr-commitments-modal.php and this class disappears. */
.mfr-cm__media--awaiting {
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--cm-soft);
}

/* The photograph is dissolved into the white of the panel on three edges — left,
   top and bottom — so it sits in the page rather than being cut out and pasted
   onto it. The right edge is left alone: it runs off the dialog, so there is
   nothing there to blend into.

   Three gradients layered in one overlay, each sized and placed to its own edge
   rather than stretched across the whole box. They composite where they meet, so
   the two left corners go whiter than either fade alone, which is what makes the
   corners read as rounded-off rather than mitred.

   Only the photograph gets this: over the placeholder's flat tint a white fade
   would read as a smudge. The middle stops keep each fade soft — opaque straight
   to transparent leaves a visible band where the gradient ends. */
.mfr-cm__media:not(.mfr-cm__media--awaiting)::after {
	content: "";
	position: absolute;
	inset: 0;
	background:
		linear-gradient(
			to right,
			#FFFFFF 0%,
			rgba(255, 255, 255, 0.72) 34%,
			rgba(255, 255, 255, 0.28) 68%,
			rgba(255, 255, 255, 0) 100%
		) left center / 150px 100% no-repeat,
		linear-gradient(
			to bottom,
			#FFFFFF 0%,
			rgba(255, 255, 255, 0.62) 40%,
			rgba(255, 255, 255, 0.22) 72%,
			rgba(255, 255, 255, 0) 100%
		) center top / 100% 110px no-repeat,
		linear-gradient(
			to top,
			#FFFFFF 0%,
			rgba(255, 255, 255, 0.62) 40%,
			rgba(255, 255, 255, 0.22) 72%,
			rgba(255, 255, 255, 0) 100%
		) center bottom / 100% 110px no-repeat;
	/* Decoration only; never in the way of a click. */
	pointer-events: none;
}

/* The placeholder is a small mark centred by the flexbox above, so it goes back
   into the flow rather than filling the frame. */
.mfr-cm__media--awaiting img {
	position: static;
	width: 42%;
	max-width: 190px;
	height: auto;
	opacity: 0.55;
}

/* The four outcomes close the right column, under the artwork. */
.mfr-cm__outcomes {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	margin: 0;
	padding: 16px 30px 0 0;
	border-top: 1px solid var(--cm-line);
	list-style: none;
}

.mfr-cm__outcomes li {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 7px;
	padding: 0 12px;
	text-align: center;
}

.mfr-cm__outcomes li + li {
	border-left: 1px solid var(--cm-line);
}

.mfr-cm__outcomes i {
	color: var(--cm-ink);
	font-size: 27px;
}

/* Artwork in place of the glyph. The files are 1254px squares with the mark
   inset well inside them, so the box has to run larger than the 27px icons it
   replaces to read at the same optical weight. */
.mfr-cm__outcome-art {
	width: 58px;
	height: 58px;
	object-fit: contain;
}

.mfr-cm__outcomes strong {
	color: var(--cm-ink);
	font-size: 12px;
	line-height: 1.25;
	font-weight: 900;
	letter-spacing: 0.4px;
	text-transform: uppercase;
}

.mfr-cm__outcomes span {
	color: var(--cm-muted);
	font-size: 12px;
	line-height: 1.4;
}


/* =Navigation
------------------------------------------------------------ */

.mfr-cm__nav {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	gap: 18px;
	padding: 16px 22px;
	background: #FFFFFF;
	border-top: 1px solid var(--cm-line);
}

.mfr-cm__step-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	min-height: 52px;
	padding: 0 26px;
	border-radius: 10px;
	cursor: pointer;
	font-family: inherit;
	font-size: 15px;
	font-weight: 700;
	transition: 0.18s ease;
}

.mfr-cm__step-btn--prev {
	justify-self: start;
	background: #FFFFFF;
	color: var(--cm-navy);
	border: 1px solid #C9D6E7;
}

.mfr-cm__step-btn--prev:hover:not(:disabled) {
	background: #F4F8FD;
	border-color: var(--cm-navy);
}

/* On the first commitment there is nothing to go back to. The parent theme's
   own disabled-button rule paints every `button[disabled]` with
   `background`, `border-color` and `color` all `!important` (see "Disabled
   buttons" in veto/skins/default/css/style.css), which turned this into a solid
   grey-lavender slab. Matching `!important` is the only way past it; the
   selector is a class plus a pseudo-class, so it outranks the theme's
   `button[disabled]` among the important declarations. */
.mfr-cm__step-btn--prev:disabled {
	background: #FFFFFF !important;
	color: #9BAAC0 !important;
	border-color: var(--cm-line) !important;
	cursor: default;
}

/* The accent belongs to whichever panel is showing, and the nav sits outside
   the panels, so it is read from the active one. */
.mfr-cm__step-btn--next {
	justify-self: end;
	background: var(--cm-ink);
	color: #FFFFFF;
	border: 0;
}

.mfr-cm__step-btn--next:hover {
	filter: brightness(0.92);
}

.mfr-cm__progress {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 7px;
}

.mfr-cm__dots {
	display: flex;
	align-items: center;
	gap: 9px;
}

.mfr-cm__dot {
	width: 10px;
	height: 10px;
	padding: 0;
	background: #CFDAE9;
	border: 0;
	border-radius: 50%;
	cursor: pointer;
	transition: 0.18s ease;
}

.mfr-cm__dot:hover {
	background: #9EB2CC;
}

.mfr-cm__dot.is-active {
	background: var(--cm-ink);
	transform: scale(1.35);
}

.mfr-cm__count {
	margin: 0;
	color: var(--cm-muted);
	font-size: 13px;
	font-weight: 700;
}


/* =Responsive
   Below 1000px the two columns stack — the argument first, then the artwork and
   the outcomes under it — and the outcomes go to a 2x2 block because four of
   them across a phone leaves one word per line.
------------------------------------------------------------ */

@media (max-width: 1180px) {
	.mfr-cm__title {
		font-size: 34px;
	}

	.mfr-cm__body {
		column-gap: 28px;
		padding: 26px 0 22px 30px;
	}
}

@media (max-width: 1000px) {
	.mfr-cm {
		padding: 0;
	}

	.mfr-cm__dialog {
		max-width: none;
		height: 100%;
		max-height: none;
		border-radius: 0;
	}

	/* One column, in document order: the argument, then the artwork and the
	   outcomes below it. The right gutter comes back, because with everything
	   stacked it is prose that reaches the edge, not the artwork — which asks
	   for the bleed itself, below. */
	.mfr-cm__body {
		grid-template-columns: minmax(0, 1fr);
		row-gap: 24px;
		padding-right: 30px;
	}

	.mfr-cm__aside {
		/* Nothing above it to fill the leftovers of now, so the artwork takes a
		   height of its own instead of a share of the column. */
		display: block;
	}

	/* Stacked below the header, the highlight no longer shares a line with the
	   close button. */
	.mfr-cm__highlight {
		margin: 0 0 18px;
	}

	.mfr-cm__media,
	.mfr-cm__media:first-child {
		height: 300px;
		margin: 0 -30px 18px 0;
		border-radius: 14px 0 0 14px;
	}

	/* The fade exists to join the photograph to the column of text beside it.
	   Stacked, there is nothing beside it — it would just be a white smear down
	   one edge. */
	.mfr-cm__media::after {
		display: none;
	}

	.mfr-cm__outcomes {
		padding-right: 0;
	}

	.mfr-cm__result {
		margin-top: 20px;
	}
}

@media (max-width: 700px) {
	.mfr-cm__body {
		padding: 22px 18px 20px;
	}

	.mfr-cm__media,
	.mfr-cm__media:first-child {
		height: 210px;
		margin-right: -18px;
	}

	.mfr-cm__head {
		grid-template-columns: 68px minmax(0, 1fr);
		gap: 14px;
	}

	.mfr-cm__medallion {
		width: 68px;
		height: 68px;
	}

	.mfr-cm__medallion img {
		padding: 11px;
	}

	.mfr-cm__title {
		padding-right: 0;
		font-size: 27px;
		letter-spacing: -0.8px;
	}

	.mfr-cm__badge {
		margin-left: 0;
		/* Its own line — beside a 27px title it would force an awkward wrap. */
		display: inline-flex;
		vertical-align: 3px;
	}

	.mfr-cm__tagline {
		font-size: 17px;
	}

	.mfr-cm__highlight-value {
		font-size: 28px;
	}

	.mfr-cm__outcomes {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 20px 0;
	}

	.mfr-cm__outcomes li + li {
		border-left: 0;
	}

	/* The dots move above the buttons, because three columns at this width
	   squeezes both labels to two lines each. */
	.mfr-cm__nav {
		grid-template-columns: auto minmax(0, 1fr);
		gap: 12px;
		padding: 14px 16px;
	}

	.mfr-cm__progress {
		grid-column: 1 / -1;
		grid-row: 1;
	}

	.mfr-cm__step-btn {
		justify-self: stretch;
		min-height: 48px;
		padding: 0 12px;
		font-size: 13px;
		line-height: 1.2;
		text-align: center;
	}

	/* "Previous Commitment" cannot fit half a phone, and going back is the one
	   direction the arrow explains on its own. The forward button keeps its
	   label because it changes to "See All Commitments" on the last panel,
	   which an arrow would not tell anyone. */
	.mfr-cm__step-btn--prev {
		justify-self: start;
		width: 56px;
		padding: 0;
	}

	.mfr-cm__step-btn--prev span {
		display: none;
	}

	.mfr-cm__step-btn i {
		font-size: 16px;
	}
}

/* Landscape phones and short windows: the dialog is already full height, so
   only the medallion and the header spacing need to give way. */
@media (max-height: 560px) {
	.mfr-cm__head {
		grid-template-columns: minmax(0, 1fr);
	}

	.mfr-cm__medallion {
		display: none;
	}
}


/* =Mobile menu Donate button
   Markup: veto-child/inc/mfr-mobile-donate.php

   The button the mobile header row does not have, sitting at the top of the
   slide-out panel. Colours are the header Button widget's own: #ffc42e on
   #182565, 10px radius.

   The panel is a flex column that centres its content vertically and scrolls
   when the content outgrows it. The button is the first thing in that column,
   so it rides with the links rather than being pinned to the top of the
   panel: it stays directly above Home wherever the block sits, and on a short
   screen the whole thing scrolls together instead of the button overlapping
   the links.
------------------------------------------------------------ */

.trx-addons-mobile-menu-outer-container > .mfr-mobile-donate {
	flex: 0 0 auto;
	/* Wider than the 10px between links: the button is not a sixth link. */
	margin-bottom: 26px;
	/* Shares the panel's left padding with the list below it, so the button's
	   left edge lines up with the menu labels. */
	text-align: left;
}

.mfr-mobile-donate__link {
	background-color: #ffc42e;
	border-radius: 10px;
	color: #182565;
	display: inline-block;
	font-size: 17px;
	font-weight: 600;
	line-height: 1.2;
	padding: 14px 30px;
	transition: background-color 0.25s ease;
}

.mfr-mobile-donate__link:hover,
.mfr-mobile-donate__link:focus-visible {
	background-color: #ffd24d;
	color: #182565;
}

/* --------------------------------------------------------------------------
   Contact page
   -------------------------------------------------------------------------- */

.mfr-contact-page {
	background: #ffffff;
	color: #14306e;
}

/* The theme positions the header over the content (`header_position_over`),
   so the hero has to pad past it or the "Common Questions" eyebrow sits
   behind it. --mfr-header-h is measured at runtime by the script in
   page-contact-us.php; 86px is the desktop fallback.

   The clearance is deliberately small (24px). The header is 86px on every
   page, so a tall white band under it here reads as a taller header on this
   page alone; the generous spacing lives at the bottom instead. */
.mfr-contact-page__hero {
	padding: calc(var(--mfr-header-h, 86px) + 24px) 0 104px;
}

.mfr-contact-page__inner {
	box-sizing: border-box;
	display: grid;
	gap: 48px;
	grid-template-columns: minmax(0, 1.05fr) minmax(0, 1.15fr);
	margin: 0 auto;
	max-width: 1280px;
	padding: 0 24px;
	width: 100%;
}

.mfr-contact-page__copy {
	padding-top: 20px;
}

.mfr-contact-page__eyebrow {
	color: #14306e;
	font-size: 13px;
	font-weight: 800;
	letter-spacing: 0.12em;
	line-height: 1.2;
	margin: 0 0 18px;
	text-transform: uppercase;
}

.mfr-contact-page__title {
	color: #14306e;
	font-size: clamp(3rem, 5vw, 4.9rem);
	font-weight: 800;
	letter-spacing: -0.03em;
	line-height: 0.98;
	margin: 0 0 24px;
}

.mfr-contact-page__lead {
	color: rgba(20, 48, 110, 0.78);
	font-size: 18px;
	line-height: 1.65;
	margin: 0 0 28px;
	max-width: 31rem;
}

.mfr-contact-page__details {
	list-style: none;
	margin: 0;
	padding: 0;
}

.mfr-contact-page__details li {
	align-items: center;
	color: #14306e;
	display: flex;
	font-size: 16px;
	font-weight: 500;
	gap: 12px;
	line-height: 1.5;
	margin: 0 0 18px;
}

.mfr-contact-page__details a {
	color: inherit;
}

.mfr-contact-page__icon {
	align-items: center;
	border: 1px solid rgba(20, 48, 110, 0.22);
	border-radius: 999px;
	color: #14306e;
	display: inline-flex;
	flex: 0 0 auto;
	height: 26px;
	justify-content: center;
	width: 26px;
}

.mfr-contact-page__icon svg {
	height: 14px;
	width: 14px;
}

.mfr-contact-page__form-wrap {
	align-self: start;
}

.mfr-contact-form {
	background: #ffffff;
	border: 1px solid rgba(20, 48, 110, 0.06);
	border-radius: 20px;
	box-shadow: 0 22px 60px rgba(20, 48, 110, 0.12);
	padding: 32px;
}

/* One field per row, Name above Email — they used to share a two-up grid. */
.mfr-contact-form__field {
	margin: 0 0 18px;
	min-width: 0;
}

.mfr-contact-form__label {
	color: #14306e;
	display: block;
	font-size: 15px;
	font-weight: 700;
	line-height: 1.3;
	margin: 0 0 8px;
}

.mfr-contact-form__required {
	color: #ef4444;
	margin-left: 1px;
}

/* :not([type="checkbox"]) — the consent box is not a text field and picked up
   the 13px/16px padding here, which is what inflated it to a 48px square. */
.mfr-contact-form input:not([type="checkbox"]),
.mfr-contact-form textarea {
	-webkit-appearance: none;
	appearance: none;
	background: #ffffff;
	border: 1px solid rgba(20, 48, 110, 0.16);
	border-radius: 12px;
	box-sizing: border-box;
	color: #14306e;
	display: block;
	font: inherit;
	font-size: 16px;
	line-height: 1.4;
	outline: none;
	padding: 13px 16px;
	transition: border-color 0.2s ease, box-shadow 0.2s ease;
	width: 100%;
}

.mfr-contact-form textarea {
	min-height: 128px;
	resize: vertical;
}

.mfr-contact-form input::placeholder,
.mfr-contact-form textarea::placeholder {
	color: rgba(20, 48, 110, 0.42);
	opacity: 1;
}

.mfr-contact-form input:not([type="checkbox"]):focus,
.mfr-contact-form textarea:focus {
	border-color: #14306e;
	box-shadow: 0 0 0 3px rgba(20, 48, 110, 0.08);
}

/* --- Phone: one control, two parts --------------------------------------
   The country code and the number used to be two separate bordered boxes
   with a gap between them, which read as two unrelated fields. They share a
   single border now and light up together on focus. */

.mfr-contact-form__phone {
	align-items: stretch;
	background: #ffffff;
	border: 1px solid rgba(20, 48, 110, 0.16);
	border-radius: 12px;
	box-sizing: border-box;
	display: flex;
	transition: border-color 0.2s ease, box-shadow 0.2s ease;
	width: 100%;
}

.mfr-contact-form__phone:focus-within {
	border-color: #14306e;
	box-shadow: 0 0 0 3px rgba(20, 48, 110, 0.08);
}

.mfr-contact-form .mfr-contact-form__phone input[type="tel"] {
	background: transparent;
	border: 0;
	border-radius: 0 12px 12px 0;
	box-shadow: none;
	flex: 1 1 auto;
	min-width: 0;
}

.mfr-phone-code {
	border-right: 1px solid rgba(20, 48, 110, 0.12);
	flex: 0 0 auto;
	position: relative;
}

/* The plain <select> the template prints: what a visitor without JavaScript
   uses, and what carries the value in every case. */
.mfr-phone-code__select {
	-webkit-appearance: none;
	appearance: none;
	background-color: transparent;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5' fill='none' stroke='%2314306e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	background-position: right 10px center;
	background-repeat: no-repeat;
	background-size: 16px 16px;
	border: 0;
	border-radius: 12px 0 0 12px;
	box-sizing: border-box;
	color: #14306e;
	cursor: pointer;
	font: inherit;
	font-size: 16px;
	max-width: 168px;
	outline: none;
	padding: 13px 32px 13px 16px;
	text-overflow: ellipsis;
	width: 100%;
}

.mfr-phone-code__select:focus-visible {
	box-shadow: inset 0 0 0 2px rgba(20, 48, 110, 0.35);
}

/* Replaced by the searchable dropdown once the script has run. It keeps
   submitting the value, so it is hidden rather than removed. */
.mfr-phone-code.is-enhanced .mfr-phone-code__select {
	display: none;
}

.mfr-phone-code__trigger {
	align-items: center;
	background: transparent;
	border: 0;
	border-radius: 12px 0 0 12px;
	color: #14306e;
	cursor: pointer;
	display: flex;
	font: inherit;
	font-size: 16px;
	font-weight: 600;
	gap: 7px;
	line-height: 1.4;
	min-height: 100%;
	padding: 13px 12px 13px 16px;
	transition: background-color 0.2s ease;
	white-space: nowrap;
}

/* The parent theme repaints every <button> on :hover AND :focus —
   `color: var(--theme-color-bg_color)` (white) on
   `background-color: var(--theme-color-hover)` (#E7362A) — via a plain
   `button:hover, button:focus` selector in veto/skins/default/css/style.css.
   That is what made the "+61" disappear on hover (white on white) and what
   turned the control orange-red after a click, since a mouse click leaves
   :focus behind. Pinning all four states here: `:hover` and `:focus` each
   count as one class, so these outrank the theme's element-level rule. */
.mfr-phone-code__trigger:hover,
.mfr-phone-code__trigger:focus,
.mfr-phone-code__trigger:focus-visible,
.mfr-phone-code__trigger:active {
	background-color: transparent;
	border-color: transparent;
	color: #14306e;
}

/* Re-applies the intended hover tint after the reset above. */
.mfr-phone-code__trigger:hover,
.mfr-phone-code__trigger:focus-visible {
	background-color: rgba(20, 48, 110, 0.05);
}

/* Keyboard users still get a ring; a mouse click does not. */
.mfr-phone-code__trigger:focus-visible {
	outline: 2px solid #14306e;
	outline-offset: -2px;
}

.mfr-phone-code__iso {
	color: rgba(20, 48, 110, 0.5);
	font-size: 12px;
	font-weight: 800;
	letter-spacing: 0.06em;
}

.mfr-phone-code__dial {
	font-variant-numeric: tabular-nums;
}

.mfr-phone-code__caret {
	color: rgba(20, 48, 110, 0.55);
	display: inline-flex;
	transition: transform 0.2s ease;
}

.mfr-phone-code__caret svg {
	height: 16px;
	width: 16px;
}

.mfr-phone-code.is-open .mfr-phone-code__caret {
	transform: rotate(180deg);
}

.mfr-phone-code__panel {
	background: #ffffff;
	border: 1px solid rgba(20, 48, 110, 0.12);
	border-radius: 14px;
	box-shadow: 0 20px 44px rgba(20, 48, 110, 0.18);
	box-sizing: border-box;
	left: 0;
	max-width: calc(100vw - 56px);
	padding: 10px;
	position: absolute;
	top: calc(100% + 8px);
	width: 320px;
	z-index: 30;
}

.mfr-contact-form input.mfr-phone-code__search-input {
	border-radius: 10px;
	font-size: 15px;
	padding: 10px 12px;
}

.mfr-phone-code__list {
	list-style: none;
	margin: 8px 0 0;
	max-height: 244px;
	overflow-y: auto;
	overscroll-behavior: contain;
	padding: 0;
}

.mfr-phone-code__option {
	align-items: center;
	border-radius: 10px;
	color: #14306e;
	cursor: pointer;
	display: flex;
	font-size: 15px;
	gap: 14px;
	justify-content: space-between;
	line-height: 1.35;
	margin: 0;
	padding: 9px 12px;
}

/* The display:flex above out-ranks the browser's own rule for the hidden
   attribute, so the search would filter the list without hiding anything. */
.mfr-phone-code__option[hidden] {
	display: none;
}

.mfr-phone-code__option.is-active {
	background-color: rgba(20, 48, 110, 0.07);
}

.mfr-phone-code__option[aria-selected="true"] {
	font-weight: 700;
}

.mfr-phone-code__option-dial {
	color: rgba(20, 48, 110, 0.55);
	flex: 0 0 auto;
	font-variant-numeric: tabular-nums;
}

.mfr-phone-code__empty {
	color: rgba(20, 48, 110, 0.6);
	font-size: 14px;
	margin: 0;
	padding: 12px;
	text-align: center;
}

/* --- Consent checkbox ---------------------------------------------------
   The parent theme hides real checkboxes off-screen and draws a box in a
   :before instead. That pseudo-element does not render in every browser, so
   the box itself is styled here and the theme's is switched off. */

.mfr-contact-form__consent {
	align-items: flex-start;
	color: rgba(20, 48, 110, 0.85);
	cursor: pointer;
	display: flex;
	font-size: 14px;
	gap: 12px;
	line-height: 1.5;
	margin: 2px 0 4px;
}

.mfr-contact-form__consent input[type="checkbox"] {
	-webkit-appearance: none;
	appearance: none;
	background-color: #ffffff;
	background-position: center;
	background-repeat: no-repeat;
	background-size: 12px 12px;
	border: 1px solid rgba(20, 48, 110, 0.3);
	border-radius: 6px;
	box-shadow: none;
	box-sizing: border-box;
	clip: auto;
	clip-path: none;
	cursor: pointer;
	flex: 0 0 auto;
	height: 20px;
	margin: 1px 0 0;
	padding: 0;
	position: static !important;
	transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
	width: 20px;
}

.mfr-contact-form__consent input[type="checkbox"]::before {
	content: none;
	display: none;
}

.mfr-contact-form__consent input[type="checkbox"]:checked {
	background-color: #14306e;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5 13l4 4L19 7' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	border-color: #14306e;
}

.mfr-contact-form__consent input[type="checkbox"]:focus-visible {
	box-shadow: 0 0 0 3px rgba(20, 48, 110, 0.15);
}

/* --- Validation --------------------------------------------------------- */

.mfr-contact-form__error {
	color: #c9412a;
	font-size: 13px;
	line-height: 1.4;
	margin: 6px 0 0;
}

.mfr-contact-form__error--consent {
	margin: 0 0 4px 32px;
}

.mfr-contact-form__field.is-invalid input:not([type="checkbox"]),
.mfr-contact-form__field.is-invalid textarea,
.mfr-contact-form__field.is-invalid .mfr-contact-form__phone {
	border-color: #e0553a;
}

.mfr-contact-form__field.is-invalid input:not([type="checkbox"]):focus,
.mfr-contact-form__field.is-invalid textarea:focus,
.mfr-contact-form__field.is-invalid .mfr-contact-form__phone:focus-within {
	border-color: #e0553a;
	box-shadow: 0 0 0 3px rgba(224, 85, 58, 0.12);
}

.mfr-contact-form__consent.is-invalid input[type="checkbox"] {
	border-color: #e0553a;
}

/* --- Submit ------------------------------------------------------------- */

.mfr-contact-form__actions {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
	margin-top: 18px;
}

/* Same yellow as the header's "Donate Now" Button widget (#ffc42e on #182565,
   hover #ffd24d) rather than the orange gradient it used to carry, so the
   page's two calls to action read as the same button. Matches
   .mfr-mobile-donate__link, which mirrors that widget too. */
.mfr-contact-form__button {
	align-items: center;
	background: #ffc42e;
	border: 0;
	border-radius: 999px;
	box-shadow: 0 12px 26px rgba(255, 196, 46, 0.32);
	color: #182565;
	cursor: pointer;
	display: inline-flex;
	font-size: 16px;
	font-weight: 800;
	gap: 10px;
	justify-content: center;
	min-height: 54px;
	min-width: 168px;
	padding: 0 24px;
	transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.2s ease;
}

/* :focus and :active are pinned for the same reason as the code selector
   above — the theme's `button:focus` rule would otherwise paint this
   orange-red with white text from the moment it is clicked. */
.mfr-contact-form__button:hover,
.mfr-contact-form__button:focus,
.mfr-contact-form__button:focus-visible,
.mfr-contact-form__button:active {
	background: #ffc42e;
	border-color: transparent;
	color: #182565;
}

.mfr-contact-form__button:hover,
.mfr-contact-form__button:focus-visible {
	background: #ffd24d;
	box-shadow: 0 16px 32px rgba(255, 196, 46, 0.38);
	transform: translateY(-1px);
}

.mfr-contact-form__button:focus-visible {
	outline: 2px solid #182565;
	outline-offset: 3px;
}

.mfr-contact-form[data-busy="1"] .mfr-contact-form__button {
	cursor: wait;
	opacity: 0.86;
	pointer-events: none;
}

.mfr-contact-form__spinner {
	animation: mfr-contact-spin 0.8s linear infinite;
	border: 2px solid rgba(24, 37, 101, 0.3);
	border-radius: 50%;
	border-top-color: #182565;
	display: none;
	height: 14px;
	width: 14px;
}

.mfr-contact-form[data-busy="1"] .mfr-contact-form__spinner {
	display: inline-block;
}

.mfr-contact-form__status {
	color: rgba(20, 48, 110, 0.75);
	font-size: 14px;
	line-height: 1.45;
	margin: 0;
	max-width: 22rem;
}

.mfr-contact-form__status:empty {
	display: none;
}

.mfr-contact-form__status[data-state="success"] {
	color: #0f7a44;
	font-weight: 600;
}

.mfr-contact-form__status[data-state="error"] {
	color: #c9412a;
}

@keyframes mfr-contact-spin {
	to {
		transform: rotate(360deg);
	}
}

@media (max-width: 1023px) {
	.mfr-contact-page__inner {
		grid-template-columns: 1fr;
	}

	.mfr-contact-page__copy {
		padding-top: 0;
	}
}

@media (max-width: 767px) {
	.mfr-contact-page__hero {
		padding: calc(var(--mfr-header-h, 86px) + 20px) 0 72px;
	}

	.mfr-contact-page__inner {
		padding: 0 18px;
	}

	.mfr-contact-form {
		padding: 22px 18px;
	}

	/* The code and the number stay side by side — stacking them made the code
	   look like a field of its own again. */
	.mfr-phone-code__trigger {
		padding: 13px 10px 13px 12px;
	}

	.mfr-phone-code__panel {
		max-width: calc(100vw - 44px);
		width: 288px;
	}

	.mfr-contact-form__actions {
		align-items: flex-start;
		flex-direction: column;
	}

	.mfr-contact-form__button {
		width: 100%;
	}

	.mfr-contact-form__status {
		max-width: none;
	}

	.mfr-contact-page__lead {
		font-size: 16px;
	}

	.mfr-contact-page__title {
		font-size: clamp(2.5rem, 12vw, 3.5rem);
	}
}

/* =Chat widget (bot-ai SDK, cdn.linky.biz)
-------------------------------------------------------------- */

/* NOTE (2026-08-19, revised 2026-08-21): the bundle mounts itself into a SHADOW
   ROOT on a body-level `#botai-host`, and page stylesheets do not cross that
   boundary — so every rule in this section matches nothing. They are kept
   because they are correct for the light-DOM version the SDK shipped before,
   and it is a third-party bundle that can change back under us.

   Nothing here or anywhere else in the theme lays the widget out any more. The
   SDK sizes itself against the window (full screen on a phone, a clamped card
   above that) and reads ONE thing from this site: `--botai-bottom-offset`, the
   height of the sticky support bar, published on :root by publishHeight() in
   veto-child/inc/mfr-support-bar.php. That variable is the whole interface —
   set it and the launcher and panel move; there is nothing else to override.

   The stylesheet this theme used to inject into the shadow root is gone. Do not
   bring it back: its rules were all `!important`, so they outranked the SDK's
   own layout and would clip the full-screen phone panel back to a small box. */

/* The SDK is a third-party bundle and it sizes the panel from JavaScript,
   as inline styles on `.chat-widget`: width 450px, height 600px, right 20px
   and a bottom offset of (viewport height - 600) / 1.2. None of that is
   exposed through createChatbot()'s options, so every rule below has to be
   !important to land on top of the inline style attribute. */

/* Never wider or taller than the window — whatever the inline size says, and
   whatever the drag-resize handle in the panel's bottom-right corner is
   pulled out to. Percentages, not vw/vh: the panel's parent is the SDK's
   `position:fixed; inset:0` overlay, so 100% is the visible viewport with no
   scrollbar to subtract and no iOS toolbar counted in. 108px of headroom
   keeps the round launcher button (56px tall, 16px off the bottom) clear. */
.chat-widget {
	max-height: calc(100% - 108px) !important;
	max-width: calc(100% - 40px) !important;
}

/* Under ~820px of window height the SDK's computed bottom offset slides the
   panel down over the launcher, and on a short window it goes negative and
   takes the message input off the bottom of the screen. Pin it instead. */
@media (max-height: 820px) {
	.chat-widget {
		bottom: 88px !important;
	}
}

/* Phones. The inline 450px is wider than the screen, so framer-motion drags
   the panel back inside its constraint box — which is what pushed the right
   edge of every message off screen in the first place. Fill the width
   instead, and drop the drag transform so the panel stays where it is put. */
@media (max-width: 640px) {
	.chat-widget {
		border-radius: 14px !important;
		bottom: 80px !important;
		cursor: default !important;
		height: calc(100% - 96px) !important;
		left: auto !important;
		max-height: none !important;
		max-width: none !important;
		right: 8px !important;
		transform: none !important;
		width: calc(100% - 16px) !important;
	}

	/* Resizing needs a mouse-down and mousemove, so it does nothing here. */
	.chat-widget .chat-resize-handle {
		display: none !important;
	}
}

/* A long link in a reply used to push its bubble wider than the panel. */
.chat-widget li,
.chat-widget p,
.chat-widget a {
	overflow-wrap: anywhere;
}

/* =Sticky support bar
   Markup: veto-child/inc/mfr-support-bar.php

   The donation CTA pinned to the viewport: a full-width purple bar across the
   bottom up to 1024px, where the header is the hamburger row and has no Donate
   button of its own, and a gold card in the bottom-left corner above that,
   where the header's own button scrolls away. One block of markup, two skins —
   see "The desktop card" at the end of this section.

   Colours are the comp's: #311f5a panel, #ffc42e button and accent line (the
   site gold, shared with the header and slide-out Donate buttons), white copy.

   Geometry. The bar is a two-part stack — a 20px tab, then the panel — so the
   collapse can slide it down by the panel's height and leave the tab standing
   on the bottom edge. `--mfr-sb-panel-h` and `--mfr-sb-h` are both measured by
   the script and written to `:root`: the first drives that slide, the second is
   the height the page has to keep clear at the bottom.

   The panel is the full-width purple; `.mfr-sb__inner` is the row it centres —
   medallion, copy, button, with the close taken out of the flow into the
   corner.
   ------------------------------------------------------------ */

.mfr-sb {
	/* Which of the two layouts is showing, read back by the script in
	   mfr-support-bar.php so the breakpoint below is the only place it is
	   written down. `bar` up to 1024px, `card` above. */
	--mfr-sb-mode: bar;
	/* Between the page and the theme's own fixed furniture. The neighbours,
	   lowest first: the My Plan sticky notice (8000), which the bar has to
	   cover; the slide-out mobile menu (10002), which has to cover the bar —
	   an open full-screen menu owns the screen, and the script below also
	   slides the bar out of the way while it is open, so this is the belt to
	   that braces; the theme's fixed header row (100002) and the commitments
	   modal (100010), both of which stay above it. */
	z-index: 10001;
	bottom: 0;
	box-sizing: border-box;
	left: 0;
	position: fixed;
	right: 0;
	transition: transform 0.32s ease;
	will-change: transform;
}

.mfr-sb *,
.mfr-sb *::before,
.mfr-sb *::after {
	box-sizing: border-box;
}

/* Only one wording shows at a time. The other is `display: none`, which takes
   it out of the accessibility tree as well — see the note in the markup.

   Two-class selectors, here and in the desktop block below, because two of
   these elements set a display of their own (the medallion is a flex box): a
   bare `.mfr-sb__at--card` ties with those rules on specificity and would then
   be decided by whichever sits lower in the file. */
.mfr-sb__medallion.mfr-sb__at--card,
.mfr-sb__title-line.mfr-sb__at--card,
.mfr-sb__text.mfr-sb__at--card,
.mfr-sb__cta-label.mfr-sb__at--card {
	display: none;
}

@media print {
	.mfr-sb {
		display: none;
	}
}

/* Collapsed: down by the panel's height, which leaves the tab on the edge.
   100% is the no-JS fallback and never applies — the class is only ever set by
   the script that writes the variable. */
.mfr-sb--collapsed {
	transform: translateY(var(--mfr-sb-panel-h, 100%));
}

/* Dismissed, and yielding to the open chat panel or the open mobile menu: all
   the way off. */
.mfr-sb--gone,
.mfr-sb--yield {
	transform: translateY(100%);
}

.mfr-sb--yield {
	pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
	.mfr-sb {
		transition: none;
	}
}

/* --- The collapse tab ------------------------------------------------- */

/* Centred on the panel's top edge and the same colour, so it reads as a pull
   handle on the bar rather than a control floating above it. 44px wide by 24px
   is under the 44px touch target the close button gets, deliberately: hiding
   the campaign's call to action should be the harder of the two taps, and the
   tab is the recoverable one. */
.mfr-sb__tab {
	appearance: none;
	background: #311f5a;
	border: 0;
	border-radius: 14px 14px 0 0;
	color: #ffffff;
	cursor: pointer;
	display: block;
	height: 20px;
	margin: 0 auto;
	padding: 0;
	width: 46px;
}

.mfr-sb__chevron {
	display: block;
	height: 18px;
	margin: 0 auto;
	transition: transform 0.32s ease;
	width: 18px;
}

/* Points up once the bar is collapsed: the tab now brings it back. */
.mfr-sb--collapsed .mfr-sb__chevron {
	transform: rotate(180deg);
}

@media (prefers-reduced-motion: reduce) {
	.mfr-sb__chevron {
		transition: none;
	}
}

/* --- The panel -------------------------------------------------------- */

/* The full-width purple. It carries the vertical padding and the safe-area
   inset — the iPhone home indicator, without which the gold button sits under
   the swipe bar — and nothing else; the row itself is the wrapper inside. */
.mfr-sb__panel {
	background: #311f5a;
	color: #ffffff;
	padding: 10px 0 calc(10px + env(safe-area-inset-bottom, 0px));
	text-align: left;
}

/* The row, capped and centred so the three blocks stay a group on a tablet
   instead of drifting to opposite edges of a 1024px bar.

   Flex, not grid: the medallion drops out below 375px, and a grid's items
   would then shift a column left — the copy would take the medallion's `auto`
   track, size itself to its longest line and push the button off the right
   edge. In a row, a removed item just gives its space back. The copy is the
   only elastic item (`min-width: 0` below lets it shrink past its longest
   word); the medallion and the button hold their size.

   The right padding is wider than the left because the close button is taken
   out of the flow into that corner, so the row has to stop short of it. */
.mfr-sb__inner {
	align-items: center;
	display: flex;
	gap: 8px;
	margin: 0 auto;
	max-width: 640px;
	padding: 0 30px 0 8px;
	/* The close button's anchor. */
	position: relative;
	width: 100%;
}

/* The gold ring is the panel's one piece of decoration and the first thing
   read on a dark bar, so it keeps its size where it can — but under 375px the
   copy needs those 46px more than the ring does: without them the one line of
   reasoning runs to five. */
.mfr-sb__medallion {
	align-items: center;
	border: 2px solid #ffc42e;
	border-radius: 50%;
	color: #ffffff;
	display: flex;
	flex: 0 0 auto;
	height: 46px;
	justify-content: center;
	width: 46px;
}

.mfr-sb__medallion svg {
	display: block;
	height: 24px;
	width: 24px;
}

@media (max-width: 374px) {
	.mfr-sb__medallion {
		display: none;
	}
}

/* --- Copy ------------------------------------------------------------- */

.mfr-sb__copy {
	flex: 1 1 auto;
	min-width: 0;
}

.mfr-sb__title {
	font-size: 15px;
	font-weight: 800;
	letter-spacing: 0.01em;
	line-height: 1.15;
	margin: 0 0 4px;
	text-transform: uppercase;
}

/* Two lines whatever the width: the headline is a two-line lockup in the comp,
   and letting it reflow puts "independent" on the first line on a wide phone. */
.mfr-sb__title-line {
	display: block;
}

.mfr-sb__title-line--accent {
	color: #ffc42e;
}

.mfr-sb__text {
	/* 11.5px, not the 15px body size: at this size the line of reasoning wraps
	   to the three lines the comp shows on a 390px screen, which is what keeps
	   the whole bar near 120px — a sixth of a phone screen. */
	font-size: 11.5px;
	font-weight: 600;
	line-height: 1.36;
	margin: 0;
	/* A pasted URL in edited copy would otherwise widen the column. */
	overflow-wrap: anywhere;
}

/* --- The button ------------------------------------------------------- */

.mfr-sb__cta {
	align-items: center;
	background: #ffc42e;
	border-radius: 10px;
	color: #182565;
	display: flex;
	flex-direction: column;
	font-size: 12.5px;
	font-weight: 800;
	gap: 3px;
	justify-content: center;
	line-height: 1.14;
	padding: 9px 8px 7px;
	text-align: center;
	/* The theme underlines content links; this one is a button. */
	text-decoration: none;
	text-transform: uppercase;
	transition: background-color 0.25s ease;
	/* Fixed, not min-width. Left to size itself the label sets on one long line
	   and takes the copy's width with it; 96px is the comp's button, and the
	   label breaks over the three lines it shows there. */
	flex: 0 0 96px;
}

.mfr-sb__cta:hover,
.mfr-sb__cta:focus-visible {
	background: #ffd24d;
	color: #182565;
}

.mfr-sb__cta-arrow {
	display: block;
	height: 15px;
	width: 15px;
}

/* --- Close ------------------------------------------------------------ */

/* In the panel's top-right corner rather than in a column of its own, which
   is the comp's arrangement and the one that leaves the copy its width: the
   panel's right padding is the only room it takes, and the gold button clears
   it by starting lower. 34x34 of tappable area around an 18px glyph. */
.mfr-sb__close {
	align-items: center;
	appearance: none;
	background: none;
	border: 0;
	color: #ffffff;
	cursor: pointer;
	display: flex;
	height: 34px;
	justify-content: center;
	padding: 0;
	position: absolute;
	right: -4px;
	top: -2px;
	width: 34px;
}

.mfr-sb__close svg {
	height: 18px;
	width: 18px;
}

.mfr-sb__close:hover,
.mfr-sb__close:focus-visible {
	color: #ffc42e;
}

.mfr-sb__tab:focus-visible,
.mfr-sb__close:focus-visible,
.mfr-sb__cta:focus-visible {
	outline: 2px solid #ffc42e;
	outline-offset: 2px;
}

/* Label for the icon-only controls. */
.mfr-sb__sr {
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	height: 1px;
	overflow: hidden;
	position: absolute;
	white-space: nowrap;
	width: 1px;
}

/* --- The desktop card (1025px and up) ---------------------------------
   The same markup worn as the comp's gold card in the bottom-left corner:
   #ffc42e on a 3px #7352a2 outline, #412d82 for the ink, the button and the
   medallion, and the second headline line dropping its gold for that same ink.

   Bottom-LEFT, not right: the chat launcher owns the right corner (its offsets
   are set from the bar's script, which publishes 0 at this width so it stays
   put). `left`/`bottom` are the two values to change to move the card.

   The comp draws it 654px wide over the hero. It is capped a little under that
   and against the viewport, so a 1280px laptop keeps its content readable
   beside it.
   ------------------------------------------------------------ */

@media (min-width: 1025px) {
	.mfr-sb {
		--mfr-sb-mode: card;
		bottom: 28px;
		left: 28px;
		right: auto;
		width: min(620px, calc(100vw - 56px));
	}

	/* Card wording in, bar wording out. */
	.mfr-sb__title-line.mfr-sb__at--card,
	.mfr-sb__text.mfr-sb__at--card,
	.mfr-sb__cta-label.mfr-sb__at--card {
		display: block;
	}

	.mfr-sb__medallion.mfr-sb__at--card {
		display: flex;
	}

	.mfr-sb__medallion.mfr-sb__at--bar,
	.mfr-sb__title-line.mfr-sb__at--bar,
	.mfr-sb__text.mfr-sb__at--bar,
	.mfr-sb__cta-label.mfr-sb__at--bar {
		display: none;
	}

	/* No collapse at this size, so the tab goes — and with it the transform a
	   collapse left behind if the reader shrank the window and grew it again. */
	.mfr-sb__tab {
		display: none;
	}

	.mfr-sb--collapsed {
		transform: none;
	}

	.mfr-sb__panel {
		background: #ffc42e;
		border: 3px solid #7352a2;
		border-radius: 16px;
		box-shadow: 0 14px 34px rgba(20, 12, 45, 0.26);
		color: #412d82;
		padding: 0;
	}

	.mfr-sb__inner {
		gap: 18px;
		max-width: none;
		/* Right padding clears the close in the corner, as on the bar. */
		padding: 22px 46px 22px 22px;
	}

	/* Filled plate rather than the bar's ring: on gold, an outline of the same
	   purple as the text reads as a second glyph. */
	.mfr-sb__medallion {
		background: #412d82;
		border: 0;
		color: #ffc42e;
		height: 54px;
		width: 54px;
	}

	.mfr-sb__medallion svg {
		height: 27px;
		width: 27px;
	}

	.mfr-sb__title {
		font-size: 24px;
		letter-spacing: 0;
		line-height: 1.14;
		margin-bottom: 7px;
	}

	/* The card is one voice in one colour; the bar's gold second line would be
	   invisible on gold anyway. */
	.mfr-sb__title-line--accent {
		color: inherit;
	}

	.mfr-sb__text {
		font-size: 16.5px;
		font-weight: 600;
		line-height: 1.35;
	}

	.mfr-sb__cta {
		background: #412d82;
		border-radius: 12px;
		color: #ffffff;
		flex: 0 0 auto;
		/* A row at this size: "DONATE NOW →" on one line, as the comp has it. */
		flex-direction: row;
		font-size: 16.5px;
		gap: 10px;
		letter-spacing: 0.02em;
		padding: 16px 24px;
		white-space: nowrap;
	}

	.mfr-sb__cta:hover,
	.mfr-sb__cta:focus-visible {
		background: #533ba1;
		color: #ffffff;
	}

	.mfr-sb__cta-arrow {
		height: 17px;
		width: 17px;
	}

	.mfr-sb__close {
		color: #412d82;
		right: 6px;
		top: 6px;
	}

	.mfr-sb__close:hover,
	.mfr-sb__close:focus-visible {
		color: #7352a2;
	}

	.mfr-sb__tab:focus-visible,
	.mfr-sb__close:focus-visible,
	.mfr-sb__cta:focus-visible {
		outline-color: #412d82;
	}
}

/* Short windows — a laptop with the dock and a toolbar — where a 130px card in
   the corner eats too much of what is left. Same card, one size down. */
@media (min-width: 1025px) and (max-height: 700px) {
	.mfr-sb {
		bottom: 18px;
		left: 18px;
		width: min(560px, calc(100vw - 36px));
	}

	.mfr-sb__inner {
		padding: 15px 40px 15px 16px;
	}

	.mfr-sb__title {
		font-size: 20px;
	}

	.mfr-sb__text {
		font-size: 15px;
	}

	.mfr-sb__medallion {
		height: 46px;
		width: 46px;
	}

	.mfr-sb__cta {
		font-size: 15px;
		padding: 13px 18px;
	}
}

/* --- Clearance -------------------------------------------------------- */

/* The bar is fixed, so the bottom of the footer would sit under it with
   nothing left to scroll. `--mfr-sb-h` is the bar's measured height, written
   to `:root` by the script; 116px is the fallback for a reader without
   JavaScript, who has no way to collapse the bar either.

   Scoped to `.mfr-has-support-bar` (added in mfr-support-bar.php) so pages
   without the bar keep the footer flush to the bottom of the page. */
@media (max-width: 1024px) {
	.mfr-has-support-bar .page_wrap {
		padding-bottom: var(--mfr-sb-h, 116px);
	}
}


/* =Background scroll lock (dialogs)
   Script: veto-child/inc/mfr-scroll-lock.php

   `html` is the scroll container on this theme (`document.scrollingElement`),
   so that is what has to stop scrolling while a dialog is open — locking
   `body`, as the priorities widget tried to, does nothing.

   `!important` is not decoration here. The theme declares
   `html { overflow-y: scroll !important }` in trx_addons/css/__styles.css and
   again as `html:not(.edit-post-visual-editor)` in veto/style.css; without it
   this rule loses and the computed value stays `scroll`.

   Locking `body` as well costs nothing and covers the theme's own
   `body { overflow: hidden auto }` if that ever becomes the scroller.
-------------------------------------------------------------- */

html.mfr-lock,
html.mfr-lock body {
	overflow: hidden !important;
}

/* The theme keeps a scrollbar on screen at all times. Hiding it hands ~15px of
   width back to the page, which slides sideways under the dialog as it opens —
   on Windows and anywhere else with classic scrollbars. Reserving the gutter
   holds the width; macOS overlay scrollbars take no width either way, so
   nothing changes there. */
html.mfr-lock {
	scrollbar-gutter: stable !important;
}

/* A gesture that reaches the end of a panel inside the dialog stops there
   rather than handing the rest to whatever is behind it. */
.mfr-cm,
.rp-modal {
	overscroll-behavior: contain;
}


/* =Header, before its JavaScript
--------------------------------------------------------------------------

   The header's desktop rows are Elementor containers carrying an entrance
   animation, so they ship hidden:

       <div class="... animation_type_block elementor-invisible ..."
            data-settings='{"animation":"ta_fadein"}'>

   `.elementor-invisible { visibility: hidden }` holds them there until
   elementor-frontend's GlobalHandler takes the class off and swaps in
   `animated ta_fadein`, and that handler sits at the end of the footer script
   stack. Measured on /contact-us/: 90 scripts, frontend.min.js finished at
   2.57s, load at 3.68s. So the fade does not start when the header paints —
   it starts two to three seconds later, and until then the header is a blank
   white bar. That wait is the complaint, not the fade.

   inc/mfr-embed-chrome.php stops the script stack throwing. This starts the
   fade at paint instead, by declaring it in CSS, where nothing has to load
   first:

   - ta_fadein is the theme's own, from veto/skins/default/css/__plugins.css
     (`opacity: 0 -> 1`), at the 1s `.animated` gives it and the `ease` that
     `.ta_fadein` does. Same fade, same timing — only sooner.
   - It is declared identically for both states, the `elementor-invisible` the
     header paints in and the `animated` Elementor swaps in later. The
     computed animation is the same either way, so the swap does not restart
     it: the fade runs once, from paint, and Elementor arriving mid-fade is
     invisible rather than a replay.
   - No fill mode, matching the theme, which leaves it off `.animated`
     deliberately ("to prevent conflicts with masonry, isotope, submenu").
     Nothing needs it: these rows are opaque at rest.

   Scoped to the header's own top-level rows, so entrance animations elsewhere
   on the page are untouched, and the sticky row is left out of it entirely.
   That one is not held back by `elementor-invisible` in the first place —
   trx_addons collapses it with
   `.sc_layouts_row_hide_unfixed:not(.sc_layouts_row_fixed_on) { height: 0 }`
   — and it fades in on scroll, by which time the scripts are long loaded.
   The phone row carries no animation and was never hidden.
-------------------------------------------------------------- */

.top_panel .elementor > .e-con.elementor-invisible:not(.sc_layouts_row_fixed),
.top_panel .elementor > .e-con.animated:not(.sc_layouts_row_fixed) {
	visibility: visible;
	-webkit-animation: ta_fadein 1s ease;
			animation: ta_fadein 1s ease;
}

/* The sticky row still waits for its scripts, but it has nothing to show
   until someone scrolls. Visible here only so that it is not left behind
   `visibility: hidden` if they never arrive. */
.top_panel .elementor > .e-con.sc_layouts_row_fixed.elementor-invisible {
	visibility: visible;
}

/* The phone header has its own version of the same wait, and it is not this
   class. Its row carries no animation, so the bar and the logo paint on time;
   what is missing is the hamburger. The nav widget is printed with the hide
   inline —

       <div class="trx-addons-nav-widget-container"
            style="visibility:hidden; opacity:0;">

   — and the only thing that clears it is NavMenu.js, in trx_addons'
   elementor-widgets/.../NavMenu/assets/NavMenu.js:

       $widgetContainer.css({ visibility: 'inherit', opacity: 'inherit' });

   which runs off a `frontend/element_ready/trx_elm_nav_menu.default` hook it
   registers on `elementor/frontend/init`. So on a phone the menu is
   unreachable for as long as the footer scripts take, and on a request that
   throws before them there is no way into the menu at all.

   The same two values NavMenu.js would have set, so it has nothing left to do
   when it arrives. Revealing the widget early shows the hamburger and nothing
   else: the slide-out it belongs to is `display: none` until it is opened, and
   the full-screen overlay beside it is `pointer-events: none` — checked with
   elementFromPoint at 375px, which still reaches the page underneath.

   `[style*="hidden"]` keeps this to the containers that ship hidden, which
   here is the phone one; `!important` because the hide is inline. */
.top_panel .trx-addons-nav-widget-container[style*="hidden"] {
	visibility: inherit !important;
	opacity: inherit !important;
}
