/*
Theme Name:   Dercums Child
Theme URI:    https://dercums.com
Description:  Child theme of Hello Elementor for Dercums.com (AquaLink). Holds only the
              custom CSS/PHP that Elementor cannot reasonably handle. Layout and content
              remain Elementor-managed.
Author:       JS Web Design Services
Author URI:   https://junsanchez.com
Template:     hello-elementor
Version:      1.0.0
Text Domain:  dercums-child
*/

/* Component styles are added here only where Elementor cannot handle the requirement.
   Organise by component, keep specificity low, and use the shared class names
   (site-header, hero, section, benefits, process, science, testimonial,
   product-cta, faq-preview, resources, final-cta, site-footer). */


/* ==========================================================================
   1. Content width
   --------------------------------------------------------------------------
   The Figma board is 1440 wide with 120px side margins, so the content
   measure is 1200px. Elementor 4.3 REMOVED the kit's global "Content Width"
   control (the kit stack no longer registers `container_width`), so the only
   place left to set it once is Elementor's own public custom property.
   Boxed containers resolve their inner width from
   `--content-width: min(100%, var(--container-max-width, 1140px))`.
   Side gutters below 1440 come from each section's own inline padding, not
   from here — see the section padding convention in the build notes.
   ========================================================================== */
.elementor .e-con {
	--container-max-width: 1200px;
}


/* ==========================================================================
   2. Type rendering
   --------------------------------------------------------------------------
   Poppins at the Figma sizes needs optical smoothing to match the board;
   without it headings render measurably heavier than the design.
   ========================================================================== */
body {
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}


/* ==========================================================================
   3. Focus visibility
   --------------------------------------------------------------------------
   WCAG 2.4.7. teal-700 (#1F7A6E) is the measured ring colour: it clears 3:1
   against every ground on this site including the gold button face (3.09:1),
   where teal-500 falls to 1.99:1. Do not substitute teal-500.
   ========================================================================== */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
	outline: 2.5px solid #1F7A6E;
	outline-offset: 2px;
}


/* ==========================================================================
   4. Footer decoration
   --------------------------------------------------------------------------
   Two purely decorative layers from Figma node 119:220 that Elementor cannot
   express: a 4-stop gradient hairline across the top edge, and a 900px radial
   teal glow anchored off the lower-right corner. Both are pseudo-elements so
   they add no markup and cannot be tabbed to. The footer clips them, which is
   what the Figma frame does too.
   ========================================================================== */
.dx-footer {
	position: relative;
	isolation: isolate;
}

/* Top Accent Rule — 1px, teal 0 → teal .55 @28% → gold .40 @62% → teal 0 */
.dx-footer::before {
	content: "";
	position: absolute;
	inset-block-start: 0;
	inset-inline: 0;
	block-size: 1px;
	background: linear-gradient(
		90deg,
		rgba(42, 157, 143, 0) 0%,
		rgba(42, 157, 143, 0.55) 28%,
		rgba(233, 196, 106, 0.40) 62%,
		rgba(42, 157, 143, 0) 100%
	);
	z-index: -1;
}

/* Depth Glow — Ø900 ellipse, centre off the lower-right corner */
.dx-footer::after {
	content: "";
	position: absolute;
	inset-block-start: 120px;
	inset-inline-end: -360px;
	inline-size: 900px;
	block-size: 900px;
	border-radius: 50%;
	background: radial-gradient(
		closest-side,
		rgba(42, 157, 143, 0.16) 0%,
		rgba(42, 157, 143, 0.05) 60%,
		rgba(42, 157, 143, 0) 100%
	);
	pointer-events: none;
	z-index: -1;
}


/* ==========================================================================
   5. Rich-text margin trim
   --------------------------------------------------------------------------
   The Figma board measures every text block as its text box. Elementor's
   Text Editor emits <p>, whose trailing margin (14.4px at the footer's 15px
   body size) is then added to the auto-layout gap, pushing everything below
   it down. Trimming only the LAST child keeps the spacing between paragraphs
   intact while making the widget box equal its text box.
   Elementor 4.3 ships "optimized markup", so a widget may or may not have the
   .elementor-widget-container wrapper. Both shapes are covered below.
   ========================================================================== */
.elementor-widget-text-editor > :last-child,
.elementor-widget-text-editor > .elementor-widget-container > :last-child,
.elementor-widget-theme-post-content > :last-child,
.elementor-widget-theme-post-content > .elementor-widget-container > :last-child {
	margin-block-end: 0;
}


/* ==========================================================================
   6. Atmospheric layers
   --------------------------------------------------------------------------
   Sections 06 and 07 carry purely decorative Figma layers — blurred bubbles,
   water ribbons, a molecular silhouette and a wide aqua glow. They are drawn
   here as background layers on the section rather than as elements, so they
   add no markup, cannot be tabbed to, and cannot affect text contrast.
   Coordinates and colours are taken from the board 1:1.
   ========================================================================== */

/* --- 06 · The Science Behind AquaLink (node 88:175) --- */
.dx-science {
	position: relative;
	isolation: isolate;
}
/* Three blurred bubbles: upper-left (Ø210 @ -78,30), upper-right (Ø164 @ 1308,74),
   lower-right (Ø208 @ 1286,1042). Each is white .46 → white .16 @58% → teal .07
   @86% → transparent, which reads as the blurred ellipse without a filter. */
.dx-science::before {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: -2;
	background:
		radial-gradient(105px 105px at -78px 135px,
			rgba(255,255,255,0.46) 0%, rgba(255,255,255,0.16) 58%,
			rgba(42,157,143,0.07) 86%, rgba(42,157,143,0) 100%),
		radial-gradient(82px 82px at calc(100% - 50px) 156px,
			rgba(255,255,255,0.46) 0%, rgba(255,255,255,0.16) 58%,
			rgba(42,157,143,0.07) 86%, rgba(42,157,143,0) 100%),
		radial-gradient(104px 104px at calc(100% - 50px) calc(100% - 195px),
			rgba(255,255,255,0.46) 0%, rgba(255,255,255,0.16) 58%,
			rgba(42,157,143,0.07) 86%, rgba(42,157,143,0) 100%);
	background-repeat: no-repeat;
}
/* Two full-width water ribbons bleeding off the top and bottom edges. */
.dx-science::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: -1;
	background:
		linear-gradient(90deg, rgba(42,157,143,0.17) 0%, rgba(42,157,143,0.07) 50%, rgba(42,157,143,0.15) 100%),
		linear-gradient(90deg, rgba(42,157,143,0.12) 0%, rgba(42,157,143,0.05) 50%, rgba(42,157,143,0.10) 100%);
	background-repeat: no-repeat, no-repeat;
	background-size: 100% 92px, 100% 120px;
	background-position: 0 -26px, 0 calc(100% - 50px);
	filter: blur(13px);
}
/* Molecular silhouette (node 90:180): 4 bonds + 5 nodes at teal 13%,
   230x190 anchored at x=1010, y=150 within the 1440 board. */
.dx-science > .dx-molecule {
	position: absolute;
	inset-block-start: 150px;
	inset-inline-start: calc(50% - 720px + 1010px);
	inline-size: 230px;
	block-size: 190px;
	pointer-events: none;
	z-index: -1;
}
@media (max-width: 1439px) {
	.dx-science > .dx-molecule { display: none; }
}

/* --- 07 · Featured Experience (node 126:220) --- */
.dx-featured {
	position: relative;
	isolation: isolate;
}
/* Aqua Glow: Ø700 ellipse at (-30, 200), teal .18 → .05 @60% → 0, blur 110. */
.dx-featured::before {
	content: "";
	position: absolute;
	inset-block-start: 200px;
	inset-inline-start: -30px;
	inline-size: 700px;
	block-size: 700px;
	border-radius: 50%;
	background: radial-gradient(closest-side,
		rgba(42,157,143,0.18) 0%, rgba(42,157,143,0.05) 60%, rgba(42,157,143,0) 100%);
	pointer-events: none;
	z-index: -1;
}

/* A self-hosted video must fill the card it is cropped into. */
.dx-featured .e-self-hosted-video,
.dx-featured video {
	inline-size: 100%;
	block-size: 100%;
	object-fit: cover;
	display: block;
}

/* Bonds N1-N2, N2-N3, N2-N4, N4-N5 and five nodes, read off node 90:180. */
.dx-science > .dx-molecule {
	background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 190"><g stroke="%232A9D8F" stroke-opacity=".13" stroke-width="1.25"><line x1="38" y1="54" x2="118" y2="30"/><line x1="118" y1="30" x2="186" y2="78"/><line x1="118" y1="30" x2="104" y2="116"/><line x1="104" y1="116" x2="178" y2="150"/></g><g fill="%232A9D8F" fill-opacity=".13"><circle cx="38" cy="54" r="13"/><circle cx="118" cy="30" r="19"/><circle cx="186" cy="78" r="11"/><circle cx="104" cy="116" r="15"/><circle cx="178" cy="150" r="10"/></g></svg>');
	background-repeat: no-repeat;
	background-size: 100% 100%;
}

/* The scrim, duration pill and name sit above the player; they must not
   intercept clicks or the native video controls become unreachable. */
.dx-video-overlay {
	pointer-events: none;
}


/* ==========================================================================
   7. FAQ disclosure
   --------------------------------------------------------------------------
   The homepage FAQ preview is an Elementor loop over the `faq` post type, so
   it renders as question/answer pairs rather than as one accordion widget.
   These rules give it the board's appearance; assets/js/faq-disclosure.js
   adds the button semantics. Without JS every answer stays visible, which is
   the right fallback for this content.
   ========================================================================== */
.dx-faq-loop .elementor-grid {
	gap: 0;
}
.dx-faq-item .dx-faq-q .elementor-heading-title {
	margin: 0;
}
/* Hello Elementor's reset.css paints every button pink on hover/focus
   (`button:hover { background-color: #c36 }`, specificity 0,1,1). `all: unset`
   is a different declaration and cannot override it, so the neutral state is
   spelled out here at 0,2,0. */
.elementor .dx-faq-toggle,
.elementor .dx-faq-toggle:hover,
.elementor .dx-faq-toggle:focus,
.elementor .dx-faq-toggle:active {
	background-color: transparent;
	color: inherit;
	text-decoration: none;
	box-shadow: none;
}
.dx-faq-toggle {
	all: unset;
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 32px;
	inline-size: 100%;
	cursor: pointer;
	font: inherit;
	color: inherit;
	text-align: start;
}
.dx-faq-toggle::after {
	content: "";
	flex: 0 0 auto;
	inline-size: 18px;
	block-size: 18px;
	/* teal plus sign, drawn from two 2px bars as on the board */
	background:
		linear-gradient(#1F7A6E, #1F7A6E) center / 16px 2px no-repeat,
		linear-gradient(#1F7A6E, #1F7A6E) center / 2px 16px no-repeat;
	transition: transform .18s ease;
}
.dx-faq-item.is-open .dx-faq-toggle::after {
	/* the vertical bar is hidden, leaving a minus */
	background: linear-gradient(#1F7A6E, #1F7A6E) center / 16px 2px no-repeat;
}
/* The board sets the answer measure to 620, not the full 740 column. Capping
   the widget wrapper does not stick (Elementor resolves the text-editor
   wrapper's inline size to 100% of the flex line), so the cap goes on the
   paragraph itself, which nothing else sizes. */
.elementor .dx-faq-a > p,
.elementor .dx-faq-a > .elementor-widget-container > p {
	max-inline-size: 620px;
}
.dx-faq-a[hidden] {
	display: none;
}

/* Article cards: the loop item must fill its grid cell so all three align. */
.dx-article-loop .elementor-grid > .e-loop-item,
.dx-article-loop .elementor-loop-container > .e-loop-item {
	display: flex;
}
.dx-article-card {
	inline-size: 100%;
}
.dx-article-card .dx-article-img img {
	inline-size: 100%;
	block-size: 240px;
	object-fit: cover;
	display: block;
}
.dx-read-link .elementor-heading-title a {
	color: inherit;
	text-decoration: none;
}


/* ==========================================================================
   8. "What AquaLink supports" — the five-state feature panel
   --------------------------------------------------------------------------
   Figma node 96:181 for the layout, and the Foundations board
   "Supports Interaction - States" (100:13) for the five states.

   Five panels are stacked in a fixed-height well on the left, and the list on
   the right drives which one is shown. The well is fixed because the five
   copy blocks differ in height (132-164 in the board) and the brief requires
   no layout shift; the board's 990 band assumes state 01's copy only.

   Activation is pointer-, click- AND keyboard-driven; see
   assets/js/supports-panel.js. The last activated item stays active.
   ========================================================================== */
.elementor .dx-supports__left {
	/* All five panels share one grid cell, so the well is always exactly as
	   tall as the tallest state. A fixed height would need re-measuring every
	   time the copy changes, and would clip whichever state grew. */
	display: grid;
	grid-template-columns: 1fr;
}

.elementor .dx-supports__panel {
	grid-area: 1 / 1;
	display: flex;
	flex-direction: column;
	gap: 28px;
	opacity: 0;
	visibility: hidden;
	transform: scale(1.01);
	transition: opacity .26s ease, transform .26s ease, visibility 0s linear .26s;
}
.dx-supports__panel.is-active {
	opacity: 1;
	visibility: visible;
	transform: none;
	transition: opacity .26s ease, transform .26s ease, visibility 0s;
}
/* Without JS every panel would stack on top of the others; show the first. */
.no-js .elementor .dx-supports__panel:not(:first-child) {
	display: none;
}
.no-js .elementor .dx-supports__panel:first-child {
	opacity: 1;
	visibility: visible;
	transform: none;
}

.elementor .dx-supports__visual {
	inline-size: 100%;
	block-size: 420px;
	flex: 0 0 auto;
	border-radius: 12px;
	overflow: hidden;
	background-color: #E9F4F7;
}
.dx-supports__visual img {
	inline-size: 100%;
	block-size: 100%;
	object-fit: cover;
	display: block;
}

/* ---- the right-hand list ---- */
/* Same pink-button reset as the FAQ toggle above. */
.elementor .dx-supports__item,
.elementor .dx-supports__item:hover,
.elementor .dx-supports__item:focus,
.elementor .dx-supports__item:active {
	background-color: transparent;
	color: inherit;
	text-decoration: none;
	box-shadow: none;
}
.elementor .dx-supports__item {
	all: unset;
	box-sizing: border-box;
	position: relative;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	inline-size: 100%;
	block-size: 100px;
	padding-inline: 0 0;
	border-block-end: 1px solid #E2E8F0;
	cursor: pointer;
	transition: padding-inline-start .2s ease;
}
/* The board draws the active edge as a 3x40 bar centred in the row, not as a
   full-height border, so it is a pseudo-element rather than a border-left. */
.elementor .dx-supports__item::before {
	content: "";
	position: absolute;
	inset-inline-start: 0;
	inset-block-start: 30px;
	inline-size: 3px;
	block-size: 40px;
	border-radius: 3px;
	background-color: #2A9D8F;
	opacity: 0;
	transition: opacity .2s ease;
}
.elementor .dx-supports__item[aria-selected="true"] {
	padding-inline-start: 20px;
}
.elementor .dx-supports__item[aria-selected="true"]::before {
	opacity: 1;
}

.dx-supports__item-title {
	flex: 1 1 auto;
	font-family: Poppins, sans-serif;
	font-size: 18px;
	font-weight: 500;
	line-height: 26px;
	color: #5B6B82;
	transition: color .2s ease;
}
.dx-supports__item[aria-selected="true"] .dx-supports__item-title {
	color: #0F172A;
	font-weight: 600;
}

.elementor .dx-supports__arrow {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	inline-size: 44px;
	block-size: 44px;
	border-radius: 999px;
	border: 1.25px solid rgba(15, 23, 42, 0.5);
	color: #1F7A6E;
	transition: background-color .2s ease, border-color .2s ease, color .2s ease;
}
.elementor .dx-supports__arrow::after {
	content: "";
	inline-size: 11px;
	block-size: 11px;
	/* A ::after inherits `display: inline` from the atomic base block, and an
	   inline box ignores width/height — so it must be told to be a block.
	   The glyph is baked per state rather than masked with currentColor: a
	   CSS mask resolves currentColor against its own document, not the host. */
	display: block;
	background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11"><g fill="none" stroke="%231F7A6E" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M1 10 10 1"/><path d="M3.2 1H10v6.8"/></g></svg>') center / 11px 11px no-repeat;
}
.elementor .dx-supports__item[aria-selected="true"] .dx-supports__arrow {
	background-color: #0F172A;
	border-color: #0F172A;
}
.elementor .dx-supports__item[aria-selected="true"] .dx-supports__arrow::after {
	background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 11 11"><g fill="none" stroke="%23FFFFFF" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M1 10 10 1"/><path d="M3.2 1H10v6.8"/></g></svg>');
}

/* Keyboard focus has to be visible on a control with no default outline. */
.elementor .dx-supports__item:focus-visible {
	outline: 2.5px solid #1F7A6E;
	outline-offset: -2px;
	border-radius: 4px;
}

@media (prefers-reduced-motion: reduce) {
	.elementor .dx-supports__panel,
	.elementor .dx-supports__item,
	.elementor .dx-supports__item::before,
	.elementor .dx-supports__item-title,
	.elementor .dx-supports__arrow {
		transition-duration: .01ms;
	}
	.elementor .dx-supports__panel { transform: none; }
}

/* Tablet and below: the visual leads, the list follows, interaction unchanged. */
@media (max-width: 1024px) {
	.elementor .dx-supports__visual { block-size: 360px; }
}
@media (max-width: 767px) {
	.elementor .dx-supports__visual { block-size: 240px; }
	.elementor .dx-supports__item { block-size: auto; padding-block: 20px; }
	.elementor .dx-supports__item[aria-selected="true"] { padding-inline-start: 16px; }
}

/* --------------------------------------------------------------------------
   Supports: between Elementor's desktop and tablet breakpoints the two fixed
   columns (636 + 48 + 516 = 1200) are wider than the available measure, so
   they have to become flexible before they overflow. Elementor's own tablet
   rule only fires at 1024, which is 176px too late.
   -------------------------------------------------------------------------- */
@media (max-width: 1199px) {
	.elementor .dx-supports__left,
	.elementor .dx-supports__list {
		inline-size: auto;
		flex: 1 1 0;
		min-inline-size: 0;
	}
}
/* Narrower than that, side by side stops being readable: the visual leads and
   the list sits underneath, with the interaction unchanged. */
@media (max-width: 899px) {
	.elementor .dx-supports__cols {
		flex-direction: column;
	}
	.elementor .dx-supports__left,
	.elementor .dx-supports__list {
		inline-size: 100%;
		flex: 0 0 auto;
	}
}

/* ==========================================================================
   9. Overlapping compositions below 1200
   --------------------------------------------------------------------------
   Sections 03 and 07 are built as two fixed columns that deliberately overlap
   (700 + 560 and 480 + 780, each pulled back 60px). Those widths are drawn
   for the 1200 measure; below it they push past the viewport. Elementor's own
   tablet breakpoint is 1024, which is already too late, so the columns become
   flexible at 1199 and stop overlapping at 899.
   ========================================================================== */
@media (max-width: 1199px) {
	.elementor .dx-why__card,
	.elementor .dx-featured__card {
		inline-size: auto;
		flex: 1 1 0;
		min-inline-size: 0;
	}
	.elementor .dx-why__plate,
	.elementor .dx-featured__left {
		inline-size: auto;
		flex: 1 1 0;
		min-inline-size: 0;
	}
}
@media (max-width: 899px) {
	.elementor .dx-why__row,
	.elementor .dx-featured__row {
		flex-direction: column;
	}
	.elementor .dx-why__card,
	.elementor .dx-why__plate,
	.elementor .dx-featured__left,
	.elementor .dx-featured__card {
		inline-size: 100%;
		flex: 0 0 auto;
		/* the overlap and the vertical offset only make sense side by side */
		margin: 0;
	}
	.elementor .dx-why__plate { block-size: 420px; margin-block-start: 32px; }
	.elementor .dx-featured__card { margin-block-start: 32px; }
	.elementor .dx-why__card,
	.elementor .dx-featured__card { padding: 40px 32px; }
}

/* On a phone the card's own padding competes with the page gutter for an
   already narrow measure, so it comes in to match. */
@media (max-width: 767px) {
	.elementor .dx-why__card,
	.elementor .dx-featured__card { padding: 32px 24px; }
}

/* Absolutely positioned accent plates are sized to their sibling, so they have
   to stop being fixed-width at the same breakpoint the sibling does. */
@media (max-width: 1199px) {
	.elementor .dx-why__accent,
	.elementor .dx-featured__accent {
		inline-size: auto;
		inset-inline-end: -36px;
	}
	.elementor .dx-featured__accent { inset-inline-end: 36px; inset-inline-start: -36px; }

	.elementor .dx-faq__headcol,
	.elementor .dx-faq__loopwrap {
		inline-size: auto;
		flex: 1 1 0;
		min-inline-size: 0;
	}
	.elementor .dx-faq__headcol { flex: 0 1 320px; }
}
@media (max-width: 899px) {
	.elementor .dx-faq__row { flex-direction: column; }
	.elementor .dx-faq__headcol,
	.elementor .dx-faq__loopwrap { inline-size: 100%; flex: 0 0 auto; }
	.elementor .dx-why__accent,
	.elementor .dx-featured__accent { display: none; }
}

/* A CSS grid track's automatic minimum is min-content, so a loop item with any
   fixed-width descendant will refuse to shrink. */
.dx-faq-loop .elementor-grid,
.dx-article-loop .elementor-grid {
	min-inline-size: 0;
}
.dx-faq-loop .e-loop-item,
.dx-article-loop .e-loop-item {
	min-inline-size: 0;
}

/* --------------------------------------------------------------------------
   Footer columns. 440 brand + 96 gutter + 664 links is drawn for the 1200
   measure; below it the fixed widths push past the band, and because the
   footer clips its decorative glow the overflow silently cuts content off
   rather than producing a scrollbar.
   -------------------------------------------------------------------------- */
@media (max-width: 1199px) {
	.dx-footer .dx-footer__brand {
		width: auto;
		flex: 1 1 320px;
		min-width: 0;
	}
	.dx-footer .dx-footer__cols {
		flex: 1 1 420px;
		min-width: 0;
		gap: 40px;
	}
	.dx-footer .dx-footer__col {
		width: auto;
		flex: 1 1 auto;
		min-width: 140px;
	}
}
@media (max-width: 767px) {
	.dx-footer .dx-footer__brand,
	.dx-footer .dx-footer__cols { flex: 1 1 100%; }
	.dx-footer .dx-footer__col { flex: 1 1 45%; }
}


/* ==========================================================================
   10. Fixed header and scroll state
   --------------------------------------------------------------------------
   Behaviour copied from aqualinkh2o.com, measured on the live site: the header
   is fixed at the top, transparent-surfaced at rest, and past the scroll
   threshold it compacts (84 -> 68 there, 88 -> 68 here) and gains a
   translucent blurred surface with a hairline, over a 500ms premium ease.
   The palette is Dercums' own — its header is paper, not navy.
   ========================================================================== */
:root {
	--dx-header-h: 88px;
	--dx-header-h-scrolled: 68px;
	--dx-ease-premium: cubic-bezier(0.22, 1, 0.36, 1);
	/* Page gutter below the mobile breakpoint. Anything that bleeds out of a
	   band measures itself from this, so there is one number to change. */
	--dx-gutter: 20px;
}

.elementor-location-header {
	position: fixed;
	inset-block-start: 0;
	inset-inline: 0;
	z-index: 80;
}

/* The header no longer occupies flow, so the document has to start below it. */
body {
	padding-block-start: var(--dx-header-h);
}

.elementor .dx-header {
	min-block-size: var(--dx-header-h);
	background-color: #FFFFFF;
	transition:
		min-block-size .5s var(--dx-ease-premium),
		background-color .5s var(--dx-ease-premium),
		box-shadow .5s var(--dx-ease-premium),
		backdrop-filter .5s var(--dx-ease-premium);
}
/* Elementor emits the container background as
   `.elementor-37 .elementor-element.elementor-element-x:not(.elementor-motion-effects-element-type-background)`,
   whose :not() puts it at 0,4,0 — above anything sane a child theme can write.
   The scrolled surface is the one place that has to win outright. */
.elementor .dx-header.is-scrolled {
	min-block-size: var(--dx-header-h-scrolled);
	background-color: rgba(255, 255, 255, 0.92) !important;
	-webkit-backdrop-filter: blur(12px);
	backdrop-filter: blur(12px);
	box-shadow: 0 1px 0 rgba(15, 23, 42, 0.08), 0 10px 30px -18px rgba(15, 23, 42, 0.35);
}
/* The logo shrinks with the bar, as it does on the parent site. */
.elementor .dx-header .dx-header__logo img {
	transition: width .5s var(--dx-ease-premium);
}
.elementor .dx-header.is-scrolled .dx-header__logo img {
	width: 140px;
}

/* Elementor's own burger belongs to the nav-menu widget; the drawer replaces it. */
.elementor .dx-header .elementor-menu-toggle,
.elementor .dx-header .elementor-nav-menu--dropdown {
	display: none !important;
}

/* ---- the toggle ---- */
.elementor .dx-header__toggle .elementor-widget-container,
.elementor .dx-header__toggle {
	line-height: 0;
}
.dx-nav-toggle,
.dx-nav-toggle:hover,
.dx-nav-toggle:focus,
.dx-nav-toggle:active {
	display: grid;
	place-items: center;
	inline-size: 44px;
	block-size: 44px;
	padding: 0;
	border: 1px solid rgba(15, 23, 42, 0.2);
	border-radius: 999px;
	background-color: transparent;
	color: #0F172A;
	cursor: pointer;
	transition: border-color .2s ease, background-color .2s ease;
}
.dx-nav-toggle:hover {
	border-color: rgba(15, 23, 42, 0.5);
}
.dx-nav-toggle:focus-visible {
	outline: 2.5px solid #1F7A6E;
	outline-offset: 2px;
}
.dx-nav-toggle__bars,
.dx-nav-toggle__bars::before,
.dx-nav-toggle__bars::after {
	display: block;
	inline-size: 18px;
	block-size: 2px;
	border-radius: 2px;
	background-color: currentColor;
}
.dx-nav-toggle__bars {
	position: relative;
}
.dx-nav-toggle__bars::before,
.dx-nav-toggle__bars::after {
	content: "";
	position: absolute;
	inset-inline-start: 0;
}
.dx-nav-toggle__bars::before { inset-block-start: -6px; }
.dx-nav-toggle__bars::after  { inset-block-start: 6px; }


/* ==========================================================================
   11. Mobile navigation drawer
   --------------------------------------------------------------------------
   Same shape as the parent site: a blurred navy scrim over the page and a
   panel sliding in from the right at min(88vw, 22rem), logo and close control
   at the top, the primary links stacked with hairlines, and the CTA pinned to
   the bottom.
   ========================================================================== */
.dx-drawer {
	position: fixed;
	inset: 0;
	z-index: 90;
}
.dx-drawer[hidden] {
	display: none;
}
.dx-drawer__scrim {
	position: absolute;
	inset: 0;
	inline-size: 100%;
	block-size: 100%;
	padding: 0;
	border: 0;
	cursor: default;
	background-color: rgba(11, 17, 32, 0.7);
	-webkit-backdrop-filter: blur(4px);
	backdrop-filter: blur(4px);
	opacity: 0;
	transition: opacity .4s var(--dx-ease-premium);
}
.dx-drawer.is-open .dx-drawer__scrim {
	opacity: 1;
}
.dx-drawer__panel {
	position: absolute;
	inset-block: 0;
	inset-inline-end: 0;
	display: flex;
	flex-direction: column;
	inline-size: min(88vw, 22rem);
	padding: 20px 24px 32px;
	background-color: #0B1120;
	box-shadow: -24px 0 60px -24px rgba(0, 0, 0, 0.6);
	transform: translateX(100%);
	transition: transform .42s var(--dx-ease-premium);
	overflow-y: auto;
	overscroll-behavior: contain;
}
.dx-drawer.is-open .dx-drawer__panel {
	transform: none;
}

.dx-drawer__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin-block-end: 24px;
}
.dx-drawer__logo img {
	display: block;
	inline-size: 148px;
	block-size: auto;
}
.dx-drawer__close,
.dx-drawer__close:hover,
.dx-drawer__close:focus,
.dx-drawer__close:active {
	display: grid;
	place-items: center;
	inline-size: 44px;
	block-size: 44px;
	flex: 0 0 auto;
	padding: 0;
	border: 1px solid rgba(42, 157, 143, 0.75);
	border-radius: 999px;
	background-color: transparent;
	color: #FFFFFF;
	cursor: pointer;
}
.dx-drawer__close::before,
.dx-drawer__close::after {
	content: "";
	position: absolute;
	inline-size: 16px;
	block-size: 2px;
	border-radius: 2px;
	background-color: currentColor;
}
.dx-drawer__close { position: relative; }
.dx-drawer__close::before { transform: rotate(45deg); }
.dx-drawer__close::after  { transform: rotate(-45deg); }
.dx-drawer__close:focus-visible {
	outline: 2.5px solid #2A9D8F;
	outline-offset: 2px;
}

.dx-drawer__nav ul {
	list-style: none;
	margin: 0;
	padding: 0;
}
.dx-drawer__nav li + li {
	border-block-start: 1px solid rgba(255, 255, 255, 0.1);
}
.dx-drawer__nav a {
	display: block;
	padding-block: 16px;
	font-family: Poppins, sans-serif;
	font-size: 17px;
	font-weight: 500;
	line-height: 26px;
	color: #CBD5E1;
	text-decoration: none;
	transition: color .2s ease;
}
.dx-drawer__nav a:hover,
.dx-drawer__nav a[aria-current="page"] {
	color: #E9C46A;
}
.dx-drawer__nav a:focus-visible {
	outline: 2.5px solid #2A9D8F;
	outline-offset: 2px;
}

.dx-drawer__cta {
	margin-block-start: auto;
	display: flex;
	align-items: center;
	justify-content: center;
	block-size: 56px;
	border-radius: 8px;
	background-color: #E9C46A;
	color: #0F172A;
	font-family: Poppins, sans-serif;
	font-size: 13px;
	font-weight: 600;
	letter-spacing: 1.04px;
	text-transform: uppercase;
	text-decoration: none;
}
.dx-drawer__cta:hover { background-color: #D9AE4A; }
.dx-drawer__cta:focus-visible {
	outline: 2.5px solid #2A9D8F;
	outline-offset: 2px;
}

html.dx-drawer-open,
html.dx-drawer-open body {
	overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {
	.dx-drawer__panel,
	.dx-drawer__scrim,
	.elementor .dx-header,
	.elementor .dx-header .dx-header__logo img {
		transition-duration: .01ms;
	}
}


/* ==========================================================================
   12. Testimonial poster, play control and video dialog
   ========================================================================== */
.elementor .dx-video__play,
.elementor .dx-video__play:hover,
.elementor .dx-video__play:focus,
.elementor .dx-video__play:active {
	/* Hello Elementor paints buttons pink on hover; see section 7. */
	background-color: rgba(15, 23, 42, 0.38);
	color: #FFFFFF;
	/* inset-inline-start/block-start are 50%, so pull back by half the box */
	transform: translate(-50%, -50%);
	transition: background-color .25s ease, border-color .25s ease, transform .25s ease;
}
.elementor .dx-video__play:hover {
	background-color: rgba(15, 23, 42, 0.62);
	border-color: rgba(255, 255, 255, 0.9);
	transform: translate(-50%, -50%) scale(1.06);
}
.elementor .dx-video__play:focus-visible {
	outline: 2.5px solid #2A9D8F;
	outline-offset: 3px;
}
/* The Figma triangle is 15x17. A border triangle has to be nudged with a
   margin to look centred, and that margin also shifts it off the true centre;
   an SVG whose own viewBox is balanced needs no nudge at all. */
.elementor .dx-video__tri {
	inline-size: 18px;
	block-size: 20px;
	background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="18" height="20" viewBox="0 0 18 20"><path d="M16.2 8.7 2.7.3A1.5 1.5 0 0 0 .4 1.6v16.8a1.5 1.5 0 0 0 2.3 1.3l13.5-8.4a1.5 1.5 0 0 0 0-2.6Z" fill="%23FFFFFF"/></svg>') center / contain no-repeat;
}

.dx-video-modal {
	inline-size: min(92vw, 520px);
	max-block-size: 90dvh;
	padding: 0;
	border: 0;
	border-radius: 20px;
	background: transparent;
	overflow: visible;
}
.dx-video-modal::backdrop {
	background-color: rgba(11, 17, 32, 0.82);
	-webkit-backdrop-filter: blur(6px);
	backdrop-filter: blur(6px);
}
.dx-video-modal__frame {
	position: relative;
	border-radius: 20px;
	overflow: hidden;
	background-color: #0B1120;
	box-shadow: 0 30px 80px -30px rgba(0, 0, 0, 0.8);
}
.dx-video-modal__player {
	display: block;
	inline-size: 100%;
	max-block-size: 82dvh;
	background-color: #0B1120;
}
.dx-video-modal__close,
.dx-video-modal__close:hover,
.dx-video-modal__close:focus,
.dx-video-modal__close:active {
	position: absolute;
	inset-block-start: 12px;
	inset-inline-end: 12px;
	display: grid;
	place-items: center;
	inline-size: 40px;
	block-size: 40px;
	padding: 0;
	border: 1px solid rgba(255, 255, 255, 0.35);
	border-radius: 999px;
	background-color: rgba(15, 23, 42, 0.62);
	color: #FFFFFF;
	cursor: pointer;
}
.dx-video-modal__close::before,
.dx-video-modal__close::after {
	content: "";
	position: absolute;
	inline-size: 14px;
	block-size: 2px;
	border-radius: 2px;
	background-color: currentColor;
}
.dx-video-modal__close::before { transform: rotate(45deg); }
.dx-video-modal__close::after  { transform: rotate(-45deg); }
.dx-video-modal__close:focus-visible {
	outline: 2.5px solid #2A9D8F;
	outline-offset: 2px;
}

/* The board's soft line breaks are set for its own column widths. They are
   client copy and stay in the markup, but below the tablet breakpoint they
   land mid-sentence, so the text is allowed to reflow naturally instead. */
@media (max-width: 767px) {
	.dx-soft-break br {
		display: none;
	}
}


/* ==========================================================================
   13. Reveal on scroll and on load
   --------------------------------------------------------------------------
   Same motion as the parent site: elements start low and transparent and
   settle as they arrive, staggered, on cubic-bezier(.22, 1, .36, 1).

   The RESTING state is declared here and armed by an inline flag printed in
   the <head>, so the hero is already hidden on the first paint. If this
   waited for the footer script the hero would paint, disappear, then animate.
   assets/js/reveal.js only adds .is-revealed, a frame later, so the
   transition has a start state to run from.

   Rows and single-child wrappers hand the reveal down to their contents and
   mark themselves .dx-reveal-passthrough, so a grid of cards arrives card by
   card rather than as one slab.
   ========================================================================== */
.dx-reveal-ready .dx-section__wrap > *,
.dx-reveal-ready .dx-reveal {
	opacity: 0;
	transform: translateY(20px);
	transition:
		opacity .6s var(--dx-ease-premium),
		transform .6s var(--dx-ease-premium);
	will-change: opacity, transform;
}
.dx-reveal-ready .dx-reveal-passthrough,
.dx-reveal-ready .dx-reveal.is-revealed,
.dx-reveal-ready .dx-section__wrap > *.is-revealed {
	opacity: 1;
	transform: none;
	will-change: auto;
}
/* A passthrough must not animate or it would fight its own children. */
.dx-reveal-ready .dx-reveal-passthrough {
	transition: none;
}

@media (prefers-reduced-motion: reduce) {
	.dx-reveal-ready .dx-section__wrap > *,
	.dx-reveal-ready .dx-reveal {
		opacity: 1;
		transform: none;
		transition: none;
	}
}


/* ==========================================================================
   14. Mobile rhythm
   --------------------------------------------------------------------------
   The board's vertical spacing is drawn for a 1440 frame: 140px bands and
   56-88px gaps between groups. Carried to a 390 screen that reads as long
   stretches of empty paper between ideas. Bands and gaps are tightened here in
   one place rather than as a mobile variant on every section.
   ========================================================================== */
@media (max-width: 767px) {
	/* One gutter for the whole page, set once — bands, the header and the
	   footer, so everything lines up on the same rail. Each of these carries
	   its own Elementor padding at the same specificity, so this rule has to
	   come after them in the sheet, which it does. */
	.elementor .dx-band,
	.elementor .dx-header,
	.dx-footer {
		padding-inline: var(--dx-gutter);
	}
	.elementor .dx-band {
		padding-block: 56px;
	}
	.elementor .dx-section__wrap {
		row-gap: 36px;
	}
	/* The hero keeps a little more air than the other bands, but far less than
	   the board's desktop rhythm: `body` already carries the fixed header's
	   clearance, so this is breathing room only and nothing slides under the
	   bar when it is cut. Applies to every hero on the site via .dx-hero. */
	.elementor .dx-band.dx-hero {
		padding-block: 40px;
	}
}

/* The band between the two breakpoints.
   --------------------------------------------------------------------------
   The drawer nav takes over at 1024, so from there down a visitor is on what
   is plainly a small screen — but Elementor's `mobile` variants stop at 767.
   Without this the 768-1024 band keeps the board's full 1440 rhythm: 140-180px
   of padding per band, which is how the footer came to have 104px of navy
   above its logo on a tablet. The values sit between the two neighbours rather
   than jumping off a cliff at 768. */
@media (min-width: 768px) and (max-width: 1024px) {
	/* 72, not 88: with tablet landscape and laptop now active above it, this
	   is the NARROWEST of the four desktop-layout steps and has to sit below
	   them — 56 mobile, 72 here, 80 landscape, 88 laptop. It read 88 while it
	   was the only step between mobile and desktop, which left a 900px screen
	   with more band padding than an 1100px one. */
	.elementor .dx-band {
		padding-block: 72px;
	}
	.elementor .dx-section__wrap {
		row-gap: 48px;
	}
	.elementor .dx-band.dx-hero {
		padding-block: 56px;
	}
}


/* ==========================================================================
   15. Hero photograph below the nav breakpoint
   --------------------------------------------------------------------------
   On desktop the hero is copy over a full-bleed photograph with a
   left-to-right scrim, which is the approved board. That composition assumes
   a landscape frame: the source is 1671x941 and the product sits at about 62%
   across, so on a portrait viewport `cover` crops it out of the picture
   entirely.

   aqualinkh2o.com solves this by changing the composition rather than the
   crop — on mobile its hero is a solid navy band with the product as a real
   image block between the headline and the body copy. Same approach here.

   The 85% object-position is measured, not guessed: at a 5:4 block the source
   scales to 1108px wide against a 390px window, and 85% of that 328px of
   overflow is what centres the tub with its splash and molecules intact.

   NOTE: an atomic e-image renders the <img> itself — there is no wrapper — so
   every one of these declarations belongs on the same element, and
   `max-inline-size` has to be released or e-image-base's `max-width: 100%`
   caps the bleed back to the column width.
   ========================================================================== */
.elementor .dx-hero__photo {
	display: none;
}

/* Every hero shares the behaviour below but not the values: the homepage is
   white copy on a navy scrim, the Science hero is navy copy on a white wash,
   and each photograph has its own subject placement. Both are declared as
   custom properties so a second hero is a two-line override, not a fork of
   the whole block. Defaults are the homepage's. */
.elementor .dx-band.dx-hero {
	--dx-hero-solid: #0F172A;
	--dx-hero-focus: 85%;
	--dx-hero-focus-wide: 72%;
	--dx-hero-ratio: 5 / 4;
}

/* The Science hero. Its wash is white and its ink is navy, so the solid
   colour has to invert or the copy lands white-on-white. 70% is measured the
   same way as the homepage's 85%: at a 5:4 block the 1942x809 source scales to
   749px against a 390px window, and 70% of that 359px of overflow is the only
   offset that keeps the molecule, the powder dish and the tub all in frame. */
.elementor .dx-band.dx-hero.dx-hero--light {
	--dx-hero-solid: #FFFFFF;
	--dx-hero-focus: 70%;
	--dx-hero-focus-wide: 70%;
}

@media (max-width: 1024px) {
	/* The band becomes solid, so the scrim has nothing left to do — unless the
	   hero opted out (see dx-hero--keep-bg below). */
	.elementor .dx-band.dx-hero:not(.dx-hero--keep-bg) {
		background-image: none;
		background-color: var(--dx-hero-solid);
	}

	/* The copy column is 620px wide by design. The bleed below is measured
	   from its own width, so it has to fill the band first or the image stops
	   short of the right edge. */
	.elementor .dx-hero__copy {
		inline-size: 100%;
		max-inline-size: 100%;
	}

	.elementor .dx-hero:not(.dx-hero--keep-bg) .dx-hero__photo {
		display: block;
		/* The homepage hero's copy column carries a 26px gap so the photo is
		   spaced by its siblings; the Science hero spaces its lines with their
		   own margins instead, which leaves the photo flush against the
		   headline above and the intro below. Owning its own margin makes the
		   photo correct in both, and `margin-block` does not fight the
		   `margin-inline` bleed below. */
		margin-block: 28px;
		/* Full bleed out of the band's own gutter. */
		inline-size: calc(100% + (2 * var(--dx-gutter)));
		max-inline-size: none;
		margin-inline: calc(-1 * var(--dx-gutter));
		aspect-ratio: var(--dx-hero-ratio);
		object-fit: cover;
		object-position: var(--dx-hero-focus) center;
	}
}

/* Between the nav breakpoint and mobile the section keeps 40px of inline
   padding and the frame is wider, so the bleed and the crop both change. */
@media (max-width: 1024px) and (min-width: 768px) {
	.elementor .dx-hero:not(.dx-hero--keep-bg) .dx-hero__photo {
		/* Above the mobile breakpoint the band keeps Elementor's 40px. */
		inline-size: calc(100% + 80px);
		margin-inline: -40px;
		aspect-ratio: 16 / 9;
		object-position: var(--dx-hero-focus-wide) center;
	}
}


/* ==========================================================================
   16. Science page
   --------------------------------------------------------------------------
   Everything here is a pattern the atomic style schema cannot express:
   `overflow: clip`, viewport-relative bleeds, generated hairlines, and a real
   data table. Values are read from the approved board
   (page "03 — Science · Desktop").
   ========================================================================== */

/* --- decorative blocks narrower than 30px --------------------------------
   Elementor floors every container at min-width: 30px so an empty one stays
   grabbable in the editor. That is an editor affordance, not a layout rule,
   and it silently renders the 9px process-track dots as 30x9 dashes. `:empty`
   cannot be used to catch these — an Elementor container always contains a
   whitespace text node — so the blocks that need the floor released carry
   dx-dot. Every rule and hairline in this build is wider than 30px and so is
   unaffected. */
.elementor .dx-dot {
	min-inline-size: 0;
}

/* --- decorative node-and-bond textures ----------------------------------
   Two frames of 77 and 87 hairlines with 35 and 42 dots. Reproducing them as
   atomic elements would add 112 nodes of page data for pure decoration, so
   they are exported once and painted as backgrounds. Both deliberately hang
   outside their band, hence the clip on the band rather than on the texture:
   `clip` (not `hidden`) because it must not create a scroll container. */
.elementor .dx-band.dx-has-texture,
.elementor .dx-band.dx-has-bleed {
	overflow: clip;
}
.elementor .dx-tex {
	pointer-events: none;
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
}
.elementor .dx-tex--lattice {
	background-image: url("assets/img/texture-lattice.svg");
}
.elementor .dx-tex--matrix {
	background-image: url("assets/img/texture-matrix.svg");
}

/* --- 03 · the image that hugs the viewport edge -------------------------
   The board zeroes this band's left padding so the 640x820 image touches the
   frame edge. A fixed width would only be right at 1440, so the bleed is
   measured from the measure itself: margin percentages resolve against the
   flex container, so `50% - 50vw` is exactly the distance from the measure's
   left edge to the viewport's, at any width. The image then grows to fill
   what is left beside the 600px copy column — 640px at 1440, as drawn. */
@media (min-width: 1025px) {
	.elementor .dx-sci-split__media {
		margin-inline-start: calc(50% - 50vw);
		inline-size: auto;
		max-inline-size: none;
		flex: 1 1 auto;
	}
	/* Both items need their automatic minimum released or they refuse to
	   shrink: a flex item's `min-width: auto` floors an <img> at its own
	   aspect-derived width, so between 1025 and 1280 — where the measure is
	   narrower than 1200 but the row has not stacked yet — the pair overflows
	   the viewport by whatever the bleed took. With the floor gone the row
	   still resolves to the board's 640 + 80 + 600 at 1440, because the image
	   is the only item that grows. */
	.elementor .dx-sci-split__media,
	.elementor .dx-sci-split__copy {
		min-inline-size: 0;
	}
	.elementor .dx-sci-split__copy {
		flex: 0 1 600px;
	}
}

/* --- 05 · the process track --------------------------------------------
   Each step owns its dot and numeral (.dx-sci-step__rail). On desktop the
   four rails sit side by side and read as one track, so only the connecting
   hairline is drawn here: 936x1 running centre-to-centre of the first and
   last dot. Four 264 columns in a 1200 row put those centres at 132 and 1068,
   i.e. 11% in from each end. Generated rather than built, so it cannot drift
   out of alignment with the dots. A sized pseudo-element needs an explicit
   display or it collapses. */
.elementor .dx-sci-steps::before {
	content: "";
	display: block;
	position: absolute;
	inset-block-start: 4px;
	inset-inline: 11%;
	block-size: 1px;
	background-color: #CBD5E1;
}

/* Below the four-across layout the track turns ninety degrees: the spine runs
   down the left, each dot sits on it with its numeral beneath, and the step's
   image and copy sit to the right. The connector is drawn per step rather than
   as one line down the column so it stops at the last dot instead of running
   on into the whitespace below it. */
@media (max-width: 767px) {
	.elementor .dx-sci-steps {
		--dx-rail: 40px;
		--dx-step-gap: 40px;
		row-gap: var(--dx-step-gap);
		align-items: stretch;
	}
	.elementor .dx-sci-steps::before {
		content: none;   /* the horizontal hairline has nothing to connect */
	}

	.elementor .dx-sci-step {
		flex-direction: row;
		align-items: flex-start;
		column-gap: 20px;
		inline-size: 100%;
	}
	.elementor .dx-sci-step__rail {
		position: relative;
		flex: 0 0 var(--dx-rail);
		inline-size: var(--dx-rail);
		/* The step aligns its children to flex-start, which leaves the rail
		   only as tall as the dot and numeral — 41px — and the connector below
		   is measured from the rail's own box, so it would stop a long way
		   short of the next dot. Stretching it to the step's full height costs
		   nothing: the rail is a column, so the dot stays at the top. */
		align-self: stretch;
	}
	/* From this dot down to the next one. The dot paints over the top of it. */
	.elementor .dx-sci-step:not(:last-child) .dx-sci-step__rail::after {
		content: "";
		display: block;
		position: absolute;
		inset-block: 4px calc(-1 * var(--dx-step-gap));
		inset-inline-start: calc(50% - 0.5px);
		inline-size: 1px;
		background-color: #CBD5E1;
	}
	/* Centred under the dot on desktop; ranged left beside it on mobile. */
	.elementor .dx-sci-step__card,
	.elementor .dx-sci-step__card * {
		align-items: flex-start;
		text-align: start;
	}
}

/* --- 08 · the mechanism table -------------------------------------------
   A real <table>: the board draws column headers over paired values, which is
   tabular data, and a screen reader should announce the pairing. The atomic
   set has no table element, so this one block is a core HTML widget. */
.elementor .dx-table {
	margin-block: 0;   /* Elementor's reset gives every table 15px below it */
	inline-size: 100%;
	border-collapse: collapse;
	table-layout: fixed;   /* auto layout otherwise re-sizes both columns to fit content */
	text-align: start;
}
/* With table-layout: fixed the column widths are taken from the FIRST row, so
   they belong on the head cells — 480 (400 of label + an 80 gutter) leaves the
   values the board's 720. */
.elementor .dx-table thead th:first-child {
	inline-size: 480px;
}
/* Hello Elementor's reset gives every cell a 1px grey border on all four
   sides and a 7% grey wash. The board has neither — only a horizontal rule
   under each row — so both are cleared before the board's own rules go on. */
.elementor .dx-table th,
.elementor .dx-table td {
	background-color: transparent;
	border: 0;
}
/* The head row's top border comes from a SEPARATE Hello rule,
   `table thead:first-child tr:first-child th`, which at (0,2,4) outranks the
   reset above at (0,2,1) — so the sides and bottom clear but the top line
   survives. Matched here selector-for-selector so the later sheet wins. */
.elementor .dx-table thead:first-child tr:first-child th {
	border-block-start: 0;
}
.elementor .dx-table thead th {
	font-family: Poppins, sans-serif;
	font-size: 13px;
	line-height: 20px;
	font-weight: 500;
	letter-spacing: 0.26px;
	text-transform: uppercase;
	color: #5B6B82;
	text-align: start;
	padding: 0 0 16px;
	border-block-end: 1px solid #CBD5E1;
}
.elementor .dx-table tbody th,
.elementor .dx-table tbody td {
	font-family: Poppins, sans-serif;
	text-align: start;
	vertical-align: top;
	padding-block: 28px;
	border-block-end: 1px solid #E2E8F0;
}
.elementor .dx-table tbody th {
	padding-inline-end: 80px;
	font-size: 18px;
	line-height: 26px;
	font-weight: 600;
	color: #0F172A;
}
.elementor .dx-table tbody td {
	font-size: 17px;
	line-height: 30px;
	font-weight: 400;
	color: #475569;
}
/* Two columns of this width cannot survive a phone, so the table becomes a
   stack of labelled blocks. The header row is hidden rather than removed —
   the row headers still name each value. */
@media (max-width: 767px) {
	.elementor .dx-table,
	.elementor .dx-table tbody,
	.elementor .dx-table tr,
	.elementor .dx-table tbody th,
	.elementor .dx-table tbody td {
		display: block;
		inline-size: auto;
	}
	.elementor .dx-table thead {
		position: absolute;
		inline-size: 1px;
		block-size: 1px;
		overflow: hidden;
		clip-path: inset(50%);
		white-space: nowrap;
	}
	.elementor .dx-table tbody th {
		padding: 24px 0 6px;
		border-block-end: 0;
	}
	.elementor .dx-table tbody td {
		padding: 0 0 24px;
	}
}

/* --- 09 · the pro-fibrotic actions --------------------------------------
   Three columns at 32 / 400 / auto on the board. Below the tablet breakpoint
   the 400px title column is wider than the screen, so the row stacks and the
   fixed widths have to be released. */
@media (max-width: 1024px) {
	.elementor .dx-sci-actions__row {
		flex-direction: column;
		row-gap: 8px;
	}
	.elementor .dx-sci-actions__row > * {
		inline-size: 100%;
		flex: 0 0 auto;
	}
}

/* --- 10 · the source panel ---------------------------------------------- */
.elementor .dx-sci-source > * {
	min-inline-size: 0;   /* a flex item's min-content floor otherwise wins */
}

/* --- the breadcrumb -----------------------------------------------------
   Moved to section 32: the trail is Yoast's markup now, not ours. */


/* ==========================================================================
   17. Mobile type step
   --------------------------------------------------------------------------
   The design-system roles (dx-h1 … dx-eyebrow) carry their own mobile sizes as
   global classes, and the footer's classic widgets carry responsive settings.
   What is left are the handful of components whose type is written here rather
   than coming from a role. Same 25% step, same 767 breakpoint, so the whole
   page steps together instead of one component staying large.
   ========================================================================== */
@media (max-width: 767px) {
	.dx-supports__item-title {
		font-size: 13.5px;
		line-height: 19.5px;
	}

	.dx-drawer__nav a {
		font-size: 12.75px;
		line-height: 19.5px;
	}
	.dx-drawer__cta {
		font-size: 9.75px;
		letter-spacing: 0.78px;
	}

	.elementor .dx-table thead th {
		font-size: 9.75px;
		line-height: 15px;
		letter-spacing: 0.195px;
	}
	.elementor .dx-table tbody th {
		font-size: 13.5px;
		line-height: 19.5px;
	}
	.elementor .dx-table tbody td {
		font-size: 12.75px;
		line-height: 22.5px;
	}
}



/* ==========================================================================
   18. Resources CTA below the grid on mobile
   --------------------------------------------------------------------------
   The board puts "view all articles" on the heading row, opposite the h2.
   Stacked on a phone that asks people to leave before they have seen anything
   to leave for, so below the three cards is the better place for it.

   The button lives inside the heading row, so `order` alone cannot lift it out
   past the grid. `display: contents` dissolves that row into the section
   measure for the duration of the media query, which puts the heading, the
   button and the grid on one ordering axis.

   Note: a `display: contents` element generates no box, so the reveal's
   opacity on the dissolved row is simply ignored and its two children arrive
   unanimated at this width. They are visible and correctly placed, which is
   the part that matters.
   ========================================================================== */
@media (max-width: 767px) {
	.elementor .dx-res__head {
		display: contents;
	}
	.elementor .dx-res__head > :first-child {
		order: 1;
	}
	.elementor .dx-res__loop {
		order: 2;
	}
	.elementor .dx-res__cta {
		order: 3;
		justify-self: start;
	}

	/* Same move for "view all faqs", which sits in the heading column beside
	   the questions on the board. Dissolving that column puts its heading, its
	   lead and the button on the same ordering axis as the loop, so the button
	   can fall past the questions.

	   OPT-IN, via --split. Dissolving a heading column also hands its children
	   the row's gap, which is drawn for two columns side by side — on the FAQ
	   page that opened a 58px hole between each group's title and its blurb.
	   Only the homepage preview and the Science selection have a "view all"
	   button to move; the FAQ page's five group headings keep their column. */
	.elementor .dx-faq__headcol--split {
		display: contents;
	}
	.elementor .dx-faq__headcol--split > * {
		order: 1;
	}
	.elementor .dx-faq__headcol--split ~ .dx-faq__loopwrap,
	.elementor .dx-faq__row > .dx-faq__loopwrap {
		order: 2;
	}
	.elementor .dx-faq__headcol--split > .dx-btn {
		order: 3;
		justify-self: start;
	}
}


/* ==========================================================================
   19. Footer link columns, two up on mobile
   --------------------------------------------------------------------------
   The container settings carry the right values — `--width: 45%` and
   `--gap: 32px 20px` are both on the element — but the computed gap stays at
   40px and no rule matching the element sets `gap` at all, so Elementor is
   not consuming its own custom property here. The widths then never get the
   room to share a line and flex-grow puts each column back to full width.
   Setting both here is direct and cannot be undone by that plumbing.

   Explore and Legal pair up; Contact keeps its own row because it holds an
   email, a phone number and a three-line address.
   ========================================================================== */
@media (max-width: 767px) {
	.elementor .dx-footer__cols {
		column-gap: 20px;
		row-gap: 32px;
		align-items: start;
	}
	.elementor .dx-footer__cols > .dx-footer__col:nth-child(-n + 2) {
		flex: 0 1 calc(50% - 10px);
		inline-size: calc(50% - 10px);
		max-inline-size: calc(50% - 10px);
	}
	.elementor .dx-footer__cols > .dx-footer__col:nth-child(3) {
		flex: 1 1 100%;
		inline-size: 100%;
		max-inline-size: 100%;
	}
}


/* ==========================================================================
   20. Tap targets
   --------------------------------------------------------------------------
   The 25% type step shortened every text-sized control with it. WCAG 2.2
   SC 2.5.8 wants 24x24, and both cases below technically passed on the
   spacing exception — but an FAQ row that *looks* like an 187px card while
   only a 20px strip responds is a usability defect whatever the SC says.

   The padding is cancelled by an equal negative margin, so the tap area grows
   without moving anything. 16px is the ceiling here, not a round number: the
   loop item puts 20px between the question and its answer, so a larger value
   would let a tap on the answer collapse it.
   ========================================================================== */
.elementor .dx-faq-toggle {
	padding-block: 16px;
	margin-block: -16px;
}

/* 17px tall against a 32px rhythm — compliant, but not a comfortable thumb
   target. 4px either side clears 24 outright and still cannot collide. */
.elementor .dx-footer__col a {
	padding-block: 4px;
}

/* Same for an article card's "read article", which sits alone at the foot of
   the card with 149px to the nearest other target. The category link above the
   title is left alone deliberately: it is only ~20px clear of the title, so
   growing both would make them touch, and the title is already a 243x50 target
   doing the same job. */
.elementor .dx-read-link a {
	padding-block: 6px;
	margin-block: -6px;
}


/* ==========================================================================
   21. Source panel: "read the full article" below the summary on mobile
   --------------------------------------------------------------------------
   On the board the button sits in the provenance rail, under the domain. Once
   the panel stacks, that buries it in the middle of the block — you are asked
   to leave for the article before you have read the summary of it.

   The button is nested inside the rail, so `order` alone cannot lift it past
   the summary. Dissolving the rail with `display: contents` puts its children
   and the summary on one ordering axis. That is only safe because the rail has
   NO gap of its own — its children are spaced entirely by their own margins,
   so they keep their exact rhythm once the rail stops generating a box. The
   panel's own 40px row-gap has to go with it (it would otherwise apply between
   every dissolved child) and comes back as margins on the three blocks.
   ========================================================================== */
@media (max-width: 767px) {
	.elementor .dx-sci-source {
		row-gap: 0;
	}
	.elementor .dx-sci-source__rail {
		display: contents;
	}
	.elementor .dx-sci-source__rail > * {
		order: 1;
	}
	.elementor .dx-sci-source__divider {
		order: 2;
		margin-block-start: 40px;
	}
	.elementor .dx-sci-source__summary {
		order: 3;
		margin-block-start: 40px;
	}
	.elementor .dx-sci-source__cta {
		order: 4;
		margin-block-start: 40px;
	}
}


/* ==========================================================================
   22. FAQ page
   --------------------------------------------------------------------------
   The five groups reuse the homepage's dx-faq hooks, so the disclosure, the
   hairlines and the tap target all come for free. What is new is that four of
   the answers are STRUCTURED — a lead paragraph, sub-labels, a bulleted list
   and a compliance panel — because the client supplied them that way. They
   live in the same ACF wysiwyg field as every other answer, so one loop and
   one field still drive every FAQ on the site.
   ========================================================================== */

/* --- structured answers -------------------------------------------------- */
.elementor .dx-faq-a h4 {
	margin-block: 22px 8px;
	font-family: Poppins, sans-serif;
	font-size: 15px;
	line-height: 26px;
	font-weight: 600;
	color: #0F172A;
}
.elementor .dx-faq-a h4:first-child {
	margin-block-start: 0;
}
.elementor .dx-faq-a ul {
	margin-block: 0 14px;
	padding-inline-start: 22px;
	list-style: disc;
}
.elementor .dx-faq-a li {
	margin-block-end: 6px;
	color: #475569;
}
/* A quiet aside under an answer — "read the Supplement Facts panel". */
.elementor .dx-faq-a .dx-faq-note {
	margin-block-start: 18px;
	font-size: 15px;
	line-height: 26px;
	color: #5B6B82;
}
/* The tinted compliance panel inside "How much do I take?". This one is
   load-bearing copy, not decoration: it is the client's own statement that the
   product is not a medical dose. */
.elementor .dx-faq-a .dx-faq-panel {
	margin-block-start: 24px;
	padding: 22px 24px;
	background-color: #EAF4F6;
	border-radius: 12px;
}
.elementor .dx-faq-a .dx-faq-panel > p:last-child {
	margin-block-end: 0;
	font-size: 15px;
	line-height: 26px;
	color: #0F172A;
}
.elementor .dx-faq-a .dx-faq-panel__label {
	margin-block-end: 10px;
	font-size: 12px;
	line-height: 16px;
	font-weight: 600;
	letter-spacing: 1.68px;
	text-transform: uppercase;
	color: #866619;
}

/* --- CLIENT COPY REQUIRED ------------------------------------------------
   Seven questions on the board have no supplied answer. They are marked on
   the page itself, exactly as the board draws them, so the gap is impossible
   to miss in review — and impossible to ship by accident. The gold outline is
   deliberately unlike anything else on the site. */
.elementor .dx-faq-a .dx-faq-pending {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 12px;
	margin-block: 0;
	padding: 20px 24px;
	border: 1px solid #C9A227;
	border-radius: 12px;
	background-color: rgba(201, 162, 39, 0.06);
}
.elementor .dx-faq-a .dx-faq-pending__label {
	font-size: 12px;
	line-height: 16px;
	font-weight: 600;
	letter-spacing: 1.68px;
	text-transform: uppercase;
	color: #866619;
}
.elementor .dx-faq-a .dx-faq-pending__note {
	font-size: 15px;
	line-height: 26px;
	color: #5B6B82;
}

/* --- category nav -------------------------------------------------------- */
.elementor .dx-faq-cat__link a,
.elementor a.dx-faq-cat__link {
	color: inherit;
	text-decoration: none;
	border-block-end: 1px solid transparent;
	transition: border-color .18s ease;
}
.elementor .dx-faq-cat__link a:hover,
.elementor a.dx-faq-cat__link:hover {
	border-block-end-color: #2A9D8F;
}
/* The header is fixed, so an anchor jump would otherwise land under it. */
.elementor .dx-faq-group {
	scroll-margin-block-start: calc(var(--dx-header-h-scrolled) + 16px);
}

/* --- decorations --------------------------------------------------------- */
.elementor .dx-tex--molecular {
	background-image: url("assets/img/texture-molecular.svg");
}
/* .dx-faq-graphic removed 2026-09-24. The FAQ contact CTA now carries a
   photographic background that contains the same rings and molecules, so the
   drawn SVG on top of it was two ring systems in one place. graphic-hydration.svg
   is unused as a result — left in assets/img/ rather than deleted, in case the
   flat-artwork treatment is wanted back. */



/* ==========================================================================
   23. A hero that keeps its background below 1024
   --------------------------------------------------------------------------
   The homepage and Science heroes are photographs of the product, which a
   portrait crop loses entirely — hence the block treatment in §15. The FAQ
   hero is abstract artwork with no subject to lose, so it stays a background
   and the page opens on the image instead of a band of flat white.

   Below 1024 it is anchored RIGHT, not centre: a portrait crop of a 2.3:1
   landscape shows barely 40% of it, and the right is where the glass sphere
   and the molecular cluster are. The centre is mostly empty water.

   It needs its own wash to do that. The board's readability gradient runs
   LEFT TO RIGHT across a 1440 frame and has faded to nothing by 70%. On a 390
   screen the copy is full-width, so it lands where that gradient is already
   transparent: measured against the real artwork, the muted secondary line
   sits at 1.92:1 unwashed.

   The overlay is 0.90, and that number follows the crop. Against the CENTRE
   crop 0.85 was enough (4.72:1 on the muted ink). The right of this image is
   darker, and the same 0.85 drops it to 4.38 — under the 4.5 line. 0.90
   restores the headroom: 15.53 / 6.59 / 4.72:1. Re-measure if the crop or the
   artwork ever changes; the two are tied.

   The overlay is a pseudo-element rather than an extra background layer so it
   does not need the attachment URL hard-coded into this stylesheet.
   ========================================================================== */
.elementor .dx-band.dx-hero--keep-bg {
	position: relative;
}
.elementor .dx-band.dx-hero--keep-bg > * {
	position: relative;
	z-index: 1;
}

@media (max-width: 1024px) {
	.elementor .dx-band.dx-hero--keep-bg {
		background-position: right center;
	}
	.elementor .dx-band.dx-hero--keep-bg::before {
		content: "";
		display: block;
		position: absolute;
		inset: 0;
		background-color: rgba(255, 255, 255, 0.90);
	}
}


/* ==========================================================================
   24. Contact CTA graphic as a backdrop on mobile
   --------------------------------------------------------------------------
   On the board the concentric-ring graphic sits beside the copy. Stacked on a
   phone it becomes a 400px-tall block of near-empty white below the buttons —
   a whole screen of scrolling for a decoration. Taking it out of flow and
   letting it bleed off the right edge keeps the motif without the cost.

   Opacity is the safety margin, not a taste call: at 0.45 the worst case is
   body copy landing on one of the two gold nodes, which composites to about
   (247, 232, 198) and leaves #475569 at 6.27:1. It is aria-hidden already and
   .dx-tex makes it pointer-events: none, so it cannot take a tap meant for a
   button behind it.
   ========================================================================== */
/* The mobile rule that bled .dx-faq-graphic off the right edge at 45% opacity
   went with it — the section's own background image is now that treatment,
   done with the real artwork and measured against the text sitting on it. */


/* ==========================================================================
   25. Blog components
   --------------------------------------------------------------------------
   Three loop item shapes: the 3-up card, the horizontal index row and the
   single featured article. All three are classic widgets inside atomic
   section shells, for the same reason the FAQ loop is — there is no atomic
   dynamic tag for a post title, excerpt, term or featured image.
   ========================================================================== */

/* --- shared card parts --------------------------------------------------- */
.elementor .dx-card-excerpt p {
	margin: 0;
}
/* The board separates the read link from the date with a 3px dot. Drawn
   rather than placed so the loop item has one less widget to keep aligned. */
/* On the widget WRAPPER this generates its own line box and adds 24px to the
   card. It belongs on the heading element inside it. */
.elementor .dx-blog-card__foot .dx-card-date .elementor-heading-title::before,
.elementor .dx-blog-feature__foot .dx-card-date .elementor-heading-title::before {
	content: "";
	display: inline-block;
	inline-size: 3px;
	block-size: 3px;
	margin-inline-end: 24px;
	margin-block-end: 4px;
	border-radius: 50%;
	background-color: #DDE5EA;
	vertical-align: middle;
}

/* --- 3-up card ----------------------------------------------------------- */
.elementor .dx-blog-card {
	block-size: 100%;
}
.elementor .dx-blog-card__img img {
	inline-size: 100%;
	aspect-ratio: 373 / 280;
	object-fit: cover;
	border-radius: 16px;
	display: block;
}
/* The footer sits on the card's bottom edge so a row of cards aligns even
   when the excerpts run to different lengths. */
.elementor .dx-blog-card__body {
	flex: 1 1 auto;
}

/* --- horizontal index row ------------------------------------------------ */
.elementor .dx-blog-row__img {
	flex: 0 0 200px;
	inline-size: 200px;
}
.elementor .dx-blog-row__img img {
	inline-size: 200px;
	aspect-ratio: 200 / 140;
	object-fit: cover;
	border-radius: 12px;
	display: block;
}
.elementor .dx-blog-row__body {
	flex: 1 1 auto;
	min-inline-size: 0;
}
/* The loop grid puts its own gap between items; the rows carry their own
   hairline, so the gap has to go or the rules float away from the rows. */
.elementor .dx-blog-index .elementor-grid {
	gap: 0;
}

/* --- featured article ---------------------------------------------------- */
.elementor .dx-blog-feature__img {
	flex: 0 0 680px;
	inline-size: 680px;
}
.elementor .dx-blog-feature__img img {
	inline-size: 100%;
	aspect-ratio: 680 / 500;
	object-fit: cover;
	border-radius: 16px;
	display: block;
}
.elementor .dx-blog-feature__body {
	flex: 1 1 auto;
	min-inline-size: 0;
}
.elementor .dx-blog-feature__title {
	margin-block: 18px 22px;
}
.elementor .dx-blog-feature__foot {
	margin-block-start: 30px;
}

/* --- category pills ------------------------------------------------------
   The pills borrow dx-btn for its type and focus behaviour but not its box:
   the board draws them 44 tall on a 100px radius with a hairline border. */
.elementor .dx-pill {
	block-size: 44px;
	padding-inline: 24px;
	border-radius: 100px;
	border: 1px solid #DDE5EA;
	background-color: transparent;
	color: #0F172A;
	text-transform: none;
	letter-spacing: 0;
}
.elementor .dx-pill:hover {
	border-color: #0F172A;
}
.elementor .dx-pill--on,
.elementor .dx-pill--on:hover {
	background-color: #0F172A;
	border-color: #0F172A;
	color: #FFFFFF;
}

/* --- below the two-column breakpoints ------------------------------------ */
@media (max-width: 1024px) {
	.elementor .dx-blog-feature {
		flex-direction: column;
	}
	.elementor .dx-blog-feature__img {
		flex: 0 0 auto;
		inline-size: 100%;
	}
}
@media (max-width: 767px) {
	/* The index row's 200px thumbnail leaves too little for the title at
	   phone width, so the row becomes a stack like every other card. */
	.elementor .dx-blog-row {
		flex-direction: column;
		align-items: stretch;
		row-gap: 18px;
		padding-block: 24px;
	}
	.elementor .dx-blog-row__img,
	.elementor .dx-blog-row__img img {
		flex: 0 0 auto;
		inline-size: 100%;
	}
	.elementor .dx-blog-row__img img {
		aspect-ratio: 16 / 9;
	}
	.elementor .dx-blog-feature__title {
		margin-block: 14px 16px;
	}
}


/* ==========================================================================
   26. Single article
   --------------------------------------------------------------------------
   Long-form type is a DELIBERATELY SEPARATE scale from the rest of the site:
   H2 34/44, H3 24/32, pull quote 28/40, body 22/38. The shared scale jumps
   from 24 straight to 44, which leaves nothing usable once body type passes
   19px, so the article set fills that gap.

   The reading column is 1200 wide because Jun widened it from 860 — see the
   note raised with him. At 22px that measures 74-102 characters per line.
   ========================================================================== */
.elementor .dx-article-body {
	max-inline-size: 1200px;
}
.elementor .dx-article-body > *:first-child {
	margin-block-start: 0;
}
.elementor .dx-article-body p {
	margin-block: 0 22px;
	font-size: 22px;
	line-height: 38px;
	color: #475569;
}
.elementor .dx-article-body h2 {
	margin-block: 64px 24px;
	font-size: 34px;
	line-height: 44px;
	font-weight: 600;
	letter-spacing: -0.51px;
	color: #0F172A;
}
.elementor .dx-article-body h3 {
	margin-block: 40px 26px;
	font-size: 24px;
	line-height: 32px;
	font-weight: 600;
	color: #0F172A;
}

/* --- numbered steps ------------------------------------------------------ */
.elementor .dx-article-body .dx-steps {
	margin-block: 0 0;
	padding-inline-start: 0;
	list-style: none;
	counter-reset: dx-step;
}
.elementor .dx-article-body .dx-steps > li {
	position: relative;
	margin-block-end: 18px;
	padding-inline-start: 44px;
	font-size: 17px;
	line-height: 30px;
	color: #475569;
}
.elementor .dx-article-body .dx-steps > li::before {
	counter-increment: dx-step;
	content: counter(dx-step) ".";
	position: absolute;
	inset-inline-start: 0;
	font-size: 13px;
	line-height: 30px;
	font-weight: 500;
	color: #1F7A6E;
}

/* --- lead + description list --------------------------------------------- */
.elementor .dx-article-body .dx-leadlist {
	margin-block: 0;
	padding-inline-start: 0;
	list-style: none;
}
.elementor .dx-article-body .dx-leadlist > li {
	padding-block: 20px;
	border-block-start: 1px solid #E2E8F0;
}
.elementor .dx-article-body .dx-leadlist > li:first-child {
	border-block-start: 0;
	padding-block-start: 0;
}
.elementor .dx-article-body .dx-leadlist__lead,
.elementor .dx-article-body .dx-leadlist__desc,
.elementor .dx-article-body .dx-refs span {
	display: block;
}
.elementor .dx-article-body .dx-leadlist__lead {
	margin-block-end: 6px;
	font-size: 19px;
	line-height: 28px;
	font-weight: 600;
	color: #0F172A;
}
.elementor .dx-article-body .dx-leadlist__desc {
	font-size: 17px;
	line-height: 30px;
	color: #475569;
}

/* --- figure -------------------------------------------------------------- */
.elementor .dx-article-body .dx-figure {
	margin: 0;
}
.elementor .dx-article-body .dx-figure img {
	inline-size: 100%;
	block-size: auto;
	border-radius: 16px;
	display: block;
}
.elementor .dx-article-body .dx-figure figcaption {
	margin-block-start: 16px;
	max-inline-size: 860px;
}
.elementor .dx-article-body .dx-figure__caption,
.elementor .dx-article-body .dx-figure__source {
	display: block;
	font-size: 15px;
	line-height: 26px;
	color: #5B6B82;
}
.elementor .dx-article-body .dx-figure__source {
	font-size: 13px;
	color: #94A3B8;
}

/* --- pull quote ---------------------------------------------------------- */
.elementor .dx-article-body .dx-pull {
	margin-block: 56px;
	padding: 0;
	border: 0;
	max-inline-size: 980px;
}
.elementor .dx-article-body .dx-pull p {
	font-size: 28px;
	line-height: 40px;
	font-weight: 600;
	color: #0F172A;
	margin: 0;
}

/* --- callouts ------------------------------------------------------------
   Three distinct roles, kept visually distinct on purpose: Definition is a
   neutral term, Evidence is what research shows (with a citation slot), and
   Important Distinction is the gold-accented AquaLink boundary statement.
   Do not let AquaLink interpretation migrate into the Evidence block. */
.elementor .dx-article-body .dx-def,
.elementor .dx-article-body .dx-evidence,
.elementor .dx-article-body .dx-distinction,
.elementor .dx-article-body .dx-disclaimer {
	margin-block: 40px;
	max-inline-size: 980px;
}
.elementor .dx-article-body .dx-def {
	padding: 30px 32px;
	background-color: #EAF4F6;
	border-radius: 16px;
}
.elementor .dx-article-body .dx-def__label,
.elementor .dx-article-body .dx-evidence__label,
.elementor .dx-article-body .dx-distinction__label {
	margin-block-end: 14px;
	font-size: 12px;
	line-height: 16px;
	font-weight: 600;
	letter-spacing: 1.68px;
	text-transform: uppercase;
}
/* 4.62:1 — passes, but the tightest pairing on the page. If this callout ever
   gains small body text, darken the ground or the label. */
.elementor .dx-article-body .dx-def__label {
	color: #1F7A6E;
}
.elementor .dx-article-body .dx-def__term {
	margin-block-end: 10px;
	font-size: 18px;
	line-height: 26px;
	font-weight: 600;
	color: #0F172A;
}
.elementor .dx-article-body .dx-def__body,
.elementor .dx-article-body .dx-evidence p,
.elementor .dx-article-body .dx-distinction p,
.elementor .dx-article-body .dx-disclaimer p {
	margin-block-end: 0;
	font-size: 17px;
	line-height: 30px;
	color: #475569;
}
/* A 3px rule, which the general craft floor caps at 1px. Jun specified it and
   it carries real semantic weight — established evidence vs proposed
   mechanism. Note this differs from the Science page, where the same device
   was removed from a pull quote. */
.elementor .dx-article-body .dx-evidence {
	padding-inline-start: 28px;
	border-inline-start: 3px solid #2A9D8F;
}
.elementor .dx-article-body .dx-evidence__label {
	color: #1F7A6E;
}
.elementor .dx-article-body .dx-evidence__cite {
	margin-block-start: 12px;
	font-size: 13px !important;
	line-height: 20px !important;
	color: #94A3B8 !important;
}
.elementor .dx-article-body .dx-distinction {
	padding: 28px 32px;
	background-color: #FFFFFF;
	border: 1px solid #E2E8F0;
	border-radius: 16px;
	border-block-start: 3px solid #C9A227;
}
.elementor .dx-article-body .dx-distinction__label {
	color: #866619;
}
.elementor .dx-article-body .dx-distinction p {
	font-size: 19px;
	line-height: 32px;
	color: #0F172A;
}

/* --- references ---------------------------------------------------------- */
.elementor .dx-article-body .dx-refs {
	margin-block: 0;
	padding-inline-start: 0;
	list-style: none;
	counter-reset: dx-ref;
	max-inline-size: 980px;
}
.elementor .dx-article-body .dx-refs > li {
	position: relative;
	padding: 20px 0 20px 44px;
	border-block-start: 1px solid #E2E8F0;
}
.elementor .dx-article-body .dx-refs > li:first-child {
	border-block-start: 0;
}
.elementor .dx-article-body .dx-refs > li::before {
	counter-increment: dx-ref;
	content: counter(dx-ref) ".";
	position: absolute;
	inset-inline-start: 0;
	font-size: 13px;
	line-height: 26px;
	font-weight: 500;
	color: #5B6B82;
}
.elementor .dx-article-body .dx-refs__author,
.elementor .dx-article-body .dx-refs__title {
	font-size: 15px;
	line-height: 26px;
	color: #475569;
}
.elementor .dx-article-body .dx-refs__title {
	color: #0F172A;
}
.elementor .dx-article-body .dx-refs__meta {
	font-size: 13px;
	line-height: 20px;
	color: #94A3B8;
}

/* --- disclaimer ---------------------------------------------------------- */
.elementor .dx-article-body .dx-disclaimer {
	margin-block-start: 56px;
	padding: 28px 32px;
	background-color: #F8F9FA;
	border-radius: 16px;
}
.elementor .dx-article-body .dx-disclaimer__head {
	margin-block-end: 10px;
	font-size: 18px !important;
	line-height: 26px !important;
	font-weight: 600;
	color: #0F172A !important;
}

/* --- article header + hero image ------------------------------------------ */
.elementor .dx-article-hero-img img {
	inline-size: 100%;
	block-size: auto;
	aspect-ratio: 1200 / 430;
	object-fit: cover;
	border-radius: 16px;
	display: block;
}
.elementor .dx-article-deck p {
	margin: 0;
}

@media (max-width: 767px) {
	.elementor .dx-article-body p { font-size: 16.5px; line-height: 28.5px; }
	.elementor .dx-article-body h2 { font-size: 25.5px; line-height: 33px; margin-block: 44px 18px; }
	.elementor .dx-article-body h3 { font-size: 18px; line-height: 24px; margin-block: 30px 18px; }
	.elementor .dx-article-body .dx-pull p { font-size: 21px; line-height: 30px; }
	.elementor .dx-article-body .dx-pull { margin-block: 36px; }
	.elementor .dx-article-body .dx-def,
	.elementor .dx-article-body .dx-distinction,
	.elementor .dx-article-body .dx-disclaimer { padding: 22px 20px; }
	.elementor .dx-article-body .dx-evidence { padding-inline-start: 18px; }
}


/* ==========================================================================
   27. Blog: read-article arrow, index row link, date rhythm
   ========================================================================== */

/* --- the arrow -----------------------------------------------------------
   The board draws a 16x12 glyph beside READ ARTICLE: a 15px shaft with two
   6px barbs at ±41°, ROUND caps, 1.5 wide in #866619. Exported once rather
   than rebuilt from borders, which cannot round a diagonal cap. It sits in
   the anchor so it underlines and moves with the label. */
.elementor .dx-read-link .elementor-heading-title a,
.elementor .dx-read-link .elementor-heading-title {
	display: inline-flex;
	align-items: center;
	gap: 10px;
}
/* The arrow belongs to the anchor only. It was also declared on the heading
   as a fallback, which double-drew it — the read link always renders an <a>
   because the widget carries a post-url dynamic link, and the :has() meant to
   suppress the duplicate sat at LOWER specificity than the rule it cancelled. */
.elementor .dx-read-link .elementor-heading-title a::after {
	content: "";
	flex: 0 0 auto;
	inline-size: 16px;
	block-size: 12px;
	background: url("assets/img/arrow-read.svg") center / 16px 12px no-repeat;
	transition: transform .18s var(--dx-ease-premium);
}
.elementor .dx-blog-card:hover .dx-read-link .elementor-heading-title a::after,
.elementor .dx-blog-feature:hover .dx-read-link .elementor-heading-title a::after {
	transform: translateX(4px);
}

/* --- index row: the title is the row's link -------------------------------
   One anchor per article, stretched over the whole row, so the click target
   is the row while a screen reader still announces a single link. */
.elementor .dx-blog-row {
	position: relative;
}
.elementor .dx-blog-row__title a::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
}
.elementor .dx-blog-row__title a {
	color: inherit;
	text-decoration: none;
}
.elementor .dx-blog-row:hover .dx-blog-row__title a {
	color: #1F7A6E;
}
/* The date is the row's third column on the board, not a line under the copy. */
.elementor .dx-blog-row > .dx-card-date {
	flex: 0 0 auto;
	margin-inline-start: auto;
	align-self: flex-start;
	white-space: nowrap;
}

/* Card and feature titles link too, and stay ink-coloured until hover. */
.elementor .dx-blog-card__title a,
.elementor .dx-blog-feature__title a {
	color: inherit;
	text-decoration: none;
}
.elementor .dx-blog-card:hover .dx-blog-card__title a,
.elementor .dx-blog-feature:hover .dx-blog-feature__title a {
	color: #1F7A6E;
}

@media (max-width: 767px) {
	/* Stacked, the date returns to the flow under the copy. */
	.elementor .dx-blog-row > .dx-card-date {
		margin-inline-start: 0;
	}
}


/* ==========================================================================
   28. Sections whose mobile spacing is driven by margins
   --------------------------------------------------------------------------
   §14 gives every `.dx-section__wrap` a 36px row-gap on mobile. That is right
   for sections that space their children with the wrap's own gap — but a
   section built the other way, with an explicit gap of 0 and margins on each
   child, then gets BOTH. On the blog that showed up as a 54px gap between a
   heading and its own note (18 margin + 36 gap) and 72px before the article
   index (56 + 36 truncated).

   These sections carry dx-wrap-margins, and here the wrap gap steps back out
   of the way so the margins are the single source of spacing.
   ========================================================================== */
@media (max-width: 767px) {
	.elementor .dx-wrap-margins > .dx-section__wrap {
		row-gap: 0;
	}
}


/* ==========================================================================
   29. Contact form
   --------------------------------------------------------------------------
   Elementor Pro's own form widget — no plugin added. The field border is
   #64748B because it is MEASURED at 4.76:1 against the white section; the
   site's usual #DDE5EA hairline reads about 1.2:1 and would miss the 3:1
   floor that a component boundary has to clear (WCAG 2.2 SC 1.4.11).
   ========================================================================== */
.elementor .dx-form .elementor-field-group {
	margin-block-end: 24px;
}
.elementor .dx-form .elementor-field-label {
	margin-block-end: 10px;
	font-family: Poppins, sans-serif;
	font-size: 14px;
	line-height: 20px;
	font-weight: 500;
	color: #0F172A;
}
.elementor .dx-form .elementor-field-textual {
	min-block-size: 54px;
	padding: 0 18px;
	border: 1px solid #64748B;
	border-radius: 10px;
	background-color: #FFFFFF;
	font-family: Poppins, sans-serif;
	font-size: 16px;
	line-height: 24px;
	color: #0F172A;
	box-shadow: none;
	transition: border-color .18s ease;
}
.elementor .dx-form textarea.elementor-field-textual {
	min-block-size: 170px;
	padding: 16px 18px;
}
.elementor .dx-form .elementor-field-textual::placeholder {
	color: #5B6B82;
	opacity: 1;
}
/* A 2px teal edge on focus, as the board's Focus variant draws it. The
   global focus ring still applies on top for keyboard users. */
.elementor .dx-form .elementor-field-textual:focus {
	border-color: #1F7A6E;
	border-width: 2px;
	caret-color: #1F7A6E;
}
.elementor .dx-form .elementor-field-type-submit button {
	block-size: 54px;
	padding-inline: 34px;
	border: 1px solid #866619;
	border-radius: 8px;
	background-color: #E9C46A;
	color: #0F172A;
	font-family: Poppins, sans-serif;
	font-size: 13px;
	line-height: 16px;
	font-weight: 600;
	letter-spacing: 1.04px;
	text-transform: uppercase;
}
.elementor .dx-form .elementor-field-type-submit button:hover {
	background-color: #D9AE4A;
}
.elementor .dx-form .elementor-field-required .elementor-field-label::after {
	content: " *";
	color: #866619;
}
.elementor .dx-contact-value a {
	color: inherit;
	text-decoration: none;
	border-block-end: 1px solid rgba(15, 23, 42, 0.25);
}
.elementor .dx-contact-value a:hover {
	border-block-end-color: #1F7A6E;
	color: #1F7A6E;
}

@media (max-width: 767px) {
	.elementor .dx-form .elementor-field-group { margin-block-end: 18px; }
	.elementor .dx-form textarea.elementor-field-textual { min-block-size: 130px; }
	.elementor .dx-form .elementor-field-type-submit button { block-size: 44px; padding-inline: 20px; font-size: 9.75px; letter-spacing: 0.78px; }
}


/* ==========================================================================
   30. Topic archive
   --------------------------------------------------------------------------
   No Figma board for this one. Built from the existing system only — no new
   colour, type role or component — around one idea: a category page is not a
   filtered list, it is a SUBJECT. Someone arrived because they care about one
   topic, so the page states which topic, how much is here, gives the articles
   a reading order, and offers a way out sideways instead of a dead end.
   ========================================================================== */

/* --- masthead ------------------------------------------------------------
   Drawn, not photographed. The four existing heroes spend the dark
   photograph, the light photograph and the abstract artwork; a paper ground
   carrying the lattice texture is the treatment left, so a topic page cannot
   be mistaken for an article or the blog index. */
.elementor .dx-topic-hero .dx-topic-desc p:last-child {
	margin-block-end: 0;
}
.elementor .dx-topic-desc {
	max-inline-size: 680px;
}
/* The type used to come from the widget's own controls; it is a shortcode now
   (see dercums_topic_description_shortcode), so the board's size lives here. */
.elementor .dx-topic-desc .dx-topic-desc__text {
	font-family: Poppins, sans-serif;
	font-size: 19px;
	line-height: 34px;
	color: #475569;
}
.elementor .dx-topic-desc .dx-topic-desc__text p:last-child {
	margin-block-end: 0;
}
@media (max-width: 767px) {
	.elementor .dx-topic-desc .dx-topic-desc__text {
		font-size: 14.25px;
		line-height: 25.5px;
	}
}
.elementor .dx-topic-desc:empty,
.elementor .dx-topic-desc .elementor-widget-container:empty {
	display: none;
}
/* The count is a fact, so it can be stated without client copy — which is why
   the description above is allowed to be empty and simply disappear. */
.elementor .dx-topic-count {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin-block-start: 22px;
	font-family: Poppins, sans-serif;
	font-size: 13px;
	line-height: 20px;
	font-weight: 500;
	letter-spacing: 0.26px;
	color: #5B6B82;
}
.elementor .dx-topic-count::before {
	content: "";
	inline-size: 28px;
	block-size: 2px;
	background-color: #2A9D8F;
}

/* --- the article grid ----------------------------------------------------
   Three up, uniform. An earlier pass numbered the articles and gave the first
   one a full-width lead; both were dropped on Jun's call — a topic page reads
   better as an even field of articles than as a ranked list, and the numerals
   competed with the category label directly beneath them. */
/* No `align-items: start` here. It was right when this grid had a full-width
   lead item; with three uniform cards it leaves each card only as tall as its
   own excerpt, so READ ARTICLE lands at a different height in every column.
   Stretching is what aligns the footers, and it is what every other card grid
   on the site does. */

/* --- other topics ---------------------------------------------------------
   The move a category archive normally cannot offer: changing subject without
   going back to the index. Every other topic, with its count. */
.elementor .dx-topics {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.elementor .dx-topics__link {
	display: inline-flex;
	align-items: center;
	gap: 12px;
	block-size: 44px;
	padding-inline: 24px;
	border: 1px solid #DDE5EA;
	border-radius: 100px;
	background-color: #FFFFFF;
	font-family: Poppins, sans-serif;
	font-size: 13px;
	line-height: 16px;
	font-weight: 600;
	color: #0F172A;
	text-decoration: none;
	transition: border-color .18s ease, background-color .18s ease;
}
.elementor .dx-topics__link:hover {
	border-color: #0F172A;
}
/* 5.13:1 on the #F8F9FA ground — the dark gold, not the light one, because
   this sits on paper rather than a dark band. */
.elementor .dx-topics__count {
	font-size: 12px;
	letter-spacing: 1.2px;
	color: #866619;
}

@media (max-width: 767px) {
	.elementor .dx-topic-count {
		margin-block-start: 16px;
	}
	.elementor .dx-topics__link {
		block-size: 38px;
		padding-inline: 16px;
		font-size: 11px;
		gap: 8px;
	}
}


/* ==========================================================================
   31. The laptop and tablet-landscape ladder
   --------------------------------------------------------------------------
   Elementor now runs four breakpoints: mobile 767, tablet 1024, tablet
   landscape 1200, laptop 1366. Before they existed the type and band padding
   jumped straight from the mobile step to values drawn for a 1440 frame — so
   a 1280 laptop was rendering a 64px H1 and 128px bands sized for a screen
   160px wider than it, and the 1200 measure plus its 40px gutters came to
   1280 exactly, running edge to edge.

   Two steps fill that gap. Type only: the section padding already has a
   tablet rule (§14) and a desktop scale (§ the 0.72 rescale), so these carry
   the sizes between them.
   ========================================================================== */

/* --- laptop: 1201-1366 ---------------------------------------------------- */
@media (min-width: 1201px) and (max-width: 1366px) {
	.elementor .dx-band {
		padding-block: 88px;
	}
	.elementor .dx-band.dx-hero {
		padding-block: 72px;
	}
	.elementor .dx-h1        { font-size: 56px; line-height: 62px; letter-spacing: -1.12px; }
	.elementor .dx-h1-page   { font-size: 50px; line-height: 58px; letter-spacing: -1px; }
	.elementor .dx-h1-panel  { font-size: 46px; line-height: 54px; letter-spacing: -0.92px; }
	.elementor .dx-h2        { font-size: 38px; line-height: 46px; letter-spacing: -0.57px; }
	.elementor .dx-numeral   { font-size: 48px; line-height: 50px; }
	.elementor .dx-topic-title { font-size: 56px; line-height: 62px; }

	/* Long-form set steps with it or the article column looks unrelated to
	   the headings above it. */
	.elementor .dx-article-body p  { font-size: 20px; line-height: 34px; }
	.elementor .dx-article-body h2 { font-size: 30px; line-height: 40px; margin-block: 56px 22px; }
	.elementor .dx-article-body h3 { font-size: 22px; line-height: 30px; }
	.elementor .dx-article-body .dx-pull p { font-size: 25px; line-height: 36px; }
	.elementor .dx-article-h1 { font-size: 46px; line-height: 54px; }
}

/* --- tablet landscape: 1025-1200 -------------------------------------------
   The narrowest width that still runs the desktop layout — two and three
   column grids are still side by side here, so the type has to give instead. */
@media (min-width: 1025px) and (max-width: 1200px) {
	.elementor .dx-band {
		padding-block: 80px;
	}
	.elementor .dx-band.dx-hero {
		padding-block: 64px;
	}
	.elementor .dx-h1        { font-size: 48px; line-height: 56px; letter-spacing: -0.96px; }
	.elementor .dx-h1-page   { font-size: 44px; line-height: 52px; letter-spacing: -0.88px; }
	.elementor .dx-h1-panel  { font-size: 40px; line-height: 48px; letter-spacing: -0.8px; }
	.elementor .dx-h2        { font-size: 34px; line-height: 42px; letter-spacing: -0.51px; }
	.elementor .dx-h3        { font-size: 22px; line-height: 30px; }
	.elementor .dx-numeral   { font-size: 42px; line-height: 46px; }
	.elementor .dx-body-lg   { font-size: 18px; line-height: 32px; }
	.elementor .dx-topic-title { font-size: 48px; line-height: 56px; }

	.elementor .dx-article-body p  { font-size: 19px; line-height: 32px; }
	.elementor .dx-article-body h2 { font-size: 28px; line-height: 38px; margin-block: 48px 20px; }
	.elementor .dx-article-body h3 { font-size: 21px; line-height: 29px; }
	.elementor .dx-article-body .dx-pull p { font-size: 23px; line-height: 34px; }
	.elementor .dx-article-h1 { font-size: 40px; line-height: 48px; }

	/* The blog feature's 680px image leaves the copy under 400 here. */
	.elementor .dx-blog-feature__img {
		flex: 0 0 52%;
		inline-size: 52%;
	}
	/* Three up gets cramped before the grid itself breaks; two reads better. */
	.elementor .dx-topic-loop .elementor-grid {
		grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
	}
}

/* --- 768-1024 also had no type of its own ---------------------------------
   The global classes only ever carried a desktop and a mobile variant, so
   portrait tablet was rendering the full 64px display scale on a 768 screen. */
@media (min-width: 768px) and (max-width: 1024px) {
	.elementor .dx-h1        { font-size: 44px; line-height: 52px; letter-spacing: -0.88px; }
	.elementor .dx-h1-page   { font-size: 40px; line-height: 48px; letter-spacing: -0.8px; }
	.elementor .dx-h1-panel  { font-size: 38px; line-height: 46px; letter-spacing: -0.76px; }
	.elementor .dx-h2        { font-size: 32px; line-height: 40px; letter-spacing: -0.48px; }
	.elementor .dx-h3        { font-size: 21px; line-height: 29px; }
	.elementor .dx-numeral   { font-size: 40px; line-height: 44px; }
	.elementor .dx-body-lg   { font-size: 18px; line-height: 32px; }
	.elementor .dx-topic-title { font-size: 44px; line-height: 52px; }

	.elementor .dx-article-body p  { font-size: 18px; line-height: 31px; }
	.elementor .dx-article-body h2 { font-size: 26px; line-height: 35px; margin-block: 44px 18px; }
	.elementor .dx-article-body h3 { font-size: 20px; line-height: 28px; }
	.elementor .dx-article-body .dx-pull p { font-size: 22px; line-height: 32px; }
	.elementor .dx-article-h1 { font-size: 36px; line-height: 44px; }
}


/* ==========================================================================
   32. Breadcrumbs (Yoast SEO)
   --------------------------------------------------------------------------
   Six hand-built trails were replaced by one [dx_breadcrumbs] shortcode on
   2026-09-24. Yoast decides the words; this decides how they look, and it has
   to reproduce exactly what the board drew: dx-caption (13/20, 500, +0.26
   tracking), links in #475569, the current page in #0F172A.

   Yoast emits a flat run of inline <span>s with the separator as a bare text
   node between them. That is why the wrapper is a block and NOT a flexbox —
   as flex items each span would be its own box and the separators would be
   anonymous items free to break onto their own lines. Inline flow keeps
   "Home / Blog / Hydration" together and lets it wrap like the sentence it is.
   ========================================================================== */
.elementor .dx-crumbs-slot .elementor-widget-container,
.elementor .dx-crumbs-slot .elementor-widget-shortcode {
	/* The shortcode widget's own wrapper would otherwise add its widget margin
	   on top of the margin the hero already set on the slot. */
	margin: 0;
}
.elementor .dx-crumbs {
	font-family: Poppins, sans-serif;
	font-size: 13px;
	line-height: 20px;
	font-weight: 500;
	letter-spacing: 0.26px;
	color: #475569;
}
.elementor .dx-crumbs a {
	color: #475569;
	text-decoration: none;
}
.elementor .dx-crumbs a:hover {
	text-decoration: underline;
	text-underline-offset: 3px;
}
.elementor .dx-crumbs a:focus-visible {
	outline: 2.5px solid #1F7A6E;
	outline-offset: 3px;
	border-radius: 2px;
}
/* Yoast marks the current page itself; boldlast is off so this is the only
   thing distinguishing it, exactly as the board draws it. */
.elementor .dx-crumbs .breadcrumb_last {
	color: #0F172A;
}
/* On a navy band (the legal pages) the trail has to be repainted. Measured on
   #0B1120: link #CBD5E1 is 12.68:1 and the current page in white is 18.83:1. */
.elementor .dx-crumbs--ondark,
.elementor .dx-crumbs--ondark a {
	color: #CBD5E1;
}
.elementor .dx-crumbs--ondark .breadcrumb_last {
	color: #FFFFFF;
}
.elementor .dx-crumbs--ondark a:focus-visible {
	outline-color: #E9C46A;
}

/* Same 25% mobile step every other role on this site carries. */
@media (max-width: 767px) {
	.elementor .dx-crumbs {
		font-size: 9.75px;
		line-height: 15px;
		letter-spacing: 0.195px;
	}
}


/* ==========================================================================
   33. Article cards, two-up on mobile
   --------------------------------------------------------------------------
   Every article list on the site went 2-up below 768 on 2026-09-24 (Jun): the
   homepage's Latest Resources, the blog's Latest Articles and More Articles,
   the related articles under a post, and the topic archive.

   That halves the measure to 169px on a 390 screen, and nothing drawn for a
   373px card survives it untouched. The PADDING, GAPS and TITLE SIZE are not
   here — they are mobile settings on the loop item templates themselves
   (build-loops.php, build-loops-blog.php), because Elementor writes container
   gap as `.elementor-124 .elementor-element.elementor-element-artli003`, a
   (0,3,0) selector that no reasonable class selector outranks. Fighting that
   from a child sheet costs an !important on every line and leaves the editor
   showing values the page does not use.

   What is left here is the part that has no Elementor control behind it.
   ========================================================================== */
@media (max-width: 767px) {

	/* ---- thumbnails: shorter crop, so the words lead --------------------
	   A 373/280 crop is 127px tall on a 169px card — taller than the title and
	   excerpt together, so the picture outweighs the words. */
	.elementor .dx-blog-card__img img,
	.elementor .dx-blog-row__img img {
		aspect-ratio: 16 / 10;
		border-radius: 12px;
	}
	.dx-article-card .dx-article-img img {
		/* This one is a fixed height, not a ratio: 240 -> 112, the same 16/10
		   proportion at the width these cards now get. */
		block-size: 112px;
	}

	/* The 3px dot separated READ ARTICLE from the date on one line. The footer
	   stacks at this width, so the dot is an orphan leading the date. */
	.elementor .dx-blog-card__foot .dx-card-date .elementor-heading-title::before {
		display: none;
	}

	/* Section 25 removes the grid gap for More Articles, which is right when
	   the rows are full-width and carry their own hairline. Two-up, they need
	   a column gap back — and still no row gap, so the hairlines stay put. */
	.elementor .dx-blog-index .elementor-grid {
		column-gap: 12px;
		row-gap: 0;
	}
}


/* ==========================================================================
   34. Legal documents (Terms & Conditions, Privacy Policy)
   --------------------------------------------------------------------------
   One construction, two documents, following the parent site's Legal.jsx: a
   navy page header over a 760px measure, then the document on white.

   The body is a single text-editor widget, so its type cannot come from widget
   controls the way the rest of the site's does — a lawyer's replacement text
   has to inherit this styling by pasting, not by re-authoring it. That is what
   this section is for. Contrast measured, not assumed: on #0B1120 the gold
   eyebrow is 11.27:1, the H1 18.83:1, the intro 10.84:1; on white the H2 is
   17.85:1, body 7.58:1, the last-updated line 5.43:1 and links 5.16:1.
   ========================================================================== */
.elementor .dx-legal-hero {
	/* The hero photo treatment the other pages share does not apply here —
	   there is no photograph, only a flat navy field. */
	background-image: none;
}
/* A 40px gold rule leads the eyebrow on the parent; it is decorative, so it is
   drawn rather than marked up. */
.elementor .dx-legal-eyebrow::before {
	content: "";
	display: inline-block;
	inline-size: 40px;
	block-size: 1px;
	margin-inline-end: 14px;
	vertical-align: middle;
	background-color: #C9A55C;
}

.elementor .dx-legal-doc {
	inline-size: 100%;
}
.elementor .dx-legal-doc h2,
.elementor .dx-legal-contact h2 {
	font-family: Poppins, sans-serif;
	font-size: 24px;
	line-height: 32px;
	font-weight: 600;
	letter-spacing: -0.12px;
	color: #0F172A;
	/* Each section owns the space above it, so the gap between two sections is
	   one number instead of a margin collapse between two different widgets. */
	margin-block: 36px 14px;
	/* The fixed header would otherwise sit on top of a section arrived at from
	   an anchor link — every section here has an id. */
	scroll-margin-block-start: calc(var(--dx-header-h-scrolled) + 24px);
}
.elementor .dx-legal-doc > h2:first-child {
	margin-block-start: 0;
}
.elementor .dx-legal-doc p {
	font-family: Poppins, sans-serif;
	font-size: 19px;
	line-height: 34px;
	color: #475569;
	margin-block: 0;
}

/* The contact block closes the document behind a hairline. */
.elementor .dx-legal-contact {
	inline-size: 100%;
	margin-block-start: 48px;
	padding-block-start: 36px;
	border-block-start: 1px solid rgba(31, 122, 110, 0.25);
}
.elementor .dx-legal-contact h2 {
	margin-block-start: 0;
}
.elementor .dx-legal-contact p,
.elementor .dx-legal-contact address {
	font-family: Poppins, sans-serif;
	font-size: 19px;
	line-height: 34px;
	color: #475569;
	font-style: normal;
	margin-block: 0;
}
.elementor .dx-legal-contact a {
	color: #1F7A6E;
	text-decoration: underline;
	text-underline-offset: 2px;
}
.elementor .dx-legal-contact a:hover {
	color: #0F172A;
}
.elementor .dx-legal-contact a:focus-visible {
	outline: 2.5px solid #1F7A6E;
	outline-offset: 3px;
}

/* The breakpoint ladder (section 31) steps the rest of the site's type; the
   legal documents carry their own, so they step here. */
@media (min-width: 768px) and (max-width: 1366px) {
	.elementor .dx-legal-doc h2,
	.elementor .dx-legal-contact h2 { font-size: 21px; line-height: 29px; }
	.elementor .dx-legal-doc p,
	.elementor .dx-legal-contact p,
	.elementor .dx-legal-contact address { font-size: 17px; line-height: 30px; }
}
@media (max-width: 767px) {
	.elementor .dx-legal-doc h2,
	.elementor .dx-legal-contact h2 {
		font-size: 15.75px;
		line-height: 21.75px;
		margin-block: 26px 10px;
	}
	.elementor .dx-legal-doc p,
	.elementor .dx-legal-contact p,
	.elementor .dx-legal-contact address {
		font-size: 12.75px;
		line-height: 22.5px;
	}
	.elementor .dx-legal-contact {
		margin-block-start: 32px;
		padding-block-start: 24px;
	}
	.elementor .dx-legal-eyebrow::before {
		inline-size: 24px;
		margin-inline-end: 10px;
	}
}


/* ==========================================================================
   35. Footer agency credit
   --------------------------------------------------------------------------
   Matches the parent site's own credit (Footer.jsx): underlined on hover only,
   gold on hover, opening in a new tab. Measured on the footer's #0B1120:
   #94A3B8 is 7.26:1 and the gold hover #E9C46A is 11.27:1, so the link passes
   in both states — a hover colour that only passes at rest is a link nobody
   with low vision can follow once they point at it.
   ========================================================================== */
.dx-footer .dx-ftr-copy p {
	margin-block: 0;
}
.dx-footer .dx-ftr-copy a {
	color: inherit;
	text-decoration: none;
	transition: color .2s ease;
}
.dx-footer .dx-ftr-copy a:hover {
	color: #E9C46A;
	text-decoration: underline;
	text-underline-offset: 4px;
}
.dx-footer .dx-ftr-copy a:focus-visible {
	outline: 2.5px solid #E9C46A;
	outline-offset: 3px;
	border-radius: 2px;
}


/* ==========================================================================
   36. The WordPress admin bar
   --------------------------------------------------------------------------
   Belongs with section 10; it is here because this sheet is appended to.

   Logged in, WordPress sets `html { margin-top: 32px }` to make room for the
   admin bar. That moves the DOCUMENT down, but section 10's header is
   `position: fixed; inset-block-start: 0`, which is positioned against the
   VIEWPORT and does not move. Two things go wrong at once:

     · the admin bar covers the top 32px of the header (the logo gets clipped)
     · the page content starts at 32 + 88 = 120 while the header ends at 88,
       leaving a 32px band of bare page between the header and the hero

   Both are the same bug, so both are fixed by the same line: push the fixed
   header down by exactly the height WordPress reserved. Header then occupies
   32-120 and the content starts at 120, with nothing between them.

   The height comes from WordPress's own `--wp-admin--admin-bar--height`, which
   it sets to 32px and to 46px below 782px — reading it means this cannot drift
   out of step with WordPress. The 32px fallback only matters if that variable
   ever goes away, and the rule is scoped to `body.admin-bar` so it can never
   apply to a logged-out visitor.
   ========================================================================== */
body.admin-bar .elementor-location-header {
	inset-block-start: var(--wp-admin--admin-bar--height, 32px);
}

/* Below 600 WordPress switches the bar to `position: absolute`, so it scrolls
   away with the page. A header held 46px down would float below a band of
   nothing the moment the page moved, so it goes back to the top edge.

   That alone re-creates the original bug in mirror image: `html` still carries
   its 46px margin, so with the header back at 0 the content starts 46px below
   where the header ends. The space is being reserved TWICE, so the second
   reservation — section 10's padding on body — gives back exactly what
   WordPress already took.

   The trade here is that the bar sits under the header at scroll 0. That is
   the compromise every fixed-header theme makes below this width, and it only
   affects a logged-in admin on a phone; a visitor never sees it. If it gets in
   the way in practice, the fix is a few lines in site-header.js — offset the
   header by `max(0, barHeight - scrollY)` so it rides the bar up — not more
   CSS. */
@media screen and (max-width: 600px) {
	body.admin-bar .elementor-location-header {
		inset-block-start: 0;
	}
	body.admin-bar {
		padding-block-start: calc(
			var(--dx-header-h) - var(--wp-admin--admin-bar--height, 46px)
		);
	}
}



/* ==========================================================================
   37. Gutenberg post body inside the Single Post template
   --------------------------------------------------------------------------
   The Single Post template's content widget is .dx-article-body, capped at the
   full 1200 measure (section 26). That was set for the board's own article
   layout. A native Gutenberg post pours straight into it, so its paragraphs
   ran the full 1200 at 22px — 109 characters a line, against a comfortable
   50-75.

   This narrows the MEASURE only, and only for Gutenberg blocks: every selector
   below is keyed to a wp-block-* class, so the Elementor-built article layout
   keeps the 1200 it was drawn with and its open question stays open. No
   article text is touched to achieve this.

   Type is stepped down here too (Jun, 2026-09-24): section 26's 22px body and
   34px H2 are the long-form display scale drawn for the board's article, and
   at blog length it reads oversized. 18px body / 26px H2 instead.

   The measure comes down WITH it, to 680 — the bottom of the brief's 680-760
   band. Font size and measure have to move together: 18px text in a 720px
   column is 85 characters a line, longer than the 22px it started from. At
   620 it is ~78, near the top of the comfortable 50-75 band. Body went
   22 -> 18 -> 16 at Jun's direction; the measure moved with it every time,
   because the two together are what decide line length.

   Presentation only. No article text is touched.
   ========================================================================== */
.elementor .dx-article-body > .wp-block-paragraph,
.elementor .dx-article-body > h2.wp-block-heading,
.elementor .dx-article-body > h3.wp-block-heading,
.elementor .dx-article-body > .wp-block-list,
.elementor .dx-article-body > .wp-block-quote,
.elementor .dx-article-body > .wp-block-image {
	max-inline-size: 760px;
	/* Centred in the 1200 band (Jun, 2026-09-24). Without this the column is
	   capped but still sits hard left, leaving 440px of empty paper down the
	   right of every article. `margin-inline` only — the block margins below
	   set the vertical rhythm and must not be reset. */
	margin-inline: auto;
}
.elementor .dx-article-body > .wp-block-paragraph {
	font-size: 16px;
	line-height: 28px;
	margin-block: 0 18px;
}
.elementor .dx-article-body > h2.wp-block-heading {
	font-size: 26px;
	line-height: 34px;
	letter-spacing: -0.26px;
	margin-block: 44px 16px;
}
.elementor .dx-article-body > h3.wp-block-heading {
	font-size: 20px;
	line-height: 28px;
	margin-block: 32px 14px;
}

/* The list has to read as a list, not as a block of indented prose. */
.elementor .dx-article-body > .wp-block-list {
	margin-block: 0 20px;
	padding-inline-start: 22px;
}
.elementor .dx-article-body > .wp-block-list li {
	margin-block-end: 8px;
	font-size: 16px;
	line-height: 28px;
	color: #475569;
}

/* Images fill the measure rather than floating at their native 536px inside a
   720px column, which would read as a mistake rather than a choice. */
.elementor .dx-article-body > .wp-block-image {
	margin-block: 36px 40px;
}
.elementor .dx-article-body > .wp-block-image img {
	inline-size: 100%;
	block-size: auto;
	display: block;
	border-radius: 12px;
}

@media (max-width: 767px) {
	.elementor .dx-article-body > .wp-block-paragraph,
	.elementor .dx-article-body > .wp-block-list li {
		font-size: 16px;
		line-height: 28px;
	}
	.elementor .dx-article-body > h2.wp-block-heading {
		font-size: 21px;
		line-height: 28px;
		margin-block: 32px 12px;
	}
	.elementor .dx-article-body > h3.wp-block-heading {
		font-size: 17px;
		line-height: 24px;
	}
	.elementor .dx-article-body > .wp-block-image {
		margin-block: 24px 26px;
	}
}
