/* ==========================================================================
   Clari5 Tabs — main stylesheet
   Brand identity pulled from the real Clari5 logo: charcoal wordmark, a
   two-tone blue (sky blue + navy), and a small green accent. Light is the
   primary experience (matching the logo's light-background mark); a dark
   palette is available via the header theme toggle, using the same hues.
   ========================================================================== */

:root {
	--bg: #FFFFFF;
	--bg-alt: #F3F5F8;
	--surface: #FFFFFF;
	--surface-2: #EDF1F6;
	--ink: #2B2B2E;
	/* Matched to the reference's --muted-foreground, oklch(47% .04 255) converted. */
	--ink-soft: #4C5C71;
	--ink-faint: #8B8D94;
	--border: #E3E6EC;
	--border-soft: #EDF0F4;
	/* The reference's own pale two-tone gradient stops (oklch 93%/96.5%
	   navy tints), used on the hub-diagram center circle. */
	--navy-soft: #DFE9F4;
	--navy-deep: #EFF4F9;

	/* "Strong ink" for headings — dark charcoal on light, near-white on dark,
	   so headings always read at full contrast regardless of theme. Matched
	   to the reference site's own --foreground (a true navy, not neutral
	   gray-black) by converting its oklch(22% .05 263) to sRGB. */
	--navy: #0E1A32;
	--navy-rgb: 14, 26, 50;
	--navy-600: #000000;
	--navy-100: #E9F4FC;

	/* Matched to the reference site's --primary, converted from its own
	   oklch(45% .296 264.6) to sRGB — a touch more violet-leaning than the
	   design doc's original #2E5BFF. --accent-600 is the same hue darkened
	   in oklch space (38% lightness) rather than an eyeballed shade. */
	--accent: #0619F5;
	--accent-600: #0E00DC;
	--accent-100: #E8ECFF;
	--accent-rgb: 6, 25, 245;
	--accent-600-rgb: 14, 0, 220;

	--brand-green: #4CB27A;
	--brand-green-rgb: 76, 178, 122;
	/* Matched to the reference's --destructive, oklch(60% .2 20) converted. */
	--brand-red: #DE394B;
	--brand-red-rgb: 222, 57, 75;
	/* The reference's --cyan-glow accent (small live-stat highlights) —
	   oklch(56% .11 215) converted. Not wired in broadly yet; available for
	   spot use where the reference uses it distinctly from the main blue. */
	--cyan-glow: #00849C;
	--cyan-glow-rgb: 0, 132, 156;

	--radius-sm: 8px;
	--radius-md: 12px;
	--radius-lg: 18px;

	--shadow-sm: 0 1px 2px rgba(20, 22, 27, 0.06);
	--shadow-md: 0 8px 24px rgba(20, 22, 27, 0.08);
	--shadow-lg: 0 20px 48px rgba(20, 22, 27, 0.12);

	--ease: cubic-bezier(0.22, 1, 0.36, 1);
	/* Site-wide font audit: Inter was still showing up in the FAQ, footer,
	   and elsewhere -- everything routes through these two variables
	   (only 2 hardcoded 'Inter' references existed in the whole file,
	   both right here), so both now resolve to Poppins. Small mono
	   headings/eyebrows (--font-mono) are the deliberate exception,
	   untouched. */
	--font-display: 'Poppins', -apple-system, sans-serif;
	--font-body: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
	/* Was JetBrains Mono / Oswald -- a deliberate typographic accent for
	   small kicker labels and big stat numbers, but the client note is
	   explicit and repeated: every page should use Poppins, no exceptions.
	   Kept as separate variables (not merged into --font-body) so anything
	   keyed off --font-mono/--font-numeric for its letter-spacing/tracking
	   treatment, not just its typeface, is untouched. */
	--font-mono: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
	--font-numeric: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

	/* Matched to the reference's own header/hero container width
	   (1280px, confirmed via its actual computed layout), not guessed --
	   was 1620px, noticeably wider, which is why the hero's proportions
	   (and the badge chips relative to the sphere) didn't match.
	   .container-max used to stay at 1440px after that fix, so every
	   section using plain .container (most of the homepage) no longer
	   shared a left/right edge with .container-wide (header, footer,
	   hero) -- per direct feedback, both now match. */
	--container-max: 1280px;
	--container-wide-max: 1280px;

	color-scheme: light;
}

:root[data-theme="dark"] {
	--bg: #12151A;
	--bg-alt: #181C22;
	--surface: #1C2129;
	--surface-2: #212730;
	--ink: #F2F3F5;
	--ink-soft: #A3A8B0;
	--ink-faint: #6C717A;
	--border: #2A303A;
	--border-soft: #232931;

	--navy: #F5F6F8;
	--navy-600: #FFFFFF;
	--navy-100: #16283C;

	--accent: #4FADE0;
	--accent-600: #7EC4EA;
	--accent-100: #16283C;
	--accent-rgb: 79, 173, 224;
	--accent-600-rgb: 126, 196, 234;

	--brand-green: #57C486;
	--brand-green-rgb: 87, 196, 134;

	--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
	--shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4);
	--shadow-lg: 0 24px 56px rgba(0, 0, 0, 0.55);

	color-scheme: dark;
}

body { transition: background 0.4s var(--ease), color 0.4s var(--ease); }
.site-header,
.feature-card, .case-card, .tabs-v-layout, .stats-grid, .insight-item,
.accordion-item, .hero-visual { transition: background 0.4s var(--ease), border-color 0.4s var(--ease), box-shadow 0.4s var(--ease), color 0.4s var(--ease); }

/* ---------- reset ---------- */
*, *::before, *::after { box-sizing: border-box; }
/* "Why do we have horizontal scroll, I don't want horizontal scroll" --
   decorative absolutely-positioned glow/blur elements (.hero-glow etc.)
   intentionally bleed past their own section on purpose, clipped by that
   section's own overflow:hidden; this is a page-level safety net so a
   transform/animation on one of those, or any future one, can never leak
   into a document-level horizontal scrollbar regardless of which section
   it's in. */
html, body { overflow-x: hidden; max-width: 100%; }
html { scroll-behavior: smooth; }
body {
	margin: 0;
	background: var(--bg) radial-gradient(var(--border-soft) 1px, transparent 1px) 0 0/28px 28px;
	color: var(--ink);
	font-family: var(--font-body);
	font-size: 16px;
	line-height: 1.6;
	-webkit-font-smoothing: antialiased;
}
img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; background: none; border: none; color: inherit; }
/* Form fields never inherit the page font by default (they fell back to Arial,
   e.g. the Insights "By Document / By Country / By Topic" selects) -- use the
   site font everywhere. */
input, select, textarea { font-family: inherit; }
ul { margin: 0; padding: 0; list-style: none; }
h1, h2, h3, h4 { font-family: var(--font-display); font-weight: 600; line-height: 1.15; letter-spacing: -0.01em; margin: 0 0 0.5em; color: var(--navy); }
p { margin: 0 0 1em; color: var(--ink-soft); }

.sr-only {
	position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
	overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.skip-link {
	position: absolute; left: -999px; top: 0; background: var(--accent); color: var(--bg);
	padding: 12px 20px; z-index: 999; border-radius: 0 0 8px 0; font-weight: 700;
}
.skip-link:focus { left: 0; }

.container {
	max-width: var(--container-max);
	margin: 0 auto;
	padding: 0 40px;
}
.container-wide {
	max-width: var(--container-wide-max);
	margin: 0 auto;
	padding: 0 40px;
}

/* ---------- scroll progress bar ---------- */
.scroll-progress {
	position: fixed;
	top: 0; left: 0;
	height: 3px;
	width: 0%;
	background: linear-gradient(90deg, var(--accent), var(--accent-600));
	box-shadow: 0 0 12px rgba(var(--accent-rgb), 0.6);
	z-index: 999;
	transition: width 0.1s linear;
}

/* ---------- scroll-to-top button ---------- */
.scroll-top-btn {
	position: fixed; right: 24px; bottom: 24px;
	width: 44px; height: 44px; border-radius: 50%;
	display: flex; align-items: center; justify-content: center;
	background: var(--accent); color: #FFFFFF; border: 0;
	box-shadow: 0 10px 26px -10px rgba(var(--accent-rgb), 0.6);
	cursor: pointer;
	opacity: 0; visibility: hidden; transform: translateY(10px);
	transition: opacity 0.25s var(--ease), transform 0.25s var(--ease), visibility 0.25s, background 0.25s var(--ease);
	z-index: 500;
}
.scroll-top-btn.is-visible { opacity: 1; visibility: visible; transform: translateY(0); }
.scroll-top-btn:hover { background: var(--accent-600); transform: translateY(-3px); }
/* "The scroll to top button is not working in mobile" -- it wasn't broken,
   it was being covered by the cookie-consent banner's own hit area (same
   bottom-right corner) for any first-time visitor who hadn't dismissed it
   yet. --cookie-banner-offset is set to that banner's real height by
   initCookieConsent() in main.js. */
body.has-cookie-banner .scroll-top-btn { bottom: var(--cookie-banner-offset, 24px); transition: opacity 0.25s var(--ease), transform 0.25s var(--ease), visibility 0.25s, background 0.25s var(--ease), bottom 0.3s var(--ease); }
@media (max-width: 760px) {
	.scroll-top-btn { right: 16px; bottom: 16px; width: 40px; height: 40px; }
}

/* ---------- cookie consent banner ---------- */
/* "Scroll to top is not working in mobile" -- the REAL cause, found by
   checking which element actually receives the tap: this unconditional
   `display: flex` is author CSS, which always beats the browser's own
   `[hidden] { display: none }` default regardless of specificity, so
   setting banner.hidden = true in JS never actually removed it from the
   layout. It just sat there at opacity:0 (invisible) but still on top
   (z-index 600, above the button's 500) and fully clickable, silently
   swallowing every tap on the scroll-top button on every page, forever
   after the first dismissal -- not only while genuinely visible. Explicit
   pointer-events + a real [hidden] rule close both gaps. */
.cookie-consent {
	position: fixed; left: 24px; right: 24px; bottom: 24px; z-index: 600;
	max-width: 620px; margin: 0 auto;
	display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px;
	padding: 18px 22px;
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg);
	box-shadow: 0 24px 60px -20px rgba(0,0,0,0.35);
	opacity: 0; transform: translateY(16px); pointer-events: none;
	transition: opacity 0.4s var(--ease), transform 0.4s var(--ease);
}
.cookie-consent.is-visible { opacity: 1; transform: translateY(0); pointer-events: auto; }
.cookie-consent[hidden] { display: none; }
.cookie-consent-text { margin: 0; font-size: 13.5px; color: var(--ink-soft); flex: 1 1 260px; }
.cookie-consent-text a { color: var(--accent); font-weight: 600; }
.cookie-consent-actions { display: flex; gap: 10px; flex: none; }
@media (max-width: 640px) {
	.cookie-consent { left: 12px; right: 12px; bottom: 12px; padding: 16px; }
	.cookie-consent-actions { width: 100%; }
	.cookie-consent-actions .btn { flex: 1; }
}

/* ---------- theme toggle ---------- */
.theme-toggle {
	width: 38px; height: 38px;
	border-radius: 50%;
	border: 1.5px solid var(--border);
	display: flex; align-items: center; justify-content: center;
	gap: 8px;
	color: var(--ink);
	transition: border-color 0.3s var(--ease), background 0.3s var(--ease), color 0.3s var(--ease);
	flex: none;
}
.theme-toggle:hover { border-color: var(--accent); color: var(--accent); }

/* Both icons are always in the DOM; only the one for the *next* state shows
   — moon while in light mode ("tap for dark"), sun while in dark mode. */
.theme-icon-sun { display: none; }
.theme-icon-moon { display: block; }
:root[data-theme="dark"] .theme-icon-sun { display: block; }
:root[data-theme="dark"] .theme-icon-moon { display: none; }

.theme-toggle-label { display: none; }

/* Matched to the reference's own eyebrow exactly (inspected directly):
   Inter, not mono -- font-weight 600, and letter-spacing 0.3em, much
   wider than what was here before. */
/* Every section eyebrow on the reference (Solutions, Proof at scale,
   Insights, The Anatomy of a Decision, Enterprise-wide coverage, ...)
   uses the same cyan, never the blue accent -- confirmed by sampling
   every uppercase/tracked label site-wide, not just this one section. */
.eyebrow {
	font-family: var(--font-body);
	font-size: 12px;
	font-weight: 600;
	letter-spacing: 0.3em;
	text-transform: uppercase;
	color: var(--cyan-glow);
	margin: 0 0 12px;
}

/* ---------- buttons ---------- */
/* Fully pill-shaped, matching the reference site's own buttons exactly
   (border-radius: 3.35544e+07px in their computed styles, i.e. "however
   round the box allows" — 999px does the same thing without the silly
   number). */
.btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 12px 22px;
	border-radius: 999px;
	font-weight: 600;
	font-size: 14px;
	position: relative;
	overflow: hidden;
	transition: transform 0.35s var(--ease), box-shadow 0.35s var(--ease), background 0.25s var(--ease), color .25s var(--ease);
	white-space: nowrap;
}
.btn > * { position: relative; z-index: 1; }
/* Submit button starts disabled on the Contact Us / Request a Demo forms
   until every mandatory field (incl. captcha) validates -- needs to
   visibly look inactive, not just silently refuse clicks (Sept 2026
   site-modifications doc). */
.btn:disabled { opacity: 0.45; cursor: not-allowed; box-shadow: none; }
.btn:disabled:hover::before { animation: none; }
/* Same hover-only diagonal sheen used on every other box/button on the
   site (.hub-node, the insights cards, etc.) for one consistent effect
   everywhere, not a per-component variant. */
.btn::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.btn:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
/* Always-on soft glow at rest, matched to the reference's own primary
   button (it isn't hover-only there). */
.btn-primary {
	background: var(--accent);
	color: #FFFFFF;
	box-shadow: 0 0 42px -8px rgba(var(--accent-rgb), 0.6);
}
.btn-primary:hover { background: var(--accent-600); transform: translateY(-4px); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); }
.btn-primary:disabled:hover { background: var(--accent); transform: none; box-shadow: none; }
.is-magnetic { transition: transform 0.25s var(--ease), background 0.25s var(--ease), box-shadow 0.25s var(--ease); }
/* A clean focus ring instead of the browser's default (often a harsh black
   rectangle) — shown only for keyboard/assistive-tech users, not mouse clicks. */
.btn:focus-visible {
	outline: 2px solid var(--accent-600);
	outline-offset: 2px;
}
/* Matched to the reference's secondary button: a translucent navy wash
   rather than plain transparent-with-border. */
.btn-ghost {
	background: rgba(var(--navy-rgb), 0.06);
	color: var(--ink);
	border: 1px solid rgba(var(--navy-rgb), 0.12);
}
.btn-ghost:hover { border-color: rgba(var(--accent-rgb), 0.35); background: var(--accent-100); color: var(--accent); transform: translateY(-4px); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); }
.btn-lg { padding: 16px 32px; font-size: 14px; }
.btn-sm { padding: 9px 16px; font-size: 13px; }
.btn-block { display: flex; width: 100%; }

/* ---------- reveal-on-scroll ----------
   The reference's own entrance (its Tailwind "enter" keyframe, sampled
   directly off its site) blurs elements into focus on top of the usual
   fade + slide -- a much more pronounced, deliberate reveal than a plain
   fade. Matched here across every .reveal use, not just the hero, so the
   whole site's reveals read as one consistent effect. */
.reveal {
	opacity: 0;
	transform: translateY(22px);
	filter: blur(14px);
	transition: opacity 0.7s var(--ease), transform 0.7s var(--ease), filter 0.7s var(--ease);
}
.reveal.in-view { opacity: 1; transform: translateY(0); filter: blur(0); }
/* Two-column split sections slide in from their own side, like the
   reference (left column from the left, right column from the right). */
.genie-split > .reveal:first-child:not(.in-view) { transform: translateX(-48px); }
.genie-split > .reveal:nth-child(2):not(.in-view) { transform: translateX(48px); }
.genie-split > .reveal:nth-child(2) { transition-delay: 0.12s; }

/* ==========================================================================
   Header
   ========================================================================== */
.site-header {
	position: sticky;
	top: 0;
	z-index: 100;
	/* Light is the default now (no toggle sets [data-theme] at all), so this
	   rule — not a [data-theme="light"] override — is what actually applies. */
	background: rgba(250, 250, 247, 0.82);
	backdrop-filter: blur(12px);
	border-bottom: 1px solid transparent;
	transition: border-color 0.3s var(--ease), box-shadow 0.3s var(--ease), background 0.3s var(--ease);
}
:root[data-theme="dark"] .site-header { background: rgba(10, 11, 14, 0.78); }
.site-header.is-scrolled {
	border-bottom-color: var(--border);
	box-shadow: var(--shadow-sm);
}
.header-inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	height: 88px;
}
.brand { display: flex; align-items: center; gap: 8px; }
.brand-word {
	font-family: var(--font-display);
	font-size: 22px;
	font-weight: 700;
	letter-spacing: -0.02em;
	color: var(--navy);
}

/* Real uploaded logo (Appearance > Customize > Site Identity), when set.
   Sized taller than a typical single-line wordmark since Clari5's logo file
   is a two-row lockup ("Clari5" + "A Perfios Company" stacked beneath it) —
   this keeps the tagline legible instead of shrinking it to a sliver. */
.custom-logo-link { display: flex; align-items: center; }
/* Sized to roughly match the "Schedule Demo" button's height, so the two
   line up visually instead of the logo dominating the header row. */
.custom-logo-link img { max-height: 46px; width: auto; display: block; }
.footer-brand .custom-logo-link img { max-height: 40px; }

@media (max-width: 760px) {
	.custom-logo-link img { max-height: 36px; }
	.logo-mobile img { max-height: 30px; }
}

/* Optional separate dark-mode logo (Site Identity > "Logo — Dark Mode").
   Both logos are always in the DOM; CSS swaps which one is visible the
   instant [data-theme] changes, so there's no flash or JS-timed swap. */
.logo-light,
.logo-dark,
.logo-mobile { display: flex; align-items: center; }
.logo-dark,
.logo-mobile { display: none; }
:root[data-theme="dark"] .has-dark-variant { display: none; }
:root[data-theme="dark"] .logo-dark { display: flex; }

/* Optional separate compact logo for small screens (Site Identity >
   "Logo — Mobile"). Overrides whichever of light/dark is otherwise active. */
@media (max-width: 760px) {
	.has-mobile-variant { display: none !important; }
	.logo-mobile { display: flex !important; }
}

.primary-nav .nav-menu { display: flex; align-items: center; gap: 32px; }
.primary-nav .nav-menu > li { position: static; }
.primary-nav .nav-menu > li.has-mega { position: relative; } /* wins over the rule above on specificity */
/* "Menu font is small and dropdown menu is big" -- the top-level nav bar
   (14.5px) read as undersized next to its own dropdown content, which is
   17px since the mega-menu font-size fix above. Bumped the bar itself
   closer to that scale instead of shrinking the dropdown back down (that
   dropdown size was itself a deliberate earlier fix for "Solutions banner
   ... looks very congested"). */
.primary-nav .nav-menu a,
.nav-mega-trigger {
	font-size: 16px;
	font-weight: 500;
	color: var(--ink);
	position: relative;
	padding: 6px 0;
}
.primary-nav .nav-menu a::after {
	content: ''; position: absolute; left: 0; right: 100%; bottom: 0; height: 2px;
	background: var(--accent); transition: right 0.3s var(--ease);
	box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.7);
}
.primary-nav .nav-menu a:hover::after { right: 0; }

/* ---------- mega menu ---------- */
.has-mega { position: relative; }
/* Same padding/no-background as every other nav link — per feedback it
   should read as a plain nav item with a dropdown caret, not a
   highlighted pill. */
.nav-mega-trigger { display: flex; align-items: center; gap: 5px; }
.mega-caret { transition: transform 0.3s var(--ease); color: var(--ink-faint); }
.has-mega:hover .mega-caret,
.nav-mega-trigger[aria-expanded="true"] .mega-caret { transform: rotate(180deg); color: var(--accent); }

/* The gap between the trigger and the panel lives INSIDE this element as
   padding-top, not as a `top` offset — so the invisible space the cursor
   crosses on the way down is still part of .mega-menu's hoverable box.
   (An offset gap creates a dead zone: the mouse leaves .has-mega between
   the button and the panel, so :hover drops and the menu closes early.) */
.mega-menu {
	position: absolute;
	top: 100%;
	/* Left-anchored to the trigger (not centered) and capped to the viewport
	   width with margin either side — "Platform" sits near the left edge of
	   the header, so centering a wide panel on it pushed most of the panel
	   off-screen to the left and got visually cut off. */
	left: 0;
	/* Header Menu Changes-30Sept.pdf: "increase the box size" -- widened
	   to comfortably fit the now-longer full-form labels without wrapping
	   mid-word. */
	width: min(880px, calc(100vw - 48px));
	padding-top: 18px;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity 0.25s var(--ease), visibility 0.25s;
	z-index: 90;
}
.mega-menu-inner {
	transform: translateY(10px);
	transition: transform 0.25s var(--ease);
}
/* :hover scoped to devices that actually have hover (a real pointer) --
   on touch, a :hover rule on this element makes the browser swallow the
   first tap just to simulate the hover state, so opening it needed two
   taps: one to "hover", one to actually click. The click-to-toggle JS
   below (.mega-menu.is-open) already handles touch on its own; :hover
   is purely a desktop nicety layered on top. */
@media (hover: hover) and (pointer: fine) {
	.has-mega:hover .mega-menu { opacity: 1; visibility: visible; pointer-events: auto; }
	.has-mega:hover .mega-menu-inner { transform: translateY(0); }
}
.has-mega:has(:focus-visible) .mega-menu,
.mega-menu.is-open {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
}
.has-mega:has(:focus-visible) .mega-menu-inner,
.mega-menu.is-open .mega-menu-inner {
	transform: translateY(0);
}
.mega-menu-inner {
	display: flex;
	gap: 36px;
	padding: 32px;
	max-width: none;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	box-shadow: var(--shadow-lg);
}
.mega-cols { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; flex: 1; }
/* Matches the sitewide convention for these small tracked kicker
   labels (Inter/font-body, not mono) -- same fix already applied to
   .eyebrow, .logo-strip-label, .hero-visual-chip-label, etc. */
.mega-col-heading {
	font-family: var(--font-body);
	font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.06em;
	color: var(--accent);
	margin: 0 0 10px;
}
.mega-link { display: flex; align-items: center; gap: 7px; padding: 9px 0; }
/* Header Menu Changes-30Sept.pdf: "Increase the font size of the menus" --
   was 13.5px; also carries longer full-form labels now (e.g. "EFRM –
   Enterprise Fraud Risk Management") so line-height needs the room too. */
.mega-link-title { font-size: 15px; line-height: 1.35; font-weight: 500; color: var(--ink); transition: color 0.25s var(--ease); }
.mega-link:hover .mega-link-title { color: var(--accent); }

.mega-promo {
	flex: 0 0 240px;
	background: var(--accent-100);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	padding: 20px;
	overflow: hidden; /* belt-and-braces: nothing inside can visually break out past the rounded corners */
}
.mega-promo .btn {
	display: flex; /* block-level, so margin:auto below can actually center it */
	white-space: normal;
	text-align: center;
	justify-content: center;
	max-width: 200px;
	width: fit-content;
	margin: 4px auto 0; /* centered, so there's visible space on both sides instead of sitting flush with the card's left edge */
	padding: 16px 28px !important; /* deliberately generous and !important so no inherited .btn/.btn-sm padding can win instead */
}
/* .primary-nav .nav-menu a, .nav-mega-trigger { color: var(--ink) }
   (2 classes + 1 element) outranks .btn-primary's plain white (1
   class) since this button lives inside .nav-menu's own dropdown --
   text was rendering dark-on-blue, unreadable. Three classes here
   beats that compound selector on specificity. */
.mega-promo .btn.btn-primary { color: #FFFFFF; }
/* Requested: no darkening/lift on hover for this specific button — it stays flat. */
.mega-promo .btn:hover {
	background: var(--accent);
	transform: none;
	box-shadow: none;
}
.mega-promo-tag {
	display: inline-block;
	font-family: var(--font-body);
	font-size: 10.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em;
	color: var(--accent-600);
	margin-bottom: 10px;
}
.mega-promo h4 { font-size: 1.05rem; margin-bottom: 6px; }
.mega-promo p { font-size: 13px; margin-bottom: 16px; }

/* Resources / Company dropdowns: flat link lists, no promo card and no
   per-column group headings -- much narrower than the grouped Solutions
   mega menu (760px), so it doesn't read as a half-empty giant panel over
   just two short columns of links. */
.mega-menu.is-compact { width: min(360px, calc(100vw - 48px)); }
.mega-menu.is-compact .mega-cols { grid-template-columns: repeat(2, 1fr); gap: 8px 24px; }

/* Solutions dropdown, redesigned into a flat 2-column list of fixed
   product names (header menu redesign, Sept 2026) -- wider than the
   Resources/Company .is-compact panels since several labels here
   ("Cybercrime Complaint Processing", "AI-Powered Risk Intelligence")
   are long enough to wrap awkwardly at 360px. */
.mega-menu.is-flat-solutions { width: min(460px, calc(100vw - 48px)); }
.mega-menu.is-flat-solutions .mega-cols { grid-template-columns: repeat(2, 1fr); gap: 4px 24px; }

/* "Insurance" flyout inside the Solutions dropdown -- its own hover/click
   sub-panel (EFRM, AML) instead of a plain link. Flies out to the right
   of the Solutions panel on desktop; collapses into an inline accordion
   on mobile/touch instead (see @media blocks below). */
.mega-link-parent { position: relative; }
.mega-submenu-trigger {
	display: flex; align-items: center; justify-content: space-between; gap: 8px;
	width: 100%; padding: 9px 0; background: none; border: 0; font: inherit; text-align: left; cursor: pointer;
}
.mega-submenu-trigger .mega-link-title { transition: color 0.25s var(--ease); }
.mega-submenu-trigger:hover .mega-link-title,
.mega-submenu-trigger[aria-expanded="true"] .mega-link-title { color: var(--accent); }
.mega-caret-right { transition: transform 0.25s var(--ease), color 0.25s var(--ease); color: var(--ink-faint); flex-shrink: 0; }
.mega-submenu-trigger[aria-expanded="true"] .mega-caret-right { transform: rotate(90deg); color: var(--accent); }
.mega-submenu {
	position: absolute;
	left: 100%;
	top: -8px;
	min-width: 150px;
	max-width: 260px;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	box-shadow: var(--shadow-lg);
	padding: 8px 14px;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transform: translateX(6px);
	transition: opacity 0.2s var(--ease), visibility 0.2s, transform 0.2s var(--ease);
	z-index: 91;
}
@media (hover: hover) and (pointer: fine) {
	.mega-link-parent:hover .mega-submenu { opacity: 1; visibility: visible; pointer-events: auto; transform: translateX(0); }
	.mega-link-parent:hover .mega-caret-right { transform: rotate(90deg); color: var(--accent); }
}
.mega-submenu.is-open { opacity: 1; visibility: visible; pointer-events: auto; transform: translateX(0); }
.mega-sublink { display: block; padding: 6px 0; font-size: 13.5px; line-height: 1.35; font-weight: 500; color: var(--ink); white-space: normal; transition: color 0.25s var(--ease); }
.mega-sublink:hover { color: var(--accent); }

@media (max-width: 1080px) {
	.mega-cols { grid-template-columns: repeat(2, 1fr); }
	.mega-menu-inner { flex-direction: column; }
	.mega-promo { flex: none; }
	/* Not enough room to fly out sideways once the panel itself is
	   already near the viewport edge -- drop the submenu below its
	   trigger instead, same direction the main mega-menu opens. */
	.mega-submenu { left: 0; top: 100%; transform: translateY(4px); }
	.mega-submenu.is-open { transform: translateY(0); }
}
@media (hover: hover) and (pointer: fine) and (max-width: 1080px) {
	.mega-link-parent:hover .mega-submenu { transform: translateY(0); }
}

/* Inside .mobile-nav, hover doesn't apply (touch) — the mega menu becomes a
   plain accordion driven purely by JS toggling .is-open via click. */
@media (max-width: 760px) {
	.mobile-nav .mega-menu {
		position: static;
		width: 100%;
		max-height: 0;
		overflow: hidden;
		opacity: 1;
		visibility: visible;
		pointer-events: auto;
		transform: none;
		padding-top: 0;
		margin-top: 4px;
		transition: max-height 0.4s var(--ease);
	}
	.mobile-nav .mega-menu.is-open { max-height: 1200px; }
	.mobile-nav .mega-menu-inner {
		padding: 8px 0 16px;
		background: transparent;
		border: none;
		border-radius: 0;
		box-shadow: none;
	}
	.mobile-nav .mega-cols { grid-template-columns: 1fr 1fr; gap: 14px; }
	.mobile-nav .mega-promo { margin-top: 4px; }

	/* Insurance flyout becomes an inline accordion here -- no room to fly
	   out sideways on a phone-width panel. */
	.mobile-nav .mega-submenu {
		position: static;
		max-height: 0;
		overflow: hidden;
		opacity: 1; visibility: visible; pointer-events: auto; transform: none;
		background: none; border: none; box-shadow: none; border-radius: 0;
		padding: 0 0 0 14px;
		margin-bottom: 0;
		transition: max-height 0.3s var(--ease), margin-bottom 0.3s var(--ease);
	}
	.mobile-nav .mega-submenu.is-open { max-height: 200px; padding-top: 4px; margin-bottom: 6px; }
}

.header-actions { display: flex; align-items: center; gap: 12px; }

.nav-toggle {
	display: none;
	flex-direction: column;
	justify-content: center;
	gap: 5px;
	width: 40px; height: 40px;
}
.nav-toggle span {
	display: block; width: 20px; height: 2px; background: var(--navy);
	transition: transform 0.3s var(--ease), opacity 0.3s var(--ease);
	margin: 0 auto;
}
.nav-toggle.is-open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-toggle.is-open span:nth-child(2) { opacity: 0; }
.nav-toggle.is-open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.mobile-nav {
	display: none;
	max-height: 0;
	overflow: hidden;
	background: var(--surface);
	border-bottom: 1px solid var(--border);
	transition: max-height 0.4s var(--ease);
}
.mobile-nav.is-open { max-height: 80vh; overflow-y: auto; }
.mobile-nav { padding: 0 24px; }
/* Was a plain stacked text list with a 4px gap and no separation --
   per direct feedback ("looks very simple"), gave each link its own
   row with even padding and a divider, matching the weight/size of
   the desktop nav links instead of reading as an afterthought. */
.mobile-nav .nav-menu-mobile { padding: 8px 0 16px; display: flex; flex-direction: column; gap: 0; }
.mobile-nav .nav-menu-mobile li { border-bottom: 1px solid var(--border-soft); }
.mobile-nav .nav-menu-mobile li:last-child { border-bottom: none; }
/* .nav-mega-trigger included alongside the plain links -- it was missing
   here entirely, so Solutions/Resources/Company (all <button> triggers)
   were falling back to the base desktop rule's tighter padding/lighter
   weight (padding: 6px 0, font-weight: 500) instead of this touch-sized
   one, while "Contact Us" (a plain <a>, the only real link at this level)
   correctly got it -- that's why it alone looked bold, and why all four
   rows didn't line up (6px 0 padding vs 16px 4px doesn't share a left
   edge or a row height). width: 100% + justify-content: space-between
   is also new here (the base rule doesn't need it -- desktop's caret
   sits tight against its own label, not pushed to a shared row's far
   edge). */
.mobile-nav .nav-menu-mobile a,
.mobile-nav .nav-menu-mobile .nav-mega-trigger {
	display: flex; align-items: center; justify-content: space-between; width: 100%;
	padding: 16px 4px; font-weight: 600; font-size: 15.5px; color: var(--navy);
	transition: color 0.2s var(--ease);
}
.mobile-nav .nav-menu-mobile a:hover,
.mobile-nav .nav-menu-mobile .nav-mega-trigger:hover { color: var(--accent); }

.mobile-nav-footer {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 16px 0 20px;
	border-top: 1px solid var(--border-soft);
}
.mobile-nav-footer .btn { margin: 0; flex: 1; }
.mobile-nav-footer .theme-toggle {
	width: auto;
	height: 44px;
	border-radius: var(--radius-sm);
	padding: 0 14px;
	flex: none;
}
.mobile-nav-footer .theme-toggle-label { display: inline; font-size: 13.5px; font-weight: 500; }

/* ==========================================================================
   Hero
   ========================================================================== */
/* Tightened (was 96px/72px) so the whole hero — badge through buttons —
   fits within a single 14"/15.6" laptop screen without scrolling. */
.hero { position: relative; padding: 20px 0 24px; overflow: hidden; }
.hero-glow {
	position: absolute; inset: -20% -10% auto -10%; height: 560px;
	background:
		radial-gradient(480px 320px at 15% 20%, rgba(var(--accent-rgb), 0.16) 0%, transparent 70%),
		radial-gradient(520px 360px at 85% 10%, rgba(var(--accent-600-rgb), 0.16) 0%, transparent 70%);
	filter: blur(10px);
	animation: driftGlow 16s ease-in-out infinite alternate;
	pointer-events: none;
}
@keyframes driftGlow {
	0% { transform: translate3d(0,0,0) scale(1); }
	100% { transform: translate3d(20px,10px,0) scale(1.05); }
}
.hero-inner {
	position: relative;
	display: grid;
	grid-template-columns: 1.05fr 0.95fr;
	gap: 56px;
	align-items: center;
}
.hero-copy { text-align: left; max-width: 620px; }
/* Hero eyebrow is a bordered pill/badge on the reference (its other
   section eyebrows use a plain dash + line instead — see .eyebrow
   further down, left as-is), reusing the same frosted-glass treatment
   as .hub-node/.hero-visual-chip. Values matched to the reference's own
   markup: <p class="glass ... rounded-full px-4 py-1.5 text-[11px]
   ... tracking-[0.25em] text-cyan-glow"><span class="animate-node-pulse
   h-1.5 w-1.5 rounded-full bg-cyan-glow"></span>label</p> */
.hero-badge {
	display: inline-flex; align-items: center; gap: 10px;
	padding: 6px 16px;
	border-radius: 999px;
	background: rgba(var(--navy-rgb), 0.06);
	border: 1px solid rgba(var(--navy-rgb), 0.12);
	backdrop-filter: blur(18px);
	-webkit-backdrop-filter: blur(18px);
	font-size: 11px; font-weight: 500; letter-spacing: 0.25em; text-transform: uppercase;
	color: var(--cyan-glow);
	margin: 0 0 14px;
}
.hero-badge-dot {
	width: 6px; height: 6px; border-radius: 50%; flex: none;
	background: var(--cyan-glow);
	animation: clari5-node-pulse 3.4s ease-in-out infinite;
}
/* Matched to the reference's own hero h1 computed styles at 1440px
   (83.2px / weight 700 / line-height ~1.02 / letter-spacing -2.08px,
   i.e. -0.025em) via a clamp so it still scales down gracefully on
   narrower screens instead of just hardcoding 83.2px. */
.hero h1 {
	font-size: clamp(2.4rem, 6vw, 5.2rem);
	font-weight: 700;
	line-height: 1.02;
	letter-spacing: -0.025em;
	margin-bottom: 0.25em;
}
/* No underline on the reference's accent phrase — solid accent color only. */
.ink-underline { white-space: nowrap; color: var(--accent); }
.hero-sub { font-size: 18px; max-width: 540px; margin-bottom: 1.1em; }
.hero-actions { display: flex; gap: 14px; flex-wrap: wrap; }

/* hero live-dashboard mockup */
.hero-visual { position: relative; border-radius: var(--radius-lg); }
.hero-visual::before {
	content: '';
	position: absolute;
	inset: 0;
	border-radius: var(--radius-lg);
	padding: 1.5px;
	background: conic-gradient(from 0deg, var(--accent), transparent 30%, transparent 70%, var(--accent));
	-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
	-webkit-mask-composite: xor;
	mask-composite: exclude;
	animation: spinBorder 7s linear infinite;
	pointer-events: none;
}
@keyframes spinBorder { to { transform: rotate(360deg); } }
.hero-visual-card {
	position: relative;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	box-shadow: var(--shadow-lg);
	padding: 22px;
	animation: floatCard 6s ease-in-out infinite;
}
@keyframes floatCard {
	0%, 100% { transform: translateY(0); }
	50% { transform: translateY(-10px); }
}
.hero-visual-head {
	display: flex; align-items: center; justify-content: space-between;
	margin-bottom: 18px;
}
.hero-visual-dots { display: flex; gap: 6px; }
.hero-visual-dots span { width: 9px; height: 9px; border-radius: 50%; background: var(--border); }
.hero-visual-live {
	display: flex; align-items: center; gap: 6px;
	font-family: var(--font-mono);
	font-size: 11.5px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase;
	color: var(--brand-green);
}
.hero-visual-live::before {
	content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--brand-green);
	animation: pulseDot 1.6s ease-in-out infinite;
}
@keyframes pulseDot {
	0%, 100% { box-shadow: 0 0 0 0 rgba(var(--brand-green-rgb), 0.5); }
	50% { box-shadow: 0 0 0 6px rgba(var(--brand-green-rgb), 0); }
}
.hero-chart {
	display: flex; align-items: flex-end; gap: 8px;
	height: 120px;
	padding: 0 2px 12px;
	border-bottom: 1px solid var(--border-soft);
	margin-bottom: 16px;
}
.hero-chart span {
	flex: 1;
	border-radius: 4px 4px 2px 2px;
	background: linear-gradient(180deg, var(--accent), var(--accent-600));
	transform-origin: bottom;
	animation: growBar 1.4s var(--ease) both;
}
.hero-chart span:nth-child(even) { background: linear-gradient(180deg, var(--accent-600), var(--accent)); }
@keyframes growBar {
	from { transform: scaleY(0); opacity: 0; }
	to { transform: scaleY(1); opacity: 1; }
}
.hero-visual-stats { display: flex; gap: 12px; }
.hero-visual-stat {
	flex: 1;
	background: var(--bg-alt);
	border: 1px solid var(--border-soft);
	border-radius: var(--radius-sm);
	padding: 12px 14px;
}
.hero-visual-stat strong { display: block; font-family: var(--font-mono); font-size: 1.25rem; color: var(--navy); font-weight: 600; }
.hero-visual-stat span { font-size: 12px; color: var(--ink-faint); }

/* Two-line badge: a small dotted label ("Screening") over a bold value
   ("2,400 tx/s"). Floats gently — see .anim-float further down, matched
   to the reference site's own floating badge timing. */
/* Frosted-glass badge, matched to the reference's own chip: radius 20px,
   navy/6% wash, navy/12% border, 18px backdrop-blur, no shadow at rest. */
.hero-visual-chip {
	position: absolute;
	max-width: 190px;
	background: rgba(var(--navy-rgb), 0.06);
	border: 1px solid rgba(var(--navy-rgb), 0.12);
	border-radius: 20px;
	padding: 12px 16px;
	font-family: var(--font-display);
	font-size: 18px;
	font-weight: 600;
	line-height: 28px;
	color: var(--ink);
	backdrop-filter: blur(18px);
	-webkit-backdrop-filter: blur(18px);
	display: flex; flex-direction: column; align-items: flex-start; gap: 3px;
	z-index: 2;
}
.hero-visual-chip-label {
	display: flex; align-items: center; gap: 6px;
	font-family: var(--font-body);
	font-size: 10px; font-weight: 400; text-transform: uppercase; letter-spacing: 0.2em;
	line-height: 15px;
	color: var(--ink-faint);
}
.hero-visual-chip-label::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--brand-green); box-shadow: 0 0 6px rgba(var(--brand-green-rgb), 0.8); }
/* The "Fraud attempt" badge reports a catch, not routine screening — give
   its dot its own red so the two badges don't read as the same status. */
.chip-alert .hero-visual-chip-label::before { background: var(--brand-red); box-shadow: 0 0 6px rgba(var(--brand-red-rgb), 0.8); }
.chip-1 { top: 14%; left: 0; }
/* Below the sphere, close to its edge but clear of it -- not just
   "somewhere below" (98% left a big dead gap, per direct feedback).
   Solved for the tightest safe position: distance from the sphere's
   center to the chip's top-left corner (its closest point, since the
   chip sits right of center) must stay >= the sphere's radius, even
   at the top of the chip's float bob (clari5-float moves it up to
   12px closer). That works out to ~93.6% of the container's height;
   94.5% nudges it up closer per direct feedback while keeping a
   small real buffer (~4px at the float's peak, not zero). */
.chip-2 { top: 94.5%; bottom: auto; right: 0; }

@media (max-width: 1080px) {
	.hero-inner { grid-template-columns: 1fr; }
	/* order: -1 (removed) put the sphere ahead of the headline/copy on
	   mobile, so visitors had to scroll past it to reach the actual
	   message -- per direct feedback, content now comes first. */
	.hero-visual { max-width: 460px; margin: 0 auto; }
	.hero-copy { max-width: 100%; }
}

/* ==========================================================================
   Stats band
   ========================================================================== */
.stats-band { padding: 8px 0 64px; }
.stats-grid {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 24px;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	padding: 40px 32px;
	box-shadow: var(--shadow-sm);
}
.stat { text-align: center; }
.stat-value, .stat-suffix {
	font-family: var(--font-numeric);
	font-size: 2.3rem;
	color: var(--navy);
	font-weight: 600;
}
.stat-suffix { color: var(--accent); }
.stat-label { margin-top: 6px; font-size: 13.5px; color: var(--ink-faint); }

/* ==========================================================================
   Explore / Tabs section
   ========================================================================== */
.explore { padding: 40px 0 96px; }
.section-head { max-width: 640px; margin: 0 auto 40px; text-align: center; }
/* Matched to the reference's own section h2 exactly: 60px / weight 600 /
   line-height ~1.05 / letter-spacing -1.5px (-0.025em) at desktop, via a
   clamp so it still scales down on narrower screens (was capping out at
   2.4rem/38.4px -- noticeably smaller than the reference throughout). */
.section-head h2 { font-size: clamp(1.8rem, 4.2vw, 3.75rem); font-weight: 600; line-height: 1.05; letter-spacing: -0.025em; }
/* Headings the client asked to "keep in 2 lines" / "keep in 1 line" (AML
   Development Changes-5Oct.pdf) -- a wider head, and .h2-line spans that
   each hold one unbroken line on desktop instead of wherever the old
   640px box happened to wrap them. Intro paragraphs keep their measure. */
.section-head-wide { max-width: 1120px; }
.section-head-wide h2 { font-size: clamp(1.8rem, 3.9vw, 3.5rem); }
.section-head-wide > p { max-width: 720px; margin-left: auto; margin-right: auto; }
@media (min-width: 961px) {
	.h2-line { display: block; white-space: nowrap; }
	/* "keep the black font content in 1 line ... so that the content remains in 3 lines" -- the accent part wraps under it over two lines. */
	.h2-narrow { display: block; max-width: 820px; margin: 0 auto; }
}
.section-sub { font-size: 16px; }

/* horizontal tabs */
.tabs-h {
	position: relative;
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	background: var(--bg-alt);
	border: 1px solid var(--border);
	border-radius: 999px;
	padding: 6px;
	max-width: fit-content;
	margin: 0 auto 40px;
}
.tab-h {
	position: relative;
	z-index: 2;
	padding: 11px 22px;
	border-radius: 999px;
	font-size: 14.5px;
	font-weight: 600;
	color: var(--ink-soft);
	transition: color 0.3s var(--ease);
}
.tab-h.is-active { color: #FFFFFF; }
.tab-h-indicator {
	position: absolute;
	z-index: 1;
	top: 6px; left: 6px;
	height: calc(100% - 12px);
	border-radius: 999px;
	background: var(--accent);
	box-shadow: 0 0 20px rgba(var(--accent-rgb), 0.45);
	transition: transform 0.4s var(--ease), width 0.4s var(--ease);
}
.tab-h-indicator.no-anim { transition: none; }

.tab-panel { display: none; }
.tab-panel.is-active { display: block; animation: panelIn 0.5s var(--ease); }
@keyframes panelIn {
	from { opacity: 0; transform: translateY(14px); }
	to { opacity: 1; transform: translateY(0); }
}

.panel-kicker {
	text-align: center; font-family: var(--font-mono); font-size: 13px; color: var(--ink-faint);
	text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 28px;
}

/* Overview panel */
.overview-grid {
	display: grid;
	grid-template-columns: 1.1fr 1fr;
	gap: 48px;
	align-items: start;
	margin-bottom: 56px;
}
.overview-copy h3 { font-size: 1.7rem; }
.check-list li {
	position: relative;
	padding: 8px 0 8px 30px;
	color: var(--ink);
	font-size: 15px;
}
.check-list li::before {
	content: '';
	position: absolute; left: 0; top: 12px;
	width: 18px; height: 18px;
	border-radius: 50%;
	background: rgba(var(--brand-green-rgb), 0.14);
	box-shadow: inset 0 0 0 1.5px var(--brand-green);
}
.check-list li::after {
	content: '';
	position: absolute; left: 5px; top: 16px;
	width: 8px; height: 4px;
	border-left: 2px solid var(--brand-green);
	border-bottom: 2px solid var(--brand-green);
	transform: rotate(-45deg);
}
.overview-cards { display: flex; flex-direction: column; gap: 16px; }
.feature-card {
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	padding: 22px 24px;
	position: relative;
	overflow: hidden;
	transition: transform 0.15s linear, box-shadow 0.35s var(--ease), border-color .35s var(--ease);
	transform-style: preserve-3d;
	will-change: transform;
}
.feature-card > * { position: relative; z-index: 1; }
/* Same hover-only sheen as every other box on the site; the lift itself
   is already handled by initTilt()'s own translateY(-4px) baked into its
   3D-tilt transform, so only the glow/border/sheen need matching here. */
.feature-card::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.feature-card:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
.feature-card:hover { box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); border-color: rgba(var(--accent-rgb), 0.35); }
.feature-card h4 { margin: 6px 0 6px; font-size: 1.1rem; }
.feature-card p { margin: 0; font-size: 14.5px; }
.feature-card-tag {
	display: inline-block;
	font-family: var(--font-mono);
	font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.04em;
	color: var(--accent);
	background: var(--accent-100);
	padding: 4px 10px;
	border-radius: 999px;
}

/* Auto-scrolling marquee, right to left, images only -- per explicit
   request (the reference itself is actually a static row, but the
   client wants the scroll behaviour back, just with real logos
   instead of the old text-name fallback). */
.logo-strip {
	border-top: 1px solid var(--border);
	padding-top: 32px;
	text-align: center;
}
.logo-strip-label {
	font-family: var(--font-body);
	font-size: 11px;
	font-weight: 400;
	letter-spacing: 0.3em;
	text-transform: uppercase;
	color: var(--ink-faint);
	margin-bottom: 32px;
}
.logo-marquee {
	overflow: hidden;
	padding: 8px 0;
	margin: -8px 0;
	-webkit-mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
	mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
}
.logo-track {
	display: flex;
	align-items: center;
	gap: 80px;
	width: max-content;
	animation: marquee 32s linear infinite;
}
@keyframes marquee {
	from { transform: translateX(0); }
	to { transform: translateX(-33.333%); }
}
.logo-marquee:hover .logo-track { animation-play-state: paused; }
/* Bare logo, no card/pill treatment -- matching the reference exactly:
   its logo wrapper has no border, no background, no padding at all,
   just the image centered in a fixed-size box. Height-constrained
   (not width-constrained): the uploaded logo files have wildly
   different aspect ratios (5:1 to 8:1), so fitting them to a fixed
   *width* let their rendered heights vary from 16px to 24px -- a
   visibly uneven row, which read as "not aligned." Fixing every
   logo to the same height and letting width flex keeps them at a
   consistent visual scale, same convention the reference itself uses.

   The previous fix used a *fixed* height (26px) plus a max-width cap --
   for any logo whose natural width at 26px tall exceeded that cap
   (the widest ones, ~8:1), the browser squeezed its width down to fit
   while height stayed rigidly fixed, distorting/squashing it. Using
   max-height instead of height, with no max-width at all, lets every
   logo scale down proportionally with no distortion, however wide. */
.logo-chip {
	flex: none;
	display: flex;
	align-items: center;
	justify-content: center;
	height: 44px;
}
.logo-chip-img { max-height: 24px; width: auto; height: auto; display: block; filter: none; } /* 32px -> 29px -> 24px, per repeated direct feedback that they still read as too large */

/* ---------- live activity ticker (inside hero dashboard mockup) ---------- */
.activity-ticker {
	margin-top: 16px;
	border-top: 1px solid var(--border-soft);
	padding-top: 12px;
	height: 26px;
	overflow: hidden;
	position: relative;
}
.activity-ticker-list {
	position: absolute;
	inset: 0;
	margin: 0;
}
.activity-ticker-list li {
	display: flex;
	align-items: center;
	gap: 8px;
	height: 26px;
	font-family: var(--font-mono);
	font-size: 12px;
	color: var(--ink-soft);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.activity-dot {
	flex: none;
	width: 6px; height: 6px; border-radius: 50%;
	background: var(--brand-green);
	box-shadow: 0 0 0 3px rgba(var(--brand-green-rgb), 0.18);
}
/* Each <li> is shown for one slice of the cycle, matching the JS index toggling display */
.activity-ticker-list li { display: none; }
.activity-ticker-list li.is-active { display: flex; animation: tickerIn 0.4s var(--ease); }
@keyframes tickerIn {
	from { opacity: 0; transform: translateY(6px); }
	to { opacity: 1; transform: translateY(0); }
}

/* ---------- outcomes ---------- */
.outcomes { padding: 24px 0 72px; }
.outcomes-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 20px;
}
.outcome-card {
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	padding: 32px 28px;
	position: relative;
	overflow: hidden;
	transition: transform 0.35s var(--ease), box-shadow 0.35s var(--ease), border-color .35s var(--ease);
}
.outcome-card > * { position: relative; z-index: 1; }
.outcome-card::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.outcome-card:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
.outcome-card:hover { transform: translateY(-4px); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); border-color: rgba(var(--accent-rgb), 0.35); }
.outcome-icon { width: 30px; height: 30px; color: var(--accent); margin-bottom: 18px; }
.outcome-value {
	font-family: var(--font-mono);
	font-size: 2.5rem;
	color: var(--navy);
	font-weight: 600;
	line-height: 1;
	margin-bottom: 10px;
}
.outcome-suffix { color: var(--accent); }
.outcome-card p { margin: 0; font-size: 14.5px; }

/* ---------- certifications ---------- */
.certifications { padding: 0 0 88px; text-align: center; }
.cert-label {
	font-family: var(--font-mono);
	font-size: 12.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.06em;
	color: var(--ink-faint); margin-bottom: 22px;
}
.cert-grid {
	display: grid;
	grid-template-columns: repeat(6, 1fr);
	gap: 14px;
}
.cert-badge {
	background: var(--bg-alt);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	padding: 18px 14px;
	position: relative;
	overflow: hidden;
	transition: transform 0.35s var(--ease), border-color 0.35s var(--ease), box-shadow .35s var(--ease);
}
.cert-badge > * { position: relative; z-index: 1; }
.cert-badge::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.cert-badge:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
.cert-badge:hover { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.35); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); }
.cert-name { display: block; font-weight: 700; font-size: 13.5px; color: var(--navy); margin-bottom: 4px; }
.cert-desc { display: block; font-size: 11.5px; color: var(--ink-faint); line-height: 1.35; }

/* ---------- leadership ---------- */
.leader-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
	gap: 18px;
	margin-top: 16px;
}
.leader-card {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 6px;
	padding: 20px 12px;
	border-radius: var(--radius-md);
	position: relative;
	overflow: hidden;
	border: 1px solid transparent;
	transition: background 0.3s var(--ease), transform 0.3s var(--ease), border-color 0.3s var(--ease), box-shadow 0.3s var(--ease);
}
.leader-card > * { position: relative; z-index: 1; }
.leader-card::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.leader-card:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
.leader-card:hover { background: var(--bg-alt); transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.35); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); }
.leader-avatar {
	width: 56px; height: 56px; border-radius: 50%;
	display: flex; align-items: center; justify-content: center;
	background: linear-gradient(135deg, var(--accent), var(--accent-600));
	color: #FFFFFF;
	font-family: var(--font-display);
	font-size: 1.3rem;
	font-weight: 700;
	margin-bottom: 6px;
}
.leader-avatar-img {
	width: 56px; height: 56px; border-radius: 50%;
	object-fit: cover;
	margin-bottom: 6px;
}
.leader-card strong { font-size: 14.5px; color: var(--navy); }
.leader-title { font-size: 12.5px; color: var(--ink-faint); }

/* ---------- contact form ---------- */
.contact-section { padding: 88px 0; background: var(--bg-alt); border-top: 1px solid var(--border); }
.contact-inner { max-width: 760px; }
.contact-form { margin-top: 32px; }
.form-grid {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 18px;
	margin-bottom: 18px;
}
.field { position: relative; }
.field-full { margin-bottom: 24px; }
.field input,
.field textarea {
	width: 100%;
	/* var(--bg-alt), not plain var(--surface) -- a flat white box on a
	   white page read as barely-there; this gives every field a visibly
	   distinct fill (Sept 2026 site-modifications doc: "make the boxes
	   little prominent with a different background colour"). */
	background: var(--bg-alt);
	border: 1.5px solid var(--border);
	border-radius: var(--radius-sm);
	padding: 16px 14px 8px;
	font: inherit;
	font-size: 14.5px;
	color: var(--ink);
	transition: border-color 0.3s var(--ease), box-shadow 0.3s var(--ease);
}
.field input[type="file"] { padding: 12px 14px; font-size: 13.5px; }
.field textarea { padding-top: 20px; resize: vertical; min-height: 90px; }
.field input:focus,
.field textarea:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.2);
}
.field label {
	position: absolute;
	left: 15px; top: 15px;
	font-size: 14.5px;
	color: var(--ink-faint);
	pointer-events: none;
	transition: transform 0.2s var(--ease), font-size 0.2s var(--ease), color 0.2s var(--ease), top 0.2s var(--ease);
	transform-origin: left top;
}
.field input:focus + label,
.field input:not(:placeholder-shown) + label,
.field textarea:focus + label,
.field textarea:not(:placeholder-shown) + label {
	top: 8px;
	font-size: 11px;
	color: var(--accent);
	font-weight: 600;
}
.hp-field { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.form-status {
	padding: 14px 18px;
	border-radius: var(--radius-sm);
	font-size: 14.5px;
	font-weight: 500;
	line-height: 1.4;
	/* Was "24px 0 -8px" -- the negative bottom margin looked fine for the
	   old one-line-only messages, but once a message can wrap to two
	   lines (the longer, field-specific ones now shown), it pulled the
	   heading below up into the banner text. */
	margin: 24px 0 20px;
}
.form-status-success { background: #E4F6EC; color: #1C7A41; border: 1px solid #B7E6C6; }
.form-status-error { background: #FBEAEA; color: #B3261E; border: 1px solid #F2C6C3; }
/* Added by initFormValidationMessage() (main.js) after a failed submit --
   a red border on the specific field(s) that failed, not just the one
   banner above the form, so it's obvious which required field is still
   empty or malformed without having to re-read every label. */
.was-validated input:invalid,
.was-validated select:invalid,
.was-validated textarea:invalid { border-color: #E5484D; }
.was-validated input:invalid:focus,
.was-validated select:invalid:focus,
.was-validated textarea:invalid:focus { box-shadow: 0 0 0 3px rgba(229, 72, 77, 0.2); }

/* Added by initInlineFieldValidation() (main.js) -- per-field feedback as
   someone fills the form in, not just on a failed submit attempt. Set
   directly on the field itself (not gated behind .was-validated on the
   form), since a field can be "touched" and invalid well before anyone
   has tried to submit. */
input.is-invalid, select.is-invalid, textarea.is-invalid { border-color: #E5484D; }
input.is-invalid:focus, select.is-invalid:focus, textarea.is-invalid:focus { box-shadow: 0 0 0 3px rgba(229, 72, 77, 0.2); }
.field-error-msg { color: #B3261E; font-size: 12.5px; font-weight: 500; margin: 6px 0 0; }

/* ==========================================================================
   Contact Us page -- built September 2026 to Consasia's Lovable reference
   at clarity-voyage-net.lovable.app/contact. The hero's orbital diagram
   (four contact methods in a circle around a "Talk to Clari5" bubble) uses
   real absolute-position percentages measured off a screenshot of that
   reference -- not a simplified grid. The center bubble's pulse reuses
   .hub-ping-ring/clari5-ping-ring (front-page.php's hub diagram) and each
   satellite node reuses floatCard's gentle bob (.hero-visual-card) -- the
   site's existing motion language, not new keyframes.
   ========================================================================== */
/* Light tint (var(--bg-alt), not plain white) so the hero visually reads
   as its own band instead of blending into the page background -- Sept
   2026 site-modifications doc. */
.contact-hero { padding: 48px 0 40px; position: relative; overflow: hidden; background: var(--bg-alt); }
.contact-hero-grid { display: grid; grid-template-columns: 1.05fr 0.95fr; gap: 48px; align-items: center; position: relative; z-index: 1; }
.contact-hero h1 { font-size: clamp(2rem, 3.6vw, 2.9rem); margin: 14px 0 16px; color: var(--navy); }
.contact-hero-sub { font-size: 16px; color: var(--ink-soft); max-width: 480px; }

/* ---------- orbital diagram ----------
   Shrunk from 520px (was leaving a lot of empty space above/below the
   left column's text at this height) -- same doc. */
/* max-width caps this at roughly the same size as its own height --
   the rings are sized as a % of THIS element's width (aspect-ratio: 1
   makes each ring's height follow suit), so without a width cap this
   just stretches to fill its whole grid column, which on a wide desktop
   is noticeably wider than 400px tall, and the resulting ring/cards
   overflowed the shorter box and got clipped by .contact-hero's
   overflow: hidden. */
/* height fixed at one value across every breakpoint (not tuned per
   screen size) -- see .contact-orbit-node below for why the box needs to
   be this tall regardless of width: it's what keeps the top/bottom card
   pairs clear of the center hub's own ~150px footprint everywhere. */
.contact-orbit { position: relative; height: 440px; width: 100%; max-width: 400px; margin: 0 auto; }
.contact-orbit-ring {
	position: absolute; top: 50%; left: 50%;
	border-radius: 50%;
	border: 1px solid rgba(var(--accent-rgb), 0.14);
	transform: translate(-50%, -50%);
	pointer-events: none;
	/* aspect-ratio (not a height %) so this is always a true circle --
	   .contact-orbit's own width and height rarely match (its height is a
	   fixed px per breakpoint, its width just whatever its grid column
	   comes out to), so a height % here sized it against the wrong
	   dimension and drew an oval, worst on mobile where the column goes
	   full-width against a much shorter fixed height. */
	aspect-ratio: 1;
}
.contact-orbit-ring-outer { width: 92%; }
.contact-orbit-ring-inner { width: 58%; }
.contact-orbit-center {
	position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
	display: flex; flex-direction: column; align-items: center; gap: 10px;
	text-align: center; z-index: 1;
}
.contact-orbit-center-bubble {
	position: relative;
	width: 64px; height: 64px; border-radius: var(--radius-md);
	display: flex; align-items: center; justify-content: center;
	background: var(--accent);
	box-shadow: 0 12px 30px -10px rgba(var(--accent-rgb), 0.5);
	/* Gentle scale breathing -- same keyframe used for other "alive" UI
	   elements elsewhere on the site (see clari5-breathe usages). */
	animation: clari5-breathe 3.2s ease-in-out infinite;
}
/* .hub-ping-ring is position:absolute; inset:0 -- sized off this bubble,
   scaling outward via clari5-ping-ring exactly like the homepage's hub
   diagram center node. */
.contact-orbit-title { font-weight: 700; color: var(--navy); font-size: 15px; }
.contact-orbit-sub { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-faint); }

.contact-quick-card {
	display: flex; flex-direction: column; gap: 5px;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	padding: 12px 14px;
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.contact-quick-card:hover { transform: translateY(-3px) !important; box-shadow: var(--shadow-md); border-color: rgba(var(--accent-rgb), 0.3); }
.contact-quick-icon {
	display: inline-flex; align-items: center; justify-content: center;
	width: 30px; height: 30px; border-radius: 50%;
	background: var(--accent-100); color: var(--accent);
	flex: none;
}
.contact-quick-label { font-family: var(--font-mono); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); }
/* Was 14px -- these cards shrank (40% of .contact-orbit, itself capped
   to 400px so the ring would stop overflowing its section) without this
   text shrinking to match, so "connect@clari5.com" / "080-4112 5043"
   were spilling past the card edge. */
.contact-quick-value { font-weight: 700; font-size: 11.5px; color: var(--navy); white-space: nowrap; }

/* Percentages measured off a screenshot of the reference diagram --
   roughly 180deg-symmetric pairs (Email/Visit, Call/Book), not a plain
   4-quadrant grid. Each gets floatCard's bob, staggered per node so they
   don't move in lockstep.
   Width used to be a flat 220px -- fine at the one container size it was
   measured against, but a paired left+width past 100% (or a left column
   width the orbit didn't actually get) at any other viewport meant two
   cards' boxes could genuinely overlap instead of just sitting close. A
   %-based width scales with whatever the orbit's own column ends up being
   at any breakpoint, and 40%-wide pairs at these lefts never sum past
   100%, so they can't collide with each other or spill past the ring.
   Top/bottom, by contrast, were never actually safe at any width: the
   center hub's own footprint (bubble + title + subtitle) is a fixed
   ~150px regardless of container size, so the old 10%/26%/60%/76% values
   only cleared it by coincidence at whatever one viewport they were
   eyeballed against -- measuring live rects found 3 of the 4 cards
   overlapping the hub's bounding box at 1440px desktop just as much as at
   375px mobile. Pinning the top pair to the very top edge and the bottom
   pair to the very bottom edge (paired with .contact-orbit's own fixed
   height below) guarantees clearance at every width instead of tuning a
   percentage that happens to work at whichever one size someone last
   checked (site-modifications thread: overlap reported at a ~838px
   tablet screenshot after mobile alone had already been "fixed" twice,
   2026-09-27). */
.contact-orbit-node { position: absolute; width: 40%; max-width: 220px; animation: floatCard 6s ease-in-out infinite; }
.contact-orbit-node-1 { top: 3%; left: 0; animation-delay: 0s; }
.contact-orbit-node-2 { top: 3%; left: 60%; animation-delay: 1.5s; }
.contact-orbit-node-3 { top: auto; bottom: 3%; left: 2%; animation-delay: 3s; }
.contact-orbit-node-4 { top: auto; bottom: 3%; left: 58%; animation-delay: 4.5s; }

.contact-form-section { padding: 16px 0 64px; }
/* 1.15fr/0.85fr (not a flat 1fr/300px) and the card wrapper below both
   measured directly off clarity-voyage-net.lovable.app/contact's own
   computed layout ("make my contact page look like this", 2026-09-27) --
   the reference wraps its whole form in a bordered white card
   (rounded-3xl border border-border bg-card p-6 md:p-10 -- 24px radius,
   1px subtle border, 40px padding) where ours had the form sitting bare
   on the page background with no card at all, the single biggest visual
   gap between the two pages. */
.contact-form-grid { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 48px; align-items: start; }
.contact-form-col {
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: 24px;
	padding: 40px;
}
.event-register-col { margin-top: 48px; max-width: 640px; }
.contact-form-heading { font-size: 1.5rem; color: var(--navy); margin-bottom: 6px; }
.contact-form-note { font-size: 13px; color: var(--ink-faint); margin-bottom: 20px; }
/* Fields inside this card specifically get the reference's own field
   treatment (16px radius, near-white fill distinct from the card's own
   white, subtle border) -- scoped to .contact-form-col rather than
   changed globally on .field so the Request a Demo form and every other
   .field usage site-wide is untouched. */
.contact-form-col .field input,
.contact-form-col .field textarea { background: var(--bg-alt); border-radius: 16px; }
.contact-form-col .field-select select { border-radius: 16px; }

/* Static (non-floating) labels + a real example in the placeholder --
   matches the reference exactly, and reads better for a form this long
   than the floating-label treatment used on the shorter Schedule Demo form. */
.field-static label { display: block; font-size: 14px; font-weight: 600; color: var(--ink-faint); margin-bottom: 6px; position: static; pointer-events: auto; transform: none; }
.field-static input,
.field-static textarea { padding: 12px 14px; }
.field-static input:focus + label,
.field-static input:not(:placeholder-shown) + label { top: auto; font-size: 12px; color: var(--ink-faint); font-weight: 600; }

.field-select select {
	width: 100%;
	background: var(--bg-alt);
	border: 1.5px solid var(--border);
	border-radius: var(--radius-sm);
	padding: 12px 14px;
	font: inherit; font-size: 14.5px; color: var(--ink);
	transition: border-color 0.3s var(--ease), box-shadow 0.3s var(--ease);
}
/* .field label (the floating-label default further up) is absolutely
   positioned at top:15px so it can sit inside the input until you start
   typing -- .field-select never floats anything over the <select> itself,
   but only overrode display/spacing here, not position, so the label kept
   that absolute placement and sat printed right on top of the select's own
   "Select your country" text instead of above the box. */
.field-select label { display: block; position: static; pointer-events: auto; transform: none; font-size: 14px; font-weight: 600; color: var(--ink-faint); margin-bottom: 6px; }
.field-select select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.2); }

.field-radio-group { border: 0; padding: 0; margin-bottom: 24px; }
.field-radio-group legend { font-size: 12.5px; font-weight: 600; color: var(--ink-faint); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 12px; padding: 0; }
.field-radio-row { display: flex; flex-wrap: wrap; gap: 10px; }
.field-radio { display: inline-flex; align-items: center; gap: 7px; font-size: 13.5px; color: var(--ink-soft); border: 1px solid var(--border); border-radius: 999px; padding: 8px 14px; cursor: pointer; transition: border-color 0.3s var(--ease), color 0.3s var(--ease); }
.field-radio:has(input:checked) { border-color: var(--accent); color: var(--accent); background: var(--accent-100); }
.field-radio input { accent-color: var(--accent); }

/* Simple arithmetic captcha + consent checkboxes -- Sept 2026
   site-modifications doc. Captcha reuses the same .field-static input
   sizing; a narrow max-width so it doesn't stretch full-width like the
   message textarea above it. */
.field-captcha input[type="text"] { max-width: 140px; }
/* Image "type what you see" captcha (replaced the a+b math one) --
   clari5_render_captcha_field()/clari5_maybe_serve_captcha_image()
   (functions.php). */
.captcha-image-row { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.captcha-image { display: block; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-alt); }
.captcha-refresh {
	flex: none; width: 36px; height: 36px; border-radius: var(--radius-sm);
	display: flex; align-items: center; justify-content: center;
	font-size: 18px; line-height: 1; color: var(--ink-faint);
	background: var(--bg-alt); border: 1px solid var(--border); cursor: pointer;
	transition: color 0.2s var(--ease), border-color 0.2s var(--ease), transform 0.3s var(--ease);
}
.captcha-refresh:hover { color: var(--accent); border-color: var(--accent); }
.captcha-refresh.is-loading { transform: rotate(180deg); }
.field-checkbox-group { display: flex; flex-direction: column; gap: 10px; margin-bottom: 24px; }
.field-checkbox { display: flex; align-items: flex-start; gap: 10px; font-size: 13.5px; color: var(--ink-soft); cursor: pointer; line-height: 1.45; }
.field-checkbox input { margin-top: 3px; accent-color: var(--accent); flex-shrink: 0; }
.field-checkbox a { color: var(--accent); text-decoration: underline; }
.field-checkbox a:hover { color: var(--accent-600); }

/* ---------- merged info + offices panel ---------- */
.contact-info-col { display: flex; flex-direction: column; position: sticky; top: 100px; }
.contact-info-panel-merged { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 4px 22px; }
.contact-info-row { display: flex; flex-direction: column; padding: 18px 0; border-bottom: 1px solid var(--border); }
.contact-info-row:last-child { border-bottom: none; }
.contact-info-label { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); margin: 8px 0 4px; }
.contact-info-value { font-weight: 700; font-size: 15px; }
.contact-info-value a { color: var(--navy); }
.contact-info-value a:hover { color: var(--accent); }
.contact-info-note { font-size: 12.5px; color: var(--ink-faint); margin-top: 2px; }
.contact-hq-address { font-size: 13.5px; color: var(--ink-soft); line-height: 1.65; margin-top: 4px; }

/* ---------- offices: full-width row before the map, not the old
   2-office sidebar list (Sept 2026 site-modifications doc) ---------- */
.contact-offices-section { padding: 8px 0 56px; }
.contact-offices-heading { font-family: var(--font-display); font-weight: 600; font-size: 1.4rem; color: var(--navy); margin-bottom: 20px; }
/* align-items: stretch (grid's own default, stated explicitly) makes
   every card in the row match the tallest one's height regardless of how
   much shorter another office's address actually is -- the divider below
   is each card's own bottom border now, not an inline underline sized to
   that card's own text, so with equal-height cards every divider lands on
   the same line instead of wherever each card's own text happened to end. */
.contact-offices-grid { display: grid; grid-template-columns: repeat(4, 1fr); align-items: stretch; gap: 14px 24px; }
.contact-office-card { display: flex; flex-direction: column; height: 100%; padding-bottom: 14px; border-bottom: 1.5px solid rgba(var(--accent-rgb), 0.35); }
.contact-office-city { font-weight: 700; font-size: 14.5px; color: var(--navy); margin-bottom: 6px; }
.contact-office-desc { font-size: 13px; color: var(--ink-faint); line-height: 1.55; flex: 1; }
@media (max-width: 900px) {
	.contact-offices-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
	.contact-offices-grid { grid-template-columns: 1fr; }
}

/* ---------- real embedded map ---------- */
.contact-map-section { padding: 16px 0 80px; }
.contact-map-head { display: flex; align-items: baseline; justify-content: space-between; gap: 20px; flex-wrap: wrap; margin-bottom: 20px; }
.contact-map-head h2 { font-size: clamp(1.4rem, 2.4vw, 1.9rem); color: var(--navy); margin: 0; }
.contact-map-link { font-weight: 600; font-size: 14px; color: var(--accent); white-space: nowrap; }
.contact-map-link:hover { color: var(--accent-600); }
.contact-map-embed { aspect-ratio: 16 / 6; border-radius: 24px; overflow: hidden; border: 1px solid var(--border); }
.contact-map-embed iframe { display: block; width: 100%; height: 100%; }

@media (max-width: 900px) {
	.contact-hero-grid { grid-template-columns: 1fr; gap: 32px; }
	.contact-form-grid { grid-template-columns: 1fr; }
	.contact-info-col { position: static; }
}
@media (max-width: 560px) {
	.contact-map-embed { aspect-ratio: 4 / 5; }
	.field-radio-row { gap: 8px; }
	/* Reference uses p-6 md:p-10 -- 40px only from the md breakpoint up,
	   24px below it. Matches the card's own 24px border-radius rather than
	   a phone-cramping full 40px. */
	.contact-form-col { padding: 24px; }
}

/* vertical tab layout (used by Solutions / Insights / Company) */
.tabs-v-layout {
	display: grid;
	grid-template-columns: 280px 1fr;
	gap: 32px;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	padding: 20px;
	box-shadow: var(--shadow-sm);
}
.tabs-v {
	display: flex;
	flex-direction: column;
	gap: 2px;
	border-right: 1px solid var(--border-soft);
	padding-right: 20px;
	max-height: 560px;
	overflow-y: auto;
}
.tab-v {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 3px;
	text-align: left;
	padding: 12px 16px;
	border-radius: var(--radius-sm);
	border-left: 3px solid transparent;
	transition: background 0.3s var(--ease), border-color 0.3s var(--ease), transform .3s var(--ease);
}
.tab-v:hover { background: var(--bg-alt); transform: translateX(4px); }
.tab-v.is-active {
	background: var(--accent-100);
	border-left-color: var(--accent);
	transform: translateX(2px);
}
.tab-v-tag {
	font-family: var(--font-mono);
	font-size: 10.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em;
	color: var(--accent);
}
.tab-v-title { font-size: 14.5px; font-weight: 600; color: var(--navy); }

.view-all-link { margin-top: 18px; }
.tabs-v-panels { padding: 8px 12px; min-height: 320px; }
.tab-v-panel { display: none; }
.tab-v-panel.is-active { display: block; animation: panelIn 0.4s var(--ease); }
.tab-v-panel h3 { font-size: 1.5rem; margin-bottom: 0.4em; }
.tab-v-panel > .check-list { margin: 16px 0 24px; }
/* Reference renders these as bordered, tinted chip rows with their own
   hover lift -- not a plain checkmark list. Scoped to this one panel
   (not the base .check-list, which other pages reuse as a plain list). */
.tab-v-panel > .check-list li {
	border: 1px solid var(--border); border-radius: var(--radius-md);
	background: var(--bg-alt); padding: 12px 16px 12px 44px; margin-bottom: 8px;
	transition: transform 0.5s var(--ease), border-color 0.5s var(--ease), background 0.5s var(--ease);
}
.tab-v-panel > .check-list li:hover { transform: translateY(-2px); border-color: rgba(var(--accent-rgb), 0.4); background: var(--accent-100); }
.tab-v-panel > .check-list li::before { left: 14px; }
.tab-v-panel > .check-list li::after { left: 19px; }

/* Case studies */
.cases-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 20px;
}
.case-card {
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	padding: 26px;
	position: relative;
	overflow: hidden;
	transition: transform 0.15s linear, box-shadow 0.35s var(--ease), border-color .35s var(--ease);
	transform-style: preserve-3d;
	will-change: transform;
}
.case-card > * { position: relative; z-index: 1; }
/* Lift already handled by initTilt()'s own translateY(-4px). */
.case-card::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.case-card:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
.case-card:hover { box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); border-color: rgba(var(--accent-rgb), 0.35); }
.case-region {
	font-family: var(--font-mono);
	font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em;
	color: var(--accent);
}
.case-card h3 { font-size: 1.2rem; margin: 8px 0 10px; }
.case-metric { font-weight: 600; color: var(--navy); font-size: 14px; }
.case-link { font-weight: 600; font-size: 14px; color: var(--accent); }
.case-link:hover { color: var(--accent-600); }

/* ==========================================================================
   Testimonials
   ========================================================================== */
.testimonials { padding: 80px 0; background: var(--surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); text-align: center; }
/* touch-action: pan-y -- without this, a touchscreen's default gesture
   handling claims any drag that starts here for page-scrolling before
   the pointer events below ever see a meaningful horizontal delta (the
   classic reason a "swipe" only works with a mouse in a desktop
   simulator, never with a real finger). pan-y still lets an actually
   vertical drag scroll the page as normal -- only horizontal intent is
   captured by JS instead. */
.testimonial-carousel { position: relative; max-width: 720px; margin: 24px auto 0; min-height: 160px; touch-action: pan-y; cursor: grab; }
.testimonial-carousel.is-dragging { cursor: grabbing; }
.testimonial {
	position: absolute; inset: 0;
	opacity: 0; transform: translateY(10px);
	transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
	margin: 0;
}
.testimonial.is-active { position: relative; opacity: 1; transform: translateY(0); }
/* Plain icon, no circle badge -- matching the reference exactly. */
.testimonial-quote-mark { display: block; margin: 0 auto 16px; color: var(--cyan-glow); }
.testimonial p {
	font-family: var(--font-display);
	font-weight: 400;
	font-size: 1rem;
	color: var(--navy);
	line-height: 1.35;
	margin-bottom: 28px;
}
.testimonial-attribution { display: flex; align-items: center; justify-content: center; gap: 12px; }
.testimonial-avatar { width: 56px; height: 56px; border-radius: 50%; object-fit: cover; flex: none; }
.testimonial-avatar-fallback {
	display: flex; align-items: center; justify-content: center;
	background: linear-gradient(135deg, var(--accent), var(--accent-600));
	color: #FFFFFF; font-family: var(--font-display); font-weight: 700; font-size: 1.1rem;
}
.testimonial cite { font-style: normal; text-align: left; }
.testimonial-name { display: block; font-weight: 600; font-size: 14.5px; color: var(--navy); }
.testimonial-role { display: block; font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--cyan-glow); margin-top: 2px; }
/* Active dot is an elongated dash, matching the reference, not just a
   bigger circle. */
.testimonial-dots { display: flex; justify-content: center; align-items: center; gap: 8px; margin-top: 28px; }
.testimonial-dots button {
	width: 8px; height: 8px; border-radius: 999px;
	background: var(--border);
	transition: background 0.3s var(--ease), width .3s var(--ease);
}
.testimonial-dots button.is-active { width: 24px; background: var(--cyan-glow); box-shadow: 0 0 8px rgba(var(--cyan-glow-rgb), 0.6); }

/* ==========================================================================
   FAQ
   ========================================================================== */
.faq { padding: 88px 0; }
.faq-inner { max-width: 1080px; }
/* Row-based grid, not CSS multi-column -- multi-column fills the left
   column top-to-bottom before wrapping right, so a left/right pair
   almost never lines up at the same height. Grid with auto-flow row
   pairs item 1/2, 3/4, ... left/right, each row sized to its taller
   item, per direct request for matching alignment on both sides. */
/* stretch (not start) so both cards in a row match height regardless of
   whether the question text wraps to one line or two -- per direct
   feedback, cards were ending at different heights side by side. */
.accordion { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 48px; align-items: stretch; }
/* Once something in the row is open, stretch would force the still-
   collapsed row-sibling to match the now-much-taller open row, leaving a
   large blank box under its (unexpanded) question -- main.js's
   initAccordion() toggles this class on open/close. See the comments
   above for why stretch exists in the first place. */
.accordion.has-expanded { align-items: start; }
@media (max-width: 780px) {
	.accordion { grid-template-columns: 1fr; }
}
/* Full outline card, not just a bottom border, matching the reference. */
.accordion-item {
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	background: var(--surface);
}
.accordion-trigger {
	width: 100%;
	display: flex; align-items: center; justify-content: space-between; gap: 20px;
	padding: 18px 20px;
	text-align: left;
	font-weight: 600;
	font-size: 16px;
	color: var(--navy);
	transition: color 0.3s var(--ease);
}
/* Sitewide FAQ gap found auditing every Lovable reference against ours:
   the trigger itself has no hover state anywhere on the site (only the
   open/close icon reacts). Reference nudges the question text right and
   underlines/tints it accent on hover, on every page's FAQ. */
.accordion-trigger:hover { color: var(--accent); }
.accordion-trigger > span:first-child { transition: transform 0.3s var(--ease), text-decoration-color 0.3s var(--ease); text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 3px; }
.accordion-trigger:hover > span:first-child { transform: translateX(6px); text-decoration-color: currentColor; }
.accordion-icon { position: relative; width: 18px; height: 18px; flex: none; }
.accordion-icon::before, .accordion-icon::after {
	content: ''; position: absolute; background: var(--accent);
	transition: transform 0.35s var(--ease);
}
.accordion-icon::before { top: 50%; left: 0; width: 18px; height: 2px; transform: translateY(-50%); }
.accordion-icon::after { left: 50%; top: 0; width: 2px; height: 18px; transform: translateX(-50%); }
.accordion-trigger[aria-expanded="true"] .accordion-icon::after { transform: translateX(-50%) rotate(90deg); opacity: 0; }
.accordion-panel {
	display: grid;
	grid-template-rows: 0fr;
	transition: grid-template-rows 0.4s var(--ease);
}
.accordion-panel > p, .accordion-panel-body { overflow: hidden; margin: 0; padding: 0 20px; }
.accordion-trigger[aria-expanded="true"] + .accordion-panel { grid-template-rows: 1fr; }
.accordion-trigger[aria-expanded="true"] + .accordion-panel > p,
.accordion-trigger[aria-expanded="true"] + .accordion-panel > .accordion-panel-body { padding-bottom: 20px; }
.accordion-panel { display: grid; }
.accordion-panel > p, .accordion-panel-body { min-height: 0; }
/* Multi-paragraph answers (Intelligence Hub etc.): spacing between paragraphs. */
.accordion-panel-body > p { margin: 0; }
.accordion-panel-body > p + p { margin-top: 10px; }

/* ==========================================================================
   CTA band — an intentionally dark inverted panel regardless of site theme
   ========================================================================== */
.cta-band { padding: 80px 0; text-align: center; }
/* Given directly as a screenshot of the real reference (not the darker
   one guessed at previously, which turned out wrong): a light,
   near-white gradient with a soft blue glow top-left and a faint dot
   grid, dark-navy heading, blue accent on its second line, and a
   centered teal eyebrow above it -- not a dark band at all. */
.cta-band-inner {
	background: linear-gradient(135deg, #F2F4FC 0%, #FAFBFF 55%, #FFFFFF 100%);
	border: 1px solid var(--border);
	border-radius: 32px;
	padding: 64px 40px;
	color: var(--navy);
	position: relative;
	overflow: hidden;
}
.cta-band-inner::before {
	content: '';
	position: absolute; inset: 0;
	background:
		radial-gradient(480px 320px at 24% 12%, rgba(var(--accent-rgb), 0.16), transparent 70%),
		radial-gradient(circle, rgba(var(--navy-rgb), 0.08) 1px, transparent 1px);
	background-size: auto, 22px 22px;
}
.cta-band-inner .eyebrow { position: relative; color: var(--cyan-glow); }
.cta-band-inner h2 { color: var(--navy); font-size: clamp(1.6rem, 3vw, 2.2rem); position: relative; }
.cta-band-inner p:not(.eyebrow) { color: var(--ink-soft); max-width: 460px; margin: 0 auto 28px; position: relative; }
.cta-band-inner .btn { position: relative; }
.cta-band-inner .btn-ghost { background: var(--surface); color: var(--navy); border-color: var(--border); }
.cta-band-inner .btn-ghost:hover { background: var(--bg-alt); color: var(--navy); border-color: var(--border); }

/* ==========================================================================
   Footer — always dark (black), independent of the site's light theme.
   Hardcoded colors here, not the --bg/--ink tokens (which are light-mode
   values site-wide), same reasoning as .brand-card-inner above.
   ========================================================================== */
.site-footer { background: #000000; border-top: 1px solid #1E2128; padding: 40px 0 24px; }
.footer-inner { display: grid; grid-template-columns: 1.1fr 2fr; gap: 48px; margin: 40px auto 48px; }
.footer-brand p { max-width: 320px; font-size: 14.5px; margin: 14px 0 18px; color: #9BA2B0; }
/* Reuse the theme's "Logo — Dark Mode" upload here, forced on, regardless
   of the (now light-only) site-wide theme — this section is always dark. */
.site-footer .has-dark-variant,
.brand-card-inner .has-dark-variant { display: none; }
.site-footer .logo-dark,
.brand-card-inner .logo-dark { display: flex !important; }
.site-footer .brand-word { color: #FFFFFF; }
.social-links { display: flex; align-items: center; gap: 12px; }
/* Filled circular badges, not bare icon glyphs -- matching the
   reference, which shows each icon inside its own dark rounded button. */
.social-links a {
	width: 34px; height: 34px;
	display: flex; align-items: center; justify-content: center;
	background: rgba(255,255,255,0.08); border-radius: 50%; border: 0;
	font-size: 12px; font-weight: 700; color: #E7EAF0;
	transition: background 0.3s var(--ease), color 0.3s var(--ease), transform .3s var(--ease);
}
.social-links a:hover { background: var(--cyan-glow); color: #0B0D12; transform: translateY(-2px); }
.footer-cols { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
.footer-col h3 { font-family: var(--font-body); font-weight: 600; font-size: 12px; text-transform: uppercase; letter-spacing: 0.05em; color: #6C7280; margin-bottom: 14px; }
.footer-col li { margin-bottom: 10px; }
.footer-col a { font-size: 14.5px; color: #C4C8D0; transition: color 0.25s var(--ease); }
.footer-col a:hover { color: var(--accent); }
/* "Insurance" in the footer's Solutions column -- a non-link parent label
   (its own two children carry the real links) instead of a plain <a>,
   mirroring the header's Insurance flyout. */
.footer-parent-label { font-size: 14.5px; color: #C4C8D0; }
.footer-sublist { margin: 6px 0 0; padding-left: 14px; }
.footer-sublist li { margin-bottom: 6px; }
.footer-sublist a { font-size: 13.5px; }
/* Three parts (credit / legal links / copyright) laid out left-center-
   right, matching the reference exactly instead of a single centered
   copyright line. */
.footer-bottom {
	border-top: 1px solid #1E2128; padding-top: 20px; padding-bottom: 24px;
	display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px 24px;
}
/* Site's own body font, not the mono face -- per direct feedback, it
   read as visually inconsistent with the rest of the page. */
.footer-bottom p { font-family: var(--font-body); font-size: 14px; color: #6C7280; margin: 0; }
.footer-bottom-legal { flex: 1; text-align: center; }
.footer-bottom-legal a { color: #6C7280; transition: color 0.2s var(--ease); }
.footer-bottom-legal a:hover { color: #FFFFFF; }
@media (max-width: 700px) {
	.footer-bottom { justify-content: center; text-align: center; }
	.footer-bottom-legal { flex-basis: 100%; order: 1; }
}

/* ==========================================================================
   Responsive
   ========================================================================== */
@media (max-width: 1080px) {
	.overview-grid { grid-template-columns: 1fr; }
	.stats-grid { grid-template-columns: repeat(2, 1fr); }
	.cases-grid { grid-template-columns: 1fr; }
	.outcomes-grid { grid-template-columns: 1fr; }
	.cert-grid { grid-template-columns: repeat(3, 1fr); }
	.form-grid { grid-template-columns: 1fr; }
	/* Sub-tabs (Solutions / Insights / Company) go from a sidebar to a plain
	   vertical list — not a horizontal-scrolling row. Scrolling sideways to
	   find an option is poor mobile UX; a normal tap-able stacked list that
	   the page just scrolls past is more familiar and needs no discovery. */
	.tabs-v-layout { grid-template-columns: 1fr; }
	.tabs-v {
		flex-direction: column;
		border-right: none;
		padding-right: 0;
		max-height: none;
		overflow: visible;
	}
	.tab-v { flex: none; border-bottom: 1px solid var(--border-soft); border-radius: 0; }
	.tab-v:last-child { border-bottom: none; }
	.tab-v.is-active { border-bottom-color: var(--border-soft); transform: none; }
	.footer-inner { grid-template-columns: 1fr; margin-bottom: 28px; }
	.footer-cols { grid-template-columns: repeat(2, 1fr); }
	/* "Spacing above Infrastructure by consasia" -- the gap between the
	   footer's link columns and the bottom credit line stacked up (this
	   margin + .footer-bottom's own padding-top) into noticeably more
	   whitespace than on desktop, where the columns sit side by side
	   instead of stacking tall. A later pass trimmed this to 14px, which
	   on mobile reads as the credit text sitting almost flush against the
	   divider line above it -- bumped back up a bit for visible breathing
	   room without reverting to the original oversized gap. */
	.footer-bottom { padding-top: 26px; }
}

@media (max-width: 760px) {
	.container,
	.container-wide { padding: 0 20px; }

	.header-inner { height: 72px; }
	.primary-nav { display: none; }
	.header-actions { gap: 8px; }
	.header-actions .btn-ghost { display: none; }
	/* The toggle moves into the mobile menu panel (.mobile-nav-footer) so
	   it stops competing with the logo for space in the compact header. */
	.header-actions > .theme-toggle { display: none; }
	.nav-toggle { display: flex; }
	.mobile-nav { display: block; }

	.hero { padding: 44px 0 40px; }
	/* margin-bottom reserves room for .chip-2 below the sphere -- it's
	   position: absolute, so it doesn't contribute to .hero-visual's own
	   height, and .hero has overflow: hidden. Without this, the chip's
	   fixed top: 100% + margin-top position (set above) would extend
	   past .hero's own auto-height boundary and get clipped instead of
	   just sitting below the sphere as intended. */
	.hero-visual { width: 100%; max-width: none; margin-bottom: 130px; }
	.hero-network { min-height: 330px; padding: 16px 0; }
	.network-graphic { max-width: 420px; flex-basis: 420px; }
	.hero h1 { font-size: clamp(1.9rem, 8vw, 2.6rem); }
	.hero-sub { font-size: 16px; }
	.hero-actions .btn { flex: 1 1 auto; }

	.stats-band { padding: 0 0 40px; }
	.stats-grid { grid-template-columns: repeat(2, 1fr); gap: 16px; padding: 24px 18px; }
	.stat-value, .stat-suffix { font-size: 1.7rem; }

	.explore { padding: 24px 0 64px; }
	.section-head { margin-bottom: 28px; }

	/* Tabs row: a wrapping 2-column grid of independently-styled buttons
	   instead of a scrolling row with a shared sliding indicator — the
	   indicator's size/position is calculated relative to a single-row
	   layout, so it breaks (stretches into a blob) the moment the row
	   wraps or scrolls at narrow widths. A grid sidesteps that entirely:
	   each button carries its own active state, nothing to mis-measure. */
	.tabs-h {
		display: grid;
		grid-template-columns: repeat(2, 1fr);
		gap: 8px;
		max-width: 100%;
		margin: 0 0 28px;
		padding: 0;
		background: transparent;
		border: none;
	}
	.tab-h-indicator { display: none; }
	.tab-h {
		background: var(--bg-alt);
		border: 1px solid var(--border);
		border-radius: var(--radius-sm);
		text-align: center;
		padding: 12px 10px;
	}
	.tab-h.is-active {
		background: var(--accent);
		border-color: var(--accent);
		color: #fff;
	}
	.tab-h:last-of-type { grid-column: span 2; } /* odd count (5 tabs) — last one spans full width instead of sitting alone, half-empty */

	.tabs-v-layout { padding: 14px; }
	.mobile-nav .mega-promo { display: none; } /* keep the mobile accordion focused on links, not a promo card */

	.cert-grid { grid-template-columns: repeat(2, 1fr); }
	.outcomes { padding: 16px 0 56px; }
	.testimonials { padding: 56px 0; }
	.faq { padding: 56px 0; }
}

/* ==========================================================================
   Cursor-tracking spotlight glow (feature/case/outcome cards, cert badges)
   ========================================================================== */
.spotlight-card { position: relative; overflow: hidden; }
.spotlight-card::before {
	content: '';
	position: absolute;
	inset: 0;
	background: radial-gradient(220px circle at var(--spot-x, 50%) var(--spot-y, 50%), rgba(var(--accent-rgb), 0.14), transparent 72%);
	opacity: 0;
	transition: opacity 0.4s var(--ease);
	pointer-events: none;
	z-index: 0;
}
.spotlight-card:hover::before { opacity: 1; }
.spotlight-card > * { position: relative; z-index: 1; }

/* ==========================================================================
   Staggered pop-in when a tab panel becomes active
   ========================================================================== */
@keyframes popIn {
	from { opacity: 0; transform: translateY(16px) scale(0.98); }
	to { opacity: 1; transform: translateY(0) scale(1); }
}
.stagger-pop { animation: popIn 0.55s var(--ease) both; }

/* ==========================================================================
   Blog archive (home.php / index.php)
   Redesigned per direct request ("modern, unique, trendy, better UI/UX"):
   a featured-post spotlight ahead of a color-coded card grid, instead of a
   flat uniform grid every card the same weight. Every card/chip carries a
   --cat-color custom property (set inline per post's insight_group term in
   home.php/content-post-card.php) -- one color per category, used
   consistently for its chip text, top accent bar, and image-fallback
   gradient, so the page reads as one coherent system rather than random
   per-card colors.
   ========================================================================== */
/* Wraps masthead + featured card + stat strip so one drifting glow can sit
   behind all of it -- otherwise this whole upper region of the page is
   flat white, which is most of why the redesign still reads as plain. */
.blog-top { position: relative; overflow: hidden; }
.blog-glow {
	/* .hero-glow already sets position/background/animation (see Hero
	   section above) -- this only widens its color story to the blog's own
	   category colors instead of just --accent/--accent-600, and gives it
	   more vertical room to cover the stats strip too. */
	inset: -10% -10% auto -10%;
	height: 720px;
	background:
		radial-gradient(460px 300px at 12% 15%, rgba(var(--accent-rgb), 0.14) 0%, transparent 70%),
		radial-gradient(420px 300px at 88% 8%, rgba(var(--cyan-glow-rgb), 0.14) 0%, transparent 70%),
		radial-gradient(480px 340px at 50% 85%, rgba(var(--brand-green-rgb), 0.10) 0%, transparent 70%);
}

.blog-hero { padding: 64px 0 32px; position: relative; }
/* Text left, the same network-sphere visual used on the homepage hero on
   the right (Sept 2026 site-modifications doc: "will it look good if we
   have an image on the right?"). Was a single centered column with a
   bottom-rule masthead treatment; that layout is gone, not just hidden --
   nothing else on the page still expects a border-bottom here. */
.blog-hero-grid {
	display: grid;
	grid-template-columns: 1.1fr 0.9fr;
	align-items: center;
	gap: 32px;
}
.blog-hero h1 {
	font-size: clamp(2.25rem, 4.2vw, 3.4rem);
	max-width: 780px;
	color: var(--navy);
	/* The old single-line horizontal gradient-fade doesn't read as
	   intentional once the headline wraps across several lines (Sept 2026
	   copy is much longer) -- it just looked like one word fading out
	   mid-word. Plain navy, with the accent-colored span in home.php's
	   markup doing the emphasis instead. */
}
.blog-hero .hero-visual.hero-network { min-height: 280px; }
@media (max-width: 900px) {
	.blog-hero-grid { grid-template-columns: 1fr; }
	.blog-hero .hero-visual.hero-network { display: none; }
}

/* ---------- featured spotlight ---------- */
.blog-featured { padding: 0 0 40px; }
.blog-featured-card {
	display: grid;
	grid-template-columns: 1.15fr 1fr;
	align-items: stretch;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	overflow: hidden;
	box-shadow: var(--shadow-md);
	transition: transform 0.35s var(--ease), box-shadow 0.35s var(--ease), border-color 0.35s var(--ease);
}
.blog-featured-card:hover {
	transform: translateY(-3px);
	box-shadow: var(--shadow-lg);
	border-color: rgba(var(--accent-rgb), 0.3);
}
.blog-featured-media { position: relative; overflow: hidden; min-height: 280px; background: var(--bg-alt); }
.blog-featured-media img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s var(--ease); }
.blog-featured-card:hover .blog-featured-media img { transform: scale(1.045); }
/* Most posts don't have a featured image yet -- a big category-colored
   gradient with the type's first letter reads as designed, not empty,
   until real photography/graphics exist for each one. */
.blog-featured-media-fallback {
	position: absolute; inset: 0;
	display: flex; align-items: center; justify-content: center;
	/* Three stops instead of a flat diagonal -- a warm color-mix midtone
	   between --cat-color and white keeps this from reading as a plain
	   two-tone swatch, closer to the richer gradient-render thumbnails
	   than a flat corporate accent block. Oversized + animated position so
	   it slowly drifts -- the one hero visual on the page, so it's the one
	   spot that earns a bit of idle motion instead of sitting static. */
	background: linear-gradient(135deg,
		var(--cat-color) 0%,
		color-mix(in srgb, var(--cat-color) 55%, white) 45%,
		var(--navy) 100%);
	background-size: 180% 180%;
	animation: blogFeaturedDrift 14s ease-in-out infinite;
	font-family: var(--font-display); font-weight: 800; font-size: 7rem; color: rgba(255, 255, 255, 0.28);
}
@keyframes blogFeaturedDrift {
	0%, 100% { background-position: 0% 0%; }
	50% { background-position: 100% 100%; }
}
@media (prefers-reduced-motion: reduce) {
	.blog-featured-media-fallback { animation: none; }
}
.blog-featured-body { padding: 40px 44px; display: flex; flex-direction: column; justify-content: center; }
.blog-featured-label {
	display: inline-flex; align-items: center; gap: 6px; width: fit-content;
	font-family: var(--font-mono); font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em;
	color: var(--cat-color);
	background: color-mix(in srgb, var(--cat-color) 12%, transparent);
	padding: 4px 10px; border-radius: 999px;
	margin-bottom: 14px;
}
/* Reuses the same live-pulse idiom as .hero-visual-live elsewhere on the
   site, just keyed to this card's own category color instead of always
   brand-green -- ties the blog's "Latest" badge into the same motion
   language as the rest of the site rather than inventing a new one.
   pulseDot itself is hardcoded to brand-green, so this gets its own
   currentColor-based keyframe instead of reusing that one directly. */
.blog-featured-label-dot {
	width: 6px; height: 6px; border-radius: 50%;
	background: var(--cat-color); color: var(--cat-color);
	animation: pulseDotCat 1.6s ease-in-out infinite;
}
@keyframes pulseDotCat {
	0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, currentColor 50%, transparent); }
	50% { box-shadow: 0 0 0 6px color-mix(in srgb, currentColor 0%, transparent); }
}
.blog-featured-title { font-size: clamp(1.5rem, 2.4vw, 2rem); margin-bottom: 12px; color: var(--navy); }
.blog-featured-excerpt { font-size: 15.5px; margin-bottom: 18px; }

/* ---------- "at a glance" stat strip ---------- */
/* Same data-count-to counter used by .success-value on the homepage (see
   initCounters() in main.js) -- no JS changes needed, just the same markup
   contract, restyled as a compact inline row instead of a 3-column block. */
.blog-stats { padding: 8px 0 36px; }
.blog-stats-row {
	display: flex;
	flex-wrap: wrap;
	/* Each .blog-stat below is baseline-aligned *internally* (value+label),
	   but without this, the row itself only aligns the three blocks by
	   their box tops -- so the "9"'s baseline (a big 30.4px numeral) and
	   "August 2026"'s baseline (an 18.4px phrase) end up at different
	   heights across the row even though each pair looks fine on its own. */
	align-items: baseline;
	gap: 36px;
	padding: 20px 28px;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
}
.blog-stat { display: flex; align-items: baseline; gap: 8px; }
.blog-stat-value {
	font-family: var(--font-numeric); font-size: 1.9rem; font-weight: 600; color: var(--navy);
}
/* A full date phrase in the same size/weight as a single-digit count still
   reads as heavier than "9"/"3" just by being wider -- toned down further
   (smaller, and off --ink-soft instead of full --navy) so this third block
   reads as supporting metadata, not a third headline stat. */
.blog-stat-value-text { font-size: 0.95rem; font-weight: 600; color: var(--ink-soft); }
.blog-stat-label { font-size: 12.5px; color: var(--ink-faint); }
@media (max-width: 640px) {
	.blog-stats-row { gap: 20px 28px; padding: 18px 20px; }
}

/* ---------- filter chips ---------- */
.blog-filters {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin-bottom: 36px;
}
.blog-filter {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 13.5px;
	font-weight: 600;
	padding: 9px 18px;
	border-radius: 999px;
	border: 1px solid var(--border);
	color: var(--ink-soft);
	transition: border-color 0.3s var(--ease), color 0.3s var(--ease), background 0.3s var(--ease);
}
.blog-filter-icon { flex: none; }
/* Chips other than "All" carry their own --cat-color -- hover previews it,
   active fills solid with it, matching that category's cards below. */
.blog-filter:hover { border-color: var(--cat-color, var(--accent)); color: var(--cat-color, var(--accent)); }
.blog-filter.is-active { background: var(--cat-color, var(--accent)); border-color: var(--cat-color, var(--accent)); color: #FFFFFF; }

.blog-archive { padding: 40px 0 96px; }
.post-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	/* dense backfills the gaps a span-2 "wide" card otherwise leaves behind
	   when it doesn't divide evenly into a 3-column row (pulls a later,
	   regular card forward to fill the hole instead of leaving it empty). */
	grid-auto-flow: dense;
	gap: 22px;
	margin-bottom: 48px;
	/* Named so the browser crossfades the whole grid as one group across
	   the cross-document view transition (see the @view-transition opt-in
	   in home.php) instead of the page just hard-cutting to the new
	   filtered/paginated set. */
	view-transition-name: blog-grid;
}
@media (prefers-reduced-motion: reduce) {
	::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) {
		animation: none !important;
	}
}
.post-card {
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	position: relative;
	overflow: hidden;
	/* Inset top accent bar in this card's category color -- no extra
	   markup needed, just a colored inset shadow along the top edge. */
	box-shadow: inset 0 3px 0 0 var(--cat-color, var(--accent));
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.post-card > * { position: relative; z-index: 1; }
.post-card::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.post-card:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
/* .post-card is also a .spotlight-card (see post_class() in
   content-post-card.php), whose own cursor-tracking glow normally lives on
   ::before -- already taken here by the sheen above, so it gets its own
   ::after instead. Otherwise main.js's initSpotlight() keeps setting
   --spot-x/--spot-y on every card for a glow that never renders anywhere. */
.post-card::after {
	content: '';
	position: absolute; inset: 0;
	background: radial-gradient(220px circle at var(--spot-x, 50%) var(--spot-y, 50%), color-mix(in srgb, var(--cat-color, var(--accent)) 25%, transparent), transparent 72%);
	opacity: 0;
	transition: opacity 0.4s var(--ease);
	pointer-events: none;
}
.post-card:hover::after { opacity: 1; }
.post-card:hover {
	transform: translateY(-4px);
	box-shadow: inset 0 3px 0 0 var(--cat-color, var(--accent)), 0 18px 46px -20px rgba(var(--accent-rgb), 0.55);
	border-color: rgba(var(--accent-rgb), 0.35);
}
/* Flex column filling the full stretched card height -- without this,
   height:100% on .post-card-body below has nothing real to size against
   (this link, not .post-card, is its actual parent), so the CTA still
   lands right under each card's own excerpt instead of a shared baseline. */
.post-card-link { display: flex; flex-direction: column; height: 100%; }
.post-card-media { flex: none; aspect-ratio: 16 / 9; overflow: hidden; background: var(--bg-alt); position: relative; }
.post-card-media img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s var(--ease); }
.post-card:hover .post-card-media img { transform: scale(1.06); }
.post-card-media-fallback {
	position: absolute; inset: 0;
	display: flex; align-items: center; justify-content: center;
	background: linear-gradient(135deg,
		var(--cat-color) 0%,
		color-mix(in srgb, var(--cat-color) 55%, white) 45%,
		var(--navy) 100%);
	font-family: var(--font-display); font-weight: 800; font-size: 3rem; color: rgba(255, 255, 255, 0.3);
}
/* A soft glow behind the top of each card's media area on hover -- the
   reference's recurring "spotlight cone" behind feature art, reused here
   in each card's own accent color instead of a fixed one. */
.post-card-media::after {
	content: '';
	position: absolute; inset: 0;
	background: radial-gradient(140px 90px at 50% 0%, color-mix(in srgb, var(--cat-color, var(--accent)) 35%, transparent), transparent 70%);
	opacity: 0;
	transition: opacity 0.4s var(--ease);
}
.post-card:hover .post-card-media::after { opacity: 1; }
/* Bento rhythm -- every 4th card spans both columns instead of a flat,
   uniform 3-up grid the whole way down, so the page has visual variation
   beyond the one spotlight card at the very top. */
.post-card.is-wide { grid-column: span 2; }
.post-card.is-wide .post-card-media { aspect-ratio: 21 / 9; }
.post-card.is-wide .post-card-title { font-size: 1.4rem; }
@media (max-width: 1080px) {
	.post-card.is-wide .post-card-media { aspect-ratio: 16 / 9; }
}
/* flex: 1 (not height:100%) so this grows to fill whatever's left in
   .post-card-link after .post-card-media's fixed aspect-ratio box -- then
   the CTA below is pushed to the bottom via margin-top:auto, so "Read
   article" lands on one shared baseline across a row regardless of how
   many lines each card's own title/excerpt happens to wrap to. */
.post-card-body { padding: 22px; display: flex; flex-direction: column; flex: 1; }
.post-card-cta { margin-top: auto; padding-top: 4px; }
.post-card-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 12px; }
.post-card-meta .insight-type {
	display: inline-flex; align-items: center; gap: 5px;
	color: var(--cat-color, var(--accent)); font-weight: 600;
}
.insight-type-icon { flex: none; }
.post-card-date { font-family: var(--font-mono); font-size: 11.5px; color: var(--ink-faint); }
/* A small dot between date and read time -- ::before on the second
   mono-styled meta item, not a literal character in the markup, so it
   only ever shows up when there's something to separate. */
.post-card-readtime { font-family: var(--font-mono); font-size: 11.5px; color: var(--ink-faint); display: inline-flex; align-items: center; gap: 10px; }
.post-card-readtime::before { content: ''; width: 3px; height: 3px; border-radius: 50%; background: var(--ink-faint); }
.post-card-title { font-size: 1.15rem; margin-bottom: 8px; color: var(--navy); }
.post-card-excerpt { font-size: 14px; margin-bottom: 14px; }
.post-card-cta { font-size: 13.5px; font-weight: 600; color: var(--accent); }

.blog-pagination { display: flex; justify-content: center; gap: 6px; flex-wrap: wrap; }
.blog-pagination .page-numbers {
	display: inline-flex; align-items: center; justify-content: center;
	min-width: 40px; height: 40px; padding: 0 12px;
	border-radius: var(--radius-sm);
	border: 1px solid var(--border);
	font-size: 13.5px; font-weight: 600;
	color: var(--ink-soft);
	transition: border-color 0.3s var(--ease), color 0.3s var(--ease), background 0.3s var(--ease);
}
.blog-pagination .page-numbers:hover { border-color: var(--accent); color: var(--accent); }
.blog-pagination .page-numbers.current { background: var(--accent); border-color: var(--accent); color: #FFFFFF; }
.blog-pagination .page-numbers.dots { border-color: transparent; }

.blog-empty { text-align: center; padding: 48px 0; }
.blog-empty p { margin-bottom: 20px; }

@media (max-width: 1080px) {
	.post-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 860px) {
	.blog-featured-card { grid-template-columns: 1fr; }
	.blog-featured-media { min-height: 220px; }
	.blog-featured-body { padding: 28px 24px; }
}
@media (max-width: 640px) {
	.post-grid { grid-template-columns: 1fr; }
	/* .is-wide's grid-column: span 2 (see the bento rhythm above) otherwise
	   still applies here -- against a single explicit column that forces
	   the grid to invent a second, near-zero-width implicit column to fit
	   the span. Regular cards that land in that crushed column wrap their
	   text one character per line and blow up to 900+px tall, which is
	   what actually produced the huge gaps between posts on mobile. */
	.post-card.is-wide { grid-column: span 1; }
}

/* ==========================================================================
   Blog archive v2 -- rebuilt September 2026 to Consasia's approved
   Blogpage_V2 spec (see home.php's own header comment). New hero copy/CTA,
   a 1-big/3-small "Featured Blogs" strip replacing the old single spotlight
   card, a search + By Topic/By Region filter row, and a newsletter band.
   The existing .post-card/.post-grid/.blog-pagination rules above are
   reused as-is -- only what's genuinely new lives here.
   ========================================================================== */
.blog-hero-sub { font-size: 17px; max-width: 640px; margin: 14px 0 24px; color: var(--ink-soft); }

/* ---------- Featured Blogs strip: 1 big + 3 small ---------- */
.blog-featured-strip { padding: 8px 0 40px; }
.blog-featured-grid {
	display: grid;
	grid-template-columns: 1.3fr 1fr;
	gap: 28px;
	align-items: stretch;
}
.blog-featured-big {
	display: flex; flex-direction: column;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	overflow: hidden;
	position: relative;
	box-shadow: var(--shadow-md);
	transition: transform 0.35s var(--ease), box-shadow 0.35s var(--ease);
}
.blog-featured-big:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.blog-featured-big .blog-featured-media { position: relative; aspect-ratio: 16 / 11; max-height: 260px; overflow: hidden; background: var(--bg-alt); flex: none; }
.blog-featured-big .blog-featured-media img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s var(--ease); }
.blog-featured-big:hover .blog-featured-media img { transform: scale(1.045); }
.blog-featured-media-fallback {
	position: absolute; inset: 0;
	display: flex; align-items: center; justify-content: center;
	background: linear-gradient(135deg, var(--cat-color) 0%, color-mix(in srgb, var(--cat-color) 55%, white) 45%, var(--navy) 100%);
	color: rgba(255, 255, 255, 0.3);
}
.blog-featured-big .blog-featured-body {
	display: flex; flex-direction: column; flex: 1;
	padding: 28px 30px;
}
.blog-featured-big .insight-type { display: inline-block; color: var(--cat-color, var(--accent)); font-weight: 600; font-size: 13px; margin-bottom: 10px; }
.blog-featured-title { font-size: clamp(1.4rem, 2.2vw, 1.8rem); margin-bottom: 10px; color: var(--navy); }
.blog-featured-excerpt { font-size: 14.5px; margin-bottom: 16px; color: var(--ink-soft); }
.blog-featured-big .post-card-cta { margin-top: auto; font-size: 13.5px; font-weight: 600; color: var(--accent); }

/* space-between (not flex-start) so the 3 items spread out to fill the
   same stretched height the grid gives .blog-featured-big on its left --
   otherwise they cluster at the top and leave a bare gap at the bottom,
   which is what actually read as "the two columns aren't the same height". */
.blog-featured-small-list { display: flex; flex-direction: column; justify-content: space-between; height: 100%; }
.blog-featured-small {
	display: flex; flex-direction: column;
	padding: 18px 4px;
	border-bottom: 1px solid var(--border);
	transition: transform 0.3s var(--ease);
}
.blog-featured-small:first-child { padding-top: 4px; }
.blog-featured-small:last-child { border-bottom: none; }
.blog-featured-small:hover { transform: translateX(4px); }
.blog-featured-small .insight-type { color: var(--cat-color, var(--accent)); font-weight: 600; font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 6px; }
.blog-featured-small-title {
	font-size: 1rem; line-height: 1.35; margin-bottom: 10px; color: var(--navy);
	/* 2-line clamp so titles of very different lengths still end at a
	   consistent height -- that's what "all ending in 1 single line" in the
	   spec means: the CTA below lands on the same baseline for every item. */
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.blog-featured-small .post-card-cta { margin-top: auto; font-size: 13px; font-weight: 600; color: var(--accent); }

/* ---------- Search + Topic/Region filter row ---------- */
.blog-search-row {
	display: flex; flex-wrap: wrap; align-items: center;
	justify-content: flex-end;
	gap: 12px;
	margin-bottom: 20px;
}
/* Search box, the two <select> filters and the Submit button all sit on
   one row and need to actually line up -- same box-sizing, same vertical
   padding and the same 14px everywhere, instead of each control keeping
   whatever padding/font-size it happened to be given on its own. */
.blog-search-box {
	display: flex; align-items: center; gap: 8px; box-sizing: border-box;
	border: 1px solid var(--border); border-radius: 999px;
	padding: 11px 18px;
	color: var(--ink-faint);
	background: var(--surface);
	min-width: 220px;
	transition: border-color 0.3s var(--ease);
}
.blog-search-box:focus-within { border-color: var(--accent); color: var(--accent); }
.blog-search-box input { border: 0; outline: 0; font-size: 14px; width: 100%; background: transparent; color: var(--ink); }
.blog-filter-selects { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.blog-filter-selects select {
	box-sizing: border-box;
	border: 1px solid var(--border); border-radius: 999px;
	padding: 11px 18px; font-size: 14px; font-weight: 500;
	background: var(--surface); color: var(--ink-soft);
}
.blog-filter-selects .btn-sm { padding: 11px 22px; font-size: 14px; }
/* "Dropdowns are not matching the theme" -- a native <select>'s open
   popup is mostly outside CSS's reach, but Chromium/Edge do respect
   background/color set directly on <option>, so at least its
   highlight color is the site's own accent instead of the OS default. */
.blog-filter-selects select option,
.career-filter-row select option {
	background: var(--surface);
	color: var(--ink);
}
.blog-filter-selects select option:checked,
.blog-filter-selects select option:hover,
.career-filter-row select option:checked,
.career-filter-row select option:hover {
	background: var(--accent);
	color: #fff;
}
/* Ajax filtering (see initBlogAjaxFilters in main.js) swaps #blog-results'
   contents in place instead of a full page navigation -- this is just the
   brief "still working" flicker while that fetch is in flight. */
#blog-results.is-loading { opacity: 0.45; pointer-events: none; transition: opacity 0.15s var(--ease); }

/* ---------- newsletter band ---------- */
/* Horizontal margin on the band itself (not just padding on the
   .container-wide inside it) -- border-radius on a section with zero side
   margin just clips flush against the viewport edge, so on a phone this
   rounded "card" was touching the screen with no visible gutter at all
   (Sept 2026 site-modifications thread). */
.blog-newsletter-band {
	margin: 56px 40px 0;
	padding: 56px 0;
	background: linear-gradient(160deg, var(--accent-600), var(--navy) 120%);
	text-align: center;
	border-radius: var(--radius-lg);
}
@media (max-width: 640px) {
	.blog-newsletter-band { margin: 40px 16px 0; padding: 40px 20px; }
	.blog-newsletter-band .container-wide { padding: 0; }
	/* Icon + placeholder were sitting almost on top of each other at phone
	   widths -- the icon was still full desktop size (16px) inside a
	   tighter box (site-modifications thread, Sept 2026). */
	.blog-search-box { gap: 6px; padding: 10px 14px; }
	.blog-search-box svg { width: 13px; height: 13px; flex-shrink: 0; }
}
.blog-newsletter-band h2 { color: #FFFFFF; font-size: clamp(1.5rem, 2.6vw, 2rem); margin-bottom: 10px; }
.blog-newsletter-band p { color: rgba(255, 255, 255, 0.78); max-width: 480px; margin: 0 auto 24px; }
.blog-newsletter-form { display: flex; justify-content: center; gap: 10px; flex-wrap: wrap; max-width: 480px; margin: 0 auto; }
.blog-newsletter-form input[type="email"] {
	flex: 1; min-width: 220px;
	padding: 13px 18px; border-radius: 999px; border: 0;
	font-size: 14px;
}
.btn-secondary-green {
	display: inline-flex; align-items: center; justify-content: center;
	padding: 13px 24px; border-radius: 999px; border: 0;
	background: var(--brand-green); color: #FFFFFF; font-weight: 600; font-size: 14px;
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
	cursor: pointer;
}
.btn-secondary-green:hover { transform: translateY(-2px); box-shadow: 0 12px 30px -12px rgba(0,0,0,0.4); }
.blog-newsletter-note { color: #FFFFFF; font-weight: 600; }
.visually-hidden { position: absolute !important; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

@media (max-width: 860px) {
	.blog-featured-grid { grid-template-columns: 1fr; }
	.blog-search-row { justify-content: flex-start; }
}

/* ==========================================================================
   Single blog post (single.php, post_type "post" only) -- hero image/
   fallback, then a two-column body: article + a sticky side panel (category
   badge, share links, "More in [category]"). Every non-post post type keeps
   the plain centered layout single.php already had, untouched.
   ========================================================================== */
.post-detail-head { padding: 56px 0 28px; max-width: 900px; }
.post-detail-title { font-size: clamp(1.9rem, 3.6vw, 2.6rem); margin: 14px 0 16px; color: var(--navy); }

.post-detail-media { margin-bottom: 48px; }
.post-detail-media img,
.post-detail-media-fallback {
	display: block; width: 100%; max-width: 1000px; margin: 0 auto;
	/* height:auto is required here, not optional -- WordPress prints literal
	   width/height attributes on the <img> tag (e.g. 1024x640) which act as
	   a presentational height hint, leaving height already "determined"
	   instead of auto. aspect-ratio only computes a dimension that's auto,
	   so without this override it's silently ignored and the image renders
	   at its native ~640px tall on any width -- the huge blank gap on
	   mobile actually was this box, not empty space. */
	height: auto;
	aspect-ratio: 21 / 9; border-radius: var(--radius-lg); object-fit: cover;
}
.post-detail-media-fallback {
	display: flex; align-items: center; justify-content: center;
	/* Same 3-stop gradient as the blog cards' image fallback -- one visual
	   system whether you're looking at the card or the article itself. */
	background: linear-gradient(135deg,
		var(--cat-color) 0%,
		color-mix(in srgb, var(--cat-color) 55%, white) 45%,
		var(--navy) 100%);
	color: rgba(255, 255, 255, 0.3);
}

.post-detail-grid {
	display: grid;
	grid-template-columns: 1fr 300px;
	gap: 56px;
	align-items: start;
	padding-bottom: 96px;
}
.post-detail-main { max-width: 720px; }
.post-detail-back { margin-top: 40px; }

/* Sticky so the panel stays visible while a long article scrolls underneath
   it -- 100px top offset clears the fixed site header. */
.post-detail-sidebar { position: sticky; top: 100px; display: flex; flex-direction: column; gap: 18px; }
.post-detail-panel {
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	padding: 20px;
}
.post-detail-category-card { display: flex; align-items: center; gap: 12px; }
.post-detail-category-icon {
	flex: none; width: 40px; height: 40px; border-radius: var(--radius-sm);
	display: flex; align-items: center; justify-content: center;
	color: var(--cat-color);
	background: color-mix(in srgb, var(--cat-color) 12%, transparent);
}
.post-detail-category-label { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-faint); }
.post-detail-category-name { font-weight: 700; color: var(--navy); }

.post-detail-panel-heading {
	font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em;
	color: var(--ink-faint); margin-bottom: 12px;
}
.post-detail-share { display: flex; gap: 8px; }
.post-detail-share a {
	width: 34px; height: 34px; border-radius: 50%;
	display: flex; align-items: center; justify-content: center;
	background: var(--bg-alt); color: var(--ink-soft); border: 1px solid var(--border);
	transition: color 0.3s var(--ease), border-color 0.3s var(--ease), background 0.3s var(--ease);
}
.post-detail-share a:hover {
	color: var(--cat-color); border-color: var(--cat-color);
	background: color-mix(in srgb, var(--cat-color) 12%, transparent);
}

.post-detail-related-list { display: flex; flex-direction: column; gap: 14px; }
.post-detail-related-list a { display: block; }
.post-detail-related-title { display: block; font-weight: 600; font-size: 13.5px; color: var(--navy); margin-bottom: 3px; }
.post-detail-related-list a:hover .post-detail-related-title { color: var(--cat-color); }
.post-detail-related-date { font-family: var(--font-mono); font-size: 11px; color: var(--ink-faint); }

/* ---------- breadcrumb (Blog Internal Page Suggestions spec) ---------- */
.post-detail-breadcrumb {
	display: inline-flex; align-items: center; gap: 6px;
	font-family: var(--font-mono); font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em;
	color: var(--ink-faint);
	margin-bottom: 18px;
	transition: color 0.3s var(--ease);
}
.post-detail-breadcrumb:hover { color: var(--accent); }

/* ---------- Table of Contents ---------- */
.post-detail-toc-list { display: flex; flex-direction: column; gap: 10px; }
.post-detail-toc-list a {
	display: block; font-size: 13.5px; color: var(--ink-soft);
	border-left: 2px solid var(--border); padding-left: 12px;
	transition: color 0.3s var(--ease), border-color 0.3s var(--ease);
}
.post-detail-toc-list a:hover { color: var(--navy); }
/* .is-active is toggled by main.js's scroll-spy as each <h2> section
   scrolls through the viewport -- keeps the reader oriented in a long
   article without needing to scroll the sidebar itself. */
.post-detail-toc-list li.is-active > a { color: var(--cat-color, var(--accent)); border-color: var(--cat-color, var(--accent)); font-weight: 600; }

/* ---------- Keep reading carousel ---------- */
.post-detail-keep-reading { padding: 8px 0 64px; }
.post-detail-carousel {
	display: flex; gap: 18px;
	overflow-x: auto;
	padding: 18px 4px 8px;
	margin: 0 -4px;
	scroll-snap-type: x proximity;
	-webkit-overflow-scrolling: touch;
}
.post-detail-carousel-card {
	flex: none; scroll-snap-align: start;
	width: 260px;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
	padding: 14px;
	display: flex; flex-direction: column;
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.post-detail-carousel-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: rgba(var(--accent-rgb), 0.3); }
.post-detail-carousel-media {
	aspect-ratio: 16 / 10; border-radius: var(--radius-sm); overflow: hidden; margin-bottom: 12px;
	background: var(--bg-alt); position: relative;
}
.post-detail-carousel-media img { width: 100%; height: 100%; object-fit: cover; }
.post-detail-carousel-card .insight-type { display: inline-block; color: var(--cat-color, var(--accent)); font-weight: 600; font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 6px; }
.post-detail-carousel-title { font-size: 14px; font-weight: 600; color: var(--navy); line-height: 1.35; margin-bottom: 10px; }
.post-detail-carousel-cta { margin-top: auto; font-size: 12.5px; font-weight: 600; color: var(--accent); }

@media (max-width: 900px) {
	.post-detail-grid { grid-template-columns: 1fr; }
	.post-detail-sidebar { position: static; }
}

/* ==========================================================================
   Homepage v2 — long-scroll sections added per
   "Homepage Design Changes - 14Aug2026.pdf"
   ========================================================================== */

.container-narrow { max-width: 760px; margin: 0 auto; padding: 0 40px; }
/* Only used by .fraud-cta-inner -- widened to match the reference's own
   card (max-w-6xl / 1152px, rounded-[2.5rem] / 40px), computed directly
   off its site rather than eyeballed. Padding stays governed by
   .fraud-cta-inner below (it already wins over .container-narrow's own
   padding via source order, same specificity). */
.fraud-cta-inner.container-narrow { max-width: 1152px; }
.text-accent { color: var(--accent); }
.text-center { text-align: center; }

/* ---------- hero v2 network graphic ---------- */
/* The old spinning conic-gradient card border (.hero-visual::before) was
   built for the boxed dashboard-mockup hero and renders as a stray
   diagonal streak against the open network graphic — not part of this
   design, so switch it off for this hero variant. */
.hero-network::before { content: none; }
/* Padding trimmed (was 28px all around) to pull the sphere+chips block
   up and shorten the hero overall -- on shorter viewports the fraud-
   attempt chip below the sphere was getting cut off below the fold.
   Per direct feedback + screenshot. */
.hero-network { display: flex; align-items: center; justify-content: center; padding: 12px 28px; min-height: 300px; position: relative; }
/* A soft blue halo directly behind the sphere, matching the reference's
   own glow around its network graphic (separate from .hero-glow, which
   is the wider ambient wash across the whole hero). */
.hero-network::after {
	content: '';
	position: absolute; inset: 8%;
	background: radial-gradient(circle, rgba(var(--accent-rgb), 0.18), transparent 70%);
	filter: blur(24px);
	z-index: 0;
	pointer-events: none;
}
/* A Fibonacci-sphere point cloud (generated, see front-page.php) that
   rotates via real per-node 3D math in JS (initHeroSphere() in main.js),
   not a CSS transform on the flat plane — see that function's comment for
   why. This is just sizing; the #hero-sphere-data JSON stays invisible via
   its own script-tag semantics, nothing to hide here. */
.network-graphic { width: 100%; max-width: 440px; aspect-ratio: 1 / 1; display: block; flex: 0 1 440px; position: relative; z-index: 1; }
/* <video> defaults to inline, which leaves a few px of baseline gap under
   it inside a flex container; block avoids that. object-fit guards
   against any aspect-ratio mismatch if the source is ever swapped. */
/* Fraud/info accent nodes get a soft breathing glow so they read as
   "live markers," not just differently-colored dots — matching the
   reference. Animates the glow strength only (not opacity, which JS
   already drives every frame based on depth, to avoid the two fighting). */
.sphere-accent {
	filter: drop-shadow(0 0 2px rgba(255,255,255,0.9));
	animation: clari5-sphere-glow 2.6s ease-in-out infinite;
}
@keyframes clari5-sphere-glow {
	0%, 100% { filter: drop-shadow(0 0 1.5px rgba(255,255,255,0.8)); }
	50% { filter: drop-shadow(0 0 5px rgba(255,255,255,1)); }
}
.logo-strip-hero { margin-top: 32px; }

/* ---------- anatomy of a decision (timeline) ---------- */
.anatomy { padding: 88px 0 0; }
.anatomy-timeline {
	max-width: 720px;
	margin: 56px auto 0;
	position: relative;
	padding-left: 2px;
}
.anatomy-timeline::before {
	/* Static track spanning the full journey, always visible — matched to
	   the reference's own base line (navy/10%, no fade at the ends). */
	content: '';
	position: absolute;
	left: 50%;
	top: 0; bottom: 0;
	width: 1px;
	background: rgba(var(--navy-rgb), 0.1);
	transform: translateX(-50%);
}
/* Animated fill that grows from 0 to 100% height as the visitor scrolls
   through the section — driven by initAnatomyTimeline() in main.js,
   matching the design copy's own "Scroll through the journey" framing.
   Gradient + glow matched to the reference's own progress line. */
.anatomy-progress-line {
	position: absolute;
	left: 50%;
	top: 0;
	width: 1px;
	height: 0%;
	background: linear-gradient(180deg, var(--accent), var(--cyan-glow));
	box-shadow: 0 0 42px -8px rgba(var(--accent-rgb), 0.6);
	transform: translateX(-50%);
	transition: height 0.2s ease-out;
	z-index: 1;
}
/* z-index:2 (not auto) is required here, not decorative: .anatomy-step also
   carries .reveal, and .reveal.in-view sets a real `transform` value
   (translateY(0)) which creates its own stacking context. Without an
   explicit z-index, that traps .anatomy-dot's z-index:2 inside it, so the
   explicitly-z-indexed progress line (z-index:1, a sibling of .anatomy-step)
   ends up painting on top of the whole step — dot included — instead of
   behind it. */
.anatomy-step { position: relative; z-index: 2; display: grid; grid-template-columns: 1fr 1fr; padding: 28px 0; }
/* Text stays fully legible at all times on the reference — only the dot
   changes with scroll position, nothing dims/shifts here. */
.anatomy-content { grid-column: 1; text-align: right; padding-right: 44px; }
.anatomy-step.is-right .anatomy-content { grid-column: 2; grid-row: 1; text-align: left; padding-right: 0; padding-left: 44px; }
.anatomy-num { font-family: var(--font-mono); font-size: 11.5px; color: var(--cyan-glow); letter-spacing: 0.08em; }
/* Matched to the reference's own timeline step titles: 30px / weight 600
   / line-height 1.2 (was 1.4rem/22.4px, noticeably smaller). */
.anatomy-content h3 { font-size: 1.875rem; font-weight: 600; line-height: 1.2; margin: 4px 0 8px; }
.anatomy-content p { font-size: 15.5px; margin: 0; }
/* Matched to the reference's own dot: 44px (was 26px), a plain
   near-white/muted resting state, and on .is-active — a single moving
   spotlight, not a cumulative trail (see initAnatomyTimeline() in
   main.js) — a cyan-tinted border, --navy-soft fill, cyan icon, the same
   glow shadow reused from buttons/badges, and a 10% scale-up. */
.anatomy-dot {
	/* top: 32px centered the dot against .anatomy-num (the small step
	   count above the title) instead of the h3 title itself -- per
	   direct feedback + screenshot, measured and moved to match the
	   title's actual vertical center instead of guessing. */
	position: absolute; left: 50%; top: 52px; transform: translateX(-50%) scale(1);
	width: 44px; height: 44px; border-radius: 50%;
	display: flex; align-items: center; justify-content: center;
	background: var(--bg); border: 1px solid var(--border);
	color: var(--ink-soft);
	z-index: 2;
	transition: border-color 0.7s var(--ease), background 0.7s var(--ease), box-shadow 0.7s var(--ease), transform 0.7s var(--ease), color 0.7s var(--ease);
}
.anatomy-dot-icon { flex: none; }
.anatomy-step.is-active .anatomy-dot {
	border-color: rgba(var(--cyan-glow-rgb), 0.7);
	background: var(--navy-soft);
	color: var(--cyan-glow);
	box-shadow: 0 0 42px -8px rgba(var(--accent-rgb), 0.6);
	transform: translateX(-50%) scale(1.1);
}
@media (max-width: 720px) {
	.anatomy-timeline::before, .anatomy-progress-line { left: 20px; }
	.anatomy-step, .anatomy-step.is-right { grid-template-columns: 1fr; }
	.anatomy-content, .anatomy-step.is-right .anatomy-content { grid-column: 1; text-align: left; padding-left: 48px; padding-right: 0; transform: none; }
	.anatomy-content h3 { font-size: 1.4rem; }
	.anatomy-content p { font-size: 14px; }
	/* left: 20px (matching the line/dot) placeholder -- top gets a real
	   measured value below once synced, since shrinking the title text
	   above changes where its vertical center actually lands. */
	.anatomy-dot { left: 20px; top: 49px; }
}

/* ---------- success panel ---------- */
.success-panel { margin-top: 64px; padding: 56px 0; background: var(--surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
/* Not wrapped in .section-head like every other section's heading, so it
   was falling back to the browser's bare h2 default size instead of the
   shared heading scale — matched here explicitly. */
.success-panel h2 { font-size: clamp(1.8rem, 3vw, 2.4rem); }
/* Same bug as .risk-makers-head: this h2 has no wrapping .section-head,
   so it had no font-size rule at all and fell back to the plain
   browser default. Matched to the same clamp every other section
   heading uses. */
.success-panel h2 { font-size: clamp(1.8rem, 4.2vw, 3.75rem); font-weight: 600; line-height: 1.05; letter-spacing: -0.025em; }
.success-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; max-width: 640px; margin: 32px auto 0; }
.success-stat { text-align: center; }
.success-value, .success-suffix { font-family: var(--font-numeric); font-size: clamp(2.4rem, 5vw, 3.4rem); font-weight: 600; color: var(--navy); }
.success-label { margin-top: 6px; font-size: 13.5px; color: var(--ink-faint); }
@media (max-width: 640px) { .success-grid { grid-template-columns: 1fr; gap: 32px; } }

/* ---------- nervous system hub diagram ---------- */
.nervous-system { padding: 88px 0; }
/* Center column is fixed at exactly the circle's diameter with zero gap,
   so the grid's column boundary IS the circle's edge — that's what
   guarantees both the circle sitting dead-center and every connector
   (a flex-grow line filling the rest of its row) actually touching it,
   instead of a hardcoded connector length guessing at a gap that varies
   with each row's label width. */
.hub-diagram {
	display: grid;
	/* Must stay equal to .hub-center-inner's width+height (176px) — the
	   zero-gap fixed-width center column is what guarantees the circle is
	   centered AND every connector actually touches its edge. */
	grid-template-columns: 1fr 176px 1fr;
	column-gap: 0;
	align-items: center;
	max-width: 860px;
	margin: 56px auto 0;
}
.hub-col { display: flex; flex-direction: column; gap: 16px; }
.hub-row { display: flex; align-items: center; }
/* Hover/idle treatment matched to the reference's own hub pills: a frosted
   "glass" resting state, a continuously-sweeping diagonal light streak
   (their .sheen), and on hover a blue glow + lift. Values (colors, blur,
   gradient stops, shadow offsets, lift distance) are pulled directly from
   the reference's computed styles, not eyeballed. */
.hub-node {
	display: flex; align-items: center; gap: 9px;
	flex: 0 0 auto;
	position: relative;
	overflow: hidden;
	background: rgba(var(--navy-rgb), 0.06);
	border: 1px solid rgba(var(--navy-rgb), 0.12);
	border-radius: var(--radius-md);
	padding: 10px 18px;
	font-size: 13.5px; font-weight: 500;
	white-space: nowrap;
	backdrop-filter: blur(18px);
	-webkit-backdrop-filter: blur(18px);
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
/* Sheen streak only exists — and only animates — while hovered, per
   request; idle state shows no continuous motion at all. */
.hub-node::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
@keyframes clari5-sheen {
	0% { transform: translateX(-140%); }
	100% { transform: translateX(140%); }
}
.hub-node:hover::before {
	animation: clari5-sheen 0.9s ease-out 1;
}
.hub-node:hover {
	transform: translateY(-4px);
	border-color: rgba(var(--accent-rgb), 0.35);
	box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55);
}
.hub-col-right .hub-node { flex-direction: row-reverse; }
/* Icon color matched to the reference: their cyan-glow accent, not the
   main brand blue. */
.hub-node-icon { flex: none; color: var(--cyan-glow); position: relative; z-index: 1; }
.hub-node span { position: relative; z-index: 1; }

/* Connector: flex-grow, so it always spans exactly the remaining space in
   its row — from the pill's edge to the row's edge (= the circle's edge)
   — regardless of label length. Matched to the reference's own connector
   exactly (inspected directly, not guessed): a flat navy/10% base line
   with a soft cyan glow band swept along it via a background-position
   animation on ::after, not a discrete traveling dot. The sweep travels
   TOWARD the center circle on both sides, i.e. data streaming into the
   "single brain," not away from it. */
.hub-connector {
	position: relative;
	flex: 1 1 auto; min-width: 16px;
	height: 1px;
	background: rgba(var(--navy-rgb), 0.1);
}
.hub-connector::after {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(90deg, transparent, var(--cyan-glow), transparent);
	background-repeat: no-repeat;
	background-size: 40% 100%;
	animation: clari5-connector-flow 2.4s linear infinite;
}
/* Right-side connectors sweep the opposite direction (right-to-left) so
   both sides converge on the center circle, same as the left side's
   left-to-right sweep. */
.hub-connector-right::after { animation-direction: reverse; }
@keyframes clari5-connector-flow {
	0% { background-position: -60% 0; }
	100% { background-position: 160% 0; }
}
/* Stagger each row so the flow reads as continuous streaming, not five
   sweeps ticking in lockstep. */
.hub-row:nth-child(2) .hub-connector::after { animation-delay: 0.4s; }
.hub-row:nth-child(3) .hub-connector::after { animation-delay: 0.8s; }
.hub-row:nth-child(4) .hub-connector::after { animation-delay: 1.2s; }
.hub-row:nth-child(5) .hub-connector::after { animation-delay: 1.6s; }
.hub-center { display: flex; align-items: center; justify-content: center; }
/* Matched to the reference's own center badge: 176px, a subtle two-tone
   radial gradient (not a plain fade to white), a dual-layer glow (a wide
   soft accent-blue halo plus a tighter cyan-tinted one underneath it —
   not a single pulsing ring), "CLARI5" in solid accent blue, and the
   sub-label in muted ink rather than accent. The breathing scale
   (clari5-breathe, added earlier) still supplies the "living" motion;
   the glow itself is static, same as the reference. */
.hub-center-inner {
	position: relative;
	width: 176px; height: 176px;
	border-radius: 50%;
	display: flex; flex-direction: column; align-items: center; justify-content: center;
	text-align: center;
	font-family: var(--font-display); font-weight: 700; font-size: 20px; letter-spacing: 0.25em;
	color: var(--accent);
	background: radial-gradient(circle at 35% 30%, var(--navy-soft), var(--navy-deep));
	border: 1px solid rgba(var(--cyan-glow-rgb), 0.3);
	box-shadow: 0 0 80px -12px rgba(var(--accent-rgb), 0.55), 0 0 28px -6px rgba(var(--cyan-glow-rgb), 0.35);
}
.hub-center-inner small { display: block; font-size: 10px; font-weight: 400; letter-spacing: 0.2em; color: var(--ink-soft); margin-top: 6px; }
/* The actual Clari5 logo mark in place of typed "CLARI5" text, sized down
   from the header's 46px to fit the 176px badge. Forces the dark-mode
   (light-colored) logo variant on, same as .site-footer/.brand-card-inner,
   since the badge's own background is always the dark navy gradient
   above regardless of site theme. */
/* "SINGLE BRAIN" removed from the markup -- logo is the only content
   now, so it's free to sit bigger and dead-center in the badge. */
.hub-center-logo { display: flex; align-items: center; justify-content: center; }
.hub-center-logo .custom-logo-link img { max-height: 36px; width: auto; }
.hub-center-logo .brand-word { font-size: 24px; }
/* Two staggered expanding/fading rings, reusing the same clari5-ping-ring
   animation already established elsewhere on the site — matched to the
   reference's own pair around its center badge, offset by half the cycle
   so a new ring starts as the other fades, reading as a continuous wave
   rather than two rings pulsing in sync. */
.hub-ping-ring {
	position: absolute; inset: 0;
	border-radius: 50%;
	pointer-events: none;
	animation: clari5-ping-ring 2.6s cubic-bezier(0, 0, 0.2, 1) infinite;
}
.hub-ping-ring-1 { border: 1px solid rgba(var(--cyan-glow-rgb), 0.5); }
.hub-ping-ring-2 { border: 1px solid rgba(var(--cyan-glow-rgb), 0.3); animation-delay: 1.3s; }
@media (max-width: 780px) {
	/* Single-column stack -- hub-col-left, the center circle, and
	   hub-col-right become three stacked grid rows with zero row-gap
	   (only column-gap was ever set, since desktop never stacks them),
	   so the last node before the circle and the first node after it
	   were touching/overlapping it. */
	.hub-diagram { grid-template-columns: 1fr; row-gap: 28px; justify-items: center; }
	.hub-col { align-items: center; }
	.hub-row, .hub-col-left .hub-row, .hub-col-right .hub-row { padding: 0; }
	.hub-col-right .hub-node { flex-direction: row; }
	.hub-connector { display: none; }
}

/* ---------- platform showcase ---------- */
.showcase { padding: 88px 0; background: var(--surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.showcase-layout { display: grid; grid-template-columns: 260px 1fr; gap: 56px; margin-top: 48px; }
.showcase-tabs { display: flex; flex-direction: column; gap: 8px; }
.showcase-tab {
	text-align: left;
	padding: 16px 18px;
	border-radius: var(--radius-md);
	border: 1px solid transparent;
	display: flex; flex-direction: column; gap: 4px;
	transition: background 0.25s var(--ease), border-color 0.25s var(--ease);
}
.showcase-tab:hover { background: var(--surface); }
.showcase-tab.is-active { background: var(--surface); border-color: var(--accent); box-shadow: var(--shadow-sm); }
/* Subtitle line only shows on the active tab, matching the reference —
   title renders first in the markup (the big label), tag/subtitle second
   (small, cyan, hidden unless active). */
.showcase-tab-tag { display: none; font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--cyan-glow); }
.showcase-tab.is-active .showcase-tab-tag { display: block; }
.showcase-tab-title { font-size: 15px; font-weight: 600; color: var(--navy); }
/* Stacked, not side-by-side: a full-width visual banner (with two overlay
   badges baked into it, matching the reference) sits above the description
   + checklist, not beside them. */
.showcase-panel { display: none; }
.showcase-panel.is-active { display: block; animation: panelIn 0.4s var(--ease); }
.showcase-visual {
	border-radius: var(--radius-lg); overflow: hidden; background: #0B0D12;
	min-height: 580px; position: relative;
}
/* Real per-solution photography (pulled from the reference), when set via
   the solution's Featured Image in wp-admin — falls back to the generic
   .showcase-ribbon gradient below when it isn't. A bottom scrim keeps the
   two badges legible over any image. */
.showcase-visual.has-image {
	background-image:
		linear-gradient(0deg, rgba(6,8,12,0.85) 0%, rgba(6,8,12,0.15) 45%, transparent 70%),
		var(--visual-bg);
	background-size: cover;
	background-position: center;
}
.showcase-ribbon {
	position: absolute; inset: 0;
	background:
		radial-gradient(60% 50% at 30% 40%, rgba(var(--accent-rgb), 0.5), transparent 60%),
		radial-gradient(50% 45% at 70% 65%, rgba(76, 178, 122, 0.35), transparent 60%),
		radial-gradient(45% 40% at 60% 20%, rgba(27, 62, 140, 0.4), transparent 60%);
	filter: blur(6px);
	animation: ribbonDrift 8s ease-in-out infinite alternate;
}
@keyframes ribbonDrift {
	0% { transform: scale(1) rotate(0deg); }
	100% { transform: scale(1.08) rotate(4deg); }
}
/* Light "glass" badge, matching the reference exactly (inspected
   directly): a frosted near-white panel with dark text, not the dark
   panel with white text this used to be -- background/border/blur
   values pulled from its computed style, not eyeballed. */
.showcase-badge {
	position: absolute; bottom: 16px;
	display: flex; align-items: center; gap: 8px;
	/* The reference's own value is a much subtler 6% tint -- but that
	   only reads as "light glass" because its photography is bright
	   behind the badge. Ours varies per solution (this one has a dark
	   corner right where the left badge sits), so a near-opaque white
	   backing keeps the dark text legible regardless of what's behind
	   it, while the blur still gives it the same frosted edge. */
	background: rgba(247, 248, 250, 0.88);
	backdrop-filter: blur(18px);
	-webkit-backdrop-filter: blur(18px);
	border: 1px solid rgba(var(--navy-rgb), 0.12);
	border-radius: var(--radius-md);
	padding: 10px 16px;
	color: var(--navy);
	z-index: 1;
}
.showcase-badge-left { left: 16px; }
.showcase-badge-right { right: 16px; flex-direction: column; align-items: flex-end; gap: 0; text-align: right; }
.showcase-badge-icon {
	display: flex; align-items: center; justify-content: center;
	width: 26px; height: 26px; border-radius: 50%;
	background: rgba(var(--accent-rgb), 0.12); color: var(--accent);
	flex: none;
}
.showcase-badge strong { display: block; font-size: 13px; font-weight: 600; line-height: 1.3; color: var(--navy); }
.showcase-badge em { font-style: normal; font-family: var(--font-body); font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); }
.showcase-badge-right strong { font-family: var(--font-numeric); font-size: 1.4rem; color: var(--cyan-glow); }
.showcase-body { margin-top: 24px; }
.check-list-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 16px; margin: 16px 0 24px; }
@media (max-width: 900px) {
	.showcase-layout { grid-template-columns: 1fr; }
	.showcase-tabs { flex-direction: row; overflow-x: auto; }
	.check-list-2col { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
	/* Both badges are independently absolutely-positioned with no width
	   cap, so on a narrow screen their content (esp. a longer solution
	   name on the left) runs into the number badge on the right and
	   they overlap. Stacked instead of side-by-side here. */
	.showcase-badge-left { right: 16px; }
	/* flex-direction switched from column to row here, but gap: 0
	   (inherited from the base rule, meant for stacked lines with no
	   space between them) came along for the ride -- so the big number
	   sat flush against the label with no breathing room. Also sized
	   down: 1.4rem was tuned for the badge's own column width, not a
	   full-width mobile row. */
	.showcase-badge-right { top: 16px; bottom: auto; left: 16px; right: 16px; flex-direction: row; align-items: center; text-align: left; gap: 10px; }
	.showcase-badge-right strong { font-size: 1.1rem; }
}

/* ---------- "watch a fraud attempt die" CTA band ---------- */
.fraud-cta { padding: 120px 0; }
.fraud-cta-inner {
	text-align: center;
	/* 0.1 read as barely-there next to the reference's visibly glowing
	   card -- bumped to 0.4 per direct feedback + screenshot. */
	background: radial-gradient(60% 100% at 50% 0%, rgba(var(--accent-rgb), 0.4), transparent 70%);
	border: 1px solid var(--border);
	border-radius: 40px;
	padding: 96px 64px;
}
/* Matched to the reference's own computed size (inspected directly):
   60px/700/63px line-height, capped at 768px so it wraps the same way. */
.fraud-cta-inner h2 {
	font-size: clamp(2rem, 5vw, 60px);
	font-weight: 700;
	line-height: 1.05;
	max-width: 768px;
	margin: 0 auto;
}
.fraud-cta-actions { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; margin-top: 32px; }

/* ---------- EFRM section ---------- */
.efrm { padding: 32px 0 88px; }
.efrm-grid { display: grid; grid-template-columns: 1fr 1.1fr; gap: 48px; align-items: center; }
.efrm-copy h2 { font-size: clamp(1.8rem, 3vw, 2.3rem); margin-bottom: 0.5em; }
.efrm-why-label { font-weight: 600; color: var(--navy); margin: 20px 0 10px; }
.efrm-console {
	background: #0B0D12;
	border-radius: var(--radius-lg);
	padding: 20px;
	color: #E7EAF0;
	box-shadow: var(--shadow-lg);
	font-family: var(--font-mono);
}
.efrm-console-head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.efrm-console-dots { display: flex; gap: 6px; }
.efrm-console-dots span { width: 8px; height: 8px; border-radius: 50%; background: #3A404C; }
.efrm-console-title { font-size: 12px; color: var(--brand-green); flex: 1; }
.efrm-console-live { font-size: 10.5px; color: var(--brand-green); letter-spacing: 0.05em; }
.efrm-console-sub { display: flex; justify-content: space-between; font-size: 11px; color: var(--brand-green); margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid #22262F; }
.efrm-feed { display: flex; flex-direction: column; gap: 8px; }
.efrm-feed-row {
	display: flex; align-items: center; justify-content: space-between; gap: 12px;
	background: #12151C; border: 1px solid #20242D; border-radius: 8px;
	padding: 10px 14px; font-size: 12px;
}
.efrm-badge { font-size: 10.5px; font-weight: 700; padding: 3px 8px; border-radius: 5px; white-space: nowrap; }
.efrm-badge-ok { background: rgba(87, 196, 134, 0.15); color: #57C486; }
.efrm-badge-block { background: rgba(230, 90, 90, 0.15); color: #E65A5A; }
.efrm-console-foot { display: flex; justify-content: space-between; font-size: 10.5px; color: var(--brand-green); margin-top: 14px; padding-top: 12px; border-top: 1px solid #22262F; }
.efrm-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 48px; }
.efrm-stat {
	text-align: center; background: var(--surface); border: 1px solid var(--border);
	border-radius: var(--radius-md); padding: 24px 16px;
}
.efrm-stat strong { display: block; font-family: var(--font-display); font-size: 1.5rem; color: var(--accent); margin-bottom: 4px; }
.efrm-stat span { font-size: 13px; color: var(--ink-faint); }
.efrm-related { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; margin-top: 32px; }
.efrm-related a {
	font-size: 13px; font-weight: 500; padding: 9px 16px;
	border: 1px solid var(--border); border-radius: 999px;
	transition: border-color 0.25s var(--ease), color 0.25s var(--ease);
}
.efrm-related a:hover { border-color: var(--accent); color: var(--accent); }
@media (max-width: 900px) {
	.efrm-grid { grid-template-columns: 1fr; }
	.efrm-stats { grid-template-columns: 1fr; }
}

/* ---------- capabilities experience (interactive console) ---------- */
/* Bottom padding trimmed specifically -- this section is followed
   directly by the CTA band (120px top padding of its own), and the
   combined whitespace between the console mockup and "Watch a fraud
   attempt..." read as a huge, unintentional gap. */
.capex { padding: 88px 0 40px; }
.capex-tabs { display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px; margin: 40px 0 32px; }
.capex-tab {
	text-align: left; padding: 14px 16px;
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
	display: flex; flex-direction: column; gap: 4px;
	transition: background 0.25s var(--ease), border-color 0.25s var(--ease);
}
.capex-tab-num { font-family: var(--font-mono); font-size: 11px; font-weight: 700; color: var(--accent); }
.capex-tab-label { font-size: 13.5px; font-weight: 700; color: var(--navy); }
.capex-tab:hover { border-color: rgba(var(--accent-rgb), 0.35); }
.capex-tab.is-active { background: var(--accent); border-color: var(--accent); }
.capex-tab.is-active .capex-tab-num,
.capex-tab.is-active .capex-tab-label { color: #FFFFFF; }
.capex-panel { display: none; }
/* stretch, not start -- both sides now match height, with .capex-left
   (a flex column below) distributing its own content to fill it rather
   than sitting shorter than the console mockup beside it. */
.capex-panel.is-active { display: grid; grid-template-columns: 1fr 1fr; gap: 40px; align-items: stretch; animation: panelIn 0.4s var(--ease); }
.capex-module-badge {
	display: inline-block; font-family: var(--font-mono); font-size: 10.5px; font-weight: 600;
	color: var(--accent); background: var(--accent-100); padding: 5px 12px; border-radius: 999px; margin-bottom: 14px;
}
.capex-left { display: flex; flex-direction: column; }
.capex-left h3 { font-size: 1.5rem; margin-bottom: 12px; }
.capex-left > p { color: var(--ink-soft); margin-bottom: 20px; font-size: 14.5px; }
.capex-caps-label { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-faint); margin-bottom: 10px; }
/* Pushed to the bottom of the flex column -- lines its bottom edge up
   with the console mockup's, now that the panel stretches both sides
   to equal height. */
.capex-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-top: auto; }
.capex-stat {
	background: var(--bg-alt); border: 1px solid var(--border); border-radius: var(--radius-md);
	padding: 14px; text-align: left;
}
.capex-stat span { display: block; font-size: 11px; color: var(--ink-faint); margin-bottom: 4px; }
.capex-stat strong { font-family: var(--font-numeric); font-size: 1.15rem; color: var(--accent); }
/* Console chrome — same dark mockup styling as the EFRM section
   (.efrm-console), duplicated under its own namespace since this
   section's console body varies per tab (transaction feed, network
   graph, AI chat, biometric readout, merged alert, audio waveform),
   not a single fixed layout. */
/* .capex-right stretches to match .capex-left's height (grid's
   align-items: stretch, above) but a plain block .capex-console was
   only ever as tall as its own content -- shorter consoles (network
   graph, two-box layouts) left dead space below them instead of
   filling the row. Console is now a flex column at height: 100% of
   that stretched row, with its body flexing to take up the slack. */
.capex-right { display: flex; flex-direction: column; }
.capex-console {
	display: flex; flex-direction: column; height: 100%;
	background: #12151C; border: 1px solid #22262F; border-radius: var(--radius-lg);
	padding: 20px 22px; color: #fff; box-shadow: var(--shadow-lg);
}
.capex-console-head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.capex-console-dots { display: flex; gap: 6px; }
.capex-console-dots span { width: 8px; height: 8px; border-radius: 50%; background: #3A404C; }
.capex-console-title { font-size: 12px; color: var(--brand-green); flex: 1; }
.capex-console-live { font-size: 10.5px; color: var(--brand-green); letter-spacing: 0.05em; }
.capex-console-body { flex: 1; min-height: 150px; }
.capex-console-sub { display: flex; justify-content: space-between; font-size: 11px; color: var(--brand-green); margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid #22262F; }
.capex-console-foot { display: flex; justify-content: space-between; font-size: 10.5px; color: var(--brand-green); margin-top: 14px; padding-top: 12px; border-top: 1px solid #22262F; }
.capex-risk { color: #E65A5A; }
.capex-ok-text { color: #57C486; }
.capex-warn-text { color: #E5A63A; }
/* EFM feed rows */
.capex-feed { display: flex; flex-direction: column; gap: 8px; }
.capex-feed-row {
	display: flex; justify-content: space-between; align-items: center;
	background: #171B23; border: 1px solid #22262F; border-radius: var(--radius-sm);
	padding: 10px 14px; font-size: 12px;
}
.capex-feed-row-alert { background: rgba(230, 90, 90, 0.1); border-color: rgba(230, 90, 90, 0.3); }
/* FLAGGED rows (AML for Insurance console) -- same amber already used
   for .capex-warn-text elsewhere in this component, not a new color. */
.capex-feed-row-warn { background: rgba(229, 166, 58, 0.1); border-color: rgba(229, 166, 58, 0.3); }
.capex-badge { font-size: 10.5px; font-weight: 700; padding: 3px 8px; border-radius: 5px; white-space: nowrap; }
.capex-badge-ok { background: rgba(87, 196, 134, 0.15); color: #57C486; }
.capex-badge-block { background: rgba(230, 90, 90, 0.15); color: #E65A5A; }
.capex-badge-warn { background: rgba(229, 166, 58, 0.15); color: #E5A63A; }
/* AML network-graph flow bar */
.capex-graph-labels { display: flex; justify-content: space-between; font-size: 10.5px; color: var(--brand-green); margin-bottom: 8px; }
.capex-graph-bar {
	display: block; width: 100%; height: 6px; border-radius: 999px; margin-bottom: 16px;
	background: linear-gradient(90deg, var(--accent), var(--cyan-glow), #E65A5A);
}
.capex-console-note { font-size: 12px; line-height: 1.6; color: var(--brand-green); }
/* Genie AI chat */
.capex-genie-label { font-size: 12px; color: #9BA2B0; margin-bottom: 12px; }
.capex-genie-input {
	display: flex; align-items: center; gap: 10px;
	background: #171B23; border: 1px solid #22262F; border-radius: var(--radius-sm);
	padding: 10px 10px 10px 14px; margin-bottom: 12px;
}
.capex-genie-input span { flex: 1; font-size: 12px; color: #C4C8D0; }
.capex-genie-run {
	background: var(--accent); color: #FFFFFF; font-size: 11.5px; font-weight: 600;
	padding: 7px 14px; border-radius: var(--radius-sm); flex: none;
	transition: background 0.25s var(--ease);
}
.capex-genie-run:hover { background: var(--accent-600); }
.capex-genie-result {
	background: #0B0D12; border: 1px solid #22262F; border-radius: var(--radius-sm);
	padding: 20px; min-height: 60px; font-size: 12px; color: #E7EAF0;
	display: flex; align-items: center; justify-content: center; text-align: center;
	transition: color 0.3s var(--ease);
}
.capex-genie-result.has-result { color: #C4C8D0; text-align: left; justify-content: flex-start; }
/* TrustArmour / FRAML two-box layouts */
.capex-twobox { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 12px; }
.capex-box {
	background: #171B23; border: 1px solid #22262F; border-radius: var(--radius-sm);
	padding: 12px 14px;
}
.capex-box span { display: block; font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: #6C7280; margin-bottom: 4px; }
.capex-box strong { font-size: 12.5px; color: #C4C8D0; }
.capex-unified-bar {
	background: rgba(var(--accent-rgb), 0.12); border: 1px solid rgba(var(--accent-rgb), 0.3);
	border-radius: var(--radius-sm); padding: 10px 14px; font-size: 12px; color: var(--cyan-glow);
}
/* Maestro waveform */
.capex-waveform { display: flex; align-items: center; gap: 3px; height: 60px; margin-bottom: 12px; }
.capex-waveform span { flex: 1; background: var(--accent); border-radius: 2px; opacity: 0.8; }
.capex-waveform span:nth-child(3n) { height: 40%; }
.capex-waveform span:nth-child(3n+1) { height: 90%; }
.capex-waveform span:nth-child(3n+2) { height: 60%; }
.capex-waveform span:nth-child(5n) { height: 25%; }
.capex-alert-bar {
	background: rgba(229, 166, 58, 0.12); border: 1px solid rgba(229, 166, 58, 0.3);
	border-radius: var(--radius-sm); padding: 10px 14px; font-size: 12px; color: #E5A63A; line-height: 1.5;
}
@media (max-width: 900px) {
	.capex-tabs { grid-template-columns: repeat(2, 1fr); }
	.capex-panel.is-active { grid-template-columns: 1fr; }
	.capex-twobox { grid-template-columns: 1fr; }
}

/* ---------- risk decision makers ---------- */
.risk-makers { padding: 0 0 88px; }
/* Outer bordered/filled card restored per the PDF design. */
.risk-makers-panel {
	/* Had the same radial wash as .fraud-cta-inner (added for consistency
	   between the two big bordered cards), but removed per direct
	   feedback -- this one stays plain, .fraud-cta-inner keeps its glow. */
	background: var(--surface);
	border: 1px solid var(--border); border-radius: var(--radius-lg);
	padding: 48px; box-shadow: var(--shadow-sm);
}
/* This heading had no font-size rule at all -- it was falling back to
   the plain browser default h2 size (not even our base h1-h4 rule sets
   one), nowhere near the polished clamp every other section heading
   uses. Matched to that same clamp for consistency. */
.risk-makers-head { max-width: 640px; margin-bottom: 28px; }
.risk-makers-head h2 { font-size: clamp(1.8rem, 4.2vw, 3.75rem); font-weight: 600; line-height: 1.05; letter-spacing: -0.025em; }
/* One shared gray track behind all the tabs (segmented control), not
   each tab carrying its own separate pill/outline -- matched to the
   reference's own grouped look, per direct feedback + screenshot. */
.risk-tabs {
	display: flex; gap: 4px; flex-wrap: wrap; margin-bottom: 28px;
	background: var(--surface-2); border-radius: 999px; padding: 6px;
	width: fit-content;
}
.risk-tab {
	padding: 10px 20px; border-radius: 999px; border: 0;
	background: transparent;
	font-size: 14.5px; font-weight: 600; color: var(--ink-soft);
	transition: background 0.25s var(--ease), color 0.25s var(--ease);
}
.risk-tab:hover { color: var(--accent); }
.risk-tab.is-active { background: var(--accent); color: #FFFFFF; }
@media (max-width: 560px) {
	/* border-radius: 999px on a track that's only ever wide on desktop --
	   once the three tabs wrap to stacked rows on a narrow screen, that
	   same radius turns the track into a tall stretched stadium shape
	   instead of a rounded rectangle. Column layout + a normal radius
	   here instead. */
	.risk-tabs { flex-direction: column; width: 100%; border-radius: var(--radius-lg); }
	.risk-tab { width: 100%; text-align: left; }
}
.risk-panel { display: none; }
.risk-panel.is-active { display: block; animation: panelIn 0.4s var(--ease); }
/* The filled panel around the pain/solution content -- matched to the
   design's light, borderless-outer/filled-inner treatment. */
.risk-panel-grid {
	display: grid; grid-template-columns: 1.1fr 1fr; gap: 40px;
	background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg);
	padding: 40px;
}
/* Matches every other section eyebrow/kicker on the site -- cyan, not
   the plain gray it had been. */
.risk-pain-label { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--cyan-glow); margin-bottom: 8px; }
.risk-pain-text { display: flex; align-items: flex-start; gap: 8px; font-size: 15px; color: var(--ink); margin-bottom: 20px; }
.risk-pain-icon { flex: none; margin-top: 3px; color: #C08A2E; }
.risk-pain h3 { font-size: 1.4rem; margin-bottom: 0.8em; }
/* Solution heading + CTA now live in .risk-pain (left column) alongside
   the pain copy, matching the design -- .risk-solution (right column)
   holds only the checklist. */
.risk-solution { display: flex; align-items: center; }
/* Each point gets its own filled pill row instead of plain list text,
   matching the design -- scoped to this section only since .check-list
   is shared elsewhere. */
.risk-solution .check-list { display: flex; flex-direction: column; gap: 8px; width: 100%; }
.risk-solution .check-list li {
	background: var(--surface); border: 1px solid var(--border); border-radius: 10px;
	padding: 12px 16px 12px 42px;
	position: relative;
}
/* top: 50% + translateY, not a fixed top offset -- the fixed offset
   only centered against a specific single-line text height, so it
   drifted off-center the moment a point's text ran to two lines. */
.risk-solution .check-list li::before {
	left: 14px; top: 50%; transform: translateY(-50%);
	background: rgba(var(--accent-rgb), 0.12); box-shadow: inset 0 0 0 1.5px var(--accent);
}
.risk-solution .check-list li::after { left: 19px; top: 50%; border-color: var(--accent); transform: translateY(-52%) rotate(-45deg); }
.risk-placeholder { font-style: italic; color: var(--ink-faint); }
@media (max-width: 780px) {
	.risk-panel-grid { grid-template-columns: 1fr; gap: 20px; padding: 24px; }
}

/* ---------- proof at scale ---------- */
.proof-scale { padding: 88px 0; }
/* Pinned-scroll effect -- desktop only (min-width: 900px), same as
   initProofScrollJack()'s gate in main.js (both need to agree on which
   mode is active). Tried matching the reference's mobile behavior too
   (it scroll-jacks at every width, no native scroll fallback at all) but
   that didn't hold up in practice: a real mobile viewport rarely has
   enough height to fit a full card in a pinned box at all, and even
   after fixing the fit/z-index issues that caused, direct feedback was
   that it just didn't read well on a phone -- a hand-draggable strip
   (matching the testimonial carousel's swipe) is what's wanted on
   mobile instead, same as before scroll-jack ever existed. .proof-grid
   already gets that natively via overflow-x: auto below, no JS needed
   -- unlike the testimonial carousel (which has no native overflow
   container and needed touch-action: pan-y + custom pointer handling to
   receive touch drags at all), a genuine overflow-x: auto element
   already receives native touch-scroll/drag from the browser itself.

   .proof-scale-track is given extra height by JS on desktop,
   proportional to how far the strip needs to travel; .proof-scale-sticky
   pins to the viewport while that height scrolls past underneath it,
   and the strip's own translateX is driven by scroll position instead
   of native horizontal scrolling. Below 900px (or reduced-motion, any
   width), .proof-scale-track/-sticky stay inert, plain block elements at
   their natural height, and JS never touches them -- .proof-grid is a
   normal fully-visible, natively-scrollable row instead of a pinned box. */
.proof-scale-track { position: relative; }
@media (min-width: 900px) and (prefers-reduced-motion: no-preference) {
	.proof-scale-sticky {
		position: sticky; top: 0;
		height: 100vh;
		display: flex; flex-direction: column; justify-content: center;
		overflow: hidden;
	}
	/* .proof-grid's own overflow-x: auto override lives after the base
	   .proof-grid rule further down (not here) -- this exact spot lost
	   that cascade once already this session (same class of bug as the
	   footer-subscribe-row/hero-chip fixes: a later, same-specificity
	   rule always wins a source-order tie, regardless of media query),
	   which is why the native horizontal scrollbar was showing up on
	   desktop instead of the transform-driven strip staying hidden. */
}
/* width: 100% is a holdover from when this sat inside .proof-scale-sticky's
   flex column (a real flexbox quirk there: a flex item with horizontal
   auto margins doesn't stretch to fill the cross axis on its own).
   Harmless now that it's back in normal block flow ahead of the pinned
   section instead, just no longer load-bearing -- left as-is rather than
   pulled out for a change that isn't fixing anything. margin-bottom is
   new: it used to get its spacing from .proof-grid's own margin-top
   while both shared one flex column; now that the pinned card sits in
   its own separate box, the gap has to come from here instead. */
.proof-scale-head-row { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; width: 100%; margin-bottom: 32px; }
.section-head-left { margin: 0; text-align: left; }
/* A real button now (was a plain span) -- clicking it scrolls .proof-grid,
   see initProofScroll() in main.js. */
.keep-scrolling {
	display: flex; align-items: center; gap: 6px;
	font-family: var(--font-mono); font-size: 11.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.06em;
	color: var(--ink-faint);
	white-space: nowrap; margin-bottom: 6px;
	background: none; border: 0; cursor: pointer;
	transition: color 0.2s var(--ease);
}
.keep-scrolling:hover { color: var(--accent); }
/* Arrow nudges right and back so the hint reads as "this scrolls",
   not just a static label. */
.keep-scrolling svg { animation: clari5-nudge-right 1.6s ease-in-out infinite; }
@keyframes clari5-nudge-right {
	0%, 100% { transform: translateX(0); }
	50% { transform: translateX(4px); }
}
/* width: fit-content (capped at container-max as a ceiling for whenever
   there are enough cards to need it) -- percentage-based card widths
   don't combine safely with fit-content (circular sizing), so cards
   below use a fixed px basis instead: 588px card * 2 + 24px gap + 80px
   (this row's own left/right padding) = exactly 1280px = --container-max.
   With exactly 2 cards the strip is exactly that wide -- no peek of a
   3rd, per direct feedback -- but once enough cards exist to exceed
   1280px, it's capped there and the excess overflows into the existing
   scroll (drag / "Keep scrolling" button), the same as before. */
.proof-grid {
	display: flex; gap: 24px;
	width: fit-content; max-width: var(--container-max); margin: 48px auto 0;
	/* Top/bottom padding added -- overflow-x: auto forces overflow-y to
	   also become non-visible (a CSS quirk: one axis can't stay 'visible'
	   once the other isn't), so with zero top padding the hover lift
	   (translateY(-4px)) and its glow shadow were getting clipped flush
	   against the strip's own top edge. */
	padding: 16px 40px 24px;
	overflow-x: auto;
	scroll-snap-type: x proximity;
	-webkit-overflow-scrolling: touch;
	cursor: grab;
	/* Scrollable, but the native scrollbar itself stays hidden -- the
	   drag/swipe/button ways of moving the strip are the intended
	   affordance, not a visible track+thumb. Doesn't affect desktop at
	   all (overflow-x: visible there already, see below, so there's no
	   scrollbar to hide in the first place) -- this only ever does
	   anything on mobile, where overflow-x: auto above is what's active. */
	scrollbar-width: none; /* Firefox */
	-ms-overflow-style: none; /* old Edge/IE */
}
.proof-grid::-webkit-scrollbar { display: none; } /* Chrome/Safari/WebKit */
/* Desktop: position is driven by the scroll-jack transform (see
   initProofScrollJack() in main.js), not native horizontal scrolling --
   overflow-x: auto above (native scrollbar) is only the mobile/
   reduced-motion fallback. Placed here, after the base rule, so it
   actually wins the cascade at this width instead of losing a
   source-order tie. */
@media (min-width: 900px) and (prefers-reduced-motion: no-preference) {
	.proof-grid {
		overflow-x: visible;
		overflow-y: visible;
		scroll-snap-type: none;
		cursor: default;
		will-change: transform;
	}
}
/* width: 100% -- without this, width: fit-content (see the comment
   above the base rule) measures out to the full 1280px --container-max
   ceiling even on a narrow viewport, wider than the screen: harmless on
   desktop, where .proof-scale-sticky's overflow: hidden clips it, but
   with no pinned wrapper active here, the same box was bleeding
   straight out to <html> and forcing the whole page to scroll
   sideways. Kept combined with reduced-motion (not just the width
   query below) since that same bleed risk applies there too -- a
   reduced-motion user at a DESKTOP width still gets native horizontal
   scroll (not the vertical stack below, that's mobile-width-only), and
   still needs this same fit-content/1280px fix. */
@media (max-width: 899px), (prefers-reduced-motion: reduce) {
	.proof-grid { width: 100%; max-width: 100%; }
}
.proof-grid.is-dragging { cursor: grabbing; scroll-snap-type: none; user-select: none; }
/* Matched directly to the client's reference: gray fill (not the
   sitewide white-card default -- this section is a deliberate
   exception, called out explicitly with its own screenshot), more
   generous padding, and a much bigger logo (see .proof-card-logo)
   instead of a small icon propped up by a separately-typed name. */
/* flex: 0 0 (fixed basis, no grow/shrink) -- matched to the reference's
   own behavior (inspected directly): each card holds its size
   regardless of how many exist, so with exactly 2 they fill the row
   edge-to-edge (as now), but once a 3rd is added it doesn't force all
   three to shrink and divide evenly -- it overflows and peeks off the
   edge, inviting a scroll, same as the reference's cards do. */
.proof-card {
	flex: 0 0 calc(50% - 12px);
	background: var(--bg-alt);
	border: 1px solid var(--border);
	border-radius: var(--radius-lg);
	padding: 36px;
	box-shadow: none;
	scroll-snap-align: start;
	position: relative;
	overflow: hidden;
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.proof-card > * { position: relative; z-index: 1; }
.proof-card::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.proof-card:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
.proof-card:hover { transform: translateY(-4px); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); border-color: rgba(var(--accent-rgb), 0.35); }
.proof-card-head { display: flex; align-items: center; margin-bottom: 20px; }
/* Full logo at real size, not a 24px icon -- width is left unconstrained
   (only capped so an unusually wide upload can't blow out the card) so a
   wide banner logo (PNB) and a square icon lockup (Khan Bank) both read
   at the same, legible height. */
.proof-card-logo { max-height: 48px; max-width: 100%; width: auto; height: auto; display: block; flex: none; }
.proof-card-name { font-family: var(--font-display); font-size: 1.2rem; font-weight: 700; color: var(--navy); }
.proof-card > p { font-size: 16px; }
.proof-metrics { display: flex; gap: 28px; margin-top: 24px; flex-wrap: wrap; }
.proof-metric strong { display: block; font-family: var(--font-numeric); font-size: 1.6rem; color: var(--cyan-glow); }
.proof-metric span {
	font-family: var(--font-mono); font-size: 11px; font-weight: 600;
	text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint);
}
/* Moved from one standalone link below the whole strip to a CTA on each
   card instead -- per direct feedback. */
.proof-card-readmore {
	display: inline-flex; align-items: center; gap: 6px;
	margin-top: 24px;
	font-family: var(--font-body); font-size: 14px; font-weight: 600;
	color: var(--accent);
	transition: gap 0.25s var(--ease);
}
.proof-card-readmore:hover { gap: 10px; }
@media (max-width: 640px) {
	.proof-scale-head-row { flex-direction: column; align-items: flex-start; }
	/* Fixed 88vw (not a percentage) so the next card peeks in at the
	   right edge as a horizontal-scroll invitation, same idea as
	   .proof-card's fixed-px desktop basis above. */
	.proof-card { flex-basis: 88vw; }
}

/* ---------- recognition / awards ---------- */
.recognition { padding: 0 0 88px; text-align: center; }
/* Mobile padding for the sections above -- placed here, after all of
   their base rules (not in the shared 760px block much earlier in the
   file), because that earlier block was losing the cascade to these
   unscoped rules defined later in the file, same specificity, source
   order decides. .fraud-cta/.fraud-cta-inner in particular had a
   long-stale ".cta-band"/".cta-band-inner" override that matched no
   real class at all, so it ran its full 120px desktop padding on
   every screen size -- across all seven sections this was the bulk of
   the "too much white space on mobile" complaint. */
@media (max-width: 760px) {
	.anatomy { padding: 56px 0 0; }
	.showcase { padding: 56px 0; }
	.fraud-cta { padding: 56px 0; }
	.fraud-cta-inner { padding: 40px 24px; }
	.capex { padding: 56px 0 24px; }
	.risk-makers { padding: 0 0 56px; }
	.proof-scale { padding: 56px 0; }
	.recognition { padding: 0 0 56px; }
}
.awards-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; max-width: 900px; margin: 0 auto; }
/* White, not the gray surface-2 fill -- per direct instruction, every
   card block on the site is white except the two panels that
   deliberately carry the radial gradient (the CTA band and Risk
   Decision Makers). */
.award-badge {
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
	padding: 28px 20px; display: flex; flex-direction: column; align-items: center; gap: 6px; text-align: center;
	position: relative; overflow: hidden;
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.award-badge > * { position: relative; z-index: 1; }
.award-badge::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.award-badge:hover::before { animation: clari5-sheen 0.9s ease-out 1; }
.award-badge:hover { transform: translateY(-4px); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); border-color: rgba(var(--accent-rgb), 0.35); }
/* Real award-mark image now (was a currentColor SVG in a tinted
   circle) -- the tinted circle background is dropped since the image
   has its own white background baked in (no alpha channel) and would
   show a visible seam against it otherwise. */
.award-icon {
	display: flex; align-items: center; justify-content: center;
	width: 40px; height: 40px; margin-bottom: 6px;
}
.award-icon img { width: 32px; height: 32px; object-fit: contain; }
.award-badge strong { font-family: var(--font-display); font-size: 1.05rem; color: var(--navy); }
.award-badge span:not(.award-year) { font-size: 12.5px; color: var(--ink-soft); }
.award-year { font-family: var(--font-mono); font-size: 11px; font-weight: 600; color: var(--cyan-glow); margin-top: 4px; }
@media (max-width: 780px) { .awards-grid { grid-template-columns: 1fr; } }

/* ---------- insights teaser ----------
   Featured card and list items matched to the reference site: the
   featured card splits into a dark/image top and a white body below
   (title + excerpt), rather than text overlaid on the image; list items
   are boxed cards, not divided rows, with the same lift/glow/border-tint
   hover already established on .hub-node for consistency across the
   site. */
.insights-teaser { padding: 88px 0; }
/* This heading's text is long enough that the sitewide 640px
   .section-head max-width wraps it to 3 lines; the reference uses
   768px (max-w-3xl) here specifically, which wraps it to 2. */
.insights-teaser .section-head { max-width: 768px; }
.insights-teaser-grid { display: grid; grid-template-columns: 1.1fr 1fr; gap: 32px; margin-top: 48px; }
.insights-featured {
	display: flex; flex-direction: column;
	height: 100%;
	position: relative;
	border-radius: var(--radius-lg);
	background: var(--surface);
	border: 1px solid var(--border);
	overflow: hidden;
	box-shadow: var(--shadow-sm);
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.insights-featured > * { position: relative; z-index: 1; }
.insights-featured-media {
	display: flex; align-items: flex-start;
	flex: 1; padding: 20px; min-height: 260px;
	background: linear-gradient(160deg, var(--accent-600), var(--navy) 120%);
}
/* When wp-admin sets a featured image, layer it under the same gradient
   (now a scrim, not the fill) so the badge stays legible either way. */
.insights-featured-media.has-image {
	background-image: linear-gradient(180deg, rgba(10,12,16,0.15), rgba(10,12,16,0.75)), var(--featured-bg, none);
	background-size: cover;
	background-position: center;
}
.insights-featured-tag {
	font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em;
	background: rgba(255,255,255,0.9); color: var(--navy); padding: 6px 14px; border-radius: 999px;
}
.insights-featured-body { padding: 24px 28px 28px; }
.insights-featured h3 { color: var(--navy); font-size: 1.4rem; margin: 0 0 10px; }
.insights-featured-excerpt { display: block; font-size: 14px; line-height: 1.6; color: var(--ink-soft); }
.insights-featured-link { display: block; margin-top: 16px; font-size: 13.5px; font-weight: 600; color: var(--cyan-glow); }
/* The icon-tagged row (Video/Podcast/Report) lives inside this same
   right-hand column, below the 3 list items -- not a separate
   full-width row spanning under both columns. That's what lets the
   featured card on the left stretch (height: 100%, above) to match the
   combined height of the list + icon row instead of leaving empty
   space beneath a shorter fixed-height image. Confirmed against the
   reference's actual grid structure, not guessed. */
.insights-column { display: flex; flex-direction: column; gap: 24px; height: 100%; }
.insights-list { display: flex; flex-direction: column; gap: 12px; }
/* Same hover recipe as everywhere else on the site (.hub-node, the
   showcase cards, etc.) rather than a one-off variant for this section:
   a 4px lift, border tinting to accent/35%, the same centered glow, and
   the same hover-only diagonal sheen streak — used consistently across
   the featured card and every strip/list item. */
.insights-featured,
.insights-list-item,
.insights-strip-item {
	transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.insights-featured::before,
.insights-list-item::before,
.insights-strip-item::before {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(115deg, transparent 35%, rgba(var(--cyan-glow-rgb), 0.22) 50%, transparent 65%);
	transform: translateX(-140%);
	pointer-events: none;
}
.insights-featured:hover::before,
.insights-list-item:hover::before,
.insights-strip-item:hover::before {
	animation: clari5-sheen 0.9s ease-out 1;
}
.insights-featured:hover,
.insights-list-item:hover,
.insights-strip-item:hover {
	transform: translateY(-4px);
	border-color: rgba(var(--accent-rgb), 0.35);
	box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55);
}
.insights-list-item {
	display: flex; flex-direction: column; gap: 4px;
	position: relative;
	overflow: hidden;
	padding: 20px 44px 20px 20px;
	background: var(--surface);
	border: 1px solid var(--border);
	border-radius: var(--radius-md);
}
.insights-list-item > * { position: relative; z-index: 1; }
.insights-list-item .insight-arrow {
	position: absolute; right: 16px; top: 20px;
	display: flex; align-items: center; justify-content: center;
	width: 28px; height: 28px; border-radius: 50%;
	background: var(--surface); color: var(--ink-faint);
	transition: color 0.25s var(--ease), transform 0.25s var(--ease), background 0.25s var(--ease);
}
.insights-list-item:hover .insight-arrow { color: var(--accent); background: var(--accent-100); transform: translate(2px, -2px); }
/* Matches the reference's own insight-type tags (Research/Analysis/
   Perspective/Regulation), sampled directly: cyan, same family as
   every section eyebrow, not the blue accent. */
.insights-list-item .insight-type { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--cyan-glow); }
.insights-list-item .insight-title { font-size: 15px; font-weight: 600; color: var(--navy); line-height: 1.35; }
.insight-read-time { font-size: 12px; color: var(--ink-faint); }
.insights-strip { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.insights-strip-item {
	display: flex; flex-direction: column; gap: 10px; padding: 18px;
	position: relative; overflow: hidden;
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
}
.insights-strip-item > * { position: relative; z-index: 1; }
/* Matched to the reference's own strip icon exactly: 40px, a cyan-tinted
   wash + border (not the accent-blue fill it had before), icon itself
   left navy rather than tinted. */
.insights-strip-icon {
	display: flex; align-items: center; justify-content: center;
	width: 40px; height: 40px; border-radius: 50%;
	background: rgba(var(--cyan-glow-rgb), 0.1);
	border: 1px solid rgba(var(--cyan-glow-rgb), 0.3);
	color: var(--cyan-glow);
	flex: none;
}
.insights-strip-item .insight-type { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.18em; color: var(--ink-soft); }
.insights-strip-item .insight-title { font-size: 13.5px; font-weight: 500; color: var(--navy); }
@media (max-width: 900px) {
	.insights-teaser-grid { grid-template-columns: 1fr; }
	.insights-strip { grid-template-columns: 1fr; }
}

/* ---------- footer subscribe box ---------- */
/* Social icons moved up here (were down in .footer-brand below the
   logo) so they sit level with the newsletter row, matching the
   reference exactly -- icons left, subscribe form right. */
.footer-subscribe-row {
	display: grid; grid-template-columns: 1.1fr 2fr; gap: 48px; align-items: center;
	padding-bottom: 32px; border-bottom: 1px solid #1E2128;
}
/* Mirrors .footer-cols' own grid (repeat(4, 1fr), 24px gap) directly below,
   so the subscribe form's left edge lines up with the Insights column
   instead of floating at the far right, per direct feedback. */
.footer-subscribe-cols { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; min-width: 0; }
.footer-subscribe-wrap {
	grid-column: 2 / -1; display: flex; flex-direction: column; align-items: flex-start; gap: 10px;
	min-width: 0;
}
.footer-subscribe-status { width: 100%; max-width: 560px; }
/* min-width: 0 on the flex container and its flex: 1 input -- otherwise
   their default min-width: auto lets the input's/button's intrinsic
   content size blow out past the grid track on narrow viewports. */
.footer-subscribe { display: flex; gap: 12px; width: 100%; max-width: 560px; min-width: 0; }
.footer-subscribe input {
	flex: 1; min-width: 0; padding: 15px 20px; border-radius: var(--radius-sm);
	border: 1px solid #2A2E36; background: #FFFFFF; color: #1A1D22; font-size: 15px;
}
.footer-subscribe input::placeholder { color: #8B8D94; }
.footer-subscribe input:focus { outline: none; border-color: var(--footer-cyan, #17B4CE); }
.footer-subscribe .btn {
	background: var(--footer-cyan, #17B4CE); color: #FFFFFF; box-shadow: none;
	padding: 15px 28px; font-size: 15px;
}
.footer-subscribe .btn:hover { background: #139DB4; transform: none; box-shadow: none; }
/* Placed after the base rules above (not in the shared 1080px breakpoint
   block earlier in the file) so it actually wins the cascade at narrow
   widths -- same specificity, so source order decides. */
@media (max-width: 1080px) {
	.footer-subscribe-row { grid-template-columns: 1fr; gap: 20px; }
	.footer-subscribe-cols { grid-template-columns: 1fr; }
	.footer-subscribe-wrap { grid-column: 1; align-items: stretch; }
	.footer-subscribe, .footer-subscribe-status { max-width: none; }
}

/* ==========================================================================
   Ambient motion matched to the reference (clarity-voyage-net.lovable.app)
   Timings/easings below are lifted 1:1 from that site's own computed
   styles, each applied to its closest equivalent element here. See
   .hero-visual-chip, .chip-alert, .hub-center-inner and .eyebrow for where
   each one lands.
   ========================================================================== */
@keyframes clari5-float {
	0%, 100% { transform: translateY(0); }
	50% { transform: translateY(-12px); }
}
@keyframes clari5-node-pulse {
	0%, 100% { opacity: 0.35; }
	50% { opacity: 1; }
}
@keyframes clari5-ping-ring {
	0% { opacity: 0.55; transform: scale(1); }
	100% { opacity: 0; transform: scale(1.9); }
}
@keyframes clari5-breathe {
	0%, 100% { transform: scale(1); }
	50% { transform: scale(1.035); }
}
@keyframes clari5-shimmer {
	0% { background-position: -150% 0; }
	100% { background-position: 250% 0; }
}

.hero-visual-chip { animation: clari5-float 7s ease-in-out infinite; }
.hero-visual-chip.chip-2 { animation-delay: -3.5s; } /* out of phase with chip-1, so the two don't bob in lockstep */

.hero-visual-chip-label::before { animation: clari5-node-pulse 3.4s ease-in-out infinite; }

/* The alert badge additionally gets an expanding "ping" ring off its dot
   — reserved for the badge reporting an active catch, not routine
   screening. */
.chip-alert .hero-visual-chip-label { position: relative; }
.chip-alert .hero-visual-chip-label::after {
	content: '';
	position: absolute; left: 0; top: 50%;
	width: 6px; height: 6px; margin-top: -3px;
	border-radius: 50%; border: 1px solid var(--brand-red);
	animation: clari5-ping-ring 2.6s cubic-bezier(0, 0, 0.2, 1) infinite;
}

/* Final hero treatment: keep the telemetry cards light, compact, and crossing
   the sphere edges like the reference hero rather than reading as dashboard UI. */
.hero-v2 .hero-visual-chip {
	padding: 12px 16px;
	border-radius: 20px;
	background: rgba(14, 26, 50, 0.06);
	border: 1px solid rgba(14, 26, 50, 0.12);
	color: var(--ink);
}
.hero-v2 .chip-1 { top: 14%; right: auto; left: 0; }
/* Below the sphere, not on top of it -- see the plain .chip-2 rule
   above for the measurements this is based on. This is the rule that
   actually wins (higher specificity, .hero-v2 is on the live markup),
   so it needs the same fix, not just the rule above it. */
.hero-v2 .chip-2 { top: 88.5%; bottom: auto; right: 1%; left: auto; }
/* That 88.5% was measured against the desktop sphere/container
   proportions -- .hero-network's padding/min-height are fixed px
   while the sphere's own width is fluid on mobile (min(viewport,
   420px)), so the same percentage lands in a different place there
   and was overlapping the content below it. top: 100% + a fixed
   margin anchors to the container's actual bottom edge instead of a
   percentage guess, so it's correct regardless of the sphere's
   actual rendered size. */
@media (max-width: 760px) {
	.hero-v2 .chip-2 { top: 100%; bottom: auto; margin-top: 16px; right: 0; }
}
.hero-v2 .chip-alert { color: var(--cyan-glow); }

/* Hub center badge: a slow breathing scale, matching the reference's own
   .animate-breathe on its equivalent glowing wordmark badge. The glow
   itself (box-shadow, set on .hub-center-inner above) is static, same
   as the reference — only the scale moves. */
.hub-center-inner { animation: clari5-breathe 6s ease-in-out infinite; }

/* Small shimmer dash in front of every eyebrow label across the site,
   matching the reference's moving highlight line. */
.eyebrow { display: inline-flex; align-items: center; gap: 8px; }
.eyebrow::before {
	content: '';
	width: 20px; height: 1px; flex: none;
	background: linear-gradient(90deg, transparent, currentColor 45%, currentColor 55%, transparent);
	background-size: 220% 100%;
	animation: clari5-shimmer 3.6s linear infinite;
	opacity: 0.6;
}
/* .eyebrow is inline-flex, so justify-content alone only centers its
   dash+label *within* its own box — it doesn't center the box itself in
   the section, since an inline-flex element's own position still comes
   from the parent's text-align, not anything set on itself. Switching to
   a full-width flex container fixes that: now there's room on both sides
   for justify-content to actually center into. */
.eyebrow-center { display: flex; justify-content: center; width: 100%; }

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; }
}

/* Blog detail: category pill under the breadcrumb (Blog Internal spec) */
.post-detail-pill{display:inline-block;margin:0 0 14px;padding:5px 14px;border-radius:999px;background:rgba(0,120,255,.1);color:var(--accent);font-size:.78rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase}
.post-detail-breadcrumb{display:block;margin-bottom:16px}

/* ==========================================================================
   Blog cards v3 -- matches clarity-voyage-net.lovable.app/blog (values read
   from its computed styles): 32px card, tinted gradient panel holding a
   framed image, big display title, pill footer with category chip + date.
   ========================================================================== */
/* This had no media-query guard, so its 3-column layout was winning over
   the responsive .post-grid rules above (2 cols under 1080px, 1 col under
   640px) at every viewport including mobile -- 3 cards squeezed into
   phone width, illegibly narrow (Sept 2026 site-modifications doc: "the
   view of the 3 blogs is not looking good [on mobile]"). */
.post-grid.post-grid-3up { grid-template-columns: repeat(3, 1fr); gap: 24px; }
.post-grid-3up .post-card.is-wide { grid-column: auto; }
@media (max-width: 1080px) {
	.post-grid.post-grid-3up { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
	.post-grid.post-grid-3up { grid-template-columns: 1fr; }
}
.post-card {
	border-radius: 32px; border-color: rgba(var(--accent-rgb), 0.12);
	box-shadow: none; background: #fff;
	transition: transform 0.7s var(--ease), border-color 0.7s var(--ease), box-shadow 0.7s var(--ease);
}
.post-card:hover { transform: translateY(-6px); box-shadow: 0 30px 60px -34px rgba(var(--accent-rgb), 0.45); border-color: rgba(var(--accent-rgb), 0.3); }
/* Was padding: 24px around a "panel" with a lavender-tinted gradient
   matte (color-mix(accent...)) framing a smaller inset image -- Sept 2026
   site-modifications doc: "Remove the purple background and expand the
   image to that extent." Image now runs edge-to-edge to the card's own
   rounded corners (.post-card still has overflow: hidden, so it still
   clips to those corners) instead of sitting inset in a colored mat. */
.post-card-link { padding: 0; }
.post-card-panel { border-radius: 0; padding: 0; overflow: hidden; position: relative; background: none; }
.post-card-panel .post-card-media {
	aspect-ratio: 16 / 10; border-radius: 0; background: var(--bg-alt);
	border: none; box-shadow: none;
}
.post-card-media img { transition: transform 1.4s var(--ease); }
.post-card:hover .post-card-media img { transform: scale(1.06); }
.post-card-body { padding: 22px 22px 0; }
/* Weight/tracking matched to .blog-featured-title's effective style
   (which just inherits the sitewide h1-h4 rule: font-weight 600,
   letter-spacing -0.01em) instead of this card grid carrying its own
   heavier 700/-0.025em -- "use the same font details for heading as used
   in [the Featured section]" (same doc). */
.post-card-title { font-size: clamp(1.5rem, 2.2vw, 2rem); line-height: 1.15; letter-spacing: -0.01em; font-weight: 600; margin-bottom: 16px; transition: color 0.5s var(--ease); }
.post-card:hover .post-card-title { color: var(--accent); }
.post-card-excerpt { font-size: 14px; line-height: 1.6; color: var(--ink-soft, #56627a); margin-bottom: 0; flex: 1; }
.post-card-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-top: 28px; padding: 0 22px 22px; }
.post-card-pill {
	display: inline-flex; align-items: center; gap: 12px; padding: 6px 20px 6px 6px;
	border: 1px solid rgba(var(--accent-rgb), 0.12); border-radius: 999px; background: rgba(255,255,255,.6);
	transition: border-color 0.5s var(--ease);
}
.post-card:hover .post-card-pill { border-color: rgba(var(--accent-rgb), 0.3); }
.post-card-chip { padding: 8px 16px; border-radius: 999px; background: var(--accent); color: #fff; font-size: 14px; font-weight: 600; }
.post-card-cta { margin-top: 0; padding-top: 0; }
@media (max-width: 760px) {
	.post-grid.post-grid-2up { grid-template-columns: 1fr; }
	/* "the outline is round but the image is square" -- this padding
	   re-inset the image away from the card's rounded edge on mobile only,
	   undoing the edge-to-edge treatment above (the image's own corners
	   are square via border-radius: 0, which only ever looked right flush
	   against the card's own rounded corner + overflow:hidden clip). Text
	   still gets its own gutter from .post-card-body/.post-card-foot's
	   padding below, independent of this. */
	.post-card-body { padding: 22px 6px 0; }
}

/* ==========================================================================
   Blog detail v3 -- clarity-voyage-net.lovable.app/blog/<slug> layout:
   2-col hero (text + framed image), border-top, sticky 300px ToC beside a
   narrow reading column, "See it live" CTA card, 3-up "Keep reading".
   ========================================================================== */
.pd2-hero { position: relative; padding: 150px 0 56px; overflow: hidden; }
.pd2-aura { position: absolute; left: 50%; top: -120px; width: 900px; height: 500px; transform: translateX(-50%); pointer-events: none; }
.pd2-hero-grid { position: relative; display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
.pd2-back { display: inline-block; margin-bottom: 26px; font-size: 12px; font-weight: 600; letter-spacing: .2em; text-transform: uppercase; color: var(--accent); }
.pd2-pill { display: table; margin: 0 0 22px; padding: 7px 14px; border: 1px solid rgba(var(--accent-rgb), .15); border-radius: 10px; background: rgba(var(--accent-rgb), .05); font-size: 11px; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: var(--navy); opacity: .8; }
/* Was clamp(2.2rem, 4.4vw, 3.6rem)/700/-0.03em -- reduced, and weight +
   tracking matched to .blog-featured-title's effective style (the
   sitewide h1-h4 rule: 600/-0.01em) instead of this page's own heavier
   treatment (Sept 2026 site-modifications doc). */
.pd2-title { font-size: clamp(1.8rem, 3vw, 2.4rem); line-height: 1.15; letter-spacing: -0.01em; font-weight: 600; margin: 0 0 24px; }
.pd2-meta { display: flex; align-items: center; gap: 12px; font-size: 14px; color: var(--ink-soft, #56627a); }
.pd2-dot { width: 3px; height: 3px; border-radius: 50%; background: currentColor; }
.pd2-hero-media { border-radius: 28px; overflow: hidden; box-shadow: 0 40px 80px -40px rgba(var(--accent-rgb), .5); aspect-ratio: 4 / 3; background: var(--bg-alt); }
.pd2-hero-media img { width: 100%; height: 100%; object-fit: cover; display: block; transform: scale(1.04); transition: transform 1.6s var(--ease); }
.pd2-hero-media.in-view img { transform: scale(1); }
.pd2-hero-media .post-detail-media-fallback { position: static; display: flex; width: 100%; height: 100%; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--accent), var(--navy)); color: rgba(255,255,255,.35); }
.pd2-body { padding: 0 0 96px; }
.pd2-body-grid { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 80px; padding-top: 48px; border-top: 1px solid rgba(var(--accent-rgb), .12); }
.pd2-aside { position: sticky; top: 112px; align-self: start; }
.pd2-aside-title { font-family: var(--font-display); font-size: 1.15rem; font-weight: 600; color: var(--navy); margin: 0 0 24px; }
.pd2-toc { gap: 0; margin: 0; padding: 0; list-style: none; border-left: 1px solid rgba(var(--accent-rgb), .12); }
.pd2-toc li { margin: 0; }
.pd2-toc a { display: block; padding: 10px 0 10px 16px; margin-left: -1px; border: 0; border-left: 2px solid transparent; font-size: 14px; line-height: 1.4; color: var(--ink-soft, #56627a); transition: color .3s var(--ease), border-color .3s var(--ease); }
.pd2-toc a:hover { color: var(--navy); }
.pd2-toc li.is-active > a { color: var(--accent); border-left-color: var(--accent); font-weight: 500; }
.pd2-share { display: flex; align-items: center; gap: 10px; margin-top: 32px; font-size: 13px; color: var(--ink-soft, #56627a); }
.pd2-share a { display: inline-flex; width: 34px; height: 34px; align-items: center; justify-content: center; border: 1px solid rgba(var(--accent-rgb), .15); border-radius: 50%; color: var(--navy); transition: all .3s var(--ease); }
.pd2-share a:hover { background: var(--accent); border-color: var(--accent); color: #fff; transform: translateY(-2px); }
.pd2-main { max-width: 768px; min-width: 0; }
.pd2-content { font-size: 17px; line-height: 1.85; }
.pd2-content h2 { font-size: clamp(1.7rem, 2.6vw, 2.1rem); letter-spacing: -0.02em; margin: 56px 0 18px; scroll-margin-top: 110px; }
.pd2-content > *:first-child { margin-top: 0; }
.pd2-content p { margin: 0 0 20px; }
.pd2-content ul { list-style: none; padding: 0; margin: 24px 0; }
.pd2-content ul li { padding: 4px 0 4px 20px; border-left: 1px solid rgba(var(--accent-rgb), .15); margin-bottom: 8px; font-size: 15px; line-height: 1.6; }
.pd2-cta { margin-top: 72px; padding: 40px; border: 1px solid rgba(var(--accent-rgb), .12); border-radius: 28px; background: rgba(var(--accent-rgb), .045); }
.pd2-cta .eyebrow { margin-bottom: 14px; }
.pd2-cta h2 { font-size: clamp(1.5rem, 2.6vw, 2.1rem); line-height: 1.25; margin: 0 0 28px; max-width: 560px; }
.pd2-keep { padding: 0 0 112px; }
.pd2-keep-title { font-size: clamp(1.6rem, 2.4vw, 1.9rem); margin-bottom: 40px; }
/* Horizontal scroll, not a fixed 3-up grid -- the query behind this now
   pulls more than 3 posts (single.php), so there's always something past
   the first row to scroll to (Sept 2026 site-modifications doc: "a
   horizontal scroll in the 'Keep Reading' section after the 3 cards, so
   audience can scroll to other cards"). Each card is a flex-basis
   fraction of the row instead of a grid column so the row can overflow
   sideways at all; scroll-snap just makes that scrolling land cleanly on
   a card boundary instead of stopping mid-card. */
/* "Scroll is visible only on hover in the Mobile version for the read
   more section" -- this row's native scrollbar only appears on
   hover/while-scrolling on some platforms (a Mac/desktop scrollbar
   default, not anything mobile-specific, but it reads as "no way to
   tell there's more" either way). Hides the native bar entirely and
   relies on the right-edge fade below as an always-visible affordance
   instead, so nothing here depends on hover at all. */
.pd2-keep .container-wide { position: relative; }
.post-grid.pd2-keep-grid {
	display: flex;
	gap: 28px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	padding-bottom: 12px;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;
}
.post-grid.pd2-keep-grid::-webkit-scrollbar { display: none; }
.pd2-keep .container-wide::after {
	content: '';
	position: absolute;
	top: 40px; right: 0; bottom: 12px; width: 64px;
	background: linear-gradient(to right, transparent, var(--bg) 85%);
	pointer-events: none;
}
.pd2-keep-grid .post-card { flex: 0 0 calc((100% - 56px) / 3); scroll-snap-align: start; }
.pd2-keep-grid .post-card-title { font-size: 1.35rem; }
@media (max-width: 1080px) {
	.pd2-hero-grid { grid-template-columns: 1fr; gap: 40px; }
	.pd2-body-grid { grid-template-columns: 1fr; gap: 32px; }
	.pd2-aside { position: static; }
	.pd2-keep-grid .post-card { flex-basis: calc((100% - 28px) / 2); }
}
@media (max-width: 680px) {
	.pd2-hero { padding: 110px 0 36px; }
	.pd2-cta { padding: 28px 22px; border-radius: 22px; }
	.pd2-keep-grid .post-card { flex-basis: 82%; }
}

/* ==========================================================================
   AML page -- built to clarity-voyage-net.lovable.app/aml (functions.php's
   clari5_maybe_render_aml_page()). Reuses existing primitives (.stat,
   .section-head, .outcome-card, .accordion, .cta-band) rather than
   reinventing them, with a small set of aml-* rules for what's actually new:
   the hero stat strip, the numbered problem/force cards, the deployment +
   Suspicious Activity Monitoring layout, the GenAI capability grid, the
   static comparison table and the customer-story cards.
   ========================================================================== */
.aml-hero { position: relative; padding: 72px 0 0; overflow: hidden; }
.aml-hero-grid { display: grid; grid-template-columns: 1.05fr 1fr; gap: 56px; align-items: center; position: relative; z-index: 1; }
.aml-eyebrow-pill {
	display: inline-flex; align-items: center; gap: 8px; margin: 0 0 18px;
	padding: 6px 16px; border: 1px solid var(--border); border-radius: 999px;
	background: var(--surface); font-size: 12px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-soft);
}
.aml-eyebrow-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
.aml-hero h1 { font-size: clamp(2rem, 3.6vw, 2.9rem); line-height: 1.1; margin: 0 0 18px; color: var(--navy); }
.aml-hero-sub { font-size: 16px; color: var(--ink-soft); max-width: 560px; margin-bottom: 28px; }
.aml-hero-ctas { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 48px; }

/* ---------- hero dashboard mockup + floating stat chips ----------
   The reference's own hero visual turned out to be one static image (its
   own dashboard screenshot -- confirmed by inspecting the live page's DOM,
   an <img>, not a real interactive widget), not a build-able HTML/CSS
   component -- functions.php now renders that same image directly.
   The hover lift + shadow shift below is read off that same element's own
   real computed styles before/after :hover, not approximated: translateY
   -4px, and the ambient glow shifting to a tighter, more directional
   "lifted" shadow. */
.aml-hero-visual { position: relative; }
.aml-mock-card {
	border-radius: 24px; overflow: hidden; padding: 8px;
	background: var(--surface); border: 1px solid var(--border);
	box-shadow: 0 0 42px -8px rgba(var(--accent-rgb), 0.5);
	transition: transform 0.7s var(--ease), box-shadow 0.7s var(--ease);
}
.aml-mock-card:hover { transform: translateY(-4px); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.4); }
.aml-mock-image { display: block; width: 100%; height: auto; border-radius: 18px; }
/* No real product screenshot yet (Sentinel/CCCP/AI-ML) -- an abstract
   gradient fills the same card shape so the hero chips still have
   somewhere to anchor, without faking a dashboard.
   "This sentinel page this blank image is too small in mobile version" --
   this div has only aspect-ratio set, no explicit width, and sits inside
   a single-column grid whose rows size to content (auto), not stretch.
   With both axes indefinite, the browser's aspect-ratio auto-sizing
   fell back to a UA-default box (~188px) instead of filling the grid
   item's full column width. An explicit width: 100% forces it to size
   from its container instead of guessing. */
.aml-mock-card-abstract {
	width: 100%; aspect-ratio: 16 / 10.08; border-radius: 18px;
	background:
		radial-gradient(circle at 30% 25%, rgba(var(--accent-rgb), 0.35), transparent 55%),
		radial-gradient(circle at 75% 70%, rgba(var(--cyan-glow-rgb), 0.25), transparent 50%),
		linear-gradient(135deg, var(--navy) 0%, #0c1430 100%);
}
.aml-hero-chip {
	position: absolute; display: flex; flex-direction: column; gap: 2px;
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
	padding: 10px 16px; box-shadow: var(--shadow-md); animation: floatCard 6s ease-in-out infinite;
}
.aml-hero-chip-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); }
.aml-hero-chip-value { font-family: var(--font-numeric); font-size: 1.05rem; font-weight: 700; color: var(--accent); }
.aml-hero-chip-1 { top: -18px; left: -24px; animation-delay: 0s; }
.aml-hero-chip-2 { bottom: -18px; right: -18px; animation-delay: 2s; }
/* The EFRM page's mockup (.efrm-console) is a dense terminal panel with
   real title text right at its own top-left corner -- the AML page's
   chip-1 offset above only ever floated over blank image corner there, so
   here it needs to sit further clear of the panel instead of over its
   header row. */
.efrm-hero-visual .aml-hero-chip-1 { top: -54px; left: 24px; }
.efrm-hero-visual .aml-hero-chip-2 { bottom: -68px; right: 24px; }
/* .aml-hero has padding-bottom: 0 because the AML page's own .aml-stats-row
   sits right below .aml-hero-grid inside the same <section>, giving the
   bottom-right floating chip room before .aml-hero's overflow:hidden clips
   it. This page's hero has no stats-row after the grid, so without this the
   chip above got clipped away entirely instead of just floating over the
   panel's bottom-right corner. */
.aml-hero-no-stats { padding-bottom: 72px; }

/* ---------- underlined stat row below the hero ---------- */
/* padding-top/-bottom, not the padding shorthand -- this sits inside a
   .container that itself supplies the 40px side gutter, and a plain
   "padding: 40px 0 56px" zeroed that side padding right back out again
   (the shorthand's 2nd value is left+right), pushing every number in
   this row flush against the browser edge on the live site. */
/* EFRM Page Development Changes-30Sept.pdf: "Make it centrally aligned" --
   was a 4-column grid, which stretched each stat's accent underline the
   full width of its column; switched to a centered flex row so each
   stat (and its short underline) sizes to its own content and the whole
   group centers as one block, matching the reference. */
.aml-stats-row {
	display: flex; justify-content: center; flex-wrap: wrap; gap: 48px;
	padding-top: 40px; padding-bottom: 56px; margin-top: 32px; border-top: 1px solid var(--border);
	position: relative; z-index: 1;
}
/* "some lines are too big and some are small not as per text length" --
   the border-top used to sit on .aml-row-stat itself, so its width was
   whatever the browser's intrinsic shrink-to-fit sizing picked for the
   WHOLE block (number + wrapping label underneath), which tracks the
   longer, multi-word label's wrap width, not the big number. A stat with
   a short number but a long label (e.g. "<20 min" / "Auto-acknowledgement
   for 100% of emails") ended up with a far wider line than one with a
   longer number but a short label. Moved the line onto .stat-value
   itself as an inline-block pseudo-element, so its width always hugs
   just the number glyphs, independent of the label's own width below it. */
/* max-width caps each stat's label to 2-3 wrapped lines -- without it, a
   flex item with no explicit width renders its longest label as one
   unwrapped line (shrink-to-fit sizing has no reason to wrap when
   nothing constrains it), which on mobile either overflowed the
   viewport outright or just barely fit depending on the exact label. */
.aml-row-stat { flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; text-align: center; max-width: 200px; }
.aml-row-stat .stat-value {
	display: inline-block; position: relative; padding-top: 14px;
	transition: color 0.5s var(--ease), transform 0.5s var(--ease);
}
.aml-row-stat .stat-value::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--accent); }
.aml-row-stat:hover .stat-value { transform: translateY(-4px); color: var(--accent); }
/* Maestro's 6-stat strip -- plain flex-wrap left one stat orphaned alone
   on its own centered second row (5 fit the first line, 1 wrapped).
   A fixed 3-column grid keeps it a balanced 3x2 instead. */
.aml-stats-row-grid { display: grid; grid-template-columns: repeat(3, 1fr); }
@media (max-width: 720px) {
	.aml-stats-row-grid { grid-template-columns: repeat(2, 1fr); }
}
.aml-row-stat .stat-value { font-size: 1.9rem; }
/* AML Development Changes-5Oct.pdf: "Make it bold as per the design" --
   the label line under each number reads as the heading of that stat on
   the reference (bold, navy, letter-spaced caps), not as faint body text. */
.aml-row-stat .stat-label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: var(--navy); }
.aml-stat-sub { margin-top: 4px; font-size: 12px; color: var(--ink-faint); }

.aml-section { padding: 72px 0; }
.aml-section-alt { background: var(--bg-alt); }
.aml-explore-sub { max-width: 640px; margin: 0 auto; color: var(--ink-soft); text-align: center; }

/* ---------- problem grid (compliance imperative) ---------- */
.aml-problem-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; }
/* EFRM Page Development Changes-30Sept.pdf + the live
   clari5-flow-vision.lovable.app/enterprise-fraud-management reference
   (checked directly via computed styles, not just the PDF's screenshot):
   the reference card is a translucent "glass" panel -- backdrop-filter
   blur(18px) over a ~6%-opacity dark tint, not a flat grey fill -- plus
   a hover-lift (the reference's own "glass hover-lift" class). Approximated
   here with the site's own navy tone instead of copying the exact oklab
   value, since that's specific to whatever sits behind it on their page. */
.aml-problem {
	background: rgba(14, 26, 50, 0.05);
	backdrop-filter: blur(18px);
	-webkit-backdrop-filter: blur(18px);
	border: 1px solid rgba(14, 26, 50, 0.1);
	border-radius: var(--radius-md);
	padding: 26px 28px;
	transition: transform 0.4s var(--ease), box-shadow 0.4s var(--ease), background-color 0.4s var(--ease), border-color 0.4s var(--ease);
}
/* "On hover color effect is missing" -- measured the reference's actual
   :hover computed styles directly (not visible in a static screenshot):
   the whole card flips to a solid accent-blue fill with a lift, and its
   icon/number/title/body all go white/near-white for contrast against
   that new background — a full color-swap, not just a lift. */
.aml-problem:hover {
	transform: translateY(-6px) scale(1.01);
	background: var(--accent);
	border-color: rgba(var(--accent-rgb), 0.35);
	box-shadow: 0 22px 60px -26px rgba(var(--accent-rgb), 0.6);
}
.aml-problem:hover h3,
.aml-problem:hover .aml-problem-n { color: #fff; }
.aml-problem:hover p { color: rgba(255, 255, 255, 0.85); }
.aml-problem:hover .aml-problem-icon { border-color: rgba(255, 255, 255, 0.5); color: #fff; }
/* Reference layout: an icon circle top-left, a large muted number
   top-right, on the same row -- was just a small plain number, no icon
   at all (confirmed missing entirely against a screenshot of the live
   reference, not just the PDF's own screenshot). */
.aml-problem-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 22px; }
.aml-problem-icon { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 50%; border: 1.5px solid rgba(var(--accent-rgb), 0.35); color: var(--accent); flex: none; transition: color 0.4s var(--ease), border-color 0.4s var(--ease); }
.aml-problem-n { font-family: var(--font-numeric); font-size: 2.2rem; font-weight: 700; color: rgba(var(--accent-rgb), 0.22); line-height: 1; transition: color 0.4s var(--ease); }
.aml-problem h3 { margin: 0 0 8px; font-size: 1.2rem; transition: color 0.4s var(--ease); }
.aml-problem p { color: var(--ink-soft); font-size: 14.5px; margin: 0; transition: color 0.4s var(--ease); }
/* EFRM Page Development Changes-30Sept.pdf: "Animation missing" -- an
   explicit stagger here so the 3 problem cards visibly animate in one
   after another regardless of their index in main.js's whole-page
   .reveal sequence. */
/* !important: main.js's initScrollReveal() sets a transition-delay
   inline on every .reveal element, which otherwise wins over any
   stylesheet rule regardless of specificity. */
.efrm-problem-grid.aml-problem-grid .aml-problem:nth-child(1) { transition-delay: 0.1s !important; }
.efrm-problem-grid.aml-problem-grid .aml-problem:nth-child(2) { transition-delay: 0.3s !important; }
.efrm-problem-grid.aml-problem-grid .aml-problem:nth-child(3) { transition-delay: 0.5s !important; }

/* ---------- "why now" forces ---------- */
/* Zigzag two-column rows -- text on one side, a stat-callout card on the
   other, alternating sides row to row (.aml-force-reverse flips it via
   order, not by duplicating markup in reverse). This used to render all
   three forces as identical single stacked cards (icon+title+body, then
   every stat as a plain bullet underneath) instead of this alternating
   text/card layout. */
.aml-forces { display: grid; gap: 56px; }
.aml-force { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: stretch; }
.aml-force-reverse .aml-force-text { order: 2; }
.aml-force-reverse .aml-force-card { order: 1; }
.aml-force-head { display: flex; align-items: center; gap: 14px; margin-bottom: 16px; }
.aml-force-icon {
	display: inline-flex; align-items: center; justify-content: center; flex: none;
	width: 44px; height: 44px; border-radius: 50%; background: var(--accent-100); color: var(--accent);
}
.aml-force-n { font-family: var(--font-numeric); font-weight: 700; font-size: 2.2rem; color: rgba(var(--accent-rgb), 0.3); }
.aml-force-text h3 { margin: 0 0 12px; font-size: 1.5rem; }
.aml-force-text p { color: var(--ink-soft); margin: 0; }
.aml-force-rule { display: block; width: 40px; height: 2px; background: rgba(var(--accent-rgb), 0.4); margin-top: 20px; }
/* AML Development Changes-5Oct.pdf: "Align this section properly" -- the
   card used to share the section's own --bg-alt fill, so its points
   floated borderless and out of line with the text beside them. A real
   bordered card, stretched to the text block's height with its points
   centred, lines the two columns up the way the reference does. */
.aml-force-card {
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg);
	padding: 28px 32px; display: flex; flex-direction: column; justify-content: center; gap: 18px;
}
.aml-force-point { display: flex; align-items: flex-start; gap: 12px; font-size: 14.5px; color: var(--ink); }
.aml-force-point svg { flex: none; color: var(--accent); margin-top: 2px; }

/* ---------- modular picker + deployment switch ---------- */
/* AML Development Changes-5Oct.pdf: "This section not matching with the
   design" -- two columns split by a rule: a tap-to-build module picker
   (chips + "n/6 modules" bar) and an On-premise / Compliance-as-a-Service
   switch, replacing the two static deployment cards. Wired by
   initAmlModulePicker() / initAmlDeploySwitch() in main.js. */
.aml-build-grid {
	display: grid; grid-template-columns: 1fr 1fr; gap: 0;
	padding-bottom: 56px; margin-bottom: 56px; border-bottom: 1px solid var(--border);
}
.aml-build-col { padding-right: 56px; }
.aml-build-col + .aml-build-col { padding: 0 0 0 56px; border-left: 1px solid var(--border); }
.aml-build-head { display: flex; align-items: center; gap: 12px; margin-bottom: 22px; }
.aml-build-icon {
	display: inline-flex; align-items: center; justify-content: center; flex: none;
	width: 44px; height: 44px; border-radius: 12px; border: 1.5px solid var(--accent); color: var(--accent);
}
.aml-build-icon.is-solid { background: var(--accent); color: #fff; }
.aml-build-tag { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--accent); }
.aml-build-col h3 { font-size: clamp(1.4rem, 2vw, 1.75rem); line-height: 1.3; margin: 0 0 16px; }
.aml-build-col > p { color: var(--ink-soft); margin: 0 0 24px; }
.aml-module-chips { display: flex; flex-wrap: wrap; gap: 10px; }
.aml-module-chip {
	display: inline-flex; align-items: center; gap: 8px; padding: 9px 16px;
	border: 1px solid var(--border); border-radius: 999px; background: var(--surface);
	font: inherit; font-size: 14px; font-weight: 500; color: var(--ink-soft); cursor: pointer;
	transition: background 0.3s var(--ease), color 0.3s var(--ease), border-color 0.3s var(--ease);
}
.aml-module-chip svg { color: var(--ink-faint); transition: color 0.3s var(--ease); }
.aml-module-chip:hover { border-color: var(--accent); }
.aml-module-chip.is-on { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }
.aml-module-chip.is-on svg { color: #fff; }
.aml-module-progress { display: flex; align-items: center; gap: 16px; margin-top: 28px; }
.aml-module-track { flex: 1; height: 4px; border-radius: 999px; background: var(--bg-alt); overflow: hidden; }
.aml-module-fill { display: block; height: 100%; width: 50%; border-radius: 999px; background: var(--accent); transition: width 0.4s var(--ease); }
.aml-module-count { font-size: 14px; font-weight: 700; color: var(--navy); white-space: nowrap; }
.aml-deploy-switch { display: inline-flex; gap: 4px; padding: 4px; border: 1px solid var(--border); border-radius: 999px; margin-bottom: 24px; }
.aml-deploy-option {
	padding: 8px 16px; border: 0; border-radius: 999px; background: transparent;
	font: inherit; font-size: 14px; font-weight: 500; color: var(--ink-soft); cursor: pointer;
	transition: background 0.3s var(--ease), color 0.3s var(--ease);
}
.aml-deploy-option.is-active { background: var(--accent); color: #fff; font-weight: 600; }
.aml-deploy-panel { display: none; }
.aml-deploy-panel.is-active { display: block; animation: panelIn 0.4s var(--ease); }
.aml-deploy-panel p { color: var(--ink-soft); margin: 0 0 22px; }
.aml-deploy-panel ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
.aml-deploy-panel li { display: flex; align-items: center; gap: 14px; font-size: 14.5px; color: var(--ink); }
.aml-deploy-panel li::before { content: ''; flex: none; width: 22px; height: 1.5px; background: var(--accent); }

/* ---------- Suspicious Activity Monitoring ---------- */
/* Suspicious Activity Monitoring's six modules -- a real vertical tab
   list on the reference (click a module, its own tag/description/points
   swap in), reusing .tabs-v-layout/.tab-v/.tab-v-panel as-is (same
   component EFRM's Fraud Coverage tabs use) rather than one fixed panel
   next to a plain, unclickable list of the other five module names. */
.aml-sam-panel h3 { font-size: 1.5rem; margin-bottom: 6px; }
.aml-sam-tag { font-family: var(--font-mono); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent); margin-bottom: 14px; }
.aml-sam-panel > p:not(.aml-sam-tag) { color: var(--ink-soft); margin-bottom: 24px; max-width: 720px; }
.aml-sam-points { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; margin-bottom: 24px; }
.aml-sam-point {
	display: flex; align-items: flex-start; gap: 10px;
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
	padding: 14px 16px; font-size: 13.5px; color: var(--ink);
}
.aml-sam-point svg { flex: none; color: var(--accent); margin-top: 1px; }
.aml-inline-link { font-weight: 600; color: var(--accent); font-size: 14.5px; transition: color 0.4s var(--ease); }
.aml-inline-link:hover { color: var(--accent-600); }

/* ---------- GenAI 6-capability grid ---------- */
.aml-genai-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; }
.aml-genai-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.aml-genai-tag {
	display: inline-block; padding: 4px 10px; border-radius: 999px;
	background: var(--accent-100); color: var(--accent); font-size: 11px; font-weight: 700;
	text-transform: uppercase; letter-spacing: 0.04em;
}
.aml-genai-n { font-family: var(--font-numeric); font-size: 13px; color: var(--ink-faint); }
.aml-genai-card h3 { font-size: 1.1rem; margin-bottom: 8px; transition: color 0.5s var(--ease); }
.aml-genai-card p { font-size: 14px; color: var(--ink-soft); margin: 0; transition: color 0.5s var(--ease); }
.aml-genai-tag, .aml-genai-n { transition: background 0.5s var(--ease), color 0.5s var(--ease); }
/* Reference fills these specific cards solid accent on hover (not just the
   shared .outcome-card lift/shadow they already get) -- tag/number/title/
   body all invert to a light tone against the accent fill. */
.aml-genai-card { transition: background 0.5s var(--ease), border-color 0.5s var(--ease); }
.aml-genai-card:hover { background: var(--accent); border-color: var(--accent); }
.aml-genai-card:hover .aml-genai-tag { background: rgba(255,255,255,0.15); color: #fff; }
.aml-genai-card:hover .aml-genai-n { color: rgba(255,255,255,0.4); }
.aml-genai-card:hover h3 { color: #fff; }
.aml-genai-card:hover p { color: rgba(255,255,255,0.85); }

/* ---------- comparison tabs ---------- */
/* AML Development Changes-5Oct.pdf: "This section not matching as per the
   design" -- nine numbered chip tabs over one Traditional-vs-Clari5 panel
   with an "01 / 9" progress bar, replacing the static 9-row table. Wired
   by initAmlCompareTabs() in main.js. */
.aml-compare-chips { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 40px; }
.aml-compare-chip {
	display: inline-flex; align-items: center; gap: 8px; padding: 10px 15px;
	border: 1px solid var(--border); border-radius: 999px; background: var(--surface);
	font: inherit; font-size: 14px; font-weight: 600; color: var(--navy); cursor: pointer;
	transition: background 0.3s var(--ease), color 0.3s var(--ease), border-color 0.3s var(--ease);
}
.aml-compare-chip:hover { border-color: var(--accent); }
.aml-compare-chip-n { font-size: 11px; font-weight: 600; color: var(--ink-faint); }
.aml-compare-chip.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }
.aml-compare-chip.is-active .aml-compare-chip-n { color: rgba(255, 255, 255, 0.75); }
.aml-compare-card { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 36px; }
.aml-compare-panel { display: none; }
.aml-compare-panel.is-active { display: block; animation: panelIn 0.4s var(--ease); }
.aml-compare-panel-head { display: flex; align-items: center; gap: 16px; margin-bottom: 32px; }
.aml-compare-panel-icon {
	display: inline-flex; align-items: center; justify-content: center; flex: none;
	width: 44px; height: 44px; border-radius: 12px; background: var(--accent); color: #fff;
}
.aml-compare-tag { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.16em; color: var(--ink-soft); margin: 0 0 2px; }
.aml-compare-panel-head h3 { font-size: 1.6rem; margin: 0; }
.aml-compare-sides { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.aml-compare-side { border-radius: var(--radius-md); padding: 28px 24px; }
.aml-compare-side.is-legacy { background: var(--bg-alt); border: 1px solid var(--border); }
.aml-compare-side.is-clari5 { background: var(--accent); color: #fff; }
.aml-compare-side-tag { display: flex; align-items: center; gap: 10px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--ink-soft); margin: 0 0 18px; }
.aml-compare-side.is-clari5 .aml-compare-side-tag { color: rgba(255, 255, 255, 0.85); }
.aml-compare-side-text { margin: 0; font-size: 15px; color: var(--ink-soft); }
.aml-compare-side.is-clari5 .aml-compare-side-text { font-size: 17px; font-weight: 700; color: #fff; }
.aml-compare-progress { display: flex; align-items: center; gap: 14px; margin-top: 32px; padding-top: 28px; border-top: 1px solid var(--border); }
.aml-compare-track { flex: 1; height: 3px; border-radius: 999px; background: var(--bg-alt); overflow: hidden; }
.aml-compare-fill { display: block; height: 100%; background: var(--accent); border-radius: 999px; transition: width 0.4s var(--ease); }
.aml-compare-count { font-size: 13px; font-weight: 700; color: var(--navy); }

/* ---------- customer stories ---------- */
.aml-stories-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.aml-story-card {
	display: flex; flex-direction: column;
	background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg);
	overflow: hidden; transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}
.aml-story-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); border-color: rgba(var(--accent-rgb), 0.3); }
.aml-story-media { display: block; aspect-ratio: 16 / 10; background: linear-gradient(135deg, var(--navy), var(--accent)); overflow: hidden; position: relative; }
/* Real photo, when one's set (clari5_case_study_thumb_id()) -- covers the
   gradient placeholder above instead of sitting inside it at intrinsic
   size. Philippine Veterans Bank's only real source image is a wordmark
   logo, not a photo (see clari5_case_study_thumb_id()'s own use), so
   object-fit: contain with the gradient still showing through as a
   background reads better there than a hard cover-crop would. */
.aml-story-media img { display: block; width: 100%; height: 100%; object-fit: contain; background: linear-gradient(135deg, var(--navy), var(--accent)); }
.aml-story-body { padding: 22px 24px; }
.aml-story-body h3 { font-size: 1.15rem; margin-bottom: 10px; }
.aml-story-body p { font-size: 13.5px; color: var(--ink-soft); margin-bottom: 10px; }
.aml-story-body .post-card-cta { margin-top: 6px; display: inline-block; }

/* ---------- explore-platform teaser ---------- */
.aml-explore-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; }
/* EFRM Page Development Changes-30Sept.pdf: "Animation and grey background
   in the boxes missing" (the AML Suite / FRAML pair) -- checked against
   the live clari5-flow-vision.lovable.app reference directly: it's the
   same translucent "glass" card as the problem cards above (backdrop
   blur + ~6% dark tint + hover-lift), not a flat grey fill. The
   reveal-in stagger is explicit here (rather than relying only on
   main.js's whole-page reveal index) so these two visibly animate in
   one after another regardless of where they land in that sequence. */
.aml-explore-card {
	background: rgba(14, 26, 50, 0.05);
	backdrop-filter: blur(18px);
	-webkit-backdrop-filter: blur(18px);
	border: 1px solid rgba(14, 26, 50, 0.1);
	border-radius: var(--radius-lg);
	padding: 30px;
	transition: transform 0.4s var(--ease), box-shadow 0.4s var(--ease);
}
/* Same measured hover behaviour as .aml-problem above: a full
   background/text color-swap to solid accent-blue, not just a lift. */
.aml-explore-card:hover {
	transform: translateY(-6px) scale(1.01);
	background: var(--accent);
	border-color: rgba(var(--accent-rgb), 0.35);
	box-shadow: 0 22px 60px -26px rgba(var(--accent-rgb), 0.6);
}
.aml-explore-card:hover h3,
.aml-explore-card:hover .aml-inline-link { color: #fff; }
.aml-explore-card:hover p { color: rgba(255, 255, 255, 0.85); }
.aml-explore-card h3 { margin: 0 0 10px; transition: color 0.4s var(--ease); }
.aml-explore-card p { color: var(--ink-soft); font-size: 14.5px; margin-bottom: 16px; transition: color 0.4s var(--ease); }
.aml-explore-grid .aml-explore-card:nth-child(1) { transition-delay: 0.1s !important; }
.aml-explore-grid .aml-explore-card:nth-child(2) { transition-delay: 0.3s !important; }

@media (max-width: 960px) {
	.aml-hero-grid { grid-template-columns: 1fr; }
	/* width: 100% needed alongside the auto side-margins -- see the
	   matching .genie-hero-visual rule's comment below for why (auto
	   inline-margins without an explicit width silently disable grid
	   "stretch" sizing, shrinking any aspect-ratio content inside to a
	   fit-content guess instead of the column's real width). */
	.aml-hero-visual { width: 100%; max-width: 460px; margin: 0 auto; }
	.aml-problem-grid,
	.aml-genai-grid,
	.aml-explore-grid,
	.aml-stories-grid { grid-template-columns: 1fr; }
	.aml-sam-points { grid-template-columns: 1fr; }
	.aml-build-grid,
	.aml-compare-sides { grid-template-columns: 1fr; gap: 16px; }
	.aml-build-col { padding-right: 0; }
	.aml-build-col + .aml-build-col { padding: 32px 0 0; border-left: 0; border-top: 1px solid var(--border); margin-top: 16px; }
	.aml-compare-card { padding: 24px 20px; }
	.aml-compare-chip { font-size: 13.5px; padding: 8px 14px; }
	/* nine chips stacked into a tall column on phones -- one swipeable row instead */
	.aml-compare-chips { flex-wrap: nowrap; overflow-x: auto; margin: 0 -20px 28px; padding: 0 20px 6px; scrollbar-width: none; }
	.aml-compare-chips::-webkit-scrollbar { display: none; }
	.aml-compare-chip { flex: none; }
	/* Missing stacking rule -- .aml-force's 2-col grid (fixed 48px gap)
	   never collapsed to 1 column below desktop, so its content pushed
	   the whole page wider than the viewport (mobile-optimization pass,
	   Sept 2026). .aml-force-reverse's order swap is harmless once
	   there's only one column left to order. */
	.aml-force { grid-template-columns: 1fr; gap: 24px; }
}
@media (max-width: 560px) {
	.aml-stats-row { gap: 28px; }
	.aml-hero-ctas { flex-direction: column; align-items: stretch; }
	.aml-hero-chip { position: static; margin-top: 12px; animation: none; }
	/* .btn is nowrap by design (site-wide pill shape), but the EFRM cta-band's
	   "Request a 20-minute Fraud Assessment" is long enough that nowrap ran
	   the text past the card's own overflow:hidden edge on phones, visibly
	   clipping it (Sept 2026 site-modifications thread: "buttons are getting
	   cut", mobile only). Letting text wrap only inside these CTA rows keeps
	   every other pill button on the site untouched. */
	.aml-hero-ctas .btn,
	.cta-band-inner .btn,
	.pd2-cta .btn { white-space: normal; text-align: center; line-height: 1.3; }
	.cta-band-inner { padding: 48px 24px; }
}

/* ==========================================================================
   EFRM page -- built to clarity-voyage-net.lovable.app/enterprise-fraud-
   management (functions.php's clari5_maybe_render_efrm_page()). Reuses the
   AML page's own section/card primitives (.aml-hero*, .aml-problem*,
   .aml-genai-grid/-card, .aml-stats-row, .aml-story-card, .aml-explore-card)
   plus the homepage's existing .efrm-console mockup -- the rules below are
   only what's actually new to this page: the "one attack" timeline panel,
   the 7-stage pipeline stepper, capability icon chips and the proof badges.
   ========================================================================== */
.efrm-problem-grid { grid-template-columns: repeat(3, 1fr); }

/* ---------- "Why Clari5" 6-card grid --------------------------------------
   Rebuilt to match clarity-voyage-net.lovable.app/enterprise-fraud-management
   exactly (client request, Sept 2026) -- was the generic bordered
   .outcome-card/.aml-genai-card treatment (small number badge, no icon,
   visible box border on every card); the reference instead uses a plain
   3x2 table-like grid (thin dividers between cells, no per-card border/
   box-shadow), a large faint ghost number top-right of each cell, a small
   stroke icon top-left, and a thin blue left-edge accent that only
   appears on :hover. */
.efrm-why-grid { display: grid; grid-template-columns: repeat(3, 1fr); border-top: 1px solid var(--border); }
.efrm-why-card {
	position: relative;
	padding: 32px 28px 28px;
	overflow: hidden;
	border-top: 1px solid var(--border);
	border-left: 1px solid var(--border);
}
.efrm-why-card:nth-child(3n+1) { border-left: none; }
.efrm-why-card:nth-child(-n+3) { border-top: none; }
/* The hover accent -- a separate 2px bar layered on the same edge as the
   divider above (not a recolor of it), so it shows up on every card
   including the first column, which has no divider border to recolor. */
/* Reference animates this edge as a vertical scale-grow from the top
   (transform: scaleY(0) -> scaleY(1)), not a color fade -- matched exactly
   rather than approximated with opacity. */
.efrm-why-card::before {
	content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 2px;
	background: var(--accent); transform: scaleY(0); transform-origin: top;
	transition: transform 0.7s var(--ease);
}
.efrm-why-card:hover::before { transform: scaleY(1); }
.efrm-why-n {
	position: absolute; top: 28px; right: 24px; z-index: 0;
	font-family: var(--font-numeric); font-weight: 700; font-size: 3rem; line-height: 1;
	color: rgba(var(--accent-rgb), 0.12);
	transition: color 0.7s var(--ease);
}
.efrm-why-card:hover .efrm-why-n { color: rgba(var(--accent-rgb), 0.15); }
.efrm-why-icon { display: inline-flex; color: var(--accent); margin-bottom: 16px; position: relative; z-index: 1; }
.efrm-why-card h3 { font-size: 1.15rem; margin: 0 0 10px; position: relative; z-index: 1; }
.efrm-why-card p { font-size: 14px; color: var(--ink-soft); margin: 0; position: relative; z-index: 1; }
@media (max-width: 900px) {
	.efrm-why-grid { grid-template-columns: 1fr 1fr; }
	.efrm-why-card { border-left: 1px solid var(--border) !important; border-top: 1px solid var(--border) !important; }
	.efrm-why-card:nth-child(odd) { border-left: none !important; }
	.efrm-why-card:nth-child(-n+2) { border-top: none !important; }
}
@media (max-width: 640px) {
	.efrm-why-grid { grid-template-columns: 1fr; }
	.efrm-why-card { border-left: none !important; }
	.efrm-why-card:first-child { border-top: none !important; }
}

/* ---------- "one attack, four signals" timeline ---------- */
.efrm-attack-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: center; }
.efrm-attack-panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 28px; box-shadow: var(--shadow-sm); transition: transform 0.35s var(--ease), box-shadow 0.35s var(--ease); }
/* Measured against the live reference: hovering the whole panel lifts
   it 4px with a blue-tinted glow shadow -- no scale/zoom despite how
   that glow can read visually, same shadow recipe as .btn-primary:hover
   elsewhere on this site. */
.efrm-attack-panel:hover { transform: translateY(-4px); box-shadow: 0 18px 46px -20px rgba(var(--accent-rgb), 0.55); }
.efrm-attack-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 18px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-faint); }
.efrm-live-pill { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border: 1px solid var(--border); border-radius: 999px; color: #E5484D; }
.efrm-live-dot { width: 6px; height: 6px; border-radius: 50%; background: #E5484D; animation: clari5-breathe 1.4s ease-in-out infinite; }
.efrm-attack-list { display: flex; flex-direction: column; }
.efrm-attack-row { display: flex; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--border); }
.efrm-attack-row:last-child { border-bottom: 0; }
.efrm-attack-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; margin-top: 6px; }
/* Measured against the live reference: each row's own status dot has a
   continuous pulsing ring ("animate-node-pulse" in its markup) -- not
   just the top "LIVE" pill's dot (.efrm-live-dot, already pulsing via
   clari5-breathe). Staggered per row so they don't all pulse in lockstep. */
.efrm-attack-row-watch .efrm-attack-dot { background: #E5484D; animation: clari5-node-pulse-red 1.8s ease-out infinite; }
.efrm-attack-row-block .efrm-attack-dot { background: var(--accent); animation: clari5-node-pulse-blue 1.8s ease-out infinite; }
.efrm-attack-row:nth-child(1) .efrm-attack-dot { animation-delay: 0s; }
.efrm-attack-row:nth-child(2) .efrm-attack-dot { animation-delay: 0.35s; }
.efrm-attack-row:nth-child(3) .efrm-attack-dot { animation-delay: 0.7s; }
.efrm-attack-row:nth-child(4) .efrm-attack-dot { animation-delay: 1.05s; }
@keyframes clari5-node-pulse-red {
	0% { box-shadow: 0 0 0 0 rgba(229, 72, 77, 0.5); }
	70% { box-shadow: 0 0 0 8px rgba(229, 72, 77, 0); }
	100% { box-shadow: 0 0 0 0 rgba(229, 72, 77, 0); }
}
@keyframes clari5-node-pulse-blue {
	0% { box-shadow: 0 0 0 0 rgba(var(--accent-rgb), 0.5); }
	70% { box-shadow: 0 0 0 8px rgba(var(--accent-rgb), 0); }
	100% { box-shadow: 0 0 0 0 rgba(var(--accent-rgb), 0); }
}
@media (prefers-reduced-motion: reduce) {
	.efrm-attack-row-watch .efrm-attack-dot,
	.efrm-attack-row-block .efrm-attack-dot { animation: none; }
}
.efrm-attack-meta { display: flex; align-items: center; gap: 10px; margin-bottom: 3px; }
.efrm-attack-time { font-family: var(--font-mono); font-size: 11px; color: var(--ink-faint); }
/* Reference uses a solid filled pill (dark navy/white text), not this
   light accent-tinted one -- confirmed against a screenshot of the
   live reference. */
.efrm-attack-tag { display: inline-block; padding: 2px 9px; border-radius: 999px; background: var(--navy); color: #fff; font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; }
.efrm-attack-title { font-size: 14px; font-weight: 600; color: var(--navy); margin: 0; }
.efrm-attack-note { font-size: 11.5px; margin: 2px 0 0; }
.efrm-attack-row-watch .efrm-attack-note { color: #E5484D; text-transform: uppercase; letter-spacing: 0.03em; }
.efrm-attack-row-block .efrm-attack-note { color: var(--accent); text-transform: uppercase; letter-spacing: 0.03em; }
.efrm-attack-verdict {
	display: flex; align-items: center; gap: 10px; margin-top: 18px; padding: 14px 16px;
	background: var(--bg-alt); border: 1px solid var(--border); border-radius: var(--radius-md);
	font-size: 13.5px; color: var(--ink); font-weight: 500;
}
.efrm-attack-verdict svg { flex: none; color: var(--accent); }
.efrm-decision-pill { display: inline-block; margin-top: 16px; padding: 9px 18px; border-radius: 999px; font-weight: 700; font-size: 13px; letter-spacing: 0.03em; }
.efrm-decision-block { background: #E5484D; color: #fff; }
/* EFRM Page Development Changes-30Sept.pdf: "Make the font size of the
   heading and sub content of the right side content bigger so that it
   covers the blank space." */
.efrm-attack-text h2 { margin: 14px 0 18px; font-size: clamp(1.7rem, 3.2vw, 3rem); }
.efrm-attack-text p { color: var(--ink-soft); margin-bottom: 16px; font-size: 16.5px; line-height: 1.6; }

/* "Animation on left card missing" -- the live-feed rows now populate
   one at a time (matching the "Live" pill) instead of appearing all at
   once; .efrm-attack-panel already carries .reveal, so this piggybacks
   on the same IntersectionObserver .in-view toggle (initScrollReveal(),
   main.js) instead of adding a second observer. */
.efrm-attack-row { opacity: 0; transform: translateY(10px); }
.efrm-attack-panel.in-view .efrm-attack-row {
	animation: clari5-attack-row-in 0.5s var(--ease) forwards;
}
.efrm-attack-panel.in-view .efrm-attack-row:nth-child(1) { animation-delay: 0.15s; }
.efrm-attack-panel.in-view .efrm-attack-row:nth-child(2) { animation-delay: 0.4s; }
.efrm-attack-panel.in-view .efrm-attack-row:nth-child(3) { animation-delay: 0.65s; }
.efrm-attack-panel.in-view .efrm-attack-row:nth-child(4) { animation-delay: 0.9s; }
.efrm-attack-panel.in-view .efrm-attack-verdict,
.efrm-attack-panel.in-view .efrm-decision-pill { opacity: 0; animation: clari5-attack-row-in 0.5s var(--ease) forwards; animation-delay: 1.15s; }
@keyframes clari5-attack-row-in { to { opacity: 1; transform: translateY(0); } }
@media (prefers-reduced-motion: reduce) {
	.efrm-attack-row, .efrm-attack-panel.in-view .efrm-attack-verdict, .efrm-attack-panel.in-view .efrm-decision-pill { opacity: 1; transform: none; animation: none; }
}

/* ==========================================================================
   Voice Analytics / "Maestro" page (clari5_maybe_render_voice_analytics_page(),
   functions.php) -- built from Maestro Changes-22Sept.pdf's own review
   markup. Reuses .aml-hero/.aml-section/.cta-band etc. for the page
   rhythm; these are just the page's own three components (hero point
   list, six-pillar list, capability table, use-case list).
   ========================================================================== */
/* Oct 2026 rebuild against the reference (clari5-flow-vision.lovable.app/
   maestro-voice-analytics): hero, problem, stages, use cases, benefits and
   FAQ reuse the Genie/AML components (.genie-hero-grid, .genie-problem,
   .genie-mode, .genie-wf-tabs, .accordion); the rules below are only the
   pieces unique to this page. */

/* Hero visual -- the reference's audio card: mic + live waveform, a
   player bar and a transcript bubble, built in CSS (no image needed). */
.mvp-voice-card { padding: 34px 32px 30px; display: grid; gap: 22px; }
.mvp-voice-wave { display: flex; align-items: center; gap: 18px; }
.mvp-voice-mic {
	flex: none; display: inline-flex; align-items: center; justify-content: center;
	width: 52px; height: 52px; border-radius: 50%; background: var(--accent-100); color: var(--accent);
}
.mvp-voice-bars { flex: 1; display: flex; align-items: center; justify-content: space-between; height: 96px; }
.mvp-voice-bars span {
	display: block; width: 4px; border-radius: 4px; background: var(--accent); opacity: 0.85;
	animation: mvp-wave 1.6s ease-in-out infinite alternate; transform-origin: center;
}
.mvp-voice-bars span:nth-child(3n) { opacity: 0.45; }
@keyframes mvp-wave { from { transform: scaleY(0.45); } to { transform: scaleY(1); } }
.mvp-voice-player {
	display: flex; align-items: center; gap: 16px; padding: 12px 16px;
	border: 1px solid var(--border); border-radius: 999px; background: var(--surface); color: var(--accent);
}
.mvp-voice-play {
	flex: none; display: inline-flex; align-items: center; justify-content: center;
	width: 34px; height: 34px; border-radius: 50%; background: var(--accent); color: #fff;
}
.mvp-voice-track { flex: 1; height: 4px; border-radius: 999px; background: var(--bg-alt); position: relative; }
.mvp-voice-track span { position: absolute; inset: 0 48% 0 0; border-radius: 999px; background: var(--accent); }
.mvp-voice-track span::after {
	content: ''; position: absolute; right: -6px; top: 50%; width: 12px; height: 12px; margin-top: -6px;
	border-radius: 50%; background: var(--accent);
}
.mvp-voice-transcript {
	justify-self: center; width: 70%; display: grid; gap: 8px; padding: 18px 20px;
	border-radius: 16px; background: var(--accent-100);
}
.mvp-voice-transcript span { height: 6px; border-radius: 999px; background: rgba(var(--accent-rgb), 0.35); }
.mvp-voice-transcript span:nth-child(2) { width: 82%; }
.mvp-voice-transcript span:nth-child(3) { width: 48%; }
@media (prefers-reduced-motion: reduce) { .mvp-voice-bars span { animation: none; } }

/* Problem -- the four points as one bordered list beside the copy. */
.mvp-problem-list { list-style: none; margin: 0; padding: 0; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); overflow: hidden; }
.mvp-problem-list li { display: flex; gap: 16px; padding: 22px 24px; border-bottom: 1px solid var(--border); font-size: 15px; color: var(--navy); line-height: 1.55; }
.mvp-problem-list li:last-child { border-bottom: 0; }
.mvp-problem-n { flex: none; font-family: var(--font-numeric); font-weight: 700; color: var(--accent); }

/* Eight stages -- a 4 x 2 grid of the Genie operating-mode blocks. */
.mvp-stage-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 32px 32px; }
.mvp-stage h3 { font-size: 1.15rem; }
.mvp-stage p { font-size: 14.5px; }
/* Reference draws a line across the top border on hover (width 0 -> 100%)
   instead of just recoloring it, and lifts the stage icon slightly. */
.mvp-stage { position: relative; }
.mvp-stage::before {
	content: ''; position: absolute; left: 0; top: -1px; height: 2px; width: 0;
	background: var(--accent); transition: width 0.7s var(--ease);
}
.mvp-stage:hover::before { width: 100%; }
.mvp-stage .genie-mode-head svg { transition: transform 0.5s var(--ease); }
.mvp-stage:hover .genie-mode-head svg { transform: translateY(-4px); }

/* Six pillars -- full-width numbered rows: big faded number, icon, title,
   description and a small waveform glyph, divided by hairlines. */
.mvp-pillar-rows { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--border); }
.mvp-pillar-rows li {
	position: relative; overflow: hidden;
	display: grid; grid-template-columns: 110px 64px minmax(0, 1fr) minmax(0, 1.2fr) 70px; align-items: center; gap: 24px;
	padding: 34px 0; border-bottom: 1px solid var(--border);
	transition: border-color 0.5s var(--ease);
}
.mvp-pillar-rows li:hover { border-bottom-color: rgba(var(--accent-rgb), 0.4); }
/* Reference wipes a faint fill in from the left on hover, behind everything. */
.mvp-pillar-rows li::before {
	content: ''; position: absolute; inset: 0 0 1px 0; width: 0;
	background: var(--accent-100); transition: width 0.7s var(--ease); z-index: 0;
}
.mvp-pillar-rows li:hover::before { width: 100%; }
.mvp-pillar-rows li > * { position: relative; z-index: 1; }
.mvp-pillar-rows-n { font-family: var(--font-numeric); font-weight: 700; font-size: 3.2rem; line-height: 1; color: rgba(var(--accent-rgb), 0.18); transition: color 0.5s var(--ease), transform 0.5s var(--ease); }
.mvp-pillar-rows li:hover .mvp-pillar-rows-n { color: var(--accent); transform: translateX(4px); }
.mvp-pillar-rows-icon { color: var(--accent); display: inline-flex; transition: transform 0.5s var(--ease); }
.mvp-pillar-rows li:hover .mvp-pillar-rows-icon { transform: translateY(-3px) scale(1.1); }
.mvp-pillar-rows h3 { margin: 0; font-size: 1.45rem; line-height: 1.3; transition: color 0.5s var(--ease); }
.mvp-pillar-rows li:hover h3 { color: var(--accent); }
.mvp-pillar-rows p { margin: 0; color: var(--ink-soft); }
.mvp-pillar-rows-wave { display: flex; align-items: flex-end; gap: 4px; height: 40px; justify-content: flex-end; }
.mvp-pillar-rows-wave span { width: 3px; border-radius: 3px; background: rgba(var(--accent-rgb), 0.25); height: var(--bar); transition: height 0.7s var(--ease), background 0.7s var(--ease); }
.mvp-pillar-rows li:hover .mvp-pillar-rows-wave span { height: var(--bar-tall); background: var(--accent); }

.mvp-capability-table { border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; background: var(--surface); }
.mvp-capability-row { display: grid; grid-template-columns: 1fr 1.2fr 1.4fr; gap: 20px; padding: 16px 24px; border-bottom: 1px solid var(--border); align-items: center; }
.mvp-capability-row:last-child { border-bottom: 0; }
.mvp-capability-head { background: var(--bg-alt); font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-faint); }
.mvp-capability-head .is-accent { color: var(--accent); }
.mvp-capability-cap { font-weight: 700; color: var(--navy); font-size: 14.5px; }
.mvp-capability-does { font-size: 13.5px; color: var(--ink-faint); }
.mvp-capability-matters { font-size: 13.5px; color: var(--accent); font-weight: 600; }
/* "Not matching as per the design" -- the reference tints each row on
   hover; ours was static. */
.mvp-capability-row:not(.mvp-capability-head) { transition: background 0.3s var(--ease); }
.mvp-capability-row:not(.mvp-capability-head):hover { background: var(--accent-100); }
/* AML Insurance "What regulators require" table, rebuilt to the reference:
   narrower, three equal columns, tracked uppercase header, roomier rows,
   struck-through legacy values and check-marked Clari5 values. */
.ins-compare-table { max-width: 1024px; margin: 0 auto; border-radius: 24px; }
.ins-compare-table .mvp-capability-row { grid-template-columns: repeat(3, 1fr); gap: 16px; padding: 20px 24px; }
.ins-compare-table .mvp-capability-head { padding: 16px 24px; font-family: var(--font-body); font-size: 11px; font-weight: 600; letter-spacing: 0.2em; color: var(--ink-soft); }
.ins-compare-table .mvp-capability-cap { font-weight: 500; font-size: 16px; }
.ins-compare-table .mvp-capability-does { font-size: 14px; color: var(--ink-soft); }
.ins-compare-table .mvp-capability-does s { text-decoration-color: rgba(100, 116, 139, 0.45); }
.ins-compare-table .mvp-capability-matters { display: flex; align-items: center; gap: 8px; font-size: 14px; }
.ins-compare-table .mvp-capability-matters svg { flex: none; stroke-width: 2.2; }
@media (max-width: 640px) {
	.ins-compare-table .mvp-capability-row { grid-template-columns: 1fr; gap: 6px; }
	.ins-compare-table .mvp-capability-head { display: none; }
}

/* "Key capabilities" icon-card grid (Voice Analytics) -- the reference
   renders these as cards with a continuously-pulsing waveform glyph, an
   icon badge, and a "Why it matters" sub-panel that fills solid accent on
   hover, not a 3-column table (checked the live reference directly after
   the table version didn't match). First card is a permanently-highlighted
   "featured" variant. */
.mvp-cap-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
.mvp-cap-card {
	position: relative; overflow: hidden; display: flex; flex-direction: column;
	border: 1px solid var(--border); border-radius: 22px; background: var(--surface);
	padding: 26px; min-height: 230px;
	transition: transform 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease);
}
.mvp-cap-card:hover { transform: translateY(-5px); border-color: rgba(var(--accent-rgb), 0.4); box-shadow: 0 20px 44px -22px rgba(var(--accent-rgb), 0.45); }
.mvp-cap-pulse { position: absolute; top: 22px; right: 22px; display: flex; align-items: flex-end; gap: 3px; height: 40px; opacity: 0.4; transition: opacity 0.5s var(--ease); }
.mvp-cap-card:hover .mvp-cap-pulse { opacity: 1; }
.mvp-cap-pulse span { width: 3px; border-radius: 2px; background: var(--accent); transform-origin: bottom; animation: clari5-eq-bounce 1.6s ease-in-out infinite; }
@keyframes clari5-eq-bounce {
	0%, 100% { transform: scaleY(0.55); }
	50% { transform: scaleY(1); }
}
.mvp-cap-head { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; }
.mvp-cap-icon { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border-radius: 14px; background: var(--accent-100); color: var(--accent); transition: transform 0.5s var(--ease); }
.mvp-cap-card:hover .mvp-cap-icon { transform: scale(1.1); }
.mvp-cap-n { font-family: var(--font-numeric); font-size: 13px; font-weight: 700; color: var(--accent); }
.mvp-cap-card h3 { font-size: 1.1rem; margin: 0 0 8px; max-width: 85%; }
.mvp-cap-card p { font-size: 13.5px; color: var(--ink-soft); margin: 0; }
.mvp-cap-matters { margin-top: auto; padding-top: 18px; }
.mvp-cap-matters > div { background: var(--bg-alt); border-radius: 14px; padding: 12px 16px; transition: background 0.5s var(--ease); }
.mvp-cap-card:hover .mvp-cap-matters > div { background: var(--accent); }
.mvp-cap-matters-label, .mvp-cap-matters-text { position: relative; z-index: 1; margin: 0; }
/* Prefixed with .mvp-cap-card so these beat the generic ".mvp-cap-card p"
   rule above on specificity (two classes vs one class + one type) --
   without it, that rule was winning and both ended up the same size. */
.mvp-cap-card .mvp-cap-matters-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--ink-faint); transition: color 0.5s var(--ease); }
.mvp-cap-card .mvp-cap-matters-text { font-size: 13.5px; font-weight: 600; color: var(--navy); margin-top: 4px; transition: color 0.5s var(--ease); }
.mvp-cap-card:hover .mvp-cap-matters-label { color: rgba(255,255,255,0.7); }
.mvp-cap-card:hover .mvp-cap-matters-text { color: #fff; }
/* First card ships permanently filled -- the reference's one "hero"
   highlight among the nine. */
.mvp-cap-card.is-featured { background: var(--accent); border-color: var(--accent); }
.mvp-cap-card.is-featured .mvp-cap-icon { background: rgba(255,255,255,0.15); color: #fff; }
.mvp-cap-card.is-featured .mvp-cap-n { color: rgba(255,255,255,0.7); }
.mvp-cap-card.is-featured h3,
.mvp-cap-card.is-featured p { color: #fff; }
.mvp-cap-card.is-featured .mvp-cap-matters > div { background: rgba(255,255,255,0.12); }
.mvp-cap-card.is-featured .mvp-cap-matters-label { color: rgba(255,255,255,0.65); }
.mvp-cap-card.is-featured .mvp-cap-matters-text { color: #fff; }
.mvp-cap-card.is-featured .mvp-cap-pulse { opacity: 0.7; }
.mvp-cap-card.is-featured .mvp-cap-pulse span { background: #fff; }
@media (max-width: 1100px) { .mvp-cap-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .mvp-cap-grid { grid-template-columns: 1fr; } }

/* Use cases -- Genie's workflow tabs, plus the UC number under the title
   and the "See it on your calls" link beside the result pill. */
.mvp-uc-n { margin: 4px 0 0; font-size: 11px; font-weight: 600; letter-spacing: 0.16em; color: var(--accent); }
.mvp-uc-foot { display: flex; flex-wrap: wrap; align-items: center; gap: 18px; }

/* Deployment -- copy and an On-premise / Managed services switch on the
   left, the selected mode's card on the right (initAmlDeploySwitch()). */
.mvp-deploy { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: start; }
.mvp-deploy-options { display: flex; flex-wrap: wrap; gap: 12px; }
.mvp-deploy-option.aml-deploy-option {
	display: inline-flex; align-items: center; gap: 8px; padding: 11px 20px;
	border: 1px solid var(--border); background: var(--surface); color: var(--ink-soft);
}
.mvp-deploy-option.aml-deploy-option.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }
.mvp-deploy-panel-card { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 36px; }
.mvp-deploy-panel-icon { display: inline-flex; color: var(--accent); margin-bottom: 18px; }
.mvp-deploy-panel-card h3 { font-size: 1.35rem; margin: 0 0 14px; }
.mvp-deploy-panel-card .aml-deploy-panel p { padding-bottom: 26px; margin-bottom: 26px; border-bottom: 1px solid var(--border); }
.mvp-deploy-badges-row { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 10px; }
.mvp-deploy-badges-row li {
	display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px;
	border: 1px solid var(--border); border-radius: 999px; font-size: 13px; font-weight: 500; color: var(--navy);
}
.mvp-deploy-badges-row svg { color: var(--accent); }

/* FAQ -- now a real accordion with the reference's answers; the number
   sits in front of each question. */
.mvp-faq-accordion .accordion-trigger > span:first-child { display: flex; gap: 14px; align-items: baseline; text-align: left; }
.mvp-faq-n { flex: none; font-family: var(--font-numeric); font-size: 12px; font-weight: 700; color: var(--accent); }

.mvp-explore-grid { grid-template-columns: repeat(3, 1fr); }
/* Reference: four stats in one even row under the hero, left-aligned. */
.mvp-hero .aml-stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 40px; }
.mvp-hero .aml-row-stat { text-align: left; align-items: flex-start; border-top: 0; padding-top: 0; }
.mvp-hero .aml-row-stat .stat-value { padding-top: 0; padding-bottom: 14px; margin-bottom: 14px; position: relative; }
.mvp-hero .aml-row-stat .stat-value::before { display: none; }
.mvp-hero .aml-row-stat .stat-value::after { content: ""; position: absolute; left: 0; bottom: 0; width: 32px; height: 2px; background: rgba(var(--accent-rgb), 0.5); }
/* 2-column like every other page's FAQ (New Website Changes-20Oct.pdf). */
/* Active use-case tab needs its own fill on a white section. */
.aml-section:not(.aml-section-alt) .genie-wf-tabs .tab-v.is-active { background: var(--bg-alt); }

@media (max-width: 1100px) {
	.mvp-stage-grid { grid-template-columns: repeat(2, 1fr); }
	.mvp-pillar-rows li { grid-template-columns: 70px 40px minmax(0, 1fr); }
	.mvp-pillar-rows p { grid-column: 3; }
	.mvp-pillar-rows-wave { display: none; }
}
@media (max-width: 960px) {
	.mvp-hero .aml-stats-row { grid-template-columns: repeat(2, 1fr); }
	.mvp-capability-row { grid-template-columns: 1fr; gap: 4px; }
	.mvp-deploy { grid-template-columns: 1fr; gap: 32px; }
	.mvp-explore-grid { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
	/* 4 stats were still stuck in a 2x2 grid on phone widths (only
	   stepped down 4->2 at 960px, never 2->1) -- long labels like
	   "Inbound calls high-risk for fraud" wrapped across 3 cramped
	   lines in a half-width column. Reference stacks one per row here. */
	.mvp-hero .aml-stats-row { grid-template-columns: 1fr; gap: 28px; }
	.mvp-stage-grid { grid-template-columns: 1fr; }
	.mvp-pillar-rows li { grid-template-columns: 52px minmax(0, 1fr); gap: 12px 16px; padding: 24px 0; }
	.mvp-pillar-rows-icon { display: none; }
	.mvp-pillar-rows h3, .mvp-pillar-rows p { grid-column: 2; }
	.mvp-pillar-rows-n { font-size: 2.2rem; grid-row: span 2; }
	.mvp-voice-card { padding: 22px 18px; }
	.mvp-deploy-panel-card { padding: 24px 20px; }
}

/* ---------- 7-stage pipeline stepper --------------------------------------
   Rebuilt to match clarity-voyage-net.lovable.app/enterprise-fraud-management
   exactly (client request, Sept 2026): auto-advances through the 7 stages
   every 4s (initEfrmStepper(), main.js) with a progress-fill line behind
   the circles, a 3-state circle per stage (future = gray outline, past =
   blue outline, current = solid blue fill -- was only ever 2-state
   active/inactive before), and an ALWAYS-visible Decision Actions panel
   on the right whose 7 pills map 1:1 to the 7 stages (was hardcoded to
   only render inside stage 04's own card). */
.efrm-stepper { display: flex; align-items: flex-start; justify-content: space-between; margin: 40px 0 8px; position: relative; }
.efrm-stepper::before { content: ''; position: absolute; top: 18px; left: 5%; right: 5%; height: 1px; background: var(--border); z-index: 0; }
/* Sits on top of the gray ::before line; initEfrmStepper() sets its width
   (in px, measured against the current active circle's center) every time
   the active stage changes, so it visually fills the line green^H^Hblue up
   to wherever the stepper currently is. */
.efrm-stepper-progress { position: absolute; top: 18px; left: 5%; height: 1px; background: var(--accent); z-index: 0; width: 0; transition: width 0.5s var(--ease); }
.efrm-stepper-item {
	display: flex; flex-direction: column; align-items: center; gap: 10px;
	position: relative; z-index: 1; flex: 1;
	background: none; border: 0; padding: 0; font: inherit; cursor: pointer;
}
.efrm-stepper-item:hover .efrm-stepper-circle { border-color: var(--accent); color: var(--accent); }
/* Past stages -- outlined blue, not filled (that's reserved for the
   current one only). */
.efrm-stepper-item.is-complete .efrm-stepper-circle { border-color: var(--accent); color: var(--accent); }
.efrm-stepper-item.is-active .efrm-stepper-circle { background: var(--accent); border-color: var(--accent); color: #fff; }
.efrm-stepper-item.is-active .efrm-stepper-label { color: var(--navy); }
.efrm-stepper-circle {
	width: 38px; height: 38px; border-radius: 50%; background: var(--surface); border: 2px solid var(--border);
	color: var(--ink-faint); font-family: var(--font-numeric); font-weight: 700; font-size: 13px;
	display: flex; align-items: center; justify-content: center;
	transition: background 0.25s var(--ease), border-color 0.25s var(--ease), color 0.25s var(--ease);
}
.efrm-stepper-label { font-size: 11.5px; font-weight: 600; color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.03em; text-align: center; transition: color 0.25s var(--ease); }

/* One card at a time (whichever stage is currently active), left column;
   Decision Actions panel, right column, always visible regardless of
   which stage is active. */
.efrm-stage-panel-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; margin-top: 40px; padding-top: 40px; border-top: 1px solid var(--border); align-items: start; }
.efrm-stage-grid { position: relative; }
.efrm-stage-card { display: none; }
.efrm-stage-card.is-active { display: block; animation: panelIn 0.4s var(--ease); }
.efrm-stage-head { display: flex; align-items: center; gap: 14px; margin-bottom: 18px; }
.efrm-stage-icon {
	display: flex; align-items: center; justify-content: center; flex: none;
	width: 52px; height: 52px; border-radius: var(--radius-md);
	background: var(--accent-100); color: var(--accent);
}
.efrm-stage-n { font-family: var(--font-numeric); font-weight: 700; font-size: 2.2rem; color: rgba(var(--accent-rgb), 0.25); }
.efrm-stage-card h3 { font-size: 1.6rem; margin: 0 0 10px; }
.efrm-stage-card p { color: var(--ink-soft); margin: 0 0 16px; }
.efrm-stage-of { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); }

.efrm-decision-label { font-family: var(--font-mono); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent); margin: 0 0 14px; }
.efrm-decision-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 20px; }
.efrm-decision-action {
	display: inline-flex; align-items: center; gap: 7px;
	padding: 9px 16px; border-radius: 999px; border: 1px solid var(--border); background: var(--surface);
	font-size: 13.5px; font-weight: 600; color: var(--ink-soft);
	transition: background 0.3s var(--ease), color 0.3s var(--ease), border-color 0.3s var(--ease);
}
.efrm-decision-dot { width: 6px; height: 6px; border-radius: 50%; background: rgba(var(--accent-rgb), 0.5); flex: none; transition: background 0.3s var(--ease); }
.efrm-decision-action.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }
.efrm-decision-action.is-active .efrm-decision-dot { background: #fff; }
.efrm-decision-note { font-size: 13.5px; color: var(--ink-soft); line-height: 1.6; margin: 0; }
@media (max-width: 760px) {
	.efrm-stage-panel-grid { grid-template-columns: 1fr; gap: 32px; }
}

/* ---------- capability cards (icon chip + numbered label) ---------- */
.efrm-capability-card { display: flex; flex-direction: column; }
.efrm-capability-icon {
	display: inline-flex; align-items: center; justify-content: center; flex: none;
	width: 42px; height: 42px; border-radius: var(--radius-sm); margin-bottom: 14px;
	background: var(--accent-100); color: var(--accent);
}
.efrm-capability-card .aml-genai-n { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); font-weight: 600; }
.efrm-capability-card h3 { margin: 6px 0 8px; font-size: 1.05rem; }

/* ---------- proof certification badges ---------- */
.efrm-badges { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-top: 40px; }
.efrm-badge-pill { padding: 9px 18px; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); font-size: 12px; font-weight: 700; letter-spacing: 0.03em; color: var(--ink-soft); transition: transform 0.5s var(--ease), border-color 0.5s var(--ease), color 0.5s var(--ease); }
.efrm-badge-pill:hover { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.4); color: var(--accent); }

@media (max-width: 960px) {
	.efrm-problem-grid { grid-template-columns: 1fr; }
	.efrm-attack-grid { grid-template-columns: 1fr; gap: 32px; }
	.efrm-stepper { flex-wrap: wrap; gap: 16px 0; }
	.efrm-stepper::before { display: none; }
	.efrm-stepper-item { flex: 0 0 25%; }
}
@media (max-width: 560px) {
	.efrm-stepper-item { flex: 0 0 33.33%; }
	.efrm-stepper-label { font-size: 10px; }
}

/* ==========================================================================
   AML "compliance imperative" tabs -- on the reference this is a real
   vertical tab list (left: four numbered tabs with a thin left border;
   right: a data panel that swaps per tab -- a legacy-vs-Clari5 stat, two
   comparison bars and a "Clari5 response" callout), not four static
   description cards. Reuses .tabs-v-layout/.tab-v/.tab-v-panel (already
   shipped, already wired via initVerticalTabs()) with page-specific
   overrides below instead of that component's own boxed-card chrome.
   ========================================================================== */
.aml-imperative-tabs.tabs-v-layout {
	grid-template-columns: 220px minmax(0, 1fr);
	gap: 40px;
	background: transparent; border: 0; box-shadow: none; padding: 0;
	margin-top: 40px;
	align-items: start;
}
.aml-imperative-tabs .tabs-v { border-right: 0; padding-right: 0; max-height: none; gap: 0; }
.aml-imperative-tabs .tab-v {
	align-items: flex-start; gap: 4px; padding: 16px 0 16px 22px;
	border-left: 2px solid var(--border); border-radius: 0; background: transparent;
}
.aml-imperative-tabs .tab-v:hover { background: transparent; }
.aml-imperative-tabs .tab-v.is-active { background: transparent; border-left-color: var(--accent); transform: none; }
.aml-imperative-tabs .tab-v-tag { color: var(--ink-faint); font-weight: 700; }
.aml-imperative-tabs .tab-v.is-active .tab-v-tag { color: var(--accent); }
.aml-imperative-tabs .tab-v-title { font-size: 1.15rem; font-weight: 600; color: var(--ink-faint); }
.aml-imperative-tabs .tab-v.is-active .tab-v-title { color: var(--navy); }
.aml-imperative-tabs .tabs-v-panels { padding: 0; min-height: 0; }

/* AML Development Changes-5Oct.pdf: "Put the content in 1 single rectangle
   box, so that the content in the box gets viewed in 1 single view. Make
   the width of the first column smaller" -- the stat sits beside the bars
   and the response beside the points (.aml-imp-top / .aml-imp-bottom), so
   the panel is half as tall and fits one screen next to a narrower tab
   column. */
.aml-imp-panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 28px 32px; }
.aml-imp-top { display: grid; grid-template-columns: 1fr 1fr; gap: 36px; align-items: end; padding-bottom: 22px; margin-bottom: 22px; border-bottom: 1px solid var(--border); }
.aml-imp-bottom { display: grid; grid-template-columns: 1fr 1fr; gap: 36px; align-items: start; }
.aml-imp-eyebrow { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-faint); margin: 0 0 10px; }
.aml-imp-gap { font-size: 14.5px; color: var(--ink-soft); margin: 0 0 16px; }
.aml-imp-stat { font-family: var(--font-numeric); font-size: clamp(2rem, 3vw, 2.6rem); font-weight: 700; color: var(--accent); line-height: 1.1; }
.aml-imp-stat-label { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); margin: 4px 0 0; }
.aml-imp-bars { padding-bottom: 6px; }
.aml-imp-bar-row { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 6px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-faint); }
.aml-imp-bar-row-clari5 { margin-top: 16px; color: var(--accent); }
.aml-imp-bar-track { height: 6px; border-radius: 999px; background: var(--bg-alt); overflow: hidden; }
.aml-imp-bar-fill { height: 100%; border-radius: 999px; }
.aml-imp-bar-legacy { background: var(--ink-faint); }
.aml-imp-bar-clari5 { background: var(--accent); }
.aml-imp-response { background: var(--accent-100); border: 1px solid rgba(var(--accent-rgb), 0.15); border-radius: var(--radius-md); padding: 18px 20px; }
.aml-imp-response-tag { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--accent); margin: 0 0 6px; }
.aml-imp-response-heading { font-size: 1.05rem; font-weight: 700; color: var(--navy); margin: 0; line-height: 1.35; }
.aml-imp-points { display: flex; flex-direction: column; gap: 10px; }
.aml-imp-point { display: flex; align-items: flex-start; gap: 10px; font-size: 14px; color: var(--ink); margin: 0; }
.aml-imp-point span { color: var(--accent); flex: none; }

@media (max-width: 900px) {
	.aml-imperative-tabs.tabs-v-layout { grid-template-columns: 1fr; gap: 24px; }
	.aml-imperative-tabs .tabs-v { flex-direction: row; flex-wrap: wrap; border-bottom: 1px solid var(--border); padding-bottom: 8px; }
	.aml-imperative-tabs .tab-v { border-left: 0; border-bottom: 2px solid transparent; padding: 10px 14px; flex-direction: row; align-items: center; gap: 8px; }
	.aml-imperative-tabs .tab-v.is-active { border-bottom-color: var(--accent); }
	.aml-imperative-tabs .tab-v-title { font-size: 14px; }
	.aml-imp-top,
	.aml-imp-bottom { grid-template-columns: 1fr; gap: 20px; }
}

/* ==========================================================================
   About Us page -- built to spectrum-sync-grid.lovable.app/about (functions
   .php's clari5_maybe_render_about_page()). Reuses the AML/EFRM primitives
   (.aml-eyebrow-pill, .aml-hero-sub/-ctas, .aml-stats-row/-row-stat,
   .section-head, .accordion, .cta-band) for anything already identical,
   plus the homepage's own .hero-visual.hero-network sphere for the hero
   visual -- the rules below are only what's new to this page: the hero's
   two-column grid, the vision copy block, the Clari5+Perfios wordmark row,
   the Life at Clari5 photo grid, the recognition timeline and the
   leadership cards.
   ========================================================================== */
.about-hero { position: relative; padding: 72px 0 72px; overflow: hidden; }
.about-hero-grid { display: grid; grid-template-columns: 1.05fr 1fr; gap: 56px; align-items: center; position: relative; z-index: 1; }
/* This dark fill was only ever meant for the old static hero photo (it was
   neutralised there by a second, more specific .about-hero-image rule
   further down) -- the hub diagram that replaced that photo is .about-hero-
   -visual's only user now, and it wants the page's own light background
   showing through, not a dark card. Confirmed the live reference itself
   has no dark wrapper here either (its own body background is near-white
   all the way up the hub's ancestor chain). */
.about-hero-visual { border-radius: var(--radius-lg); }
.about-stats-row { margin-top: 0; }

.about-vision .section-head { max-width: 720px; text-align: left; margin: 0 auto; }
.about-vision .section-head p { font-size: 16.5px; }

.about-stronger { text-align: center; }
.about-wordmark-row { display: flex; align-items: center; justify-content: center; gap: 22px; margin: 28px 0 32px; }
.about-wordmark-clari5 { font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; color: var(--navy); }
.about-wordmark-divider { width: 60px; height: 1px; background: var(--border); }
.about-wordmark-perfios { font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; color: var(--ink-soft); }

/* ---------- recognition timeline (reuses .accordion/.accordion-trigger/
   .accordion-panel's own JS + collapse animation, styled as a dotted
   timeline instead of that component's default plain list look) ---------- */
.about-recognition-list { position: relative; padding-left: 24px; border-left: 1px solid var(--border); display: flex; flex-direction: column; gap: 20px; }
.about-recognition-item { position: relative; }
.about-recognition-dot { position: absolute; left: -29px; top: 22px; width: 9px; height: 9px; border-radius: 50%; background: var(--accent); }
.about-recognition-years { font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; color: var(--navy); }
.about-recognition-panel > ul { overflow: hidden; margin: 0; padding: 0 20px; min-height: 0; list-style: none; }
.accordion-trigger[aria-expanded="true"] + .about-recognition-panel > ul { padding-bottom: 20px; }
.about-recognition-points li { position: relative; padding: 5px 0 5px 18px; font-size: 14.5px; color: var(--ink-soft); }
.about-recognition-points li::before { content: ''; position: absolute; left: 0; top: 13px; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }

/* "both the cards should be of same width and height" -- plain 1fr
   columns have an implicit min-width:auto, so a name with one long
   unbreakable surname (e.g. "Suryanarayana", no space to wrap at)
   forced ITS column wider to fit that word without overflowing,
   stealing width from the sibling column in the same row even though
   both are nominally "1fr" -- the classic grid-blowout trap. minmax(0,
   1fr) lets columns actually stay equal; the long name wraps within
   its own card instead (word-break below) rather than widening it. */
.about-leadership-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; }
.about-leader-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 28px 22px; transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease); }
.about-leader-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.about-leader-avatar {
	display: flex; align-items: center; justify-content: center;
	width: 56px; height: 56px; border-radius: var(--radius-md); margin-bottom: 18px;
	background: var(--accent-100); color: var(--accent); font-family: var(--font-display); font-weight: 700; font-size: 1.1rem;
	box-shadow: 0 0 0 6px rgba(var(--accent-rgb), 0.08);
	overflow: hidden;
}
.about-leader-avatar-photo { background: var(--bg-alt); padding: 0; }
.about-leader-avatar-photo img { width: 100%; height: 100%; object-fit: cover; }
.about-leader-name { font-weight: 700; color: var(--navy); margin-bottom: 4px; word-break: break-word; overflow-wrap: break-word; }
.about-leader-title { font-size: 11.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); margin: 0; }

.about-global-panel { display: grid; grid-template-columns: 1.3fr 1fr; gap: 40px; align-items: center; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 48px; }
.about-hq-card { background: var(--bg-alt); border-radius: var(--radius-md); padding: 28px; text-align: center; }
.about-hq-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); margin: 0 0 8px; }
.about-hq-value { font-family: var(--font-display); font-size: 1.4rem; font-weight: 700; color: var(--navy); margin: 0; }

@media (max-width: 960px) {
	.about-hero-grid { grid-template-columns: 1fr; }
	.about-leadership-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.about-global-panel { grid-template-columns: 1fr; text-align: center; }
}
@media (max-width: 560px) {
	.about-wordmark-row { gap: 14px; }
	.about-recognition-list { padding-left: 18px; }
	.about-recognition-dot { left: -22px; }
}

/* About Us -- Oct 2026: reference hero image, the reference's four further
   sections, and About Us Development Changes-6Oct.pdf. */
.about-hero h1 { font-size: clamp(2.4rem, 5vw, 4.6rem); line-height: 1.02; }
/* .about-hero-visual.about-hero-image and .about-hero-image img (the old
   static hero photo's own rules) removed 17 Oct along with the photo --
   the hub diagram that replaced it no longer carries that second class. */

/* Our Story / Our Foundation -- copy beside a Clari5 orbit graphic. */
.about-split { display: grid; grid-template-columns: 1fr 1fr; gap: 72px; align-items: center; }
.about-orbit { position: relative; width: 100%; max-width: 440px; aspect-ratio: 1 / 1; margin: 0 auto; }
.about-orbit::before {
	content: ''; position: absolute; inset: 18%; border-radius: 50%;
	background: radial-gradient(circle, rgba(var(--accent-rgb), 0.16), transparent 70%);
}
.about-orbit-ring { position: absolute; left: 50%; top: 50%; border-radius: 50%; transform: translate(-50%, -50%); }
.about-orbit-ring-outer { width: 100%; height: 100%; border: 1px solid rgba(var(--cyan-glow-rgb), 0.45); }
.about-orbit-ring-inner { width: 68%; height: 68%; border: 1.5px dashed rgba(var(--accent-rgb), 0.3); animation: about-orbit-spin 40s linear infinite; }
@keyframes about-orbit-spin { to { transform: translate(-50%, -50%) rotate(360deg); } }
.about-orbit-line { position: absolute; left: 50%; top: 50%; height: 1.5px; width: 48%; transform-origin: 0 50%; background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.5), rgba(var(--accent-rgb), 0.15)); }
.about-orbit-line::after { content: ''; position: absolute; right: -5px; top: -4.5px; width: 10px; height: 10px; border-radius: 50%; background: var(--cyan, #0E8FA8); }
.about-orbit-line-1 { transform: rotate(-140deg); }
.about-orbit-line-2 { transform: rotate(-45deg); }
.about-orbit-line-3 { transform: rotate(-8deg); }
.about-orbit-line-4 { transform: rotate(30deg); width: 46%; }
.about-orbit-line-5 { transform: rotate(140deg); width: 44%; }
.about-orbit-core {
	position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 1;
	width: 38%; aspect-ratio: 1 / 1; border-radius: 24px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px;
	background: color-mix(in srgb, var(--surface) 80%, var(--accent-100)); border: 1px solid var(--border);
	box-shadow: 0 0 60px rgba(var(--accent-rgb), 0.35);
}
.about-orbit-wordmark { font-family: var(--font-display); font-weight: 700; font-size: 1.7rem; color: var(--navy); }
.about-orbit-label { font-size: 9.5px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-faint); text-align: center; padding: 0 10px; }
.about-split-reverse > :first-child { order: 0; }
@media (prefers-reduced-motion: reduce) { .about-orbit-ring-inner { animation: none; } }

/* "Change Hero Banner image" -- the reference's hub diagram: two
   counter-rotating rings, dashed SVG spokes, a pulsing centre core, and
   five floating labelled nodes orbiting it (gently bobbing, staggered). */
.about-hero-visual { position: relative; }
.about-hub { position: relative; width: 100%; max-width: 480px; aspect-ratio: 1 / 1; margin: 0 auto; }
.about-hub-glow { position: absolute; inset: -10%; border-radius: 50%; background: radial-gradient(circle, rgba(var(--accent-rgb), 0.18), transparent 70%); animation: clari5-breathe 6s ease-in-out infinite; }
.about-hub-ring { position: absolute; left: 50%; top: 50%; border-radius: 50%; transform: translate(-50%, -50%); }
.about-hub-ring-outer { width: 84%; height: 84%; border: 1px dashed rgba(var(--accent-rgb), 0.35); animation: about-orbit-spin 50s linear infinite; }
.about-hub-ring-inner { width: 56%; height: 56%; border: 1px solid var(--border); animation: about-hub-spin-rev 36s linear infinite; }
@keyframes about-hub-spin-rev { to { transform: translate(-50%, -50%) rotate(-360deg); } }
.about-hub-spokes { position: absolute; inset: 0; width: 100%; height: 100%; }
.about-hub-spokes line { stroke: var(--accent); stroke-opacity: 0.35; stroke-width: 0.4; stroke-dasharray: 1.5 1.5; }
.about-hub-core {
	position: absolute; left: 50%; top: 50%; z-index: 2;
	width: 32%; aspect-ratio: 1 / 1; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center;
	background: var(--accent); color: #fff; text-align: center;
	box-shadow: 0 0 60px -6px rgba(var(--accent-rgb), 0.65);
	/* "The circle should be exactly at center" -- clari5-breathe's own
	   transform:scale() keyframes replace an element's whole transform
	   value rather than composing with it, so the centering translate(-50%,
	   -50%) that used to sit alongside it here was being wiped out the
	   instant the animation ran, leaving the circle positioned by its
	   top-left corner instead of centered. Dedicated keyframe below bakes
	   the translate into every step instead. */
	animation: about-hub-core-breathe 6s ease-in-out infinite;
}
@keyframes about-hub-core-breathe {
	0%, 100% { transform: translate(-50%, -50%) scale(1); }
	50% { transform: translate(-50%, -50%) scale(1.035); }
}
.about-hub-core-title { font-family: var(--font-display); font-weight: 700; font-size: 1.4rem; margin: 0; color: #fff; }
.about-hub-core-label { font-size: 9px; letter-spacing: 0.16em; text-transform: uppercase; color: rgba(255,255,255,0.8); margin: 2px 0 0; }
.about-hub-node {
	position: absolute; z-index: 3; transform: translate(-50%, -50%);
	display: flex; align-items: center; gap: 8px;
	background: var(--surface); border: 1px solid var(--border); border-radius: 14px; padding: 8px 12px;
	box-shadow: 0 10px 26px -10px rgba(0,0,0,0.25);
	animation: clari5-hub-float 5s ease-in-out infinite;
}
@keyframes clari5-hub-float { 0%, 100% { margin-top: 0; } 50% { margin-top: -8px; } }
.about-hub-node-icon { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 8px; background: var(--accent-100); color: var(--accent); flex: none; }
.about-hub-node-label { font-size: 12px; font-weight: 600; color: var(--navy); white-space: nowrap; }
.about-hub-badge {
	position: absolute; left: 50%; bottom: -8px; transform: translateX(-50%); z-index: 3;
	background: var(--surface); border: 1px solid var(--border); border-radius: 999px; padding: 8px 18px;
	font-size: 12.5px; font-weight: 600; color: var(--ink-soft); white-space: nowrap;
	box-shadow: 0 10px 26px -10px rgba(0,0,0,0.25);
}
@media (prefers-reduced-motion: reduce) {
	.about-hub-glow, .about-hub-ring-outer, .about-hub-ring-inner, .about-hub-core, .about-hub-node { animation: none; }
	/* The centering translate normally lives only inside the keyframe (see
	   about-hub-core-breathe above) -- restore it statically here since
	   turning the animation off would otherwise leave the circle
	   unpositioned. */
	.about-hub-core { transform: translate(-50%, -50%); }
}
@media (max-width: 760px) {
	.about-hub { max-width: 340px; }
	.about-hub-node-label { font-size: 10.5px; }
	.about-hub-node { padding: 6px 9px; gap: 6px; }
	.about-hub-node-icon { width: 22px; height: 22px; }
}

/* Our Mission -- five capability cards. */
.about-mission-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.about-mission-card { padding: 30px; }
.about-mission-card h3 { font-size: 1.25rem; margin: 22px 0 10px; }
.about-mission-card p { font-size: 14.5px; }

/* "New section after Our Mission" -- Industries we work with. Left: a
   4-segment progress-bar glyph (purely decorative, matching the reference
   exactly -- not a real tab control). Right: a solid-accent panel holding
   a 2x2 grid of tiles, each with a giant faint background icon that
   rotates/brightens on hover, matching the reference's industry cards. */
.about-industries { display: grid; grid-template-columns: 0.9fr 1.1fr; gap: 48px; align-items: center; }
.about-industries-bar { display: flex; gap: 10px; margin-top: 28px; max-width: 320px; }
.about-industries-bar span { flex: 1; height: 5px; border-radius: 999px; background: rgba(var(--accent-rgb), 0.15); }
.about-industries-bar span.is-active { background: var(--accent); }
.about-industries-panel { background: var(--accent); border-radius: 28px; padding: 8px; box-shadow: 0 30px 60px -24px rgba(var(--accent-rgb), 0.55); }
.about-industries-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.about-industry-tile {
	position: relative; overflow: hidden; min-height: 200px;
	display: flex; flex-direction: column; justify-content: space-between;
	background: rgba(255,255,255,0.1); border-radius: 18px; padding: 22px;
	transition: background 0.5s var(--ease);
}
.about-industry-tile:hover { background: #fff; }
.about-industry-ghost { position: absolute; right: -24px; bottom: -24px; color: rgba(255,255,255,0.1); transition: transform 0.5s var(--ease), color 0.5s var(--ease); }
.about-industry-tile:hover .about-industry-ghost { transform: rotate(-8deg) scale(1.1); color: rgba(var(--accent-rgb), 0.1); }
.about-industry-head { position: relative; display: flex; align-items: center; justify-content: space-between; }
.about-industry-icon {
	position: relative; display: inline-flex; align-items: center; justify-content: center;
	width: 48px; height: 48px; border-radius: 14px; background: rgba(255,255,255,0.15); color: #fff;
	transition: background 0.5s var(--ease), color 0.5s var(--ease);
}
.about-industry-tile:hover .about-industry-icon { background: var(--accent); color: #fff; }
.about-industry-n { position: relative; font-family: var(--font-numeric); font-size: 13px; font-weight: 700; color: rgba(255,255,255,0.6); transition: color 0.5s var(--ease); }
.about-industry-tile:hover .about-industry-n { color: var(--accent); }
.about-industry-title { position: relative; font-size: 1.5rem; font-weight: 600; color: #fff; margin: 0; transition: color 0.5s var(--ease); }
.about-industry-tile:hover .about-industry-title { color: var(--accent); }
@media (max-width: 960px) {
	.about-industries { grid-template-columns: 1fr; gap: 28px; }
	.about-industries-bar { margin: 20px auto 0; }
}
@media (max-width: 540px) {
	/* Stays a 2x2 grid here, not 1 column -- the reference keeps this
	   exact 2x2 layout down to phone widths (see the comment above
	   .about-industries), a 1-column override here was contradicting
	   that and making 4 full-width cards with oversized icons instead. */
	.about-industry-tile { min-height: 150px; }
}

/* How Clari5 Works -- four steps on one connecting line. */
.about-how-steps { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(4, 1fr); gap: 32px; position: relative; }
.about-how-steps::before { content: ''; position: absolute; left: 12.5%; right: 12.5%; top: 35px; height: 1px; background: var(--border); }
.about-how-steps li { position: relative; text-align: center; }
.about-how-icon {
	display: inline-flex; align-items: center; justify-content: center; width: 70px; height: 70px; border-radius: 18px;
	background: var(--surface); border: 1px solid var(--border); color: var(--accent); position: relative;
	box-shadow: 0 0 34px rgba(var(--accent-rgb), 0.22);
}
.about-how-n { display: block; margin: 20px 0 6px; font-size: 11px; letter-spacing: 0.2em; color: var(--ink-faint); }
.about-how-steps h3 { font-size: 1.25rem; margin: 0 0 10px; }
.about-how-steps p { font-size: 14px; color: var(--ink-soft); margin: 0 auto; max-width: 260px; }

/* Our Vision -- centred like the other sections (About Us Development
   Changes-6Oct.pdf: "It should be centrally aligned like other sections"). */
.about-vision .section-head.about-vision-head { text-align: center; max-width: 820px; }

/* Stronger Together -- the real Clari5 and Perfios logos. */
.about-logo-clari5 { height: 54px; width: auto; }
.about-logo-perfios { height: 34px; width: auto; }
/* Perfios's own SVG is white-on-dark; a navy copy shows on light pages and
   the original white one in dark mode. */
.about-logo-perfios-dark { display: none; }
:root[data-theme="dark"] .about-logo-perfios:not(.about-logo-perfios-dark) { display: none; }
:root[data-theme="dark"] .about-logo-perfios-dark { display: inline; }
.about-wordmark-row { gap: 32px; }

/* Global Presence -- "Built for Banks, Wherever They Operate" rebuild
   (About Us Changes-15Oct.pdf): a map panel with a badge/legend, a
   6-region market breakdown bar, then the real office cards. */
.about-map-panel {
	position: relative; overflow: hidden; min-height: 280px; margin: 40px 0;
	border-radius: 28px; padding: 28px;
	background: linear-gradient(180deg, var(--surface), var(--accent-100));
	border: 1px solid var(--border);
}
/* Real dot-matrix world map (assets/images/about-world-map.svg, 10k+
   circles) extracted directly from the live reference's own generated
   SVG output -- "this worldmap i am not able to see" wasn't solvable
   with an abstract placeholder, and fabricating a cartographic outline
   risked being geographically wrong, so this reuses the reference's
   actual asset. The map and its pins/lines share one percentage-based
   coordinate space (the map image is stretched, not cropped, to fill
   this box) so pin positions lifted from the reference land correctly
   regardless of the panel's own rendered aspect ratio.
   The SVG itself has a transparent background and light steel-blue dots
   (#9fb3d9) -- confirmed directly against the reference, which sits the
   map straight on its light panel with no separate dark box. An earlier
   pass wrongly wrapped it in a #0b0d12 dark box, darkening the whole
   thing; removed so it reads light like the rest of the page. */
.about-map-world {
	position: relative; z-index: 1; margin-top: 18px;
	aspect-ratio: 218 / 110; border-radius: 20px; overflow: hidden;
}
.about-map-world-img { position: absolute; inset: 0; width: 100%; height: 100%; }
.about-map-world-lines { position: absolute; inset: 0; width: 100%; height: 100%; }
.about-map-world-lines path { fill: none; stroke: var(--accent); stroke-width: 0.35; stroke-opacity: 0.45; stroke-dasharray: 1.4 1.4; }
.about-map-world-dot {
	position: absolute; width: 4px; height: 4px; margin: -2px 0 0 -2px; border-radius: 50%;
	background: var(--cyan-glow); box-shadow: 0 0 4px rgba(var(--cyan-glow-rgb), 0.5);
}
.about-map-world-pin { position: absolute; z-index: 2; margin: -7px 0 0 -7px; display: flex; align-items: center; }
.about-map-world-pin-wrap { position: relative; display: block; width: 13px; height: 13px; flex-shrink: 0; }
.about-map-world-pin-ring {
	position: absolute; inset: 0; border-radius: 50%;
	background: rgba(var(--accent-rgb), 0.5);
	animation: clari5-ping-ring 1.8s ease-out infinite;
}
.about-map-world-pin-dot {
	position: relative; display: block; width: 100%; height: 100%; border-radius: 50%;
	background: var(--accent); box-shadow: 0 0 0 2px var(--surface), 0 0 10px rgba(var(--accent-rgb), 0.5);
}
.about-map-world-pin.is-hq .about-map-world-pin-dot { box-shadow: 0 0 0 2px var(--surface), 0 0 14px rgba(var(--accent-rgb), 0.7); }
.about-map-world-pin-label {
	margin-left: 7px; white-space: nowrap; background: var(--accent); color: #fff;
	font-size: 10.5px; font-weight: 700; padding: 3px 9px; border-radius: 999px;
	pointer-events: none;
}
@media (max-width: 782px) {
	.about-map-world-pin-label { display: none; }
}
.about-map-legend { position: relative; z-index: 2; display: flex; gap: 16px; justify-content: flex-end; font-size: 12px; font-weight: 600; color: var(--ink-soft); }
.about-map-legend span { display: inline-flex; align-items: center; gap: 6px; }
.about-map-dot { width: 9px; height: 9px; border-radius: 50%; }
.about-map-dot.is-office { background: var(--accent); box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.25); }
.about-map-dot.is-market { background: var(--cyan-glow); }
.about-map-badge {
	position: relative; z-index: 2; display: inline-flex; flex-direction: column; gap: 2px;
	background: var(--surface); border: 1px solid var(--border); border-radius: 18px; padding: 14px 20px; margin-top: 16px;
}
.about-map-badge strong { font-family: var(--font-numeric); font-size: 1.9rem; color: var(--accent); line-height: 1; }
.about-map-badge span { font-size: 12px; color: var(--ink-faint); }

/* Solid-accent panel with translucent-white buttons inside -- confirmed
   against the live reference directly (not guessed from the PDF alone):
   the whole region bar sits on one bg-primary panel, each region is a
   bg-white/10 button on top of it (hover bg-white/20), not individual
   light cards divided by borders. */
.about-region-panel { background: var(--accent); border-radius: 28px; padding: 10px; box-shadow: 0 30px 60px -24px rgba(var(--accent-rgb), 0.5); }
.about-region-bar { display: grid; grid-template-columns: repeat(6, 1fr); gap: 8px; }
.about-region {
	background: rgba(255,255,255,0.1); border: 0; border-radius: 16px; padding: 20px 16px; text-align: left; cursor: pointer;
	display: flex; flex-direction: column; height: 100%;
	transition: background 0.3s var(--ease);
}
.about-region:hover { background: rgba(255,255,255,0.2); }
.about-region-title { font-size: 1.05rem; font-weight: 600; color: #fff; margin: 0; }
.about-region-count { font-family: var(--font-numeric); font-size: 1.8rem; font-weight: 700; color: #fff; margin: 6px 0 0; }
.about-region-count span { font-family: var(--font-body); font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: rgba(255,255,255,0.75); margin-left: 6px; }
.about-region-note { font-size: 11.5px; color: rgba(255,255,255,0.7); margin: 8px 0 0; }
.about-region-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.about-region-tags span { background: rgba(255,255,255,0.15); color: #fff; font-size: 11px; font-weight: 500; padding: 2px 10px; border-radius: 999px; }

.about-office-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; margin-top: 40px; }
.about-office-card { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 26px; transition: transform 0.4s var(--ease), border-color 0.4s var(--ease); }
.about-office-card:hover { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.4); }
.about-office-card svg { color: var(--accent); }
.about-office-card.is-hq { background: var(--accent); border-color: var(--accent); color: #fff; }
.about-office-card.is-hq svg { color: #fff; }
.about-office-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--cyan-glow); margin: 14px 0 6px; }
.about-office-card.is-hq .about-office-label { color: rgba(255,255,255,0.75); }
.about-office-card h3 { font-size: 1.15rem; margin: 0 0 8px; }
.about-office-address { font-size: 13px; color: var(--ink-soft); margin: 0; }
.about-office-card.is-hq .about-office-address { color: rgba(255,255,255,0.85); }
@media (max-width: 1100px) {
	.about-region-bar { grid-template-columns: repeat(3, 1fr); }
	.about-office-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
	/* 2 columns here squeezed each region card to ~170px, forcing every
	   country pill onto its own line (e.g. Southeast & East Asia's 10
	   countries) and inflating the section's height far past the
	   reference, which stacks one full-width region card per row at
	   this width. */
	.about-region-bar { grid-template-columns: 1fr; }
	.about-office-grid { grid-template-columns: 1fr; }
	.about-map-legend { justify-content: flex-start; flex-wrap: wrap; }
}

@media (max-width: 960px) {
	.about-split { grid-template-columns: 1fr; gap: 40px; }
	.about-split-reverse > :first-child { order: 1; }
	.about-mission-grid { grid-template-columns: repeat(2, 1fr); }
	.about-how-steps { grid-template-columns: repeat(2, 1fr); row-gap: 40px; }
	.about-how-steps::before { display: none; }
}
@media (max-width: 560px) {
	.about-mission-grid, .about-how-steps { grid-template-columns: 1fr; }
	.about-logo-clari5 { height: 40px; }
	.about-logo-perfios { height: 26px; }
}

/* ==========================================================================
   Case Studies + Infographics pages -- reuse the AML/EFRM/About primitives
   for hero + CTA band; the case-study cards reuse .aml-story-card as-is.
   ========================================================================== */
.case-studies-grid { grid-template-columns: repeat(3, 1fr); }
.case-study-region { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--accent); margin: 0 0 8px; }

.infographic-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
.infographic-card {
	display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--border);
	border-radius: var(--radius-md); overflow: hidden; transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
}
.infographic-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.infographic-media { display: block; aspect-ratio: 321 / 219; background: var(--bg-alt); overflow: hidden; }
.infographic-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.infographic-title { display: block; padding: 14px 16px; font-size: 13.5px; font-weight: 600; color: var(--navy); line-height: 1.4; }

@media (max-width: 960px) {
	.case-studies-grid { grid-template-columns: 1fr; }
	.infographic-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
	.infographic-grid { grid-template-columns: 1fr; }
}

/* ==========================================================================
   Schedule Demo (page-request-a-demo.php) -- the Contact Us page's own
   form, reused as-is (.contact-form/.contact-form-static-labels/.field*
   all untouched), just centered as one column instead of that page's
   form + office-info two-column grid, with no hero/map around it.
   ========================================================================== */
.contact-form-section-solo { padding-top: 96px; }
.contact-form-section-solo .section-head { max-width: 640px; margin: 0 auto 40px; }
.contact-form-col-solo { max-width: 640px; margin: 0 auto; }

/* ==========================================================================
   Careers page (clari5_render_careers_page(), functions.php) -- built
   against clari5.com's own careers page (Sept 2026 site-modifications
   thread). Reuses .blog-hero/.blog-archive/.blog-empty from the blog
   archive for the hero and open-positions section; this is just the
   stats band + job card list unique to this page.
   ========================================================================== */
/* Search/filter bar (New Website Changes-29Sept.pdf screenshot): a wide
   search box + Search button on one row, Location/Full-Part-time/Job
   Category/More selects on the next -- reuses .blog-search-box and
   .blog-filter-selects (blog archive) rather than new field styles, just
   with this page's own row layout. */
.career-filters-section { padding: 28px 0 8px; }
.career-search-form { display: flex; flex-direction: column; gap: 14px; }
.career-search-row { display: flex; gap: 12px; }
.career-search-box { flex: 1 1 auto; max-width: 520px; }
.career-filter-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; justify-content: flex-start; }
@media (max-width: 640px) {
	.career-search-row { flex-direction: column; }
	.career-search-box { max-width: none; }
}

/* Careers filter dropdowns (clari5_render_filter_dropdown(), functions.php)
   -- a custom flush white-card panel styled like the header's Solutions
   mega-menu (same .mega-menu.is-compact/.mega-link classes), not a
   native <select>, since that couldn't be themed at all. */
.career-filter-dropdown { position: relative; }
.career-filter-trigger {
	display: inline-flex; align-items: center; gap: 8px;
	box-sizing: border-box;
	border: 1px solid var(--border); border-radius: 999px;
	padding: 11px 18px; font: inherit; font-size: 14px; font-weight: 500;
	background: var(--surface); color: var(--ink-soft);
	cursor: pointer;
	transition: border-color 0.2s var(--ease), color 0.2s var(--ease), background 0.2s var(--ease);
}
.career-filter-trigger:hover { border-color: var(--accent); color: var(--accent); background: var(--bg-alt); }
.career-filter-trigger .mega-caret { transition: transform 0.2s var(--ease); flex: none; }
.career-filter-trigger[aria-expanded="true"] { border-color: var(--accent); color: var(--accent); }
.career-filter-trigger[aria-expanded="true"] .mega-caret { transform: rotate(180deg); }
/* .mega-menu is normally positioned off a header nav trigger; same
   mechanics here, just anchored to this pill instead, and toggled by
   initCareerFilterDropdowns() (main.js) rather than .nav-mega-trigger's
   hover-to-open behaviour (a filter should only open on click). */
.career-filter-panel { width: max-content; min-width: 180px; left: 0; padding-top: 8px; }
.career-filter-panel .mega-menu-inner { padding: 10px; gap: 0; }
.career-filter-panel .mega-cols { display: block; }
/* "Drop downs are not same font and are pretty static" -- .mega-link-title
   is 15px (sized for the header nav, Header Menu Changes-30Sept.pdf's own
   "increase the font size" ask there), a visible jump from this trigger's
   14px; matched here instead, and gave each row its own hover fill (was
   color-only, which read as inert next to the trigger's own hover state
   added above). */
.career-filter-option { width: 100%; text-align: left; background: none; border: 0; border-radius: var(--radius-sm); font: inherit; cursor: pointer; padding: 9px 12px; transition: background 0.15s var(--ease); }
.career-filter-option .mega-link-title { font-size: 14px; }
.career-filter-option:hover { background: var(--bg-alt); }
.career-filter-option.is-selected .mega-link-title { color: var(--accent); font-weight: 600; }

.career-stats-section { padding: 32px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); background: var(--bg-alt); }
.career-stats-row { display: flex; flex-wrap: wrap; gap: 40px; justify-content: center; }
.career-stat { text-align: center; }
.career-stat strong { display: block; font-size: 2rem; font-weight: 700; color: var(--navy); }
.career-stat span { font-size: 13px; color: var(--ink-faint); }

.career-jobs-heading { font-size: 1.4rem; margin-bottom: 24px; color: var(--navy); }
.career-jobs-list { display: flex; flex-direction: column; gap: 16px; margin-bottom: 40px; }
.career-job-card { display: flex; align-items: center; justify-content: space-between; gap: 20px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 20px 24px; }
.career-job-title { font-weight: 700; color: var(--navy); margin-bottom: 4px; }
.career-job-meta { font-size: 13px; color: var(--accent); font-weight: 600; margin-bottom: 6px; }
.career-job-summary { font-size: 14px; color: var(--ink-soft); margin: 0; }
.career-resume-cta { text-align: center; padding: 40px 0 0; border-top: 1px solid var(--border); }
.career-resume-cta p { margin-bottom: 16px; color: var(--ink-soft); }
@media (max-width: 640px) {
	.career-job-card { flex-direction: column; align-items: flex-start; }
}

/* ==========================================================================
   Case study detail page (single.php's case_study branch) + "Download Case
   Study" popup (clari5_render_case_study_download_modal(), functions.php)
   -- matches clari5.com's own case study pages, e.g.
   clari5.com/xacbank-fortifies-aml-defense-with-clari5/.
   ========================================================================== */
/* One side image, other side text, per the site-modifications thread:
   "the details page of each case study or other similar pages which have
   download should have one side image and other side text and below that
   Download option." Was a single 780px-wide stacked column (image full
   width on top, text below) -- widened to fit two columns side by side. */
.case-study-detail { padding: 64px 24px 96px; max-width: 1040px; margin: 0 auto; }
.case-study-detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; margin: 24px 0 32px; }
.case-study-region { display: inline-block; font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--accent); margin-bottom: 8px; }
.case-study-detail-metric { font-size: 1.1rem; font-weight: 700; color: var(--accent); margin: 8px 0 16px; }
.case-study-detail-media { border-radius: var(--radius-lg); overflow: hidden; }
.case-study-detail-media img { display: block; width: 100%; height: 100%; object-fit: cover; }
.case-study-detail .btn { margin-top: 8px; }
@media (max-width: 860px) {
	.case-study-detail-grid { grid-template-columns: 1fr; gap: 24px; }
}

/* Careers internal page (single.php's job_opening branch) -- title, a
   Full Time/Location/Posted meta row, About Clari5 + the role's own
   content, an Experience/Department/Job Category fact strip, then the
   Apply form card (reuses .contact-form-col from the Contact page). */
.job-detail { padding: 64px 24px 96px; max-width: 780px; margin: 0 auto; }
.job-detail-meta { display: flex; flex-wrap: wrap; gap: 18px; margin: 12px 0 28px; font-size: 13.5px; color: var(--ink-soft); }
.job-detail-meta span { display: inline-flex; align-items: center; gap: 6px; }
/* "Some blocks have big font and some small" -- the later #main h2
   !important type-scale rule (further down this file) was winning over
   this non-important rule, so "About Clari5" and any job-description
   subheadings were rendering at the 44px hero size instead of this
   deliberately small in-page sub-heading. Matched the cs-modal h2
   pattern (also further down) of using !important to escape it. */
#main .job-detail-content h2 { font-size: 1.2rem !important; line-height: 1.3 !important; margin: 28px 0 10px; color: var(--navy); }
.job-detail-content h2:first-child { margin-top: 0; }
.job-detail-facts { display: flex; flex-wrap: wrap; gap: 32px; margin: 32px 0; padding: 20px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.job-detail-fact-label { display: block; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); margin-bottom: 4px; }
.job-apply-col { margin-top: 24px; }

.cs-modal-overlay {
	position: fixed; inset: 0; z-index: 200;
	display: flex; align-items: center; justify-content: center;
	background: rgba(10, 14, 25, 0.6);
	padding: 24px;
	opacity: 0; visibility: hidden; pointer-events: none;
	transition: opacity 0.25s var(--ease), visibility 0.25s;
}
.cs-modal-overlay.is-open { opacity: 1; visibility: visible; pointer-events: auto; }
/* .cs-modal itself no longer scrolls -- it just clips to the rounded
   corners (overflow: hidden) and holds the fixed close button. The actual
   scrolling happens on .cs-modal-body inside it instead, so on a short
   mobile viewport the scrollbar is a plain rectangle running down the
   inner content, not fighting the outer rounded corners (that clash was
   the "form is showing vertical scroll" complaint, Sept 2026
   site-modifications thread -- the scrollbar itself was visually
   breaking the card's rounded shape). */
.cs-modal {
	position: relative;
	background: var(--surface);
	border-radius: var(--radius-lg);
	box-shadow: var(--shadow-lg);
	width: 100%; max-width: 480px;
	max-height: 90vh;
	overflow: hidden;
	transform: translateY(12px);
	transition: transform 0.25s var(--ease);
}
.cs-modal-overlay.is-open .cs-modal { transform: translateY(0); }
/* Compact across the board (not just a mobile breakpoint) -- the original
   spacing (36px padding, 18px between fields, full-height .field inputs)
   added up to more than a lot of ordinary desktop browser windows have
   room for vertically, forcing a scroll even though nothing about the
   form itself needs that much space (client feedback: "can we fit in a
   page without scroll"). */
.cs-modal-body {
	max-height: 90vh;
	overflow-y: auto;
	padding: 24px 32px;
}
.cs-modal-body::-webkit-scrollbar { width: 6px; }
.cs-modal-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: 999px; }
.cs-modal h2 { font-size: 1.25rem; margin: 0 0 14px; color: var(--navy); }
.cs-modal-close {
	position: absolute; top: 14px; right: 14px; z-index: 1;
	width: 28px; height: 28px; border-radius: 50%;
	display: flex; align-items: center; justify-content: center;
	font-size: 18px; line-height: 1; color: var(--ink-faint);
	background: none; border: none; cursor: pointer;
	transition: background 0.2s var(--ease), color 0.2s var(--ease);
}
.cs-modal-close:hover { background: var(--bg-alt); color: var(--ink); }
.cs-download-form .field-full { margin-bottom: 10px; }
.cs-download-form .field-static label { margin-bottom: 3px; font-size: 13px; }
.cs-download-form .field-static input { padding: 10px 14px; }
.cs-download-form button[type="submit"] { width: 100%; margin-top: 4px; padding-top: 11px; padding-bottom: 11px; }
@media (max-width: 480px) {
	.cs-modal-overlay { padding: 12px; }
	.cs-modal-body { padding: 20px; }
}

/* ==========================================================================
   Page hero -- Awards, Newsroom, Videos, Careers (Awards Page, Newsroom,
   Press Releases & Careers Changes-5Oct.pdf: "Make it vibrant like how the
   Blog homepage was created. Use a relevant image for this page. Create the
   background as it is developed in the Contact Us page"). The blog hero's
   copy column and colour glow on the Contact Us hero's tinted band, with
   the Contact Us orbit graphic (.contact-orbit, reused as-is) re-themed per
   page in clari5_render_page_hero().
   ========================================================================== */
.page-hero-top { position: relative; overflow: hidden; background: var(--bg-alt); }
.page-hero { position: relative; z-index: 1; padding: 56px 0 48px; }
.page-hero-grid { display: grid; grid-template-columns: 1.1fr 0.9fr; align-items: center; gap: 48px; }
.page-hero h1 { font-size: clamp(2.25rem, 4.2vw, 3.4rem); max-width: 720px; color: var(--navy); margin: 14px 0 0; }
.page-hero .blog-hero-sub { max-width: 560px; }
.page-hero-orbit { height: 400px; }
@media (max-width: 900px) {
	.page-hero-grid { grid-template-columns: 1fr; gap: 0; }
	.page-hero-orbit { display: none; }
}

/* Logo-style images -- the award and press-outlet artwork imported from
   clari5.com is wide logos (~250x80), which object-fit: cover cropped to
   an unreadable sliver. Shown whole on a white panel instead (white in
   dark mode too: the logos themselves assume a light background). */
.post-card-media.is-logo,
.blog-featured-media.is-logo,
.case-study-detail-media.is-logo {
	display: flex; align-items: center; justify-content: center; background: #fff;
}
.post-card-media.is-logo img,
.blog-featured-media.is-logo img,
.case-study-detail-media.is-logo img {
	width: auto; height: auto; max-width: 72%; max-height: 62%; object-fit: contain;
}
.post-card:hover .post-card-media.is-logo img { transform: scale(1.04); }
.case-study-detail-media.is-logo { aspect-ratio: 16 / 10; border: 1px solid var(--border); }

/* Video cards -- a play badge over the thumbnail. */
.post-card-media.is-video::before {
	content: ''; position: absolute; z-index: 2; left: 50%; top: 50%;
	width: 58px; height: 58px; margin: -29px 0 0 -29px; border-radius: 50%;
	background: rgba(var(--accent-rgb), 0.92) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9 7v10l8-5z' fill='%23fff'/%3E%3C/svg%3E") 55% 50% / 26px no-repeat;
	box-shadow: 0 10px 26px -8px rgba(var(--accent-rgb), 0.7);
	transition: transform 0.4s var(--ease);
}
.post-card:hover .post-card-media.is-video::before { transform: scale(1.1); }
.page-hero-top + .blog-featured-strip,
.page-hero-top + .blog-archive { padding-top: 48px; }
/* Award / Newsroom / Video headlines run much longer than blog titles
   ("Clari5 Category Leader in Chartis Research RiskTech AML Transaction
   Monitoring Solutions 2025"), so these cards use a smaller title and a
   clamped excerpt to keep each row of the grid an even height. */
.post-card.is-compact .post-card-title,
.post-card:has(.is-logo) .post-card-title,
.post-card:has(.is-video) .post-card-title { font-size: clamp(1.15rem, 1.5vw, 1.35rem); line-height: 1.3; margin-bottom: 12px; }
.post-card.is-compact .post-card-excerpt,
.post-card:has(.is-logo) .post-card-excerpt,
.post-card:has(.is-video) .post-card-excerpt { display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; flex: 0 1 auto; margin-bottom: 20px; }
.post-card.is-compact .post-card-foot,
.post-card:has(.is-logo) .post-card-foot,
.post-card:has(.is-video) .post-card-foot { margin-top: auto; }
.case-study-detail-media.is-logo { align-self: start; }

/* ==========================================================================
   Genie page (/genie/) -- clari5_maybe_render_genie_page(). Reuses the AML
   page's hero/chips/stats-row/section/accordion/explore components; the
   rules below are only what the Lovable reference adds on top.
   ========================================================================== */
/* Genie Changes-30Sept.pdf: "Start the image from the same line as the First
   Line of the content" -- the eyebrow pill gets its own row across both
   columns, so the image's top edge lines up with the heading's first line
   instead of being vertically centred against the whole text column. */
.genie-hero-grid {
	display: grid; grid-template-columns: 1.05fr 1fr; column-gap: 56px; align-items: start;
	position: relative; z-index: 1;
}
.genie-hero-pill { grid-column: 1 / -1; justify-self: start; margin-bottom: 22px; }
.genie-hero h1 { font-size: clamp(2.2rem, 4vw, 3.4rem); line-height: 1.05; }
.genie-hero-visual { margin-top: 10px; }
.genie-hero-lead { font-size: 18px; font-weight: 500; color: var(--navy); line-height: 1.6; margin: 0 0 16px; }
/* "It should come in 1 single row" -- both CTAs side by side. */
.genie-ctas { display: flex; flex-wrap: nowrap; gap: 14px; }
.genie-ctas-center { justify-content: center; margin-top: 36px; }

.genie-problem { display: grid; grid-template-columns: 1fr 1fr; gap: 72px; align-items: start; }
.genie-problem-text h2 { font-size: clamp(1.9rem, 3.2vw, 2.8rem); line-height: 1.1; margin: 0 0 24px; }
.genie-problem-text p:not(.eyebrow) { color: var(--ink-soft); font-size: 17px; }
.genie-problem-text .genie-problem-strong { color: var(--navy); font-weight: 500; }
.genie-problem-caption { font-size: 14px; color: var(--ink-soft); margin: 4px 0 12px; }
.genie-step-grid {
	list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr;
	border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; background: var(--surface);
}
.genie-step-grid li {
	display: flex; align-items: center; gap: 14px; padding: 22px 20px; font-size: 14.5px; font-weight: 500; color: var(--navy);
	border-bottom: 1px solid var(--border);
	transition: background 0.4s var(--ease), color 0.4s var(--ease);
}
.genie-step-grid li:nth-child(odd) { border-right: 1px solid var(--border); }
.genie-step-grid li:nth-last-child(-n+2) { border-bottom: 0; }
.genie-step-grid li:hover { background: var(--accent); color: #fff; }
.genie-step-grid li:hover .genie-step-n { color: rgba(255,255,255,0.7); }
.genie-step-n { font-family: var(--font-numeric); font-weight: 700; font-size: 17px; color: rgba(var(--accent-rgb), 0.55); transition: color 0.4s var(--ease); }

.genie-icon-box {
	display: inline-flex; align-items: center; justify-content: center; flex: none;
	width: 44px; height: 44px; border-radius: 12px; border: 1px solid rgba(var(--accent-rgb), 0.25);
	background: var(--accent-100); color: var(--accent);
	transition: border-color 0.4s var(--ease), background 0.4s var(--ease), color 0.4s var(--ease);
}
.genie-agent-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
/* Sentinel's "3 Pillars" reuses .genie-agent-grid/-card but with 3 items,
   not CIH/Genie's usual 4. "This section does not move to the right in
   mobile version" -- the two-class selector here (0,2,0) was beating the
   responsive step-downs below (each a plain single-class
   `.genie-agent-grid` selector, 0,1,0), even inside their own media
   queries: a media query doesn't add specificity, so the unconditional,
   more-specific rule here won at every width, including mobile, leaving
   the 3rd pillar's card rendered off past the right edge of the viewport
   with no way to scroll to it (the sitewide overflow-x:hidden safety net
   clips it instead of showing a scrollbar). Needs its own override at
   each breakpoint below, not a reused one-class selector. */
.genie-agent-grid.sol-pillars-3 { grid-template-columns: repeat(3, 1fr); }
.genie-agent-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; transition: background 0.4s var(--ease), border-color 0.4s var(--ease); }
/* Full hover color-swap to solid accent -- confirmed on BOTH pages that
   reuse this card (Genie's own agent cards, and CIH's value-prop cards),
   not just CIH as first assumed; no longer scoped to .cih-value-grid. */
.genie-agent-card:hover { background: var(--accent); border-color: var(--accent); }
.genie-agent-card h3,
.genie-agent-card p { transition: color 0.4s var(--ease); }
.genie-agent-card:hover h3,
.genie-agent-card:hover p { color: #fff; }
.genie-agent-card:hover .genie-icon-box { border-color: rgba(255,255,255,0.4); background: rgba(255,255,255,0.12); color: #fff; }
.genie-agent-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
.genie-agent-n { font-family: var(--font-numeric); font-weight: 700; font-size: 22px; color: rgba(var(--accent-rgb), 0.18); }
.genie-agent-card h3 { font-size: 1.05rem; margin: 0 0 10px; }
.genie-agent-card p { font-size: 14px; color: var(--ink-soft); margin: 0; }
.genie-footnote { text-align: center; color: var(--ink-soft); margin: 36px auto 0; max-width: 720px; }

.genie-mode-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px; }
/* Hover per the Genie reference (New Website Changes-20Oct.pdf: "animation
   not matching"): a 2px accent line grows across the top border, the icon
   lifts, the number darkens and the title turns accent. */
.genie-mode { position: relative; border-top: 1px solid var(--border); padding-top: 32px; }
.genie-mode::before {
	content: ""; position: absolute; left: 0; top: -1px; width: 0; height: 2px; background: var(--accent);
	transition: width 0.7s cubic-bezier(0.22, 1, 0.36, 1); pointer-events: none;
}
.genie-mode:hover::before { width: 100%; }
.genie-mode-head { display: flex; align-items: center; gap: 14px; color: var(--accent); margin-bottom: 22px; }
.genie-mode-head svg { transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1); }
.genie-mode:hover .genie-mode-head svg { transform: translateY(-4px); }
.genie-mode-n { font-family: var(--font-numeric); font-weight: 700; font-size: 1.8rem; color: rgba(var(--accent-rgb), 0.18); transition: color 0.5s var(--ease); }
.genie-mode:hover .genie-mode-n { color: rgba(var(--accent-rgb), 0.4); }
.genie-mode h3 { font-size: 1.5rem; margin: 0 0 14px; transition: color 0.5s var(--ease); }
.genie-mode:hover h3 { color: var(--accent); }
/* Genie hero: second paragraph in the same colour as the lead above it
   ("Colour code not matching with the previous paragraph"). */
.genie-hero-grid .aml-hero-sub { color: var(--navy); }
.genie-mode p { color: var(--ink-soft); margin: 0; }

.genie-wf-tabs.tabs-v-layout {
	grid-template-columns: 340px minmax(0, 1fr); gap: 56px; align-items: start;
	background: transparent; border: 0; box-shadow: none; padding: 0;
}
.genie-wf-tabs .tabs-v { border-right: 0; padding-right: 0; max-height: none; gap: 6px; }
.genie-wf-tabs .tab-v {
	flex-direction: column; align-items: flex-start; gap: 6px; padding: 18px 22px;
	border-left: 2px solid var(--border); border-radius: 0 var(--radius-md) var(--radius-md) 0; background: transparent;
}
.genie-wf-tabs .tab-v.is-active { background: var(--surface); border-left-color: var(--accent); transform: none; }
/* "Use the Blue band colour on the left column... to make it look vibrant"
   -- AML Insurance's value-chain tabs only, not the other pages sharing
   .genie-wf-tabs: a thicker, glowing accent band instead of the shared
   2px border-left. */
/* Rebuilt to the reference (AML Insurance Dev Changes-13Oct, re-flagged
   20 Oct as "not fully complete"): equal columns, each stage a full
   bordered card (number, icon, title in one row), the active one a solid
   accent fill with white text; the panel carries the stage icon large
   above its heading and plain accent check marks. */
#main .genie-wf-tabs.ins-value-tabs.tabs-v-layout { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 24px; align-items: stretch; }
#main .ins-value-tabs .tabs-v { gap: 12px; }
#main .ins-value-tabs .tab-v {
	flex: 1; flex-direction: row; align-items: center; gap: 20px; padding: 20px 24px;
	border: 1px solid var(--border); border-radius: var(--radius-lg); background: transparent;
	transition: background 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease), color 0.5s var(--ease);
}
#main .ins-value-tabs .tab-v:hover { transform: none; background: transparent; border-color: rgba(var(--accent-rgb), 0.4); }
#main .ins-value-tabs .tab-v.is-active {
	background: var(--accent); border-color: var(--accent); color: #fff;
	box-shadow: 0 14px 34px -12px rgba(var(--accent-rgb), 0.6);
}
#main .ins-value-tabs .tab-v-tag { font-family: var(--font-numeric); font-size: 14px; font-weight: 700; letter-spacing: 0; color: var(--ink-soft); }
#main .ins-value-tabs .ins-value-icon { display: inline-flex; flex: none; color: var(--accent); transition: color 0.5s var(--ease); }
#main .ins-value-tabs .tab-v-title { font-family: var(--font-display); font-size: 1.125rem; font-weight: 600; color: var(--navy); transition: color 0.5s var(--ease); }
#main .ins-value-tabs .tab-v.is-active .tab-v-tag { color: rgba(255, 255, 255, 0.7); }
#main .ins-value-tabs .tab-v.is-active .ins-value-icon,
#main .ins-value-tabs .tab-v.is-active .tab-v-title { color: #fff; }
#main .ins-value-tabs .genie-wf-panel { height: 100%; padding: 40px; border-radius: 24px; }
.ins-value-panel-icon { display: inline-flex; color: var(--accent); }
#main .ins-value-tabs .genie-wf-head { padding-bottom: 0; margin: 20px 0 24px; border-bottom: 0; }
#main .ins-value-tabs .framl-check-list { gap: 16px; }
#main .ins-value-tabs .framl-check-list li > span { width: 20px; height: 20px; background: none; }
#main .ins-value-tabs .framl-check-list li > span svg { width: 20px; height: 20px; stroke-width: 2; }
@media (max-width: 960px) {
	#main .genie-wf-tabs.ins-value-tabs.tabs-v-layout { grid-template-columns: 1fr; }
	#main .genie-wf-tabs.ins-value-tabs .tab-v { border: 1px solid var(--border); border-radius: var(--radius-lg); }
	#main .ins-value-tabs .genie-wf-panel { padding: 28px; }
}
.genie-wf-tabs .tab-v-tag { font-size: 11px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; color: var(--accent); }
.genie-wf-tabs .tab-v-title { font-size: 1.05rem; line-height: 1.4; text-align: left; }
.genie-wf-tabs .tabs-v-panels { padding: 0; min-height: 0; }
.genie-wf-panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 36px; }
.genie-wf-head { display: flex; align-items: center; gap: 16px; padding-bottom: 24px; margin-bottom: 26px; border-bottom: 1px solid var(--border); }
.genie-wf-head h3 { margin: 0; font-size: 1.5rem; }
.genie-wf-steps { list-style: none; margin: 0 0 26px; padding: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 10px 8px; }
.genie-wf-steps li {
	position: relative; display: inline-flex; align-items: center; padding: 7px 14px;
	border: 1px solid var(--border); border-radius: 999px; background: var(--bg-alt);
	font-size: 13.5px; font-weight: 500; color: var(--navy);
}
.genie-wf-steps li + li { margin-left: 22px; }
.genie-wf-steps li + li::before {
	content: "\203A"; position: absolute; left: -18px; top: 50%; transform: translateY(-54%);
	font-size: 18px; color: var(--accent);
}
.genie-wf-body { font-size: 17px; color: var(--ink-soft); line-height: 1.7; margin: 0 0 26px; padding-bottom: 26px; border-bottom: 1px solid var(--border); }
.genie-wf-result {
	display: inline-flex; align-items: center; gap: 10px; margin: 0; padding: 10px 18px; border-radius: 999px;
	background: var(--accent); color: #fff; font-size: 14px; font-weight: 600; border-radius: 20px;
}

.genie-vs-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.genie-vs-card { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 36px; }
.genie-vs-card.is-genie { background: var(--accent-100); border-color: rgba(var(--accent-rgb), 0.35); }
.genie-vs-tag { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.16em; color: var(--ink-soft); margin: 0 0 24px; }
.genie-vs-card.is-genie .genie-vs-tag { color: var(--accent); }
.genie-vs-card h3 { font-size: 1.45rem; line-height: 1.35; margin: 0 0 20px; }
.genie-vs-card > p:not(.genie-vs-tag) { color: var(--ink-soft); margin: 0; }
.genie-vs-steps { list-style: none; counter-reset: gvs; margin: 0; padding: 0; display: grid; gap: 14px; }
.genie-vs-steps li { counter-increment: gvs; display: flex; align-items: center; gap: 14px; font-size: 15px; color: var(--navy); }
.genie-vs-steps li::before {
	content: counter(gvs); flex: none; display: inline-flex; align-items: center; justify-content: center;
	width: 28px; height: 28px; border-radius: 50%; background: var(--accent); color: #fff; font-size: 13px; font-weight: 700;
}
.genie-vs-note { text-align: center; font-size: 18px; color: var(--navy); max-width: 760px; margin: 48px auto 0; }

.genie-split { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: start; }
.genie-split-title { font-size: clamp(1.8rem, 2.8vw, 2.5rem); line-height: 1.1; margin: 12px 0 28px; }
.genie-split-sub { color: var(--ink-soft); margin: -8px 0 28px; }
.genie-control-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.genie-control-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; color: var(--accent); transition: transform 0.5s var(--ease), background 0.5s var(--ease), border-color 0.5s var(--ease); }
.genie-control-card h3 { font-size: 1.05rem; margin: 14px 0 8px; transition: color 0.5s var(--ease); }
.genie-control-card p { font-size: 14px; color: var(--ink-soft); margin: 0; transition: color 0.5s var(--ease); }
/* Shared across FRAML's modules, AML Insurance's AI/ecosystem grids,
   Sentinel's features, CCCP's differentiators and AI/ML's recognition
   cards -- reference fills every one of these solid accent on hover, so
   fixing it once here covers all of them. */
.genie-control-card:hover { transform: translateY(-4px); background: var(--accent); border-color: var(--accent); }
.genie-control-card:hover > svg { color: #fff; }
.genie-control-card:hover h3 { color: #fff; }
.genie-control-card:hover p { color: rgba(255,255,255,0.85); }
.genie-env-list { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--border); }
/* Hover per the reference: the row slides right and its title turns accent. */
.genie-env-list li { display: flex; align-items: flex-start; gap: 14px; padding: 20px 0; border-bottom: 1px solid var(--border); color: var(--accent); transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1); }
.genie-env-list li:hover { transform: translateX(6px); }
.genie-env-list svg { flex: none; margin-top: 3px; transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1); }
.genie-env-list li:hover svg { transform: scale(1.15); }
.genie-env-list h3 { font-size: 1.05rem; margin: 0 0 4px; transition: color 0.4s var(--ease); }
.genie-env-list li:hover h3 { color: var(--accent); }
.genie-env-list p { font-size: 14.5px; color: var(--ink-soft); margin: 0; }

.genie-regulated { text-align: center; }
.genie-regulated-sub { font-size: 18px; color: var(--ink-soft); max-width: 720px; margin: 14px auto 32px; }
.genie-chip-list { list-style: none; margin: 0 auto; padding: 0; display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; max-width: 900px; }
.genie-chip-list li {
	display: inline-flex; align-items: center; gap: 10px; padding: 10px 20px;
	border: 1px solid var(--border); border-radius: 999px; background: var(--surface); font-size: 14.5px; font-weight: 500; color: var(--navy);
}
.genie-chip-list svg { color: var(--accent); flex: none; }

.genie-role-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 24px; }
.genie-role { border-top: 1px solid var(--border); padding-top: 24px; color: var(--accent); }
.genie-role h3 { font-size: 1.05rem; margin: 14px 0 8px; }
.genie-role p { font-size: 14px; color: var(--ink-soft); margin: 0; }

.genie-action {
	text-align: center; max-width: 1020px; margin: 0 auto; padding: 56px 48px;
	border: 1px solid var(--border); border-radius: 32px; background: var(--surface);
	background-image: radial-gradient(520px 220px at 50% 0%, rgba(var(--accent-rgb), 0.08), transparent 70%);
}
.genie-action h2 { font-size: clamp(1.8rem, 3.2vw, 2.8rem); line-height: 1.1; margin: 12px 0 36px; }
.genie-action .h2-line { white-space: normal; }
.genie-action-list { list-style: none; margin: 0 auto; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 12px; max-width: 780px; text-align: left; }
.genie-action-list li {
	display: flex; align-items: center; gap: 12px; padding: 14px 18px; border: 1px solid var(--border);
	border-radius: var(--radius-md); background: var(--surface); font-size: 14.5px; color: var(--navy);
	transition: color 0.3s var(--ease), border-color 0.3s var(--ease);
}
.genie-action-list li:hover { color: var(--accent); border-color: rgba(var(--accent-rgb), 0.4); }
.genie-action-list svg { flex: none; color: var(--accent); }

@media (max-width: 1100px) {
	.genie-agent-grid { grid-template-columns: repeat(2, 1fr); }
	.genie-agent-grid.sol-pillars-3 { grid-template-columns: repeat(2, 1fr); }
	.genie-role-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 960px) {
	.genie-hero-grid,
	.genie-problem,
	.genie-split,
	.genie-vs-grid,
	.genie-mode-grid { grid-template-columns: 1fr; gap: 32px; }
	.genie-hero-grid { gap: 0; }
	/* width: 100% is required alongside the auto side-margins here, not
	   just cosmetic -- on a grid item, auto inline-margins with no
	   explicit width quietly opt the item OUT of "stretch" sizing (the
	   browser falls back to shrink-to-fit instead), which is the actual
	   cause of "this blank image is too small in mobile version": the
	   abstract placeholder card inside (aspect-ratio, no width of its
	   own) was inheriting that shrunk ~188px box instead of the column's
	   full width. Giving this a definite width first restores stretch,
	   and the auto margins then just center it once max-width caps it. */
	.genie-hero-visual { width: 100%; max-width: 520px; margin: 32px auto 0; }
	/* Was a fixed-240px horizontal-scroll strip with no scroll affordance
	   (no arrow/fade/dots), so the last tab's label just got cut off
	   mid-word at the viewport edge instead of reading as scrollable --
	   on Sentinel's 10-tab module list, tabs 5-10 were pushed off-screen
	   entirely. The rest of the site's own .tabs-v-layout pattern already
	   stacks sub-tabs as a plain vertical list on narrow screens (see the
	   "Sub-tabs... go from a sidebar to a plain vertical list" comment
	   elsewhere in this file) -- this reuses that instead of a second,
	   contradicting mobile treatment just for this one variant. */
	.genie-wf-tabs.tabs-v-layout { grid-template-columns: 1fr; gap: 20px; }
	.genie-wf-tabs .tabs-v { flex-direction: column; max-height: none; overflow: visible; }
	.genie-wf-tabs .tab-v { border-left-width: 2px; border-radius: 0 var(--radius-md) var(--radius-md) 0; }
	.genie-action-list { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
	.genie-agent-grid,
	.genie-agent-grid.sol-pillars-3,
	.genie-role-grid,
	.genie-control-grid,
	.genie-step-grid { grid-template-columns: 1fr; }
	.genie-step-grid li:nth-child(odd) { border-right: 0; }
	.genie-step-grid li:nth-last-child(2) { border-bottom: 1px solid var(--border); }
	.genie-ctas { flex-wrap: wrap; }
	.genie-ctas .btn { width: 100%; justify-content: center; }
	.genie-action { padding: 36px 20px; }
	.genie-wf-panel { padding: 24px 20px; }
}

/* Careers filters on phones -- each dropdown panel hung off its own pill
   (width: max-content), so the ones that wrapped to the right-hand side
   ran past the screen edge and made the whole page scroll sideways. On
   small screens the panel opens full-width under the filter row instead. */
@media (max-width: 560px) {
	.career-filter-row { position: relative; }
	.career-filter-dropdown { position: static; }
	.career-filter-panel { left: 0; right: 0; width: auto; min-width: 0; }
}

/* Alliances (clari5_maybe_render_alliances_page()) -- partner support tab
   panels and the technology-partner cards. */
.alliance-support-items { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 24px; }
.alliance-support-items h4 { font-size: 1.05rem; color: var(--navy); margin: 0 0 8px; }
.alliance-support-items p { font-size: 14.5px; color: var(--ink-soft); margin: 0; }
.genie-wf-panel .alliance-support-items { margin-top: 4px; }
.alliance-tech-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.alliance-tech-card { display: flex; flex-direction: column; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 28px; }
.alliance-tech-logo { height: 84px; display: flex; align-items: center; margin-bottom: 18px; background: #fff; border-radius: var(--radius-md); padding: 10px 14px; }
.alliance-tech-logo img { max-height: 64px; max-width: 180px; width: auto; height: auto; }
.alliance-tech-card h3 { font-size: 1.15rem; margin: 0 0 10px; }
.alliance-tech-card p { font-size: 14.5px; color: var(--ink-soft); margin: 0 0 18px; flex: 1; }
@media (max-width: 960px) { .alliance-tech-grid { grid-template-columns: 1fr; } }

/* ==========================================================================
   Intelligence Hub + Onboarding Intelligence pages (Oct 2026) -- built on
   the AML / Genie / Maestro components; these are the pieces new to them.
   ========================================================================== */
.sol-label { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.16em; color: var(--ink-faint); margin: 0 0 10px; }
.sol-label.is-accent { color: var(--accent); }
.sol-pill-list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 10px; }
.sol-pill-list li { padding: 8px 16px; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); font-size: 14px; color: var(--navy); }
.genie-problem-text .sol-label { margin-top: 28px; color: var(--navy); }

.sol-silo-list { list-style: none; margin: 0 0 20px; padding: 0; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); overflow: hidden; }
.sol-silo-list li { padding: 22px 24px; border-bottom: 1px solid var(--border); transition: background 0.5s var(--ease); }
.sol-silo-list li:last-child { border-bottom: 0; }
.sol-silo-list h3 { font-size: 1.05rem; margin: 0 0 6px; transition: color 0.5s var(--ease); }
.sol-silo-list p { font-size: 14px; color: var(--ink-soft); margin: 0; transition: color 0.5s var(--ease); }
/* Shared "problem/gap/capability" row list across FRAML, Sentinel, CCCP,
   AML Insurance and AI/ML -- reference fills each row solid accent on
   hover with icon/title/body inverted to white. */
.sol-silo-list li:hover { background: var(--accent); }
.sol-silo-list li:hover h3 { color: #fff; }
.sol-silo-list li:hover p { color: rgba(255,255,255,0.85); }
.sol-silo-list li:hover .sol-icon { color: #fff; }
.sol-silo-list p span { color: var(--accent); margin-right: 6px; }
.sol-callout { margin: 0; padding: 22px 24px; border: 1px solid rgba(var(--accent-rgb), 0.35); border-radius: var(--radius-lg); background: var(--accent-100); color: var(--navy); font-size: 15.5px; line-height: 1.6; }
.sol-callout strong { color: var(--accent); }

.sol-segment-switch { justify-content: center; margin-bottom: 36px; }
.sol-card-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.sol-source-card { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 28px; transition: transform 0.4s var(--ease), border-color 0.4s var(--ease); }
.sol-source-card:hover { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.4); }
.sol-source-card h3 { font-size: 1.25rem; margin: 0 0 12px; }
.sol-source-card p:not(.sol-label) { font-size: 14.5px; color: var(--ink-soft); margin: 0; }
.sol-source-card .sol-label { color: var(--cyan, #0E8FA8); }
.sol-integration { max-width: 900px; margin: 48px auto 0; padding: 28px 30px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--bg-alt); }
.sol-integration p:last-child { margin: 0; color: var(--ink-soft); font-size: 15.5px; line-height: 1.7; }
.sol-integration strong { color: var(--navy); }

/* Six use cases -- icon steps on a line, with one detail card below. */
.sol-step-tabs { display: grid; grid-template-columns: repeat(6, 1fr); gap: 12px; position: relative; margin-bottom: 40px; }
.sol-step-tabs::before { content: ''; position: absolute; left: 8%; right: 8%; top: 26px; height: 1px; background: var(--border); }
.sol-step-tab.aml-compare-chip { flex-direction: column; gap: 14px; padding: 0; border: 0; background: transparent; border-radius: 0; text-align: center; position: relative; }
.sol-step-tab.aml-compare-chip.is-active { background: transparent; color: var(--navy); }
.sol-step-icon { display: inline-flex; align-items: center; justify-content: center; width: 52px; height: 52px; border-radius: 50%; border: 1px solid var(--border); background: var(--surface); color: var(--accent); transition: background 0.3s var(--ease), color 0.3s var(--ease); }
.sol-step-tab.is-active .sol-step-icon { background: var(--accent); border-color: var(--accent); color: #fff; box-shadow: 0 0 24px rgba(var(--accent-rgb), 0.45); }
.sol-step-label { font-size: 14px; font-weight: 600; color: var(--ink-soft); line-height: 1.35; }
.sol-step-tab.is-active .sol-step-label { color: var(--navy); }
.sol-step-card { max-width: 900px; margin: 0 auto; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 36px 40px; }
.sol-step-card .aml-compare-panel.is-active { display: flex; gap: 22px; align-items: flex-start; }
.sol-step-card .genie-icon-box { width: 56px; height: 56px; border-radius: 16px; }
.sol-step-card h3 { font-size: 1.5rem; margin: 0 0 12px; }
.sol-step-card p:not(.sol-label) { margin: 0; color: var(--ink-soft); font-size: 16.5px; line-height: 1.7; }

/* Severity-based action logic. */
.sol-severity-list { display: grid; gap: 16px; }
.sol-severity { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 22px 24px; transition: transform 0.3s var(--ease), border-color 0.3s var(--ease); }
.sol-severity:hover { transform: translateX(4px); border-color: rgba(var(--accent-rgb), 0.4); }
.sol-severity-head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; margin-bottom: 14px; }
.sol-severity-head h3 { font-size: 1.1rem; margin: 0; }
.sol-severity-head .sol-label { margin: 0; }
.sol-severity-bar { display: block; height: 5px; border-radius: 999px; background: var(--bg-alt); overflow: hidden; margin-bottom: 14px; }
.sol-severity-bar span { display: block; height: 100%; border-radius: 999px; background: var(--accent); }
.sol-severity.is-critical .sol-severity-bar span { background: #E0384F; }
.sol-severity.is-low .sol-severity-bar span { background: var(--cyan, #0E8FA8); }
.sol-severity p { margin: 0; font-size: 14.5px; color: var(--navy); }
.sol-severity p span { color: var(--accent); margin-right: 8px; }

/* Key capabilities -- two columns of numbered rows. */
.sol-cap-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; column-gap: 48px; }
.sol-cap-grid li { display: flex; gap: 20px; padding: 30px 0; border-top: 1px solid var(--border); }
.sol-cap-n { flex: none; font-family: var(--font-numeric); font-weight: 700; font-size: 1.5rem; color: rgba(var(--accent-rgb), 0.3); transition: color 0.3s var(--ease); }
.sol-cap-grid h3 { display: flex; align-items: center; gap: 10px; font-size: 1.15rem; margin: 2px 0 10px; }
.sol-cap-grid h3 svg { color: var(--accent); flex: none; }
.sol-cap-grid p { margin: 0; font-size: 14.5px; color: var(--ink-soft); }

/* Why -- a two-column table. */
.sol-why-table { max-width: 1020px; margin: 0 auto; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); overflow: hidden; }
.sol-why-row { display: grid; grid-template-columns: 300px 1fr; gap: 32px; padding: 20px 32px; border-bottom: 1px solid var(--border); align-items: center; }
.sol-why-row:last-child { border-bottom: 0; }
.sol-why-row h3 { display: flex; align-items: center; gap: 10px; font-size: 1.02rem; margin: 0; }
.sol-why-row h3 svg { color: var(--accent); flex: none; }
.sol-why-row p { margin: 0; font-size: 14.5px; color: var(--ink-soft); }

/* Onboarding: structural gap 2x2 + typologies. */
.sol-gap-grid { display: grid; grid-template-columns: 1fr 1fr; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); overflow: hidden; }
.sol-gap { padding: 34px 32px; border-bottom: 1px solid var(--border); transition: background 0.5s var(--ease); }
.sol-gap:nth-child(odd) { border-right: 1px solid var(--border); }
.sol-gap:nth-last-child(-n+2) { border-bottom: 0; }
.sol-gap-n { display: block; font-family: var(--font-numeric); font-weight: 700; font-size: 1.8rem; color: rgba(var(--accent-rgb), 0.25); margin-bottom: 18px; transition: color 0.5s var(--ease); }
.sol-gap:hover { background: var(--accent); }
.sol-gap:hover .sol-gap-n { color: rgba(255,255,255,0.5); }
.sol-gap:hover h3 { color: #fff; }
.sol-gap:hover p { color: rgba(255,255,255,0.85); }
.sol-gap h3, .sol-gap p { transition: color 0.5s var(--ease); }
.sol-gap h3 { font-size: 1.25rem; margin: 0 0 12px; }
.sol-gap p { margin: 0; color: var(--ink-soft); }
.sol-typologies { display: grid; grid-template-columns: 1fr 1.6fr; gap: 48px; align-items: center; margin-top: 56px; padding: 36px; border-radius: var(--radius-lg); background: var(--bg-alt); }
.sol-typologies h3 { font-size: clamp(1.4rem, 2.2vw, 1.9rem); margin: 0; }
.sol-typologies ol { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 10px 24px; }
.sol-typologies li { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 12px 16px; border-radius: var(--radius-md); background: var(--surface); border: 1px solid var(--border); font-weight: 600; color: var(--navy); font-size: 14.5px; transition: transform 0.4s var(--ease), border-color 0.4s var(--ease), background 0.4s var(--ease), color 0.4s var(--ease); }
.sol-typologies li:hover { transform: translateY(-3px); border-color: var(--accent); background: var(--accent); color: #fff; }
.sol-typologies .sol-cap-n { font-size: 0.95rem; }

/* Onboarding: five stages. */
.sol-stage-list { list-style: none; margin: 0; padding: 0; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); overflow: hidden; }
.sol-stage-list li { display: grid; grid-template-columns: 80px minmax(0, 1fr) 260px; gap: 24px; align-items: center; padding: 30px 32px; border-bottom: 1px solid var(--border); transition: padding-left 0.4s var(--ease), background 0.4s var(--ease); }
.sol-stage-list li:last-child { border-bottom: 0; }
.sol-stage-list li:hover { padding-left: 40px; background: var(--accent-100); }
.sol-stage-list li:hover .sol-stage-n { color: var(--accent); }
/* "Animation missing as per the design" -- each stage now reveals on its
   own, staggered top to bottom (same fix as FRAML's lifecycle pipeline). */
.sol-stage-list li.reveal:nth-child(1) { transition-delay: 0.05s !important; }
.sol-stage-list li.reveal:nth-child(2) { transition-delay: 0.15s !important; }
.sol-stage-list li.reveal:nth-child(3) { transition-delay: 0.25s !important; }
.sol-stage-list li.reveal:nth-child(4) { transition-delay: 0.35s !important; }
.sol-stage-list li.reveal:nth-child(5) { transition-delay: 0.45s !important; }
.sol-stage-n { font-family: var(--font-numeric); font-weight: 700; font-size: 2rem; color: rgba(var(--accent-rgb), 0.3); transition: color 0.3s var(--ease); }
.sol-stage-list h3 { font-size: 1.2rem; margin: 0 0 8px; }
.sol-stage-list p { margin: 0; color: var(--ink-soft); }
.sol-stage-list .sol-stage-out { font-weight: 600; font-size: 14px; color: var(--accent); }
.sol-typology-line { margin: 0; font-size: 14.5px; color: var(--navy); font-weight: 500; }
.genie-wf-panel .aml-sam-points { margin-bottom: 26px; }

/* Onboarding: correlation table + principles, score bands, impact. */
.sol-correlation { margin-bottom: 40px; }
.sol-principles .genie-mode h3 { font-size: 1.15rem; }
.sol-bands { display: grid; grid-template-columns: repeat(5, 1fr); border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); overflow: hidden; }
.sol-band { padding: 30px 24px; border-right: 1px solid var(--border); }
.sol-band:last-child { border-right: 0; }
.sol-band h3 { font-size: 1.3rem; margin: 0 0 4px; }
.sol-band-risk { color: var(--accent); font-size: 14px; margin: 0 0 18px; }
.sol-band p:last-child { margin: 0; font-size: 14px; color: var(--ink-soft); }
.sol-impact-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 40px; margin: 0 0 48px; border-top: 0; padding-top: 0; }
.sol-impact-stats .aml-row-stat { text-align: left; align-items: flex-start; }

@media (max-width: 1100px) {
	.sol-step-tabs { grid-template-columns: repeat(3, 1fr); row-gap: 28px; }
	.sol-step-tabs::before { display: none; }
	.sol-bands { grid-template-columns: repeat(2, 1fr); }
	.sol-band { border-bottom: 1px solid var(--border); }
	.sol-stage-list li { grid-template-columns: 60px minmax(0, 1fr); }
	.sol-stage-list .sol-stage-out { grid-column: 2; }
}
@media (max-width: 960px) {
	.sol-gap:nth-child(odd) { border-right: 0; }
	.sol-gap:nth-last-child(2) { border-bottom: 1px solid var(--border); }
	.sol-why-row { grid-template-columns: 1fr; gap: 6px; }
	.sol-impact-stats { grid-template-columns: repeat(2, 1fr); }
	.sol-step-card { padding: 26px 22px; }
	.sol-step-card .aml-compare-panel.is-active { flex-direction: column; }
}
@media (max-width: 760px) {
	/* Was in the 960px breakpoint above, which collapsed these to 1
	   column through the whole tablet range (768-960px) -- the reference
	   keeps its 3-col/2-col grids at tablet widths and only stacks on
	   true phone widths, confirmed by direct screenshot comparison at
	   820px on intelligence-hub (.sol-card-grid-3's 3 cards) and
	   onboarding-intelligence (.sol-gap-grid's 2x2). Moved to this
	   narrower breakpoint to match. */
	.sol-card-grid-3, .sol-cap-grid, .sol-gap-grid, .sol-typologies { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
	.sol-step-tabs { grid-template-columns: repeat(2, 1fr); }
	.sol-typologies ol, .sol-bands { grid-template-columns: 1fr; }
	.sol-band { border-right: 0; }
}

/* ==========================================================================
   New Website Changes-7Oct.pdf
   ========================================================================== */

/* Archive pages (Case Studies, Brochures, Insights, Whitepapers, Awards,
   Newsroom/PR, Videos): "Remove the blue hover colour. Keep only the lift
   option on the card" -- no sheen, spotlight glow, media glow, image zoom,
   title or border colour change; a neutral shadow under the lift. */
.archive-lift-only .post-card::before,
.archive-lift-only .post-card::after,
.archive-lift-only .post-card .post-card-media::after { display: none; }
.archive-lift-only .post-card:hover {
	transform: translateY(-6px);
	box-shadow: 0 24px 48px -28px rgba(15, 23, 42, 0.35);
	border-color: rgba(var(--accent-rgb), 0.12);
}
.archive-lift-only .post-card:hover .post-card-title { color: var(--navy); }
.archive-lift-only .post-card:hover .post-card-media img,
.archive-lift-only .post-card:hover .post-card-media.is-logo img { transform: none; }
.archive-lift-only .post-card:hover .post-card-pill { border-color: rgba(var(--accent-rgb), 0.12); }
.archive-lift-only .post-card:hover .post-card-media.is-video::before { transform: none; }

/* "Use different type of images in the header section" -- each archive's
   hero shows a fanned stack of that page's own artwork (award logos, press
   logos, video thumbnails, case-study and whitepaper covers ...) instead of
   the shared orbit graphic. */
.page-hero-stack { position: relative; height: 400px; }
.page-hero-stack-card {
	position: absolute; width: 64%; aspect-ratio: 16 / 10; border-radius: 20px; overflow: hidden;
	background: var(--surface); border: 1px solid var(--border);
	box-shadow: 0 30px 60px -30px rgba(var(--accent-rgb), 0.45);
	transition: transform 0.6s var(--ease);
}
.page-hero-stack-card img { display: block; width: 100%; height: 100%; object-fit: cover; }
.page-hero-stack.is-contain .page-hero-stack-card { background: #fff; }
.page-hero-stack.is-contain .page-hero-stack-card img { object-fit: contain; padding: 22px 28px; }
.page-hero-stack-card-1 { left: 0; top: 18%; transform: rotate(-7deg); z-index: 1; }
.page-hero-stack-card-2 { left: 18%; top: 2%; transform: rotate(2deg); z-index: 2; }
.page-hero-stack-card-3 { right: 0; top: 34%; transform: rotate(7deg); z-index: 3; }
.page-hero-stack:hover .page-hero-stack-card-1 { transform: rotate(-9deg) translateX(-8px); }
.page-hero-stack:hover .page-hero-stack-card-3 { transform: rotate(9deg) translateX(8px); }
.page-hero-stack.has-play .page-hero-stack-card-3::after {
	content: ''; position: absolute; left: 50%; top: 50%; width: 56px; height: 56px; margin: -28px 0 0 -28px; border-radius: 50%;
	background: rgba(var(--accent-rgb), 0.92) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9 7v10l8-5z' fill='%23fff'/%3E%3C/svg%3E") 55% 50% / 26px no-repeat;
	box-shadow: 0 10px 26px -8px rgba(var(--accent-rgb), 0.7);
}
.page-hero-stack-chip { position: absolute; left: 4%; bottom: 0; z-index: 4; animation: none; }
@media (max-width: 900px) {
	.page-hero-stack { display: none; }
}

/* "All H1, H2, H3, Paragraph fonts should be uniform for all pages on the
   website" -- one type scale for every page's content area (#main; header
   and footer keep their own UI sizes). Same Poppins family throughout;
   these override the per-page sizes that had drifted (H1 32–83px, H2
   22–60px, H3 16–32px, body copy 14–18px). Small caps labels, eyebrows,
   tags, chips and stat captions are UI labels set as <p>, not paragraphs,
   so they keep their own size. */
:root {
	--fs-h1: clamp(2.25rem, 4.2vw, 3.375rem);   /* 54px desktop */
	--fs-h2: clamp(1.85rem, 3.2vw, 2.75rem);    /* 44px desktop */
	--fs-h3: clamp(1.15rem, 1.5vw, 1.375rem);   /* 22px desktop */
	--fs-body: 16px;
}
#main h1 { font-size: var(--fs-h1) !important; line-height: 1.08 !important; font-weight: 600 !important; letter-spacing: -0.02em !important; }
#main h2 { font-size: var(--fs-h2) !important; line-height: 1.12 !important; font-weight: 600 !important; letter-spacing: -0.02em !important; }
#main h3 { font-size: var(--fs-h3) !important; line-height: 1.3 !important; font-weight: 600 !important; letter-spacing: -0.01em !important; }
#main p:not(:is(
	.eyebrow, .hero-badge, .logo-strip-label, .capex-caps-label, .capex-console-note, .capex-genie-label, .capex-unified-bar, .capex-alert-bar,
	.risk-pain-label, .aml-eyebrow-pill, .stat-label, .aml-stat-sub, .aml-imp-eyebrow, .aml-imp-stat-label, .aml-imp-response-tag,
	.aml-imp-response-heading, .aml-sam-tag, .aml-compare-tag, .aml-compare-side-tag, .aml-compare-side-text, .efrm-attack-title,
	.efrm-attack-note, .efrm-decision-label, .efrm-decision-note, .efrm-why-label, .genie-wf-result, .genie-vs-tag, .mvp-uc-n, .sol-label,
	.sol-stage-out, .sol-band-risk, .sol-typology-line, .about-leader-title, .about-leader-name, .about-hq-label, .about-hq-value,
	.about-hq-address, .about-office-city, .about-office-address, .contact-orbit-title, .contact-orbit-sub, .contact-form-note,
	.contact-info-label, .contact-info-value, .contact-info-note, .contact-office-city, .contact-office-desc, .contact-offices-heading,
	.success-label, .genie-problem-caption,
	.about-hub-core-title, .about-hub-core-label, .about-industry-title, .about-region-note, .about-office-label,
	.about-region-title, .about-region-count,
	.mvp-cap-matters-label, .mvp-cap-matters-text, .mvp-cap-does,
	.sen-innov-count, .sen-timeline-when, .cc-proof-figure, .cc-proof-caption, .cc-proof-strap
)) {
	font-size: var(--fs-body) !important;
	line-height: 1.65 !important;
}

/* Even card heights across the archive grids -- excerpts clamp to 4 lines. */
.archive-lift-only .post-card-excerpt { display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; }

/* Uniform paragraphs, second pass (New Website Changes-7Oct.pdf) -- these
   sentence-length paragraphs were still sized/weighted as labels. All now
   16px regular like every other paragraph; the workflow result pill keeps
   its bold only because it sits on a solid blue badge. */
#main :is(.aml-imp-response-heading, .efrm-decision-note, .genie-problem-caption, .about-hq-address, .about-office-address,
	.genie-hero-lead, .genie-problem-strong, .sol-stage-out, .sol-typology-line, .genie-wf-result) {
	font-size: var(--fs-body) !important;
	line-height: 1.6 !important;
}
#main :is(.aml-imp-response-heading, .genie-hero-lead, .genie-problem-strong, .sol-stage-out, .sol-typology-line) { font-weight: 400 !important; }

/* ==========================================================================
   FRAML + AML for Insurance pages (Oct 2026)
   ========================================================================== */
.sol-icon-list li { display: flex; gap: 16px; align-items: flex-start; }
.sol-icon { flex: none; color: var(--accent); margin-top: 2px; transition: color 0.5s var(--ease); }

.framl-lifecycle { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: 32px; position: relative; }
/* Sentinel's 6-stage pipeline reuses this component (3 items wraps to 2
   rows on its own) but the ::before connector line below was built for a
   single row of 3 -- hidden here rather than drawing a line that would
   only span the top row. */
.framl-lifecycle-6::before { display: none; }
.framl-lifecycle-6 { row-gap: 40px; }
.framl-lifecycle::before { content: ''; position: absolute; left: 28px; right: 8%; top: 28px; height: 1px; background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.35), rgba(var(--accent-rgb), 0.05)); }
.framl-lifecycle li { position: relative; }
.framl-lifecycle-n { display: inline-flex; align-items: center; justify-content: center; width: 56px; height: 56px; border-radius: 50%; border: 1px solid rgba(var(--accent-rgb), 0.35); background: var(--surface); color: var(--accent); font-weight: 700; font-size: 18px; position: relative; transition: transform 0.4s var(--ease), background 0.4s var(--ease), color 0.4s var(--ease); }
.framl-lifecycle h3 { margin: 26px 0 16px; }
.framl-arrow { color: var(--accent); font-weight: 400; display: inline-block; transition: transform 0.4s var(--ease); }
/* "Animation Missing" on this exact section -- the reveal-in stagger
   (above) wasn't the whole story: the reference also scales the number
   circle solid on hover, nudges the arrow right, and brightens each pill
   tag's border/text. Scoped to .framl-lifecycle so it doesn't touch
   .sol-pill-list's other reuses elsewhere on the site. */
.framl-lifecycle li:hover .framl-lifecycle-n { transform: scale(1.1); background: var(--accent); color: #fff; }
.framl-lifecycle li:hover .framl-arrow { transform: translateX(3px); }
.framl-lifecycle .sol-pill-list li { transition: border-color 0.3s var(--ease), color 0.3s var(--ease); }
.framl-lifecycle li:hover .sol-pill-list li { border-color: rgba(var(--accent-rgb), 0.4); color: var(--navy); }
/* "Animation Missing" on the 3-stage pipeline -- each stage now reveals on
   its own (li gets .reveal, not just the wrapping <ol>), staggered left to
   right so the fraud-to-laundering flow reads as a sequence, not one block
   popping in at once. Same !important-override need as the other explicit
   stagger fixes in this file (main.js's default reveal delay doesn't
   separate same-row siblings enough to read as sequential). */
.framl-lifecycle li.reveal:nth-child(1) { transition-delay: 0.05s !important; }
.framl-lifecycle li.reveal:nth-child(2) { transition-delay: 0.25s !important; }
.framl-lifecycle li.reveal:nth-child(3) { transition-delay: 0.45s !important; }
/* "Animation missing" on the 2x/360°/$4.6B impact row -- same stagger fix. */
.genie-mode-grid .framl-impact:nth-child(1) { transition-delay: 0.1s !important; }
.genie-mode-grid .framl-impact:nth-child(2) { transition-delay: 0.3s !important; }
.genie-mode-grid .framl-impact:nth-child(3) { transition-delay: 0.5s !important; }

/* "Not matching as per the design" -- the "Three steps to a FRAML business
   case" grid of boxed cards didn't match the reference, which lays the
   three steps out as a divided horizontal list (big faint number, title +
   body, duration tag), not a 3-column card grid. */
.framl-steps-list { border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); margin-top: 48px; }
.framl-step-row {
	display: grid; grid-template-columns: 80px 1fr 140px; align-items: center; gap: 24px;
	padding: 32px 0; border-bottom: 1px solid var(--border);
	transition: padding-left 0.4s var(--ease);
}
.framl-step-row:last-child { border-bottom: none; }
.framl-step-row:hover { padding-left: 12px; }
.framl-step-n { font-family: var(--font-numeric); font-size: 2.25rem; font-weight: 700; color: rgba(var(--accent-rgb), 0.3); transition: color 0.3s var(--ease); }
.framl-step-row:hover .framl-step-n { color: var(--accent); }
.framl-step-body h3 { font-size: 1.15rem; margin: 0 0 6px; }
.framl-step-body p { margin: 0; color: var(--ink-soft); font-size: 14.5px; }
.framl-duration { text-align: right; margin: 0; white-space: nowrap; }
@media (max-width: 640px) {
	.framl-step-row { grid-template-columns: 48px 1fr; }
	.framl-duration { grid-column: 2; text-align: left; margin-top: 4px; }
}

.framl-switch { display: flex; width: max-content; margin: 0 auto 32px; }
.framl-transform-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 16px; }
.framl-transform-card { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 22px; min-height: 150px; transition: transform 0.4s var(--ease); }
.framl-transform-card:hover { transform: translateY(-4px); }
.framl-transform-grid.is-framl .framl-transform-card { border-color: rgba(var(--accent-rgb), 0.35); background: var(--accent-100); }
#main .framl-transform-text { font-weight: 600 !important; color: var(--navy); margin: 0; }
/* "X and Tick Yes is missing in the boxes" -- Today (siloed) rows get a
   muted X, FRAML (converged) rows get an accent check, matching the
   reference's per-row today-vs-converged marker. */
.framl-transform-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 4px; }
.framl-transform-icon { display: inline-flex; flex: none; }
.framl-transform-icon.is-x { color: var(--ink-faint); }
.framl-transform-icon.is-check { color: var(--accent); }

.framl-approach-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; align-items: stretch; }
.framl-approach { border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 32px; transition: transform 0.5s var(--ease), border-color 0.5s var(--ease); }
.framl-approach:not(.is-clari5):hover { transform: translateY(-6px); border-color: rgba(var(--accent-rgb), 0.4); }
.framl-approach .sol-label { margin: 20px 0 6px; }
.framl-approach p:not(.sol-label) { margin: 0; color: var(--ink-soft); }
.framl-approach.is-clari5 { background: var(--accent); border-color: var(--accent); box-shadow: 0 24px 48px -24px rgba(var(--accent-rgb), 0.6); }
.framl-approach.is-clari5 h3, .framl-approach.is-clari5 p:not(.sol-label) { color: #fff; }
.framl-approach.is-clari5 .sol-label { color: rgba(255, 255, 255, 0.75); }

.framl-check-list { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 12px; }
.framl-check-list li { display: flex; gap: 12px; align-items: flex-start; color: var(--navy); transition: transform 0.4s var(--ease); }
.framl-check-list li:hover { transform: translateX(4px); }
.framl-check-list li > span { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; background: var(--accent-100); color: var(--accent); margin-top: 1px; }
.genie-control-card > svg { color: var(--accent); }

.framl-impact-value { font-family: var(--font-numeric); font-size: 3rem; font-weight: 700; color: var(--accent); line-height: 1; margin-bottom: 18px; }
.framl-impact .sol-label { margin: -2px 0 12px; }
.framl-duration { margin-top: 14px; }

/* AML for Insurance */
.ins-cost-card { margin-top: 28px; padding: 24px 26px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); }
.ins-cost-card ul { margin: 0; padding-left: 18px; display: grid; gap: 8px; color: var(--navy); }
.ins-cost-card li::marker { color: var(--accent); }
.ins-typology-grid { list-style: none; margin: 0 auto; padding: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; max-width: 1160px; }
.ins-typology-grid li { display: flex; gap: 14px; align-items: flex-start; padding: 22px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); color: var(--navy); transition: transform 0.4s var(--ease), border-color 0.4s var(--ease); }
/* "Provide the visual effect as shown in the design" -- the reference lifts
   each typology card and tints its border/number to accent on hover; ours
   had no hover state at all. */
.ins-typology-grid li:hover { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.4); }
.ins-typology-grid li:hover .sol-cap-n { color: var(--accent); }
/* The stray short accent dash above each number was .aml-deploy-panel's own
   list-bullet rule leaking in (these cards sit in an .aml-deploy-panel too);
   the reference has no dash. Cards also rise in one after another whenever
   their tab is shown, like the reference's staggered reveal. */
.ins-typology-grid li::before { content: none; }
.aml-deploy-panel.is-active .ins-typology-grid li { animation: ins-card-in 0.7s cubic-bezier(0.22, 1, 0.36, 1) backwards; }
.aml-deploy-panel.is-active .ins-typology-grid li:nth-child(2) { animation-delay: 0.07s; }
.aml-deploy-panel.is-active .ins-typology-grid li:nth-child(3) { animation-delay: 0.14s; }
.aml-deploy-panel.is-active .ins-typology-grid li:nth-child(4) { animation-delay: 0.21s; }
.aml-deploy-panel.is-active .ins-typology-grid li:nth-child(5) { animation-delay: 0.28s; }
.aml-deploy-panel.is-active .ins-typology-grid li:nth-child(6) { animation-delay: 0.35s; }
@keyframes ins-card-in { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: translateY(0); } }
@media (prefers-reduced-motion: reduce) { .aml-deploy-panel.is-active .ins-typology-grid li { animation: none; } }
/* "Make them in bullet points in 3 rows" -- 11 scenarios as a bulleted
   list, 4 columns wide so it falls into exactly 3 rows. */
/* "Put bullet arrows or similar icons to create a visual appeal" -- first
   tried an arrow-bullet grid, but the live reference turned out to render
   these as individual rounded pill badges in a flex-wrap, not boxed grid
   rows, each with its own hover fill -- matched that instead now that the
   actual reference (not just the PDF's screenshot of it) has been checked. */
.ins-scenario-list { list-style: none; margin: 28px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 10px; }
.ins-scenario-list svg { flex: none; color: var(--accent); transition: color 0.3s var(--ease), transform 0.3s var(--ease); }
.ins-scenario-list li:hover svg { color: #fff; transform: translateX(2px); }
/* Behavioural analytics card: the four points as a 2x2 grid split by hairline dividers, like the reference. */
.ins-behaviour-card { padding: 40px; }
.ins-behaviour-card h3 { font-size: 1.5rem; line-height: 1.3; margin: 10px 0 28px; }
.ins-behaviour-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; }
.ins-behaviour-grid li { padding: 22px 20px; font-size: 15px; font-weight: 500; color: var(--navy); line-height: 1.45; transition: color 0.3s var(--ease), background 0.3s var(--ease); }
.ins-behaviour-grid li:nth-child(odd) { border-right: 1px solid var(--border); }
.ins-behaviour-grid li:nth-child(n+3) { border-top: 1px solid var(--border); }
.ins-behaviour-grid li:hover { color: var(--accent); background: var(--accent-100); }
#main p.ins-behaviour-note { margin: 24px 0 0; font-size: 14px !important; color: var(--ink-soft); }
@media (max-width: 540px) {
	.ins-behaviour-card { padding: 28px; }
	.ins-behaviour-grid { grid-template-columns: 1fr; }
	.ins-behaviour-grid li:nth-child(odd) { border-right: 0; }
	.ins-behaviour-grid li + li { border-top: 1px solid var(--border); }
}
.ins-scenario-list li {
	display: inline-flex; align-items: center; gap: 7px;
	padding: 7px 14px; border: 1px solid var(--border); border-radius: 999px;
	font-size: 14px; color: var(--navy);
	transition: transform 0.3s var(--ease), border-color 0.3s var(--ease), background 0.3s var(--ease), color 0.3s var(--ease);
}
.ins-scenario-list li:hover { transform: translateY(-2px); border-color: var(--accent); background: var(--accent); color: #fff; }
.ins-ai-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
/* "Put it in 1 line" -- the GenAI spotlight sentence. */
.ins-spotlight { margin-top: 28px; }
#main .ins-spotlight-line { margin: 0; color: var(--navy); white-space: nowrap; }
.ins-eco-grid { grid-template-columns: repeat(4, 1fr); }

.ins-assess { display: grid; grid-template-columns: 1.6fr 1fr; gap: 32px; align-items: start; }
.ins-assess-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.ins-assess-list label { display: flex; align-items: center; gap: 16px; padding: 16px 20px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface); cursor: pointer; color: var(--navy); transition: border-color 0.2s var(--ease), background 0.2s var(--ease); }
.ins-assess-list label:has(input:checked) { border-color: var(--accent); background: var(--accent-100); }
.ins-assess-list input { width: 20px; height: 20px; accent-color: var(--accent); flex: none; }
.ins-assess-n { font-size: 12px; font-weight: 700; color: var(--ink-faint); }
.ins-assess-result { position: sticky; top: 110px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); padding: 32px; }
#main .ins-assess-score { font-family: var(--font-numeric); font-size: 3.5rem !important; font-weight: 700; color: var(--accent); margin: 4px 0 14px; line-height: 1 !important; }
.ins-assess-score small { font-size: 1.4rem; color: var(--ink-soft); }
.ins-assess-bar { display: block; height: 6px; border-radius: 999px; background: var(--bg-alt); overflow: hidden; margin-bottom: 24px; }
.ins-assess-bar span { display: block; height: 100%; width: 0; background: var(--accent); border-radius: 999px; transition: width 0.3s var(--ease), background 0.3s var(--ease); }
.ins-assess-result .btn { width: 100%; justify-content: center; margin-top: 8px; }
.ins-next-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 28px; }

@media (max-width: 1100px) {
	.framl-transform-grid { grid-template-columns: repeat(3, 1fr); }
	.ins-scenario-list { grid-template-columns: repeat(2, 1fr); }
	#main .ins-spotlight-line { white-space: normal; }
	.ins-eco-grid, .ins-next-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 960px) {
	.framl-lifecycle, .framl-approach-grid, .ins-typology-grid, .ins-ai-grid, .ins-assess { grid-template-columns: 1fr; }
	.framl-lifecycle::before { display: none; }
	.ins-assess-result { position: static; }
}
@media (max-width: 640px) {
	.framl-transform-grid, .ins-scenario-list, .ins-eco-grid, .ins-next-grid { grid-template-columns: 1fr; }
	.framl-switch { width: auto; flex-wrap: wrap; }
}

/* ==========================================================================
   New Website Changes-9Oct.pdf
   ========================================================================== */
/* Resource heroes: second CTA ("Subscribe to our newsletter"). */
.page-hero-ctas { display: flex; flex-wrap: wrap; gap: 12px; }
/* Insights hero: "3 cards - Asia, ME, Africa". */
.page-hero-stack-label {
	position: absolute; left: 14px; bottom: 14px;
	padding: 6px 14px; border-radius: 999px;
	background: rgba(255, 255, 255, 0.94); color: var(--navy);
	font-size: 13px; font-weight: 600; letter-spacing: 0.01em;
	box-shadow: 0 6px 18px -8px rgba(15, 23, 42, 0.45);
}
/* Insights filters: search + three dropdowns on one line. */
.archive-select-bar { flex-wrap: nowrap; justify-content: space-between; }
.archive-select-bar .blog-search-box { flex: 1 1 240px; max-width: 360px; }
.archive-select-bar .blog-filter-selects { flex-wrap: nowrap; }
.archive-select-bar select { max-width: 230px; }
.archive-select-reset { font-size: 14px; font-weight: 500; color: var(--accent); white-space: nowrap; }
@media (max-width: 1100px) {
	.archive-select-bar, .archive-select-bar .blog-filter-selects { flex-wrap: wrap; }
	.archive-select-bar .blog-search-box { max-width: none; }
}
/* Insight internal pages. */
.insight-detail-ctas { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 24px; }
.insight-related-heading { margin-top: 64px; }
/* Download popup now carries the Contact Us field set (two columns). */
.cs-modal:has(.cs-download-form) { max-width: 640px; }
.cs-download-form .field-checkbox-group { margin: 6px 0 14px; }
@media (max-width: 640px) {
	.cs-download-form .form-grid { grid-template-columns: 1fr; }
}
/* Header: "Solutions banner should be bigger and wider. Fonts should be
   bigger. Looks very congested." */
/* Widened again per New Website Changes-20Oct.pdf ("still too congested,
   widen it, bigger fonts, make the highlighted icon prominent"): wide
   enough that every label sits on one line, and Insurance's EFRM/AML
   open inline beneath it (the old side flyout had to flip left on laptop
   widths and then covered the first column). main.js's fitMegaMenu()
   nudges the panel left when it would run past the viewport edge. */
@media (min-width: 761px) {
	.mega-menu.is-flat-solutions { width: min(960px, calc(100vw - 48px)); }
	.mega-menu.is-flat-solutions .mega-menu-inner { padding: 40px 48px; }
	.mega-menu.is-flat-solutions .mega-cols { gap: 4px 64px; }
	.mega-menu.is-flat-solutions .mega-link,
	.mega-menu.is-flat-solutions .mega-submenu-trigger { padding: 13px 0; }
	.mega-menu.is-flat-solutions .mega-link-title { font-size: 18px; }
	.mega-menu.is-flat-solutions .mega-submenu,
	.mega-menu.is-flat-solutions .mega-submenu.is-open {
		position: static; display: none; min-width: 0; max-width: none;
		margin: 0 0 8px 2px; padding: 2px 0 2px 18px;
		border: 0; border-left: 2px solid var(--accent); border-radius: 0; box-shadow: none; background: none;
		opacity: 1; visibility: visible; pointer-events: auto; transform: none;
	}
	.mega-menu.is-flat-solutions .mega-submenu.is-open { display: block; }
	.mega-menu.is-flat-solutions .mega-sublink { font-size: 16.5px; padding: 8px 0; }
	.mega-menu.is-flat-solutions .mega-caret-right {
		box-sizing: border-box; width: 30px; height: 30px; padding: 9px 10px 9px 11px;
		border-radius: 50%; background: rgba(var(--accent-rgb), 0.1); color: var(--accent);
		transition: transform 0.25s var(--ease), background 0.25s var(--ease), color 0.25s var(--ease);
	}
	.mega-menu.is-flat-solutions .mega-link-parent:hover .mega-caret-right { transform: none; }
	.mega-menu.is-flat-solutions .mega-submenu-trigger:hover .mega-caret-right { background: var(--accent); color: #fff; }
	.mega-menu.is-flat-solutions .mega-submenu-trigger[aria-expanded="true"] .mega-caret-right { transform: rotate(90deg); background: var(--accent); color: #fff; }
}
/* "Font sizes are different in mega menu drop downs" -- Resources/Company
   (.is-compact) was left at the original 15px link styling while Solutions
   (.is-flat-solutions, above) got bumped to 17px. Match the type size here
   too so every mega menu column reads consistently. Padding/width stay at
   their original, snugger values on purpose (short flat label list, see
   comment above) -- a prior attempt also matched the 13px padding, but
   that read as "dropdown menu is big" once the nav bar below was its only
   other size reference, so just the font-size needs to line up. */
@media (min-width: 761px) {
	.mega-menu.is-compact .mega-link-title { font-size: 17px; }
}
/* Labels sit top-left: the only corner of each fanned card left uncovered. */
.page-hero-stack-label { top: 14px; bottom: auto; }
#main .cs-modal h2 { font-size: 1.5rem !important; line-height: 1.25 !important; }
.cs-download-form .form-grid .field-full { grid-column: 1 / -1; }
/* Insurance flyout: opens to the left when the right edge has no room
   (class set by initMegaSubmenus in main.js). */
@media (min-width: 1081px) {
	.mega-link-parent.opens-left .mega-submenu { left: auto; right: 100%; transform: translateX(-6px); }
	.mega-link-parent.opens-left .mega-submenu.is-open { transform: translateX(0); }
}
@media (hover: hover) and (pointer: fine) and (min-width: 1081px) {
	.mega-link-parent.opens-left:hover .mega-submenu { transform: translateX(0); }
}

/* ==========================================================================
   Sentinel -- six-stage stepper + 3 Pillars (New Website Changes-20Oct.pdf,
   "Follow the design"; reference clari5-flow-vision.lovable.app/sentinel)
   ========================================================================== */
.sen-stepper { position: relative; margin-top: 56px; }
.sen-stepper-track { position: absolute; left: 8%; right: 8%; top: 25px; height: 6px; border-radius: 999px; background: var(--border); overflow: hidden; }
.sen-stepper-fill { display: block; height: 100%; width: 0; border-radius: 999px; background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.6), var(--accent)); box-shadow: 0 0 18px rgba(var(--accent-rgb), 0.5); transition: width 0.7s var(--ease); }
.sen-stepper-list { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 16px; }
.sen-step { display: flex; flex-direction: column; align-items: center; width: 100%; height: 100%; padding: 0; background: none; border: 0; cursor: pointer; text-align: center; font: inherit; }
.sen-step-icon {
	position: relative; z-index: 1; display: flex; align-items: center; justify-content: center; width: 56px; height: 56px; border-radius: 16px;
	border: 1px solid var(--border); background: var(--surface); color: var(--accent); box-shadow: 0 0 0 4px var(--bg);
	transition: transform 0.5s var(--ease), background 0.5s var(--ease), color 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease);
}
.sen-step.is-done .sen-step-icon { background: rgba(var(--accent-rgb), 0.8); border-color: transparent; color: #fff; }
.sen-step.is-active .sen-step-icon { transform: scale(1.1); background: var(--accent); border-color: transparent; color: #fff; box-shadow: 0 0 0 4px var(--bg), 0 12px 30px -6px rgba(var(--accent-rgb), 0.65); }
.sen-step.is-active .sen-step-icon::before { content: ""; position: absolute; inset: 0; border-radius: inherit; background: rgba(var(--accent-rgb), 0.3); animation: sen-ping 1.4s cubic-bezier(0, 0, 0.2, 1) infinite; z-index: -1; }
@keyframes sen-ping { 75%, 100% { transform: scale(1.6); opacity: 0; } }
.sen-step-card {
	display: block; flex: 1; width: 100%; margin-top: 20px; padding: 16px; border: 1px solid var(--border); border-radius: 16px; background: var(--surface);
	transition: background 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease);
}
.sen-step:hover .sen-step-card { border-color: rgba(var(--accent-rgb), 0.4); }
.sen-step-n { display: block; font-family: var(--font-display); font-size: 12px; font-weight: 600; color: var(--accent); }
.sen-step-title { display: block; margin-top: 4px; font-family: var(--font-display); font-size: 15.5px; font-weight: 600; line-height: 1.35; color: var(--navy); }
.sen-step.is-active .sen-step-card { background: var(--accent); border-color: var(--accent); box-shadow: 0 14px 34px -12px rgba(var(--accent-rgb), 0.65); }
.sen-step.is-active .sen-step-n { color: rgba(255, 255, 255, 0.8); }
.sen-step.is-active .sen-step-title { color: #fff; }
#main p.sen-stepper-caption { margin: 28px auto 0; max-width: 640px; text-align: center; font-size: 15px !important; color: var(--ink-soft); min-height: 1.6em; }
.sen-pillars-title { margin: 88px 0 40px; text-align: center; font-size: clamp(1.5rem, 2.6vw, 2.1rem); font-weight: 700; letter-spacing: -0.02em; line-height: 1.2; }
.sol-pillars-3 .genie-agent-card { padding: 32px; }
.sol-pillars-3 .genie-icon-box { width: 56px; height: 56px; border-radius: 16px; }
.sol-pillars-3 .genie-agent-card h3 { margin-top: 8px; }
@media (max-width: 1080px) {
	.sen-stepper-track { display: none; }
	.sen-stepper-list { grid-template-columns: repeat(3, minmax(0, 1fr)); row-gap: 28px; }
}
@media (max-width: 560px) {
	.sen-stepper-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.sen-step-title { font-size: 14px; }
}
@media (prefers-reduced-motion: reduce) { .sen-step.is-active .sen-step-icon::before { animation: none; } }

/* Sentinel -- "Ten integrated modules" rebuilt to the reference: a
   two-column grid of compact icon cards beside the detail panel. */
#main .genie-wf-tabs.sentinel-module-tabs.tabs-v-layout { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 24px; align-items: stretch; }
#main .sentinel-module-tabs .tabs-v { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; flex-direction: initial; }
#main .sentinel-module-tabs .tab-v {
	flex-direction: row; align-items: center; gap: 12px; min-height: 72px; padding: 16px; height: 100%;
	border: 1px solid var(--border); border-radius: 16px; background: var(--surface);
	transition: background 0.3s var(--ease), border-color 0.3s var(--ease), box-shadow 0.3s var(--ease);
}
#main .sentinel-module-tabs .tab-v:hover { transform: none; border-color: rgba(var(--accent-rgb), 0.4); }
#main .sentinel-module-tabs .tab-v.is-active { background: var(--accent); border-color: var(--accent); box-shadow: 0 14px 34px -12px rgba(var(--accent-rgb), 0.65); }
#main .sentinel-module-tabs .sen-mod-icon { display: inline-flex; flex: none; color: var(--accent); }
#main .sentinel-module-tabs .tab-v-tag { flex: none; font-family: var(--font-display); font-size: 12px; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--accent); }
#main .sentinel-module-tabs .tab-v-title { font-size: 14px; font-weight: 600; line-height: 1.35; color: var(--navy); }
#main .sentinel-module-tabs .tab-v.is-active .sen-mod-icon,
#main .sentinel-module-tabs .tab-v.is-active .tab-v-tag,
#main .sentinel-module-tabs .tab-v.is-active .tab-v-title { color: #fff; }
#main .sentinel-module-tabs .genie-wf-panel { height: 100%; padding: 40px; border-radius: 24px; }
.sen-mod-panel-tag { display: flex; align-items: center; gap: 12px; color: var(--accent); }
.sen-mod-panel-tag span { font-family: var(--font-display); font-size: 14px; font-weight: 700; }
#main .sentinel-module-tabs .genie-wf-head { padding-bottom: 0; margin: 20px 0 12px; border-bottom: 0; }
#main .sentinel-module-tabs .sen-mod-summary { margin: 0 0 24px; color: var(--ink-soft); }
.sen-mod-points { list-style: none; margin: 0; padding: 0; display: grid; gap: 14px; }
.sen-mod-points li { position: relative; padding-left: 18px; font-size: 14.5px; line-height: 1.6; color: var(--navy); }
.sen-mod-points li::before { content: ""; position: absolute; left: 0; top: 0.65em; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
@media (max-width: 960px) {
	#main .genie-wf-tabs.sentinel-module-tabs.tabs-v-layout { grid-template-columns: 1fr; }
	#main .genie-wf-tabs.sentinel-module-tabs .tab-v { border: 1px solid var(--border); border-radius: 16px; }
	#main .genie-wf-tabs.sentinel-module-tabs .tab-v.is-active { border-color: var(--accent); }
	#main .sentinel-module-tabs .genie-wf-panel { padding: 28px; }
}
@media (max-width: 480px) {
	#main .sentinel-module-tabs .tabs-v { grid-template-columns: 1fr; }
}

/* Sentinel -- "09 / Where Sentinel breaks from the market" per the reference. */
.sen-innov-head { display: flex; align-items: flex-end; justify-content: center; gap: 24px; text-align: left; }
#main .sen-innov-count { margin: 0; font-family: var(--font-display); font-size: 6rem !important; font-weight: 700; line-height: 1 !important; color: var(--accent); letter-spacing: -0.03em; }
.sen-innov-head .eyebrow { margin: 0; }
.sen-innov-head h2 { margin: 12px 0 0; font-size: clamp(1.8rem, 3vw, 2.25rem); font-weight: 700; line-height: 1.1; letter-spacing: -0.02em; }
.sen-innov-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; margin-top: 56px; }
.sen-innov-card { height: 100%; padding: 28px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); transition: transform 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease); }
.sen-innov-card:hover { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.5); box-shadow: 0 14px 34px -14px rgba(var(--accent-rgb), 0.45); }
.sen-innov-n { font-family: var(--font-display); font-size: 14px; font-weight: 700; color: var(--accent); }
.sen-innov-card h3 { margin: 12px 0 8px; font-size: 1.125rem; line-height: 1.35; }
#main .sen-innov-card p { margin: 0; font-size: 14px !important; line-height: 1.65 !important; color: var(--ink-soft); }
@media (max-width: 960px) { .sen-innov-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) {
	.sen-innov-head { flex-direction: column; align-items: center; text-align: center; gap: 12px; }
	.sen-innov-grid { grid-template-columns: 1fr; }
}

/* Sentinel -- headline metrics as a 4x2 panel (two rows), per the reference. */
.sen-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border: 1px solid var(--border); border-radius: 24px; overflow: hidden; background: var(--surface); }
.sen-metric { display: flex; flex-direction: column; gap: 10px; padding: 32px; border-right: 1px solid var(--border); border-bottom: 1px solid var(--border); transition: background 0.4s var(--ease); }
.sen-metric:nth-child(4n) { border-right: 0; }
.sen-metric:nth-last-child(-n+4) { border-bottom: 0; }
.sen-metric:hover { background: var(--accent-100); }
.sen-metric-value { font-family: var(--font-display); font-size: clamp(1.9rem, 2.6vw, 2.4rem); font-weight: 700; line-height: 1.1; letter-spacing: -0.02em; color: var(--accent); }
.sen-metric-label { font-size: 14px; line-height: 1.5; color: var(--ink-soft); }
@media (max-width: 860px) {
	.sen-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.sen-metric:nth-child(4n) { border-right: 1px solid var(--border); }
	.sen-metric:nth-child(2n) { border-right: 0; }
	.sen-metric:nth-last-child(-n+4) { border-bottom: 1px solid var(--border); }
	.sen-metric:nth-last-child(-n+2) { border-bottom: 0; }
	.sen-metric { padding: 24px; }
}

/* Sentinel -- "16 weeks to go-live" timeline per the reference. */
.sen-timeline { position: relative; margin-top: 56px; }
.sen-timeline-line { position: absolute; left: 10%; right: 10%; top: 22px; height: 3px; border-radius: 999px; background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.3), var(--accent) 50%, rgba(var(--accent-rgb), 0.3)); }
.sen-timeline-list { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 24px; }
.sen-timeline-list li { display: flex; flex-direction: column; align-items: center; }
.sen-timeline-node { position: relative; z-index: 1; display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 50%; background: var(--accent); color: #fff; font-family: var(--font-display); font-size: 15px; font-weight: 700; box-shadow: 0 0 0 6px var(--bg), 0 8px 24px -4px rgba(var(--accent-rgb), 0.6); transition: transform 0.4s var(--ease); }
.sen-timeline-list li:hover .sen-timeline-node { transform: scale(1.12); }
.sen-timeline-card { flex: 1; width: 100%; margin-top: 24px; padding: 28px 22px; text-align: center; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); transition: transform 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease); }
.sen-timeline-list li:hover .sen-timeline-card { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.4); box-shadow: 0 14px 34px -14px rgba(var(--accent-rgb), 0.4); }
#main .sen-timeline-when { margin: 0; font-size: 12px !important; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; color: var(--cyan-glow); }
.sen-timeline-card h3 { margin: 10px 0 10px; font-size: 1.125rem; line-height: 1.4; }
#main .sen-timeline-text { margin: 0; font-size: 14px !important; line-height: 1.65 !important; color: var(--ink-soft); }
@media (max-width: 1080px) {
	.sen-timeline-line { left: 21px; right: auto; top: 0; bottom: 0; width: 3px; height: auto; background: linear-gradient(180deg, rgba(var(--accent-rgb), 0.3), var(--accent) 50%, rgba(var(--accent-rgb), 0.3)); }
	.sen-timeline-list { grid-template-columns: 1fr; gap: 20px; }
	.sen-timeline-list li { flex-direction: row; align-items: flex-start; gap: 20px; }
	.sen-timeline-card { margin-top: 0; text-align: left; }
}

/* ==========================================================================
   Cybercrime Complaint Processing (New Website Changes-20Oct.pdf; reference
   clari5-flow-vision.lovable.app/cybercrime-complaint-processing)
   ========================================================================== */
/* Golden Hour dial beside "Why it matters". */
.cc-golden { display: flex; flex-direction: column; align-items: center; }
.cc-golden-dial { position: relative; display: flex; align-items: center; justify-content: center; width: 100%; max-width: 380px; aspect-ratio: 1; }
.cc-golden-aura { position: absolute; inset: 0; border-radius: 50%; background: radial-gradient(circle, rgba(var(--accent-rgb), 0.16), transparent 70%); animation: cc-aura 6s ease-in-out infinite; }
.cc-golden-orbit { position: absolute; inset: 24px; border-radius: 50%; border: 1px dashed rgba(var(--accent-rgb), 0.3); animation: cc-spin 40s linear infinite; }
.cc-golden-face { position: absolute; inset: 56px; border-radius: 50%; border: 1px solid var(--border); background: var(--surface); box-shadow: 0 0 40px -6px rgba(var(--accent-rgb), 0.45); }
.cc-golden-text { position: relative; display: flex; flex-direction: column; align-items: center; text-align: center; color: var(--accent); }
.cc-golden-value { margin-top: 12px; font-family: var(--font-display); font-size: clamp(2.4rem, 4vw, 3rem); font-weight: 700; line-height: 1; color: var(--navy); }
.cc-golden-label { margin-top: 10px; font-size: 12px; letter-spacing: 0.25em; text-transform: uppercase; color: var(--ink-soft); }
#main p.cc-golden-tagline { margin: 36px 0 0; text-align: center; font-family: var(--font-display); font-size: 1.25rem !important; font-weight: 600; line-height: 1.4 !important; color: var(--navy); }
@keyframes cc-spin { to { transform: rotate(360deg); } }
@keyframes cc-aura { 0%, 100% { opacity: 0.75; transform: scale(1); } 50% { opacity: 1; transform: scale(1.05); } }
@media (prefers-reduced-motion: reduce) { .cc-golden-aura, .cc-golden-orbit { animation: none; } }
/* "One lifecycle, from ingestion to resolution." -- the missing section. */
.cc-lifecycle-card { max-width: 1024px; margin: 0 auto; padding: 48px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); }
#main .cc-lifecycle-card p { margin: 0; font-size: 18px !important; line-height: 1.7 !important; color: var(--ink-soft); }
.cc-lifecycle-card strong { font-weight: 600; color: var(--navy); }
/* "Eight capabilities" as a 4x2 card grid; a card fills accent on hover. */
.cc-cap-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; }
.cc-cap-card { height: 100%; padding: 28px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); transition: transform 0.5s var(--ease), background 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease); }
.cc-cap-top { display: flex; align-items: center; justify-content: space-between; color: var(--accent); transition: color 0.5s var(--ease); }
.cc-cap-top span { font-family: var(--font-display); font-size: 14px; font-weight: 700; color: var(--ink-soft); transition: color 0.5s var(--ease); }
.cc-cap-card h3 { margin: 24px 0 12px; font-size: 1.125rem; line-height: 1.35; transition: color 0.5s var(--ease); }
#main .cc-cap-card p { margin: 0; font-size: 14px !important; line-height: 1.65 !important; color: var(--ink-soft); transition: color 0.5s var(--ease); }
.cc-cap-card:hover { transform: translateY(-6px); background: var(--accent); border-color: var(--accent); box-shadow: 0 18px 40px -14px rgba(var(--accent-rgb), 0.65); }
.cc-cap-card:hover .cc-cap-top, .cc-cap-card:hover .cc-cap-top span, .cc-cap-card:hover h3 { color: #fff; }
#main .cc-cap-card:hover p { color: rgba(255, 255, 255, 0.85); }
@media (max-width: 1080px) { .cc-cap-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 600px) {
	.cc-cap-grid { grid-template-columns: 1fr; }
	.cc-lifecycle-card { padding: 28px; }
}
/* "12 weeks to go-live" + proven performance as two side-by-side cards. */
.cc-proof-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
.cc-proof-card { padding: 44px 40px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); }
.cc-proof-card.is-accent { background: var(--accent); border-color: var(--accent); color: #fff; box-shadow: 0 20px 50px -18px rgba(var(--accent-rgb), 0.7); }
.cc-proof-card .eyebrow::before { display: none; }
.cc-proof-card.is-accent .eyebrow { color: rgba(255, 255, 255, 0.75); }
#main .cc-proof-figure { margin: 18px 0 0; font-family: var(--font-display); font-size: clamp(3rem, 5vw, 4rem); font-weight: 700; line-height: 1; letter-spacing: -0.03em; color: var(--accent); }
.cc-proof-figure small { font-size: 1.6rem; font-weight: 600; letter-spacing: -0.01em; color: var(--navy); }
#main .cc-proof-card.is-accent .cc-proof-figure { color: #fff; }
#main .cc-proof-caption { margin: 12px 0 0; font-size: 14px; color: var(--ink-soft); }
#main .cc-proof-card.is-accent .cc-proof-caption { color: rgba(255, 255, 255, 0.85); }
#main p.cc-proof-text { margin: 24px 0 0; color: var(--ink-soft); }
#main .cc-proof-card.is-accent p.cc-proof-text { color: rgba(255, 255, 255, 0.9); }
#main .cc-proof-strap { margin: 24px 0 0; font-family: var(--font-display); font-size: 1.125rem; font-weight: 600; color: var(--navy); }
#main .cc-proof-card.is-accent .cc-proof-strap { color: #fff; }
@media (max-width: 860px) {
	.cc-proof-grid { grid-template-columns: 1fr; }
	.cc-proof-card { padding: 32px 28px; }
}

/* ==========================================================================
   Alliances -- rebuilt to the new reference (clari5-flow-vision.lovable.app/alliances)
   ========================================================================== */
/* Hero ecosystem card */
.al-eco-card { position: relative; width: 100%; max-width: 448px; margin-left: auto; padding: 24px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); box-shadow: 0 24px 60px -24px rgba(15, 23, 42, 0.25); }
.al-eco-head { display: flex; align-items: center; justify-content: space-between; font-size: 11px; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink-soft); }
.al-eco-live { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px; background: var(--accent-100); color: var(--accent); letter-spacing: 0; text-transform: none; font-size: 11px; }
.al-eco-live i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; animation: al-blink 1.6s ease-in-out infinite; }
@keyframes al-blink { 50% { opacity: 0.3; } }
.al-eco-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin-top: 18px; }
.al-eco-node { display: flex; align-items: center; gap: 10px; min-height: 54px; padding: 10px 12px; border: 1px solid var(--border); border-radius: 14px; font-size: 12.5px; font-weight: 600; line-height: 1.25; color: var(--navy); transition: border-color 0.3s var(--ease), transform 0.3s var(--ease); }
.al-eco-node:hover { border-color: rgba(var(--accent-rgb), 0.45); transform: translateY(-2px); }
.al-eco-icon { display: inline-flex; flex: none; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 9px; background: var(--accent-100); color: var(--accent); }
.al-eco-link { display: block; width: 1px; height: 32px; margin: 14px auto; background: linear-gradient(var(--border), var(--accent)); position: relative; }
.al-eco-link::before { content: ""; position: absolute; left: -3px; top: 6px; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); animation: al-flow 1.8s ease-in-out infinite; }
@keyframes al-flow { 0% { transform: translateY(-6px); opacity: 0; } 50% { opacity: 1; } 100% { transform: translateY(22px); opacity: 0; } }
.al-eco-core { display: flex; align-items: center; gap: 14px; padding: 16px 20px; border-radius: 16px; background: var(--accent); color: #fff; box-shadow: 0 16px 34px -12px rgba(var(--accent-rgb), 0.7); }
.al-eco-core span { display: flex; flex-direction: column; font-size: 12px; color: rgba(255, 255, 255, 0.85); }
.al-eco-core strong { font-family: var(--font-display); font-size: 15px; color: #fff; }
.al-eco-tags { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 10px; }
.al-eco-tags span { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 8px; border: 1px solid var(--border); border-radius: 12px; font-size: 12px; font-weight: 600; color: var(--navy); }
.al-eco-tags svg { color: var(--accent); }
@media (prefers-reduced-motion: reduce) { .al-eco-live i, .al-eco-link::before { animation: none; } }
/* Six reasons */
.al-reason-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
.al-reason-card { height: 100%; padding: 28px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); transition: transform 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease); }
.al-reason-card:hover { transform: translateY(-4px); border-color: rgba(var(--accent-rgb), 0.45); box-shadow: 0 14px 34px -14px rgba(var(--accent-rgb), 0.4); }
.al-reason-icon { display: inline-flex; color: var(--accent); transition: transform 0.5s var(--ease); }
.al-reason-card:hover .al-reason-icon { transform: translateY(-3px); }
.al-reason-card h3 { margin: 22px 0 12px; font-size: 1.125rem; line-height: 1.4; }
#main .al-reason-card p { margin: 0; font-size: 14.5px !important; color: var(--ink-soft); }
/* Partner ecosystem cards */
.al-type-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
.al-type-card { display: flex; flex-direction: column; height: 100%; padding: 28px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); transition: transform 0.5s var(--ease), border-color 0.5s var(--ease), box-shadow 0.5s var(--ease); }
.al-type-card:hover { transform: translateY(-4px); border-color: var(--accent); box-shadow: 0 14px 34px -14px rgba(var(--accent-rgb), 0.4); }
.al-type-top { display: flex; align-items: flex-start; justify-content: space-between; }
.al-type-icon { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 50%; background: var(--accent-100); color: var(--accent); }
.al-type-n { font-family: var(--font-display); font-size: 2.6rem; font-weight: 700; line-height: 1; color: rgba(var(--accent-rgb), 0.12); transition: color 0.5s var(--ease); }
.al-type-card:hover .al-type-n { color: rgba(var(--accent-rgb), 0.3); }
.al-type-card h3 { margin: 22px 0 16px; font-size: 1.25rem; }
#main p.al-type-label { margin: 0 0 6px; font-size: 11px !important; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink-soft); }
#main p.al-type-who { margin: 0 0 18px; font-size: 14.5px !important; line-height: 1.5 !important; color: var(--navy); }
#main p.al-type-how { margin: 0 0 22px; font-size: 14.5px !important; line-height: 1.5 !important; color: var(--ink-soft); }
.al-type-link { margin-top: auto; font-size: 14.5px; font-weight: 600; color: var(--accent); }
.al-type-link span { display: inline-block; transition: transform 0.3s var(--ease); }
.al-type-link:hover span { transform: translateX(4px); }
/* Partner types in detail */
.al-detail-tabs { margin: 0 auto 32px; flex-wrap: wrap; justify-content: center; }
.al-detail-panel li::before { content: none; }
.al-detail-panel.is-active { display: grid; grid-template-columns: minmax(0, 0.62fr) minmax(0, 1fr); border: 1px solid var(--border); border-radius: 24px; overflow: hidden; background: var(--surface); }
.al-detail-lead { padding: 40px; background: var(--accent); color: #fff; }
#main p.al-detail-eyebrow { margin: 22px 0 10px; font-size: 12px !important; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; color: rgba(255, 255, 255, 0.8); }
#main .al-detail-lead h3 { margin: 0 0 20px; color: #fff; }
#main p.al-detail-intro { margin: 0; color: rgba(255, 255, 255, 0.9); }
#main p.al-detail-step { margin: 24px 0 0; padding: 16px 18px; border-radius: 16px; background: rgba(255, 255, 255, 0.14); font-size: 14.5px !important; line-height: 1.5 !important; font-weight: 600; color: #fff; }
.al-detail-lists { padding: 40px; }
#main p.al-detail-label { margin: 0 0 14px; font-size: 12px !important; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; color: var(--cyan-glow); }
.al-detail-lists ul { list-style: none; margin: 0 0 28px; padding: 0; display: grid; gap: 12px; }
.al-detail-lists ul:last-child { margin-bottom: 0; }
.al-detail-lists li, .al-lookfor li { display: flex; gap: 12px; align-items: flex-start; font-size: 14.5px; line-height: 1.55; color: var(--navy); }
.al-detail-lists li svg, .al-lookfor li svg { flex: none; margin-top: 3px; color: var(--accent); }
/* Partner path */
.al-path { position: relative; list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 24px; }
.al-path::before { content: ""; position: absolute; left: 0; right: 0; top: 23px; height: 1px; background: var(--border); }
.al-path li { position: relative; }
.al-path-n { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 50%; background: var(--accent); color: #fff; font-family: var(--font-display); font-weight: 700; box-shadow: 0 0 0 6px var(--bg-alt), 0 10px 24px -6px rgba(var(--accent-rgb), 0.6); transition: transform 0.4s var(--ease); }
.al-path li:hover .al-path-n { transform: scale(1.1); }
.al-path h3 { margin: 22px 0 10px; font-size: 1.125rem; }
#main .al-path p { margin: 0; font-size: 14.5px !important; color: var(--ink-soft); }
.al-lookfor { margin-top: 56px; padding: 40px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); }
.al-lookfor ul { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.al-lookfor li { padding: 20px; border-radius: 16px; background: var(--bg-alt); }
/* Become a partner */
.al-join { display: grid; grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); gap: 56px; align-items: start; }
.al-join-text h2 { margin: 12px 0 20px; }
.al-join-card { padding: 36px; border: 1px solid var(--border); border-radius: 24px; background: var(--surface); box-shadow: 0 0 60px -12px rgba(var(--accent-rgb), 0.35); }
.al-join-form.contact-form { margin-top: 0; }
.al-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.al-form-grid input, .al-form-grid select, .al-form-grid textarea { width: 100%; padding: 13px 16px; border: 1px solid var(--border); border-radius: 14px; background: var(--bg); font: inherit; font-size: 14.5px; color: var(--navy); transition: border-color 0.2s var(--ease), box-shadow 0.2s var(--ease); }
.al-form-grid input:focus, .al-form-grid select:focus, .al-form-grid textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.15); }
.al-form-grid .al-form-full { grid-column: 1 / -1; }
.al-form-grid textarea { resize: vertical; min-height: 104px; }
.al-join-submit { width: 100%; justify-content: center; margin-top: 16px; }
@media (max-width: 1080px) {
	.al-path { grid-template-columns: repeat(3, minmax(0, 1fr)); row-gap: 40px; }
	.al-path::before { display: none; }
	.al-join { grid-template-columns: 1fr; gap: 32px; }
}
@media (max-width: 960px) {
	.al-reason-grid, .al-type-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.al-detail-panel.is-active { grid-template-columns: 1fr; }
	.al-lookfor ul { grid-template-columns: 1fr; }
	.al-eco-card { margin: 0 auto; }
}
@media (max-width: 640px) {
	.al-reason-grid, .al-type-grid, .al-form-grid { grid-template-columns: 1fr; }
	.al-path { grid-template-columns: 1fr; }
	.al-detail-lead, .al-detail-lists, .al-lookfor, .al-join-card { padding: 28px; }
	.al-detail-tabs.aml-deploy-switch { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); width: 100%; border-radius: 20px; }
	.al-detail-tabs .aml-deploy-option { padding: 10px 8px; font-size: 13px; white-space: normal; border-radius: 14px; }
}

/* Sentinel hero: one phrase per line ("Manual to Intelligent." / "Fragmented to Unified." / "Opaque to Transparent."). */
.h1-line { display: block; }
@media (min-width: 641px) {
	/* Keep the standard h1 size (consistent headings sitewide) and give this
	   hero a wider text column instead, so each phrase fits on one line. */
	.h1-line { white-space: nowrap; }
}
@media (min-width: 961px) {
	.genie-hero-grid:has(.h1-line) { grid-template-columns: 1.35fr 1fr; }
}

/* ==========================================================================
   Mega menus, unified (Consasia WhatsApp 22 Oct): every dropdown uses the
   main-menu tab font (16px / 500), the same row spacing, and Resources /
   About Us get a wider box. A menu closes instantly (only opening fades),
   so clicking from one dropdown to the next never shows both at once.
   ========================================================================== */
.mega-menu { transition: none; }
.mega-menu.is-open { transition: opacity 0.25s var(--ease), visibility 0.25s; }
@media (hover: hover) and (pointer: fine) {
	.has-mega:hover .mega-menu { transition: opacity 0.25s var(--ease), visibility 0.25s; }
}
@media (min-width: 761px) {
	.mega-menu.is-flat-solutions .mega-link-title,
	.mega-menu.is-compact .mega-link-title { font-size: 16px; font-weight: 500; line-height: 1.4; }
	.mega-menu.is-flat-solutions .mega-link,
	.mega-menu.is-flat-solutions .mega-submenu-trigger,
	.mega-menu.is-compact .mega-link { padding: 11px 0; }
	.mega-menu.is-flat-solutions .mega-cols,
	.mega-menu.is-compact .mega-cols { row-gap: 4px; }
	.mega-menu.is-flat-solutions { width: min(860px, calc(100vw - 48px)); }
	.mega-menu.is-flat-solutions .mega-cols { column-gap: 56px; }
	.mega-menu.is-compact { width: min(540px, calc(100vw - 48px)); }
	.mega-menu.is-compact .mega-menu-inner { padding: 32px 40px; }
	.mega-menu.is-compact .mega-cols { column-gap: 48px; }
	.mega-menu.is-flat-solutions .mega-sublink { font-size: 15px; padding: 8px 0; }
}

/* Careers (Consasia WhatsApp 22 Oct): "need more spacing" between the
   filter row and the stats strip below it, and the resume "Choose File"
   button in the site's own pill-button style instead of the browser grey. */
.career-filters-section { padding-bottom: 56px; }
.field input[type="file"] { cursor: pointer; color: var(--ink-soft); }
.field input[type="file"]::file-selector-button {
	margin-right: 14px; padding: 9px 20px; border: 1px solid var(--accent); border-radius: 999px;
	background: var(--accent-100); color: var(--accent); font: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
	transition: background 0.25s var(--ease), color 0.25s var(--ease);
}
.field input[type="file"]:hover::file-selector-button { background: var(--accent); color: #fff; }

/* Alliances: primary "Become a partner" CTA under the partner-type detail. */
.al-detail-cta { display: flex; justify-content: center; margin-top: 40px; }
/* Captcha + consent inside the partner form card. */
.al-join-form .field-captcha { margin-top: 18px; }
.al-join-form .field-checkbox-group { margin: 14px 0 0; }
#partner-types, #partner-ecosystem, #become-a-partner { scroll-margin-top: 90px; }

/* ==========================================================================
   Cookie consent v2 (Consasia WhatsApp 22 Oct, reference bakerhughes.com):
   wide banner with Cookie Settings / Reject / Accept, plus a Preference
   Center modal with per-category switches.
   ========================================================================== */
.cookie-consent { max-width: 1080px; flex-wrap: nowrap; align-items: flex-end; gap: 28px; padding: 24px 28px; }
.cookie-consent-body { flex: 1 1 auto; }
.cookie-consent-title { margin: 0 0 8px; font-family: var(--font-display); font-size: 16px; font-weight: 600; color: var(--navy); }
.cookie-consent-text { font-size: 13px; line-height: 1.6; }
.cookie-consent-actions { align-items: center; flex-wrap: wrap; justify-content: flex-end; }
.cookie-consent-actions .btn { white-space: nowrap; }
.cookie-link-btn { padding: 9px 16px; border: 1px solid var(--navy); border-radius: 999px; font-size: 13px; font-weight: 600; color: var(--navy); text-decoration: underline; text-underline-offset: 3px; background: var(--surface); transition: background 0.2s var(--ease), color 0.2s var(--ease); }
.cookie-link-btn:hover { background: var(--navy); color: #fff; }
@media (max-width: 900px) {
	.cookie-consent { flex-wrap: wrap; align-items: stretch; }
	.cookie-consent-actions { width: 100%; justify-content: stretch; }
	.cookie-consent-actions > * { flex: 1 1 auto; }
}

/* Preference Center */
.cookie-prefs { position: fixed; inset: 0; z-index: 700; display: flex; align-items: center; justify-content: center; padding: 20px; }
.cookie-prefs[hidden] { display: none; }
.cookie-prefs-backdrop { position: absolute; inset: 0; background: rgba(10, 14, 26, 0.55); opacity: 0; transition: opacity 0.25s var(--ease); }
.cookie-prefs-panel { position: relative; display: flex; flex-direction: column; width: min(860px, 100%); max-height: min(640px, calc(100vh - 40px)); background: var(--surface); border-radius: var(--radius-lg); box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.45); overflow: hidden; opacity: 0; transform: translateY(16px) scale(0.98); transition: opacity 0.25s var(--ease), transform 0.25s var(--ease); }
.cookie-prefs.is-open .cookie-prefs-backdrop { opacity: 1; }
.cookie-prefs.is-open .cookie-prefs-panel { opacity: 1; transform: none; }
html.cookie-prefs-open { overflow: hidden; }
.cookie-prefs-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 18px 24px; border-bottom: 1px solid var(--border); }
.cookie-prefs-title { margin: 0; font-family: var(--font-display); font-size: 18px; font-weight: 600; color: var(--navy); }
.cookie-prefs-close { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border: 1px solid var(--border); border-radius: 10px; color: var(--navy); }
.cookie-prefs-close:hover { border-color: var(--accent); color: var(--accent); }
.cookie-prefs-main { display: grid; grid-template-columns: 240px minmax(0, 1fr); min-height: 0; flex: 1; }
.cookie-prefs-nav { display: flex; flex-direction: column; border-right: 1px solid var(--border); background: var(--bg-alt); overflow-y: auto; }
.cookie-prefs-nav button { padding: 14px 20px; border-left: 3px solid transparent; border-bottom: 1px solid var(--border); text-align: left; font-size: 13.5px; font-weight: 600; color: var(--ink-soft); transition: background 0.2s var(--ease), color 0.2s var(--ease); }
.cookie-prefs-nav button:hover { color: var(--navy); }
.cookie-prefs-nav button.is-active { border-left-color: var(--accent); background: var(--surface); color: var(--navy); }
.cookie-prefs-content { padding: 24px 28px; overflow-y: auto; }
.cookie-prefs-pane[hidden] { display: none; }
.cookie-prefs-pane-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 12px; }
.cookie-prefs-pane-title { margin: 0 0 12px; font-family: var(--font-display); font-size: 16px; font-weight: 600; color: var(--navy); }
.cookie-prefs-pane-head .cookie-prefs-pane-title { margin: 0; }
.cookie-prefs-pane p { font-size: 13.5px; line-height: 1.65; }
.cookie-prefs-pane a { color: var(--accent); font-weight: 600; }
.cookie-always-on { font-size: 13px; font-weight: 600; color: var(--accent); white-space: nowrap; }
.cookie-switch { position: relative; display: inline-flex; flex: none; cursor: pointer; }
.cookie-switch input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.cookie-switch-track { position: relative; width: 44px; height: 24px; border-radius: 999px; background: var(--border); transition: background 0.2s var(--ease); }
.cookie-switch-track::after { content: ""; position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25); transition: transform 0.2s var(--ease); }
.cookie-switch input:checked + .cookie-switch-track { background: var(--accent); }
.cookie-switch input:checked + .cookie-switch-track::after { transform: translateX(20px); }
.cookie-switch input:focus-visible + .cookie-switch-track { outline: 2px solid var(--accent); outline-offset: 2px; }
.cookie-prefs-foot { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 10px; padding: 16px 24px; border-top: 1px solid var(--border); }
.screen-reader-text { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
.footer-cookie-settings { padding: 0; font: inherit; color: inherit; text-decoration: none; cursor: pointer; }
.footer-cookie-settings:hover { text-decoration: underline; }
@media (max-width: 640px) {
	.cookie-prefs { padding: 0; align-items: flex-end; }
	.cookie-prefs-panel { max-height: 92vh; border-radius: 20px 20px 0 0; }
	.cookie-prefs-main { grid-template-columns: 1fr; }
	.cookie-prefs-nav { flex-direction: row; overflow-x: auto; border-right: 0; border-bottom: 1px solid var(--border); }
	.cookie-prefs-nav button { flex: none; border-left: 0; border-bottom: 3px solid transparent; }
	.cookie-prefs-nav button.is-active { border-bottom-color: var(--accent); }
	.cookie-prefs-foot .btn { flex: 1 1 100%; justify-content: center; }
}
@media (max-width: 640px) {
	.cookie-consent-actions { flex-direction: column; align-items: stretch; gap: 8px; }
	.cookie-consent-actions > *, .cookie-consent-actions .btn { flex: none; width: 100%; justify-content: center; white-space: normal; }
	.cookie-consent-text { font-size: 12.5px; }
}

/* Live search: results dim briefly while the next set loads. */
form.is-searching ~ * { opacity: 0.55; transition: opacity 0.2s var(--ease); }
