/* ============================================================================
   funnel.css — VAL-134 industry funnel pages + plan-modal document
   ----------------------------------------------------------------------------
   Loaded AFTER css/style.css on: prop-firms.html and its 6 siblings
   (generated from tools/funnels/template.html) and on plan-modal.html.

   RULES THIS FILE OBEYS
   1. Every selector, keyframe and custom property introduced here is `fnl-`
      prefixed, or is an override of an existing class scoped under one of
      .fnl-page / .fnl-hero / .fnl-modal-page / .fnl-faq / .fnl-s11 / .fnl-modal.
      No bare existing class is ever restyled globally.
   2. css/style.css is NEVER edited. Everything the funnel needs to change about
      an inherited rule is re-declared here at equal-or-higher specificity; this
      file loads second, so equal specificity wins.
   3. Z-index contract (FINAL — supersedes the storyboard §0c draft values,
      because style.css:1891 puts a stray z-index:3000 in the root stacking
      context, so 1200 is not the ceiling):
         in-page: tiles 1 · scrim 2 · content/media 3 · islands 4 ·
                  in-media controls 5 · header 6
         gallery preview modal shell 3400
         plan modal shell 3500 · its close button 3501
   4. Section order below mirrors page order. Responsive work is consolidated at
      the end, mobile-last (max-width), in the site's own idiom:
      1400 · 1200 · 991 · 767 · 575 · 390 · 360.
   5. ONE prefers-reduced-motion block, last in the file.
   ========================================================================== */


/* ============================================================================
   1. TOKENS
   ========================================================================== */

.fnl-page,
.fnl-modal-page {
	/* motion (storyboard §0d) */
	--fnl-ease-out: cubic-bezier(.22, .61, .36, 1);
	--fnl-ease-io: cubic-bezier(.65, 0, .35, 1);

	/* surfaces (storyboard §0e) */
	--fnl-bg: #091811;
	--fnl-rail: #050E0A;
	--fnl-stage: #0A1410;
	--fnl-card-bg: linear-gradient(180deg, #0C1B14 0%, #091811 100%);
	--fnl-border: 1px solid rgba(255, 255, 255, .09);
	--fnl-border-hover: rgba(255, 255, 255, .16);
	--fnl-inner-light: inset 0 1px 0 rgba(255, 255, 255, .05);
	--fnl-divider: 1px solid rgba(255, 255, 255, .07);
	--fnl-glass-bg: rgba(5, 14, 10, .45);
	--fnl-glass-border: 1px solid rgba(255, 255, 255, .18);
	--fnl-media-shadow: 0 30px 70px -40px rgba(0, 0, 0, .8);

	/* radii */
	--fnl-r-card: 20px;
	--fnl-r-media: 18px;
	--fnl-r-tile: 12px;
	--fnl-r-chip: 14px;

	/* palette */
	--fnl-green: #00FF8A;
	--fnl-white: #fff;
	--fnl-sub: #A9CDBB;
	--fnl-muted: #83B59F;
	--fnl-dim: #5E8272;
	--fnl-answer: #9DC3B0;

	/* rhythm (storyboard §0f; per-breakpoint values in the responsive block) */
	--fnl-secpad: 100px;
	--fnl-gap: 24px;
}


/* ============================================================================
   2. GATES — A/B variant, offer, plan-modal mode, scroll lock
   ----------------------------------------------------------------------------
   All three gates are pure CSS off attributes/classes set on <html> by an
   inline <head> script, so the losing copy is display:none from the very first
   style resolution: zero flash, zero CLS, and the winning markup is the only
   thing ever painted.
   ========================================================================== */

/* --- 2a. A/B copy variants (arch §7) ------------------------------------- */
html.fnl-var-a .fnl-v--b,
html.fnl-var-b .fnl-v--a {
	display: none !important;
}

/* --- 2b. Offer-gated CTA clusters (arch §3) ------------------------------ */
.fnl-cta[data-fnl-cta] {
	display: none;
}

html[data-fnl-offer="book_call"] .fnl-cta[data-fnl-cta="book_call"],
html[data-fnl-offer="subscription"] .fnl-cta[data-fnl-cta="subscription"],
html[data-fnl-offer="free_trial"] .fnl-cta[data-fnl-cta="free_trial"] {
	display: flex;
	flex-direction: column;
}

/* --- 2c. Offer-gated pricing-card CTAs ---------------------------------- */
/* !important on both sides: these sit on .filled-btn / .regular-btn, which
   style.css declares display:inline-flex at the same (0,1,0) specificity, and a
   pricing card must never show two CTAs for two different offers. */
.fnl-offer-only {
	display: none !important;
}

html[data-fnl-offer="book_call"] .fnl-offer-only--book_call,
html[data-fnl-offer="subscription"] .fnl-offer-only--subscription,
html[data-fnl-offer="free_trial"] .fnl-offer-only--free_trial {
	display: inline-flex !important;
}

/* A free_trial CTA must additionally lose to plan-modal trial/paid mode: a
   .fnl-trial-only element inside a paid document stays hidden even when the
   offer gate would show it (both use !important; the mode gate is later). */

/* --- 2d. plan-modal.html paid|trial mode (arch §4) ---------------------- */
html.fnl-mode-paid .fnl-trial-only {
	display: none !important;
}

html.fnl-mode-trial .fnl-paid-only {
	display: none !important;
}

/* --- 2e. Body scroll lock — class-based, NEVER inline style -------------
   script.js:960 (Calendly close) unconditionally clears
   document.body.style.overflow. A class on <html> is immune to that clobber,
   which is exactly why the inline-style approach would be a bug. */
html.fnl-locked,
html.fnl-locked body {
	overflow: hidden;
}


/* ============================================================================
   3. PAGE BASE + INHERITED-STYLE GUARDS
   ----------------------------------------------------------------------------
   style.css drops <p> to 14px at ≤1200 and 12px at ≤767 in many places, forces
   text-transform:capitalize on .h2-title (which would render "At 1% Of The
   Price."), and colours FAQ answers #5E8272 at 12px. None of that may reach a
   conversion page. The floor uses :where() so it stays at (0,1,0) specificity
   and every intentional per-element size below beats it on source order.
   ========================================================================== */

.fnl-page,
.fnl-modal-page {
	background-color: var(--fnl-bg);
	overflow-x: hidden;
}

.fnl-main {
	display: block;
	position: relative;
}

.fnl-page :where(p),
.fnl-page :where(li),
.fnl-modal-page :where(p) {
	font-size: 16px;
	letter-spacing: -0.03em;
}

/* Never capitalize funnel headings. */
.fnl-page .h2-title,
.fnl-page .fnl-h2,
.fnl-page .fnl-hero__h1,
.fnl-modal-page .h2-title {
	text-transform: none;
}

.fnl-page img,
.fnl-modal-page img {
	max-width: 100%;
}

.fnl-page ul,
.fnl-modal-page ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Section frame shared by every funnel band. */
.fnl-s1,
.fnl-s2,
.fnl-s3,
.fnl-s4,
.fnl-fs,
.fnl-s11,
.fnl-s12 {
	position: relative;
	padding-top: var(--fnl-secpad);
	padding-bottom: var(--fnl-secpad);
}

.fnl-s2,
.fnl-s3 {
	border-bottom: var(--fnl-divider);
}


/* ============================================================================
   4. SHARED COMPONENTS — pill, section head, H2/sub, CTA cluster, stars,
      reveal, sr-only
   ========================================================================== */

/* --- 4a. .fnl-pill — the section eyebrow (storyboard §0g, replaces
   .pre-title, which appears nowhere on the funnel) ------------------------ */
.fnl-pill {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	height: 30px;
	padding: 0 14px;
	border-radius: 999px;
	background: rgba(0, 255, 138, .07);
	border: 1px solid rgba(0, 255, 138, .22);
	font-family: "Inter", sans-serif;
	font-size: 12px;
	line-height: 1;
	font-weight: 500;
	letter-spacing: .10em;
	text-transform: uppercase;
	color: var(--fnl-green);
	white-space: nowrap;
}

/* --- 4b. Centred section head block ------------------------------------- */
.fnl-sechead {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
}

.fnl-sechead .fnl-pill {
	margin-bottom: 18px;
}

/* --- 4c. Headings and subheads ------------------------------------------ */
.fnl-h2 {
	margin: 0;
	font-family: "Rethink Sans", sans-serif;
	font-weight: 600;
	font-size: 54px;
	line-height: 92%;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	text-transform: none;
	max-width: 900px;
}

.fnl-h2 .colored,
.fnl-h2 span.colored {
	color: var(--fnl-green);
}

/* two-column sections (S5–S10) run a shorter measure and a smaller size */
.fnl-h2--col {
	font-size: 40px;
	line-height: 95%;
	max-width: 520px;
}

.fnl-h2--final {
	font-size: 68px;
	line-height: 92%;
	max-width: 900px;
}

.fnl-sub {
	margin: 18px 0 0;
	font-size: 18px;
	line-height: 150%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-sub);
	max-width: 720px;
}

.fnl-sub--col {
	max-width: 480px;
}

.fnl-sechead .fnl-h2 + .fnl-sub {
	margin-top: 18px;
}

/* --- 4d. .fnl-cta — one CTA cluster, placed 12× ------------------------
   Funnel CTAs are 48px / 15px (storyboard D2): 43px fails the 44px touch
   minimum and this is the primary conversion control. Scoped under .fnl-page
   so the global button classes are untouched. */
.fnl-cta {
	margin-top: 40px;
}

.fnl-cta__btns {
	display: flex;
	align-items: flex-start;
	gap: 15px;
}

.fnl-cta__subtext {
	display: block;
	margin: 14px 0 0;
	max-width: 560px; /* the free_trial subtext is 46 chars — 380px forced a second line on desktop (Ben #5) */
	font-size: 14px;
	line-height: 130%;
	font-weight: 400;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
}

.fnl-cta--hero,
.fnl-cta--lite {
	text-align: left;
}

.fnl-cta--hero .fnl-cta__btns,
.fnl-cta--lite .fnl-cta__btns {
	justify-content: flex-start;
}

.fnl-cta--inline,
.fnl-cta--final {
	text-align: center;
}

.fnl-cta--inline .fnl-cta__btns,
.fnl-cta--final .fnl-cta__btns {
	justify-content: center;
}

.fnl-cta--inline .fnl-cta__subtext,
.fnl-cta--final .fnl-cta__subtext {
	margin-left: auto;
	margin-right: auto;
}

/* the free-trial offer renders one button only — cap it so it never stretches */
.fnl-cta__primary,
.fnl-cta__secondary {
	max-width: 420px;
	flex: 0 1 auto;
}

/* 48px / 15px button geometry, funnel-scoped */
.fnl-page .fnl-cta .filled-btn,
.fnl-page .fnl-cta .regular-btn,
.fnl-page .fnl-plan__cta,
.fnl-page .fnl-backtop,
.fnl-modal-page .fnl-plan__cta {
	height: 48px;
	padding: 16px 28px;
	font-size: 15px;
	line-height: 90%;
	font-weight: 500;
	letter-spacing: -0.03em;
}

.fnl-page .fnl-cta .filled-btn:hover,
.fnl-page .fnl-enterprise__btn .filled-btn:hover {
	/* keep the site's arrow slide-in working: the padding SHIFT is part of
	   the animation (style.css:842) and our 0,3,0 padding override was
	   freezing it — the .fb-in arrow then overlapped the label (Ben #24) */
	padding-left: 54px;
	padding-right: 14px;
}

/* --- 4e. .fnl-stars — 5 glyphs, fractional fill via --stars -------------
   Two stacked rows: the <i> elements are the empty row; ::after is the filled
   row, clipped to calc(var(--stars) / 5 * 100%). No half-star assets needed.
   The mask tile is 20×16 (16px star + 4px gap) so both rows share one period. */
/* NOTE: `--stars` is set inline by the generated markup (partials/case-study.html)
   and is therefore the one custom property on the page without an `fnl-` prefix.
   This file never DEFINES it — it is only read, with a fallback — so the
   generator's lint rule 6 ("no unprefixed var declared in css/funnel.css")
   still passes. */
.fnl-stars {
	--fnl-star: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='16' viewBox='0 0 20 16'%3E%3Cpath d='M8 0l2.06 4.45L15 5.17l-3.5 3.09L12.36 13 8 10.35 3.64 13l.86-4.74L1 5.17l4.94-.72z' fill='%23000'/%3E%3C/svg%3E");
	position: relative;
	display: block;
	width: 100px;
	height: 16px;
	font-size: 0;
}

.fnl-stars > i {
	display: inline-block;
	width: 20px;
	height: 16px;
	background-color: rgba(255, 255, 255, .18);
	-webkit-mask-image: var(--fnl-star);
	        mask-image: var(--fnl-star);
	-webkit-mask-size: 20px 16px;
	        mask-size: 20px 16px;
	-webkit-mask-repeat: no-repeat;
	        mask-repeat: no-repeat;
}

.fnl-stars::after {
	content: "";
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	width: calc(var(--stars, 5) / 5 * 100%);
	background-color: var(--fnl-green);
	-webkit-mask-image: var(--fnl-star);
	        mask-image: var(--fnl-star);
	-webkit-mask-size: 20px 16px;
	        mask-size: 20px 16px;
	-webkit-mask-repeat: repeat-x;
	        mask-repeat: repeat-x;
	-webkit-mask-position: left center;
	        mask-position: left center;
}

/* --- 4f. .fnl-reveal — the one shared entrance mechanism (storyboard §0d)
   Never applied to hero copy: the H1/sub/CTA must render at full opacity on
   first paint (LCP). Stagger via --d in 70ms steps, hard cap 280ms. */
.fnl-reveal {
	opacity: 0;
	transform: translate3d(0, 14px, 0);
	transition:
		opacity .5s var(--fnl-ease-out),
		transform .6s var(--fnl-ease-out);
	transition-delay: var(--d, 0ms);
}

.fnl-reveal.is-in {
	opacity: 1;
	transform: none;
}

/* --- 4g. sr-only ------------------------------------------------------- */
.sr-only {
	position: absolute !important;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}


/* ============================================================================
   5. HEADER
   ----------------------------------------------------------------------------
   Logo only. It is a <span>, not an <a> — nothing on this page may read as an
   escape route, so the inherited hover drop-shadow is killed and the cursor
   stays default. z-index 6 so the logo sits above the metric islands (z4).
   ========================================================================== */

.fnl-header {
	position: absolute;
	top: 30px;
	left: 0;
	width: 100%;
	z-index: 6;
}

.fnl-header .outer__header {
	display: flex;
	align-items: center;
	justify-content: flex-start;
}

.fnl-header__logo {
	display: inline-flex;
	align-items: center;
	cursor: default;
	pointer-events: none;
}

.fnl-header__logo img {
	display: block;
	width: 154px;
	height: 30px;
	filter: none;
}

.fnl-header__logo:hover img {
	filter: none;
}


/* ============================================================================
   6. HERO
   ----------------------------------------------------------------------------
   Reuses .hero__grid--video + the .vmarq builder from style.css/script.js.
   What is added here and nowhere else:
     · .fnl-hero__tiles repositioning so the tile field frames the PLAYER
       instead of the copy
     · a retuned ::after scrim (copy side fully solid, player side lightly
       veiled) — storyboard §3.5
     · the 730px/1fr copy-media split with the metric islands living in the
       56px gutter, which is the whole trick: the islands never cover the
       creative because there is somewhere else for them to be
     · the reduced-motion guard style.css never got (finding 0.17)
   ========================================================================== */

.fnl-hero {
	position: relative;
	z-index: 2;
	overflow: hidden;
	min-height: 855px;
	padding: 96px 0 72px;
	display: flex;
	align-items: center;
	border-bottom: var(--fnl-divider);
}

/* --- 6a. Tile field (z1) ------------------------------------------------ */
.fnl-hero .fnl-hero__tiles.grid-float {
	position: absolute;
	top: -60px;
	right: 0;
	left: auto;
	width: 88%;
	display: flex;
	gap: 25px;
	align-items: center;
	justify-content: flex-end;
	z-index: 1;
}

/* --- 6b. Retuned legibility scrim (z2) — storyboard §3.5 ---------------
   Vertical gradient kept exactly as style.css has it; the horizontal one is
   replaced so the copy column sits over ≥86% opaque scrim (white on #050D09
   ≈ 19:1, the #A9CDBB subhead ≈ 10:1) while the player side stays readable
   as moving media. */
.fnl-hero.hero__grid--video::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 2;
	/* Ben #48: the /video page curve VERBATIM — the previous retune (solid to
	   42% + .86 veil) buried the tiles. /video proves copy stays readable over
	   the lighter veil. */
	background:
		linear-gradient(90deg,
			#050D09 0%,
			#050D09 24%,
			rgba(5, 13, 9, .72) 50%,
			rgba(5, 13, 9, .5) 78%,
			rgba(5, 13, 9, .62) 100%),
		linear-gradient(0deg,
			rgba(5, 13, 9, .85) 0%,
			rgba(5, 13, 9, 0) 22%,
			rgba(5, 13, 9, 0) 80%,
			rgba(5, 13, 9, .7) 100%);
}

.fnl-hero > .container {
	position: relative;
	z-index: 3;
}

/* --- 6c. The 57/38.5 split (storyboard §3.1) --------------------------- */
.fnl-hero__grid {
	display: grid;
	grid-template-columns: 730px 1fr;
	column-gap: 56px;
	align-items: center;
}

.fnl-hero__copy {
	position: relative;
	z-index: 3;
	text-align: left;
}

/* --- 6d. Trusted-by row ------------------------------------------------ */
.fnl-trust {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	height: 24px;
	margin: 0 0 28px;
	font-size: 16px;
	line-height: 100%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
}

.fnl-trust svg {
	flex: 0 0 auto;
}

.fnl-trust b {
	font-weight: 600;
}

/* --- 6e. H1 + subhead -------------------------------------------------- */
.fnl-hero__h1 {
	margin: 0;
	font-family: "Rethink Sans", sans-serif;
	font-weight: 500;
	font-size: 56px;
	line-height: 95%;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	max-width: 730px;
	text-transform: none;
}

.fnl-hero__h1 .colored,
.fnl-hero__h1 span.colored {
	color: var(--fnl-green);
}

.fnl-hero__sub {
	margin: 24px 0 0;
	font-size: 18px;
	line-height: 145%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-sub);
	max-width: 600px;
}

.fnl-hero__copy .fnl-cta {
	margin-top: 40px;
}

/* --- 6f. Media column + player ---------------------------------------- */
.fnl-hero__media {
	position: relative;
	z-index: 3;
	display: flex;
	flex-direction: column;
	align-items: center;
}

.fnl-hero-player {
	position: relative;
	width: 320px;
	height: 569px;
	aspect-ratio: 9 / 16;
	border-radius: 16px;
	overflow: hidden;
	border: 1px solid rgba(255, 255, 255, .14);
	box-shadow: 0 40px 90px -40px rgba(0, 0, 0, .85);
	background-color: #05100B;
	cursor: pointer;
	-webkit-tap-highlight-color: transparent;
}

.fnl-hero-poster,
.fnl-hero-player video,
.fnl-hero-video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: 50% 35%;
	transition: opacity .32s var(--fnl-ease-out);
}

.fnl-hero-poster {
	z-index: 1;
}

/* funnel.js hides the poster inline on `canplay` and restores it inline if it
   has to abandon the rotator; these two are the belt for the case where the
   inline path never runs. */
.fnl-hero-player.is-playing .fnl-hero-poster {
	opacity: 0;
}

.fnl-hero-player.is-abandoned .fnl-hero-poster {
	opacity: 1;
}

/* A square/landscape clip in the rotation gets contain + a blurred self-fill
   rather than a cover-crop that would cut faces. funnel.js injects
   .fnl-hero-backfill as the player's first child and drives its
   background-image / opacity entirely with inline styles, so the only thing
   this file owes it is a stacking slot that the poster and videos sit above. */
.fnl-hero-player[data-fit="contain"] video,
.fnl-hero-player[data-fit="contain"] .fnl-hero-video {
	object-fit: contain;
}

.fnl-hero-backfill {
	z-index: 0;
}

/* overlay legibility scrim for the in-media chrome (arch §5b) */
.fnl-hero-player::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 4;
	background: linear-gradient(180deg,
		rgba(2, 9, 5, .55) 0%,
		rgba(2, 9, 5, 0) 22%,
		rgba(2, 9, 5, 0) 74%,
		rgba(2, 9, 5, .5) 100%);
}

/* --- 6g. In-media controls (z5) ---------------------------------------- */
/* right-anchored so the 40px sound button at top-LEFT can never collide
   with the pill (it did at 405px player width) */
.fnl-hero-chrome {
	position: absolute;
	top: 14px;
	right: 14px;
	left: 14px;
	z-index: 5;
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: 8px;
	flex-wrap: wrap;
}

.fnl-hero-pill {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	height: 26px;
	padding: 0 10px 0 8px;
	border-radius: 999px;
	background: rgba(5, 14, 10, .42);
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	border: 1px solid rgba(255, 255, 255, .16);
	font-size: 11px;
	line-height: 1;
	font-weight: 500;
	letter-spacing: .02em;
	color: var(--fnl-white);
	white-space: nowrap;
}

/* Ben #39/#40: no chip box at all — every mark ships transparent, so the logo
   sits bare on the footage (drop-shadow for legibility) at the SAME height as
   the Created-by pill. The old glass rectangle read as a broken half-box. */
.fnl-hero-clientlogo {
	display: inline-flex;
	align-items: center;
	justify-content: flex-end;
	height: 26px;
}

.fnl-hero-clientlogo img {
	display: block;
	max-height: 26px;
	max-width: 124px;
	width: auto;
	height: auto;
	object-fit: contain;
	opacity: .98;
	filter: drop-shadow(0 2px 8px rgba(0, 0, 0, .55));
}

/* Monochrome white for vector monos only — inverting a raster chip turns any
   residual background box solid white (Ben #33). */
.fnl-hero-clientlogo img[src$=".svg"] {
	filter: brightness(0) invert(1) drop-shadow(0 2px 8px rgba(0, 0, 0, .55));
}

/* Mute toggle — top LEFT, always visible (never hover-gated). */
.fnl-hero-sound {
	position: absolute;
	bottom: 18px;
	right: 14px;
	z-index: 5;
	color: #fff; /* button UA color is black — the icon is currentColor (Ben #32) */
	width: 40px;
	height: 40px;
	padding: 0;
	border-radius: 250px;
	border: var(--fnl-glass-border);
	background: var(--fnl-glass-bg);
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}

/* 44×44 tap target without a 44px visual */
.fnl-hero-sound::before {
	content: "";
	position: absolute;
	inset: -2px;
}

.fnl-hero-sound svg,
.fnl-hero-sound img {
	position: relative;
	width: 18px;
	height: 18px;
	pointer-events: none;
}

.fnl-hero-play {
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	z-index: 5;
	width: 64px;
	height: 64px;
	padding: 0;
	border-radius: 999px;
	border: var(--fnl-glass-border);
	background: var(--fnl-glass-bg) url("../img/play-btn.svg") center / 20px 20px no-repeat;
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	cursor: pointer;
	transition: opacity .26s var(--fnl-ease-out);
}

/* #3 While playing, the control shows a PAUSE glyph rather than staying a play
   arrow -- it used to fade out entirely, so the icon never reflected state and
   there was no visible way to pause. It stays dimmed so it does not fight the
   footage, and comes to full strength on hover/focus. */
.fnl-hero-player.is-engaged.is-playing .fnl-hero-play {
	opacity: .45;
	pointer-events: auto;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Crect x='6' y='4' width='4' height='16' rx='1.2'/%3E%3Crect x='14' y='4' width='4' height='16' rx='1.2'/%3E%3C/svg%3E");
	background-size: 20px 20px;
}

.fnl-hero-player.is-engaged.is-playing:hover .fnl-hero-play,
.fnl-hero-player.is-engaged.is-playing .fnl-hero-play:focus-visible {
	opacity: 1;
}

/* Ambient rotation (playing but not engaged) keeps the original behaviour: the
   control stays out of the way and only appears on hover. */
.fnl-hero-player.is-playing:not(.is-engaged) .fnl-hero-play {
	opacity: 0;
	pointer-events: none;
}
.fnl-hero-player.is-playing:not(.is-engaged):hover .fnl-hero-play {
	opacity: 1;
	pointer-events: auto;
}

.fnl-hero-progress {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 5;
	height: 2px;
	background: rgba(255, 255, 255, .16);
}

.fnl-hero-progress > i {
	display: block;
	height: 100%;
	width: 0;
	background: var(--fnl-green);
}

/* --- 6h. Metric islands (z4) — storyboard §3.4 -------------------------
   Positions are relative to the player box and offset OUTWARD into the 87px
   of side slack, so the union of island rectangles never intrudes on the
   central 70% of the creative. Anti-jank per arch §6: tabular figures +
   a ch-based min-width mean a textContent write 4×/s triggers no layout;
   `contain` scopes any residual work; the float is transform-only on the
   compositor and never touches the property the ticker writes. */
/* The islands container is sized to the PLAYER box, not to the media column,
   so the vertical percentages below are percentages of the creative — which is
   what makes the "never intrude on the central 70%" rule verifiable. The media
   column centres its children and the player is its first in-flow child, so
   left:50%/translateX(-50%) at top:0 lands exactly on the player. */
.fnl-islands {
	position: absolute;
	top: 0;
	left: 50%;
	transform: translateX(-50%);
	width: 320px;
	height: 569px;
	z-index: 4;
	pointer-events: none;
}

.fnl-island {
	position: absolute;
	width: 132px;
	height: 56px;
	padding: 9px 12px;
	display: grid;
	row-gap: 4px;
	align-content: center;
	border-radius: var(--fnl-r-chip);
	background: rgba(9, 24, 17, .55);
	-webkit-backdrop-filter: blur(14px);
	        backdrop-filter: blur(14px);
	border: 1px solid rgba(255, 255, 255, .12);
	box-shadow: 0 18px 40px -22px rgba(0, 0, 0, .7);
	contain: layout style paint;
	will-change: transform;
}

.fnl-island--tl {
	top: 6%;
	left: -98px;
}

.fnl-island--br {
	top: 44%;
	right: -108px;
}

.fnl-island--bl {
	top: 79%;
	left: -92px;
}

.fnl-island__label {
	font-size: 11px;
	line-height: 100%;
	font-weight: 500;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--fnl-muted);
	white-space: nowrap;
}

.fnl-island__value {
	display: inline-block;
	min-width: 7ch;
	text-align: left;
	font-family: "Rethink Sans", sans-serif;
	font-size: 22px;
	line-height: 100%;
	font-weight: 600;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	font-variant-numeric: tabular-nums;
	font-feature-settings: "tnum" 1;
	white-space: nowrap;
}

/* Three 7px sine drifts at non-harmonic periods never sync, so it reads
   organic. Negative delays desynchronise them with no JS stagger. */
@keyframes fnl-island-float {
	0%,
	100% { transform: translate3d(0, 0, 0); }
	50%  { transform: translate3d(0, -7px, 0); }
}

.fnl-island--f0 {
	animation: fnl-island-float 5.4s ease-in-out infinite;
	animation-delay: 0s;
}

.fnl-island--f1 {
	animation: fnl-island-float 6.2s ease-in-out infinite;
	animation-delay: -1.8s;
}

.fnl-island--f2 {
	animation: fnl-island-float 4.8s ease-in-out infinite;
	animation-delay: -3.4s;
}

.fnl-islands.is-paused .fnl-island {
	animation-play-state: paused;
}

/* --- 6i. Mobile metric bar — replaces the islands at ≤767 -------------
   Occlusion is impossible at 390px (only 25px of slack per side), all three
   metrics survive, and one 56px strip is one composite layer sitting OUTSIDE
   the video's paint rect instead of three backdrop-filters over it. */
.fnl-metricbar {
	display: none;
	width: 100%;
	max-width: 420px;
	height: 56px;
	margin-top: 12px;
	border-radius: var(--fnl-r-chip);
	background: rgba(9, 24, 17, .55);
	-webkit-backdrop-filter: blur(14px);
	        backdrop-filter: blur(14px);
	border: 1px solid rgba(255, 255, 255, .12);
	grid-template-columns: repeat(3, 1fr);
	contain: layout style paint;
}

.fnl-metricbar__cell {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 4px;
	text-align: center;
}

.fnl-metricbar__cell + .fnl-metricbar__cell {
	border-left: 1px solid rgba(255, 255, 255, .10);
}

.fnl-metricbar .fnl-island__label {
	font-size: 13px;
	letter-spacing: .06em;
}

.fnl-metricbar .fnl-island__value {
	font-size: 20px;
	min-width: 0;
	text-align: center;
}


/* ============================================================================
   7. LOGO RAIL — social proof
   ----------------------------------------------------------------------------
   Pure-CSS marquee [D10]: the <ul> carries the logo set TWICE in the markup
   (not cloned by JS) so translate3d(-50%) wraps seamlessly. Zero JS, and
   trivially reducible to a static scrollable row for reduced motion.
   ========================================================================== */

.fnl-logos {
	position: relative;
	background: var(--fnl-rail);
	border-top: var(--fnl-divider);
	border-bottom: var(--fnl-divider);
	padding: 28px 0;
}

.fnl-logos__grid {
	display: grid;
	grid-template-columns: 300px 1fr;
	column-gap: 40px;
	align-items: center;
}

.fnl-logos__stat {
	grid-column: 1;
	min-width: 0;
}

.fnl-logos__num {
	margin: 0;
	font-family: "Rethink Sans", sans-serif;
	font-size: 40px;
	line-height: 100%;
	font-weight: 600;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	font-variant-numeric: tabular-nums;
}

.fnl-logos__support {
	margin: 6px 0 0;
	font-size: 15px;
	line-height: 140%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
	max-width: 260px;
}

.fnl-logorail {
	position: relative;
	overflow: hidden;
	height: 40px;
	-webkit-mask-image: linear-gradient(to right, transparent 0, #000 72px, #000 calc(100% - 72px), transparent 100%);
	        mask-image: linear-gradient(to right, transparent 0, #000 72px, #000 calc(100% - 72px), transparent 100%);
}

@keyframes fnl-logos-scroll {
	from { transform: translate3d(0, 0, 0); }
	to   { transform: translate3d(-50%, 0, 0); }
}

.fnl-logorail ul {
	display: flex;
	align-items: center;
	gap: 34px;
	width: max-content;
	height: 100%;
	animation: fnl-logos-scroll 42s linear infinite;
	will-change: transform;
}

.fnl-logorail li {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 40px;
	width: 152px; /* fixed cell — even rhythm regardless of logo width (Ben #31/#52) */
	flex: 0 0 auto;
}

/* Each cell is a fixed OPTICAL height, not a fixed width, so proportions stay
   natural while visual weight looks even. Three-value correction system. */
.fnl-logorail li img {
	display: block;
	max-height: 40px;
	max-width: 124px; /* < the 152px cell, so every gap is ≥28px (Ben #31/#41/#52) */
	width: auto;
	height: auto;
	object-fit: contain;
	filter: brightness(0) invert(1);
	opacity: .7;
	transition: opacity .4s var(--fnl-ease-out);
}

.fnl-logorail li[data-optical="0.78"] img {
	max-height: 34px;
}

.fnl-logorail li[data-optical="1.12"] img {
	max-height: 45px;
}


/* ============================================================================
   8. SECTION 1 — How It Works (pinned five-stage story)
   ----------------------------------------------------------------------------
   The tall scroll track is gated behind (min-width:992px) AND
   (min-height:620px). Below either threshold .fnl-s1 is auto-height and the
   stages stack as a vertical numbered stepper — which removes the entire class
   of "pinned section in a 500px-tall laptop window" failures, and all five
   captions are readable with zero motion either way (brief rule #40).
   ========================================================================== */

/* --- 8a. Mobile / short-window stepper is the DEFAULT ------------------- */
.fnl-s1__pin {
	position: relative;
}

.fnl-s1__head {
	padding-top: 34px;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
}

.fnl-s1__head .fnl-pill {
	margin-bottom: 18px;
}

/* Reserve the taller A/B variant's height so the two variants produce the same
   section geometry — otherwise the experiment measures layout, not copy.
   px first as the fallback for engines without the `lh` unit. */
.fnl-s1__head .fnl-h2 {
	min-height: 133px;
	min-height: 3lh;
}

/* Stepper interleave. The markup holds captions and visuals in two SIBLING
   containers, so the only way to get caption→visual→caption ordering without
   touching the HTML is display:contents plus explicit grid rows. The rail is
   explicitly placed to span every row, which lets it overlap the stack. */
.fnl-s1__stagebox {
	margin-top: 44px;
	display: grid;
	grid-template-columns: 1fr;
}

.fnl-s1__captions,
.fnl-s1__visuals {
	display: contents;
}

.fnl-s1__caption:nth-child(2) { grid-row: 1; }
.fnl-s1__caption:nth-child(3) { grid-row: 3; }
.fnl-s1__caption:nth-child(4) { grid-row: 5; }
.fnl-s1__caption:nth-child(5) { grid-row: 7; }
.fnl-s1__caption:nth-child(6) { grid-row: 9; }

.fnl-s1__visual:nth-child(1) { grid-row: 2; }
.fnl-s1__visual:nth-child(2) { grid-row: 4; }
.fnl-s1__visual:nth-child(3) { grid-row: 6; }
.fnl-s1__visual:nth-child(4) { grid-row: 8; }
.fnl-s1__visual:nth-child(5) { grid-row: 10; }

.fnl-s1__caption {
	grid-column: 1;
	z-index: 1;
}

.fnl-s1__visual {
	grid-column: 1;
	z-index: 1;
}

/* the 2px rail joining the number chips */
.fnl-s1__rail {
	grid-column: 1;
	grid-row: 1 / -1;
	position: relative;
	justify-self: start;
	align-self: stretch;
	margin-left: 15px;
	width: 2px;
	z-index: 0;
	background: rgba(0, 255, 138, .22);
	overflow: hidden;
}

.fnl-s1__rail > i {
	display: block;
	width: 100%;
	height: 100%;
	background: var(--fnl-green);
	transform: scaleY(var(--fnl-s1-p, 0));
	transform-origin: top center;
}

.fnl-s1__caption {
	position: relative;
	padding: 0 0 28px 0;
}

.fnl-s1__caption:last-child {
	padding-bottom: 0;
}

.fnl-s1__num {
	position: absolute;
	left: 0;
	top: 0;
	width: 32px;
	height: 32px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 999px;
	border: 1px solid rgba(0, 255, 138, .5);
	background: rgba(0, 255, 138, .07);
	font-size: 14px;
	line-height: 1;
	font-weight: 600;
	letter-spacing: -0.03em;
	color: var(--fnl-green);
	font-variant-numeric: tabular-nums;
}

.fnl-s1__caption > p {
	margin: 0 0 14px;
	margin-left: 46px;
	font-family: "Rethink Sans", sans-serif;
	font-size: 20px;
	line-height: 125%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	max-width: 30ch;
}

.fnl-s1__visuals {
	display: contents;
}

/* In stepper mode each visual is a normal block that follows its caption. */
.fnl-s1__visual {
	position: relative;
	width: 100%;
	aspect-ratio: 16 / 10;
	margin: 0 0 28px 46px;
	border-radius: 14px;
	overflow: hidden;
	border: var(--fnl-border);
	background: var(--fnl-stage);
}

.fnl-s1__visual img,
.fnl-s1__visual video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* --- 8b. Desktop pinned track ------------------------------------------ */
@media (min-width: 992px) and (min-height: 620px) {
	.fnl-s1 {
		height: 460vh;
		padding-top: 0;
		padding-bottom: 0;
	}

	.fnl-s1__pin {
		position: sticky;
		top: 0;
		height: 100vh;
		overflow: hidden;
		display: flex;
		flex-direction: column;
		justify-content: center;
	}

	.fnl-s1__stagebox {
		display: grid;
		grid-template-columns: 36% 1fr;
		column-gap: 56px;
		align-items: center;
		margin-top: 44px;
	}

	/* undo the stepper's display:contents interleave */
	.fnl-s1__captions {
		display: block;
		position: relative;
		padding-left: 20px;
		grid-column: 1;
		grid-row: 1;
	}

	.fnl-s1__caption,
	.fnl-s1__visual {
		grid-row: auto;
		grid-column: auto;
	}

	.fnl-s1__rail {
		position: absolute;
		left: 0;
		top: 0;
		bottom: 0;
		width: 3px;
		margin-left: 0;
		background: rgba(0, 255, 138, .16);
	}

	/* All five captions are visible simultaneously — the process reads as a
	   list even with motion disabled. Active state is class-driven. */
	.fnl-s1__caption {
		padding: 15px 0 15px 20px;
		border-left: 2px solid transparent;
		display: flex;
		align-items: baseline;
		gap: 14px;
		transition:
			color .3s var(--fnl-ease-out),
			border-color .3s var(--fnl-ease-out);
	}

	.fnl-s1__num {
		position: static;
		width: auto;
		height: auto;
		border: 0;
		background: none;
		border-radius: 0;
		font-size: 13px;
		font-weight: 600;
		color: rgba(255, 255, 255, .22);
		transition: color .3s var(--fnl-ease-out);
	}

	.fnl-s1__caption > p {
		margin: 0;
		font-size: 18px;
		line-height: 130%;
		font-weight: 400;
		color: var(--fnl-dim);
		max-width: none;
		transition:
			color .3s var(--fnl-ease-out),
			font-size .3s var(--fnl-ease-out);
	}

	.fnl-s1__caption.is-active {
		border-left-color: var(--fnl-green);
	}

	.fnl-s1__caption.is-active .fnl-s1__num {
		color: var(--fnl-green);
	}

	.fnl-s1__caption.is-active > p {
		font-size: 22px;
		line-height: 125%;
		font-weight: 500;
		color: var(--fnl-white);
	}

	/* The five visuals stack absolutely inside one 16:10 frame; the sequencer
	   drives transform+opacity only, so reverse scrolling is exact. */
	.fnl-s1__visuals {
		display: block;
		position: relative;
		grid-column: 2;
		grid-row: 1;
		width: 100%;
		aspect-ratio: 16 / 10;
		border-radius: var(--fnl-r-media);
		overflow: hidden;
		border: var(--fnl-border);
		background: var(--fnl-stage);
		box-shadow: var(--fnl-media-shadow);
	}

	.fnl-s1__visual {
		position: absolute;
		inset: 0;
		width: 100%;
		height: 100%;
		margin: 0;
		border: 0;
		border-radius: 0;
		opacity: 0;
		aspect-ratio: auto;
		will-change: transform, opacity;
	}

	.fnl-s1__visual.is-active {
		opacity: 1;
	}
}


/* ============================================================================
   9. SECTION 2 — Feature grid
   ----------------------------------------------------------------------------
   Asymmetric 12-column grid (storyboard §6.2). Two card archetypes chosen by
   the card's own proportions — one rule, no per-card invention:
     wide  (aspect > 1.7) → copy left 44% / media right 56%
     tall & square        → copy top / media bottom
   Media always bleeds to the card's own edges; the screenshot reaching the
   edge is the one thing the reference grid gets right.
   ========================================================================== */

.fnl-s2__grid {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	grid-template-rows: 308px 308px 380px 380px;
	gap: var(--fnl-gap);
	margin-top: 40px;
}

.fnl-card {
	position: relative;
	overflow: hidden;
	border-radius: var(--fnl-r-card);
	background: var(--fnl-card-bg);
	border: var(--fnl-border);
	box-shadow: var(--fnl-inner-light);
	padding: 28px 28px 0;
	transition:
		border-color .42s var(--fnl-ease-out),
		transform .42s var(--fnl-ease-out);
}

/* named slots */
.fnl-card--a { grid-column: 1 / 6;  grid-row: 1 / 3; }
.fnl-card--b { grid-column: 6 / 13; grid-row: 1 / 2; }
.fnl-card--c { grid-column: 6 / 13; grid-row: 2 / 3; }
/* Ben #53: the brain card is removed — D and E are 50/50 halves, matching
   the G/H row below them. Slot f no longer exists in the config. */
.fnl-card--d { grid-column: 1 / 7;  grid-row: 3 / 4; }
.fnl-card--e { grid-column: 7 / 13; grid-row: 3 / 4; }
.fnl-card--g { grid-column: 1 / 7;  grid-row: 4 / 5; }
.fnl-card--h { grid-column: 7 / 13; grid-row: 4 / 5; }

/* a ninth card, if Ben supplies the missing copy block: row 4 becomes three
   405px squares identical to row 3. One grid-template line, no redesign. */
.fnl-card--i { grid-column: 9 / 13; grid-row: 4 / 5; }

/* Explicit rather than implicit: the copy block is grid/flex child 1 in every
   archetype, so a future markup reorder cannot silently swap it with the media. */
.fnl-card__copy {
	position: relative;
	z-index: 2;
	grid-column: 1;
	grid-row: 1;
	flex: 0 0 auto;
}

.fnl-card--wide .fnl-card__copy {
	padding-right: 20px;
}

.fnl-card__title {
	margin: 0 0 12px;
	font-family: "Rethink Sans", sans-serif;
	font-size: 27px;
	line-height: 115%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	max-width: 24ch;
}

.fnl-card__support {
	margin: 0;
	font-size: 16px;
	line-height: 140%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
	max-width: 34ch;
}

.fnl-card__media {
	position: relative;
	overflow: hidden;
}

.fnl-card__media img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform .42s var(--fnl-ease-out);
}

/* --- 9a. Archetype: tall (copy top / media bottom, bottom-bleed) ------- */
.fnl-card--tall {
	display: flex;
	flex-direction: column;
}

.fnl-card--tall .fnl-card__media {
	margin: 24px -28px 0;
	flex: 1 1 auto;
	min-height: 0;
}

.fnl-card--a .fnl-card__media img {
	object-position: top center;
	transform: scale(1.08);
	transform-origin: top center;
}

/* --- 9b. Archetype: square (copy top / media bottom) ------------------- */
.fnl-card--square {
	display: flex;
	flex-direction: column;
}

.fnl-card--square .fnl-card__media {
	margin: 24px -28px 0;
	flex: 1 1 auto;
	min-height: 0;
}

/* Card E is the "Cross-Publish Campaigns Across All Your Channels" graph map.
   It used to be the ONLY card that cancelled the square archetype's -28px
   bleed and added padding:12px, and its declared 810x424 disagrees with the
   SVG's intrinsic 424x340 -- so object-fit:contain letterboxed it with dark
   gutters on both sides while its neighbours ran edge to edge. It now takes
   NOTE: card E is a WIDE card (copy left / media right), not a square one.
   The square archetype's `margin: 24px -28px 0` collapsed the media to 0px,
   because the wide archetype sizes it via flex, not width. Only the padding is
   removed and the bleed sits on the right edge -- the edge it must be flush to. */
.fnl-card--e .fnl-card__media {
	padding: 0;
	margin-right: -28px;
	overflow: hidden;
}

.fnl-card--e .fnl-card__media img {
	object-fit: cover;
	object-position: left center;
	width: 100%;
	height: 100%;
}

/* --- 9c. Archetype: wide (copy left 44% / media right 56%) ------------- */
.fnl-card--wide {
	display: grid;
	grid-template-columns: 44% 56%;
	align-items: center;
	column-gap: 0;
	padding: 28px;
}

.fnl-card--wide .fnl-card__media {
	position: relative;
	align-self: stretch;
	margin: -28px -28px -28px 0;
}

/* G and H are dashboards/documents whose meaning is horizontal; their crops
   bleed off the right and bottom edges. */
/* left-anchored so the app navigation stays visible and the media reads as
   a real screenshot rather than a mystery crop (Ben #2/#47) */
.fnl-card--d .fnl-card__media img,
.fnl-card--g .fnl-card__media img,
.fnl-card--h .fnl-card__media img {
	object-position: left top;
}

/* --- 9d. Overlap compositions (storyboard §6.3) -----------------------
   B: primary over secondary, secondary poking out LEFT and slightly LOWER
      (128px of its 179px visible = 71%, 28px lower).
   C: clean overlap, only 30% of the secondary showing.
   Both bleed below the card's bottom edge so the composition reads as
   "more where that came from". No rotation — the brief says clean. */
.fnl-card__media--overlap {
	overflow: visible;
}

.fnl-card__media--overlap .fnl-card__img,
.fnl-card__media--overlap .fnl-card__img2 {
	position: absolute;
	width: auto;
	height: auto;
	object-fit: contain;
	border-radius: 10px;
}

.fnl-card--b .fnl-card__img {
	height: 300px;
	right: 34px;
	bottom: -56px;
	z-index: 2;
	border: 1px solid rgba(255, 255, 255, .14);
	box-shadow: 0 24px 50px -24px rgba(0, 0, 0, .7);
}

.fnl-card--b .fnl-card__img2 {
	height: 268px;
	right: 162px;
	bottom: -84px;
	z-index: 1;
	border: 1px solid rgba(255, 255, 255, .10);
	opacity: .86;
}

.fnl-card--c .fnl-card__img {
	height: 292px;
	right: 30px;
	bottom: -42px;
	z-index: 2;
	border: 1px solid rgba(255, 255, 255, .14);
	box-shadow: 0 24px 50px -24px rgba(0, 0, 0, .7);
}

.fnl-card--c .fnl-card__img2 {
	height: 258px;
	right: 92px;
	bottom: -70px;
	z-index: 1;
	border: 1px solid rgba(255, 255, 255, .10);
	opacity: .82;
}

/* --- 9e. Card F — the brain (static image + 9 positioned icon nodes) ----
   brain.js is deliberately not ported: 100KB of JS for an effect calibrated
   to a full-width stage and invisible at 405×212. */
.fnl-card__media--brain {
	position: relative;
}

.fnl-card__brainicons {
	position: absolute;
	inset: 0;
	display: block;
	pointer-events: none;
}

.fnl-card__brainicons img {
	position: absolute;
	width: 26px;
	height: 26px;
	object-fit: contain;
	opacity: .55;
	animation: fnl-brain-pulse 3.2s ease-in-out infinite;
}

@keyframes fnl-brain-pulse {
	0%, 100% { opacity: .55; transform: scale(1); }
	50%      { opacity: 1;   transform: scale(1.06); }
}

.fnl-card__brainicons img:nth-child(1) { left: 12%; top: 18%; animation-delay: 0s; }
.fnl-card__brainicons img:nth-child(2) { left: 40%; top: 8%;  animation-delay: .35s; }
.fnl-card__brainicons img:nth-child(3) { left: 71%; top: 16%; animation-delay: .7s; }
.fnl-card__brainicons img:nth-child(4) { left: 6%;  top: 50%; animation-delay: 1.05s; }
.fnl-card__brainicons img:nth-child(5) { left: 82%; top: 47%; animation-delay: 1.4s; }
.fnl-card__brainicons img:nth-child(6) { left: 24%; top: 72%; animation-delay: 1.75s; }
.fnl-card__brainicons img:nth-child(7) { left: 55%; top: 64%; animation-delay: 2.1s; }
.fnl-card__brainicons img:nth-child(8) { left: 78%; top: 76%; animation-delay: 2.45s; }
.fnl-card__brainicons img:nth-child(9) { left: 44%; top: 88%; animation-delay: 2.8s; }

/* --- 9f. Hover — decorative only, and only on real pointers ----------- */
@media (hover: hover) and (pointer: fine) {
	.fnl-card:hover {
		border-color: var(--fnl-border-hover);
		transform: translate3d(0, -3px, 0);
	}

	.fnl-card:hover .fnl-card__media > img {
		transform: scale(1.03);
	}

	.fnl-card--a:hover .fnl-card__media img {
		transform: scale(1.11);
	}

	.fnl-card__media--overlap:hover .fnl-card__img,
	.fnl-card__media--overlap:hover .fnl-card__img2 {
		transform: none;
	}

	.fnl-logorail li:hover img {
		opacity: .95;
	}
}


/* ============================================================================
   10. SECTION 3 — Campaigns gallery
   ----------------------------------------------------------------------------
   Uniform 9:16 tiles. The 3-column hold runs down to 768 deliberately:
   dropping to 2 columns at 991 would produce a single tile taller than the
   viewport. Non-9:16 assets are handled by data-fit rather than by cropping
   faces or distorting artwork.
   ========================================================================== */

.fnl-s3__grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: var(--fnl-gap);
	max-width: 1128px;
	margin: 40px auto 0;
}

.fnl-tile {
	position: relative;
	display: block;
	width: 100%;
	aspect-ratio: 9 / 16;
	padding: 0;
	border: 1px solid rgba(255, 255, 255, .14);
	border-radius: var(--fnl-r-tile);
	overflow: hidden;
	background: #070F0B;
	cursor: pointer;
	-webkit-tap-highlight-color: transparent;
	transition: transform .42s var(--fnl-ease-out);
}

/* the site's proven inner frame overlay */
.fnl-tile::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 3;
	border-radius: var(--fnl-r-tile);
	border: 1px solid rgba(255, 255, 255, .16);
	mix-blend-mode: overlay;
	pointer-events: none;
	transition: border-color .3s var(--fnl-ease-out);
}

/* bottom scrim revealed on hover */
.fnl-tile::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 0;
	z-index: 2;
	background: linear-gradient(to top, rgba(5, 13, 9, .85), transparent);
	pointer-events: none;
	transition: height .42s var(--fnl-ease-out);
}

.fnl-tile__mediabox {
	position: absolute;
	inset: 0;
	display: block;
	overflow: hidden;
}

.fnl-tile__mediabox img {
	position: relative;
	z-index: 1;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	transition: transform .42s var(--fnl-ease-out);
}

/* 9:16 video — exact fit, no crop */
.fnl-tile__mediabox[data-fit="cover"] img {
	object-fit: cover;
}

/* Graphics (1:1, 4:5) and landscape — contain + blurred self-fill. Cropping a
   square graphic to 9:16 destroys 44% of the composition, and the composition
   IS the product. The backfill background-image is set inline by JS. */
.fnl-tile__mediabox[data-fit="contain"] img {
	object-fit: contain;
	border-radius: 4px;
	box-shadow: 0 0 0 1px rgba(255, 255, 255, .14);
}

/* The blurred self-fill needs the poster URL, which CSS cannot read off the
   <img>. It activates only once a `style="background-image:url(...)"` is present
   on the mediabox (set by the generator or by JS); the attribute test keeps a
   pointless blurred empty layer off every other tile until then. Without it the
   contained artwork still reads correctly — framed by the 1px shadow above on
   the tile's own #070F0B surface. */
.fnl-tile__mediabox[data-fit="contain"][style*="background-image"]::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	background-position: center;
	background-size: cover;
	background-repeat: no-repeat;
	background-image: inherit;
	filter: blur(24px) saturate(1.15) brightness(.45);
	transform: scale(1.2);
}

/* Emails — top-anchored crop, because an email's top 60% (logo, hero,
   headline) is the part that proves design quality. */
.fnl-tile__mediabox[data-fit="top"] img {
	object-fit: cover;
	object-position: top center;
}

.fnl-tile__mediabox[data-fit="top"]::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 96px;
	z-index: 2;
	background: linear-gradient(to top, #050D09, transparent);
	pointer-events: none;
}

/* --- 10a. Tile overlays (z5) — all always visible, no hover dependency - */
.fnl-tile__pill {
	position: absolute;
	top: 10px;
	right: 10px;
	z-index: 5;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	height: 26px;
	padding: 0 10px 0 8px;
	border-radius: 999px;
	background: rgba(5, 14, 10, .55);
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	border: 1px solid rgba(255, 255, 255, .18);
	font-size: 12px;
	line-height: 1;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	white-space: nowrap;
	transition: border-color .3s var(--fnl-ease-out);
}

.fnl-tile__pill img {
	width: 14px;
	height: 14px;
	flex: 0 0 auto;
}

/* The client logo is the single highest-value pixel in the section: it is what
   makes the tile read as real client work rather than a stock reel. */
.fnl-tile__client {
	position: absolute;
	left: 10px;
	bottom: 10px;
	z-index: 5;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	height: 28px;
	padding: 0 8px;
	border-radius: 8px;
	background: rgba(5, 14, 10, .5);
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	opacity: .9;
}

.fnl-tile__client img {
	display: block;
	max-height: 20px;
	max-width: 72px;
	width: auto;
	height: auto;
	object-fit: contain;
	filter: brightness(0) invert(1);
}

/* 44×44 persistent affordance — never hover-gated (rule #25) */
.fnl-tile__affordance {
	position: absolute;
	right: 10px;
	bottom: 10px;
	z-index: 5;
	width: 44px;
	height: 44px;
	border-radius: 999px;
	background: var(--fnl-glass-bg) center / 16px 16px no-repeat;
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	border: var(--fnl-glass-border);
	opacity: .92;
}

.fnl-tile--ad_video .fnl-tile__affordance,
.fnl-tile--social_video .fnl-tile__affordance {
	background-image: url("../img/play-btn.svg");
}

.fnl-tile--graphic .fnl-tile__affordance,
.fnl-tile--email .fnl-tile__affordance {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M9 3H3v6M15 21h6v-6M3 3l7 7M21 21l-7-7'/%3E%3C/svg%3E");
}

.fnl-tile:active {
	transform: scale(.985);
}

@media (hover: hover) and (pointer: fine) {
	.fnl-tile:hover {
		transform: translate3d(0, -2px, 0);
	}

	.fnl-tile:hover .fnl-tile__mediabox img {
		transform: scale(1.06);
	}

	.fnl-tile:hover::after {
		height: 64px;
	}

	.fnl-tile:hover::before {
		border-color: rgba(255, 255, 255, .32);
	}

	.fnl-tile:hover .fnl-tile__pill {
		border-color: rgba(255, 255, 255, .32);
	}
}

.fnl-s3 .fnl-cta {
	margin-top: 40px;
}


/* ============================================================================
   11. SECTION 4 — Case-study panel
   ----------------------------------------------------------------------------
   The left column vertically CENTRES and the testimonial card stretches, which
   is the whole mechanism for absorbing 1–4 stat rows and 20–90-word quotes
   without a single per-case override (measured range 420–566px).
   ========================================================================== */

.fnl-case {
	position: relative;
	margin-top: 40px;
	padding: 48px;
	border-radius: 24px;
	background: #0A1812;
	border: var(--fnl-border);
	display: grid;
	grid-template-columns: 1fr 1fr;
	column-gap: 56px;
	align-items: stretch;
	min-height: 420px;
}

/* a deliberate 48px glass chip, matching the stat icons (Ben #35 — the bare
   half-clipped glyph read as a rendering bug) */
.fnl-case__rocket {
	position: absolute;
	top: 28px;
	right: 28px;
	width: 48px;
	height: 48px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 14px;
	border: 1px solid rgba(0, 255, 138, .28);
	background: rgba(0, 255, 138, .07);
	pointer-events: none;
}

.fnl-case__rocket img,
.fnl-case__rocket svg {
	display: block;
	width: 22px;
	height: 22px;
}

.fnl-case__left {
	display: flex;
	flex-direction: column;
	justify-content: center;
}

.fnl-case__logo {
	display: block;
	margin-bottom: 28px;
}

.fnl-case__logo img {
	display: block;
	max-height: 34px;
	max-width: 200px;
	width: auto;
	height: auto;
	object-fit: contain;
	filter: brightness(0) invert(1);
	opacity: .92;
}

.fnl-case__h {
	margin: 0 0 28px;
	font-family: "Rethink Sans", sans-serif;
	font-size: 36px;
	line-height: 105%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	max-width: 520px;
	text-transform: none;
}

.fnl-case__resultslabel {
	margin: 0 0 12px;
	font-size: 13px;
	line-height: 100%;
	font-weight: 500;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--fnl-dim);
}

/* 1–4 stat rows are absorbed by the left column's justify-content:center, not
   by a per-case override — this wrapper only needs to not introduce its own box. */
.fnl-case__stats {
	display: block;
}

.fnl-case__stat {
	display: flex;
	align-items: center;
	gap: 14px;
	min-height: 64px;
}

.fnl-case__stat + .fnl-case__stat {
	border-top: var(--fnl-divider);
}

/* Seven different source icons rendered monochrome green at 20px in one glass
   chip so they read as a single set. */
.fnl-case__staticon {
	flex: 0 0 auto;
	width: 40px;
	height: 40px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 12px;
	background: rgba(255, 255, 255, .04);
	border: 1px solid rgba(255, 255, 255, .08);
}

.fnl-case__staticon img {
	width: 20px;
	height: 20px;
	object-fit: contain;
}

.fnl-case__stat > p {
	margin: 0;
	display: flex;
	align-items: baseline;
	gap: 10px;
	flex-wrap: wrap;
}

.fnl-case__stat > p > b {
	font-family: "Rethink Sans", sans-serif;
	font-size: 28px;
	line-height: 100%;
	font-weight: 600;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
}

.fnl-case__stat > p > span {
	font-size: 16px;
	line-height: 130%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
	max-width: 30ch;
}

/* --- 11a. Testimonial card -------------------------------------------- */
.fnl-case__quote {
	align-self: stretch;
	padding: 32px;
	border-radius: var(--fnl-r-media);
	background: rgba(255, 255, 255, .03);
	border: var(--fnl-border);
}

.fnl-case__quote .fnl-stars {
	margin-bottom: 20px;
}

.fnl-case__pull {
	margin: 0 0 16px;
	font-family: "Rethink Sans", sans-serif;
	font-size: 22px;
	line-height: 128%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	max-width: 34ch;
}

.fnl-case__body > p {
	margin: 0 0 16px;
	font-size: 17px;
	line-height: 165%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-sub);
	max-width: 62ch;
}

.fnl-case__body > p:last-child {
	margin-bottom: 0;
}

.fnl-case__body b {
	color: var(--fnl-white);
	font-weight: 500;
}

.fnl-case__attrib {
	display: flex;
	align-items: center;
	gap: 12px;
	margin-top: 24px;
}

.fnl-case__avatar {
	width: 40px;
	height: 40px;
	border-radius: 999px;
	object-fit: cover;
	flex: 0 0 auto;
}

.fnl-case__author {
	margin: 0;
	font-size: 16px;
	line-height: 130%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
}

.fnl-case__role {
	margin: 2px 0 0;
	font-size: 15px;
	line-height: 130%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
}

/* "Read full review" expander — mobile only, applied by JS when the quote
   exceeds 55 words. Desktop is never clamped. */
.fnl-case__more {
	display: none;
	margin-top: 12px;
	min-height: 44px;
	padding: 0;
	background: none;
	border: 0;
	font-size: 15px;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-green);
	text-decoration: underline;
	text-underline-offset: 3px;
	cursor: pointer;
}

.fnl-s4 .fnl-cta {
	margin-top: 40px;
}


/* ============================================================================
   12. SECTIONS 5–10 — one feature-section component, six configurations
   ----------------------------------------------------------------------------
   Desktop alternation is achieved purely with grid placement, never by
   reordering the DOM — so mobile inherits the correct order for free and
   rule #96 cannot be violated by accident.
   ========================================================================== */

.fnl-fs__grid {
	display: grid;
	grid-template-columns: 520px 1fr;
	column-gap: 60px;
	align-items: center;
}

.fnl-fs__copy {
	grid-column: 1;
	grid-row: 1;
	text-align: left;
}

.fnl-fs__media {
	grid-column: 2;
	grid-row: 1;
	position: relative;
}

/* media-right is the base composition; the class is stated explicitly so the
   two variants are symmetrical in the cascade instead of one being "the default" */
.fnl-fs--media-right .fnl-fs__copy {
	grid-column: 1;
}

.fnl-fs--media-right .fnl-fs__media {
	grid-column: 2;
}

/* media-left variant — placement only */
.fnl-fs--media-left .fnl-fs__copy {
	grid-column: 2;
}

.fnl-fs--media-left .fnl-fs__media {
	grid-column: 1;
}

.fnl-fs--media-left .fnl-fs__grid {
	grid-template-columns: 1fr 520px;
}

.fnl-fs__copy .fnl-pill {
	margin-bottom: 18px;
}

.fnl-fs__copy .fnl-cta {
	margin-top: 36px;
}

/* --- 12a. The canonical slide frame ----------------------------------- */
.fnl-fs__frame {
	position: relative;
	width: 100%;
	aspect-ratio: 700 / 438;
	border-radius: var(--fnl-r-media);
	overflow: hidden;
	border: var(--fnl-border);
	background: var(--fnl-stage);
	box-shadow: var(--fnl-media-shadow);
	touch-action: pan-y;
}

.fnl-slide {
	position: absolute;
	inset: 0;
	opacity: 0;
	visibility: hidden;
	transform: translate3d(2%, 0, 0);
	transition:
		opacity 520ms var(--fnl-ease-out),
		transform 520ms var(--fnl-ease-out),
		visibility 520ms step-end;
	will-change: transform, opacity;
}

.fnl-slide.is-active {
	opacity: 1;
	visibility: visible;
	transform: none;
	transition:
		opacity 520ms var(--fnl-ease-out),
		transform 520ms var(--fnl-ease-out),
		visibility 0s;
	z-index: 2;
}

/* the outgoing slide drifts the other way — a 2% dissolve reads as "same
   window, next screen", where a full slide would read as "different pictures" */
.fnl-slide.is-out {
	opacity: 0;
	visibility: visible;
	transform: translate3d(-2%, 0, 0);
	z-index: 1;
}

.fnl-slide__full {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: center;
}

/* Overlap slides: composed as DOM so they scale with the frame. Per-slide
   left/right/top/bottom/width come from generated inline styles — this rule
   supplies only the shared chrome. */
.fnl-slide__primary,
.fnl-slide__secondary {
	position: absolute;
	height: auto;
	border-radius: 10px;
}

.fnl-slide__primary {
	z-index: 2;
	border: 1px solid rgba(255, 255, 255, .14);
	box-shadow: 0 24px 48px -20px rgba(0, 0, 0, .7);
}

.fnl-slide__secondary {
	z-index: 1;
	opacity: .9;
	border: 1px solid rgba(255, 255, 255, .10);
}

/* the calendar slide's 2.0× detail inset — gestalt + legibility in one frame */
.fnl-slide__inset {
	position: absolute;
	left: 5%;
	bottom: 8%;
	width: 38%;
	height: auto;
	z-index: 3;
	border-radius: 10px;
	border: 1px solid rgba(255, 255, 255, .14);
	box-shadow: 0 20px 40px -18px rgba(0, 0, 0, .7);
}

/* --- 12b. Arrows — outside the frame on desktop ----------------------
   Outside-placement matters because the screenshots ARE the argument; an
   arrow must never sit on one. */
.fnl-fs__arrow {
	position: absolute;
	/* arrows are siblings of the frame (it clips) — center on the frame band,
	   which sits above ~132px of caption+dots (Ben #15) */
	top: calc((100% - 132px) / 2);
	transform: translateY(-50%);
	z-index: 5;
	width: 48px;
	height: 48px;
	padding: 0;
	border-radius: 999px;
	border: var(--fnl-glass-border);
	background: var(--fnl-glass-bg) center / 16px 16px no-repeat;
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	cursor: pointer;
	transition: border-color .3s var(--fnl-ease-out);
}

/* overlaid INSIDE the frame edge — the ±56px outside placement collided
   with the copy column across 1201–1440 (Ben #46) */
.fnl-fs__arrow--prev {
	left: 14px;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 18l-6-6 6-6'/%3E%3C/svg%3E");
}

.fnl-fs__arrow--next {
	right: 14px;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E");
}

.fnl-fs__arrow:hover {
	border-color: rgba(255, 255, 255, .32);
}

/* --- 12c. Caption — min-height reserves two lines, so a 1-line caption
   never makes the dots below it jump -------------------------------------- */
.fnl-fs__caption {
	margin: 20px 0 0;
	min-height: 52px;
	font-size: 16px;
	line-height: 130%;
	font-weight: 400;
	color: #9DC3B0;
	letter-spacing: -0.03em;
	transition: opacity .22s var(--fnl-ease-out), transform .22s var(--fnl-ease-out);
}

.fnl-fs__caption.is-swapping {
	opacity: 0;
	transform: translateY(6px);
	transition-duration: .18s;
	transition-timing-function: linear;
}

/* funnel.js writes into these two spans (never into the <p>), so the caption and
   its media are swapped in the same frame and cannot desynchronise. */
.fnl-fs__caption1 {
	display: inline;
}

.fnl-fs__caption2 {
	display: inline;
	font-size: 15px;
	line-height: 140%;
	font-weight: 300;
	font-style: italic;
	color: var(--fnl-muted);
}

/* --- 12d. Dots — 44px targets without giant dots ---------------------
   The active dot's 7s progress fill is the fix for "carousels that move while
   a visitor is reading": the change is telegraphed, so it never feels like the
   page moved on its own. It animates only while the carousel is playing. */
.fnl-fs__dots {
	display: flex;
	align-items: center;
	justify-content: flex-start;
	gap: 4px;
	height: 44px;
	margin-top: 16px;
}

.fnl-fs__dot {
	width: 44px;
	height: 44px;
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	-webkit-tap-highlight-color: transparent;
}

.fnl-fs__dot > i {
	position: relative;
	display: block;
	width: 8px;
	height: 8px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .24);
	overflow: hidden;
	transition:
		width .3s var(--fnl-ease-out),
		background-color .3s var(--fnl-ease-out);
}

.fnl-fs__dot.is-active > i {
	width: 24px;
	background: rgba(0, 255, 138, .28);
}

.fnl-fs__dot.is-active > i::after {
	content: "";
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	width: 0;
	background: var(--fnl-green);
}

@keyframes fnl-dot-progress {
	from { width: 0; }
	to   { width: 100%; }
}

.fnl-fs__frame.is-playing ~ .fnl-fs__dots .fnl-fs__dot.is-active > i::after,
.fnl-fs__media.is-playing .fnl-fs__dot.is-active > i::after {
	animation: fnl-dot-progress 3.5s linear forwards;
}

/* single-slide sections (S8) render no chrome at all — never disabled
   controls; nothing extra to hide here, the partial omits the markup */


/* ============================================================================
   13. SECTION 11 — Pricing
   ----------------------------------------------------------------------------
   Generated from config/plans.mjs. The markup uses new .fnl-plan* classes
   (not .hero__plans .elem), so nothing inherits from the site's pricing CSS
   and nothing here can leak back into it. The monthly/annual switcher markup
   IS the site's contract (script.js:232 binds .switcher__plans and sweeps
   [data-monthly][data-annually] across document.body) — which is why no other
   funnel element may carry those attributes.
   ========================================================================== */

.fnl-page .fnl-s11 .switcher__plans,
.fnl-modal-page .fnl-s11 .switcher__plans {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	margin: 32px auto 0;
	padding: 4px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .03);
	border: 1px solid rgba(255, 255, 255, .08);
}

.fnl-page .fnl-s11 .switcher__plans > a,
.fnl-modal-page .fnl-s11 .switcher__plans > a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	height: 40px;
	padding: 0 22px;
	border-radius: 999px;
	text-decoration: none;
	font-size: 15px;
	line-height: 90%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: rgba(255, 255, 255, .6);
	transition: .3s ease all;
}

.fnl-page .fnl-s11 .switcher__plans > a.current,
.fnl-modal-page .fnl-s11 .switcher__plans > a.current {
	background: var(--fnl-green);
	color: #000;
}

.fnl-s11 > .container {
	display: flex;
	flex-direction: column;
	align-items: center;
}

.fnl-s11 .fnl-sechead,
.fnl-s11 .fnl-plans,
.fnl-s11 .fnl-enterprise {
	width: 100%;
}

.fnl-plans {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: var(--fnl-gap);
	margin-top: 40px;
	align-items: start;
}

.fnl-plan {
	position: relative;
	display: flex;
	flex-direction: column;
	padding: 36px 32px 32px;
	row-gap: 6px;
	border-radius: var(--fnl-r-card);
	background: var(--fnl-card-bg);
	border: var(--fnl-border);
	box-shadow: var(--fnl-inner-light);
}

.fnl-plan--featured {
	border-color: rgba(0, 255, 138, .4);
	background:
		linear-gradient(180deg, rgba(0, 255, 138, .06) 0%, rgba(0, 255, 138, 0) 55%),
		var(--fnl-card-bg);
}

.fnl-plan__badge {
	position: absolute;
	top: -13px;
	left: 30px;
	display: inline-flex;
	align-items: center;
	height: 26px;
	padding: 0 12px;
	border-radius: 999px;
	background: var(--fnl-green);
	font-size: 12px;
	line-height: 1;
	font-weight: 600;
	letter-spacing: -0.02em;
	color: #000;
	white-space: nowrap;
}

.fnl-plan__head {
	display: flex;
	flex-direction: column;
	gap: 10px;
	flex: 0 0 auto;
	/* NO divider here, and none on .fnl-plan__counts either — the two each drew
	   one a few px apart, which was the stray double line under the deliverable
	   counts. The price block reads as one unit now, separated from the feature
	   list by spacing alone. Don't re-add a border to either without removing
	   the other. */
	margin-bottom: 18px;
}

.fnl-plan__name {
	margin: 0;
	font-family: "Rethink Sans", sans-serif;
	font-size: 18px;
	line-height: 120%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
}

.fnl-plan__billnote {
	margin: 6px 0 0;
	font-size: 14px;
	line-height: 130%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-dim);
}

.fnl-plan__price {
	display: flex;
	align-items: baseline;
	gap: 4px;
	margin: 14px 0 0;
	font-family: "Rethink Sans", sans-serif;
	font-size: 44px;
	line-height: 100%;
	font-weight: 600;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	font-variant-numeric: tabular-nums;
}

.fnl-plan__price > em {
	font-family: "Inter", sans-serif;
	font-size: 15px;
	line-height: 100%;
	font-weight: 400;
	font-style: normal;
	color: var(--fnl-muted);
}

/* No border here — see .fnl-plan__head above for why neither element has one. */
.fnl-plan__counts {
	display: flex;
	flex-wrap: wrap;
	gap: 6px 16px;
	margin: 16px 0 0;
	padding-bottom: 2px;
}

.fnl-plan__counts li {
	font-size: 15px;
	line-height: 130%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
}

.fnl-plan__counts li b {
	font-weight: 600;
	color: var(--fnl-white);
	font-variant-numeric: tabular-nums;
}

/* Ben #55: margin-top plus the head's own bottom border/padding produced a
   floating empty band above the CTA that read as a stray island. */
.fnl-plan__content {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	margin-top: 4px;
}

.fnl-page .fnl-plan__cta,
.fnl-modal-page .fnl-plan__cta {
	width: 100%;
}

/* The trial footnote reads as a footnote, which is what it is. It only ever
   renders in trial mode (2d) — no free-trial messaging on a paid funnel. */
.fnl-page .fnl-plan__content > .trial__note,
.fnl-modal-page .fnl-plan__content > .trial__note {
	display: block;
	margin: 10px 0 4px;
	font-size: 14px;
	line-height: 1.45;
	letter-spacing: -0.03em;
	color: var(--fnl-dim);
	text-align: center;
}

.fnl-plan__features {
	margin: 20px 0 0;
	flex: 1 1 auto;
}

.fnl-plan__features li {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	margin-bottom: 12px;
	font-size: 15px;
	line-height: 145%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-sub);
	max-width: 34ch;
}

.fnl-plan__features li > span {
	flex: 0 0 auto;
	display: inline-flex;
	margin-top: 3px;
}

.fnl-plan__features li img {
	width: 16px;
	height: 16px;
}

.fnl-page .fnl-plan__compare,
.fnl-modal-page .fnl-plan__compare {
	margin-top: 20px;
	width: 100%;
	height: 44px;
	padding: 12px 20px;
	font-size: 15px;
	cursor: pointer;
}

/* --- 13a. Enterprise band -------------------------------------------- */
.fnl-enterprise {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: center;
	column-gap: 40px;
	margin-top: var(--fnl-gap);
	padding: 30px;
	border-radius: var(--fnl-r-card);
	background: var(--fnl-card-bg);
	border: var(--fnl-border);
	box-shadow: var(--fnl-inner-light);
}

.fnl-enterprise__copy > p {
	margin: 0 0 8px;
	font-family: "Rethink Sans", sans-serif;
	font-size: 22px;
	line-height: 120%;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
}

.fnl-enterprise__copy > span {
	display: block;
	font-size: 16px;
	line-height: 150%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
	max-width: 640px;
}

.fnl-page .fnl-enterprise__btn .filled-btn {
	height: 48px;
	padding: 16px 28px;
	font-size: 15px;
	white-space: nowrap;
}


/* ============================================================================
   14. SECTION 12 — Demo video
   ----------------------------------------------------------------------------
   Poster-first, never autoplay. src is assigned on first play, then the native
   controls take over: this is a one-minute talking head, and a bespoke
   scrubber earns nothing.
   ========================================================================== */

.fnl-s12 > .container {
	display: flex;
	flex-direction: column;
	align-items: center;
}

.fnl-demo {
	position: relative;
	width: 100%;
	max-width: 980px;
	margin-top: 40px;
	aspect-ratio: 16 / 9;
	border-radius: var(--fnl-r-media);
	overflow: hidden;
	border: var(--fnl-border);
	background: #05100B;
	box-shadow: var(--fnl-media-shadow);
}

.fnl-demo__poster,
.fnl-demo video,
.fnl-demo__video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.fnl-demo video,
.fnl-demo__video {
	z-index: 2;
}

.fnl-demo__play {
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	z-index: 3;
	width: 72px;
	height: 72px;
	padding: 0;
	border-radius: 999px;
	border: var(--fnl-glass-border);
	background: var(--fnl-glass-bg) url("../img/play-btn.svg") center / 22px 22px no-repeat;
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	cursor: pointer;
	transition: opacity .26s var(--fnl-ease-out), transform .26s var(--fnl-ease-out);
}

.fnl-demo.is-playing .fnl-demo__play {
	opacity: 0;
	pointer-events: none;
}

.fnl-s12 .fnl-cta {
	margin-top: 36px;
}


/* ============================================================================
   15. SECTION 13 — FAQ
   ----------------------------------------------------------------------------
   Reuses .faq__wrapper markup and the script.js:364 accordion. Everything
   below is a typography and a11y correction to inherited rules [D4]:
   14px→12px #5E8272 answers are the site's single worst readability failure
   and must not ship on a conversion page. Same specificity as the style.css
   rules; this file loads second, so these win — including inside the
   ≤1200 / ≤767 media blocks further down.
   ========================================================================== */

.fnl-faq {
	padding-top: var(--fnl-secpad);
	padding-bottom: var(--fnl-secpad);
}

.fnl-faq .outer__faq > .top {
	align-items: center;
	text-align: center;
	margin-bottom: 40px;
}

.fnl-faq .outer__faq > .top .fnl-pill {
	margin-bottom: 18px;
}

.fnl-faq .outer__faq > .top .h2-title {
	margin-bottom: 0;
	text-transform: none;
	font-size: 48px;
	line-height: 92%;
}

.fnl-faq .outer__faq .content {
	max-width: 900px;
	margin: 0 auto;
}

.fnl-faq .outer__faq .content > .elem {
	padding-top: 24px;
	padding-bottom: 24px;
	cursor: default;
}

/* Clicking inside an open answer must not close it — the whole .elem is no
   longer the affordance; .head-faq is. */
.fnl-faq .outer__faq .content > .elem .head-faq {
	cursor: pointer;
	align-items: flex-start;
	width: 100%;
	min-height: 44px;
	background: none;
	border: 0;
	padding: 0;
	text-align: left;
}

.fnl-faq .outer__faq .content > .elem .head-faq:focus-visible {
	outline: 2px solid var(--fnl-green);
	outline-offset: 3px;
	border-radius: 6px;
}

.fnl-faq .outer__faq .content > .elem .head-faq > p {
	margin: 0 0 0 20px;
	font-size: 22px;
	line-height: 120%;
	font-weight: 400;
	letter-spacing: -0.03em;
	color: var(--fnl-white);
	max-width: 46ch;
	transition: color .3s var(--fnl-ease-out);
}

.fnl-faq .outer__faq .content > .elem.opened .head-faq > p {
	color: var(--fnl-green);
}

.fnl-faq .outer__faq .content > .elem .head-faq > span > .vertical,
.fnl-faq .outer__faq .content > .elem .head-faq > span > .horizontal {
	background-color: var(--fnl-white);
}

.fnl-faq .outer__faq .content > .elem.opened .head-faq > span > .vertical,
.fnl-faq .outer__faq .content > .elem.opened .head-faq > span > .horizontal {
	background-color: var(--fnl-green);
}

.fnl-faq .outer__faq .content > .elem .content-faq > p {
	margin: 0;
	font-size: 16px;
	line-height: 165%;
	font-weight: 300;
	letter-spacing: -0.03em;
	color: var(--fnl-answer);
	max-width: 78ch;
}


/* ============================================================================
   16. SECTION 14 — Final CTA
   ----------------------------------------------------------------------------
   The conclusion, not another band. NO FOOTER — the document ends here, and
   the only exit is forward or up.

   The background arrives as a background-image via a data-bg IO swap (a CSS
   background cannot be lazy-loaded, and the 233KB finance asset must never
   compete with the hero for bandwidth), so #050E0A is the pre-load surface.
   The three-layer scrim guarantees the headline's bounding box stays darker
   than #2A3B33 (≥9:1 for white) on both very different industry images —
   worst case ≈ .92 × .86 × .72 of source luminance, which no realistic
   source pixel can defeat.
   ========================================================================== */

.fnl-s14 {
	position: relative;
	min-height: 520px;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var(--fnl-secpad) 0;
	background-color: #050E0A;
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
	overflow: hidden;
}

.fnl-s14::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 1;
	background:
		/* 1 vertical anchor — blends both edges into the page */
		linear-gradient(180deg,
			rgba(9, 24, 17, .78) 0%,
			rgba(9, 24, 17, .42) 42%,
			rgba(9, 24, 17, .74) 100%),
		/* 2 vignette — pulls focus to the headline, kills bright corners */
		radial-gradient(120% 90% at 50% 45%, rgba(5, 13, 9, .22) 0%, rgba(5, 13, 9, .72) 100%),
		/* 3 flat unifier — two art directions read as one surface */
		linear-gradient(rgba(5, 13, 9, .14), rgba(5, 13, 9, .14));
	-webkit-backdrop-filter: saturate(.75);
	        backdrop-filter: saturate(.75);
}

.fnl-s14 > .container {
	position: relative;
	z-index: 2;
}

.fnl-s14__inner {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
}

.fnl-s14__inner .fnl-sub {
	margin-top: 20px;
	max-width: 620px;
}

.fnl-s14 .fnl-cta {
	margin-top: 40px;
}

/* Back to the Top — visible, simple, and deliberately NOT a fixed floating
   control: a persistent floating button on a funnel competes with the CTA.
   The chevron is supplied explicitly because buttons.js auto-appends its own
   arrow to any .outline-btn lacking a child image. */
.fnl-page .fnl-backtop {
	margin-top: 32px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	height: 48px;
	padding: 0 26px;
	color: rgba(255, 255, 255, .8);
	cursor: pointer;
}

.fnl-page .fnl-backtop > span {
	display: inline-flex;
	align-items: center;
	position: relative;
	z-index: 2;
}


/* ============================================================================
   17. MODALS
   ----------------------------------------------------------------------------
   Two shells, one CSS component. The class contract below is read straight off
   js/funnel.js Kit.createShell() — NOT invented here:

     root      .fnl-modal            (+ cfg.cls)
     backdrop  .fnl-modal__backdrop  (first child)
     content   cfg.contentCls        (second child)
     close     .fnl-modal__close     (last child, so it wins the paint order)

     plan modal    cls "fnl-modal--plans" · contentCls "fnl-modal__framewrap"
                   → z 3500, holds iframe.fnl-modal__frame
     gallery       cls "fnl-preview"      · contentCls "fnl-preview__box"
                   → z 3400, holds .fnl-preview__arrow--prev,
                     .fnl-preview__stage, .fnl-preview__arrow--next,
                     .fnl-preview__caption; the box also carries
                     data-layout / .fnl-preview__box--video|graphic|email

   Both sit above the stray z-index:3000 at style.css:1891 (which participates
   in the ROOT stacking context because .integrations__wrapper declares no
   z-index of its own). 1200 — the Calendly ceiling — is not the ceiling.
   funnel.js also sets these two z-indexes inline as a defence; the values here
   are the authoritative ones and must match.
   ========================================================================== */

.fnl-modal {
	/* The shell is appended to <body>, so it must not depend on the page body
	   carrying .fnl-page — an industry lander does not, and the modal would then
	   render with undefined borders and radii. Exactly the 8 tokens the modal
	   region below reads; --fnl-secpad / --fnl-gap are breakpoint-overridden on
	   .fnl-page and are deliberately NOT restated here. */
	--fnl-ease-out: cubic-bezier(.22, .61, .36, 1);
	--fnl-bg: #091811;
	--fnl-border: 1px solid rgba(255, 255, 255, .09);
	--fnl-glass-bg: rgba(5, 14, 10, .45);
	--fnl-glass-border: 1px solid rgba(255, 255, 255, .18);
	--fnl-muted: #83B59F;
	--fnl-r-media: 18px;
	--fnl-white: #fff;

	position: fixed;
	inset: 0;
	z-index: 3400;
	opacity: 0;
	visibility: hidden;
	transition: opacity .3s ease, visibility .3s ease;
}

.fnl-modal--plans {
	z-index: 3500;
}

.fnl-modal.is-open {
	opacity: 1;
	visibility: visible;
}

.fnl-modal:focus {
	outline: none;
}

.fnl-modal__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(2, 9, 5, .92);
	-webkit-backdrop-filter: blur(6px);
	        backdrop-filter: blur(6px);
}

.fnl-preview .fnl-modal__backdrop {
	background: rgba(2, 9, 5, .88);
	-webkit-backdrop-filter: blur(8px);
	        backdrop-filter: blur(8px);
}

/* the shell's default content wrapper — neither shell uses it (both pass a
   contentCls), but it must not collapse if a third one ever does */
.fnl-modal__content {
	position: relative;
	z-index: 2;
}

/* A full-screen iframe silently kills backdrop-close, so the visible exit
   control IS the contract: 44×44, pinned, above the frame. */
.fnl-modal__close {
	position: absolute;
	top: 16px;
	right: 16px;
	z-index: 3501;
	width: 44px;
	height: 44px;
	padding: 0;
	border-radius: 999px;
	border: var(--fnl-glass-border);
	background: rgba(5, 14, 10, .65) center / 16px 16px no-repeat;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='M18 6L6 18M6 6l12 12'/%3E%3C/svg%3E");
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	cursor: pointer;
}

/* The iframe IS the viewport, so the modal document's own responsive CSS does
   all the work and there is no separate mobile geometry to write. */
.fnl-modal__framewrap {
	position: absolute;
	inset: 0;
	z-index: 2;
}

.fnl-modal__frame {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	background: var(--fnl-bg);
}

/* --- 17a. Gallery preview (.fnl-preview, z 3400) ---------------------- */
.fnl-preview {
	display: flex;
	align-items: center;
	justify-content: center;
}

.fnl-preview__box {
	position: relative;
	z-index: 2;
	margin: auto;
	max-width: min(92vw, 1000px);
	max-height: 90vh;
	transform: translateY(16px) scale(.985);
	transition: transform 380ms var(--fnl-ease-out);
	/* swipe-down-to-dismiss drags this element via an inline transform, so the
	   open transition must live on the same element and nothing else may animate
	   transform here. */
	touch-action: pan-y;
}

.fnl-preview.is-open .fnl-preview__box {
	transform: translateY(0) scale(1);
}

.fnl-preview__stage {
	position: relative;
	border-radius: var(--fnl-r-media);
	overflow: hidden;
	background: #070F0B;
	border: var(--fnl-border);
	box-shadow: 0 40px 90px -40px rgba(0, 0, 0, .85);
}

.fnl-preview__video,
.fnl-preview__img,
.fnl-preview__email {
	display: block;
	width: 100%;
	height: auto;
	object-fit: contain;
}

/* video: height-led so a 9:16 ad fills the tall axis without cropping */
.fnl-preview__box--video .fnl-preview__stage {
	width: min(92vw, calc(min(86vh, 900px) * 9 / 16));
}

.fnl-preview__video {
	max-height: min(86vh, 900px);
	background: #000;
}

/* graphic: contain inside a dark, checkerless surround; pinch-zoom allowed so a
   visitor can inspect detail on touch */
.fnl-preview__box--graphic .fnl-preview__stage {
	width: min(90vw, 1000px);
	background: #070F0B;
	touch-action: pinch-zoom;
}

.fnl-preview__img {
	max-height: min(86vh, 880px);
	width: auto;
	max-width: 100%;
	margin: 0 auto;
}

/* tall email: the STAGE scrolls (funnel.js reads stage.scrollTop to decide
   whether swipe-to-dismiss may start), the page beneath stays locked */
.fnl-preview__box--email .fnl-preview__stage {
	width: min(92vw, 620px);
	height: 86vh;
	overflow-y: auto;
	-webkit-overflow-scrolling: touch;
}

.fnl-preview__box--email .fnl-preview__email {
	max-height: none;
}

/* 24px bottom fade while more content remains */
.fnl-preview__box--email .fnl-preview__stage::after {
	content: "";
	position: sticky;
	bottom: 0;
	display: block;
	height: 24px;
	margin-top: -24px;
	background: linear-gradient(to top, #070F0B, rgba(7, 15, 11, 0));
	pointer-events: none;
}

.fnl-preview__caption {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	margin: 14px 0 0;
	font-size: 15px;
	line-height: 140%;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
	text-align: center;
}

/* prev/next — 48px glass circles OUTSIDE the media, never over the creative */
.fnl-preview__arrow {
	position: absolute;
	top: 50%;
	z-index: 4;
	width: 48px;
	height: 48px;
	padding: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 999px;
	border: var(--fnl-glass-border);
	background: var(--fnl-glass-bg);
	-webkit-backdrop-filter: blur(10px);
	        backdrop-filter: blur(10px);
	color: var(--fnl-white);
	font-size: 26px;
	line-height: 1;
	cursor: pointer;
	transition: border-color .3s var(--fnl-ease-out);
}

.fnl-preview__arrow:hover {
	border-color: rgba(255, 255, 255, .32);
}

.fnl-preview__arrow > span {
	position: relative;
	top: -2px;
}

.fnl-preview__arrow--prev {
	left: -28px;
	transform: translate(-100%, -50%);
}

.fnl-preview__arrow--next {
	right: -28px;
	transform: translate(100%, -50%);
}

/* --- 17b. plan-modal.html document ---------------------------------- */
.fnl-modal-page {
	background: var(--fnl-bg);
}

.fnl-modal-head {
	position: relative;
	z-index: 4;
	padding: 20px 0 0;
}

.fnl-modal-head__row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	min-height: 44px;
}

/* Pinned to the iframe viewport so a #comparison deep link always has a way
   out (the whole head is no longer sticky — Ben final). Glass backdrop keeps
   it legible over scrolled content; flex gap separates the ← from "Back". */
.fnl-modal-head__back {
	position: fixed;
	top: 20px;
	right: 24px;
	z-index: 60;
	display: inline-flex;
	align-items: center;
	gap: 10px;
	min-height: 44px;
	padding: 0 20px;
	border-radius: 999px;
	border: 1px solid rgba(255, 255, 255, .12);
	background: rgba(9, 24, 17, .78);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	font-size: 15px;
	font-weight: 500;
	letter-spacing: -0.03em;
	color: rgba(255, 255, 255, .72);
	cursor: pointer;
	transition: .3s ease all;
}

.fnl-modal-head__back:hover {
	color: var(--fnl-white);
	border-color: rgba(255, 255, 255, .24);
}

.fnl-modal-page .fnl-modal-head__title {
	margin: 28px 0 0;
	font-size: 48px;
	line-height: 92%;
	text-transform: none;
	text-align: center;
}

.fnl-modal-page .fnl-modal-head__title span,
.fnl-modal-page .fnl-modal-head__title.bigger span {
	font-size: inherit;
}

.fnl-s11--modal {
	padding-top: 40px;
	padding-bottom: 60px;
}


/* --- 17c. Niche video (.fnl-video, z 3450) ---------------------------------
   The /{niche}-video outreach modal, opened over an industry lander or funnel
   page by js/funnel.js module 12. Geometry mirrors .fnl-preview__box--video so
   the 9:16 edits render identically to the gallery preview.
   Sits above .fnl-modal (3400) and below .fnl-modal--plans (3500).
   -------------------------------------------------------------------------- */

.fnl-video {
	z-index: 3450;
	display: flex;
	align-items: center;
	justify-content: center;
}

.fnl-video .fnl-modal__backdrop {
	background: rgba(2, 9, 5, .94);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
}

.fnl-video__box {
	position: relative;
	z-index: 2;
	margin: auto;
	max-width: min(92vw, 1000px);
	max-height: 90vh;
	transform: translateY(16px) scale(.985);
	transition: transform 380ms var(--fnl-ease-out);
	touch-action: pan-y;
	/* Kit.swipeDown drags this element inline */
}

.fnl-video.is-open .fnl-video__box {
	transform: translateY(0) scale(1);
}

.fnl-video__stage {
	position: relative;
	border-radius: var(--fnl-r-media);
	overflow: hidden;
	background: #070F0B;
	border: var(--fnl-border);
	box-shadow: 0 40px 90px -40px rgba(0, 0, 0, .85);
	width: min(92vw, calc(min(86vh, 900px) * 9 / 16));
}

.fnl-video__stage--landscape {
	width: min(92vw, 900px);
}

.fnl-video__player {
	display: block;
	width: 100%;
	height: auto;
	max-height: min(86vh, 900px);
	background: #000;
}

.fnl-video__caption {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	margin: 14px 0 0;
	font-size: 15px;
	line-height: 140%;
	letter-spacing: -0.03em;
	color: var(--fnl-muted);
	text-align: center;
}

.fnl-video__sound {
	position: absolute;
	left: 50%;
	bottom: 64px;
	transform: translateX(-50%);
	z-index: 5;
	min-height: 44px;
	padding: 0 18px;
	border-radius: 999px;
	border: var(--fnl-glass-border);
	background: var(--fnl-glass-bg);
	color: var(--fnl-white);
	font-size: 14px;
	letter-spacing: -0.03em;
	cursor: pointer;
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
}

.fnl-video__play {
	position: absolute;
	inset: 0;
	margin: auto;
	width: 72px;
	height: 72px;
	z-index: 5;
	border-radius: 999px;
	border: var(--fnl-glass-border);
	background: var(--fnl-glass-bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M8 5v14l11-7z'/%3E%3C/svg%3E") center / 24px no-repeat;
	cursor: pointer;
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
}

.fnl-video__sound[hidden],
.fnl-video__play[hidden] {
	display: none;
}


/* ============================================================================
   18. UTILITIES
   ========================================================================== */

.fnl-page [hidden],
.fnl-modal-page [hidden] {
	display: none !important;
}

.fnl-page .container,
.fnl-modal-page .container {
	position: relative;
}


/* ============================================================================
   19. RESPONSIVE — consolidated, mobile-last (max-width), site idiom
      1400 · 1200 · 991 · 767 · 575 · 390 · 360
   ========================================================================== */

/* ---------------------------------------------------------------- ≤1400 --- */
@media (max-width: 1400px) {
	.fnl-page,
	.fnl-modal-page {
		--fnl-secpad: 96px;
	}

	.fnl-hero__grid {
		grid-template-columns: 700px 1fr;
		column-gap: 50px;
	}

	.fnl-hero__h1 {
		font-size: 54px;
		max-width: 700px;
	}

	.fnl-hero-player {
		width: 306px;
		height: 544px;
	}

	.fnl-islands {
		width: 306px;
		height: 544px;
	}
}

/* ---------------------------------------------------------------- ≤1200 --- */
@media (max-width: 1200px) {
	.fnl-page,
	.fnl-modal-page {
		--fnl-secpad: 80px;
	}

	/* hero */
	.fnl-hero {
		min-height: 800px;
	}

	.fnl-hero__grid {
		grid-template-columns: 654px 1fr;
		column-gap: 46px;
	}

	.fnl-hero__h1 {
		font-size: 50px;
		max-width: 654px;
	}

	.fnl-hero__sub {
		font-size: 17px;
		max-width: 560px;
	}

	.fnl-hero-player {
		width: 288px;
		height: 512px;
	}

	.fnl-islands {
		width: 288px;
		height: 512px;
	}

	.fnl-island {
		width: 120px;
		height: 52px;
	}

	.fnl-island--tl { left: -81px; }
	.fnl-island--br { right: -91px; }
	.fnl-island--bl { left: -75px; }

	.fnl-island__value {
		font-size: 20px;
	}

	/* type scale */
	.fnl-h2 {
		font-size: 40px;
		max-width: 820px;
	}

	.fnl-h2--col {
		font-size: 36px;
		max-width: 470px;
	}

	.fnl-h2--final {
		font-size: 56px;
	}

	.fnl-sub {
		font-size: 17px;
		max-width: 660px;
	}

	.fnl-sub--col {
		max-width: 470px;
	}

	/* logo rail */
	.fnl-logos__num {
		font-size: 36px;
	}

	/* S1 */
	.fnl-s1__caption > p {
		font-size: 17px;
	}

	.fnl-s1__caption.is-active > p {
		font-size: 20px;
	}

	.fnl-s1__stagebox {
		grid-template-columns: 38% 1fr;
	}

	/* S2 */
	.fnl-card__title {
		font-size: 21px;
	}

	/* overlaps × 0.88 */
	.fnl-card--b .fnl-card__img  { height: 264px; right: 30px; bottom: -49px; }
	.fnl-card--b .fnl-card__img2 { height: 236px; right: 143px; bottom: -74px; }
	.fnl-card--c .fnl-card__img  { height: 257px; right: 26px; bottom: -37px; }
	.fnl-card--c .fnl-card__img2 { height: 227px; right: 81px; bottom: -62px; }

	/* S4 */
	.fnl-case__h {
		font-size: 34px;
	}

	.fnl-case__stat > p > b {
		font-size: 26px;
	}

	.fnl-case__pull {
		font-size: 21px;
	}

	/* S5–S10 — no room for outside arrows; overlay them at 12px inset */
	.fnl-fs__grid {
		grid-template-columns: 470px 1fr;
		column-gap: 40px;
	}

	.fnl-fs--media-left .fnl-fs__grid {
		grid-template-columns: 1fr 470px;
	}

	.fnl-fs__arrow {
		width: 44px;
		height: 44px;
	}

	.fnl-fs__arrow--prev { left: 12px; }
	.fnl-fs__arrow--next { right: 12px; }

	/* S11 */
	.fnl-plan__price {
		font-size: 40px;
	}

	/* FAQ — beat the style.css:10607/10610 overrides */
	.fnl-faq .outer__faq > .top .h2-title {
		font-size: 40px;
	}

	.fnl-faq .outer__faq .content > .elem .head-faq > p {
		font-size: 21px;
	}

	.fnl-faq .outer__faq .content > .elem .content-faq > p {
		font-size: 16px;
	}

	.fnl-faq .outer__faq .content > .elem {
		padding-top: 24px;
		padding-bottom: 24px;
	}

	.fnl-modal-page .fnl-modal-head__title {
		font-size: 40px;
	}
}

/* ----------------------------------------------------------------- ≤991 --- */
@media (max-width: 991px) {
	.fnl-page,
	.fnl-modal-page {
		--fnl-secpad: 64px;
		--fnl-gap: 20px;
	}

	/* hero stacks — copy stays LEFT aligned; centred multi-line long
	   headlines are harder to scan, and .hero__grid--video itself uses
	   align-items:flex-start */
	.fnl-hero {
		min-height: 0;
		padding: 96px 0 64px;
	}

	.fnl-hero__grid {
		grid-template-columns: 1fr;
		row-gap: 40px;
	}

	.fnl-hero__h1 {
		font-size: 46px;
		max-width: 640px;
	}

	.fnl-hero__sub {
		max-width: 560px;
	}

	.fnl-hero-player {
		width: 300px;
		height: 533px;
	}

	.fnl-islands {
		width: 300px;
		height: 533px;
	}

	/* three islands are KEPT at tablet: 300px player inside 718px of content
	   leaves 209px of slack per side, so nothing can be occluded */
	.fnl-island--tl { left: -90px; }
	.fnl-island--br { right: -98px; }
	.fnl-island--bl { left: -86px; }

	.fnl-h2--col {
		font-size: 34px;
	}

	.fnl-h2--final {
		font-size: 48px;
	}

	/* logo rail */
	.fnl-logos {
		padding: 24px 0;
	}

	.fnl-logos__grid {
		grid-template-columns: 34% 1fr;
		column-gap: 32px;
	}

	.fnl-logos__num {
		font-size: 34px;
	}

	.fnl-logorail {
		height: 34px;
	}

	.fnl-logorail ul {
		gap: 48px;
	}

	.fnl-logorail li {
		height: 34px;
	}

	.fnl-logorail li img {
		max-height: 34px;
	}

	.fnl-logorail li[data-optical="0.78"] img { max-height: 27px; }
	.fnl-logorail li[data-optical="1.12"] img { max-height: 38px; }

	/* S2 — 2 equal columns; A and H span both to avoid an orphan at 8 cards */
	.fnl-s2__grid {
		grid-template-columns: repeat(2, 1fr);
		grid-template-rows: auto;
	}

	.fnl-card--a { grid-column: 1 / 3; grid-row: auto; min-height: 360px; }
	.fnl-card--b { grid-column: 1 / 2; grid-row: auto; }
	.fnl-card--c { grid-column: 2 / 3; grid-row: auto; }
	.fnl-card--d { grid-column: 1 / 2; grid-row: auto; }
	.fnl-card--e { grid-column: 2 / 3; grid-row: auto; }
	.fnl-card--g { grid-column: 1 / 2; grid-row: auto; }
	.fnl-card--h { grid-column: 1 / 3; grid-row: auto; min-height: 340px; }
	.fnl-card--i { grid-column: 2 / 3; grid-row: auto; }

	/* A becomes WIDE, everything else SQUARE at tablet */
	.fnl-card--b,
	.fnl-card--c,
	.fnl-card--d,
	.fnl-card--e,
	.fnl-card--f,
	.fnl-card--g,
	.fnl-card--i {
		display: flex;
		flex-direction: column;
		grid-template-columns: none;
		padding: 28px 28px 0;
		min-height: 420px;
	}

	.fnl-card--b .fnl-card__media,
	.fnl-card--c .fnl-card__media,
	.fnl-card--d .fnl-card__media,
	.fnl-card--e .fnl-card__media,
	.fnl-card--f .fnl-card__media,
	.fnl-card--g .fnl-card__media,
	.fnl-card--i .fnl-card__media {
		margin: 24px -28px 0;
		flex: 1 1 auto;
		min-height: 0;
	}

	.fnl-card--a,
	.fnl-card--h {
		display: grid;
		grid-template-columns: 44% 56%;
		align-items: center;
		padding: 28px;
	}

	.fnl-card--a .fnl-card__media,
	.fnl-card--h .fnl-card__media {
		align-self: stretch;
		margin: -28px -28px -28px 0;
		flex: none;
	}

	.fnl-card--a .fnl-card__media img {
		object-position: center;
		transform: none;
	}

	/* overlaps rebuilt vertically: primary centred at 92%, secondary peeking
	   22% from the left */
	.fnl-card--b .fnl-card__media--overlap,
	.fnl-card--c .fnl-card__media--overlap {
		overflow: hidden;
	}

	.fnl-card--b .fnl-card__img,
	.fnl-card--c .fnl-card__img {
		height: auto;
		width: 92%;
		left: 50%;
		right: auto;
		transform: translateX(-50%);
		bottom: -24px;
	}

	.fnl-card--b .fnl-card__img2,
	.fnl-card--c .fnl-card__img2 {
		height: auto;
		width: 44%;
		left: -22%;
		right: auto;
		bottom: -24px;
	}

	/* S3 — 3-column hold, deliberately: 2 columns here would give 458×814
	   tiles, i.e. a single tile taller than the viewport */
	.fnl-s3__grid {
		grid-template-columns: repeat(3, 1fr);
	}

	/* S4 stacks */
	.fnl-case {
		grid-template-columns: 1fr;
		row-gap: 28px;
		padding: 28px 22px;
		border-radius: var(--fnl-r-card);
		min-height: 0;
	}

	.fnl-case__rocket {
		display: none;
	}

	.fnl-case__logo img {
		max-height: 28px;
	}

	.fnl-case__h {
		font-size: 32px;
	}

	.fnl-case__stat {
		min-height: 56px;
	}

	.fnl-case__stat > p > b {
		font-size: 26px;
	}

	.fnl-case__quote {
		padding: 22px;
	}

	.fnl-case__pull {
		font-size: 20px;
	}

	/* S5–S10 stack, alternation ignored (rule #96).
	   Mobile order is pill → H2 → sub → media → caption → dots → CTA, but the
	   DOM puts the CTA inside the copy column ahead of the media. Rather than
	   reorder the DOM (which would break the desktop reading order), the copy
	   column becomes display:contents and its children are re-ordered as grid
	   items: text group 1, media 2, CTA 3. */
	.fnl-fs__grid,
	.fnl-fs--media-left .fnl-fs__grid,
	.fnl-fs--media-right .fnl-fs__grid {
		display: grid;
		grid-template-columns: 1fr;
		row-gap: 20px;
		justify-items: center;
		text-align: center;
	}

	.fnl-fs__copy,
	.fnl-fs--media-left .fnl-fs__copy,
	.fnl-fs--media-right .fnl-fs__copy {
		display: contents;
	}

	.fnl-fs__copy > .fnl-pill,
	.fnl-fs__copy > .fnl-h2,
	.fnl-fs__copy > .fnl-sub {
		order: 1;
	}

	/* MUST include the --media-right variant: its desktop grid-column: 2 rule
	   (specificity 0,2,0) beats a bare .fnl-fs__media override and shoved the
	   media into a phantom second column offscreen (Ben mobile #4) */
	.fnl-fs__media,
	.fnl-fs--media-left .fnl-fs__media,
	.fnl-fs--media-right .fnl-fs__media {
		order: 2;
		grid-column: 1;
		/* the desktop rule ALSO pins grid-row:1, which explicitly places the
		   media in the first row and made `order` moot — the media rendered
		   above the pill/headline (Ben mobile #4) */
		grid-row: auto;
		width: 100%;
		margin-top: 12px;
	}

	.fnl-fs__copy > .fnl-cta {
		order: 3;
		grid-column: 1;
		width: 100%;
		margin-top: 4px;
	}

	.fnl-fs__copy > .fnl-pill {
		margin-bottom: 0;
	}

	.fnl-h2--col,
	.fnl-sub--col {
		max-width: 100%;
		width: 100%;
	}

	.fnl-sub--col {
		margin-top: 0;
	}

	.fnl-fs__caption {
		min-height: 46px;
		text-align: center;
	}

	.fnl-fs__dots {
		justify-content: center;
	}

	.fnl-fs__arrow {
		width: 40px;
		height: 40px;
	}

	.fnl-fs__arrow--prev { left: 10px; }
	.fnl-fs__arrow--next { right: 10px; }

	/* S11 */
	.fnl-plan__price {
		font-size: 38px;
	}

	.fnl-plan {
		padding: 24px;
	}

	.fnl-enterprise {
		grid-template-columns: 1fr;
		row-gap: 20px;
	}

	/* S12 */
	.fnl-demo__play {
		width: 64px;
		height: 64px;
	}

	/* S14 */
	.fnl-s14 {
		min-height: 460px;
	}

	/* FAQ */
	.fnl-faq .outer__faq .content > .elem .head-faq > p {
		font-size: 20px;
	}

	.fnl-modal-page .fnl-modal-head__title {
		font-size: 36px;
	}

	/* no room outside the box — overlay the preview arrows at 10px inset */
	.fnl-preview__arrow {
		width: 44px;
		height: 44px;
	}

	.fnl-preview__arrow--prev {
		left: 10px;
		transform: translate(0, -50%);
	}

	.fnl-preview__arrow--next {
		right: 10px;
		transform: translate(0, -50%);
	}
}

/* ----------------------------------------------------------------- ≤767 --- */
@media (max-width: 767px) {
	.fnl-page,
	.fnl-modal-page {
		--fnl-secpad: 56px;
		--fnl-gap: 16px;
	}

	/* Headline break release — one rule, not per-section hacks. Mirrors the
	   site's own idiom. Below 768 all headlines wrap naturally. */
	.fnl-page h1 br,
	.fnl-page h2 br,
	.fnl-page .fnl-sub br {
		display: none;
	}

	/* header */
	.fnl-header {
		top: 20px;
	}

	.fnl-header__logo img {
		width: 124px;
		height: 24px;
	}

	/* hero — order: trust → H1 → sub → primary → secondary → subtext →
	   player → metric bar. Both CTAs sit fully in the fold at 390×844 with
	   ~250px to spare, and ~204px of the moving player still pulls the
	   scroll. */
	.fnl-hero {
		padding: 76px 0 48px;
	}

	.fnl-hero__grid {
		row-gap: 24px;
	}

	.fnl-hero__h1 {
		font-size: 40px;
		max-width: 100%;
	}

	.fnl-hero__sub {
		margin-top: 20px;
		max-width: 100%;
	}

	.fnl-hero__copy .fnl-cta {
		margin-top: 24px;
	}

	.fnl-hero-player {
		width: 300px;
		height: 533px;
	}

	/* pill text shortens in the markup at these widths; keep it from
	   overrunning the 300px player alongside the client logo */
	.fnl-hero-chrome {
		max-width: calc(100% - 68px);
	}

	/* Ben's call (2026-07-31): floating islands stay on mobile — the stat bar
	   is retired. Two compact islands only (storyboard §3.4 mobile row):
	   VIEWS top-left, CLICKS bottom-right, ≤12px bite into the 300px player;
	   ROI is hidden to keep the creative clear. */
	.fnl-metricbar {
		display: none;
	}

	.fnl-island {
		width: 96px;
		height: 44px;
		padding: 6px 9px;
		row-gap: 2px;
	}

	.fnl-island .fnl-island__label {
		font-size: 10px;
	}

	.fnl-island .fnl-island__value {
		font-size: 15px;
	}

	/* clear of the 40px sound button (top:14 + 40 + clearance) — overlapping
	   it made the button's backdrop-blur smear the island's white metric
	   value into a milky disc */
	.fnl-island--tl {
		top: 66px;
		left: -10px;
	}

	.fnl-island--br {
		top: auto;
		bottom: 6%;
		right: -10px;
	}

	.fnl-island--bl {
		display: none;
	}

	/* CTA stacking is arithmetically forced, not stylistic: the longest label
	   is 196px, and two of those plus a 12px gap is 404px against 350px of
	   content width at 390. Never side by side. */
	.fnl-cta {
		margin-top: 28px;
	}

	.fnl-cta__btns {
		flex-direction: column;
		align-items: stretch;
		gap: 12px;
	}

	.fnl-cta--inline .fnl-cta__btns,
	.fnl-cta--final .fnl-cta__btns,
	.fnl-cta--hero .fnl-cta__btns,
	.fnl-cta--lite .fnl-cta__btns {
		align-items: center;
	}

	.fnl-page .fnl-cta .filled-btn,
	.fnl-page .fnl-cta .regular-btn {
		width: 100%;
		max-width: 420px;
		height: 50px;
		font-size: 16px;
		padding: 16px 22px;
	}

	.fnl-cta__subtext {
		margin-top: 14px;
		margin-left: auto;
		margin-right: auto;
		font-size: 15px;
		max-width: 100%;
		text-align: center;
	}

	/* type scale */
	.fnl-h2 {
		font-size: 36px;
		max-width: 100%;
	}

	.fnl-h2--col {
		font-size: 32px;
	}

	.fnl-h2--final {
		font-size: 42px;
	}

	.fnl-pill {
		height: 28px;
	}

	/* logo rail — full-bleed marquee so the logos reach both screen edges and
	   read as an endless roster rather than a cramped row */
	.fnl-logos__grid {
		grid-template-columns: 1fr;
		row-gap: 20px;
	}

	.fnl-logos__num {
		font-size: 32px;
	}

	.fnl-logos__support {
		max-width: 300px;
	}

	.fnl-logorail {
		height: 44px;
		margin-inline: -25px;
	}

	.fnl-logorail ul {
		gap: 40px;
		animation-duration: 30s;
	}

	.fnl-logorail li {
		height: 28px;
	}

	.fnl-logorail li img {
		max-height: 28px;
	}

	.fnl-logorail li[data-optical="0.78"] img { max-height: 22px; }
	.fnl-logorail li[data-optical="1.12"] img { max-height: 31px; }

	/* S1 stepper spacing */
	.fnl-s1__caption > p {
		font-size: 20px;
	}

	/* S2 — 1 column, square archetype everywhere, per-card locked media
	   aspect ratios so there is zero CLS */
	.fnl-s2__grid {
		grid-template-columns: 1fr;
	}

	.fnl-card,
	.fnl-card--a,
	.fnl-card--b,
	.fnl-card--c,
	.fnl-card--d,
	.fnl-card--e,
	.fnl-card--f,
	.fnl-card--g,
	.fnl-card--h,
	.fnl-card--i {
		grid-column: 1;
		grid-row: auto;
		display: flex;
		flex-direction: column;
		grid-template-columns: none;
		padding: 24px 22px 0;
		min-height: 0;
	}

	.fnl-card .fnl-card__media,
	.fnl-card--a .fnl-card__media,
	.fnl-card--h .fnl-card__media {
		margin: 20px -22px 0;
		align-self: auto;
		flex: none;
	}

	.fnl-card--e .fnl-card__media {
		margin-left: 0;
		margin-right: 0;
	}

	.fnl-card--a .fnl-card__media { aspect-ratio: 4 / 5; }
	.fnl-card--b .fnl-card__media { aspect-ratio: 16 / 11; }
	.fnl-card--c .fnl-card__media { aspect-ratio: 16 / 11; }
	.fnl-card--d .fnl-card__media { aspect-ratio: 16 / 10; }
	.fnl-card--e .fnl-card__media { aspect-ratio: 1 / 1; }
	.fnl-card--f .fnl-card__media { aspect-ratio: 16 / 11; }
	.fnl-card--g .fnl-card__media { aspect-ratio: 16 / 10; }
	.fnl-card--h .fnl-card__media { aspect-ratio: 16 / 10; }
	.fnl-card--i .fnl-card__media { aspect-ratio: 16 / 10; }

	.fnl-card__title {
		font-size: 20px;
	}

	/* Two screenshots inside a 350px card are both illegible; showing one
	   well beats showing two badly. Explicit decision, not a fallback. */
	.fnl-card__img2 {
		display: none;
	}

	.fnl-card--b .fnl-card__img,
	.fnl-card--c .fnl-card__img {
		position: relative;
		width: 78%;
		height: auto;
		left: auto;
		right: auto;
		bottom: auto;
		transform: none;
		margin: 0 auto -32px;
		display: block;
	}

	/* brain: 5 icons only — nodes 6–9 collide below 400px of card width */
	.fnl-card__brainicons img:nth-child(n + 6) {
		display: none;
	}

	.fnl-card__brainicons img {
		animation: none;
		opacity: .8;
	}

	/* S3 — 2 columns */
	.fnl-s3__grid {
		grid-template-columns: repeat(2, 1fr);
	}

	.fnl-tile__pill {
		height: 24px;
		font-size: 12px;
	}

	/* S5–S10 slide overlaps: secondary out, primary scaled up */
	.fnl-slide__secondary {
		display: none;
	}

	.fnl-slide__primary {
		width: 92% !important;
		left: 4% !important;
		right: auto !important;
		top: 4% !important;
		bottom: auto !important;
	}

	.fnl-slide__inset {
		width: 44%;
	}

	/* S11 — natural price order on mobile: Starter, Team, Pro. This previously
	   pulled the featured (Pro) card to the top; with live ad traffic landing
	   here, the most expensive plan was the first price a visitor saw, which
	   reads as the price of entry. DOM order is already cheapest-first, so the
	   fix is simply to not reorder. */
	.fnl-plans {
		grid-template-columns: 1fr;
	}

	.fnl-plan__price {
		font-size: 36px;
	}

	.fnl-page .fnl-enterprise__btn .filled-btn {
		width: 100%;
		max-width: 420px;
		height: 50px;
		font-size: 16px;
	}

	/* S12 */
	.fnl-demo__play {
		width: 56px;
		height: 56px;
	}

	/* S14 */
	.fnl-s14 {
		min-height: 420px;
	}

	.fnl-page .fnl-backtop {
		width: 100%;
		max-width: 420px;
		height: 50px;
		font-size: 16px;
	}

	/* FAQ — beat the style.css:11893 override and keep answers at 16px */
	.fnl-faq .outer__faq .content > .elem .head-faq > p {
		font-size: 19px;
		margin-left: 10px;
	}

	.fnl-faq .outer__faq .content > .elem .content-faq > p {
		font-size: 16px;
	}

	.fnl-faq .outer__faq .content > .elem .content-faq {
		padding-left: 30px;
	}

	.fnl-faq .outer__faq > .top .h2-title {
		font-size: 36px;
	}

	/* plan modal: the sticky category bar is positioned against the IFRAME
	   viewport, and the modal header is 64px, not the site's 163px */
	.fnl-modal-page .compare__plans .compare-cat-fixed {
		top: 64px;
	}

	.fnl-modal-page .fnl-modal-head__title {
		font-size: 32px;
	}

	/* Close is 44×44 at the VIEWPORT's top-right on mobile — it is a child of
	   the shell root, so it already is viewport-positioned; this only restates
	   the contract next to the box resize. */
	.fnl-preview__box {
		max-width: 94vw;
	}

	.fnl-preview__box--video .fnl-preview__stage {
		width: min(92vw, 420px);
	}

	.fnl-preview__box--graphic .fnl-preview__stage {
		width: min(94vw, 520px);
	}

	.fnl-preview__box--email .fnl-preview__stage {
		width: 94vw;
		height: 88vh;
	}

	.fnl-preview__caption {
		font-size: 15px;
	}

	/* 17c niche video — mirrors .fnl-preview__box--video above */
	.fnl-video__box {
		max-width: 94vw;
	}

	.fnl-video__stage {
		width: min(92vw, 420px);
	}

	.fnl-video__caption {
		font-size: 15px;
	}

	.fnl-video .fnl-modal__close {
		top: 16px;
		right: 16px;
	}

	.fnl-preview .fnl-modal__close {
		top: 16px;
		right: 16px;
	}
}

/* ----------------------------------------------------------------- ≤575 --- */
@media (max-width: 575px) {
	.fnl-page,
	.fnl-modal-page {
		--fnl-secpad: 48px;
		--fnl-gap: 14px;
	}

	/* the two headlines whose desktop break survives to 576 release here */
	.fnl-s3 h2 br,
	.fnl-s11 h2 br {
		display: none;
	}

	/* variant B's S1 headline is the tallest text on the page (5 lines at 390);
	   reserve it so the two variants produce the same section geometry and the
	   A/B result is not contaminated by a layout difference */
	.fnl-s1__head .fnl-h2 {
		min-height: 170px;
		min-height: 5lh;
	}

	.fnl-hero__h1 {
		font-size: 38px;
	}

	.fnl-hero__sub {
		font-size: 16px;
	}

	.fnl-trust {
		font-size: 15px;
	}

	.fnl-h2 {
		font-size: 34px;
	}

	.fnl-h2--col {
		font-size: 30px;
	}

	.fnl-h2--final {
		font-size: 38px;
	}

	.fnl-sub {
		font-size: 16px;
	}

	.fnl-logos__num {
		font-size: 30px;
	}

	.fnl-card__support {
		font-size: 16px;
	}

	/* all card media flattens to 16:10 except A */
	.fnl-card--b .fnl-card__media,
	.fnl-card--c .fnl-card__media,
	.fnl-card--e .fnl-card__media,
	.fnl-card--f .fnl-card__media {
		aspect-ratio: 16 / 10;
	}

	.fnl-tile__pill {
		height: 24px;
		font-size: 11px;
	}

	.fnl-case__h {
		font-size: 28px;
	}

	.fnl-case {
		padding: 24px 18px;
	}

	.fnl-case__stat > p > b {
		font-size: 24px;
	}

	.fnl-case__pull {
		font-size: 19px;
	}

	.fnl-case__body > p {
		font-size: 16px;
	}

	.fnl-case__author {
		font-size: 15px;
	}

	.fnl-case__role {
		font-size: 14px;
	}

	.fnl-fs__caption {
		font-size: 16px;
	}

	.fnl-fs__caption2 {
		font-size: 14px;
	}

	.fnl-plan__name {
		font-size: 17px;
	}

	.fnl-plan__price {
		font-size: 34px;
	}

	.fnl-faq .outer__faq .content > .elem .head-faq > p {
		font-size: 19px;
	}

	.fnl-faq .outer__faq > .top .h2-title {
		font-size: 34px;
	}

	.fnl-modal-page .fnl-modal-head__title {
		font-size: 28px;
	}
}

/* ----------------------------------------------------------------- ≤400 ---
   Storyboard §3.3: below 400px the "Created by ValiantAI" pill plus the
   client logo exceed the 300px player width, so the pill collapses to the V
   mark alone. The whole chrome group is aria-hidden, so hiding the text costs
   nothing in the accessibility tree. */
@media (max-width: 400px) {
	.fnl-hero-pill {
		padding: 0 7px;
		gap: 0;
	}

	.fnl-hero-pill__txt {
		display: none;
	}
}

/* ----------------------------------------------------------------- ≤390 --- */
@media (max-width: 390px) {
	.fnl-s3__grid {
		gap: 12px;
	}

	.fnl-logorail {
		margin-inline: -16px;
	}
}

/* ----------------------------------------------------------------- ≤360 --- */
@media (max-width: 360px) {
	.fnl-hero__h1 {
		font-size: 34px;
	}

	.fnl-hero-player {
		width: 280px;
		height: 498px;
	}

	.fnl-h2 {
		font-size: 30px;
	}

	.fnl-h2--col {
		font-size: 28px;
	}

	.fnl-h2--final {
		font-size: 34px;
	}

	.fnl-metricbar .fnl-island__label {
		font-size: 12px;
	}

	.fnl-metricbar .fnl-island__value {
		font-size: 18px;
	}

	.fnl-logos__num {
		font-size: 28px;
	}

	.fnl-logos__support {
		font-size: 14px;
	}

	.fnl-card__title {
		font-size: 19px;
	}

	.fnl-card__support {
		font-size: 15px;
	}

	.fnl-tile__pill {
		height: 24px;
		font-size: 11px;
	}

	.fnl-case__h {
		font-size: 26px;
	}

	.fnl-case__stat > p > b {
		font-size: 22px;
	}

	.fnl-case__stat > p > span {
		font-size: 15px;
	}

	.fnl-case__pull {
		font-size: 18px;
	}

	.fnl-plan__price {
		font-size: 32px;
	}

	.fnl-plan__features li {
		font-size: 14px;
	}

	.fnl-cta__subtext {
		font-size: 14px;
	}

	.fnl-faq .outer__faq .content > .elem .head-faq > p {
		font-size: 18px;
	}

	.fnl-faq .outer__faq .content > .elem .content-faq > p {
		font-size: 15px;
	}

	.fnl-faq .outer__faq > .top .h2-title {
		font-size: 30px;
	}
}

/* --- Hero background: mobile tile-field overrides ---------------------
   Kept separate from the consolidated blocks because these are overrides of
   the INHERITED .grid-float geometry, which style.css also rewrites at
   ≤991 / ≤767 / ≤575 — scoping them to .fnl-hero and placing them last is
   what makes the funnel's placement win. */
@media (max-width: 991px) {
	.fnl-hero .fnl-hero__tiles.grid-float {
		top: -60px;
		right: -30%;
		width: 110%;
	}
}

@media (max-width: 767px) {
	.fnl-hero .fnl-hero__tiles.grid-float {
		top: -40px;
		right: -40%;
		width: 150%;
		opacity: .5;
	}

	.fnl-hero .fnl-hero__tiles.grid-float .row:nth-child(n + 3) {
		display: none;
	}

	.fnl-hero .fnl-hero__tiles.grid-float .row .el {
		min-width: 150px;
		max-width: 150px;
	}

	/* strengthen the vertical scrim across the top 40% so the stacked copy
	   stays fully legible over the moving field */
	.fnl-hero.hero__grid--video::after {
		background:
			linear-gradient(90deg,
				rgba(5, 13, 9, .92) 0%,
				rgba(5, 13, 9, .88) 55%,
				rgba(5, 13, 9, .78) 100%),
			linear-gradient(0deg,
				rgba(5, 13, 9, .9) 0%,
				rgba(5, 13, 9, .5) 55%,
				rgba(5, 13, 9, .92) 100%);
	}
}

@media (max-width: 575px) {
	.fnl-hero .fnl-hero__tiles.grid-float .row:nth-child(n + 2) {
		display: none;
	}

	.fnl-hero .fnl-hero__tiles.grid-float .row .vmarq {
		will-change: auto;
	}
}


/* ============================================================================
   20. REDUCED MOTION — the single guard block
   ----------------------------------------------------------------------------
   Everything animated on a funnel page is decorative: the five S1 steps, the
   six carousels' slides, the logo roster and the metric values are all fully
   readable with motion off. So this is "off", not "slower".
   Includes the guard style.css never got for .vmarq (finding 0.17), scoped to
   .fnl-hero so video.html is unaffected.
   ========================================================================== */


/* ============================================================================
   18b. GREEN FLOW ACCENTS (Ben #12) — subtle radial glows so sections don't
   read flat. Deliberately quiet: nothing above .07 alpha, no animation, and
   never behind body copy blocks (contrast first).
   ========================================================================== */

.fnl-s2,
.fnl-s4,
.fnl-s11,
.fnl-s12 {
	position: relative;
}

.fnl-s2::before,
.fnl-s4::before,
.fnl-s11::before,
.fnl-s12::before {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 0;
	background: radial-gradient(52% 38% at 50% 0%, rgba(0, 255, 138, .06) 0%, rgba(0, 255, 138, 0) 100%);
}

.fnl-s2 > .container,
.fnl-s4 > .container,
.fnl-s11 > .container,
.fnl-s12 > .container {
	position: relative;
	z-index: 1;
}

.fnl-fs--media-left {
	background-image: linear-gradient(83deg, rgba(0, 255, 138, 0) 30%, rgba(0, 255, 138, .03) 100%);
}

.fnl-fs--media-right {
	background-image: linear-gradient(263deg, rgba(0, 255, 138, 0) 30%, rgba(0, 255, 138, .03) 100%);
}


/* inlined stat/rocket icons inherit currentColor — set the green here (Ben #25) */
.fnl-case__staticon,
.fnl-case__staticon svg {
	color: #00FF8A;
}

.fnl-case__rocket,
.fnl-case__rocket svg {
	color: #00FF8A;
}

.fnl-tile__pill svg {
	color: #fff;
}

/* text fallback for clients with no obtainable logo (gold-boys etc.) */
.fnl-tile__client--text {
	display: inline-flex;
	align-items: center;
	height: 28px;
	padding: 0 10px;
	border-radius: 10px;
	background: rgba(5, 14, 10, .42);
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
	border: 1px solid rgba(255, 255, 255, .16);
	font-size: 12px;
	font-weight: 500;
	color: rgba(255, 255, 255, .92);
}

/* plan-modal header polish (Ben #19): give Back a real pill and clear the
   parent ✕ from the scrollbar edge */
.fnl-modal-head {
	padding: 22px 0 6px;
}

.fnl-modal-head__title {
	margin: 18px 0 6px;
}

.fnl-modal--plans .fnl-modal__close {
	top: 16px;
	right: 22px;
}


/* M1 — script.js appends a hamburger to ANY header .outer__header; funnels
   have no nav to toggle */
.fnl-header .menu-btn {
	display: none !important;
}

/* M5 — CTA labels never wrap inside the button */
.fnl-page .fnl-cta a,
.fnl-page .fnl-cta button,
.fnl-plan__cta {
	white-space: nowrap;
}


/* ============================================================================
   8c. MOBILE PINNED S1 (Ben mobile #3) — .fnl-s1--mpin is added by funnel.js
   stageSeq when it activates at ≤991px. One stage on screen at a time, the
   visual full-width (finally readable), screens entering right→left exactly
   like desktop (same engine). Without JS / reduced motion / short landscape
   windows the class never appears and the vertical stepper above remains.
============================================================================ */
@media (max-width: 991px) {
	.fnl-s1--mpin {
		height: 460vh;
		padding-top: 0;
		padding-bottom: 0;
	}

	.fnl-s1--mpin .fnl-s1__pin {
		position: sticky;
		top: 0;
		height: 100vh;
		height: 100svh;
		overflow: hidden;
		display: flex;
		flex-direction: column;
		justify-content: center;
	}

	.fnl-s1--mpin .fnl-s1__head {
		padding-top: 0;
	}

	.fnl-s1--mpin .fnl-s1__stagebox {
		display: flex;
		flex-direction: column;
		margin-top: 26px;
	}

	/* visual first (homepage how-it-works order), caption below */
	/* full-bleed out of the 20px container padding and a taller 4:3 box: the
	   stage diagrams were unreadable at 350x219 (Ben mobile #3) */
	.fnl-s1--mpin .fnl-s1__visuals {
		order: 1;
		display: block;
		position: relative;
		width: calc(100% + 40px);
		margin-inline: -20px;
		aspect-ratio: 4 / 3;
		border-radius: 0;
		overflow: hidden;
		border: var(--fnl-border);
		background: var(--fnl-stage);
	}

	.fnl-s1--mpin .fnl-s1__visual {
		position: absolute;
		inset: 0;
		width: 100%;
		margin: 0;
		border: 0;
		border-radius: 0;
		background: none;
		opacity: 0;
		/* two stages cross-fading at 350px wide read as one ghosted mess —
		   only the active stage paints on mobile (Ben mobile #3) */
		visibility: hidden;
		transition: opacity .28s linear, visibility .28s step-end;
	}

	.fnl-s1--mpin .fnl-s1__visual.is-active {
		opacity: 1 !important;
		visibility: visible;
		transform: none !important;
		transition: opacity .28s linear, visibility .28s step-start;
	}

	.fnl-s1--mpin .fnl-s1__captions {
		order: 2;
		display: block;
		position: relative;
		min-height: 108px;
		margin-top: 20px;
		padding-left: 0;
	}

	.fnl-s1--mpin .fnl-s1__caption {
		position: absolute;
		inset: 0;
		display: flex;
		align-items: flex-start;
		justify-content: center;
		gap: 14px;
		padding: 0;
		opacity: 0;
		visibility: hidden;
		transform: none;
		transition: opacity .4s var(--fnl-ease-out), visibility .4s step-end;
	}

	.fnl-s1--mpin .fnl-s1__caption.is-active {
		opacity: 1;
		visibility: visible;
		transition: opacity .4s var(--fnl-ease-out), visibility .4s step-start;
	}

	/* the reveal util must never hold an mpin caption at opacity 0 */
	.fnl-s1--mpin .fnl-s1__caption.fnl-reveal {
		transform: none;
	}

	.fnl-s1--mpin .fnl-s1__num {
		position: static;
		flex: 0 0 auto;
	}

	.fnl-s1--mpin .fnl-s1__caption > p {
		margin: 5px 0 0;
		max-width: 26ch;
		text-align: left;
	}

	.fnl-s1--mpin .fnl-s1__rail {
		display: none;
	}
}


/* M7 — comparison header on a phone: style.css pins the price span to
   21px!important at <=767, which wraps the price mid-word in a 106px
   column. Same importance, later sheet, higher specificity wins. */
@media (max-width: 767px) {
	.fnl-modal-page .compare__plans .top-absolute .plans .elem .top > span {
		font-size: 15px !important;
		white-space: nowrap;
	}

	.fnl-modal-page .compare__plans .plans .elem > .top > p {
		font-size: 16px;
	}

	/* buttons: 145px min-width overflows three-up at 390px */
	.fnl-modal-page .compare__plans .plans .elem > .top .btn > a {
		min-width: 0;
		max-width: none;
		padding: 12px 14px;
		font-size: 13px;
	}

}


/* Ben #52 — breathing room at the two seams around Section 1: the pinned
   track sets padding to 0, so the rail sat hard against the S1 heading and
   S2 started immediately after the release. */
.fnl-logos {
	margin-bottom: 28px;
}

.fnl-s1__head {
	padding-top: 72px;
}

.fnl-s2 {
	padding-top: calc(var(--fnl-secpad) + 40px);
}

@media (max-width: 991px) {
	.fnl-s1__head {
		padding-top: 48px;
	}

	.fnl-s2 {
		padding-top: calc(var(--fnl-secpad) + 20px);
	}
}


/* mpin on SHORT phones/emulated viewports: compact the head so pin content
   never overflows 100svh (the sub is redundant with the caption there) */
@media (max-width: 991px) and (max-height: 700px) {
	.fnl-s1--mpin .fnl-s1__head .fnl-sub {
		display: none;
	}

	.fnl-s1--mpin .fnl-s1__head .fnl-h2 {
		font-size: 27px;
		min-height: 0;
	}

	.fnl-s1--mpin .fnl-s1__visuals {
		aspect-ratio: 16 / 10;
	}

	.fnl-s1--mpin .fnl-s1__captions {
		min-height: 84px;
		margin-top: 12px;
	}
}


/* Ben #48 (final calibration): the funnel bg tiles were exported darker than
   /video's slide-video-*.webp — lift them so the field measures like /video
   under the identical scrim. */
.fnl-hero .fnl-hero__tiles .el > img {
	filter: brightness(1.12); /* dialed back — 1.35 competed with the player (Ben final) */
}


/* #24 — plan CTAs carry no .fb-in arrow (label is a <p>, so buttons.js never
   enhances them): freeze their hover padding or the label lurches 20px with
   nothing sliding in */
.fnl-page .fnl-plan__cta.filled-btn:hover,
.fnl-modal-page .fnl-plan__cta.filled-btn:hover {
	padding: 16px 28px;
}

/* #18 — the CTA sat flush against the first feature bullet (54px above, 0 below) */
.fnl-page .fnl-plan__cta,
.fnl-modal-page .fnl-plan__cta {
	margin-bottom: 18px;
}

/* Ben final: head content scrolls normally — only the Back control is pinned
   (see .fnl-modal-head__back), and the old sticky gradient that painted a
   band across the top of the modal is gone */

/* Landscape phones: the ✕ sits at top-right of the viewport, so a full-height
   9:16 stage would run under it. Shrink the stage rather than move the button. */
@media (max-height: 560px) {

	.fnl-video__player {
		max-height: 78vh;
	}

	.fnl-video__stage {
		width: min(92vw, calc(78vh * 9 / 16));
	}
}


@media (prefers-reduced-motion: reduce) {

	/* the niche-video modal appears without the rise-and-scale */
	.fnl-video__box {
		transition: none;
		transform: none;
	}

	/* hero tile field becomes a static tilted collage, which still reads */
	.fnl-hero.hero__grid--video .grid-float .row .vmarq,
	.fnl-hero .fnl-hero__tiles .vmarq {
		animation: none !important;
	}

	/* metric islands: no float; the ticker renders its final value once */
	.fnl-island,
	.fnl-island--f0,
	.fnl-island--f1,
	.fnl-island--f2 {
		animation: none !important;
		will-change: auto;
	}

	/* entrance reveals are instant */
	.fnl-reveal {
		opacity: 1 !important;
		transform: none !important;
		transition: none !important;
	}

	/* logo rail: static, horizontally scrollable roster — no information is
	   motion-dependent */
	.fnl-logorail {
		overflow-x: auto;
		-webkit-mask-image: none;
		        mask-image: none;
	}

	.fnl-logorail ul {
		animation: none !important;
		justify-content: flex-start;
		will-change: auto;
	}

	/* carousels: no auto-advance telegraph, no drift; arrows and dots only */
	.fnl-fs__dot.is-active > i::after,
	.fnl-fs__frame.is-playing ~ .fnl-fs__dots .fnl-fs__dot.is-active > i::after,
	.fnl-fs__media.is-playing .fnl-fs__dot.is-active > i::after {
		animation: none !important;
		width: 100%;
	}

	.fnl-slide,
	.fnl-slide.is-active,
	.fnl-slide.is-out {
		transform: none !important;
		transition: none !important;
	}

	.fnl-fs__caption {
		transition: none !important;
	}

	/* S1 rail fill is static */
	.fnl-s1__rail > i {
		transform: none;
		opacity: .22;
		background: rgba(0, 255, 138, .22);
	}

	.fnl-s1__caption,
	.fnl-s1__caption > p,
	.fnl-s1__num,
	.fnl-s1__visual {
		transition: none !important;
	}

	/* hover zooms off */
	.fnl-card,
	.fnl-card__media img,
	.fnl-card__media > img,
	.fnl-tile,
	.fnl-tile__mediabox img,
	.fnl-tile::after,
	.fnl-tile::before {
		transition: none !important;
	}

	.fnl-card:hover,
	.fnl-tile:hover {
		transform: none !important;
	}

	.fnl-card:hover .fnl-card__media > img,
	.fnl-card--a:hover .fnl-card__media img,
	.fnl-tile:hover .fnl-tile__mediabox img {
		transform: none !important;
	}

	/* brain nodes never pulse */
	.fnl-card__brainicons img {
		animation: none !important;
	}

	/* modals open and close instantly */
	.fnl-modal,
	.fnl-preview__box,
	.fnl-preview__arrow,
	.fnl-hero-poster,
	.fnl-hero-player video,
	.fnl-hero-video,
	.fnl-hero-play,
	.fnl-demo__play {
		transition: none !important;
	}

	.fnl-preview__box,
	.fnl-preview.is-open .fnl-preview__box {
		transform: none !important;
	}
}

/* VAL-136: the whole poster is the click target, not just the play button. */
.fnl-demo {
	cursor: pointer;
}

.fnl-demo.is-playing {
	cursor: default;
}

/* ============================================================================
   VAL-137 — plan comparison: sticky chrome, column grid, mobile order
   ----------------------------------------------------------------------------
   The comparison had TWO independently-positioned sticky layers with solid
   backgrounds: the plan header (sticky, top:0) and each category band
   (sticky, top:163px — a hard-coded guess). The header is taller than 163px,
   so the band tucked underneath it, and together ~278px of opaque chrome hid
   up to four rows as you scrolled. That is the "colour block" swallowing
   "Videos/Emails/Graphics included".

   Everything below is driven from ONE variable per breakpoint so the two
   layers can never drift apart again. --cmp-head-h MUST equal the rendered
   height of .top-absolute > .inner at that breakpoint.
============================================================================ */
.fnl-modal-page .compare__plans {
	--cmp-head-h: 174px;
	--cmp-col-gap: 8px;
}

/* The category band pins directly BELOW the header instead of under it.
   The -1px overlaps the band's own top hairline onto the header's bottom
   hairline while it is pinned, so the two render as ONE line rather than
   stacking into a 2px seam — the same doubling this pass removes elsewhere.
   (The band sits at z-index 1 under the header's 2, so it is the header's
   hairline that survives the overlap; either way the visible edge is 1px.) */
.fnl-modal-page .compare__plans .bottom__part > .subtitle {
	top: calc(var(--cmp-head-h) - 1px);
}

/* The band read as a hard-edged rectangle floating over the table because its
   box is ~25px wider than the rows on each side.
   Do NOT fix that by zeroing the padding: the padding is what aligns the plan
   columns with the row values beneath them. Removing it slid every heading 25px
   left of its own numbers. Instead keep the padding and paint the background
   FULL-BLEED behind it, so it reads as a header bar rather than a floating
   block, and the columns stay aligned. */
.fnl-modal-page .compare__plans .top-absolute > .inner {
	position: sticky;
	background-color: transparent;
	isolation: isolate;
}

.fnl-modal-page .compare__plans .top-absolute > .inner::after {
	content: "";
	position: absolute;
	top: 0;
	bottom: 0;
	left: 50%;
	width: 100vw;
	transform: translateX(-50%);
	background-color: #050E0A;
	z-index: -1;
	pointer-events: none;
}

@media (max-width: 991px) {
	.fnl-modal-page .compare__plans {
		--cmp-head-h: 150px;
		--cmp-col-gap: 12px;
	}

	/* Re-enable the frozen plan names on mobile. style.css turns this off below
	   991px, so the columns lost their headings the moment you scrolled — on a
	   long table that leaves three unlabelled columns of values. */
	/* display:contents removes .top-absolute from the box tree, so .inner's
	   containing block becomes the full-height .container. Without this the
	   header computes position:sticky but NEVER PINS: style.css makes
	   .top-absolute static with height:auto below 991px, collapsing it to
	   exactly .inner's height, which leaves sticky zero travel. Computed style
	   says "sticky" either way — only scrolling reveals it. */
	.fnl-modal-page .compare__plans .top-absolute {
		display: contents;
	}

	.fnl-modal-page .compare__plans .top-absolute > .inner {
		position: sticky;
		top: 0;
		z-index: 4;
	}

	/* Only the plan names + prices pin. The big "Compare The Plans" title does
	   not need to follow you down a 7,000px table, and dropping it is what
	   makes the pinned band small enough to be worth having. */
	.fnl-modal-page .compare__plans .top-absolute > .inner > .left {
		display: none;
	}

}

@media (max-width: 767px) {
	.fnl-modal-page .compare__plans {
		--cmp-head-h: 132px;
		/* Columns must separate MORE than the logos inside them, or the three
		   plans' integration icons read as one continuous strip (they were 8px
		   apart while their own icons were 15px apart). */
		--cmp-col-gap: 20px;
	}

	/* Row cells AND the header grid must both take the gap, or the columns
	   drift: the header kept an 8px gap from style.css while the rows moved to
	   20px, putting Pro's values 8px right of the Pro heading. */
	.fnl-modal-page .compare__plans .bottom__part > .list .elem,
	.fnl-modal-page .compare__plans .top-absolute > .inner .plans {
		gap: var(--cmp-col-gap);
	}

	.fnl-modal-page .compare__plans .bottom__part > .list .elem .sub__el {
		width: calc((100% - 2 * var(--cmp-col-gap)) / 3);
		min-width: 0;
		flex: 0 0 calc((100% - 2 * var(--cmp-col-gap)) / 3);
		margin: 0;
	}

	/* Tighter than the column gap above — proximity is what tells a visitor
	   which logos belong to which plan. */
	.fnl-modal-page .compare__plans .bottom__part > .list .sub__el > ul {
		gap: 10px !important;
	}

	/* Breathing room between rows; 25px+25px read as one cramped block once the
	   values wrapped to two and three lines. */
	.fnl-modal-page .compare__plans .bottom__part > .list .elem {
		padding-bottom: 18px;
		margin-bottom: 18px;
	}

	/* Back moves to the BOTTOM on mobile. Pinned top-right it covered the Pro
	   price in the frozen header and sat on card text while scrolling; padding
	   the header instead would have pushed the plan columns out of alignment
	   with the rows below. Bottom-right is also the easier thumb target. */
	.fnl-modal-page .fnl-modal-head__back {
		top: auto;
		bottom: 16px;
		right: 16px;
		min-height: 40px;
		padding: 0 16px;
		font-size: 14px;
		box-shadow: 0 10px 30px -12px rgba(0, 0, 0, .9);
	}

	/* The pinned band carried dead space under the buttons. */
	.fnl-modal-page .compare__plans .top-absolute > .inner {
		padding-top: 14px;
		padding-bottom: 14px;
	}
}

/* Anchor jumps and scrollIntoView to a ROW or CATEGORY must land below the
   pinned header, or the thing you jumped to sits behind it — that is what made
   rows look permanently missing rather than merely scrolled past.

   #comparison is deliberately NOT in this list. The header lives inside that
   section and pins itself, so a margin there only opened a dead gap beneath the
   header on arrival (386px at 375px wide). */
.fnl-modal-page .compare__plans .bottom__part > .subtitle,
.fnl-modal-page .compare__plans .bottom__part > .list > .elem {
	scroll-margin-top: calc(var(--cmp-head-h) + 12px);
}

/* The featured card renders LAST on mobile now, and its "Most Popular" badge is
   absolutely positioned at top:-13px — inside the 14px single-column gap that
   left only 2px of clearance over the card above. Give it real room. */
@media (max-width: 991px) {
	.fnl-plan--featured {
		margin-top: 14px;
	}
}

/* ── VAL-138: the category bands read as floating dark rectangles ────────────
   They were painted #050E0A — DARKER than the page's #091811 — so each one sat
   on the table as a distinct block, 104px tall with its label alone in the
   left corner and a wide empty area to the right. Inset, while the header band
   above them runs full-bleed, which made the mismatch obvious.

   They still need an opaque background (they pin under the header and must
   occlude the rows passing behind them), so the fix is to paint them in the
   PAGE colour: invisible at rest, fully functional when pinned. A hairline
   rule carries the section break instead of a filled block. */
.fnl-modal-page .compare__plans .bottom__part > .subtitle {
	background-color: #091811;
	border-top: 1px solid rgba(255, 255, 255, .07);
	padding-top: 34px;
	padding-bottom: 14px;
	height: auto;
	min-height: 0;
}

.fnl-modal-page .compare__plans .bottom__part > .subtitle:first-child {
	border-top: 0;
	padding-top: 20px;
}

/* The header had exactly the same problem and gets exactly the same treatment:
   it was a #050E0A slab sitting on a #091811 page, so the whole top of the
   table read as a black box with a hard horizontal seam under it. Painting it
   in the page colour makes the section one continuous surface; the full-bleed
   hairline on the same pseudo-element carries the separation and keeps working
   when the header is pinned (which is the only moment a boundary is needed). */
.fnl-modal-page .compare__plans .top-absolute > .inner::after {
	background-color: #091811;
	border-bottom: 1px solid rgba(255, 255, 255, .07);
}

/* style.css draws a 600px fading rule across the plan columns 30px below the
   header. It lands on the same baseline as the hairline above, so the two
   stack into a doubled seam — the "two-tone edge" that made the block obvious.
   The full-bleed hairline is the better of the pair; drop the decorative one. */
.fnl-modal-page .compare__plans .top-absolute > .inner .plans::before {
	display: none;
}

/* At 767px and below there is a SECOND slab: style.css:13786 paints .plans
   itself #050E0A. It sits inside the header's horizontal padding, so on a
   phone the pinned header rendered as a black rectangle inset ~16px from each
   edge, floating on the page — the mobile half of the same complaint, and
   invisible if you only check the desktop breakpoint. The full-bleed ::after
   already provides the opaque surface the pinned header needs, so this one is
   pure decoration. Scoped to 991px rather than 767px deliberately: a superset
   of where the slab exists today, so a future breakpoint tweak upstream cannot
   reintroduce it silently. */
@media (max-width: 991px) {
	.fnl-modal-page .compare__plans .top-absolute > .inner .plans {
		background-color: transparent;
	}
}

@media (max-width: 767px) {
	.fnl-modal-page .compare__plans .bottom__part > .subtitle {
		padding-top: 26px;
		padding-bottom: 10px;
	}
}

/* ==========================================================================
   Case-study scroller (.fnl-s4--multi) — the landing/industry variant of the
   funnel case-study panel. The funnels show ONE .fnl-case; here seven ride a
   scroll-snap track so the section works with JS disabled (native swipe/scroll
   still pages through the panels) and the arrows/dots are progressive
   enhancement layered on top by funnel.js.
   ========================================================================== */
.fnl-s4--multi .fnl-sechead__sub {
	margin-top: 14px;
	font-size: 16px;
	line-height: 1.6;
	color: #C9E3D6;
}
.fnl-cases { position: relative; margin-top: 40px; }
.fnl-cases__track {
	display: flex;
	gap: 24px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	-webkit-overflow-scrolling: touch;
	/* scroll-behavior is deliberately NOT set here. As a CSS property it makes
	   even a plain `el.scrollLeft = x` animate, so anywhere the UA suppresses
	   scroll animation (background tab, reduced motion) the scroller would sit
	   frozen. funnel.js asks for smooth per-call instead, and falls back to an
	   instant jump under prefers-reduced-motion. */
	scrollbar-width: none;
	/* bleed the track to the viewport edge on small screens so a snapped panel
	   still sits inside the container gutter */
	padding-bottom: 4px;
}
.fnl-cases__track::-webkit-scrollbar { display: none; }
.fnl-case--slide {
	flex: 0 0 100%;
	margin-top: 0;
	scroll-snap-align: start;
	min-width: 0;
}
.fnl-cases__nav {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 20px;
	margin-top: 28px;
}
.fnl-cases__arrow {
	width: 44px; height: 44px;
	flex: 0 0 44px;
	border-radius: 50%;
	border: var(--fnl-border);
	background: #0A1812;
	cursor: pointer;
	position: relative;
	transition: border-color .2s ease, background .2s ease;
}
.fnl-cases__arrow::before {
	content: '';
	position: absolute; top: 50%; left: 50%;
	width: 9px; height: 9px;
	border-right: 2px solid #C9E3D6;
	border-bottom: 2px solid #C9E3D6;
}
.fnl-cases__arrow--next::before { transform: translate(-60%, -50%) rotate(-45deg); }
.fnl-cases__arrow--prev::before { transform: translate(-40%, -50%) rotate(135deg); }
.fnl-cases__arrow:hover { border-color: rgba(0, 255, 138, .4); background: #0D2018; }
.fnl-cases__arrow[disabled] { opacity: .35; cursor: default; }
.fnl-cases__arrow[disabled]:hover { border-color: var(--fnl-border-c, rgba(255,255,255,.08)); background: #0A1812; }
.fnl-cases__dots { display: flex; align-items: center; gap: 8px; }
.fnl-cases__dot {
	width: 8px; height: 8px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: rgba(255, 255, 255, .18);
	cursor: pointer;
	transition: background .2s ease, width .2s ease;
}
.fnl-cases__dot.is-on { background: #00FF8A; width: 22px; border-radius: 4px; }

@media (max-width: 991px) {
	.fnl-case--slide { padding: 32px; min-height: 0; }
	.fnl-cases__track { gap: 16px; }
}
@media (max-width: 767px) {
	.fnl-case--slide { padding: 24px; }
	.fnl-cases__nav { gap: 14px; margin-top: 22px; }
}

/* ==========================================================================
   Testimonial wall (.fnl-tw) — modelled on the blaze.ai "Built for every
   business that deserves great marketing." section, minus its industry
   selector. One drifting row of fixed-width cards, each carrying avatar,
   name, title, star rating, quote and sector label.

   Spacing is a trailing margin per card, NOT `gap` on the track: with `gap`
   the single space between the two duplicated halves belongs to neither, so a
   -50% translate slips by half a gap each loop and the seam shows.
   ========================================================================== */
.fnl-tw { overflow: hidden; }
.fnl-tw__marquee {
	margin-top: 44px;
	overflow: hidden;
	-webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
	mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}
/* Row 2 runs the other way, matching the blaze.ai reference: two bands drifting
   in opposite directions reads as a wall rather than a single conveyor. */
.fnl-tw__marquee--2 { margin-top: 20px; }
.fnl-tw__marquee--2 .fnl-tw__track { animation-direction: reverse; animation-duration: 104s; }
.fnl-tw__track {
	display: flex;
	width: max-content;
	animation: fnl-tw-drift 90s linear infinite;
}
/* Deliberately NOT paused on hover: the wall should keep moving while you read
   across it. Focus still pauses, so keyboard users can reach a card's links. */
.fnl-tw:focus-within .fnl-tw__track { animation-play-state: paused; }
@keyframes fnl-tw-drift {
	from { transform: translate3d(0, 0, 0); }
	to   { transform: translate3d(-50%, 0, 0); }
}

.fnl-tw__card {
	flex: 0 0 440px;
	width: 440px;
	margin: 0 24px 0 0;
	padding: 28px;
	border-radius: 20px;
	background: #0A1812;
	border: var(--fnl-border);
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.fnl-tw__head { display: flex; align-items: center; gap: 14px; }
.fnl-tw__avatar {
	flex: 0 0 60px;
	width: 60px; height: 60px;
	border-radius: 50%;
	overflow: hidden;
	background: rgba(0, 255, 138, .12);
	display: flex; align-items: center; justify-content: center;
}
.fnl-tw__avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* monogram stands in where a reviewer has no published photo */
.fnl-tw__mono {
	font-size: 22px; font-weight: 600; color: #00FF8A; line-height: 1;
}
.fnl-tw__who { min-width: 0; }
.fnl-tw__name { font-size: 18px; font-weight: 700; color: #fff; margin: 0; }
.fnl-tw__title { font-size: 15px; color: #fff; opacity: .5; margin: 2px 0 0; }
.fnl-tw__stars { display: flex; gap: 3px; color: #00FF8A; }
.fnl-tw__star { width: 16px; height: 16px; display: block; color: rgba(255, 255, 255, .18); }
.fnl-tw__star.is-on { color: #00FF8A; }
.fnl-tw__star svg { width: 16px; height: 16px; display: block; }
/* fractional star: clip the lit copy to the fraction, leaving the dim one behind */
.fnl-tw__star.is-half { position: relative; }
.fnl-tw__star.is-half::before {
	content: ''; position: absolute; inset: 0;
	width: calc(var(--f) * 100%);
	overflow: hidden;
	background: currentColor;
	color: #00FF8A;
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M7.593.255a.44.44 0 0 1 .814 0l1.588 4.889a.44.44 0 0 0 .418.303h5.141a.428.428 0 0 1 .252.774l-4.159 3.022a.428.428 0 0 0-.155.478l1.588 4.889a.428.428 0 0 1-.659.478l-4.159-3.022a.428.428 0 0 0-.503 0l-4.159 3.022a.428.428 0 0 1-.659-.478l1.589-4.889a.428.428 0 0 0-.156-.478L.216 6.221a.428.428 0 0 1 .251-.774h5.142a.44.44 0 0 0 .418-.303z'/%3E%3C/svg%3E") 0 0 / 16px 16px no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M7.593.255a.44.44 0 0 1 .814 0l1.588 4.889a.44.44 0 0 0 .418.303h5.141a.428.428 0 0 1 .252.774l-4.159 3.022a.428.428 0 0 0-.155.478l1.588 4.889a.428.428 0 0 1-.659.478l-4.159-3.022a.428.428 0 0 0-.503 0l-4.159 3.022a.428.428 0 0 1-.659-.478l1.589-4.889a.428.428 0 0 0-.156-.478L.216 6.221a.428.428 0 0 1 .251-.774h5.142a.44.44 0 0 0 .418-.303z'/%3E%3C/svg%3E") 0 0 / 16px 16px no-repeat;
}
.fnl-tw__quote { margin: 0; flex: 1 1 auto; }
.fnl-tw__pull { font-size: 17px; line-height: 25px; color: #fff; font-weight: 600; margin: 0 0 10px; }
/* The body was previously not rendered at all. It sets the card height -- no
   fixed height or clamp here, or long quotes get clipped mid-sentence. */
.fnl-tw__quote p { font-size: 15px; line-height: 23px; color: #C9E3D6; margin: 0; }
.fnl-tw__sector {
	font-size: 14px;
	color: #83B59F;
	padding-top: 14px;
	border-top: 1px solid rgba(255, 255, 255, .08);
}

@media (max-width: 767px) {
	.fnl-tw__card { flex-basis: 300px; width: 300px; margin-right: 16px; padding: 22px; }
	.fnl-tw__avatar { flex-basis: 48px; width: 48px; height: 48px; }
	.fnl-tw__name { font-size: 16px; }
	.fnl-tw__title { font-size: 14px; }
}
@media (prefers-reduced-motion: reduce) {
	.fnl-tw__track { animation: none; }
	.fnl-tw__marquee { overflow-x: auto; }
}

/* ==========================================================================
   .fnl-s1 hosted inside the original Getting Started shell.

   The brief kept that section's background. Its light-rays + ascii-dots
   canvases are found by JS via `.how__works .ascii-dots` / `.how__works
   .how-fx` and styled by 106 descendant rules, so the wrapper must keep the
   .how__works class verbatim -- the modifier only neutralises the layout
   properties that would fight the imported section. The old stage-pinning
   script early-returns here because .outer__how / .float__section do not
   exist in .fnl-s1.
   ========================================================================== */
/* I originally zeroed BOTH paddings here to avoid doubling up with
   `.how__works .container { padding-top: 100px }`. That over-corrected: the pill
   ended up 28px from the section's top edge, and the pinned stage had no room to
   finish before .how__works's `overflow: clip` sliced the bottom of the diagram.
   The host now carries the vertical rhythm itself and the inner container stays
   zeroed, so there is room top and bottom without double spacing. */
.how__works--fnl { padding-top: 88px; padding-bottom: 96px; }
.how__works--fnl > .fnl-s1 .container { padding-top: 0; }

@media (max-width: 767px) {
	.how__works--fnl { padding-top: 52px; padding-bottom: 56px; }
}

/* ==========================================================================
   Examples scroller — funnel tiles inside the site's .slider-shorts.

   On a funnel the tiles sit in .fnl-s3__grid, which is what gives them their
   width (grid track) — .fnl-tile itself is only `width:100%`. Dropped into a
   slick track the parent has no intrinsic width, so with variableWidth the
   slides collapsed to ~2px. The site's own slides get their width from .inn,
   which these tiles do not use, so the width is set here explicitly.
   ========================================================================== */
.fnl-examples .slider-shorts .elem { width: auto; margin: 0 12px; }
.fnl-examples .slider-shorts .fnl-tile { width: 260px; }
.fnl-examples .slider-shorts .elem.is-wide .fnl-tile { width: 320px; }

@media (max-width: 767px) {
	.fnl-examples .slider-shorts .elem { margin: 0 8px; }
	.fnl-examples .slider-shorts .fnl-tile { width: 200px; }
	.fnl-examples .slider-shorts .elem.is-wide .fnl-tile { width: 250px; }
}


/* ==========================================================================
   #2 Logo rail — breathing room. The marks were flush to the 40px clip box,
   so tall wordmarks (NINJATRADER, FXIFY) were shaved top and bottom. Inset the
   mark inside the row and space the items apart.
   ========================================================================== */
.fnl-logorail li {
	padding: 0 26px;
	box-sizing: content-box;
}
.fnl-logorail li img {
	max-height: 28px;          /* < the 40px row, so nothing can clip */
	width: auto;
	object-fit: contain;
}

/* ==========================================================================
   #12 Pricing panels — equal height, aligned trailing CTA. Feature lists differ
   in length, which left the bottom "Compare plans" buttons at three different
   heights. Cards stretch, and the trailing CTA is pushed to the card floor.
   ========================================================================== */
.fnl-s11 .fnl-plans { align-items: stretch; }
.fnl-s11 .fnl-plan { height: 100%; }
.fnl-s11 .fnl-plan__compare,
.fnl-s11 .fnl-plan > a:last-child { margin-top: auto; }


/* #12 Pricing panels -- feature lists differ in length, which left the three
   trailing "Compare plans" buttons at three different heights. Stretch the
   cards and push the trailing CTA to the card floor. */
.fnl-s11 .fnl-plans > .fnl-plan { height: 100%; align-self: stretch; }
.fnl-s11 .fnl-plan .fnl-plan__content { display: flex; flex-direction: column; flex: 1 1 auto; }
.fnl-s11 .fnl-plan .fnl-plan__content > a:last-child { margin-top: auto; }

/* ==========================================================================
   #8 Rolling-digit ticker. Each digit is a 0-9 strip clipped to one glyph and
   translated into place, so a change animates as movement rather than the
   string being swapped. Tabular figures keep the columns from jittering.
   ========================================================================== */
.fnl-odo { display: inline-flex; align-items: baseline; font-variant-numeric: tabular-nums; }
.fnl-odo__sep { display: inline-block; }
.fnl-odo__col { display: inline-block; overflow: hidden; height: 1em; line-height: 1; vertical-align: baseline; }
.fnl-odo__strip { display: block; will-change: transform; transition: transform .55s cubic-bezier(.22,.61,.36,1); }
.fnl-odo__strip > span { display: block; height: 1em; line-height: 1; }
@media (prefers-reduced-motion: reduce) {
	.fnl-odo__strip { transition: none; }
}

/* ==========================================================================
   Examples section — header + slide alignment.

   The pill inherits the section's left-aligned flow while the heading and sub
   are centred, so it sat hard left of a centred block. The slides are mixed
   aspect ratios (9:16 video, 4:5 graphic, tall email), so a default stretch
   left them ragged top and bottom; they now centre on a shared axis. The
   track also began at the viewport edge, clipping the first tile.
   ========================================================================== */
.fnl-examples .outer__shorts { text-align: center; }
.fnl-examples .outer__shorts > .fnl-pill { display: inline-flex; margin: 0 auto 18px; }
.fnl-examples .outer__shorts > h2,
.fnl-examples .outer__shorts > p { margin-left: auto; margin-right: auto; }

.fnl-examples .slider-shorts .slick-track { display: flex; align-items: center; }
.fnl-examples .slider-shorts .slick-slide { display: flex; align-items: center; height: auto; float: none; }
/* one shared height so mixed ratios line up instead of stepping */
.fnl-examples .slider-shorts .fnl-tile { height: 462px; aspect-ratio: auto; }
.fnl-examples .slider-shorts .elem.is-wide .fnl-tile { height: 462px; }
/* first tile clears the viewport edge and lines up with the heading gutter */
.fnl-examples .slider-shorts .slick-list { padding-left: 24px; }

@media (max-width: 767px) {
	.fnl-examples .slider-shorts .fnl-tile,
	.fnl-examples .slider-shorts .elem.is-wide .fnl-tile { height: 356px; }
	.fnl-examples .slider-shorts .slick-list { padding-left: 16px; }
}

/* ==========================================================================
   Pill normalisation. Pills injected into native sections inherited whatever
   flow surrounded the heading, so seven of them rendered with ZERO gap to the
   title while the funnel-native ones had 18px. One consistent treatment: the
   pill is its own block-level row with a fixed gap beneath it, and it inherits
   the section's text alignment so centred sections centre it.
   ========================================================================== */
.fnl-pill {
	display: inline-flex;
	align-items: center;
	/* justify-content MUST be restated: this rule comes after the base .fnl-pill
	   and would otherwise drop the base's centring, leaving the label hard
	   against the pill's left padding. */
	justify-content: center;
	text-align: center;
	margin: 0 0 18px;
	vertical-align: middle;
	/* A pill inside a flex/grid column with align-items:stretch (which several
	   native sections use) gets stretched to the full container width -- the
	   PROCESS pill on /video rendered as a full-width bar. These pin it to its
	   content regardless of the parent's alignment. */
	align-self: center;
	justify-self: center;
	width: fit-content;
	max-width: 100%;
	flex: 0 0 auto;
}
/* a pill sitting directly before a heading always gets its own line */
.fnl-pill + h1, .fnl-pill + h2, .fnl-pill + h3 { margin-top: 0; }
.fnl-pill:not(:only-child) { flex: 0 0 auto; }

/* Pills in native sections take their alignment from the section itself rather
   than being forced to centre: forcing it put the FAQ pill 612px from a
   left-aligned heading, and forcing left put Recent Campaigns 554px from a
   centred one. inline-flex is inline-level, so `text-align` on the section
   positions it exactly like the heading beneath it. */
.ticker__tags > .fnl-pill,
.brain__wrapper > .fnl-pill,
.faq__wrapper > .fnl-pill,
.integrations__wrapper > .fnl-pill,
.matrix_wrapper > .fnl-pill,
.workflows__wrapper > .fnl-pill,
.portfolio__wrapper .fnl-pill,
.workflows__wrapper .fnl-pill,
.shorts-portfolio .outer__shorts > .fnl-pill {
	display: inline-flex;
	margin-left: 0;
	margin-right: 0;
}
/* the shorts header centres its heading and sub, so the pill follows */
.shorts-portfolio .outer__shorts { text-align: center; }
.shorts-portfolio .outer__shorts > h2,
.shorts-portfolio .outer__shorts > p { margin-left: auto; margin-right: auto; }

/* ==========================================================================
   Section rhythm. .fnl-tw carried no vertical padding at all, so its pill sat
   flush against the section's top edge -- and because the testimonial band has
   a different background, that edge reads as a hard seam with the section
   above it. The demo section likewise ended at its video card with nothing
   beneath. Both now breathe.
   ========================================================================== */
.fnl-tw { padding-top: 96px; padding-bottom: 96px; }
.markets__dead.fnl-demo-section { padding-bottom: 72px; }

@media (max-width: 767px) {
	.fnl-tw { padding-top: 56px; padding-bottom: 56px; }
	.markets__dead.fnl-demo-section { padding-bottom: 44px; }
}

/* ==========================================================================
   Recent Campaigns — the funnel hero player standing in for the phone mockup.

   The mockup was an absolutely-centred <img> inside .portfolio--box, sitting
   above the .phone__rows collage. Dropping .fnl-hero__media in its place put a
   full-width, normal-flow block at the TOP of the box instead: the player
   pinned to T0 while the collage ran 1170px beneath it, so the pill, the client
   logo and the three islands scattered across unrelated background tiles.

   It now occupies exactly the footprint the mockup had -- centred both axes,
   above the collage -- so the islands and chrome anchor to the player again.
   ========================================================================== */
.portfolio--box .fnl-hero__media{
	position: absolute;
	top: 50%; left: 50%;
	transform: translate(-50%, -50%);
	width: auto;
	display: block;
	z-index: 5;
	pointer-events: auto;
}
.portfolio--box .fnl-hero-player{ margin: 0 auto; }
/* the metric bar is the funnel's mobile-only strip; the collage has no room */
.portfolio--box .fnl-metricbar{ display: none !important; }

@media (max-width: 767px){
	.portfolio--box .fnl-hero__media{ width: 78%; }
	.portfolio--box .fnl-hero-player{ width: 100%; }
}

/* A pill dropped into a flex-ROW header (.top on several native sections) sits
   beside the heading instead of above it -- the FAQ pill on /video landed 612px
   from its own h2. Stack those headers and align the pill to whichever edge the
   heading uses, so it reads as a label above the title in both cases. */
.top:has(> .fnl-pill){ flex-direction: column; align-items: flex-start; }
.top:has(> .fnl-pill) > h1,
.top:has(> .fnl-pill) > h2,
.top:has(> .fnl-pill) > h3{ width: 100%; }
/* centred variants keep the pill on the same axis as the heading */
.outer__shorts:has(> .fnl-pill), .fnl-sechead:has(> .fnl-pill){ align-items: center; }

/* These two sections centre their HEADING (via text-align on the h2, or auto
   margins) while the wrapper stays text-align:start -- so an inline pill fell to
   the left edge, ~600px off its own title. Centre the pill to match. */
.ticker__tags > .fnl-pill,
.outer__why > .fnl-pill{
	display: flex;
	align-items: center;
	justify-content: center;
	width: fit-content;
	margin-left: auto;
	margin-right: auto;
}

/* Recent Campaigns header: .outer__portfolio is text-align:start while its h2
   is text-align:center across the full container width, so the inline pill fell
   to the left edge, 554px off its own title. Same shape as .ticker__tags and
   .outer__why. */
.outer__portfolio > .fnl-pill{
	display: flex;
	align-items: center;
	justify-content: center;
	width: fit-content;
	margin-left: auto;
	margin-right: auto;
}

/* Metric islands must read IN FRONT of the clip, not behind it. Inside the
   collage the player creates its own stacking context, so the islands -- which
   are siblings of it, not children -- were painted underneath. */
.portfolio--box .fnl-islands{ z-index: 7; }
.portfolio--box .fnl-island{ position: absolute; z-index: 7; }
.portfolio--box .fnl-hero-player{ z-index: 6; }

/* The collage layer (.phone__rows, position:absolute) paints ABOVE the hero
   media, so the metric islands were covered by background campaign tiles --
   a hit-test on an island returned .tile--dynamic. Put the collage behind and
   lift the player, its chrome and the islands clear of it. */
.portfolio--box .phone__rows{ z-index: 1; }
.portfolio--box .fnl-hero__media{ z-index: 12; }
.portfolio--box .fnl-islands,
.portfolio--box .fnl-island{ z-index: 14; }
.portfolio--box .fnl-hero-player{ z-index: 13; }
.portfolio--box .fnl-hero-chrome,
.portfolio--box .fnl-hero-sound,
.portfolio--box .fnl-hero-play,
.portfolio--box .fnl-hero-progress{ z-index: 15; }


/* #5 The industries -> workflows junction showed a hard black band: the
   industries section is transparent (so it renders the body colour) while the
   workflows section paints a lighter background image, and industries also
   carried a border-bottom -- the literal line in the screenshot. Drop the
   border at that junction and let the two sections meet without a step. */
.ticker__tags{ border-bottom: 0 !important; }
.workflows__wrapper{ border-top: 0 !important; }

/* #7 The FAQ section's heading and copy are left-aligned, so its pill belongs on
   the same edge rather than centred. */
.faq__wrapper > .fnl-pill,
.faq__wrapper .outer__faq > .fnl-pill,
.faq__wrapper .top > .fnl-pill{
	margin-left: 0;
	margin-right: auto;
}

/* ==========================================================================
   Logo rail on the lander and industry pages: flush, not a band.

   On a funnel the rail is deliberately its own strip -- a darker --fnl-rail
   ground (#050E0A) between hairline borders, sitting against the funnel hero.
   Dropped onto the site pages that same treatment reads as a seam: the rail is
   darker than the page ground (#091811), its border draws a visible line, and
   the 28px below it shows page colour again, so the eye sees three bands.

   The rail keeps its layout and marquee; only the banding comes off. Scoped by
   an explicit modifier on the 14 non-funnel pages rather than a :has() guess --
   the homepage now carries .fnl-hero* classes too (the campaign player), so
   selector-sniffing the funnels is not reliable.
   ========================================================================== */
.fnl-logos--flush {
	background: transparent;
	border-top: 0;
	border-bottom: 0;
}
