/*--------------------------------------------------------------
# Animation
--------------------------------------------------------------*/

.fadeInUp {
	animation-name: fadeInUp;
}

.fadeInDown {
	animation-name: fadeInDown;
}

.fadeInLeft {
	animation-name: fadeInLeft;
}

.fadeInRight {
	animation-name: fadeInRight;
}

@keyframes fadeInUp {
	0% {
		opacity: 0;
		transform: translate3d(0, 100%, 0);
	}

	100% {
		opacity: 1;
		transform: translateZ(0);
	}
}

@keyframes fadeInLeft {
	0% {
		opacity: 0;
		transform: translate3d(-100%, 0, 0);
	}

	100% {
		opacity: 1;
		transform: translateZ(0);
	}
}

@keyframes fadeInRight {
	0% {
		opacity: 0;
		transform: translate3d(100%, 0, 0);
	}

	100% {
		opacity: 1;
		transform: translateZ(0);
	}
}

.animated.delay-100ms {
	-webkit-animation-delay: 0.1s;
	animation-delay: 0.1s;
}

.animated.delay-200ms {
	-webkit-animation-delay: 0.2s;
	animation-delay: 0.2s;
}

.animated.delay-300ms {
	-webkit-animation-delay: 0.3s;
	animation-delay: 0.3s;
}

.animated.delay-400ms {
	-webkit-animation-delay: 0.4s;
	animation-delay: 0.4s;
}

.animated.delay-500ms {
	-webkit-animation-delay: 0.5s;
	animation-delay: 0.5s;
}

.animated.delay-600ms {
	-webkit-animation-delay: 0.6s;
	animation-delay: 0.6s;
}

.animated.delay-700ms {
	-webkit-animation-delay: 0.7s;
	animation-delay: 0.7s;
}

.animated.delay-800ms {
	-webkit-animation-delay: 0.8s;
	animation-delay: 0.8s;
}
.animated.delay-900ms {
	-webkit-animation-delay: 0.9s;
	animation-delay: 0.9s;
}

.animated.delay-1000ms {
	-webkit-animation-delay: 1s;
	animation-delay: 1s;
}

/* Disable animations on mobile devices */

/*@media only screen and (max-width: 1023px) {
 .animated {
 opacity: 1 !important;
 filter: alpha(opacity=100) !important;
 -webkit-animation: none !important;
 -moz-animation: none !important;
 -o-animation: none !important;
 animation: none !important;
}
}*/

.postid-759 .testimonial_logo img {
	height: 35px;
	width: auto;
}

.wpcf7-turnstile {
	margin-bottom: 26px;
}

/* ===================================
   Scroll reveals: the animate.css class names in the block templates (animated fadeInUp
   delay-300ms) with short, soft movements on the shared motion tokens. assets/js/reveal.js decides
   *when* (on scroll into view, grouped by section); the delay-NNNms classes stagger.
=================================== */
.animated.animated {
	animation-duration: var(--dur-reveal);
	animation-timing-function: var(--ease-out);
	/* hold the first frame during the delay; without it an element shows in place, then vanishes as
     its animation starts */
	animation-fill-mode: both;
}
.animated.fadeInUp {
	animation-name: exc-reveal-up;
}
.animated.fadeInDown {
	animation-name: exc-reveal-down;
}
.animated.fadeInLeft {
	animation-name: exc-reveal-left;
}
.animated.fadeInRight {
	animation-name: exc-reveal-right;
}
.animated.fadeIn {
	animation-name: exc-reveal-fade;
}

@keyframes exc-reveal-up {
	from {
		opacity: 0;
		transform: translate3d(0, 40px, 0);
	}
	to {
		opacity: 1;
		transform: none;
	}
}
@keyframes exc-reveal-down {
	from {
		opacity: 0;
		transform: translate3d(0, -24px, 0);
	}
	to {
		opacity: 1;
		transform: none;
	}
}
@keyframes exc-reveal-left {
	from {
		opacity: 0;
		transform: translate3d(-56px, 0, 0);
	}
	to {
		opacity: 1;
		transform: none;
	}
}
@keyframes exc-reveal-right {
	from {
		opacity: 0;
		transform: translate3d(56px, 0, 0);
	}
	to {
		opacity: 1;
		transform: none;
	}
}
@keyframes exc-reveal-fade {
	from {
		opacity: 0;
	}
	to {
		opacity: 1;
	}
}

/* ===================================
   Soft-focus reveals for text
   Headings, labels and descriptions resolve out of a blur as they rise in. Text only:
   images, cards and carousels keep the plain fade (blur on big areas smears and costs more).
   The blur amount scales with the type size; the filter is gone once the reveal ends.
=================================== */
:is(
	.section_title,
	.section_title_above,
	.section_description,
	.section_sub_title,
	.slider_sub_heading,
	.slide_sub_heading,
	.slider_description,
	.slide_description,
	.featured_content,
	.contact_info_col,
	.title_description,
	.above_title,
	.page_title
) {
	--reveal-blur: 5px;
}
/* headings resolve from a stronger blur; labels and body text from a light one (many run at once) */
:is(.section_title, .page_title) {
	--reveal-blur: 12px;
}
:is(.section_title_above, .above_title) {
	--reveal-blur: 4px;
}

.animated.fadeInUp:is(
		.section_title,
		.section_title_above,
		.section_description,
		.section_sub_title,
		.slider_sub_heading,
		.slide_sub_heading,
		.slider_description,
		.slide_description,
		.featured_content,
		.contact_info_col
	) {
	animation-name: exc-reveal-up-blur;
}
.animated.fadeInLeft:is(
		.section_title,
		.section_title_above,
		.section_description,
		.section_sub_title,
		.featured_content,
		.contact_info_col
	) {
	animation-name: exc-reveal-left-blur;
}
.animated.fadeInRight:is(
		.section_title,
		.section_title_above,
		.section_description,
		.section_sub_title,
		.featured_content,
		.contact_info_col
	) {
	animation-name: exc-reveal-right-blur;
}

@keyframes exc-reveal-up-blur {
	from {
		opacity: 0;
		filter: blur(var(--reveal-blur, 8px));
		transform: translate3d(0, 32px, 0);
	}
	to {
		opacity: 1;
		filter: none;
		transform: none;
	}
}
@keyframes exc-reveal-left-blur {
	from {
		opacity: 0;
		filter: blur(var(--reveal-blur, 8px));
		transform: translate3d(-48px, 0, 0);
	}
	to {
		opacity: 1;
		filter: none;
		transform: none;
	}
}
@keyframes exc-reveal-right-blur {
	from {
		opacity: 0;
		filter: blur(var(--reveal-blur, 8px));
		transform: translate3d(48px, 0, 0);
	}
	to {
		opacity: 1;
		filter: none;
		transform: none;
	}
}

/* Inner-page title areas (title.php) had no entrance at all: label, heading, description and
   link now resolve in on load, one after another. */
.page_title_content > * {
	animation: exc-reveal-up-blur var(--dur-reveal) var(--ease-out) both;
	animation-delay: calc(150ms + var(--k, 0) * 110ms);
}
.page_title_content > :nth-child(2) {
	--k: 1;
}
.page_title_content > :nth-child(3) {
	--k: 2;
}
.page_title_content > :nth-child(n + 4) {
	--k: 3;
}

/* ===================================
   Character reveals (assets/js/motion.js)
=================================== */
.cw {
	display: inline-block;
	white-space: nowrap;
}

/* "Positioned to Lead" CTA: letters resolve out of a blur, left to right */
.cta-ready .js-char-reveal.animated,
.cta-ready .js-char-reveal.hidden-animated {
	animation: none !important; /* the letters do the entrance instead of the whole heading */
	visibility: visible !important;
	opacity: 1 !important;
}
.js-char-reveal .ch {
	display: inline-block;
	opacity: 0;
	filter: blur(8px);
	transform: translate3d(0, 0.35em, 0);
}
.cta-ready.is-in .js-char-reveal .ch {
	opacity: 1;
	filter: none;
	transform: none;
	transition:
		opacity 700ms var(--ease-out),
		filter 800ms var(--ease-out),
		transform 900ms var(--ease-out);
	transition-delay: calc(150ms + var(--i, 0) * 26ms);
}
/* the asterisk spins in from a quarter turn and settles (slight overshoot), then turns gently with
   scroll (--spin, set by the script, uses the separate `rotate` property) */
.cta-ready .container::before,
.cta-ready .cta-asterisk {
	rotate: var(--spin, 0deg);
	transform-origin: 50% 50%;
	opacity: 0;
	filter: blur(6px);
	transform: rotate(-90deg) scale(0.4);
	transition:
		opacity 700ms var(--ease-out),
		filter 700ms var(--ease-out),
		transform 1300ms var(--ease-overshoot);
}
.cta-ready.is-in .container::before,
.cta-ready.is-in .cta-asterisk {
	opacity: 1;
	filter: none;
	transform: none;
}

/* ===================================
   Section text choreography (assets/js/motion.js sequence())
   Order: label -> heading line by line (140ms apart) -> green words during their own line ->
   description -> button. Everything starts when assets/js/reveal.js reveals the element (removes
   .hidden-animated), so nothing runs on its own timer and there's no hole in the heading.
=================================== */
/* headings split into lines: the heading rises as a whole while each line fades and unblurs in
   turn. Lines stay inline and the editor's <br>s are untouched, so wrapping is exactly as before
   at every width (some blocks hide the <br>s on small screens). */
.section_title.has-lines.animated:is(.fadeInUp, .fadeInLeft, .fadeInRight, .fadeIn) {
	animation-name: exc-rise-only;
	animation-delay: var(--d0, 0ms) !important;
}
@keyframes exc-rise-only {
	from {
		transform: translate3d(0, 28px, 0);
	}
	to {
		transform: none;
	}
}
.section_title.has-lines.animated:is(.fadeInUp, .fadeInLeft, .fadeInRight, .fadeIn):not(.hidden-animated) .tl {
	animation: exc-line-focus var(--dur-reveal) var(--ease-out) both;
	animation-delay: calc(var(--d0, 0ms) + var(--line, 0) * 140ms);
}
@keyframes exc-line-focus {
	from {
		opacity: 0;
		filter: blur(12px);
	}
	to {
		opacity: 1;
		filter: none;
	}
}

/* headline inside a revealed wrapper (assets/js/motion.js nested(), e.g. the big circle): the same line,
   highlight and description order, timed from the wrapper's reveal */
.animated:not(.hidden-animated) .section_title.in-reveal {
	animation: exc-rise-only var(--dur-reveal) var(--ease-out) var(--d0, 0ms) both;
}
.animated:not(.hidden-animated) .section_title.in-reveal .tl {
	animation: exc-line-focus var(--dur-reveal) var(--ease-out) both;
	animation-delay: calc(var(--d0, 0ms) + var(--line, 0) * 140ms);
}
.animated:not(.hidden-animated) .in-reveal-item {
	--reveal-blur: 5px;
	animation: exc-reveal-up-blur var(--dur-reveal) var(--ease-out) var(--d, 0ms) both;
}

/* green highlighted words: written in letter by letter once their line is legible, leaning in then
   straightening up. --hl0 (start) and --hl-step (per letter) come from assets/js/motion.js
   scheduleHighlights(): one rule for every headline, derived from line and position. */
.hl-ready .hl {
	display: inline-block;
}
.section_title.animated:not(.hidden-animated) .hl-ready .hl,
.animated:not(.hidden-animated) .section_title.in-reveal .hl-ready .hl,
.is-line-reveal .hl-ready .hl,
.page_title .hl-ready .hl {
	animation: exc-hl-in 900ms var(--ease-out) both;
	animation-delay: calc(var(--hl0, 0ms) + var(--i, 0) * var(--hl-step, 38ms));
}
@keyframes exc-hl-in {
	/* the blur is on the whole word (below), not per letter: one blur per highlight instead of one per
     letter, ~8-10x fewer at once (blur can't be animated off the main thread) */
	from {
		opacity: 0;
		transform: translate3d(0.12em, 0.3em, 0) skewX(-10deg);
	}
	to {
		opacity: 1;
		transform: none;
	}
}
.section_title.animated:not(.hidden-animated) .hl-ready,
.animated:not(.hidden-animated) .section_title.in-reveal .hl-ready,
.is-line-reveal .hl-ready,
.page_title .hl-ready {
	animation: exc-hl-focus calc(var(--hl-n, 8) * var(--hl-step, 38ms) + 700ms) var(--ease-out) var(--hl0, 0ms) both;
}
@keyframes exc-hl-focus {
	from {
		filter: blur(6px);
	}
	to {
		filter: none;
	}
}

/* Rolling digits (assets/js/reels.js): each digit is a reel. The invisible final
   digit keeps the number's final width and baseline; the strip (0-9) rolls over it.
   These numbers use a very tight line-height (0.8), so glyphs overflow the line box: each reel gets
   --reel-pad of extra room above and below (cancelled by negative margins, so the layout is
   unchanged), and only the outer edge of that room fades. */
.has-reels .reel {
	/* window = the em box (digits fit inside) when the line box is tighter than it; never negative
	   (the small stats have a loose line-height, the circle number a tight one) */
	--reel-pad: max(0.05em, calc((1em - 1lh) / 2 + 0.05em));
	--row-pad: calc(var(--reel-pad) + 0.3em); /* rows sit further apart than the window, so neighbours never peek in */
	position: relative;
	display: inline-block;
	padding-block: var(--reel-pad);
	margin-block: calc(var(--reel-pad) * -1);
	/* old-style digits overhang their advance width; give the mask room at the sides too */
	padding-inline: 0.15em;
	margin-inline: -0.15em;
	-webkit-mask-image: linear-gradient(
		to bottom,
		transparent 0,
		#000 0.12em,
		#000 calc(100% - 0.12em),
		transparent 100%
	);
	mask-image: linear-gradient(to bottom, transparent 0, #000 0.12em, #000 calc(100% - 0.12em), transparent 100%);
	clip-path: inset(0 -0.3em);
}
.has-reels .reel-final {
	visibility: hidden;
}
.has-reels .reel-strip {
	position: absolute;
	left: 50%;
	top: calc(var(--reel-pad) - var(--row-pad));
	display: flex;
	flex-direction: column;
	align-items: center;
	translate: -50% 0;
	transform: translate3d(0, calc(var(--s, 0) * -10%), 0); /* start digit (lead) */
}
.has-reels .reel-strip > span {
	display: block;
	box-sizing: border-box;
	height: calc(1lh + var(--row-pad) * 2);
	padding-block: var(--row-pad);
}
.has-reels .reel.is-rolling .reel-strip {
	transform: translate3d(0, calc(var(--d) * -10%), 0);
	transition: transform var(--roll-ms, 1500ms) var(--ease-out) var(--roll-delay, 450ms);
}

/* Scroll reveals are theme-owned: the animate.css class names in the block
   templates (animated fadeInUp delay-300ms) are defined in this file, and assets/js/reveal.js toggles
   .hidden-animated. The Blocks Animation plugin isn't needed for any of it. */
.hidden-animated {
	animation-play-state: paused;
	visibility: hidden;
}

/* Scroll reveals (assets/js/reveal.js): until the script has sorted on-screen from off-screen elements,
   hold everything (otherwise below-the-fold elements could play before anyone sees them). */
.js-motion .animated:not(.o-anim-ready) {
	animation-play-state: paused;
	visibility: hidden;
}

/* ===================================
   Per-block entrance settings
   Chosen in the editor: every block's "Entrance animation" panel (ACF, acf-json/
   group_7fe40502a5b3c.json) adds one of these classes to the block (inc/template-helpers.php).
   - Speed: slower/quicker entrances by changing --dur-reveal for the block; staggering stays.
   - Fade only: every entrance in the block (whole elements, heading lines, nested items, green
     highlighted letters) becomes a plain fade: no movement, no blur. Timing and order stay.
   - None: content shows right away (assets/js/reveal.js doesn't hide it; entrances jump to their end).
   !important: an explicit editor choice beats the per-element choreography rules above.
=================================== */
.entrance-calm {
	--dur-reveal: 1500ms;
}
.entrance-quick {
	--dur-reveal: 700ms;
}

:is(.entrance-fade, .entrance-fade *):is(.animated, .tl, .in-reveal, .in-reveal-item, .hl, .page_title_content > *) {
	animation-name: exc-reveal-fade !important;
}
.entrance-fade .hl-ready {
	animation: none !important; /* no blur on highlighted words either */
}

:is(.entrance-none, .entrance-none *):is(.animated, .tl, .in-reveal, .in-reveal-item, .hl, .hl-ready) {
	animation-duration: 0.01ms !important;
	animation-delay: 0s !important;
	animation-iteration-count: 1 !important;
}
