/**
 * Homepage block pattern styles — Aquinas Classical Academy.
 *
 * Every rule that sets color, background, or brand typography is prefixed
 * with `html body` to out-specificity Kadence's own default block/element
 * CSS (kadence/assets/css/*.min.css), which otherwise sits at an equal or
 * higher specificity and wins on load order — the same fix already applied
 * to the global button override in functions.php. Values (colors, font
 * families/sizes, spacing) come from theme.json tokens only; nothing here
 * introduces a new color or font.
 *
 * Heading font-family is the same bug in a new spot: theme.json's
 * generated CSS sets `h1,h2,h3,h4,h5,h6{font-family:cardo}` and
 * `h2{font-family:lora}`, both plain-tag selectors. Kadence's own base
 * CSS sets the identical `h1,h2,h3,h4,h5,h6{font-family:var(--global-
 * heading-font-family)}` (which resolves to the literal keyword
 * "inherit"), also a plain-tag selector — same specificity, and
 * Kadence's stylesheet loads later, so it wins for any h1-h6 that
 * doesn't declare its own font-family. Every actual heading tag
 * (h1/h2/h3) used in these patterns now sets its own font-family below
 * for exactly this reason — a bare class selector already outranks a
 * plain tag selector on specificity regardless of the `html body`
 * prefix, but the prefix is kept for consistency with every other rule
 * in this file. `.aca-diff-row__heading` (h3) already declared its own
 * font-family before this fix and was never actually affected.
 *
 * Same story for font-size on three of the h2-tagged section headings
 * (.aca-welcome__heading, .aca-differentiators__heading,
 * .aca-find-way__heading). theme.json's h2 rule and Kadence's own
 * hardcoded h2 rule both cap these at ~28px (the generic "heading"
 * token), but all three are specified in Figma as Cardo Bold 64/120 —
 * H1 scale, not the smaller size an h2 tag would suggest (verified
 * directly against Figma nodes 1:54, 17:52, and 1:100 respectively).
 * Each now sets its own font-size (var(--wp--preset--font-size--display)
 * — the same fluid/responsive token already used for the H1, so these
 * scale the same way across breakpoints instead of becoming a fixed
 * pixel size) and line-height (1.2, matching Figma's documented 64/120
 * and theme.json's own heading line-height) for the same reason: a
 * plain tag selector can't win a specificity fight against Kadence's
 * plain tag selector once Kadence loads later, no matter what the
 * "correct" value is.
 *
 * The Hero h1 (.aca-hero__heading) was WRONGLY assumed at the time of
 * that fix to already be correct via theme.json's h1-specific rule, on
 * the theory that Kadence only hardcoded a shared h1-h6 rule. It
 * doesn't just do that — Kadence's base CSS also hardcodes a dedicated
 * `h1 { font-size: 32px; line-height: 1.5; }`, tied specificity with
 * theme.json's own h1 rule, loading later and winning, exactly like
 * every other case here. Confirmed via computed styles (not just
 * reading the CSS source) that the Hero heading was actually rendering
 * at 32px/48px instead of 64px/76.8px before this was caught. Same
 * fix as the others: font-size (var(--wp--preset--font-size--display))
 * and line-height (1.2) declared explicitly below, matching Figma node
 * 1:42's confirmed 64/120 spec.
 *
 * A fourth variant of the same underlying problem surfaced in the
 * Welcome row: `html body .aca-welcome__row` is (0,0,1,2) — one class,
 * two type selectors. Kadence's own `.single-content .wp-block-columns
 * { margin-bottom: var(--global-md-spacing); }` is (0,0,2,0) — two
 * classes, no type selectors. CSS specificity compares class-count (c)
 * before type-count (d), so Kadence's rule wins outright on c (2 vs 1)
 * regardless of d — confirmed live in DevTools' Computed panel, not
 * assumed. `html body` ancestors only defend against a *type-selector*
 * arms race (h1, p, etc.); they do nothing against a selector that
 * simply uses more classes. Every `.aca-welcome__row*`/`.aca-welcome__
 * image` selector below now also includes the element's own generic WP
 * block class (`.wp-block-columns`, `.wp-block-column`, `.wp-block-
 * image`) for exactly this reason — it costs nothing (the element
 * already carries that class) and raises c to 2, tying any
 * `.single-content .wp-block-*`-shaped Kadence default and winning on d
 * (html + body) instead.
 */

/* ---------------------------------------------------------------------
 * Shared: photography placeholders
 * ------------------------------------------------------------------- */

html body .aca-photo-placeholder {
	position: relative;
	margin: 0;
	overflow: hidden;
}

html body .aca-photo-placeholder img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* ---------------------------------------------------------------------
 * Hero
 * ------------------------------------------------------------------- */

/*
 * aspect-ratio matches Figma's actual Hero frame (node 1:40, file
 * eBOw6GfQzuFBs1gn9W0vDh): 1988.0001220703125 x 1017px — the trailing
 * .0001 is float-export noise, so this uses the clean 1988/1017 fraction
 * (differs from the exact figure in the 8th significant digit, i.e. not
 * at all). Applied unconditionally, with no breakpoint/media-query gate
 * and no separate min-height rule.
 *
 * That's deliberate, not an oversight: a block-level box with `aspect-
 * ratio` set and `height: auto` only uses the ratio as a *preferred*
 * size — if the content (padding + eyebrow + heading + subtext + button)
 * needs more height than the ratio implies, the browser still grows the
 * box to fit it, same as if aspect-ratio weren't there at all. Verified
 * this holds here, not assumed: rendered the real markup/CSS/webfonts
 * (Playwright, real Cardo font, and the H1's actual fluid font-size —
 * computed from WordPress core's own wp_get_typography_font_size_value()
 * algorithm against this theme's real settings, not guessed) at 20
 * widths from 320 to 1920px, before and after adding this rule. Below
 * ~900px the rendered height is byte-for-byte identical with or without
 * aspect-ratio (content need already exceeds the ratio's implied height,
 * so the ratio is a no-op there) — including the specific 320/375/480px
 * widths called out as previously tight: clearance between the Schedule
 * a Visit button and the wave curve measured at 21px/24px/29px in both
 * states, not 0px and not reduced by this change. Above ~900px the ratio
 * takes over smoothly (matches the ratio-implied height exactly from
 * 900px up to 1920px, where it lands at 982px, vs. this section's
 * previous auto height of 616px there) with no dip or discontinuity at
 * the crossover. No separate mobile handling needed as a result.
 */
html body .aca-hero {
	position: relative;
	aspect-ratio: 1988 / 1017;
	padding: clamp(4rem, 12vw, 8rem) clamp(1.5rem, 6vw, 5rem);
}

/*
 * Background layer only — this is what the wave clip-path is scoped to,
 * never the .aca-hero section itself, so the curve can't ever clip
 * .aca-hero__content (heading/subtext/button sit in their own stacking
 * context at z-index: 3, well above this layer's z-index: 1).
 *
 * Placeholder color and dark photo tint are combined into one
 * `background` value so both are carried by, and clipped with, this
 * single element. When real photography replaces the placeholder, swap
 * only the `background-color` line below for a `background-image: url(...)`
 * (keeping the same rgba() tint layer on top of it) — the clip-path
 * needs no changes at all.
 *
 * Shape: measured directly from the actual Figma hero background pixels
 * (file eBOw6GfQzuFBs1gn9W0vDh, node 9:27), not estimated from a
 * screenshot. That node is a single flattened raster image, not a
 * vector — the photo→white transition row was scanned at every pixel
 * column, lightly smoothed, and fit with cubic bezier segments (see
 * template-parts/site-header.php for the #aca-hero-wave path and the
 * full measurement methodology). The real curve: deepest at the left
 * edge itself (not an interior trough), a subtle bump-then-dip ripple
 * through the middle third, then a continuous rise to its shallowest
 * point at the right edge. Two earlier passes here — a hand-guessed
 * clip-path: polygon(), then a hand-tuned bezier — both assumed the low
 * point sat away from the left edge; that assumption was wrong, which
 * is exactly why this one was measured instead of eyeballed.
 *
 * clip-path references an SVG <clipPath> (#aca-hero-wave, defined once
 * in template-parts/site-header.php) built from real cubic bezier
 * curves rather than clip-path: polygon() — a polygon of straight-line
 * segments was tried first and, regardless of point count, read as
 * near-straight-diagonal on the long rise rather than a continuous arc.
 * The SVG path's clipPathUnits="objectBoundingBox" keeps every
 * coordinate a 0–1 fraction of this element's own box, so the curve
 * still scales proportionally at any viewport width or hero height —
 * nothing here is a fixed pixel value; verified at 1920/1024/480px.
 */
html body .aca-hero::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	background-image: linear-gradient(rgba(20, 20, 20, 0.4), rgba(20, 20, 20, 0.4)), url(/wp-content/uploads/2026/10/home-hero.jpg);
	background-color: var(--wp--preset--color--muted-text);
	background-size: cover;
	clip-path: url(#aca-hero-wave);
}

html body .aca-hero[data-placeholder-label]::after {
	content: attr(data-placeholder-label);
	position: absolute;
	top: 16px;
	left: 16px;
	z-index: 2;
	background-color: var(--wp--preset--color--black);
	color: var(--wp--preset--color--off-white);
	font-family: var(--wp--preset--font-family--roboto);
	font-size: 0.6875rem;
	font-weight: 500;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	padding: 0.25rem 0.5rem;
	border-radius: 3px;
}

html body .aca-hero__content {
	position: relative;
	z-index: 3;
	max-width: 46rem;
}

html body .aca-hero__heading {
	color: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--cardo);
	font-size: var(--wp--preset--font-size--display);
	line-height: 1.2;
	margin-top: 0.75rem;
}

html body .aca-hero__subtext {
	color: var(--wp--preset--color--warm-cream);
}

/*
 * Mobile only -- desktop's left-aligned eyebrow/heading/subtext/button
 * (against the section's own padding, no auto-centering) is correct and
 * untouched here. Below the 782px breakpoint (this codebase's standard
 * "mobile" cutoff -- see .aca-stats__grid/.aca-footer__grid below) the
 * design calls for all four centered instead. Scoped to
 * .aca-hero__content and its own descendants only, not the shared/base
 * .wp-block-buttons class, so no other section's button row is affected.
 *
 * The aspect-ratio removal on .aca-hero itself is a separate, unrelated
 * fix living in the same breakpoint: WebKit (Safari, and Chrome-on-iOS,
 * which is WebKit under the hood) has shipped multiple 2026 fixes for
 * aspect-ratio boxes not correctly growing past their ratio-derived
 * height to fit content that needs more room -- this section's own
 * eyebrow/heading/subtext/button stack is tall enough at mobile widths
 * to hit exactly that case, confirmed live on a real iPhone: the box
 * locks to its pure aspect-ratio height with no growth, and the
 * subtext/button render below the box's actual bottom edge, overlapping
 * the next section. `min-height: min-content` (an earlier attempt at a
 * single-property fix) was proven NOT to be a safe substitute here --
 * on Blink it takes an entirely different sizing code path than the
 * plain `aspect-ratio` + implicit `min-height: auto` that already works
 * correctly there, and collapses the box back down to the same broken
 * pure-ratio height, reproducing this exact bug on Chrome too. Dropping
 * aspect-ratio outright below this breakpoint sidesteps the whole
 * cross-engine ambiguity: with no ratio to reconcile against, ordinary
 * block-flow content sizing (which every engine gets right) is all
 * that's left. .aca-hero::before (the background/curve layer) needs no
 * matching change -- it's `position: absolute; inset: 0` against
 * .aca-hero, so it already fills whatever height results, and its
 * `background-size: cover` already adapts to any box height; the
 * #aca-hero-wave clip-path is objectBoundingBox-scoped so it re-scales
 * with the box rather than breaking. Above 782px the ratio is restored
 * unchanged -- desktop was never part of this bug.
 */
@media (max-width: 782px) {
	html body .aca-hero {
		aspect-ratio: auto;
	}

	html body .aca-hero__content {
		text-align: center;
	}

	html body .aca-hero__content .wp-block-buttons {
		justify-content: center;
	}
}

/* ---------------------------------------------------------------------
 * Welcome / Cause
 * ------------------------------------------------------------------- */

/*
 * The Welcome row's original bottom margin (13.925rem / 222.8px, measured
 * Welcome image bottom to stats bar top -- see the comment on
 * .aca-welcome__row below). Pulled into a custom property so the Video
 * feature section, when it sits between Welcome and the stats bar, can
 * reuse the literal same value as its bottom padding instead of a second
 * copy of the number.
 */
html body {
	--aca-welcome-stats-gap: 13.925rem;
}

html body .aca-welcome__heading {
	font-family: var(--wp--preset--font-family--cardo);
	font-size: var(--wp--preset--font-size--display);
	line-height: 1.2;
	margin-bottom: 1.25rem;
}

html body .aca-welcome__heading .aca-welcome__heading-accent {
	color: var(--wp--preset--color--mustard-gold);
	display: block;
}

html body .aca-welcome__text {
	color: var(--wp--preset--color--muted-text);
	max-width: 42rem;
}

/*
 * margin-top/margin-bottom and the image's own size below were
 * originally measured against node 10:30 ("ArchwayStudent 1")'s reported
 * bounding box (x 859, y 1156, 655x818) — which turned out to be stale:
 * compositing that node's own exported bitmap against the "Section
 * Cause" text node (1:53) at their reported coordinates puts the text
 * block directly on top of the photo, which isn't what the file actually
 * renders. The real geometry (image, and by extension these two margins)
 * was instead measured directly off four independently-rendered
 * composites of the whole page — pixel-scanning for the photo/white-
 * background edge, the same technique already used for the Hero wave
 * curve — consistent across all four to within ~1px: the image actually
 * renders at 456x745, top edge at y≈1180, bottom edge at y≈1925. text
 * node 1:53's own reported position (x 905) was independently
 * corroborated by that same pixel scan (measured text start ≈903), so
 * unlike the image node, its numbers are trusted as-is.
 *   - margin-top 57.3px = Hero frame's bottom edge (node 1:40, y 106 +
 *     height 1017 = 1123) to the Welcome image's measured top (≈1180).
 *   - margin-bottom 222.8px = the Welcome image's measured bottom (≈1925)
 *     to the stats bar background's top edge (node 1:82 "Section Urgent
 *     Cause", y 2148).
 * Neither value lines up with this theme's generated spacing-preset
 * scale (settings.spacing.spacingScale in theme.json: steps 20-80 work
 * out to 7/10.7/16/24/36/54/81px via WordPress core's own
 * compute_spacing_sizes() algorithm — checked against the real formula,
 * not assumed), and no rule anywhere else in this codebase references
 * `--wp--preset--spacing--*` either, so introducing that token here
 * would be a new pattern, not an existing one. Plain rem values instead,
 * matching how .aca-welcome__image's own aspect-ratio below is already a
 * flat measured value rather than a fluid one.
 *
 * gap 146.5px is the same pixel-measured methodology: the space between
 * the image's measured right edge (≈758) and the text column's left
 * edge (905), at the same 1920px reference width as every other value
 * here.
 *
 * padding-inline is new: this row had no horizontal inset at all, so it
 * sat flush against the true browser edge while every other section
 * (Hero, stats, etc.) has one — the same missing-is-layout-constrained
 * problem already identified for this row's width behavior, just on the
 * left/right axis instead of growth. Rather than invent a separate
 * value, this reuses .aca-hero's own padding formula verbatim
 * (clamp(1.5rem, 6vw, 5rem)) so the two sections' content edges are
 * driven by the literal same rule, not two numbers that happen to
 * match today. Confirmed via rendered left-edge measurement at seven
 * widths (375-1920px) that .aca-hero__content and this row now align
 * exactly at every one, not just visually close.
 */
html body .aca-welcome__row.wp-block-columns {
	/*
	 * !important: WordPress core itself ships
	 * `.wp-block-columns { align-items: normal !important; }`, which beats
	 * ANY non-important rule outright regardless of specificity -- the
	 * specificity bump from appending .wp-block-columns above was never
	 * enough on its own for this specific property, only for the
	 * Kadence-vs-class-count issue it was originally added for. align-items:
	 * normal resolves to stretch on a flex row, so without this the row
	 * stretches to its tallest child and the (non-stretching) text column
	 * just sits at the top of that taller box -- confirmed as the real
	 * mechanism via the identical, actually-reported bug on
	 * .aca-diff-row.wp-block-columns below, not assumed here.
	 */
	align-items: center !important;
	gap: clamp(2rem, 7.63vw, 9.15625rem);
	margin-top: 3.58125rem;
	margin-bottom: var(--aca-welcome-stats-gap);
	padding-inline: clamp(1.5rem, 6vw, 5rem);
}

/*
 * flex-basis was previously a percentage (33.65%/66.35%, matching the
 * measured 456:900 ratio). That grows with the viewport, which is wrong
 * here: this row's wrapping `wp:group {"layout":{"type":"constrained"}}`
 * never actually gets a max-width on the front end (WP's real
 * constrained-layout CSS is keyed to an `is-layout-constrained` class
 * that only the block *editor* adds at save time — this pattern's HTML
 * is hand-authored, so that class, and the width rule tied to it, are
 * both simply absent; confirmed by grepping this file's own output for
 * that class, not assumed). With no ceiling above it, a percentage-based
 * image column grows without bound as the viewport widens — which is
 * exactly the "image dominates the page" symptom, at a wider absolute
 * size than the 456px it was fixed at, not just the wrong ratio.
 *
 * flex-grow: 0 with a fixed flex-basis keeps the image at its real
 * measured 456px at any container width at or above roughly 602px
 * (456px image + the row's own gap), full stop — it never grows past
 * that regardless of viewport. flex-shrink: 1 still lets it shrink
 * below 456px on narrower containers, same as before. The text column's
 * flex-grow: 1 absorbs whatever space the image column doesn't use, and
 * .aca-welcome__text's own max-width: 42rem below already stops the
 * paragraph itself from stretching past a readable line length, so that
 * absorbed space becomes whitespace, not a wider paragraph.
 */
html body .aca-welcome__row-image.wp-block-column {
	flex: 0 1 456px;
}

html body .aca-welcome__row-text.wp-block-column {
	flex: 1 1 0%;
}

/*
 * border-radius is a flat 228px (456 / 2), not a percentage or a calc()
 * tied to the element's current width — deliberately, and only correct
 * because of the flex-basis fix above. Per the CSS border-radius spec,
 * when a box's two same-edge corner radii would sum to more than that
 * edge's current length, both are scaled down proportionally until they
 * exactly fit — so at any width at or below 456px, the browser itself
 * reduces 228px+228px down to exactly half of whatever the current
 * width actually is, with no extra CSS needed. That auto-scaling is what
 * broke before: the image's old percentage width could exceed 456px, and
 * above that width 228px is LESS than half the current width, so the
 * corners stopped meeting at the top-center and the arch flattened.
 * Confirmed directly (not assumed) via Playwright's computed
 * border-top-left-radius at several rendered widths, both below and at
 * this element's 456px ceiling — getComputedStyle() reports the
 * authored 228px/228px at every width since that resolution happens at
 * paint time, not in computed style, so this was checked visually
 * (rendered screenshots), not by reading computed values.
 *
 * max-width: 456px here too, as a backstop independent of the flex fix
 * on .aca-welcome__row-image above: below the mobile breakpoint where
 * core's wp:columns block stacks columns (flex-basis: 100%), this figure
 * would otherwise still be free to render wider than 456px on any
 * viewport wider than that — mobile *stacked* still means "one
 * full-width column," and viewports well past 456px exist above that
 * breakpoint too (e.g. a tablet just under it).
 */
html body .aca-welcome__image.wp-block-image {
	border-radius: 228px 228px 0 0;
	aspect-ratio: 456 / 745;
	max-width: 456px;
}

/* ---------------------------------------------------------------------
 * Video feature (editor-inserted group between Welcome and Stats)
 * ------------------------------------------------------------------- */

/*
 * When the Video feature group directly follows the Welcome group, the
 * Welcome row's 222.8px bottom margin no longer separates Welcome from the
 * stats bar -- it separates Welcome from the video. Shrink it to a normal
 * section gap here only; the selector needs the adjacent .aca-video-feature
 * to match, so Welcome is unchanged on any page without it.
 * --wp--preset--spacing--80 is the largest step of theme.json's spacing
 * scale (5.0625rem / 81px). Specificity (0,3,2) -- :has() counts as its
 * argument's one class -- beats the base
 * .aca-welcome__row.wp-block-columns rule (0,2,2) and Kadence's
 * .single-content .wp-block-columns (0,2,0).
 */
html body .wp-block-group:has(+ .aca-video-feature) > .aca-welcome__row {
	margin-bottom: var(--wp--preset--spacing--80);
}

/*
 * The 222.8px that used to sit between Welcome and the stats bar moves to
 * the bottom of this section, so video-to-stats matches the original
 * Welcome-to-stats rhythm. Same custom property as .aca-welcome__row.
 */
html body .aca-video-feature.wp-block-group {
	padding-bottom: var(--aca-welcome-stats-gap);
}

/*
 * Below the 782px columns breakpoint (same 781px max-width query used
 * elsewhere in this file) the flat 222.8px is far too tall for a phone.
 * Scale it with the viewport instead: 64px floor, 15vw in between (~117px
 * at 781px), never above the desktop value. Desktop (782px+) keeps the
 * full --aca-welcome-stats-gap above.
 */
@media (max-width: 781px) {
	html body .aca-video-feature.wp-block-group {
		padding-bottom: clamp(4rem, 15vw, var(--aca-welcome-stats-gap));
	}
}

/*
 * Same section-H2 values as .aca-differentiators__heading (and
 * .aca-welcome__heading / .aca-find-way__heading). Those three are separate
 * rules, not a shared selector list, so the values are repeated here.
 *
 * font-size is the same fluid --wp--preset--font-size--display token the
 * differentiators heading uses (theme.json fluid: true, wideSize 1920px, so
 * WP generates clamp(35.2px, 2.2rem + ((1vw - 3.2px) * 1.8), 64px) -- 64px
 * only at 1920px and up), so both headings scale together at every width.
 *
 * margin-top: 0 -- the eyebrow above already carries margin-bottom 32px,
 * and the generic h2 top margin (96px live, = 1.5em at 64px) was winning
 * the margin collapse. (0,2,2) beats those (0,1,1) content-heading rules.
 */
html body .aca-video-feature__heading.wp-block-heading {
	font-family: var(--wp--preset--font-family--cardo);
	font-size: var(--wp--preset--font-size--display);
	line-height: 1.2;
	text-align: center;
	margin-top: 0;
}

/* Full width of the group's content box, scaling down with it on mobile. */
html body .aca-video-feature .wp-block-video {
	width: 100%;
	max-width: 100%;
}

html body .aca-video-feature .wp-block-video video {
	display: block;
	width: 100%;
	max-width: 100%;
	height: auto;
}

/* ---------------------------------------------------------------------
 * Stats bar
 * ------------------------------------------------------------------- */

/*
 * .wp-block-group appended: this section's own outer element is
 * `<section class="wp-block-group alignfull aca-stats">`, carrying the
 * same generic WP block class this file's top comment now warns about
 * (a class-count specificity loss to a Kadence `.single-content
 * .wp-block-*` default, distinct from the html-body type-selector
 * defense). Not confirmed to be an active conflict on the live site the
 * way .aca-welcome__row's was — applied proactively since the exposure
 * itself is real and the fix costs nothing.
 */
/*
 * border-top/bottom: confirmed via Figma nodes 18:1950/18:1952 ("Rectangle
 * 74"/"Rectangle 75"), two 1920px-wide, 4px-tall mustard-gold rectangles
 * sitting at this section's own top and bottom edges. Decorative only,
 * new scope this batch -- not a fix to an existing regression.
 *
 * padding-top/bottom 107px/127px (6.6875rem/7.9375rem): previously an
 * unmeasured clamp(2.5rem, 5vw, 3.5rem), which landed the live section at
 * ~202px tall against Figma's real 324px. Measured directly from plain
 * rectangle/ellipse nodes, not text -- node 1:82's own top/bottom (y 2148,
 * height 324) against icon circle node 16:9's top/bottom (y 2255, height
 * 90) -- so unlike the differentiators heading gap, there's no text
 * leading to correct for here; the raw metadata delta is the real value:
 * 2255-2148=107 top, (2148+324)-(2255+90)=127 bottom. 107+90+127=324,
 * matching node 1:82's real height exactly. Fixed values, not a clamp,
 * since the icon circle they wrap is itself a fixed 90px at every width
 * (.aca-stats__icon below), the same reasoning already used for the
 * differentiators numeral/row measurements.
 */
html body .aca-stats.wp-block-group {
	position: relative;
	background-color: var(--wp--preset--color--wine);
	padding: 6.6875rem clamp(1.5rem, 6vw, 5rem) 7.9375rem;
	border-top: 4px solid var(--wp--preset--color--mustard-gold);
	border-bottom: 4px solid var(--wp--preset--color--mustard-gold);
}

/*
 * Background layer only -- same architecture as .aca-hero::before: kept
 * off .aca-stats itself so the opacity only fades the decorative
 * texture, not the wine background color or the content on top of it.
 *
 * Confirmed via Figma node 12:35 ("Rectangle 75", same position/size as
 * the section's own background rect 1:82): a repeating cross/quatrefoil
 * texture, authored in Figma at ~10% opacity. Asset
 * (assets/stats-bar-pattern.png) is exported at exactly 1920x324 -- the
 * section's own real Figma dimensions -- confirming Figma's scaleMode:
 * CROP means "fill the section," not "tile a small swatch," so this
 * isn't a `repeat` tile.
 *
 * background-size: cover, not 100% 100% -- that stretched each axis
 * independently to fill the box, which only looks right at the box's
 * original 1920x324 proportions. At narrower widths where the stats
 * grid wraps to 2x2, the section gets much taller relative to its
 * width, and the independent-axis stretch visibly squeezed/elongated
 * the pattern's crosses out of proportion -- confirmed via real
 * screenshots at the wrapped width, not assumed from the mechanism
 * alone. cover scales the image uniformly on both axes and crops
 * whatever overflows, keeping the crosses correctly shaped at any
 * width -- the right tradeoff for a subtle, repeating-looking texture
 * where losing a bit at the edges is unnoticeable but a warped shape
 * isn't.
 *
 * opacity 0.3, not Figma's literal 0.1: a deliberate client-directed
 * deviation, not a measurement. This value has moved twice before
 * landing here, and both earlier moves were methodology mistakes worth
 * recording so they don't repeat:
 *   1. The first pass (0.3) was tuned against a broken export of this
 *      asset with a solid white background instead of a transparent
 *      one, so the whole layer faded in uniformly rather than showing
 *      texture -- 0.3 was only needed to make anything visible at all
 *      against THAT file.
 *   2. After the file was corrected to a real transparent background,
 *      a second pass dropped this to 0.15 based on zoomed, upscaled
 *      screenshot crops, which made the subtle per-pixel contrast look
 *      far more visible than it actually is at real, un-zoomed viewing
 *      scale -- confirmed genuinely near-invisible on the live page,
 *      and reproduced here too once re-checked at native (unscaled)
 *      screenshot resolution instead of a magnified crop.
 * Re-tested a third time at native resolution against the confirmed
 * true background-color (rgb(106, 7, 16) / #6A0710, verified via
 * getComputedStyle and a direct pixel sample of the rendered
 * screenshot, not assumed): 0.15-0.2 reads as flat red at normal
 * viewing distance, 0.3 is where the texture is reliably visible
 * without magnification, 0.5+ starts to compete with the wine red.
 */
html body .aca-stats::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	background-image: url(../stats-bar-pattern.png);
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
	opacity: 0.3;
	pointer-events: none;
}

html body .aca-stats__grid {
	position: relative;
	z-index: 1;
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 2rem;
}

html body .aca-stats__item {
	display: flex;
	align-items: center;
	gap: 1.25rem;
	flex: 1 1 200px;
}

html body .aca-stats__icon {
	flex: none;
	width: 90px;
	height: 90px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--warm-cream);
	display: flex;
	align-items: center;
	justify-content: center;
}

/*
 * svg (Newman Guide's star, still hand-drawn -- no real Figma asset
 * exists for it, see the note in aquinas_child_register_stats_pattern())
 * stays at its own placeholder size. img (the other three, now real
 * exported Figma assets) is sized via width/height attributes matching
 * each icon's own real Figma footprint (80px/82px/82px -- AquinasIcons_
 * Student/Alumni/Priest, file eBOw6GfQzuFBs1gn9W0vDh) set directly on
 * each <img> tag rather than forced to one shared number here, so this
 * rule only needs to keep them block-level (avoids inline-image
 * baseline whitespace inside the flex-centered circle). The real icons
 * are exported pre-colored black, not wine -- confirmed by sampling the
 * exported PNGs' opaque pixels (0,0,0) directly, not assumed -- so
 * unlike the svg they carry no `fill` override here; recoloring them
 * would depart from what Figma actually exported.
 */
html body .aca-stats__icon svg {
	width: 42px;
	height: 42px;
	fill: var(--wp--preset--color--wine);
}

html body .aca-stats__icon img {
	display: block;
}

html body .aca-stats__number {
	color: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--cardo);
	font-weight: 700;
	font-size: clamp(2.25rem, 4vw, 3rem);
	line-height: 1.1;
	margin: 0;
}

html body .aca-stats__label {
	color: var(--wp--preset--color--off-white);
	font-family: var(--wp--preset--font-family--roboto);
	font-size: 1.125rem;
	margin: 0;
}

/* ---------------------------------------------------------------------
 * What Makes Aquinas Different
 * ------------------------------------------------------------------- */

/*
 * margin-top 7rem (112px) is measured directly from Figma: the stats
 * bar background's bottom edge (node 1:82 "Section Urgent Cause", y
 * 2148 + height 324 = 2472) to this heading's own top edge (node 17:52,
 * y 2584). Both are plain rectangle/text node coordinates, not a raster
 * fill like the Welcome image's node was, so there's no reason to
 * distrust these the way that one turned out to need pixel-scanning.
 *
 * .wp-block-heading appended for the same reason as .aca-stats above:
 * this element is `<h2 class="wp-block-heading aca-differentiators__
 * heading">`, so it carries the exact class this codebase has a
 * confirmed real bug with elsewhere (.aca-welcome__row losing to
 * `.single-content .wp-block-columns` on class-count). Applied
 * proactively, not because this specific rule was seen failing live.
 */
/*
 * margin-bottom was a flat 12rem (192px), reasoned at the time from a
 * pixel-scanned Figma measurement at the 1920px reference width (see git
 * history). Live review confirmed that fixed value reads as an
 * oversized gap at BOTH breakpoints, not a mobile-only symptom -- flat
 * rem values don't scale down with the viewport the way this section's
 * other spacing (padding-inline, row gaps) already does via clamp(), so
 * the same 192px gap that's merely generous on desktop dominates a
 * mobile viewport's far shorter vertical space. Replaced with a
 * responsive clamp() so both breakpoints shrink accordingly: floor
 * 3.5rem/56px (well below the old fixed value at any width), scaling
 * via 8vw, ceiling 9rem/144px on desktop -- brought roughly in line
 * with this same section's row-to-row gaps just below (7.6875rem/
 * 8.3125rem/10rem), rather than sitting well above all of them as the
 * old flat 192px did.
 */
html body .aca-differentiators__heading.wp-block-heading {
	font-family: var(--wp--preset--font-family--cardo);
	font-size: var(--wp--preset--font-size--display);
	line-height: 1.2;
	text-align: center;
	margin-top: 7rem;
	margin-bottom: clamp(3.5rem, 8vw, 9rem);
}

/*
 * padding-inline brought in scope this batch: previously flagged as an
 * out-of-scope, section-wide fix while addressing the numeral's own
 * offset. This section's outer `wp:group {"layout":{"type":"constrained"}}`
 * is inert on the front end for the same reason .aca-welcome__row's was
 * before that fix -- the `is-layout-constrained` class it needs is only
 * added by the block editor at save time, and this pattern's HTML is
 * hand-authored -- so without this rule the section sits flush against
 * the true browser edge with no inset at all. Reuses Hero's own padding
 * formula verbatim (clamp(1.5rem, 6vw, 5rem)), the same value already
 * applied to .aca-welcome__row for the identical reason, so the section's
 * content edges line up with every other section rather than introducing
 * a second number that happens to match today.
 *
 * This is also the real fix for the per-row heading wrapping to two
 * lines: the text column was narrower than Figma's box only because this
 * section had zero horizontal inset while Figma's did, not because the
 * heading itself needs text-align or a size change -- confirmed Figma
 * shows the headings as left-aligned, single-line, no text-center class,
 * exactly as already coded.
 */
html body .aca-differentiators.wp-block-group {
	padding-inline: clamp(1.5rem, 6vw, 5rem);
}

html body .aca-differentiators__heading .aca-differentiators__heading-accent {
	color: var(--wp--preset--color--mustard-gold);
}

/* .wp-block-columns appended -- same exposure as .aca-welcome__row, this
 * element is `<div class="wp-block-columns aca-diff-row">`. The existing
 * !important on margin-bottom already wins regardless of specificity, so
 * it's left alone; the class is added so position (and anything added
 * here later) gets the same protection without relying on !important
 * everywhere.
 *
 * align-items: stretch needs its own !important for a DIFFERENT reason
 * than the class-count issue above: WordPress core ships
 * `.wp-block-columns { align-items: normal !important; }`, which wins
 * outright over any non-important rule regardless of specificity, so no
 * specificity trick beats it -- only a matching !important does. This
 * was previously set to `center`, fixing the immediate symptom (numeral/
 * heading/body sitting at the top of the row instead of against the
 * image) but centering the wrong box: the numeral's real Figma bounding
 * box is IDENTICAL to its paired image's (same top edge, same 372px
 * height), so the text column needs to STRETCH to the row's full height
 * -- matching the image -- not shrink-wrap to its own content and center
 * that smaller box. See .aca-diff-row__text below for how the numeral
 * and heading are positioned within that now-stretched column.
 */
html body .aca-diff-row.wp-block-columns {
	position: relative;
	align-items: stretch !important;
	margin-bottom: clamp(2rem, 5vw, 3.5rem) !important;
}

/*
 * Real row-to-row gaps, measured in Figma from each row's own
 * numeral/image top+height (the two share identical top/height values
 * within a row, so either reference point gives the same row-bottom):
 * 123px between row 1 and row 2, 133px between row 2 and row 3. This is
 * separate from, and doesn't touch, the within-row numeral-to-heading
 * offset (156px top / 180px left gap, set on .aca-diff-row__number and
 * .aca-diff-row__text above) -- that's the gap between the numeral and
 * its own row's heading; this is the gap between one row's content and
 * the next row's. :nth-of-type is used instead of a shared value because
 * the three real gaps differ from each other.
 *
 * Row 3's own margin-bottom (the space before the accreditation logos)
 * is now measured too: raw metadata gives row 3's bottom (17:44/17:47,
 * y 3822 + height 372 = 4194) to the accreditation group's top (18:1958,
 * y 4352) as 158px, and unlike the heading-to-row-1 gap above, pixel-
 * scanning an actual Figma screenshot confirms this one directly -- both
 * sides here are image/vector nodes, not auto-height text, so there's no
 * hidden leading to correct for. ~160px (10rem) is used as the clean
 * rem-equivalent of the ~158-166px raw/pixel-measured range.
 */
html body .aca-diff-row.wp-block-columns:nth-of-type(1) {
	margin-bottom: 7.6875rem !important;
}

html body .aca-diff-row.wp-block-columns:nth-of-type(2) {
	margin-bottom: 8.3125rem !important;
}

html body .aca-diff-row.wp-block-columns:nth-of-type(3) {
	margin-bottom: 10rem !important;
}

/* .wp-block-image appended -- this figure is `<figure class="wp-block-image
 * size-full aca-photo-placeholder aca-diff-row__image">`. */
html body .aca-diff-row__image.wp-block-image {
	border-radius: 36px;
	aspect-ratio: 583 / 372;
}

/*
 * .wp-block-group appended -- this is `<div class="wp-block-group
 * aca-diff-row__text">`.
 *
 * height: 100% makes this box fill its parent .wp-block-column, which
 * itself now stretches to the row's full height (align-items: stretch
 * above) -- i.e. the same height as the paired image, confirmed
 * identical in Figma. Percentage heights resolve correctly here because
 * a stretched flex item has a definite used height for descendants to
 * size against, not an auto one.
 *
 * padding-left 11.25rem (180px) insets the heading/body from this
 * column's own edge to reproduce the real gap between the numeral and
 * the heading in Figma -- see the full measurement in the comment on
 * .aca-diff-row__number below. It does NOT affect the numeral's own
 * position: an absolutely-positioned child's `left` offset is measured
 * from the parent's padding-box edge (its outer edge, same as the
 * border-box when there's no border), not the padding-adjusted content
 * edge -- confirmed directly with an isolated test (a padded parent
 * plus an absolute left:0 child landed the child at the parent's own
 * unpadded edge), not assumed. That's what lets the numeral sit flush
 * at this column's true start while the padding still pushes the
 * heading/body in.
 *
 * padding-top 9.75rem (156px) is the same mechanism on the vertical
 * axis: the numeral is pinned to top: 0 of this box (see
 * .aca-diff-row__number below), matching the image's own top edge, and
 * this padding-top pushes the heading/body down by the same 156px that
 * used to be encoded as the numeral's own negative top offset -- the
 * math is unchanged, only which box it's anchored to.
 */
html body .aca-diff-row__text.wp-block-group {
	position: relative;
	height: 100%;
	padding-left: 11.25rem;
	padding-top: 9.75rem;
}

/*
 * Numeral-behind-text overlap: confirmed real via Figma's own node
 * positions, not a bug to remove.
 *
 * top: 0, NOT the numeral-top-to-heading-top offset. Confirmed directly
 * in Figma: the numeral's bounding box is IDENTICAL to its paired
 * image's -- same top edge, same 372px height (e.g. row 1: both node
 * 3:91 and its image rect start at y 2822, both 372px tall) -- so the
 * numeral is meant to span the same vertical range as the image, not
 * sit as its own auto-height group offset above the heading. With
 * .aca-diff-row__text now stretched to the row's full height (matching
 * the image -- see that rule above) and this numeral positioned
 * relative to it, top: 0 puts the numeral flush with the image's own
 * top edge on every row. The 156px numeral-to-heading offset (nodes
 * 3:91/3:92, 17:48/17:49, 17:44/17:45, the same fixed constant as
 * before) is now expressed as padding-top on .aca-diff-row__text
 * instead, pushing the heading/body down from that same shared top
 * edge -- the math is unchanged, only which box it's anchored to.
 *
 * left: 0, NOT an offset relative to the heading. The numeral's real
 * absolute position in Figma is ~314px for the text-left rows (01, 03)
 * and ~992px for the text-right row (02) -- both match the column-start
 * convention the opposite row's image uses for its own column (e.g.
 * row 2's image starts at x 313, almost identical to row 1/3's numeral
 * at x 314), not an offset from wherever the heading happens to sit.
 * left: 0 here (an absolutely-positioned child measures its offset from
 * the parent's padding-box edge, i.e. .aca-diff-row__text's own
 * unpadded edge -- see the comment on that rule above) puts the numeral
 * at this column's true start in exactly the same way regardless of
 * which physical side of the row the column is on, which is what
 * actually reproduces "same column-start convention" in code rather
 * than one specific pixel number.
 *
 * The gap this leaves between the numeral and the heading -- the
 * padding-left on .aca-diff-row__text -- is 184px/174px/68px on rows
 * 1/2/3 (heading-left minus numeral-left in Figma's own coordinates).
 * Rows 1 and 2 agree closely; row 3 doesn't (its heading wraps to two
 * lines, likely hand-nudged independently of the numeral). Using 180px,
 * representative of the two consistent rows, as one shared value rather
 * than encoding row 3's likely-incidental deviation.
 *
 * font-size 291px (18.1875rem) is confirmed via get_design_context
 * (which reports the authored value straight from the node) on node
 * 3:91, the "01" numeral. The task asked to confirm this is one
 * consistent value across all three rows rather than a per-row number;
 * 17:48 ("02") and 17:44 ("03") were not independently re-checked via
 * get_design_context in this pass, so this single value is applied to
 * all three on the strength of the 3:91 check plus the original design
 * intent (one shared numeral style), not because all three nodes were
 * individually confirmed -- worth a follow-up get_design_context call
 * on those two nodes once Figma access is available again. It was
 * previously an unverified clamp(5rem, 12vw, 9rem); opacity (0.5) and
 * color (warm-cream) were already correct.
 *
 * These are Figma's real relative numbers, faithfully reproduced --
 * but the ABSOLUTE page position this produces still won't match
 * Figma's ~314px/~992px exactly, because this section's own left/right
 * padding doesn't match Figma's real ~314px inset for this section (it
 * currently has no real padding constraint at all beyond whatever
 * generic default applies -- the differentiators section's `wp:group
 * {"layout":{"type":"constrained"}}` is inert on the front end for the
 * same reason .aca-welcome__row's was before that fix: the
 * `is-layout-constrained` class it needs is only added by the block
 * editor at save time, and this pattern's HTML is hand-authored).
 * Fixing that is a section-wide padding change, not a numeral-specific
 * one, so it's flagged here rather than folded into this fix.
 *
 * position: absolute + z-index: 0, with the heading/body given z-index: 1
 * of their own (rather than a negative z-index on the numeral alone,
 * which would otherwise be enough by itself: a positioned descendant
 * with a negative z-index paints below any normal in-flow sibling
 * within the same containing block). That simpler version is what was
 * tried first, and it's correct CSS, but it hit an actual rendering bug
 * in this environment's Chromium: with z-index: -1 specifically, at this
 * font-size, the "1" in "01" silently failed to paint at all (confirmed
 * via getBoundingClientRect/elementFromPoint that the glyph's own box
 * was there and correctly sized, it just never got drawn) — removing
 * only the negative z-index, nothing else, made it paint correctly
 * again. Rather than ship something that happened to break in testing,
 * this uses a non-negative z-index on the numeral and lets the heading/
 * body opt into a higher one instead, which produces the identical
 * visual stacking without tripping whatever that bug is.
 */
html body .aca-diff-row__number {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 0;
	font-family: var(--wp--preset--font-family--lora);
	font-weight: 700;
	font-size: 18.1875rem;
	color: var(--wp--preset--color--warm-cream);
	opacity: 0.5;
	line-height: 1;
	margin: 0;
}

/*
 * top needs no override here -- it's 0 at every width, same as desktop,
 * since the numeral always tracks its stretched box's own top edge
 * regardless of column width. font-size scales down with the same
 * factor .aca-diff-row__text's padding-top below now uses, keeping the
 * numeral-to-heading offset proportionate on a narrow column. left
 * needs no override either, for the same reason established previously:
 * checked directly via rendered getBoundingClientRect at 375px.
 *
 * .aca-diff-row__text's own padding-top halves along with font-size,
 * same proportion as desktop. padding-left does NOT simply halve to
 * 5.625rem (the naive equivalent) -- at this font-size a two-digit
 * numeral like "01" renders ~146px wide, confirmed by both
 * getBoundingClientRect and a pixel-level screenshot check, which found
 * the heading's own leading letter genuinely starting underneath the
 * numeral's stroke at 90px, not just a bounding-box artifact (the
 * equivalent desktop check found a real, clear gap there, so this is a
 * mobile-specific fix, not a revisit of the desktop numeral/heading
 * overlap, which is intentional and confirmed via Figma elsewhere in
 * this file). 10rem/160px clears the numeral's real ~146px width with a
 * small margin.
 */
@media (max-width: 599px) {
	html body .aca-diff-row__number {
		font-size: 9.09375rem;
	}

	html body .aca-diff-row__text.wp-block-group {
		padding-left: 10rem;
		padding-top: 4.875rem;
	}

	/*
	 * Equal spacing between all three stacked blocks -- overriding the
	 * three different desktop-measured nth-of-type margins (7.6875rem/
	 * 8.3125rem/10rem), which read as inconsistent once stacked into a
	 * single mobile column rather than three side-by-side desktop rows.
	 */
	html body .aca-diff-row.wp-block-columns:nth-of-type(1),
	html body .aca-diff-row.wp-block-columns:nth-of-type(2),
	html body .aca-diff-row.wp-block-columns:nth-of-type(3) {
		margin-bottom: 3rem !important;
	}
}

/*
 * Desktop's alternating image-left/image-right layout is achieved via
 * literal DOM source order (see the $first/$second swap in
 * aquinas_child_register_differentiators_pattern()), not a CSS
 * order/grid-area property -- "reverse" rows (02, 04, ...) put the image
 * column before their own text column. WP core's mobile column-stacking
 * rule (below 782px) preserves DOM order when it stacks columns, so those
 * rows rendered image-then-text once stacked. Pushing whichever column
 * holds the image to the end makes every stacked row read number/text
 * then image, regardless of row position or count (previously this was a
 * row-02-only nth-of-type rule, which missed row 04 on the Academics
 * page). Scoped to the stacking breakpoint only, so desktop's side-by-side
 * alternation (driven by that same DOM order) is unaffected.
 */
@media (max-width: 781px) {
	html body .aca-diff-row.wp-block-columns > .wp-block-column:has(.aca-diff-row__image) {
		order: 2;
	}
}

/*
 * .wp-block-heading appended -- `<h3 class="wp-block-heading
 * aca-diff-row__heading">`. position/z-index: see the comment on
 * .aca-diff-row__number above.
 *
 * text-align: center is a deliberate deviation from Figma, requested
 * directly by the client to match the already-centered body copy below
 * -- Figma itself confirms these headings (nodes 3:92/17:49/17:45) are
 * left-aligned, single-line text (textAlignHorizontal: LEFT), so this is
 * knowingly overriding the design file, not a bug fix.
 */
html body .aca-diff-row__heading.wp-block-heading {
	position: relative;
	z-index: 1;
	font-family: var(--wp--preset--font-family--lora);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--heading);
	line-height: 1.2;
	color: var(--wp--preset--color--black);
	text-align: center;
	margin: 0 0 0.75rem;
}

/*
 * text-align: center confirmed directly via get_design_context on node
 * 3:95 (the body paragraph), which reports a literal `text-center`
 * class on the node itself -- not inferred from a screenshot.
 * position/z-index: see the comment on .aca-diff-row__number above.
 *
 * margin: 0 was missing entirely -- unlike .aca-diff-row__heading just
 * above, which already zeroes its own margin-top explicitly, this rule
 * never set any margin at all. This <p> has no wp:paragraph block
 * comment wrapping it in block-patterns.php, so it doesn't pick up WP
 * core's block-library paragraph reset; without a theme-level `p`
 * reset covering it either, it was left to fall back to a default
 * margin (browser UA default is `margin: 1em 0`, sized against
 * whatever font-size it inherits) that this test harness never
 * reproduced. That default margin-top pushed the paragraph down below
 * its intended 156px-from-top position, extending this box past the
 * paired image's bottom edge on the live page. Zeroed here rather than
 * guessing at Kadence's actual default, since zero is correct
 * regardless of what that default turns out to be.
 */
html body .aca-diff-row__body {
	position: relative;
	z-index: 1;
	margin: 0;
	color: var(--wp--preset--color--muted-text);
	max-width: 26rem;
	text-align: center;
}

/*
 * gap 81px (5.0625rem) is measured directly from Figma: the ICLE logo's
 * right edge (node 18:1957 "icle_orig 1", x 590 + width 355 = 945) to
 * the NAPCIS logo's left edge (node 18:1956 "napcis-logo-scaled_orig 1",
 * x 1026). Previously an unmeasured clamp(2rem, 5vw, 4rem).
 *
 * align-items: center was already correct and is exactly why the two
 * logos should already level with each other -- the real bug was
 * .aca-accreditation__logo forcing both figures to the SAME aspect
 * ratio (320/84), when Figma shows they're genuinely different sizes:
 * ICLE is 355x98 (aspect 3.62), NAPCIS is 304x80 (aspect 3.8). Their
 * vertical centers, computed from Figma's own y+height/2, are IDENTICAL
 * (4401 for both) -- confirming they're meant to be center-aligned at
 * different heights, not forced to one shared box. See
 * .aca-accreditation__logo--icle/--napcis below for each one's own real
 * size; this shared rule now only carries what's actually common to both.
 */
html body .aca-accreditation {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 5.0625rem;
	margin-top: clamp(1.5rem, 4vw, 3rem);
}

/*
 * .wp-block-image appended on each variant below -- both logos are now
 * real exported assets (`<figure class="wp-block-image size-full
 * aca-accreditation__logo aca-accreditation__logo--{icle,napcis}">`), no
 * longer the gray-box placeholder, so the placeholder's fill color is
 * dropped -- both PNGs have their own transparent/white background and a
 * muted-text-colored box behind them would show through.
 *
 * margin-bottom: 0 -- confirmed via live DevTools computed styles (not
 * this file's own reconstruction, which never reproduced it): the ICLE
 * figure was carrying a stray 32px margin-bottom that the NAPCIS figure
 * didn't have (0px), a live-only asymmetry with no matching rule in
 * this file, source unconfirmed. align-items: center on .aca-accreditation
 * was never the problem -- it correctly centers each figure's own
 * margin box, so an unequal margin on just one side of just one figure
 * is exactly what shifts that figure's visual center relative to the
 * other's, the precise 16px (half of 32px) measured live. Zeroed on the
 * shared rule so neither figure can carry it regardless of where it
 * actually originates.
 */
html body .aca-accreditation__logo.wp-block-image {
	max-width: 100%;
	margin-bottom: 0;
}

html body .aca-accreditation__logo--icle.wp-block-image {
	width: 355px;
	aspect-ratio: 355 / 98;
}

html body .aca-accreditation__logo--napcis.wp-block-image {
	width: 304px;
	aspect-ratio: 304 / 80;
}

/* ---------------------------------------------------------------------
 * Find Your Way In
 * ------------------------------------------------------------------- */

/*
 * padding-bottom 13.375rem (214px), not the clamp() top padding still
 * uses: measured directly from Figma (card frames end at y 5592.5, the
 * CTA section starts at y 5807 -- a plain 214.5px gap between two
 * rectangle-ish nodes, no text-leading ambiguity to correct for) at the
 * 1920px reference width. The previous shared padding-block clamp
 * topped out at 5rem/80px here, well short. Confirmed via a rendered
 * measurement that this section's own bottom padding is the sole
 * contributor to the gap (the cards row and .aca-cta carry no margin of
 * their own on this edge), so padding-bottom alone closes it -- not
 * split into a separate margin-bottom on the cards row, since nothing
 * else needed isolating from it. padding-top keeps the original clamp,
 * untouched by this change.
 */
/*
 * padding-top 15.3125rem (245px), not the clamp() this used to share
 * with padding-bottom: measured directly from Figma (accreditation
 * logos' bottom edge, node 18:1957, to this section's heading top, node
 * 1:100) at the 1920px reference width. Confirmed via a rendered
 * measurement before changing this that padding-top was the sole
 * contributor to the gap (previously 80px, exactly matching the old
 * clamp's max) -- no hidden margin on the differentiators/accreditation
 * section below, or on the heading itself, same diagnostic step used
 * for the padding-bottom/CTA-gap fix earlier.
 */
/*
 * margin-bottom: 0 !important -- PR #71's margin-top: 0 on .aca-cta/
 * .aca-footer turned out not to be the real fix: confirmed live via
 * DevTools' Styles panel that the actual source is Kadence's own base
 * CSS, which includes .wp-block-group sections under .single-content
 * (this section and .aca-cta both match) in a broad selector list
 * setting `margin-top: 0; margin-bottom: var(--global-md-spacing);`
 * (32px). Margin collapsing takes the LARGER of two touching margins --
 * .aca-find-way's margin-bottom (32px) vs .aca-cta's margin-top (0px,
 * already correct either way) collapses to 32px, which is why zeroing
 * margin-top in PR #71 had no visible effect: it was never the
 * deciding property.
 *
 * !important is required, not optional here: Kadence's selector
 * (.single-content .wp-block-group, two classes) outranks this file's
 * usual `html body .aca-find-way` pattern (one class, two type
 * selectors) on class-count alone, the same class-count loss already
 * documented at the top of this file for .aca-welcome__row -- so a
 * same-specificity override would silently lose the same way PR #71's
 * margin-top fix did. Matches this file's own existing precedent for
 * beating a Kadence/WP-core default this way (e.g. .aca-diff-row.
 * wp-block-columns's align-items/margin-bottom !important rules).
 *
 * Scoped to .aca-find-way and .aca-cta only (see that rule for the
 * other half) -- Kadence's rule is broad enough to likely also affect
 * .aca-hero, .aca-stats, .aca-differentiators, and other top-level
 * sections the same way, but only these two have been confirmed as
 * bugs; .aca-footer is last in flow, already correct, and untouched.
 */
html body .aca-find-way {
	position: relative;
	overflow: hidden;
	padding-top: 15.3125rem;
	padding-bottom: 13.375rem;
	margin-bottom: 0 !important;
}

/*
 * Mobile only -- confirmed via live DevTools that this flat 245px/214px
 * padding (no clamp, unscaled by viewport) reads as a large empty gap
 * above the first arch card and below the last one at mobile widths;
 * desktop was not flagged and keeps the base rule above untouched. No
 * Figma mobile frame exists for this section, so there's no source
 * measurement to pull -- instead this reuses the actual reduction ratio
 * already established for the same category of fix elsewhere in this
 * file: .aca-differentiators__heading's margin-bottom (flat 192px,
 * oversized at every width) was replaced with a responsive clamp that
 * computes to 56px at mobile (390px) -- a reduction to 56/192 = 29.17%
 * of the original. Applying that same factor here: 245px × 0.2917 ≈
 * 71.5px (4.5rem) and 214px × 0.2917 ≈ 62.4px (3.9rem). 4.5rem/3.9rem
 * = 1.154, matching the original 245:214 = 1.145 ratio to within 1% --
 * preserving that asymmetry (top clears the curve/heading, bottom
 * transitions into the CTA section below) rather than picking two
 * independent numbers.
 */
@media (max-width: 782px) {
	html body .aca-find-way {
		padding-top: 4.5rem;
		padding-bottom: 3.9rem;
	}
}

/*
 * SECOND ATTEMPT at this divider -- see PR #63 (reverted in PR #66) for
 * the first. That version applied #aca-hero-wave's clip-path directly
 * to inset:0 (i.e. stretched to this section's own full, highly
 * variable height) via objectBoundingBox, the same technique Hero uses
 * for its own curve. That broke visibly on the live page at both
 * breakpoints: objectBoundingBox scales the path's x and y independently
 * to whatever box it's applied to, and this section's real aspect ratio
 * is nothing like Hero's -- Hero's own height is comparatively stable
 * (bounded by aspect-ratio at wide widths, modest text content at
 * narrow ones), while this section's height varies by roughly an order
 * of magnitude between breakpoints (one content row on desktop vs.
 * three stacked arch-card photos on mobile). Reusing the same
 * full-height-stretch technique here distorted the curve severely,
 * worse on mobile but visible on desktop too -- a structural mismatch,
 * not something a transform tweak could fix.
 *
 * Fix: split the curve out of the full-height stretch entirely. This
 * layer (::before) is now a FIXED-ASPECT band pinned to the very top of
 * the section -- width: 100%, aspect-ratio: 1988/1017 (Hero's own real
 * ratio, so the curve keeps Hero's true proportions always, regardless
 * of how tall this section gets) -- rather than inset: 0. The flat fill
 * for the rest of the section's variable-height area is a separate
 * layer below (::after).
 *
 * clip-path is #aca-hero-wave itself (defined once in template-parts/
 * site-header.php) -- the SAME asset Hero's own curve uses, not a
 * separate find-way-specific shape, per direct client request for
 * visual consistency with the header. transform: scaleY(-1) turns
 * Hero's own bottom-edge notch into a top-edge one for this section,
 * without touching the shared clipPath's own coordinates -- Hero's own
 * use of #aca-hero-wave, on its own differently-shaped box, is
 * unaffected by this section also referencing it.
 *
 * Because Hero's own box aspect ratio isn't perfectly stable across
 * breakpoints either (varies with content, same as noted above -- see
 * the diagnostic numbers in this project's own history), this
 * section's curve will look MORE consistent across breakpoints than
 * Hero's own curve does, and the two won't necessarily be pixel-twins
 * of each other at every width. That's expected: the goal is an
 * undistorted, graceful wave that never crowds this section's own
 * content, not a literal render-for-render match against whatever
 * Hero's curve happens to look like at that specific width.
 */
html body .aca-find-way::before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	aspect-ratio: 1988 / 1017;
	z-index: 0;
	background: var(--wp--preset--gradient--wine-gradient);
	clip-path: url(#aca-hero-wave);
	transform: scaleY(-1);
}

/*
 * Flat fill for the section's remaining height below the curve band
 * above -- needed because the band's own aspect-ratio height (~51.16%
 * of this section's width) falls well short of covering the section's
 * real content height at most widths, especially mobile (three stacked
 * arch-card photos push mobile height far past what the band alone
 * covers).
 *
 * top: 9.5vw, not 0 or a plain inset(0): after the ::before band's
 * scaleY(-1) flip, its own "kept" (wine-painted) region spans from a
 * per-x threshold down to its own bottom edge -- that threshold's worst
 * case (thinnest guaranteed-transparent slice, i.e. the deepest the
 * "should stay white" notch ever reaches) is 1 - 0.8226 = 0.1774 of the
 * BAND's own height (0.8226 being #aca-hero-wave's own shallowest
 * boundary value, at its x=1 edge -- see the path data on
 * #aca-hero-wave in template-parts/site-header.php). Converted to a
 * viewport-relative unit using the band's own aspect-ratio (band height
 * = element width / 1.955, and this alignfull section's width is
 * effectively 100vw): 0.1774 × (1017/1988) × 100vw ≈ 9.08vw. 9.5vw
 * keeps a small safety margin above that so this layer's own top edge
 * never starts inside the band's transparent notch (which would paint
 * wine over the "should stay white" area and hide the curve entirely),
 * while staying comfortably short of the band's own full height
 * (~51.16vw), so there's no gap between the two layers either --
 * confirmed the two layers share the exact same background value
 * (var(--wp--preset--gradient--wine-gradient), a horizontal 90deg
 * gradient with the color at any x independent of y), so even the
 * shared seam at 9.5vw is invisible regardless of exact pixel
 * alignment: both layers render an identical color at that x either
 * side of the seam.
 */
html body .aca-find-way::after {
	content: "";
	position: absolute;
	top: 9.5vw;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 0;
	background: var(--wp--preset--gradient--wine-gradient);
}

/*
 * .aca-find-way > .wp-block-group added alongside .aca-find-way__content:
 * confirmed via live DevTools that page 17's actual saved content
 * wrapper carries only `wp-block-group is-layout-constrained
 * wp-block-group-is-layout-constrained` -- no aca-find-way__content
 * class at all (that's a block-editor-saved instance from some earlier
 * point, not a fresh copy of the current pattern source, which is the
 * only place that class name still gets attached). Without this,
 * .aca-find-way__content's own position:relative + z-index:1 never
 * matched the real element, which fell back to some other still-
 * unidentified source for position:relative with no z-index override
 * (auto). At the shared position:relative/z-index:auto-or-0 stacking
 * tier .aca-find-way::before/::after both sit at, paint order follows
 * tree order -- and ::after, being last in the DOM by definition,
 * painted its solid wine-gradient fill directly over the real heading/
 * subtext/cards instead of behind them. The child-combinator selector
 * here targets the same element structurally (.aca-find-way's one
 * direct-child wp-block-group) regardless of which classes a given
 * saved copy of this content actually carries, so it doesn't depend on
 * identifying every possible class variant a page might have saved.
 */
html body .aca-find-way__content,
html body .aca-find-way > .wp-block-group {
	position: relative;
	z-index: 1;
}

/*
 * Figma's heading for this section is white, which only makes sense
 * against the wine background above — a previous pass rendered it in
 * black because that background color hadn't been wired up yet and
 * white-on-white would've been invisible. Now that .aca-find-way
 * actually carries the wine background, white is correct again.
 */
html body .aca-find-way__heading {
	font-family: var(--wp--preset--font-family--cardo);
	font-size: var(--wp--preset--font-size--display);
	line-height: 1.2;
	text-align: center;
	color: var(--wp--preset--color--white);
	margin-bottom: 0.75rem;
}

/*
 * New copy added to page 17 directly (client-approved, already in the
 * page content -- no markup change needed here). Confirmed via Figma
 * node 18:1945: ~18px gap from the heading's bottom to this element's
 * top, ~44px from this element's bottom to .aca-find-way__rule below.
 * margin-top: 1.125rem (18px) and margin-bottom: 2.75rem (44px) --
 * verified via a real rendered screenshot, not just the arithmetic,
 * since adjacent block margins collapse to their max rather than
 * summing: the heading's own margin-bottom (0.75rem/12px) is smaller
 * than this element's margin-top, and .aca-find-way__rule's margin-top
 * is 0, so in both cases this element's own margin is the larger of
 * the pair and wins the collapse outright -- confirmed the rendered
 * gaps land at exactly 18px/44px, not some collapsed-down smaller
 * value.
 */
html body .aca-find-way__subtext {
	font-family: var(--wp--preset--font-family--inter);
	font-size: 1rem;
	line-height: 1.5;
	text-align: center;
	color: var(--wp--preset--color--white);
	max-width: 32rem;
	margin: 1.125rem auto 2.75rem;
}

/*
 * margin-bottom 5.125rem (82px), not the clamp() this used to be:
 * measured from Figma (this rule, node 1:102, to the first card's top,
 * node 1:103) at the 1920px reference width. Confirmed via a rendered
 * measurement that this rule's own margin-bottom was already the sole
 * contributor (previously 56px, matching the old clamp's max exactly).
 */
html body .aca-find-way__rule {
	width: 100px;
	height: 3px;
	background-color: var(--wp--preset--color--mustard-gold);
	margin: 0 auto 5.125rem;
	border: 0;
}

/*
 * max-width: 370px: Figma confirms these cards are fixed-width, not a
 * flexible column stretching to fill available space -- all three are
 * exactly 370px with fixed 59px gaps between them (nodes 1:103, 17:59,
 * 17:67). Without this, the card (391.33px live, its column's width)
 * was wider than .aca-find-way__card-image below (capped at 370px in
 * an earlier pass) -- since the image is flush with the card's own
 * left edge, that 21px difference showed up as a visible white gap on
 * the right side of every arch, confirmed via live measurement.
 */
/*
 * --wp--style--block-gap: 0 -- the figure's own margin-bottom (zeroed
 * below) turned out NOT to be the cause of the doubled image-to-heading
 * gap: confirmed live that zeroing it had zero effect, the gap stayed
 * at exactly 64px. Real cause, per live inspection: this group carries
 * `is-layout-flow` at render time even though no "layout" attribute was
 * ever written into its saved block comment -- core/group resolves an
 * implicit default layout and computes its wrapper classes/styles from
 * that at render time, not just from what was literally saved. With
 * this theme's blockGap setting enabled (theme.json,
 * settings.spacing.blockGap: true), WordPress auto-injects
 * `margin-block-start: var(--wp--style--block-gap, <fallback>)` on
 * every child after the first inside a flow container -- here, that's
 * .aca-find-way__card-content, the second child after the image
 * figure. That margin is additive with, not collapsed into, this
 * element's own explicit 2rem (32px) padding-top, doubling the real
 * gap to 64px. This can't be overridden by targeting the generated
 * margin rule directly (it lives in a uniquely-classed, per-instance
 * inline style block this file has no stable selector for), but
 * setting the actual custom property to 0 on an ancestor makes every
 * var(--wp--style--block-gap, ...) reference inside it resolve to 0
 * regardless of which stylesheet declares the consuming rule, since
 * custom property values inherit through the cascade independently of
 * that.
 */
/*
 * align-items: stretch on the cards row (no distinguishing class of
 * its own in block-patterns.php, so scoped via the .aca-find-way
 * ancestor rather than adding a new class that already-inserted live
 * content wouldn't have) + height: 100% on the card itself: confirmed
 * via real measured heights that card 2 ("About Us") rendered 27.2px
 * taller than cards 0/1 because its subtext wraps to two lines while
 * theirs fits on one -- Figma's three card frames (nodes 1:103/17:59/
 * 17:67) are within 2px of each other, confirming uniform height is
 * the intent regardless of copy length. !important on align-items for
 * the same reason as every other `.wp-block-columns` in this file:
 * WordPress core ships `.wp-block-columns { align-items: normal
 * !important; }`, which wins over any non-important rule regardless of
 * specificity.
 */
html body .aca-find-way .wp-block-columns {
	align-items: stretch !important;
}

/*
 * background-color removed from here -- Figma's own fill data (not the
 * image geometry, already verified correct) shows the outer card
 * frame (node 1:103) has no fill at all; the white background exists
 * only on a separate rectangle (node 1:104) that starts exactly where
 * the image ends and covers only the bottom content area. There's no
 * white anywhere behind the image/arch region in the design -- outside
 * the curve there is meant to be the red section background showing
 * through. Painting off-white on this whole card meant any
 * imperfection at the arch's curve edge (ordinary anti-aliasing,
 * visible at extreme zoom) showed white bleeding through instead of
 * red. Moved to .aca-find-way__card-content below, matching Figma's
 * actual structure where only that lower rectangle carries the fill.
 */
html body .aca-find-way__card {
	max-width: 370px;
	height: 100%;
	--wp--style--block-gap: 0;
}

/*
 * Mobile only -- desktop's fixed 370px card width against its own
 * narrower column (already close to that width, per Figma) is untouched.
 * Below WP core's 782px column-stacking breakpoint each column becomes
 * 100% of the section's width, but this card's own max-width: 370px
 * above has no auto-centering of its own, so it hugged its column's
 * left edge with visible empty space on the right -- same root cause
 * (fixed pixel width, no mobile margin:0 auto) as PR #52's CTA/footer-
 * grid centering fix. margin-inline: auto centers it the same way.
 */
@media (max-width: 782px) {
	html body .aca-find-way__card {
		margin-inline: auto;
	}
}

/*
 * max-width: 370px, same fix pattern as .aca-welcome__image earlier in
 * this project: border-radius is a flat 185px, exactly half of Figma's
 * real 370px card-image width (node 1:112, matching its 370px-wide
 * card, node 1:103) -- the two top corner curves only meet to form a
 * clean semicircle at that exact width. Without a cap, this image was
 * confirmed via a rendered measurement to stretch to its full column
 * width (619px at the 1920px reference width, nearly double 370px),
 * leaving the fixed 185px radius well short of center and exposing
 * small flat/white corners where the card's own background shows
 * through -- CSS only ever shrinks a too-large border-radius to fit a
 * box, never grows one that's too small for a wider box, so a flat px
 * radius always needs a matching max-width cap, not a percentage.
 *
 * margin-bottom: 0 !important -- this rule already existed without
 * !important and still lost: confirmed live that this figure's
 * computed margin-bottom was still 32px despite it, meaning something
 * else was setting margin-bottom on THIS element directly (not
 * margin-top on its sibling, which the --wp--style--block-gap: 0 fix
 * on .aca-find-way__card above already confirmed fixed independently --
 * that element's own margin-top checked out at a correct 0px). Most
 * likely the same per-instance auto-generated block-gap style, just
 * applied as this element's margin-bottom rather than the next
 * element's margin-top depending on which WP version/code path
 * generated it. Rather than chase the exact competing selector, this
 * forces it with !important, the same approach already proven
 * elsewhere in this file against WordPress's own !important core
 * rules (see .aca-diff-row.wp-block-columns's align-items).
 */
html body .aca-find-way__card-image {
	border-radius: 185px 185px 0 0;
	aspect-ratio: 370 / 385;
	max-width: 370px;
	margin-bottom: 0 !important;
}

/*
 * background-color moved here from .aca-find-way__card -- see the
 * comment on that rule above. This is Figma's actual lower rectangle
 * (node 1:104), the only part of the card with an off-white fill.
 *
 * min-height: 264px -- "For Families" runs shorter since its
 * description is a single line, so without this its content box (and
 * the card as a whole, via .aca-find-way__card's own height: 100% +
 * the row's align-items: stretch) shrinks to match its own shorter
 * content instead of reserving the same space as the other two. This
 * gives every card the same white-box height regardless of how many
 * lines the description wraps to, rather than only stretching to
 * whichever card happens to be tallest for a given set of copy.
 *
 * Was 254px, calibrated from a 2-line measurement (32px padding-top +
 * 40px padding-bottom + content) at ~210px content width. At ~306px
 * content width, the same 2-line case ("About Us") actually needs
 * 258.086px -- overflowing the old minimum by ~4px, since a wider
 * column lets that description's line-wrap fall differently. Rather
 * than re-measure at every breakpoint, bumped to 264px: a ~6px buffer
 * above the highest real measurement so far, not a re-derivation.
 */
html body .aca-find-way__card-content {
	background-color: var(--wp--preset--color--off-white);
	padding: 2rem 2rem 2.5rem;
	min-height: 264px;
	display: flex;
	flex-direction: column;
}

/*
 * margin-top: auto pushes the button wrapper to sit flush against this
 * box's own bottom padding regardless of how many lines the
 * description above it wraps to -- rather than the button's vertical
 * position depending on content length. .aca-find-way__card-text's own
 * margin-bottom: 50px (confirmed against Figma, ~50.052px) is left
 * untouched and still does real work here: it's no longer the ONLY
 * thing producing the gap above the button, it's the FLOOR that gap
 * can't shrink below -- on a 1-line description, the extra space in
 * the 264px box gets absorbed above the button by this auto margin;
 * on a 2-line description that leaves less room, the 50px margin is
 * still there and the auto margin just contributes whatever's left
 * over (which can be ~0).
 */
html body .aca-find-way__card-content .wp-block-buttons {
	margin-top: auto;
}

/*
 * margin-bottom 0.1875rem (3px), not the previous 0.5rem (8px):
 * measured from Figma (nodes 1:109, 3:48) at the 1920px reference
 * width. Minor relative to the other three fixes in this section, but
 * included for full fidelity.
 */
html body .aca-find-way__card-heading {
	font-family: var(--wp--preset--font-family--cardo);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--label);
	color: var(--wp--preset--color--black);
	text-transform: uppercase;
	margin: 0 0 0.1875rem;
}

/*
 * margin-bottom 3.125rem (50px), not the previous 1.5rem (24px), about
 * half what Figma calls for: measured from Figma (nodes 1:109, 3:48,
 * subtext-bottom to the LEARN MORE button's top) at the 1920px
 * reference width.
 */
/*
 * font-family/font-size/line-height added -- this rule never set any
 * of the three, so it fell through to Kadence's own body-text default
 * (confirmed via live computed styles: the system-font fallback stack,
 * 17px/27.2px, not Inter 16px/24px) rather than this theme's own Inter
 * token. Not an enqueue problem -- Inter is correctly requested in the
 * Google Fonts URL in functions.php alongside Cardo/Lora/Roboto, and
 * theme.json's styles.typography.fontFamily already defaults the whole
 * site to it -- but that global default clearly isn't reaching this
 * element, the same class of Kadence-vs-unset-property issue already
 * documented at the top of this file for headings. Flat 1rem/1.5,
 * matching the sibling .aca-find-way__subtext rule added a few rounds
 * ago, rather than the fluid --wp--preset--font-size--body token.
 */
html body .aca-find-way__card-text {
	font-family: var(--wp--preset--font-family--inter);
	font-size: 1rem;
	line-height: 1.5;
	color: var(--wp--preset--color--muted-text);
	margin: 0 0 3.125rem;
}

/* ---------------------------------------------------------------------
 * CTA bar
 * ------------------------------------------------------------------- */

/*
 * margin-bottom: 0 !important -- superseded understanding, corrected
 * here: earlier passes on this rule (see git history) first zeroed
 * margin-bottom on the theory of an isolated stray per-instance value,
 * then separately zeroed margin-top on the theory of WordPress's
 * block-gap auto-injection -- neither was the real mechanism, which is
 * why the margin-top fix produced no visible live change. Confirmed
 * via live DevTools' Styles panel: the actual source is Kadence's own
 * base CSS, which includes .wp-block-group sections under
 * .single-content (this element and .aca-find-way both match) in a
 * broad selector list setting `margin-top: 0; margin-bottom:
 * var(--global-md-spacing);` (32px). Margin collapsing takes the
 * LARGER of two touching margins -- .aca-find-way's margin-bottom
 * (32px) vs this element's margin-top (0px, already correct either
 * way) collapses to 32px, and the same again against .aca-footer's
 * margin-top below.
 *
 * !important is required: Kadence's selector (.single-content
 * .wp-block-group, two classes) outranks this file's usual `html body
 * .aca-cta` pattern (one class, two type selectors) on class-count
 * alone, the same class-count loss already documented at the top of
 * this file for .aca-welcome__row -- a same-specificity override would
 * silently lose the same way the margin-top fix did. Matches this
 * file's own existing precedent for beating a Kadence/WP-core default
 * this way (e.g. .aca-diff-row.wp-block-columns's align-items/
 * margin-bottom !important rules). margin-top: 0 is left in place --
 * harmless, and still correct regardless of it not being the deciding
 * property in the collapse.
 *
 * Scoped to .aca-find-way (see that rule) and this element only --
 * Kadence's rule is broad enough to likely also affect .aca-hero,
 * .aca-stats, .aca-differentiators, and other top-level sections the
 * same way, but only these two have been confirmed as bugs;
 * .aca-footer is last in flow, already correct, and untouched.
 */
html body .aca-cta {
	background-color: var(--wp--preset--color--mustard-gold);
	padding: 1.75rem clamp(1.5rem, 19.53vw, 23.4375rem);
	margin-top: 0;
	margin-bottom: 0 !important;
}

html body .aca-cta__inner {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 1.5rem 3rem;
}

html body .aca-cta__text {
	color: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--cardo);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--heading);
	margin: 0;
	text-align: center;
}

/* ---------------------------------------------------------------------
 * Footer
 * ------------------------------------------------------------------- */

/*
 * margin-top: 0 -- same finding and likely mechanism as .aca-cta's own
 * margin-top: 0 above: confirmed via live getBoundingClientRect() a
 * 32px gap between .aca-cta's bottom edge and this section's top edge,
 * with Figma's own node coordinates showing zero gap is the actual
 * design intent (the CTA node ends at exactly the y the Footer node
 * starts at). Zeroed directly on this element, not the shared
 * --wp--style--block-gap custom property, for the same reason.
 */
html body .aca-footer {
	position: relative;
	background-color: var(--wp--preset--color--black);
	padding: clamp(3rem, 6vw, 4.5rem) clamp(1.5rem, 19.53vw, 23.4375rem) 0;
	margin-top: 0;
	overflow: hidden;
}

html body .aca-footer__overlay {
	position: absolute;
	inset: 0;
	background-color: var(--wp--preset--color--black);
	z-index: 0;
}

/*
 * Photo layer only -- kept off .aca-footer__overlay itself so the 35%
 * opacity fades just the photo, not the #141414 base color under it.
 * Sizing/position matched directly from Figma (node 1:297, file
 * eBOw6GfQzuFBs1gn9W0vDh): the photo isn't a simple cover-crop, it's
 * oversized to 224.44% of the footer's own height and offset to
 * top: -110.16% / left: -0.5%, with max-width: none so it isn't
 * constrained to the container's width.
 */
html body .aca-footer__overlay::before {
	content: "";
	position: absolute;
	top: -110.16%;
	left: -0.5%;
	width: 100%;
	max-width: none;
	height: 224.44%;
	background-image: url(/wp-content/uploads/2026/08/Bg.jpg);
	background-size: 100% 100%;
	opacity: 0.35;
}

html body .aca-footer__overlay[data-placeholder-label]::after {
	content: attr(data-placeholder-label);
	position: absolute;
	top: 12px;
	left: 12px;
	background-color: var(--wp--preset--color--black);
	color: var(--wp--preset--color--off-white);
	font-family: var(--wp--preset--font-family--roboto);
	font-size: 0.6875rem;
	font-weight: 500;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	padding: 0.25rem 0.5rem;
	border-radius: 3px;
	opacity: 1;
}

html body .aca-footer__grid {
	position: relative;
	z-index: 1;
	column-gap: 0;
	justify-content: center;
	/*
	 * Pin all four columns to the same top edge. Without this the columns
	 * rendered vertically centered, dropping the outer columns (logo/blurb,
	 * Follow Us) below the two middle ones whenever content heights differ
	 * (visible on the Giving page). The align-items: center wasn't set here
	 * -- it was inherited from the flex-layout defaults on the
	 * is-layout-flex container, so it wasn't visible from a source read;
	 * confirmed via live computed styles.
	 */
	align-items: flex-start;
}

/*
 * Real Figma column widths (1920px reference, file eBOw6GfQzuFBs1gn9W0vDh):
 * 227px / 241px / 252px / 227px, separated by three DIFFERENT gaps --
 * 73px / 58px / 49px -- not a uniform gap, so flexbox's `gap` (zeroed
 * above via column-gap only, leaving row-gap intact for the mobile-
 * stacked case below) can't express this on its own. Each column gets a
 * fixed flex-basis with no grow/shrink, and columns 2-4 carry their own
 * margin-left instead of relying on gap -- same fixed-width convention
 * as .aca-welcome__row-image and .aca-diff-row elsewhere in this file.
 */
html body .aca-footer__grid > .wp-block-column:nth-child(1) {
	flex: 0 0 227px;
}

html body .aca-footer__grid > .wp-block-column:nth-child(2) {
	flex: 0 0 241px;
	margin-left: 73px;
}

html body .aca-footer__grid > .wp-block-column:nth-child(3) {
	flex: 0 0 252px;
	margin-left: 58px;
}

html body .aca-footer__grid > .wp-block-column:nth-child(4) {
	flex: 0 0 227px;
	margin-left: 49px;
}

/*
 * Below WP core's 782px breakpoint, core's own
 * `.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column
 * { flex-basis: 100% !important; }` already stacks each column to full
 * width (beating the fixed flex-basis above via !important), but it
 * does NOT touch margin-left -- so without this reset, columns 2-4
 * would keep their desktop 73px/58px/49px left offset while stacked,
 * indenting them instead of stacking flush. Same pattern as
 * .aca-stats__grid's own 782px override below.
 */
@media (max-width: 782px) {
	html body .aca-footer__grid > .wp-block-column:nth-child(2),
	html body .aca-footer__grid > .wp-block-column:nth-child(3),
	html body .aca-footer__grid > .wp-block-column:nth-child(4) {
		margin-left: 0;
	}

	/*
	 * All four columns, including the unnamed "about" column (logo +
	 * intro paragraph) -- WHO WE ARE / LOCATION / FOLLOW US (nth-child
	 * 2-4) were centered first; the about column was intentionally left
	 * alone at the time, scoped out of that ticket, then covered in a
	 * follow-up. Same root cause throughout: PR #51's fixed column
	 * widths have no mobile-specific centering of their own once
	 * stacked full-width. .aca-footer__rule (a fixed 50px divider) and
	 * .aca-footer__logo (a fixed 176px image) both hug their
	 * now-full-width column's left edge exactly like the arch card did
	 * -- centered here the same way. Extended to text-align: center on
	 * every column (headings/links/paragraphs) and justify-content:
	 * center on the two icon-row flex layouts (LOCATION's contact list,
	 * FOLLOW US's social icons) so each column reads as one coherent
	 * centered block on mobile, not just its own fixed-width element.
	 */
	html body .aca-footer__grid > .wp-block-column {
		text-align: center;
	}

	html body .aca-footer__grid > .wp-block-column:nth-child(2) .aca-footer__rule,
	html body .aca-footer__grid > .wp-block-column:nth-child(3) .aca-footer__rule,
	html body .aca-footer__grid > .wp-block-column:nth-child(4) .aca-footer__rule {
		margin-inline: auto;
	}

	/*
	 * Scoped via the nth-child(1) ancestor, not the bare .aca-footer__logo
	 * class: .aca-footer__logo's own base rule below (line ~1605) also
	 * sets margin via the `margin: 0 0 31px` shorthand, which resolves to
	 * the SAME physical margin-left/margin-right longhands as
	 * margin-inline: auto. Two rules of equal specificity (both "html
	 * body .aca-footer__logo") targeting the same physical property
	 * resolve by source order, and that later, unconditional rule sits
	 * after this one in the file -- so it would silently win at every
	 * width, media query or not, without this extra specificity (the
	 * same fix shape as the .aca-footer__rule override just above,
	 * which needed the same nth-child ancestor for the same reason).
	 */
	html body .aca-footer__grid > .wp-block-column:nth-child(1) .aca-footer__logo {
		margin-inline: auto;
	}

	html body .aca-footer__contact li {
		justify-content: center;
	}

	html body .aca-footer__social {
		justify-content: center;
	}
}

html body .aca-footer__col-heading {
	color: var(--wp--preset--color--mustard-gold);
	font-family: var(--wp--preset--font-family--roboto);
	font-size: 1.125rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	margin: 0 0 0.75rem;
}

html body .aca-footer__rule {
	width: 50px;
	height: 1px;
	background-color: var(--wp--preset--color--mustard-gold);
	margin: 0 0 1rem;
	border: 0;
}

html body .aca-footer__logo {
	display: block;
	width: 176px;
	height: 43px;
	margin: 0 0 31px;
}

html body .aca-footer p:not(.aca-footer__col-heading),
html body .aca-footer li,
html body .aca-footer a {
	color: var(--wp--preset--color--off-white);
	font-family: var(--wp--preset--font-family--inter);
	font-size: 1rem;
}

html body .aca-footer__links {
	list-style: none;
	margin: 0;
	padding: 0;
}

html body .aca-footer__links li {
	margin-bottom: 0.6rem;
}

html body .aca-footer__links a {
	text-decoration: none;
}

html body .aca-footer__links a::before {
	content: "› ";
	color: var(--wp--preset--color--mustard-gold);
}

html body .aca-footer__links a:hover,
html body .aca-footer__links a:focus {
	color: var(--wp--preset--color--warm-cream);
}

html body .aca-footer__contact {
	list-style: none;
	margin: 0;
	padding: 0;
}

/*
 * Figma (nodes 1:328/1:331/1:334/1:337): each line's icon is a 21px
 * glyph in a 27px-tall container, with the text indented ~34px from
 * the column's left edge. 13px gap here (0.8125rem) plus the icon's
 * own 21px width gets that same 34px total. align-items: flex-start
 * (not center) so the icon pins to the first line if a line wraps,
 * rather than centering against the whole multi-line block.
 */
html body .aca-footer__contact li {
	display: flex;
	align-items: flex-start;
	gap: 0.8125rem;
	margin-bottom: 0.75rem;
}

html body .aca-footer__contact-icon {
	flex: 0 0 21px;
	width: 21px;
	height: 27px;
	display: flex;
	align-items: center;
	justify-content: center;
}

/*
 * fill for the solid-path icons (map-pin, phone) and color for the
 * stroke="currentColor" outline icons (envelope, clock) -- same split
 * as .aca-footer__social's icons above, for the same reason.
 */
html body .aca-footer__contact-icon svg {
	width: 21px;
	height: 21px;
	fill: var(--wp--preset--color--warm-cream);
	color: var(--wp--preset--color--warm-cream);
}

/*
 * margin-bottom: 0 -- the FOLLOW US column's description paragraph is
 * a plain <p> with no class of its own (unlike its .aca-footer__col-
 * heading and .aca-footer__rule siblings), so it falls through to
 * Kadence's generic .single-content p default, which sets
 * margin-bottom: var(--global-md-spacing) (32px) -- the same mechanism
 * already found twice tonight (.aca-find-way__card-content, .aca-cta/
 * .aca-footer). Confirmed via live DevTools: with no bottom border or
 * padding anywhere in the ancestor chain to contain it (.aca-footer's
 * own padding-bottom is 0px), this margin collapses straight through
 * the column, the columns grid, .aca-footer, <main>, and <body>,
 * inflating the page's total scrollHeight by exactly 32px beyond
 * anything actually painted -- a 32px white strip at the very bottom
 * of the page.
 *
 * Selector uses a descendant combinator for `p`, not a direct-child
 * one, since this pattern's hand-authored source has the paragraph as
 * a direct child of the column but the live page's actual saved
 * content may nest it differently -- same class/structure-mismatch
 * risk already hit once tonight on .aca-find-way__content, so this
 * doesn't assume the exact live nesting. :not(.aca-footer__col-heading)
 * excludes that column's OTHER bare <p> (the FOLLOW US heading itself)
 * from this same selector, which would otherwise also match it and
 * incorrectly zero its own, intentional 0.75rem bottom margin.
 *
 * No !important needed: four classes/pseudo-classes here
 * (.aca-footer__grid, .wp-block-column, :nth-child(4), and
 * .aca-footer__col-heading inside :not()) comfortably outrank
 * Kadence's one-class .single-content p -- confirmed via harness
 * against a simulated copy of that exact rule, not assumed.
 */
html body .aca-footer__grid > .wp-block-column:nth-child(4) p:not(.aca-footer__col-heading) {
	margin-bottom: 0;
}

html body .aca-footer__social {
	display: flex;
	gap: 0.75rem;
	list-style: none;
	margin: 1rem 0 0;
	padding: 0;
}

html body .aca-footer__social a {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	color: var(--wp--preset--color--warm-cream);
}

html body .aca-footer__social a svg {
	width: 16px;
	height: 16px;
	fill: var(--wp--preset--color--warm-cream);
	color: var(--wp--preset--color--warm-cream);
}

html body .aca-footer__social a:hover,
html body .aca-footer__social a:focus {
	color: var(--wp--preset--color--mustard-gold);
}

html body .aca-footer__social a:hover svg,
html body .aca-footer__social a:focus svg {
	fill: var(--wp--preset--color--mustard-gold);
	color: var(--wp--preset--color--mustard-gold);
}

/*
 * padding-inline and margin-inline here must stay in lockstep with
 * .aca-footer's own padding-inline above -- the negative margin-inline
 * bleeds this bar out to the full section width (cancelling the
 * parent's inset), and the matching padding-inline then re-applies that
 * same inset to this bar's own content so the copyright text still
 * lines up with the rest of the footer. Not touched by the user's
 * request directly, but left at the old 6vw/5rem value here would have
 * broken that cancellation the moment .aca-footer's padding changed
 * above, so it's updated to the same clamp(1.5rem, 19.53vw, 23.4375rem).
 */
html body .aca-footer__bottom {
	position: relative;
	z-index: 1;
	margin-top: clamp(2rem, 5vw, 3rem);
	padding: 0.9rem clamp(1.5rem, 19.53vw, 23.4375rem);
	margin-inline: calc(-1 * clamp(1.5rem, 19.53vw, 23.4375rem));
	background-color: var(--wp--preset--color--black);
	text-align: center;
}

html body .aca-footer__bottom p {
	margin: 0;
	font-size: 0.875rem;
	color: var(--wp--preset--color--muted-text);
}

/* ---------------------------------------------------------------------
 * Content-to-footer spacing
 * ------------------------------------------------------------------- */

/*
 * The footer now renders as a theme-level template part (inc/footer.php,
 * kadence_footer hook) OUTSIDE #inner-wrap, so Kadence's boxed content
 * article no longer has the footer as its last child. Its bottom padding
 * (.entry-content-wrap, 32px) and the off-white #inner-wrap background it
 * exposes therefore showed as a white/off-white band between the last
 * page section and the footer -- confirmed via live computed styles.
 * Zeroing the article's bottom padding lets full-bleed pages (home, gift)
 * meet the footer flush; text pages keep their bottom breathing room from
 * their last content block's own margin (.aca-content margin-block), not
 * this padding, so this is safe to apply globally.
 */
html body .entry-content-wrap {
	padding-bottom: 0;
}

/*
 * Homepage only: the outer constrained content group (the single
 * .wp-block-group.is-layout-constrained that is the direct child of
 * .single-content and wraps all the homepage section patterns) still
 * carried Kadence's `.single-content .wp-block-group { margin-bottom:
 * var(--global-md-spacing); }` (32px) -- the same mechanism already
 * overridden on .aca-cta / .aca-find-way above, but this outer wrapper
 * isn't one of those section classes so it wasn't covered. That 32px
 * left a white band between the CTA and the footer on the homepage only;
 * text pages (Giving, Board, etc.) render correctly and must stay
 * untouched, hence the .home scope.
 *
 * !important for the same reason as the .aca-cta / .aca-find-way
 * overrides: Kadence's `.single-content .wp-block-group` is two classes,
 * outranking this file's usual `html body .<one-class>` pattern on
 * class-count. Confirmed against the DevTools breadcrumb (.single-content
 * -> div.wp-block-group.is-layout-constrained); needs a live re-check
 * after deploy since the source wasn't reachable from the build env.
 */
html body.home .single-content > .wp-block-group {
	margin-bottom: 0 !important;
}

/*
 * Homepage: #primary (.content-area) carries Kadence's 80px
 * content-vertical-padding bottom margin. On full-bleed pages that leaves
 * an 80px gap between the last section (CTA) and the theme-level footer,
 * showing the body background through it -- traced via live Console
 * (#primary mb:80px, #inner-wrap ends 80px past the CTA, footer starts there).
 * Zero it on the homepage so the CTA meets the footer flush. Text pages keep
 * the 80px as intended breathing room before the footer, hence .home scope.
 */
html body.home #primary {
	margin-bottom: 0;
}

/*
 * .aca-stats__item's own `flex: 1 1 200px` sets a 200px flex-basis
 * meant for the WIDTH each item takes on the normal row-direction
 * layout. Once flex-direction flips to column here, that same 200px
 * basis applies to HEIGHT instead -- found via an actual mobile
 * screenshot showing each stacked item ~200px tall with large gaps
 * between them, not the compact icon+text row it should be. Reset to
 * `auto` so each item sizes to its own content again.
 */
@media (max-width: 782px) {
	html body .aca-stats__grid {
		flex-direction: column;
	}

	html body .aca-stats__item {
		flex: 1 1 auto;
	}
}

/* ---------------------------------------------------------------------
 * Sub-pages — Page Header + content pattern kit
 * ------------------------------------------------------------------- */

/*
 * Shared constrained content wrapper for every sub-page content pattern.
 * Hand-authored wp:group markup never gets the block editor's own
 * is-layout-constrained max-width CSS (see the file-header note on
 * .aca-welcome__row for why), so this reproduces it directly using
 * theme.json's own settings.layout.contentSize (1200px) and the same
 * horizontal padding formula every other section in this file uses.
 */
html body .aca-content.wp-block-group {
	max-width: 1200px;
	margin-inline: auto;
	padding-inline: clamp(1.5rem, 6vw, 5rem);
	margin-block: clamp(2.5rem, 5vw, 4rem);
}

html body .aca-content__heading.wp-block-heading {
	font-family: var(--wp--preset--font-family--cardo);
	margin-bottom: 1rem;
}

html body .aca-content__text {
	color: var(--wp--preset--color--body-text);
}

html body .is-layout-flex {
	display: flex;
	flex-wrap: wrap;
}

/* Page Header */
html body .aca-page-hero.wp-block-cover {
	min-height: 420px;
}

html body .aca-page-hero .wp-block-cover__inner-container {
	max-width: 1200px;
	margin-inline: auto;
	padding-inline: clamp(1.5rem, 6vw, 5rem);
}

html body .aca-page-hero__heading.wp-block-heading {
	color: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--cardo);
	margin: 0 0 0.75rem;
}

html body .aca-page-hero__subtext {
	color: var(--wp--preset--color--warm-cream);
	font-size: var(--wp--preset--font-size--label);
	margin: 0;
	max-width: 42rem;
}

/* Two-Column Text + Image */
html body .aca-two-col.wp-block-columns {
	align-items: center !important;
	gap: clamp(2rem, 6vw, 5rem);
}

html body .aca-two-col__image.wp-block-image {
	border-radius: 12px;
	aspect-ratio: 4 / 3;
}

html body .aca-two-col__image.wp-block-image:has(img[class*="wp-image-"]) {
	aspect-ratio: auto;
}

html body .aca-two-col__image.wp-block-image img[class*="wp-image-"] {
	width: auto;
	height: auto;
	max-width: 100%;
	object-fit: initial;
	border-radius: 12px;
}

html body .aca-two-col__heading.wp-block-heading {
	font-family: var(--wp--preset--font-family--lora);
	margin-bottom: 0.75rem;
}

html body .aca-two-col__text {
	color: var(--wp--preset--color--body-text);
}

/* Pull-Quote / Testimonial */
html body .aca-quote.wp-block-quote {
	border-left: 3px solid var(--wp--preset--color--mustard-gold);
	padding-left: clamp(1.25rem, 4vw, 2.5rem);
	margin-inline: auto;
	max-width: 46rem;
}

html body .aca-quote p {
	font-family: var(--wp--preset--font-family--lora);
	font-size: var(--wp--preset--font-size--heading);
	font-style: italic;
	color: var(--wp--preset--color--black);
	line-height: 1.4;
}

html body .aca-quote cite {
	display: block;
	margin-top: 1rem;
	font-family: var(--wp--preset--font-family--roboto);
	font-size: 0.9375rem;
	font-style: normal;
	color: var(--wp--preset--color--muted-text);
}

/* Numbered List */
html body .aca-list-row.wp-block-group {
	display: flex;
	gap: 1.5rem;
	align-items: flex-start;
	padding-block: 1.75rem;
	border-bottom: 1px solid var(--wp--preset--color--warm-cream);
}

html body .aca-list-row:first-child {
	border-top: 1px solid var(--wp--preset--color--warm-cream);
}

html body .aca-list-row__number {
	flex: none;
	width: 3.5rem;
	font-family: var(--wp--preset--font-family--lora);
	font-weight: 700;
	font-size: 2rem;
	color: var(--wp--preset--color--mustard-gold);
	margin: 0;
}

/*
 * Date-label variant of the Numbered List — add the `aca-list-row--label`
 * class to the wrapping group (alongside `aca-list-row`) when the leading
 * column holds a date or short text label instead of a single/double-digit
 * numeral. The default rule above sizes that column for "1"/"01" (2rem
 * font, fixed 3.5rem width); a full date like "12/16/2025" wraps character
 * by character at that size. Used on the News & Events page.
 */
html body .aca-list-row--label .aca-list-row__number {
	width: auto;
	font-size: 1.1rem;
	white-space: nowrap;
}

html body .aca-list-row__heading.wp-block-heading {
	font-family: var(--wp--preset--font-family--lora);
	margin: 0 0 0.4rem;
}

html body .aca-list-row__body {
	color: var(--wp--preset--color--muted-text);
	margin: 0;
}

/* Image Gallery */
html body .aca-gallery__image.wp-block-image {
	border-radius: 8px;
	aspect-ratio: 4 / 3;
}

/* Timeline */
html body .aca-timeline {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 1.5rem 1rem;
	padding-block: 2.5rem 1rem;
	position: relative;
}

html body .aca-timeline::before {
	content: "";
	position: absolute;
	top: 3.6875rem;
	left: 0;
	right: 0;
	height: 1px;
	background: var(--wp--preset--color--warm-cream);
}

html body .aca-timeline .aca-list-row.wp-block-group {
	flex: 1 1 0;
	min-width: 130px;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 0;
	padding: 0;
	border: none;
	position: relative;
}

html body .aca-timeline .aca-list-row:first-child {
	border: none;
}

html body .aca-timeline .aca-list-row__number {
	width: auto;
	background: var(--wp--preset--color--off-white);
	padding-inline: 0.5rem;
	margin-bottom: 0.6rem;
}

html body .aca-timeline .aca-list-row__text {
	text-align: center;
}

html body .aca-timeline .aca-list-row__heading.wp-block-heading {
	font-size: 1rem;
}

html body .aca-timeline .aca-list-row__body {
	font-size: 0.85rem;
	max-width: 18ch;
	margin-inline: auto;
}

@media (max-width: 781px) {
	html body .aca-timeline {
		flex-direction: column;
		padding-block: 0;
	}

	html body .aca-timeline::before {
		display: none;
	}

	html body .aca-timeline .aca-list-row.wp-block-group {
		flex-direction: row;
		text-align: left;
		align-items: flex-start;
		gap: 1.5rem;
		padding-block: 1.75rem;
		border-bottom: 1px solid var(--wp--preset--color--warm-cream);
	}

	html body .aca-timeline .aca-list-row:first-child {
		border-top: 1px solid var(--wp--preset--color--warm-cream);
	}

	html body .aca-timeline .aca-list-row__text,
	html body .aca-timeline .aca-list-row__heading.wp-block-heading {
		text-align: left;
	}

	html body .aca-timeline .aca-list-row__body {
		max-width: none;
		margin-inline: 0;
	}
}

/* FAQ Accordion */
html body .aca-faq__item.wp-block-details {
	border-bottom: 1px solid var(--wp--preset--color--warm-cream);
	padding-block: 1.25rem;
}

html body .aca-faq__question {
	cursor: pointer;
	font-family: var(--wp--preset--font-family--lora);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--label);
	color: var(--wp--preset--color--black);
}

html body .aca-faq__answer {
	color: var(--wp--preset--color--muted-text);
	margin: 0.75rem 0 0;
}

/* Team / Staff Grid */
html body .aca-team__photo.wp-block-image {
	border-radius: 50%;
	aspect-ratio: 1 / 1;
	max-width: 200px;
	margin-inline: auto;
}

html body .aca-team__card {
	text-align: center;
}

html body .aca-team__name {
	font-family: var(--wp--preset--font-family--lora);
	font-weight: 700;
	margin: 1rem 0 0.15rem;
}

html body .aca-team__title {
	color: var(--wp--preset--color--muted-text);
	font-size: 0.9375rem;
	margin: 0;
}

/* Stat Callout */
html body .aca-stat-callout {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	justify-content: space-between;
}

html body .aca-stat-callout__item {
	flex: 1 1 160px;
	text-align: center;
}

html body .aca-stat-callout__number {
	font-family: var(--wp--preset--font-family--cardo);
	font-weight: 700;
	font-size: clamp(2rem, 4vw, 2.75rem);
	color: var(--wp--preset--color--wine);
	margin: 0;
}

html body .aca-stat-callout__label {
	color: var(--wp--preset--color--muted-text);
	margin: 0.25rem 0 0;
}

/*
 * Mobile: faculty two-column rows stack in source order, so rows whose
 * photo is the second column show the bio before the photo. Pull the
 * image column to the top of the stack on mobile only; desktop keeps its
 * source-order side-by-side layout untouched.
 */
@media (max-width: 781px) {
	html body .aca-two-col > .wp-block-column:has(.aca-two-col__image) {
		order: -1;
	}
}

/* Faculty headshots: uniform 4:5 frame regardless of per-block inline sizes */
html body .aca-two-col .aca-two-col__image.wp-block-image {
	display: block;
	width: 100%;
	max-width: 400px;
	margin-left: auto;
	margin-right: auto;
	aspect-ratio: 4 / 5;
}

html body .aca-two-col .aca-two-col__image.wp-block-image img {
	width: 100% !important;
	height: 100% !important;
	aspect-ratio: 4 / 5 !important;
	object-fit: cover;
	object-position: center top;
}

/* Content buttons: equal width on desktop */
@media (min-width: 782px) {
	html body .aca-content .wp-block-button__link {
		min-width: 23rem;
		box-sizing: border-box;
		text-align: center;
	}
}

/* Mobile: stack content buttons full-width with even spacing */
@media (max-width: 781px) {
	html body .aca-content .wp-block-buttons {
		flex-direction: column;
		align-items: stretch;
		gap: 0.75rem;
	}

	html body .aca-content .wp-block-buttons > .wp-block-button {
		width: 100%;
	}

	html body .aca-content .wp-block-buttons .wp-block-button__link {
		width: 100%;
		box-sizing: border-box;
		text-align: center;
	}
}

/* Mobile: even spacing when two button blocks sit back to back */
@media (max-width: 781px) {
	html body .aca-content .wp-block-buttons + .wp-block-buttons {
		margin-top: 0.75rem;
	}

	html body .aca-content .wp-block-buttons:has(+ .wp-block-buttons) {
		margin-bottom: 0;
	}
}

/* Alumni & Friends signup form (rebuilt Mailchimp embed) */
html body .aca-form {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 1.25rem 1.5rem;
	margin: 0;
	max-width: 100%;
}

html body .aca-form__note,
html body .aca-form__fieldset,
html body .aca-form__field--full,
html body .aca-form__actions {
	grid-column: 1 / -1;
}

html body .aca-form__note {
	margin: 0;
	font-size: 0.9rem;
	color: var(--wp--preset--color--muted-text);
}

html body .aca-form__field {
	display: flex;
	flex-direction: column;
	gap: 0.4rem;
	margin: 0;
}

html body .aca-form label,
html body .aca-form legend {
	padding: 0;
	font-weight: 600;
	line-height: 1.3;
	color: var(--wp--preset--color--body-text);
}

html body .aca-form__req {
	margin-left: 0.15em;
	color: var(--wp--preset--color--wine);
}

html body .aca-form input[type="text"],
html body .aca-form input[type="email"],
html body .aca-form input[type="tel"] {
	width: 100%;
	box-sizing: border-box;
	padding: 0.8rem 1rem;
	border: 1px solid var(--wp--preset--color--warm-cream);
	border-radius: 5px;
	background: var(--wp--preset--color--white);
	font: inherit;
	line-height: 1.4;
	color: var(--wp--preset--color--body-text);
}

html body .aca-form input[type="text"]:focus,
html body .aca-form input[type="email"]:focus,
html body .aca-form input[type="tel"]:focus {
	border-color: var(--wp--preset--color--mustard-gold);
	outline: 2px solid rgba(176, 126, 30, 0.35);
	outline-offset: 0;
}

html body .aca-form__fieldset {
	margin: 0;
	padding: 0;
	border: 0;
	min-width: 0;
}

html body .aca-form__options {
	display: flex;
	flex-wrap: wrap;
	gap: 0.75rem 1.75rem;
	margin: 0.6rem 0 0;
	padding: 0;
	list-style: none;
}

html body .aca-form__options li {
	margin: 0;
}

html body .aca-form__options label {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	font-weight: 400;
	cursor: pointer;
}

html body .aca-form__options input[type="radio"] {
	width: 1.1rem;
	height: 1.1rem;
	margin: 0;
	accent-color: var(--wp--preset--color--mustard-gold);
}

html body .aca-form__actions {
	margin-top: 0.5rem;
}

html body .aca-form input[type="submit"] {
	min-width: 23rem;
	cursor: pointer;
	border: 0;
	border-radius: 5px;
	background-color: var(--wp--preset--color--mustard-gold);
	color: var(--wp--preset--color--white);
}

html body .aca-form input[type="submit"]:hover,
html body .aca-form input[type="submit"]:focus-visible {
	background-color: var(--wp--preset--color--charcoal-brown);
	color: var(--wp--preset--color--white);
}

@media (max-width: 781px) {
	html body .aca-form {
		grid-template-columns: 1fr;
	}

	html body .aca-form input[type="submit"] {
		width: 100%;
		min-width: 0;
	}
}

/* Breathing room below the last block in the white content card.
   Skips the homepage and any page that ends in a full-width band. */
html body:not(.home) .entry-content-wrap:not(:has(> .entry-content > .alignfull:last-child)) {
	padding-bottom: 3rem;
}

@media (max-width: 781px) {
	html body:not(.home) .entry-content-wrap:not(:has(> .entry-content > .alignfull:last-child)) {
		padding-bottom: 2rem;
	}
}

/* Kadence paints visited buttons its default blue (--global-palette-btn-bg).
   Keep visited buttons in the brand gold, with the normal charcoal hover. */
html body .wp-block-button__link:visited,
html body .wp-element-button:visited {
	background-color: var(--wp--preset--color--mustard-gold);
	color: var(--wp--preset--color--white);
}
html body .wp-block-button__link:visited:hover,
html body .wp-element-button:visited:hover {
	background-color: var(--wp--preset--color--charcoal-brown);
	color: var(--wp--preset--color--white);
}

/* Subpage photo banners: replace the wine tint with the homepage's dark tint
   (#141414 at 40%) so the beige hero text stays legible. Banners with no photo
   (e.g. the Board pages' solid wine bar) are excluded by the :has() check.
   !important is needed because WordPress sets the overlay colour via
   .has-wine-background-color { background-color: ... !important }. */
html body .aca-page-hero.wp-block-cover:has(> img.wp-block-cover__image-background) > .wp-block-cover__background {
	background-color: var(--wp--preset--color--black) !important;
	opacity: 0.4 !important;
}

/* Reusable soft cream band for content sections. Add the class
   "aca-content--tint" to any .aca-content group (block editor > Advanced >
   Additional CSS class) to give it a warm-cream panel. */
html body .aca-content.wp-block-group.aca-content--tint {
	background-color: rgba(209, 199, 181, 0.25); /* warm-cream #D1C7B5 at 25% */
	border-radius: 12px;
	padding-block: clamp(2rem, 4vw, 3.5rem);
}
html body .aca-content.wp-block-group.aca-content--tint > :first-child {
	margin-top: 0;
}
html body .aca-content.wp-block-group.aca-content--tint > :last-child {
	margin-bottom: 0;
}

/* Single-number stat callouts (e.g. Academics "100 percent of our teachers")
   get a larger figure than the 64px display preset. !important is needed
   because .has-display-font-size sets font-size with !important. Multi-number
   rows are excluded by :only-child. */
html body .aca-stat-callout:has(> .aca-stat-callout__item:only-child) .aca-stat-callout__number {
	font-size: clamp(3.5rem, 2rem + 5vw, 6rem) !important;
	line-height: 1;
}

/* "Class of 20XX Acceptances" (/academics/): a core Columns block with two
   List blocks. Once the columns stack below 782px, the columns' row gap
   plus the first list's bottom margin leave a blank line mid-list. Close
   it so each year reads as one continuous list; desktop is untouched. */
@media (max-width: 781px) {
	html body .aca-acceptances.wp-block-columns {
		row-gap: 0;
	}

	html body .aca-acceptances .wp-block-column:first-child .wp-block-list {
		margin-bottom: 0;
	}

	html body .aca-acceptances .wp-block-column + .wp-block-column .wp-block-list {
		margin-top: 0;
	}
}

/* Core Pullquote (e.g. CCC 2229 on /about/), sitewide. Kadence draws the
   opening mark as `.wp-block-pullquote blockquote::before { content:
   open-quote }` (absolute, top 80px / left 35px, 200px sans-serif with a
   40px line-height) in a near-invisible #EDF2F7. This adds the matching
   closing mark and gives both one shared, slightly stronger color. The
   `html body` prefix outranks Kadence's rule without !important.

   Geometry: with a 40px line box and a 200px glyph, the visible mark
   paints roughly 8-56px ABOVE its box's top edge, i.e. about 48-96px
   above the box's bottom edge. So bottom: 0 puts the closing glyph level
   with the last line of quote text and keeps its lowest point ~48px
   above the blockquote's bottom edge, clear of the one-line cite. If the
   mark needs nudging, `bottom` is the only value to change. */
html body .wp-block-pullquote blockquote {
	position: relative;
}

html body .wp-block-pullquote blockquote::before,
html body .wp-block-pullquote blockquote::after {
	color: #E6D8BC;
	color: color-mix(in srgb, var(--wp--preset--color--mustard-gold) 30%, transparent);
}

html body .wp-block-pullquote blockquote::after {
	content: close-quote;
	position: absolute;
	right: 35px;
	bottom: 0;
	z-index: 0;
	font-family: sans-serif;
	font-size: 200px;
	line-height: 40px;
	pointer-events: none;
}

/* Quote text and cite paint above both marks. */
html body .wp-block-pullquote blockquote > p,
html body .wp-block-pullquote blockquote > cite {
	position: relative;
	z-index: 1;
}

/* Narrow screens: both marks at 60% scale, offsets scaled to match, so the
   closing mark doesn't crowd the wrapped quote text. */
@media (max-width: 781px) {
	html body .wp-block-pullquote blockquote::before,
	html body .wp-block-pullquote blockquote::after {
		font-size: 120px;
		line-height: 24px;
	}

	html body .wp-block-pullquote blockquote::before {
		top: 48px;
		left: 21px;
	}

	html body .wp-block-pullquote blockquote::after {
		right: 21px;
		bottom: 0;
	}
}
