/*
Theme Name: Bricks Enlighten
Theme URI: https://enlightenmobility.com
Author: Enlighten Mobility
Author URI: https://enlightenmobility.com
Description: Child theme of Bricks for the Enlighten Mobility marketing site. Design tokens, fonts, and customizations for the Enlighten brand.
Version: 1.0.0
Template: bricks
Text Domain: enlighten-mobility
*/

/*
 * Global Class recipes — the 12 primitives registered in Bricks as thin
 * Global Classes (id + name only). Bricks adds the class to the element's
 * HTML; these rules supply the styles. All values reference Bricks
 * Variables / CSS custom properties defined in assets/css/tokens.css.
 *
 * Update contract: editing a recipe here changes the rendered style
 * immediately. Changing the *name* of a class requires updating the
 * matching registration in tools/phase-2-seed.php (or the committed
 * config/bricks-global-classes.json) so Bricks still finds it.
 */

/* ---------- Root scroll behavior — single-page anchor navigation ----------

   Nav is sticky (72/56 px). Without scroll-padding-top, clicking an
   anchor link (#portfolio, #purpose, …) scrolls the target beneath
   the nav. scroll-padding-top reserves that space. scroll-behavior:
   smooth is 2026 baseline for single-page anchor navigation; the
   reduced-motion override keeps it instant for users who need it.
*/

html {
	scroll-behavior: smooth;
	scroll-padding-top: var(--nav-height-desktop);
}

@media ( max-width: 1099px ) {
	html {
		scroll-padding-top: var(--nav-height-mobile);
	}
}

@media ( prefers-reduced-motion: reduce ) {
	html {
		scroll-behavior: auto;
	}
}

/* ---------- Buttons ---------- */

.btn-primary,
.btn-outline,
.btn-outline-on-dark,
.btn-dark {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--space-2);
	padding: var(--space-3) var(--space-6);
	border-radius: var(--radius-pill);
	font-family: var(--font-sans);
	font-size: var(--fs-button);
	line-height: var(--lh-button);
	font-weight: var(--fw-bold);
	text-decoration: none;
	white-space: nowrap;
	cursor: pointer;
	transition: background var(--motion-fast), color var(--motion-fast), transform var(--motion-fast), border-color var(--motion-fast);
}

.btn-primary {
	background: var(--gold);
	color: var(--ink);
	border: 1px solid var(--gold);
}

.btn-primary:hover {
	background: var(--gold-deep);
	border-color: var(--gold-deep);
	color: var(--ink);
}

.btn-primary:active {
	transform: translateY(1px);
}

.btn-primary:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 2px;
}

.btn-primary[disabled],
.btn-primary[aria-disabled="true"] {
	background: var(--light-grey);
	border-color: var(--light-grey);
	color: var(--mute);
	cursor: not-allowed;
}

.btn-outline {
	background: transparent;
	color: var(--ink);
	border: 1px solid var(--ink);
}

.btn-outline:hover {
	background: var(--ink-tint-08);
	color: var(--ink);
}

.btn-outline:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 2px;
}

/* On-dark variant — used over the full-bleed hero video where the
   `--ink` border + text of `.btn-outline` would disappear into the
   darkened video. Canvas border + canvas text + canvas-tint hover.
   Same shape, padding, motion as the canvas-bg variant. */
.btn-outline-on-dark {
	background: transparent;
	color: var(--canvas);
	border: 1px solid var(--canvas);
}

.btn-outline-on-dark:hover {
	background: rgba(251, 247, 238, 0.10);
	border-color: var(--canvas);
	color: var(--canvas);
}

.btn-outline-on-dark:active {
	transform: translateY(1px);
}

.btn-outline-on-dark:focus-visible {
	outline: 2px solid var(--canvas);
	outline-offset: 2px;
}

.btn-dark {
	background: var(--ink);
	color: var(--canvas);
	border: 1px solid var(--ink);
}

.btn-dark:hover {
	background: var(--ink-2);
	border-color: var(--ink-2);
	color: var(--canvas);
}

.btn-dark:focus-visible {
	outline: 2px solid var(--gold);
	outline-offset: 2px;
}

/* ---------- Eyebrow chip ---------- */

.chip-eyebrow {
	display: inline-block;
	padding: var(--space-2) var(--space-4);
	background: var(--gold-tint-15);
	color: var(--ink);
	border-radius: var(--radius-pill);
	font-family: var(--font-sans);
	font-size: var(--fs-eyebrow);
	line-height: var(--lh-eyebrow);
	font-weight: var(--fw-bold);
	letter-spacing: var(--track-eyebrow);
	text-transform: uppercase;
}

/* ---------- Cards ---------- */

.card-standard {
	display: flex;
	flex-direction: column;
	gap: var(--space-4);
	padding: var(--space-6);
	background: var(--white);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-rest);
	transition: box-shadow var(--motion-fast), transform var(--motion-fast);
}

.card-standard:hover {
	box-shadow: var(--shadow-hover);
	transform: translateY(-2px);
}

.card-hero {
	overflow: hidden;
	border-radius: var(--radius-feature);
	background: var(--ink-tint-08);
	aspect-ratio: 4 / 5;
}

.card-hero > img,
.card-hero > picture > img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.card-dark {
	padding: var(--space-6);
	background: rgba(255, 255, 255, 0.08);
	border: 1px solid var(--border-translucent-dark);
	border-radius: var(--radius-card);
	color: var(--canvas);
}

/* ---------- Form fields ---------- */

.field-input,
.field-textarea {
	display: block;
	width: 100%;
	padding: var(--space-3) var(--space-4);
	background: var(--white);
	color: var(--ink);
	border: 1px solid var(--light-grey);
	border-radius: var(--radius-input);
	font-family: var(--font-sans);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	transition: border-color var(--motion-fast), box-shadow var(--motion-fast);
}

.field-input:focus,
.field-textarea:focus {
	border-color: var(--ink);
	outline: 2px solid var(--ink);
	outline-offset: 2px;
}

.field-input[aria-invalid="true"],
.field-textarea[aria-invalid="true"] {
	border-color: var(--warn-red);
}

.field-textarea {
	min-height: calc( var(--space-8) * 2 );
	resize: vertical;
}

/* ---------- Section surfaces ----------
   Section rhythm — v5 (May 2026). v4 (40 default + 80 dark compensation
   + doubled bottoms on Purpose/Collaborators/Connect) measured uneven:
   80 between canvas-canvas, 176 between Purpose and Collaborators (96
   doubled-bot + 80 dark-top), 192 between Collaborators and Connect (96
   doubled-bot + 96 doubled-top).

   v5 collapses every section to a single uniform padding pattern:
   40px top + 40px bottom on every section, every breakpoint, dark or
   canvas. Inter-section gap = 80px, everywhere. The dark-band color-
   boundary perceptual compensation is dropped — if the dark band reads
   tight after this change, reintroduce a SMALL compensation (≤16px),
   not the v3/v4 doubling. */

.section-canvas {
	background: var(--canvas);
	color: var(--ink);
	padding-top: 40px;
	padding-bottom: 40px;
}

.section-dark {
	background: var(--ink);
	color: var(--canvas);
	padding-top: 40px;
	padding-bottom: 40px;
}

@media ( max-width: 1199px ) {
	.section-canvas,
	.section-dark {
		padding-top: 40px;
		padding-bottom: 40px;
	}
}

@media ( max-width: 959px ) {
	.section-canvas,
	.section-dark {
		padding-top: 40px;
		padding-bottom: 40px;
	}
}

/* ============================================================
   Per-section padding fine-tuning overrides
   ============================================================
   The base rhythm above sets every section to 80/56/40 each
   side at desktop/tablet/mobile (160/112/80 inter-section gap).
   .section-dark and the canvas section that follows it get a
   compensated padding-top to fix the dark→canvas color-boundary
   visual perception issue.

   When a specific section needs to deviate from that base,
   uncomment its block below and adjust. The ID selector wins
   specificity over the .section-canvas / .section-dark rules
   above without needing !important.

   ── Live-edit workflow ──
   1. Open the page → DevTools (right-click → Inspect)
   2. Click the <section> element you want to tune
   3. In the Styles panel find padding-top / padding-bottom
   4. Type new values directly — applies instantly, no save
   5. Use ↑↓ to nudge 1px, Shift+↑↓ to nudge 10px
   6. When happy, paste values into the matching block below
      and uncomment
   7. Save this file → refresh the page

   ── DevTools breakpoints ──
   Toggle device toolbar (Ctrl+Shift+M) and resize to:
     • 1440px = desktop
     • 1024px = tablet  (max-width: 1199px applies)
     •  375px = mobile  (max-width:  959px applies)

   ── Section IDs ──
   #top            Hero            (canvas, contains video stage + Approach block)
   #portfolio      Portfolio       (canvas)
   #purpose        Purpose         (canvas)
   #collaborators  Collaborators   (DARK BAND)
   #connect        Connect         (canvas, sits after dark band)

   For Hero only: the gap ABOVE the "01 / APPROACH" eyebrow is
   controlled by #em-hero-wrap padding-top, NOT by #top section
   padding. That's because Hero contains TWO blocks (video stage
   + Approach Block B) and the gap above 01 is the gap BETWEEN
   them, not a section-edge gap. There's a dedicated block for
   #em-hero-wrap below.
   ============================================================ */

/* ---- HERO (#top) — section padding ----
   Outer gap from previous content (no preceding section, so
   only the top of the page) and gap below Block B's last
   paragraph to the Portfolio section above. */
/*
#top {
	padding-top: 80px;
	padding-bottom: 80px;
}
@media ( max-width: 1199px ) {
	#top {
		padding-top: 56px;
		padding-bottom: 56px;
	}
}
@media ( max-width: 959px ) {
	#top {
		padding-top: 40px;
		padding-bottom: 40px;
	}
}
*/

/* ---- HERO Block B internal gap (#em-hero-wrap) ----
   Controls the gap between the bottom of the video stage and
   the top of the "01 / APPROACH" eyebrow. This is the ONLY
   gap above 01 — the section-padding-top sits ABOVE the video
   stage, not above the Approach block.
   Default is 160px desktop / 112px tablet / 80px mobile, set
   to match the inter-section gap so 01's gap reads consistent
   with all the other section eyebrow gaps. */
/*
#em-hero-wrap {
	padding-top: 160px;
}
@media ( max-width: 1199px ) {
	#em-hero-wrap {
		padding-top: 80px;
	}
}
@media ( max-width: 959px ) {
	#em-hero-wrap {
		padding-top: 80px;
	}
}
*/

/* ---- PORTFOLIO (#portfolio) — section padding ---- */
/*
#portfolio {
	padding-top: 80px;
	padding-bottom: 80px;
}
@media ( max-width: 1199px ) {
	#portfolio {
		padding-top: 56px;
		padding-bottom: 56px;
	}
}
@media ( max-width: 959px ) {
	#portfolio {
		padding-top: 40px;
		padding-bottom: 40px;
	}
}
*/

/* ---- Per-section padding overrides — v7 (May 2026) ----
   Per-section vertical padding tuned by hand at three breakpoints
   for the rhythm to feel right at each scale. v5 had everything
   uniform at 40/40; v6 introduced per-section + per-breakpoint
   variance for editorial weight; v7 (May 2026) re-opens mobile
   spacing — the v6 "tight mobile" model read cramped on phones,
   so mobile now gets generous spacing that closely tracks desktop
   (Collaborators + Connect at 80/80 same as desktop), while tablet
   stays as the in-between rhythm.

   ┌─────────────────┬─────────┬─────────┬─────────┐
   │ Section         │ Desktop │ Tablet  │ Mobile  │  (top / bottom)
   ├─────────────────┼─────────┼─────────┼─────────┤
   │ Approach (#top) │ 40 / 40 │ 40 / 20 │ 40 / 20 │
   │ Portfolio       │ 40 / 40 │ 20 / 20 │ 40 / 20 │
   │ Purpose         │ 40 / 80 │ 20 / 40 │ 40 / 80 │
   │ Collaborators   │ 80 / 80 │ 40 / 40 │ 80 / 80 │  (dark band)
   │ Connect         │ 80 / 80 │ 40 / 40 │ 80 / 80 │
   └─────────────────┴─────────┴─────────┴─────────┘

   .section-canvas / .section-dark continue to set 40/40 as the
   defaults at every breakpoint. The IDs below override only where
   the spec deviates. */

/* DESKTOP (≥1200px) */
#purpose {
	padding-bottom: 80px;
}

#collaborators {
	padding-top: 80px;
	padding-bottom: 80px;
}

#connect {
	padding-top: 80px;
	padding-bottom: 80px;
}

/* v7 (May 2026): standardize heading → primary-content gap at 48px
   (space-7) on desktop across all five sections so the eyebrow →
   heading (16, tight pair) → primary content (48, breath) rhythm
   reads consistently. Portfolio (head margin-bottom space-7) and
   Collaborators (wrap gap space-7) already produce 48; the rules
   below bring Approach, Purpose, and Connect into line.

   Mechanism: add margin-top via @media so it ONLY applies at
   desktop. Tablet/mobile keep their existing tighter rhythm where
   the body content joins the head stack at the head's flex gap (16).
   The 16px head gap stays in place at desktop — adding margin-top
   stacks on top of it (16 + 32 = 48 visible).
*/
@media ( min-width: 1200px ) {
	#em-hero-approach-p {
		margin-top: var(--space-6);
	}
	#em-purpose-body-1 {
		margin-top: var(--space-6);
	}
	#em-connect-address {
		margin-top: var(--space-6);
	}
}

/* TABLET (≤1199px) — fully explicit so the cascade can't accidentally
   leave a stale desktop value (e.g. Collaborators 80) on a smaller
   viewport. Mobile overrides below in its own block. */
@media (max-width: 1199px) {
	#top {
		padding-top: 40px;
		padding-bottom: 20px;
	}

	#portfolio {
		padding-top: 20px;
		padding-bottom: 20px;
	}

	#purpose {
		padding-top: 20px;
		padding-bottom: 40px;
	}

	#collaborators {
		padding-top: 40px;
		padding-bottom: 40px;
	}

	#connect {
		padding-top: 40px;
		padding-bottom: 40px;
	}
}

/* MOBILE (≤959px) — re-open spacing per v7 (May 2026). The v6
   "tight mobile" values (mostly 20/20 or 40/40) read cramped on
   phones; v7 brings mobile back closer to the desktop rhythm so
   each section has clear editorial breathing room on a phone. */
@media (max-width: 959px) {
	#portfolio {
		padding-top: 40px;
		padding-bottom: 20px;
	}

	#purpose {
		padding-top: 40px;
		padding-bottom: 80px;
	}

	#collaborators {
		padding-top: 80px;
		padding-bottom: 80px;
	}

	#connect {
		padding-top: 80px;
		padding-bottom: 80px;
	}

	/* Human Resilience callout box (Collaborative Initiative pill):
	   tile-stack content needs less padding than the dual-logo
	   layouts, but should still honor the pill-overhang compensation.
	   v7 (May 2026): bumped top 20 → 36 and bottom 20 → 24 so
	   visible pill→tiles (25) ≈ visible tiles→bottom (24). Was
	   20/20 which read 9 / 20 — top crammed against the pill. */
	.em-logo-callout[ data-callout-label="Collaborative Initiative" ] {
		padding-top: 36px;
		padding-bottom: 24px;
	}
}

/* ---------- Layout container ---------- */

.container-1200 {
	max-width: var(--content-max);
	margin-inline: auto;
	padding-inline: var(--gutter);
}

@media ( max-width: 959px ) {
	.container-1200 {
		padding-inline: var(--gutter-mobile);
	}
}

/* ============================================================
   Section 1 — Header / Nav

   Bricks rule-of-the-day: the parent theme applies default
   element classes to our template primitives. Our <section>
   gets `.brxe-section`, each of our blocks gets `.brxe-block`,
   each button-rendered-as-anchor gets `.brxe-button`. Those
   defaults are:

     .brxe-section { display: flex; flex-direction: column;
                     align-items: center; width: 100%; }
     .brxe-block   { display: flex; flex-direction: column;
                     align-items: flex-start; width: 100%; }

   ID selectors win on properties we re-declare, but anything
   we leave unset inherits the Bricks default. `width: 100%`
   is the trap — it stretches every flex item to fill the
   main axis, which made the logo's own anchor full-width and
   centered its img visually. Every rule below explicitly
   declares width, flex-direction, and alignment on any
   container where the default would fight us.
   ============================================================ */

#em-nav {
	display: block;
	position: sticky;
	top: 0;
	z-index: 100;
	width: 100%;
	height: var(--nav-height-desktop);
	background: var(--canvas);
	border-bottom: 1px solid transparent;
	/* The transition list intentionally covers everything that flips
	   between transparent (over hero) and canvas (post-hero) states:
	   bg, border, shadow on the bar; color on links + toggle; filter
	   on the logo image. motion-base (240ms) reads as a smooth handoff
	   without feeling sluggish. */
	transition:
		background-color var(--motion-base),
		border-color var(--motion-base),
		box-shadow var(--motion-base);
	/* v7 (May 2026): padding-top + border-box mirrors the mobile
	   pattern (cf. nav-height-mobile bump in commit a9be1c4). The
	   88px band breathes 16px below the viewport top before the
	   nav-row's flex-center kicks in, lifting the logo off the
	   screen edge. Pairs with the --nav-height-desktop bump
	   72 → 88 in tokens.css so scroll-padding-top, hero margin-top
	   pull-up, and anchor offsets all stay in sync. */
	padding-top: 16px;
	margin: 0;
	box-sizing: border-box;
}

#em-nav.is-scrolled {
	border-bottom-color: var(--light-grey);
	box-shadow: var(--shadow-rest);
}

/* Transparent-over-hero state — DEFAULT on the WP front page (body.home
   class added server-side by WordPress). Applied at first paint from
   the static HTML, so there's no FOUC where the canvas-styled nav
   renders briefly before JS toggles it transparent.

   On scroll past the hero, JS in enlighten_nav_frontend_script() adds
   `em-nav--solid` to revert to the canvas variant (rules below). On
   non-home pages, the body.home class is absent so these rules don't
   apply and the nav uses the default canvas styling above. */
body.home #em-nav {
	background: transparent;
	border-bottom-color: transparent;
	box-shadow: none;
}

body.home #em-nav .em-nav-link {
	color: var(--canvas);
}

body.home #em-nav .em-nav-link:hover,
body.home #em-nav .em-nav-link:focus-visible {
	color: var(--gold);
}

body.home #em-nav #em-nav-logo img {
	/* The dark wordmark PNG flattens cleanly to white via this filter
	   chain — same technique used for partner logos on the dark band
	   (gotcha #24). Saves shipping a separate light-wordmark image. */
	filter: brightness(0) invert(1);
}

body.home #em-nav #em-nav-toggle {
	color: var(--canvas);
}

body.home #em-nav #em-nav-toggle:focus-visible {
	outline-color: var(--canvas);
}

/* Scrolled-past-hero state — JS adds .em-nav--solid when the hero
   stage has scrolled out from under the sticky nav, OR when the
   mobile drawer is open (the link list needs a solid backdrop to
   read against the video). Reverts the four overrides above to the
   nav's default canvas styling. */
body.home #em-nav.em-nav--solid {
	background: var(--canvas);
	border-bottom-color: var(--light-grey);
}

body.home #em-nav.em-nav--solid .em-nav-link {
	color: var(--ink);
}

body.home #em-nav.em-nav--solid .em-nav-link:hover,
body.home #em-nav.em-nav--solid .em-nav-link:focus-visible {
	color: var(--gold);
}

body.home #em-nav.em-nav--solid #em-nav-logo img {
	filter: none;
}

body.home #em-nav.em-nav--solid #em-nav-toggle {
	color: var(--ink);
}

body.home #em-nav.em-nav--solid #em-nav-toggle:focus-visible {
	outline-color: var(--ink);
}

#em-nav-row {
	position: relative;
	width: 100%;
	/* v7 (May 2026): cap to --content-max so the nav's logo/CTA align
	   with the section content beneath it on viewports > 1600px.
	   Previously width:100% + no max-width let the nav stretch
	   edge-to-edge while sections sat in a 1600px centered cap —
	   the misalignment was hidden when --gutter was a static 24px,
	   then surfaced once the gutter went fluid. */
	max-width: var(--content-max);
	height: 100%;
	display: flex;
	flex-direction: row;
	flex-wrap: nowrap;
	align-items: center;
	justify-content: flex-start;
	gap: var(--space-6);
	padding: 0 var(--gutter);
	margin: 0 auto;
	box-sizing: border-box;
}

#em-nav-logo {
	display: inline-flex;
	flex: 0 0 auto;
	flex-direction: row;
	flex-wrap: nowrap;
	width: auto;
	align-items: center;
	margin: 0;
	padding: 0;
	text-decoration: none;
	line-height: 0;
}

#em-nav-logo img {
	display: block;
	height: 30px;
	width: auto;
	/* Transitions the brightness/invert filter when the nav flips
	   between canvas (dark wordmark) and transparent-over-hero
	   (white wordmark) states. */
	transition: filter var(--motion-base);
}

#em-nav-toggle {
	display: none;
	flex: 0 0 auto;
	position: relative;
	width: 44px;
	height: 44px;
	margin: 0 0 0 auto;
	padding: 0;
	background: transparent;
	border: none;
	cursor: pointer;
	color: var(--ink);
	/* Above the drawer (z-index 50) so the X stays tappable while open. */
	z-index: 60;
	overflow: visible;
}

#em-nav-toggle::before,
#em-nav-toggle::after {
	content: "";
	position: absolute;
	left: 50%;
	width: 22px;
	height: 2px;
	background: currentColor;
	transform: translateX(-50%);
	transition: top var(--motion-base), bottom var(--motion-base), transform var(--motion-base);
}

#em-nav-toggle::before { top: 15px; }
#em-nav-toggle::after  { top: auto; bottom: 15px; }

#em-nav.em-nav-open #em-nav-toggle::before {
	top: 50%;
	transform: translate(-50%, -50%) rotate(45deg);
}

#em-nav.em-nav-open #em-nav-toggle::after {
	bottom: auto;
	top: 50%;
	transform: translate(-50%, -50%) rotate(-45deg);
}

#em-nav-toggle:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 2px;
	border-radius: 4px;
}

#em-nav-links {
	display: flex;
	flex-direction: row;
	flex-wrap: nowrap;
	width: auto;
	align-items: center;
	/* 48px between every sibling — text links AND the button.
	   The button's own horizontal padding is "inside" its visible
	   pill, so the 48px flex gap is the *visible* gap between the
	   last link's text edge and the button's pill edge. Matches
	   the 48px gap between text links. */
	gap: var(--space-7);
	margin: 0 0 0 auto;
	padding: 0;
}

.em-nav-link {
	display: inline-flex;
	align-items: center;
	padding: var(--space-2) 0;
	background: transparent;
	border: none;
	color: var(--ink);
	font-family: var(--font-sans);
	font-size: var(--fs-nav);
	line-height: var(--lh-nav);
	font-weight: var(--fw-bold);
	text-decoration: none;
	white-space: nowrap;
	/* motion-base (not motion-fast) so the ink↔canvas color flip during
	   the transparent-over-hero ↔ canvas state change reads as a smooth
	   handoff matched to the bar's bg fade. Hover-only color changes
	   still feel instant because hover is a discrete user gesture. */
	transition: color var(--motion-base);
	cursor: pointer;
}

.em-nav-link:hover,
.em-nav-link:focus-visible {
	color: var(--gold-deep);
}

.em-nav-link:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 4px;
	border-radius: 2px;
}

/* ---------- Mobile: <= 1099px (catches tablets + narrow laptops
   where the logo + 3 links + CTA don't fit on one line) ---------- */

@media ( max-width: 1099px ) {
	/* +20px breathing room above the logo on mobile so the bar doesn't
	   kiss the top of the viewport / OS chrome. Variable redefined here
	   (rather than in tokens.css) so drawer top, scroll-padding-top and
	   anchor offsets all stay in sync via var(--nav-height-mobile). */
	:root {
		--nav-height-mobile: 76px;
	}

	#em-nav {
		height: var(--nav-height-mobile);
		padding-top: 20px;
		box-sizing: border-box;
	}

	#em-nav-row {
		gap: var(--space-4);
		padding: 0 var(--gutter-mobile);
	}

	#em-nav-toggle {
		display: block;
	}

	/* Mobile drawer — a full-viewport panel fixed below the sticky
	   nav bar. Opacity + translateY transition (instead of max-height)
	   so the open/close motion stays consistent across content heights.
	   No top border — the drawer shares the nav bar's canvas bg, so the
	   two merge seamlessly and there's no horizontal seam under the X. */
	#em-nav-links {
		position: fixed;
		top: var(--nav-height-mobile);
		left: 0;
		right: 0;
		bottom: 0;
		width: auto;
		flex-direction: column;
		align-items: stretch;
		gap: 0;
		margin: 0;
		padding: var(--space-7) var(--gutter-mobile) 40px;
		background: var(--canvas);
		/* Closed state */
		opacity: 0;
		visibility: hidden;
		transform: translateY(-8px);
		transition:
			opacity var(--motion-base),
			transform var(--motion-base),
			visibility 0s linear var(--motion-base);
		z-index: 50;
		overflow-y: auto;
		counter-reset: emnavcount;
		-webkit-overflow-scrolling: touch;
	}

	#em-nav.em-nav-open #em-nav-links {
		opacity: 1;
		visibility: visible;
		transform: translateY(0);
		transition:
			opacity var(--motion-base),
			transform var(--motion-base),
			visibility 0s linear 0s;
	}

	/* Text links become large typographic items with a numbered
	   wayfinder prefix — echoes the SectionEyebrow 01 / 02 / 03
	   pattern used in every section below. */
	#em-nav-links .em-nav-link {
		position: relative;
		display: flex;
		align-items: baseline;
		gap: var(--space-5);
		padding: var(--space-5) 0 var(--space-5) 0;
		border-bottom: 1px solid var(--ink-tint-08);
		font-size: var(--fs-h3);
		line-height: var(--lh-h3);
		letter-spacing: -0.005em;
		justify-content: flex-start;
		transition: color var(--motion-fast), padding-left var(--motion-base);
	}

	#em-nav-links .em-nav-link::before {
		counter-increment: emnavcount;
		content: counter( emnavcount, decimal-leading-zero );
		flex: 0 0 auto;
		min-width: 2.2em;
		color: var(--mute);
		font-size: var(--fs-eyebrow);
		font-weight: var(--fw-bold);
		letter-spacing: var(--track-eyebrow);
		text-transform: uppercase;
	}

	/* Gold accent bar that slides in from the left on hover / focus. */
	#em-nav-links .em-nav-link::after {
		content: "";
		position: absolute;
		left: calc( var(--space-5) * -1 );
		top: 50%;
		width: 0;
		height: 2px;
		background: var(--gold);
		transform: translateY( -50% );
		transition: width var(--motion-base);
	}

	#em-nav-links .em-nav-link:hover,
	#em-nav-links .em-nav-link:focus-visible {
		color: var(--gold-deep);
		padding-left: var(--space-4);
	}

	#em-nav-links .em-nav-link:hover::after,
	#em-nav-links .em-nav-link:focus-visible::after {
		width: var(--space-3);
	}

	#em-nav-links .em-nav-link:focus-visible {
		outline: none; /* accent bar is the focus affordance here */
	}

	#em-nav-links .btn-primary {
		/* margin-top: auto pushes the button to the bottom of the
		   flex column (the drawer is a fixed full-viewport panel
		   below the nav, so this anchors the CTA against the
		   drawer's bottom padding). align-self: stretch matches the
		   width of the hero CTAs (full container minus mobile
		   gutter, since the drawer uses the same gutter-mobile on
		   the sides). The drawer's bottom padding above (40px)
		   is the visual offset from the screen bottom. */
		margin-top: auto;
		align-self: stretch;
		font-size: var(--fs-button);
	}

	/* Body scroll lock while drawer is open — stops the page
	   behind from jittering. Scoped to mobile viewports only. */
	html.em-nav-lock,
	html.em-nav-lock body {
		overflow: hidden;
	}
}

/* ============================================================
   Section 2 — Footer
   Matches Footer.jsx: full-bleed --ink-2, four-column grid
   (wordmark+tagline · Sections · Portfolio · Address), hairline
   divider, copyright line. Column titles use the brand-spec
   eyebrow treatment (Sen 700 UPPERCASE, 0.08em tracking, 13/12px).
   No social row: brand-source v1 §4.7 mentions one, but the
   approved wireframe omits it and the nav LinkedIn was removed
   per user review. Can be added later in a follow-up if wanted.
   ============================================================ */

#em-footer {
	display: block;
	width: 100%;
	background: var(--ink-2);
	color: var(--canvas);
	padding: var(--space-8) var(--gutter) var(--space-6);
	margin: 0;
	box-sizing: border-box;
}

#em-footer-grid {
	width: 100%;
	max-width: var(--content-max);
	margin: 0 auto;
	display: grid;
	grid-template-columns: 1.4fr 1fr 1fr 1fr;
	gap: var(--space-7);
	padding-bottom: var(--space-7);
	border-bottom: 1px solid var(--border-translucent-dark);
}

#em-footer-brand {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--space-4);
	width: 100%;
	margin: 0;
}

#em-footer-brand img {
	display: block;
	/* 48px desktop / tablet — was 28px which read undersized as the
	   primary footer brand mark. Mobile bumped to 44px in the @959
	   block; desktop slightly larger to fill the 4-col grid space. */
	height: 48px;
	width: auto;
}

#em-footer-tagline {
	margin: 0;
	max-width: 280px;
	color: var(--fg-on-dark-2);
	font-family: var(--font-sans);
	font-size: var(--fs-caption);
	line-height: var(--lh-caption);
	font-weight: var(--fw-regular);
}

.em-footer-col {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 0;
	width: 100%;
	margin: 0;
}

.em-footer-list {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--space-3);
	width: 100%;
	margin: 0;
	padding: 0;
	font-style: normal;
}

.em-footer-link {
	display: inline-flex;
	align-items: center;
	padding: 0;
	background: transparent;
	border: none;
	color: var(--canvas);
	font-family: var(--font-sans);
	font-size: 15px;
	line-height: 1.4;
	font-weight: var(--fw-regular);
	text-decoration: none;
	transition: color var(--motion-fast);
	cursor: pointer;
}

.em-footer-link:hover,
.em-footer-link:focus-visible {
	color: var(--gold);
}

.em-footer-link:focus-visible {
	outline: 2px solid var(--gold);
	outline-offset: 4px;
	border-radius: 2px;
}

.em-footer-addr {
	margin: 0;
	color: var(--fg-on-dark-2);
	font-family: var(--font-sans);
	font-size: 15px;
	line-height: 1.4;
	font-weight: var(--fw-regular);
}

@media ( max-width: 959px ) {
	.em-footer-addr {
		line-height: 0.7em;
	}
}

/* Footer bottom row — copyright left, LinkedIn icon right.
   The row owns the max-width + margin auto; the children inside
   just sit at the flex ends. */
#em-footer-bottom {
	width: 100%;
	max-width: var(--content-max);
	margin: var(--space-5) auto 0;
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: space-between;
	gap: var(--space-4);
}

#em-footer-copyright {
	margin: 0;
	color: var(--mute);
	font-family: var(--font-sans);
	font-size: 13px;
	line-height: 1.4;
	font-weight: var(--fw-regular);
}

/* Copyright + legal links group — sits left in the footer's bottom row,
   the LinkedIn social anchor sits right via the parent's space-between.

   Layout shift at ≤959px: above the breakpoint, copyright + legal-links
   sit inline on one row separated by a "·". Below the breakpoint, the
   group becomes a column (copyright on top, legal-links centered below)
   and the inline "·" before legal-links is hidden because it would
   render orphaned at the start of its own row.

   `flex-direction: row` is explicit because Bricks' default .brxe-block
   sets flex-direction: column — without an explicit override here the
   children stack vertically. Direct children forced to inline-flex so
   Bricks' default block-level wrapping on heading/button elements
   doesn't push each one onto its own row. */
#em-footer-left-group {
	display: flex !important;
	flex-direction: row !important;
	flex-wrap: nowrap !important;
	align-items: center;
	font-family: var(--font-sans);
	font-size: 13px;
	line-height: 1.4;
	color: var(--mute);
}

#em-footer-left-group > * {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
}

/* Legal-links wrapper — Privacy and Terms always inline together.
   `flex-direction: row` is explicit because Bricks' .brxe-block default
   is flex-direction: column. !important is defensive — Bricks injects
   block-level layout rules at compound-selector specificity that
   sometimes outrank ID selectors via the `[class*="brxe-"]` pattern. */
#em-footer-legal-links {
	display: inline-flex !important;
	flex-direction: row !important;
	flex-wrap: nowrap !important;
	align-items: center;
}

/* Leading "·" before the legal-links group separates it from copyright
   when the two sit on the same row. Hidden at ≤959px (mobile block).

   `display: inline-block; width: 1em; text-align: center` centers the
   "·" glyph at the geometric midpoint of a 1em-wide rendering box.
   The U+00B7 MIDDLE DOT character is naturally left-positioned within
   its native glyph box in Sen — without this override, the visible
   whitespace AFTER the dot reads larger than the whitespace BEFORE it
   even at mathematically equal margins, because the empty right side
   of the glyph box stacks adjacent to the margin-right. */
#em-footer-legal-links::before {
	content: "·";
	display: inline-block;
	width: 1em;
	margin: 0 var(--space-3);
	text-align: center;
	color: var(--mute);
}

/* Single "·" between Privacy Policy and Terms. Implemented as a real
   <span id="em-footer-legal-sep"> child of #em-footer-legal-links —
   sibling to both anchors, NOT inside either. This intentionally
   matches the structural pattern of the leading bullet
   (#em-footer-legal-links::before, also outside any link), so both
   bullets render with identical surrounding-whitespace behavior.

   A previous implementation used `a + a::before` which placed the
   bullet inside the Terms anchor — that wrapping caused the visible
   "·"→"T" gap to read larger than "Privacy"→"·" because Bricks'
   .bricks-button per-element CSS leaked padding past the anchor reset
   (and won the specificity battle vs. our wrapper-scoped rule).

   The span is `aria-hidden` since the bullet is decorative chrome,
   not content. */
#em-footer-legal-sep {
	display: inline-block;
	width: 1em;
	margin: 0 var(--space-3);
	text-align: center;
	color: var(--mute);
	user-select: none;
}

/* Strip Bricks `.bricks-button` defaults (padding, background, bold weight)
   so legal-link anchors render as plain text inheriting the parent group's
   13px / regular / mute typography. Matching the copyright's visual weight
   keeps the bottom row reading as one quiet line of utility chrome — the
   user's brief: "more unassuming. People will find it if they need to." */
#em-footer-legal-links a,
#em-footer-left-group a {
	padding: 0;
	margin: 0;
	background: none;
	background-color: transparent;
	border: 0;
	border-radius: 0;
	font-family: inherit;
	font-size: inherit;
	font-weight: var(--fw-regular);
	line-height: inherit;
	letter-spacing: 0;
	color: var(--mute);
	text-decoration: none;
	transition: color var(--motion-fast);
}

/* Subtle hover — small brightness lift, no color shift. Affords
   clickability without competing with the gold accents elsewhere. */
#em-footer-left-group a:hover,
#em-footer-left-group a:focus-visible {
	color: var(--fg-on-dark-2);
}

#em-footer-left-group a:focus-visible {
	outline: 2px solid var(--gold);
	outline-offset: 2px;
	border-radius: 2px;
}

/* LinkedIn icon — thin-outlined rounded square with the authentic
   "in" brand glyph inside. Mask-image approach so background-color
   (token-driven) tints both the outline stroke and the filled
   "in" letters uniformly. 22px visual inside a 32px hit-area. */
#em-footer-social {
	display: inline-flex;
	flex: 0 0 auto;
	width: 32px;
	height: 32px;
	margin: 0;
	padding: 0;
	background-color: var(--fg-on-dark-2);
	-webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><rect x='3' y='3' width='18' height='18' rx='3' fill='none' stroke='black' stroke-width='1.5'/><circle cx='7.75' cy='7.5' r='1.2' fill='black'/><rect x='6.55' y='10' width='2.4' height='7.5' fill='black'/><path d='M10.5 10h2.4v1.1c0.5-0.7 1.4-1.3 2.6-1.3 1.6 0 2.9 1.2 2.9 2.9V17.5h-2.4v-3.8c0-0.9-0.5-1.6-1.4-1.6-0.9 0-1.3 0.7-1.3 1.6V17.5h-2.4V10z' fill='black'/></svg>");
	mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><rect x='3' y='3' width='18' height='18' rx='3' fill='none' stroke='black' stroke-width='1.5'/><circle cx='7.75' cy='7.5' r='1.2' fill='black'/><rect x='6.55' y='10' width='2.4' height='7.5' fill='black'/><path d='M10.5 10h2.4v1.1c0.5-0.7 1.4-1.3 2.6-1.3 1.6 0 2.9 1.2 2.9 2.9V17.5h-2.4v-3.8c0-0.9-0.5-1.6-1.4-1.6-0.9 0-1.3 0.7-1.3 1.6V17.5h-2.4V10z' fill='black'/></svg>");
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: 22px 22px;
	mask-size: 22px 22px;
	text-decoration: none;
	transition: background-color var(--motion-fast);
}

#em-footer-social:hover,
#em-footer-social:focus-visible {
	background-color: var(--gold);
}

#em-footer-social:focus-visible {
	outline: 2px solid var(--gold);
	outline-offset: 4px;
	border-radius: 4px;
}

/* Footer-at-bottom on short pages — body becomes a flex column and
   #brx-content grows to fill available space. When the page content
   is shorter than the viewport, the footer sits against the bottom
   edge instead of leaving a canvas-colored gap below it. When content
   is longer than the viewport, the footer is at the natural end of
   the page. The footer is NOT fixed and does not track the scroll. */
body {
	min-height: 100vh;
	display: flex;
	flex-direction: column;
}

#brx-content {
	flex: 1 0 auto;
}

/* Mobile footer — drop the link columns entirely (the drawer nav
   already covers section navigation on mobile, so repeating it here
   is redundant for an investor audience). Show wordmark + tagline +
   address + copyright, all centered. */
@media ( max-width: 959px ) {
	#em-footer {
		padding: var(--space-7) var(--gutter-mobile) var(--space-5);
		text-align: center;
	}

	#em-footer-grid {
		grid-template-columns: 1fr;
		gap: var(--space-6);
		padding-bottom: var(--space-6);
	}

	#em-footer-brand {
		align-items: center;
		max-width: none;
	}

	/* Bump the wordmark on mobile — 28px (desktop) reads too small as
	   a footer brand mark on phone screens where the wordmark is the
	   primary visual identity (no nav, no hero context). 44px sits in
	   the requested 40-50px range. */
	#em-footer-brand img {
		height: 44px;
	}

	#em-footer-tagline {
		max-width: 320px;
		margin-inline: auto;
	}

	/* Hide Sections + Portfolio columns on mobile (#em-footer-grid's
	   2nd and 3rd children — brand is 1st, address is 4th). */
	#em-footer-grid > .em-footer-col:nth-child(2),
	#em-footer-grid > .em-footer-col:nth-child(3) {
		display: none;
	}

	#em-footer-grid > .em-footer-col {
		align-items: center;
	}

	#em-footer-grid > .em-footer-col .em-footer-list {
		align-items: center;
	}

	#em-footer-bottom {
		flex-direction: column;
		gap: var(--space-3);
		justify-content: center;
		align-items: center;
	}

	#em-footer-copyright {
		text-align: center;
	}

	/* Below 960px: stack copyright above legal-links, centered. The
	   leading "·" before legal-links is hidden because the legal-links
	   wrapper is now on its own row — a leading orphan glyph would
	   read as a typo. The single "·" BETWEEN Privacy and Terms stays
	   visible because that's defined on `a + a::before`. !important
	   re-applied to defeat the desktop rule's !important on the
	   row direction. */
	#em-footer-left-group {
		flex-direction: column !important;
		align-items: center;
		justify-content: center;
		text-align: center;
		gap: var(--space-2);
	}

	#em-footer-legal-links {
		justify-content: center;
	}

	#em-footer-legal-links::before {
		display: none;
	}

	/* Tighter bullet on the centered legal row — when Privacy and Terms
	   sit alone without copyright leading, the desktop's 12px margin
	   reads as too generous and visually splits the pair. 8px each side
	   keeps "Privacy Policy · Terms" reading as a single utility unit. */
	#em-footer-legal-sep {
		margin: 0 var(--space-2);
	}

	/* Nuclear padding reset on legal-link anchors at this breakpoint.
	   Bricks `.bricks-button` default padding-inline (~16px) leaks past
	   the base anchor reset above. Even though the bullet is now a
	   sibling element (not inside the Terms anchor), zeroing button
	   padding here keeps anchor hit-targets visually flush with their
	   text content on mobile/tablet where the centered row is tight. */
	#em-footer-legal-links a {
		padding: 0 !important;
		padding-inline: 0 !important;
		padding-block: 0 !important;
		margin: 0 !important;
	}
}

/* ============================================================
   SectionEyebrow primitive — numbered wayfinder

   Used 5 times: 01 / Our Approach (Hero), 02 / Portfolio,
   03 / Purpose, 04 / Collaborators (dark band), 05 / Connect.
   Shared Global Classes so every use stays in lockstep.

   Anatomy: 24×2px gold bar (::before) + Sen 700 12px UPPERCASE
   label with 0.14em tracking. Wider-than-chip-eyebrow tracking
   is intentional editorial chrome — the 5 numbered eyebrows rhyme
   across sections as wayfinding "ticker" marks.

   Variants:
     .em-eyebrow          — canvas surfaces (mute label)
     .em-eyebrow-on-dark  — dark band (translucent canvas label)
   ============================================================ */

.em-eyebrow,
.em-eyebrow-on-dark {
	display: inline-flex;
	flex-direction: row;
	flex-wrap: nowrap;
	align-items: center;
	width: auto;
	gap: var(--space-3);
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: 12px;
	line-height: 1;
	font-weight: var(--fw-bold);
	letter-spacing: 0.14em;
	text-transform: uppercase;
	text-decoration: none;
}

.em-eyebrow::before,
.em-eyebrow-on-dark::before {
	content: "";
	display: inline-block;
	flex: 0 0 auto;
	width: 24px;
	height: 2px;
	background: var(--gold);
}

.em-eyebrow         { color: var(--mute); }
.em-eyebrow-on-dark { color: rgba(251, 247, 238, 0.65); }

/* ============================================================
   Section 3 — Hero
   <section id="top"> (anchor target for nav logo + footer
   "Our Approach" link). Two stacked blocks:

     Stage — full-bleed video with copy + CTAs overlaid
       Edge-to-edge `<video>` background, gradient overlay for
       contrast, copy + CTA pair anchored vertically centered in
       the left half of a 1200-max inner container. The sticky
       <nav> overlays the top of this stage in transparent state
       on the home page (see Section 1 — Header rules) and fades
       to canvas as the user scrolls past the stage.

     Block B — "Our Approach" sub-block (canvas-bg, constrained)
       Separated from the stage by the section's natural padding.
       Existing 2-col composition retained verbatim — gold-slab
       kicker LEFT, sub-H2 + paragraph RIGHT — followed by a
       full-width documentary photograph that visually proves the
       "where our work lives" tagline.

   Mobile (<960px): stage shrinks to a clamp-bounded portrait
   block; Block B stacks single-column.
   ============================================================ */

#top {
	display: block;
	width: 100%;
	/* `enl-cls-section-canvas` global class applies var(--space-10)
	   top + bottom padding via the .section-canvas rule. The full-
	   bleed stage owns the top of the section, so we override the
	   top padding to zero (ID selector wins on specificity) while
	   letting the bottom padding stand. */
	padding-top: 0;
	margin: 0;
	box-sizing: border-box;
}

/* ---- Stage — full-bleed video with overlay copy ----

   The stage escapes the 1200-max container by being a direct child
   of <section id="top"> at full width. Inside, three layered
   children:
     1. <video>            — absolute-positioned, object-fit: cover.
     2. <div #overlay>     — pointer-events: none gradient guard.
     3. <div #stage-inner> — the 1200-max constrained copy column.

   z-index stack: video (1) → overlay (2) → inner copy (3). Position
   relative on the stage establishes the containing block for all
   three absolute layers below.
*/
#em-hero-stage {
	position: relative;
	display: block;
	width: 100%;
	/* Clamped height — never shorter than 640px on a vertical-monitor
	   laptop, never taller than 800px on a 4K screen. 80vh on the
	   midband leaves a ~20vh sliver of Block B visible at scrollY 0,
	   signaling "more below" without burying the wayfinder. */
	height: clamp( 640px, 80vh, 800px );
	overflow: hidden;
	margin: 0;
	padding: 0;
	background: var(--ink); /* Fallback while video buffers. */
}

/* Pull the stage up UNDER the sticky nav so the transparent-state
   nav genuinely overlays the video (cinq.care pattern). Without this,
   the sticky nav sits in document flow and pushes the stage 72px
   down — the transparent nav would float above the page-bg gap, not
   over the video. Scoped to body.home so other pages (where content
   should start BELOW the nav, not behind it) are unaffected.
   Mobile uses --nav-height-mobile (56px). */
body.home #em-hero-stage {
	margin-top: calc( var(--nav-height-desktop) * -1 );
}

@media ( max-width: 1099px ) {
	body.home #em-hero-stage {
		margin-top: calc( var(--nav-height-mobile) * -1 );
	}
}

#em-hero-stage video,
#em-hero-stage > .brxe-video {
	display: block;
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
	z-index: 1;
}

#em-hero-stage video {
	object-fit: cover;
}

/* Gradient overlay — two stacked gradients:
     1. 90deg horizontal: heavily darkens the LEFT half of the stage
        (where copy sits at all viewport widths) and fades to near-
        clear on the right (lets the video breathe).
     2. 180deg vertical:   subtle top + bottom darkening so the
        white nav logo (transparent state) and the CTA buttons stay
        legible regardless of where lighter video content lands.

   pointer-events: none so clicks fall through to the stage-inner
   above, where the buttons sit. */
#em-hero-stage-overlay {
	position: absolute;
	inset: 0;
	z-index: 2;
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
	background:
		linear-gradient(
			90deg,
			rgba( 27, 26, 23, 0.65 ) 0%,
			rgba( 27, 26, 23, 0.35 ) 50%,
			rgba( 27, 26, 23, 0.05 ) 100%
		),
		linear-gradient(
			180deg,
			rgba( 27, 26, 23, 0.20 ) 0%,
			rgba( 27, 26, 23, 0.00 ) 35%,
			rgba( 27, 26, 23, 0.00 ) 65%,
			rgba( 27, 26, 23, 0.30 ) 100%
		);
	pointer-events: none;
}

#em-hero-stage-inner {
	position: relative;
	z-index: 3;
	display: flex;
	flex-direction: column;
	justify-content: center; /* Vertical center of the stage. */
	align-items: stretch;
	width: 100%;
	max-width: var(--content-max);
	height: 100%;
	margin: 0 auto;
	padding: 0 var(--gutter);
	box-sizing: border-box;
}

#em-hero-a-copy {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--space-5);
	width: auto;
	/* Capped width — H1 stays in the left ~55% of the screen on
	   ultrawide monitors so the video on the right reads as a
	   coherent panel rather than a thin strip. */
	max-width: clamp( 320px, 55%, 620px );
	margin: 0;
	padding: 0;
}

#em-hero-h1 {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: var(--fs-display);
	line-height: var(--lh-display);
	font-weight: var(--fw-regular);
	letter-spacing: -0.01em;
	/* Light-on-dark — copy now overlays the video. */
	color: var(--canvas);
	/* Subtle depth shadow keeps the H1 legible if the video frame
	   under the H1 happens to be a light-colored frame. Brand
	   spec §6 forbids drop-shadow pyrotechnics — this is a 24px
	   depth blur at 18% opacity, not a stylistic shadow. */
	text-shadow: 0 1px 24px rgba( 0, 0, 0, 0.18 );
}

/* Accent word — brand system §3.2 sanctions one Display-scale
   word colored differently for the hero only. On the dark video
   we use the brighter --gold (vs --gold-deep on canvas) for
   stronger separation against ink rather than against canvas. */
#em-hero-h1 .em-hero-accent {
	color: var(--gold);
	font-weight: var(--fw-bold);
}

#em-hero-para {
	margin: 0;
	padding: 0;
	max-width: 540px;
	font-family: var(--font-sans);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	font-weight: var(--fw-regular);
	/* canvas at 88% — slight de-emphasis vs the H1 to preserve
	   typographic hierarchy on a busy video background. */
	color: rgba( 251, 247, 238, 0.88 );
	text-shadow: 0 1px 16px rgba( 0, 0, 0, 0.20 );
}

#em-hero-btns {
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--space-4);
	width: auto;
	margin: var(--space-2) 0 0;
	padding: 0;
}

/* Reduced motion — hide the video, paint the poster SVG as the
   stage background. Video autoplay is visual motion and must be
   suppressed under prefers-reduced-motion per WCAG + CLAUDE.md. */
@media ( prefers-reduced-motion: reduce ) {
	#em-hero-stage video,
	#em-hero-stage > .brxe-video {
		display: none;
	}

	#em-hero-stage {
		background-image: url( "/wp-content/themes/bricks-enlighten/assets/images/hero-video-poster.svg" );
		background-size: cover;
		background-position: center;
		background-repeat: no-repeat;
	}
}

/* ---- Block B — "Our Approach" sub-block ----

   Image-LEFT / text-RIGHT split composition (Apr 2026 redesign — was
   "stacked text + image below," called out as ungainly). The
   documentary photograph IS the visual anchor of the section now;
   the right column carries the full text composition (eyebrow chip
   → gold-slab kicker → sub-H2 → paragraph) stacked. Top-aligned
   (May 2026 v6 — was vertically centered, but reducing the Sub-H2
   from 28 to 22px shortened the text column enough that vertical
   centering pushed the eyebrow noticeably below the image's top
   edge). Top alignment keeps the eyebrow anchored to the image
   regardless of the text column's height. Mobile stacks
   image-second per Option B reorder. */

#em-hero-wrap {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	width: 100%;
	max-width: var(--content-max);
	margin: 0 auto;
	/* Top padding matches the inter-section gap (80 desktop+tablet,
	   80 mobile = 2x the .section-canvas per-side padding) so the
	   gap above 01/APPROACH equals the gap above every other
	   section's eyebrow. v4 halved from 160 → 80 desktop. Bottom
	   rhythm comes from the section-canvas padding-bottom. */
	padding: 80px var(--gutter) 0;
	box-sizing: border-box;
}

/* Block B — image-LEFT / text-RIGHT split on canvas. No panel
   surface (Apr 2026 v2 — panel reverted; broke page rhythm with
   the rest of the canvas sections). 6fr 6fr = 50/50 so the
   documentary photo reads at a substantial editorial size,
   balancing the body statement + paragraph on the right. */
#em-hero-b {
	display: grid;
	grid-template-columns: 6fr 6fr;
	gap: var(--space-7);
	align-items: start;
	width: 100%;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

/* Image column — Bricks renders a bare <img> when image.external =
   true with no link/caption/tag setting (gotcha #20). The wrapper
   carries the radius + aspect-ratio + bg-fallback; the <img> just
   fills it via object-fit: cover. aspect-ratio reserves the slot
   before the WebP loads (zero CLS).

   Apr 2026: radius dropped from --radius-feature (24px) to
   --radius-image (16px) so it nests cleanly inside the panel's
   24px corners. 1px --ink-tint-08 hairline defines the photo edge
   against the warm panel surface without reading as a frame. */
#em-hero-approach-img {
	display: block;
	width: 100%;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
	border-radius: var(--radius-image);
	border: 1px solid var(--ink-tint-08);
	overflow: hidden;
	background: var(--ink-tint-08);
	aspect-ratio: 16 / 9;
}

#em-hero-approach-img img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	margin: 0;
	padding: 0;
}

/* Text column — single stacked composition.
   Order: eyebrow → SUBHEAD ("Our Approach", spec-required) → body
   H2 → paragraph. 16px gap (var(--space-4)) matches the
   eyebrow→heading distance used in every other section
   (Portfolio, Purpose, Collaborators, Connect) so the section-
   header rhythm is uniform across the page. */
#em-hero-b-text {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--space-4);
	width: auto;
	margin: 0;
	padding: 0;
}

/* Eyebrow tightening — Hero-only override (Apr 2026 polish). Slightly
   wider tracking than the default .em-eyebrow (0.14em) so the chapter-
   marker reads more institutional-confident at a glance. Scoped to
   Block B so the other section eyebrows keep the page-rhythm tracking. */
#em-hero-b-text > .em-eyebrow {
	letter-spacing: 0.16em;
}

/* Approach section heading — "Care for neuromotor conditions should
   be as relentless as the people who need it." Carries the subhead
   pattern (22/24/20 bold) and serves as the section's H2 directly
   under the eyebrow. v7 (May 2026): the prior "Our Approach" H3
   subhead was removed in favor of the lead statement standing on
   its own — eyebrow → heading → body, matching the rhythm used in
   Portfolio / Purpose / Collaborators / Connect. */
#em-hero-approach-h2 {
	margin: 0;
	padding: 0;
	max-width: 540px;
	font-family: var(--font-sans);
	/* v6 (May 2026): desktop reduced from --fs-quote (28px) to 22px
	   per design pass — quote-weight was reading as a competing
	   anchor against the H2 above it; dialed down so it serves as
	   a sub-anchor / lead-in instead of a parallel heading. Tablet
	   keeps 24px (line 1469 area), mobile keeps 20px (line 1573
	   area, set during Option B reorder). */
	font-size: 22px;
	line-height: var(--lh-quote);
	font-weight: var(--fw-bold);
	letter-spacing: -0.005em;
	color: var(--ink);
}

#em-hero-approach-p {
	margin: 0;
	padding: 0;
	max-width: 540px;
	font-family: var(--font-sans);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	font-weight: var(--fw-regular);
	color: var(--ink);
}

/* ---- Tablet ---- */

@media ( max-width: 1199px ) {
	#em-hero-stage {
		height: clamp( 480px, 70vh, 640px );
	}

	#em-hero-a-copy {
		max-width: 60%;
	}

	#em-hero-wrap {
		/* v6 (May 2026): tablet gap above 01/APPROACH eyebrow set to
		   40 per spec ("Approach section: 40px top padding" tablet).
		   The em-hero-wrap padding-top is the gap from the hero
		   video bottom to the Approach eyebrow — visually reads as
		   the "Approach section top padding" because Block B is the
		   Approach content area. Was 80px (matched the v5 inter-
		   section gap which is no longer the spec'd value). */
		padding-top: 40px;
	}

	#em-hero-b {
		grid-template-columns: 6fr 6fr;
		gap: var(--space-6);
		padding: 0;
	}

	#em-hero-approach-h2 {
		font-size: 24px;
	}
}

/* ---- Mobile: <960px ---- */

@media ( max-width: 959px ) {
	/* Mobile hero: switch from a clamped fixed height with centered
	   content to a flexible min-height with explicit top + bottom
	   padding. The fixed clamp() height + justify-content: center
	   model squashed the H1 against the nav and made top/bottom
	   spacing impossible to control independently. min-height keeps
	   visual presence on tall viewports; height: auto lets the stack
	   grow naturally so the spacing rhythm is honored. */
	#em-hero-stage {
		height: auto;
		min-height: clamp( 560px, 80vh, 720px );
	}

	/* Mobile is too narrow to support the 90deg horizontal split —
	   text would always overlap the right-fade region. Switch to a
	   uniform vertical darkening so copy reads cleanly anywhere on
	   the stage regardless of what video frame is playing under it. */
	#em-hero-stage-overlay {
		background: linear-gradient(
			180deg,
			rgba( 27, 26, 23, 0.40 ) 0%,
			rgba( 27, 26, 23, 0.55 ) 100%
		);
	}

	#em-hero-stage-inner {
		/* Top-align the copy stack and add explicit breathing room
		   above + below. Top padding = nav-height + 80px because the
		   stage is pulled up under the sticky nav by -nav-height, so
		   the first 76px of the stage sits behind the nav bar; we
		   need to clear it before the H1 starts. Bottom padding is a
		   flat 80px so the stack is evenly framed top + bottom. */
		justify-content: flex-start;
		height: auto;
		padding: calc( var(--nav-height-mobile) + 80px ) var(--gutter-mobile) 80px;
	}

	#em-hero-a-copy {
		max-width: 100%;
		/* Wider stack gap on mobile (40px vs desktop space-5 = ~16px).
		   Single-column copy benefits from more separation between the
		   three voice levels (statement / context / action). */
		gap: 40px;
	}

	#em-hero-h1 {
		font-size: 40px;
		line-height: 1.15;
	}

	#em-hero-para {
		font-size: 17px;
	}

	#em-hero-btns {
		width: 100%;
		justify-content: flex-start;
		/* Extra margin-top on mobile (16px) layered on top of the
		   parent's 28px gap = 44px total separation between the body
		   paragraph and the CTA pair. Action elements get more
		   breathing room than inter-text gaps so the eye reads them
		   as a distinct call-to-action moment, not as continuation. */
		margin-top: 16px;
	}

	/* Match button widths when they stack on mobile. The two CTAs
	   ("Connect with us" / "See the portfolio") have different label
	   lengths and read as a sloppy rhythm when each takes its
	   natural inline-flex width and stacks. Force 100% width so the
	   stacked pair always reads as a clean equal-weight pair. */
	#em-hero-btns > .btn-primary,
	#em-hero-btns > .btn-outline,
	#em-hero-btns > .btn-outline-on-dark {
		width: 100%;
	}

	#em-hero-wrap {
		/* v7 (May 2026): mobile gap above 01/APPROACH eyebrow bumped
		   to 80 per the v7 mobile-spacing reopen. Reads as the
		   "Approach section top padding" because Block B is the
		   Approach content area — gives the eyebrow a clean breath
		   between the hero video stage and the editorial copy below. */
		padding-top: 80px;
		padding-inline: var(--gutter-mobile);
	}

	/* Mobile (≤959px) — Option B order: text-top → IMAGE → body
	   paragraph. Eyebrow + H2 + Sub-H2 anchor the section's claim,
	   the image provides visual context as a mid-section breath,
	   and the body paragraph closes with substantive copy. Replaces
	   the v1 image-first ordering which read as "photo with no
	   context" on mobile (institutional brands lead with copy, image
	   is supporting evidence — not the hook). Desktop+tablet keep
	   their image-LEFT / text-RIGHT 2-col layout untouched.

	   Mechanism: flatten the text block via display:contents so its
	   children become direct grid items of #em-hero-b, then use CSS
	   `order` on each grid item to interleave them with the image.
	   No DOM changes — JSON unchanged, AT order matches original.
	   (If the AT order also matters for Option B in the future, swap
	   to a true DOM restructure per the conversation thread.) */
	#em-hero-b {
		grid-template-columns: 1fr;
		/* v7 (May 2026): mobile flatten gap matches desktop rhythm
		   exactly (space-4 = 16). Tried space-6 then space-5; both
		   read too loose vs desktop. Mirroring desktop precisely
		   keeps the heading→subhead pair tight at every breakpoint. */
		gap: var(--space-4);
		padding: 0;
	}

	#em-hero-b-text {
		display: contents;
	}

	#em-hero-b .em-eyebrow {
		order: 1;
	}

	#em-hero-b #em-hero-approach-h2 {
		order: 2;
		font-size: 20px;
	}

	#em-hero-b #em-hero-approach-img {
		order: 3;
		border-radius: var(--radius-image);
		/* v7 (May 2026): heading → image gap nets to 32px (16 wrap
		   gap + 16 margin) so the eyebrow → heading reads tight at
		   16px and the image lands with deliberate breathing room.
		   Matches Portfolio heading → tabs and Purpose heading →
		   photo at the same breakpoint. */
		margin-top: var(--space-4);
	}

	#em-hero-b #em-hero-approach-p {
		order: 4;
	}
}

/* ============================================================
   LogoCallout primitive — Global Class .em-logo-callout

   Used 3× in Section 4 (Portfolio) and likely re-used in
   Collaborators / Connect. A canvas-bg card with a relationship
   pill badge that OVERHANGS the top edge — the badge is the
   "earn the gold" moment for each portfolio entry.

   Anatomy:
     - 36/40px interior padding, min-height 180px so the three
       panels keep visual parity even when one logo is taller.
     - data-callout-label drives the overhanging gold pill via
       a ::before pseudo. Centered, top: -14px so it bridges
       the card's top edge.
     - The pill uses gold-deep (not gold) — gold-deep on canvas
       passes WCAG 3:1 for large UI text and reads more confident
       at 11px UPPERCASE than the brighter gold.
   ============================================================ */

.em-logo-callout {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: var(--space-5);
	width: 100%;
	max-width: 640px;
	min-height: 180px;
	margin: 0 auto;
	/* v7 (May 2026): asymmetric top/bottom (48 / 36) compensates for
	   the pill's ~11px overhang INSIDE the card top edge (top: -14
	   on a ~25px-tall pseudo). Net: visible pill→content gap (37px)
	   ≈ visible content→bottom gap (36px). Was 36/36 which produced
	   a visible imbalance (pill→content 25, content→bottom 36). */
	padding: 48px 40px 36px;
	background: var(--canvas);
	border: 1px solid var(--light-grey);
	border-radius: var(--radius-image);
	box-sizing: border-box;
}

.em-logo-callout::before {
	content: attr( data-callout-label );
	position: absolute;
	top: -14px;
	left: 50%;
	transform: translateX( -50% );
	padding: 6px 16px;
	/* v6 (May 2026): badge colors dialed back from gold-deep fill to
	   white-on-ink with a light-grey hairline border. The original
	   gold pill was reading as a competing CTA against the actual
	   gold "Learn more" button below the body copy in each panel —
	   two gold-fill elements stacked on the same card created a
	   visual redundancy that flattened the gold's signal value.
	   White makes the badge a quiet relationship label ("Acquired",
	   "Strategic Partnership", "Collaborative Initiative") and
	   reserves the gold weight for the action CTA. */
	background: var(--white);
	color: var(--ink);
	border: 1px solid var(--light-grey);
	border-radius: var(--radius-pill);
	font-family: var(--font-sans);
	font-size: 11px;
	line-height: 1;
	font-weight: var(--fw-bold);
	letter-spacing: 0.1em;
	text-transform: uppercase;
	white-space: nowrap;
}

/* ============================================================
   Section 4 — Portfolio

   Anchor target #portfolio (Header nav + Hero CTA). Canvas
   surface (.section-canvas), 1200-max container. Section header
   (eyebrow / H2 / sub) + pill-tab carousel inside a white feature
   card + slide-indicator dots.

   Tabs: ARIA tablist + 3 tabs + 3 tabpanels. Active panel toggled
   via the [hidden] HTML attribute (not just CSS) so AT software
   gets correct state. Keyboard: ←/→ cycle tabs, Home/End jump to
   first/last, activation on focus. JS lives in
   enlighten_portfolio_frontend_script() (functions.php @ wp_footer 20).
   ============================================================ */

#portfolio {
	display: block;
	width: 100%;
	margin: 0;
	/* Section vertical padding handled by .section-canvas Global Class
	   (Apr 2026 polish pass — duplicate padding rules stripped so the
	   section gap matches every other section uniformly). */
	background: var(--canvas);
	color: var(--ink);
	box-sizing: border-box;
}

#em-portfolio-wrap {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	/* gap is 0 at desktop+tablet so the head→tabs and tabs→card
	   gaps can be controlled independently — the embedded-pill
	   pattern needs the tabs to overlap the card's top edge via
	   a negative margin, which is incompatible with a uniform
	   flex-gap. Mobile (≤959px) restores a positive gap below. */
	gap: 0;
	width: 100%;
	max-width: var(--content-max);
	margin: 0 auto;
	padding: 0 var(--gutter);
	box-sizing: border-box;
}

/* ---- Section header ---- */

#em-portfolio-head {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--space-4);
	width: 100%;
	max-width: 760px;
	margin: 0;
	/* Restores the head→tabs gap that was previously the wrap's
	   flex-gap. Mobile resets this to 0 since the wrap re-enables
	   its own gap below 959px. */
	margin-bottom: var(--space-7);
	padding: 0;
}

#em-portfolio-sub {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	/* v7 (May 2026): subhead pattern — mirrors the Approach lead
	   statement (#em-hero-approach-h2). 22 desktop / 24 tablet /
	   20 mobile, bold quote-line typography. Replaces fs-body
	   regular so cross-section subheads share one rhythm. */
	font-size: 22px;
	line-height: var(--lh-quote);
	font-weight: var(--fw-bold);
	letter-spacing: -0.005em;
	color: var(--ink);
}

/* ---- Pill tablist — segmented-control idiom ---- */

#em-portfolio-tabs {
	display: inline-flex;
	flex-direction: row;
	flex-wrap: nowrap;
	align-items: center;
	gap: 6px;
	width: auto;
	max-width: 100%;
	margin: 0;
	padding: 6px;
	/* Pills' container background mirrors the card surface (white)
	   so the bottom half of the pill row, which overlaps the card,
	   reads as a notch-extension of the card upward rather than a
	   contrasting capsule. The 1px light-grey border continues the
	   card's outline without seam. */
	background: var(--white);
	border: 1px solid var(--light-grey);
	border-radius: var(--radius-pill);
	box-sizing: border-box;
	/* Embedded-pill pattern: pills sit centered horizontally on the
	   card's top edge. Outer container is 48px tall (6px+6px padding
	   + 34px inner pill + 2px border); margin-bottom -24px pulls the
	   next sibling (#em-portfolio-card) up by half the pill height
	   so the card top renders at the pills' vertical center. The
	   z-index lifts pills over the card's border at the overlap. */
	align-self: center;
	position: relative;
	z-index: 2;
	margin-bottom: -24px;
}

.em-portfolio-tab {
	display: inline-flex;
	flex: 0 0 auto;
	flex-direction: row;
	align-items: center;
	justify-content: center;
	width: auto;
	margin: 0;
	padding: 10px 20px;
	background: transparent;
	color: var(--ink);
	border: none;
	border-radius: var(--radius-pill);
	font-family: var(--font-sans);
	font-size: 14px;
	line-height: 1;
	font-weight: var(--fw-bold);
	letter-spacing: 0;
	white-space: nowrap;
	cursor: pointer;
	transition: background var(--motion-base), color var(--motion-base);
}

.em-portfolio-tab:hover {
	background: var(--ink-tint-08);
}

.em-portfolio-tab[aria-selected="true"] {
	background: var(--ink);
	color: var(--canvas);
}

.em-portfolio-tab[aria-selected="true"]:hover {
	background: var(--ink-2);
}

.em-portfolio-tab:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 2px;
}

.em-portfolio-tab[aria-selected="true"]:focus-visible {
	outline-color: var(--gold);
}

/* ---- Active panel card frame ---- */

#em-portfolio-card {
	/* Grid-stack: all three panels occupy the same grid cell. The
	   cell auto-sizes to the tallest panel's natural height, so
	   switching tabs never resizes the card. (v6 first try used
	   min-height: 640px which only enforced a floor — taller panels
	   still grew the card. Grid-stack is measurement-free and
	   self-adjusting.) */
	display: grid;
	grid-template-columns: 1fr;
	width: 100%;
	margin: 0;
	/* Top padding is 64 (panel content baseline) + 24 (clearance for
	   the embedded pill row that overhangs the card top edge by half
	   its height). Net: panel content has the original 64px clear
	   gap from the pills' bottom edge. Sides + bottom unchanged. */
	padding: 88px 56px 64px;
	background: var(--white);
	border: 1px solid var(--light-grey);
	border-radius: var(--radius-feature);
	box-sizing: border-box;
}

.em-portfolio-panel {
	/* All panels stack in the same grid cell (column 1, row 1). The
	   active panel is visible; inactive panels are kept in layout
	   (so they contribute to cell height) but invisible. */
	grid-column: 1;
	grid-row: 1;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--space-7);
	width: 100%;
	margin: 0;
	padding: 0;
	text-align: center;
}

/* Inactive panels (those with the [hidden] attribute set by the JS):
   override the browser-default `display: none` so the panel STAYS in
   layout and contributes to the grid cell's intrinsic height. Hide
   visually via visibility + pointer-events. The [hidden] attribute
   is still respected by AT software (which uses the attribute, not
   the computed display) so the active-tab semantic is preserved. */
.em-portfolio-panel[hidden] {
	display: flex;
	visibility: hidden;
	pointer-events: none;
}

/* Panel header — small eyebrow + H3 + one-liner */

.em-panel-head {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--space-3);
	width: 100%;
	max-width: 720px;
	margin: 0;
	padding: 0;
}

.em-panel-h3 {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: 40px;
	line-height: 1.2;
	font-weight: var(--fw-bold);
	letter-spacing: -0.005em;
	color: var(--ink);
}

.em-panel-oneliner {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: var(--fs-body);
	line-height: 1.55;
	font-weight: var(--fw-regular);
	color: var(--ink);
}

/* LogoCallout dual-logo arrangement (Edna acquired by AngelEye)

   Grid `1fr | auto | 1fr` puts the bridge text in a center track that
   sits at the geometric 50% of the callout — directly under the
   "Acquired" pill (which is ::before at left: 50%). Logos right- /
   left-align into the flanking 1fr tracks so both sit equidistant
   from the bridge regardless of their intrinsic widths. Flex-row
   centered the row as a single block, which made the bridge land
   wherever asymmetric logo widths pushed it (not at 50%) and made
   the whole composition appear optically shifted. */

.em-logo-callout-row {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	gap: var(--space-6);
	width: 100%;
	max-width: 100%;
	margin: 0;
	padding: 0;
}

/* Position-based selectors so the AngelEye image still aligns
   correctly when wrapped in an <a> by the Bricks image-link
   feature. (Bricks renders <a><img></a> as the row's last
   direct child, breaking `> img:last-of-type` which would then
   match EDNA on the left.) */
.em-logo-callout-row > :first-child {
	justify-self: end;
}

.em-logo-callout-row > .em-logo-bridge {
	justify-self: center;
}

.em-logo-callout-row > :last-child {
	justify-self: start;
}

.em-logo-callout-row img {
	display: block;
	width: auto;
	/* v7 (May 2026): EDNA upweighted from 36 → 44 so its visual mass
	   balances against AngelEye's larger lockup (wordmark + ring +
	   stacked HEALTH). AngelEye stays the marginally-larger anchor at
	   52 (em-logo-tall) — the asymmetry preserves the "acquirer is
	   the bigger logo" relationship signal without leaving EDNA
	   looking diminished beside it. */
	height: 44px;
	max-width: 100%;
	object-fit: contain;
}

/* Two selectors so the height applies whether Bricks puts the
   em-logo-tall class on the <img> directly OR on a wrapping
   element (anchor / figure) — depends on whether the image
   element has a link configured. */
.em-logo-callout-row img.em-logo-tall,
.em-logo-callout-row .em-logo-tall img {
	height: 52px;
}

.em-logo-callout-row .em-logo-bridge {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: 14px;
	line-height: 1;
	font-weight: var(--fw-regular);
	font-style: italic;
	color: var(--mute);
}

/* Single-logo arrangement (Gravitrex). Last selector also covers
   the case where the image has a link — Bricks wraps the <img>
   in an <a>, the em-logo-callout-single class lives on either the
   img or its anchor wrapper, and the descendant img inherits the
   sizing through the second branch below. */

.em-logo-callout img.em-logo-callout-single,
.em-logo-callout > img.em-logo-callout-single,
.em-logo-callout .em-logo-callout-single,
.em-logo-callout .em-logo-callout-single img {
	display: block !important;
	width: auto !important;
	height: auto !important;
	max-width: 320px !important;
	max-height: 48px !important;
	object-fit: contain;
	margin-inline: auto;
}

/* Clickable partner logos (AngelEye, Gravitrex). Subtle opacity
   hover signals interactivity; the focus-visible ring matches the
   site-wide outline pattern for keyboard users. */
a.em-logo-link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	text-decoration: none;
	transition: opacity var(--motion-fast);
}

a.em-logo-link:hover,
a.em-logo-link:focus-visible {
	opacity: 0.7;
}

a.em-logo-link:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 4px;
	border-radius: 2px;
}

.em-logo-callout-single {
	display: block;
	width: auto;
	height: auto;
	max-width: 320px;
	max-height: 48px;
	object-fit: contain;
	max-width: 100%;
	margin: 0;
	padding: 0;
	object-fit: contain;
}

/* Human Resilience — three text tiles */

.em-resilience-tiles {
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: var(--space-4);
	width: auto;
	max-width: 100%;
	margin: 0;
	padding: 0;
}

.em-resilience-tile {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	width: auto;
	margin: 0;
	padding: 14px 18px;
	background: var(--white);
	color: var(--ink);
	border: 1px solid var(--light-grey);
	border-radius: var(--radius-input);
	font-family: var(--font-sans);
	font-size: 18px;
	line-height: 1;
	/* v6 (May 2026): bold (700) instead of extrabold (800). Two
	   problems with the v1 800 weight:
	   1. Visual: extrabold tiles read as competing with the H3 above
	      them and the Learn more CTA below — too many heavy hits in
	      a small content area.
	   2. Performance: Sen ExtraBold isn't in the hero-weight preload
	      list (only Regular + Bold are preloaded per Phase 2). When
	      the user clicks the Human Resilience tab, the tile elements
	      paint with the fallback Sen Regular until ExtraBold finishes
	      its lazy fetch — visible flicker / font-swap. Dropping to
	      Bold uses an already-preloaded weight, eliminating the
	      flicker AND tuning the visual rhythm down. */
	font-weight: var(--fw-bold);
	letter-spacing: -0.01em;
}

.em-resilience-plus {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: 18px;
	line-height: 1;
	font-weight: var(--fw-bold);
	color: var(--mute);
}

/* Mobile: the three tiles wrap one-per-line at narrow widths and the
   "+" connectors land in awkward partial-row positions (zigzag).
   Switch to a clean centered column with the "+" between rows so the
   partnership metaphor still reads, and force tiles to a uniform
   width so the column looks intentional rather than ragged. */
@media ( max-width: 768px ) {
	.em-resilience-tiles {
		flex-direction: column;
		gap: var(--space-3);
	}
	.em-resilience-tile {
		width: 100%;
		max-width: 240px;
	}
	.em-resilience-plus {
		line-height: 1;
	}
}

/* Body copy block + read-more (native <details>) */

.em-panel-body {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: var(--space-5);
	width: 100%;
	max-width: 720px;
	margin: 0;
	padding: 0;
	text-align: left;
}

.em-panel-body p {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: 17px;
	line-height: 1.65;
	font-weight: var(--fw-regular);
	color: var(--ink);
}

/* Read-more — JS-driven aria-expanded button paired with a sibling
   [hidden] content block. Single-source-of-truth interactivity
   (the same enlighten_portfolio_frontend_script() owns both tabs
   and read-more) keeps debugging predictable across rendering
   contexts. The [hidden] HTML attribute is used (not just CSS)
   so AT software gets the correct visible/hidden state. */

.em-readmore-content {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: var(--space-5);
	width: 100%;
	margin: 0;
	padding: 0;
}

.em-readmore-content[hidden] {
	display: none;
}

.em-readmore-toggle {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: flex-start;
	align-self: flex-start;
	gap: 6px;
	width: auto;
	margin: 0;
	padding: 0;
	background: transparent;
	border: none;
	color: var(--ink);
	font-family: var(--font-sans);
	font-size: 14px;
	line-height: 1;
	font-weight: var(--fw-bold);
	cursor: pointer;
}

.em-readmore-toggle::after {
	content: "";
	display: inline-block;
	width: 8px;
	height: 8px;
	border-right: 2px solid var(--ink);
	border-bottom: 2px solid var(--ink);
	transform: translateY( -2px ) rotate( 45deg );
}

@media ( prefers-reduced-motion: no-preference ) {
	.em-readmore-toggle::after {
		transition: transform var(--motion-base);
	}
}

.em-readmore-toggle[aria-expanded="true"]::after {
	transform: translateY( 1px ) rotate( -135deg );
}

.em-readmore-toggle:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 4px;
	border-radius: 2px;
}

.em-readmore-toggle .em-readmore-label-less,
.em-readmore-toggle[aria-expanded="true"] .em-readmore-label-more {
	display: none;
}

.em-readmore-toggle[aria-expanded="true"] .em-readmore-label-less {
	display: inline;
}

/* Human Resilience "Current projects include" sub-eyebrow + bullet list */

.em-projects {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: var(--space-3);
	width: 100%;
	margin: 0;
	padding: 0;
	text-align: left;
}

.em-projects-label {
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: 11px;
	line-height: 1;
	font-weight: var(--fw-bold);
	letter-spacing: var(--track-eyebrow);
	text-transform: uppercase;
	color: var(--ink);
}

.em-projects-list {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: var(--space-3);
	width: 100%;
	margin: 0;
	padding: 0;
	list-style: none;
}

.em-projects-list li {
	display: flex;
	flex-direction: row;
	align-items: baseline;
	gap: var(--space-3);
	margin: 0;
	padding: 0;
	font-family: var(--font-sans);
	font-size: 17px;
	line-height: 1.5;
	font-weight: var(--fw-regular);
	color: var(--ink);
}

.em-projects-list li::before {
	content: "";
	display: inline-block;
	flex: 0 0 auto;
	width: 7px;
	height: 7px;
	background: var(--gold);
	border-radius: 999px;
	transform: translateY( -3px );
}

/* Panel CTA row */

.em-panel-cta {
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: var(--space-4);
	width: auto;
	margin: 0;
	padding: 0;
}

/* ---- Slide-indicator dot row ---- */

#em-portfolio-dots {
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: center;
	gap: var(--space-2);
	width: 100%;
	margin: 0;
	padding: 0;
}

/* Empty dots container (no dot buttons rendered) collapses out of
   layout entirely so its parent's flex gap doesn't inflate the
   gap between the card and the next section. Apr 2026 polish —
   the dots are populated by JS under specific tab-carousel
   conditions; when they're absent, the container should not
   contribute any vertical space. */
#em-portfolio-dots:empty {
	display: none;
}

.em-portfolio-dot {
	display: inline-block;
	flex: 0 0 auto;
	width: 8px;
	height: 8px;
	margin: 0;
	padding: 0;
	background: var(--light-grey);
	border: none;
	border-radius: 999px;
	cursor: pointer;
	transition: width var(--motion-base), background var(--motion-base);
}

.em-portfolio-dot[aria-current="true"] {
	width: 28px;
	background: var(--ink);
}

.em-portfolio-dot:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 4px;
}

/* ---- Tablet ---- */

@media ( max-width: 1199px ) {
	#em-portfolio-card {
		/* Mirrors the desktop embed math at tablet scale: 56 baseline
		   panel-content top + 24 clearance for embedded pill overhang =
		   80. Sides + bottom drop to 40 / 56 per existing tablet rule. */
		padding: 80px 40px 56px;
	}

	#em-portfolio-head {
		/* v7 (May 2026): tablet head→tabs gap reduced space-7 (48)
		   → space-6 (32) so the subhead → card-top visual rhythm
		   matches what other sections produce at tablet (subhead →
		   next-block in column, ~32). Desktop keeps its 48px
		   editorial breathing; mobile (≤959) keeps its own override
		   (margin-bottom: 0 + wrap gap space-6) below. */
		margin-bottom: var(--space-6);
	}

	.em-panel-h3 {
		font-size: 36px;
	}
}

/* ---- Tablet + Mobile gutter: <960px ---- */

@media ( max-width: 959px ) {
	#em-portfolio-wrap {
		padding-inline: var(--gutter-mobile);
	}

	/* Mobile rhythm — keep the LogoCallout feature breathing.
	   The callout is the brand-signal moment of each panel (gold
	   pill badge overhang); 32px on each side reads tight against
	   a card-shaped element. 48px gives it the "feature" pause
	   per brand v1 s1 ("Stay airy"). */
	.em-portfolio-panel {
		gap: var(--space-7);
	}

	.em-panel-h3 {
		font-size: 28px;
	}

	.em-panel-oneliner {
		font-size: 17px;
	}

	.em-logo-callout {
		/* v7 (May 2026): mirror desktop's pill-overhang compensation
		   at mobile scale. 40 top / 28 bottom → visible 29 / 28,
		   even rhythm with a little more breathing than the prior
		   28/28 (which read 17 / 28, top tight). */
		padding: 40px 24px 28px;
		max-width: 100%;
	}

	/* Stack the dual-lockup vertically on narrow viewports so the
	   three-step phrase reads as LOGO / bridge text / LOGO instead
	   of a broken "EDNA + acquired by" row above an orphaned
	   AngelEye row. Desktop rule is now grid; revert to flex-column
	   here and reset grid-track artifacts so children flow vertically. */
	.em-logo-callout-row {
		display: flex;
		flex-direction: column;
		flex-wrap: nowrap;
		grid-template-columns: none;
		justify-items: center;
		gap: var(--space-4);
	}

	.em-logo-callout-row > :first-child,
	.em-logo-callout-row > .em-logo-bridge,
	.em-logo-callout-row > :last-child {
		justify-self: auto;
	}

	.em-logo-callout-row img {
		/* v7 (May 2026): mobile EDNA scales 32 → 40 in proportion to
		   the desktop bump. AngelEye em-logo-tall stays 44 so the
		   ~10% asymmetry holds at every breakpoint. */
		height: 40px;
	}

	.em-logo-callout-row img.em-logo-tall,
	.em-logo-callout-row .em-logo-tall img {
		height: 44px;
	}

	.em-logo-callout img.em-logo-callout-single,
	.em-logo-callout > img.em-logo-callout-single,
	.em-logo-callout .em-logo-callout-single,
	.em-logo-callout .em-logo-callout-single img {
		max-width: 220px !important;
		max-height: 40px !important;
	}

	.em-logo-callout-single {
		max-width: 220px;
		max-height: 40px;
	}
}

/* ---- Mobile only (≤719px): turn OFF the embedded-pill pattern ----

   Tablet (720-1199px) inherits the desktop embed because iPad portrait
   (834px) and similar large-mobile / small-tablet viewports look great
   with the pills bolted onto the card top edge. Below 720px (iPhone
   portrait + smaller Android), the embed compresses too tight and the
   centered pills + card become a layout puzzle. Revert to stacked
   layout for true phones only. */

@media ( max-width: 719px ) {
	#em-portfolio-wrap {
		gap: var(--space-6);
	}

	#em-portfolio-head {
		margin-bottom: 0;
	}

	#em-portfolio-tabs {
		align-self: flex-start;
		margin-bottom: 0;
		background: var(--canvas);
	}

	#em-portfolio-card {
		padding: 40px 24px;
	}
}

/* ---- Mobile pills: <=720px wrap-and-flow ----

   The desktop "pill of pills" canvas-bg container shrinks to fit
   3 pills cleanly. On narrow mobile viewports the third (longest)
   pill butts against the container's pill-shaped right edge with
   only 6px of canvas-on-canvas padding — a visually invisible gap.
   Drop the container shell entirely on mobile and let the three
   pills flow as independent chips. The active pill's --ink fill
   still carries the segmented-control intent without a frame.
   Pills wrap to a second row if needed, anchored left so the
   reading order stays intact. */

@media ( max-width: 720px ) {
	/* Segmented control on mobile — three equal-width pills in a single
	   edge-to-edge row. Replaces the v1 wrap-and-flow that produced a
	   2-on-top + 1-orphan-below split. iOS-native pattern (Settings,
	   Stocks, banking apps); fits the institutional brand tone. */
	#em-portfolio-tabs {
		display: flex;
		flex-direction: row;
		flex-wrap: nowrap;
		align-items: stretch;
		justify-content: stretch;
		align-self: stretch;
		width: 100%;
		max-width: 100%;
		gap: 6px;
		padding: 0;
		background: transparent;
		border: none;
		border-radius: 0;
	}

	.em-portfolio-tab {
		/* Equal share of available width regardless of label length so
		   the three pills always read as a balanced segmented row. */
		flex: 1 1 0;
		min-width: 0;
		padding: 9px 6px;
		font-size: 12px;
		line-height: 1.2;
		text-align: center;
		/* Graceful degradation for sub-360px viewports (iPhone SE 1st
		   gen, older Android): truncate with ellipsis rather than wrap
		   onto a second line. Most modern phones fit "Human Resilience"
		   at 12px in their share without truncation. */
		white-space: nowrap;
		overflow: hidden;
		text-overflow: ellipsis;
		border: 1px solid var(--light-grey);
		border-radius: var(--radius-pill);
		/* Anchor for the ::before touch-target expansion below. */
		position: relative;
	}

	/* AAA touch-target expansion (WCAG 2.5.5 — 44×44 CSS pixels). The
	   visible pill is ~30px tall to keep the segmented control compact,
	   but the actual hit area extends 7px above + 7px below = 44px
	   total via an invisible ::before. No visual change, no hit-area
	   conflicts (vertical expansion only goes into non-interactive
	   eyebrow/H2 space above and the card's non-interactive top
	   padding below). 2026 best practice — same pattern used by
	   Apple iOS, Google Material compact buttons, GitHub repo nav. */
	.em-portfolio-tab::before {
		content: "";
		position: absolute;
		inset: -7px 0;
	}

	.em-portfolio-tab[aria-selected="true"] {
		border-color: var(--ink);
	}
}

/* ============================================================
   Section 5 — Purpose

   Anchor target #purpose (Header nav + Footer "Purpose" link).
   Two-column 1fr / 1.1fr grid inside a 1200-max wrapper. Left
   column is a staggered B&W portrait collage (2× labeled
   placeholder frames at 4:5, solid token-driven warm-dark fills
   per CLAUDE.md no-gradient rule). Right column is the copy
   stack: SectionEyebrow 03 / Purpose → H2 → two body paragraphs
   from the working draft → accent kicker ending in "Join us."
   in --gold-deep + Bold (the section's "earn the gold" moment).

   Pattern: Two-column story (brand-source v1 §5.4).
   No JS. No interactivity. Presentational.

   Mobile (<960px): single column, photo-first / copy-second so
   the section lands emotionally before the copy explains it.
   The collage's min-height is dropped so the two stacked frames
   don't reserve dead space.
   ============================================================ */

#purpose {
	display: block;
	width: 100%;
	margin: 0;
	box-sizing: border-box;
}

#em-purpose-wrap {
	display: grid;
	grid-template-columns: 1fr 1.1fr;
	/* align-items: start so both columns anchor flush to the section's
	   top padding edge (Apr 2026 v3 — was center, which floated the
	   shorter 16:9 photo column in the middle of the row, creating
	   perceived "extra gap above Purpose" on the left side compared
	   to other sections that anchor content flush). */
	align-items: start;
	gap: var(--space-8);
	width: 100%;
	max-width: var(--content-max);
	margin: 0 auto;
	padding: 0 var(--gutter);
	box-sizing: border-box;
}

/* ---- Left column — single hero portrait ----

   One photo, full-column width, native 16:10 source aspect. No
   collage chrome, no overlap, no frame stacking. The two-person
   editorial portrait leads the section on its own — the brand
   spec §6 calls this the "warm documentary color" treatment for
   leadership/team moments. CSS filter applies a warm-color
   editorial polish (file stays untouched, treatment reversible).

   Decision rationale: a staggered collage reads as decoration
   on an investor-facing page; a single confident portrait reads
   as the founders introducing themselves. Less surface, more
   message.
*/

#em-purpose-photo {
	display: block;
	position: relative;
	width: 100%;
	/* 16:9 to match the Approach photo (Apr 2026 polish — was 16:10
	   native source). The 10% loss comes off the BOTTOM of the frame
	   via object-position: top on the inner img — Marissa+Adrian's
	   heads + shoulders stay framed; only foreground/floor crops out. */
	aspect-ratio: 16 / 9;
	margin: 0;
	padding: 0;
	overflow: hidden;
	background: var(--ink-tint-08);
	border-radius: var(--radius-image);
	box-shadow: var(--shadow-rest);
	box-sizing: border-box;
}

/* The Bricks image wrapper (.brxe-image / <figure>) absolute-fills
   the photo block so the inner <img> can flex to 100% without
   being constrained by the wrapper's intrinsic size. Same
   pattern as the Hero video wrapper — preempts gotcha #9. */
#em-purpose-photo > .brxe-image,
#em-purpose-photo figure {
	display: block;
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
}

/* The <img> fills the block edge-to-edge via object-fit: cover.
   Warm-documentary color treatment via CSS filter:
     - saturate( 0.85 ) pulls back modern-camera vividness so the
       photo reads editorial rather than phone-snapshot
     - contrast( 1.04 ) adds a touch of editorial weight
     - brightness( 1.02 ) lifts midtones for a cleaner read on
       the warm --canvas page background
     - sepia( 0.08 ) warms highlights toward the canvas palette
       so the photo feels native to the page surface rather
       than dropped in */
#em-purpose-photo img,
#em-purpose-photo .brxe-image img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center top;
	filter: saturate( 0.85 ) contrast( 1.04 ) brightness( 1.02 ) sepia( 0.08 );
}

/* ---- Right column — copy stack ---- */

#em-purpose-copy {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--space-4);
	width: auto;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

/* v7 (May 2026): Purpose section lede — section-deck statement
   between the H2 "Our Purpose" and the body paragraphs. Split out
   from body-1 (was the first sentence of a compound paragraph)
   into its own element so it can carry the subhead pattern. */
#em-purpose-lede {
	margin: 0;
	padding: 0;
	max-width: 580px;
	font-family: var(--font-sans);
	font-size: 22px;
	line-height: var(--lh-quote);
	font-weight: var(--fw-bold);
	letter-spacing: -0.005em;
	color: var(--ink);
}

/* Body paragraphs — 18/1.65 desktop, --ink. Max-width 580px holds
   the measure at the brand spec's recommended ~62-character target
   for sustained body reading. */
#em-purpose-body-1,
#em-purpose-body-2 {
	margin: 0;
	padding: 0;
	max-width: 580px;
	font-family: var(--font-sans);
	font-size: var(--fs-body);
	line-height: 1.65;
	font-weight: var(--fw-regular);
	color: var(--ink);
}

/* Accent kicker — the section's "earn the gold" moment. 24px
   Sen Bold, slightly tighter letter-spacing than body for
   rhetorical weight. Top margin 12px above to set it apart from
   body para 2 without breaking the right-column rhythm. The
   inline accent span carries the only --gold-deep word in the
   section (brand v1 §3.1: one accent per section). */
#em-purpose-kicker {
	margin: var(--space-3) 0 0;
	padding: 0;
	max-width: 580px;
	font-family: var(--font-sans);
	/* v7 (May 2026): kicker sizing now mirrors the Purpose lede
	   exactly (22 desktop / 24 tablet / 20 mobile, lh-quote). The
	   tablet + mobile overrides live in the shared subhead-pattern
	   @media blocks below so the kicker tracks the lede across
	   every breakpoint. */
	font-size: 22px;
	line-height: var(--lh-quote);
	font-weight: var(--fw-bold);
	letter-spacing: -0.005em;
	color: var(--ink);
}

#em-purpose-kicker .em-purpose-kicker-accent {
	color: var(--gold-deep);
	font-weight: var(--fw-bold);
}

/* ---- Tablet: 960–1199px ---- */

@media ( max-width: 1199px ) {
	#em-purpose-wrap {
		gap: var(--space-7);
	}
}

/* ---- Mobile: <960px ----

   Single column. Photo-first / copy-second per editorial decision
   (Purpose is emotional anchor; investors reading on a phone get
   the visual punch before the copy lands). The collage drops its
   absolute-positioning model — the two frames stack vertically
   as sized boxes with the secondary anchored right and pulled
   up to preserve a compact staggered overlap.

   Frame widths bump up (84% / 62%) so the two stacked frames
   read as a deliberate pair, not orphaned thumbnails on a wide
   single column. */

@media ( max-width: 959px ) {
	/* Option B for Purpose on mobile — text-top → IMAGE → body→kicker.
	   Eyebrow + H2 anchor the section, then Marissa & Adrian's photo
	   sits as visual context BEFORE the body lands. Matches the
	   Approach (Section 1) Option B pattern for editorial consistency
	   on mobile. Desktop+tablet keep their image-LEFT / text-RIGHT
	   2-col layout. Mechanism: display:contents flattens #em-purpose-copy
	   so the photo can be positioned between H2 and body via order. */
	#em-purpose-wrap {
		grid-template-columns: 1fr;
		/* v7 (May 2026): mobile flatten gap matches desktop rhythm
		   (space-4 = 16). H2→lede sits as a tight pair, identical
		   to desktop spacing — just translated to a single-column
		   stack. */
		gap: var(--space-4);
	}

	#em-purpose-copy {
		display: contents;
	}

	#em-purpose-wrap .em-eyebrow {
		order: 1;
	}

	#em-purpose-wrap #em-purpose-lede {
		order: 2;
	}

	#em-purpose-wrap #em-purpose-photo {
		order: 3;
		/* v7 (May 2026): margin-block bumped space-3 (12) → space-4
		   (16) so heading → photo and photo → body each net to 32px
		   (16 wrap gap + 16 margin), matching Approach's mobile
		   heading → image and Portfolio's heading → tabs. Keeps the
		   "tight eyebrow → heading pair → breathing room before
		   next block" rhythm consistent across sections. */
		margin-block: var(--space-4);
	}

	#em-purpose-wrap #em-purpose-body-1 {
		order: 4;
		font-size: 17px;
		line-height: 1.6;
	}

	#em-purpose-wrap #em-purpose-body-2 {
		order: 5;
		font-size: 17px;
		line-height: 1.6;
	}

	#em-purpose-wrap #em-purpose-kicker {
		order: 6;
	}
}

/* ============================================================
   Section 5 — Photo strip (filmstrip + mobile carousel)

   Sits below the two-column row, at the section's full width
   (sibling of #em-purpose-wrap, child of #purpose section). Tells
   the Enlighten Mobility narrative arc in 4 photos:
     1. Team building the brand   (Jeff & Leanne)
     2. Leading institutions      (Team at Nationwide Children's)
     3. Real patient impact       (Amy walking, early prototype)
     4. Partner success           (AngelEye Health conference)

   Desktop (>= 720px): 4-column CSS Grid filmstrip, no gaps so
     the four photos butt against each other and read as a single
     composed editorial unit. Full-bleed (breaks the 1200 max
     container) — the strip is the section's visual punctuation.

   Mobile (< 720px): horizontal scroll-snap carousel. One photo
     fills ~88vw of the viewport, with a ~12vw peek of the next
     photo signaling "more this way". Pagination dots below the
     strip. Native CSS scroll-snap — no library, no slider plugin,
     no autoplay. Browser-native a11y (keyboard arrows scroll the
     region; AT software announces it as a labeled region).

   Same warm-color CSS filter as the hero portrait (file stays
   color, treatment is reversible).
*/

/* The strip is parented to the section (sibling of #em-purpose-wrap),
   so it inherits no max-width by default. Constrain it here to the
   same 1200/24-gutter container as the rest of the section so the
   filmstrip aligns with the copy column above it on desktop —
   tight, intentional, not full-bleed. */
#em-purpose-strip {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	width: 100%;
	max-width: var(--content-max);
	/* v7 (May 2026): top margin tracks the Purpose section's
	   per-breakpoint padding-bottom so the gap above the strip
	   equals the gap below it (strip → section bottom):
	     desktop  ≥1200px   80 / 80
	     tablet   960-1199  40 / 40 (override below)
	     mobile   720-959   80 / 80
	     mobile   <720      64 / 80 (close enough; override at @719)
	   Was a flat 80 which produced a visible 40px imbalance at
	   tablet (strip→section-bottom 40, kicker→strip 80). */
	margin: 80px auto 0;
	padding: 0 var(--gutter);
	box-sizing: border-box;
}

@media ( min-width: 960px ) and ( max-width: 1199px ) {
	#em-purpose-strip {
		margin-top: 40px;
	}
}

/* The strip's outer scroll container. On desktop this is a static
   3-column grid (overflow auto won't trigger because content fits).
   On mobile (<720px) it becomes the swipe carousel — see media
   query below.

   3-photo editorial triptych at 4:3 cells: at 1152px content width
   each cell is ~384w × 288h — substantial enough to read faces and
   scenes without thumbnailing. Narrative arc: founders → leading
   institution → real patient impact.

   Corner rounding: per brand spec §3.4, photos use --radius-image
   (16px). The filmstrip reads as ONE unified composed image, so
   only the OUTSIDE corners of cells 1 and 3 are rounded — the
   inner edges between cells stay square so the three photos still
   butt cleanly against each other. The container also clips its
   own corners (overflow: hidden + border-radius) as defense-in-
   depth in case any inner-cell content tries to bleed past the
   rounded silhouette. */
#em-purpose-strip-scroll {
	display: grid;
	grid-template-columns: repeat( 3, 1fr );
	gap: 0;
	width: 100%;
	margin: 0;
	padding: 0;
	overflow: hidden;
	border-radius: var(--radius-image);
	box-shadow: var(--shadow-rest);
	box-sizing: border-box;
}

/* Each photo cell. Aspect-ratio 4:3 — substantial per-cell height
   so faces and scene detail are readable at content-width scale.
   overflow: hidden + relative position lets the inner image
   absolute-fill cleanly regardless of any wrapper Bricks emits. */
#em-purpose-strip-scroll > [id^="em-purpose-strip-cell-"] {
	display: block;
	position: relative;
	width: 100%;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	margin: 0;
	padding: 0;
	background: var(--ink-tint-08);
	box-sizing: border-box;
}

/* Outside cells (1 = leftmost, 3 = rightmost) get matching corner
   rounding so the radius is carried through any wrapper layers
   (insurance against any inner wrapper that might paint over the
   parent's clip). */
#em-purpose-strip-scroll > #em-purpose-strip-cell-1 {
	border-top-left-radius: var(--radius-image);
	border-bottom-left-radius: var(--radius-image);
}

#em-purpose-strip-scroll > #em-purpose-strip-cell-3 {
	border-top-right-radius: var(--radius-image);
	border-bottom-right-radius: var(--radius-image);
}

/* Bricks <figure>/wrapper around each <img> — absolute-fill so
   inner img can flex to 100%. Same defensive pattern used for
   the hero video and the Section 5 hero photo (gotcha #9). */
#em-purpose-strip-scroll [id^="em-purpose-strip-cell-"] > .brxe-image,
#em-purpose-strip-scroll [id^="em-purpose-strip-cell-"] figure {
	display: block;
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
}

/* Each <img> fills its cell + warm-color filter. Slight hover
   polish on desktop only (brightness up + 1.02 zoom over 240ms)
   gives editorial liveliness without breaking the calm. */
#em-purpose-strip-scroll [id^="em-purpose-strip-cell-"] img,
#em-purpose-strip-scroll [id^="em-purpose-strip-cell-"] .brxe-image img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	filter: saturate( 0.85 ) contrast( 1.04 ) brightness( 1.02 ) sepia( 0.08 );
	transition: filter var(--motion-base), transform var(--motion-base);
}

@media ( hover: hover ) and ( prefers-reduced-motion: no-preference ) {
	#em-purpose-strip-scroll [id^="em-purpose-strip-cell-"]:hover img {
		filter: saturate( 0.92 ) contrast( 1.04 ) brightness( 1.05 ) sepia( 0.06 );
		transform: scale( 1.02 );
	}
}

/* Dot pagination row — hidden on desktop, visible on mobile only. */
#em-purpose-strip-dots {
	display: none;
}

/* ---- Mobile (<720px): swipe carousel ---- */

@media ( max-width: 719px ) {
	#em-purpose-strip {
		/* Mobile keeps the strip inside the section's normal
		   gutter rhythm (16px gutter via .container-1200's mobile
		   override). The strip's own padding handles snap edges
		   inside the constrained width. */
		margin-top: var(--space-8);
		padding: 0;
	}

	#em-purpose-strip-scroll {
		display: flex;
		flex-direction: row;
		flex-wrap: nowrap;
		gap: var(--space-3);
		width: 100%;
		max-width: 100%;
		min-width: 0;
		overflow-x: auto;
		overflow-y: hidden;
		scroll-snap-type: x mandatory;
		scroll-padding-inline: var(--gutter-mobile);
		padding: 0 var(--gutter-mobile);
		-webkit-overflow-scrolling: touch;
		/* Explicit touch-action: pan-x. Without this, some mobile
		   browsers default to touch-action: auto which lets the
		   browser intercept horizontal swipes for nav gestures
		   (back/forward) before the scroll container gets them. */
		touch-action: pan-x;
		/* Don't let horizontal-scroll spill into the document. */
		overscroll-behavior-x: contain;
		/* Drop the desktop strip-level rounding + shadow — each
		   mobile cell rounds itself. */
		border-radius: 0;
		box-shadow: none;
		/* Hide the scrollbar — visual polish, native swipe still
		   works (the bar serves no purpose for a 3-photo set). */
		scrollbar-width: none;
	}

	#em-purpose-strip-scroll::-webkit-scrollbar {
		display: none;
	}

	/* Each mobile cell rounds all four corners independently and
	   uses an 80% flex basis so a meaningful peek of the next
	   photo signals "swipe for more". */
	#em-purpose-strip-scroll > [id^="em-purpose-strip-cell-"] {
		flex: 0 0 80%;
		scroll-snap-align: start;
		scroll-snap-stop: always;
		aspect-ratio: 4 / 3;
		border-radius: var(--radius-image);
	}

	/* Reset the desktop outside-only corner rules — every mobile
	   cell rounds all four corners (set above). */
	#em-purpose-strip-scroll > #em-purpose-strip-cell-1,
	#em-purpose-strip-scroll > #em-purpose-strip-cell-3 {
		border-radius: var(--radius-image);
	}

	/* Dot pagination — kept hidden on mobile (was display:flex with
	   24px margin-top + 16px button height = 40px of layout impact
	   below the photo strip). Native scroll-snap + horizontal swipe
	   handles carousel UX on mobile without dots. The DOM element
	   stays for ARIA semantics (role="tablist") in case future JS
	   wants to wire it up — display:none on the container collapses
	   the layout but preserves the screen-reader path.

	   Defensively zero out margin/padding so even if a downstream
	   override flips display back, the element doesn't reintroduce
	   the layout anomaly that prompted Phase 7a / 2026-05-01. */
	#em-purpose-strip-dots {
		display: none;
		margin: 0;
		padding: 0;
	}
}

/* ============================================================
   Section 6 — Collaborators (dark credibility band)
   <section id="collaborators"> — only dark band on the page,
   per brand spec §5.5. Anchor target for the Header nav and
   the Footer "Collaborators" sub-link.

   Inner 1200-max wrapper holds the section header (eyebrow +
   single H2) above a 3×3 logo grid. Logos render monochrome
   white via filter: brightness(0) invert(1), at 0.85 opacity
   resting / 1.0 hover. Hairline lattice between cells uses the
   --border-translucent-dark token.

   Mobile (<720px): grid stays 3-cols at reduced logo height
   so the 3×3 visual identity survives small viewports.
   ============================================================ */

#em-collab-wrap {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	width: 100%;
	max-width: var(--content-max);
	margin: 0 auto;
	padding-inline: var(--gutter);
	gap: var(--space-7);
}

@media (max-width: 959px) {
	#em-collab-wrap {
		padding-inline: var(--gutter-mobile);
		gap: var(--space-6);
	}
}

#em-collab-head {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	width: auto;
	gap: var(--space-4);
	margin: 0;
	padding: 0;
}

#em-collab-h2 {
	margin: 0;
	padding: 0;
	max-width: 760px;
	font-family: var(--font-sans);
	font-weight: var(--fw-bold);
	/* v7 (May 2026): downsized from fs-h2 (44px) to subhead
	   pattern (22 desktop / 24 tablet / 20 mobile). The dark band
	   now reads as a quieter handoff into the partner grid rather
	   than a second display-weight section heading competing with
	   the hero / portfolio H2s above it. Color stays canvas (white
	   on ink). */
	font-size: 22px;
	line-height: var(--lh-quote);
	letter-spacing: -0.005em;
	color: var(--canvas);
}

/* 3×3 logo grid — DOM is <ul role="list"> for a11y. Visual is a
   single canvas-bg "shelf" inside the dark band, holding all 9
   logos in a 3×3 arrangement (Apr 2026 redesign — replaces the
   "9 floating tiles" pattern). The shelf is one cohesive light
   surface; cells are flat with subtle 1px hairline gridlines
   between them via the grid `gap` + shelf bg trick. Reads as a
   single act of curation rather than nine separate cards. The
   dark band still frames the shelf, preserving the brand-rhythm
   dark-band beat. */
#em-collab-grid {
	display: grid;
	/* v8 (May 2026): Desktop 2×4 (2 cols × 4 rows) — wider
	   cells give each logo greater institutional presence at
	   the cost of a taller section. v7 was 4×2 (Beacon dropped
	   → 8 cells); v6 was 3×3 with 9. Tablet stays 4×2 below —
	   2-col cells get squat at narrow viewport widths. Mobile
	   (≤719px) keeps its own 2-col rules with shorter cells. */
	grid-template-columns: repeat(2, 1fr);
	/* 1px gap + shelf bg shows through as the gridline color. The
	   shelf bg has to be slightly darker than the cells for the
	   hairlines to read; --light-grey on a canvas surface produces
	   a hairline at ~5% contrast — visible, not visually loud. */
	gap: 1px;
	width: 100%;
	margin: 0;
	padding: 0;
	list-style: none;
	background: var(--light-grey);
	border-radius: var(--radius-image);
	overflow: hidden; /* clips child cells to the rounded shelf corners */
	box-shadow: 0 12px 40px rgba(0, 0, 0, 0.20);
}

#em-collab-grid > li[id^="em-collab-cell-"] {
	display: flex;
	align-items: center;
	justify-content: center;
	width: auto;
	height: 168px;
	margin: 0;
	padding: var(--space-4) var(--space-6);
	background: var(--canvas);
	transition: background var(--motion-fast);
	box-sizing: border-box;
}

#em-collab-grid > li[id^="em-collab-cell-"]:hover,
#em-collab-grid > li[id^="em-collab-cell-"]:focus-within {
	background: var(--white);
}

/* Bricks `image` element with external URL renders a bare <img>
   (gotcha #20 — no figure / .brxe-image wrapper). Target the
   <img> directly. No filter — logos render full-color. */
#em-collab-grid > li[id^="em-collab-cell-"] > img {
	display: block;
	width: auto;
	height: auto;
	max-width: 100%;
	max-height: 80px;
	object-fit: contain;
}

/* Tablet — slightly tighter cell height, same shelf treatment. */
@media (max-width: 959px) {
	#em-collab-grid {
		/* Override desktop 2×4 — at tablet widths, 2-col cells
		   become wide-and-squat. 4×2 keeps logo proportions
		   readable on narrow viewports. */
		grid-template-columns: repeat(4, 1fr);
	}

	#em-collab-grid > li[id^="em-collab-cell-"] {
		height: 110px;
		padding: var(--space-3) var(--space-5);
	}

	#em-collab-grid > li[id^="em-collab-cell-"] > img {
		max-height: 52px;
	}
}

/* Mobile — drop to 2×5 grid so the wider lockups (Beacon Hospital,
   Michigan Medicine, Nationwide Children's) get readable size.
   3-col at narrow viewports compressed each logo to ~32px tall in
   ~110px-wide cells, well below the institutional-credibility
   threshold the dark band is meant to deliver. 2-col gives each
   logo ~165px width × 56-72px height — readable, dignified.

   The 9th cell (last one) spans both columns on the final row so
   we don't end with an orphaned empty cell. Reads as deliberate
   editorial composition, not lazy layout. */
@media (max-width: 719px) {
	#em-collab-grid {
		grid-template-columns: repeat(2, 1fr);
		border-radius: var(--radius-card);
	}

	#em-collab-grid > li[id^="em-collab-cell-"] {
		height: 110px;
		padding: var(--space-4) var(--space-5);
	}

	#em-collab-grid > li[id^="em-collab-cell-"] > img {
		max-height: 56px;
	}
}

@media (max-width: 479px) {
	#em-collab-grid > li[id^="em-collab-cell-"] {
		height: 96px;
		padding: var(--space-3) var(--space-4);
	}

	#em-collab-grid > li[id^="em-collab-cell-"] > img {
		max-height: 48px;
	}
}

/* =====================================================================
 * Section 7 — Connect (closing CTA + native Bricks Form)
 * Brand source: §5.6 (closing CTA + form), §4.2 (feature card),
 * §4.4 (form input — error & focus states).
 * ===================================================================== */

/* Feature card — Global Class.
 * Differs from .card-standard (20px / --space-6) — feature variant uses
 * 24px radius + --space-7 padding per brand §4.2. */
.card-feature {
	display: flex;
	flex-direction: column;
	width: 100%;
	background: var(--white);
	border-radius: var(--radius-feature);
	padding: var(--space-7);
	box-shadow: var(--shadow-rest);
	box-sizing: border-box;
}

@media (max-width: 1199px) {
	.card-feature {
		padding: var(--space-6);
	}
}

/* Mobile card padding stays at --space-6 (32px) to harmonize with the
 * card padding rhythm used elsewhere on the page, rather than tightening
 * to --space-5 which made the form feel pinched. */

/* ---------- Section frame ---------- */

#em-connect-wrap {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	width: 100%;
	max-width: var(--content-max);
	margin-inline: auto;
	padding-inline: var(--gutter);
	box-sizing: border-box;
}

@media (max-width: 959px) {
	#em-connect-wrap {
		padding-inline: var(--gutter-mobile);
	}
}

#em-connect-grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: var(--space-8);
	align-items: start;
	width: 100%;
}

@media (max-width: 959px) {
	#em-connect-grid {
		grid-template-columns: 1fr;
		gap: var(--space-7);
	}
}

/* ---------- Left column (intro + address) ---------- */

#em-connect-intro {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--space-4);
	width: 100%;
	max-width: 480px;
}

@media (max-width: 959px) {
	#em-connect-intro {
		max-width: none;
	}
}

#em-connect-sub {
	margin: 0;
	font-family: var(--font-sans);
	/* v7 (May 2026): subhead pattern — mirrors Approach lead
	   statement (22 desktop / 24 tablet / 20 mobile, bold). Was
	   fs-quote regular (28px). Cross-section subheads now share
	   one rhythm; mobile font-size override moved into the
	   shared @media block below. */
	font-weight: var(--fw-bold);
	font-size: 22px;
	line-height: var(--lh-quote);
	letter-spacing: -0.005em;
	color: var(--ink);
	max-width: 26em;
}

/* ============================================================
   Subhead pattern — responsive scale
   v7 (May 2026): unified font-size cascade for the four
   cross-section subheads. Mirrors #em-hero-approach-h2's
   per-breakpoint scale: 22 desktop / 24 tablet / 20 mobile.
   ============================================================ */

@media ( max-width: 1199px ) {
	#em-portfolio-sub,
	#em-purpose-lede,
	#em-purpose-kicker,
	#em-collab-h2,
	#em-connect-sub {
		font-size: 24px;
	}
}

@media ( max-width: 959px ) {
	#em-portfolio-sub,
	#em-purpose-lede,
	#em-purpose-kicker,
	#em-collab-h2,
	#em-connect-sub {
		font-size: 20px;
		line-height: var(--lh-quote);
	}

	/* Section-head gaps stay at the default space-4 (16px) on
	   mobile — same as desktop. No override needed; the existing
	   internal head gap cascades through. (Earlier v7 attempts at
	   space-6 / space-5 read too loose and were reverted to match
	   the desktop rhythm exactly.) */
}

#em-connect-address {
	display: block;
	width: 100%;
	margin-top: var(--space-7);
	padding-top: var(--space-7);
	border-top: 1px solid var(--light-grey);
	font-family: var(--font-sans);
	font-style: normal;
	font-size: var(--fs-caption);
	line-height: 1.7;
	color: var(--ink);
}

/* Mobile — drop the divider line + halve the spacing. On a 2-col
   desktop layout the divider visually separates "intro copy"
   (top) from "mailing address" (footer-of-left-column) within a
   shared column — that semantic anchor doesn't translate to the
   1-col mobile stack, where the divider just creates a heavy
   visual break before the address that competes with the form
   card boundary below. Keep the spacing instead. */
@media (max-width: 959px) {
	#em-connect-address {
		margin-top: var(--space-5);
		padding-top: 0;
		border-top: none;
	}
}

#em-connect-address-label {
	display: block;
	margin-bottom: var(--space-3);
	font-family: var(--font-sans);
	font-weight: var(--fw-bold);
	font-size: 11px;
	line-height: 1;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--mute);
}

#em-connect-address-lines {
	display: block;
	font-family: var(--font-sans);
	font-weight: var(--fw-regular);
	font-size: 15px;
	line-height: 1.7;
	color: var(--ink);
}

#em-connect-address-lines br {
	display: block;
}

/* ---------- Right column (form card) ---------- */

#em-connect-form-card {
	width: 100%;
	box-sizing: border-box;
}

/* Form root reset — Bricks emits .brxe-form with default flex behavior;
 * we want a vertical stack with consistent gaps. */
#em-connect-form-card .brxe-form {
	display: flex;
	flex-direction: column;
	gap: var(--space-5);
	width: 100%;
	margin: 0;
}

#em-connect-form-card .brxe-form .form-group {
	display: flex;
	flex-direction: column;
	gap: var(--space-2);
	width: 100%;
	margin: 0;
}

/* Honeypot wrapper hide.
 *
 * Bricks' generate_honeypot_field_styles() emits an inline <style> block
 * targeting `div.form-group:has(input#form-field-{unique_id})` — but our
 * own `#em-connect-form-card .brxe-form .form-group { display: flex }`
 * rule is more specific and wins the cascade, so the honeypot wrapper
 * stays visible.
 *
 * Force-hide the wrapper containing our honeypot input by targeting
 * the `name` attribute (we control the field id slug -> "company"
 * -> DOM `name="form-field-company"` per form.php:2933).
 *
 * Position the wrapper offscreen (vs display:none) — bots that filter
 * on `display:none` will still fill it; offscreen positioning is more
 * robust honeypot technique. The field has tabindex="-1" + autocomplete="off"
 * already (auto-set by Bricks when isHoneypot:true).
 */
#em-connect-form-card .brxe-form .form-group:has(input[name="form-field-company"]) {
	position: absolute !important;
	left: -10000px !important;
	top: auto !important;
	width: 1px !important;
	height: 1px !important;
	overflow: hidden !important;
	margin: 0 !important;
	padding: 0 !important;
	gap: 0 !important;
}

#em-connect-form-card .brxe-form label {
	font-family: var(--font-sans);
	font-weight: var(--fw-bold);
	font-size: 14px;
	line-height: 1.3;
	color: var(--ink);
}

/* Optional "How Did You Hear About Us?" muted treatment per brand §4.4 */
#em-connect-form-card .brxe-form .form-group.is-muted label {
	font-size: 13px;
	color: var(--mute);
}

#em-connect-form-card .brxe-form label.required::after {
	content: " *";
	color: var(--warn-red);
}

/* Inputs — re-implements .field-input recipe scoped to Bricks form output.
 * Bricks does not apply our Global Classes to nested form fields. */
#em-connect-form-card .brxe-form .form-group :is(input[type="text"], input[type="email"], input[type="tel"], input[type="url"], input[type="number"], input[type="password"], textarea, select) {
	display: block;
	width: 100%;
	box-sizing: border-box;
	padding: var(--space-3) var(--space-4);
	background: var(--white);
	color: var(--ink);
	border: 1px solid var(--light-grey);
	border-radius: var(--radius-input);
	font-family: var(--font-sans);
	font-size: 17px;
	line-height: 1.4;
	transition: border-color var(--motion-fast), box-shadow var(--motion-fast);
}

#em-connect-form-card .brxe-form .form-group textarea {
	min-height: calc(var(--space-8) * 2);
	resize: vertical;
}

/* Select — flat, no native chevron. Custom chevron via background-image. */
#em-connect-form-card .brxe-form .form-group select {
	appearance: none;
	-webkit-appearance: none;
	-moz-appearance: none;
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' stroke='%231B1A17' stroke-width='1.5' fill='none' stroke-linecap='round'/></svg>");
	background-repeat: no-repeat;
	background-position: right var(--space-4) center;
	padding-right: calc(var(--space-4) + 24px);
	cursor: pointer;
}

/* Focus — brand spec §4.4: 4px gold-tint ring + ink border, no native outline. */
#em-connect-form-card .brxe-form .form-group :is(input, textarea, select):focus,
#em-connect-form-card .brxe-form .form-group :is(input, textarea, select):focus-visible {
	border-color: var(--ink);
	outline: none;
	box-shadow: 0 0 0 4px var(--gold-tint-15);
}

/* Error — brand spec §4.4: warm red border + inline message. */
#em-connect-form-card .brxe-form .form-group :is(input, textarea, select)[aria-invalid="true"],
#em-connect-form-card .brxe-form .form-group.brx-form-validation-error :is(input, textarea, select) {
	border-color: var(--warn-red);
	box-shadow: 0 0 0 4px rgba(179, 58, 31, 0.12);
}

/* Bricks emits validation messages as <span class="brx-form-validation-error-message">.
 * Style to brand spec — small warm-red caption beneath the field. */
#em-connect-form-card .brxe-form .form-group .brx-form-validation-error-message,
#em-connect-form-card .brxe-form .form-group [data-error-message]:has(+ .brx-form-validation-error) {
	font-family: var(--font-sans);
	font-size: 13px;
	line-height: 1.4;
	color: var(--warn-red);
	margin-top: var(--space-2);
}

/* Submit button row — right-aligned hug-content on desktop, full-width on mobile. */
#em-connect-form-card .brxe-form .submit-button-wrapper {
	flex-direction: row;
	justify-content: flex-end;
	margin-top: var(--space-3);
}

#em-connect-form-card .brxe-form .submit-button-wrapper .bricks-button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--space-2);
	padding: var(--space-3) var(--space-6);
	background: var(--gold);
	color: var(--ink);
	border: 1px solid var(--gold);
	border-radius: var(--radius-pill);
	font-family: var(--font-sans);
	font-size: var(--fs-button);
	font-weight: var(--fw-bold);
	line-height: var(--lh-button);
	cursor: pointer;
	transition: background var(--motion-fast), border-color var(--motion-fast), transform var(--motion-fast);
}

#em-connect-form-card .brxe-form .submit-button-wrapper .bricks-button:hover {
	background: var(--gold-deep);
	border-color: var(--gold-deep);
}

#em-connect-form-card .brxe-form .submit-button-wrapper .bricks-button:active {
	transform: translateY(1px);
}

#em-connect-form-card .brxe-form .submit-button-wrapper .bricks-button:focus-visible {
	outline: 2px solid var(--ink);
	outline-offset: 2px;
}

#em-connect-form-card .brxe-form .submit-button-wrapper .bricks-button.sending,
#em-connect-form-card .brxe-form .submit-button-wrapper .bricks-button[disabled] {
	background: var(--light-grey);
	color: var(--mute);
	border-color: var(--light-grey);
	cursor: not-allowed;
}

@media (max-width: 479px) {
	#em-connect-form-card .brxe-form .submit-button-wrapper {
		justify-content: stretch;
	}

	#em-connect-form-card .brxe-form .submit-button-wrapper .bricks-button {
		width: 100%;
	}
}

/* ---------- Inline-replace success state (brand §5.6) ----------

   Bricks appends <div class="message success"><div class="text">...</div></div>
   on a successful submission. We hide the form fields, override Bricks'
   green parent-theme defaults (background + border), and let .text render
   the JSON's `successMessage` value with brand typography.

   Source of truth for the copy is `bricks-templates/home-connect.json`'s
   `settings.successMessage`. To change the wording, edit the JSON, push,
   visit /wp-admin/ to trigger the bricks-sync mu-plugin's reconciliation. */
#em-connect-form-card .brxe-form:has(.message.success) .form-group {
	display: none;
}

#em-connect-form-card .brxe-form .message.success {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	text-align: center;
	padding: var(--space-7) var(--space-4);
	background: transparent;
	background-color: transparent;
	border: 0;
	color: var(--ink);
}

#em-connect-form-card .brxe-form .message.success .text {
	display: block;
	max-width: 36ch;
	margin: 0 auto;
	font-family: var(--font-sans);
	font-weight: var(--fw-regular);
	font-size: var(--fs-quote);
	line-height: var(--lh-quote);
	letter-spacing: -0.005em;
	color: var(--ink);
}

/* Error message (Bricks appends .message.error). Keep form visible,
 * show small inline error band at the top of the card. */
#em-connect-form-card .brxe-form .message.error {
	order: -1;
	display: block;
	padding: var(--space-3) var(--space-4);
	margin: 0 0 var(--space-3);
	background: rgba(179, 58, 31, 0.08);
	border: 1px solid var(--warn-red);
	border-radius: var(--radius-input);
	color: var(--warn-red);
	font-family: var(--font-sans);
	font-size: 14px;
	line-height: 1.5;
}

#em-connect-form-card .brxe-form .message.error .text {
	display: block;
}

/* =====================================================================
 * Legal pages — Privacy Policy / Terms
 * Centered prose template (page-legal.php) for plain legal copy.
 * Bricks header/footer wrap; the body is a narrow column with the
 * site's Sen typography and the canvas surface.
 * ===================================================================== */

.em-legal {
	background: var(--canvas);
	padding: var(--space-9) var(--gutter) var(--space-10);
}

.em-legal-inner {
	max-width: 720px;
	margin: 0 auto;
}

.em-legal-header {
	margin-bottom: var(--space-6);
}

.em-legal-title {
	font-family: var(--font-sans);
	font-size: var(--fs-h2);
	line-height: var(--lh-h2);
	font-weight: var(--fw-bold);
	color: var(--ink);
	margin: 0 0 var(--space-3);
}

.em-legal-body {
	font-family: var(--font-sans);
	color: var(--ink);
}

.em-legal-body p {
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	margin: 0 0 var(--space-4);
}

.em-legal-body p.em-legal-meta {
	font-size: 14px;
	color: var(--mute);
	margin-bottom: var(--space-6);
	font-style: italic;
}

.em-legal-body h2 {
	font-family: var(--font-sans);
	font-size: 22px;
	line-height: 1.3;
	font-weight: var(--fw-bold);
	color: var(--ink);
	margin: var(--space-7) 0 var(--space-3);
}

.em-legal-body ul,
.em-legal-body ol {
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	margin: 0 0 var(--space-4);
	padding-left: var(--space-5);
}

.em-legal-body ul li,
.em-legal-body ol li {
	margin-bottom: var(--space-2);
}

.em-legal-body a {
	color: var(--gold-deep);
	text-decoration: underline;
	text-underline-offset: 2px;
	transition: color var(--motion-fast);
}

.em-legal-body a:hover,
.em-legal-body a:focus-visible {
	color: var(--ink);
}

.em-legal-body strong {
	font-weight: var(--fw-bold);
}

@media (max-width: 959px) {
	.em-legal {
		padding: var(--space-8) var(--gutter) var(--space-9);
	}
}

@media (max-width: 719px) {
	.em-legal {
		padding: var(--space-7) var(--gutter-mobile) var(--space-8);
	}

	.em-legal-title {
		font-size: 32px;
	}

	.em-legal-body h2 {
		font-size: 19px;
		margin-top: var(--space-6);
	}
}
