/*
Theme Name: Studio Simpatico
Theme URI: http://www.studiosimpati.co/
Description: This custom WordPress theme was designed and developed with love by Studio Simpatico.
Author: Studio Simpatico
Author URI: http://www.studiosimpati.co/
Version: 1.0.0
*/

/***************************************************************************************************************************************************************************************/
/* HTML5 BOILERPLATE MINIFIED */
/***************************************************************************************************************************************************************************************/

*{box-sizing:border-box;}article{display:block}aside{display:block}details{display:block}figcaption{display:block}figure{display:block;margin:0}footer{display:block}header{display:block}hgroup{display:block}nav{display:block}section{display:block}audio{display:inline;}canvas{display:inline;}video{display:inline;}audio:not([controls]){display:none}[hidden]{display:none}html{color:#222;font-family:sans-serif;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}button{-webkit-appearance:button;color:#222;cursor:pointer;font-family:sans-serif;font-size:100%;line-height:normal;margin:0;overflow:visible;vertical-align:middle}input{color:#222;font-family:sans-serif;font-size:100%;line-height:normal;margin:0;vertical-align:middle}select{color:#222;font-family:sans-serif;font-size:100%;margin:0;vertical-align:middle}textarea{color:#222;font-family:sans-serif;font-size:100%;margin:0;overflow:auto;resize:vertical;vertical-align:top}body{font-size:1em;line-height:1.4;margin:0}::-moz-selection{background:#333;color:#fff;text-shadow:none}::selection{background:#333;color:#fff;text-shadow:none}a{color:#00e}a:hover{color:#06e;outline:0}a:active{outline:0}abbr[title]{border-bottom:1px dotted}b{font-weight:700}strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{border:0;border-top:1px solid #ccc;display:block;height:1px;margin:1em 0;padding:0}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:700}pre{font-family:monospace, serif;_font-family:'courier new', monospace;font-size:1em;white-space:pre-wrap;word-wrap:break-word}code{font-family:monospace, serif;_font-family:'courier new', monospace;font-size:1em}kbd{font-family:monospace, serif;_font-family:'courier new', monospace;font-size:1em}samp{font-family:monospace, serif;_font-family:'courier new', monospace;font-size:1em}q{quotes:none}q:before{content:none}q:after{content:none}small{font-size:85%}sub{bottom:-.25em;font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{font-size:75%;line-height:0;position:relative;top:-.5em;vertical-align:baseline}ul{margin:1em 0;padding:0 0 0 40px}ol{margin:1em 0;padding:0 0 0 40px}dd{margin:0 0 0 40px}nav ul{list-style:none;list-style-image:none;margin:0;padding:0}nav ol{list-style:none;list-style-image:none;margin:0;padding:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle}svg:not(:root){overflow:hidden}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;margin-left:-7px;padding:0;white-space:normal}input[type="button"]{-webkit-appearance:button;cursor:pointer;overflow:visible}input[type="reset"]{-webkit-appearance:button;cursor:pointer;overflow:visible}input[type="submit"]{-webkit-appearance:button;cursor:pointer;overflow:visible}button[disabled]{cursor:default}input[disabled]{cursor:default}input[type="checkbox"]{box-sizing:border-box;height:13px;padding:0;width:13px}input[type="radio"]{box-sizing:border-box;height:13px;padding:0;width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner{border:0;padding:0}input::-moz-focus-inner{border:0;padding:0}input:invalid{background-color:#f0dddd}textarea:invalid{background-color:#f0dddd}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{background:#ccc;color:#000;margin:.2em 0;padding:.2em 0}

/***************************************************************************************************************************************************************************************/
/* FONTS */
/***************************************************************************************************************************************************************************************/

@font-face {
	font-display: swap;
	font-family: 'KH Teka';
	font-style: normal;
	font-weight: 300;
	src: local('KH Teka Light'), local('KHTeka-Light'),
		url('assets/fonts/KHTeka-Light.woff2') format('woff2'),
		url('assets/fonts/KHTeka-Light.woff') format('woff'),
		url('assets/fonts/KHTeka-Light.otf') format('opentype');
}

@font-face {
	font-display: swap;
	font-family: 'KH Teka';
	font-style: normal;
	font-weight: 400;
	src: local('KH Teka'), local('KHTeka-Regular'),
		url('assets/fonts/KHTeka-Regular.woff2') format('woff2'),
		url('assets/fonts/KHTeka-Regular.woff') format('woff'),
		url('assets/fonts/KHTeka-Regular.otf') format('opentype');
}

@font-face {
	font-display: swap;
	font-family: 'KH Teka';
	font-style: normal;
	font-weight: 500;
	src: local('KH Teka Medium'), local('KHTeka-Medium'),
		url('assets/fonts/KHTeka-Medium.woff2') format('woff2'),
		url('assets/fonts/KHTeka-Medium.woff') format('woff'),
		url('assets/fonts/KHTeka-Medium.otf') format('opentype');
}

@font-face {
	font-display: swap;
	font-family: 'KH Teka';
	font-style: normal;
	font-weight: 700;
	src: local('KH Teka Bold'), local('KHTeka-Bold'),
		url('assets/fonts/KHTeka-Bold.woff2') format('woff2'),
		url('assets/fonts/KHTeka-Bold.woff') format('woff'),
		url('assets/fonts/KHTeka-Bold.otf') format('opentype');
}

/***************************************************************************************************************************************************************************************/
/* BODY STYLES */
/***************************************************************************************************************************************************************************************/

:root {
	/* Colors */
	--orange: #fb5a08;
	--orange-on-parchment: #f05608; /* darker orange for AA contrast on parchment */
	--black: #242b2d;
	--electric-lavender: #7155de;
	--digital-blue: #0042e4;
	--teal: #27e9d4;
	--lavender: #e3e1f4;
	--alabaster-gray: #c4d1d5;
	--parchment: #f3f2ef;
	--off-white: #fafafa;
	--white: #fff;
	--error-color: #c00;

	/* Grays */
	--gray-light: #d4d4d2;
	--gray: #c1c1c1;
	--gray-dark: #6f7373;

	/* Hover states */
	--black-hover: #4d5354;
	--white-hover: #e9eaea;
	--digital-blue-hover: #0e399b;
	--alabaster-gray-hover: #d7dedf;

	/* Gradients */
	--orange-gradient: linear-gradient(to bottom, #ff803e 0%, var(--orange) 100%);
	--teal-gradient: linear-gradient(to bottom, #a7b4c7 0%, #2db0a2 100%);
	--blue-gradient: linear-gradient(-19deg, rgba(236, 185, 222, 0) 20.83%, rgba(236, 185, 222, 0.4) 84.82%), linear-gradient(90deg, var(--digital-blue), var(--digital-blue));

	/* Same 4-layer shape as --euphoric-blue so it reuses the euphoria-drift
	   keyframes; the linear base stays still on its 100% layer. */
	--teal-glow:
		radial-gradient(50% 60% at 75% 20%, color-mix(in srgb, var(--teal) 75%, transparent) 0%, transparent 60%),
		radial-gradient(55% 65% at 18% 55%, color-mix(in srgb, var(--electric-lavender) 32%, transparent) 0%, transparent 60%),
		radial-gradient(50% 55% at 55% 95%, color-mix(in srgb, #20857a 65%, transparent) 0%, transparent 58%),
		linear-gradient(to bottom, #a7b4c7 0%, #2db0a2 100%);

	/* Kept dark enough for white text. The blobs ride oversized background-sizes
	   and drift via the euphoria-drift keyframes (motion-gated); the linear base
	   sits still on its 100% layer. */
	--euphoric-blue:
		radial-gradient(48% 58% at 16% 22%, color-mix(in srgb, var(--electric-lavender) 82%, transparent) 0%, transparent 62%),
		radial-gradient(52% 60% at 86% 40%, color-mix(in srgb, var(--digital-blue-hover) 78%, transparent) 0%, transparent 58%),
		radial-gradient(50% 54% at 64% 92%, rgba(236, 185, 222, 0.3) 0%, transparent 58%),
		linear-gradient(155deg, var(--digital-blue) 22%, color-mix(in srgb, var(--digital-blue) 50%, var(--electric-lavender)) 100%);

	/* One drift cycle for every euphoria-drift surface. Lower = livelier; the
	   keyframes hold 5 legs, so a leg (a blob's turn) is this over five. */
	--euphoria-drift-duration: 16s;

	/* Shadows / overlays */
	--overlay-dim: rgba(0, 0, 0, 0.25);
	--hero-overlay: rgba(0, 0, 0, 0.2);
	--shadow-subtle: 0 4px 20px rgba(0, 0, 0, 0.06);
	--shadow-strong: -15px 15px 40px rgba(0, 0, 0, 0.15);
	--shadow-card: drop-shadow(24px 24px 30px rgba(0, 0, 0, 0.03));
	--shadow-dropdown: 0 16px 40px rgba(36, 43, 45, 0.12);
	--shadow-sticky: 0 24px 20px rgba(0, 0, 0, 0.08);
	--text-shadow-dim: 0 0 30px rgba(0, 0, 0, 0.4);

	/* Locals not in the brand palette (figma-only one-offs) */
	--carousel-purple: #2d5fe6;
	--carousel-purple-hover: #2556d9;
	--meta-gray: #666b6c;
	--electric-lavender-light: #8a71ef;
	--electric-lavender-lighter: #a28aff;
	--track-gray: #e3e3e3;

	/* Fonts */
	--body-font: 'acumin-pro-wide', 'Acumin Pro Wide', 'acumin-pro-wide-black', Arial, Helvetica, sans-serif;
	--heading-font: 'KH Teka', Arial, Helvetica, sans-serif;

	/* Container */
	--container-width: 90vw;
	--container-max-width: 2000px;
	--container-outer-padding: 40px;
	--container-outer-margin: calc((100vw - var(--container-width)) / 2);
	--viewport-edge: calc((var(--container-outer-margin) + var(--container-outer-padding)) * -1);
	--container-breakout-full: min(0px, 64px - var(--container-outer-margin) - var(--container-outer-padding));
	--container-breakout: max(-42px, var(--container-breakout-full));
	--one-column-width: ((100vw - (2 * (var(--container-outer-margin) + var(--container-outer-padding)))) - (11 * var(--gap))) / 12;

	/* Grid */
	--gap: 40px;
	--grid: repeat(12, minmax(0,1fr));

	/* Header */
	--header-height: 80px;
	/* How much overlaid header the first hero must reserve. 0 unless the header
	   leaves the flow — see the body:has() rule beside #header. Not a length of
	   0: calc() can't add a unitless number to a length. */
	--header-clearance: 0px;

	/* Spacing */
	--text-spacing-xxsmall: 8px;
	--text-spacing-xsmall: 16px;
	--text-spacing-small: 24px;
	--text-spacing-medium: 32px;
	--text-spacing-large: 40px;
	--text-spacing-xlarge: 48px;
	--text-spacing-xxlarge: 56px;
	--module-spacing-small: 64px;
	--module-spacing-medium: 80px;
	--module-spacing-large: 120px;
	--module-spacing-xlarge: 160px;
	--module-spacing-xxlarge: 240px;

	interpolate-size: allow-keywords;
}

/* Each blob travels a closed orbit — differently shaped, differently phased, so
   they never turn together — while swelling out of phase with its own travel. The
   swell is what reads as glow; position alone just slides the layer.
   linear is set per-keyframe (overriding the call sites' ease-in-out): easing to a
   stop at every vertex is what made the old drift lurch. The trailing layer is the
   solid base, held still at 0 0 / 100%. Sizes at 0% match the background-size each
   surface declares, so the resting (reduced-motion) frame is unchanged. */
@keyframes euphoria-drift {
	0% {
		animation-timing-function: linear;
		background-position: 50% 0%, 100% 50%, 20% 80%, 0 0;
		background-size: 200% 200%, 220% 220%, 240% 240%, 100% 100%;
	}
	20% {
		animation-timing-function: linear;
		background-position: 98% 35%, 65% 98%, 0% 30%, 0 0;
		background-size: 222% 222%, 204% 204%, 258% 258%, 100% 100%;
	}
	40% {
		animation-timing-function: linear;
		background-position: 79% 90%, 10% 79%, 45% 0%, 0 0;
		background-size: 204% 204%, 234% 234%, 244% 244%, 100% 100%;
	}
	60% {
		animation-timing-function: linear;
		background-position: 21% 90%, 10% 21%, 95% 25%, 0 0;
		background-size: 226% 226%, 210% 210%, 262% 262%, 100% 100%;
	}
	80% {
		animation-timing-function: linear;
		background-position: 2% 35%, 65% 2%, 80% 75%, 0 0;
		background-size: 208% 208%, 232% 232%, 248% 248%, 100% 100%;
	}
	100% {
		background-position: 50% 0%, 100% 50%, 20% 80%, 0 0;
		background-size: 200% 200%, 220% 220%, 240% 240%, 100% 100%;
	}
}

@keyframes hero-glow-breathe {
	0%,
	100% {
		opacity: 0.75;
		transform: scale(0.96);
	}

	50% {
		opacity: 1;
		transform: scale(1);
	}
}

/* Always reserve the scrollbar gutter so the layout width is constant — no
   jump between short and scrolling pages. overflow-y: scroll is the fallback
   for browsers without scrollbar-gutter. */
/* Anchor jumps clear the fixed header. scroll-padding on the scroll container (not
   a per-element scroll-margin) covers every target type — section, .svp-step, the
   stacked props — and it must sit outside prefers-reduced-motion: the offset is
   layout, not motion, so reduced-motion users need it too. */
html {
	font-size: 100%;
	overflow-y: scroll;
	scroll-padding-top: calc(var(--header-height) + var(--text-spacing-large));
	scrollbar-gutter: stable;
}

/* A pinned sticky-menu parks under the header — an anchor must clear both. */
html:has(.sticky-menu) {
	scroll-padding-top: calc(var(--header-height) + 56px + var(--text-spacing-large));
}

body {
	background: var(--off-white);
	color: var(--black);
	font: 1rem var(--body-font);
	-moz-osx-font-smoothing: grayscale;
	/* Inherited — a long URL/token in a heading, card title, or WYSIWYG body would
	   otherwise overflow its column and scroll the page at 320px (WCAG 1.4.10). */
	overflow-wrap: break-word;
	-webkit-font-smoothing: antialiased;
}

.svg-inline--fa {
	display: inline-block;
	font-size: inherit;
	height: 1em;
	overflow: visible;
	vertical-align: -0.125em;
}

.svg-inline--fa path {
	fill: currentColor;
}

a {
	text-decoration: none;
	transition: all .25s ease;
}

input[type=submit],
button {
	border-radius: 0;
	font-family: inherit;
	transition: all .25s ease;
}

img,
svg,
iframe,
picture {
	max-width: 100%;
}

img,
svg,
picture {
	height: auto;
}

h1,
.heading-1,
h2,
.heading-2,
h3,
.heading-3,
h4,
.heading-4,
h5,
.heading-5,
h6,
.heading-6 {
	font-family: var(--heading-font);
	font-weight: 300;
	margin: 0;
}

/* H1–H5 default to the Light cut; .bold swaps to the heavier Regular cut. */
h1.bold,
.heading-1.bold,
h2.bold,
.heading-2.bold,
h3.bold,
.heading-3.bold,
h4.bold,
.heading-4.bold,
h5.bold,
.heading-5.bold {
	font-weight: 400;
}

/* <strong>/<b> inside a heading maps to the .bold (Regular) cut. */
:is(h1, .heading-1, h2, .heading-2, h3, .heading-3, h4, .heading-4, h5, .heading-5) :is(strong, b) {
	font-weight: 400;
}

h1,
.heading-1 {
	font-size: calc(88rem / 16);
	letter-spacing: -0.6px;
	line-height: calc(96 / 88);
}

/* Inherits the -0.6px tracking from .heading-1. */
.heading-1.large {
	font-size: calc(108rem / 16);
	line-height: calc(96 / 108);
}

/* Lighter, smaller display heading — inherits the -0.6px tracking from .heading-1. */
.heading-1.small {
	font-size: calc(76rem / 16);
	font-weight: 300;
	line-height: calc(84 / 76);
}

h2,
.heading-2 {
	font-size: calc(64rem / 16);
	line-height: calc(70 / 64);
}

/* WYSIWYG (content-styles) headings render one step down the display scale — a
   bare h2 takes .heading-3, h3 takes .heading-4, etc. — so body-copy headings
   stay modest against the page's display headings. Carried through every
   breakpoint below. */
h3,
.heading-3,
.content-styles h2:not([class^="heading-"]) {
	font-size: calc(52rem / 16);
	line-height: calc(56 / 52);
}

h4,
.heading-4,
.content-styles h3:not([class^="heading-"]) {
	font-size: calc(40rem / 16);
	line-height: calc(50 / 40);
}

h5,
.heading-5,
.content-styles h4:not([class^="heading-"]) {
	font-size: calc(32rem / 16);
	line-height: calc(40 / 32);
}

h6,
.heading-6,
.content-styles h5:not([class^="heading-"]) {
	font-size: calc(18rem / 16);
	font-weight: 700;
	letter-spacing: 0.4px;
	line-height: calc(26 / 18);
}

.heading-6.large {
	font-size: calc(22rem / 16);
	font-weight: 500;
	letter-spacing: 0.1px;
	line-height: calc(32 / 22);
}

.heading-6.large.bold {
	font-weight: 700;
}

p,
ul,
ol,
.regular-text,
.regular-text p,
.regular-text ul,
.regular-text ol {
	font-size: calc(16rem / 16);
	font-weight: 300;
	line-height: calc(30 / 16);
}

/* No UA margin on <p> — module spacing comes from gap / adjacent margins.
   Rich-text wrappers restore inter-paragraph spacing via p + p below. */
p {
	margin: 0;
}

/* Reset the UA blockquote margin/padding (boilerplate sets margin: 1em 40px). */
blockquote {
	margin: 0;
	padding: 0;
}

/* Paragraph rhythm scales with the text size: regular body at 12px (between the
   xxsmall/xsmall tokens — no token lands on it), the larger and longform cuts
   open up to xsmall, and small text tightens to xxsmall. */
.content-styles p + p,
.regular-text p + p,
.medium-text p + p {
	margin-top: 12px;
}

.large-text p + p,
.xlarge-text p + p,
.longform-text p + p {
	margin-top: var(--text-spacing-xsmall);
}

.small-text p + p {
	margin-top: var(--text-spacing-xxsmall);
}

/* Inline video / oEmbeds fill the content column at 16:9 (e.g. webinar replays);
   WordPress otherwise leaves the iframe at its native pixel size. */
.content-styles :is(iframe, video) {
	aspect-ratio: 16 / 9;
	display: block;
	height: auto;
	width: 100%;
}

p.xlarge,
ul.xlarge,
ol.xlarge,
.xlarge-text,
.xlarge-text p,
.xlarge-text ul,
.xlarge-text ol {
	font-family: var(--body-font);
	font-size: calc(22rem / 16);
	font-weight: 400;
	line-height: calc(34 / 22);
}

p.xlarge.bold,
.xlarge-text.bold,
.xlarge-text.bold p {
	font-weight: 600;
}

p.large,
ul.large,
ol.large,
.large-text,
.large-text p,
.large-text ul,
.large-text ol {
	font-family: var(--body-font);
	font-size: calc(20rem / 16);
	font-weight: 400;
	line-height: calc(32 / 20);
}

p.large.bold,
.large-text.bold,
.large-text.bold p {
	font-weight: 600;
}

p.medium,
ul.medium,
ol.medium,
.medium-text,
.medium-text p,
.medium-text ul,
.medium-text ol {
	font-family: var(--body-font);
	font-size: calc(16rem / 16);
	font-weight: 300;
	line-height: calc(30 / 16);
}

p.medium.bold,
.medium-text.bold,
.medium-text.bold p {
	font-weight: 600;
}

p.longform,
ul.longform,
ol.longform,
.longform-text,
.longform-text p,
.longform-text ul,
.longform-text ol {
	font-family: var(--body-font);
	font-size: calc(18rem / 16);
	font-weight: 300;
	line-height: calc(34 / 18);
}

p.longform.bold,
.longform-text.bold,
.longform-text.bold p,
.longform a:not(.btn),
.longform-text a:not(.btn) {
	font-weight: 500;
}

/* :not() carries the exemptions: buttons, and the reference marker/back-link,
   which are navigation affordances rather than prose links. Listing them here
   beats out-specifying this (0,2,1) selector from each of their own rules. */
.longform a:not(.btn, .ref-marker-link, .ref-backref),
.longform-text a:not(.btn, .ref-marker-link, .ref-backref) {
	text-decoration: underline;
}

p.small,
ul.small,
ol.small,
.small-text,
.small-text p,
.small-text ul,
.small-text ol {
	font-size: calc(14rem / 16);
	font-weight: 400;
	letter-spacing: 0.2px;
	line-height: calc(24 / 14);
}

p.small.bold,
.small-text.bold,
.small-text.bold p {
	font-weight: 700;
}

p.xsmall,
ul.xsmall,
ol.xsmall,
.xsmall-text,
.xsmall-text p,
.xsmall-text ul,
.xsmall-text ol {
	font-size: calc(12rem / 16);
	font-weight: 400;
	letter-spacing: 0.2px;
	line-height: calc(16 / 12);
}

/* Bold in body copy defaults to the semibold (600) cut. */
b,
strong {
	font-weight: 600;
}

/* Small body is the exception — its bold cut is full bold (700), not semibold, so
   it stays bold when a true Acumin semibold is added to the kit. */
.small-text :is(b, strong),
p.small :is(b, strong) {
	font-weight: 700;
}

.eyebrow,
.large-text .eyebrow,
.medium-text .eyebrow,
.small-text .eyebrow,
.regular-text .eyebrow,
.longform-text .eyebrow {
	display: block;
	/* Pinned so the eyebrow looks identical whether it's a <p> or a heading tag
	   (e.g. an <h1> when it stands in as the semantic page title). */
	font-family: var(--body-font);
	font-size: calc(14rem / 16);
	font-weight: 700;
	letter-spacing: 3px;
	line-height: calc(20 / 14);
	text-transform: uppercase;
}

.eyebrow.small {
	font-size: calc(11rem / 16);
	font-weight: 700;
	letter-spacing: 1.5px;
	line-height: calc(16 / 11);
}

.eyebrow.xsmall {
	font-size: calc(10rem / 16);
	font-weight: 700;
	letter-spacing: 0.8px;
	line-height: calc(13 / 10);
}

.eyebrow.lavender {
	color: var(--lavender);
}

/*** Callout box — dashed-border offer box (eyebrow + body) ***/

.callout {
	align-items: stretch;
	border: 1px dashed color-mix(in srgb, currentColor 40%, transparent);
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xxsmall);
	padding: var(--text-spacing-large) var(--text-spacing-medium) var(--text-spacing-xlarge);
}

.callout > * {
	margin: 0;
}

/* Promo variant — white card with dark copy, the badge straddling its top edge. */
.callout:has(.spin-badge) {
	background: var(--white);
	color: var(--black);
	padding-top: var(--text-spacing-xxlarge);
	position: relative;
}

/*** Try Phreesia badge — circular teal sticker centred on the callout's top edge ***/

/* translateY -58% keeps ~42px overlapping the box, the rest above it (Figma 1624:6233). */
.spin-badge {
	left: 50%;
	position: absolute;
	top: 0;
	transform: translate(-50%, -58%);
	width: 100px;
}

.spin-badge svg {
	display: block;
	height: auto;
	width: 100%;
}

.field-label {
	font-size: calc(10rem / 16);
	font-weight: 700;
	letter-spacing: 0.8px;
	line-height: calc(13 / 10);
	text-transform: uppercase;
}

.big-stat {
	font-family: var(--heading-font);
	font-size: calc(114rem / 16);
	font-weight: 300;
	letter-spacing: -0.6px;
	line-height: calc(96 / 114);
}

.big-stat.large {
	font-size: calc(180rem / 16);
	line-height: calc(140 / 180);
}

/* A hidden copy of the final value sizes the box, so the live counting number
   (overlaid in the same grid cell) never resizes the layout as digits are added.
   tabular-nums keeps the digits from jiggling as they tick. */
.count-up {
	display: inline-grid;
	font-variant-numeric: tabular-nums;
}

.count-up > * {
	grid-area: 1 / 1;
}

.count-up-value {
	text-align: inherit;
}

.count-up-reserve {
	visibility: hidden;
}

.highlight {
	color: var(--orange);
	font-weight: 400;
}

/* On a digital-blue field the brand-orange highlight clashes — paint it white. */
.module.bg-digital-blue .highlight {
	color: var(--white);
}

/* Inset painted region — modules set `background` only. `:has()` auto-isolates
   the host so the z-index:-1 doesn't escape upward. */
:has(> .bg-field) {
	isolation: isolate;
	position: relative;
}

.bg-field {
	inset: 0 var(--text-spacing-small);
	position: absolute;
	z-index: -1;
}

/* Hero paints bg-field as a card — inset on all four sides, not the band's
   side-only gutters. Shared here (not per style) because each hero style loads
   its own CSS file; every hero style that renders a bg-field wants this. */
.module.hero .bg-field {
	inset: var(--text-spacing-small);
}

/* Drop into any positioned, clipping host (e.g. .media); fills and sits behind
   the host's content. */
.bg-gradient {
	height: 100%;
	left: 0;
	overflow: hidden;
	position: absolute;
	top: 0;
	width: 100%;
	z-index: -1;
}

.bg-layer {
	height: 100%;
	left: 0;
	pointer-events: none;
	position: absolute;
	top: 0;
	width: 100%;
}

.bg-layer-base {
	background-color: #12ceb4;
}

.bg-layer-diamond {
	background: url(assets/images/bg-gradient-diamond.svg) no-repeat center;
	background-size: cover;
}

.bg-layer-texture {
	background: url(assets/images/bg-gradient-texture.png) no-repeat center;
	background-size: 100% 100%;
}

@property --bg-green-angle {
	inherits: false;
	initial-value: 270deg;
	syntax: '<angle>';
}

.bg-layer-green {
	--bg-green-angle: 270deg;
	background: linear-gradient(var(--bg-green-angle), rgba(0, 158, 136, 0) 0%, rgba(0, 158, 136, 0.3) 100%);
}

@property --bg-pink-angle {
	inherits: false;
	initial-value: 322.03deg;
	syntax: '<angle>';
}

.bg-layer-pink {
	--bg-pink-angle: 322.03deg;
	background: linear-gradient(var(--bg-pink-angle), rgba(236, 185, 222, 0) -20.83%, rgba(236, 185, 222, 0.7) 84.82%);
}

@keyframes bg-green-sway {
	to {
		--bg-green-angle: 240deg;
	}
}

@keyframes bg-pink-rotate {
	to {
		--bg-pink-angle: 682.03deg;
	}
}

/* Motion is ambient decoration — static for reduced-motion users. */
@media (prefers-reduced-motion: no-preference) {

	.bg-layer-green {
		animation: bg-green-sway 10s ease-in-out infinite alternate;
	}

	.bg-layer-pink {
		animation: bg-pink-rotate 14s linear infinite;
	}

}

.media {
	aspect-ratio: 15 / 17;
	overflow: hidden;
	position: relative;
}

.media > img,
.media > video,
.media > iframe,
.media > picture > img {
	display: block;
	height: 100%;
	left: 0;
	object-fit: cover;
	position: absolute;
	top: 0;
	width: 100%;
}

.media > iframe {
	border: 0;
}

.media.product {
	aspect-ratio: 748 / 756;
	background: var(--teal-gradient);
}

.media.product > img,
.media.product > picture > img {
	filter: drop-shadow(8px 8px 24px rgba(0, 0, 0, 0.14));
	object-fit: contain;
	padding: var(--text-spacing-small);
}

/* Anchor the screenshot to a corner: drop the padding on the anchored sides so
   it hugs that corner, keeping it only on the two away sides (centre is default). */
.media.product.anchor-top-left > img,
.media.product.anchor-top-left > picture > img {
	object-position: top left;
	padding: 0 var(--text-spacing-small) var(--text-spacing-small) 0;
}

.media.product.anchor-top-right > img,
.media.product.anchor-top-right > picture > img {
	object-position: top right;
	padding: 0 0 var(--text-spacing-small) var(--text-spacing-small);
}

.media.product.anchor-bottom-left > img,
.media.product.anchor-bottom-left > picture > img {
	object-position: bottom left;
	padding: var(--text-spacing-small) var(--text-spacing-small) 0 0;
}

.media.product.anchor-bottom-right > img,
.media.product.anchor-bottom-right > picture > img {
	object-position: bottom right;
	padding: var(--text-spacing-small) 0 0 var(--text-spacing-small);
}

/* Silent video (no controls) stands in for an image — show its full frame at
   its natural ratio instead of cropping it to the 16/9 box. */
.media.video-silent {
	aspect-ratio: auto;
}

.media.video-silent > video {
	height: auto;
	position: static;
	width: 100%;
}

/* Silent embed (Vimeo `background=1` / muted YouTube): a no-controls background
   player standing in for the image. The 16:9 iframe is oversized + centered so it
   covers any .media box aspect (crop, don't letterbox), and stays non-interactive. */
.media.video-bg {
	overflow: hidden;
}

.media.video-bg > iframe {
	aspect-ratio: 16 / 9;
	height: auto;
	left: 50%;
	min-height: 100%;
	min-width: 100%;
	pointer-events: none;
	top: 50%;
	translate: -50% -50%;
	width: auto;
}

/* Hover scrim — fades a bottom darken over the poster (z-index 1: above the
   image, below the play button + label at 2) so the label stays legible. */
.media.video::after {
	background: linear-gradient(180deg, transparent 57.06%, #000 100%);
	content: "";
	inset: 0;
	opacity: 0;
	position: absolute;
	transition: opacity 0.2s ease;
	z-index: 1;
}

.media.video:hover::after,
.media.video:focus-within::after {
	opacity: 0.25;
}

/* Whole .media is the click target (button covers it); triggers an inline
   <video> swap (script.js) or opens a JazzyDialog. */
.media.video .play {
	background: transparent;
	border: 0;
	color: var(--black);
	cursor: pointer;
	font-size: calc(22rem / 16);
	inset: 0;
	padding: 0;
	position: absolute;
	z-index: 2;
}

.media.video .play .play-control {
	align-items: center;
	bottom: var(--text-spacing-small);
	display: flex;
	gap: var(--text-spacing-xsmall);
	left: var(--text-spacing-small);
	position: absolute;
}

.media.video .play .play-icon {
	align-items: center;
	background: var(--orange);
	border-radius: 50%;
	display: flex;
	flex-shrink: 0;
	height: 64px;
	justify-content: center;
	transition: scale .2s ease;
	width: 64px;
}

.media.video .play .play-label {
	color: var(--white);
	opacity: 0;
	transition: opacity .2s ease;
}

.media.video .play:hover .play-label,
.media.video .play:focus-visible .play-label {
	opacity: 1;
}

/* While playing, only the play/pause icon stays — the label has nothing left to say. */
.media.video .play[data-state="playing"] .play-label,
.media.video .play[data-state="playing"]:hover .play-label,
.media.video .play[data-state="playing"]:focus-visible .play-label {
	opacity: 0;
}

.media.video .play:hover .play-icon,
.media.video .play:focus-visible .play-icon {
	scale: 1.15;
}

/* Media-accordion, content-media + media-text hero video play button: keep the
   round button but swap the rounded fa-play glyph for a hard-edged triangle
   (nudged right so it optically centres), with a colour-shift-not-grow hover
   (voice-AI orange). */
.module:is(.media-accordion, .content-media, .hero.style-media-text) .media.video .play-icon {
	transition: background 0.2s ease;
}

.module:is(.media-accordion, .content-media, .hero.style-media-text) .media.video .icon-play svg {
	display: none;
}

.module:is(.media-accordion, .content-media, .hero.style-media-text) .media.video .icon-play::after {
	border-block: 9px solid transparent;
	border-left: 14px solid currentColor;
	content: "";
	transform: translateX(2px);
}

.module:is(.media-accordion, .content-media, .hero.style-media-text) .media.video .play:hover .play-icon,
.module:is(.media-accordion, .content-media, .hero.style-media-text) .media.video .play:focus-visible .play-icon {
	background: #e75307;
	scale: 1;
}

/* Inline playback — poster hidden, the button stays a play/pause toggle layered on
   the scrim: it fades in on hover, the icon swaps off data-state (script.js). */
.media.video.is-inline > img,
.media.video.is-inline > picture,
.media.video.is-inline > .poster-video {
	display: none;
}

.media.video.is-inline .play-control {
	opacity: 0;
	transition: opacity .2s ease;
}

.media.video.is-inline:hover .play-control,
.media.video.is-inline:focus-within .play-control {
	opacity: 1;
}

/* Inline embed (YouTube/Vimeo): the iframe player owns the tile — lift it above
   the hover scrim and drop the scrim so its controls stay clickable even if the
   browser blocks autoplay (the native <video> inline case keeps its scrim). */
.media.video.is-embed > iframe {
	z-index: 3;
}

.media.video.is-embed::after {
	display: none;
}

/* contents so the visible wrapper doesn't disturb the icon's centring. */
.media.video .play .play-icon > span {
	display: contents;
}

.media.video .play[data-state="playing"] .icon-play,
.media.video .play:not([data-state="playing"]) .icon-pause {
	display: none;
}

/* Inline playback pause: the button flips to white with a hard-edged pause glyph
   (two sharp bars) instead of the rounded fa-pause. */
.media.video.is-inline .play[data-state="playing"] .play-icon {
	background: var(--white);
	transition: background 0.2s ease;
}

/* Hover like a white button — darken to white-hover, no grow. */
.media.video.is-inline .play[data-state="playing"]:hover .play-icon,
.media.video.is-inline .play[data-state="playing"]:focus-visible .play-icon {
	background: var(--white-hover);
	scale: 1;
}

.media.video.is-inline .play[data-state="playing"] .icon-pause {
	align-items: center;
	display: flex;
	gap: 4px;
	justify-content: center;
}

.media.video.is-inline .play[data-state="playing"] .icon-pause svg {
	display: none;
}

.media.video.is-inline .play[data-state="playing"] .icon-pause::before,
.media.video.is-inline .play[data-state="playing"] .icon-pause::after {
	background: var(--black);
	content: "";
	height: 14px;
	width: 4px;
}

.media.video.square {
	aspect-ratio: 1;
}

.media.video.large .play-icon {
	color: var(--black);
	font-size: calc(36rem / 16);
	height: 120px;
	width: 120px;
}

.media.video.large .play-label {
	display: none;
}

/* Touch can't hover — surface the "Watch Video" affordance permanently: the label
   on modal facades, the whole play-control on inline ones, plus the legibility
   scrim. Mirrors the :hover reveals above; the playing-state rule still hides the
   label mid-playback (higher specificity), and .large keeps its label off. */
@media (hover: none) {

	.media.video::after {
		opacity: 0.25;
	}

	.media.video .play .play-label {
		opacity: 1;
	}

	.media.video.is-inline .play-control {
		opacity: 1;
	}

}

.legal,
.meta {
	font-size: calc(11rem / 16);
	font-weight: 400;
	letter-spacing: 0.2px;
	line-height: calc(16 / 11);
}

/* p.quote selectors keep specificity above p.medium / p.longform. */
.quote,
p.quote,
blockquote,
blockquote p:not([class]) {
	font-family: var(--heading-font);
	font-size: calc(30rem / 16);
	font-weight: 300;
	line-height: calc(42 / 30);
}

.quote.bold,
p.quote.bold,
blockquote.bold,
blockquote.bold p:not([class]) {
	font-weight: 500;
}

header,
section,
footer,
article {
	width: 100%;
}

.container {
	clear: both;
	margin: 0 auto;
	max-width: var(--container-max-width);
	padding: 0 var(--container-outer-padding);
	position: relative;
	width: var(--container-width);
}

.container-full {
	clear: both;
	margin: 0 auto;
	max-width: 100%;
	padding: 0 var(--container-outer-padding);
	position: relative;
	width: 100%;
}

.flex-container,
.flex {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
}

.grid-container,
.grid {
	display: grid;
	gap: var(--gap);
	grid-template-columns: var(--grid);
}

ul.flex-container,
ul.flex,
ul.grid-container,
ul.grid,
ol.flex-container,
ol.flex,
ol.grid-container,
ol.grid {
	list-style: none;
	margin: 0;
	padding: 0;
}

.accessibility,
.hidden_label > label,
.sr-text {
	backface-visibility: hidden;
	left: -999999999px;
	opacity: 0;
	position: absolute;
}

#skip-to-content {
	pointer-events: none;
	top: 0;
	z-index: 9999999;
}

#skip-to-content:focus {
	backface-visibility: visible;
	background: var(--black);
	border: 1px solid var(--white);
	color: var(--white);
	left: var(--container-outer-padding);
	opacity: 1;
	pointer-events: auto;
	top: var(--text-spacing-xsmall);
}

#skip-to-content:focus:hover {
	box-shadow: inset 0px 0px 0px 2px var(--black);
}

.image-zoom {
	overflow: hidden;
}

.image-zoom > img,
.image-zoom > picture {
	display: block;
	height: 100%;
	object-fit: cover;
	transition: all .25s ease;
	width: 100%;
}

.tablet-only,
.mobile-only {
	display: none !important;
}

/*** Carousels ***/

.carousel,
.jazzy-carousel-wrapper,
.slide {
	height: 100%;
}

.carousel {
	/*margin: 0 var(--viewport-edge);
	overflow: visible;
	padding: 0 calc(var(--container-outer-margin) + var(--container-outer-padding));
	position: relative;
	width: 100vw;*/
}

.jazzy-carousel-wrapper {
	overflow: hidden;
	position: relative;
}

.jazzy-carousel {
	-webkit-touch-callout: none;
	-webkit-user-select: none;
	box-sizing: border-box;
	position: relative;
	touch-action: pan-y;
	user-select: none;
}

.jazzy-carousel.jazzy-slide {
	display: flex;
	transition: transform 0.35s cubic-bezier(0.65, 0, 0.35, 1);
	will-change: transform;
}

.jazzy-carousel.jazzy-fade {
	display: grid;
}

.jazzy-carousel.jazzy-fade > * {
	grid-column: 1;
	grid-row: 1;
	opacity: 0;
	transition: opacity 0.35s ease;
}

.jazzy-carousel.jazzy-fade > .is-active {
	opacity: 1;
}

/* Adaptive height (opt-in via data-jazzy-adaptive-height) — carousel.js sets the
   container height to the active slide; align-self keeps each slide at its own
   content height so it stays measurable, overflow clips taller slides mid-fade. */
.jazzy-carousel.jazzy-adaptive-height {
	overflow: hidden;
	transition: height 0.35s ease;
}

.jazzy-carousel.jazzy-adaptive-height.jazzy-fade > * {
	align-self: start;
}

.jazzy-carousel.is-dragging {
	cursor: grabbing;
	transition: none;
}

/** Arrows **/

.jazzy-arrows {
	display: flex;
	gap: var(--text-spacing-xxsmall);
}

.jazzy-prev,
.jazzy-next {
	align-items: center;
	background: var(--carousel-purple);
	border: 0;
	color: var(--white);
	cursor: pointer;
	display: flex;
	flex-shrink: 0;
	height: 48px;
	justify-content: center;
	padding: 0;
	transition: background 0.2s ease;
	width: 48px;
}

.jazzy-prev:hover,
.jazzy-next:hover {
	background: var(--carousel-purple-hover);
}

.jazzy-arrows.gray .jazzy-prev,
.jazzy-arrows.gray .jazzy-next {
	background: var(--gray-light);
	color: var(--black);
}

.jazzy-arrows.gray .jazzy-prev:hover,
.jazzy-arrows.gray .jazzy-next:hover {
	background: color-mix(in srgb, var(--gray-light) 82%, var(--black));
}

.jazzy-prev[disabled],
.jazzy-next[disabled] {
	opacity: 0.4;
	pointer-events: none;
}

/* Swap the library's default chevron for the brand arrow glyph. */
.jazzy-prev > svg,
.jazzy-next > svg {
	display: none;
}

.jazzy-prev::before,
.jazzy-next::before {
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M10.6458 7.875H0V6.125H10.6458L5.76042 1.23958L7 0L14 7L7 14L5.76042 12.7604L10.6458 7.875Z'/%3E%3C/svg%3E") center / contain no-repeat;
	background: currentColor;
	content: "";
	height: 14px;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M10.6458 7.875H0V6.125H10.6458L5.76042 1.23958L7 0L14 7L7 14L5.76042 12.7604L10.6458 7.875Z'/%3E%3C/svg%3E") center / contain no-repeat;
	width: 14px;
}

.jazzy-prev::before {
	transform: rotate(180deg);
}

/** Dots **/

.jazzy-dots {
	display: flex;
	gap: var(--text-spacing-xxsmall);
	justify-content: center;
}

.jazzy-dot {
	background: currentColor;
	border: 0;
	border-radius: 50%;
	height: 6px;
	opacity: 0.3;
	padding: 0;
	position: relative;
	width: 6px;
}

/* 24px transparent hit area over the 6px dot (WCAG 2.5.8 target size). */
.jazzy-dot::before {
	content: "";
	inset: -9px;
	position: absolute;
}

.jazzy-dot.is-active {
	opacity: 1;
}

/** Pause/Play Rotation **/

.jazzy-pause {
	align-items: center;
	background: transparent;
	border: 0;
	cursor: pointer;
	display: inline-flex;
	justify-content: center;
}

/** Non-active / hidden slides **/

.jazzy-fade > [aria-hidden="true"] {
	pointer-events: none;
}

/*** Buttons ***/

.btn,
.content-styles .wp-block-button .wp-block-button__link {
	align-items: center;
	background: transparent;
	border: 0;
	border-radius: 0;
	cursor: pointer;
	display: inline-flex;
	font-family: var(--body-font);
	font-size: calc(15rem / 16);
	font-weight: 600;
	gap: var(--text-spacing-xxsmall);
	line-height: calc(18 / 15);
	padding: 0;
	text-decoration: none;
	transition: background .25s ease, border-color .25s ease, color .25s ease;
	width: auto;
	word-break: unset;
}

.btn:focus-visible,
.content-styles .wp-block-button .wp-block-button__link:focus-visible {
	outline: 2px solid var(--digital-blue);
	outline-offset: 2px;
}

.btn[disabled],
.btn.disabled {
	opacity: 0.5;
	pointer-events: none;
}

/** Button - Small **/

.btn.small {
	font-size: calc(13rem / 16);
	line-height: calc(16 / 13);
}

/** Button - Primary **/

.btn.primary {
	background: var(--black);
	color: var(--white);
	justify-content: center;
	padding: 19px var(--text-spacing-small) 19px;
}

.btn.primary:hover,
a.card:hover .btn.primary {
	background: var(--black-hover);
}

.btn.primary.light {
	background: var(--white);
	color: var(--black);
}

.btn.primary.light:hover {
	background: var(--white-hover);
}

.btn.primary.small,
.btn.outline.small {
	padding: 15px 18px 13px;
}

/** Button - Outline **/

.btn.outline {
	border: 1px solid;
	color: var(--black);
	justify-content: center;
	padding: 20px var(--text-spacing-small) 18px;
}

/* Border matches the fill so the button reads as one solid block the same height
   as a filled button (a contrasting/blended border would look 2px shorter). */
.btn.outline:hover,
a.card:hover .btn.outline {
	background: var(--black);
	border-color: var(--black);
	color: var(--white);
}

.btn.outline.light {
	color: var(--white);
}

.btn.outline.light:hover {
	background: var(--white);
	border-color: var(--white);
	color: var(--black);
}

/** Button - Secondary / Underline Link **/

/* Same underline style; .secondary gets a trailing arrow as an inline SVG from
   the_button() (buttons.php), .underline-link has none. */

.btn.secondary,
.underline-link,
.content-styles .wp-block-button .wp-block-button__link {
	border-bottom: 1.5px solid currentColor;
	color: var(--black);
	padding-bottom: 4px;
	text-align: left;
}

.btn.secondary:hover,
a.card:hover .btn.secondary,
.underline-link:hover,
.content-styles .wp-block-button .wp-block-button__link:hover {
	color: var(--black-hover);
}

.btn.secondary.light,
.underline-link.light {
	color: var(--white);
}

.btn.secondary.light:hover,
.underline-link.light:hover {
	color: var(--white-hover);
}

/* Arrow nudges forward on hover/focus; right padding grows the same 4px so the
   underline tracks the arrow, with a matching negative margin so the footprint
   doesn't shift neighbors. */
.btn.secondary,
.content-styles .wp-block-button .wp-block-button__link {
	transition: background .25s ease, color .25s ease, padding-right .2s ease, margin-right .2s ease;
}

.btn.secondary .icon {
	transition: transform .2s ease;
}

.btn.secondary:hover,
.btn.secondary:focus-visible,
a.card:hover .btn.secondary,
.content-styles .wp-block-button .wp-block-button__link:hover,
.content-styles .wp-block-button .wp-block-button__link:focus-visible {
	margin-right: -4px;
	padding-right: 4px;
}

.btn.secondary:hover .icon,
.btn.secondary:focus-visible .icon,
a.card:hover .btn.secondary .icon {
	transform: translateX(4px);
}

.underline-link.small {
	font-size: calc(11rem / 16);
	font-weight: 500;
	letter-spacing: 0.2px;
	line-height: calc(16 / 11);
}

.legal-link {
	color: var(--black);
	font-size: calc(11rem / 16);
	font-weight: 500;
	letter-spacing: 0.2px;
	line-height: calc(16 / 11);
	text-decoration: none;
}

.legal-link:hover {
	text-decoration: underline;
}

/** Button - Tertiary **/

/* Tertiary type — shared with pagination numbers (.page-numbers reuses it). */
.btn.tertiary,
.page-numbers,
.pagination {
	font-size: calc(13rem / 16);
	font-weight: 500;
	line-height: calc(16 / 13);
}

.btn.tertiary {
	color: var(--digital-blue);
	gap: 5px;
}

.btn.tertiary:hover,
a.card:hover .btn.tertiary {
	color: var(--digital-blue-hover);
}

/* On a dark/coloured band — arrow inherits via currentColor. */
.btn.tertiary.light,
.btn.tertiary.light:hover {
	color: var(--white);
}

.btn.tertiary::after {
	background-color: currentColor;
	content: '';
	height: 9px;
	mask: url('assets/svgs/arrow-right.svg') center / contain no-repeat;
	position: relative;
	top: 1px;
	transition: transform .2s ease;
	width: 9px;
}

/* Arrow nudges forward on hover, matching .btn.secondary. transform composes with
   the .external rotate below — they're independent properties. */
.btn.tertiary:hover::after,
.btn.tertiary:focus-visible::after,
a.card:hover .btn.tertiary::after {
	transform: translateX(4px);
}

.btn.tertiary.external::after {
	rotate: -45deg;
}

/** Button - Icon **/

.btn.icon {
	align-items: center;
	aspect-ratio: 1;
	border-radius: 100%;
	display: flex;
	justify-content: center;
	width: 48px;
}

/*** Cards ***/

/* Grid-based cards override `display`; visual chrome lives on variants. */
.card {
	display: flex;
	flex-direction: column;
}

.card.blog-card {
	background: var(--white);
	filter: var(--shadow-card);
	height: 100%;
	position: relative;
}

/* Whole-card link: the title is the only real anchor; its ::after stretches
   over the card so a click anywhere follows it. Keeps one link in the a11y
   tree while leaving the excerpt text selectable. */
.card.blog-card .card-link::after {
	content: '';
	inset: 0;
	position: absolute;
	z-index: 1;
}

.card.blog-card .media {
	aspect-ratio: 372 / 210;
	background: var(--gray-light);
	display: block;
}

/* No featured image — the card still needs a filled frame, so it falls back to
   the teal field rather than a flat grey block. The overlay tag is always
   present, so test for the img itself, not for emptiness. */
.card.blog-card .media:not(:has(img)) {
	background: var(--teal-glow);
	background-size: 200% 200%, 220% 220%, 240% 240%, 100% 100%;
}

@media (prefers-reduced-motion: no-preference) {

	.card.blog-card .media:not(:has(img)) {
		animation: euphoria-drift var(--euphoria-drift-duration) ease-in-out infinite;
	}

}

.card.blog-card .overlay-tag {
	left: var(--text-spacing-xxsmall);
	position: absolute;
	top: var(--text-spacing-xxsmall);
	z-index: 1;
}

.card.blog-card .body {
	align-items: flex-start;
	display: flex;
	flex-direction: column;
	flex-grow: 1;
	padding: var(--text-spacing-medium);
}

/* Card rhythm: title→byline 8, byline→excerpt 16. */
.card.blog-card .body > * + * {
	margin-top: var(--text-spacing-xsmall);
}

.card.blog-card .body > * + .meta,
.card.blog-card .body > * + .heading-5 {
	margin-top: var(--text-spacing-xxsmall);
}

.card.blog-card .body a {
	color: inherit;
}

.card.blog-card .body a:hover {
	color: var(--black-hover);
}

.card.blog-card .excerpt {
	word-break: break-word;
}

.card.blog-card .meta {
	align-items: center;
	color: var(--meta-gray);
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xxsmall);
}

.card.blog-card .meta .sep {
	color: var(--alabaster-gray);
}

/* margin-top:auto pins the read-more to the card bottom so it lines up across
   the equal-height row; padding-top keeps a gap above it. */
.card.blog-card .btn.tertiary {
	align-self: flex-start;
	color: var(--digital-blue);
	margin-top: auto;
	padding-top: var(--text-spacing-medium);
}

/* Whole-card hover (blog, newsroom + press-release): the read-more / View
   tertiary shifts to the hover blue with the arrow nudged forward. Blog-card
   also eases its overlay type-icon open and zooms the image (below). */
.card:is(.blog-card, .news-card, .press-card) .btn.tertiary::after {
	transition: transform .2s ease;
}

.card:is(.blog-card, .news-card, .press-card):hover .btn.tertiary {
	color: var(--digital-blue-hover);
}

.card:is(.blog-card, .news-card, .press-card):hover .btn.tertiary::after {
	transform: translateX(3px);
}

/* Icon collapses to zero width at rest and eases open on card hover (gap moves
   to the icon's margin so it can animate; display can't transition). */
.card.blog-card .overlay-tag {
	gap: 0;
}

.card.blog-card .overlay-tag svg {
	margin-right: 0;
	max-width: 0;
	opacity: 0;
	overflow: hidden;
	transition: margin-right .25s ease, max-width .25s ease, opacity .25s ease;
}

.card.blog-card:hover .overlay-tag svg {
	margin-right: 4px;
	max-width: 1.25em;
	opacity: 1;
}

.card.blog-card .media img {
	transition: scale .4s ease;
}

@media (prefers-reduced-motion: no-preference) {

	.card.blog-card:hover .media img {
		scale: 1.04;
	}

}

/* minmax(0, 2fr) lets the excerpt column shrink instead of overflowing. */
.card.release-note-card {
	align-items: flex-start;
	background: var(--white);
	column-gap: var(--text-spacing-xlarge);
	display: grid;
	filter: var(--shadow-card);
	grid-template-columns: minmax(220px, 1fr) minmax(0, 2fr);
	padding: var(--text-spacing-medium) var(--text-spacing-large);
	position: relative;
	row-gap: var(--text-spacing-xsmall);
}

.card.release-note-card .lead {
	display: flex;
	flex-direction: column;
}

.card.release-note-card .heading-6 {
	margin: 0;
}

.card.release-note-card .meta {
	color: var(--meta-gray);
	margin: var(--text-spacing-xxsmall) 0 0;
}

.card.release-note-card .excerpt {
	color: var(--gray-dark);
	margin: 0;
}

.card.release-note-card .btn.tertiary {
	grid-column: 2;
	justify-self: start;
}

.card.release-note-card .card-link {
	color: inherit;
}

.card.release-note-card .card-link::after {
	content: '';
	inset: 0;
	position: absolute;
	z-index: 1;
}

.card.release-note-card:hover .card-link,
.card.release-note-card:focus-within .card-link {
	color: var(--black-hover);
}

/* Bare by default (no card chrome) — the recents list uses it on a parchment field. */
.card.blog-card.horizontal {
	align-items: center;
	background: none;
	filter: none;
	flex-direction: row;
	gap: var(--text-spacing-small);
}

.card.blog-card.horizontal .media {
	aspect-ratio: 4 / 3;
	background: var(--gray-light);
	flex: 0 0 160px;
	order: 2;
}

.card.blog-card.horizontal .body {
	gap: var(--text-spacing-xxsmall);
	padding: 0;
}

.card.blog-card.horizontal .body > * + * {
	margin-top: 0;
}

/* Tag icon stays collapsed until the card is hovered/focused, then slides in —
   the negative margin cancels the pill's 4px gap while it's hidden. min-width:0
   lets it collapse (flex items default to min-width:auto, ignoring max-width:0). */
.card.blog-card.horizontal .pill.tag svg {
	height: 10px;
	margin-right: -4px;
	max-width: 0;
	min-width: 0;
	opacity: 0;
	transition: margin-right .25s ease, max-width .25s ease, opacity .25s ease;
	width: auto;
}

.card.blog-card.horizontal:hover .pill.tag svg,
.card.blog-card.horizontal:focus-within .pill.tag svg {
	margin-right: 0;
	max-width: 16px;
	opacity: 1;
}

.card.category {
	align-items: center;
	aspect-ratio: 1;
	background: var(--white);
	color: var(--black);
	filter: var(--shadow-card);
	gap: var(--text-spacing-xsmall);
	justify-content: center;
	padding: 0 var(--text-spacing-xsmall);
	text-align: center;
}

.card.category .icon {
	font-size: calc(26rem / 16);
}

.card.category:hover .icon,
.card.category:focus-visible .icon {
	color: var(--orange);
}

.card.story {
	background: var(--white);
	filter: var(--shadow-card);
	height: 100%;
	position: relative;
}

.card.story .media {
	aspect-ratio: 558 / 314;
}

/* Corner wash so the white logo reads over any photo. */
.card.story .media::after {
	background: linear-gradient(225deg, transparent, rgba(0, 0, 0, 0.3));
	content: '';
	inset: 0;
	position: absolute;
}

.card.story .media .logo {
	bottom: var(--text-spacing-small);
	left: var(--text-spacing-small);
	position: absolute;
	z-index: 1;
}

.card.story .media .logo img {
	display: block;
	height: 48px;
	max-width: 172px;
	object-fit: contain;
	width: auto;
}

.card.story .body {
	align-items: flex-start;
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-large);
	padding: var(--text-spacing-large) var(--text-spacing-medium) var(--text-spacing-xlarge);
}

.card.story .content {
	align-items: flex-start;
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
}

.card.story .meta {
	color: var(--gray-dark);
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xsmall);
	list-style: none;
	margin: 0;
	padding: 0;
}

.card.story .meta li {
	align-items: center;
	display: flex;
	gap: var(--text-spacing-xxsmall);
}

.card.story .stats {
	display: grid;
	gap: var(--text-spacing-xsmall);
	grid-template-columns: repeat(3, 1fr);
	list-style: none;
	margin: 0;
	padding: 0;
}

.card.story .stats .label {
	color: var(--gray-dark);
	margin-top: var(--text-spacing-xxsmall);
}

.card.story .card-link::after {
	content: '';
	inset: 0;
	position: absolute;
	z-index: 1;
}

/* Each template sets its own column count on .news-grid. */
.news-grid {
	display: grid;
	gap: var(--module-spacing-small) var(--text-spacing-large);
	list-style: none;
	margin: 0;
	padding: 0;
}

.card.client-story-card {
	background: var(--white);
	color: inherit;
	display: flex;
	filter: var(--shadow-card);
	flex-direction: column;
	height: 100%;
	text-decoration: none;
}

.card.client-story-card .media {
	aspect-ratio: 558 / 314;
	background: var(--euphoric-blue);
	background-size: 200% 200%, 220% 220%, 240% 240%, 100% 100%;
	display: block;
	position: relative;
}

@media (prefers-reduced-motion: no-preference) {

	.card.client-story-card .media {
		animation: euphoria-drift var(--euphoria-drift-duration) ease-in-out infinite;
	}

}

/* Dark scrim keeps the white logo legible over any still. */
.card.client-story-card .media::after {
	background: linear-gradient(225deg, transparent 0%, color-mix(in srgb, var(--black) 30%, transparent) 100%);
	content: '';
	inset: 0;
	position: absolute;
}

/* No featured image — the logo centred vertically. */
.card.client-story-card .media.logo-only::after {
	display: none;
}

.card.client-story-card .media.logo-only .logo {
	bottom: auto;
	left: 50%;
	top: 50%;
	translate: -50% -50%;
}

/* Reset the global .media > img fill (top:0/height:100%/cover) so the logo
   sits intrinsic-sized at the bottom-left, not stretched from the top. */
.card.client-story-card .logo {
	bottom: var(--text-spacing-small);
	height: auto;
	left: var(--text-spacing-small);
	max-height: 48px;
	max-width: 220px;
	object-fit: contain;
	position: absolute;
	right: auto;
	top: auto;
	width: auto;
	z-index: 1;
}

/* WebP plugin wraps the logo <img> in <picture class="logo"> — size + un-cover
   the inner image (the global .media > picture > img would otherwise crop it). */
.card.client-story-card .logo img {
	height: auto;
	max-height: 48px;
	max-width: 220px;
	object-fit: contain;
	position: static;
	width: auto;
}

.card.client-story-card .body {
	align-items: flex-start;
	display: flex;
	flex-direction: column;
	flex-grow: 1;
	padding: var(--text-spacing-large) var(--text-spacing-medium) var(--text-spacing-xlarge);
}

/* Compact — tighter body padding for dense contexts (e.g. the carousel). */
.card.client-story-card.compact .body {
	padding: var(--text-spacing-medium) var(--text-spacing-small) var(--text-spacing-large);
}

.card.client-story-card .body > * + * {
	margin-top: var(--text-spacing-xsmall);
}

.card.client-story-card .byline {
	color: var(--black);
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xxsmall) var(--text-spacing-xsmall);
	list-style: none;
	margin: 0;
	padding: 0;
}

.card.client-story-card .byline > li {
	align-items: center;
	display: flex;
	gap: 6px;
}

.card.client-story-card .heading-6 + .byline {
	color: var(--meta-gray);
}

.card.client-story-card.small .byline > li + li::before {
	color: var(--alabaster-gray);
	content: "|";
}

.card.client-story-card .byline .chip {
	align-items: center;
	background: var(--alabaster-gray);
	border-radius: 50%;
	display: inline-flex;
	flex-shrink: 0;
	height: 24px;
	justify-content: center;
	width: 24px;
}

.card.client-story-card .byline svg {
	height: 12px;
	width: 12px;
}

/* Result stats — black number + label pairs, no divider. */
.card.client-story-card .stats {
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xsmall);
	list-style: none;
	margin: var(--text-spacing-xsmall) 0 0;
	padding: 0;
	width: 100%;
}

.card.client-story-card .stat {
	align-items: flex-start;
	display: flex;
	flex: 1;
	flex-direction: column;
}

/* Read link pinned to the foot so it aligns across a row of cards. */
.card.client-story-card .btn.secondary {
	margin-top: auto;
	padding-top: var(--text-spacing-medium);
}

/** Small variant **/

.card.client-story-card.small .media {
	aspect-ratio: 372 / 210;
}

.card.client-story-card.small .heading-6 .highlight {
	font-weight: 500;
}

.card.client-story-card.small .body {
	padding: var(--text-spacing-medium);
}

.card.client-story-card.small .body > * + * {
	margin-top: var(--text-spacing-xxsmall);
}

.card.client-story-card.small .body > * + .small-text {
	margin-top: var(--text-spacing-xsmall);
}

.card.client-story-card.small .eyebrow,
.card.client-story-card.small .meta {
	color: var(--meta-gray);
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xxsmall);
}

.card.client-story-card.small .sep {
	color: var(--alabaster-gray);
}

.card.client-story-card.small .btn.tertiary {
	color: var(--digital-blue);
	margin-top: auto;
	padding-top: var(--text-spacing-medium);
}

.card.news-card {
	background: var(--white);
	color: var(--black);
	filter: var(--shadow-card);
	height: 100%;
	overflow: hidden;
	position: relative;
}

/* Plain variant — bare card (no box, shadow, or body padding); logo keeps a white plate. */
.card.news-card.plain {
	background: none;
	filter: none;
	gap: var(--text-spacing-small);
}

/* Fixed height (not max) so every plate matches the tallest, logo centred inside. */
.card.news-card.plain .logo {
	background: var(--white);
	height: 64px;
	max-width: 120px;
	min-height: auto;
	padding: var(--text-spacing-xxsmall);
}

.card.news-card.plain .body {
	padding: 0;
}

/* .white — for dark bands: text + the View link reverse to white. */
.card.news-card.plain.white,
.card.news-card.plain.white :is(.meta, .sub),
.card.news-card.plain.white .btn.tertiary {
	color: var(--white);
}

/* …but the outlet name stays dark on its white logo plate. */
.card.news-card.plain.white .logo {
	color: var(--black);
}

/* Heading holds white on hover/focus — the global black-hover would darken it. */
.card.news-card.plain.white:hover .card-link,
.card.news-card.plain.white:focus-within .card-link {
	color: var(--white);
}

/* card-link's ::after stretches over the card so the whole tile opens it. */
.card.news-card .card-link::after {
	content: '';
	inset: 0;
	position: absolute;
	z-index: 1;
}

/* Logo capped so cards read evenly; name fallback. */
.news-card .logo {
	align-items: center;
	background: var(--parchment);
	display: flex;
	justify-content: center;
	min-height: 200px;
	padding: var(--text-spacing-medium) var(--text-spacing-large);
}

.news-card .logo img {
	max-height: 48px;
	max-width: 70%;
	object-fit: contain;
	width: auto;
}

.news-card .logo span {
	text-align: center;
}

.news-card .body {
	align-items: flex-start;
	display: flex;
	flex-direction: column;
	flex-grow: 1;
	gap: var(--text-spacing-xxsmall);
	padding: var(--text-spacing-medium);
}

.news-card .card-link {
	color: inherit;
}

.news-card .body .btn.tertiary {
	margin-top: var(--text-spacing-xsmall);
}

/* Shift the title on hover/focus (no shadow move) — matches the blog-card. */
.news-card:hover .card-link,
.news-card:focus-within .card-link {
	color: var(--black-hover);
}

/* Card hover (dark-band press cards): the copy block lifts 4px; the View link is
   countered so it holds still and only its external arrow pushes out, with the
   white-secondary colour shift. Lifting .body (not .card-link's ancestors) keeps
   the whole-tile .card-link::after overlay intact. */
.news-card.plain.white .body,
.news-card.plain.white .btn.tertiary {
	transition: transform 0.35s ease, color 0.25s ease;
}

/* Individual `translate` (applied after the arrow's -45deg `rotate`), so the push
   is screen-space right — not along the arrow's diagonal. */
.news-card.plain.white .btn.tertiary::after {
	transition: translate 0.2s ease;
}

.news-card.plain.white:hover .body,
.news-card.plain.white:focus-within .body {
	transform: translateY(-4px);
}

.news-card.plain.white:hover .btn.tertiary,
.news-card.plain.white:focus-within .btn.tertiary {
	color: var(--white-hover);
	transform: translateY(4px);
}

.news-card.plain.white:hover .btn.tertiary::after,
.news-card.plain.white:focus-within .btn.tertiary::after {
	translate: 4px;
}

.news-card .meta,
.news-card .sub {
	color: var(--gray-dark);
}

/*** Pills ***/

.pill {
	align-items: center;
	color: var(--black);
	display: inline-flex;
	font-family: var(--body-font);
	font-weight: 700;
	justify-content: center;
	text-transform: uppercase;
	white-space: nowrap;
}

/* Optional leading icon. */
.pill .icon {
	align-items: center;
	display: inline-flex;
}

.pill .icon svg {
	display: block;
	height: 10px;
	width: auto;
}

/** Pill - Category **/

.pill.category {
	background: var(--alabaster-gray);
	font-size: calc(10rem / 16);
	letter-spacing: 0.6px;
	line-height: calc(12 / 10);
	padding: 7px 12px;
	transition: background .25s ease;
}

.pill.category.light {
	background: var(--parchment);
}

/* Both variants land on the same tint so the hover reads identically wherever a
   category pill appears. Declared after .light — at equal specificity that rule
   would otherwise win by source order and .light would have no hover at all.
   color is re-asserted because .pill's (0,1,0) loses to an ancestor's a:hover. */
.pill.category:hover,
.pill.category.light:hover,
.pill.category:focus-visible,
.pill.category.light:focus-visible {
	background: var(--alabaster-gray-hover);
	color: var(--black);
}

/** Pill - Tag **/

.pill.tag {
	background: var(--teal);
	font-size: calc(9rem / 16);
	gap: 4px;
	letter-spacing: 0.4px;
	line-height: calc(12 / 9);
	padding: 3px var(--text-spacing-xxsmall);
}

.pill.tag.large {
	font-size: calc(10rem / 16);
	font-weight: 700;
	letter-spacing: 0.6px;
	line-height: calc(12 / 10);
	padding: 7px 12px;
}

/*** Pagination — global (WP paginate_links + jazzy AJAX archives) ***/

/* The pager is a <ul>, so it inherits the reset's list indent (40px) and 1em block
   margins — clear both; only the deliberate top gap stays. */
.pagination {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xsmall);
	justify-content: center;
	list-style: none;
	margin: var(--module-spacing-medium) 0 0;
	padding: 0;
	position: relative;
}

.page-numbers {
	align-items: center;
	color: var(--black);
	display: inline-flex;
	justify-content: center;
	text-decoration: none;
}

/* Number cells are 32×32 squares; prev/next/dots size to their content. */
.page-numbers:not(.prev):not(.next):not(.dots) {
	height: 32px;
	width: 32px;
}

a.page-numbers:hover {
	background: var(--parchment);
}

.page-numbers.current {
	background: var(--alabaster-gray);
}

/* Pinned to the edges so the centred numbers stay put even when one is absent —
   margin-auto would shove the numbers off-centre on page 1 (no prev). */
.page-numbers.prev,
.page-numbers.next {
	color: var(--digital-blue);
	gap: var(--text-spacing-xxsmall);
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
}

.page-numbers.prev {
	left: 0;
}

.page-numbers.next {
	right: 0;
}

.page-numbers.prev svg {
	transform: scaleX(-1);
}

/* Jazzy AJAX paged pagination wears the same look. Its numbered view renders
   <ul class="pagination"><li><a class="page current">…</a></li>…> (wrapper class
   set in functions/archives.php), so flatten the <li> wrappers and map its class
   names onto the .page-numbers styling above. */
.pagination > li {
	display: contents;
}

.pagination .page,
.pagination .extend {
	align-items: center;
	color: var(--black);
	display: inline-flex;
	justify-content: center;
	text-decoration: none;
}

/* Number cells are 32×32 squares; the ellipsis sizes to its content. */
.pagination .page {
	height: 32px;
	width: 32px;
}

.pagination a.page:hover {
	background: var(--parchment);
}

.pagination .page.current {
	background: var(--alabaster-gray);
}

/* Prev/Next pin to the edges so the centred numbers stay put even when one is
   absent — margin-auto would shove the numbers off-centre on page 1 (no prev). */
.pagination .previous,
.pagination .next {
	align-items: center;
	color: var(--digital-blue);
	display: inline-flex;
	gap: var(--text-spacing-xxsmall);
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
}

.pagination .previous {
	left: 0;
}

.pagination .next {
	right: 0;
}

/* Digital-blue arrow glyph (assets/svgs/arrow-right.svg) tinted with the link
   colour, same as .btn.tertiary; the previous arrow is that shape flipped.
   Skipped when the link carries .page-numbers — WordPress's paginate_links()
   output already embeds its own inline <svg> (see page-resources.php), so the
   pseudo-element would double up. Jazzy AJAX's pagination uses .previous/.next
   without .page-numbers and relies on this rule. */
.pagination .previous:not(.page-numbers)::before,
.pagination .next:not(.page-numbers)::after {
	background-color: currentColor;
	content: "";
	height: 9px;
	mask: url('assets/svgs/arrow-right.svg') center / contain no-repeat;
	transition: transform 0.2s ease;
	width: 9px;
}

.pagination .previous:not(.page-numbers)::before {
	transform: scaleX(-1);
}

.pagination .next:not(.page-numbers):hover::after,
.pagination .next:not(.page-numbers):focus-visible::after {
	transform: translateX(4px);
}

/* translateX rides the flipped axis, so +4px nudges the arrow left. */
.pagination .previous:not(.page-numbers):hover::before,
.pagination .previous:not(.page-numbers):focus-visible::before {
	transform: scaleX(-1) translateX(4px);
}

/*** Multi-select — checkbox dropdown filter (JazzyMultiselect, data-jazzy-multiselect) ***/

.jazzy-multiselect {
	position: relative;
}

.jazzy-multiselect .trigger {
	align-items: center;
	background: transparent;
	border: 1px solid var(--gray-light);
	color: var(--gray-dark);
	cursor: pointer;
	display: flex;
	font-family: var(--body-font);
	font-size: calc(14rem / 16);
	font-weight: 400;
	gap: var(--text-spacing-small);
	justify-content: space-between;
	min-width: 200px;
	padding: 12px 10px 12px 20px;
	width: 100%;
}

.jazzy-multiselect .trigger:focus-visible {
	border-color: var(--black);
	outline: none;
}

.jazzy-multiselect .caret {
	align-items: center;
	background: var(--gray-light);
	border-radius: 50%;
	color: var(--black);
	display: inline-flex;
	flex-shrink: 0;
	height: 24px;
	justify-content: center;
	width: 24px;
}

.jazzy-multiselect .panel {
	background: var(--white);
	border: 1px solid color-mix(in srgb, var(--black) 12%, transparent);
	box-shadow: var(--shadow-dropdown);
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	left: 0;
	margin-top: var(--text-spacing-xxsmall);
	min-width: 100%;
	padding: 16px var(--text-spacing-xsmall);
	position: absolute;
	top: 100%;
	white-space: nowrap;
	z-index: 3;
}

/* display:flex above outranks the UA [hidden]{display:none} — restore it so the
   library's panel.hidden = true actually hides the panel. */
.jazzy-multiselect .panel[hidden] {
	display: none;
}

.jazzy-multiselect .panel label {
	align-items: center;
	cursor: pointer;
	display: flex;
	font-size: calc(13rem / 16);
	gap: var(--text-spacing-xxsmall);
}

.jazzy-multiselect .badge {
	align-items: center;
	background: var(--black);
	border-radius: 999px;
	color: var(--white);
	display: inline-flex;
	font-size: calc(11rem / 16);
	font-weight: 500;
	height: 20px;
	justify-content: center;
	line-height: 1;
	margin-left: var(--text-spacing-xxsmall);
	min-width: 20px;
	padding: 0 6px;
}

/* Author display:inline-flex outranks the UA [hidden]{display:none} — restore it. */
.jazzy-multiselect .badge[hidden] {
	display: none;
}

.jazzy-multiselect .panel label .count {
	color: var(--gray-dark);
	margin-left: auto;
}

.jazzy-multiselect .panel .clear {
	background: transparent;
	border: none;
	border-top: 1px solid color-mix(in srgb, var(--black) 12%, transparent);
	color: var(--gray-dark);
	cursor: pointer;
	font-family: var(--body-font);
	font-size: calc(13rem / 16);
	margin-top: var(--text-spacing-xxsmall);
	padding: var(--text-spacing-xsmall) 0 0;
	text-align: left;
	text-decoration: underline;
	text-underline-offset: 2px;
}

.jazzy-multiselect .panel .clear:hover,
.jazzy-multiselect .panel .clear:focus-visible {
	color: var(--black);
	outline: none;
}

/*** Share links — social icon buttons (single article + client story) ***/

.share-link {
	align-items: center;
	background: var(--black);
	color: var(--white);
	display: flex;
	height: 44px;
	justify-content: center;
	transition: background 0.2s ease;
	width: 44px;
}

/* Keep the icon white on hover — only the square darkens (the normalize layer's
   a:hover colour would otherwise tint the currentColor glyph blue). */
.share-link:hover {
	background: var(--black-hover);
	color: var(--white);
}

.share-link svg {
	height: 18px;
	width: 18px;
}

/*** Tooltip — info circle with a popup that appears on hover/focus ***/

/* Inline wrapper so the trigger sits in flow with surrounding text. */
.tooltip {
	display: inline-flex;
	position: relative;
	vertical-align: middle;
}

.tooltip-trigger {
	align-items: center;
	background: var(--electric-lavender);
	border: 0;
	border-radius: 50%;
	color: var(--white);
	cursor: pointer;
	display: inline-flex;
	height: 16px;
	justify-content: center;
	padding: 0;
	width: 16px;
}

.tooltip-trigger:focus-visible {
	outline: 2px solid var(--electric-lavender);
	outline-offset: 2px;
}

.tooltip-trigger svg {
	display: block;
	height: 8px;
	width: auto;
}

/* Hidden by default; revealed on hover or any focus inside the wrapper. */
.tooltip-popup {
	background: var(--lavender);
	color: var(--black);
	left: 0;
	margin-top: 10px; /* 4px gap + 6px caret */
	max-width: min(372px, calc(100vw - 32px));
	opacity: 0;
	padding: var(--text-spacing-xsmall);
	pointer-events: none;
	position: absolute;
	text-align: left;
	top: 100%;
	transition: opacity .2s ease;
	width: max-content;
	z-index: 10;
}

/* Upward caret, positioned to roughly center over the 16px trigger. */
.tooltip-popup::before {
	border-bottom: 6px solid var(--lavender);
	border-left: 6px solid transparent;
	border-right: 6px solid transparent;
	bottom: 100%;
	content: '';
	height: 0;
	left: 2px;
	position: absolute;
	width: 0;
}

.tooltip:hover .tooltip-popup,
.tooltip:focus-within .tooltip-popup {
	opacity: 1;
	pointer-events: auto;
}

/* Escape dismisses the popup without moving the pointer (WCAG 1.4.13). Outranks
   the hover rule on specificity; script.js clears it on mouseleave / focusout. */
.tooltip.is-dismissed .tooltip-popup {
	opacity: 0;
	pointer-events: none;
}

/*** Stat orbit graphic — thin ring, settling dot, pulsing cluster. Markup is
     built by render_stat_orbit(); animates off .big-stat-graphic.animated-in
     (JazzyScroll "big-stat"). Shared by the SVP module's stat media (which adds
     a count-up figure/caption overlay) and the Stat tile (decorative only). ***/

.big-stat-graphic {
	aspect-ratio: 602 / 592;
	container-type: inline-size;
	margin: 0 auto;
	max-width: 602px;
	position: relative;
	width: 100%;
}

.big-stat-graphic svg {
	display: block;
	height: 100%;
	overflow: visible;
	width: 100%;
}

/* Figure (+ optional caption) centred on the ring's optical centre — 47.34% /
   51.86% of the viewBox, off-centre from the graphic box because the decorative
   orbit circles extend past it. A property of render_stat_orbit(), so it lives
   with the graphic: both the SVP stat media and the stat tile use it. */
.big-stat-overlay {
	align-items: center;
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	left: 47.34%;
	position: absolute;
	top: 51.86%;
	transform: translate(-50%, -50%);
	width: 61.5%;
}

.big-stat-number {
	color: var(--orange);
}

.big-stat-caption {
	color: var(--black);
	font-size: clamp(calc(13rem / 16), 3cqw, calc(18rem / 16));
	line-height: 1.55;
	margin: 0;
	text-align: center;
}

.big-stat-dot {
	fill: var(--alabaster-gray);
}

.big-stat-cluster circle {
	opacity: 0.25;
}

@media (prefers-reduced-motion: no-preference) {

	/* Keyframes, not transitions — a keyframe restarts cleanly when script.js
	   toggles .animated-in + reflows on each crossfade re-activation (like the
	   metric icons); a transition already at its end value wouldn't replay. */
	.big-stat-ring,
	.big-stat-dot {
		transform-box: fill-box;
		transform-origin: center;
	}

	.big-stat-ring {
		transform: scale(0.25);
	}

	.big-stat-dot {
		transform: scale(4);
		transform-origin: bottom right;
	}

	.big-stat-graphic.animated-in .big-stat-ring {
		animation: big-stat-ring-in 1500ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
	}

	.big-stat-graphic.animated-in .big-stat-dot {
		animation: big-stat-dot-in 1500ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
	}

	@keyframes big-stat-ring-in {
		to {
			transform: scale(1);
		}
	}

	@keyframes big-stat-dot-in {
		to {
			transform: scale(1);
		}
	}

	.big-stat-cluster circle {
		opacity: 0;
		transform: scale(0.95);
		transform-box: fill-box;
		transform-origin: center;
		transition: opacity 400ms ease, transform 400ms ease;
	}

	.big-stat-orbit-2 {
		transition-delay: 1300ms;
	}

	.big-stat-orbit-3 {
		transition-delay: 1400ms;
	}

	.big-stat-orbit-4 {
		transition-delay: 1500ms;
	}

	.big-stat-orbit-1 {
		transition-delay: 1600ms;
	}

	.big-stat-orbit-5 {
		transition-delay: 1700ms;
	}

	.big-stat-graphic.animated-in .big-stat-cluster circle {
		animation: orbit-pulse 5s ease-in-out infinite;
		opacity: 0.25;
		transform: scale(1);
	}

	.big-stat-graphic.animated-in .big-stat-orbit-2 {
		animation-delay: 2100ms;
	}

	.big-stat-graphic.animated-in .big-stat-orbit-3 {
		animation-delay: 3100ms;
	}

	.big-stat-graphic.animated-in .big-stat-orbit-4 {
		animation-delay: 4100ms;
	}

	.big-stat-graphic.animated-in .big-stat-orbit-1 {
		animation-delay: 5100ms;
	}

	.big-stat-graphic.animated-in .big-stat-orbit-5 {
		animation-delay: 6100ms;
	}

	@keyframes orbit-pulse {
		0%,
		100% {
			opacity: 0.25;
		}

		10% {
			opacity: 1;
		}

		20% {
			opacity: 0.25;
		}
	}

}

/*** Metric Icon — soft disc holding a progress ring or bar-chart glyph, with
     an optional centred up/down arrow overlay. Markup is built by the
     render_metric_icon() helper; extend by adding a new .type-{name} block
     and a matching branch in the helper. Tunable via CSS custom properties
     so any host module can override accent, disc, arrow color in scope. ***/

.metric-icon {
	--metric-icon-size: 60px;
	--metric-icon-track: var(--track-gray);
	--metric-icon-accent: var(--orange);
	--metric-icon-arrow-color: currentColor;

	align-items: center;
	border-radius: 50%;
	display: flex;
	flex-shrink: 0;
	height: var(--metric-icon-size);
	justify-content: center;
	position: relative;
	width: var(--metric-icon-size);
}

.metric-icon-glyph {
	display: block;
	height: 100%;
	width: 100%;
}

/** Ring — full-circle track + a stroke that draws to --pct using pathLength="100". **/

/* Register typed numbers so the calc() below interpolates smoothly: --pct is the
   fill percentage (set inline on the icon span, inherits to the stroke);
   --ring-draw is the 0→1 draw progress the animation tweens. */
@property --pct {
	inherits: true;
	initial-value: 70;
	syntax: '<number>';
}

@property --ring-draw {
	inherits: true;
	initial-value: 1;
	syntax: '<number>';
}

.metric-icon.type-ring {
	--metric-icon-ring-from: color-mix(in srgb, var(--metric-icon-accent) 62%, #ffffff);
	--metric-icon-ring-width: calc(var(--metric-icon-size) * 0.06);
	--metric-icon-track-width: calc(var(--metric-icon-ring-width) * 0.5);

	/* Stacking context so the ::before track sits BELOW the conic glyph without
	   escaping to the page. */
	isolation: isolate;
}

/* Thin gray track centered radially within the orange ring band. Conic's
   inactive arc is transparent (below) so this shows on the un-progressed
   portion; the orange overpaints it where the arc is filled. */
.metric-icon.type-ring::before {
	background: var(--metric-icon-track);
	border-radius: 50%;
	content: '';
	inset: 0;
	mask-image: radial-gradient(farthest-side,
		transparent calc(100% - var(--metric-icon-ring-width) * 3 / 4),
		#000        calc(100% - var(--metric-icon-ring-width) * 3 / 4),
		#000        calc(100% - var(--metric-icon-ring-width) / 4),
		transparent calc(100% - var(--metric-icon-ring-width) / 4));
	position: absolute;
	z-index: -1;
}

/* Conic progress ring — light→accent sweep clockwise from 12 o'clock; inactive
   arc is `transparent` so the thin track behind shows through. --ring-draw
   (0→1, animated below) scales the filled sweep to --pct; conic stops
   re-interpolate because --ring-draw is a registered @property. */
.metric-icon.type-ring .metric-icon-glyph {
	background: conic-gradient(
		var(--metric-icon-ring-from),
		var(--metric-icon-accent) calc(var(--pct, 70) * var(--ring-draw, 1) * 1%),
		transparent 0);
	border-radius: 50%;
	mask-image: radial-gradient(farthest-side, #0000 calc(100% - var(--metric-icon-ring-width)), #000 calc(100% - var(--metric-icon-ring-width)));
}

/* Draw the ring when it scrolls into view (JazzyScroll adds .animated-in), not
   on load. JazzyScroll only initialises for motion-OK clients, so reduced-motion
   keeps the resting filled state above. */
@media (prefers-reduced-motion: no-preference) {

	.metric-icon.type-ring.animated-in .metric-icon-glyph {
		animation: metric-icon-ring-draw 1.2s cubic-bezier(0.5, 0, 0.1, 1) forwards;
	}

}

@keyframes metric-icon-ring-draw {
	from {
		--ring-draw: 0;
	}
	to {
		--ring-draw: 1;
	}
}

/** Chart — bars climb at staggered times once the icon enters the viewport
    (JazzyScroll adds .animated-in). The keyframe is `both`-filled so each
    bar holds invisible through its stagger delay AND keeps its final scale
    after the run ends — the old `backwards` value reverted to the declared
    scaleY(0) after, so the chart vanished. Reduced-motion holds the resting
    filled state with no animation at all. **/

.metric-icon.type-chart .bar {
	fill: var(--metric-icon-accent);
	transform-box: fill-box;
	transform-origin: 50% 100%;
}

@media (prefers-reduced-motion: no-preference) {

	.metric-icon.type-chart .bar {
		transform: scaleY(0);
	}

	.metric-icon.type-chart.animated-in .bar {
		animation: metric-icon-bar-grow 0.55s cubic-bezier(0.5, 0, 0.1, 1) both;
	}

	.metric-icon.type-chart.animated-in .bar:nth-child(1) {
		animation-delay: 0.00s;
	}
	.metric-icon.type-chart.animated-in .bar:nth-child(2) {
		animation-delay: 0.08s;
	}
	.metric-icon.type-chart.animated-in .bar:nth-child(3) {
		animation-delay: 0.16s;
	}
	.metric-icon.type-chart.animated-in .bar:nth-child(4) {
		animation-delay: 0.24s;
	}
	.metric-icon.type-chart.animated-in .bar:nth-child(5) {
		animation-delay: 0.32s;
	}
	.metric-icon.type-chart.animated-in .bar:nth-child(6) {
		animation-delay: 0.40s;
	}

}

@keyframes metric-icon-bar-grow {
	from {
		transform: scaleY(0);
	}
	to {
		transform: scaleY(1);
	}
}

/** Plus — centred "+" glyph for open-ended figures ("5+", "10+"). Reveals on
    scroll with a subtle pop so the "+" lands with intent rather than as a
    static decal. **/

/* Plus shape: a thin ring framing a centred + so it reads as a badge rather
   than two bare crossed lines. Ring sits subdued (35% opacity) so the plus
   stays the focal point. */
/* fill-box so each shape scales about its own centre (32,32), not the SVG origin. */
.metric-icon.type-plus .plus,
.metric-icon.type-plus .plus-ring {
	stroke: var(--metric-icon-accent);
	transform-box: fill-box;
	transform-origin: center;
}

.metric-icon.type-plus .plus-ring {
	opacity: 0.35;
}

@media (prefers-reduced-motion: no-preference) {

	/* Ring eases in first (subtle 0.95 → 1 + fade); the plus follows after a beat. */
	.metric-icon.type-plus.animated-in .plus-ring {
		animation: metric-icon-ring-in 0.5s cubic-bezier(0.2, 0.8, 0.2, 1) both;
	}

	.metric-icon.type-plus.animated-in .plus {
		animation: metric-icon-plus-in 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) 0.2s both;
	}

}

@keyframes metric-icon-ring-in {
	from {
		opacity: 0;
		transform: scale(0.95);
	}
	to {
		opacity: 0.35;
		transform: scale(1);
	}
}

@keyframes metric-icon-plus-in {
	from {
		opacity: 0;
		transform: scale(0.95);
	}
	to {
		opacity: 1;
		transform: scale(1);
	}
}

@keyframes metric-icon-plus-pop {
	from {
		opacity: 0;
		transform: scale(0.6);
	}
	to {
		opacity: 1;
		transform: scale(1);
	}
}

/** Image — an editor-uploaded square icon (SVG recommended) shown in place of
    the generated glyph. Inset so it carries the same visual weight as the
    ring/chart/plus glyphs (which sit at ~62% of the disc), and pops in on scroll
    like the plus. **/

.metric-icon.type-image .metric-icon-glyph {
	object-fit: contain;
	padding: 18%;
}

@media (prefers-reduced-motion: no-preference) {

	.metric-icon.type-image.animated-in .metric-icon-glyph {
		animation: metric-icon-plus-pop 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) backwards;
	}

}

/** Arrow — small centred glyph overlaid on the ring/plus; .arrow-down flips
    via rotate. On the chart, the arrow moves up to the top of the tallest
    bar (right side) and rises in once the bars finish climbing. **/

.metric-icon.has-arrow .metric-icon-arrow {
	color: var(--metric-icon-arrow-color);
	height: 18px;
	position: absolute;
	width: 12px;
}

.metric-icon.arrow-down .metric-icon-arrow {
	transform: rotate(180deg);
}

/* Chart context — anchor the arrow above the target bar instead of the
   centered ring/plus position. The helper computes --arrow-x as a 0–1
   fraction of the icon width (target = first bar if there are only 2, middle
   bar otherwise) — subtracting half the arrow's width centers it on that
   bar's column. */
.metric-icon.type-chart.has-arrow .metric-icon-arrow {
	bottom: auto;
	left: calc(var(--arrow-x, 0.7) * 100% - 6px);
	right: auto;
	/* Tail sits 8px above the target bar's top — --arrow-bar-top is that bar's
	   top as a fraction of icon height; 26px = 8px gap + the 18px arrow height. */
	top: calc(var(--arrow-bar-top, 0.4) * 100% - 26px);
}

.metric-icon.type-chart.has-arrow.arrow-down .metric-icon-arrow {
	/* Pivot in place so rotate doesn't shift the anchor away from the corner. */
	transform-origin: center;
}

/* The arrow enters once the icon's main animation has finished — chart after the
   bars climb (~0.95s), ring after the stroke draws (1.2s) — with a DIRECTIONAL
   translate: up arrows rise up into place, down arrows drop down. Reduced-motion
   users get the static end-state with no animation. */
@media (prefers-reduced-motion: no-preference) {

	.metric-icon.type-ring.has-arrow .metric-icon-arrow,
	.metric-icon.type-chart.has-arrow .metric-icon-arrow {
		opacity: 0;
		transform: translateY(8px); /* up arrow: starts below, rises up */
	}

	.metric-icon.arrow-down.has-arrow .metric-icon-arrow {
		transform: translateY(-8px) rotate(180deg); /* down arrow: starts above, drops down */
	}

	.metric-icon.type-chart.has-arrow.animated-in .metric-icon-arrow {
		animation: metric-icon-arrow-rise 0.55s cubic-bezier(0.2, 0.8, 0.2, 1) 0.85s forwards;
	}

	.metric-icon.type-ring.has-arrow.animated-in .metric-icon-arrow {
		animation: metric-icon-arrow-rise 0.55s cubic-bezier(0.2, 0.8, 0.2, 1) 1.1s forwards;
	}

	.metric-icon.arrow-down.has-arrow.animated-in .metric-icon-arrow {
		animation-name: metric-icon-arrow-descend;
	}

}

@keyframes metric-icon-arrow-rise {
	from {
		opacity: 0;
		transform: translateY(8px);
	}
	to {
		opacity: 1;
		transform: translateY(0);
	}
}

@keyframes metric-icon-arrow-descend {
	from {
		opacity: 0;
		transform: translateY(-8px) rotate(180deg);
	}
	to {
		opacity: 1;
		transform: translateY(0)    rotate(180deg);
	}
}

/*** Form Styles — Demo conversion form. The same rules style two parallel
     class systems: the sample HTML's .demo-form-* names AND Gravity Forms's
     .gform_* / .gfield_* names. New form embeds get the look automatically as
     long as they use either system. ***/

/* Field wrapper — label above input, 8px gap. Vertical stack regardless of
   which class system the form uses. */
.demo-form-field,
.gfield {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xxsmall);
}

/* Field stack inside a Gravity Forms form — 24px between rows, matching the
   sample HTML's spacing-between-fields. */
.gform_fields {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-small);
}

/* Hidden fields — the .gfield flex rule above overrides Gravity Forms' own
   display:none and re-shows hidden/honeypot fields, which then open phantom
   gaps in the flex stack. Re-hide them (higher specificity beats .gfield, no
   !important needed). .hidden_label hides only the label, not the field, so
   it's deliberately NOT in this list. */
.gfield.gform_hidden,
.gfield.gfield_visibility_hidden,
.gform_validation_container {
	display: none;
}

/* First / last name row — two equal columns, 24px gutter. Sample uses
   .demo-form-row; Gravity Forms gets the same shape via --width-half on
   sibling .gfield items (handled by GF's own grid). */
.demo-form-row {
	display: grid;
	gap: var(--text-spacing-small);
	grid-template-columns: 1fr 1fr;
}

/* Field labels — targets the Gravity label class AND a plain <label> inside
   our sample wrapper. */
.gfield_label,
.demo-form-field > label {
	color: var(--black-hover);
	font-size: calc(10rem / 16);
	font-weight: 700;
	letter-spacing: 0.8px;
	line-height: calc(13 / 10);
	margin: 0;
	text-transform: uppercase;
}

/* Composite fields (Name, Address) label the group with a <legend>, which browsers
   render outside the fieldset's flex flow — so the .gfield column gap skips it.
   Space the legend to its inputs explicitly. */
.gfield_label_before_complex {
	margin-bottom: var(--text-spacing-xxsmall);
}

input[type=email],
input[type=text],
input[type=tel],
input[type=number],
input[type=url],
input[type=password],
input[type=search],
select,
textarea {
	background: var(--white);
	border: 1px solid var(--gray-light);
	border-radius: 0;
	box-sizing: border-box;
	color: var(--black);
	font-family: var(--body-font);
	font-size: calc(14rem / 16);
	font-weight: 400;
	line-height: calc(16 / 14);
	padding: 10px 10px 10px 20px;
	width: 100%;
}

/* Natural line box for the closed control — a tight explicit line-height clips the
   selected option's descenders (Chrome renders it to the line box, not the padding). */
select {
	line-height: normal;
}

/* Textarea — taller field; caret hugs the top edge instead of vertically
   centring like a single-line input would. */
textarea {
	min-height: 88px;
	padding: 15px 10px 10px 20px;
	resize: vertical;
}

/* h5bp normalize flags :invalid fields with a red background that fires on load
   for required-but-empty fields (and out-specifies the textarea skin). Keep the
   neutral skin; errors are surfaced via focus and .gfield_error instead. */
input:invalid,
select:invalid,
textarea:invalid {
	background-color: var(--white);
}

/* Select — inline SVG of a 24px gray disc with a centred filled caret, matching
   the JazzyMultiselect .caret (24px disc + caret-down.svg glyph) so native and
   filter dropdowns share one caret. Inline data URL stays crisp at any DPI
   without a separate /svgs file, and the fixed background-size prevents stretching. */
select {
	appearance: none;
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><circle cx='12' cy='12' r='12' fill='%23d4d4d2'/><path d='M15.5 11L12 14L8.5 11V10H15.5V11Z' fill='%23242b2d'/></svg>");
	background-position: right 10px center;
	background-repeat: no-repeat;
	background-size: 24px 24px;
	padding-right: 44px;
}

input[type=email]:focus,
input[type=text]:focus,
input[type=tel]:focus,
input[type=number]:focus,
input[type=url]:focus,
input[type=password]:focus,
input[type=search]:focus,
select:focus,
textarea:focus {
	border-color: var(--electric-lavender);
	outline: none;
}

/* Open-select swap — focus stands in for "open" since native <select> has no
   :open pseudo. Same gray-light disc, caret inverted. */
select:focus {
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><circle cx='12' cy='12' r='12' fill='%23d4d4d2'/><path d='M15.5 13L12 10L8.5 13V14H15.5V13Z' fill='%23242b2d'/></svg>");
}

input::placeholder,
textarea::placeholder,
select:invalid /* Mark selects required to get this 'placeholder' look. */ {
	color: var(--gray-dark);
	opacity: 1;
}

/*** Marketo forms (MktoForms2) — the embed renders a floated, inline-width layout
     on a stock blue skin, scoped to #mktoForm_<id>. Reset it to the theme's vertical
     label-above-field stack and re-skin every field type (text, select, textarea,
     checkbox/radio groups, consent). The id-scoped pieces Marketo out-specifies
     (label weight, float layout, button) are re-asserted in assets/js/script.js at
     the same id; everything else wins here at class level. ***/
.mktoForm {
	font-family: var(--body-font) !important;
	padding: 0 !important;
	width: 100% !important;
}

.mktoForm .mktoFormRow,
.mktoForm .mktoFormCol,
.mktoForm .mktoFieldDescriptor,
.mktoForm .mktoFieldWrap,
.mktoForm .mktoLogicalField {
	float: none !important;
	width: 100% !important;
}

.mktoForm .mktoFormRow {
	margin-bottom: var(--text-spacing-small) !important;
	overflow: hidden !important;
}

/* A run of checkbox rows (e.g. the MIPS consent stack) groups tighter than the
   default row rhythm — only the gaps between consecutive checkbox rows close up. */
.mktoForm .mktoFormRow:has(.mktoCheckboxList):has(+ .mktoFormRow:has(.mktoCheckboxList)) {
	margin-bottom: var(--text-spacing-xsmall) !important;
}

.mktoForm .mktoFormRow .mktoFormCol {
	min-height: 0 !important;
}

/* Marketo wraps groups in a bordered <fieldset> with a stock <legend> ("Fieldset
   Label"); strip the chrome and hide the legend (kept off-screen for AT). */
.mktoForm fieldset.mktoFormCol {
	border: 0 !important;
	margin: 0 !important;
	min-width: 0 !important;
	padding: 0 !important;
}

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

/* Spacer/gutter columns shove fields sideways — collapse them. */
.mktoForm .mktoOffset,
.mktoForm .mktoGutter,
.mktoForm .mktoClear {
	display: none !important;
}

/* Hide honeypot / anti-spam fields Marketo leaves visible. */
.mktoForm .mktoFormRow:has([name*="honeypot" i]),
.mktoForm .mktoFormRow:has([id*="honeypot" i]) {
	display: none !important;
}

/* Collapse the empty rows Marketo emits for hidden tracking inputs and unfilled
   conditional-field placeholders, so they don't stack up phantom row spacing. */
.mktoForm .mktoFormRow:has(> input[type="hidden"]),
.mktoForm .mktoFormRow:has(> .mktoPlaceholder:empty) {
	display: none !important;
}

/* Per-field instruction spans just echo the label here — drop them. */
.mktoForm .mktoInstruction {
	display: none !important;
}

/* Label above the field, matching .gfield_label. Marketo injects theme CSS scoped
   to #mktoForm_<id>, whose ID out-specifies these class-only rules, so the weight
   here can be overridden — assets/js/script.js re-injects it scoped to the id. */
.mktoForm .mktoFieldWrap .mktoLabel {
	color: var(--black-hover) !important;
	float: none !important;
	font-size: calc(10rem / 16) !important;
	font-weight: 700 !important;
	letter-spacing: 0.8px !important;
	line-height: calc(13 / 10) !important;
	margin: 0 0 var(--text-spacing-xxsmall) !important;
	padding: 0 !important;
	text-transform: uppercase !important;
	width: auto !important;
}

/* Consent / choice-group labels carry sentence text (and links), so they read as
   body copy, not the uppercase eyebrow. Also re-asserted id-scoped in script.js. */
.mktoForm .mktoFieldWrap:has(.mktoCheckboxList) .mktoLabel,
.mktoForm .mktoFieldWrap:has(.mktoRadioList) .mktoLabel {
	color: var(--black) !important;
	font-size: calc(14rem / 16) !important;
	font-weight: 400 !important;
	letter-spacing: normal !important;
	line-height: calc(20 / 14) !important;
	margin: 0 0 var(--text-spacing-xsmall) !important;
	text-transform: none !important;
}

.mktoForm .mktoLabel a {
	color: inherit;
	text-decoration: underline;
}

/* Rich-text/HTML blocks (intro copy, consent) — theme link styling; !important on
   the colour/decoration Marketo's id-scoped skin sets on anchors. */
.mktoForm .mktoHtmlText a {
	color: var(--digital-blue) !important;
	font-weight: 500;
	text-decoration: underline !important;
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
	text-underline-position: from-font;
}

.mktoForm .mktoHtmlText a:hover {
	color: var(--digital-blue-hover) !important;
	text-underline-offset: 2px;
}

/* Marketo stamps an inline per-block width (with .mktoHasWidth) — fill the column. */
.mktoForm .mktoHtmlText.mktoHasWidth {
	width: 100% !important;
}

/* Marketo floats its asterisk above the label — hide it. */
.mktoForm .mktoFieldWrap .mktoAsterix {
	display: none !important;
}

/* Text/select/textarea fill the column and take the theme's input skin (checkbox
   and radio inputs are skinned separately below). */
.mktoForm input.mktoField:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
.mktoForm select.mktoField,
.mktoForm textarea.mktoField {
	background: var(--white) !important;
	border: 1px solid var(--gray-light) !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	box-sizing: border-box !important;
	color: var(--black) !important;
	font-family: var(--body-font) !important;
	font-size: calc(14rem / 16) !important;
	height: auto !important;
	line-height: calc(16 / 14) !important;
	padding: 17px 20px 15px 20px !important;
	width: 100% !important;
}

.mktoForm textarea.mktoField {
	min-height: 88px !important;
	padding-top: 15px !important;
}

.mktoForm input.mktoField:not([type="checkbox"]):not([type="radio"]):focus,
.mktoForm select.mktoField:focus,
.mktoForm textarea.mktoField:focus {
	border-color: var(--electric-lavender) !important;
	outline: none !important;
}

/* Marketo selects — the theme's gray disc caret (matching the Form Styles select). */
.mktoForm select.mktoField {
	appearance: none !important;
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><circle cx='12' cy='12' r='12' fill='%23d4d4d2'/><path d='M15.5 11L12 14L8.5 11V10H15.5V11Z' fill='%23242b2d'/></svg>") !important;
	background-position: right 10px center !important;
	background-repeat: no-repeat !important;
	background-size: 24px 24px !important;
	line-height: normal !important;
	padding-right: 44px !important;
}

.mktoForm select.mktoField:focus {
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><circle cx='12' cy='12' r='12' fill='%23d4d4d2'/><path d='M15.5 13L12 10L8.5 13V14H15.5V13Z' fill='%23242b2d'/></svg>") !important;
}

/* Checkbox / radio groups — one option per row (control in col 1, label in col 2)
   with squared/round custom controls in the theme's ink. */
.mktoForm .mktoCheckboxList,
.mktoForm .mktoRadioList {
	align-items: center;
	column-gap: 12px;
	display: grid !important;
	float: none !important;
	grid-template-columns: 14px 1fr !important;
	justify-items: start !important;
	margin: 0 !important;
	padding: 0 !important;
	row-gap: var(--text-spacing-xxsmall);
	text-indent: 0 !important;
	width: 100% !important;
}

/* Pin the control to column 1 and its label to column 2 — Marketo's forms2.css
   hangs the label off a 1.5em left margin, which otherwise pushes the row right. */
.mktoForm .mktoCheckboxList > input,
.mktoForm .mktoRadioList > input {
	grid-column: 1 !important;
	justify-self: start !important;
	margin: 0 !important;
	padding: 0 !important;
}

.mktoForm .mktoCheckboxList > label,
.mktoForm .mktoRadioList > label {
	grid-column: 2 !important;
	margin: 0 !important;
}

.mktoForm .mktoCheckboxList input[type="checkbox"],
.mktoForm .mktoRadioList input[type="radio"] {
	appearance: none !important;
	-webkit-appearance: none !important;
	background: var(--white);
	border: 1px solid var(--gray-light) !important;
	box-shadow: none !important;
	cursor: pointer;
	height: 14px;
	margin: 0 !important;
	/* Marketo's forms2.css hides the native input (opacity:0) to draw its own box on
	   the label; we kill that box and show the styled native input instead. */
	opacity: 1 !important;
	width: 14px !important;
}

.mktoForm .mktoRadioList input[type="radio"] {
	border-radius: 50%;
}

.mktoForm .mktoCheckboxList input[type="checkbox"]:checked {
	background: var(--electric-lavender) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 10'><path d='M1 5l3.2 3.5L11 1' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></svg>") center / 10px 8px no-repeat;
	border-color: var(--electric-lavender) !important;
}

.mktoForm .mktoRadioList input[type="radio"]:checked {
	background: radial-gradient(var(--black) 0 45%, transparent 50%);
	border-color: var(--black) !important;
}

.mktoForm .mktoCheckboxList input:focus-visible,
.mktoForm .mktoRadioList input:focus-visible {
	outline: 2px solid var(--electric-lavender);
	outline-offset: 2px;
}

.mktoForm .mktoCheckboxList label,
.mktoForm .mktoRadioList label {
	color: var(--gray-dark);
	font-size: calc(12rem / 16);
	font-weight: 400;
	letter-spacing: 0.2px;
	line-height: calc(16 / 12);
	margin: 0 !important;
	text-transform: none;
}

/* Marketo draws its own control on the label's pseudo-elements — kill it so the
   theme-styled native input is the only checkbox/radio (no doubled box). */
.mktoForm input[type=checkbox] + label::before,
.mktoForm input[type=radio] + label::before,
.mktoForm input[type=checkbox] + label::after,
.mktoForm input[type=radio] + label::after {
	content: none !important;
}

/* "Are you a patient?" — the lone yes/no checkbox renders as the demo-form pill
   toggle (label left, sliding NO/YES switch right). The demo toggle is a JS-driven
   [role=switch]; a Marketo checkbox has no aria-checked to hang off, so the same
   pill is drawn on the native input via :checked. Scoped to the Marketo field name
   so the multi-select "challenges" list keeps its checkboxes. */
.mktoForm .mktoCheckboxList:has(> [name="areyouapatient"]) {
	align-items: center;
	display: flex !important;
	gap: var(--text-spacing-small);
	justify-content: space-between;
}

.mktoForm .mktoCheckboxList > label[for="areyouapatient"] {
	color: var(--black-hover);
	font-weight: 700;
	order: -1; /* label leads; the DOM-first checkbox becomes the switch on the right */
}

.mktoForm .mktoCheckboxList input[name="areyouapatient"] {
	background: var(--parchment) !important;
	border: 0 !important;
	border-radius: 30px !important;
	flex-shrink: 0;
	height: 30px !important;
	opacity: 1 !important;
	position: relative;
	width: 58px !important;
}

/* Knob — 20px circle that slides between the ends. */
.mktoForm .mktoCheckboxList input[name="areyouapatient"]::before {
	background: var(--black);
	border-radius: 50%;
	content: '';
	height: 20px;
	left: 5px;
	position: absolute;
	top: 5px;
	transition: left 0.2s ease;
	width: 20px;
}

/* NO when off, flips to YES + left side when checked. */
.mktoForm .mktoCheckboxList input[name="areyouapatient"]::after {
	color: var(--gray-dark);
	content: 'NO';
	font-size: calc(8rem / 16);
	font-weight: 700;
	letter-spacing: 0.8px;
	position: absolute;
	right: 9px;
	top: 50%;
	transform: translateY(-50%);
}

.mktoForm .mktoCheckboxList input[name="areyouapatient"]:checked {
	background: var(--electric-lavender) !important;
}

.mktoForm .mktoCheckboxList input[name="areyouapatient"]:checked::before {
	background: var(--white);
	left: 33px;
}

.mktoForm .mktoCheckboxList input[name="areyouapatient"]:checked::after {
	color: var(--white);
	content: 'YES';
	left: 9px;
	right: auto;
}

/* Validation errors — Marketo positions these absolutely with a tooltip arrow;
   drop that for simple red text under the field. */
.mktoForm .mktoError {
	bottom: auto !important;
	position: static !important;
	right: auto !important;
}

.mktoForm .mktoErrorMsg {
	background: none !important;
	border: 0 !important;
	box-shadow: none !important;
	color: #c22 !important;
	font-size: calc(12rem / 16) !important;
	margin: var(--text-spacing-xxsmall) 0 0 !important;
	padding: 0 !important;
	text-shadow: none !important;
}

.mktoForm .mktoErrorArrow {
	display: none !important;
}

/* Submit — themed primary button (matches .btn.primary). Marketo re-skins it via a
   <style> block inside the form, so script.js re-asserts this id-scoped; these
   class rules are the fallback. */
.mktoForm .mktoButtonRow {
	margin-top: 0 !important;
	width: 100% !important;
}

.mktoForm .mktoButtonWrap {
	margin-left: 0 !important;
}

.mktoForm .mktoButton {
	background: var(--black) !important;
	background-image: none !important;
	border: 0 !important;
	border-radius: 0 !important;
	color: var(--white) !important;
	cursor: pointer;
	font-family: var(--body-font) !important;
	font-size: calc(15rem / 16) !important;
	font-weight: 600 !important;
	line-height: calc(18 / 15) !important;
	padding: 19px var(--text-spacing-small) !important;
	text-transform: none !important;
	transition: background .25s ease, color .25s ease;
}

.mktoForm .mktoButton:hover,
.mktoForm .mktoButton:focus-visible {
	background: var(--black-hover) !important;
	color: var(--white) !important;
}

/* Passkey — themed password gate. Markup from functions/passkey-form.php; reuses
   .container + the global input/button styles, so this is layout/spacing only. */
.passkey {
	padding: var(--module-spacing-large) 0;
}

/* Centered on the grid, widening toward full width as the viewport shrinks. */
.passkey form {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-medium);
	grid-column: 4 / -4;
}

.passkey .field {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
}

.passkey .error {
	color: var(--error-color);
	margin: 0;
}

.passkey .btn {
	align-self: flex-start;
}

/* Checkboxes — custom 14px square, lavender fill + white tick when checked.
   Native input is reskinned via appearance:none so it keeps keyboard focus
   and form-submit semantics for free. */
.demo-form-checkboxes,
.gfield_checkbox,
.ginput_container_checkbox {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xxsmall);
}

.demo-form-checkboxes,
.ginput_container_checkbox {
	margin-top: var(--text-spacing-xxsmall);
}

.demo-form-checkboxes label,
.gfield_checkbox label,
.ginput_container_checkbox label,
.gchoice label {
	align-items: center;
	color: var(--gray-dark);
	cursor: pointer;
	display: flex;
	font-size: calc(12rem / 16);
	font-weight: 400;
	gap: 12px;
	letter-spacing: 0.2px;
	line-height: calc(16 / 12);
	margin: 0;
	text-transform: none;
}

input[type=checkbox] {
	appearance: none;
	background: transparent;
	border: 1px solid var(--gray-light);
	border-radius: 0;
	cursor: pointer;
	display: inline-block;
	flex-shrink: 0;
	height: 14px;
	margin: 0;
	position: relative;
	vertical-align: middle;
	width: 14px;
}

input[type=checkbox]:checked {
	background: var(--electric-lavender);
	border-color: var(--electric-lavender);
}

/* Tick — a 3×7px box with right + bottom white border, rotated 45deg into a
   check shape. No external glyph needed. Marketo boxes paint their own SVG check
   (.mktoCheckboxList :checked), so exclude them to avoid a doubled tick. */
input[type=checkbox]:not(.mktoField):checked::before {
	border: solid var(--white);
	border-width: 0 1.5px 1.5px 0;
	content: '';
	height: 7px;
	left: 4px;
	position: absolute;
	top: 1px;
	transform: rotate(45deg);
	width: 3px;
}

input[type=checkbox]:focus-visible {
	outline: 2px solid var(--electric-lavender);
	outline-offset: 2px;
}

/* Choice row — control + label inline (GF renders the input as a sibling of the
   label, so the row, not the label, carries the layout). */
.gchoice {
	align-items: center;
	display: flex;
	gap: var(--text-spacing-xsmall);
}

/* Radios — the checkbox control made circular, lavender dot when selected. */
.gfield_radio,
.ginput_container_radio {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xxsmall);
}

input[type=radio] {
	appearance: none;
	background: transparent;
	border: 1px solid var(--gray-light);
	border-radius: 50%;
	cursor: pointer;
	flex-shrink: 0;
	height: 14px;
	margin: 0;
	position: relative;
	width: 14px;
}

input[type=radio]:checked {
	border-color: var(--electric-lavender);
}

input[type=radio]:checked::before {
	background: var(--electric-lavender);
	border-radius: 50%;
	content: '';
	inset: 3px;
	position: absolute;
}

input[type=radio]:focus-visible {
	outline: 2px solid var(--electric-lavender);
	outline-offset: 2px;
}

/* Sub-labels (Name's First / Last and other complex fields) — small helper text. */
.ginput_complex label,
.gform-field-label--type-sub {
	color: var(--gray-dark);
	display: block;
	font-size: calc(12rem / 16);
	font-weight: 400;
	letter-spacing: 0.2px;
	margin: var(--text-spacing-xxsmall) 0 0;
	text-transform: none;
}

/* Multi-select is a listbox, not a dropdown — drop the caret and let it grow. */
select[multiple] {
	background-image: none;
	height: auto;
	padding-right: 20px;
}

/* List field — bordered Add / Delete controls instead of the raw UA button. */
.gfield_list button,
.gfield_list .add_list_item,
.gfield_list .delete_list_item {
	background: transparent;
	border: 1px solid var(--gray-light);
	border-radius: 0;
	color: var(--black);
	cursor: pointer;
	font-family: var(--body-font);
	font-size: calc(14rem / 16);
	font-weight: 600;
	padding: 8px 16px;
	width: auto;
}

/* Toggle row — eyebrow label left, pill switch right. Sample HTML uses
   .demo-form-toggle / [role=switch]; the off state is the default and the on
   state responds to aria-checked="true" — JS wiring is the form's job. */
.demo-form-toggle-row {
	align-items: center;
	display: flex;
	gap: var(--text-spacing-small);
	justify-content: space-between;
}

.demo-form-toggle-row > span:first-child {
	color: var(--black-hover);
	font-size: calc(10rem / 16);
	font-weight: 700;
	letter-spacing: 0.8px;
	line-height: calc(13 / 10);
	text-transform: uppercase;
}

/* Pill track — parchment background, 30px tall, NO/YES label inside. */
.demo-form-toggle {
	background: var(--parchment);
	border-radius: 30px;
	cursor: pointer;
	display: inline-block;
	flex-shrink: 0;
	height: 30px;
	position: relative;
	width: 58px;
}

/* Knob — 20px dark circle that slides between the two ends. */
.demo-form-toggle::before {
	background: var(--black);
	border-radius: 50%;
	content: '';
	height: 20px;
	left: 5px;
	position: absolute;
	top: 5px;
	transition: left 0.2s ease;
	width: 20px;
}

/* NO label on the right when off; flips to YES + left side when on. */
.demo-form-toggle::after {
	color: var(--gray-dark);
	content: 'NO';
	font-size: calc(8rem / 16);
	font-weight: 700;
	letter-spacing: 0.8px;
	position: absolute;
	right: 9px;
	top: 50%;
	transform: translateY(-50%);
}

.demo-form-toggle[aria-checked="true"] {
	background: var(--electric-lavender);
}

.demo-form-toggle[aria-checked="true"]::before {
	background: var(--white);
	left: 33px;
}

.demo-form-toggle[aria-checked="true"]::after {
	color: var(--white);
	content: 'YES';
	left: 9px;
	right: auto;
}

/* GF radio styled as a yes/no pill — set the "gf-yes-no-toggle" CSS class on a
   Gravity Forms radio field (Yes/No choices). Unlike .demo-form-toggle above (a
   JS-wired role=switch), this drives off the real radio inputs via :has(), so it
   needs no JS and submits actual field data. */
.gf-yes-no-toggle {
	align-items: flex-end;
	border: none;
	display: flex;
	gap: var(--text-spacing-xsmall);
	justify-content: space-between;
	margin: 0;
	padding: 0;
	width: 100%;
}

.gf-yes-no-toggle .gfield_required {
	display: none;
}

.gf-yes-no-toggle .ginput_container_radio {
	flex-shrink: 0;
}

/* Pill track. */
.gf-yes-no-toggle .gfield_radio {
	background: var(--parchment);
	border-radius: 100px;
	display: block;
	height: 28px;
	position: relative;
	width: 60px;
}

/* Each choice covers its half of the pill. */
.gf-yes-no-toggle .gchoice {
	bottom: 0;
	position: absolute;
	top: 0;
	width: 50%;
}
.gf-yes-no-toggle .gchoice:first-child { left: 0; }
.gf-yes-no-toggle .gchoice:last-child { right: 0; }

/* Invisible radio inputs sit on top and stay keyboard-focusable; native outline
   is surfaced on the pill below instead of on the transparent input. */
.gf-yes-no-toggle .gfield-choice-input {
	appearance: none;
	cursor: pointer;
	height: 100%;
	inset: 0;
	margin: 0;
	opacity: 0;
	outline: none;
	position: absolute;
	width: 100%;
	z-index: 2;
}

/* YES / NO text inside each half — knob slides over them. */
.gf-yes-no-toggle .gform-field-label--type-inline {
	align-items: center;
	display: flex;
	font-size: calc(10rem / 16);
	font-weight: 700;
	inset: 0;
	justify-content: center;
	letter-spacing: 0.5px;
	pointer-events: none;
	position: absolute;
	z-index: 1;
}

/* Knob — sits above the labels, passes clicks through to the inputs. */
.gf-yes-no-toggle .gfield_radio::before {
	background: var(--black);
	border-radius: 50%;
	content: '';
	height: 20px;
	left: 3px;
	pointer-events: none;
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	transition: left 0.2s ease;
	width: 20px;
	z-index: 3;
}

/* YES checked (first choice) — knob slides right. */
.gf-yes-no-toggle .gfield_radio:has(.gchoice:first-child input:checked)::before {
	left: calc(100% - 23px);
}

/* Keyboard focus ring on the pill (the real outline target is the invisible input). */
.gf-yes-no-toggle .gfield_radio:has(.gfield-choice-input:focus-visible) {
	outline: 2px solid var(--electric-lavender);
	outline-offset: 2px;
}

/* Submit button — full-width dark block, semibold 15/18 white label. Sample
   uses .demo-form-submit; Gravity Forms emits <button class="gform_button">
   OR <input type=submit> inside .gform_footer depending on version. */
.demo-form-submit,
.gform_button,
.gform_footer input[type=submit] {
	background: var(--black);
	border: 0;
	border-radius: 0;
	color: var(--white);
	cursor: pointer;
	display: block;
	font-family: var(--body-font);
	font-size: calc(15rem / 16);
	font-weight: 600;
	letter-spacing: 0;
	line-height: calc(18 / 15);
	min-height: 0;
	padding: 20px var(--text-spacing-small) 18px;
	text-align: center;
	transition: background 0.2s ease;
	width: 100%;
}

.demo-form-submit:hover,
.gform_button:hover,
.gform_footer input[type=submit]:hover {
	background: var(--black-hover);
}

/* Legal footnote — 11/16 medium, centred under the submit. Targets sample's
   class and Gravity's footer disclaimer. */
.demo-form-footnote,
.gform_footer_legal {
	color: var(--black);
	font-size: calc(11rem / 16);
	font-weight: 500;
	letter-spacing: 0.2px;
	line-height: calc(16 / 11);
	margin: 0;
	text-align: center;
}

.demo-form-footnote a,
.gform_footer_legal a {
	color: inherit;
	text-decoration: underline;
}

/* Patient-redirect banner — dark strip across the top of the form card. The
   production content-form module already renders a sibling .form-bar with
   matching geometry; this rule paints the sample HTML's banner when it's
   pasted directly inside .form-embed. */
.demo-form-banner {
	align-items: center;
	background: var(--black);
	color: var(--white);
	display: flex;
	font-size: calc(14rem / 16);
	font-weight: 700;
	gap: var(--text-spacing-xsmall);
	line-height: calc(24 / 14);
	padding: 12px var(--text-spacing-large);
}

.demo-form-banner a {
	color: inherit;
	font-weight: 400;
	text-decoration: underline;
}

/* Info "i" disc — white circle, dark glyph, sized to sit on the 14/24
   baseline. */
.demo-form-banner-icon {
	align-items: center;
	background: var(--white);
	border-radius: 50%;
	color: var(--black);
	display: flex;
	flex-shrink: 0;
	font-size: calc(11rem / 16);
	font-weight: 700;
	height: 18px;
	justify-content: center;
	width: 18px;
}

.demo-form-card-body {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-small);
}

/* When the sample HTML's full card sits inside a content-form embed, drop the
   embed's own padding so the banner can bleed to the panel edges and the
   body's own padding takes over. Gravity Forms output doesn't carry
   .demo-form-card, so its embed-level padding stays intact. */
.module.content-form .form-embed:has(> .demo-form-card),
.module.content-form .form-embed:has(> form.demo-form-card) {
	padding: 0;
}

/* Gravity Forms — error chrome. Header banner is dismissed in favour of
   inline messages; field-level errors get an italic red tone that still
   reads against the parchment / white card. */
.gform_validation_errors {
	display: none !important;
}

.validation_message,
.gfield_validation_message {
	color: var(--error-color);
	font-size: calc(12rem / 16);
	font-style: italic;
	padding-top: 4px;
}

.gfield_error input,
.gfield_error select,
.gfield_error textarea {
	border-color: var(--error-color);
}

/*** Lightboxes ***/

/* Literal colour, not var(--black) (kept in sync, #242b2d === --black): older
   Safari/iPadOS don't inherit custom properties into ::backdrop, so the var resolves
   invalid there and the backdrop paints transparent. */
dialog::backdrop {
	background: #242b2d;
	opacity: .75;
}

/* Patient gate — dialog opened from script.js when a visitor marks themselves a
   patient on a Marketo demo form; the shared dialog::backdrop dims behind it. */
.patient-gate {
	background: var(--white);
	border: none;
	margin: auto;
	max-width: min(90vw, 768px);
	padding: var(--text-spacing-xlarge) var(--text-spacing-xlarge);
	width: 100%;
}

.patient-gate > * + * {
	margin-top: var(--text-spacing-xsmall);
}

.patient-gate .buttons {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-small);
	margin-top: var(--text-spacing-medium);
}

.jazzy-dialog {
	background: var(--black);
	border: none;
	margin: auto;
	max-width: 80vw;
	overflow-x: clip;
	padding: 0;
	width: 100%;
}

.jazzy-dialog video,
.jazzy-dialog iframe {
	aspect-ratio: 16 / 9;
	height: auto;
	object-fit: contain;
	width: 100%;
}

.jazzy-dialog [data-jazzy-dialog-close] {
	align-items: center;
	aspect-ratio: 1;
	background: var(--gray-light);
	border: none;
	border-radius: 100%;
	display: flex;
	justify-content: center;
	padding: 0;
	position: absolute;
	right: var(--text-spacing-xxsmall);
	top: var(--text-spacing-xxsmall);
	transition: background 0.2s ease;
	width: 48px;
	z-index: 1;
}

/* 44px transparent hit area over the small close glyph — the visible chip stays
   svg-sized. Same trick as .roi-tooltip / .jazzy-dot. */
.jazzy-dialog [data-jazzy-dialog-close]::before {
	content: "";
	inset: -15px;
	position: absolute;
}

.jazzy-dialog [data-jazzy-dialog-close]:hover {
	background: var(--gray);
}

/* It takes focus when the dialog opens, so the ring has to read against both the
   media behind it and the gray chip. */
.jazzy-dialog [data-jazzy-dialog-close]:focus-visible {
	outline: 2px solid var(--digital-blue);
	outline-offset: 2px;
}

.jazzy-dialog [data-jazzy-dialog-close] svg {
	height: 14px;
	width: 14px;
}

/*** Accordions ***/

/* Stacked rows divided by a hairline. Scoped to button accordions so the
   archive's list-based li.accordion keeps its own treatment. */
.accordion:has(> button) {
	padding-block: var(--text-spacing-xsmall);
}

.accordion:has(> button) + .accordion:has(> button) {
	border-top: 1px solid color-mix(in srgb, var(--black) 15%, transparent);
}

.accordion > :is(h1, h2, h3, h4, h5, h6) {
	margin: 0;
}

/* Trigger row — title left, square toggle right. */
.accordion button {
	align-items: center;
	background: none;
	border: 0;
	cursor: pointer;
	display: flex;
	gap: var(--text-spacing-small);
	justify-content: space-between;
	padding: 0;
	text-align: left;
	width: 100%;
}

.accordion-title.longform-text.bold {
	font-weight: 500;
}

/* Square toggle — black with a white plus; flips to grey + black minus when open. */
.accordion-toggle {
	background: var(--black);
	color: var(--white);
	flex-shrink: 0;
	padding: 15px;
	transition: background 0.25s ease, color 0.25s ease;
}

.accordion.active .accordion-toggle {
	background: var(--gray-light);
	color: var(--black);
}

/* Closed (black) toggle hovers to the primary-button hover; open (grey) toggle
   hovers to the dialog close-button grey. Triggered from anywhere on the row. */
.accordion:hover .accordion-toggle {
	background: var(--black-hover);
}

.accordion.active:hover .accordion-toggle {
	background: var(--gray);
}

.accordion-toggle .expand {
	display: block;
	height: 14px;
	position: relative;
	width: 14px;
}

/* The separate minus glyph is unused — the plus's vertical bar rotates flat onto
   the horizontal one to become the minus. */
.accordion-toggle .collapse {
	display: none;
}

/* Plus drawn from two 2px currentColor bars. */
.accordion-toggle .expand::before,
.accordion-toggle .expand::after {
	background: currentColor;
	content: '';
	inset: 6px 0;
	position: absolute;
}

.accordion-toggle .expand::after {
	inset: 0 6px;
	transition: transform 0.3s ease;
}

.accordion.active .accordion-toggle .expand::after {
	transform: rotate(90deg);
}

/* Non-button accordions (the archive list) hide their panel outright; button
   accordions animate it open via grid-template-rows below. */
.accordion:not(:has(> button)):not(.active) > :nth-child(n + 2) {
	display: none;
}

/* Panel collapses to a 0fr grid row, expands to 1fr; the inner wrapper clips so
   the height animates instead of snapping. */
.accordion-panel {
	display: grid;
	grid-template-rows: 0fr;
	transition: grid-template-rows 0.35s ease;
}

.accordion.active .accordion-panel {
	grid-template-rows: 1fr;
}

.accordion-panel > * {
	min-height: 0;
	overflow: hidden;
}

/* Padding only on the open panel — it's part of the element box and overflow
   doesn't clip an element's own padding, so leaving it on a closed panel keeps
   it ~8px tall instead of collapsing flat with the 0fr grid row. */
.accordion.active .accordion-panel > * {
	padding-right: var(--text-spacing-xxlarge);
	padding-top: var(--text-spacing-xxsmall);
}

/* Boxed variant — parchment cards (gap-separated by the parent) instead of
   hairline-divided rows; the open card lightens. */
.accordion.boxed {
	background: var(--parchment);
	padding: var(--text-spacing-xsmall) var(--text-spacing-small);
	transition: background 0.25s ease;
}

.accordion.boxed.active {
	background: var(--off-white);
}

.accordion.boxed:has(> button) + .accordion.boxed:has(> button) {
	border-top: 0;
}

/* Motion off: open/close instantly, no rotate. */
@media (prefers-reduced-motion: reduce) {

	.accordion.boxed,
	.accordion-panel,
	.accordion-toggle,
	.accordion-toggle .expand::after {
		transition: none;
	}

}

/*** Content Styles ***/

/* Content links — plain (unclassed) links inside body copy: Digital Blue,
   Semibold, underlined. Scoped across the body type scale so WYSIWYG links read
   the same everywhere (SVP copy, content media, etc.) and inside the
   .content-styles rich-text wrapper. :not([class]) leaves buttons/CTAs alone.
   (On dark/blue fields a module overrides the colour — see the note below.) */
.large-text a:not([class]),
.xlarge-text a:not([class]),
.medium-text a:not([class]),
.small-text a:not([class]),
.longform a:not([class]),
.longform-text a:not([class]),
.content-styles a:not([class]) {
	color: var(--digital-blue);
	font-weight: 500;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
	text-underline-position: from-font;
}

.large-text a:not([class]):hover,
.xlarge-text a:not([class]):hover,
.medium-text a:not([class]):hover,
.small-text a:not([class]):hover,
.longform a:not([class]):hover,
.longform-text a:not([class]):hover,
.content-styles a:not([class]):hover {
	color: var(--digital-blue-hover);
	text-underline-offset: 2px;
}

/* Also match Gutenberg's <ul>/<ol class="wp-block-list">; :is() holds specificity. */
.content-styles ul:is(:not([class]), .wp-block-list),
.content-styles ol:is(:not([class]), .wp-block-list) {
	list-style: none;
	margin: var(--text-spacing-xxsmall) 0 0;
	padding: 0;
}

/* Each item is a row: a hanging bullet + the text, so wrapped lines align under
   the text rather than the bullet. */
.content-styles ul:is(:not([class]), .wp-block-list) li {
	font-weight: 400;
	padding-left: var(--text-spacing-small);
	position: relative;
}

.content-styles ul:is(:not([class]), .wp-block-list) li + li {
	margin-top: var(--text-spacing-xxsmall);
}

.content-styles ul:is(:not([class]), .wp-block-list) li::before {
	color: var(--electric-lavender);
	content: "•";
	flex-shrink: 0;
	font-weight: 950;
	left: 0;
	position: absolute;
	top: -2px;
}

.content-styles ol:is(:not([class]), .wp-block-list) {
	counter-reset: content-ol;
}

.content-styles ol:is(:not([class]), .wp-block-list) li {
	counter-increment: content-ol;
	font-weight: 400;
	padding-left: var(--text-spacing-medium);
	position: relative;
}

.content-styles ol:is(:not([class]), .wp-block-list) li + li {
	margin-top: var(--text-spacing-xxsmall);
}

.content-styles ol:is(:not([class]), .wp-block-list) li::before {
	color: var(--electric-lavender);
	content: counter(content-ol) ".";
	font-weight: 950;
	left: 0;
	position: absolute;
	top: 0;
}

/* List sits apart from surrounding body copy. (Block gap estimated — the list
   node didn't carry its own surrounding spacing.)
   Exclusions on the "after a list" selectors, all so the following element keeps
   its own rhythm rather than this tight one:
     figure — its xlarge block margin (.content-styles > figure)
     h1–h6  — the section break below; a heading after a list starts a new section
     .tile  — tiles render inline in the body, so one following a list is this
              rule's subject; it keeps its own block margin */
.content-styles * + ul:is(:not([class]), .wp-block-list),
.content-styles ul:is(:not([class]), .wp-block-list) + :not(figure, h1, h2, h3, h4, h5, h6, .tile),
.content-styles * + ol:is(:not([class]), .wp-block-list),
.content-styles ol:is(:not([class]), .wp-block-list) + :not(figure, h1, h2, h3, h4, h5, h6, .tile) {
	margin-top: var(--text-spacing-xsmall);
}

/* A heading after a list starts a new section, not a tight continuation. */
.content-styles ul:is(:not([class]), .wp-block-list) + h3:not([class^="heading-"]),
.content-styles ol:is(:not([class]), .wp-block-list) + h3:not([class^="heading-"]) {
	margin-top: var(--module-spacing-medium);
}

.content-styles .wp-block-separator {
	border: 0;
	border-top: 1px solid color-mix(in srgb, var(--black) 15%, transparent);
	margin-block: var(--text-spacing-large);
}

/* Editor blockquotes reuse the .quote-tile flex layout (in the Tiles section).
   The curly marks are wrapped in PHP like the tile, so only the cite needs
   sizing here (to match .name). */
.content-styles blockquote cite {
	font-family: var(--body-font);
	font-size: calc(14rem / 16);
	font-style: normal;
	font-weight: 700;
	line-height: calc(24 / 14);
}

/* WYSIWYG tables — editorial grid for inline content tables (e.g. the consumer
   health-data privacy policy). Hairline rules + a lavender header underline echo
   the list-marker accent; zebra striping aids row scanning in dense legal copy. */
.content-styles table {
	border: 1px solid color-mix(in srgb, var(--black) 12%, transparent);
	font-size: calc(16rem / 16);
	line-height: 1.5;
	width: 100%;
}

.content-styles table th,
.content-styles table td {
	padding: var(--text-spacing-xsmall) var(--text-spacing-small);
	text-align: left;
	vertical-align: top;
}

.content-styles table thead th {
	background: var(--parchment);
	border-bottom: 2px solid var(--electric-lavender);
	font-family: var(--heading-font);
	font-weight: 600;
}

.content-styles table tbody td {
	border-top: 1px solid color-mix(in srgb, var(--black) 12%, transparent);
}

.content-styles table tbody tr:nth-child(even) {
	background: var(--off-white);
}

.content-styles * + table,
.content-styles table + * {
	margin-top: var(--text-spacing-large);
}

.content-styles h2:not([class^="heading-"]),
.content-styles h4:not([class^="heading-"]) {
	margin-bottom: var(--text-spacing-xsmall);
}

.content-styles h3:not([class^="heading-"]) {
	margin-bottom: var(--text-spacing-xxsmall);
}

.content-styles * + h2:not([class^="heading-"]),
.content-styles * + h3:not([class^="heading-"]),
.content-styles * + h4:not([class^="heading-"]) {
	margin-top: var(--module-spacing-small);
}

/* Cascading headings (h2 → h3, h2 → h4, h3 → h4) are a subsection lockup, not
   a new section — collapse the 80px break to the lockup rhythm. */
.content-styles h2:not([class^="heading-"]) + h3:not([class^="heading-"]),
.content-styles h2:not([class^="heading-"]) + h4:not([class^="heading-"]),
.content-styles h3:not([class^="heading-"]) + h4:not([class^="heading-"]) {
	margin-top: var(--text-spacing-small);
}

/* Eyebrow section labels: a generous break before each (new section, after body
   copy), then tight onto the heading it introduces. */
.content-styles p + .eyebrow {
	margin-top: var(--text-spacing-xlarge);
}

.content-styles .eyebrow + h2:not([class^="heading-"]),
.content-styles .eyebrow + h3:not([class^="heading-"]),
.content-styles .eyebrow + h4:not([class^="heading-"]) {
	margin-top: var(--text-spacing-xsmall);
}

/* WordPress block image — strip the UA figure inset margins and stretch the
   image to its figure's column. Adjacent-sibling margins give the figure breath
   above and below from neighbouring blocks. */
.content-styles .wp-block-image {
	margin: 0;
}

.content-styles .wp-block-image img {
	display: block;
	height: auto;
	max-width: 100%;
}

.content-styles * + .wp-block-image,
.content-styles .wp-block-image + * {
	margin-top: var(--text-spacing-large);
}

.content-styles > figure {
	margin-block: var(--text-spacing-xlarge);
}

/* At the edges of the field there's no sibling to space away from — the wrapper
   owns that gap, so the xlarge above would double it. */
.content-styles > figure:first-child {
	margin-top: 0;
}

.content-styles > figure:last-child {
	margin-bottom: 0;
}

/* Migrated content: .gb-headline paragraphs are really a heading + its lead-in,
   so tuck the following paragraph up against it instead of the body rhythm. */
.content-styles p.gb-headline + p:not([class]) {
	margin-top: 4px;
}

/* WordPress block buttons — the link inherits .btn + .btn.secondary appearance
   from the shared selectors above (underline + black text + hover shift). Since
   editor markup has no inline icon, the arrow is generated as ::after — local
   to this selector so .btn.secondary elsewhere stays icon-driven via the_button(). */
.content-styles .wp-block-buttons {
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xsmall);
	margin: 0;
}

.content-styles .wp-block-button {
	margin: 0;
}

/* Editor wraps the button label in <strong> by default; inherit weight so the
   label matches the button's 600 instead of bumping to UA bold. */
.content-styles .wp-block-button .wp-block-button__link strong {
	font-weight: inherit;
}

/* Arrow — SVG masked with currentColor so it tracks the button's hover colour.
   Inline-flex on .btn means ::after participates in the parent's gap; no extra
   margin needed between label and arrow. */
.content-styles .wp-block-button .wp-block-button__link::after {
	background-color: currentColor;
	content: "";
	display: inline-block;
	height: 12px;
	mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 0 45.3 0l160-160z'/></svg>") center / contain no-repeat;
	transition: transform .2s ease;
	width: 12px;
}

.content-styles .wp-block-button .wp-block-button__link:hover::after,
.content-styles .wp-block-button .wp-block-button__link:focus-visible::after {
	transform: translateX(4px);
}

/* Tagging a block button with the editor's "Display link as a button" control adds
   .btn.primary, which asks for the solid treatment — but the block selectors above
   are (0,3,0) and .btn.primary is only (0,2,0), so on its own it silently renders as
   the underlined secondary skin. Echoing the block selector here (0,4,0) lets the
   explicit variant win. Solid buttons carry no arrow — the_button() gives one to
   .secondary only — so the generated ::after is dropped with it. */
.content-styles .wp-block-button .wp-block-button__link.primary {
	background: var(--black);
	border-bottom: 0;
	color: var(--white);
	padding: 19px var(--text-spacing-small);
}

.content-styles .wp-block-button .wp-block-button__link.primary:hover,
.content-styles .wp-block-button .wp-block-button__link.primary:focus-visible {
	background: var(--black-hover);
	color: var(--white);
	margin-right: 0;
	padding-right: var(--text-spacing-small);
}

.content-styles .wp-block-button .wp-block-button__link.primary::after {
	content: none;
}

.content-styles * + .wp-block-buttons {
	margin-top: var(--text-spacing-small);
}

/* A template-rendered .btn (tile bodies, module rich text) gets the same break
   off body copy that an editor's button block does. */
.content-styles p + .btn {
	margin-top: var(--text-spacing-small);
}

.content-styles .wp-block-buttons + * {
	margin-top: var(--text-spacing-large);
}

/** Tight — 40% less rhythm between items, scaled from each base gap so the
    differentiated spacing is preserved (e.g. dense bios in the people dialog). **/
.content-styles.tight p + p {
	margin-top: calc(12px * 0.6);
}

.content-styles.tight ul:is(:not([class]), .wp-block-list) li + li,
.content-styles.tight ol:is(:not([class]), .wp-block-list) li + li {
	margin-top: calc(var(--text-spacing-xxsmall) * 0.6);
}

.content-styles.tight * + ul:is(:not([class]), .wp-block-list),
.content-styles.tight ul:is(:not([class]), .wp-block-list) + *,
.content-styles.tight * + ol:is(:not([class]), .wp-block-list),
.content-styles.tight ol:is(:not([class]), .wp-block-list) + * {
	margin-top: calc(var(--text-spacing-small) * 0.6);
}

.content-styles.tight * + h2:not([class^="heading-"]),
.content-styles.tight * + h3:not([class^="heading-"]),
.content-styles.tight * + h4:not([class^="heading-"]) {
	margin-top: calc(var(--module-spacing-medium) * 0.6);
}

.content-styles.tight h2:not([class^="heading-"]) + h3:not([class^="heading-"]),
.content-styles.tight h2:not([class^="heading-"]) + h4:not([class^="heading-"]),
.content-styles.tight h3:not([class^="heading-"]) + h4:not([class^="heading-"]) {
	margin-top: calc(var(--text-spacing-small) * 0.6);
}

.content-styles.tight * + .wp-block-image,
.content-styles.tight .wp-block-image + * {
	margin-top: calc(var(--text-spacing-large) * 0.6);
}

.content-styles.tight * + .wp-block-buttons,
.content-styles.tight .wp-block-buttons + * {
	margin-top: calc(var(--text-spacing-large) * 0.6);
}

/* [tldr] body callout — highlighted summary box; the lavender .definition variant
   is the "definition" treatment. Single-axis: the modifier only swaps the field. */
.tldr {
	background: var(--parchment);
	margin: var(--text-spacing-large) 0;
	padding: var(--text-spacing-medium) var(--text-spacing-medium) var(--text-spacing-large);
}

.tldr.definition {
	background: var(--lavender);
}

.tldr-label {
	align-items: center;
	display: flex;
	gap: var(--text-spacing-xxsmall);
	margin: 0 0 var(--text-spacing-xsmall);
}

.tldr-label .icon {
	display: flex;
	flex-shrink: 0;
}

.tldr-label .icon svg {
	display: block;
	height: 16px;
	width: auto;
}

.tldr.definition .tldr-label {
	color: var(--electric-lavender);
}

.tldr-body > :first-child {
	margin-top: 0;
}

/* Callout tile — centred euphoric-blue card (Figma 1287:5198). Lavender heading
   with a white .highlight (the inverse of the usual on-blue treatment). */
.callout-tile {
	align-items: center;
	background: var(--euphoric-blue);
	background-size: 200% 200%, 220% 220%, 240% 240%, 100% 100%;
	color: var(--white);
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	margin: var(--text-spacing-large) 0;
	padding: var(--module-spacing-small) var(--text-spacing-xlarge);
	text-align: center;
}

@media (prefers-reduced-motion: no-preference) {

	.callout-tile.style-card {
		animation: euphoria-drift var(--euphoria-drift-duration) ease-in-out infinite;
	}

}

.callout-tile > .icon {
	display: block;
	height: 32px;
	width: 32px;
}

.callout-tile > .icon img {
	display: block;
	height: 100%;
	object-fit: contain;
	width: 100%;
}

.callout-tile > .icon svg {
	display: block;
	height: 100%;
	width: 100%;
}

.callout-tile > .icon i {
	font-size: 32px;
	line-height: 1;
}

/* The stat graphic is a disc, not a glyph — it needs the whole slot, and the
   slot has to grow to a legible size for it. */
.callout-tile > .icon:has(.metric-icon) {
	height: auto;
	width: auto;
}

.callout-tile .metric-icon {
	--metric-icon-size: 88px;
}

/* On the euphoric-blue card the default orange accent and solid grey track both
   fight the gradient — swap to the pale lavender and a translucent track so the
   card reads through it. Inline keeps the defaults on its parchment. */
.callout-tile.style-card .metric-icon {
	--metric-icon-accent: var(--lavender);
	--metric-icon-track: color-mix(in srgb, var(--track-gray) 15%, transparent);
}

/* :is() covers both sizes — the card uses .heading-5, inline steps down to
   .heading-6 (see includes/shortcodes/callout.php). */
.callout-tile :is(.heading-5, .heading-6) {
	color: var(--lavender);
	margin: 0;
}

/* Underlined rather than recoloured — the heading sits on both the blue card and
   the parchment inline, so colour alone couldn't carry the affordance on either. */
.callout-tile :is(.heading-5, .heading-6) a {
	color: inherit;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
}

.callout-tile :is(.heading-5, .heading-6) a:hover,
.callout-tile :is(.heading-5, .heading-6) a:focus-visible {
	color: var(--white);
	text-underline-offset: 2px;
}

/* Inline sits on parchment, where white is invisible — take the standard link
   hover instead of the card's brighten. */
.callout-tile.style-inline :is(.heading-5, .heading-6) a:hover,
.callout-tile.style-inline :is(.heading-5, .heading-6) a:focus-visible {
	color: var(--black-hover);
}

.callout-tile .highlight {
	color: var(--white);
}

.callout-tile .small-text {
	margin: 0;
	max-width: 672px;
}

.callout-tile .btn {
	margin-top: var(--text-spacing-xxsmall);
}

/* .content carries the text rhythm so the tile's own gap only has to space the
   icon from the copy — which is what lets the inline style run them side by side. */
.callout-tile .content {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
}

.callout-tile.style-card .content {
	align-items: center;
}

/* Inline — icon beside a short proof point, sized to sit mid-article. */
.callout-tile.style-inline {
	align-items: flex-start;
	background: var(--parchment);
	color: var(--black);
	flex-direction: row;
	gap: var(--text-spacing-small);
	padding: var(--text-spacing-large) var(--text-spacing-xlarge);
	text-align: left;
}

.callout-tile.style-inline .content {
	align-items: flex-start;
}

/* Top-aligned against the copy, nudged down to sit on the heading's cap height
   rather than its line box. */
/* .svg-inline--fa path fills with currentColor, so colouring the slot colours
   the glyph. Card keeps the inherited white; only inline goes orange. */
.callout-tile.style-inline > .icon {
	color: var(--orange);
	flex-shrink: 0;
	height: 40px;
	margin-top: var(--text-spacing-xxsmall);
	width: 40px;
}

/* Echoes the base :has() carve-out — this rule is more specific, so without it
   the 40px box would crop the disc back down. */
.callout-tile.style-inline > .icon:has(.metric-icon) {
	height: auto;
	width: auto;
}

.callout-tile.style-inline .metric-icon {
	--metric-icon-size: 64px;
}

.callout-tile.style-inline > .icon i {
	font-size: 40px;
}

.callout-tile.style-inline :is(.heading-5, .heading-6) {
	color: inherit;
}

.callout-tile.style-inline .highlight {
	color: var(--orange);
}

/* FAQ tile — heading over the global accordion stack (Figma 1270:7863). */
.faq-tile {
	margin: var(--text-spacing-large) 0;
}

.faq-tile > .heading-3 {
	margin: 0 0 var(--text-spacing-small);
}

/* Stat tile — big orange figure + body beside a graphic (orbit or metric icon),
   hairline rules (Figma 648:2240). */
.stat-tile {
	align-items: center;
	border-block: 1px solid color-mix(in srgb, var(--black) 15%, transparent);
	display: flex;
	gap: var(--text-spacing-xlarge);
	margin-block: var(--text-spacing-xxlarge);
	padding-block: var(--text-spacing-xlarge);
}

.stat-tile .graphic {
	align-items: center;
	display: flex;
	flex-shrink: 0;
	justify-content: center;
	width: 225px;
}

.stat-tile .graphic .metric-icon {
	--metric-icon-size: 160px;
}

.stat-tile .number {
	color: var(--orange);
	margin: 0;
}

/* The tile's orbit is 225px against SVP's full column, so the global .big-stat
   (114px) would overflow the ring — scale to the graphic's container instead. */
.stat-tile .big-stat-number {
	font-size: clamp(calc(24rem / 16), 20cqw, calc(48rem / 16));
	line-height: 1.1;
}

/* Takeaways tile — parchment panel, lavender check badge per line (Figma 658:2377). */
.takeaways-tile {
	background: var(--parchment);
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-medium);
	margin: var(--text-spacing-large) 0;
	padding: var(--text-spacing-xxlarge) var(--text-spacing-xlarge);
}

.takeaways-tile > .heading-5 {
	margin: 0;
}

.takeaways-tile .checks {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	list-style: none;
	margin: 0;
	padding: 0;
}

.takeaways-tile .checks li {
	align-items: flex-start;
	display: flex;
	gap: 12px;
}

.takeaways-tile .check {
	align-items: center;
	aspect-ratio: 1;
	background: var(--lavender);
	border-radius: 50%;
	color: var(--black);
	display: flex;
	flex-shrink: 0;
	justify-content: center;
	margin: 2px 0 0;
	width: 32px;
}

.takeaways-tile .check svg {
	display: block;
	height: auto;
	width: 100%;
}

/* Transcript tile — speaker/timestamp in a hanging gutter beside each turn. */
.transcript-tile {
	margin: var(--text-spacing-large) 0;
}

.transcript-tile > .heading-5 {
	margin: 0 0 var(--text-spacing-small);
}

.transcript-tile .turn {
	column-gap: var(--gap);
	display: grid;
	grid-template-columns: 120px 1fr;
}

.transcript-tile .meta {
	align-items: flex-start;
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.transcript-tile .media {
	aspect-ratio: 1;
	background: var(--gray-light);
	border-radius: 50%;
	display: block;
	margin-bottom: 4px;
	overflow: hidden;
	position: relative;
	width: 40px;
}

.transcript-tile .media img {
	height: 100%;
	inset: 0;
	object-fit: cover;
	position: absolute;
	width: 100%;
}

/* Type comes from the tile's own scale; this is layout + tint only. */
.transcript-tile .initials {
	align-items: center;
	color: var(--gray-dark);
	display: flex;
	font-size: calc(14rem / 16);
	inset: 0;
	justify-content: center;
	position: absolute;
}

/* Tabular figures keep the times aligned down the gutter. */
.transcript-tile .timestamp {
	color: var(--gray-dark);
	font-variant-numeric: tabular-nums;
}

/* References tile — parchment panel, lavender-numbered citation list (Figma 662:2781). */
.references-tile {
	background: var(--parchment);
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	margin: var(--text-spacing-large) 0;
	padding: var(--text-spacing-medium) var(--text-spacing-medium) var(--text-spacing-large);
}

.references-tile > .eyebrow {
	margin: 0;
}

.references-tile ol {
	counter-reset: citation;
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	list-style: none;
	margin: 0;
	padding: 0;
}

.references-tile li {
	align-items: flex-start;
	counter-increment: citation;
	display: flex;
	font-size: calc(12rem / 16);
	gap: 2px;
	letter-spacing: 0.2px;
	line-height: calc(16 / 12);
}

.references-tile li::before {
	color: var(--electric-lavender);
	content: counter(citation);
	flex-shrink: 0;
	font-weight: 700;
	min-width: 15px;
}

/* A source link is part of the citation, not body copy — it keeps the underline
   affordance but drops the blue. Classed in clean_citation() so the body-link
   rules skip it, which is why one class is enough here. */
.cite-link {
	color: var(--black);
}

.cite-link:hover,
.cite-link:focus-visible {
	color: var(--black-hover);
}

/* Blockquote tile — pull quote on the global .quote type, testimonials-style
   attribution. Editor blockquotes reuse this layout. */
.quote-tile,
.content-styles blockquote {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	/* Hung quotes: the opening mark sits in the gutter so the copy stays optically
	   flush with the column. Only works because the marks are real text (wrapped in
	   PHP) rather than ::before content. Inherited, so the paragraphs pick it up.
	   Safari only — see the fallback below for everyone else. */
	hanging-punctuation: first;
	margin: var(--text-spacing-large) 0;
}

/* Chrome and Firefox don't implement hanging-punctuation, so pull the first line
   out by roughly the opening mark's width instead. Safe to apply blind: both
   paths guarantee the mark is the first character — the tile wraps it, and
   quote_editor_blockquotes() prepends it to the first paragraph. In em so it
   tracks the quote's type size. */
@supports not (hanging-punctuation: first) {

	.quote-tile > .quote,
	.content-styles blockquote > p:first-of-type {
		text-indent: -0.42em;
	}

}

/* height stated as well as aspect-ratio: as a grid item Safari resolves the
   ratio against the stretched row rather than the width, so the circle ovals. */
.quote-tile .photo {
	aspect-ratio: 1;
	border-radius: 50%;
	flex-shrink: 0;
	height: 48px;
	overflow: hidden;
	width: 48px;
}

.quote-tile .photo img {
	height: 100%;
	object-fit: cover;
	width: 100%;
}

.quote-tile .attribution {
	display: flex;
	flex-direction: column;
}

/* With a headshot the footer becomes a row: photo left, name over role right.
   Grid rather than a wrapper div keeps the markup flat, and :has() means the
   photoless case keeps the plain column above (no phantom first-column gap). */
.quote-tile .attribution:has(.photo) {
	align-items: center;
	column-gap: var(--text-spacing-xsmall);
	display: grid;
	grid-template-columns: auto 1fr;
}

.quote-tile .attribution .photo {
	grid-row: 1 / span 2;
}

.quote-tile .attribution :is(.name, .role) {
	grid-column: 2;
}

.quote-tile .name {
	font-style: normal;
	font-weight: 700;
}

.quote-tile .role {
	color: var(--meta-gray);
}

/* Long CTA tile — lavender panel, rich body, centered button (Figma 1291:5240). */
.long-cta-tile {
	background: var(--lavender);
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	margin: var(--text-spacing-large) 0;
	padding: var(--text-spacing-xlarge);
}

.long-cta-tile > .heading-5 {
	margin: 0;
}

.long-cta-tile .content-styles ul li::marker {
	color: var(--electric-lavender);
}

.long-cta-tile .btn {
	align-self: center;
}

/* Media & CTA tile — media beside a centered heading / subhead / button (Figma 1291:5241). */
.media-cta-tile {
	align-items: stretch;
	background: var(--parchment);
	display: grid;
	grid-template-columns: minmax(0, 340px) 1fr;
	margin: var(--text-spacing-large) 0;
}

.media-cta-tile .media {
	aspect-ratio: auto;
	height: 100%;
}

/* Whitepaper / PDF cover — shown whole rather than cropped to the frame. */
.media-cta-tile .media.document > img,
.media-cta-tile .media.document > picture > img {
	object-fit: contain;
	padding: var(--text-spacing-xsmall);
}

.media-cta-tile .content {
	align-items: center;
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xxsmall);
	justify-content: center;
	padding: var(--text-spacing-large);
	text-align: center;
}

.media-cta-tile .content > * {
	margin: 0;
}

.media-cta-tile p + .btn {
	margin-top: var(--text-spacing-xsmall);
}

/* Media tile — single frame or a slide carousel (Figma 642:2769). */
.media-gallery-tile {
	margin: var(--text-spacing-large) 0;
	position: relative;
}

.media-gallery-tile .slide {
	margin: 0;
}

.media-gallery-tile .media {
	aspect-ratio: 16 / 9;
}

.media-gallery-tile .caption {
	margin: var(--text-spacing-xsmall) 0 0;
}

/* Inset from the photo's bottom-right corner (Figma 642:2751). Colour comes from
   the global .jazzy-arrows.gray modifier on the nav, not from here. */
.media-gallery-tile.is-carousel .jazzy-arrows {
	bottom: var(--text-spacing-xxsmall);
	position: absolute;
	right: var(--text-spacing-xxsmall);
}

/* Inline citation marker — superscript orange number linking to its entry. */
.ref-marker {
	font-weight: 700;
}

/* Both reference links carry a class purely so `a:not([class])` in the body-link
   rules stops matching, and both are named in the .longform underline exemption
   above — so plain declarations hold with no !important. */
.ref-marker-link,
.ref-backref {
	color: var(--black);
	text-decoration: none;
}

/* References — auto-appended numbered list at the foot of the article body. */
.references {
	border-top: 1px solid color-mix(in srgb, var(--black) 15%, transparent);
	margin-top: var(--module-spacing-medium);
	padding-top: var(--text-spacing-large);
}

.references-list {
	list-style: none;
	margin: var(--text-spacing-small) 0 0;
	padding: 0;
}

.references-list li {
	display: flex;
	gap: var(--text-spacing-xxsmall);
	padding-block: var(--text-spacing-xsmall);
}

.references-list li + li {
	border-top: 1px solid color-mix(in srgb, var(--black) 8%, transparent);
}

.ref-num {
	color: var(--orange);
	flex-shrink: 0;
	font-weight: 900;
}

.ref-cite {
	color: var(--meta-gray);
}

.alignleft {
	float: left;
	margin-right: var(--text-spacing-xsmall);
}

.alignright {
	float: right;
	margin-left: var(--text-spacing-xsmall);
}

.aligncenter {
	display: block;
	margin: 0 auto var(--text-spacing-small);
}

.alignnone {
	display: block;
	margin: 0 0 var(--text-spacing-small);
}

.wp-caption {
	max-width: 100%;
}

/***************************************************************************************************************************************************************************************/
/* HEADER STYLES */
/***************************************************************************************************************************************************************************************/

/* Sticky header. Interior pages stick in flow; an overlay nav — on-dark over a
   dark hero, on-light over a light one — is fixed above the hero, which reserves
   --header-height. on-light keeps the default dark text; only the position differs. */
#header {
	position: sticky;
	top: 0;
	z-index: 100;
}

#header:has(.primary-nav.on-dark),
#header:has(.primary-nav.on-light) {
	left: 0;
	position: fixed;
	right: 0;
}

/* The two overlay modes are exactly when the header leaves the flow above, so this
   is the one place a hero's top padding is owed the header's height. Derived from
   the rendered nav rather than the hero's bg, so no module re-derives the bg
   whitelist that header_overlay_mode() already owns. */
body:has(.primary-nav.on-dark),
body:has(.primary-nav.on-light) {
	--header-clearance: var(--header-height);
}

.primary-nav {
	position: relative;
	transition: background 0.25s ease;
}

.primary-nav .container-full {
	align-items: center;
	display: flex;
	gap: var(--text-spacing-small);
	justify-content: space-between;
	padding-top: var(--text-spacing-medium);
	transition: transform .3s ease;
}

/* Stuck only — tighten the nav up by 16px (cosmetic; the box stays the same). */
.primary-nav.is-stuck {
	background: var(--white);
}

.primary-nav.is-stuck .container-full {
	transform: translateY(-16px);
}

.alert-bar.desktop-only ~ .primary-nav {
	margin-top: 38px;
}

.logo-mark,
.logo-mark:hover {
	color: var(--black);
	flex-shrink: 0;
	transition: color .3s ease;
}

/* Landing pages: the logo is a non-clickable brand mark. */
.primary-nav.landing .logo-mark {
	cursor: default;
}

.logo-img,
.logo-mark svg {
	display: block;
	height: 48px;
	width: auto;
}

/*** Primary Nav Links ***/

.primary-links {
	align-items: center;
	display: flex;
	gap: var(--text-spacing-medium);
	margin: 0 auto;
}

.primary-links > .menu-item > a,
.primary-links > .menu-item > button {
	align-items: center;
	background: none;
	border: 0;
	color: var(--black);
	cursor: pointer;
	display: flex;
	font-size: calc(14rem / 16);
	font-weight: 500;
	gap: 4px;
	line-height: calc(17 / 14);
	padding: 0;
	transition: color .3s ease;
}

.primary-links > .menu-item:hover > a,
.primary-links > .menu-item:hover > button {
	color: var(--black-hover);
}

.primary-links .menu-caret {
	display: block;
	flex-shrink: 0;
	position: relative;
	top: 1px;
}

.primary-links .menu-caret svg {
	display: block;
	height: 4px;
	width: 7px;
}

/*** Megamenu Dropdowns ***/

.primary-links .menu-item-has-children {
	position: relative;
}

.primary-nav .megamenu {
	background: var(--white);
	box-shadow: var(--shadow-dropdown);
	left: -32px;
	opacity: 0;
	pointer-events: none;
	position: absolute;
	top: calc(100% + var(--text-spacing-small) - 1px);
	transform: translate3d(0, 6px, 0);
	/* visibility flips after the fade on close (delayed hide) but instantly on open
	   (.active override below) so the panel is focusable the moment JS moves focus in. */
	transition: opacity .2s ease, transform .2s ease, visibility 0s .2s;
	visibility: hidden;
	width: max-content;
	z-index: 90;
}

/* Transparent bridge so the cursor doesn't lose hover crossing the trigger gap. */
.primary-nav .megamenu::before {
	bottom: 100%;
	content: '';
	height: calc(var(--text-spacing-small) - 1px);
	left: 0;
	position: absolute;
	right: 0;
}

.primary-nav .megamenu.outcomes {
	left: -24px;
}

/* Wide two-column card sits under a right-side trigger; pull left to stay in viewport. */
.primary-nav .megamenu.split {
	left: -222px;
}

/* JS owns the open state (.active) for both hover and keyboard — a single
   source of truth so Escape/focus-out reliably close. No :hover/:focus-within
   opener (those kept the panel open against the trigger on Escape). */
.primary-links .menu-item-has-children.active > .megamenu {
	opacity: 1;
	pointer-events: auto;
	transform: translate3d(0, 0, 0);
	transition: opacity .2s ease, transform .2s ease, visibility 0s 0s;
	visibility: visible;
}

/* Caret flips open. */
.primary-links .menu-caret svg {
	transition: transform .2s ease;
}

.primary-links .menu-item-has-children.active .menu-caret svg {
	transform: rotate(180deg);
}

/* Outcomes + compact share a single-column panel — the panel IS the column. */
.megamenu.outcomes,
.megamenu.compact {
	display: flex;
	flex-direction: column;
	min-width: 240px;
	padding: var(--text-spacing-xsmall);
}

.megamenu.split {
	display: flex;
}

/* Padding lives on each .col so the tinted right column bleeds to the card edge. */
.megamenu.split .col {
	display: flex;
	flex-direction: column;
	min-width: 240px;
	padding: var(--text-spacing-xsmall);
}

.megamenu.split .col.tint {
	background: var(--off-white);
}

.megamenu a {
	color: inherit;
	display: block;
	padding: 12px var(--text-spacing-xsmall);
	transition: background .2s ease;
}

.megamenu a:hover,
.megamenu a:focus-visible {
	background: var(--parchment);
}

/* Keyboard focus indicator: the <a> is focused, not its inner .btn.tertiary span,
   so the global .btn:focus-visible never fires. The outline carries it on any
   column background (the tint / outcomes columns drop the fill). */
.megamenu a:focus-visible {
	outline: 2px solid var(--digital-blue);
	outline-offset: -2px;
}

.megamenu.split .col.tint a:hover,
.megamenu.split .col.tint a:focus-visible {
	background: transparent;
}

.megamenu a span {
	display: flex;
}

/* Title-only outcomes tighten to a fill-less list; rows with a description keep the default. */
.megamenu.outcomes:not(:has(.xsmall-text)) {
	padding: var(--text-spacing-xsmall) var(--text-spacing-small);
}

.megamenu.outcomes:not(:has(.xsmall-text)) a {
	padding: var(--text-spacing-xxsmall) 0;
}

.megamenu.outcomes:not(:has(.xsmall-text)) a:hover,
.megamenu.outcomes:not(:has(.xsmall-text)) a:focus-visible {
	background: transparent;
}

/* Block is what's hovered/focused, not the span — cascade the title color. */
.megamenu a:hover .btn.tertiary,
.megamenu a:focus-visible .btn.tertiary {
	color: var(--digital-blue-hover);
}

/* Override the global's always-on arrow with hover-only; reserve space via
   opacity so the title doesn't shift when the arrow appears. */
.megamenu a .btn.tertiary::after {
	opacity: 0;
	transform: translateX(-4px);
	transition: opacity .2s ease, transform .2s ease;
}

.megamenu a:hover .btn.tertiary::after,
.megamenu a:focus-visible .btn.tertiary::after {
	opacity: 1;
	transform: translateX(0);
}

.megamenu a > .xsmall-text {
	color: var(--meta-gray);
	display: block;
	margin-top: var(--text-spacing-xxsmall);
}

.megamenu .eyebrow.small {
	color: var(--meta-gray);
	padding: 0 var(--text-spacing-xsmall) var(--text-spacing-xxsmall);
	position: relative;
}

.megamenu .eyebrow.small::after {
	background: color-mix(in srgb, var(--black) 15%, transparent);
	bottom: 0;
	content: '';
	display: block;
	height: 1px;
	left: var(--text-spacing-xsmall);
	position: absolute;
	right: var(--text-spacing-xsmall);
	width: 100%;
	width: calc(100% - var(--text-spacing-xsmall) * 2);
}

/* Compact strips row padding + hover fill — bare title list. */
.megamenu.compact {
	gap: var(--text-spacing-xsmall);
	padding: var(--text-spacing-small);
}

.megamenu.compact a {
	padding: 0;
}

.megamenu.compact a:hover {
	background: none;
}

/*** Header CTAs ***/

.primary-right {
	display: flex;
	flex-shrink: 0;
	gap: var(--text-spacing-xsmall);
}

/* Shorter header CTAs — trim the small buttons' vertical padding here only,
   leaving the shared .btn.primary/.small padding untouched elsewhere. */
#header .primary-right .btn {
	padding-block: 13px;
}

/*** Header — On Dark (overlays a dark hero, e.g. the homepage) ***/

#header:not(.active) .primary-nav.on-dark:not(.is-stuck) .logo-mark,
#header:not(.active) .primary-nav.on-dark:not(.is-stuck) .mobile-menu,
#header:not(.active) .primary-nav.on-dark:not(.is-stuck) .primary-links > .menu-item > a,
#header:not(.active) .primary-nav.on-dark:not(.is-stuck) .primary-links > .menu-item > button {
	color: var(--white);
}

.primary-nav.on-dark .primary-links > .menu-item:hover > a,
.primary-nav.on-dark .primary-links > .menu-item:hover > button {
	color: var(--white-hover);
}

/*** Header — Stuck (scrolled off the hero; the overlay flips to a solid skin) ***/

/* White skin as an overrunning ::before — fades in when stuck and overflows the
   header by one step to fake bottom padding without changing its height/offset. */
.primary-nav.on-dark::before {
	background: var(--white);
	content: '';
	height: 100%;
	left: 0;
	opacity: 0;
	pointer-events: none;
	position: absolute;
	right: 0;
	top: 0;
	transition: opacity .3s ease;
	z-index: -1;
}

.primary-nav.on-dark.is-stuck::before {
	opacity: 1;
}

.primary-nav.on-dark.is-stuck .logo-mark,
.primary-nav.on-dark.is-stuck .primary-links > .menu-item > a,
.primary-nav.on-dark.is-stuck .primary-links > .menu-item > button {
	color: var(--black);
}

.primary-nav.on-dark.is-stuck .primary-links > .menu-item:hover > a,
.primary-nav.on-dark.is-stuck .primary-links > .menu-item:hover > button {
	color: var(--black-hover);
}

/* CTAs drop the .light treatment so they stay legible on the solid header. */
.primary-nav.on-dark.is-stuck .btn.primary.light {
	background: var(--black);
	color: var(--white);
}

.primary-nav.on-dark.is-stuck .btn.primary.light:hover {
	background: var(--black-hover);
	color: var(--white);
}

.primary-nav.on-dark.is-stuck .btn.outline.light {
	color: var(--black);
}

.primary-nav.on-dark.is-stuck .btn.outline.light:hover {
	background: var(--black);
	border-color: var(--black);
	color: var(--white);
}

/*** Nav Context — scroll-swap label (JS toggles .is-context on .primary-nav) ***/

/* Links and label share one grid cell so they crossfade in place — no reflow. */
.nav-swap {
	display: grid;
	flex: 1;
}

.nav-swap > .primary-links,
.nav-swap > .nav-context {
	grid-area: 1 / 1;
	transition: opacity .3s ease, transform .3s ease, visibility .3s;
}

.nav-context {
	align-items: center;
	color: var(--black);
	display: flex;
	justify-self: start;
	letter-spacing: -0.1px;
	opacity: 0;
	pointer-events: none;
	transform: translateX(-6px);
	visibility: hidden;
}

/* Swap — links slide/fade out, label slides/fades in (subtle, opposite directions). */
.primary-nav.is-context .primary-links {
	opacity: 0;
	pointer-events: none;
	transform: translateX(6px);
	visibility: hidden;
}

.primary-nav.is-context .nav-context {
	opacity: 1;
	pointer-events: auto;
	transform: translateX(0);
	visibility: visible;
}

.nav-context-predicate {
	color: var(--orange);
	font-weight: 500;
	margin-left: 4px;
}

/* Rotating predicate — words stack in one cell and crossfade. */
.nav-context-rotator {
	display: inline-grid;
	margin-left: 4px;
	vertical-align: baseline;
}

.nav-context-word {
	color: var(--orange);
	grid-area: 1 / 1;
	opacity: 0;
	transform: translateY(0.3em);
	transition: opacity 350ms ease, transform 500ms cubic-bezier(0.2, 0.8, 0.2, 1);
}

.nav-context-word.is-active {
	opacity: 1;
	transform: translateY(0);
}

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

	.nav-context-word {
		transform: none;
		transition: none;
	}

}

/*** Alert Bar ***/

.alert-bar {
	background: var(--black);
	color: var(--white);
	left: 0;
	margin: 0;
	overflow-x: auto;
	overflow-y: hidden;
	padding: var(--text-spacing-xxsmall) var(--container-outer-padding);
	position: absolute;
	text-align: center;
	top: 0;
	white-space: nowrap;
	width: 100%;
	z-index: 4;
}

/*** Mobile Menu ***/

.mobile-menu {
	display: none;
}

/***************************************************************************************************************************************************************************************/
/* FOOTER STYLES */
/***************************************************************************************************************************************************************************************/

.site-footer {
	background: var(--parchment);
	display: flex;
	flex-direction: column;
	gap: var(--module-spacing-xlarge);
	isolation: isolate;
	overflow: clip;
	padding: var(--module-spacing-medium) var(--module-spacing-medium) var(--text-spacing-xlarge);
	position: relative;
}

/* Decorative circle cluster, bottom-right, behind the footer content
   (isolation + z-index:-1 keeps it above the parchment, below everything else). */
.site-footer::after {
	background: url('assets/svgs/footer-circles.svg') no-repeat;
	bottom: 0;
	content: '';
	height: 412px;
	pointer-events: none;
	position: absolute;
	right: 0;
	width: 412px;
	z-index: -1;
}

/* Landing pages: condensed footer — centered copyright only, no columns or
   decorative cluster. */
.site-footer.landing {
	gap: 0;
	padding-block: var(--text-spacing-large);
	text-align: center;
}

.site-footer.landing::after {
	display: none;
}

.site-footer.landing .bottom,
.site-footer.landing .legal {
	justify-content: center;
}

/*** Footer Top — Brand + Columns ***/

.site-footer .top {
	display: flex;
	gap: var(--text-spacing-large);
}

.site-footer .brand {
	display: flex;
	flex-direction: column;
	flex-shrink: 0;
	gap: var(--text-spacing-small);
}

.site-footer .logo img {
	display: block;
	height: 48px;
	width: auto;
}

.site-footer .tagline {
	font-size: calc(14rem / 16);
	font-weight: 400;
	letter-spacing: 0.2px;
	line-height: calc(24 / 14);
	max-width: 311px;
}

.site-footer .columns {
	display: flex;
	gap: var(--module-spacing-medium);
	margin-left: auto;
	padding-top: var(--text-spacing-xsmall);
}

.site-footer .col {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-small);
	width: 166px;
}

/* Column label rides the global .eyebrow.small; footer tightens the tracking and line-height. */
.site-footer .eyebrow {
	letter-spacing: 1px;
	line-height: calc(13 / 11);
}

.site-footer .menu {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
}

.site-footer .menu a {
	color: var(--black);
	display: block;
	font-size: calc(14rem / 16);
	font-weight: 500;
	line-height: calc(17 / 14);
}

.site-footer .menu a:hover {
	color: var(--black-hover);
}

/*** Footer Bottom — Copyright + Legal/Utility Links ***/

.site-footer .bottom {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xsmall) var(--text-spacing-large);
	justify-content: space-between;
}

.site-footer .legal,
.site-footer .utility {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xsmall);
}

/* External glyph before any footer link that opens in a new tab — the Legal +
   utility bars and the column menus alike. Keyed on target (not rel="noopener"):
   the column menus are default wp_nav_menu output and carry only target="_blank".
   Masked so it inherits the link colour via currentColor. */
.site-footer .legal a[target="_blank"]::before,
.site-footer .utility a[target="_blank"]::before,
.site-footer .columns a[target="_blank"]::before {
	background-color: currentColor;
	content: '';
	display: inline-block;
	height: 8px;
	margin-right: 4px;
	mask: url('assets/svgs/external-link.svg') center / contain no-repeat;
	width: 8px;
}

.site-footer .copyright {
	font-size: calc(11rem / 16);
	font-weight: 500;
	letter-spacing: 0.2px;
	line-height: calc(16 / 11);
	white-space: nowrap;
}

/*** Sticky Toast ***/

.sticky-toast {
	background: var(--black);
	bottom: 10px;
	box-shadow: var(--shadow-strong);
	color: var(--white);
	max-width: calc(100% - 20px);
	opacity: 1;
	padding: var(--text-spacing-medium);
	pointer-events: auto;
	position: fixed;
	right: 10px;
	transition: opacity .1s ease, visibility .1s ease;
	visibility: visible;
	width: 360px;
	z-index: 99;
}

.sticky-toast.hidden {
	opacity: 0;
	pointer-events: none;
	visibility: hidden;
}

.sticky-toast button {
	background: none;
	border: none;
	border-radius: 0;
	color: var(--white);
	font-size: calc(18rem/16);
	line-height: 0;
	padding: 9px 12px;
	position: absolute;
	right: 5px;
	top: 5px;
}

.sticky-toast button:hover {
	opacity: .6;
}

.sticky-toast h2,
.sticky-toast p {
	margin-bottom: var(--text-spacing-xxsmall);
}

/***************************************************************************************************************************************************************************************/
/* DEFAULT PAGE STYLES */
/***************************************************************************************************************************************************************************************/

.page-content {
	padding: var(--module-spacing-large) 0;
}

/* The hero already supplies the top break — don't stack the section padding on it. */
.module.hero.style-simple + .page-content {
	padding-top: 0;
}

.page-content article {
	grid-column: 3 / span 8;
}

.page-content article h1 {
	margin-bottom: var(--text-spacing-small);
}

/*** 404 Page — centered brand band (no Figma; interprets the demo-CTA pattern) ***/

.error-404 {
	isolation: isolate;
	overflow-x: clip;
	padding-block: var(--module-spacing-xlarge);
	position: relative;
}

/* Soft brand-orange glow rising from the bottom — echoes the demo CTA's field. */
.error-404::after {
	background: radial-gradient(60% 100% at 50% 100%, color-mix(in srgb, var(--orange) 28%, transparent) 0%, transparent 70%);
	content: "";
	height: 320px;
	inset: auto 0 0;
	pointer-events: none;
	position: absolute;
	z-index: -1;
}

.error-404 .container.grid {
	justify-items: center;
	row-gap: var(--text-spacing-xsmall);
	text-align: center;
}

.error-404-code {
	color: var(--orange);
	grid-column: 1 / -1;
}

.error-404 .heading-2 {
	grid-column: 1 / -1;
	margin: var(--text-spacing-xsmall) 0 0;
}

.error-404 .large-text {
	grid-column: 3 / -3;
}

.error-404 .buttons {
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-medium);
	grid-column: 1 / -1;
	justify-content: center;
	margin-top: var(--text-spacing-small);
}

/***************************************************************************************************************************************************************************************/
/* PAGE BUILDER STYLES */
/***************************************************************************************************************************************************************************************/

.module.margin-spacing-small {
	margin-top: var(--module-spacing-small);
}

.module.margin-spacing-medium {
	margin-top: var(--module-spacing-medium);
}

.module.margin-spacing-large {
	margin-top: var(--module-spacing-large);
}

.module.margin-spacing-xlarge {
	margin-top: var(--module-spacing-xlarge);
}

/* Contain breakouts/bleeds so they never trigger a page-level horizontal scrollbar.
   Scoped to #main, not the page-builder section: single.php and author.php bleed too
   (the .article-author band, .article-hero), and an unclipped overshoot there leaves
   iOS holding a horizontal scroll offset across an orientation change. clip, never
   hidden — hidden would make #main a scroll container and strand the sticky menu. */
#main {
	overflow-x: clip;
}

.page-builder .module:last-child:not() {
	margin-bottom: var(--module-spacing-xlarge);
}

/* Only an inset .bg-field strip needs breath off the hero; an open stats row has
   no colour edge, so it sits flush against the video. */
.module.hero.style-video-bg + .module.stats:has(> .bg-field) {
	margin-top: var(--text-spacing-small);
}

/* bg-field rhythm — any time an inset .bg-field card sits next to another
   colored section (in either direction, including bg-field next to bg-field),
   the two color bands kiss. 24px breath so the card reads as its own block.
   Skipped when the neighbour is .bg-default — no color edge to soften. */
.module[class*="bg-"]:not(.bg-default) + .module:has(> .bg-field),
.module:has(> .bg-field) + .module[class*="bg-"]:not(.bg-default) {
	margin-top: var(--text-spacing-small);
}

/* …except a logo-garden awards parchment band flows straight into a following
   parchment section — same colour, so they merge with no breath between them. */
.module.logo-garden.style-awards.bg-parchment + .module.bg-parchment {
	margin-top: 0;
}

/* Foot of the page — the last module runs straight into the footer. One that paints
   a colour (an inset .bg-field, or a bg-* class on the section itself) already carries
   its own band padding; a transparent one has none and would sit flush, so give it a
   foot. Padding, not margin, so it can't collapse into the footer's own spacing. */
.page-builder > .module:last-child:not(:has(> .bg-field)):not([class*="bg-"]:not(.bg-default)) {
	padding-bottom: var(--module-spacing-xlarge);
}

/* …and an inset .bg-field band wants the same gutter under it as it has at its sides,
   so the last one doesn't run its bottom edge flush into the footer. Dropped at 1400,
   where the inset goes to 0 and the band bleeds full-width (no gutter to match). */
.page-builder > .module:last-child:has(> .bg-field) {
	margin-bottom: var(--text-spacing-small);
}

/***************************************************************************************************************************************************************************************/
/* ARCHIVE STYLES */
/***************************************************************************************************************************************************************************************/

/*** Archive Content ***/

.archive-content {
	padding-bottom: var(--module-spacing-large);
}

.archive-content .grid > form {
	grid-column: span 3;
}

.archive-content .grid > article  {
	grid-column: span 9;
}

.archive-content.loading {
	pointer-events: none;
}

body:has(.archive-content.loading):after {
	background: var(--black);
	content: '';
	height: 100dvh;
	left: 0;
	opacity: .5;
	position: fixed;
	top: 0;
	width: 100vw;
	z-index: 4;
}

.archive-content.loading #sidebar-container,
.archive-content.loading [jx-form-results] {
	opacity: .5;
}

.archive-content:not(.loading) .svg-loader {
	display: none;
}

.archive-content .svg-loader{
	left: 50%;
	position: fixed;
	top: 50%;
	transform: translate(-50%,-50%);
	z-index: 5;
}

.archive-content .loader-svg {
	fill: none;
	left: 0;
	position: absolute;
	stroke: var(--white);
	stroke-linecap: round;
	stroke-width: 5px;
	top: 0;
}

.archive-content .loader-svg.bg {
	stroke: var(--black);
	stroke-width: 8px;
}

.archive-content .animate {
	animation: fill-animation 1s cubic-bezier(1,1,1,1) 0s infinite;
	stroke-dasharray: 242.6;
}

@keyframes fill-animation{
	0%{
		stroke-dasharray: 40 242.6;
		stroke-dashoffset: 0;
	}
	50%{
		stroke-dasharray: 141.3;
		stroke-dashoffset: 141.3;
	}
	100%{
		stroke-dasharray: 40 242.6;
		stroke-dashoffset: 282.6;
	}
}

/* Jazzy AJAX filtering — fade the current results out and spin a 32px loader while
   the filtered set loads. jazzy-ajax adds .loading to the [jx-form] root; the legacy
   archive.php (.archive-content) keeps its own loader above. */
[jx-form]:not(.archive-content) [jx-form-results] {
	transition: opacity 0.2s ease;
}

[jx-form]:not(.archive-content).loading [jx-form-results] {
	opacity: 0.4;
	pointer-events: none;
}

[jx-form]:not(.archive-content).loading::after {
	animation: jazzy-spin 0.7s linear infinite;
	border: 1.5px solid color-mix(in srgb, var(--black) 15%, transparent);
	border-radius: 50%;
	border-top-color: var(--black);
	content: '';
	height: 32px;
	left: 50%;
	margin: -16px 0 0 -16px;
	position: fixed;
	top: 50%;
	width: 32px;
	z-index: 5;
}

@keyframes jazzy-spin {
	to {
		rotate: 360deg;
	}
}

.archive-content #open-filters,
.archive-content #close-filters {
	display: none;
}

/** Sort **/

.archive-content .sort-bar .results-count {
	margin: 0;
	transition: opacity .25s ease;
}

.archive-content .sort-bar .results-count > [jx-form-results-count="1"] + .s {
	display: none;
}

.archive-content .sort-bar .results-count:has([jx-form-results-count]:empty) {
	opacity: 0;
}

.archive-content .sort {
	align-items: center;
	display: flex;
	gap: var(--text-spacing-xsmall);
	position: absolute;
	right: var(--container-outer-padding);
	top: 0;
}

/** Filters **/

.archive-content .search-sort {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-xxsmall);
	justify-content: space-between;
	margin-bottom: var(--text-spacing-medium);
	position: relative;
}

.archive-content .search-sort label,
.archive-content .search-sort .eyebrow {
	margin: 0;
}

.archive-content .search-sort .search-container {
	align-items: center;
	display: flex;
	position: relative;
	width: 100%;
}

.archive-content .search-sort input[type="text"] {
	width: 100%;
}

.archive-content form ul {
	display: flex;
	flex-direction: column;
	gap: var(--text-spacing-xsmall);
	list-style: none;
	margin: 0;
	padding: 0;
}

.archive-content form ul li.accordion > ul {
	gap: var(--text-spacing-xxsmall);
	margin: var(--text-spacing-xxsmall) 0 0;
}

.archive-content form ul li.accordion.active > ul {
	display: flex;
}

.archive-content .filters > li {
	border-bottom: 1px solid var(--black);
	padding-bottom: var(--text-spacing-xsmall);
}

.archive-content .filters button {
	align-items: center;
	background: none;
	border: none;
	padding: 0;
	text-align: left;
	width: 100%;
}

.archive-content .filters h3 {
	margin: 0;
}

.archive-content .filters label {
	display: block;
	line-height: var(--label-line-height);
	padding-left: var(--text-spacing-small);
	position: relative;
	--label-line-height: calc(24em/16);
}

.archive-content .filters label:before,
.archive-content .filters label:after {
	content: '';
	position: absolute;
}

.archive-content .filters label:before {
	border: 1px solid var(--black);
	height: 11px;
	left: 0;
	top: calc((var(--label-line-height) - 11px) / 2);
	width: 11px;
}

.archive-content .filters label:after {
	background: var(--black);
	height: 7px;
	left: 3px;
	opacity: 0;
	top: calc((var(--label-line-height) - 11px) / 2 + 3px);
	width: 7px;
}

.archive-content .filters input:checked + label:after {
	opacity: 1;
}

/** Results **/

.archive-content article [jx-form-results-items] {
	display: flex;
	flex-direction: column;
	gap: var(--gap);
	line-height: 1;
	list-style: none;
	margin: 0;
	padding: 0;
}

/** Pagination **/

.jazzy-ajax-form-pagination {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: var(--text-spacing-small);
	justify-content: center;
	list-style: none;
	margin: 0;
	padding: 0;
}

.jazzy-ajax-form-pagination a {
	display: block;
}

.jazzy-ajax-form-pagination a:hover,
.jazzy-ajax-form-pagination .current {
	color: var(--black);
}

.jazzy-ajax-form-pagination .current {
	font-weight: 600;
}

.archive-content .btn.primary.load-more-complete {
	display: none;
}

/***************************************************************************************************************************************************************************************/
/* TOOLBAR */
/***************************************************************************************************************************************************************************************/

body.admin-bar {
	--wp-admin-bar-height: 32px;
}

body.admin-bar header,
body.admin-bar .alert-bar {
	top: var(--wp-admin-bar-height);
}

/* The sticky menu pins below the header, so its admin-bar offset stacks both. */
body.admin-bar .sticky-menu {
	top: calc(var(--header-height) + var(--wp-admin-bar-height));
}

/* WP's own breakpoint: ≤782px #wpadminbar grows to 46px AND switches to
   position:absolute (scrolls away), so the sticky header stops reserving space
   for it. (Header offset was wrongly gated at calc(75rem) = 1200px.) Raw 782px
   mirrors WP core's admin-bar query. */
@media screen and (max-width: 782px) {

	body.admin-bar {
		--wp-admin-bar-height: 46px;
	}

	body.admin-bar header {
		top: 0;
	}

}


/***************************************************************************************************************************************************************************************/
/* MQ MIN-WIDTH 2222 - Container at Max-Width */
/***************************************************************************************************************************************************************************************/

@media only screen and (min-width: calc(2222rem / 16)) {

	:root {
		--container-width: var(--container-max-width);
		--one-column-width: 123px;
	}

	.site-footer .tagline {
		max-width: 100%;
	}

}

/***************************************************************************************************************************************************************************************/
/* MQ MAX-WIDTH 1400 - Smaller Desktop Sizes */
/***************************************************************************************************************************************************************************************/

@media only screen and (max-width: calc(1400rem / 16)) {

	:root {
		--container-width: 100%;
		--container-outer-margin: 0px;
	}

	.bg-field {
		inset: 0;
	}

	/* Hero's all-sides card inset also collapses — the base .module.hero override
	   (0,2,0) otherwise outranks the .bg-field reset above. */
	.module.hero .bg-field {
		inset: 0;
	}

	/* Band is full-bleed now — no side gutter to match, so no foot either. */
	.page-builder > .module:last-child:has(> .bg-field) {
		margin-bottom: 0;
	}

	/*** Footer ***/

	.site-footer {
		padding-inline: var(--container-outer-padding);
	}

	.site-footer .columns {
		gap: var(--text-spacing-xlarge);
	}

	.site-footer .col {
		width: auto;
	}

}

/***************************************************************************************************************************************************************************************/
/* MQ MAX-WIDTH 1200 - Smaller Desktop Sizes / Larger Tablet Sizes */
/***************************************************************************************************************************************************************************************/

@media only screen and (max-width: calc(1200rem / 16)) {

	:root {
		--container-outer-padding: 40px;
	}

	/* Display + heading sizes step down at each breakpoint; body copy, h6, eyebrows
	   and labels hold at their base (≤22px — already mobile-readable). line-height is
	   unitless on every heading, so it scales with the size — font-size only here. */
	h1,
	.heading-1 {
		font-size: calc(72rem / 16);
	}

	.heading-1.large {
		font-size: calc(88rem / 16);
	}

	.heading-1.small {
		font-size: calc(62rem / 16);
	}

	h2,
	.heading-2 {
		font-size: calc(54rem / 16);
	}

	h3,
	.heading-3,
	.content-styles h2:not([class^="heading-"]) {
		font-size: calc(46rem / 16);
	}

	.big-stat {
		font-size: calc(96rem / 16);
	}

	.big-stat.large {
		font-size: calc(150rem / 16);
	}

	.passkey form {
		grid-column: 2 / -2;
	}

	/* Tighten the still-desktop nav so it fits down to the 1100 mobile switch. */
	.primary-links {
		gap: var(--text-spacing-small);
	}

	/* The tighter nav shifts the right-side trigger — pull the wide split panel
	   further left so it stays in the viewport. */
	.primary-nav .megamenu.split {
		left: -300px;
	}

	.card.blog-card .body {
		padding: var(--text-spacing-small);
	}

	/*** Footer ***/

	.site-footer {
		padding-top: var(--module-spacing-small);
	}

	/*** Archive ***/

	.archive-content [data-jazzy-scroll] {
		transform: unset !important;
	}

	.archive-content .grid {
		gap: 0;
	}

	.archive-content .grid > form,
	.archive-content .grid > article {
		grid-column: 1 / -1;
	}

	.archive-content #open-filters {
		background: none;
		border: none;
		display: flex;
		max-width: max-content;
		padding: 0;
	}

	.archive-content .sidebar-container {
		background: var(--white);
		height: 100dvh;
		left: unset;
		max-width: 310px;
		overflow: auto;
		padding: var(--text-spacing-xlarge) var(--text-spacing-small) var(--text-spacing-small);
		pointer-events: none;
		position: fixed;
		right: 0;
		top: 0;
		transform: translate3d(100%, 0, 0);
		transition: transform 0.25s ease, visibility 0.25s ease;
		visibility: hidden;
		width: 100vw;
		z-index: 99999;
	}

	.archive-content .sidebar-container.active {
		pointer-events: auto;
		transform: translate3d(0, 0, 0);
		visibility: visible;
	}

	.archive-content .sidebar-container #close-filters {
		display: block;
		position: absolute;
		right: 0;
		top: 0;
	}

	/* Reading column widens a step as the viewport tightens. */
	.page-content article {
		grid-column: 2 / -2;
	}

}

/***************************************************************************************************************************************************************************************/
/* MQ MAX-WIDTH 1100 - Mobile Header / Nav */
/***************************************************************************************************************************************************************************************/

@media only screen and (max-width: calc(1100rem / 16)) {

	/* Lock page scroll behind the open menu. The body is pinned with position:fixed
	   + a JS-set negative top (script.js lockPageScroll) so iOS Safari holds the
	   scroll position; overflow:hidden alone drops it there, jumping the page to the
	   top on close. */
	html.active {
		overflow: hidden;
		scrollbar-gutter: auto;
	}

	html.active body {
		inset-inline: 0;
		overflow: hidden;
		position: fixed;
	}

	/* Collapsed bar shows the logo + hamburger; links/CTAs move into the panel. */
	.primary-nav .nav-swap,
	.primary-nav .primary-right {
		display: none;
	}

	.primary-nav .logo-mark {
		position: relative;
		z-index: 100;
	}

	#header .mobile-menu {
		--bar-h: 2px;
		--bar-gap: 6px;
		--bar-w: 28px;
		align-items: center;
		background: none;
		border: 0;
		color: inherit;
		cursor: pointer;
		display: flex;
		flex-direction: column;
		height: 48px;
		justify-content: center;
		margin-left: auto;
		position: relative;
		width: 48px;
		z-index: 100;
	}

	.primary-nav .mobile-menu span {
		background: currentColor;
		border-radius: 1px;
		display: block;
		height: var(--bar-h);
		transition: opacity 0.2s ease, transform 0.2s ease;
		width: var(--bar-w);
	}

	.primary-nav .mobile-menu span:nth-of-type(2) {
		margin: var(--bar-gap) 0;
	}

	#header .mobile-menu:focus-visible {
		outline: 2px solid currentColor;
		outline-offset: 2px;
	}

	#header.active .mobile-menu span:nth-of-type(1) {
		transform: translateY(calc(var(--bar-h) + var(--bar-gap))) rotate(45deg);
	}

	#header.active .mobile-menu span:nth-of-type(2) {
		opacity: 0;
	}

	#header.active .mobile-menu span:nth-of-type(3) {
		transform: translateY(calc((var(--bar-h) + var(--bar-gap)) * -1)) rotate(-45deg);
	}

	/* Open — the header fills the screen as a white, scrollable panel. */
	#header.active {
		inset: 0;
		overflow-y: auto;
		position: fixed;
		z-index: 9999;
	}

	#header.active .primary-nav,
	#header.active .primary-nav.on-dark,
	#header.active .primary-nav.on-light {
		background: var(--white);
		color: var(--black);
		min-height: 100dvh;
	}

	#header.active .container-full {
		align-items: stretch;
		flex-direction: column;
		min-height: 100dvh;
		padding-bottom: var(--module-spacing-small);
	}

	/* Hamburger pins to the top-right while the panel scrolls. */
	#header .mobile-menu {
		color: var(--black);
		position: fixed;
		right: var(--text-spacing-xsmall);
		top: var(--text-spacing-medium);
	}

	/* Links fill the space between logo and CTAs, centred vertically. `safe`
	   flips to top-aligned once the list outgrows the box (open submenu), so it
	   pushes down + scrolls instead of clipping the top off-screen. */
	#header.active .nav-swap {
		display: flex;
		flex: 1;
		flex-direction: column;
		justify-content: safe center;
		padding: var(--module-spacing-small) 0;
		width: 100%;
	}

	#header.active .nav-context {
		display: none;
	}

	#header .primary-links {
		align-items: flex-start;
		flex-direction: column;
		gap: var(--text-spacing-medium);
		list-style: none;
		margin: 0;
		/* Defeat the scroll-driven nav-context fade so the panel links stay visible. */
		opacity: 1;
		padding: 0;
		pointer-events: auto;
		transform: none;
		visibility: visible;
		width: 100%;
	}

	#header .primary-links > .menu-item > a,
	#header .primary-links > .menu-item > button {
		color: var(--black);
		font-size: calc(22rem / 16);
		gap: 7px;
		justify-content: flex-start;
		line-height: calc(34 / 22);
		width: 100%;
	}

	#header .menu-item-has-children.active .menu-caret svg {
		transform: rotate(180deg);
	}

	/* Mega menus expand inline as accordions — no takeover panel. Collapsed panels
	   keep the desktop opacity/visibility (their links stay out of the tab order);
	   the existing .active rule reveals them, this just animates the height. */
	#header .primary-links .megamenu {
		align-items: flex-start;
		background: none;
		box-shadow: none;
		gap: 20px;
		height: 0;
		justify-content: flex-start;
		left: auto;
		min-width: 0;
		overflow: hidden;
		padding: 0;
		position: static;
		top: auto;
		transform: none;
		transition: height 0.3s ease;
		width: 100%;
	}

	#header .primary-links .megamenu::before {
		content: none;
	}

	/* height:auto (animated via :root interpolate-size) — the content's own height, so
	   overflow:hidden never clips it and the panel scrolls to reveal anything taller
	   than the viewport. A fixed vh cap clipped tall menus in landscape. */
	#header .primary-links .menu-item-has-children.active > .megamenu {
		height: auto;
		margin-block: var(--text-spacing-small) var(--text-spacing-xxsmall);
	}

	#header .primary-links .megamenu.split {
		flex-direction: column;
	}

	#header .primary-links .megamenu .col,
	#header .primary-links .megamenu .col.tint {
		background: none;
		gap: 20px;
		min-width: 0;
		padding: 0;
		width: 100%;
	}

	#header .primary-links .megamenu .col.tint {
		margin-top: var(--text-spacing-xsmall);
	}

	#header .primary-links .megamenu .eyebrow.small {
		padding-inline: 0;
	}

	.megamenu .eyebrow.small::after {
		left: 0;
		right: auto;
		width: 100%;
	}

	#header .primary-links .megamenu a {
		padding: 0;
	}

	#header .primary-links .megamenu .btn.tertiary::after {
		display: none;
	}

	#header .primary-links .megamenu .xsmall-text,
	#header .primary-links .megamenu .eyebrow.small {
		/*display: none;*/
	}

	.megamenu a:hover {
		background: transparent;
	}

	/* CTAs stack full-width at the foot of the menu. */
	#header.active .primary-right {
		display: flex;
		flex-direction: column;
		gap: var(--text-spacing-small);
		margin-top: auto;
		padding-top: var(--text-spacing-large);
		width: 100%;
	}

	#header.active .primary-right .btn {
		width: 100%;
	}

	/* In the menu the CTAs run at full button height — override both the bar's
	   trimmed padding-block and the .small sizing. Login keeps its outline. */
	#header.active .primary-right .btn.primary {
		padding: 19px var(--text-spacing-small);
	}

	#header.active .primary-right .btn.outline {
		padding: 20px var(--text-spacing-small) 18px;
	}

	/* Panel is always white — neutralise the on-dark .light CTA variants
	   (white-on-white / white-bordered) so both buttons stay visible. */
	#header.active .primary-right .btn.primary.light {
		background: var(--black);
		color: var(--white);
	}

	#header.active .primary-right .btn.outline.light {
		color: var(--black);
	}

	/*** Footer ***/

	.site-footer .top {
		display: block;
	}

	.site-footer .tagline {
		margin: 0 0 var(--text-spacing-medium);
		max-width: unset;
	}

	.site-footer .columns {
		flex-wrap: wrap;
		margin: 0;
	}

}

/***************************************************************************************************************************************************************************************/
/* MQ MAX-WIDTH 950 - Tablet Sizes */
/***************************************************************************************************************************************************************************************/

@media only screen and (max-width: calc(950rem / 16)) {

	:root {
		--module-spacing-small: 56px;
		--module-spacing-medium: 64px;
		--module-spacing-large: 100px;
		--module-spacing-xlarge: 120px;
		--module-spacing-xxlarge: 180px;
	}

	.card.client-story-card .body {
		padding: var(--text-spacing-medium) var(--text-spacing-small) var(--text-spacing-large);
	}

	h1,
	.heading-1 {
		font-size: calc(56rem / 16);
	}

	.heading-1.large {
		font-size: calc(72rem / 16);
	}

	.heading-1.small {
		font-size: calc(50rem / 16);
	}

	h2,
	.heading-2 {
		font-size: calc(48rem / 16);
	}

	h3,
	.heading-3,
	.content-styles h2:not([class^="heading-"]) {
		font-size: calc(38rem / 16);
	}

	h4,
	.heading-4,
	.content-styles h3:not([class^="heading-"]) {
		font-size: calc(32rem / 16);
	}

	h5,
	.heading-5,
	.content-styles h4:not([class^="heading-"]) {
		font-size: calc(28rem / 16);
	}

	.quote,
	p.quote,
	blockquote,
	blockquote p:not([class]) {
		font-size: calc(26rem / 16);
	}

	.big-stat {
		font-size: calc(78rem / 16);
	}

	.big-stat.large {
		font-size: calc(120rem / 16);
	}

	p.xlarge,
	ul.xlarge,
	ol.xlarge,
	.xlarge-text,
	.xlarge-text p,
	.xlarge-text ul,
	.xlarge-text ol {
		font-size: calc(20rem / 16);
	}

	p.large,
	ul.large,
	ol.large,
	.large-text,
	.large-text p,
	.large-text ul,
	.large-text ol {
		font-size: calc(18rem / 16);
	}

	/* Stacked now, so row-gap sets the air above and below the excerpt — tighter
	   than the desktop column gap needs to be. */
	.card.release-note-card {
		grid-template-columns: 1fr;
		padding: var(--text-spacing-medium);
		row-gap: var(--text-spacing-small);
	}

	.card.release-note-card .btn.tertiary {
		grid-column: auto;
		justify-self: start;
	}

	.passkey form {
		grid-column: 1 / -1;
	}

	/* Widens another step — full left edge, one column of right breathing room. */
	.page-content article {
		grid-column: 1 / -2;
	}

	.jazzy-dialog {
		max-width: 90dvw;
	}

	.tablet-only {
		display: block !important;
	}

	.desktop-only {
		display: none !important;
	}

	.alert-bar.desktop-only + header {
		margin-top: 0; /* If the alert bar next to the header is desktop-only, there is no mobile version */
	}

	/* Stacked, the colour bands read as one flow — the 24px breath is desktop-only. */
	.module[class*="bg-"]:not(.bg-default) + .module:has(> .bg-field),
	.module:has(> .bg-field) + .module[class*="bg-"]:not(.bg-default) {
		/*margin-top: 0;*/
	}

	/* The 48px side padding is desktop-scaled; the card's vertical rides
	   --module-spacing-small, which already steps on its own. */
	.callout-tile {
		padding: var(--module-spacing-small) var(--text-spacing-large);
	}

	.callout-tile.style-inline {
		padding: var(--text-spacing-large);
	}

	/* Stacked — the media loses its side column, so it needs an explicit ratio
	   again (the base clears it to fill the column's height). */
	.media-cta-tile {
		grid-template-columns: 1fr;
	}

	.media-cta-tile .media {
		aspect-ratio: 16 / 9;
	}

	/*** Footer ***/

	.site-footer .columns {
		display: grid;
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	/* Stacked footer stays left-aligned — override the desktop bottom bar's space-between. */
	.site-footer .bottom {
		justify-content: flex-start;
	}

}

/***************************************************************************************************************************************************************************************/
/* MQ MAX-WIDTH 650 - Mobile Sizes */
/***************************************************************************************************************************************************************************************/

@media only screen and (max-width: calc(650rem / 16)) {

	/* No room for the gutter — the speaker lockup goes above the turn. */
	.transcript-tile .turn {
		display: block;
	}

	.transcript-tile .meta {
		align-items: center;
		flex-direction: row;
		gap: var(--text-spacing-xxsmall);
		margin-bottom: var(--text-spacing-xxsmall);
	}

	.transcript-tile .media {
		margin-bottom: 0;
	}

	.callout-tile {
		padding: var(--module-spacing-small) var(--text-spacing-small);
	}

	/* Icon drops above the copy — align-items must flip too or the base rule's
	   `center` would centre the stack instead of keeping it left. */
	.callout-tile.style-inline {
		align-items: flex-start;
		flex-direction: column;
		gap: var(--text-spacing-small);
		padding: var(--text-spacing-medium) var(--text-spacing-small);
	}

	/* 88px dominates a phone-width card; the inline's own 64px still out-specifies this. */
	.callout-tile .metric-icon {
		--metric-icon-size: 64px;
	}

	/* margin-top only aligned the icon to a heading beside it — dead once stacked. */
	.callout-tile.style-inline > .icon {
		height: 64px;
		margin-top: 0;
		width: 64px;
	}

	/* Third echo of the :has() carve-out — this block is later in source, so
	   without it the 64px box re-crops the disc at mobile. */
	.callout-tile.style-inline > .icon:has(.metric-icon) {
		height: auto;
		width: auto;
	}

	.callout-tile.style-inline > .icon i {
		font-size: 64px;
	}

	:root {
		--container-outer-padding: 20px;
		/* minmax(0,1fr) — a bare 1fr floors at min-content, so a wide child (e.g. a
		   content table) blows the single column past the viewport and eats the
		   right padding. The 0 floor lets the track shrink, matching the desktop grid. */
		--grid: minmax(0, 1fr);
		--header-height: 72px;
		--module-spacing-small: 40px;
		--module-spacing-medium: 48px;
		--module-spacing-large: 64px;
		--module-spacing-xlarge: 80px;
		--module-spacing-xxlarge: 120px;
	}

	.patient-gate {
		padding: var(--text-spacing-medium);
	}

	/* Pinned to the viewport, not the panel — the dialog scrolls on a phone, and an
	   absolute close scrolls away with it. */
	.jazzy-dialog [data-jazzy-dialog-close] {
		position: fixed;
	}

	.primary-nav .container-full {
		padding-top: var(--text-spacing-small);
	}

	.primary-nav.is-stuck .container-full {
		transform: translateY(-12px);
	}

	#header .mobile-menu {
		top: var(--text-spacing-small);
	}

	.accordion.active .accordion-panel > * {
		padding-right: 0;
	}

	h1,
	.heading-1 {
		font-size: calc(44rem / 16);
	}

	.heading-1.large {
		font-size: calc(48rem / 16);
	}

	.heading-1.small {
		font-size: calc(34rem / 16);
	}

	h2,
	.heading-2 {
		font-size: calc(44rem / 16);
	}

	h3,
	.heading-3,
	.content-styles h2:not([class^="heading-"]) {
		font-size: calc(30rem / 16);
	}

	h4,
	.heading-4,
	.content-styles h3:not([class^="heading-"]) {
		font-size: calc(28rem / 16);
	}

	h5,
	.heading-5,
	.content-styles h4:not([class^="heading-"]) {
		font-size: calc(24rem / 16);
	}

	.quote,
	p.quote,
	blockquote,
	blockquote p:not([class]) {
		font-size: calc(22rem / 16);
	}

	.heading-6.large {
		font-size: calc(20rem / 16);
	}

	.big-stat {
		font-size: calc(60rem / 16);
	}

	.big-stat.large {
		font-size: calc(90rem / 16);
	}

	p.xlarge,
	ul.xlarge,
	ol.xlarge,
	.xlarge-text,
	.xlarge-text p,
	.xlarge-text ul,
	.xlarge-text ol {
		font-size: calc(18rem / 16);
	}

	p.large,
	ul.large,
	ol.large,
	.large-text,
	.large-text p,
	.large-text ul,
	.large-text ol {
		font-size: calc(16rem / 16);
	}

	.media.video .play .play-control {
		bottom: var(--text-spacing-xsmall);
		left: var(--text-spacing-xsmall);
	}

	.media.video .play .play-icon {
		height: 48px;
		width: 48px;
	}

	.media.video.large .play-icon {
		font-size: calc(24rem / 16);
		height: 80px;
		width: 80px;
	}

	.card.blog-card.horizontal {
		flex-direction: column;
	}

	.card.blog-card.horizontal .media {
		aspect-ratio: 372 / 210;
		flex: auto;
		order: 0;
		width: 100%;
	}

	.card.story .stats {
		grid-template-columns: 1fr 1fr;
	}

	/* Stack the first/last-name row on mobile — side-by-side inputs get too narrow.
	   (Gravity Forms' own grid already stacks its half-width fields.) */
	.demo-form-row {
		grid-template-columns: 1fr;
	}

	/* Parchment panel runs edge to edge, with the citations pulled back onto the
	   container — --viewport-edge is exactly that distance, so the padding is the
	   same value inverted. */
	.references-tile {
		margin-inline: var(--viewport-edge);
		padding-inline: calc(-1 * var(--viewport-edge));
	}

	.stat-tile {
		align-items: flex-start;
		flex-direction: column;
	}

	.stat-tile .graphic {
		display: none;
	}

	.media-cta-tile .content {
		padding: var(--text-spacing-small);
	}

	.error-404 .heading-2 {
		margin-top: 0;
	}

	.error-404 .large-text {
		grid-column: 1 / -1;
	}

	.error-404 .buttons {
		flex-direction: column;
	}

	.mobile-only {
		display: block !important;
	}

	/* Grid is now a single 1fr track — the desktop "3 / span 8" centering would
	   reference non-existent column lines and spawn an empty implicit track on the
	   left (the lopsided gap). Span the full column instead. */
	.page-content article {
		grid-column: 1 / -1;
	}

	/* Scroll the table horizontally rather than crushing its columns. display:block
	   turns the table into the scroll container (columns still align via the
	   anonymous table box); the cell min-width forces overflow on narrow viewports
	   so text wraps within a comfortable column instead of going wonky. */
	.content-styles table {
		display: block;
		overflow-x: auto;
		-webkit-overflow-scrolling: touch;
	}

	.content-styles table th,
	.content-styles table td {
		min-width: calc(240rem / 16);
		padding: var(--text-spacing-xxsmall) var(--text-spacing-xsmall);
	}

	/* Prev/Next rejoin the flow — a long page list (1 2 3 … 11 … 24) grows wide
	   enough here to run under the links pinned at the edges. In flow they wrap
	   instead, in DOM order, so the focus order still matches what's on screen. */
	.page-numbers.prev,
	.page-numbers.next,
	.pagination .previous,
	.pagination .next {
		position: static;
		transform: none;
	}

}

/***************************************************************************************************************************************************************************************/
/* ACCESSIBILITY REDUCE MOTIONS */
/***************************************************************************************************************************************************************************************/

@media (prefers-reduced-motion: no-preference) {

	html {
		scroll-behavior: smooth;
	}

	/*** JazzyScroll Animations ***/

	[data-jazzy-scroll] {
		pointer-events: none;
		transition-duration: .8s;
		transition-property: opacity, transform;
		transition-timing-function: cubic-bezier(0.65, 0, 0.35, 1);
	}

	[data-jazzy-scroll].animated-in {
		pointer-events: all;
	}

	/** All fade ins **/

	[data-jazzy-scroll*="fade-in"] {
		opacity: 0;
		transition-property: opacity;
	}

	[data-jazzy-scroll*="fade-in"].animated-in {
		opacity: 1;
	}

	/** Fade in up **/

	[data-jazzy-scroll="fade-in-up"] {
		position: relative;
		transform: translate3d(0, 60px, 0);
		transition-property: opacity, transform;
	}

	[data-jazzy-scroll="fade-in-up"].animated-in {
		transform: translate3d(0, 0, 0);
	}

	/*** Header ***/

	header .mobile-menu span:not(.accessibility) {
		transition: .3s;
	}

	/*** Zoom Images ***/

	a:hover .image-zoom img,
	button:hover .image-zoom img {
		transform: scale(1.05);
	}

}
