/*
 * Hello DigiPlus — global stylesheet.
 *
 * Scope rule for this file: only things that must be true everywhere, and
 * things Elementor cannot express. Per-section and per-component styling
 * belongs in Elementor global classes (the dp- prefix), not here — those live
 * in the kit so they stay editable in the editor.
 *
 * Contents
 *   1. Design tokens
 *   2. Base document
 *   3. Accessibility
 *
 * Fonts are NOT declared here. General Sans is an Elementor Custom Font and
 * owners / owners-wide come from Elementor's Adobe Fonts project (jcl1caz).
 * Declaring them again in the theme loaded a second Typekit kit and a second
 * copy of General Sans.
 */

/* --------------------------------------------------------------- 2. Tokens */

/*
 * Mirrors the Figma variables in "DigiPlus 2026 — Approved Design".
 * Elementor global variables cover most of this; these exist so hand-written
 * CSS in this file and in templates can reference the same values.
 */
:root {
	/* Brand */
	--dp-violet: #4600a8;
	/*
	 * The white header's separation from a white page: a hairline to draw the
	 * edge, plus a soft fall so it reads as a layer above the content rather
	 * than a ruled line. Single-sourced because three rules need the same
	 * value — at rest, scrolled, and the light+solid combination.
	 */
	--jsx-header-shadow: 0 1px 0 rgba( 11, 6, 24, 0.07 ), 0 4px 16px rgba( 11, 6, 24, 0.07 );
	--dp-blue: #4600ff;
	--dp-light-blue: #46bcff;
	--dp-violet-deep: #18036a;
	--dp-marker-cyan: #00c8ff;

	/* Surfaces */
	--dp-white: #ffffff;
	--dp-black: #000000;
	--dp-lavender: #e4e0f4;
	/* the quiet step used to alternate consecutive light bands */
	--dp-lavender-soft: #f3f1fa;

	/* Text */
	--dp-text-on-light: #15131f;
	--dp-text-on-light-muted: #575269;
	--dp-text-on-dark: #ffffff;
	--dp-text-on-dark-muted: #d5ccf2;

	/* Lines */
	--dp-line-on-light: #d9d6e3;
	--dp-line-on-dark: #ffffff;

	/* Type */
	--dp-font-display: "owners-wide", sans-serif;
	--dp-font-subhead: "owners", sans-serif;
	--dp-font-body: "General Sans", sans-serif;

	/* Layout — 1240 container inside 100px gutters at 1440 */
	--dp-container: 1240px;
	--dp-gutter: 100px;
	--dp-gutter-mobile: 20px;
}

/* ----------------------------------------------------------------- 3. Base */

body {
	font-family: var(--dp-font-body);
	color: var(--dp-text-on-light);
	background-color: var(--dp-white);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/*
 * Images in Elementor containers occasionally inherit an intrinsic width that
 * defeats the layout; this keeps them fluid without needing a utility class.
 */
img {
	max-width: 100%;
	height: auto;
}

/* -------------------------------------------------------- 4. Accessibility */

/*
 * WCAG 2.2 AA is the floor for this build. Hello Elementor does not ship a
 * visible focus style strong enough to pass on both light and dark sections,
 * so one is declared here for every focusable element.
 */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
	outline: 3px solid var(--dp-light-blue);
	outline-offset: 2px;
	border-radius: 2px;
}

/* Respect a reduced-motion preference across everything, including Elementor's own animations. */
@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		animation-duration: 0.001ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.001ms !important;
		scroll-behavior: auto !important;
	}
}

/* Skip link — Hello renders one but leaves it visually unstyled when focused. */
.skip-link:focus {
	background: var(--dp-white);
	color: var(--dp-text-on-light);
	padding: 12px 20px;
	z-index: 100000;
}

/* --------------------------------------------------- 5. Two-tone headings */

/*
 * The approved design sets the final words of most display headings in a brand
 * colour ("Redefining Digital *Entertainment*", "Our *Values*", "We Are
 * *DigiPlus*"). Elementor sanitises `style` and `class` off inline markup inside
 * heading widgets, so a bare <span> is all that survives — the colour is applied
 * here instead. Wrap the accented words in a <span> in the heading text.
 */
.jsx-display-hero span,
.jsx-display-section span,
.jsx-display-sub span,
.jsx-display-statement span {
	color: var(--brand-light-blue);
}

/* On light grounds the accent is the deeper brand blue; light blue fails contrast there. */
.jsx-on-light span {
	color: var(--brand-blue);
}

/* --------------------------------- 6. Shortcode-rendered data blocks */

/*
 * [dp_financials] and [dp_proof] are rendered through Elementor's shortcode
 * dynamic tag inside a paragraph widget. That widget's sanitiser keeps <span>
 * but STRIPS every attribute, so the class names the shortcode emits never
 * reach the page. The host widget's own global class does survive, so these
 * blocks are styled structurally from it. Markup order is fixed by the
 * shortcode in inc/dynamic-data.php — keep the two in step.
 *
 * figures host > span                      = the row
 *              > span > span               = one figure
 *                     > span:nth-child(1)  = value
 *                     > span:nth-child(2)  = label
 *                     > span:nth-child(3)  = delta
 */

.jsx-figures-host > span {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	width: 100%;
}

.jsx-figures-host > span > span {
	display: block;
	border-left: 1px solid var(--dp-line-on-light);
	padding-left: 30px;
	padding-right: 24px;
}
.jsx-figures-host > span > span:first-child { border-left: 0; padding-left: 0; }

.jsx-figures-host > span > span > span { display: block; font-family: var(--dp-font-body); }

.jsx-figures-host > span > span > span:nth-child(1) {
	font-family: var(--dp-font-display);
	font-size: 46px;
	line-height: 1.1;
	letter-spacing: -0.02em;
	margin-bottom: 14px;
	color: var(--dp-text-on-light);
}
.jsx-figures-host > span > span > span:nth-child(2) { font-size: 16px; line-height: 1.5; color: var(--dp-text-on-light); }
.jsx-figures-host > span > span > span:nth-child(3) { font-size: 13px; line-height: 1.4; margin-top: 4px; color: var(--dp-text-on-light-muted); }

/* proof host > span:first-child = the row, > span:last-child = the note */
.jsx-proof-host > span:first-child {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	width: 100%;
	border-top: 1px solid rgba(255, 255, 255, 0.28);
	padding-top: 34px;
}

.jsx-proof-host > span:first-child > span {
	display: block;
	border-left: 1px solid rgba(255, 255, 255, 0.28);
	padding-left: 40px;
	padding-right: 40px;
}
.jsx-proof-host > span:first-child > span:first-child { border-left: 0; padding-left: 0; }

.jsx-proof-host > span:first-child > span > span:nth-child(1) {
	display: block;
	font-family: var(--dp-font-display);
	font-size: 40px;
	line-height: 1.1;
	letter-spacing: -0.02em;
	margin-bottom: 8px;
	color: var(--dp-text-on-dark);
}
/* the award column is set smaller in the design */
.jsx-proof-host > span:first-child > span:nth-child(3) > span:nth-child(1) {
	font-size: 24px;
	font-weight: 500;
	line-height: 1.25;
}
.jsx-proof-host > span:first-child > span > span:nth-child(2) {
	display: block;
	font-family: var(--dp-font-body);
	font-size: 13px;
	line-height: 1.4;
	color: var(--dp-text-on-dark-muted);
}

.jsx-proof-host > span:last-child {
	display: block;
	font-family: var(--dp-font-body);
	font-size: 11px;
	line-height: 1.4;
	margin-top: 22px;
	color: rgba(255, 255, 255, 0.55);
}

@media (max-width: 1024px) {
	.jsx-figures-host > span { grid-template-columns: repeat(2, 1fr); row-gap: 36px; }
	.jsx-figures-host > span > span:nth-child(odd) { border-left: 0; padding-left: 0; }
	.jsx-figures-host > span > span > span:nth-child(1) { font-size: 36px; }
	.jsx-proof-host > span:first-child { grid-template-columns: 1fr 1fr; row-gap: 26px; }
	.jsx-proof-host > span:first-child > span:nth-child(odd) { border-left: 0; padding-left: 0; }
	.jsx-proof-host > span:first-child > span > span:nth-child(1) { font-size: 30px; }
}

@media (max-width: 767px) {
	/*
	 * Two up rather than stacked. The vertical rules come off entirely at this
	 * width — a 1px divider plus its 30px inset costs more of a 375px screen
	 * than it earns — so the column gap is what separates the pairs instead.
	 */
	.jsx-figures-host > span {
		grid-template-columns: repeat(2, 1fr);
		column-gap: 20px;
		row-gap: 28px;
	}
	.jsx-figures-host > span > span { border-left: 0; padding-left: 0; padding-right: 0; }
	/*
	 * Two up, same as the figures. The award sits on its own full-width row
	 * below: "Digital Operator of the Year" is far longer than the two figures
	 * beside it and in a half column it wraps to three lines and unbalances the
	 * pair above it.
	 */
	.jsx-proof-host > span:first-child {
		grid-template-columns: repeat(2, 1fr);
		column-gap: 20px;
		row-gap: 24px;
	}
	.jsx-proof-host > span:first-child > span { border-left: 0; padding-left: 0; padding-right: 0; }
	.jsx-proof-host > span:first-child > span:nth-child(3) { grid-column: 1 / -1; }
}

/* ------------------------------------------- 8. Routing rows + hover preview */

/*
 * The four routing rows are children 1-4 of .jsx-routing-rows; the four preview
 * panels are children 5-8, in the same order. Because the panels follow the
 * rows in the DOM, the general sibling combinator drives the whole interaction
 * with no JavaScript — hovering row N reveals panel N. Keeping them as siblings
 * is load-bearing: reorder the children and the pairing breaks.
 *
 * Every position is counted `of .e-con`, i.e. among the real elements only. In the Elementor
 * editor the container's first child is an injected `.elementor-element-overlay`, which pushed
 * Responsible Gaming (row 4) to child 5 — a preview-panel slot — so the editor hid it (2026-10-04).
 */
.jsx-routing-rows { position: relative; }

.jsx-routing-rows > :nth-child(n + 5 of .e-con) {
	position: absolute;
	top: -40px;
	right: 0;
	width: 460px;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transform: translateY(8px);
	transition: opacity 180ms ease-out, transform 180ms ease-out, visibility 0s linear 180ms;
	box-shadow: 0 24px 60px rgba(8, 4, 40, 0.38);
}

/*
 * Keep the panel open while the pointer is on it, otherwise moving across to
 * click the link cancels the row's :hover and the panel vanishes underneath the
 * cursor. The panel sits ON TOP of the rows, so entering it always ends the
 * row's hover — the panel's own :hover has to take over in the same frame.
 * It is only interactive while shown; hidden it stays pointer-events: none so
 * it never blocks the rows beneath it.
 */
.jsx-routing-rows > :nth-child(n + 5 of .e-con):hover {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
	transform: translateY(0);
	transition-delay: 0s;
}

.jsx-routing-rows > :nth-child(1 of .e-con):hover ~ :nth-child(5 of .e-con),
.jsx-routing-rows > :nth-child(1 of .e-con):focus-within ~ :nth-child(5 of .e-con),
.jsx-routing-rows > :nth-child(2 of .e-con):hover ~ :nth-child(6 of .e-con),
.jsx-routing-rows > :nth-child(2 of .e-con):focus-within ~ :nth-child(6 of .e-con),
.jsx-routing-rows > :nth-child(3 of .e-con):hover ~ :nth-child(7 of .e-con),
.jsx-routing-rows > :nth-child(3 of .e-con):focus-within ~ :nth-child(7 of .e-con),
.jsx-routing-rows > :nth-child(4 of .e-con):hover ~ :nth-child(8 of .e-con),
.jsx-routing-rows > :nth-child(4 of .e-con):focus-within ~ :nth-child(8 of .e-con) {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
	transform: translateY(0);
	transition-delay: 0s;
}

/* The panel overlays the right of the rows, so pull the row text clear of it. */
.jsx-routing-rows > :nth-child(-n + 4 of .e-con) > :first-child { max-width: 700px; }

/* No hover on touch, and no room for a 460px overlay — show nothing. */
@media (hover: none), (max-width: 1024px) {
	.jsx-routing-rows > :nth-child(n + 5 of .e-con) { display: none; }
	.jsx-routing-rows > :nth-child(-n + 4 of .e-con) > :first-child { max-width: none; }
}

/* ------------------------------------------------ 9. Mid-width corrections */

/*
 * Elementor's breakpoints jump 1024 -> desktop, so between 1025px and the
 * 1240px container width there was no side gutter at all and content ran to
 * the viewport edge. Everything below 1340 gets a real gutter.
 */
/* Elementor writes `.elementor.elementor .jsx-container { padding-inline: 0 }` for the
   desktop variant, so these need matching specificity AND the logical
   properties it actually sets, or they are simply outranked. */
@media (max-width: 1339px) {
	.elementor.elementor .jsx-container {
		padding-inline-start: 40px;
		padding-inline-end: 40px;
	}
}
@media (max-width: 767px) {
	.elementor.elementor .jsx-container {
		padding-inline-start: 20px;
		padding-inline-end: 20px;
	}
}

/* ----------------------------------------------------- 10. Header collapse */

/*
 * The header collapses when it MEASURES that it no longer fits, not at a
 * hard-coded width. inc/../custom.js compares the logo + nav + icons against
 * the available container width and toggles .is-compact. That keeps it correct
 * at any viewport, any font size, and survives adding or renaming a nav item —
 * a fixed breakpoint would silently start overlapping again the moment the nav
 * got one link longer.
 */
.jsx-header-toggle {
	display: none;
	appearance: none;
	border: 0;
	padding: 10px;
	cursor: pointer;
	color: #fff;
	line-height: 0;
	flex: 0 0 auto;
}

/* paint only — the compact/open/light-header rules still own its colour */
.jsx-header-toggle,
.jsx-header-toggle:hover,
.jsx-header-toggle:focus { background: none; }

.jsx-header-toggle svg { display: block; }

.jsx-header-inner > :nth-child(2),
.jsx-header-inner > :nth-child(3) { flex: 0 0 auto; min-width: 0; }

/* --- compact state --------------------------------------------------- */

.jsx-header-inner.is-compact .jsx-header-toggle { display: block; }

/*
 * Compact, custom.js lifts the search icon out of the social group and drops
 * it in just before the hamburger, so it becomes the 4th child of the bar. The
 * two rules below hide children 2 and 3 (the nav and that social group); the
 * search sits outside both and stays in the bar, which is the point.
 */
.jsx-header-inner.is-compact > .jsx-search-toggle {
	display: flex;
	align-items: center;
	flex: 0 0 auto;
	line-height: 0;
	/*
	 * Sit next to the hamburger, not adrift in the middle.
	 *
	 * The bar is `justify-content: space-between`, and compact it has only
	 * three visible items — logo, search, toggle — so the free space was split
	 * either side of the search and left it stranded mid-header. The auto
	 * margin swallows all of that space ahead of the icon instead, which parks
	 * search and the toggle together at the right end, the bar's own 24px gap
	 * between them.
	 */
	margin-inline-start: auto;
}

.jsx-header-inner.is-compact > :nth-child(2) {
	display: none;
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	flex-direction: column;
	align-items: flex-start;
	gap: 2px;
	padding: 16px 40px 8px;
	background: #0b0526;
}
.jsx-header-inner.is-compact > :nth-child(2) > * { width: 100%; }

.jsx-header-inner.is-compact > :nth-child(3) {
	display: none;
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	padding: 0 34px 20px;
	background: #0b0526;
	transform: translateY(var(--jsx-menu-h, 0px));
}

.jsx-header-inner.is-compact.is-open > :nth-child(2) { display: flex; }
.jsx-header-inner.is-compact.is-open > :nth-child(3) { display: flex; }

@media (max-width: 767px) {
	.jsx-header-inner.is-compact > :nth-child(2) { padding-left: 20px; padding-right: 20px; }
	.jsx-header-inner.is-compact > :nth-child(3) { padding-left: 14px; padding-right: 14px; }
}

/* ------------------------------------------- 11. Two-column sections, mid width */

/*
 * The 1440 design uses fixed pixel columns (720/1fr, 526/1fr, 552/1fr, 470/1fr).
 * Elementor's next breakpoint down is 1024, so between 1025 and 1240 those
 * columns get crushed rather than collapsing. Anything carrying .jsx-split
 * stacks below 1200 instead.
 */
@media (max-width: 1199px) {
	.elementor.elementor .jsx-split {
		grid-template-columns: 1fr !important;
		gap: 44px !important;
	}
}

/* The hero headline sits above the proof row; spacing comes from the column's
   own gap, so the proof must not also push itself down with an auto margin. */
.jsx-proof-host { margin-top: 0 !important; }

/* ------------------------------------------------------- 12. Careers panel */

/*
 * The 1440 design floats a 552x620 photo across a violet panel that bleeds off
 * the right edge. Below 1200 the grid stacks (see .jsx-split), which would drop
 * the white copy outside the panel onto white — so the whole section becomes
 * the violet surface instead and the floating panel is removed.
 */
@media (max-width: 1199px) {
	.elementor.elementor .jsx-careers {
		background-color: var(--dp-blue);
		padding-top: 0;
		padding-bottom: 72px;
	}
	/* the absolutely-positioned panel is the section's first child */
	.elementor.elementor .jsx-careers > :first-child { display: none; }

	.elementor.elementor .jsx-careers img {
		margin-top: 0 !important;
		margin-bottom: 0 !important;
		width: 100% !important;
		height: 420px !important;
		border-radius: 0 !important;
	}
	.elementor.elementor .jsx-careers .jsx-container { padding-left: 0; padding-right: 0; }
	.elementor.elementor .jsx-careers .jsx-container > * { gap: 0 !important; }
	/* re-inset the copy once the container padding is removed */
	.elementor.elementor .jsx-careers .jsx-container > * > :last-child {
		padding: 44px 40px 8px;
	}
}
@media (max-width: 767px) {
	.elementor.elementor .jsx-careers .jsx-container > * > :last-child { padding: 36px 20px 8px; }
	.elementor.elementor .jsx-careers img { height: 300px !important; }
}

/* --------------------- 13. Container inside header/footer templates (note) */

/*
 * NOTE: Elementor does NOT emit a global-<id>.css for theme templates. It
 * aggregates their classes into the PAGE's global-<page-id>.css via the
 * `elementor/document/related_posts` filter, and deliberately skips embedded
 * documents so they do not produce their own file. So the absence of
 * global-14403-*.css is correct behaviour, not a bug — the header's classes are
 * inside global-14405-*.css. Do not mirror the type classes here; that only
 * creates two sources of truth.
 */

/* --------------------- 13. Header/footer container, stated explicitly */

/*
 * The header and footer must sit on exactly the same 1240 band as the page.
 * Stated here rather than relying on the class alone, because these templates
 * are separate documents and a single missed rule puts the social icons
 * outside the grid while the logo still looks correct.
 */
.elementor-location-header .jsx-header-inner,
.elementor-location-footer .jsx-container {
	width: 100%;
	max-width: 1240px;
	margin-inline: auto;
	box-sizing: border-box;
}

.elementor-location-header .jsx-header-inner { position: relative; }

@media (max-width: 1339px) {
	.elementor-location-header .jsx-header-inner,
	.elementor-location-footer .jsx-container { padding-inline: 40px; }
}
@media (max-width: 767px) {
	.elementor-location-header .jsx-header-inner,
	.elementor-location-footer .jsx-container { padding-inline: 20px; }
}

/* ------------------------------------- 14. Atomic containers as flex children */

/*
 * MEASURED CAUSE of the header's escaping social icons.
 *
 * Every atomic container carries Elementor's `.e-con`, which applies the kit's
 * content width (1240px) as an explicit `width`. Inside a flex row that makes
 * each child 1240px wide, so `justify-content: space-between` pushed the icon
 * group to x=2761 on a 1440 viewport. `flex: 0 0 auto` does not help: a
 * flex-basis of `auto` resolves to `width`, which was still 1240px.
 *
 * Containers that are laid out as flex children must size to their content.
 */
.elementor-location-header .jsx-header-inner > .e-con {
	--width: auto;
	width: auto;
	max-width: none;
}

/*
 * Same rule bites absolutely-positioned containers: the Careers panel is
 * anchored with left AND right, so it must size from those, not from
 * --width: 100% (which made it 124px wider than the viewport and put a
 * horizontal scrollbar on the whole page).
 */
.elementor.elementor .jsx-careers > .e-con:first-child {
	--width: auto;
	width: auto;
}

/* ------------------------------------------------------------ 15. Hero */

/*
 * Readability in the hero is not a single scrim — the approved design uses
 * three layers, and all three values are taken from Figma, not invented:
 *
 *   1. the video itself over black: 32% in the design, 48% on 2026-10-09 (Jun: "make the hero
 *      section video overlay lighter"), then 100% the same day (Jun: "make the homepage video
 *      opacity 1"). 48% was the most the scrims below allow for AA: on a fully white frame the
 *      headline zone kept ~5.3:1 and the figures row ~4.6:1. At 100% only the two scrims darken the
 *      video, so the brightest frames drop the white text below 4.5:1. Accepted at Jun's request;
 *      strengthen the scrims, not the opacity, if contrast has to be restored.
 *   2. a vertical scrim   black .88 -> .34 -> .32 -> .58 in the design. It never rendered (under
 *      the video, see ::before below), so the contrast figures in 1. overstated the margin; since
 *      2026-10-09 ::before is a header-only top shade instead.
 *   3. a horizontal scrim black .50 -> .38 -> 0    -> 0
 *
 * The hero loop is a bright, fast-cut gaming montage, so the video opacity is
 * doing most of the work; without it no scrim alone makes the headline legible
 * on the brightest frames.
 */
.jsx-hero { background-color: #000; }

.jsx-hero video,
.jsx-hero .e-background-video__video {
	opacity: 1;
}

/*
 * ▼▼▼ EXPERIMENTAL (Jun, 2026-10-11: "this is experemental options") — not approved for the client yet.
 *     To remove: delete everything from this line down to the "▲▲▲ END EXPERIMENTAL" marker. Nothing else
 *     depends on it; the hero then renders exactly as before.
 *
 * Darker by default, full brightness on hover (Jun, 2026-10-11: "darken a bit the gradient by default to
 * make header and hero text more visible but when mouse hover the video hero section bring back the current
 * gradient"). Done as a brightness filter on the video rather than by editing the scrims, so the gradients
 * stay exactly as they are and the hover state is precisely the previous look. 0.75 = a 25% black wash.
 *
 * Hover only where a real pointer can hover: phones and tablets keep the darker, more legible version.
 * The header is outside .jsx-hero, so moving up to the menu dims the video again while it is being read.
 */
.jsx-hero video {
	filter: brightness( 0.75 );
	transition: filter 600ms ease;
}

@media ( hover: hover ) and ( pointer: fine ) {
	.jsx-hero:hover video { filter: none; }
}

@media ( prefers-reduced-motion: reduce ) {
	.jsx-hero video { transition: none; }
}
/* ▲▲▲ END EXPERIMENTAL — hero hover brightness */

/*
 * Shadow behind the hero headline (Jun, 2026-10-11: "add shadow to this text to make it more visible
 * without change the whole section gradient overlay opacity"). The video runs at full opacity, so on
 * light frames (the white "digiplus" wall sign) the white title had nothing behind it.
 *
 * filter: drop-shadow on the h1, NOT text-shadow: the line-reveal wraps each line in an
 * overflow:hidden .jsx-line box (6.4px bottom padding), which would clip a soft text-shadow into
 * hard horizontal bands. The h1 itself is overflow:visible, and drop-shadow shades its finished,
 * composited output, so the shadow spills past the line boxes and follows the reveal as it plays.
 * Two layers: a tight one that defines the letter edges, a wide one that lifts the block.
 */
.jsx-hero .jsx-display-hero {
	filter:
		drop-shadow( 0 1px 2px rgba( 0, 0, 0, 0.5 ) )
		drop-shadow( 0 4px 24px rgba( 0, 0, 0, 0.55 ) );
}

/*
 * iOS draws its own round play button over a video whose autoplay it refused (Low Power Mode, seen on
 * Jun's iPhone 2026-10-11). On the hero it sat on the headline and read as a broken player. Hidden: the
 * first frame still shows, and the first tap anywhere starts the loop (inc/enqueue.php fallback).
 *
 * One rule per pseudo-element on purpose: a browser that does not know one of them drops the whole
 * selector list, and the overlay button is Chrome-on-Android only, so a combined rule would be
 * discarded by Safari — the one browser this is for.
 */
.jsx-hero video::-webkit-media-controls-start-playback-button {
	display: none !important;
	-webkit-appearance: none;
}
.jsx-hero video::-webkit-media-controls {
	display: none !important;
}
.jsx-hero video::-webkit-media-controls-overlay-play-button {
	display: none !important;
}

.jsx-hero::before,
.jsx-hero::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
}

/*
 * Top shade behind the header menu (Jun, 2026-10-09: "add subtle gradient shadows from the top to
 * the header menu text will more visible"; the client wants the video itself fully visible).
 *
 * This pseudo used to hold the design's full-height vertical scrim (.88 -> .34 -> .32 -> .58), but
 * it never rendered: it sat at z-index 0 like the video's media layer and comes first in the DOM, so
 * the video painted over it. Turning that scrim on now would darken the whole video, which is the
 * opposite of the brief, so it is replaced by a shade over the header band only. z-index 1 lifts it
 * over the video; the content wrapper (also z-index 1, later in the DOM) still paints above it.
 * Sized in px, not %, so it tracks the header rather than the hero's height.
 */
.jsx-hero::before {
	z-index: 1;
	background: linear-gradient(
		to bottom,
		rgba(0, 0, 0, 0.5) 0,
		rgba(0, 0, 0, 0.18) 100px,
		rgba(0, 0, 0, 0) 220px
	);
}

/* horizontal — keeps the left-hand headline and figures clear of the imagery */
.jsx-hero::after {
	background: linear-gradient(
		to right,
		rgba(0, 0, 0, 0.50) 0%,
		rgba(0, 0, 0, 0.38) 45%,
		rgba(0, 0, 0, 0) 78%,
		rgba(0, 0, 0, 0) 100%
	);
}

/* content sits above both scrims */
.jsx-hero > .e-background-video-content { position: relative; z-index: 1; }
.jsx-hero > .e-background-video-controls { z-index: 2; }

/* Proof row rules, per the design: 1px #FFF at 28%, dividers at 20%. */
.jsx-proof-host > span:first-child { border-top-color: rgba(255, 255, 255, 0.28); }
.jsx-proof-host > span:first-child > span { border-left-color: rgba(255, 255, 255, 0.20); }
.jsx-proof-host > span:first-child > span > span:nth-child(2) { color: #D5CCF2; }
.jsx-proof-host > span:last-child { color: #D5CCF2; opacity: 0.55; }

/* ------------------------------------------------ 16. Button + link arrows */

/*
 * The Figma Button/Primary carries an arrow-right vector, as does the preview
 * card's text link. Drawn with CSS rather than an extra element so the arrow
 * inherits the label colour and cannot fall out of sync with it.
 */
.jsx-btn-primary::after,
.jsx-link-arrow::after {
	content: "";
	width: 15px;
	height: 12px;
	flex: 0 0 auto;
	background-color: currentColor;
	-webkit-mask: var(--jsx-arrow) no-repeat center / contain;
	mask: var(--jsx-arrow) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

:root {
	/*
	 * The kit's own button radius: `.elementor-kit-1247 button { 80px }`. Every
	 * button on the site is a pill because of it, which is why the category
	 * control reads as one and an 8px search field beside it did not. Declared
	 * here so the two controls cannot drift apart; if the kit's value changes,
	 * this is the one line to follow it.
	 */
	--jsx-control-radius: 80px;

	/* the search glyph, inlined for the same reason as the arrow: no request */
	--jsx-search-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Ccircle cx='7' cy='7' r='5' stroke='%23575269' stroke-width='1.6'/%3E%3Cpath d='M11 11l3.5 3.5' stroke='%23575269' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E");
	--jsx-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 12' fill='none'%3E%3Cpath d='M1 6h12M8.5 1.5 13 6l-4.5 4.5' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	--jsx-download: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M8 1.5v8.5M8 10 4.6 6.6M8 10l3.4-3.4M2.2 13.8h11.6' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	--jsx-pin: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 1.5a4.5 4.5 0 0 0-4.5 4.5c0 3.2 4.5 8.5 4.5 8.5s4.5-5.3 4.5-8.5A4.5 4.5 0 0 0 8 1.5Zm0 6.2A1.7 1.7 0 1 1 8 4.3a1.7 1.7 0 0 1 0 3.4Z'/%3E%3C/svg%3E");
	--jsx-mail: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M2 3.5h12a.5.5 0 0 1 .5.5v8a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5V4a.5.5 0 0 1 .5-.5Zm.9 1.3L8 8.6l5.1-3.8H2.9Z'/%3E%3C/svg%3E");
	--jsx-tel: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M5.3 1.8c.4 0 .8.3 1 .7l.9 2.1c.2.4.1.9-.2 1.2l-.9.8a8.3 8.3 0 0 0 3.3 3.3l.8-.9c.3-.3.8-.4 1.2-.2l2.1.9c.4.2.7.6.7 1v2.1c0 .7-.6 1.3-1.3 1.2A12.3 12.3 0 0 1 1.8 3.1c-.1-.7.5-1.3 1.2-1.3h2.3Z'/%3E%3C/svg%3E");
}

.jsx-btn-primary:hover::after,
.jsx-link-arrow:hover::after { transform: translateX(3px); }

/* The secondary button has no arrow in the design. */
.jsx-btn-secondary::after { content: none; }

/* ------------------------------------------- 17. Routing rows, hover colour */

/*
 * The design turns the hovered row light blue and shows a light-blue bar on the
 * left, not just the bar. :focus-within keeps it reachable by keyboard.
 */
.jsx-routing-rows > :nth-child(-n + 4 of .e-con):hover :is(h1,h2,h3,h4,p,span,a),
.jsx-routing-rows > :nth-child(-n + 4 of .e-con):focus-within :is(h1,h2,h3,h4,p,span,a) {
	color: var(--dp-light-blue);
}
.jsx-routing-rows > :nth-child(-n + 4 of .e-con):hover svg,
.jsx-routing-rows > :nth-child(-n + 4 of .e-con):focus-within svg { color: var(--dp-light-blue); }

/* ------------------------------------------------------ 18. News meta row */

/*
 * Rendered by [dp_post_meta]. Attributes are stripped from shortcode output by
 * the paragraph widget, so this is styled structurally from .jsx-meta-host:
 *   host > span              = the row
 *        > span:nth-child(1) = quarter-circle marker
 *        > span:nth-child(2) = date
 *        > span:nth-child(n+3) = category chips
 */
.jsx-meta-host > span {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
}

.jsx-meta-host > span > span:nth-child(1) {
	width: 13px;
	height: 13px;
	flex: 0 0 auto;
	background-color: var(--dp-marker-cyan);
	/* quarter disc, flat edges top and left — the brand's holding shape */
	border-bottom-right-radius: 13px;
}

.jsx-meta-host > span > span:nth-child(2) {
	font-family: var(--dp-font-body);
	font-size: 13px;
	line-height: 1.4;
	color: var(--dp-text-on-light-muted);
	margin-right: 6px;
}

/*
 * `:is(span, a)` because the chips are LINKS now. They are matched by position
 * rather than class (attributes are stripped from shortcode output by the
 * paragraph widget), so widening the element list is the only way to keep the
 * pill once the tag changed — a bare `span:nth-child(n+3)` silently stopped
 * matching and the chips fell back to plain text in the default link red.
 */
.jsx-meta-host > span > :is( span, a ):nth-child(n + 3) {
	font-family: var(--dp-font-body);
	font-size: 12px;
	line-height: 1.4;
	padding: 5px 10px;
	border-radius: 4px;
	background-color: var(--dp-blue);
	color: #fff;
	white-space: nowrap;
	text-decoration: none;
	transition: background-color 120ms ease;
}

.jsx-meta-host > span > a:nth-child(n + 3):hover,
.jsx-meta-host > span > a:nth-child(n + 3):focus-visible {
	background-color: var(--dp-violet);
	color: #fff;
}

/* On the image card the meta sits on photography. */
.jsx-news-side > *:nth-child(3) .jsx-meta-host > span > span:nth-child(2) { color: #fff; }

/* ------------------------------------------- 19. News side column layout */

/*
 * Figma 38:147-38:153: the right-hand column reads compact / image card /
 * compact, and the image card is the MIDDLE one. The loop has no offset, so it
 * fetches four and the first (a duplicate of the featured article) is hidden —
 * which makes the image card :nth-child(3), not (2). The other two hide their
 * thumbnail and read as text rows.
 *
 * Spacing is not set here: the loop layout is a flex column with
 * justify-content: space-between, so the three cards distribute themselves over
 * whatever height the featured card sets. That lands within ~10px of the
 * design's 51/40 gaps and survives a headline wrapping to an extra line.
 */
/* :not(:last-child): the Elementor editor renders a loop as its one template card, and hiding that
   left nothing on the homepage to select or edit (2026-10-04). Live there are always three. */
.jsx-news-side > *:nth-child(1):not(:last-child) { display: none; }

.jsx-news-side > *:not(:nth-child(3)) img { display: none; }

/* design draws the two text rows 20px narrower than the image card */
.jsx-news-side > *:not(:nth-child(3)) { max-width: 440px; }

/*
 * Every card in this column is 18/1.35 regular (38:148, 38:152) — lighter than
 * the featured card's 20/600. Headlines clamp to two lines, as the design draws
 * them: it truncates both the image card and the second compact card.
 */
.elementor.elementor .jsx-news-side :is(h3, h3 a) {
	font-size: 18px;
	line-height: 1.35;
	font-weight: 400;
	letter-spacing: -0.09px;
}

.elementor.elementor .jsx-news-side h3 a {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.jsx-news-side > *:nth-child(3) {
	position: relative;
	border-radius: 12px;
	overflow: hidden;
	padding: 0;
	min-height: 220px;
	justify-content: flex-end;
}
.jsx-news-side > *:nth-child(3) img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 0;
}
.jsx-news-side > *:nth-child(3) > :not(img) {
	position: relative;
	z-index: 1;
	padding-inline: 24px;
}
.jsx-news-side > *:nth-child(3) > :nth-child(2) { padding-top: 90px; }
.jsx-news-side > *:nth-child(3) > :last-child { padding-bottom: 20px; }

/*
 * Figma 38:151 washes the WHOLE card from 25% to 85% — it does not start
 * transparent. The headline sits mid-card, not at the foot, so a scrim that
 * only darkens the bottom third leaves it on bare photography.
 */
.jsx-news-side > *:nth-child(3)::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(to bottom, rgba(13, 0, 71, 0.25) 0%, rgba(13, 0, 71, 0.85) 100%);
	z-index: 0;
}
.jsx-news-side > *:nth-child(3) :is(h3, a) { color: #fff !important; }

/* the design draws no rules between the text rows */

/* the active filter carries the marker */
.jsx-tab-active { display: inline-flex; align-items: center; gap: 9px; }
.jsx-tab-active::before {
	content: "";
	width: 13px;
	height: 13px;
	background-color: var(--dp-marker-cyan);
	border-bottom-right-radius: 13px;
	flex: 0 0 auto;
}

/* --------------------------------------------- 20. Routing row hover bar */

/*
 * Figma: the hover indicator is a 3x60 bar, vertically CENTRED in the row —
 * not a full-height left border — and the label shifts 32px to clear it.
 * Drawn as a pseudo-element so it can be shorter than the row.
 */
.jsx-routing-rows > :nth-child(-n + 4 of .e-con)::before {
	content: "";
	position: absolute;
	left: 0;
	top: 50%;
	transform: translateY(-50%);
	width: 3px;
	height: 60px;
	background-color: var(--dp-light-blue);
	opacity: 0;
	transition: opacity 160ms ease-out;
}

.jsx-routing-rows > :nth-child(-n + 4 of .e-con):hover::before,
.jsx-routing-rows > :nth-child(-n + 4 of .e-con):focus-within::before { opacity: 1; }

/* the label shifts clear of the bar; the arrow stays put */
.jsx-routing-rows > :nth-child(-n + 4 of .e-con) > :first-child {
	transition: padding-left 160ms ease-out;
	padding-left: 0;
}
.jsx-routing-rows > :nth-child(-n + 4 of .e-con):hover > :first-child,
.jsx-routing-rows > :nth-child(-n + 4 of .e-con):focus-within > :first-child { padding-left: 32px; }

/* --------------------------------- 21. Financial figures, positive deltas */

/*
 * Figma colours a rise in brand blue and leaves a fall (and plain period
 * labels like "FY2025") in muted text. The delta is the third span in each
 * figure; :has() keys off the leading "+" the parser writes.
 */
.jsx-figures-host > span > span > span:nth-child(3) { color: var(--dp-text-on-light-muted); }

/* a rise emits an empty marker span first: hide it, colour the delta after it */
.jsx-figures-host > span > span > span:nth-child(3):empty { display: none; }
.jsx-figures-host > span > span > span:nth-child(4) {
	display: block;
	font-family: var(--dp-font-body);
	font-size: 13px;
	line-height: 1.4;
	margin-top: 4px;
	color: var(--dp-blue);
}

/* --------------------------------- 22. Product card scrim */

/*
 * Figma gives every product card a bottom scrim (I38:129;8:3) so the white
 * description reads over the artwork — 320px tall, transparent to 66% black.
 * Without it the copy sits on raw photography and the contrast is unpredictable
 * per card. The card body is position:relative, so the pseudo-element lands
 * above the card's absolutely-positioned background image but below the body's
 * own children, which is exactly the design's stacking order.
 */
.jsx-product-cards > .e-con > .e-con::before {
	content: "";
	position: absolute;
	top: auto;            /* Elementor's own .e-con::before sets top: 0 — reset it, or */
	left: 0;              /* the 320px block anchors to the TOP of the card instead */
	right: 0;
	bottom: 0;
	height: 320px;
	z-index: -1;          /* an absolutely-positioned ::before otherwise paints ABOVE the
	                         lockup and the copy; -1 keeps it inside the body's stacking
	                         context (so still over the card artwork) but behind the text */
	background-image: linear-gradient(
		to bottom,
		rgba(0, 0, 0, 0) 0%,
		rgba(0, 0, 0, 0.34) 55%,
		rgba(0, 0, 0, 0.66) 100%
	);
	pointer-events: none;
}

/* ------------------------------------------ 23. Latest News filter tabs */

/*
 * The active pill's colour is set per-element in Elementor, so it cannot follow
 * a class the script moves at runtime. These rules take it over for all six.
 * Elementor emits global classes at .elementor .g-xxx (0,2,0), so the prefix is
 * needed to out-weigh them.
 */
/*
 * The pills are rendered by assets/js/news-filter.js from the saved tab config,
 * so the label, count and order all come from Settings -> Latest News Tabs.
 * That means their sizing can no longer come from Elementor's per-element
 * classes — it lives here, matching what the builder produced: 44px tall,
 * 14px sides, 16/1.7 General Sans.
 */
.elementor.elementor .jsx-news-tabs > span {
	display: flex;
	align-items: center;
	height: 44px;
	padding: 0 14px;
	font-family: var(--dp-font-body);
	font-size: 16px;
	line-height: 1.7;
	color: var(--dp-text-on-light-muted);
	cursor: pointer;
	user-select: none;
	white-space: nowrap;
	transition: color 120ms ease;
}

.elementor.elementor .jsx-news-tabs > span.jsx-tab-active {
	color: var(--dp-text-on-light);
}

.elementor.elementor .jsx-news-tabs > span:hover {
	color: var(--dp-text-on-light);
}

/* the pills are spans, so they need a visible focus ring of their own */
.elementor.elementor .jsx-news-tabs > span:focus-visible {
	outline: 2px solid var(--dp-blue);
	outline-offset: 2px;
	border-radius: 4px;
}

/*
 * Cards with no featured image are served the brand placeholder (media 14488)
 * by hello_digiplus_fallback_thumbnail(), so there is no empty state to style
 * here any more. The old violet-gradient fallback has been removed.
 */

/*
 * Hold the featured headline at two lines. Without this a filter whose top
 * story has a short headline collapses it to one line, shrinking the card by
 * 26px and shifting the whole page below the section every time a tab is
 * clicked. Two lines is what the design draws, and it truncates beyond that.
 */
.elementor.elementor .jsx-news-featured h3 {
	min-height: 2.6em;
}

.elementor.elementor .jsx-news-featured h3 a {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

/* announcement target for the filter; visible to screen readers only */
.jsx-sr-only {
	position: absolute !important;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

/* ---------------------------------------------- 24. Search overlay (69:3) */

/*
 * Figma 69:3. A white panel drops from the top of the viewport over a dimmed
 * page; the site header stays put and turns white on top of it.
 *
 * The panel's height is NOT the design's fixed 486px. The design draws five
 * suggested terms on one row; the client's ACF list holds seven, which wraps to
 * two. min-height keeps the drawn proportion when the list is short and lets it
 * grow when it is not.
 */
.jsx-search[hidden] { display: none; }

.jsx-search {
	position: fixed;
	inset: 0;
	z-index: 9000;
}

.jsx-search__dim {
	position: absolute;
	inset: 0;
	background-color: rgba(11, 6, 24, 0.72);
	animation: jsx-search-fade 180ms ease both;
}

.jsx-search__panel {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	min-height: 486px;
	padding: 172px 0 60px;
	background-color: #fff;
	box-shadow: 0 18px 48px rgba(8, 0, 31, 0.3);
	animation: jsx-search-drop 220ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}

@keyframes jsx-search-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes jsx-search-drop { from { transform: translateY(-16px); opacity: 0; } to { transform: none; opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
	.jsx-search__dim,
	.jsx-search__panel { animation: none; }
}

/*
 * Figma stacks a Close icon underneath the Contact button at identical
 * coordinates, so as drawn the overlay has NO visible way out. It also sits in
 * the top 80px, which the live header now occupies and paints over.
 *
 * So the close moves into the panel's own content area, on the same 100px
 * grid as everything else and clear of the header band. Escape, the dim and
 * the header's search icon (which toggles) all close it as well.
 */
.jsx-search__close {
	position: absolute;
	top: 100px;
	right: 100px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: transparent;
	color: var(--dp-text-on-light-muted);
	cursor: pointer;
	transition: background-color 120ms ease, color 120ms ease;
}

.jsx-search__close:hover,
.jsx-search__close:focus {
	background-color: #f3f2f7;
	color: var(--dp-text-on-light);
}

.jsx-search__form {
	display: flex;
	align-items: center;
	gap: 24px;
	padding-bottom: 38px;
	border-bottom: 1px solid var(--dp-line-on-light);
}

/*
 * The placeholder is -30% from the Figma 44px at EVERY width above iPad
 * portrait (Jun, desktop + iPad landscape): 44 -> 31, tracking -0.66 -> -0.46,
 * because the original value was drawn for 44px display type and pinches at 31.
 */
.jsx-search .jsx-search__input {
	flex: 1 1 auto;
	min-width: 0;
	padding: 0;
	border: 0;
	background: transparent;
	font-family: var(--dp-font-display);
	font-size: 31px;
	line-height: 1.15;
	letter-spacing: -0.46px;
	color: var(--dp-text-on-light);
}

.jsx-search .jsx-search__input::placeholder {
	color: var(--dp-text-on-light-muted);
	opacity: 1;
}

.jsx-search .jsx-search__input:focus { outline: none; }

.jsx-search__form:focus-within {
	border-bottom-color: var(--dp-blue);
}

/*
 * hello-elementor's reset paints EVERY button crimson on hover AND focus:
 *   assets/css/reset.css
 *   button:hover, button:focus, [type=submit]:hover, [type=submit]:focus
 *     { background-color: #c36; color: #fff }
 *
 * Ours are icon buttons on white, so that is a red disc with a white glyph —
 * and on :focus a keyboard user gets it too. Naming the states on our own base
 * rules is what beats it: identical specificity (0,1,1), and this file loads
 * after the parent theme, so the tie goes our way. Any new <button> added to
 * this theme needs the same treatment.
 */
.jsx-search__submit {
	flex: 0 0 auto;
	width: 32px;
	height: 32px;
	padding: 0;
	border: 0;
	cursor: pointer;
}

/*
 * ONLY the painted properties carry the states — never the box.
 *
 * Putting `:hover` on the rule above was a mistake: `.x:hover` is (0,1,1) and
 * beat the `@media (max-width: 767px) .x { width: 18px }` override at (0,1,0),
 * so on a phone the button grew 18 -> 32 under the cursor and the icon jumped.
 * The reset only changes background-color, colour and text-decoration, so only
 * those need answering; leave every layout property in a stateless rule where
 * the responsive overrides can still reach it.
 */
.jsx-search__submit,
.jsx-search__submit:hover,
.jsx-search__submit:focus {
	background: transparent;
	color: var(--dp-text-on-light);
}

.jsx-search__label {
	margin: 36px 0 0;
	font-family: var(--dp-font-subhead);
	font-size: 13px;
	font-weight: 500;
	line-height: 1.4;
	letter-spacing: 1.3px;
	color: var(--dp-text-on-light-muted);
}

.jsx-search__terms {
	display: flex;
	flex-wrap: wrap;
	/* -30%: 12 -> 8, 24 -> 17 */
	gap: 8px;
	margin: 17px 0 0;
	padding: 0;
	list-style: none;
}

/*
 * Reduced 30% from the Figma pill (48 tall, 24 inline, 16px type).
 *
 * 34px keeps the tap target clear of the 24x24 floor WCAG 2.2 sets for Target
 * Size (2.5.8) — a straight 30% of every dimension would have been fine there
 * too, but it is worth stating why 34 is the floor for any further reduction.
 *
 * The type is 12px rather than the arithmetic 11.2: that is the size every
 * other chip on this site already uses (the card meta chips, the article
 * "Filed under" tags), so the pills now match them instead of introducing a
 * ninth text size.
 */
.jsx-search__terms a {
	display: inline-flex;
	align-items: center;
	height: 34px;
	padding: 0 17px;
	border-radius: 17px;
	background-color: var(--dp-blue);
	color: #fff;
	font-family: var(--dp-font-body);
	font-size: 12px;
	line-height: 1.7;
	text-decoration: none;
	white-space: nowrap;
}

.jsx-search__terms a:hover { background-color: var(--dp-violet); }

/*
 * The panel's CONTENT sits on the header's band, not on its own gutter.
 *
 * The sheet itself stays full-bleed white; only what is inside it is
 * constrained. It used to carry a flat `padding-inline: 100px` with no
 * max-width, which happens to line up with the header at exactly 1440 and
 * drifts everywhere else — at 1920 the content ran 100-1820 against the
 * header's 340-1580, 240px out on each side.
 *
 * These are the same three values `.jsx-header-inner` uses (section 13):
 * max-width 1240 centred, gutter 0 above 1339, 40 below it, 20 below 768. The
 * close button is excluded because it is absolutely positioned and does its
 * own alignment.
 */
.jsx-search__panel > :not( .jsx-search__close ) {
	box-sizing: border-box;
	width: 100%;
	max-width: 1240px;
	margin-inline: auto;
}

@media (max-width: 1339px) {
	.jsx-search__panel > :not( .jsx-search__close ) { padding-inline: 40px; }
}

@media (max-width: 767px) {
	.jsx-search__panel > :not( .jsx-search__close ) { padding-inline: 20px; }
}

.jsx-search :is(a, button, input):focus-visible {
	outline: 2px solid var(--dp-blue);
	outline-offset: 3px;
}

/* --- header while the overlay is open ------------------------------------ */

/*
 * Jun: "when search function open, the header color change to white". The
 * header keeps its position and z-order; only its palette changes, and the
 * wordmark swaps to the dark cut (media 14485) since the white one vanishes.
 */
body.dp-search-open .jsx-header {
	background-color: #fff;
	z-index: 9001;
}

body.dp-search-open .jsx-header :is(a, p, span) { color: var(--dp-text-on-light); }
body.dp-search-open .jsx-header svg { color: var(--dp-text-on-light); fill: currentColor; }

body.dp-search-open .jsx-header img[src*="js-wordmark-white"],
body.dp-search-open .jsx-header img[src*="logo"] {
	content: url("/wp-content/uploads/2026/09/js-wordmark-dark.png");
}

/*
 * The close button has to clear the HEADER, which is 88px tall at every width
 * and sits on top of this panel (both start at the same y). At 76px the
 * button's top 12px were behind the header; at 62px, below, it was worse.
 * The base rule above already has the right relationship — 100px top, content
 * at 172 — these two breakpoints just never got it. 96px puts the button 8px
 * under the header, and the panel's top padding moves down to clear its 44px.
 */
@media (max-width: 1024px) {
	.jsx-search__panel { padding: 140px 0 48px; min-height: 0; }
	/*
	 * -50% from iPad portrait down: 34 -> 17. The tracking halves with it —
	 * the base -0.66px was drawn for 44px type and reads as a squeeze at 17.
	 */
	.jsx-search .jsx-search__input { font-size: 17px; letter-spacing: -0.33px; }
	.jsx-search__close { top: 96px; right: 40px; }
}

/* Figma 92:101 — mobile stacks the terms and drops the type to 30px */
@media (max-width: 767px) {
	.jsx-search__panel { padding: 120px 0 40px; }
	/*
	 * 16px, not the arithmetic 15: iOS Safari ZOOMS the page whenever a focused
	 * input is under 16px, and being thrown into a zoomed viewport on every
	 * search is far worse than the 1px. Everything else here is the full 50%.
	 */
	.jsx-search .jsx-search__input { font-size: 16px; letter-spacing: -0.22px; }
	.jsx-search__form { gap: 16px; padding-bottom: 28px; }
	.jsx-search__submit { width: 18px; height: 18px; }
	.jsx-search__submit svg { width: 18px; height: 18px; }
	.jsx-search__label { margin-top: 28px; }
	/* -30%: 10 -> 7, 18 -> 13, 44 -> 31, 20 -> 14 */
	.jsx-search__terms { gap: 7px; margin-top: 13px; }
	.jsx-search__terms a { height: 31px; padding: 0 14px; }
	.jsx-search__close { top: 96px; right: 20px; }
}

/* --------------------------------------- 25. Search results page (70:9) */

/*
 * The header is absolutely positioned so it can sit over the homepage hero.
 * On results there is no hero, so it needs to be solid and in flow. Same
 * palette change as the open overlay, hence the shared selector list.
 */
body.dp-light-header .jsx-header {
	background-color: #fff;
	/*
	 * White header, white page — with nothing between them the header had no
	 * edge at the top of an article. The scrolled state already carried a
	 * hairline (see the .dp-header-solid rule); this gives the same separation
	 * before the first scroll, which is where the page is first seen.
	 */
	box-shadow: var( --jsx-header-shadow );
}

/* fixed now (see §31), so the results content needs the header's band back */
body.dp-light-header .jsx-results { padding-top: 168px; }

body.dp-light-header .jsx-header :is(a, p, span) { color: var(--dp-text-on-light); }
body.dp-light-header .jsx-header svg { color: var(--dp-text-on-light); fill: currentColor; }

body.dp-light-header .jsx-header img[src*="js-wordmark-white"],
body.dp-light-header .jsx-header img[src*="logo"] {
	content: url("/wp-content/uploads/2026/09/js-wordmark-dark.png");
}

/*
 * padding-top is measured from the rendered header so the eyebrow lands on the
 * design's y168, rather than guessed from the frame. Re-measured at 91px after
 * the nav's 2px hover border came off — this value tracks the header height.
 */
.jsx-results {
	max-width: 1240px;
	margin: 0 auto;
	padding: 77px 0 120px;
}

/* --- query block, all centred (70:23-70:30) ------------------------------ */

.jsx-results__eyebrow {
	margin: 0;
	font-family: var(--dp-font-subhead);
	font-size: 13px;
	font-weight: 500;
	line-height: 1.4;
	letter-spacing: 1.3px;
	text-align: center;
	text-transform: uppercase;
	color: var(--dp-text-on-light-muted);
}

.jsx-results .jsx-results__query {
	margin: 20px 0 0;
	font-family: var(--dp-font-display);
	font-size: 64px;
	font-weight: 400;
	line-height: 1.08;
	letter-spacing: -1.28px;
	text-align: center;
	color: var(--dp-text-on-light);
	overflow-wrap: anywhere;
}

.jsx-results__count {
	margin: 25px 0 0;
	font-family: var(--dp-font-body);
	font-size: 20px;
	line-height: 1.6;
	text-align: center;
	color: var(--dp-text-on-light-muted);
}

/* the "something else?" field is a 960 rule centred in the 1240 container */
.jsx-results__search {
	display: flex;
	align-items: center;
	gap: 24px;
	width: 960px;
	max-width: 100%;
	margin: 40px auto 0;
	padding-bottom: 22px;
	border-bottom: 1px solid var(--dp-line-on-light);
}

.jsx-results .jsx-results__input {
	flex: 1 1 auto;
	min-width: 0;
	padding: 0;
	border: 0;
	background: transparent;
	font-family: var(--dp-font-subhead);
	font-size: 40px;
	line-height: 1.2;
	letter-spacing: -0.4px;
	color: var(--dp-text-on-light);
}

.jsx-results .jsx-results__input::placeholder {
	color: var(--dp-text-on-light-muted);
	opacity: 1;
}

.jsx-results .jsx-results__input:focus { outline: none; }
.jsx-results__search:focus-within { border-bottom-color: var(--dp-blue); }

.jsx-results__submit {
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	padding: 0;
	border: 0;
	background: transparent;
	color: var(--dp-text-on-light);
	cursor: pointer;
}

/* --- result-type tabs (70:31) -------------------------------------------- */

.jsx-results__tabs {
	display: flex;
	justify-content: center;
	gap: 14px;
	margin-top: 64px;
}

.jsx-results__tab {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	height: 44px;
	padding: 0 14px;
	font-family: var(--dp-font-body);
	font-size: 16px;
	line-height: 1.7;
	color: var(--dp-text-on-light-muted);
	cursor: pointer;
	user-select: none;
	transition: color 120ms ease;
}

.jsx-results__tab:hover,
.jsx-results__tab.jsx-tab-active { color: var(--dp-text-on-light); }

.jsx-results__tab:focus-visible {
	outline: 2px solid var(--dp-blue);
	outline-offset: 2px;
	border-radius: 4px;
}

/* --- section headings, with the brand marker ----------------------------- */

/* Figma: 46px from the tabs to the first heading, 160px between sections. */
.jsx-results__section { margin-top: 46px; }
.jsx-results__section + .jsx-results__section { margin-top: 160px; }
.jsx-results__section[hidden] { display: none; }

.jsx-results__heading {
	display: flex;
	align-items: center;
	gap: 14px;
	margin: 0 0 32px;
	font-family: var(--dp-font-subhead);
	font-size: 40px;
	font-weight: 400;
	line-height: 1.2;
	letter-spacing: -0.4px;
	color: var(--dp-text-on-light);
}

.jsx-results__heading::before {
	content: "";
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	background-color: var(--dp-marker-cyan);
	border-bottom-right-radius: 18px;
}

/* --- page results: the routing-row pattern from S2 ----------------------- */

.jsx-results__rows { margin: 0; padding: 0; list-style: none; }

.jsx-results__row {
	position: relative;
	border-top: 1px solid var(--dp-line-on-light);
}

.jsx-results__row:last-child { border-bottom: 1px solid var(--dp-line-on-light); }

.jsx-results__row-link {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 32px;
	min-height: 105px;
	padding: 12px 0;
	color: var(--dp-text-on-light);
	text-decoration: none;
	transition: padding-left 160ms ease;
}

.jsx-results__row-title {
	font-family: var(--dp-font-subhead);
	font-size: 28px;
	line-height: 1.2;
	letter-spacing: -0.28px;
}

.jsx-results__row-arrow { flex: 0 0 auto; }

/* the indicator is a 3x52 bar centred in the row, not a full-height border */
.jsx-results__row-link::before {
	content: "";
	position: absolute;
	top: 50%;
	left: 0;
	width: 3px;
	height: 52px;
	transform: translateY(-50%);
	background-color: var(--dp-blue);
	opacity: 0;
	transition: opacity 160ms ease;
}

.jsx-results__row:hover .jsx-results__row-link,
.jsx-results__row-link:focus-visible { padding-left: 32px; }

.jsx-results__row:hover .jsx-results__row-link::before,
.jsx-results__row-link:focus-visible::before { opacity: 1; }

/* --- hover preview (75:74) ----------------------------------------------- */

.jsx-results__preview {
	position: absolute;
	top: 50%;
	right: 0;
	z-index: 2;
	width: 460px;
	padding: 0 0 32px;
	transform: translateY(-50%);
	background-color: #fff;
	border-radius: 12px;
	box-shadow: 0 18px 48px rgba(8, 0, 31, 0.18);
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity 160ms ease;
}

.jsx-results__row:hover .jsx-results__preview {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
}

.jsx-results__preview img {
	display: block;
	width: 100%;
	height: 258px;
	object-fit: cover;
	border-radius: 12px 12px 0 0;
}

.jsx-results__preview-title {
	margin: 36px 32px 0;
	font-family: var(--dp-font-body);
	font-size: 20px;
	font-weight: 600;
	line-height: 1.3;
	color: var(--dp-text-on-light);
}

.jsx-results__preview-text {
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
	margin: 14px 32px 0;
	font-family: var(--dp-font-body);
	font-size: 16px;
	line-height: 1.7;
	color: var(--dp-text-on-light-muted);
}

.jsx-results__preview-cta {
	display: inline-flex;
	align-items: center;
	height: 48px;
	margin: 28px 32px 0;
	padding: 0 24px;
	border-radius: 6px;
	background-color: var(--dp-blue);
	color: #fff;
	font-family: var(--dp-font-body);
	font-size: 16px;
	font-weight: 500;
}

/* --- article cards (72:3) ------------------------------------------------ */

.jsx-results__grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 56px 40px;
}

.jsx-results__card-link { display: block; text-decoration: none; }

.jsx-results__card-img,
.jsx-results__card .jsx-results__card-img {
	display: block;
	width: 100%;
	height: 232px;
	object-fit: cover;
	border-radius: 14px;
}

.jsx-results__card-title {
	margin: 18px 0 0;
	font-family: var(--dp-font-body);
	font-size: 22px;
	font-weight: 600;
	line-height: 1.28;
	letter-spacing: -0.11px;
	color: var(--dp-text-on-light);
}

.jsx-results__card-meta { margin: 18px 0 0; }

/* the design shows result dates in full text colour, not the muted news grey */
.jsx-results__card-meta > span > span:nth-child(2) {
	font-size: 15px;
	color: var(--dp-text-on-light);
}

/* --- pagination (70:109) ------------------------------------------------- */

.jsx-results__pagination {
	display: flex;
	justify-content: center;
	gap: 10px;
	margin-top: 64px;
}

.jsx-results__pagination :is(a, span) {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: 8px;
	font-family: var(--dp-font-body);
	font-size: 16px;
	line-height: 1.7;
	color: var(--dp-text-on-light-muted);
	text-decoration: none;
}

.jsx-results__pagination a:hover { background-color: #f3f2f7; color: var(--dp-text-on-light); }
.jsx-results__pagination .current { background-color: var(--dp-blue); color: #fff; }

.jsx-results__empty {
	margin: 80px auto 0;
	max-width: 720px;
	font-family: var(--dp-font-body);
	font-size: 20px;
	line-height: 1.7;
	text-align: center;
	color: var(--dp-text-on-light-muted);
}

@media (max-width: 1320px) {
	.jsx-results { padding-left: 40px; padding-right: 40px; }
	.jsx-results__preview { display: none; }
}

@media (max-width: 1024px) {
	.jsx-results__query { font-size: 48px; letter-spacing: -0.96px; }
	.jsx-results .jsx-results__input { font-size: 30px; }
	.jsx-results__heading { font-size: 32px; }
	.jsx-results__row-title { font-size: 22px; }
	.jsx-results__grid { grid-template-columns: repeat(2, 1fr); gap: 40px 32px; }
}

/* Figma 92:119 — one column, tighter rhythm */
@media (max-width: 767px) {
	.jsx-results { padding: 48px 20px 80px; }
	.jsx-results__query { font-size: 34px; letter-spacing: -0.68px; }
	.jsx-results .jsx-results__input { font-size: 22px; }
	.jsx-results__search { gap: 16px; margin-top: 28px; padding-bottom: 16px; }
	.jsx-results__tabs { margin-top: 38px; }
	.jsx-results__section { margin-top: 56px; }
	.jsx-results__heading { font-size: 26px; gap: 10px; margin-bottom: 22px; }
	.jsx-results__heading::before { width: 16px; height: 16px; border-bottom-right-radius: 16px; }
	.jsx-results__row-link { min-height: 76px; padding: 10px 0; gap: 16px; }
	.jsx-results__row-title { font-size: 19px; }
	.jsx-results__grid { grid-template-columns: 1fr; gap: 40px; }
	.jsx-results__card-title { font-size: 20px; }
}

/* ------------------------------------ 26. Card thumbnail zoom on hover */

/*
 * The thumbnail scales inside a clipping wrapper, so it grows within its own
 * frame instead of spilling over the headline beneath it. Every card that
 * shows artwork gets the same treatment:
 *
 *   search result card  -> .jsx-results__card-media   (wrapper in search.php)
 *   news featured card  -> .jsx-media                 (wrapper in the loop template)
 *   news image card     -> the card itself, which already clips
 *
 * 1.06 rather than a larger figure: these thumbnails carry burned-in headline
 * text, and anything more starts cropping words at the edges.
 */
.jsx-results__card-media,
.jsx-media {
	display: block;
	overflow: hidden;
	border-radius: 14px;
}

.jsx-media { border-radius: 12px; }

.jsx-results__card-media img,
.jsx-media img,
.jsx-news-side > *:nth-child(3) img {
	transition: transform 420ms cubic-bezier(0.22, 0.61, 0.36, 1);
	will-change: transform;
}

.jsx-results__card:hover .jsx-results__card-media img,
.jsx-results__card-link:focus-visible .jsx-results__card-media img,
.jsx-news-featured .e-con:hover > .jsx-media img,
.jsx-news-side > *:nth-child(3):hover img {
	transform: scale(1.06);
}

/* the wrapper owns the corner now, so the image must not round inside it.
   Two classes deep: .jsx-results__card .jsx-results__card-img is (0,2,0). */
.jsx-results__card .jsx-results__card-media img { border-radius: 0; }

@media (prefers-reduced-motion: reduce) {
	.jsx-results__card-media img,
	.jsx-media img,
	.jsx-news-side > *:nth-child(3) img { transition: none; }

	.jsx-results__card:hover .jsx-results__card-media img,
	.jsx-news-featured .e-con:hover > .jsx-media img,
	.jsx-news-side > *:nth-child(3):hover img { transform: none; }
}

/* the preview CTA is a real link now, so give it the button's hover */
a.jsx-results__preview-cta { text-decoration: none; transition: background-color 120ms ease; }
a.jsx-results__preview-cta:hover { background-color: var(--dp-violet); }

/* --------------------------------- 27. Latest News search field (38:142) */

/*
 * The shell keeps its Elementor styling (240x44, #F3F2F7, radius 22, padding);
 * the relocated form just fills it and reproduces the same flex row the
 * decorative label and icon had.
 */
.jsx-news-search__form {
	display: flex;
	align-items: center;
	gap: 12px;
	width: 100%;
}

.jsx-news-search .jsx-news-search__input {
	flex: 1 1 auto;
	min-width: 0;
	padding: 0;
	border: 0;
	background: transparent;
	font-family: var(--dp-font-body);
	font-size: 14px;
	line-height: 1.6;
	color: var(--dp-text-on-light);
}

.jsx-news-search .jsx-news-search__input::placeholder {
	color: var(--dp-text-on-light-muted);
	opacity: 1;
}

.jsx-news-search .jsx-news-search__input:focus { outline: none; }

.jsx-news-search:focus-within {
	box-shadow: 0 0 0 2px var(--dp-blue);
}

.jsx-news-search__submit {
	display: inline-flex;
	flex: 0 0 auto;
	padding: 0;
	border: 0;
	cursor: pointer;
}

/* paint only — see the note on .jsx-search__submit above */
.jsx-news-search__submit,
.jsx-news-search__submit:hover,
.jsx-news-search__submit:focus {
	background: transparent;
	color: var(--dp-text-on-light-muted);
}

.jsx-news-search__submit:hover,
.jsx-news-search__submit:focus-visible { color: var(--dp-text-on-light); }

/* the shell is the visible control, so it owns the focus ring */
.jsx-news-search__submit:focus-visible,
.jsx-news-search .jsx-news-search__input:focus-visible { outline: none; }

/*
 * The filter bar is a nowrap row: pills on the left, search on the right. At
 * 1440 that is 679 + 24 + 240 inside 1240 and fits. Below ~1180 the container
 * is narrower than the row and the field pushed past it, which put a
 * horizontal scrollbar on the whole page — visible once the field stopped
 * shrinking and started holding its designed 240px.
 *
 * :has() reaches the bar, which is an Elementor container with no class of
 * its own.
 */
@media (max-width: 1180px) {
	.e-con:has(> .jsx-news-tabs),
	.e-con:has(> .jsx-news-tabs-host) {
		flex-wrap: wrap;
		row-gap: 20px;
	}

	.jsx-news-search { margin-left: auto; }
}

/* below 768 the field is display:none by design (the mobile frame has no
   news search), so it needs no rule of its own down there. */

/* --------------------------------- 28. Hello's white focus ring, cleared */

/*
 * hello-elementor/reset.css paints a 4px WHITE box-shadow on every
 * :focus-visible control:
 *
 *   [tabindex]:not([tabindex="-1"]):focus-visible, a:focus-visible,
 *   button:focus-visible, input:focus-visible, ...
 *   { box-shadow: 0 0 0 4px #fff; outline: 2px solid #000; outline-offset: 2px }
 *
 * Overriding `outline` alone leaves the white ring behind — which is what
 * showed inside the news search pill. Every control where we define our own
 * focus treatment has to clear the box-shadow too.
 */
.jsx-news-search :is(input, button):focus-visible,
.jsx-search :is(a, button, input):focus-visible,
.jsx-results :is(a, button, input):focus-visible,
.jsx-news-tabs > span:focus-visible,
.jsx-results__tab:focus-visible {
	box-shadow: none;
}

/* the shell is the visible control, so it carries the ring for both children */
.jsx-news-search :is(input, button):focus-visible {
	outline: none;
}

/* ------------------------------------------- 29. Header nav hover colour */

/*
 * Jun: drop the underline bar, just tint the label on hover.
 *
 * The bar was an Elementor per-element border-bottom-color; that and the 2px
 * transparent border reserving room for it are gone from the template.
 *
 * Which blue depends on the header's state, because the palette's two blues
 * invert against each other:
 *
 *   on the dark header  #4600FF measures 1.4:1 — illegible
 *                       #46BCFF measures 4.9:1
 *   on the white header #46BCFF measures 2.1:1 — illegible
 *                       #4600FF measures 7.8:1
 *
 * So the dark header hovers to the light blue (the same accent the bar used)
 * and the white states hover to the deep brand blue.
 */
.elementor.elementor .jsx-ui-nav,
.elementor.elementor .jsx-ui-nav a {
	transition: color 140ms ease;
}

.elementor.elementor .jsx-ui-nav:hover,
.elementor.elementor .jsx-ui-nav:hover a,
.elementor.elementor .jsx-ui-nav a:focus-visible {
	color: var(--dp-light-blue);
}

body.dp-search-open .jsx-ui-nav:hover,
body.dp-search-open .jsx-ui-nav:hover a,
body.dp-search-open .jsx-ui-nav a:focus-visible,
body.dp-light-header .jsx-ui-nav:hover,
body.dp-light-header .jsx-ui-nav:hover a,
body.dp-light-header .jsx-ui-nav a:focus-visible {
	color: var(--dp-blue);
}

/* ------------------------------------------ 29b. Header Contact Us button */

/*
 * The last item in the nav, after Careers, so it travels into the compact menu
 * with the links rather than needing a second copy.
 *
 * Brand blue with white ink in every header state (Jun, 2026-10-03). It first
 * shipped white on the dark bar, mirroring jsx-btn-primary, because #4600FF
 * measures 1.4:1 against the bar -- but that figure matters for blue TEXT, not
 * for a filled button. The label is white on #4600FF at 7.8:1, and WCAG 1.4.11
 * does not ask a button's edge to contrast with its surroundings when the text
 * already identifies it. Hover to violet, as every house CTA does.
 *
 * House CTA shape otherwise -- 8px radius, body face at 16 / 500 -- trimmed to
 * 44px tall to sit inside the bar.
 */
.elementor.elementor .jsx-hdr-cta {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	min-height: 44px;
	margin-inline-start: 10px;
	padding: 0 20px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 16px;
	font-weight: 500;
	line-height: 1.2;
	white-space: nowrap;
	text-decoration: none;
	transition: background-color 160ms ease, border-color 160ms ease;
}

/*
 * Hover follows the §29 rule the nav links already obey: the two blues invert
 * against each other, so on the DARK header the hover goes to the light blue
 * with dark ink, and only the white states hover to violet.
 *
 * QA 2026-10-03 measured why. Behind the button the scrimmed heroes sit at
 * #4B4B5C–#646471. Violet (#4600A8) there is 1.3–2.0:1 and only 1.48:1 against
 * the rest state -- hovering made the button recede. Light blue is 3.1–4.4:1
 * against those heroes, 4.1:1 against the rest state, and carries its ink at
 * 8.7:1. Violet stays for the white states, where it is 11.5:1.
 */
.elementor.elementor .jsx-hdr-cta:hover,
.elementor.elementor .jsx-hdr-cta:focus-visible {
	background-color: var( --dp-light-blue );
	border-color: var( --dp-light-blue );
	color: var( --dp-text-on-light );
	text-decoration: none;
}

body.dp-light-header .elementor.elementor .jsx-hdr-cta:hover,
body.dp-light-header .elementor.elementor .jsx-hdr-cta:focus-visible,
body.dp-search-open .elementor.elementor .jsx-hdr-cta:hover,
body.dp-search-open .elementor.elementor .jsx-hdr-cta:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
	color: var( --dp-white );
}

/*
 * The open compact menu recolours every `a` in it with
 * `.jsx-header-inner.is-compact.is-open :is( a, p, span )` (0,3,1), which beats
 * the rules above and would put dark ink on the blue. Restated here to outrank
 * it; this is a white surface, so it takes the violet hover.
 */
.elementor.elementor .jsx-header-inner.is-compact.is-open .jsx-hdr-cta {
	color: var( --dp-white );
}
.elementor.elementor .jsx-header-inner.is-compact.is-open .jsx-hdr-cta:hover,
.elementor.elementor .jsx-header-inner.is-compact.is-open .jsx-hdr-cta:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
	color: var( --dp-white );
}

/*
 * The menu gap stays at the design's 15px side padding (36px label to label).
 * Adding the button alone would have pushed the bar to ~1220px and dropped a
 * 1280 laptop to the hamburger, but the social icons came out of the header in
 * the same change and freed ~130px: the bar now needs 1081px, so the full nav
 * holds down to ~1100 without tightening anything. If icons ever come back,
 * this is the value to revisit -- the JS measures the bar in its expanded state,
 * so the hamburger threshold follows it.
 */


/*
 * In the open compact menu the links are full-width rows with a rule under
 * each. The button keeps its shape instead: a full-width button below the
 * list, not a seventh row. The row rule (`> :nth-child(2) > *`) strips padding
 * and adds a bottom border, so both are put back.
 */
.elementor.elementor .jsx-header-inner.is-compact.is-open > :nth-child( 2 ) > .jsx-hdr-cta {
	width: 100%;
	min-height: 52px;
	margin: 24px 0 0;
	padding: 0 24px;
	border: 1px solid var( --dp-blue );
	font-size: 18px;
}

/* ------------------------------------------ 30. Footer link hover colour */

/*
 * Same treatment as the header nav (§29): no bar, just a colour change.
 *
 * The bar here was Elementor Pro's nav-menu "pointer", which defaults to
 * underline — there was no setting to change, only a default to override. It
 * is now `pointer: none` on all three footer menus, so the ::before/::after
 * bars are not emitted at all.
 *
 * The footer is black, so hover goes to the light blue. The deep brand blue
 * the pointer used (#2000F7) measures 1.3:1 against it.
 */
/*
 * Footer links match the footer's own body copy, at every width.
 *
 * They are Elementor Nav Menu widgets, so the size came from a widget
 * typography setting rather than a jsx- class — 20px, while every other line
 * down there (address, privacy note, copyright) is `.jsx-body-small` at 14px.
 * That read as a second, louder hierarchy in the one part of the page that
 * should be quiet.
 *
 * This was mobile-only until now, on the grounds that 20px is what the approved
 * 1440 design specifies and unifying it was a design call rather than a defect.
 * Jun has since made that call, so it applies everywhere.
 *
 * The block padding is not decoration: at 14px with a 1.6 line-height the link
 * box is ~22px tall, under the 24x24 CSS px floor WCAG 2.2 sets for Target Size
 * (Minimum, 2.5.8). 6px top and bottom takes it to ~34px.
 */
/*
 * FONT SIZE AND LINE HEIGHT ARE NOT SET HERE ANY MORE.
 *
 * They live on each nav-menu widget's own `menu_typography` group, with an
 * explicit value at every active breakpoint (desktop / laptop 1366 /
 * tablet_extra 1200 / tablet 1024 / mobile 767), so the sizes are editable in
 * Elementor instead of being buried in this file. That control's selector is
 * `{{WRAPPER}} .elementor-nav-menu .elementor-item` — the same element this
 * rule targets, so anything typographic added back here would silently
 * override the editor and the two would drift.
 *
 * What stays is the hit area, which is not typography: at 14/1.6 the link box
 * is ~22px tall, under the 24x24 CSS px floor WCAG 2.2 sets for Target Size
 * (Minimum, 2.5.8). 6px top and bottom takes it to ~34px.
 */
/*
 * EVERY STATE gets the same padding, which is what stops the links moving.
 *
 * This rule used to name only `.elementor-item` and `:focus`. On hover
 * something else won and the padding changed, so the link box resized and
 * everything below it shifted — the movement Jun kept reporting. Listing the
 * states explicitly pins the box: hover, focus, keyboard focus, SmartMenus'
 * `.highlighted` and the current-page item all measure the same.
 *
 * Only `transition: color` is animated. Nothing here may ever animate or vary
 * a box property, or the shift comes straight back.
 */
.elementor-location-footer .elementor-nav-menu .elementor-item,
.elementor-location-footer .elementor-nav-menu .elementor-item:hover,
.elementor-location-footer .elementor-nav-menu .elementor-item:focus,
.elementor-location-footer .elementor-nav-menu .elementor-item:focus-visible,
.elementor-location-footer .elementor-nav-menu .elementor-item:active,
.elementor-location-footer .elementor-nav-menu .elementor-item.highlighted,
.elementor-location-footer .elementor-nav-menu .elementor-item.elementor-item-active {
	padding-block: 6px;
	transition: color 140ms ease;
	/*
	 * The link box must never be able to change height.
	 *
	 * A footer link was caught at 48px and settling to 34px, which shunted
	 * every link below it up by 14px — 48 is this box with TWO text lines in
	 * it (6 + 22.4 + 22.4 + 6). Whatever briefly made a label wrap, it cannot
	 * now: one line, one height, nothing below it can move.
	 */
	white-space: nowrap;
}

/*
 * COLOUR IS NOT SET HERE EITHER. The three nav-menu widgets carry
 * `color_menu_item` #FFFFFF, `color_menu_item_hover` #4600FF and
 * `color_menu_item_active` #FFFFFF. The active colour has to be set explicitly
 * because Elementor's hover selector also matches `.elementor-item-active`,
 * so leaving it blank would make the current page permanently blue instead of
 * removing the active state.
 */

/* Elementor draws the pointer with these; belt and braces if a menu is added
   later without the setting */
.elementor-location-footer .elementor-nav-menu .elementor-item::before,
.elementor-location-footer .elementor-nav-menu .elementor-item::after {
	content: none;
}

/* ------------------------------- 31. Header scroll behaviour (Wix parity) */

/*
 * Ported from the approved Wix prototype. Its header sits in a pinned layer
 * (`position: fixed; top: 0`) and on scroll applies:
 *
 *   --scrolled-transform: translateY(-100%);
 *   --transition-property: transform;
 *   --transition-duration: 0.3s;
 *   --transition-timing-function: linear;
 *
 * i.e. slide up out of view on the way down, slide back on the way up. Those
 * exact values are reproduced here.
 */
/* .elementor prefix: the element's own class sets position:absolute at (0,2,0) */
.elementor.elementor .jsx-header {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	transition: transform 0.3s linear, background-color 0.3s linear;
	will-change: transform;
}

body.dp-header-hidden .elementor.elementor .jsx-header {
	transform: translateY(-100%);
}

/*
 * NOT in the prototype, and needed here: our header is transparent with white
 * text because it was designed to sit over the hero. Revealed part-way down
 * the page it would land on the white Financial Highlights / Latest News
 * sections and disappear, so it takes a ground once away from the hero.
 *
 * A gradient rather than a flat fill: a solid rgba(11,6,24,.92) read as a hard
 * dark slab. This keeps enough density behind the nav (white on it measures
 * 7.9:1 at worst, over a white section) and fades out at the lower edge so
 * there is no hard line across the page.
 *
 * No backdrop-filter — that makes the header a containing block for
 * position:fixed descendants and would trap the search overlay.
 */
body.dp-header-solid .elementor.elementor .jsx-header {
	background-image: linear-gradient(
		to bottom,
		rgba(11, 6, 24, 0.88) 0%,
		rgba(11, 6, 24, 0.74) 60%,
		rgba(11, 6, 24, 0.40) 100%
	);
}

/*
 * ...except the fade above stops at 0.40 AT the header's own bottom edge, so it
 * drops 40% to nothing in one pixel — a visible line straight across the page.
 *
 * The rest of the fade happens BELOW the header, in a tail of its own. Doing it
 * this way rather than simply ending the gradient at 0 keeps the ground behind
 * the nav: run to transparent inside an 88px bar and the links at its foot lose
 * their contrast over a bright hero.
 *
 * Positioned against the header, which is already `position: fixed`, so the
 * tail travels with it — including while it slides away on scroll down.
 */
body.dp-header-solid .elementor.elementor .jsx-header::after {
	content: "";
	position: absolute;
	inset-block-start: 100%;
	inset-inline: 0;
	height: 56px;
	background-image: linear-gradient(
		to bottom,
		rgba(11, 6, 24, 0.40) 0%,
		rgba(11, 6, 24, 0.22) 38%,
		rgba(11, 6, 24, 0.08) 68%,
		rgba(11, 6, 24, 0) 100%
	);
	/* it sits over the page, so it must never intercept a click */
	pointer-events: none;
}

/*
 * The white states have a shadow instead — a tail under a white bar would read
 * as a grey smear. Both need naming: .dp-light-header is more specific than the
 * rule above, but .dp-search-open is not, and the search panel turns the header
 * white at any scroll position.
 */
body.dp-light-header.dp-header-solid .elementor.elementor .jsx-header::after,
body.dp-search-open .elementor.elementor .jsx-header::after {
	display: none;
}

/*
 * ...and not where a sticky bar already butts against the header.
 *
 * On Corporate Governance the anchor nav sticks flush to the header's bottom
 * edge, so the tail — a child of the header, and the header is z-index 20
 * against the nav's 19 — painted its full 56px of dark straight across that
 * white bar. Giving the tail a negative z-index does not help: the header is a
 * stacking context, so the whole of it still sits above the nav.
 *
 * Nothing is lost by dropping it here. The tail exists to soften the header
 * against free-flowing content; against an opaque bar of its own there is no
 * cut to soften, and the nav already carries a hairline.
 */
body:has( .jsx-cg-nav ) .elementor.elementor .jsx-header::after {
	display: none;
}

/* the light-header pages are already solid, so leave their colour alone */
body.dp-light-header.dp-header-solid .elementor.elementor .jsx-header {
	background-image: none;
	background-color: #fff;
	/* same value as the at-rest state: this rule is more specific and would
	   otherwise drop back to a bare hairline the moment the page scrolls */
	box-shadow: var( --jsx-header-shadow );
}

/*
 * The search panel turns the header white and swaps in the dark wordmark. That
 * has to beat the scrolled ground above — same specificity, and §31 comes
 * later, so without this the header stayed dark while its logo and nav had
 * already gone dark: an invisible logo on a dark bar.
 */
body.dp-search-open .elementor.elementor .jsx-header,
body.dp-search-open.dp-header-solid .elementor.elementor .jsx-header {
	background-image: none;
	background-color: #fff;
	/*
	 * Keeps the shadow rather than clearing it. The search panel is a white
	 * sheet directly under a now-white header, which is exactly the case the
	 * shadow exists for; `none` here used to be about suppressing the scrolled
	 * HAIRLINE, and it would now make the header edge vanish the moment search
	 * opens — visible as an inconsistency, since every other white-header state
	 * has it.
	 */
	box-shadow: var( --jsx-header-shadow );
}

/* the search toggle lives in the header — it must never be out of reach */
body.dp-search-open .elementor.elementor .jsx-header { transform: none; }

/*
 * Logged in, the admin bar occupies the top of the viewport, and a fixed
 * header at top:0 renders underneath it.
 */
body.admin-bar .elementor.elementor .jsx-header { top: 32px; }
body.admin-bar .jsx-search { top: 32px; }

@media screen and (max-width: 782px) {
	body.admin-bar .elementor.elementor .jsx-header { top: 46px; }
	body.admin-bar .jsx-search { top: 46px; }
}

/*
 * Below 600 WordPress switches the admin bar to position:absolute so it
 * scrolls away; holding an offset there would leave a permanent 46px gap.
 * It only overlaps at the very top of the page, which is WordPress' own
 * behaviour for fixed elements.
 */
@media screen and (max-width: 600px) {
	body.admin-bar .elementor.elementor .jsx-header { top: 0; }
	body.admin-bar .jsx-search { top: 0; }

	/*
	 * ...but WordPress still sets `html { margin-top: 46px }`, so the whole
	 * document is pushed down 46px while the fixed header stays at 0. A
	 * logged-in editor therefore saw 46px MORE space above the article title
	 * than the site actually ships — 70px instead of 24px — and read it as a
	 * spacing bug in the design.
	 *
	 * Giving that 46px back here makes the editing view match what a visitor
	 * gets. It cannot affect the live page: `body.admin-bar` only exists for a
	 * logged-in user. 112 - 46 = 66.
	 */
	body.admin-bar .elementor.elementor .jsx-ar-titleblock { padding-block-start: 66px; }
}

@media (prefers-reduced-motion: reduce) {
	.elementor.elementor .jsx-header { transition: none; }
}

/* --------------------------------------- 32. Entrance motion (Wix parity) */

/*
 * Easing taken from the prototype's own CSS:
 *
 *   motion-slideIn  cubic-bezier(0.645, 0.045, 0.355, 1)
 *   motion-fadeIn   cubic-bezier(0.445, 0.05, 0.55, 0.95)
 *
 * Its durations were 1000ms / 1200ms. Cut to roughly a third here across two
 * passes on Jun's call — at full length, with the per-element stagger on top,
 * content was still arriving long after the reader got there. Both live in the
 * variables below: change them in one place, the stagger step is in motion.js.
 * Much below ~300ms a rise stops reading as motion and starts to flicker.
 *
 * The prototype's slideIn also carries a clip-path wipe. That is NOT copied:
 * several targets here own content that deliberately overflows them — the
 * routing rows hold a 523px hover preview, the cards have shadows — and any
 * clip would cut it. Rise + fade gives the same read without that risk.
 *
 * The rise is 28px rather than the prototype's 100% of the element's own
 * height, which is sensible on a small text block and absurd on a 1200px one.
 *
 * The start state is gated on html.dp-motion, which is set by an inline script
 * in the head. If the script or motion.js never runs, nothing is hidden.
 */
:root {
	--jsx-reveal-rise: 320ms;
	--jsx-reveal-fade: 400ms;
}

.dp-motion .jsx-reveal {
	opacity: 0;
	transform: translateY(20px);
	transition:
		opacity var(--jsx-reveal-fade) cubic-bezier(0.445, 0.05, 0.55, 0.95) var(--jsx-reveal-delay, 0ms),
		transform var(--jsx-reveal-rise) cubic-bezier(0.645, 0.045, 0.355, 1) var(--jsx-reveal-delay, 0ms);
	will-change: opacity, transform;
}

.dp-motion .jsx-reveal.is-revealed {
	opacity: 1;
	transform: none;
	will-change: auto;
}

/*
 * Smooth scrolling for in-page jumps. scroll-padding keeps an anchored target
 * clear of the fixed header instead of landing underneath it.
 */
@media (prefers-reduced-motion: no-preference) {
	html { scroll-behavior: smooth; }
}

html { scroll-padding-top: 110px; }
body.admin-bar { scroll-padding-top: 142px; }

@media (prefers-reduced-motion: reduce) {
	.dp-motion .jsx-reveal {
		opacity: 1;
		transform: none;
		transition: none;
	}
}

/* ---------------------------- 33. Masked headings, line by line */

/*
 * The hero h1 and every section h2 are rebuilt by motion.js into one mask per
 * line — .jsx-line clips, .jsx-line__i rides up inside it — so each line can be
 * revealed on its own. Elementor's saved content is never touched; this is
 * display-time only, and if the script never runs the headings render exactly as
 * they did before.
 *
 * Lines are broken only on marks the author put there: a newline in the text
 * (the hero, which Elementor renders with `white-space: pre-line`) or a <br>
 * (the careers heading). A heading that merely WRAPS is left as one mask, because
 * splitting on where text happens to wrap would freeze that wrap and stop the
 * heading reflowing at another width. A single-line heading still gets a mask; it
 * just wipes as one.
 *
 * `.jsx-lines` marks a rebuilt heading and switches it to `white-space: normal`:
 * the newlines are gone, the breaks are structural now, and normal collapsing
 * stops the whitespace between the blocks rendering as an extra empty line.
 *
 * These take the prototype's clip wipe where §32's other targets do not — a
 * heading line owns no overflowing content, so §32's reason for skipping the
 * wipe does not apply.
 *
 * -- the guard --
 *
 * `overflow: hidden` clips to the line box, and both headings set a line-height
 * TIGHTER than the font's own ascent + descent, so the line box is shorter than
 * the glyphs it carries. Measured on the live page with owners-wide loaded:
 *
 *            line-height   font content box   ink headroom top / bottom
 *   h1 hero     1.08em          1.3269em           0.115em / 0.048em
 *   h2 section  1.15em          1.3333em           0.181em / 0.075em
 *
 * Nothing is actually cut at those values, but the bottom is thin enough that
 * deeper descenders in new copy, or a fallback font if the webfont fails to load,
 * would start shaving glyph tails with no warning. So the mask is padded out past
 * the glyphs and then put back exactly where it was.
 *
 * A bigger guard is always safe — padding only ever ADDS visible area, and the
 * start-state transform below is expressed in terms of it, so nothing can peek
 * whatever it is set to. The guard is sized to the tighter of the two headings.
 *
 * -- why two mechanisms and not one --
 *
 *   margin-bottom: -(top + bottom)   takes the padding back OUT OF FLOW
 *   position: relative; top: -top    puts the mask back visually
 *
 * The obvious version — pad both ends, negative-margin both ends — is wrong.
 * Adjacent siblings' vertical margins COLLAPSE to the single most negative value
 * rather than summing, so each gap gave back only the bottom guard and the line
 * spacing grew by the top guard (measured: 56.2px -> 60.3px). One margin per line
 * plus a relative offset avoids collapsing entirely, because `top` never touches
 * flow. `flow-root` on the heading then keeps the last line's negative bottom
 * margin from collapsing out through it and pulling the next section up.
 *
 * Check any change here by asserting that the gap between inner line tops equals
 * the computed line-height, and that the heading's height equals line-height
 * times line count.
 */
:root {
	--jsx-line-guard-top: 0.08em;
	--jsx-line-guard-bottom: 0.10em;
	--jsx-line-rise: 420ms;
}

/*
 * The marker is `jsx-lines`, not the more obvious `jsx-split`: that name is
 * already taken by a layout class on four `e-grid-base` containers in the page,
 * and a bare `.jsx-split { display: flow-root }` silently overrode their
 * `display: grid`. Check the served markup before choosing any new jsx- name.
 */
.jsx-lines {
	white-space: normal;
	display: flow-root;
}

/* Elementor writes `white-space: pre-line` onto the hero heading from its own
   local stylesheet at equal specificity, so that one has to be beaten outright. */
.jsx-display-hero.jsx-lines {
	white-space: normal;
}

/*
 * `color: inherit` is load-bearing: §5 paints `.jsx-display-hero span` and
 * `.jsx-display-section span` in the accent colour to pick out the accented word,
 * and those selectors (0,1,1) catch these wrappers too — every line would take
 * the accent. This wins at (0,2,0), while the real accent span, which has no
 * .jsx-line, keeps it.
 */
.jsx-lines .jsx-line,
.jsx-lines .jsx-line__i {
	display: block;
	color: inherit;
}

.jsx-lines .jsx-line {
	overflow: hidden;
	padding-top: var(--jsx-line-guard-top);
	padding-bottom: var(--jsx-line-guard-bottom);
	margin-bottom: calc( ( var(--jsx-line-guard-top) + var(--jsx-line-guard-bottom) ) * -1 );
	position: relative;
	top: calc( var(--jsx-line-guard-top) * -1 );
}

/*
 * Start below the mask. The travel is 100% of the line plus the bottom guard,
 * because the guard is part of the visible (clipped) area — at a flat 100% the
 * very top of the glyphs would sit in the padding band and peek out before the
 * animation starts. Transform only, no fade: against a clip wipe a crossfade
 * reads as mud rather than motion.
 */
.dp-motion .jsx-lines .jsx-line__i {
	transform: translateY( calc( 100% + var(--jsx-line-guard-bottom) ) );
	transition: transform var(--jsx-line-rise)
		cubic-bezier(0.645, 0.045, 0.355, 1) var(--jsx-reveal-delay, 0ms);
	will-change: transform;
}

.dp-motion .jsx-lines .jsx-line.is-revealed .jsx-line__i {
	transform: none;
	will-change: auto;
}

@media (prefers-reduced-motion: reduce) {
	.dp-motion .jsx-lines .jsx-line__i {
		transform: none;
		transition: none;
	}
}

/* ------------------------------- 34. Mobile: section rhythm and the tab strip */

/*
 * Page 14405 carries almost no mobile variants of its own — every container
 * inherits its 1440 desktop values all the way down. Two of those are vertical
 * gaps big enough to read as broken at 375px:
 *
 *   .e-39f1e917-23cf   "We Are DigiPlus"      gap 81px
 *   .e-e999a55-db75    Investor Relations     gap 108px
 *
 * (The third, .e-6613e964-ac92 at 110px, is one of the .jsx-split grids and is
 * already capped to 44px by §11 below 1200.)
 *
 * These are Elementor local class ids, stored in the page's saved data, so they
 * are stable — but they belong to specific elements. If a section is rebuilt in
 * the editor its id changes and the rule silently stops applying, so re-check
 * this list whenever one of those two sections is reworked. The long-term home
 * for these values is a mobile variant on the element itself.
 */
@media (max-width: 767px) {
	/* .e-39f1e917-23cf and .e-e999a55-db75 (S2 columns) moved 2026-10-09 to the elements' own mobile
	   variants, so the gaps travel with the exported template. */

	/*
	 * The routing rows are the worst of it, and it is not the container gap:
	 * the block carries `margin-block-start: 140px` and every row is padded
	 * 42px top AND bottom, so four rows spend 336px on padding alone. Targeted
	 * through the jsx- class rather than the four local ids, which keeps working
	 * if a row is rebuilt.
	 */
	/*
	 * The .jsx-split grids carry their own inline padding from the 1440 design
	 * (24px on the Integrated Report one), which lands ON TOP of the container's
	 * 20px gutter and pushes the card to 44px. At this width the gutter is the
	 * whole budget, so the grids give theirs up.
	 */
	.elementor.elementor .jsx-split { padding-inline: 0; }

	.elementor.elementor .jsx-routing-rows { margin-block-start: 56px; }
	.elementor.elementor .jsx-routing-rows > :nth-child(-n + 4 of .e-con) {
		padding-block-start: 24px;
		padding-block-end: 24px;
	}
}

/*
 * The Latest News filter strip is six pills on one nowrap row. Below 768 that
 * is wider than the screen, so it was simply cut off at the right edge with no
 * sign that anything was missing.
 *
 * It scrolls horizontally instead of wrapping: wrapping six pills makes a
 * two-row block that pushes the articles down and reads like navigation rather
 * than a filter. Scroll snapping is left off — these are labels of very
 * different widths and snapping fights the thumb.
 *
 * The strip scrolls INSIDE its container, with no bleed past the page gutter.
 * A `margin-inline: -20px` bleed to the screen edges looks better, but the
 * strip is then wider than its container and nothing upstream clips it, so the
 * whole PAGE gains 40px of horizontal overflow — a sideways scroll of the
 * entire layout, which is exactly what this rule set out to stop.
 */
@media (max-width: 767px) {
	.elementor.elementor .jsx-news-tabs {
		flex-wrap: nowrap;
		overflow-x: auto;
		overscroll-behavior-x: contain;
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none;
		/*
		 * These two are what actually make the scroll work, and only measuring
		 * found them. Elementor gives the strip `flex-shrink: 0`, so it held its
		 * full 651px min-content width inside a correctly-sized 335px parent and
		 * `overflow-x` never got anything to clip — the row just ran off the
		 * screen and took the page's horizontal scroll with it. `min-width: 0`
		 * alone does nothing while shrink is 0; both are required.
		 */
		flex-shrink: 1;
		min-width: 0;
	}

	.elementor.elementor .jsx-news-tabs::-webkit-scrollbar { display: none; }

	/* the row's own pill padding would otherwise push the first label off the gutter */
	.elementor.elementor .jsx-news-tabs > span:first-child { padding-left: 0; }
	.elementor.elementor .jsx-news-tabs > span:last-child { padding-right: 0; }
}

/* ------------------- 35. Mobile: section rhythm below the hero, footer type */

/*
 * Every section below the hero gives up 40% of its top and bottom padding at
 * this width. The values are the 1440 design's, inherited wholesale because the
 * page has no mobile variants (see §34), and at 375px they read as dead space
 * rather than rhythm. Measured on the live page, then multiplied by 0.6:
 *
 *   Financial Highlights  .e-5624be61-4971   96 / 76   ->  58 / 46
 *   Latest News           .e-1a7fc17b-5083   32 / 71   ->  19 / 43
 *   Integrated Report     .e-73dc8265-bdc8  170 / 180  -> 102 / 108
 *   Careers               .jsx-careers        0 / 72   ->   0 / 43
 *
 * "We Are DigiPlus" and "Our Products" are not listed because they carry no
 * section padding at all — their spacing is internal gaps, already cut in §34.
 *
 * These are Elementor local class ids and belong to specific elements; if a
 * section is rebuilt in the editor its id changes and its rule quietly stops
 * applying. Re-measure rather than trusting this list after any such rebuild.
 */
@media (max-width: 767px) {
	.elementor .e-5624be61-4971 { padding-block-start: 58px; padding-block-end: 46px; }
	.elementor .e-1a7fc17b-5083,
	.elementor .jsx-news-body { padding-block-start: 19px; padding-block-end: 43px; }
	.elementor .e-73dc8265-bdc8 { padding-block-start: 102px; padding-block-end: 108px; }
	.elementor.elementor .jsx-careers { padding-block-end: 43px; }
}

/*
 * Footer menu links sat at 20px while every other line in the footer — address,
 * privacy note, copyright — is .jsx-body-small at 14px, so the links read as a
 * second, louder hierarchy. They are Elementor Nav Menu widgets, so the size is
 * a widget typography setting rather than a jsx- class, which is why nothing in
 * this file was holding it.
 *
 * The block padding is not decoration: at 14px with a 1.6 line-height the link
 * box is ~22px tall, under the 24x24 CSS px floor WCAG 2.2 sets for Target Size
 * (Minimum, 2.5.8). 6px top and bottom takes it to ~34px.
 *
 * Scoped to mobile deliberately. Desktop keeps 20px, which is what the approved
 * 1440 design specifies; unifying it up there is a design decision, not a fix.
 */
@media (max-width: 767px) {
	/* ---------------------------------------------------------------
	 * Mobile footer layout, to the approved mockup.
	 *
	 * Three differences from desktop, none of which Elementor can express on
	 * its own — `order` and `display: contents` have no controls, and the
	 * label/address pairing needs the column gap cancelled per widget:
	 *
	 *   1. one link per row, not two wrapping across the column
	 *   2. the link groups read main-nav first, legal last
	 *   3. each label sits directly on top of the lines it introduces
	 *
	 * `.elementor.elementor-location-footer` is doubled up deliberately: the
	 * atomic widgets carry no `.elementor-element` class, so their styles land
	 * as `.elementor .e-xxxx` (two classes). Matching that specificity exactly
	 * would leave the winner down to file order; three classes settles it.
	 * --------------------------------------------------------------- */

	/* The grid stops spacing the rows; each block states its own gap below. */
	.elementor.elementor-location-footer .e-5c2c1898-fdfb { row-gap: 0; }
	.elementor.elementor-location-footer .e-1111c67e-2e89 { margin-block-end: 40px; }
	.elementor.elementor-location-footer .e-4cc7305c-5684 { margin-block-end: 40px; }

	/*
	 * The two menu wrappers dissolve so their menus become grid rows in their
	 * own right — the only way to interleave menus from different parents.
	 */
	.elementor.elementor-location-footer .e-77536807-8d7d,
	.elementor.elementor-location-footer .e-dee4a74-513e { display: contents; }

	.elementor-location-footer .elementor-element-3ac5cb01 { order: 1; }
	.elementor-location-footer .elementor-element-1c6118e9 { order: 2; }
	.elementor-location-footer .elementor-element-72ab5452 {
		order: 3;
		/* the one deliberate break: legal links sit apart from the nav links */
		margin-block-start: 34px;
	}

	/* One link per row. */
	.elementor-location-footer .elementor-nav-menu {
		flex-direction: column;
		column-gap: 0;
		row-gap: 6px;
	}

	/*
	 * A label and the lines under it read as one block: the 26px column gap is
	 * cancelled so they sit a line apart, not a paragraph apart.
	 */
	.elementor.elementor-location-footer .e-ftrhqh-st,
	.elementor.elementor-location-footer .e-ftrsth-st,
	.elementor.elementor-location-footer .e-ftrnh-st,
	.elementor.elementor-location-footer .e-ftrsh-st { margin-block-end: -26px; }

	/* The mockup spaces the social icons noticeably wider than desktop. */
	.elementor.elementor-location-footer .e-1215c1b5-417f { gap: 40px; }

	/*
	 * Same every-state list as above: pinned, so the inline padding cannot
	 * change under the cursor here either.
	 */
	.elementor-location-footer .elementor-nav-menu .elementor-item,
	.elementor-location-footer .elementor-nav-menu .elementor-item:hover,
	.elementor-location-footer .elementor-nav-menu .elementor-item:focus,
	.elementor-location-footer .elementor-nav-menu .elementor-item:focus-visible,
	.elementor-location-footer .elementor-nav-menu .elementor-item:active,
	.elementor-location-footer .elementor-nav-menu .elementor-item.highlighted,
	.elementor-location-footer .elementor-nav-menu .elementor-item.elementor-item-active {
		/*
		 * The item box already starts on the 20px gutter; its own 20px of inline
		 * padding was pushing the TEXT to 40px, so the menus read as indented
		 * against the address above them. The space between items moves to the
		 * list's column-gap, which leaves the first label on the gutter and keeps
		 * the spacing even.
		 */
		padding-inline: 0;
	}

	.elementor-location-footer .elementor-nav-menu {
		column-gap: 28px;
		row-gap: 2px;
	}
}

/* ------------------------------- 36. Products carousel (mobile) */

/*
 * Two consumers: the homepage's `.jsx-product-cards` and Our Brand's
 * `.jsx-ob-prodgrid` (§69). Same three cards, same behaviour -- extended here
 * rather than copied so there is one carousel on the site, not two that drift.
 */

/*
 * Below 768 the three product cards become a swipeable carousel instead of a
 * tall stack. This is a native CSS scroll-snap carousel, not a script: touch
 * swipe, trackpad, keyboard and a screen reader's own scrolling all work
 * without us handling a single event, and with CSS disabled it degrades to the
 * stack it is today rather than to nothing.
 *
 * The container is already `display: grid`, so it stays grid — switching to
 * `grid-auto-flow: column` turns the rows into a single track. `grid-template-
 * columns: none` is required to clear the desktop `repeat(3, 1fr)`; without it
 * the auto-flow has nothing to do and the cards keep the three fixed columns.
 *
 * `flex-shrink: 1` and `min-width: 0` are not decoration. The carousel is
 * itself a flex item and Elementor sets `flex-shrink: 0` on its containers, so
 * without both it holds its full min-content width, `overflow-x` has nothing to
 * clip, and the whole PAGE scrolls sideways instead of the carousel. Same trap
 * as the news tab strip in §34.
 *
 * Cards are 84% wide so the next one peeks: an edge-aligned card gives a
 * carousel no affordance, and people do not swipe what does not look swipeable.
 * There is no negative-margin bleed to the screen edges — that reintroduces the
 * page-level overflow this is written to avoid.
 */
@media (max-width: 767px) {
	.elementor.elementor .jsx-product-cards,
	.elementor.elementor .jsx-ob-prodgrid {
		display: grid;
		grid-auto-flow: column;
		grid-template-columns: none;
		grid-auto-columns: 84%;
		gap: 16px;

		overflow-x: auto;
		overscroll-behavior-x: contain;
		-webkit-overflow-scrolling: touch;
		scroll-snap-type: x mandatory;
		scrollbar-width: none;

		flex-shrink: 1;
		min-width: 0;
	}

	.elementor.elementor .jsx-product-cards::-webkit-scrollbar,
	.elementor.elementor .jsx-ob-prodgrid::-webkit-scrollbar { display: none; }

	.elementor.elementor .jsx-product-cards > *,
	.elementor.elementor .jsx-ob-prodgrid > * {
		scroll-snap-align: start;
		min-width: 0;
	}

	/*
	 * Snapping is disabled for anyone who has asked for less motion: a mandatory
	 * snap animates the viewport out from under the user's finger, which is the
	 * kind of movement that setting exists to stop. The carousel still scrolls,
	 * it just no longer pulls.
	 */
	@media (prefers-reduced-motion: reduce) {
		.elementor.elementor .jsx-product-cards,
		.elementor.elementor .jsx-ob-prodgrid { scroll-snap-type: none; }
	}
}

/* ------------------- 37. Mobile: the inner band padding §35 did not reach */

/*
 * §35 cut the padding on the SECTION elements. These four bands are padded on
 * the `.jsx-container` INSIDE the section instead, so they were untouched and
 * stayed at their 1440 values — which is why the space above "We Are DigiPlus",
 * below "Responsible Gaming", and around "Our Products" still read as dead
 * space after that pass. Measured live, then multiplied by 0.6:
 *
 *   We Are DigiPlus   .e-6cef349b-11e7   130 / 120  ->  78 / 72
 *   Our Products      .e-436d621f-d1ed   120 /  63  ->  72 / 38
 *   "Our Products" h2 margin-bottom       76         ->  46
 *   Integrated Report .e-73dc8265-bdc8   102 / 108  ->  61 / 65   (a second pass)
 *
 * The Integrated Report band is the one §35 already cut once; it is taken down
 * again here because it was still the tallest gap on the page. Its bottom goes
 * with its top so the band stays symmetrical.
 *
 * When a band looks too tall, measure where the padding actually sits before
 * writing a rule: on this page it is as likely to be on the inner container, on
 * a heading's own margin, or on a flex gap as on the section itself.
 */
@media (max-width: 767px) {
	/* .e-6cef349b-11e7 (S2 inner, 78 / 72) and .e-4aca7f6e-bcf4 ("Our Products" h2, 46) moved 2026-10-09
	   to the elements' own mobile variants, so they travel with the exported template. */
	/* .e-436d621f-d1ed (products grid) dropped 2026-10-09: it is inside the S2 band now and spaced by
	   its own margin; padding here would double the gap. */
	.elementor .e-73dc8265-bdc8 { padding-block-start: 61px; padding-block-end: 65px; }
}

/* ------------------- 38. Integrated Report poster, once it is in the card */

/*
 * custom.js moves the poster inside the violet card below 768 (it is a grid
 * column beside the card in the design, which strands it under the copy once
 * the grid stacks). In there it is no longer a grid item, so the design's
 * `width: 415px` and `justify-self: center` stop making sense — the first
 * overflows the card's content box, the second is a grid property and simply
 * does nothing in a flex column.
 *
 * Scoped to the poster AS A CHILD OF THE CARD, so the desktop rule is untouched
 * and nothing here applies until the script has actually moved it.
 */
@media (max-width: 767px) {
	/*
	 * The card keeps the 1440 design's 48px / 44px inline padding, which on a
	 * 335px card leaves only 243px of content — the poster and the copy both end
	 * up squeezed into the middle third of the screen. 24px a side gives back
	 * 44px of width and squares up the asymmetry, which only existed to balance
	 * the card against the poster column that is no longer beside it.
	 */
	.elementor .e-5985bec0-14d3 {
		padding-inline-start: 24px;
		padding-inline-end: 24px;
	}

	.elementor .e-5985bec0-14d3 > .e-2054c383-80d5 {
		width: 100%;
		max-width: none;
		align-self: stretch;
		/* the design's 70px drop shadow was for a poster floating over the city
		   photograph; against the card's own violet it only muddies the edge */
		box-shadow: none;
	}
}

/* --------- 39. One section band from tablet portrait up (>=768) */

/*
 * From 768 up, every section below the hero gets the same 80px band top and
 * bottom. The 1440 design never had a system here — measured at 1366 the bands
 * ran 32-180px top and 63-180px bottom, and because what a reader actually sees
 * is the JOIN (previous section's bottom + next section's top), the gaps between
 * sections came out at 95, 130, 196, 216, 241 and 330px. That reads as accident,
 * not rhythm, and the 330px join below the Integrated Report was a hole.
 *
 * 80px makes every join a uniform 160px, down from a 201px average and a 330px
 * worst case — about 400px off the page. One number controls it: change 80 here
 * and the whole page re-spaces.
 *
 * Note which element carries the band — it differs per section. Three are padded
 * on the section itself, two on the `.jsx-container` inside it. Reading the
 * section element alone would have missed half of them (see §37).
 */
@media (min-width: 768px) {
	/* band on the section element */
	.elementor .e-5624be61-4971,
	.elementor .e-1a7fc17b-5083,
	.elementor .e-73dc8265-bdc8,
	/* News & Updates body (page 14518): it had borrowed the homepage Latest News id above, an orphan in the
	   editor ("Some classes are missing"); it has its own class since 2026-10-12 */
	.elementor .jsx-news-body {
		padding-block-start: 80px;
		padding-block-end: 80px;
	}
	/* (2026-10-09: "We Are DigiPlus" + "Our Products" are one S2 band now, Figma 9:35; its inner
	   container .e-6cef349b-11e7 and the products grid .e-436d621f-d1ed take their spacing from their
	   own Elementor styles, 140/80 and a 93px top margin, so they are no longer listed here.
	   2026-10-12: removing them that day also deleted this rule's declaration block by mistake, leaving a
	   selector list with no body, so these bands lost their 80px from 768 up until it was restored.) */
}

/*
 * Careers is deliberately held back to >=1200. Between 768 and 1199 §12 turns
 * the whole section into the violet surface and sets its own 0 / 72px padding so
 * the floating photo panel can be removed; that block and this one have equal
 * specificity, so a plain min-width: 768px rule here would come later in the
 * file and quietly undo it.
 */
@media (min-width: 1200px) {
	.elementor.elementor .jsx-careers {
		padding-block-start: 80px;
		padding-block-end: 80px;
	}
}

/* ------------------------ 40. Hero video control: icon, not a sentence */

/*
 * The control read "Play background video" / "Pause background video" as visible
 * text in a pill. At mobile that pill sits across the hero's verified-sources
 * line, and no amount of repositioning fixes it for good — the label is 20+
 * characters and the hero copy reflows at every width.
 *
 * So the words become the ACCESSIBLE NAME and an icon becomes the visible
 * control. The <p> Elementor renders inside each button is clipped with the
 * same technique as .jsx-sr-only rather than `display: none`, because a hidden
 * element is removed from the accessibility tree and the buttons would announce
 * as nothing at all.
 *
 * The icons are drawn in CSS — a border triangle and two bars — rather than
 * loaded as assets: two shapes are not worth a request, and `currentColor`
 * keeps them in step with the button's own colour on every state.
 *
 * 44px square is deliberate. WCAG 2.2 2.5.8 (Target Size, Minimum) wants 24x24
 * CSS px; 44px is the comfortable touch figure and these sit over a video where
 * a mis-tap is annoying.
 */
.elementor .e-background-video__play,
.elementor .e-background-video__pause {
	width: 44px;
	height: 44px;
	padding: 0;
	position: relative;
}

/* keep the label for assistive tech; take it out of the visual box */
.elementor .e-background-video__play > p,
.elementor .e-background-video__pause > p {
	position: absolute !important;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

/*
 * Centred by `position: absolute; inset: 0; margin: auto` with a fixed size,
 * NOT by the button's flex alignment. The button computes as
 * `display: flex; justify-content: center; align-items: center` — verified —
 * and the pseudo-element still painted in its top-left corner. Rather than keep
 * guessing why the pseudo is not behaving as a flex item here, this centres on
 * the box model alone, which no container display can contradict.
 */
.elementor .e-background-video__play::before,
.elementor .e-background-video__pause::before {
	content: "";
	display: block;
	position: absolute;
	inset: 0;
	margin: auto;
}

/*
 * Both icons are drawn INSIDE a symmetric 16x16 box, and the box is what the
 * flex centring positions. The first version built them out of a border
 * triangle and a bar-plus-box-shadow, each nudged with a margin — but a
 * box-shadow paints outside the element's box, so the flex centring saw a 4px
 * item while the eye saw a 12px pair, and the icon landed ~15px left of centre.
 * Geometry that lies to the layout cannot be corrected with a margin; give the
 * box the icon's real size and the problem disappears.
 */
.elementor .e-background-video__play::before,
.elementor .e-background-video__pause::before {
	width: 16px;
	height: 16px;
	background: currentColor;
}

/* play: a triangle whose centroid sits on the box's centre, so the box being
   centred is also optically centred — no nudge needed */
.elementor .e-background-video__play::before {
	clip-path: polygon(25% 6%, 95% 50%, 25% 94%);
}

/* pause: two bars cut out of the same box, symmetric about its centre */
.elementor .e-background-video__pause::before {
	background:
		linear-gradient(currentColor 0 0) 2px 0 / 4px 100% no-repeat,
		linear-gradient(currentColor 0 0) 10px 0 / 4px 100% no-repeat;
}

/* the pill is now a circle */
.elementor .e-background-video__play,
.elementor .e-background-video__pause {
	border-radius: 50%;
}

.elementor .e-background-video__play:focus-visible,
.elementor .e-background-video__pause:focus-visible {
	outline: 2px solid #fff;
	outline-offset: 2px;
}

/* ----------------- 41. Careers: centre the floating panel on the section */

/*
 * Three symptoms, one cause. The violet panel is absolutely positioned inside
 * the careers section with ASYMMETRIC insets — `top: 150px; bottom: 30px` —
 * while everything else in the section is centred: the photo sits in a grid row
 * with `align-items: center` (and -40px margins so it overhangs), and the copy
 * column is centred in that same row.
 *
 * Measured at 1440, section 4992-5692:
 *
 *   panel   5142 - 5662      photo overhang  110 above, -10 below
 *   copy    5158 - 5526      inside the panel: 16px above, 136px below
 *
 * So the photo looked hung too high, the copy looked jammed against the top of
 * the blue box, and the band under the panel looked wrong — all of it the same
 * 120px of offset.
 *
 * Equal insets fix all three at once, and keep fixing them: whatever height the
 * section takes, `top` and `bottom` being equal centres the panel on the same
 * axis the photo and copy are already centred on. Nothing here is a magic
 * number tuned to today's content — 90px simply preserves the panel's current
 * 520px height at this section height.
 *
 * Scoped to >=1200 because below that §12 removes the floating panel entirely
 * and turns the whole section into the violet surface.
 */
@media (min-width: 1200px) {
	.elementor.elementor .jsx-careers > .e-3876a61f-f68a {
		top: 90px;
		bottom: 90px;
	}
}

/* ------------------- 42. Routing rows: the whole row is the link */

/*
 * Each row is a 335x80 div, but the <a> wraps only the words — measured at
 * mobile, 180x35 inside a 335x80 row — and the arrow sits OUTSIDE the anchor
 * entirely. So the one thing that looks tappable was the one thing that did
 * nothing, and on a phone there is no hover preview to hint that the words are
 * the target.
 *
 * A stretched pseudo-element on the anchor makes the entire row the hit area,
 * arrow included, without touching the markup or duplicating the link (which
 * would put the same destination in the tab order twice). The rows are already
 * `position: relative`, so the overlay has something to size itself against.
 *
 * z-index 1 keeps it above the row's own ::before — that is the hover scrim
 * from §8, which sits at z-index 0 and would otherwise swallow the taps.
 */
.jsx-routing-rows > :nth-child(-n + 4 of .e-con) a::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
}

/* the whole row now responds, so it should look like it does */
.jsx-routing-rows > :nth-child(-n + 4 of .e-con) { cursor: pointer; }

/* --------------------------- 43. Hero disc: keep the quarter circle round */

/*
 * The disc artwork from digiplus.com.ph (bg-ellipse-quater-2835-1-1.png) is a
 * TRUE quarter circle — 1200x1201, centred on its own bottom-left corner with
 * radius 1200 (traced from the alpha: the arc hits x=234 at y=24 and x=1194 at
 * y=1176, which is exactly that circle).
 *
 * Elementor sizes the element 535x470 (300x264 at mobile), so a square source
 * gets squashed to 88% of its height and the "perfect rounded" arc comes out
 * as an ellipse. `aspect-ratio: 1` with `height: auto` makes the box follow the
 * artwork at every breakpoint instead of pinning a second pixel value that
 * would need maintaining alongside Elementor's own.
 *
 * The element is anchored `inset-block-end: 0`, so the extra height grows
 * upward from the hero's bottom edge — the disc's footprint across the hero is
 * unchanged, it simply reaches higher.
 */
.jsx-hero img.e-4a930abd-523e {
	height: auto;
	aspect-ratio: 1;
}

/* ------------------- 44. Mobile menu: full-screen panel, light ground */

/*
 * Follows the live site's mobile menu — full-height panel, logo and close on a
 * top bar, one nav item per row divided by hairlines, socials parked at the
 * bottom — on a light ground rather than black.
 *
 * It reuses the header's existing children rather than adding markup: the four
 * elements Elementor already renders (logo, nav, utilities, and the toggle
 * custom.js injects) are placed into a grid. §10's dropdown rules positioned
 * the nav and utilities absolutely under the bar, so those are reset here.
 */
/*
 * NOT in a media query, deliberately.
 *
 * The hamburger appears when custom.js MEASURES the nav as not fitting, not
 * at a breakpoint — a long nav plus the admin bar collapses the header well
 * above 1024. These rules were wrapped in max-width:1024, so above it the
 * hamburger opened the OLD dark dropdown instead of this panel. Gating on
 * `.is-compact.is-open` is the same condition the script uses, so the panel
 * now follows the hamburger wherever it appears.
 */
/*
 * The PANEL is the header itself, not the inner element.
 *
 * §31 gives `.jsx-header` `will-change: transform` for the hide-on-scroll,
 * and will-change makes an element a containing block for fixed-position
 * descendants. So `position: fixed; inset: 0` on the inner resolved against
 * the header, not the viewport, and the panel came out exactly one header
 * tall. Expanding the header itself sidesteps that entirely — it is already
 * the fixed element — and `will-change: auto` while open stops it being a
 * containing block for anything inside.
 */
.elementor.elementor .jsx-header:has( .jsx-header-inner.is-compact.is-open ) {
	position: fixed;
	inset: 0;
	/* both longhands, not the shorthand: the header's own atomic style sets
	   `background-color: transparent` and a shorthand here was not reliably
	   winning that one property */
	background-color: #fff;
	background-image: none;
	box-shadow: none;
	transform: none;
	will-change: auto;
	z-index: 9000;
	overflow-y: auto;
	overscroll-behavior: contain;
}

.elementor.elementor .jsx-header:has( .jsx-header-inner.is-compact.is-open ) .jsx-container {
	height: 100%;
}

.elementor.elementor .jsx-header-inner.is-compact.is-open {
	height: 100%;
	background-color: #fff;
	display: grid;
	/*
	 * Three columns in the top row, not two: the search icon moved into the bar
	 * (custom.js lifts it out of the social group when the header is compact),
	 * and a grid child with no area of its own auto-places into a NEW implicit
	 * row — which dropped it under the social icons at the foot of the panel.
	 */
	grid-template-columns: 1fr auto auto;
	grid-template-rows: auto 1fr auto;
	grid-template-areas:
		"logo search nav-toggle"
		"nav  nav    nav"
		"util util   util";
	gap: 0;
	/*
	 * Inline padding is 40px, NOT 20 — it has to equal the closed bar's gutter
	 * (section 13: 40px to 1339, 20px below 768) or the logo, search and
	 * hamburger all jump sideways the moment the menu opens. 20px here moved
	 * the logo from x=40 to x=20 at iPad width. The ≤767 override below
	 * follows the bar down to 20.
	 */
	padding: 21px 40px 36px;
	overflow-y: auto;
	overscroll-behavior: contain;
}

/* the page behind must not scroll under the panel */
body:has( .jsx-header-inner.is-compact.is-open ) { overflow: hidden; }

.jsx-header-inner.is-compact.is-open > :nth-child(1) { grid-area: logo; align-self: center; }
.jsx-header-inner.is-compact.is-open .jsx-header-toggle { grid-area: nav-toggle; align-self: center; }

.jsx-header-inner.is-compact.is-open > .jsx-search-toggle {
	grid-area: search;
	align-self: center;
	/* the bar's auto margin is a flex trick; this state is a grid */
	margin-inline-start: 0;
	/*
	 * 26px, so the search icon lands on exactly the pixels it occupies when
	 * closed. The bar's gap is 24px, and the open toggle is 44px wide against
	 * the closed one's 46 (see the grid-template-rows note above) while both
	 * right edges align — so matching the closed position needs 24 + 2.
	 */
	margin-inline-end: 26px;
}

/*
 * White-on-dark is the header's normal state; on this ground everything has
 * to invert. The logo is an image, so it is swapped for the dark wordmark
 * rather than recoloured — the same asset §31 uses for the search overlay.
 */
.jsx-header-inner.is-compact.is-open :is( a, p, span ) { color: var(--dp-text-on-light); }
.jsx-header-inner.is-compact.is-open svg { color: var(--dp-text-on-light); fill: currentColor; }
/*
 * The social icons carry a hard-coded fill="#FFFFFF" on their paths, so
 * `fill: currentColor` on the <svg> never reaches them — white on white,
 * present in the layout but invisible. The shapes have to be addressed
 * directly.
 */
.jsx-header-inner.is-compact.is-open svg :is( path, circle, rect, polygon, ellipse )[fill]:not([fill="none"]) {
	fill: var(--dp-text-on-light);
}
.jsx-header-inner.is-compact.is-open > :nth-child(1) img {
	content: url( "/wp-content/uploads/2026/09/js-wordmark-dark.png" );
}

/* --- the links ---------------------------------------------------- */

.jsx-header-inner.is-compact.is-open > :nth-child(2) {
	grid-area: nav;
	/* start, not the grid's default centring — the links belong directly
	   under the bar, as they do on the live site */
	align-self: start;
	justify-content: flex-start;
	position: static;
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: 0;
	padding: 28px 0 0;
	background: none;
	transform: none;
}

.jsx-header-inner.is-compact.is-open > :nth-child(2) > * {
	width: 100%;
	padding: 0;
	border-bottom: 1px solid var(--dp-line-on-light);
}

/* the tap target is the whole row, not just the words */
.jsx-header-inner.is-compact.is-open > :nth-child(2) > * > a {
	display: block;
	padding: 20px 0;
	font-size: 20px;
	line-height: 1.3;
}

/* --- socials, pinned to the bottom -------------------------------- */

.jsx-header-inner.is-compact.is-open > :nth-child(3) {
	grid-area: util;
	position: static;
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: flex-start;
	gap: 28px;
	padding: 0;
	background: none;
	transform: none;
	align-self: end;
}

/* --- the toggle becomes a close ----------------------------------- */

/* a stray button background (Elementor's base button styling) shows through
   as a filled circle behind the close icon — clear it explicitly */
.elementor.elementor .jsx-header-inner.is-compact .jsx-header-toggle,
.elementor.elementor .jsx-header-inner.is-compact .jsx-header-toggle:hover,
.elementor.elementor .jsx-header-inner.is-compact .jsx-header-toggle:focus {
	background: none;
	border: 0;
	box-shadow: none;
}

.jsx-header-inner.is-compact.is-open .jsx-header-toggle {
	position: relative;
	width: 44px;
	height: 44px;
	padding: 0;
}
.jsx-header-inner.is-compact.is-open .jsx-header-toggle svg { display: none; }

/*
 * Centred with `inset: 0; margin: auto`, not flex alignment — the same
 * technique §40 settled on after flex centring failed to reach a
 * pseudo-element on a button.
 */
.jsx-header-inner.is-compact.is-open .jsx-header-toggle::before,
.jsx-header-inner.is-compact.is-open .jsx-header-toggle::after {
	content: "";
	position: absolute;
	inset: 0;
	margin: auto;
	width: 24px;
	height: 2px;
	border-radius: 2px;
	background: var(--dp-text-on-light);
}
.jsx-header-inner.is-compact.is-open .jsx-header-toggle::before { transform: rotate(45deg); }
.jsx-header-inner.is-compact.is-open .jsx-header-toggle::after { transform: rotate(-45deg); }

/* ------- 45. The one join that earns an exception to §39 (>=768) */

/*
 * §39 makes every section join a uniform 160px (80 bottom + 80 top), and that
 * is right where a join sits between two blocks of content. This one does not:
 * the Products section ends with "See Our Portfolio", a single centred button
 * on its own row. A button carries its own optical whitespace on all four
 * sides, so the 160px reads as a hole rather than a rhythm — which is exactly
 * what was flagged.
 *
 * Trimmed on the Products side only, so the News section keeps the same 80px
 * above its heading that every other section has. The join becomes 104px.
 *
 * Same selector weight as §39, later in the file, inside the same breakpoint —
 * that is what makes it win. §37's value for this element is in a max-width
 * block and is untouched.
 */
/* (2026-10-09: the products grid's bottom padding rule was removed with the S2 merge; the band's
   80px bottom padding is on .e-6cef349b-11e7 in Elementor.) */

/* ---- 46. Search overlay icon colour, and the menu bar that moved */

/*
 * A. The header icons vanish while the search overlay is open.
 *
 * §31 already recolours the header for the white overlay, but it sets
 * `fill: currentColor` on the <svg>. A `fill` ATTRIBUTE on the child <path>
 * beats an inherited value, and three of these icons ship
 * `<path fill="#FFFFFF">` (the fourth uses `#fff`) — so they stay white on
 * white: present, sized, focusable, invisible. Same defect §44 fixed for the
 * mobile menu; this is the other place it lives.
 *
 * The shapes have to be addressed directly. The attribute guard matters: the
 * hamburger is `fill="none"` with `stroke="currentColor"`, and filling its
 * path would turn three open lines into solid shapes. `[fill]` skips it —
 * its path carries no fill attribute at all — and the :not() keeps it skipped
 * if a future icon declares one explicitly.
 */
/*
 * BOTH light-header states, not just the overlay.
 *
 * §46 fixed this for `dp-search-open`, and the search RESULTS page broke the
 * same way — it lights the header with `dp-light-header` (inc/search.php) and
 * carries its own `svg { fill: currentColor }` line with the identical blind
 * spot. Listing the states together is what stops a third copy of this bug:
 * a future light-header state belongs on this selector, not in a new rule.
 */
/*
 * The header's search icon goes away while the overlay is open.
 *
 * The overlay carries its own magnifier beside the field, so leaving the
 * header's in place shows the same control twice with only one of them live.
 *
 * `visibility`, not `display`: the icons are a right-aligned row, so removing
 * the last of them from layout would slide Facebook/Instagram/LinkedIn across
 * the moment the overlay opened. visibility also takes it out of the tab order,
 * which is what we want inside a focus trap — and it is safe to hide a control
 * that search.js returns focus to on close, because the class comes off before
 * that refocus runs (search.js removes `dp-search-open`, then calls
 * `opener.focus()`), so the icon is visible again by the time it is focused.
 */
/*
 * While the overlay is open, the header's search icon BECOMES the close
 * control — so there is one control in one place rather than a magnifier that
 * does nothing beside a separate X. The panel's own close button is removed
 * (§31 printed it at the top right of the panel) and search.js retargets the
 * toggle, which already toggled on click.
 *
 * The X is drawn rather than swapped for another SVG: two bars on the element
 * itself means no second asset to keep in step with the icon's colour, and
 * `currentColor` follows the light-header palette automatically.
 */
/*
 * EVERY width now, not just the uncollapsed header.
 *
 * This used to be gated on the header NOT being compact, because the search
 * toggle then lived inside the mobile menu and was off screen — hiding the
 * panel's own X as well would have left the overlay with no visible way out.
 * That premise is gone: custom.js now lifts the toggle into the compact bar
 * beside the hamburger, where it is on screen in every state. So the swap
 * applies everywhere and the panel's X goes with it — one close control, in
 * one place, at all widths.
 */
@media (min-width: 0px) {
	body.dp-search-open .jsx-search__close { display: none; }

	body.dp-search-open .jsx-search-toggle {
		position: relative;
		color: var(--dp-text-on-light);
		cursor: pointer;
	}

	/* the magnifier keeps its box so the icon row does not reflow */
	body.dp-search-open .jsx-search-toggle svg { visibility: hidden; }

	body.dp-search-open .jsx-search-toggle::before,
	body.dp-search-open .jsx-search-toggle::after {
		content: "";
		position: absolute;
		/* inset + auto margins, not flex centring: the parent's flex context does
		   not reach a pseudo-element (learned the hard way on the video control) */
		inset: 0;
		margin: auto;
		width: 20px;
		height: 1.8px;
		border-radius: 2px;
		background: currentColor;
	}

	body.dp-search-open .jsx-search-toggle::before { transform: rotate( 45deg ); }
	body.dp-search-open .jsx-search-toggle::after  { transform: rotate( -45deg ); }
}

body.dp-light-header .jsx-header svg :is( path, circle, rect, polygon, ellipse )[fill]:not([fill="none"]),
body.dp-search-open .jsx-header svg :is( path, circle, rect, polygon, ellipse )[fill]:not([fill="none"]) {
	fill: var(--dp-text-on-light);
}

/*
 * NOT in a media query, deliberately.
 *
 * The hamburger appears when custom.js MEASURES the nav as not fitting, not
 * at a breakpoint — a long nav plus the admin bar collapses the header well
 * above 1024. These rules were wrapped in max-width:1024, so above it the
 * hamburger opened the OLD dark dropdown instead of this panel. Gating on
 * `.is-compact.is-open` is the same condition the script uses, so the panel
 * now follows the hamburger wherever it appears.
 */
/*
 * B. Opening the menu dropped the logo and hamburger by exactly 21px.
 *
 * The header already carries `padding-block: 21px`, which is what puts the
 * closed bar at y=21 with the logo centred at y=25. §44 then gave the open
 * panel its own `padding-top: 21px`, which stacks on top of the header's —
 * so the same two elements landed at y=42 and the bar appeared to jump the
 * moment the panel opened.
 *
 * Zero here, not a smaller number: the header's own 21px is the padding,
 * and the panel must not add a second one. The row is auto-height and the
 * toggle is 46px tall, so it resolves to the closed bar's 46px and
 * `align-self: center` returns the 38px logo to y=25 — identical to closed,
 * which is the whole requirement. The bottom padding is untouched.
 *
 * The `.elementor` prefix is load-bearing, not decoration: §44 sets the
 * shorthand through `.elementor.elementor .jsx-header-inner.is-compact.is-open`, four
 * classes to this rule's three without it, so the longhand silently loses.
 * Verified: the first attempt without it left padding-top at 21px.
 */
.elementor.elementor .jsx-header-inner.is-compact.is-open {
	padding-top: 0;
	/*
	 * And the bar row is pinned to the closed bar's height. §44 sizes the
	 * open toggle 44x44 for the 2.5.8 target, but the closed one is 46
	 * (10px padding + a 26px glyph) — so an `auto` row resolved to 44 and
	 * centred the 38px logo one pixel high. 46 restores it exactly.
	 *
	 * The 2px-shorter button still centres on the same axis, so its visible
	 * glyph lands on precisely the closed icon's pixels; only the invisible
	 * hit box differs, and it keeps its 44px. Both targets stay compliant.
	 */
	grid-template-rows: 46px 1fr auto;
}

/* ------------- 47. Routing rows, 20% more compact */

/*
 * Jun: "reduce font size by 20% and reduce each link top and bottom gap by 20%".
 *
 * Both numbers live in Elementor, not here, and both are per-breakpoint, so the
 * reduction is written out at each one rather than expressed as a ratio — CSS
 * has no way to say "80% of whatever this element already computes to"
 * (percentage font-size resolves against the PARENT, which is not the same
 * thing and would have drifted).
 *
 *   label   40 -> 32   (desktop)     34 -> 27   (<=1024)     26 -> 21  (<=767)
 *   band    42 -> 34   (>=768)       24 -> 19   (<=767, the value §34 set)
 *
 * Scoped to the four rows rather than applied to `.jsx-display-sub` globally.
 * All four uses of that class on this page happen to be these rows, so the two
 * would look identical today — but it is a shared global class, and a subhead
 * added to another page later must not silently inherit a decision made about
 * this section.
 */
.jsx-routing-rows > :nth-child(-n + 4 of .e-con) .jsx-display-sub { font-size: 32px; }

.elementor.elementor .jsx-routing-rows > :nth-child(-n + 4 of .e-con) {
	padding-block-start: 34px;
	padding-block-end: 34px;
}

@media (max-width: 1024px) {
	.jsx-routing-rows > :nth-child(-n + 4 of .e-con) .jsx-display-sub { font-size: 27px; }
}

@media (max-width: 767px) {
	.jsx-routing-rows > :nth-child(-n + 4 of .e-con) .jsx-display-sub { font-size: 21px; }
	.elementor.elementor .jsx-routing-rows > :nth-child(-n + 4 of .e-con) {
		padding-block-start: 19px;
		padding-block-end: 19px;
	}
}

/* -------- 48. Mobile menu: socials off the floor, and a staggered entrance */

/*
 * NOT in a media query, deliberately.
 *
 * The hamburger appears when custom.js MEASURES the nav as not fitting, not
 * at a breakpoint — a long nav plus the admin bar collapses the header well
 * above 1024. These rules were wrapped in max-width:1024, so above it the
 * hamburger opened the OLD dark dropdown instead of this panel. Gating on
 * `.is-compact.is-open` is the same condition the script uses, so the panel
 * now follows the hamburger wherever it appears.
 */
/*
 * A. The socials row is the last grid row and `align-self: end`, so what
 * sets its distance from the floor is the panel's own bottom padding —
 * 36px from §44. Jun asked for 25.
 *
 * env() rides along because this is a full-height panel on a phone: on a
 * device with a home indicator the icons would otherwise sit under it. It
 * resolves to 0 everywhere else, so the measured gap is exactly 25px in a
 * browser and 25px of clear space on hardware.
 */
.elementor.elementor .jsx-header-inner.is-compact.is-open {
	padding-bottom: calc( 25px + env( safe-area-inset-bottom, 0px ) );
}

/* the bar drops to a 20px gutter here, so the panel must too */
@media (max-width: 767px) {
	.elementor.elementor .jsx-header-inner.is-compact.is-open { padding-inline: 20px; }
}

/*
 * The open panel must not swallow the admin bar.
 *
 * `inset: 0` pins it to the viewport, but the CLOSED header is pushed down by
 * the admin bar (32px, 46 below 782) — so for a logged-in editor the whole row
 * jumped up 32px on open while a visitor saw no movement at all. Same offsets
 * as the closed header uses, including the ≤600 case where WordPress makes the
 * bar `position: absolute` and the header goes back to 0.
 */
body.admin-bar .elementor.elementor .jsx-header:has( .jsx-header-inner.is-compact.is-open ) { top: 32px; }

@media screen and (max-width: 782px) {
	body.admin-bar .elementor.elementor .jsx-header:has( .jsx-header-inner.is-compact.is-open ) { top: 46px; }
}

@media screen and (max-width: 600px) {
	body.admin-bar .elementor.elementor .jsx-header:has( .jsx-header-inner.is-compact.is-open ) { top: 0; }
}

/*
 * ...and the header's own 21px bottom padding has to go, or it stacks
 * outside the panel's and the icons measure 46px off the floor instead of
 * 25. Exactly the trap §46 hit at the top of the same element — the header
 * is padded for a 88px bar, and when it becomes a full-height panel that
 * padding is only wanted on the side that still forms the bar.
 *
 * The top 21px stays: that is what keeps the logo aligned with the closed
 * header. Only the bottom is cleared.
 */
.elementor.elementor .jsx-header:has( .jsx-header-inner.is-compact.is-open ) {
	padding-bottom: 0;
}

/*
 * B. The links arrive in sequence rather than all at once.
 *
 * Pure CSS, keyed off `.is-open`, so it replays on every open and needs
 * nothing from motion.js — which is deferred, and a menu that animates only
 * after a script lands is the failure §46's watchdog exists to prevent.
 *
 * 40ms apart: enough to read as a sequence, short enough that the last of
 * five items is on screen in 460ms and the menu never feels like it is
 * making you wait.
 */
.jsx-header-inner.is-compact.is-open > :nth-child(2) > * {
	animation: jsx-menu-item-in 300ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
.jsx-header-inner.is-compact.is-open > :nth-child(2) > :nth-child(1) { animation-delay: 0ms; }
.jsx-header-inner.is-compact.is-open > :nth-child(2) > :nth-child(2) { animation-delay: 40ms; }
.jsx-header-inner.is-compact.is-open > :nth-child(2) > :nth-child(3) { animation-delay: 80ms; }
.jsx-header-inner.is-compact.is-open > :nth-child(2) > :nth-child(4) { animation-delay: 120ms; }
.jsx-header-inner.is-compact.is-open > :nth-child(2) > :nth-child(5) { animation-delay: 160ms; }
.jsx-header-inner.is-compact.is-open > :nth-child(2) > :nth-child(n + 6) { animation-delay: 200ms; }

@keyframes jsx-menu-item-in {
	from { opacity: 0; transform: translateY( 12px ); }
	to   { opacity: 1; transform: none; }
}

/*
 * The menu must still open instantly for anyone who has asked motion to stop.
 * `animation: none` rather than a 0s duration, so no frame of the hidden start
 * state is ever painted.
 */
@media (prefers-reduced-motion: reduce) {
	.jsx-header-inner.is-compact.is-open > :nth-child(2) > * { animation: none; }
}

/*
 * WHY EVERY RULE BELOW IS SCOPED `.elementor.elementor`
 *
 * Elementor emits its base styles differently in the two places this CSS runs.
 * On the FRONT END they are unscoped -- `.e-grid-base { … }` at (0,1,0) -- and
 * this file loads last, so a plain `.elementor .jsx-x` at (0,2,0) wins twice
 * over. Inside the EDITOR canvas the same rules come out SCOPED, as
 * `.elementor .e-grid-base` at (0,2,0), and they are injected AFTER this file.
 * That is a tie decided by order, and the editor wins it: every container
 * padding, grid track and button colour here silently reverted, so the client
 * opened the page and saw a broken layout that the public site did not have.
 *
 * Doubling `.elementor` costs one class of specificity, settles the tie in the
 * editor, and changes nothing on the front end, where these rules already won.
 * Keep it on any new rule that overrides an `e-*-base` class.
 */

/* ================ 49. Header dropdown panels */

/*
 * Figma "21 · Header — Dropdown menu". Markup: inc/mega-menu.php (authored in
 * Appearance -> Menus: "Show dropdown panel" + "Dropdown title" on top-level
 * items, the panel lists the item's sub-items). Behaviour: assets/js/mega-menu.js.
 *
 * A full-bleed white panel drops from the header, which turns white with it;
 * the page behind dims. The page name sits large on the left, its in-page
 * sections in balanced columns on the right. Every panel uses the same grid,
 * so the links start at the same x whichever item is open.
 *
 * Without the script the panels stay `hidden`: still in the document for
 * crawlers and screen readers, never over the page.
 */

.jsx-mega-layer { position: relative; z-index: 8999; }

.jsx-mega-backdrop {
	position: fixed;
	inset: 0;
	z-index: 8998;
	background: rgba( 11, 6, 24, 0.40 );
}

.jsx-mega-backdrop[hidden] { display: none; }

.jsx-mega {
	position: fixed;
	/* published from the real header height by mega-menu.js */
	top: var( --jsx-header-h, 91px );
	left: 0;
	right: 0;
	z-index: 8999;
	max-height: calc( 100vh - var( --jsx-header-h, 91px ) );
	overflow-y: auto;
	background: #fff;
	box-shadow: 0 24px 48px rgba( 21, 19, 31, 0.16 );
	opacity: 0;
	transform: translateY( -8px );
	transition: opacity 180ms ease, transform 220ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
}

.jsx-mega.is-open { opacity: 1; transform: none; }

.jsx-mega[hidden] { display: none; }

/*
 * Mirrors the header's own container exactly (.jsx-header-inner, §3): 1240px
 * border-box with no gutter from 1340 up, 40px gutters below — so the panel's
 * title sits under the wordmark and its divider spans the bar's width at every
 * desktop size. `.jsx-container` cannot be reused: it is defined under
 * `.elementor`, and these panels print outside that wrapper.
 */
.jsx-mega__inner {
	box-sizing: border-box;
	max-width: 1240px;
	margin-inline: auto;
	padding-inline: 0;
}

@media ( max-width: 1339px ) {
	.jsx-mega__inner { padding-inline: 40px; }
}

.jsx-mega__grid {
	display: grid;
	grid-template-columns: 440px minmax( 0, 1fr );
	gap: 0 60px;
	padding-block: 40px 56px;
	border-block-start: 1px solid var( --dp-line-on-light );
}

.jsx-mega__section {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 28px;
}

.jsx-mega__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
}

.jsx-mega__title-rest { display: block; color: var( --dp-blue ); }

.jsx-mega__overview {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	font-family: var( --dp-font-body );
	font-size: 16px;
	font-weight: 500;
	line-height: 1.2;
	color: var( --dp-blue );
	text-decoration: none;
	transition: color 140ms ease;
}

.jsx-mega__overview::after {
	content: "";
	width: 15px;
	height: 12px;
	flex: 0 0 auto;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

.jsx-mega__overview:hover,
.jsx-mega__overview:focus-visible { color: var( --dp-violet ); }
.jsx-mega__overview:hover::after { transform: translateX( 3px ); }

/* "ON THIS PAGE" — caps set in CSS so the source reads as a sentence */
.jsx-mega__label {
	margin: 0 0 20px;
	font-family: var( --dp-font-subhead );
	font-size: 13px;
	font-weight: 500;
	line-height: 1.3;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var( --dp-text-on-light-muted );
}

/* columns are balanced in PHP (max 4, 7 -> 4+3), so this only lays them out */
.jsx-mega__cols { display: flex; gap: 48px; }

.jsx-mega__list {
	list-style: none;
	margin: 0;
	padding: 0;
	width: 320px;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.jsx-mega__item { margin: 0; }

.jsx-mega__link {
	display: inline-block;
	padding-block: 2px;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light );
	text-decoration: none;
	transition: color 140ms ease;
}

/* 7.8:1 on white; focus keeps the theme ring as well, never colour alone */
.jsx-mega__link:hover,
.jsx-mega__link:focus-visible { color: var( --dp-blue ); }

/* a third level, if one is ever authored: indented under its parent */
.jsx-mega__list--l3 {
	width: auto;
	gap: 6px;
	margin: 8px 0 0 2px;
	padding-inline-start: 14px;
	border-inline-start: 1px solid var( --dp-line-on-light );
}

.jsx-mega__list--l3 .jsx-mega__link { font-size: 15px; color: var( --dp-text-on-light-muted ); }

/* --- the chevron disclosure next to each label ----------------------- */

.jsx-has-mega { display: inline-flex; align-items: center; }

/*
 * The 24px hit area carries 6px of air either side of the 12px glyph, so the
 * item's own 15px right padding comes down by 6 to land on the Figma spacing
 * (label · 6 · chevron · 15). Without it each dropdown item is 6px wider than
 * designed, and the header switches to the hamburger ~18px earlier.
 */
.elementor.elementor .jsx-ui-nav.jsx-has-mega { padding-inline-end: 9px; }

/*
 * 24x24 hit area around a 12px glyph: meets 2.5.8 and leaves the 6px visual
 * gap the design has between label and chevron. Colour follows the label, so
 * every header state recolours it for free.
 */
.jsx-mega-toggle {
	appearance: none;
	display: inline-grid;
	place-items: center;
	width: 24px;
	height: 24px;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 4px;
	background: none;
	color: inherit;
	cursor: pointer;
}

/*
 * Hello Elementor's reset paints every `button:hover` / `button:focus` #c36
 * (pink) with white text. Neutralised here; the keyboard focus RING is left
 * alone, so focus stays visible.
 */
.jsx-header .jsx-mega-toggle:is( :hover, :focus, :active ) {
	background: none;
	color: inherit;
}

.jsx-mega-toggle svg { transition: transform 180ms ease; }
.jsx-mega-toggle[aria-expanded="true"] svg { transform: rotate( 180deg ); }

/* --- the header while a panel is open: the white treatment ----------- */

/*
 * Mirrors the search overlay and article header (dp-search-open,
 * dp-light-header) — same palette, same wordmark swap — under its own class,
 * so closing a panel can never strip an article page of its white header.
 */
body.dp-mega-open .jsx-header,
body.dp-mega-open .elementor.elementor .jsx-header {
	background-image: none;
	background-color: #fff;
	transform: none;
	z-index: 9001;
}

body.dp-mega-open .elementor.elementor .jsx-header::after { display: none; }

body.dp-mega-open .jsx-header :is( a, p, span ) { color: var( --dp-text-on-light ); }
body.dp-mega-open .jsx-header svg { color: var( --dp-text-on-light ); fill: currentColor; }
body.dp-mega-open .jsx-header svg :is( path, circle, rect, polygon, ellipse )[fill]:not( [fill="none"] ) {
	fill: var( --dp-text-on-light );
}
/* the chevron is stroked, and must not pick up the fill rule above */
body.dp-mega-open .jsx-header .jsx-mega-toggle svg { fill: none; }

body.dp-mega-open .jsx-header img[src*="js-wordmark-white"],
body.dp-mega-open .jsx-header img[src*="logo"] {
	content: url( "/wp-content/uploads/2026/09/js-wordmark-dark.png" );
}

body.dp-mega-open .jsx-ui-nav:hover,
body.dp-mega-open .jsx-ui-nav:hover a,
body.dp-mega-open .jsx-ui-nav a:focus-visible { color: var( --dp-blue ); }

/* the open item: brand blue, chevron up (the rotation comes from aria-expanded) */
body.dp-mega-open .jsx-header .is-mega-open,
body.dp-mega-open .jsx-header .is-mega-open :is( a, .jsx-mega-toggle ) { color: var( --dp-blue ); }

/* the CTA keeps its white label; on a white header its hover is violet (§29b) */
body.dp-mega-open .elementor.elementor .jsx-hdr-cta { color: var( --dp-white ); }
body.dp-mega-open .elementor.elementor .jsx-hdr-cta:hover,
body.dp-mega-open .elementor.elementor .jsx-hdr-cta:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
	color: var( --dp-white );
}

@media ( prefers-reduced-motion: reduce ) {
	.jsx-mega,
	.jsx-mega-toggle svg { transition: none; }
}

/* --- below the header's collapse point: an accordion ----------------- */

@media ( max-width: 1024px ) {
	/* the lists have been moved into the menu rows; the overlay never shows */
	.jsx-mega,
	.jsx-mega-backdrop { display: none !important; }
}

/*
 * The accordion rules below are NOT width-gated: they key on .jsx-has-mega-mobile / .jsx-mega-mobile,
 * which exist only while mega-menu.js has the lists in the hamburger menu. That happens at <=1024 AND
 * whenever the bar is too narrow for the full nav (`is-compact`, about 1025-1339px), 2026-10-11.
 */
@media all {
	/* label | 44px toggle, with the list spanning both columns beneath */
	.jsx-header-inner.is-compact.is-open .jsx-has-mega-mobile {
		display: grid;
		grid-template-columns: minmax( 0, 1fr ) 44px;
		align-items: center;
	}

	/*
	 * The 44px chevron column ends flush with the row, so its centre lines up with the close button
	 * above (also 44px, flush right). The bar's 9px end padding on dropdown items (".jsx-ui-nav
	 * .jsx-has-mega", same 0,4,0 weight as the menu's own reset and later in the file) was pulling every
	 * chevron 9px left of the × whenever the menu opened above 1024px (Jun, 2026-10-11).
	 */
	.elementor.elementor .jsx-header-inner.is-compact.is-open .jsx-ui-nav.jsx-has-mega-mobile {
		padding-inline-end: 0;
	}

	.jsx-header-inner.is-compact.is-open .jsx-has-mega-mobile .jsx-mega-toggle {
		width: 44px;
		height: 44px;
		color: var( --dp-text-on-light );
	}

	.jsx-header-inner.is-compact.is-open .jsx-has-mega-mobile .jsx-mega-toggle svg {
		width: 18px;
		height: 18px;
	}

	.jsx-header-inner.is-compact.is-open .jsx-has-mega-mobile.is-sub-open > a,
	.jsx-header-inner.is-compact.is-open .jsx-has-mega-mobile.is-sub-open > .jsx-mega-toggle {
		color: var( --dp-blue );
	}

	.jsx-mega-mobile {
		grid-column: 1 / -1;
	}

	/* The 12px under the list sits on the body, not the wrapper: the wrapper slides its height to 0
	   (mega-menu.js slide()), and padding on a border-box element cannot shrink below itself. */
	.jsx-mega-mobile > .jsx-mega__body { padding-block-end: 12px; }

	/* overflow only while sliding, so focus rings on the links are never clipped at rest */
	.jsx-mega-mobile.is-sliding {
		overflow: hidden;
		transition: height 260ms cubic-bezier( 0.2, 0.7, 0.2, 1 );
	}

	.jsx-mega-mobile[hidden] { display: none; }

	/* custom.js measure(): the bar's width is read without the moved sub-lists, and with transitions
	   off: the theme reset gives buttons `transition: all .3s`, so a same-task read of the chevron
	   button returned its old 44px touch width, not the 24px bar width, and the bar never came back */
	.jsx-header-inner.is-measuring .jsx-mega-mobile { display: none !important; }
	.jsx-header-inner.is-measuring,
	.jsx-header-inner.is-measuring * { transition: none !important; }

	.jsx-mega-mobile .jsx-mega__label { display: none; }

	/* one list on a 2px brand rail; the PHP columns simply stack */
	.jsx-mega-mobile .jsx-mega__cols {
		display: block;
		border-inline-start: 2px solid var( --dp-blue );
	}

	.jsx-mega-mobile .jsx-mega__list { width: auto; gap: 0; }

	/* 47px rows: 16px x 1.7 + 2 x 10px, clear of the 44px touch guidance */
	.jsx-header-inner.is-compact.is-open .jsx-mega-mobile .jsx-mega__link {
		display: block;
		padding: 10px 0 10px 18px;
		font-size: 16px;
		line-height: 1.7;
		color: var( --dp-text-on-light );
		border: 0;
	}

	.jsx-header-inner.is-compact.is-open .jsx-mega-mobile .jsx-mega__link:hover { color: var( --dp-blue ); }

	.jsx-mega-mobile .jsx-mega__list--l3 { margin-left: 18px; }
}

/* ================ 50. News & Updates landing (page 14518) */

/*
 * Every class here is prefixed `jsx-nx-` (news index), NOT `jsx-news-`.
 * The first pass used `jsx-news-featured`, which the homepage already owns —
 * custom.css styles it at §§ above and news-filter.js selects it by that exact
 * name. The landing page's section was therefore picked up and driven as if it
 * were the homepage's featured card, and `.jsx-news-side > *:not(:nth-child(3))
 * img { display: none }` blanked five of the six card images. The same class
 * name in two layouts is the bug; a distinct prefix is the fix.
 */

/*
 * Figma frame 78:3. The page reuses the homepage's news machinery rather than
 * duplicating it — the filter strip, the featured loop and the card loop are
 * the same atomic collection loops, copied with their style ids intact so they
 * inherit every card rule already written and stay in step if those change.
 * What is new here is the page hero and the three-column grid, because the
 * homepage lays the same cards out as one feature plus a list column.
 */

/* --- S1 hero ---------------------------------------------------------- */

.jsx-nx-hero {
	/* 480 is the Figma height, and it counts the nav sitting over the image */
	min-height: 480px;
	gap: 26px;
	text-align: center;
}

.jsx-nx-hero__title {
	/* Figma 78:13 measures 69px tall on one line — 58 x 1.2 */
	font-size: 58px;
	line-height: 1.2;
	margin: 0;
	color: var( --dp-text-on-dark, #fff );
}

/* the accent half of the wordmark, as on every other display heading */
.jsx-nx-hero__title span { color: var( --brand-light-blue ); }

.jsx-nx-hero__sub {
	max-width: 600px;
	margin: 0 auto;
	font-size: 18px;
	line-height: 1.78;
	color: rgba( 255, 255, 255, 0.86 );
}

/* --- S2 filter bar ---------------------------------------------------- */

/*
 * The strip is the homepage's, which is a single row of pills. Here it also
 * carries the search field at the far end, so the two groups are pushed apart
 * rather than the pills being re-laid-out.
 */
.jsx-nx-filterbar {
	justify-content: space-between;
	align-items: center;
	width: 100%;
	margin-block-end: 48px;
}

/* --- S3 featured article ---------------------------------------------- */

/*
 * One post, full container width. The image is constrained by ratio rather
 * than height so it holds 1240x560 at every width without a media query.
 */
.jsx-nx-featured { width: 100%; margin-block-end: 72px; }

.jsx-nx-featured img {
	width: 100%;
	height: auto;
	aspect-ratio: 1240 / 560;
	object-fit: cover;
	border-radius: 8px;
}

.jsx-nx-featured .jsx-heading-article {
	font-size: 44px;
	line-height: 1.16;
	margin-block: 32px 0;
	max-width: 1040px;
}

.jsx-nx-featured .jsx-meta-host { margin-block-start: 22px; }

/* --- S4 card grid ------------------------------------------------------ */

/*
 * Three across with a 40px gutter: 3 x 386 + 2 x 40 = 1238, which is the
 * container to within rounding. The loop prints its items into one wrapper
 * element, so the grid goes on that wrapper, not on the loop itself.
 */
.jsx-nx-grid__items {
	display: grid;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	gap: 56px 40px;
	width: 100%;
}

.jsx-nx-grid__items > * {
	display: flex;
	flex-direction: column;
	width: 100%;
	min-width: 0;
}

.jsx-nx-grid img {
	width: 100%;
	height: auto;
	aspect-ratio: 386 / 220;
	object-fit: cover;
	border-radius: 8px;
}

.jsx-nx-grid .jsx-heading-card {
	margin-block: 18px 0;
	font-size: 20px;
	line-height: 1.3;
}

.jsx-nx-grid .jsx-meta-host { margin-block-start: 14px; }

/* --- Load More --------------------------------------------------------- */

/*
 * e-button's base style stretches it to the container and paints Elementor's
 * default blue; both have to be undone explicitly (see the atomic base-style
 * note in the build memory).
 */
/*
 * 72px is the Figma gap: the grid ends at y857 and the button sits at y929.
 *
 * Note the selector has no `.elementor-element` in it. ATOMIC widgets render
 * the element itself and carry no such wrapper class — only CLASSIC widgets do
 * (which is why §51's crumb, a shortcode widget, needed exactly that). Adding
 * it here matched nothing at all and removed the rule entirely.
 */
.elementor.elementor .jsx-nx-more {
	align-self: center;
	width: auto;
	min-width: 147px;
	/* 48 explicitly: a bare text node in a flex button resolves its line box
	   short, so padding alone lands at 24 rather than the Figma 48 */
	height: 48px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin-block-start: 72px;
	cursor: pointer;
}

.jsx-nx-more[hidden] { display: none; }

@media (max-width: 1024px) {
	.jsx-nx-hero { min-height: 380px; }
	.jsx-nx-hero__title { font-size: 44px; }
	.jsx-nx-featured .jsx-heading-article { font-size: 32px; }
	.jsx-nx-grid__items { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); gap: 40px 28px; }
}

@media (max-width: 767px) {
	.jsx-nx-hero { min-height: 300px; gap: 16px; }
	.jsx-nx-hero__title { font-size: 32px; }
	.jsx-nx-hero__sub { font-size: 15px; line-height: 1.6; }
	.jsx-nx-filterbar { flex-direction: column; align-items: stretch; gap: 16px; margin-block-end: 32px; }
	.jsx-nx-featured { margin-block-end: 40px; }
	.jsx-nx-featured .jsx-heading-article { font-size: 24px; margin-block-start: 20px; }
	/* two-up below 768, matching every other article list on this site */
	.jsx-nx-grid__items { gap: 28px 16px; }
	.jsx-nx-grid .jsx-heading-card { font-size: 15px; }
	.elementor.elementor .jsx-nx-more { margin-block-start: 40px; width: 100%; }
}

/*
 * §50 continued — beating the copied atomic styles.
 *
 * The featured and card loops were copied from the homepage WITH their style
 * ids, which is what makes them inherit every card rule already written. The
 * cost is that they also arrive carrying the homepage's geometry: that layout
 * is one large feature beside a list column, so the images are sized for it.
 * An atomic style is a single class, so `.elementor` + the section class is
 * enough to win without reaching for !important.
 */
.elementor.elementor .jsx-nx-hero__title { font-size: 58px; }

.elementor.elementor .jsx-nx-featured .jsx-media,
.elementor.elementor .jsx-nx-featured .jsx-nx-card__media {
	height: auto;
	min-height: 0;
	aspect-ratio: auto;
}

.elementor.elementor .jsx-nx-featured img {
	width: 100%;
	height: auto;
	aspect-ratio: 1240 / 560;
	object-fit: cover;
}

.elementor.elementor .jsx-nx-grid__items > * {
	height: auto;
	min-height: 0;
}

.elementor.elementor .jsx-nx-grid img {
	width: 100%;
	height: auto;
	min-width: 0;
	aspect-ratio: 386 / 220;
	object-fit: cover;
}

@media (max-width: 1024px) { .elementor.elementor .jsx-nx-hero__title { font-size: 44px; } }
@media (max-width: 767px)  { .elementor.elementor .jsx-nx-hero__title { font-size: 32px; } }

/* ================ 51. Single article (Figma 79:105) */

/*
 * Template 14519, served only to posts flagged for the rebuild — see
 * inc/article.php. Geometry from the Figma: a 1240 container, a 700px reading
 * column with a 380px aside 160px to its right, and a 1240x620 hero.
 *
 * Classes are prefixed `jsx-ar-`. The related grid does NOT reuse `jsx-nx-grid`
 * even though it is the same card loop, because that class carries the index
 * page's six-card cap and its Load More behaviour.
 */

/* --- S1 title block --------------------------------------------------- */

.jsx-ar-titleblock { background: var( --dp-surface-light, #fff ); }

/*
 * One back-link, per Figma 79:113/79:114 — not a trail. The chevron is drawn
 * from two borders rather than shipped as an icon: it is 9x14 in the frame and
 * inherits the link colour on hover for free.
 */
.jsx-ar-crumb { font-size: 14px; line-height: 1.3; margin-block-end: 40px; }

.jsx-ar-back {
	display: inline-flex;
	align-items: center;
	gap: 13px;
	color: var( --dp-text-on-light-muted );
	text-decoration: none;
	transition: color 140ms ease;
}

.jsx-ar-back:hover,
.jsx-ar-back:focus-visible { color: var( --dp-blue ); }

.jsx-ar-back__chevron {
	width: 8px;
	height: 8px;
	flex: 0 0 8px;
	border-left: 1.6px solid currentColor;
	border-bottom: 1.6px solid currentColor;
	transform: rotate( 45deg );
}

.jsx-ar-eyebrow { margin-block-end: 20px; }
.jsx-ar-eyebrow__link {
	font-size: 14px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var( --brand-blue );
	text-decoration: none;
}
.jsx-ar-eyebrow__link:hover { text-decoration: underline; }

.elementor.elementor .jsx-ar-title h1 {
	/* Figma 79:116 is 1000 wide and 153 tall — three lines at 44/1.16 */
	max-width: 1000px;
	font-size: 44px;
	line-height: 1.16;
	letter-spacing: -0.01em;
	margin: 0;
	color: var( --dp-text-on-light );
}

.jsx-ar-bylinehost { margin-block-start: 34px; }

.jsx-ar-byline {
	display: flex;
	align-items: center;
	/*
	 * Wraps, because the category chips now share this line (see
	 * hello_digiplus_sc_article_byline). Four chips plus date, author and read
	 * time do not fit one line on a laptop, let alone a phone — and a chip
	 * pushed onto its own line reads fine, whereas an overflowing row does not.
	 */
	flex-wrap: wrap;
	gap: 10px 14px;
	font-size: 16px;
	color: var( --dp-text-muted, #575269 );
}

/* The chips sit slightly tighter to each other than to the byline text. */
.jsx-ar-byline .jsx-ar-tag + .jsx-ar-tag { margin-inline-start: -6px; }

/* the quarter-circle marker every meta row on this site opens with */
.jsx-ar-byline__marker {
	width: 15px;
	height: 15px;
	flex: 0 0 15px;
	background: var( --brand-light-blue );
	border-start-start-radius: 15px;
}

.jsx-ar-byline__sep { opacity: 0.5; }

.elementor.elementor .jsx-ar-hero { margin-block-start: 66px; }
.elementor.elementor .jsx-ar-hero img {
	width: 100%;
	height: auto;
	aspect-ratio: 1240 / 620;
	object-fit: cover;
	border-radius: 8px;
	display: block;
}

/* --- S2 body ---------------------------------------------------------- */

.jsx-ar-body { background: var( --dp-surface-light, #fff ); }

.jsx-ar-cols { gap: 160px; align-items: flex-start; }

.jsx-ar-reading { flex: 0 0 700px; max-width: 700px; min-width: 0; }

/*
 * The article body is client HTML, so it is styled by element rather than by
 * class — whatever the editor produces has to land correctly.
 */
.jsx-ar-content { font-size: 18px; line-height: 1.75; color: var( --dp-text-on-light ); }
.jsx-ar-content p { margin: 0 0 26px; }
.jsx-ar-content h2 { font-size: 30px; line-height: 1.25; margin: 44px 0 16px; }
.jsx-ar-content h3 { font-size: 22px; line-height: 1.3; margin: 34px 0 12px; }
.jsx-ar-content a { color: var( --brand-blue ); }
.jsx-ar-content img { max-width: 100%; height: auto; border-radius: 8px; }
.jsx-ar-content figure { margin: 34px 0; }
.jsx-ar-content figcaption {
	margin-block-start: 14px;
	font-size: 14px;
	line-height: 1.5;
	color: var( --dp-text-muted, #575269 );
}

/* the pull quote in the Figma is a 3px rule with the quote set beside it */
.jsx-ar-content blockquote {
	margin: 40px 0;
	padding-inline-start: 34px;
	border-inline-start: 3px solid var( --brand-blue );
	font-size: 24px;
	line-height: 1.4;
	color: var( --dp-text-on-light );
}
.jsx-ar-content blockquote cite,
.jsx-ar-content blockquote footer {
	display: block;
	margin-block-start: 18px;
	font-size: 15px;
	font-style: normal;
	color: var( --dp-text-muted, #575269 );
}

/* --- the aside -------------------------------------------------------- */

.jsx-ar-aside {
	flex: 0 0 380px;
	max-width: 380px;
	min-width: 0;
	background: var( --dp-surface-tint, #F4F7FC );
	border-radius: 10px;
	/* it is shorter than the article, so it follows the reader down */
	position: sticky;
	top: 120px;
}

.elementor.elementor .jsx-ar-asidelabel {
	font-size: 14px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var( --dp-text-muted, #575269 );
	margin: 0 0 22px;
}

.jsx-ar-share { margin-block-end: 30px; }

/*
 * The divider is an Elementor widget with its own atomic style, so a bare class
 * lost and the rule collapsed to zero margin — it landed on top of the "Filed
 * under" label. Drawn as a border here rather than relying on the widget's own
 * line, which is one less thing to keep in step.
 */
.elementor.elementor .jsx-ar-rule {
	margin-block: 26px;
	border-block-start: 1px solid var( --dp-line-on-light );
	--divider-color: var( --dp-line-on-light );
}

.jsx-ar-tags { display: flex; flex-wrap: wrap; gap: 8px; }

/*
 * The "Filed under" tags are the same chip the cards use — Figma 79:159 shows
 * violet pills with white text, 27px tall.
 *
 * They could not inherit it: the card chips are styled POSITIONALLY, as
 * `.jsx-meta-host > span > span:nth-child(n+3)`, and these are links in their
 * own container. With no colour of their own they fell back to the theme's
 * default link colour (#CC3366), which is where the red came from. The values
 * below are copied from that rule deliberately — if the chip changes, both
 * places have to change, and this comment is the pointer.
 *
 * 5 + 17 + 5 = the 27px the Figma frame measures.
 */
.jsx-ar-tag {
	display: inline-flex;
	align-items: center;
	padding: 5px 10px;
	border-radius: 4px;
	background-color: var( --dp-blue );
	color: #fff;
	font-family: var( --dp-font-body );
	font-size: 12px;
	line-height: 1.4;
	white-space: nowrap;
	text-decoration: none;
	transition: background-color 120ms ease;
}

/*
 * State the TEXT colour on hover too, not just the background.
 *
 * The base rule sets `color: #fff`, but on hover a link colour from elsewhere
 * won and the label went dark on the dark violet — about 1.6:1, unreadable.
 * Naming it here keeps the pill legible in both states (#fff on #4600a8 is
 * 8.9:1).
 */
.jsx-ar-tag:hover,
.jsx-ar-tag:focus-visible {
	background-color: var( --dp-violet );
	color: #fff;
}

/* --- S3 related ------------------------------------------------------- */

.jsx-ar-related { background: var( --dp-surface-light, #fff ); }

.jsx-ar-related .jsx-container { border-block-start: 1px solid var( --dp-line-on-light ); padding-block-start: 80px; }

.elementor.elementor .jsx-ar-relatedhead { margin: 0 0 52px; }

.elementor.elementor .jsx-ar-related-grid img {
	width: 100%;
	height: auto;
	min-width: 0;
	aspect-ratio: 386 / 220;
	object-fit: cover;
	border-radius: 8px;
}
.jsx-ar-related-grid .jsx-heading-card { margin-block: 18px 0; font-size: 20px; line-height: 1.3; }
.jsx-ar-related-grid .jsx-meta-host { margin-block-start: 14px; }


/* --- narrower ---------------------------------------------------------- */

/*
 * `.elementor` prefixed throughout: these three elements are Elementor
 * containers carrying a local atomic style, which emits as a two-class rule.
 * A bare `.jsx-ar-cols` is one class and lost silently — the column layout
 * never collapsed at mobile and the reading column rendered 130px wide beside
 * a 172px aside. The rule was present and matching; it was simply outranked.
 */
@media (max-width: 1200px) {
	.elementor.elementor .jsx-ar-cols { gap: 64px; }
	.elementor.elementor .jsx-ar-reading { flex: 1 1 auto; max-width: none; }
	.elementor.elementor .jsx-ar-aside { flex: 0 0 320px; max-width: 320px; }
}

@media (max-width: 1024px) {
	/* the aside stops being a column and becomes a footer to the article */
	.elementor.elementor .jsx-ar-cols { flex-direction: column; gap: 48px; }
	.elementor.elementor .jsx-ar-reading { flex: 1 1 auto; max-width: none; width: 100%; }
	.elementor.elementor .jsx-ar-aside { position: static; flex: 1 1 auto; max-width: none; width: 100%; }
	.elementor.elementor .jsx-ar-title h1 { font-size: 34px; }
}

@media (max-width: 767px) {
	.elementor.elementor .jsx-ar-title h1 { font-size: 26px; }
	.jsx-ar-crumb { margin-block-end: 24px; font-size: 13px; }
	.jsx-ar-byline { font-size: 14px; gap: 10px; flex-wrap: wrap; }
	.elementor.elementor .jsx-ar-hero { margin-block-start: 32px; }
	.jsx-ar-content { font-size: 16px; line-height: 1.7; }
	.jsx-ar-content blockquote { font-size: 19px; padding-inline-start: 20px; margin: 28px 0; }
	.jsx-ar-related-grid .jsx-heading-card { font-size: 15px; }
}

/*
 * §51 continued — title-block rhythm and the related heading.
 *
 * The margins above lost to Elementor's widget base, which is a heavier
 * selector than a bare utility class. Prefixing with `.elementor` restores them,
 * and the values are read straight off the Figma's y-positions rather than
 * guessed: crumb 148, eyebrow 206, headline 244, byline 431, hero 497.
 */
/*
 * `.elementor-element` on the target as well as the section ancestor: Elementor
 * zeroes widget margins with a selector heavier than a bare utility class, so
 * `.elementor.elementor .jsx-ar-crumb` measured 0 and every item below sat ~50px high.
 */
/*
 * The trail sits BELOW the featured image now, so its 40px of clearance moved
 * from under it to above it. It is the last thing in the title block and the
 * article body starts immediately after, which supplies the space beneath.
 */
.elementor.elementor .jsx-ar-titleblock .elementor-element.jsx-ar-crumb {
	margin-block-start: 32px;
	margin-block-end: 0;
}

.elementor.elementor .jsx-ar-titleblock .elementor-element.jsx-ar-eyebrow { margin-block-end: 20px; }
.elementor.elementor .jsx-ar-eyebrow__link { line-height: 1.3; display: inline-block; }

.elementor.elementor .jsx-ar-titleblock .elementor-element.jsx-ar-bylinehost { margin-block-start: 34px; }
.elementor.elementor .jsx-ar-titleblock .elementor-element.jsx-ar-hero { margin-block-start: 44px; }

/*
 * "More from DigiPlus" is 48px tall in the Figma and opens with the same
 * quarter-circle marker the section headings elsewhere use, drawn here rather
 * than added to the markup so the heading stays a plain heading.
 */
.elementor.elementor .jsx-ar-relatedhead {
	font-size: 40px;
	line-height: 1.2;
	display: flex;
	align-items: center;
	gap: 14px;
	/*
	 * State the colour, because the heading also carries the GLOBAL class
	 * `jsx-display-section`, which is built for dark bands and paints #EFF6FF.
	 * This section is the one place that heading style sits on a light ground
	 * (#F4F7FC), where it rendered at a contrast ratio of about 1.03:1 —
	 * invisible. The global class cannot be changed; every dark section on the
	 * site depends on it. `.elementor.elementor .jsx-ar-relatedhead` is (0,2,0) and beats
	 * the global class's (0,1,0) regardless of which sheet loads last.
	 *
	 * Deliberately NOT set on a descendant span: the line-splitter wraps every
	 * line in .jsx-line__i, and a span rule here would be (0,2,1) and beat the
	 * `color: inherit` that keeps those lines neutral — see the note above
	 * `.jsx-lines .jsx-line`. An accent word, if this heading ever gets one,
	 * belongs in the markup as .jsx-on-light.
	 */
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ar-relatedhead::before {
	content: "";
	width: 18px;
	height: 18px;
	flex: 0 0 18px;
	background: var( --brand-light-blue );
	border-start-start-radius: 18px;
}

@media (max-width: 767px) {
	.elementor.elementor .jsx-ar-relatedhead { font-size: 26px; gap: 10px; }
	.elementor.elementor .jsx-ar-relatedhead::before { width: 14px; height: 14px; flex-basis: 14px; }
}

/* ================ 52. News index: filter links and pagination */

/*
 * The pills became <a> elements when filtering moved to the server, so the
 * pill styling — written for the spans the Elementor strip rendered — has to
 * cover links too. Same values, not a re-design.
 */
.elementor.elementor .jsx-news-tabs > a.jsx-news-tab {
	display: flex;
	align-items: center;
	height: 44px;
	padding: 0 14px;
	font-family: var(--dp-font-body);
	font-size: 16px;
	line-height: 1.7;
	color: var(--dp-text-on-light-muted);
	text-decoration: none;
	white-space: nowrap;
	transition: color 120ms ease;
}

.elementor.elementor .jsx-news-tabs > a.jsx-news-tab:hover,
.elementor.elementor .jsx-news-tabs > a.jsx-news-tab:focus-visible,
.elementor.elementor .jsx-news-tabs > a.jsx-tab-active { color: var(--dp-text-on-light); }

.jsx-nx-filterbar__tabs { display: flex; flex-wrap: wrap; align-items: center; }

/* the index body is theme markup now, so it owns its own rhythm */
.jsx-nx-index { display: flex; flex-direction: column; width: 100%; }

/*
 * `color: inherit` closes the default-link-colour hole for good on this page:
 * the media wrapper holds only an image, so its red was invisible, but leaving
 * it means the next thing added inside a card inherits #CC3366 by accident.
 */
.jsx-nx-card__media { display: block; color: inherit; }

.jsx-nx-empty {
	margin: 64px 0;
	text-align: center;
	color: var(--dp-text-on-light-muted);
}

/* --- pagination -------------------------------------------------------- */

/*
 * 242 posts at twelve a page is 21 pages, so the pager has to stay compact:
 * paginate_links is given mid_size 1 / end_size 1, which renders as
 * `1 … 9 10 11 … 21` and never grows past nine cells at any page.
 */
.jsx-pagination {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 8px;
	margin-block-start: 72px;
}

.jsx-pagination .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* 44 square: the 2.5.8 target, and it keeps the digits optically centred */
	min-width: 44px;
	height: 44px;
	padding: 0 12px;
	border-radius: 6px;
	font-size: 16px;
	line-height: 1;
	color: var(--dp-text-on-light-muted);
	text-decoration: none;
	transition: color 120ms ease, background-color 120ms ease;
}

.jsx-pagination a.page-numbers:hover,
.jsx-pagination a.page-numbers:focus-visible {
	color: var(--dp-text-on-light);
	background-color: rgba( 21, 19, 31, 0.06 );
}

.jsx-pagination .page-numbers.current {
	color: #fff;
	background-color: var(--brand-blue);
}

.jsx-pagination .page-numbers.dots {
	min-width: 24px;
	padding: 0;
	background: none;
}

/* the prev/next chevrons are drawn, so there is no icon asset to keep in step */
.jsx-pagination__arrow {
	width: 9px;
	height: 9px;
	border-right: 1.8px solid currentColor;
	border-bottom: 1.8px solid currentColor;
	transform: rotate( 135deg );
}

.jsx-pagination__arrow--next { transform: rotate( -45deg ); }

@media (max-width: 767px) {
	.jsx-pagination { margin-block-start: 40px; gap: 4px; }
	.jsx-pagination .page-numbers { min-width: 40px; height: 40px; padding: 0 8px; font-size: 15px; }
}

/*
 * §52 continued — the filter bar is theme markup now.
 *
 * It used to be an Elementor flexbox, so `display: flex` came from the builder
 * and §50 only had to set justification. As a plain <div> it defaults to block
 * and the search field dropped onto its own full-width row.
 */
.jsx-nx-filterbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	width: 100%;
	margin-block-end: 48px;
}

/* Figma 78:35 — a 240x44 field at the far end of the strip */
.jsx-nx-search { flex: 0 0 auto; }

.jsx-nx-search input[type="search"] {
	width: 240px;
	height: 44px;
	padding: 0 18px;
	border: 1px solid var(--dp-line-on-light);
	border-radius: 22px;
	background: #fff;
	font-family: var(--dp-font-body);
	font-size: 15px;
	color: var(--dp-text-on-light);
	appearance: none;
}

.jsx-nx-search input[type="search"]::placeholder { color: var(--dp-text-on-light-muted); }

.jsx-nx-search input[type="search"]:focus-visible {
	outline: 2px solid var(--brand-blue);
	outline-offset: 2px;
	border-color: transparent;
}

@media (max-width: 767px) {
	.jsx-nx-filterbar { flex-direction: column; align-items: stretch; gap: 16px; margin-block-end: 32px; }
	.jsx-nx-search input[type="search"] { width: 100%; }
}

/*
 * §52 continued — the loading state for AJAX paging.
 *
 * Dimmed rather than emptied: the outgoing cards stay in place until the new
 * ones arrive, so the page does not collapse to nothing and jump. pointer-events
 * off stops a second click landing mid-swap (the script guards that too, but
 * the cursor should say so).
 */
.jsx-nx-index.is-loading {
	opacity: 0.45;
	pointer-events: none;
	transition: opacity 120ms ease;
}

@media (prefers-reduced-motion: reduce) {
	.jsx-nx-index.is-loading { transition: none; }
}

/*
 * §51 continued — share buttons, per Figma 79:147.
 *
 * Elementor's Share Buttons widget paints each button in the network's own
 * brand colour by default (Facebook blue, LinkedIn blue, X black). The design
 * shows the opposite: white circles with a hairline outline and a dark glyph,
 * so the panel reads as one quiet block rather than three logos competing with
 * the article. Overridden rather than reconfigured because the widget's colour
 * control is per-network and would drift the moment a network is added.
 *
 * The widget's own `color_source` is set to `custom` in the template, which is
 * what makes this work: on the default `official` setting Elementor adds
 * `.elementor-share-buttons--color-official` and paints each network from a
 * three-class rule that no sane two-class override can beat. Escalating
 * specificity against it was the wrong lever — turning the option off is the
 * supported one, and it leaves these rules simple.
 */
.jsx-ar-share .elementor-share-btn {
	background-color: #fff;
	border: 1px solid var( --dp-line-on-light );
	color: var( --dp-text-on-light );
	transition: border-color 140ms ease, color 140ms ease;
}

.jsx-ar-share .elementor-share-btn:hover,
.jsx-ar-share .elementor-share-btn:focus-visible {
	border-color: var( --dp-blue );
	color: var( --dp-blue );
}

.jsx-ar-share .elementor-share-btn__icon,
.jsx-ar-share .elementor-share-btn__icon i,
.jsx-ar-share .elementor-share-btn__icon svg {
	color: inherit;
	fill: currentColor;
	background-color: transparent;
}

/*
 * §52 continued — card and featured headline links.
 *
 * Third time this exact defect has appeared, so it is worth naming: an <a>
 * with no colour of its own falls back to the theme's default link colour,
 * #CC3366, which reads as red. The Elementor-rendered cards never showed it
 * because their colour came from an atomic style ON the heading element; the
 * server-rendered ones carry no such style, so the colour has to be stated.
 *
 * Any new markup on this site that introduces a link needs a colour. The other
 * two were the article's "Filed under" tags and the index's tag chips.
 */
/* h2 on the index, h3 in the related grid — the card function takes a level,
   so both have to be named here. */
.jsx-nx-index :is( h2, h3 ) a,
.jsx-nx-index .jsx-heading-article a,
.jsx-nx-index .jsx-heading-card a,
.jsx-nx-card :is( h2, h3 ) a,
.jsx-nx-featured :is( h2, h3 ) a {
	color: var( --dp-text-on-light );
	text-decoration: none;
	transition: color 140ms ease;
}

.jsx-nx-index :is( h2, h3 ) a:hover,
.jsx-nx-index :is( h2, h3 ) a:focus-visible,
.jsx-nx-card :is( h2, h3 ) a:hover,
.jsx-nx-card :is( h2, h3 ) a:focus-visible { color: var( --dp-blue ); }

/* the headings themselves, for any that are not wrapped in a link */
.jsx-nx-index .jsx-heading-article,
.jsx-nx-index .jsx-heading-card { color: var( --dp-text-on-light ); }

/* ================ 53. News index at mobile (approved render m-news-index-390) */

@media (max-width: 767px) {
	/*
	 * The hero still carried the desktop 100px inline padding — the atomic
	 * style has no mobile variant — leaving the headline 190px of a 390px
	 * screen to sit in, so "News & Updates" broke onto two lines and the
	 * standfirst ran to five. The approved render has the title on one line.
	 */
	.elementor.elementor .jsx-nx-hero { padding: 96px 20px 72px; }
	.jsx-nx-hero__sub { max-width: none; }

	/*
	 * Break the content-sizing chain.
	 *
	 * §34 already gives `.jsx-news-tabs` the scrolling-strip treatment, and it
	 * was doing nothing here: a nowrap flex row is sized by its content, so the
	 * 619px strip stretched `.jsx-nx-filterbar` and `.jsx-nx-index` with it and
	 * the whole PAGE scrolled sideways. `overflow-x: auto` cannot bite until
	 * something stops the ancestors growing — that is what `min-width: 0` does
	 * on a flex item, and it is the piece that was missing.
	 */
	.jsx-nx-index,
	.jsx-nx-filterbar,
	.jsx-nx-filterbar__tabs { min-width: 0; max-width: 100%; }

	.jsx-nx-filterbar { flex-direction: column; align-items: stretch; }

	.jsx-nx-filterbar__tabs {
		width: 100%;
		flex-wrap: nowrap;
		overflow-x: auto;
		overscroll-behavior-x: contain;
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none;
		/* bleed to the gutter so the last pill can scroll clear of the edge */
		margin-inline: -20px;
		padding-inline: 20px;
	}

	.jsx-nx-filterbar__tabs::-webkit-scrollbar { display: none; }

	.jsx-nx-search input[type="search"] { width: 100%; }

	/*
	 * One column, per the approved render. The 2-up used here earlier came
	 * from a convention on a different project — this design stacks, and at
	 * 390 a two-up card leaves a 157px image and a three-line title.
	 */
	.jsx-nx-grid__items { grid-template-columns: 1fr; gap: 36px; }

	.jsx-nx-grid .jsx-heading-card { font-size: 19px; line-height: 1.3; }
	.jsx-nx-card img { aspect-ratio: 350 / 197; }
}

/*
 * §53 continued — the search result summary.
 */
.jsx-nx-count {
	margin: 0 0 28px;
	font-size: 15px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-nx-clear {
	margin-inline-start: 10px;
	color: var( --dp-blue );
	text-decoration: underline;
	text-underline-offset: 2px;
}

.jsx-nx-clear:hover,
.jsx-nx-clear:focus-visible { color: var( --dp-violet ); }

.jsx-nx-empty {
	margin: 56px 0;
	text-align: center;
	font-size: 17px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

@media (max-width: 767px) {
	.jsx-nx-count { margin-block-end: 20px; font-size: 14px; }
	.jsx-nx-empty { margin: 36px 0; font-size: 15px; }
}

/* ================ 54. Article body: the elements real posts actually use */

/*
 * §51 styled the elements the Figma frame happens to show. An audit of all 242
 * published posts says the real content is different:
 *
 *   <figure>  90 posts    <img> 92    <ul>/<ol> 12    <h2> 7    <table> 1
 *   <blockquote>  ZERO
 *
 * So the pull quote §51 styles has no content behind it anywhere on this site —
 * it stays, because the design calls for it and an editor may add one, but it
 * is unproven. Lists and the table had no styling at all, which is the gap this
 * section closes. Scoped to .jsx-ar-content so it cannot reach the legacy
 * theme's posts.
 */

.jsx-ar-content ul,
.jsx-ar-content ol {
	margin: 0 0 26px;
	padding-inline-start: 24px;
}

.jsx-ar-content li { margin-bottom: 10px; }
.jsx-ar-content li::marker { color: var( --dp-blue ); }
.jsx-ar-content li > ul,
.jsx-ar-content li > ol { margin-block: 10px 0; }

.jsx-ar-content strong { font-weight: 600; }

/*
 * A table in a 700px reading column has nowhere to go on a phone, so the
 * wrapper scrolls rather than the page. `max-width: 100%` on the table itself
 * is not enough — a table sizes to its content and pushes its parent wide.
 */
.jsx-ar-content table {
	width: 100%;
	border-collapse: collapse;
	margin: 0 0 26px;
	font-size: 16px;
}

.jsx-ar-content :is( th, td ) {
	padding: 12px 14px;
	border-bottom: 1px solid var( --dp-line-on-light );
	text-align: start;
	vertical-align: top;
}

.jsx-ar-content th { font-weight: 600; color: var( --dp-text-on-light ); }

/* the reading column must never be the thing that scrolls the page sideways */
.jsx-ar-reading,
.jsx-ar-content { min-width: 0; max-width: 100%; }

.jsx-ar-content > table,
.jsx-ar-content .wp-block-table {
	display: block;
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
}

/* WordPress's own figure/caption blocks, which is how 90 posts hold images */
.jsx-ar-content :is( .wp-block-image, .wp-caption ) {
	max-width: 100%;
	margin: 34px 0;
}

.jsx-ar-content :is( .wp-caption-text, .wp-element-caption ) {
	margin-block-start: 14px;
	font-size: 14px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-ar-content iframe,
.jsx-ar-content video {
	max-width: 100%;
	border-radius: 8px;
}

.jsx-ar-content :is( .alignleft, .alignright, .aligncenter ) { max-width: 100%; height: auto; }

@media (max-width: 767px) {
	.jsx-ar-content ul,
	.jsx-ar-content ol { padding-inline-start: 20px; }
	.jsx-ar-content table { font-size: 14px; }
	.jsx-ar-content :is( th, td ) { padding: 10px; white-space: nowrap; }
}

/* ================ 55. Related articles, per Figma 80:105 */

/*
 * The band sits on the light tint, not white — in the frame it is the one
 * section that lifts off the page, which is what separates "more reading"
 * from the article you just finished.
 */
.jsx-ar-related { background: var( --dp-surface-tint, #F4F7FC ); }

.jsx-ar-related .jsx-container {
	border-block-start: 0;
	padding-block-start: 80px;
}

.jsx-ar-related-grid { width: 100%; }

.jsx-ar-related-grid__items {
	display: grid;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	gap: 40px;
	width: 100%;
	align-items: start;
}

.jsx-ar-related-grid__items > * { display: flex; flex-direction: column; min-width: 0; }

.elementor.elementor .jsx-ar-related-grid img {
	width: 100%;
	height: auto;
	min-width: 0;
	aspect-ratio: 386 / 220;
	object-fit: cover;
	border-radius: 8px;
}

.jsx-ar-related-grid .jsx-heading-card {
	margin-block: 18px 0;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.jsx-ar-related-grid .jsx-meta-host { margin-block-start: 14px; }

@media (max-width: 1024px) {
	.jsx-ar-related-grid__items { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); gap: 28px; }
}

@media (max-width: 767px) {
	/* one column, as the approved mobile render shows */
	.jsx-ar-related-grid__items { grid-template-columns: 1fr; gap: 36px; }
	.jsx-ar-related-grid .jsx-heading-card { font-size: 19px; }
	.jsx-ar-related .jsx-container { padding-block-start: 48px; }
	/* and less air under the featured image than the desktop 56 */
	.elementor.elementor .jsx-ar-body { padding-block-start: 28px; }
}

/* ================ 56. Products and Sustainability hold their columns to 768 */

/*
 * Two sections were collapsing a breakpoint too early.
 *
 * PRODUCTS: the three cards are a scroll-snap carousel below 768 (§36) and
 * three across above 1024, but Elementor's own tablet variant put them in ONE
 * column for the whole 768-1024 band — a single 805px card per row. Three
 * across all the way down to iPad portrait is what was asked for, and the
 * carousel below 768 is untouched.
 *
 * `.e-con` is in the selector to reach three classes, so this outranks the
 * atomic per-element rule without needing !important.
 */
@media (min-width: 768px) {
	.elementor .e-con.jsx-product-cards {
		display: grid;
		grid-auto-flow: row;
		grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
		gap: 24px;
		overflow: visible;
	}
}

/*
 * SUSTAINABILITY (Integrated Report): §11 stacks everything carrying
 * .jsx-split below 1200, because the 1440 design uses fixed pixel columns that
 * get crushed between 1025 and 1240. That is still right for the other three
 * splits on the page — this is an exception for one section, not a change to
 * the rule.
 *
 * Proportional columns rather than the design's 781/415, which cannot survive
 * at 768; 1.6fr/1fr holds roughly the same relationship. §11 uses !important,
 * so this has to as well — four classes to its two, and the narrower media
 * range, make the intent unambiguous.
 */
@media (min-width: 768px) and (max-width: 1199px) {
	.elementor .e-con.jsx-split.e-60529145-a357 {
		grid-template-columns: 1.6fr 1fr !important;
		gap: 32px !important;
		align-items: center;
	}
}

/* ================ 57. News index: hero band and featured image, -30% */

/*
 * Both were sized straight off the Figma frame (hero 480, featured 1240x560),
 * and on a laptop that is most of the fold before a single headline appears —
 * the featured image alone was 445px of a 931px viewport. Jun asked for 30% off
 * each; these are the Figma numbers x0.7, not new guesses.
 *
 * The hero needs BOTH values changed. Its atomic padding is 150/116, which with
 * the content comes to 409 — under the old 480 min-height, so min-height was
 * governing and cutting it alone would have done nothing until the padding was
 * cut too. 105/81 keeps the same 1.3:1 top-to-bottom relationship.
 */
.elementor.elementor .jsx-nx-hero {
	min-height: 336px;          /* 480 x 0.7 */
	padding-block: 105px 81px;  /* 150/116 x 0.7 */
}

/*
 * The crop tightens rather than the image shrinking: object-fit is cover, so a
 * wider ratio keeps the full container width and takes the 30% off the height.
 *
 * From 768 up only. The complaint was a laptop fold — at 390 the same ratio
 * renders a 104px strip, too thin to read as a featured article at all, and
 * the approved mobile render (m-news-index-390) shows it nearer 16:9. Mobile
 * keeps that; it was never the thing covering the page.
 */
/*
 * Jun, 2026-10-04: superseded. The 1240:392 strip cropped away most of every featured image (they are
 * 16:9, often with headline text burnt in: "a lot of details are cut off"). The featured image is
 * now 16:9 at every width, so the whole artwork shows; the fold cost is accepted.
 */
.elementor.elementor .jsx-nx-featured img { aspect-ratio: 16 / 9; }

@media (max-width: 1024px) {
	.elementor.elementor .jsx-nx-hero { min-height: 266px; padding-block: 84px 64px; }
}

@media (max-width: 767px) {
	.elementor.elementor .jsx-nx-hero { min-height: 210px; padding-block: 67px 50px; }
}

/* ================ 58. News index: the filter bar follows the reader */

/*
 * The categories and search stick under the header once you scroll past them,
 * so switching filter does not mean scrolling back to the top of 21 pages of
 * cards.
 *
 * `position: sticky`, not a scroll-listener that toggles `fixed`: the browser
 * does this on the compositor, so there is no jank, no layout shift when it
 * engages, and nothing to keep in sync if the header height changes.
 *
 * `top` comes from --jsx-header-h, published by custom.js from the header's
 * MEASURED height — 88 at rest, more with the admin bar, different again when
 * the header collapses. The 88px fallback only applies if that script has not
 * run yet, in which case the bar is still usable, just possibly a few pixels
 * under the header for a moment.
 */
.jsx-nx-filterbar {
	position: sticky;
	/*
	 * The header hides on scroll down and returns on scroll up, so a fixed
	 * offset is wrong in both directions: pinned to the header's height it
	 * leaves a 59px gap of cards showing when the header slides away, and the
	 * header then lands ON TOP of the bar by 32px when it comes back.
	 *
	 * So the bar tracks where the header actually ends — its offset plus its
	 * height while it is showing, just the offset once it has gone. Both come
	 * from custom.js, measured.
	 */
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) );
	transition: top 240ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
	/*
	 * One BELOW the header, which is z-index 20. They are both fixed/sticky and
	 * the bar comes later in the DOM, so at equal z-index the bar would paint
	 * over the header — invisible while the two sit flush, but wrong the moment
	 * they overlap mid-transition. Still far above the cards, which are auto.
	 */
	z-index: 19;
	/*
	 * Opaque, or the cards scroll through it. The page ground is white, so this
	 * matches rather than introducing a surface.
	 */
	background-color: #fff;
	padding-block: 18px;
}

/*
 * The GROUND runs edge to edge; the CONTENT stays in the container.
 *
 * A 20px gutter bleed was not enough — while stuck, card edges showed either
 * side of the bar and the hairline stopped short of both margins. The bar's own
 * box has to keep the container's width, or the tabs and the search field would
 * slide out to the window edges with it, so the full-width surface is painted
 * by a pseudo-element instead.
 *
 * `--dp-vw` is the viewport width WITHOUT the scrollbar, measured in custom.js.
 * Plain `100vw` includes it, which overhangs the page by ~15px and gives the
 * whole document a sideways scroll. The 100vw fallback only applies before that
 * script runs.
 *
 * `z-index: -1` is what keeps it a background: the bar already creates a
 * stacking context (position: sticky + z-index), so a negative child paints
 * above the bar's own background and below its text.
 */
.jsx-nx-filterbar::before,
.jsx-nx-filterbar::after {
	content: "";
	position: absolute;
	left: 50%;
	width: var( --dp-vw, 100vw );
	transform: translateX( -50% );
	pointer-events: none;
}

.jsx-nx-filterbar::before {
	inset-block: 0;
	background-color: #fff;
	z-index: -1;
}

body.dp-header-hidden .jsx-nx-filterbar {
	top: var( --jsx-header-offset, 0px );
}

@media (prefers-reduced-motion: reduce) {
	.jsx-nx-filterbar { transition: none; }
}

/*
 * A hairline appears only while it is stuck, so the bar reads as a boundary
 * over content and as nothing at rest. `animation-timeline: view()` is not
 * used — support is thin; this is the plain trick of a border that is the same
 * colour as the ground until something scrolls under it.
 */
.jsx-nx-filterbar::after {
	inset-block-end: 0;
	height: 1px;
	background: var( --dp-line-on-light );
	opacity: 0;
	transition: opacity 160ms ease;
}

.jsx-nx-index.is-stuck .jsx-nx-filterbar::after { opacity: 1; }

/*
 * Compact the strip from iPad portrait down.
 *
 * Stuck, this sits on screen permanently, so every pixel of it is a pixel of
 * article not being read: at 128px tall it took 15% of a 390x844 phone on top
 * of the 88px header.
 *
 * The band is 1024, not 767, because the bar WRAPS long before the phone
 * breakpoint — the tab strip is ~619px and the field 240px, so the row stops
 * fitting around 960. Left at 767 this measured 140px tall at 768, which made
 * tablet worse than phone.
 *
 * An earlier attempt here tried to keep only the pills stuck via
 * `.jsx-nx-search { position: static; }`. That does nothing — the whole BAR is
 * the sticky element, so making a child static changes no positioning.
 * Shrinking the strip is the honest fix.
 */
@media (max-width: 1024px) {
	.jsx-nx-filterbar {
		padding-block: 10px;
		gap: 10px;
	}

	.jsx-nx-search input[type="search"] {
		height: 38px;
		padding: 0 16px;
		border-radius: 19px;
		/*
		 * Height comes down; the TYPE SIZE does not. iOS Safari zooms the page
		 * whenever a focused input is under 16px, and being thrown into a
		 * zoomed viewport on every search is far worse than 2px of field.
		 */
		font-size: 16px;
	}
}

/*
 * Tablet only: hold the strip on ONE row instead of letting it wrap.
 *
 * Below 768 the layout is already a column (tabs above, field below) and the
 * field is full width, so none of this applies there — hence the floor.
 */
@media (min-width: 768px) and (max-width: 1024px) {
	.jsx-nx-filterbar { flex-wrap: nowrap; }

	/* min-width: 0 is what lets a flex item shrink below its content and so
	   lets overflow-x bite — the same fix §53 needed on the phone strip. */
	.jsx-nx-filterbar__tabs {
		flex: 1 1 auto;
		min-width: 0;
		flex-wrap: nowrap;
		overflow-x: auto;
		overscroll-behavior-x: contain;
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none;
	}

	.jsx-nx-filterbar__tabs::-webkit-scrollbar { display: none; }

	.jsx-nx-search { flex: 0 0 auto; }
	.jsx-nx-search input[type="search"] { width: 200px; }
}

/* =============================================================================
 * §59 — Latest News filter: fade the swap (homepage)
 *
 * The homepage filter had no transition because it needs none technically —
 * inc/news-filter.php ships all six filters inline, so a tab change is a DOM
 * write with nothing to wait for. It read as a hard cut next to the news index,
 * whose cards dim across their AJAX fetch, so the two now match.
 *
 * TWO THINGS MAKE THIS FIDDLIER THAN IT LOOKS.
 *
 * 1. The featured region is also a scroll-reveal target, so it carries
 *    `.jsx-reveal`, and `.dp-motion .jsx-reveal.is-revealed` pins it to
 *    `opacity: 1` at specificity 0,3,0. A plain `.jsx-news-swapping` rule
 *    (0,1,0) loses silently — the class lands, the element never dims, and the
 *    only movement on screen is the entrance animation. Hence the
 *    `.dp-motion .jsx-reveal.<class>` selectors, which tie at 0,3,0 and win on
 *    order. The side column has no `.jsx-reveal`, so it needs its own selector.
 *
 * 2. The transition must NOT be declared on the elements permanently. The
 *    reveal owns `transition` there (400ms fade + 320ms rise); overriding it
 *    would flatten the page-load entrance. So the transition rides on the
 *    transient classes instead — `swapping` out, `restoring` back — and the
 *    reveal's own timing is left untouched between swaps.
 *
 * Only the card REGIONS fade. The pills are outside this and change at once —
 * see news-filter.js for why.
 * ========================================================================== */

.dp-motion .jsx-reveal.jsx-news-swapping,
.jsx-news-featured.jsx-news-swapping,
.jsx-news-side.jsx-news-swapping {
	opacity: 0.45;
	transition: opacity 130ms ease;
	/* stops a click landing on a card that is about to be replaced */
	pointer-events: none;
}

.dp-motion .jsx-reveal.jsx-news-restoring,
.jsx-news-featured.jsx-news-restoring,
.jsx-news-side.jsx-news-restoring {
	opacity: 1;
	transition: opacity 130ms ease;
}

@media (prefers-reduced-motion: reduce) {
	.dp-motion .jsx-reveal.jsx-news-swapping,
	.jsx-news-featured.jsx-news-swapping,
	.jsx-news-side.jsx-news-swapping,
	.dp-motion .jsx-reveal.jsx-news-restoring,
	.jsx-news-featured.jsx-news-restoring,
	.jsx-news-side.jsx-news-restoring { transition: none; }
}

/* =============================================================================
 * §60 — Breadcrumbs (Yoast)
 *
 * One trail serves both contexts: small and light-on-dark inside the news hero,
 * small and dark-on-light above an article. Yoast emits a flat <span> list, so
 * everything here is typographic — there is no structure to hang layout on.
 *
 * The separator is the `breadcrumbs-sep` option, now "/". It shipped as
 * `<i class="fas fa-chevron-right">` from the legacy theme, which loaded Font
 * Awesome; this theme does not, so it rendered as nothing at all.
 * ========================================================================== */

.jsx-crumbs {
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-crumbs a {
	color: inherit;
	text-decoration: none;
	border-bottom: 1px solid transparent;
}

.jsx-crumbs a:hover,
.jsx-crumbs a:focus-visible {
	color: var( --dp-text-on-light );
	border-bottom-color: currentColor;
}

/* The current page: Yoast marks it `breadcrumb_last` + aria-current. */
.jsx-crumbs .breadcrumb_last,
.jsx-crumbs [aria-current="page"] {
	color: var( --dp-text-on-light );
}

/* Breathing room either side of the "/" without touching the markup. */
.jsx-crumbs > span > span:not(:last-child)::after,
.jsx-crumbs > span > a::after { content: none; }

.jsx-crumbs > span { display: inline; }

/*
 * On the news hero the trail sits on photography behind a dark scrim, so it
 * inverts — and the muted step has to be lighter, not darker, to stay legible.
 */
.jsx-crumbs--onhero {
	color: rgba( 255, 255, 255, 0.72 );
	margin-block-start: 22px;
}

.jsx-crumbs--onhero a:hover,
.jsx-crumbs--onhero a:focus-visible,
.jsx-crumbs--onhero .breadcrumb_last,
.jsx-crumbs--onhero [aria-current="page"] { color: #fff; }

/*
 * Above an article the trail replaces the old single back-link, so it keeps
 * that element's spacing: it is the first thing in the title block.
 */
.elementor.elementor .jsx-ar-titleblock .jsx-crumbs { margin: 0; }

/*
 * The title block's top padding has to clear the FIXED header, so it is header
 * height plus breathing room, not a design number on its own. The Elementor
 * style carries only a desktop variant (now 124 against a 91px header = 33px
 * clear), which mobile inherited — 148px against an 88px header spent a sixth
 * of a phone screen on nothing before the first word.
 */
@media (max-width: 767px) {
	.jsx-crumbs { font-size: 13px; }
	.jsx-crumbs--onhero { margin-block-start: 16px; }

	.elementor.elementor .jsx-ar-titleblock { padding-block-start: 112px; }

	.elementor.elementor .jsx-ar-titleblock .elementor-element.jsx-ar-crumb {
		margin-block-start: 22px;
		margin-block-end: 0;
	}

	/*
	 * Clamp the current-page crumb to one line. It carries the full headline,
	 * which ran the trail to three lines on a 390 screen — and the same words
	 * are the <h1> directly underneath, so nothing is lost by truncating.
	 * Visual only: the BreadcrumbList JSON-LD still carries the full title.
	 */
	.jsx-crumbs .breadcrumb_last,
	.jsx-crumbs [aria-current="page"] {
		display: inline-block;
		max-width: 100%;
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
		vertical-align: bottom;
	}
}

/* =============================================================================
 * §61 — Footer: inline links and the address labels
 * ========================================================================== */

/*
 * The "Privacy Policy" link inside the footer copy.
 *
 * Scoped to `p.jsx-body-small` — NOT `.jsx-body-small a`, because that class is
 * also on the nav-menu widgets and would underline every footer menu link.
 *
 * It inherits the paragraph's colour, so without an underline it is a link that
 * is only distinguishable by... nothing at all. WCAG 1.4.1 wants more than
 * colour alone; here there was not even colour.
 */
.elementor-location-footer p.jsx-body-small a {
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 2px;
	text-decoration-thickness: 1px;
	transition: color 140ms ease;
}

.elementor-location-footer p.jsx-body-small a:hover,
.elementor-location-footer p.jsx-body-small a:focus-visible {
	color: var( --dp-light-blue );
}

/*
 * NOTHING typographic for the footer address labels lives here.
 *
 * They are real H4 heading widgets, and their font-size (every breakpoint),
 * weight, colour and margin are all on the widget's own atomic style in
 * Elementor — `.elementor .e-ftr*-st`, which is a two-class selector and
 * therefore already beats the `jsx-body-small` global class they also carry.
 * A rule here would be a second source of truth for the same properties.
 */

/* =============================================================================
 * §62 — Footer content from the General Theme options screen
 *
 * The logo, description, copyright, address and social row are now shortcodes
 * reading ACF (inc/theme-options.php), so the client owns that copy. They come
 * out as plain markup, which means the styling the Elementor widgets used to
 * carry has to live here instead.
 *
 * The address prints the stored field verbatim — Jun's call — so it is <b> and
 * <br> rather than the heading widgets it replaces.
 * ========================================================================== */

.elementor-location-footer .jsx-opt-text {
	display: block;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
}

.elementor-location-footer .jsx-foot-desc,
.elementor-location-footer .jsx-foot-copy { color: var( --text-on-dark-muted ); }

.elementor-location-footer .jsx-foot-address { color: var( --text-on-dark ); }

/* the labels the field marks up with <b> */
.elementor-location-footer .jsx-foot-address b {
	font-weight: 700;
	color: #fff;
}

/* inline links in the footer copy: stated, or they fall back to the theme red */
.elementor-location-footer .jsx-opt-text a {
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 2px;
	transition: color 140ms ease;
}

.elementor-location-footer .jsx-opt-text a:hover,
.elementor-location-footer .jsx-opt-text a:focus-visible { color: var( --dp-light-blue ); }

/* the logo widget used to size this; the shortcode's <img> needs it stated */
.elementor-location-footer .jsx-foot-logo img {
	display: block;
	width: 118px;
	height: auto;
}

/*
 * The social row replaces a flex container that carried these values on its
 * own atomic style, so they move here with it.
 */
.elementor-location-footer .jsx-foot-social {
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: flex-start;
	gap: 28px;
	/*
	 * 2, not 28. The measured gap above the icons was 56px — this margin plus
	 * the COLUMN's own 26px row-gap, which sits above every child here and
	 * cannot be removed for one of them. Halving 56 to 28 therefore leaves 2
	 * for the margin. Change the column gap and this number has to move with
	 * it; the number to check is the rendered distance, not this value.
	 */
	margin-block-start: 2px;
}

.elementor-location-footer .jsx-social__link {
	display: inline-flex;
	color: #fff;
	line-height: 0;
}

.elementor-location-footer .jsx-social__link svg {
	width: 24px;
	height: 24px;
	display: block;
}

@media (max-width: 767px) {
	.elementor-location-footer .jsx-foot-social { gap: 40px; }
}

/* --- §62 continued: the same two shortcodes in the header ---------------- */

/*
 * These wrappers must size to their CONTENT, not fill the row.
 *
 * custom.js measures `inner.children[0].offsetWidth` (the logo) and the icon
 * row to decide whether the nav fits; a shortcode widget is a block-level div,
 * so left alone it reports the full header width and the header would collapse
 * to the hamburger at every size. The Elementor widgets these replace carried
 * `flex: 0 0 auto` on their own styles — same thing, stated here.
 */
.elementor-location-header .jsx-header-inner > .elementor-widget-shortcode,
.elementor-location-header .jsx-header-inner .elementor-widget-shortcode {
	flex: 0 0 auto;
	width: auto;
	min-width: 0;
}

.elementor-location-header .jsx-head-logo img {
	display: block;
	width: 140px;
	height: 38px;
	object-fit: contain;
}

/* the 20px the social container used to carry on its own atomic style */
.elementor-location-header .jsx-head-social {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: 20px;
}

.elementor-location-header .jsx-social__link {
	display: inline-flex;
	color: currentColor;
	line-height: 0;
}

.elementor-location-header .jsx-social__link svg {
	width: 24px;
	height: 24px;
	display: block;
}

/* ================ 63. Corporate Governance: bands, split rows, anchor nav
 *
 * The page has no approved Figma frame — the client's deck stopped at the
 * homepage set — so it is built from the system the approved pages established:
 * the News index hero band verbatim, the light surface, and the type scale
 * already in the kit. Everything page-specific is namespaced `jsx-cg-`.
 *
 * Only structure lives in the atomic document. Type, rhythm and every
 * breakpoint live here, so a change is one edit rather than a tree walk.
 */

/* --- the light band ---------------------------------------------------- */

.elementor.elementor .jsx-cg-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

/* alternating bands, so three document rows do not read as one long page */
.elementor.elementor .jsx-cg-band:nth-of-type( even ) { background-color: #FAF9FD; }

/* --- copy + artwork split ---------------------------------------------- */

.elementor.elementor .jsx-cg-split {
	align-items: center;
	gap: 80px;
}

.elementor.elementor .jsx-cg-split__copy { gap: 24px; }

/*
 * e-image renders the <img> itself, so the radius and the fit go on the
 * element — there is no wrapper to hang them on.
 */
.elementor.elementor .jsx-cg-split__img {
	width: 100%;
	max-width: 460px;
	height: auto;
	border-radius: 16px;
	object-fit: cover;
	display: block;
}

.elementor.elementor .jsx-cg-btnrow {
	flex-wrap: wrap;
	gap: 16px;
}

/* --- type and buttons on a light ground -------------------------------- */

/*
 * jsx-display-section is drawn for a DARK band — it paints #EFF6FF, which on
 * white is invisible. The same is true of the kit's two button classes (white
 * pill, dark label), which is why the buttons here carry their own instead.
 * Scoped to the band rather than changed at source: four other pages use them
 * exactly as they are.
 */
.elementor.elementor .jsx-cg-band .jsx-display-section,
.elementor.elementor .jsx-cg-band .jsx-display-sub { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-cg-band .jsx-body-base,
.elementor.elementor .jsx-cg-band .jsx-body-lead { color: var( --dp-text-on-light-muted ); }

.elementor.elementor .jsx-cg-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 48px;
	padding-inline: 28px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-body );
	font-size: 16px;
	font-weight: 500;
	line-height: 1.2;
	color: var( --dp-white );
	text-align: center;
	text-decoration: none;
	transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease;
}

.elementor.elementor .jsx-cg-btn:hover,
.elementor.elementor .jsx-cg-btn:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
	color: var( --dp-white );
}

/* the second action in a row is supporting, so it reads as an outline */
.elementor.elementor .jsx-cg-btn--ghost {
	background-color: transparent;
	border-color: var( --dp-line-on-light );
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-cg-btn--ghost:hover,
.elementor.elementor .jsx-cg-btn--ghost:focus-visible {
	background-color: transparent;
	border-color: var( --dp-blue );
	color: var( --dp-blue );
}

/* --- in-page anchor nav ------------------------------------------------ */

/*
 * Sticky under the header, tracking where the header actually ENDS — the same
 * calc the news filter bar uses (section 58). A fixed top is wrong in both
 * directions here, because this header hides on scroll down and returns on
 * scroll up: pinned to the header height it leaves a gap when the header goes,
 * and the header lands on top of the bar when it comes back.
 *
 * z-index 19 for the same reason as the filter bar: one below the header, so
 * the later-in-DOM bar cannot paint over it mid-transition.
 */
.elementor.elementor .jsx-cg-nav {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) );
	transition: top 240ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
	z-index: 19;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-cg-nav__inner {
	gap: 32px;
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-cg-nav__inner::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-cg-nav__link a {
	display: inline-block;
	padding-block: 18px;
	font-family: var( --dp-font-body );
	font-size: 15px;
	line-height: 1.4;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease;
}

.elementor.elementor .jsx-cg-nav__link a:hover,
.elementor.elementor .jsx-cg-nav__link a:focus-visible { color: var( --dp-text-on-light ); }

/*
 * The section currently under the bar. Colour only — no weight change, which
 * would re-measure the label and shuffle the row as you scroll.
 */
.elementor.elementor .jsx-cg-nav__link a.is-current { color: var( --dp-blue ); }

.elementor.elementor .jsx-cg-nav__link a.is-current:hover,
.elementor.elementor .jsx-cg-nav__link a.is-current:focus-visible { color: var( --dp-violet ); }

/*
 * The anchor divs sit at the top of each band, so the landing point has to
 * clear the header AND the sticky nav that is still covering it.
 * (No-JS fallback only since 2026-10-11: custom.js "Anchor landing" places every jump exactly.)
 */
.elementor .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 60px ); }

/*
 * Every page's sticky anchor nav rides up with the header when it hides (Jun, 2026-10-11: CG
 * "Policies" appeared to land on Disclosures). Pinned at the header's height, the bar left a
 * header-tall strip above it once the header slid away, and the previous section's tail showed
 * through it. The news filter bar (§58) already did this; these bars never got it.
 * --jsx-header-offset is the admin bar's height when logged in, otherwise 0.
 */
/* custom.js "Anchor landing" focuses the section it lands on (so Tab carries on from there); a section is
   not a control, so no ring — the browser drew one after arriving from another page (Jun, 2026-10-11) */
[data-dp-landed]:focus { outline: none; }

body.dp-header-hidden .elementor.elementor :is( .jsx-cg-nav, .jsx-ir-nav, .jsx-su-nav, .jsx-rg-nav, .jsx-car-nav, .jsx-ct-nav, .jsx-pf-nav ),
body.dp-header-hidden .jsx-pd .jsx-pd-nav {
	top: var( --jsx-header-offset, 0px );
}

.elementor.elementor :is( .jsx-ir-nav, .jsx-su-nav, .jsx-rg-nav, .jsx-car-nav, .jsx-ct-nav, .jsx-pf-nav ),
.jsx-pd .jsx-pd-nav {
	transition: top 240ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
}

@media ( prefers-reduced-motion: reduce ) {
	.elementor.elementor :is( .jsx-cg-nav, .jsx-ir-nav, .jsx-su-nav, .jsx-rg-nav, .jsx-car-nav, .jsx-ct-nav, .jsx-pf-nav ),
	.jsx-pd .jsx-pd-nav { transition: none; }
}

/* --- breakpoints ------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-cg-band,
	.elementor.elementor .jsx-cg-nav { padding-inline: 40px; }
	.elementor.elementor .jsx-cg-split { gap: 48px; }
}

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-cg-band { padding-block: 72px; }
	.elementor.elementor .jsx-cg-split__img { max-width: 380px; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-cg-band,
	.elementor.elementor .jsx-cg-nav { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-cg-band { padding-block: 56px; }

	.elementor.elementor .jsx-cg-split {
		flex-direction: column;
		align-items: flex-start;
		gap: 32px;
	}

	/* the reversed row puts artwork first on desktop; on one column the copy leads */
	.elementor.elementor .jsx-cg-split--rev .jsx-cg-split__img { order: 2; }

	.elementor.elementor .jsx-cg-split__img { max-width: 100%; }
	.elementor.elementor .jsx-cg-nav__link a { padding-block: 14px; font-size: 14px; }
	.elementor.elementor .jsx-cg-nav__inner { gap: 24px; }

	/*
	 * Two actions side by side rather than stacked. A grid, not the wrapping
	 * flex row: equal columns keep the pair the same width whatever the labels
	 * say, where flex would size them to their text and leave the second one
	 * short.
	 */
	.elementor.elementor .jsx-cg-btnrow {
		display: grid;
		grid-template-columns: 1fr 1fr;
		/*
		 * stretch, because the element's own atomic style says
		 * align-items: center — which on a grid centres the short button
		 * against the tall one instead of matching them. "Download
		 * Certificates" takes two lines here; its neighbour has to follow.
		 */
		align-items: stretch;
		gap: 12px;
		width: 100%;
	}

	/* Code and ERM carry a single action; it should not sit at half width */
	.elementor.elementor .jsx-cg-btnrow > :only-child { grid-column: 1 / -1; }

	/*
	 * "Download Certificates" needs two lines in half a phone, so the height
	 * has to come from padding — a fixed min-height would clip the second line.
	 */
	.elementor.elementor .jsx-cg-btn {
		width: 100%;
		min-height: 48px;
		padding-block: 12px;
		padding-inline: 16px;
		font-size: 15px;
		line-height: 1.3;
	}
}

/* ================ 64. Corporate Governance: people, committees, documents
 *
 * These four blocks are server-rendered (inc/corporate-governance.php) because
 * they are queries, not authored content — board order comes from an ACF field,
 * and the disclosure list is 776 rows behind a filter. The atomic document
 * holds the band, the heading and the intro; everything below is styled here.
 */

/* the plain stacked band: heading, intro, then the rendered block */
.elementor.elementor .jsx-cg-stack { gap: 20px; }
.elementor.elementor .jsx-cg-stack > .elementor-widget-shortcode { width: 100%; margin-block-start: 20px; }

/* --- tabs (People, and the committee list) ------------------------------ */

.jsx-cg-tabs { width: 100%; }

.jsx-cg-tabs__list {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-block-end: 40px;
}

.jsx-cg-tabs__tab,
.jsx-cg-committees__tab {
	appearance: none;
	min-height: 44px;            /* WCAG 2.5.8 target size */
	padding-inline: 22px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 999px;
	background-color: transparent;
	font-family: var( --dp-font-body );
	font-size: 15px;
	font-weight: 500;
	color: var( --dp-text-on-light-muted );
	cursor: pointer;
	transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease;
}

.jsx-cg-tabs__tab:hover,
.jsx-cg-committees__tab:hover {
	border-color: var( --dp-blue );
	color: var( --dp-blue );
}

.jsx-cg-tabs__tab.is-active,
.jsx-cg-committees__tab.is-active {
	background-color: var( --dp-blue );
	border-color: var( --dp-blue );
	color: var( --dp-white );
}

/*
 * Every panel is in the HTML so the page still works with the script blocked.
 * The script adds is-active; without it all panels show, which is verbose but
 * never empty.
 */
.jsx-cg-tabs__panel:not( .is-active ),
.jsx-cg-committees__panel:not( .is-active ) { display: none; }

/* --- person card -------------------------------------------------------- */

.jsx-people {
	display: grid;
	grid-template-columns: repeat( 4, 1fr );
	gap: 32px 24px;
	width: 100%;
}

/* three members, so they sit as three rather than three-of-four */
.jsx-people--committee { grid-template-columns: repeat( 3, 1fr ); max-width: 900px; }

.jsx-person__link {
	display: flex;
	flex-direction: column;
	gap: 8px;
	text-decoration: none;
	color: inherit;
}

.jsx-person__media {
	display: block;
	margin-block-end: 8px;
	border-radius: 16px;
	overflow: hidden;
	background-color: var( --dp-lavender );
}

/*
 * 17 of the 18 profile photos are square originals, so the 1:1 frame crops
 * nothing. Ping Chen's is 1829x2560 — the only portrait — and a centred cover
 * crop took its square from the MIDDLE of the frame, cutting the top of his
 * head while everyone else sat untouched.
 *
 * `object-position: center top` takes the square from the top instead, which
 * is where the head is in a headshot. It has no effect on the other 17: a
 * square image in a square box has no overflow to position.
 */
.jsx-person__photo {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: cover;
	object-position: center top;
	transition: transform 420ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
}

/* a profile with no photo still holds the grid rather than collapsing it */
.jsx-person__photo--empty { aspect-ratio: 1 / 1; }

.jsx-person__link:hover .jsx-person__photo { transform: scale( 1.04 ); }

.jsx-person__name {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.jsx-person__role {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-person__more {
	margin-block-start: 4px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	font-weight: 500;
	color: var( --dp-blue );
}

.jsx-person__link:hover .jsx-person__more { text-decoration: underline; }

/* --- committees --------------------------------------------------------- */

.jsx-cg-committees__list {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-block-end: 40px;
}

/*
 * The phone picker. Hidden everywhere by default: the script adds `is-picker`
 * once it has built the control, so with JavaScript off the pills remain —
 * long, but working.
 */
.jsx-cg-committees__picker {
	display: none;
	flex-direction: column;
	align-items: stretch;
	gap: 8px;
	width: 100%;
	margin-block-end: 32px;
}

.jsx-cg-committees__name {
	margin: 0 0 28px;
	font-family: var( --dp-font-display );
	font-size: 28px;
	line-height: 1.25;
	color: var( --dp-text-on-light );
}

/* the charter sits under its committee, reading as a document not a button */
.jsx-cg-doclink {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	min-height: 44px;
	margin-block-start: 32px;
	font-family: var( --dp-font-body );
	font-size: 16px;
	font-weight: 500;
	color: var( --dp-blue );
	text-decoration: none;
}

.jsx-cg-doclink::after {
	content: "";
	width: 15px;
	height: 12px;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
}

.jsx-cg-doclink:hover { text-decoration: underline; }

/* --- document lists ----------------------------------------------------- */

.jsx-cg-docs { width: 100%; }

/* --- the disclosures header row ---------------------------------------- */

/*
 * Title and intro left, the category control in the right corner — the live
 * site's arrangement. The filter is its own shortcode so the atomic document
 * can place it here rather than at the top of the list.
 */
/*
 * The heading row wraps rather than squeezes. Between roughly 1025 and 1300
 * the copy column plus both controls are wider than the container, and with
 * nowrap the search input was the thing that gave — down to 85px, narrower
 * than its own placeholder. Wrapping drops the pair onto its own line,
 * still right-aligned, and nothing shrinks.
 */
.elementor.elementor .jsx-cg-dischead {
	align-items: flex-end;
	flex-wrap: wrap;
}

.elementor.elementor .jsx-cg-dischead__copy {
	flex: 1 1 420px;
	max-width: 620px;
}

.elementor.elementor .jsx-cg-dischead > .elementor-widget-shortcode {
	flex: 0 0 auto;
	margin-inline-start: auto;
}

/*
 * The two controls sit as one group in the corner: search first, because it is
 * how you look for a document you can name, then the category, which is how
 * you browse. Both are labelled — a bare magnifier and a bare dropdown beside
 * each other is a guess.
 */
.jsx-cg-filter {
	display: flex;
	flex-direction: row;
	align-items: flex-end;
	gap: 12px;
}

.jsx-cg-filter__field {
	flex: 0 0 auto;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 8px;
}

/* --- the search field ---------------------------------------------------- */

.jsx-cg-search { position: relative; }

/*
 * `.elementor` prefix, not for cascade tidiness but because the parent reset
 * styles this field harder than a bare class can:
 *
 *     input[type=search] { width:100%; border:1px solid #666;
 *                          border-radius:3px; padding:.5rem 1rem }
 *
 * That is (0,1,1) — an attribute selector plus a type — and beats
 * `.jsx-cg-search__input` at (0,1,0). The field was rendering at 192px with a
 * grey 3px-radius border, none of it mine. Two classes make it (0,2,0).
 */
.elementor.elementor .jsx-cg-search__input {
	flex: 0 0 auto;
	width: 260px;
	min-height: 48px;
	/*
	 * A 48px-tall pill clamps its corners to a 24px radius, so the curve does
	 * not straighten out until 24px in. The glyph starts past that, and the
	 * text past the glyph, or both sit on the bend.
	 */
	padding-inline: 52px 24px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: var( --jsx-control-radius );
	background-color: var( --dp-white );
	background-image: var( --jsx-search-icon );
	background-repeat: no-repeat;
	background-position: 22px center;
	background-size: 16px 16px;
	font-family: var( --dp-font-body );
	font-size: 15px;
	color: var( --dp-text-on-light );
	transition: border-color 160ms ease;
}

.elementor.elementor .jsx-cg-search__input::placeholder { color: var( --dp-text-on-light-muted ); }

.elementor.elementor .jsx-cg-search__input:hover,
.elementor.elementor .jsx-cg-search__input:focus { border-color: var( --dp-blue ); outline: none; }

.elementor.elementor .jsx-cg-search__input:focus-visible {
	outline: 2px solid var( --dp-blue );
	outline-offset: 2px;
}

/*
 * Safari draws its own clear button inside a type=search, at a size and colour
 * that does not belong here; the field clears with the keyboard anyway.
 */
.elementor.elementor .jsx-cg-search__input::-webkit-search-decoration,
.elementor.elementor .jsx-cg-search__input::-webkit-search-cancel-button { -webkit-appearance: none; }

.jsx-cg-docs__count {
	margin-block-start: 12px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	color: var( --dp-text-on-light-muted );
}

.jsx-cg-docs__count:empty { display: none; }

.jsx-cg-filter__label {
	font-family: var( --dp-font-body );
	font-size: 12px;
	font-weight: 500;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var( --dp-text-on-light-muted );
}

.jsx-cg-filter__control { position: relative; }

.jsx-cg-filter__native {
	min-height: 48px;
	min-width: 280px;
	padding-inline: 24px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: var( --jsx-control-radius );
	background-color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 15px;
	color: var( --dp-text-on-light );
}

/*
 * Once the listbox is built the native select is still the value the form
 * submits, so it stays in the DOM and is taken out of the layout and the tab
 * order rather than removed.
 */
.jsx-cg-filter__native--enhanced {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	border: 0;
	overflow: hidden;
	clip-path: inset( 50% );
	white-space: nowrap;
}

.jsx-cg-filter__go {
	min-height: 48px;
	margin-inline-start: 8px;
	padding-inline: 20px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-body );
	font-size: 15px;
	color: var( --dp-white );
	cursor: pointer;
}

.jsx-cg-filter__go[hidden] { display: none; }

/* --- the listbox that replaces it -------------------------------------- */

.jsx-select { position: relative; }

.jsx-select__button {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	width: 100%;
	min-width: 280px;
	min-height: 48px;
	padding-inline: 24px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: var( --jsx-control-radius );
	background-color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 15px;
	color: var( --dp-text-on-light );
	text-align: start;
	cursor: pointer;
	transition: border-color 160ms ease;
}

.jsx-select__button:hover,
.jsx-select__button[aria-expanded="true"] { border-color: var( --dp-blue ); }

.jsx-select__value {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* a chevron drawn in CSS — one less request than an icon for two lines */
.jsx-select__chevron {
	flex: 0 0 auto;
	width: 10px;
	height: 10px;
	border-inline-end: 1.6px solid currentColor;
	border-block-end: 1.6px solid currentColor;
	transform: translateY( -2px ) rotate( 45deg );
	transition: transform 200ms ease;
}

.jsx-select__button[aria-expanded="true"] .jsx-select__chevron {
	transform: translateY( 2px ) rotate( -135deg );
}

.jsx-select__list {
	position: absolute;
	z-index: 30;
	inset-inline-start: 0;
	inset-block-start: calc( 100% + 6px );
	width: 100%;
	max-height: 320px;
	margin: 0;
	padding: 6px;
	overflow-y: auto;
	list-style: none;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 10px;
	background-color: var( --dp-white );
	box-shadow: 0 12px 32px rgba( 11, 6, 24, 0.12 );
}

.jsx-select__option {
	padding: 10px 12px;
	border-radius: 6px;
	font-family: var( --dp-font-body );
	font-size: 15px;
	line-height: 1.4;
	color: var( --dp-text-on-light );
	cursor: pointer;
}

.jsx-select__option:hover,
.jsx-select__option:focus { background-color: #F2F0FA; outline: none; }

.jsx-select__option[aria-selected="true"] {
	background-color: var( --dp-blue );
	color: var( --dp-white );
}

/* --- the list while a fetch is in flight -------------------------------- */

.jsx-cg-docs.is-loading .jsx-cg-docs__body {
	opacity: 0.45;
	pointer-events: none;
	transition: opacity 160ms ease;
}

.jsx-doclist {
	margin: 0;
	padding: 0;
	list-style: none;
	width: 100%;
	border-block-start: 1px solid var( --dp-line-on-light );
}

.jsx-doc { border-block-end: 1px solid var( --dp-line-on-light ); }

.jsx-doc__link {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 24px;
	padding-block: 18px;
	text-decoration: none;
	transition: color 160ms ease;
}

.jsx-doc__title {
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.5;
	color: var( --dp-text-on-light );
}

.jsx-doc__date {
	flex: 0 0 auto;
	font-family: var( --dp-font-body );
	font-size: 14px;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
}

.jsx-doc__link:hover .jsx-doc__title { color: var( --dp-blue ); }

.jsx-cg-docs__empty {
	font-family: var( --dp-font-body );
	color: var( --dp-text-on-light-muted );
}

/* --- pager -------------------------------------------------------------- */

.jsx-cg-pager {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin-block-start: 32px;
}

.jsx-cg-pager a,
.jsx-cg-pager span.current {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 44px;
	min-height: 44px;
	padding-inline: 14px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	font-family: var( --dp-font-body );
	font-size: 15px;
	color: var( --dp-text-on-light );
	text-decoration: none;
}

.jsx-cg-pager a:hover { border-color: var( --dp-blue ); color: var( --dp-blue ); }

.jsx-cg-pager span.current {
	background-color: var( --dp-blue );
	border-color: var( --dp-blue );
	color: var( --dp-white );
}

.jsx-cg-pager__count {
	margin-block-start: 12px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	color: var( --dp-text-on-light-muted );
}

/* --- routing rows ------------------------------------------------------- */

/*
 * The homepage pattern, on a light ground: two full-width rows, each a big
 * subhead and an arrow, separated by hairlines.
 */
.elementor.elementor .jsx-cg-routing {
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-cg-routing__row {
	max-width: 1240px;
	margin-inline: auto;
	padding-block: 44px;
	border-block-start: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-cg-routing__row:last-child { border-block-end: 1px solid var( --dp-line-on-light ); }

.elementor.elementor .jsx-cg-routing .jsx-display-sub,
.elementor.elementor .jsx-cg-routing .jsx-display-sub a { color: var( --dp-text-on-light ); text-decoration: none; }

.elementor.elementor .jsx-cg-routing__row:hover .jsx-display-sub a,
.elementor.elementor .jsx-cg-routing__row:hover .jsx-cg-routing__arrow { color: var( --dp-blue ); }

.elementor.elementor .jsx-cg-routing__arrow {
	color: var( --dp-text-on-light );
	transition: transform 240ms cubic-bezier( 0.22, 0.61, 0.36, 1 ), color 160ms ease;
}

.elementor.elementor .jsx-cg-routing__row:hover .jsx-cg-routing__arrow { transform: translateX( 8px ); }

/* --- breakpoints -------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-cg-routing { padding-inline: 40px; }
}

@media ( max-width: 1200px ) {
	.jsx-people { grid-template-columns: repeat( 3, 1fr ); }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-cg-routing { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-cg-routing__row { padding-block: 28px; }

	/* two-up, the same as every other card list on this site below 768 */
	.jsx-people,
	.jsx-people--committee { grid-template-columns: repeat( 2, 1fr ); gap: 24px 16px; }

	.jsx-person__name { font-size: 17px; }
	.jsx-person__role { font-size: 13px; }

	.jsx-cg-tabs__list,
	.jsx-cg-committees__list { gap: 8px; margin-block-end: 28px; }

	/*
	 * Seven pills stacked filled the screen before a single committee member
	 * appeared. One control instead — the same one the filters use, and the
	 * same affordance the V3 page offered ("Select a Committee:").
	 */
	.jsx-cg-committees.is-picker .jsx-cg-committees__list { display: none; }
	.jsx-cg-committees.is-picker .jsx-cg-committees__picker { display: flex; }

	.jsx-cg-committees__picker .jsx-select,
	.jsx-cg-committees__picker .jsx-select__button { width: 100%; min-width: 0; }

	/* the panel heading repeats what the picker already says */
	.jsx-cg-committees.is-picker .jsx-cg-committees__name { display: none; }

	.jsx-cg-tabs__tab,
	.jsx-cg-committees__tab { padding-inline: 16px; font-size: 14px; }

	.jsx-cg-committees__name { font-size: 22px; }

	.jsx-doc__link { flex-direction: column; align-items: flex-start; gap: 4px; padding-block: 16px; }
	.jsx-doc__title { font-size: 15px; }

	.jsx-cg-docs__filter { gap: 8px; }
	.jsx-cg-docs__select { width: 100%; }
}

/* ================ 65. Corporate Governance: the profile pop-up
 *
 * The live site opens a board member's bio in a pop-up rather than sending the
 * reader to a separate page, and loses their place in a 21-card grid. Same
 * behaviour here, rebuilt: no jQuery, our own REST route, and a real dialog —
 * Escape closes it, Tab stays inside it, and focus returns to the card.
 *
 * The card remains a link to the profile page. That is the fallback for a
 * failed fetch and for no JavaScript at all.
 */

body.dp-modal-open { overflow: hidden; }

.jsx-modal {
	position: fixed;
	inset: 0;
	z-index: 9100;          /* over the header (20) and the search overlay (9000) */
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 24px;
}

.jsx-modal__overlay {
	position: absolute;
	inset: 0;
	background-color: rgba( 11, 6, 24, 0.66 );
	animation: jsx-modal-fade 200ms ease both;
}

.jsx-modal__stage {
	position: relative;
	width: 100%;
	max-width: 760px;
	max-height: 86vh;
	animation: jsx-modal-rise 260ms cubic-bezier( 0.22, 0.61, 0.36, 1 ) both;
}

.jsx-modal__content {
	position: relative;
	max-height: 86vh;
	border-radius: 20px;
	background-color: var( --dp-white );
	overflow: hidden;
}

.jsx-modal__scroll {
	max-height: 86vh;
	padding: 40px;
	overflow-y: auto;
	overscroll-behavior: contain;
}

.jsx-modal__close {
	position: absolute;
	inset-block-start: 16px;
	inset-inline-end: 16px;
	z-index: 1;
	width: 44px;            /* WCAG 2.5.8 */
	height: 44px;
	border: 0;
	border-radius: 999px;
	background-color: rgba( 21, 19, 31, 0.06 );
	cursor: pointer;
}

.jsx-modal__close::before,
.jsx-modal__close::after {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 16px;
	height: 1.6px;
	background-color: var( --dp-text-on-light );
}

.jsx-modal__close::before { transform: translate( -50%, -50% ) rotate( 45deg ); }
.jsx-modal__close::after  { transform: translate( -50%, -50% ) rotate( -45deg ); }

.jsx-modal__close:hover { background-color: rgba( 21, 19, 31, 0.12 ); }

.jsx-modal__header {
	display: flex;
	align-items: center;
	gap: 24px;
	padding-block-end: 24px;
	margin-block-end: 24px;
	border-block-end: 1px solid var( --dp-line-on-light );
}

.jsx-modal__photo {
	flex: 0 0 auto;
	width: 120px;
	height: 120px;
	border-radius: 16px;
	object-fit: cover;
}

.jsx-modal__name {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-size: 26px;
	line-height: 1.25;
	color: var( --dp-text-on-light );
}

.jsx-modal__role {
	margin: 6px 0 0;
	font-family: var( --dp-font-body );
	font-size: 15px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-modal__bio p {
	margin: 0 0 16px;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

.jsx-modal__bio p:last-child { margin-block-end: 0; }

/* the card while its bio is being fetched */
.jsx-person__link.is-loading { opacity: 0.6; }
.jsx-person__link.is-loading .jsx-person__more::after {
	content: "…";
	margin-inline-start: 2px;
}

@keyframes jsx-modal-fade {
	from { opacity: 0; }
	to   { opacity: 1; }
}

@keyframes jsx-modal-rise {
	from { opacity: 0; transform: translateY( 16px ); }
	to   { opacity: 1; transform: none; }
}

@media ( prefers-reduced-motion: reduce ) {
	.jsx-modal__overlay,
	.jsx-modal__stage { animation: none; }

	/* the carousel still changes slide, it just stops travelling to get there */
	.jsx-charts__viewport,
	.jsx-charts__track { transition: none; }
}

@media ( max-width: 767px ) {
	.jsx-modal { padding: 0; align-items: flex-end; }

	/* a sheet, not a centred card: 120px of photo plus a long bio does not
	   fit a phone as a dialog */
	.jsx-modal__stage { max-width: none; max-height: 92vh; }
	.jsx-modal__content { max-height: 92vh; border-radius: 20px 20px 0 0; }
	.jsx-modal__scroll { max-height: 92vh; padding: 28px 20px 32px; }

	.jsx-modal__header { gap: 16px; padding-block-end: 20px; margin-block-end: 20px; }
	.jsx-modal__photo { width: 84px; height: 84px; border-radius: 12px; }
	.jsx-modal__name { font-size: 21px; }
	.jsx-modal__role { font-size: 14px; }
	.jsx-modal__bio p { font-size: 15px; }
}

/* --- the disclosures header row collapses ------------------------------- */

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-cg-dischead {
		flex-direction: column;
		align-items: flex-start;
		gap: 28px;
	}

	/*
	 * flex-basis follows the main axis: the 420px that sets a minimum COLUMN
	 * WIDTH in the row layout becomes a minimum HEIGHT once this stacks, and
	 * left 280px of blank between the intro and the search field.
	 */
	.elementor.elementor .jsx-cg-dischead__copy {
		flex: 0 0 auto;
		max-width: none;
	}

	.elementor.elementor .jsx-cg-dischead > .elementor-widget-shortcode { margin-inline-start: 0; }

	/*
	 * Once the row stacks, the filter should hold the column. Elementor's
	 * widget wrapper is the thing that shrinks to its content, so widening
	 * only the form inside it does nothing.
	 */
	.elementor.elementor .jsx-cg-dischead > .elementor-widget-shortcode { width: 100%; }

	/* stacked, the pair should fill the column rather than hug the left */
	.jsx-cg-filter { width: 100%; }
	.jsx-cg-filter__field { flex: 1 1 0%; align-items: stretch; }
	.elementor.elementor .jsx-cg-search__input,
	.jsx-select__button { width: 100%; min-width: 0; }
}

@media ( max-width: 767px ) {
	.jsx-cg-filter {
		flex-direction: column;
		align-items: stretch;
		width: 100%;
		gap: 16px;
	}

	.jsx-cg-filter__field { align-items: stretch; width: 100%; }
	.jsx-cg-filter__control,
	.jsx-select { width: 100%; }
	.jsx-select__button,
	.jsx-cg-filter__native,
	.elementor.elementor .jsx-cg-search__input { width: 100%; min-width: 0; }
}

/* ================ 66. Corporate Governance: answering hello-elementor's reset
 *
 * The parent theme's reset.css paints EVERY <button> crimson:
 *
 *     [type=button]:focus, [type=button]:hover,
 *     [type=submit]:focus, [type=submit]:hover,
 *     button:focus, button:hover { background-color: #c36; color: #fff }
 *
 * It fires on FOCUS as well as hover, which is why the pop-up's close button
 * turned crimson the moment the dialog opened and moved focus to it — no
 * pointer involved. Section 64's hover rules set a border and a text colour but
 * no background, so the reset's background was never overridden.
 *
 * Every button this page introduces therefore declares its own background AND
 * colour for :hover, :focus and :focus-visible together. Declaring hover alone
 * leaves the focus half of that selector still painting.
 *
 * The focus RING is kept — it is replaced, not removed. The reset's black
 * outline on a white halo is answered with the same blue ring the search
 * overlay uses, so keyboard users still see where they are.
 */

/* --- category pills: People and Board Committees ------------------------ */

.jsx-cg-tabs__tab:hover,
.jsx-cg-tabs__tab:focus,
.jsx-cg-tabs__tab:focus-visible,
.jsx-cg-committees__tab:hover,
.jsx-cg-committees__tab:focus,
.jsx-cg-committees__tab:focus-visible {
	background-color: #F2F0FA;
	border-color: var( --dp-blue );
	color: var( --dp-blue );
}

/* the selected pill stays brand blue through every state */
.jsx-cg-tabs__tab.is-active:hover,
.jsx-cg-tabs__tab.is-active:focus,
.jsx-cg-tabs__tab.is-active:focus-visible,
.jsx-cg-committees__tab.is-active:hover,
.jsx-cg-committees__tab.is-active:focus,
.jsx-cg-committees__tab.is-active:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
	color: var( --dp-white );
}

/* --- the category dropdown --------------------------------------------- */

.jsx-select__button:hover,
.jsx-select__button:focus,
.jsx-select__button:focus-visible,
.jsx-select__button[aria-expanded="true"] {
	background-color: var( --dp-white );
	border-color: var( --dp-blue );
	color: var( --dp-text-on-light );
}

/* --- the pop-up's close control ---------------------------------------- */

/*
 * This one is the reason the bug was visible without a mouse: the dialog moves
 * focus here as it opens, so :focus is true from the first frame.
 */
.jsx-modal__close:hover,
.jsx-modal__close:focus,
.jsx-modal__close:focus-visible {
	background-color: rgba( 21, 19, 31, 0.12 );
	color: var( --dp-text-on-light );
}

/* --- the no-JavaScript submit ------------------------------------------ */

.jsx-cg-filter__go:hover,
.jsx-cg-filter__go:focus,
.jsx-cg-filter__go:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
	color: var( --dp-white );
}

/* --- the focus ring that replaces the reset's ---------------------------- */

.jsx-cg-tabs__tab:focus-visible,
.jsx-cg-committees__tab:focus-visible,
.jsx-select__button:focus-visible,
.jsx-select__option:focus-visible,
.jsx-modal__close:focus-visible,
.jsx-cg-filter__go:focus-visible,
.jsx-cg-docs a:focus-visible,
.jsx-person__link:focus-visible {
	outline: 2px solid var( --dp-blue );
	outline-offset: 3px;
	box-shadow: none;
}

/* ================ 67. Corporate Governance: the pop-up's scrollbar
 *
 * The bios run long — Mr Tanco's is ~1,800 characters — so the pop-up always
 * scrolls, and the platform scrollbar it came with is the one thing in that
 * dialog drawn by the OS rather than by us. On macOS it is worse than plain:
 * overlay scrollbars stay hidden until the reader already started scrolling,
 * so there is no cue that there is more to read.
 *
 * Styled, and therefore always visible: a 4px thumb in brand violet at low
 * opacity, floating clear of the panel edge. `scrollbar-gutter: stable` holds
 * the space whether or not the bio overflows, so short and long bios keep the
 * same text measure instead of shifting by the scrollbar's width.
 *
 * Two syntaxes on purpose: `scrollbar-width`/`scrollbar-color` is the standard
 * one (Firefox, and Chrome 121+), `::-webkit-scrollbar` covers Safari and
 * older Chrome. Neither alone covers the browsers this site sees.
 *
 * Note they do not stack: once `scrollbar-width` is declared, Chrome 121+
 * follows the standard properties and ignores the ::-webkit- block entirely.
 * Both paths land on the same slim violet thumb, but the inset rounded barrel
 * below is what Safari draws, not what Chrome draws. Dropping
 * `scrollbar-width` would give Chrome the barrel and Firefox a full-width
 * scrollbar — a worse trade.
 */

.jsx-modal__scroll,
.jsx-select__list {
	scrollbar-gutter: stable;
	scrollbar-width: thin;
	scrollbar-color: rgba( 70, 0, 255, 0.34 ) transparent;
}

.jsx-modal__scroll::-webkit-scrollbar,
.jsx-select__list::-webkit-scrollbar {
	width: 10px;
}

.jsx-modal__scroll::-webkit-scrollbar-track,
.jsx-select__list::-webkit-scrollbar-track {
	background: transparent;
}

/*
 * The thumb is 4px of colour inside a 10px track: a transparent border plus
 * background-clip is how you inset a webkit thumb — there is no margin
 * property on it.
 */
.jsx-modal__scroll::-webkit-scrollbar-thumb,
.jsx-select__list::-webkit-scrollbar-thumb {
	border: 3px solid transparent;
	border-radius: 999px;
	background-color: rgba( 70, 0, 255, 0.34 );
	background-clip: content-box;
}

.jsx-modal__scroll::-webkit-scrollbar-thumb:hover,
.jsx-select__list::-webkit-scrollbar-thumb:hover {
	background-color: rgba( 70, 0, 255, 0.5 );
}

/* the thumb should not sit on the panel's rounded corners */
.jsx-modal__scroll::-webkit-scrollbar-thumb {
	margin-block: 12px;
}

@media ( max-width: 767px ) {
	/*
	 * Touch scrolling has its own transient indicator and the sheet is narrow,
	 * so the gutter is 20px of measure spent on nothing.
	 */
	.jsx-modal__scroll { scrollbar-gutter: auto; }
	.jsx-modal__scroll::-webkit-scrollbar { width: 6px; }
}

/* ================ 68. Corporate Governance: the structure charts
 *
 * Board Structure, Shareholding Structure and Conglomerate Map — three
 * compliance charts the V3 page carried in an Unlimited Elements slider, and
 * the one section that was missing from the rebuild.
 *
 * They are wide, dense diagrams (up to 2560x1280 with 8pt labels), so the page
 * can never render them legibly. Every slide is a link to the file, and the
 * frame says so on hover; the V3 slider made the same promise in a caption
 * ("Click/tap on the map to zoom").
 *
 * The dots reuse the tab machinery: role="tablist" with role="tab" buttons and
 * one panel each, so corp-gov.js drives them with no extra code and they are
 * keyboard operable — arrows, Home and End — like every other tab set here.
 */

.elementor.elementor .jsx-cg-stack--center { align-items: center; }

.jsx-charts { width: 100%; }

/*
 * The slide, not a swap: all three panels sit in one row and the row moves.
 *
 * The viewport's height is set by the script to the active panel, because the
 * three charts have different aspect ratios — 2.78, 2.03 and 2.00 — and a row
 * of them would otherwise stand at the tallest, leaving ~170px of white under
 * the Board Structure slide. Both the move and the height are transitioned, so
 * the frame resizes with the slide rather than after it.
 */
.jsx-charts__viewport {
	overflow: hidden;
	transition: height 420ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
}

.jsx-charts__track {
	display: flex;
	align-items: flex-start;
	width: 100%;
	/*
	 * The browser keeps vertical scrolling; horizontal is ours to interpret
	 * as a swipe. Without this the page and the carousel fight over the same
	 * gesture and the scroll stutters.
	 */
	touch-action: pan-y;
	transition: transform 480ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
	will-change: transform;
}

/*
 * flex-shrink 0, or three panels would share the width instead of queueing.
 * They stay in the flow while off-screen; the script marks them inert.
 */
.jsx-charts__panel {
	flex: 0 0 100%;
	max-width: 100%;
}

/* nothing is hidden, so the panel that is not showing must not be reachable */
.jsx-charts__panel[inert],
.jsx-charts__panel[aria-hidden="true"] { pointer-events: none; }

/*
 * The title needs the section's own spacing, and a bare class cannot give it:
 * `.elementor.elementor .jsx-display-section` (0,2,0) sets the margin and beats
 * `.jsx-charts__title` (0,1,0), which is why the gap measured 0. 40px is what
 * every other heading on this page has — the stack's 20px gap plus the
 * shortcode's 20px top margin.
 */
.elementor.elementor .jsx-charts__title {
	margin: 0 0 40px;
	text-align: center;
}

/* the second word takes the accent, as on every display heading here */
.elementor.elementor .jsx-cg-band .jsx-charts__title span { color: var( --dp-blue ); }

/*
 * The charts are drawn on white. On the tinted band that would float without
 * an edge, so the frame supplies one rather than the artwork having to.
 */
.jsx-charts__frame {
	position: relative;
	display: block;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
	background-color: var( --dp-white );
	overflow: hidden;
	transition: border-color 160ms ease, box-shadow 240ms ease;
}

.jsx-charts__frame img {
	display: block;
	-webkit-user-drag: none;
	user-select: none;
	width: 100%;
	height: auto;
}

.jsx-charts__frame:hover,
.jsx-charts__frame:focus-visible {
	border-color: var( --dp-blue );
	box-shadow: 0 16px 40px rgba( 11, 6, 24, 0.12 );
}

.jsx-charts__zoom {
	position: absolute;
	inset-block-end: 16px;
	inset-inline-end: 16px;
	padding: 8px 16px;
	border-radius: 999px;
	background-color: rgba( 21, 19, 31, 0.82 );
	font-family: var( --dp-font-body );
	font-size: 13px;
	font-weight: 500;
	color: var( --dp-white );
	opacity: 0;
	transform: translateY( 4px );
	transition: opacity 200ms ease, transform 200ms ease;
}

.jsx-charts__frame:hover .jsx-charts__zoom,
.jsx-charts__frame:focus-visible .jsx-charts__zoom {
	opacity: 1;
	transform: none;
}

/* touch has no hover, so the affordance has to be permanent there */
@media ( hover: none ) {
	.jsx-charts__zoom { opacity: 1; transform: none; }
}

.jsx-charts__dots {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	margin-block-start: 32px;
}

/*
 * The dot is 10px but the button is 44px, per WCAG 2.5.8 — the target is the
 * padding, not the mark.
 */
.jsx-charts__dot {
	position: relative;
	width: 44px;
	height: 44px;
	padding: 0;
	border: 0;
	border-radius: 999px;
	background-color: transparent;
	cursor: pointer;
}

.jsx-charts__dot::before {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 10px;
	height: 10px;
	border-radius: 999px;
	background-color: var( --dp-line-on-light );
	transform: translate( -50%, -50% );
	transition: background-color 160ms ease, width 200ms ease;
}

.jsx-charts__dot.is-active::before {
	width: 28px;
	background-color: var( --dp-blue );
}

/* the reset paints every button crimson on hover AND focus — see section 66 */
.jsx-charts__dot:hover,
.jsx-charts__dot:focus,
.jsx-charts__dot:focus-visible { background-color: transparent; }

.jsx-charts__dot:hover::before { background-color: var( --dp-blue ); }

.jsx-charts__dot:focus-visible {
	outline: 2px solid var( --dp-blue );
	outline-offset: -8px;
	box-shadow: none;
}

/* --- the short bio on a People card ------------------------------------- */

/*
 * 21 of these on the page, so they are clamped: three lines is enough to tell
 * two directors apart, and the full text is one click away in the pop-up.
 */
.jsx-person__intro {
	margin: 4px 0 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.55;
	color: var( --dp-text-on-light-muted );
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-charts__title { margin-block-end: 28px; }
	.jsx-charts__frame { border-radius: 12px; }
	.jsx-charts__dots { margin-block-start: 24px; }

	/* two lines at 2-up, or the card is mostly bio */
	.jsx-person__intro { font-size: 13px; -webkit-line-clamp: 2; }
}

/* ================ 69. Our Brand (Figma 99:128)
 *
 * Built from the approved frame. Two deliberate departures from it, both
 * flagged to Jun rather than taken quietly:
 *
 *   - The hero uses the site's inner-page band (section 57), not the frame's
 *     520px / 64px. Jun cut that hero by 30% on the news index and every inner
 *     page has followed since; matching the frame here would make this the one
 *     page out of step.
 *   - The frame's "See Our Portfolio" button is NOT built. /portfolio/ 404s,
 *     and Jun had the same button removed from the homepage for that reason.
 *
 * The bands, splits and stacks repeat the Corporate Governance structure
 * deliberately — same gutters, same container, same rhythm.
 */

.elementor.elementor .jsx-ob-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
}

/*
 * The kit's display and body classes are drawn for DARK grounds — the section
 * heading paints #EFF6FF. On this page most bands are white or lavender, where
 * that is 1.19:1 against the ground: not dim, invisible. Every light band takes
 * the on-light ink, and the two dark bands take it back.
 */
.elementor.elementor .jsx-ob-band .jsx-display-section,
.elementor.elementor .jsx-ob-band .jsx-display-sub,
.elementor.elementor .jsx-ob-band .jsx-display-statement,
.elementor.elementor .jsx-ob-band .jsx-body-lead,
.elementor.elementor .jsx-ob-band .jsx-body-base { color: var( --dp-text-on-light ); }

/*
 * The accent half of a two-tone heading, per the frame.
 *
 * `:not(.jsx-line):not(.jsx-line__i)` is load-bearing. motion.js splits every
 * `h2.jsx-display-section` into masked lines and wraps each one in spans, so a
 * bare `span` rule paints the WHOLE heading, not the accent word — "Our
 * Products" came out violet on the violet band, and "Our Values" was entirely
 * light blue instead of just "Values".
 */
.elementor.elementor .jsx-ob-band .jsx-display-section span:not( .jsx-line ):not( .jsx-line__i ),
.elementor.elementor .jsx-ob-band .jsx-display-sub span:not( .jsx-line ):not( .jsx-line__i ) {
	color: var( --dp-blue );
}

/* the body beside a photograph is the muted tone in the frame */
.elementor.elementor .jsx-ob-split__copy .jsx-body-lead { color: var( --dp-text-on-light-muted ); }

/* ...and the two bands that really are dark */
.elementor.elementor .jsx-ob-values .jsx-display-section,
.elementor.elementor .jsx-ob-products .jsx-display-section { color: var( --dp-text-on-dark ); }

.elementor.elementor .jsx-ob-values .jsx-display-section span:not( .jsx-line ):not( .jsx-line__i ) {
	color: var( --dp-light-blue );
}

.elementor.elementor .jsx-ob-stack { gap: 48px; }
.elementor.elementor .jsx-ob-stack > .elementor-widget-shortcode { width: 100%; }
.elementor.elementor .jsx-ob-stack--center { align-items: center; text-align: center; }

.elementor.elementor .jsx-ob-split { align-items: center; gap: 80px; }
.elementor.elementor .jsx-ob-split__copy { gap: 24px; }

/* --- S1 hero ------------------------------------------------------------ */

/*
 * The frame layers a photo, a scrim and a brand wash. The wash (a ::before
 * here) is retired, and the scrim -- the atomic background overlay -- is now
 * the site dark rather than navy: the header's Contact Us button is brand blue,
 * and on a blue-washed hero it disappeared into the photo (Jun, 2026-10-03).
 * Same change on every inner-page hero.
 */

.elementor.elementor .jsx-ob-hero > * { position: relative; }

/* --- S2 We Are DigiPlus ------------------------------------------------- */

.elementor.elementor .jsx-ob-photo {
	border-radius: 14px;
	object-fit: cover;
	display: block;
}

.elementor.elementor .jsx-ob-media {
	flex: 0 0 520px;
	max-width: 520px;
	min-width: 0;
}

.elementor.elementor .jsx-ob-media .jsx-ob-photo {
	width: 100%;
	aspect-ratio: 520 / 500;
	/* the decorative shape is absolute; the photo must paint over it */
	position: relative;
	z-index: 1;
}

/*
 * The brand shape: a light-blue quarter-disc BEHIND the photo, TOP RIGHT.
 *
 * Measured off the approved reference, which scales to ours at 0.705 (the
 * photo is 738px there against our 520, and its top sits 96px below the band
 * top -- exactly this band's padding, which confirms the scale). Against the
 * photo box the disc is 94px ABOVE its top edge and reaches 128px PAST its
 * right edge, 476 x 458 with the bottom-left corner rounded by the full
 * height. It must never paint over the image.
 *
 * Decorative, so it is hidden from assistive tech by being an empty element
 * with no text.
 */
.elementor.elementor .jsx-ob-shape {
	inset-block-start: -94px;
	inset-inline-end: -128px;
	z-index: 0;
	width: 476px;
	height: 458px;
	border-end-start-radius: 458px;
	background-color: var( --dp-light-blue );
	pointer-events: none;
}

/*
 * The disc deliberately bleeds past the content column -- in the reference its
 * right edge is flush with the page edge -- so the band clips it rather than
 * letting it open a horizontal scrollbar. The band carries no class of its own.
 */
.elementor.elementor [data-id="ob-we"] { overflow: hidden; }

/* --- S3 Vision & Mission ------------------------------------------------ */

.elementor.elementor .jsx-ob-vm { gap: 40px; }

.elementor.elementor .jsx-ob-vm__card {
	min-height: 400px;
	/* the frame sets both cards on brand light-blue */
	background-color: var( --dp-light-blue );
}

/*
 * The label is a pill that hugs its word, not a full-width bar. `align-self`
 * and `flex: 0 0 auto` are not enough on their own: Elementor's flexbox base
 * gives the container an explicit `width: 100%`, and an explicit width is what
 * the used size comes from -- the item cannot shrink to its content no matter
 * how it is aligned. It measured 520px around an 80px word.
 */
.elementor.elementor .jsx-ob-vm__label {
	flex: 0 0 auto;
	align-self: flex-start;
	width: fit-content;
}

.elementor.elementor .jsx-ob-vm__label .jsx-ui-label { color: var( --dp-text-on-dark ); }

/* the statement sits on light blue, so it takes the on-light ink */
.elementor.elementor .jsx-ob-vm__card .jsx-display-statement { color: var( --dp-text-on-light ); }

/*
 * Both statements have to start on the same line as each other. The cards are
 * flex columns carrying `justify-content: space-between`, so each statement was
 * pinned to the bottom of its OWN card -- the two-line vision therefore started
 * two lines below the four-line mission.
 *
 * Subgrid fixes it with no magic number: the pair shares one set of rows, and
 * the row holding the statement is sized once, by whichever card's copy is
 * taller. The shorter statement then begins on the taller one's first line, and
 * nothing needs re-measuring when the copy changes length.
 *
 * Five rows, not three. A subgrid item is sized by the tracks it spans, so its
 * own `padding-block` reserves no track space -- left on the card, the longer
 * statement sat 20px inside its own bottom padding. Rows 1 and 5 carry that
 * padding instead, and the card's `padding-block` is zeroed.
 *
 * The slack row (3) absorbs the spare height, so the block stays bottom-weighted
 * exactly as the frame has it: the LONGER statement does not move, only the
 * shorter one rises to meet it. Its 32px floor also replaces the card's `gap`,
 * which would otherwise have been applied at every row boundary.
 *
 * Items are placed explicitly. With `span 5` and two children, auto-placement
 * would drop them into rows 1 and 2 and leave the rest empty.
 *
 * Below 768 the cards stack and each is sized by its own content, so this is
 * scoped to the side-by-side range only.
 */
@media ( min-width: 768px ) {
	.elementor.elementor .jsx-ob-vm {
		display: grid;
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
		grid-template-rows: 40px auto minmax( 32px, 1fr ) auto 40px;
		column-gap: 40px;
		row-gap: 0;
		/*
		 * The frame's 400px floor lives on the PARENT now -- a subgrid item cannot
		 * grow itself. The slack row absorbs the remainder, and the whole block
		 * grows past the floor when the copy needs it to.
		 */
		min-height: 400px;
	}

	.elementor.elementor .jsx-ob-vm__card {
		display: grid;
		grid-row: span 5;
		grid-template-rows: subgrid;
		row-gap: 0;
		padding-block: 0;
	}

	.elementor.elementor .jsx-ob-vm__card > .jsx-ob-vm__label { grid-row: 2; }
	.elementor.elementor .jsx-ob-vm__card > .jsx-display-statement { grid-row: 4; }
}

/* --- S4 Our Values ------------------------------------------------------ */

/*
 * Elementor's .e-grid-base ships `grid-template-rows: repeat( 2, 1fr )`, which
 * leaves a full empty row whenever the card count fills only one. Every grid
 * here is auto-flow, so the row track is always reset to auto.
 */
.elementor.elementor .jsx-ob-valgrid,
.jsx-ob-valgrid {
	display: grid;
	grid-template-columns: repeat( 3, 1fr );
	grid-template-rows: auto;
	gap: 40px;
	/* .e-grid-base also pads 10px, which would inset the cards from the title */
	padding: 0;
	width: 100%;
}

/*
 * The card holds the design's ratio; the copy sits in its lower half, the zone
 * the illustration was drawn to leave clear.
 *
 * The artwork is an ordinary Elementor image widget pinned behind the text by
 * CSS, NOT a container background — `background-image: url()` written into an
 * atomic local style does not survive the save, and the first build rendered
 * six empty cards because of it. As a widget it is also the thing a client can
 * swap in Elementor without opening a style panel.
 */
.elementor.elementor .jsx-ob-val {
	aspect-ratio: 386 / 732;
	background-color: var( --dp-lavender );
}

.elementor.elementor .jsx-ob-val__img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center top;
}

/* the copy has to sit above the artwork it is printed on */
.elementor.elementor .jsx-ob-val__title,
.elementor.elementor .jsx-ob-val__body { position: relative; z-index: 1; }

/*
 * The artwork carries the icon in its top half and a clean gradient below, so
 * the text sits in a zone the illustration was drawn to leave empty. Black
 * type, no wash: white fails the contrast check on four of the six cards.
 */
.elementor.elementor .jsx-ob-val__title {
	margin: 0;
	/*
	 * Owners, the subhead face, rather than the body face -- these read as
	 * labels on the artwork, not as running text. Typekit serves owners at 200,
	 * 400, 500 and 700, so 500 is a real weight here, not synthesised.
	 */
	font-family: var( --dp-font-subhead );
	font-size: 22px;
	font-weight: 500;
	line-height: 1.28;
	letter-spacing: -0.11px;
	text-align: center;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ob-val__body {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	text-align: center;
	color: var( --dp-text-on-light );
}

/*
 * Every card's body copy has to start on the same line as its neighbours'. The
 * cards were equal-height flex columns, bottom-anchored, so a five-line body
 * began a line lower than a six-line one -- and a long body could push its
 * title up into the artwork, which is how CUSTOMER FIRST came to sit on the
 * dark gear and fail contrast.
 *
 * Subgrid, so each row of cards shares one title row and one body row: the
 * body row is sized once, by that row's longest copy, and every body in it
 * starts at the same y. Nothing to re-measure when the copy changes.
 *
 * The artwork zone is the hard part. A subgrid item is sized by the tracks it
 * spans, so the card's `aspect-ratio` can no longer set its height -- and a
 * percentage zone cannot work either, because a narrower card is SHORTER but
 * its copy wraps LONGER (a fixed 62% overflowed by 27px at 1340 and 46px at
 * 768). So the zone is sized off the card's WIDTH instead, by `::after` with
 * `aspect-ratio: 1 / 1.05`. The artwork scales with width too, so the gap
 * between plinth and title is the same at every size. Measured off the six
 * images, the lowest plinth ends at 0.98x the image width (CUSTOMER FIRST);
 * 1.05 clears it with room.
 *
 * The card's height is now zone + copy rather than the 386/732 ratio. It comes
 * out a little shorter than the artwork, so `cover` trims the soft glow at the
 * bottom of the image -- the icon itself never rescales.
 *
 * Rows per card: zone, title, body, 32px foot. The gaps between rows of cards
 * are their own tracks, so every card is placed explicitly: auto-placement with
 * `span 4` would drop the second row of cards onto the gap track. This assumes
 * the six values; a seventh card needs a row added here.
 *
 * Doubled classes, because the 768-1024 rule further down sets `gap: 28px`,
 * which would otherwise restore a gutter between every track of every card.
 *
 * Scoped to 768 and up. Below that the card already drops its ratio for a
 * content-driven height with its own gradient ground.
 */
@media ( min-width: 768px ) {
	.elementor.elementor .jsx-ob-valgrid.jsx-ob-valgrid {
		row-gap: 0;
		grid-template-rows:
			auto auto auto 32px
			40px
			auto auto auto 32px;
	}

	.elementor.elementor .jsx-ob-val.jsx-ob-val {
		display: grid;
		grid-template-columns: minmax( 0, 1fr );
		grid-template-rows: subgrid;
		row-gap: 0;
		aspect-ratio: auto;
		padding: 0;
	}

	.elementor.elementor .jsx-ob-val.jsx-ob-val:nth-child( -n + 3 ) { grid-row: 1 / span 4; }
	.elementor.elementor .jsx-ob-val.jsx-ob-val:nth-child( n + 4 ) { grid-row: 6 / span 4; }

	/*
	 * The artwork zone: an invisible box whose height is 1.05x the card's width.
	 * `::after`, not `::before` -- Elementor draws a container's background
	 * overlay on `.e-con::before` (absolute, inset 0), which would take this box
	 * out of the grid flow and leave the zone 0px tall. `::after` is unused here
	 * above 768; below it, the same pseudo-element is the gradient ground.
	 */
	.elementor.elementor .jsx-ob-val.jsx-ob-val::after {
		content: "";
		grid-row: 1;
		grid-column: 1;
		align-self: start;
		aspect-ratio: 1 / 1.05;
	}

	.elementor.elementor .jsx-ob-val.jsx-ob-val > .jsx-ob-val__title {
		grid-row: 2;
		grid-column: 1;
		/* a one-line label sits on the line a two-line neighbour ends on */
		align-self: end;
		padding-inline: 32px;
	}

	.elementor.elementor .jsx-ob-val.jsx-ob-val > .jsx-ob-val__body {
		grid-row: 3;
		grid-column: 1;
		align-self: start;
		/* the card's own 12px gap, which `row-gap: 0` takes away */
		margin-block-start: 12px;
		padding-inline: 32px;
	}
}

/*
 * Two columns up to 1179, not 1024. Three-up was measured across the range: at
 * 1025 the card is 283px wide, the copy wraps so long the card grows 20% past
 * its artwork's ratio, `cover` scales the icon up 1.2x, and the plinth lands
 * 20px inside the title. Three-up only holds from a ~335px card, which is 1180.
 * (The old bottom-anchored layout was worse here -- the copy rode 90px up over
 * the plinth at 1025.) Only this grid moves; the shared 1024 block below is
 * left alone.
 */
@media ( min-width: 768px ) and ( max-width: 1179px ) {
	.elementor.elementor .jsx-ob-valgrid.jsx-ob-valgrid {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
		column-gap: 28px;
		grid-template-rows:
			auto auto auto 32px
			28px
			auto auto auto 32px
			28px
			auto auto auto 32px;
	}

	.elementor.elementor .jsx-ob-val.jsx-ob-val:nth-child( -n + 2 ) { grid-row: 1 / span 4; }
	.elementor.elementor .jsx-ob-val.jsx-ob-val:nth-child( n + 3 ) { grid-row: 6 / span 4; }
	.elementor.elementor .jsx-ob-val.jsx-ob-val:nth-child( n + 5 ) { grid-row: 11 / span 4; }
}

/* --- S7 Our Products ----------------------------------------------------- */

/*
 * The design puts a violet band behind the top half of this section and lets
 * the cards hang over its lower edge. A pseudo-element rather than a second
 * container: the band is decoration, and the cards need to sit above it.
 */
.elementor.elementor .jsx-ob-products { position: relative; }
.elementor.elementor .jsx-ob-products::before {
	content: "";
	position: absolute;
	inset-block-start: 0;
	inset-inline: 0;
	height: 520px;
	background-image: linear-gradient( 90deg, #4600A8 0%, #4600FF 100% );
	pointer-events: none;
}

.elementor.elementor .jsx-ob-prodgrid {
	display: grid;
	grid-template-columns: repeat( 3, 1fr );
	grid-template-rows: auto;
	gap: 40px;
	/* .e-grid-base also pads 10px, which would inset the cards from the title */
	padding: 0;
	width: 100%;
}

.elementor.elementor .jsx-ob-prod {
	aspect-ratio: 386 / 560;
	text-decoration: none;
}

.elementor.elementor .jsx-ob-prod__bg {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/*
 * The scrim only covers the lower 320px, where the copy sits — the artwork
 * above it is the point of the card and must not be dimmed.
 */
.elementor.elementor .jsx-ob-prod::after {
	content: "";
	position: absolute;
	inset-block-end: 0;
	inset-inline: 0;
	height: 320px;
	background-image: linear-gradient( to bottom, rgba( 0, 0, 0, 0 ) 0%, rgba( 0, 0, 0, 0.34 ) 55%, rgba( 0, 0, 0, 0.66 ) 100% );
	pointer-events: none;
	z-index: 0;
}

.elementor.elementor .jsx-ob-prod__body {
	position: relative;
	z-index: 1;
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
}

.elementor.elementor .jsx-ob-prod__lockup {
	width: 240px;
	height: 90px;
	object-fit: contain;
	margin-block: auto;
}

.elementor.elementor .jsx-ob-prod__text {
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	text-align: center;
	color: var( --dp-text-on-dark );
}

/* --- S5 Our story ------------------------------------------------------- */

.elementor.elementor .jsx-ob-cols { gap: 120px; }
.elementor.elementor .jsx-ob-cols .jsx-body-base { text-align: start; }

/* --- S6 Vision statement ------------------------------------------------ */

.elementor.elementor .jsx-ob-vision .jsx-ob-split { align-items: center; }

/*
 * The photo is a flex ITEM of the split row, so `width: 100%` resolves against
 * the WHOLE row, not the photo's share of it. Paired with the body's
 * `flex: 1 1 0%` that handed the image everything and set the statement at
 * min-content -- one word to the line at 1280. Size it with flex instead, and
 * clear the automatic minimum so it can genuinely shrink.
 */
.elementor.elementor .jsx-ob-vision .jsx-ob-photo {
	flex: 0 1 640px;
	width: 640px;
	min-width: 0;
	max-width: 100%;
	aspect-ratio: 640 / 420;
}

/* --- breakpoints -------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-ob-band { padding-inline: 40px; }
	.elementor.elementor .jsx-ob-split { gap: 48px; }
	.elementor.elementor .jsx-ob-cols { gap: 64px; }
	/*
	 * A rigid basis here made the copy column NARROWER as the viewport shrank
	 * (717px at 1280 but 311px at 834), because all the positive free space went
	 * to the copy while the media never yielded. Share the row instead; the
	 * media keeps its 520 ceiling so 1440 is unchanged.
	 */
	.elementor.elementor .jsx-ob-media { flex: 1 1 0%; max-width: 520px; }
}

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-ob-band { padding-block: 72px; }
	.elementor.elementor .jsx-ob-valgrid,
	.elementor.elementor .jsx-ob-valgrid { grid-template-columns: repeat( 2, 1fr ); gap: 28px; }
	.elementor.elementor .jsx-ob-prodgrid { gap: 24px; }

	/* the shape is decoration; at this width it only crowds the photo */
	.elementor.elementor .jsx-ob-shape { display: none; }

	/* a fixed 640 photo would leave the statement ~250px here; split the row */
	.elementor.elementor .jsx-ob-vision .jsx-ob-photo { flex: 1 1 0%; width: auto; max-width: 50%; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-ob-band { padding-block: 56px; padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-ob-stack { gap: 32px; }

	.elementor.elementor .jsx-ob-split {
		flex-direction: column;
		align-items: flex-start;
		gap: 32px;
	}

	.elementor.elementor .jsx-ob-media,
	.elementor.elementor .jsx-ob-vision .jsx-ob-photo { flex: 0 0 auto; max-width: none; width: 100%; }

	.elementor.elementor .jsx-ob-vm { flex-direction: column; gap: 20px; }

	/*
	 * `flex: 0 0 auto` is the important one. The cards carry Elementor's
	 * `flex: 1 1 0%`, which sizes the MAIN axis -- width while the row is a row,
	 * but HEIGHT once this stacks into a column. With a 0 basis in an auto-height
	 * column both cards take an equal share instead of their content, so the
	 * longer Mission copy was rendering outside the blue card entirely.
	 */
	.elementor.elementor .jsx-ob-vm__card { flex: 0 0 auto; min-height: 0; padding: 28px; }

	.elementor.elementor .jsx-ob-cols { flex-direction: column; gap: 24px; }

	/*
	 * Two-up below 768, matching every other card list here — Jun's call.
	 * These are 1:1.9 portraits carrying ~40 words, so at half a phone the type
	 * has to come down with them or the body sets to about four characters a
	 * line; the sizes below are the other half of this decision, and the card
	 * padding drops to 16 to buy the measure back.
	 */
	.elementor.elementor .jsx-ob-valgrid,
	.elementor.elementor .jsx-ob-valgrid { grid-template-columns: repeat( 2, 1fr ); gap: 12px; }

	/*
	 * Below 768 this grid IS the §36 scroll-snap carousel, which supplies the
	 * flow, track size, overflow and snapping. Only these two are re-stated:
	 * §69 declares them later in the file than §36, so its desktop
	 * `repeat(3, 1fr)` and the ≤1024 `gap: 24px` would otherwise win and put
	 * the three cards back into a static row.
	 */
	.elementor.elementor .jsx-ob-prodgrid { grid-template-columns: none; gap: 16px; }
	.elementor.elementor .jsx-ob-prod { padding: 80px 16px 24px; }
	.elementor.elementor .jsx-ob-prod__lockup { width: 100%; height: 56px; }
	.elementor.elementor .jsx-ob-prod__text { font-size: 14px; }
	.elementor.elementor .jsx-ob-products::before { height: 380px; }
	/*
	 * The card must stop holding 386/732 here. At 162px wide that ratio gives a
	 * 306px box, and these bodies run to ~205 characters -- about 11 lines --
	 * so the copy rode up over the 3D artwork. Height becomes content-driven
	 * and the top padding reserves the art zone instead; the grid stretches the
	 * pair in each row to a common height.
	 */
	.elementor.elementor .jsx-ob-val {
		aspect-ratio: auto;
		padding: 150px 14px 18px;
		gap: 6px;
	}

	/*
	 * The artwork is `cover`, so it scales WITH the card: raising the top
	 * padding makes the card taller, which makes the icon bigger, which pushes
	 * it back under the copy. There is no padding that settles it. So the copy
	 * gets its own ground instead -- the same device the product cards use in
	 * §69, inverted for dark ink on light artwork. The icon above stays clear
	 * and its base fades out rather than colliding with the title.
	 */
	.elementor.elementor .jsx-ob-val::after {
		content: "";
		position: absolute;
		inset: 120px 0 0 0;
		background-image: linear-gradient(
			to bottom,
			rgba( 255, 255, 255, 0 ) 0%,
			rgba( 255, 255, 255, 0.88 ) 22%,
			rgba( 255, 255, 255, 0.96 ) 100%
		);
		pointer-events: none;
		z-index: 0;
	}
	.elementor.elementor .jsx-ob-val__title { font-size: 15px; line-height: 1.25; }
	.elementor.elementor .jsx-ob-val__body { font-size: 12px; line-height: 1.5; }
}

/* === §70 Our Brand — key visual, portfolio CTA, Connect with us ========= */

/* --- the full-bleed key visual ------------------------------------------ */

/*
 * A band with no padding at all: the artwork runs edge to edge between the
 * story band above and the vision band below, as the approved layout shows.
 * The element carries no local style, so its box is declared here.
 */
.elementor.elementor .jsx-ob-keyvisual {
	width: 100%;
	padding: 0;
	display: block;
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-ob-keyvisual__img {
	display: block;
	width: 100%;
	height: auto;
}

/* --- View Our Portfolio, under the product cards ------------------------ */

.elementor.elementor .jsx-ob-prod-cta {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 48px;
	margin-block-start: 8px;
	padding-block: 12px;
	/*
	 * The house CTA shape, same as jsx-su-cta / jsx-ir-cta / jsx-rg-cta /
	 * jsx-car-cta / jsx-cg-btn: 8px radius, 28px inline padding, weight 500.
	 * This button used to be an 80px pill at weight 600 -- the only one on the
	 * site -- which read as a different component.
	 */
	padding-inline: 28px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	font-family: var( --dp-font-subhead );
	font-size: 16px;
	font-weight: 500;
	line-height: 1.2;
	/*
	 * This lands on WHITE, not on the violet: the band has no background of its
	 * own -- the violet is a 520px ::before at the top of it, and the cards
	 * deliberately overhang onto the page. A white pill here was invisible.
	 */
	background-color: var( --dp-blue );
	color: var( --dp-text-on-dark );
	text-decoration: none;
	transition: background-color 0.2s ease, color 0.2s ease;
}

/*
 * Painted properties only -- see §66. The box stays in the rule above so the
 * responsive overrides can still reach it.
 */
.elementor.elementor .jsx-ob-prod-cta:hover,
.elementor.elementor .jsx-ob-prod-cta:focus,
.elementor.elementor .jsx-ob-prod-cta:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
	color: var( --dp-text-on-dark );
	text-decoration: none;
}

/* --- Connect with us ---------------------------------------------------- */

/*
 * The photograph carries a 90% white wash: the reference runs the copy straight
 * over the image, and at full strength the body text falls under AA. The wash
 * lives in CSS rather than on the element because `background-image: url()` in
 * an atomic local style does not survive the save (see §69).
 */
.elementor.elementor .jsx-ob-connect {
	width: 100%;
	display: flex;
	justify-content: center;
	background-color: var( --dp-white );
	background-image:
		linear-gradient( rgba( 255, 255, 255, 0.9 ), rgba( 255, 255, 255, 0.9 ) ),
		url( "/wp-content/uploads/2026/09/js-connect-bg.webp" );
	background-repeat: no-repeat;
	background-position: center;
	background-size: cover;
}

.elementor.elementor .jsx-ob-connect__inner {
	width: 100%;
	max-width: var( --dp-container );
	padding: 0;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 20px;
}

/*
 * The eyebrow's mark is the brand quarter-disc at small size, tying this band
 * to the shape behind the photo in S2.
 */
.elementor.elementor .jsx-ob-connect__eyebrow {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-size: 18px;
	font-weight: 700;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ob-connect__eyebrow::before {
	content: "";
	flex: 0 0 auto;
	width: 16px;
	height: 16px;
	border-end-start-radius: 16px;
	background-color: var( --dp-light-blue );
}

.elementor.elementor .jsx-ob-connect__title { margin: 0; }

.elementor.elementor .jsx-ob-connect__intro {
	max-width: 900px;
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ob-connectgrid {
	width: 100%;
	margin-block-start: 28px;
	display: grid;
	grid-template-columns: repeat( 2, 1fr );
	/* .e-grid-base ships a fixed two-row track -- see §69 */
	grid-template-rows: auto;
	gap: 44px 80px;
	padding: 0;
}

.elementor.elementor .jsx-ob-social {
	display: flex;
	flex-direction: row;
	align-items: flex-start;
	gap: 18px;
	padding: 0;
}

.elementor.elementor .jsx-ob-social__icon {
	flex: 0 0 auto;
	width: 30px;
	height: 30px;
	padding: 0;
	background-color: var( --dp-text-on-light );
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	transition: background-color 0.2s ease;
}

.elementor.elementor .jsx-ob-social__icon--fb {
	-webkit-mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/></svg>" );
	mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/></svg>" );
}

.elementor.elementor .jsx-ob-social__icon--tt {
	-webkit-mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z'/></svg>" );
	mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z'/></svg>" );
}

.elementor.elementor .jsx-ob-social__icon--ig {
	-webkit-mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12 0C8.74 0 8.333.015 7.053.072 5.775.132 4.905.333 4.14.63c-.789.306-1.459.717-2.126 1.384S.935 3.35.63 4.14C.333 4.905.131 5.775.072 7.053.012 8.333 0 8.74 0 12s.015 3.667.072 4.947c.06 1.277.261 2.148.558 2.913.306.788.717 1.459 1.384 2.126.667.666 1.336 1.079 2.126 1.384.766.296 1.636.499 2.913.558C8.333 23.988 8.74 24 12 24s3.667-.015 4.947-.072c1.277-.06 2.148-.262 2.913-.558.788-.306 1.459-.718 2.126-1.384.666-.667 1.079-1.335 1.384-2.126.296-.765.499-1.636.558-2.913.06-1.28.072-1.687.072-4.947s-.015-3.667-.072-4.947c-.06-1.277-.262-2.149-.558-2.913-.306-.789-.718-1.459-1.384-2.126C21.319 1.347 20.651.935 19.86.63c-.765-.297-1.636-.499-2.913-.558C15.667.012 15.26 0 12 0zm0 2.16c3.203 0 3.585.016 4.85.071 1.17.055 1.805.249 2.227.415.562.217.96.477 1.382.896.419.42.679.819.896 1.381.164.422.36 1.057.413 2.227.057 1.266.07 1.646.07 4.85s-.015 3.585-.074 4.85c-.061 1.17-.256 1.805-.421 2.227-.224.562-.479.96-.899 1.382-.419.419-.824.679-1.38.896-.42.164-1.065.36-2.235.413-1.274.057-1.649.07-4.859.07-3.211 0-3.586-.015-4.859-.074-1.171-.061-1.816-.256-2.236-.421-.569-.224-.96-.479-1.379-.899-.421-.419-.69-.824-.9-1.38-.165-.42-.359-1.065-.42-2.235-.045-1.26-.061-1.649-.061-4.844 0-3.196.016-3.586.061-4.861.061-1.17.255-1.814.42-2.234.21-.57.479-.96.9-1.381.419-.419.81-.689 1.379-.898.42-.166 1.051-.361 2.221-.421 1.275-.045 1.65-.06 4.859-.06l.045.03zm0 3.678a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 1 0 0-12.324zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm7.846-10.405a1.441 1.441 0 0 1-2.88 0 1.44 1.44 0 0 1 2.88 0z'/></svg>" );
	mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12 0C8.74 0 8.333.015 7.053.072 5.775.132 4.905.333 4.14.63c-.789.306-1.459.717-2.126 1.384S.935 3.35.63 4.14C.333 4.905.131 5.775.072 7.053.012 8.333 0 8.74 0 12s.015 3.667.072 4.947c.06 1.277.261 2.148.558 2.913.306.788.717 1.459 1.384 2.126.667.666 1.336 1.079 2.126 1.384.766.296 1.636.499 2.913.558C8.333 23.988 8.74 24 12 24s3.667-.015 4.947-.072c1.277-.06 2.148-.262 2.913-.558.788-.306 1.459-.718 2.126-1.384.666-.667 1.079-1.335 1.384-2.126.296-.765.499-1.636.558-2.913.06-1.28.072-1.687.072-4.947s-.015-3.667-.072-4.947c-.06-1.277-.262-2.149-.558-2.913-.306-.789-.718-1.459-1.384-2.126C21.319 1.347 20.651.935 19.86.63c-.765-.297-1.636-.499-2.913-.558C15.667.012 15.26 0 12 0zm0 2.16c3.203 0 3.585.016 4.85.071 1.17.055 1.805.249 2.227.415.562.217.96.477 1.382.896.419.42.679.819.896 1.381.164.422.36 1.057.413 2.227.057 1.266.07 1.646.07 4.85s-.015 3.585-.074 4.85c-.061 1.17-.256 1.805-.421 2.227-.224.562-.479.96-.899 1.382-.419.419-.824.679-1.38.896-.42.164-1.065.36-2.235.413-1.274.057-1.649.07-4.859.07-3.211 0-3.586-.015-4.859-.074-1.171-.061-1.816-.256-2.236-.421-.569-.224-.96-.479-1.379-.899-.421-.419-.69-.824-.9-1.38-.165-.42-.359-1.065-.42-2.235-.045-1.26-.061-1.649-.061-4.844 0-3.196.016-3.586.061-4.861.061-1.17.255-1.814.42-2.234.21-.57.479-.96.9-1.381.419-.419.81-.689 1.379-.898.42-.166 1.051-.361 2.221-.421 1.275-.045 1.65-.06 4.859-.06l.045.03zm0 3.678a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 1 0 0-12.324zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm7.846-10.405a1.441 1.441 0 0 1-2.88 0 1.44 1.44 0 0 1 2.88 0z'/></svg>" );
}

.elementor.elementor .jsx-ob-social__icon--li {
	-webkit-mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/></svg>" );
	mask-image: url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/></svg>" );
}

.elementor.elementor .jsx-ob-social__body {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 6px;
	padding: 0;
	min-width: 0;
}

.elementor.elementor .jsx-ob-social__title {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-size: 18px;
	font-weight: 700;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ob-social__copy {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/*
 * An e-button rendered as a link: the button base paints a box this does not
 * want, so the box is cleared and only the label remains. 44px of height keeps
 * the target inside WCAG 2.5.8.
 */
.elementor.elementor .jsx-ob-social__cta {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	padding: 0;
	border: 0;
	border-radius: 0;
	background-color: transparent;
	font-family: var( --dp-font-subhead );
	font-size: 16px;
	font-weight: 700;
	line-height: 1.3;
	color: var( --dp-blue );
	text-decoration: none;
}

.elementor.elementor .jsx-ob-social__cta:hover,
.elementor.elementor .jsx-ob-social__cta:focus,
.elementor.elementor .jsx-ob-social__cta:focus-visible {
	background-color: transparent;
	color: var( --dp-violet );
	text-decoration: underline;
}

.elementor.elementor .jsx-ob-social:hover .jsx-ob-social__icon { background-color: var( --dp-blue ); }

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-ob-connectgrid { gap: 36px 48px; }
	.elementor.elementor .jsx-ob-connect__intro { font-size: 18px; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-ob-connectgrid { grid-template-columns: 1fr; gap: 28px; margin-block-start: 20px; }
	.elementor.elementor .jsx-ob-connect__intro { font-size: 17px; }
	.elementor.elementor .jsx-ob-connect__eyebrow { font-size: 16px; }
	.elementor.elementor .jsx-ob-social__icon { width: 26px; height: 26px; }
	.elementor.elementor .jsx-ob-prod-cta { width: 100%; }
}


/* --- the products/vision seam ------------------------------------------- */

/*
 * The products band ends on a centred CTA and the Vision & Mission band that
 * follows starts on white, so the two band paddings stacked into a single
 * 192px void under the button -- measured, not estimated. Dropping this band's
 * bottom padding leaves the next band's own padding to do the work, which is
 * exactly one step of the site's rhythm. The CTA still sits nearer its own
 * cards (56px) than the section below it (96px), so it still reads as part of
 * the products.
 *
 * IT LIVES AT THE END OF THE FILE ON PURPOSE. Every breakpoint re-declares
 * `padding-block` on `.jsx-ob-band` as a SHORTHAND, which resets the end value
 * again at each width -- placed earlier this read 96px on desktop but 112px on
 * a phone. After the media queries it holds everywhere.
 *
 * This is a SEAM rule, not a property of the band: if the section order
 * changes, re-check what follows it.
 */
.elementor.elementor .jsx-ob-products { padding-block-end: 0; }

/* =============================================================================
 * 71. Our Portfolio (page 14710) — Figma 400:3 desktop / 511:3 mobile
 *
 * Six sections live here; the seventh in the frames is the footer, which is the
 * global one and is not touched. Section order: hero, anchor nav, at a glance,
 * digital platforms, physical investments, explore more.
 * ========================================================================== */

:root {
	/*
	 * --jsx-arrow in the two other inks this page needs. Same geometry, same
	 * reason it is inlined: a button arrow should not cost a request.
	 */
	--jsx-arrow-white: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 12' fill='none'%3E%3Cpath d='M1 6h12M8.5 1.5 13 6l-4.5 4.5' stroke='%23ffffff' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	--jsx-arrow-ink: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 12' fill='none'%3E%3Cpath d='M1 6h12M8.5 1.5 13 6l-4.5 4.5' stroke='%2315131f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	--jsx-arrow-blue: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 12' fill='none'%3E%3Cpath d='M1 6h12M8.5 1.5 13 6l-4.5 4.5' stroke='%234600ff' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	--jsx-download-white: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M8 1.5v8.5M8 10 4.6 6.6M8 10l3.4-3.4M2.2 13.8h11.6' stroke='%23ffffff' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	--jsx-download-blue: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M8 1.5v8.5M8 10 4.6 6.6M8 10l3.4-3.4M2.2 13.8h11.6' stroke='%234600ff' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	--jsx-play-blue: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 26' fill='none'%3E%3Cpath d='M0 0 L22 13 L0 26 Z' fill='%234600ff'/%3E%3C/svg%3E");
}

/* --- bands and the shared container ---------------------------------- */

.elementor.elementor .jsx-pf-band {
	width: 100%;
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	display: flex;
	flex-direction: column;
}

.elementor.elementor .jsx-pf-band--tint { background-color: #faf9fd; }

/*
 * "Expanded Digital Entertainment" (ArenaSocial, Drama Reels): its own band since 2026-10-12, and Jun asked
 * for a colour that separates it from the Market-Leading band above. The house wash (same gradient as
 * Investor Relations' and the portfolio detail's --wash bands): clearly apart from the white band above,
 * and its blue cast keeps it distinct from the neutral --tint of Physical Investments below. A dark band
 * was rejected — it would make the secondary offerings louder than the three flagship platforms.
 *
 * Cards sit on white inside it: their own brand tints (#e9eefc / #edecf6) vanished into the wash, so the
 * poster and the brand-coloured rule carry the brand here instead. (0,4,0) beats the (0,3,0) brand tints.
 */
.elementor.elementor .jsx-pf-band--wash { background-image: linear-gradient( 90deg, #f4f1fe 0%, #eef6ff 100% ); }
.elementor.elementor .jsx-pf-band--wash .jsx-pf-card { background-image: none; background-color: var( --dp-white ); }

.elementor.elementor .jsx-pf-inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
	padding: 0;
	display: flex;
	flex-direction: column;
}

.elementor.elementor .jsx-pf-head {
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 20px;
	margin-block-end: 56px;
}

.elementor.elementor .jsx-pf-head__title { color: var( --dp-text-on-light ); max-width: 900px; }
.elementor.elementor .jsx-pf-head__lead { color: var( --dp-text-on-light-muted ); max-width: 760px; }

/*
 * The anchor target has to clear the fixed header AND this page's sticky nav,
 * which is 72px tall — the global 60px allowance is tuned to a shorter bar.
 */
.elementor .jsx-pf-glance .elementor-menu-anchor,
.elementor .jsx-pf-band .elementor-menu-anchor {
	scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 74px );
}

/* --- the eyebrow ------------------------------------------------------ */

.elementor.elementor .jsx-pf-eyebrow {
	padding: 0;
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: 10px;
}

/*
 * Figma draws the marker as a vector, but the path is just a 14px square with
 * the bottom-right quarter swept out by a radius of 14. One border-radius
 * reproduces it exactly and stays sharp at any zoom, with no asset to ship.
 */
.elementor.elementor .jsx-pf-eyebrow__mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	padding: 0;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

.elementor.elementor .jsx-pf-eyebrow__text { color: var( --dp-light-blue ); }

/* --- S1 hero ---------------------------------------------------------- */

.elementor.elementor .jsx-pf-hero {
	width: 100%;
	overflow: hidden;
	position: relative;
	padding-block-start: 150px;
	padding-block-end: 116px;
	padding-inline: var( --dp-gutter );
	background-color: #0b0618;
	/*
	 * Dark scrim, not navy + brand wash: the header CTA is brand blue (2026-10-03).
	 * Strength settled at .66–.70 the same day: .60 left the 18px sub weak over
	 * light shirts (Jun), .72–.76 was "too dark" (Jun). Worst-case white text in
	 * the headline band is ~7.8:1 here. Same strength on every inner hero.
	 */
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.66 ) 0%, rgba( 11, 6, 24, 0.70 ) 34%, rgba( 11, 6, 24, 0.68 ) 80%, rgba( 11, 6, 24, 0.64 ) 100% ),
		url( "/wp-content/uploads/2026/03/retail-network-branches-scaled.jpg" );
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
}

.elementor.elementor .jsx-pf-hero__inner {
	width: 100%;
	max-width: var( --dp-container );
	padding: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 16px;
}

.elementor.elementor .jsx-pf-hero__title {
	color: var( --dp-text-on-dark );
	text-align: center;
}

/*
 * The eyebrow box fills the 1240 container rather than shrink-wrapping, so the
 * inner's `align-items: center` has nothing to centre — the marker and label
 * just pack to the start of a full-width row. Centre the row's contents
 * instead, which works whatever width the box ends up with.
 */
.elementor.elementor .jsx-pf-hero .jsx-pf-eyebrow { justify-content: center; }

/* --- S2 anchor nav ---------------------------------------------------- */

/*
 * Sticky, like Corporate Governance's: an anchor bar that scrolls away stops
 * being an anchor bar. It sits directly under the header.
 */
.elementor.elementor .jsx-pf-nav {
	width: 100%;
	padding-block: 0;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) ); /* + admin bar when logged in, as .jsx-cg-nav */
	z-index: 20;
	display: flex;
	flex-direction: column;
}

.elementor.elementor .jsx-pf-nav__inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
	padding: 0;
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: 30px;
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-pf-nav__inner::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-pf-nav__link { padding: 0; }

.elementor.elementor .jsx-pf-nav__link a {
	display: inline-block;
	padding-block: 22px;
	border-block-end: 3px solid transparent;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-pf-nav__link a:hover,
.elementor.elementor .jsx-pf-nav__link a:focus-visible { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-pf-nav__link a.is-current {
	color: var( --dp-blue );
	border-block-end-color: var( --dp-blue );
}

/* --- S3 at a glance --------------------------------------------------- */

.elementor.elementor .jsx-pf-glance {
	width: 100%;
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-image: linear-gradient( 90deg, #f4f1fe 0%, #eef6ff 100% );
	display: flex;
	flex-direction: column;
}

.elementor.elementor .jsx-pf-glance__grid {
	width: 100%;
	padding: 0;
	display: grid;
	grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
	grid-template-rows: auto;
	gap: 0;
}

.elementor.elementor .jsx-pf-glance__item {
	padding: 0 30px;
	display: flex;
	flex-direction: column;
	gap: 12px;
	border-inline-start: 1px solid #e5e2f7;
}

.elementor.elementor .jsx-pf-glance__item:first-child {
	padding-inline-start: 0;
	border-inline-start: 0;
}

.elementor.elementor .jsx-pf-glance__num {
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 56px;
	line-height: 1.15;
	color: var( --dp-blue );
	margin: 0;
}

.elementor.elementor .jsx-pf-glance__label {
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
	max-width: 270px;
	margin: 0;
}

/* --- S4 digital platforms --------------------------------------------- */

.elementor.elementor .jsx-pf-cards {
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 48px;
}

/*
 * Figma puts a 56px gutter left of the copy and 40px right of it. A single
 * 48px column-gap lands the card on the same 1160px of content and keeps the
 * copy column at its measured 504px, so the text wraps exactly as drawn.
 */
.elementor.elementor .jsx-pf-card {
	padding: 40px;
	display: grid;
	grid-template-columns: 300px minmax( 0, 1fr ) 260px;
	grid-template-rows: auto;
	column-gap: 48px;
	align-items: start;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 24px;
}

.elementor.elementor .jsx-pf-card--bingoplus { background-image: linear-gradient( 135deg, #eaf6fd 0%, #f8fcfe 100% ); }
.elementor.elementor .jsx-pf-card--arenaplus { background-image: linear-gradient( 135deg, #fff4ea 0%, #fffbf4 100% ); }
.elementor.elementor .jsx-pf-card--gamezone { background-image: linear-gradient( 135deg, #fdeeef 0%, #fef8f8 100% ); }
/*
 * ArenaSocial + Drama Reels (Jun, 2026-10-12: two new cards on Our Portfolio, built on the GameZone class until
 * now). Accents sampled from each card's own key art, as the first three match their brands: ArenaSocial
 * royal blue #0644dc (kept apart from BingoPlus's sky #2ba7e0), Drama Reels indigo #3a2a9a (the poster's
 * #291a7e lifted one step so the 4px rule still reads as colour). Tints are the same ~9% → ~3% wash.
 * These cards carry a poster in the tile and no separate logo, so there is no logo-width rule for them.
 */
.elementor.elementor .jsx-pf-card--arenasocial { background-image: linear-gradient( 135deg, #e9eefc 0%, #f8f9fe 100% ); }
.elementor.elementor .jsx-pf-card--dramareels { background-image: linear-gradient( 135deg, #edecf6 0%, #f9f9fc 100% ); }

.elementor.elementor .jsx-pf-card__brand {
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 18px;
}

.elementor.elementor .jsx-pf-card__tile {
	width: 100%;
	height: 220px;
	padding: 0;
	background-color: var( --dp-white );
	border-radius: 16px;
	display: flex;
	align-items: center;
	justify-content: center;
}

/*
 * Equal optical area, not equal width. The three marks are 2.70, 1.40 and 2.14
 * wide; matching their widths would make ArenaPlus read as half the size of the
 * other two. Each width below lands on roughly 20,600px² of ink.
 */
.elementor.elementor .jsx-pf-card__logo { height: auto; }
.elementor.elementor .jsx-pf-card--bingoplus .jsx-pf-card__logo { width: 236px; }
.elementor.elementor .jsx-pf-card--arenaplus .jsx-pf-card__logo { width: 170px; }
.elementor.elementor .jsx-pf-card--gamezone .jsx-pf-card__logo { width: 210px; }

.elementor.elementor .jsx-pf-card__url {
	color: var( --dp-text-on-light-muted );
	text-align: center;
}

.elementor.elementor .jsx-pf-card__main {
	padding: 0;
	display: flex;
	flex-direction: column;
}

.elementor.elementor .jsx-pf-card__rule {
	flex: 0 0 auto;
	width: 64px;
	height: 4px;
	padding: 0;
	border-radius: 2px;
	margin-block-end: 24px;
}

.elementor.elementor .jsx-pf-card--bingoplus .jsx-pf-card__rule { background-color: #2ba7e0; }
.elementor.elementor .jsx-pf-card--arenaplus .jsx-pf-card__rule { background-color: #f07e26; }
.elementor.elementor .jsx-pf-card--gamezone .jsx-pf-card__rule { background-color: #d7262c; }
.elementor.elementor .jsx-pf-card--arenasocial .jsx-pf-card__rule { background-color: #0644dc; }
.elementor.elementor .jsx-pf-card--dramareels .jsx-pf-card__rule { background-color: #3a2a9a; }

.elementor.elementor .jsx-pf-card__title {
	color: var( --dp-text-on-light );
	margin-block-end: 16px;
}

/*
 * The brand name is the only coloured run in the heading. The per-brand accents
 * (#2ba7e0, #f07e26, #d7262c) all fail 4.5:1 on these tints, so they stay on
 * the rule and the name takes DigiPlus blue.
 */
.elementor.elementor .jsx-pf-card__title span { color: var( --dp-blue ); }

.elementor.elementor .jsx-pf-card__body {
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	margin: 0;
}

.elementor.elementor .jsx-pf-card__rail {
	padding: 0;
	display: flex;
	flex-direction: column;
}

.elementor.elementor .jsx-pf-card__fact {
	padding-block: 13px;
	border-block-start: 1px solid var( --dp-line-on-light );
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light );
	margin: 0;
}

.elementor.elementor .jsx-pf-cta {
	align-self: start;
	margin-block-start: 28px;
	padding-block: 16px;
	padding-inline-start: 28px;
	padding-inline-end: 56px;
	border: 0;
	border-radius: 8px;
	background-color: var( --dp-blue );
	background-image: var( --jsx-arrow-white );
	background-repeat: no-repeat;
	background-position: right 24px center;
	background-size: 15px 12px;
	color: var( --dp-text-on-dark );
	text-align: start;
	text-decoration: none;
	transition: background-color 160ms ease;
}

.elementor.elementor .jsx-pf-cta:hover,
.elementor.elementor .jsx-pf-cta:focus-visible { background-color: var( --dp-violet ); }

/* --- S5 physical investments ------------------------------------------ */

.elementor.elementor .jsx-pf-feature {
	padding: 0;
	display: grid;
	grid-template-columns: 560px minmax( 0, 1fr );
	grid-template-rows: auto;
	column-gap: 48px;
	align-items: stretch;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 24px;
	overflow: hidden;
	margin-block-end: 32px;
}

.elementor.elementor .jsx-pf-feature__photo {
	width: 100%;
	height: 100%;
	min-height: 340px;
	object-fit: cover;
	display: block;
}

.elementor.elementor .jsx-pf-feature__copy {
	padding-block: 40px;
	padding-inline-start: 0;
	padding-inline-end: 40px;
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 16px;
}

.elementor.elementor .jsx-pf-feature__title { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-pf-feature__body {
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	margin: 0;
}

.elementor.elementor .jsx-pf-pair {
	width: 100%;
	padding: 0;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	grid-template-rows: auto;
	gap: 16px;
}

.elementor.elementor .jsx-pf-pair__card {
	padding: 0;
	display: flex;
	flex-direction: column;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 24px;
	overflow: hidden;
}

.elementor.elementor .jsx-pf-pair__photo {
	width: 100%;
	height: 260px;
	object-fit: cover;
	display: block;
}

.elementor.elementor .jsx-pf-pair__body {
	flex: 1 1 auto;
	padding: 28px 32px 32px;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.elementor.elementor .jsx-pf-pair__title {
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 22px;
	line-height: 1.28;
	letter-spacing: -0.005em;
	color: var( --dp-text-on-light );
	margin: 0;
}

.elementor.elementor .jsx-pf-pair__text {
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	margin: 0;
}

/* --- S6 explore more --------------------------------------------------- */

.elementor.elementor .jsx-pf-routes {
	width: 100%;
	padding: 0;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	grid-template-rows: auto;
	gap: 40px;
}

.elementor.elementor .jsx-pf-route {
	min-height: 178px;
	padding: 28px 72px 28px 32px;
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 12px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 14px;
	background-image: var( --jsx-arrow-blue );
	background-repeat: no-repeat;
	background-position: right 32px center;
	background-size: 15px 12px;
	text-decoration: none;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.elementor.elementor .jsx-pf-route:hover,
.elementor.elementor .jsx-pf-route:focus-visible {
	border-color: var( --dp-blue );
	box-shadow: 0 8px 24px rgba( 11, 6, 24, 0.07 );
}

.elementor.elementor .jsx-pf-route__eyebrow { color: var( --dp-blue ); }
.elementor.elementor .jsx-pf-route__title { color: var( --dp-text-on-light ); }

/* --- breakpoints ------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-pf-hero,
	.elementor.elementor .jsx-pf-nav,
	.elementor.elementor .jsx-pf-glance,
	.elementor.elementor .jsx-pf-band { padding-inline: 40px; }
}

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-pf-hero { padding-block-start: 128px; padding-block-end: 88px; }
	.elementor.elementor .jsx-pf-glance { padding-block: 72px; }
	.elementor.elementor .jsx-pf-band { padding-block: 72px; }

	.elementor.elementor .jsx-pf-glance__grid {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
		row-gap: 40px;
	}
	.elementor.elementor .jsx-pf-glance__item:nth-child( 3 ) {
		padding-inline-start: 0;
		border-inline-start: 0;
	}

	/*
	 * The right rail cannot hold a 260px column here, so it drops under the
	 * card and lays its three facts out as a row. The CTA spans the row below.
	 */
	.elementor.elementor .jsx-pf-card {
		grid-template-columns: 240px minmax( 0, 1fr );
		column-gap: 40px;
		row-gap: 32px;
	}
	.elementor.elementor .jsx-pf-card__tile { height: 180px; }
	.elementor.elementor .jsx-pf-card__rail {
		grid-column: 1 / -1;
		display: grid;
		grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
		column-gap: 24px;
	}
	.elementor.elementor .jsx-pf-cta { grid-column: 1 / -1; justify-self: start; }

	.elementor.elementor .jsx-pf-feature {
		grid-template-columns: minmax( 0, 1fr );
		column-gap: 0;
	}
	.elementor.elementor .jsx-pf-feature__photo { min-height: 0; height: 280px; }
	.elementor.elementor .jsx-pf-feature__copy { padding: 32px; }

	.elementor.elementor .jsx-pf-routes { gap: 24px; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-pf-hero {
		padding-block-start: 112px;
		padding-block-end: 56px;
		padding-inline: var( --dp-gutter-mobile );
	}
	.elementor.elementor .jsx-pf-hero__inner { align-items: flex-start; gap: 14px; }
	.elementor.elementor .jsx-pf-hero__title { text-align: start; }
	/* the whole hero reads from the left on a phone, eyebrow included */
	.elementor.elementor .jsx-pf-hero .jsx-pf-eyebrow { justify-content: flex-start; }

	.elementor.elementor .jsx-pf-glance,
	.elementor.elementor .jsx-pf-band {
		padding-block: 56px;
		padding-inline: var( --dp-gutter-mobile );
	}

	.elementor.elementor .jsx-pf-head { gap: 16px; margin-block-end: 32px; }

	/* the anchor bar becomes the approved chip rail */
	.elementor.elementor .jsx-pf-nav { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-pf-nav__inner { gap: 8px; padding-block: 20px; }
	.elementor.elementor .jsx-pf-nav__link a {
		padding: 9px 14px;
		border: 0;
		border-radius: 18px;
		background-color: var( --dp-lavender );
		font-size: 13px;
		line-height: 1.4;
	}
	.elementor.elementor .jsx-pf-nav__link a.is-current {
		background-color: var( --dp-blue );
		color: var( --dp-text-on-dark );
	}
	.elementor .jsx-pf-glance .elementor-menu-anchor,
	.elementor .jsx-pf-band .elementor-menu-anchor {
		scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px );
	}

	.elementor.elementor .jsx-pf-glance__grid { column-gap: 24px; row-gap: 32px; }
	.elementor.elementor .jsx-pf-glance__item {
		padding: 0;
		border-inline-start: 0;
		gap: 8px;
	}
	.elementor.elementor .jsx-pf-glance__num { font-size: 32px; line-height: 1.18; }
	.elementor.elementor .jsx-pf-glance__label { font-size: 13px; }

	.elementor.elementor .jsx-pf-cards { gap: 24px; }
	.elementor.elementor .jsx-pf-card {
		grid-template-columns: minmax( 0, 1fr );
		padding: 24px;
		border-radius: 16px;
		row-gap: 24px;
	}
	.elementor.elementor .jsx-pf-card__tile { height: 150px; border-radius: 12px; }
	.elementor.elementor .jsx-pf-card--bingoplus .jsx-pf-card__logo { width: 172px; }
	.elementor.elementor .jsx-pf-card--arenaplus .jsx-pf-card__logo { width: 124px; }
	.elementor.elementor .jsx-pf-card--gamezone .jsx-pf-card__logo { width: 153px; }
	.elementor.elementor .jsx-pf-card__url { text-align: start; }
	.elementor.elementor .jsx-pf-card__rule { width: 48px; margin-block-end: 20px; }
	.elementor.elementor .jsx-pf-card__body { font-size: 14px; }
	.elementor.elementor .jsx-pf-card__rail {
		grid-template-columns: minmax( 0, 1fr );
	}
	.elementor.elementor .jsx-pf-cta {
		justify-self: stretch;
		align-self: stretch;
		margin-block-start: 24px;
		padding-block: 14px;
	}

	.elementor.elementor .jsx-pf-feature { border-radius: 16px; margin-block-end: 16px; }
	.elementor.elementor .jsx-pf-feature__photo { height: 233px; }
	.elementor.elementor .jsx-pf-feature__copy { padding: 24px; gap: 12px; }
	.elementor.elementor .jsx-pf-feature__body { font-size: 14px; }

	.elementor.elementor .jsx-pf-pair { grid-template-columns: minmax( 0, 1fr ); }
	.elementor.elementor .jsx-pf-pair__card { border-radius: 16px; }
	.elementor.elementor .jsx-pf-pair__photo { height: 233px; }
	.elementor.elementor .jsx-pf-pair__body { padding: 24px; }
	.elementor.elementor .jsx-pf-pair__text { font-size: 14px; }

	.elementor.elementor .jsx-pf-routes { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-pf-route {
		min-height: 136px;
		padding: 24px 56px 24px 24px;
		background-position: right 24px center;
	}
}

/* =============================================================================
 * 72. Portfolio detail — single-portfolio.php (Figma 408:1087 / 521:3)
 *
 * A PHP template, so none of it sits inside Elementor's .elementor wrapper and
 * the kit's global classes do not apply. Type is declared here in full, the
 * same way the search results template does it.
 *
 * Sections are optional: the template omits any whose fields are empty, so the
 * rules below must not assume a neighbour exists.
 * ========================================================================== */

.jsx-pd { display: block; }

.jsx-pd .jsx-pd-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

.jsx-pd .jsx-pd-band--tint { background-color: #faf9fd; }
.jsx-pd .jsx-pd-band--wash { background-image: linear-gradient( 90deg, #f4f1fe 0%, #eef6ff 100% ); }

.jsx-pd .jsx-pd-inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
}

.jsx-pd .jsx-pd-title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.015em;
	color: var( --dp-text-on-light );
}

.jsx-pd .jsx-pd-lead {
	max-width: 760px;
	margin: 20px 0 0;
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/* --- hero --------------------------------------------------------------- */

.jsx-pd .jsx-pd-hero {
	position: relative;
	overflow: hidden;
	padding-block: 150px 116px;
	padding-inline: var( --dp-gutter );
	background-color: #0b0618;
	/*
	 * Dark scrim, not navy + brand wash: the header CTA is brand blue (2026-10-03).
	 * Strength settled at .66–.70 the same day: .60 left the 18px sub weak over
	 * light shirts (Jun), .72–.76 was "too dark" (Jun). Worst-case white text in
	 * the headline band is ~7.8:1 here. Same strength on every inner hero.
	 */
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.66 ) 0%, rgba( 11, 6, 24, 0.70 ) 34%, rgba( 11, 6, 24, 0.68 ) 80%, rgba( 11, 6, 24, 0.64 ) 100% ),
		var( --pd-hero, none );
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
}

.jsx-pd .jsx-pd-hero__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 16px;
}

.jsx-pd .jsx-pd-hero__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-dark );
	text-align: center;
}

.jsx-pd .jsx-pd-eyebrow {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var( --dp-light-blue );
}

/* a 14px square with the bottom-right quarter swept out — see §71 */
.jsx-pd .jsx-pd-eyebrow__mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

/* --- anchor bar --------------------------------------------------------- */

.jsx-pd .jsx-pd-nav {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) ); /* + admin bar when logged in, as .jsx-cg-nav */
	z-index: 20;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
}

.jsx-pd .jsx-pd-nav__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	gap: 30px;
	overflow-x: auto;
	scrollbar-width: none;
}

.jsx-pd .jsx-pd-nav__inner::-webkit-scrollbar { display: none; }

.jsx-pd .jsx-pd-nav__link {
	display: inline-block;
	padding-block: 22px;
	border-block-end: 3px solid transparent;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease, border-color 160ms ease;
}

.jsx-pd .jsx-pd-nav__link:hover,
.jsx-pd .jsx-pd-nav__link:focus-visible { color: var( --dp-text-on-light ); }

.jsx-pd .jsx-pd-nav__link.is-current {
	color: var( --dp-blue );
	border-block-end-color: var( --dp-blue );
}

/* the landing point has to clear the header and this sticky bar */
.jsx-pd .jsx-pd-band[id] { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 74px ); }

/* --- overview ----------------------------------------------------------- */

/*
 * Two columns. A single full-width paragraph ran to ~100 characters per line
 * and left the right half of the band empty.
 */
.jsx-pd .jsx-pd-overview__cols {
	display: grid;
	grid-template-columns: 560px minmax( 0, 1fr );
	column-gap: 100px;
	align-items: start;
}

.jsx-pd .jsx-pd-back {
	display: inline-block;
	margin-block-end: 24px;
	font-family: var( --dp-font-body );
	font-size: 18px;
	line-height: 1.4;
	color: var( --dp-blue );
	text-decoration: none;
}

.jsx-pd .jsx-pd-back:hover,
.jsx-pd .jsx-pd-back:focus-visible { text-decoration: underline; }

.jsx-pd .jsx-pd-overview__logo { display: block; height: auto; margin-block-end: 36px; }

.jsx-pd .jsx-pd-overview__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.015em;
	color: var( --dp-text-on-light );
}

/* the brand name, always the clause before the first comma */
.jsx-pd .jsx-pd-overview__title span,
.jsx-pd .jsx-pd-related__title span { color: var( --dp-blue ); }

.jsx-pd .jsx-pd-overview__body,
.jsx-pd .jsx-pd-overview__body p {
	margin: 0 0 1em;
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

.jsx-pd .jsx-pd-overview__body p:last-child { margin-block-end: 0; }

.jsx-pd .jsx-pd-stats {
	list-style: none;
	margin: 56px 0 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat( auto-fit, minmax( 0, 1fr ) );
	gap: 41px;
}

.jsx-pd .jsx-pd-stat {
	padding: 28px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
}

.jsx-pd .jsx-pd-stat__value {
	margin: 0 0 8px;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.34;
	letter-spacing: -0.01em;
	color: var( --dp-blue );
}

.jsx-pd .jsx-pd-stat__label {
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

.jsx-pd .jsx-pd-cta {
	display: inline-block;
	margin-block-start: 48px;
	padding: 16px 56px 16px 28px;
	border-radius: 8px;
	background-color: var( --dp-blue );
	background-image: var( --jsx-arrow-white );
	background-repeat: no-repeat;
	background-position: right 24px center;
	background-size: 15px 12px;
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-dark );
	text-decoration: none;
	transition: background-color 160ms ease;
}

.jsx-pd .jsx-pd-cta:hover,
.jsx-pd .jsx-pd-cta:focus-visible { background-color: var( --dp-violet ); }

/* --- in action: poster and play control --------------------------------- */

.jsx-pd .jsx-pd-poster {
	position: relative;
	display: block;
	width: 100%;
	margin-block-start: 28px;
	padding: 0;
	border: 0;
	background: none;
	border-radius: 12px;
	overflow: hidden;
	text-decoration: none;
	cursor: pointer;
	text-align: start;
	font: inherit;
	color: inherit;
}

.jsx-pd .jsx-pd-poster:focus-visible {
	outline: 3px solid var( --dp-blue );
	outline-offset: 3px;
}

.jsx-pd .jsx-pd-poster__img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 1240 / 698;
	object-fit: cover;
}

/*
 * The control sits lower-left, not centred on the poster. The still DigiPlus
 * supplied puts its subject — the jackpot cheque — dead centre, and a centred
 * disc lands on the one thing worth looking at. A labelled control also names
 * the action instead of relying on a bare triangle.
 */
.jsx-pd .jsx-pd-poster::after {
	content: "";
	position: absolute;
	inset-inline: 0;
	inset-block-end: 0;
	height: 260px;
	background-image: linear-gradient( 180deg, rgba( 8, 16, 41, 0 ) 0%, rgba( 8, 16, 41, 0.55 ) 55%, rgba( 8, 16, 41, 0.86 ) 100% );
	pointer-events: none;
}

.jsx-pd .jsx-pd-poster__control {
	position: absolute;
	inset-block-end: 48px;
	inset-inline-start: 32px;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	gap: 20px;
}

.jsx-pd .jsx-pd-poster__disc {
	width: 72px;
	height: 72px;
	border-radius: 50%;
	background-color: var( --dp-white );
	background-image: var( --jsx-play-blue );
	background-repeat: no-repeat;
	background-position: center;
	background-size: 22px 26px;
	transition: transform 160ms ease;
}

.jsx-pd .jsx-pd-poster:hover .jsx-pd-poster__disc,
.jsx-pd .jsx-pd-poster:focus-visible .jsx-pd-poster__disc { transform: scale( 1.06 ); }

.jsx-pd .jsx-pd-poster__label {
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-dark );
}

/* no film yet: the still carries the section on its own, with no false affordance */
.jsx-pd .jsx-pd-poster--static::after { display: none; }

.jsx-pd .jsx-pd-note {
	margin: 24px 0 0;
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/* --- inside the platform: the rail -------------------------------------- */

.jsx-pd .jsx-pd-rail {
	list-style: none;
	margin: 48px 0 0;
	padding: 0 0 8px;
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: 386px;
	gap: 41px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	overscroll-behavior-x: contain;
	scrollbar-width: thin;
}

.jsx-pd .jsx-pd-rail__card {
	scroll-snap-align: start;
	display: flex;
	flex-direction: column;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
	overflow: hidden;
}

.jsx-pd .jsx-pd-rail__img {
	display: block;
	width: 100%;
	height: 200px;
	object-fit: cover;
}

.jsx-pd .jsx-pd-rail__body {
	flex: 1 1 auto;
	padding: 28px;
	display: flex;
	flex-direction: column;
}

.jsx-pd .jsx-pd-rail__rule {
	width: 48px;
	height: 4px;
	border-radius: 2px;
	background-color: var( --dp-light-blue );
	margin-block-end: 20px;
}

.jsx-pd .jsx-pd-rail__title {
	margin: 0 0 12px;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	letter-spacing: -0.005em;
	color: var( --dp-text-on-light );
}

.jsx-pd .jsx-pd-rail__text {
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

/* --- nationwide network: photo left, copy right ------------------------- */

.jsx-pd .jsx-pd-feature {
	margin-block-start: 48px;
	display: grid;
	grid-template-columns: 560px minmax( 0, 1fr );
	column-gap: 48px;
	align-items: stretch;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 24px;
	overflow: hidden;
}

.jsx-pd .jsx-pd-feature__photo {
	display: block;
	width: 100%;
	height: 100%;
	min-height: 360px;
	object-fit: cover;
}

.jsx-pd .jsx-pd-feature__copy {
	padding-block: 40px;
	padding-inline-end: 40px;
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 20px;
}

.jsx-pd .jsx-pd-feature__statement {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.34;
	letter-spacing: -0.01em;
	color: var( --dp-text-on-light );
}

.jsx-pd .jsx-pd-feature__body {
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

/* --- related platforms --------------------------------------------------- */

.jsx-pd .jsx-pd-related__grid {
	list-style: none;
	margin: 48px 0 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	gap: 16px;
}

.jsx-pd .jsx-pd-related__card {
	background-image: linear-gradient( 135deg, var( --pd-from, #f4f1fe ) 0%, var( --pd-to, #ffffff ) 100% );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 24px;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.jsx-pd .jsx-pd-related__card:hover,
.jsx-pd .jsx-pd-related__card:focus-within {
	border-color: var( --dp-blue );
	box-shadow: 0 8px 24px rgba( 11, 6, 24, 0.07 );
}

.jsx-pd .jsx-pd-related__link {
	display: flex;
	flex-direction: column;
	gap: 24px;
	padding: 32px;
	text-decoration: none;
}

.jsx-pd .jsx-pd-related__tile {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 240px;
	height: 160px;
	background-color: var( --dp-white );
	border-radius: 16px;
}

.jsx-pd .jsx-pd-related__logo { display: block; height: auto; }

.jsx-pd .jsx-pd-related__title {
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 22px;
	line-height: 1.28;
	letter-spacing: -0.005em;
	color: var( --dp-text-on-light );
}

.jsx-pd .jsx-pd-related__url {
	font-family: var( --dp-font-body );
	font-weight: 400;
	font-size: 18px;
	line-height: 1.4;
	color: var( --dp-blue );
}

/* --- breakpoints --------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.jsx-pd .jsx-pd-band,
	.jsx-pd .jsx-pd-hero,
	.jsx-pd .jsx-pd-nav { padding-inline: 40px; }
	.jsx-pd .jsx-pd-overview__cols { column-gap: 56px; grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1fr ); }
}

@media ( max-width: 1024px ) {
	.jsx-pd .jsx-pd-hero { padding-block: 128px 88px; }
	.jsx-pd .jsx-pd-band { padding-block: 72px; }
	.jsx-pd .jsx-pd-overview__cols { grid-template-columns: minmax( 0, 1fr ); row-gap: 28px; }
	.jsx-pd .jsx-pd-stats { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); gap: 24px; }
	.jsx-pd .jsx-pd-feature { grid-template-columns: minmax( 0, 1fr ); column-gap: 0; }
	.jsx-pd .jsx-pd-feature__photo { min-height: 0; height: 300px; }
	.jsx-pd .jsx-pd-feature__copy { padding: 32px; }
	.jsx-pd .jsx-pd-rail { grid-auto-columns: 320px; gap: 24px; }
}

@media ( max-width: 767px ) {
	.jsx-pd .jsx-pd-hero {
		padding-block: 112px 56px;
		padding-inline: var( --dp-gutter-mobile );
	}
	.jsx-pd .jsx-pd-hero__inner { align-items: flex-start; gap: 14px; }
	.jsx-pd .jsx-pd-hero__title { font-size: 40px; line-height: 1.1; text-align: start; }

	.jsx-pd .jsx-pd-band,
	.jsx-pd .jsx-pd-nav { padding-inline: var( --dp-gutter-mobile ); }
	.jsx-pd .jsx-pd-band { padding-block: 56px; }

	.jsx-pd .jsx-pd-title { font-size: 30px; line-height: 1.18; }
	.jsx-pd .jsx-pd-lead,
	.jsx-pd .jsx-pd-overview__body,
	.jsx-pd .jsx-pd-overview__body p { font-size: 16px; }
	.jsx-pd .jsx-pd-overview__title { font-size: 30px; line-height: 1.18; }
	.jsx-pd .jsx-pd-overview__logo { margin-block-end: 28px; }

	/* the anchor bar becomes the approved chip rail */
	.jsx-pd .jsx-pd-nav__inner { gap: 8px; padding-block: 20px; }
	.jsx-pd .jsx-pd-nav__link {
		padding: 9px 14px;
		border: 0;
		border-radius: 18px;
		background-color: var( --dp-lavender );
		font-size: 13px;
		line-height: 1.4;
	}
	.jsx-pd .jsx-pd-nav__link.is-current {
		background-color: var( --dp-blue );
		color: var( --dp-text-on-dark );
	}
	.jsx-pd .jsx-pd-band[id] { scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px ); }

	.jsx-pd .jsx-pd-stats { grid-template-columns: minmax( 0, 1fr ); gap: 16px; margin-block-start: 40px; }
	.jsx-pd .jsx-pd-cta { display: block; margin-block-start: 32px; text-align: start; }

	.jsx-pd .jsx-pd-poster__control { inset-block-end: 20px; inset-inline-start: 16px; gap: 12px; }
	.jsx-pd .jsx-pd-poster__disc { width: 48px; height: 48px; background-size: 15px 18px; }
	.jsx-pd .jsx-pd-poster__label { font-size: 13px; }
	.jsx-pd .jsx-pd-poster::after { height: 110px; }

	.jsx-pd .jsx-pd-rail { grid-auto-columns: 300px; gap: 16px; margin-block-start: 32px; }
	.jsx-pd .jsx-pd-rail__img { height: 160px; }
	.jsx-pd .jsx-pd-rail__body { padding: 24px; }
	.jsx-pd .jsx-pd-rail__text { font-size: 14px; }

	.jsx-pd .jsx-pd-feature { margin-block-start: 32px; border-radius: 16px; }
	.jsx-pd .jsx-pd-feature__photo { height: 225px; }
	.jsx-pd .jsx-pd-feature__copy { padding: 24px; gap: 12px; }
	.jsx-pd .jsx-pd-feature__statement { font-size: 22px; line-height: 1.28; }
	.jsx-pd .jsx-pd-feature__body { font-size: 14px; }

	.jsx-pd .jsx-pd-related__grid { grid-template-columns: minmax( 0, 1fr ); margin-block-start: 32px; }
	.jsx-pd .jsx-pd-related__link { padding: 24px; gap: 20px; }
	.jsx-pd .jsx-pd-related__tile { width: 160px; height: 106px; }
	.jsx-pd .jsx-pd-related__url { font-size: 16px; }
}

/*
 * A rail card with no photo.
 *
 * ArenaPlus and GameZone have the facts but no product photography, so their
 * cards are text only. Without the image the body sat tight to the card's top
 * edge; this gives it the same breathing room the photo used to provide, so a
 * text card reads as a deliberate variant rather than a broken one.
 */
.jsx-pd .jsx-pd-rail__body:first-child { padding-block-start: 32px; }

/*
 * The feature band can hold a graphic rather than a photograph — ArenaPlus uses
 * the Sportradar partnership lockup. A lockup must not be cropped to fill, so
 * it is contained on a white field at its own proportions.
 */
.jsx-pd .jsx-pd-feature--graphic .jsx-pd-feature__photo {
	object-fit: contain;
	background-color: var( --dp-white );
	padding: 32px;
}

/* --- the film pop-up ----------------------------------------------------- */

.jsx-pd .jsx-pd-modal {
	width: min( 92vw, 1100px );
	max-width: none;
	padding: 0;
	border: 0;
	background: none;
	overflow: visible;
	color: var( --dp-text-on-dark );
}

.jsx-pd .jsx-pd-modal::backdrop {
	background-color: rgba( 8, 16, 41, 0.82 );
}

/*
 * Reserve the 16:9 box before the player exists, so opening the dialog does not
 * resize it a frame later once the iframe loads.
 */
.jsx-pd .jsx-pd-modal__frame {
	position: relative;
	width: 100%;
	aspect-ratio: 16 / 9;
	background-color: #000;
	border-radius: 12px;
	overflow: hidden;
}

.jsx-pd .jsx-pd-modal__video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}

.jsx-pd .jsx-pd-modal__close {
	position: absolute;
	inset-block-start: -52px;
	inset-inline-end: 0;
	width: 44px;
	height: 44px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background-color: rgba( 255, 255, 255, 0.12 );
	color: var( --dp-text-on-dark );
	font-size: 28px;
	line-height: 1;
	cursor: pointer;
	transition: background-color 160ms ease;
}

.jsx-pd .jsx-pd-modal__close:hover,
.jsx-pd .jsx-pd-modal__close:focus-visible { background-color: rgba( 255, 255, 255, 0.24 ); }

.jsx-pd .jsx-pd-modal__close:focus-visible {
	outline: 3px solid var( --dp-white );
	outline-offset: 2px;
}

@media ( max-width: 767px ) {
	.jsx-pd .jsx-pd-modal { width: calc( 100vw - 32px ); }
	/*
	 * No room above the player on a phone, so the control moves inside the
	 * frame's top-right rather than overhanging it.
	 */
	.jsx-pd .jsx-pd-modal__close {
		inset-block-start: 8px;
		inset-inline-end: 8px;
		background-color: rgba( 8, 16, 41, 0.6 );
	}
}

/* =============================================================================
 * 73. Action icons: an arrow for a page, a download for a file
 *
 * Driven off the href, not off a class an editor has to remember. Swap a link
 * from a PDF to a page and the icon follows on its own; the pair can never end
 * up contradicting each other, which is what they currently do on Investor
 * Relations — the PDF there carries an arrow and the external PSE Edge link
 * carries a download glyph.
 *
 * Scoped to the Corporate Governance actions for now. Extending this to the
 * rest of the site is adding selectors to the two lists below and nothing else.
 * ========================================================================== */

.elementor.elementor .jsx-cg-btn { gap: 12px; }

.elementor.elementor .jsx-cg-btn::after {
	content: "";
	flex: 0 0 auto;
	width: 15px;
	height: 12px;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

/* the arrow leans into the direction it takes you */
.elementor.elementor .jsx-cg-btn:hover::after,
.elementor.elementor .jsx-cg-btn:focus-visible::after { transform: translateX( 3px ); }

/*
 * A link that ends in a file is a download and should say so. Matched
 * case-insensitively and allowing a query string, because an uploaded file can
 * arrive as .PDF and a tracked link can carry ?ver=.
 */
.elementor.elementor .jsx-cg-btn[href$=".pdf" i]::after,
.elementor.elementor .jsx-cg-btn[href*=".pdf?" i]::after,
.jsx-cg-doclink[href$=".pdf" i]::after,
.jsx-cg-doclink[href*=".pdf?" i]::after {
	width: 14px;
	height: 14px;
	-webkit-mask-image: var( --jsx-download );
	mask-image: var( --jsx-download );
}

/* ...and a download moves down, not sideways */
.elementor.elementor .jsx-cg-btn[href$=".pdf" i]:hover::after,
.elementor.elementor .jsx-cg-btn[href$=".pdf" i]:focus-visible::after,
.elementor.elementor .jsx-cg-btn[href*=".pdf?" i]:hover::after,
.elementor.elementor .jsx-cg-btn[href*=".pdf?" i]:focus-visible::after {
	transform: translateY( 2px );
}

.jsx-cg-doclink::after { transition: transform 160ms ease-out; }

.jsx-cg-doclink[href$=".pdf" i]:hover::after,
.jsx-cg-doclink[href*=".pdf?" i]:hover::after { transform: translateY( 2px ); }

/* --- site-wide rollout (2026 pages) ------------------------------------- *
 *
 * The legacy pages are left alone deliberately: their buttons are Elementor
 * widgets carrying hand-placed inline SVGs, already correct on all 21 PDFs,
 * and adding a pseudo-element there would simply give them two icons.
 *
 * Two mechanisms are in play across the rebuild, so each needs its own PDF
 * branch:
 *   mask on ::after   — jsx-btn-primary, jsx-cg-btn, jsx-cg-doclink and the
 *                       three below, which inherit the label colour
 *   background-image  — jsx-pf-cta, jsx-pd-cta, jsx-pf-route, which paint a
 *                       fixed-ink glyph inside their own padding
 *
 * jsx-btn-secondary stays bare — section 16 records that the design gives it
 * no arrow, and that is a decision, not an omission.
 */

/* families that had no icon at all */
.elementor.elementor .jsx-ob-prod-cta,
.elementor.elementor .jsx-ob-social__cta {
	display: inline-flex;
	align-items: center;
	gap: 12px;
}

.elementor.elementor .jsx-ob-prod-cta::after,
.elementor.elementor .jsx-ob-social__cta::after,
.jsx-person__more::after {
	content: "";
	flex: 0 0 auto;
	width: 15px;
	height: 12px;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

/*
 * "Read more" is a span inside the card's own anchor, so it gets the arrow but
 * no file branch — a profile link is never a document.
 */
.jsx-person__more {
	display: inline-flex;
	align-items: center;
	gap: 8px;
}

.jsx-person__link:hover .jsx-person__more::after,
.jsx-person__link:focus-visible .jsx-person__more::after,
.elementor.elementor .jsx-ob-prod-cta:hover::after,
.elementor.elementor .jsx-ob-social__cta:hover::after { transform: translateX( 3px ); }

/* the file branch, for every mask-drawn family */
.elementor.elementor .jsx-btn-primary[href$=".pdf" i]::after,
.elementor.elementor .jsx-btn-primary[href*=".pdf?" i]::after,
.elementor.elementor .jsx-ob-prod-cta[href$=".pdf" i]::after,
.elementor.elementor .jsx-ob-social__cta[href$=".pdf" i]::after {
	width: 14px;
	height: 14px;
	-webkit-mask-image: var( --jsx-download );
	mask-image: var( --jsx-download );
}

.elementor.elementor .jsx-btn-primary[href$=".pdf" i]:hover::after,
.elementor.elementor .jsx-btn-primary[href*=".pdf?" i]:hover::after {
	transform: translateY( 2px );
}

/* the file branch, for the background-image families */
.elementor.elementor .jsx-pf-cta[href$=".pdf" i],
.elementor.elementor .jsx-pf-cta[href*=".pdf?" i],
.jsx-pd .jsx-pd-cta[href$=".pdf" i],
.jsx-pd .jsx-pd-cta[href*=".pdf?" i] {
	background-image: var( --jsx-download-white );
	background-size: 14px 14px;
}

.elementor.elementor .jsx-pf-route[href$=".pdf" i],
.elementor.elementor .jsx-pf-route[href*=".pdf?" i] {
	background-image: var( --jsx-download-blue );
	background-size: 14px 14px;
}

/* =============================================================================
 * 74. Investor Relations (page 14817) — Figma 186:32 / 212:44
 *
 * Structure lives in the atomic Elementor document (page 14817); only the six
 * repeating blocks come from inc/investor-relations.php. Everything renders
 * inside .elementor, so each selector is doubled to outrank the atomic base
 * layer and the per-element local styles -- the same mechanism as section 63.
 *
 * Type, rhythm and every breakpoint live here, so a change is one edit rather
 * than a tree walk.
 *
 * Four structures are redesigned on a phone rather than narrowed — see the
 * breakpoint block at the end.
 * ========================================================================== */

.elementor.elementor .jsx-ir-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

/*
 * Two surfaces, two jobs.
 *
 * --lavender is the brand tint the approved frames put behind IR Programmes and
 * Latest News: a deliberate accent on two bands.
 *
 * --tint is the quiet step that alternates the bands between them. The frames
 * leave Analyst Coverage through What drives us forward all white, which puts
 * five white bands in a row — and with 96 of padding on each side of every one,
 * the 192 between them reads as one undifferentiated gap rather than as six
 * sections. Alternating restores the boundary without taking the air away.
 */
.elementor.elementor .jsx-ir-band--tint { background-color: var( --dp-lavender-soft ); }
.elementor.elementor .jsx-ir-band--lavender { background-color: var( --dp-lavender ); }
.elementor.elementor .jsx-ir-band--wash { background-image: linear-gradient( 90deg, #f4f1fe 0%, #eef6ff 100% ); }

/*
 * A flex column, not a block. Elementor indents its own markup, so every band
 * carries whitespace-only text nodes between the widget divs; in a block
 * container those produced anonymous line boxes and added 15px below the one
 * band whose last child is a table. A flex container discards them outright.
 *
 * The rhythm below is unaffected — it only ever sets margin-block-start, which
 * behaves the same either way.
 */
.elementor.elementor .jsx-ir-inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

/* the inline controls size to their own text rather than the column */
.elementor.elementor .jsx-ir-inner > .jsx-ir-cta,
.elementor.elementor .jsx-ir-inner > .jsx-ir-ctarow,
.elementor.elementor .jsx-ir-inner > .jsx-ir-eyebrow { align-self: flex-start; }

.elementor.elementor .jsx-ir-title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.015em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ir-title span { color: var( --dp-blue ); }
.elementor.elementor .jsx-ir-title--light { color: var( --dp-text-on-dark ); }

/* on the report band's violet the accent is light blue, not brand blue */
.elementor.elementor .jsx-ir-title--light span { color: var( --dp-light-blue ); }

/* the hero takes the same treatment, on dark */
.elementor.elementor .jsx-ir-hero__title span { color: var( --dp-light-blue ); }

.elementor.elementor .jsx-ir-lead {
	max-width: 820px;
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-ir-lead--light { color: var( --dp-text-on-dark-muted ); }

/*
 * Body copy. Each paragraph is its own atomic element rather than one rich-text
 * block, so the bottom margin lives on the paragraph. The band's inner is a
 * plain block, so this margin collapses with the 40px above the grid that
 * usually follows -- which is the spacing the design asks for either way.
 */
.elementor.elementor .jsx-ir-body {
	max-width: 820px;
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

/* the eyebrow and its quarter-disc marker, as elsewhere on the site */
.elementor.elementor .jsx-ir-eyebrow {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-ir-eyebrow--brand { color: var( --dp-blue ); }

/* the eyebrow is a flex row, so its label is a child and inherits the type */
.elementor.elementor .jsx-ir-eyebrow__text {
	margin: 0;
	font: inherit;
	letter-spacing: inherit;
	text-transform: inherit;
	color: inherit;
}

.elementor.elementor .jsx-ir-eyebrow__mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

/* --- hero ---------------------------------------------------------------- */

.elementor.elementor .jsx-ir-hero {
	position: relative;
	overflow: hidden;
	padding-block: 214px 144px;
	padding-inline: var( --dp-gutter );
	background-color: #0b0618;
	/*
	 * Dark scrim, not navy + brand wash: the header CTA is brand blue (2026-10-03).
	 * Strength settled at .66–.70 the same day: .60 left the 18px sub weak over
	 * light shirts (Jun), .72–.76 was "too dark" (Jun). Worst-case white text in
	 * the headline band is ~7.8:1 here. Same strength on every inner hero.
	 */
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.66 ) 0%, rgba( 11, 6, 24, 0.70 ) 34%, rgba( 11, 6, 24, 0.68 ) 80%, rgba( 11, 6, 24, 0.64 ) 100% ),
		url( "/wp-content/uploads/2026/10/ir-boardroom-hero.jpg" );
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
	text-align: center;
}

.elementor.elementor .jsx-ir-hero__inner { max-width: var( --dp-container ); margin-inline: auto; }

.elementor.elementor .jsx-ir-hero__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-ir-hero__sub {
	max-width: 640px;
	margin: 29px auto 0;
	font-family: var( --dp-font-body );
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-dark );
}

/* --- anchor bar ---------------------------------------------------------- */

.elementor.elementor .jsx-ir-nav {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) ); /* + admin bar when logged in, as .jsx-cg-nav */
	z-index: 20;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-ir-nav__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	gap: 30px;
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-ir-nav__inner::-webkit-scrollbar { display: none; }

/*
 * Each chip holds both labels and the breakpoint shows one. The approved mobile
 * frame shortens three of them — "Presentations", "Financial", "Stock" — so the
 * strip scrolls less; two elements per link would be the alternative, and this
 * keeps the anchor a single focusable control.
 */
.elementor.elementor .jsx-ir-nav__link span:nth-child( 2 ) { display: none; }

.elementor.elementor .jsx-ir-nav__link {
	display: inline-block;
	padding-block: 24px 18px;
	border-block-end: 3px solid transparent;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-ir-nav__link:hover,
.elementor.elementor .jsx-ir-nav__link:focus-visible { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-ir-nav__link:has( > a.is-current ),
.elementor.elementor .jsx-ir-nav__link.is-current {
	color: var( --dp-blue );
	border-block-end-color: var( --dp-blue );
}

.jsx-ir [id] { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 74px ); }

/* --- the two document lists --------------------------------------------- */

.elementor.elementor .jsx-ir-lists {
	display: grid;
	grid-template-columns: minmax( 0, 760px ) minmax( 0, 400px );
	gap: 80px;
	align-items: start;
}

.elementor.elementor .jsx-ir-list__title {
	margin: 0 0 22px;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

/*
 * The panel is solid brand blue, so the rows sit on it as white text. A single
 * list that splits into two columns keeps it one list for a screen reader.
 */
.elementor.elementor .jsx-ir-doclist {
	list-style: none;
	margin: 0;
	padding: 32px;
	background-color: var( --dp-blue );
	/*
	 * The DigiPlus corner: square but for a deep sweep at the bottom right.
	 * Measured off the approved frame (Figma 187:19), not guessed.
	 */
	border-radius: 0 0 72px 0;
}

.elementor.elementor .jsx-ir-doclist--split { columns: 2; column-gap: 48px; }

.elementor.elementor .jsx-ir-doc { break-inside: avoid; }

.elementor.elementor .jsx-ir-doc__link {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	padding-block: 11px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-dark );
	text-decoration: none;
}

.elementor.elementor .jsx-ir-doc__link::after {
	content: "";
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: currentColor;
	-webkit-mask: var( --jsx-download ) no-repeat center / contain;
	mask: var( --jsx-download ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

.elementor.elementor .jsx-ir-doc__link:hover,
.elementor.elementor .jsx-ir-doc__link:focus-visible { text-decoration: underline; }
.elementor.elementor .jsx-ir-doc__link:hover::after { transform: translateY( 2px ); }

/* --- tables -------------------------------------------------------------- */

/*
 * Both tables share a deep-violet head; the bodies differ. Analyst Coverage
 * zebras lavender against white because twelve rows need a tracking aid, and
 * Dividends sits entirely on light blue because three rows do not.
 *
 * border-collapse must stay separate, or the head's rounded top corners are
 * squared off by the collapsed border model.
 */
.elementor.elementor .jsx-ir-table {
	width: 100%;
	border-collapse: separate;
	border-spacing: 0;
	border-radius: 12px 12px 0 0;
	overflow: hidden;
}

/*
 * hello-elementor's reset.css styles bare tables for readability: a 1px border
 * on all four sides of every cell, and a zebra wash of rgba(128,128,128,0.07)
 * on odd rows. Both have to be cleared before this design's own hairline shows,
 * or the mobile cards come out striped.
 */
.elementor.elementor .jsx-ir-table th {
	border: 0;
	background-color: var( --dp-violet-deep );
	padding: 19px 32px;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var( --dp-text-on-dark );
	text-align: start;
}

.elementor.elementor .jsx-ir-table td {
	border: 0;
	background-color: transparent;
	padding: 17px 32px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light );
	vertical-align: middle;
}

/* twelve brokers: a zebra is the tracking aid, not a rule between every row */
.elementor.elementor .jsx-ir-table--analysts tbody tr:nth-child( odd ) td {
	background-color: var( --dp-lavender );
}

/* three years, so the whole body carries the accent and a hairline divides it */
.elementor.elementor .jsx-ir-table--dividends tbody td {
	background-color: var( --dp-light-blue );
	box-shadow: inset 0 -1px 0 rgba( 255, 255, 255, 0.55 );
}

.elementor.elementor .jsx-ir-table--dividends tbody tr:last-child td { box-shadow: none; }

.elementor.elementor .jsx-ir-table a { color: var( --dp-blue ); text-decoration: none; }
.elementor.elementor .jsx-ir-table--dividends a { color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-ir-table a:hover { text-decoration: underline; }
.elementor.elementor .jsx-ir-table--dividends td { font-variant-numeric: tabular-nums; }

/* --- figure cards (financial + stock) ------------------------------------ */

/*
 * width: 100% is load-bearing. Elementor's base leaves shortcode output with
 * `justify-self: start`, so a grid here sizes to fit-content: the stock row
 * happened to max out and look right while the financial row, whose labels are
 * short, collapsed to 240 at 390.
 */
.elementor.elementor .jsx-ir-figures {
	list-style: none;
	width: 100%;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	gap: 20px;
}

/*
 * Figure cards carry the brand gradient, and the middle card of each row is
 * inverted to light blue so a row of three does not read as one slab. White ink
 * on the gradient is 8.6:1; the light-blue card takes dark ink, because white
 * on #46BCFF is 2.12:1 and fails at any size.
 */
.elementor.elementor .jsx-ir-figure {
	padding: 32px 32px 46px;
	border: 0;
	border-radius: 4px;
	background-image: linear-gradient( 120deg, var( --dp-violet ) 0%, var( --dp-blue ) 100% );
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-ir-figure:nth-child( 3n + 2 ) {
	background-image: none;
	background-color: var( --dp-light-blue );
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ir-figure__label {
	margin: 0 0 36px;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.34;
	letter-spacing: -0.01em;
	color: inherit;
}

/* the stock card's label wraps to two lines, so its value sits straight under */
.elementor.elementor .jsx-ir-figure--stock .jsx-ir-figure__label { margin-block-end: 8px; }

.elementor.elementor .jsx-ir-figure__line,
.elementor.elementor .jsx-ir-figure__value {
	margin: 0 0 2px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: inherit;
}

.elementor.elementor .jsx-ir-figure__value { font-weight: 500; }
.elementor.elementor .jsx-ir-figure__line:last-child,
.elementor.elementor .jsx-ir-figure__value:last-child { margin-block-end: 0; }

/* --- the shared action ---------------------------------------------------- */

.elementor.elementor .jsx-ir-cta {
	display: inline-flex;
	align-items: center;
	gap: 12px;
	min-height: 48px;
	padding-inline: 28px;
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-dark );
	text-decoration: none;
	transition: background-color 160ms ease;
}

.elementor.elementor .jsx-ir-cta:hover,
.elementor.elementor .jsx-ir-cta:focus-visible { background-color: var( --dp-violet ); }

/* the icon follows the href, exactly as section 73 does elsewhere */
.elementor.elementor .jsx-ir-cta::after {
	content: "";
	flex: 0 0 auto;
	width: 15px;
	height: 12px;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

/*
 * PSE Edge serves its filing through a viewer URL ending `#download` rather
 * than a .pdf path, so the extension test alone left the site's only two
 * download actions wearing an arrow.
 */
.elementor.elementor .jsx-ir-cta[href$=".pdf" i]::after,
.elementor.elementor .jsx-ir-cta[href*=".pdf?" i]::after,
.elementor.elementor .jsx-ir-cta[href$="#download" i]::after {
	width: 14px;
	height: 14px;
	-webkit-mask-image: var( --jsx-download );
	mask-image: var( --jsx-download );
}

.elementor.elementor .jsx-ir-cta:hover::after { transform: translateX( 3px ); }
.elementor.elementor .jsx-ir-cta[href$=".pdf" i]:hover::after,
.elementor.elementor .jsx-ir-cta[href$="#download" i]:hover::after { transform: translateY( 2px ); }

.elementor.elementor .jsx-ir-ctarow { display: flex; flex-wrap: wrap; gap: 24px; }

/* --- split row (IR Programmes) ------------------------------------------- */

/*
 * 620 of copy against a 580 photo on a 40 gutter — exactly the 1240 container
 * (Figma 189:2). Top-aligned, not centred: the copy runs to three paragraphs
 * and a centred photo would float against a ragged column.
 */
.elementor.elementor .jsx-ir-split {
	display: grid;
	grid-template-columns: minmax( 0, 620px ) 580px;
	gap: 40px;
	align-items: start;
}

.elementor.elementor .jsx-ir-split__img {
	width: 100%;
	height: auto;
	border-radius: 4px;
	display: block;
}

/* --- routing cards (Disclosures & News) ---------------------------------- */

/*
 * The three card grids. The shareholder card is deliberately NOT in this list
 * any more — it is a single block, not a grid — and the news band now uses the
 * site's own jsx-nx-grid.
 */
.elementor.elementor .jsx-ir-routegrid,
.elementor.elementor .jsx-ir-exploregrid,
.elementor.elementor .jsx-ir-pillars {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 32px;
}

.elementor.elementor .jsx-ir-routegrid { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); gap: 40px; }

.elementor.elementor .jsx-ir-route {
	padding: 32px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
}

.elementor.elementor .jsx-ir-route__title {
	margin: 0 0 8px;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ir-route__text {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/*
 * Inside a routing card the action is a text link with the arrow pushed to the
 * card's edge, not a pill — a filled button inside a bordered card reads as two
 * nested boxes. Approved frame 189:9.
 */
.elementor.elementor .jsx-ir-routecta {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin: 32px 0 0;
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.4;
	color: var( --dp-blue );
	text-decoration: none;
}

.elementor.elementor .jsx-ir-routecta::after {
	content: "";
	flex: 0 0 auto;
	width: 15px;
	height: 12px;
	background-image: var( --jsx-arrow-blue );
	background-repeat: no-repeat;
	background-size: contain;
	transition: transform 160ms ease;
}

.elementor.elementor .jsx-ir-route:hover .jsx-ir-routecta { text-decoration: underline; }
.elementor.elementor .jsx-ir-route:hover .jsx-ir-routecta::after { transform: translateX( 3px ); }

/* --- pillars (What drives us forward) ------------------------------------ */

.elementor.elementor .jsx-ir-pillars { grid-template-columns: repeat( 3, minmax( 0, 1fr ) ); gap: 30px; }

.elementor.elementor .jsx-ir-pillar {
	padding: 32px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
}

.elementor.elementor .jsx-ir-pillar__label {
	margin: 0 0 12px;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var( --dp-blue );
}

.elementor.elementor .jsx-ir-pillar__title {
	margin: 0 0 12px;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ir-pillar__body {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/* --- integrated report band ---------------------------------------------- */

/*
 * Regraded violet -> blue -> light blue left to right, so the copy sits on the
 * violet end (8.5:1) and the pale end falls behind the cover image. A plain
 * left-to-right ramp put light blue under white text at 2.12:1.
 */
/*
 * The one band whose height is set by its artwork, not the 96 rhythm: the cover
 * is 453 tall and sits 34 from each edge, which is what makes the band 520.
 */
.elementor.elementor .jsx-ir-report { padding-block: 34px 33px; }

.elementor.elementor .jsx-ir-report {
	background-image: linear-gradient( 110deg, var( --dp-violet ) 0%, var( --dp-blue ) 52%, var( --dp-light-blue ) 100% );
}

/*
 * The cover stops 80px short of the container's right edge in the approved
 * frame, which is what leaves the copy exactly 700 wide. That inset is the
 * reason for the padding rather than a wider gap.
 */
.elementor.elementor .jsx-ir-report__inner {
	display: grid;
	grid-template-columns: minmax( 0, 1fr ) 320px;
	gap: 140px;
	padding-inline-end: 80px;
	align-items: center;
}

.elementor.elementor .jsx-ir-report__cover {
	width: 320px;
	height: auto;
	display: block;
	border-radius: 4px;
	box-shadow: 0 18px 48px rgba( 11, 6, 24, 0.28 );
}

.elementor.elementor .jsx-ir-cta--light {
	background-color: var( --dp-white );
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ir-cta--light:hover,
.elementor.elementor .jsx-ir-cta--light:focus-visible { background-color: var( --dp-light-blue ); color: var( --dp-text-on-light ); }

/* --- shareholder contacts ------------------------------------------------ */

/*
 * Not two cards side by side: the approved frame puts the heading and lead in a
 * 700 column and BOTH contact blocks in a single brand-blue card to its right,
 * centred. The card is the section's one piece of colour, so it does the work
 * of drawing the eye to the only action on the band.
 */
.elementor.elementor .jsx-ir-share {
	display: grid;
	grid-template-columns: minmax( 0, 1fr ) 480px;
	gap: 60px;
	/* Jun, 2026-10-04: the heading and lead sit on the card's vertical centre, not its top */
	align-items: center;
}

.elementor.elementor .jsx-ir-contacts {
	display: block;
	margin: 0;
	padding: 48px 32px;
	background-color: var( --dp-blue );
	border: 0;
	border-radius: 8px;
	text-align: center;
}

/* the second block is a separate contact, so it is spaced not ruled */
.elementor.elementor .jsx-ir-contacts .jsx-ir-contact__label + * { margin-block-start: 0; }




.elementor.elementor .jsx-ir-contact__label {
	margin: 0 0 12px;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var( --dp-text-on-dark-muted );
}

.elementor.elementor .jsx-ir-contact__name {
	margin: 0 0 14px;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	letter-spacing: -0.005em;
	color: var( --dp-text-on-dark );
}

/*
 * Centred lines with a leading glyph: the icon is drawn as an inline-block
 * before the text so the icon+text group centres together. Hanging the icon off
 * the paragraph's box instead would centre the text and leave the icon adrift.
 */
.elementor.elementor .jsx-ir-contact__line {
	margin: 0 0 8px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-ir-contact__line--pin::before,
.elementor.elementor .jsx-ir-contact__line--tel::before {
	content: "";
	display: inline-block;
	vertical-align: -2px;
	width: 16px;
	height: 16px;
	margin-inline-end: 8px;
	background-color: currentColor;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-size: contain;
	mask-size: contain;
}

.elementor.elementor .jsx-ir-contact__line--pin::before {
	-webkit-mask-image: var( --jsx-pin );
	mask-image: var( --jsx-pin );
}

.elementor.elementor .jsx-ir-contact__line--tel::before {
	-webkit-mask-image: var( --jsx-tel );
	mask-image: var( --jsx-tel );
}

.elementor.elementor .jsx-ir-contact__line a { color: inherit; text-decoration: none; }

/*
 * The two spacing exceptions inside the card. They sit after the base rules
 * because those set `margin` as a shorthand, which would otherwise reset these
 * back to zero regardless of specificity.
 */
.elementor.elementor .jsx-ir-contact__line--pin { margin-block-end: 41px; }
.elementor.elementor .jsx-ir-contact__label--second { margin-block-start: 33px; }
.elementor.elementor .jsx-ir-contact__line a:hover { text-decoration: underline; }

/* --- latest news --------------------------------------------------------- */


/* --- explore more -------------------------------------------------------- */

.elementor.elementor .jsx-ir-exploregrid { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); gap: 40px; }

.elementor.elementor .jsx-ir-exploreroute {
	display: block;
	min-height: 178px;
	padding: 28px 72px 28px 32px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 14px;
	background-image: var( --jsx-arrow-blue );
	background-repeat: no-repeat;
	background-position: right 32px center;
	background-size: 15px 12px;
	text-decoration: none;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.elementor.elementor .jsx-ir-exploreroute:hover,
.elementor.elementor .jsx-ir-exploreroute:focus-visible {
	border-color: var( --dp-blue );
	box-shadow: 0 8px 24px rgba( 11, 6, 24, 0.07 );
}

.elementor.elementor .jsx-ir-exploreroute__title {
	display: block;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 40px;
	line-height: 1.2;
	letter-spacing: -0.01em;
	color: var( --dp-text-on-light );
}

/* --- breakpoints ---------------------------------------------------------- */

/* =============================================================================
 * Vertical rhythm
 *
 * Every gap below is measured off the approved frames (186:32 / 212:44) rather
 * than chosen. It is declared on ONE side only — the start of each element,
 * keyed on what precedes it — because the previous build leaned on collapsing
 * margins, which can only ever produce the LARGER of two values and so could
 * not express a 53 that follows a title and a 35 that follows a paragraph.
 *
 *            desktop  mobile
 *   title   →   53      24
 *   title   → lead      33      16
 *   lead    →   44      28
 *   body    → body      35      18
 *   body    → lists     69      36
 *   eyebrow → title     12       8
 *   any     → CTA       36      24
 *
 * Where the frames disagree with themselves — title→lead is 33 in Dividends and
 * 20 in What drives us forward — the dominant value wins, because a consistent
 * page beats a literal transcription of a drawing.
 * ========================================================================== */

.elementor.elementor .jsx-ir-inner > * + *,
.elementor.elementor .jsx-ir-title + * { margin-block-start: 53px; }

/* the report band's inner is a grid, not a stack: its columns sit side by side */
.elementor.elementor .jsx-ir-report__inner > * + * { margin-block-start: 0; }
.elementor.elementor .jsx-ir-title + .jsx-ir-lead { margin-block-start: 33px; }
.elementor.elementor .jsx-ir-lead + * { margin-block-start: 44px; }
.elementor.elementor .jsx-ir-body + * { margin-block-start: 35px; }
.elementor.elementor .jsx-ir-body + .jsx-ir-lists { margin-block-start: 69px; }
.elementor.elementor .jsx-ir-eyebrow + .jsx-ir-title { margin-block-start: 12px; }
.elementor.elementor .jsx-ir-inner > * + .jsx-ir-cta,
.elementor.elementor .jsx-ir-inner > * + .jsx-ir-ctarow { margin-block-start: 36px; }

/* the two copy columns run the same scale inside their own box */
.elementor.elementor .jsx-ir-split__copy > * + * { margin-block-start: 35px; }
.elementor.elementor .jsx-ir-split__copy > .jsx-ir-title + * { margin-block-start: 33px; }
.elementor.elementor .jsx-ir-split__copy > * + .jsx-ir-cta { margin-block-start: 33px; }

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-ir-band,
	.elementor.elementor .jsx-ir-hero,
	.elementor.elementor .jsx-ir-nav { padding-inline: 40px; }
	.elementor.elementor .jsx-ir-lists,
	.elementor.elementor .jsx-ir-split,
	.elementor.elementor .jsx-ir-report__inner { gap: 48px; }
}

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-ir-hero { padding-block: 128px 88px; }
	.elementor.elementor .jsx-ir-band { padding-block: 72px; }
	.elementor.elementor .jsx-ir-lists,
	.elementor.elementor .jsx-ir-split,
	.elementor.elementor .jsx-ir-report__inner { grid-template-columns: minmax( 0, 1fr ); row-gap: 40px; }
	.elementor.elementor .jsx-ir-figures,
	.elementor.elementor .jsx-ir-pillars,
	.elementor.elementor .jsx-ir-report__cover { justify-self: start; }
}

@media ( max-width: 767px ) {
	/* hero padding, alignment and type below 768 are overridden by §92 (one phone hero for every inner page) */
	.elementor.elementor .jsx-ir-hero {
		padding-block: 215px 60px;
		padding-inline: var( --dp-gutter-mobile );
	}
	.elementor.elementor .jsx-ir-hero__title { font-size: 40px; line-height: 1.1; }
	.elementor.elementor .jsx-ir-hero__sub { margin-block-start: 16px; font-size: 16px; }

	/* the mobile half of the scale declared above */
	.elementor.elementor .jsx-ir-inner > * + *,
	.elementor.elementor .jsx-ir-title + * { margin-block-start: 24px; }
	.elementor.elementor .jsx-ir-title + .jsx-ir-lead { margin-block-start: 16px; }
	.elementor.elementor .jsx-ir-lead + * { margin-block-start: 28px; }
	.elementor.elementor .jsx-ir-body + * { margin-block-start: 18px; }
	.elementor.elementor .jsx-ir-body + .jsx-ir-lists { margin-block-start: 36px; }
	.elementor.elementor .jsx-ir-eyebrow + .jsx-ir-title { margin-block-start: 8px; }
	.elementor.elementor .jsx-ir-inner > * + .jsx-ir-cta,
	.elementor.elementor .jsx-ir-inner > * + .jsx-ir-ctarow { margin-block-start: 24px; }

	.elementor.elementor .jsx-ir-split__copy > * + * { margin-block-start: 18px; }
	.elementor.elementor .jsx-ir-split__copy > .jsx-ir-title + * { margin-block-start: 16px; }
	.elementor.elementor .jsx-ir-split__copy > * + .jsx-ir-cta { margin-block-start: 20px; }

	/* the report band returns to the 56 rhythm; its cover is not full-bleed here */
	.elementor.elementor .jsx-ir-report { padding-block: 56px; }
	.elementor.elementor .jsx-ir-routecta { margin-block-start: 38px; }

	.elementor.elementor .jsx-ir-band,
	.elementor.elementor .jsx-ir-nav { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-ir-band { padding-block: 56px; }
	.elementor.elementor .jsx-ir-title { font-size: 30px; line-height: 1.18; }

	/* the anchor row becomes a scrolling chip strip */
	.elementor.elementor .jsx-ir-nav__inner { gap: 8px; padding-block: 20px; }
	.elementor.elementor .jsx-ir-nav__link {
		padding: 9px 14px;
		border: 0;
		border-radius: 18px;
		background-color: var( --dp-lavender );
		font-size: 13px;
		line-height: 1.4;
	}
	.elementor.elementor .jsx-ir-nav__link:has( > a.is-current ),
	.elementor.elementor .jsx-ir-nav__link.is-current { background-color: var( --dp-blue ); color: var( --dp-text-on-dark ); }

	/* the short label replaces the long one on the chip strip */
	.elementor.elementor .jsx-ir-nav__link span:first-child { display: none; }
	.elementor.elementor .jsx-ir-nav__link span:nth-child( 2 ) { display: inline; }
	.jsx-ir [id] { scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px ); }

	.elementor.elementor .jsx-ir-lists { row-gap: 32px; }
	.elementor.elementor .jsx-ir-doclist { padding: 24px; }
	/* the approved mobile row step is 40, against 44 on desktop */
	.elementor.elementor .jsx-ir-doc__link { padding-block: 9px; }
	/* two columns of 14px rows is unreadable at 350px */
	.elementor.elementor .jsx-ir-doclist--split { columns: 1; }

	.elementor.elementor .jsx-ir-figures,
	.elementor.elementor .jsx-ir-routegrid,
	.elementor.elementor .jsx-ir-exploregrid { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-ir-pillars { grid-template-columns: minmax( 0, 1fr ); gap: 14px; }

	.elementor.elementor .jsx-ir-route { padding: 24px; }
	.elementor.elementor .jsx-ir-pillar { padding: 25px; }

	/*
	 * The figure label stays at 32px on a phone — the approved frame does not
	 * step it down, and it is the only thing carrying each card.
	 */
	.elementor.elementor .jsx-ir-figure { padding: 28px 24px 18px; }
	.elementor.elementor .jsx-ir-figure__label { font-size: 32px; margin-block-end: 17px; }
	.elementor.elementor .jsx-ir-figure--stock .jsx-ir-figure__label { margin-block-end: 8px; }

	/* the shareholder split stacks, and the card runs the content width */
	.elementor.elementor .jsx-ir-share { display: block; }
	.elementor.elementor .jsx-ir-contacts { margin-block-start: 28px; padding: 24px; }

	/* cards soften a step at 390 */
	.elementor.elementor .jsx-ir-pillar,
	.elementor.elementor .jsx-ir-route,
	.elementor.elementor .jsx-ir-exploreroute { border-radius: 14px; }
	.elementor.elementor .jsx-ir-doclist { border-radius: 0 0 48px 0; }

	/*
	 * Both split bands reorder to heading, picture, copy — the approved mobile
	 * order (M8, M11). The copy column goes `display: contents` so its heading
	 * and paragraphs become siblings of the image and can be ordered around it;
	 * reordering the column as a block could only put the image above the
	 * heading or a screen below it.
	 */
	/*
	 * gap: 0 and align-items: stretch are both corrections, not defaults — the
	 * desktop grid's row-gap survives the switch to flex and would add 40 to
	 * every gap, and its align-items: center would centre the whole column.
	 */
	.elementor.elementor .jsx-ir-split,
	.elementor.elementor .jsx-ir-report__inner {
		display: flex;
		flex-direction: column;
		align-items: stretch;
		gap: 0;
		padding-inline-end: 0;
	}
	.elementor.elementor .jsx-ir-split .jsx-ir-split__copy,
	.elementor.elementor .jsx-ir-report__inner .jsx-ir-split__copy { display: contents; }

	.elementor.elementor .jsx-ir-split .jsx-ir-title,
	.elementor.elementor .jsx-ir-report__inner .jsx-ir-title { order: 1; margin-block-start: 0; }

	/* the picture owns the gap on both sides of itself */
	.elementor.elementor .jsx-ir-split__img,
	.elementor.elementor .jsx-ir-report__cover { order: 2; margin-block: 18px 22px; }

	/* ...so the split itself adds none on top of the heading above it */
	.elementor.elementor .jsx-ir-title + .jsx-ir-split { margin-block-start: 0; }
	.elementor.elementor .jsx-ir-split .jsx-ir-body:first-of-type,
	.elementor.elementor .jsx-ir-report__inner .jsx-ir-lead { margin-block-start: 0; }

	.elementor.elementor .jsx-ir-split .jsx-ir-body,
	.elementor.elementor .jsx-ir-report__inner .jsx-ir-lead,
	.elementor.elementor .jsx-ir-report__inner .jsx-ir-cta { order: 3; }
	.elementor.elementor .jsx-ir-report__inner .jsx-ir-cta { align-self: flex-start; }

	/*
	 * Both tables stop being tables — a 3- or 5-column grid at 350px would set
	 * every cell two or three characters wide — but they stop differently.
	 *
	 * Analyst Coverage becomes a plain stacked list, because company / name /
	 * email need no labels to be read. Dividends keeps its labels, because
	 * "0.83" and "31-March-2026" mean nothing without them.
	 */
	.elementor.elementor .jsx-ir-table,
	.elementor.elementor .jsx-ir-table tbody,
	.elementor.elementor .jsx-ir-table tr,
	.elementor.elementor .jsx-ir-table td { display: block; width: 100%; }

	.elementor.elementor .jsx-ir-table { border-radius: 0; overflow: visible; }
	.elementor.elementor .jsx-ir-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset( 50% ); }
	.elementor.elementor .jsx-ir-table td { padding: 0; }

	/* --- Analyst Coverage: a stacked list, ruled between brokers --- */
	.elementor.elementor .jsx-ir-table--analysts tr { padding-block: 16px; }
	.elementor.elementor .jsx-ir-table--analysts tr + tr { border-block-start: 1px solid var( --dp-line-on-light ); }
	.elementor.elementor .jsx-ir-table--analysts td,
	.elementor.elementor .jsx-ir-table--analysts tbody tr:nth-child( odd ) td { background-color: transparent; }
	.elementor.elementor .jsx-ir-table--analysts td::before { content: none; }
	.elementor.elementor .jsx-ir-table--analysts td:first-child {
		margin-block-end: 2px;
		font-size: 18px;
		font-weight: 600;
		color: var( --dp-text-on-light );
	}
	.elementor.elementor .jsx-ir-table--analysts td:nth-child( 2 ) { color: var( --dp-text-on-light-muted ); }

	/* --- Dividends: one light-blue card per year --- */
	.elementor.elementor .jsx-ir-table--dividends tr {
		margin-block-end: 14px;
		padding: 16px 20px;
		border-radius: 8px;
		background-color: var( --dp-light-blue );
	}
	.elementor.elementor .jsx-ir-table--dividends tbody td {
		display: flex;
		justify-content: space-between;
		gap: 16px;
		padding-block: 6px;
		background-color: transparent;
		box-shadow: none;
		text-align: end;
	}
	.elementor.elementor .jsx-ir-table--dividends td::before {
		content: attr( data-label );
		flex: 0 0 auto;
		font-family: var( --dp-font-subhead );
		font-weight: 500;
		font-size: 13px;
		letter-spacing: 0.08em;
		text-transform: uppercase;
		color: var( --dp-text-on-light );
		text-align: start;
	}
	.elementor.elementor .jsx-ir-table--dividends td:first-child {
		display: block;
		padding-block: 0 6px;
		font-family: var( --dp-font-subhead );
		font-size: 18px;
		text-align: start;
	}
	.elementor.elementor .jsx-ir-table--dividends td:first-child::before { content: none; }

	/* the photo runs the content width; the report cover is a 240 object */
	.elementor.elementor .jsx-ir-split__img { width: 100%; max-width: none; }
	.elementor.elementor .jsx-ir-report__cover { width: 240px; }

	/*
	 * The action inverts on a phone: an outlined white pill with a brand-blue
	 * label and the glyph leading, sized to its text rather than the column
	 * (approved frame 214:62). The label is 7.8:1 on white; the 1px hairline is
	 * decorative, and the coloured label is what identifies the control.
	 */
	.elementor.elementor .jsx-ir-cta {
		width: auto;
		min-height: 46px;
		margin-block-start: 28px;
		padding-inline: 18px;
		gap: 10px;
		flex-direction: row-reverse;
		justify-content: flex-start;
		background-color: var( --dp-white );
		border: 1px solid var( --dp-line-on-light );
		color: var( --dp-blue );
	}
	.elementor.elementor .jsx-ir-cta:hover,
	.elementor.elementor .jsx-ir-cta:focus-visible {
		background-color: var( --dp-white );
		border-color: var( --dp-blue );
	}
	/* on the report band the pill is already white, so only the glyph moves */
	.elementor.elementor .jsx-ir-cta--light { border-color: var( --dp-white ); color: var( --dp-text-on-light ); }
	.elementor.elementor .jsx-ir-cta--light:hover,
	.elementor.elementor .jsx-ir-cta--light:focus-visible { border-color: var( --dp-white ); }

	/* row-reverse puts the ::after glyph first, so the nudge reverses too */
	.elementor.elementor .jsx-ir-cta:hover::after { transform: translateX( -3px ); }
	.elementor.elementor .jsx-ir-cta[href$=".pdf" i]:hover::after,
	.elementor.elementor .jsx-ir-cta[href$="#download" i]:hover::after { transform: translateY( 2px ); }

	.elementor.elementor .jsx-ir-ctarow {
		flex-direction: column;
		align-items: flex-start;
		gap: 12px;
		margin-block-start: 28px;
	}
	.elementor.elementor .jsx-ir-ctarow .jsx-ir-cta { margin-block-start: 0; }

	.elementor.elementor .jsx-ir-exploreroute { min-height: 136px; padding: 24px 56px 24px 24px; background-position: right 24px center; }
	.elementor.elementor .jsx-ir-exploreroute__title { font-size: 26px; }
		}

/* =============================================================================
 * 75. Sustainability (page 14971) — Figma 224:32 / 473:3
 *
 * Structure lives in the atomic Elementor document; only four blocks come from
 * inc/sustainability.php, because each iterates an ACF repeater. Everything
 * renders inside .elementor, so each selector is doubled to outrank the atomic
 * base layer and the per-element local styles — the same mechanism as 63 and 74.
 *
 * The vertical scale is this page's own, measured off its frames: 44 under a
 * section title against Investor Relations' 53, because the Sustainability
 * frames are drawn tighter.
 * ========================================================================== */

/* --- bands ---------------------------------------------------------------- */

.elementor.elementor .jsx-su-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-su-band--tint { background-color: var( --dp-lavender-soft ); }

/* the two feature bands carry the brand wash, measured at 109deg off the frame */
.elementor.elementor .jsx-su-band--wash {
	background-image: linear-gradient( 109deg, #f4f1fe 0%, #eef6ff 100% );
}

.elementor.elementor .jsx-su-inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

.elementor.elementor .jsx-su-inner > .jsx-su-cta,
.elementor.elementor .jsx-su-inner > .jsx-su-eyebrow { align-self: flex-start; }

/* --- type ----------------------------------------------------------------- */

.elementor.elementor .jsx-su-title {
	max-width: 900px;
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.015em;
	color: var( --dp-text-on-light );
}

/* Integrated Report and Performance Highlights are feature moments at 56 */
.elementor.elementor .jsx-su-title--feature { font-size: 56px; line-height: 1.14; }
.elementor.elementor .jsx-su-title span { color: var( --dp-blue ); }

.elementor.elementor .jsx-su-lead {
	max-width: 1000px;
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-light );
}

/* the chairman's pull quote */
.elementor.elementor .jsx-su-statement {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.34;
	letter-spacing: -0.01em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-su-body {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-su-caption {
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 18px;
	line-height: 1.3;
	letter-spacing: -0.005em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-su-name {
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-su-role {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.04em;
	color: var( --dp-text-on-light-muted );
}

/* --- hero ----------------------------------------------------------------- */

.elementor.elementor .jsx-su-hero {
	position: relative;
	overflow: hidden;
	padding-block: 165px 165px;
	padding-inline: var( --dp-gutter );
	background-color: #0b0618;
	/*
	 * Dark scrim, not navy + brand wash: the header CTA is brand blue (2026-10-03).
	 * Strength settled at .66–.70 the same day: .60 left the 18px sub weak over
	 * light shirts (Jun), .72–.76 was "too dark" (Jun). Worst-case white text in
	 * the headline band is ~7.8:1 here. Same strength on every inner hero.
	 */
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.66 ) 0%, rgba( 11, 6, 24, 0.70 ) 34%, rgba( 11, 6, 24, 0.68 ) 80%, rgba( 11, 6, 24, 0.64 ) 100% ),
		url( "/wp-content/uploads/2026/10/sus-hero.jpg" );
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
	text-align: center;
}

/* flex, for the same reason the band inner is: Elementor's own indentation
   leaves whitespace text nodes that a block container turns into line boxes */
.elementor.elementor .jsx-su-hero__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

.elementor.elementor .jsx-su-hero__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-su-hero__title span { color: var( --dp-light-blue ); }

.elementor.elementor .jsx-su-hero__sub {
	max-width: 760px;
	margin: 28px auto 0;
	font-family: var( --dp-font-body );
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-dark );
}

/* --- anchor nav ----------------------------------------------------------- */

.elementor.elementor .jsx-su-nav {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) ); /* + admin bar when logged in, as .jsx-cg-nav */
	z-index: 20;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-su-nav__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	gap: 30px;
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-su-nav__inner::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-su-nav__link {
	display: inline-block;
	padding-block: 24px 18px;
	border-block-end: 3px solid transparent;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-su-nav__link:hover,
.elementor.elementor .jsx-su-nav__link:focus-visible { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-su-nav__link:has( > a.is-current ),
.elementor.elementor .jsx-su-nav__link.is-current {
	color: var( --dp-blue );
	border-block-end-color: var( --dp-blue );
}

.jsx-su [id] { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 74px ); }

/* --- split bands ---------------------------------------------------------- */

/*
 * Four bands pair copy with artwork. The Approach band leads with its copy at
 * 440 against a 720 diagram; Governance and Contact centre a shorter copy
 * column against a taller photograph, which is what puts their headings below
 * the band's top padding in the frame.
 */
.elementor.elementor .jsx-su-split {
	display: grid;
	grid-template-columns: minmax( 0, 620px ) 580px;
	gap: 40px;
	align-items: center;
}

/* Contact gives its photograph more air: 560 of copy on a 100 gutter */
.elementor.elementor .jsx-su-split--contact {
	grid-template-columns: minmax( 0, 560px ) 580px;
	gap: 100px;
}

.elementor.elementor .jsx-su-split--diagram {
	grid-template-columns: minmax( 0, 440px ) 720px;
	gap: 80px;
	align-items: start;
}

/*
 * The copy is staggered 140 below the diagram's caption, so it reads against
 * the middle of the artwork rather than racing it from the top. It is an
 * explicit offset in the frame, not centring — centring this block would land
 * it at 468 against the 490 drawn.
 */
.elementor.elementor .jsx-su-split--diagram .jsx-su-split__copy { padding-block-start: 140px; }

/*
 * The wheel is drawn at 580 and top-aligned in the frame. Jun asked for it
 * smaller with the copy centred against it: at 500 the diagram stops competing
 * with the heading, and the copy block is short enough that centring reads as
 * deliberate rather than as a gap under the text.
 */
.elementor.elementor .jsx-su-split--wheel {
	grid-template-columns: minmax( 0, 540px ) 500px;
	gap: 200px;
	align-items: center;
}

/* the heading stays at the top of its column; only the copy centres */
.elementor.elementor .jsx-su-split--wheel .jsx-su-split__copy { justify-content: center; }

.elementor.elementor .jsx-su-split__copy {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
}

/* the one artwork column that carries a caption above its figure */
.elementor.elementor .jsx-su-figcol {
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

/*
 * Both photographs are cropped in the frame, so the ratio is declared rather
 * than left to the file: the chairman's portrait is 2480x3508 and would run
 * 820 tall in a 580 column against the 640 the design draws.
 */
.elementor.elementor .jsx-su-photo {
	width: 100%;
	height: auto;
	border-radius: 8px;
	object-fit: cover;
	display: block;
}

/*
 * Figma crops this one at 78% of the height from 2% down. With object-fit the
 * same window is 2% / (1 - 0.78) of the overflow — 9% — which is what keeps the
 * subject's head clear of the top edge.
 */
.elementor.elementor .jsx-su-photo--portrait {
	aspect-ratio: 580 / 640;
	object-position: center 9%;
}

.elementor.elementor .jsx-su-photo--wide {
	aspect-ratio: 580 / 520;
	object-position: center;
}

.elementor.elementor .jsx-su-figure {
	width: 100%;
	height: auto;
	display: block;
}

/* --- buttons -------------------------------------------------------------- */

.elementor.elementor .jsx-su-cta {
	display: inline-flex;
	align-items: center;
	gap: 12px;
	min-height: 50px;
	padding-inline: 28px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-dark );
	text-decoration: none;
	transition: background-color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-su-cta:hover,
.elementor.elementor .jsx-su-cta:focus-visible {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
}

/* the glyph follows the href, exactly as section 73 does elsewhere */
.elementor.elementor .jsx-su-cta::after {
	content: "";
	flex: 0 0 auto;
	width: 15px;
	height: 12px;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

.elementor.elementor .jsx-su-cta[href$=".pdf" i]::after,
.elementor.elementor .jsx-su-cta[href*=".pdf?" i]::after {
	width: 14px;
	height: 14px;
	-webkit-mask-image: var( --jsx-download );
	mask-image: var( --jsx-download );
}

.elementor.elementor .jsx-su-cta:hover::after { transform: translateX( 3px ); }
.elementor.elementor .jsx-su-cta[href$=".pdf" i]:hover::after { transform: translateY( 2px ); }

/* --- the report reel ------------------------------------------------------ */

/*
 * A scroll-snapping strip rather than a slider: three covers fit the container
 * today and a fourth will not, so the behaviour has to be right either way.
 * The buttons and rail are driven from the strip's own scroll position, so the
 * component stays correct when a report is added and needs no state of its own.
 */
.elementor.elementor .jsx-su-reports { position: relative; }

.elementor.elementor .jsx-su-reports__track {
	list-style: none;
	margin: 0;
	padding: 0 0 4px;
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: 380px;
	gap: 40px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
	overscroll-behavior-inline: contain;
}

.elementor.elementor .jsx-su-reports__track::-webkit-scrollbar { display: none; }
.elementor.elementor .jsx-su-report { scroll-snap-align: start; }
.elementor.elementor .jsx-su-report__link { display: block; text-decoration: none; }

.elementor.elementor .jsx-su-report__img {
	width: 100%;
	height: 538px;
	object-fit: cover;
	object-position: top center;
	display: block;
	border-radius: 2px;
	box-shadow: 0 18px 48px rgba( 11, 6, 24, 0.14 );
}

.elementor.elementor .jsx-su-report__year {
	margin: 18px 0 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/*
 * The current report is the one the Download button serves. The approved frame
 * marks it with a rule above the label as well, but Jun had that removed: the
 * darker ink already separates it, and a short brand-blue line directly under a
 * cover read as part of the artwork rather than as a state.
 */
.elementor.elementor .jsx-su-report--current .jsx-su-report__year {
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-su-reports__rail {
	margin-block-start: 40px;
	height: 2px;
	border-radius: 1px;
	background-color: var( --dp-line-on-light );
}

.elementor.elementor .jsx-su-reports__thumb {
	display: block;
	width: 75%;
	height: 100%;
	border-radius: 1px;
	background-color: var( --dp-blue );
	transform-origin: left center;
	transition: transform 160ms ease-out;
}

.elementor.elementor .jsx-su-reports__nav {
	position: absolute;
	inset-block-start: -84px;
	inset-inline-end: 0;
	display: flex;
	gap: 12px;
}

.elementor.elementor .jsx-su-reel-btn {
	width: 48px;
	height: 48px;
	padding: 0;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 50%;
	background-color: var( --dp-white );
	cursor: pointer;
	transition: background-color 160ms ease, border-color 160ms ease, opacity 160ms ease;
}

.elementor.elementor .jsx-su-reel-btn::after {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	margin-inline: auto;
	background-color: var( --dp-text-on-light );
	-webkit-mask: var( --jsx-arrow ) no-repeat center / 15px 12px;
	mask: var( --jsx-arrow ) no-repeat center / 15px 12px;
	transform: rotate( 180deg );
}

.elementor.elementor .jsx-su-reel-btn--next {
	background-color: var( --dp-violet );
	border-color: var( --dp-violet );
}

.elementor.elementor .jsx-su-reel-btn--next::after {
	background-color: var( --dp-text-on-dark );
	transform: none;
}

.elementor.elementor .jsx-su-reel-btn:disabled { opacity: 0.4; cursor: default; }

.elementor.elementor .jsx-su-reel-btn:not( :disabled ):hover {
	background-color: var( --dp-blue );
	border-color: var( --dp-blue );
}

.elementor.elementor .jsx-su-reel-btn:not( :disabled ):hover::after { background-color: var( --dp-text-on-dark ); }

/* nothing to scroll: the controls and rail would be lying */
.elementor.elementor .jsx-su-reports[data-dp-reel="static"] .jsx-su-reports__nav,
.elementor.elementor .jsx-su-reports[data-dp-reel="static"] .jsx-su-reports__rail { display: none; }

/* --- the governance chart ------------------------------------------------- */

/*
 * The Board is not a level: the frame places it to the LEFT of the first row,
 * feeding it with a horizontal arrow, while the four levels stack beneath each
 * other and share one column of copy. 230 = the 190 node plus the arrow's gutter.
 */
.elementor.elementor .jsx-su-chart {
	width: 100%;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: 230px minmax( 0, 1fr );
	align-items: start;
}

.elementor.elementor .jsx-su-chart__board { position: relative; }

.elementor.elementor .jsx-su-chart__board::after {
	content: "";
	position: absolute;
	inset-block-start: 39px;
	inset-inline-start: 196px;
	width: 26px;
	height: 8px;
	background-color: var( --dp-blue );
	clip-path: polygon( 0 37%, 70% 37%, 70% 0, 100% 50%, 70% 100%, 70% 63%, 0 63% );
}

.elementor.elementor .jsx-su-chart__levels {
	display: flex;
	flex-direction: column;
	gap: 46px;
}

.elementor.elementor .jsx-su-chart__row {
	position: relative;
	display: grid;
	grid-template-columns: 200px minmax( 0, 1fr );
	gap: 50px;
	align-items: start;
}

/* the Board's own node keeps the frame's slightly narrower box */
.elementor.elementor .jsx-su-chart__board .jsx-su-node { width: 190px; }

/* the connector between levels, drawn rather than placed as six icon frames */
.elementor.elementor .jsx-su-chart__row + .jsx-su-chart__row::before {
	content: "";
	position: absolute;
	inset-block-start: -40px;
	inset-inline-start: 99px;
	width: 2px;
	height: 34px;
	background-color: var( --dp-blue );
}

.elementor.elementor .jsx-su-chart__row + .jsx-su-chart__row::after {
	content: "";
	position: absolute;
	inset-block-start: -10px;
	inset-inline-start: 94px;
	border-inline: 6px solid transparent;
	border-block-start: 8px solid var( --dp-blue );
}

.elementor.elementor .jsx-su-node {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 86px;
	margin: 0;
	padding: 16px;
	border-radius: 6px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.38;
	letter-spacing: 0.1em;
	text-align: center;
	color: var( --dp-text-on-dark );
}

/* the Board sits above the chart, so it reads as its origin, not a level */
.elementor.elementor .jsx-su-chart__board .jsx-su-node {
	background-color: #6fb6f5;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-su-chart__head {
	margin: 0 0 8px;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	letter-spacing: -0.005em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-su-chart__desc {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/* --- ESG pillars ---------------------------------------------------------- */

/*
 * A row per pillar: the coloured tile, then two columns of copy. Each pillar
 * carries its own colour on --su-pillar, so the tile, the rule beneath it and
 * the matching highlight group below all read from one value.
 */
.elementor.elementor .jsx-su-pillars {
	list-style: none;
	width: 100%;
	margin: 0;
	padding: 0;
}

.elementor.elementor .jsx-su-pillar {
	display: grid;
	grid-template-columns: 180px 420px minmax( 0, 1fr );
	gap: 40px;
	align-items: start;
	padding-block-end: 27px;
	border-block-end: 1px solid var( --su-pillar );
}

.elementor.elementor .jsx-su-pillar + .jsx-su-pillar { padding-block-start: 19px; }

.elementor.elementor .jsx-su-pillar__tile {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: space-between;
	width: 180px;
	height: 180px;
	padding: 34px 10px 16px;
	background-color: var( --su-pillar );
}

.elementor.elementor .jsx-su-pillar__icon {
	width: auto;
	height: 74px;
	max-width: 74px;
	object-fit: contain;
	display: block;
}

.elementor.elementor .jsx-su-pillar__label {
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.38;
	letter-spacing: 0.1em;
	text-align: center;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-su-pillar__col {
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

.elementor.elementor .jsx-su-pillar__colhead {
	margin: 0 0 10px;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 18px;
	line-height: 1.3;
	letter-spacing: -0.005em;
	color: var( --dp-text-on-light );
}

/*
 * The column headings are a table head on desktop, so only the first pair is
 * shown; a phone shows every pair, because one header row cannot caption a
 * single stacked column.
 */
.elementor.elementor .jsx-su-pillar + .jsx-su-pillar .jsx-su-pillar__colhead { display: none; }

.elementor.elementor .jsx-su-pillar__text {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light );
}

/*
 * One class per pillar, carrying both the client's brand colour and a readable
 * ink for type. Three of the six — orange, light blue, green — sit at 2.50-2.84:1
 * on white, so a headline figure drawn in the raw colour fails AA at any size;
 * --su-ink is that colour walked down in lightness until it clears 4.5:1, and is
 * identical to --su-pillar for the three that already pass. Tiles, chips, card
 * borders and rules keep the brand value; only type moves.
 *
 * The same class serves the ESG pillar row and its Performance Highlights group,
 * which is what keeps the two sections in step.
 */
.elementor.elementor .jsx-su-p--governance  { --su-pillar: #3066b0; --su-ink: #3066b0; }
.elementor.elementor .jsx-su-p--customer    { --su-pillar: #f07b36; --su-ink: #b65d29; }
.elementor.elementor .jsx-su-p--responsible { --su-pillar: #ab2668; --su-ink: #ab2668; }
.elementor.elementor .jsx-su-p--employees   { --su-pillar: #51a1d4; --su-ink: #3e7aa1; }
.elementor.elementor .jsx-su-p--economic    { --su-pillar: #44b96a; --su-ink: #31854c; }
.elementor.elementor .jsx-su-p--climate     { --su-pillar: #63429b; --su-ink: #63429b; }

/* --- performance highlights ----------------------------------------------- */

.elementor.elementor .jsx-su-highlights {
	width: 100%;
	display: flex;
	flex-direction: column;
	gap: 68px;
}

.elementor.elementor .jsx-su-hgroup__head {
	display: flex;
	align-items: center;
	gap: 16px;
	margin: 0 0 24px;
	padding-block-end: 20px;
	border-block-end: 1px solid color-mix( in srgb, var( --su-pillar ) 30%, transparent );
}

.elementor.elementor .jsx-su-hgroup__title {
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.35;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-su-hgroup__chip {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: 10px;
	background-color: var( --su-pillar );
}

.elementor.elementor .jsx-su-hgroup__icon {
	width: 22px;
	height: 22px;
	object-fit: contain;
	display: block;
}

.elementor.elementor .jsx-su-hcards {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	gap: 28px;
	align-items: stretch;
}

.elementor.elementor .jsx-su-hcard {
	display: flex;
	flex-direction: column;
	padding: 22px 24px 24px;
	background-color: var( --dp-white );
	border: 1px solid var( --su-pillar );
	border-radius: 12px;
}

.elementor.elementor .jsx-su-hcard__stat {
	margin: 0 0 10px;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.34;
	letter-spacing: -0.01em;
	color: var( --su-ink, var( --su-pillar ) );
}

.elementor.elementor .jsx-su-hcard__body {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/* the Great Place To Work card leads with a badge instead of a figure */
.elementor.elementor .jsx-su-hcard__badge { margin-block-end: 14px; }
.elementor.elementor .jsx-su-hcard__badgeimg {
	width: 80px;
	height: auto;
	display: block;
}

/* --- explore routes ------------------------------------------------------- */

.elementor.elementor .jsx-su-routes {
	width: 100%;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	gap: 40px;
}

.elementor.elementor .jsx-su-route {
	display: block;
	min-height: 178px;
	padding: 28px 72px 28px 32px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 14px;
	background-image: var( --jsx-arrow-blue );
	background-repeat: no-repeat;
	background-position: right 32px center;
	background-size: 15px 12px;
	text-decoration: none;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.elementor.elementor .jsx-su-route:hover,
.elementor.elementor .jsx-su-route:focus-visible {
	border-color: var( --dp-blue );
	box-shadow: 0 12px 32px rgba( 11, 6, 24, 0.08 );
}

/*
 * flex, not inline-flex: inside the routing card an inline box sits on a line
 * box and inherits its leading, which pushed the eyebrow 3 below the card's
 * padding and the title 7 below where the frame draws it.
 */
.elementor.elementor .jsx-su-eyebrow {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var( --dp-blue );
}

.elementor.elementor .jsx-su-eyebrow__mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

.elementor.elementor .jsx-su-eyebrow__text { margin: 0; font: inherit; letter-spacing: inherit; color: inherit; }

.elementor.elementor .jsx-su-route__title {
	display: block;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 40px;
	line-height: 1.2;
	letter-spacing: -0.01em;
	color: var( --dp-text-on-light );
}

/* --- vertical rhythm ------------------------------------------------------ */

/*
 * Measured off the Sustainability frames, which are drawn tighter than the
 * Investor Relations set: 44 under a section title against IR's 53. Declared on
 * margin-block-start only, keyed on what precedes — see section 74 for why a
 * collapsing-margin scale cannot express two different gaps after two different
 * elements.
 */
.elementor.elementor .jsx-su-inner > * + *,
.elementor.elementor .jsx-su-title + * { margin-block-start: 44px; }
.elementor.elementor .jsx-su-title--feature + * { margin-block-start: 56px; }
.elementor.elementor .jsx-su-head + * { margin-block-start: 72px; }
.elementor.elementor .jsx-su-lead + * { margin-block-start: 44px; }
.elementor.elementor .jsx-su-body + * { margin-block-start: 22px; }
.elementor.elementor .jsx-su-statement + * { margin-block-start: 20px; }
.elementor.elementor .jsx-su-caption + * { margin-block-start: 20px; }
.elementor.elementor .jsx-su-body + .jsx-su-name { margin-block-start: 24px; }
.elementor.elementor .jsx-su-name + .jsx-su-role { margin-block-start: 4px; }
.elementor.elementor .jsx-su-inner > * + .jsx-su-cta { margin-block-start: 32px; }

.elementor.elementor .jsx-su-split__copy > * + * { margin-block-start: 22px; }
.elementor.elementor .jsx-su-split__copy > .jsx-su-title + * { margin-block-start: 44px; }
.elementor.elementor .jsx-su-split__copy > * + .jsx-su-cta { margin-block-start: 32px; }
.elementor.elementor .jsx-su-split--contact .jsx-su-body + * { margin-block-start: 14px; }
.elementor.elementor .jsx-su-split--contact .jsx-su-body + .jsx-su-cta { margin-block-start: 28px; }

/* the split's own columns sit side by side, so the stack's rhythm is not theirs */
.elementor.elementor .jsx-su-split > * + *,
.elementor.elementor .jsx-su-head > * + * { margin-block-start: 0; }

.elementor.elementor .jsx-su-eyebrow + .jsx-su-route__title { margin-block-start: 8px; }

/* the Integrated Report head: the title against its intro and download */
.elementor.elementor .jsx-su-head {
	display: grid;
	grid-template-columns: minmax( 0, 560px ) 580px;
	gap: 100px;
	align-items: start;
}

.elementor.elementor .jsx-su-head > * + * { margin-block-start: 0; }
.elementor.elementor .jsx-su-head .jsx-su-body + .jsx-su-cta { margin-block-start: 32px; }

/* --- 1339 ----------------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-su-band,
	.elementor.elementor .jsx-su-hero,
	.elementor.elementor .jsx-su-nav { padding-inline: 56px; }
	.elementor.elementor .jsx-su-split,
	.elementor.elementor .jsx-su-split--diagram,
	.elementor.elementor .jsx-su-split--wheel,
	.elementor.elementor .jsx-su-head { gap: 56px; grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1fr ); }
	.elementor.elementor .jsx-su-pillar { grid-template-columns: 160px minmax( 0, 1fr ) minmax( 0, 1fr ); gap: 28px; }
}

/* --- 1024 ----------------------------------------------------------------- */

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-su-hcards { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); }
	.elementor.elementor .jsx-su-routes { grid-template-columns: minmax( 0, 1fr ); }
	.elementor.elementor .jsx-su-hero__title { font-size: 52px; }
	.elementor.elementor .jsx-su-title { font-size: 38px; }
	.elementor.elementor .jsx-su-title--feature { font-size: 44px; }
}

/* --- 767 ------------------------------------------------------------------ */

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-su-hero {
		padding-block: 148px 56px;
		padding-inline: var( --dp-gutter-mobile );
	}
	.elementor.elementor .jsx-su-hero__title { font-size: 40px; line-height: 1.1; }
	.elementor.elementor .jsx-su-hero__sub { margin-block-start: 16px; font-size: 16px; }

	.elementor.elementor .jsx-su-band,
	.elementor.elementor .jsx-su-nav { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-su-band { padding-block: 56px; }
	.elementor.elementor .jsx-su-title { font-size: 30px; line-height: 1.18; }
	.elementor.elementor .jsx-su-title--feature { font-size: 30px; }
	.elementor.elementor .jsx-su-lead { font-size: 17px; }
	.elementor.elementor .jsx-su-statement { font-size: 24px; }

	/* the mobile half of the scale */
	.elementor.elementor .jsx-su-inner > * + *,
	.elementor.elementor .jsx-su-title + *,
	.elementor.elementor .jsx-su-title--feature + * { margin-block-start: 24px; }
	.elementor.elementor .jsx-su-head + * { margin-block-start: 32px; }
	.elementor.elementor .jsx-su-lead + * { margin-block-start: 24px; }
	.elementor.elementor .jsx-su-body + * { margin-block-start: 18px; }
	.elementor.elementor .jsx-su-statement + *,
	.elementor.elementor .jsx-su-caption + * { margin-block-start: 16px; }
	.elementor.elementor .jsx-su-inner > * + .jsx-su-cta { margin-block-start: 24px; }
	/*
	 * The report band's copy is drawn tighter than a section heading: 18 under
	 * the title, and the CTA takes the scale's 24 rather than the 32 the desktop
	 * head rule sets (which has no mobile override of its own).
	 */
	.elementor.elementor .jsx-su-head .jsx-su-title + * { margin-block-start: 18px; }
	.elementor.elementor .jsx-su-head .jsx-su-body + .jsx-su-cta { margin-block-start: 24px; }
	.elementor.elementor .jsx-su-split__copy > * + * { margin-block-start: 18px; }
	.elementor.elementor .jsx-su-split__copy > .jsx-su-title + * { margin-block-start: 24px; }

	/* the anchor row becomes a scrolling chip strip, as on Investor Relations */
	.elementor.elementor .jsx-su-nav__inner { gap: 8px; padding-block: 20px; }
	.elementor.elementor .jsx-su-nav__link {
		padding: 9px 14px;
		border: 0;
		border-radius: 18px;
		background-color: var( --dp-lavender );
		font-size: 13px;
		line-height: 1.4;
	}
	.elementor.elementor .jsx-su-nav__link:has( > a.is-current ),
	.elementor.elementor .jsx-su-nav__link.is-current { background-color: var( --dp-blue ); color: var( --dp-text-on-dark ); }
	.jsx-su [id] { scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px ); }

	/*
	 * Every split stacks with its artwork directly under the heading — the
	 * approved mobile order on all four. display: contents on the copy column
	 * is what lets the picture sit between the heading and the body; see the
	 * same mechanism in section 74.
	 */
	.elementor.elementor .jsx-su-split,
	.elementor.elementor .jsx-su-split--diagram,
	.elementor.elementor .jsx-su-split--wheel,
	.elementor.elementor .jsx-su-head {
		display: flex;
		flex-direction: column;
		align-items: stretch;
		gap: 0;
	}
	.elementor.elementor .jsx-su-split .jsx-su-split__copy,
	.elementor.elementor .jsx-su-split .jsx-su-figcol { display: contents; }
	/* the desktop stagger has nothing to offset against in one column */
	.elementor.elementor .jsx-su-split--diagram .jsx-su-split__copy { padding-block-start: 0; }

	/*
	 * The Approach band's lead sits OUTSIDE its split on desktop, where it spans
	 * the full 1000. On a phone the diagram has to follow the heading like every
	 * other band, so the split itself goes display: contents and the whole
	 * section — heading, caption, diagram, lead, body — orders as one stack.
	 */
	.elementor.elementor .jsx-su-split--diagram { display: contents; }
	.elementor.elementor .jsx-su-inner:has( .jsx-su-split--diagram ) > .jsx-su-lead { order: 4; margin-block-start: 24px; }
	.elementor.elementor .jsx-su-split--diagram ~ * { order: 5; }

	/*
	 * Order is set on the copy elements themselves, not on `.jsx-su-split > *`.
	 * The copy column is display: contents, so its paragraphs are flex items but
	 * NOT child selector matches — left to the child rule they kept order 0 and
	 * sorted above the picture.
	 */
	.elementor.elementor .jsx-su-split .jsx-su-title { order: 1; margin-block-start: 0; }
	.elementor.elementor .jsx-su-split .jsx-su-caption { order: 2; margin-block: 18px 10px; }
	.elementor.elementor .jsx-su-split .jsx-su-photo,
	.elementor.elementor .jsx-su-split .jsx-su-figure { order: 3; margin-block: 18px 22px; }
	.elementor.elementor .jsx-su-split .jsx-su-lead,
	.elementor.elementor .jsx-su-split .jsx-su-body,
	.elementor.elementor .jsx-su-split .jsx-su-statement,
	.elementor.elementor .jsx-su-split .jsx-su-name,
	.elementor.elementor .jsx-su-split .jsx-su-role,
	.elementor.elementor .jsx-su-split .jsx-su-cta { order: 4; }

	/*
	 * The Approach band stacks from the inner, so it repeats the orders there —
	 * and every one of these MUST stay scoped to that band with :has(). An
	 * `order` on a band title alone sinks it below every sibling that has no
	 * order of its own: unscoped, this sent the Governance, Pillars and
	 * Highlights titles to the BOTTOM of their own sections, under the chart,
	 * the six pillars and the twenty highlight cards.
	 */
	.elementor.elementor .jsx-su-inner:has( .jsx-su-split--diagram ) > .jsx-su-title { order: 1; }
	.elementor.elementor .jsx-su-inner:has( .jsx-su-split--diagram ) .jsx-su-caption { order: 2; margin-block: 24px 10px; }
	.elementor.elementor .jsx-su-inner:has( .jsx-su-split--diagram ) .jsx-su-figcol .jsx-su-figure { order: 3; margin-block: 0 0; }
	/*
	 * Scoped to the Approach band. Unscoped, order 5 also hit Contact and
	 * Governance, where it pushed the body paragraphs BELOW the button and the
	 * chairman's name — both of which sit at order 4.
	 */
	.elementor.elementor .jsx-su-split--diagram .jsx-su-split__copy .jsx-su-body { order: 5; }
	.elementor.elementor .jsx-su-split--diagram .jsx-su-split__copy .jsx-su-body:first-of-type { margin-block-start: 24px; }
	.elementor.elementor .jsx-su-split .jsx-su-caption + .jsx-su-figure { margin-block-start: 0; }
	.elementor.elementor .jsx-su-split .jsx-su-lead,
	.elementor.elementor .jsx-su-split .jsx-su-body:first-of-type { margin-block-start: 0; }

	/* the report reel: 240 covers, as the approved mobile frame draws them */
	.elementor.elementor .jsx-su-reports__track { grid-auto-columns: 240px; gap: 36px; }
	.elementor.elementor .jsx-su-report__img { height: 340px; }
	.elementor.elementor .jsx-su-reports__nav { position: static; margin-block-start: 24px; }
	.elementor.elementor .jsx-su-reports__rail { margin-block-start: 24px; }

	/*
	 * The chart stacks: the Board moves from beside the first level to above it,
	 * so its feeding arrow has to turn with it — the desktop rule points right
	 * out of a 230px column that does not exist at this width.
	 */
	.elementor.elementor .jsx-su-chart {
		grid-template-columns: minmax( 0, 1fr );
		gap: 36px;
	}
	.elementor.elementor .jsx-su-chart__board .jsx-su-node { width: 100%; }
	.elementor.elementor .jsx-su-chart__board::after {
		inset-block-start: auto;
		inset-block-end: -30px;
		inset-inline-start: calc( 50% - 4px );
		width: 8px;
		height: 24px;
		clip-path: polygon( 37% 0, 37% 70%, 0 70%, 50% 100%, 100% 70%, 63% 70%, 63% 0 );
	}
	.elementor.elementor .jsx-su-chart__levels { gap: 36px; }
	.elementor.elementor .jsx-su-chart__row { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-su-chart__row + .jsx-su-chart__row::before { inset-block-start: -30px; inset-inline-start: calc( 50% - 1px ); height: 22px; }
	.elementor.elementor .jsx-su-chart__row + .jsx-su-chart__row::after { inset-block-start: -10px; inset-inline-start: calc( 50% - 6px ); }

	/*
	 * A pillar becomes a colour bar and one column of copy, and every pair of
	 * column headings is shown — a single header row cannot caption a stacked
	 * column.
	 */
	.elementor.elementor .jsx-su-pillar {
		grid-template-columns: minmax( 0, 1fr );
		gap: 24px;
		padding-block-end: 32px;
	}
	.elementor.elementor .jsx-su-pillar + .jsx-su-pillar { padding-block-start: 32px; }
	.elementor.elementor .jsx-su-pillar__tile {
		flex-direction: row;
		justify-content: flex-start;
		gap: 16px;
		width: 100%;
		height: auto;
		min-height: 92px;
		padding: 20px 24px;
	}
	.elementor.elementor .jsx-su-pillar__icon { height: 44px; max-width: 44px; }
	.elementor.elementor .jsx-su-pillar__label { text-align: start; }
	.elementor.elementor .jsx-su-pillar + .jsx-su-pillar .jsx-su-pillar__colhead { display: block; }

	.elementor.elementor .jsx-su-highlights { gap: 44px; }
	.elementor.elementor .jsx-su-hcards { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-su-hcard__stat { font-size: 26px; }

	.elementor.elementor .jsx-su-routes { gap: 16px; }
	.elementor.elementor .jsx-su-route { min-height: 136px; padding: 24px 56px 24px 24px; background-position: right 24px center; }
	.elementor.elementor .jsx-su-route__title { font-size: 26px; }
}

/* === §76 Responsible Gaming ============================================== */

/*
 * Page 15104, built from Figma `305:3` (desktop) and `488:3` (mobile 390).
 * Mirrors the Sustainability/Investor Relations band system: 96/96 bands on a
 * 1240 container, a sticky anchor nav under the header, and split bands that
 * pair a 600 copy column with a 580 photograph on the 1340 right edge.
 *
 * Two sections are tab groups (Elementor's atomic e-tabs). All six panels are
 * in the DOM at every breakpoint — this is regulatory content, so it is never
 * JS-gated away. Below 768 the tab list is hidden and every panel is shown
 * stacked, which is exactly what the approved mobile frame draws.
 */

/*
 * Elementor's atomic containers ship `display: flex; flex-direction: row` and a
 * 10px padding. The composition API drops per-element local styles here, so the
 * base is neutralised once from the stylesheet and each layout class sets its
 * own below — without this the eleven sections lay out as eleven columns.
 */
.elementor.elementor [class*="jsx-rg-"] { padding: 0; }

.elementor.elementor .jsx-rg-page,
.elementor.elementor .jsx-rg-hero,
.elementor.elementor .jsx-rg-nav,
.elementor.elementor .jsx-rg-band { display: block; }

/* --- hero ----------------------------------------------------------------- */

.elementor.elementor .jsx-rg-hero {
	position: relative;
	overflow: hidden;
	padding-block: 165px;
	padding-inline: var( --dp-gutter );
	background-color: #0b0618;
	/*
	 * Dark scrim, not navy + brand wash: the header CTA is brand blue (2026-10-03).
	 * Strength settled at .66–.70 the same day: .60 left the 18px sub weak over
	 * light shirts (Jun), .72–.76 was "too dark" (Jun). Worst-case white text in
	 * the headline band is ~7.8:1 here. Same strength on every inner hero.
	 */
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.66 ) 0%, rgba( 11, 6, 24, 0.70 ) 34%, rgba( 11, 6, 24, 0.68 ) 80%, rgba( 11, 6, 24, 0.64 ) 100% ),
		url( "/wp-content/uploads/2026/10/rg-hero-championing-safe-play.jpg" );
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
	text-align: center;
}

/* flex, so Elementor's own indentation does not leave line boxes behind */
.elementor.elementor .jsx-rg-hero__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

.elementor.elementor .jsx-rg-hero__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-rg-hero__title span { color: var( --dp-light-blue ); }

/* --- eyebrow -------------------------------------------------------------- */

/* flex, not inline-flex: an inline box inherits the line box's leading and
   pushes the marker off the cap height */
.elementor.elementor .jsx-rg-eyebrow {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.10em;
	text-transform: uppercase;
	color: var( --dp-blue );
}

.elementor.elementor .jsx-rg-eyebrow--onhero { justify-content: center; color: var( --dp-light-blue ); }
.elementor.elementor .jsx-rg-eyebrow--center { justify-content: center; }

.elementor.elementor .jsx-rg-mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

.elementor.elementor .jsx-rg-eyebrow__text { margin: 0; font: inherit; letter-spacing: inherit; color: inherit; }

/* --- anchor nav ----------------------------------------------------------- */

.elementor.elementor .jsx-rg-nav {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) ); /* + admin bar when logged in, as .jsx-cg-nav */
	z-index: 20;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-rg-nav__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	gap: 30px;
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-rg-nav__inner::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-rg-nav__link {
	display: inline-block;
	margin: 0;
	padding-block: 24px 18px;
	border-block-end: 3px solid transparent;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-rg-nav__link:hover,
.elementor.elementor .jsx-rg-nav__link:focus-visible { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-rg-nav__link:has( > a.is-current ),
.elementor.elementor .jsx-rg-nav__link.is-current {
	color: var( --dp-blue );
	border-block-end-color: var( --dp-blue );
}

/* the anchors are menu-anchor widgets inside each band; the site-wide rule
   clears the header but not this page's sticky section nav */
.elementor.elementor .jsx-rg-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 78px ); }

/* --- bands ---------------------------------------------------------------- */

/*
 * The frame leaves all eight content bands white, which on Investor Relations
 * read as one undifferentiated gap rather than eight sections. Same fix here:
 * alternate the surface instead of cutting the air. The two collages with real
 * transparency (customer support, EmbracePLUS) both land on white bands.
 */
.elementor.elementor .jsx-rg-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-rg-band--tint { background-color: var( --dp-lavender-soft ); }

.elementor.elementor .jsx-rg-inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

.elementor.elementor .jsx-rg-inner--center { align-items: center; text-align: center; }
.elementor.elementor .jsx-rg-inner--center .jsx-rg-split { text-align: start; }

/* --- type ----------------------------------------------------------------- */

.elementor.elementor .jsx-rg-title {
	max-width: 900px;
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.015em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-rg-inner--center > * { width: 100%; }
.elementor.elementor .jsx-rg-title--center { width: 100%; max-width: var( --dp-container ); text-align: center; }
.elementor.elementor .jsx-rg-inner--center .jsx-rg-lead { margin-inline: auto; }
.elementor.elementor .jsx-rg-title span { color: var( --dp-blue ); }

.elementor.elementor .jsx-rg-lead {
	max-width: 840px;
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-rg-body {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-rg-body strong { font-weight: 600; color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-rg-body a {
	color: var( --dp-blue );
	text-decoration: none;
}

.elementor.elementor .jsx-rg-body a:hover,
.elementor.elementor .jsx-rg-body a:focus-visible { text-decoration: underline; }

/* --- split bands ---------------------------------------------------------- */

/*
 * One split serves six bands: a 600 copy column and a 580 photograph whose
 * right edge lands on the 1340 gutter. Exclusion Program reverses it; Advocacy's
 * second row pairs two equal 580 columns.
 */
.elementor.elementor .jsx-rg-split {
	width: 100%;
	display: grid;
	grid-template-columns: minmax( 0, 600px ) 580px;
	gap: 60px;
	align-items: center;
}

.elementor.elementor .jsx-rg-split--figfirst { grid-template-columns: 580px minmax( 0, 600px ); }
.elementor.elementor .jsx-rg-split--even { grid-template-columns: 580px 580px; justify-content: space-between; gap: 80px; }
.elementor.elementor .jsx-rg-split--contact { grid-template-columns: minmax( 0, 560px ) 580px; gap: 100px; }

/* the tab panels and Advocacy's first row hang their copy from the top */
.elementor.elementor .jsx-rg-split--top { align-items: start; }

.elementor.elementor .jsx-rg-split__copy {
	min-width: 0;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
}

/* --- media ---------------------------------------------------------------- */

.elementor.elementor .jsx-rg-img {
	display: block;
	width: 100%;
	aspect-ratio: 580 / 387;
	border-radius: 12px;
	object-fit: cover;
	object-position: center;
}

.elementor.elementor .jsx-rg-split--figfirst .jsx-rg-img { aspect-ratio: 580 / 414; }
.elementor.elementor .jsx-rg-split--contact .jsx-rg-img { aspect-ratio: 580 / 520; }

/* the Player Care panels are drawn against a taller collage; one ratio across
   the group keeps the band from jumping as the tabs change */
.elementor.elementor .jsx-rg-care-group .jsx-rg-img { aspect-ratio: 580 / 498; }

/* the two transparent collages are compositions, not photographs — cropping
   them to fill would cut the artwork */
.elementor.elementor .jsx-rg-img--contain { object-fit: contain; }

/* the surety-bond key visual carries its headline and logos as artwork, so a
   cover crop cuts them mid-word; the eKYC asset is a UI composite whose left
   panel explains the steps and whose right panel is a rejection dialog */
.elementor.elementor .jsx-rg-img--left { object-position: left center; }

/*
 * The film is a poster with a play control, not an inline player: the frame
 * draws a 22% scrim and an 88px white disc with a brand-blue triangle. Clicking
 * it opens a <dialog>, which brings the modal behaviour, the focus trap and the
 * Escape key with it.
 */
.elementor.elementor .jsx-rg-video { display: block; width: 100%; }

.elementor.elementor .jsx-rg-video__open {
	position: relative;
	display: block;
	width: 100%;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 12px;
	overflow: hidden;
	background-color: #0b0618;
	aspect-ratio: 1240 / 698;
	cursor: pointer;
}

.elementor.elementor .jsx-rg-video__poster {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

.elementor.elementor .jsx-rg-video__scrim {
	position: absolute;
	inset: 0;
	background-color: rgba( 8, 16, 41, 0.22 );
	transition: background-color 180ms ease;
}

.elementor.elementor .jsx-rg-video__play {
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 88px;
	height: 88px;
	margin: -44px 0 0 -44px;
	border-radius: 50%;
	background-color: var( --dp-white );
	transition: transform 180ms ease;
}

/* the glyph is a CSS triangle, nudged right so it reads optically centred */
.elementor.elementor .jsx-rg-video__play::after {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 0;
	height: 0;
	margin: -13px 0 0 -8px;
	border-block: 13px solid transparent;
	border-inline-start: 21px solid var( --dp-blue );
	border-inline-end: 0;
}

.elementor.elementor .jsx-rg-video__open:hover .jsx-rg-video__scrim,
.elementor.elementor .jsx-rg-video__open:focus-visible .jsx-rg-video__scrim { background-color: rgba( 8, 16, 41, 0.34 ); }
.elementor.elementor .jsx-rg-video__open:hover .jsx-rg-video__play { transform: scale( 1.06 ); }
.elementor.elementor .jsx-rg-video__open:focus-visible { outline: 3px solid var( --dp-blue ); outline-offset: 3px; }

/* --- the lightbox --------------------------------------------------------- */

.elementor.elementor .jsx-rg-lightbox {
	width: min( 1240px, 92vw );
	max-width: none;
	max-height: none;
	margin: auto;
	padding: 0;
	border: 0;
	border-radius: 12px;
	background-color: transparent;
	overflow: visible;
}

.elementor.elementor .jsx-rg-lightbox::backdrop { background-color: rgba( 8, 16, 41, 0.86 ); }

.elementor.elementor .jsx-rg-lightbox__video {
	display: block;
	width: 100%;
	max-height: 82vh;
	border-radius: 12px;
	background-color: #0b0618;
}

.elementor.elementor .jsx-rg-lightbox__close {
	position: absolute;
	inset-block-start: -52px;
	inset-inline-end: 0;
	width: 44px;
	height: 44px;
	padding: 0;
	border: 1px solid rgba( 255, 255, 255, 0.4 );
	border-radius: 50%;
	background-color: transparent;
	cursor: pointer;
}

.elementor.elementor .jsx-rg-lightbox__close::before,
.elementor.elementor .jsx-rg-lightbox__close::after {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 18px;
	height: 2px;
	margin: -1px 0 0 -9px;
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-rg-lightbox__close::before { transform: rotate( 45deg ); }
.elementor.elementor .jsx-rg-lightbox__close::after { transform: rotate( -45deg ); }
.elementor.elementor .jsx-rg-lightbox__close:hover { border-color: var( --dp-white ); }
.elementor.elementor .jsx-rg-lightbox__close:focus-visible { outline: 2px solid var( --dp-light-blue ); outline-offset: 2px; }

/* --- tab groups ----------------------------------------------------------- */

/*
 * The two groups are rendered by [dp_rg_panels] off an ACF repeater, so the
 * rhythm and the full width have to be claimed on Elementor's shortcode
 * wrapper — the group itself is three divs deeper, and Elementor leaves
 * shortcode output at justify-self: start, which would size it to fit-content.
 */
.elementor.elementor .jsx-rg-inner > .elementor-widget-shortcode,
.elementor.elementor .elementor-widget-shortcode > .elementor-widget-container,
.elementor.elementor .elementor-widget-shortcode .elementor-shortcode { width: 100%; }

.elementor.elementor .jsx-rg-tabs { width: 100%; display: block; }

.elementor.elementor .jsx-rg-tabs__list {
	display: flex;
	gap: 48px;
	justify-content: flex-start;
	border-block-end: 1px solid var( --dp-line-on-light );
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-rg-tabs__list::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-rg-tab {
	flex: 0 0 auto;
	width: auto;
	min-height: 0;
	margin: 0 0 -1px;
	padding: 0 0 8px;
	border: 0;
	border-block-end: 2px solid transparent;
	border-radius: 0;
	background-color: transparent;
	cursor: pointer;
	transition: border-color 160ms ease;
}

.elementor.elementor .jsx-rg-tab__label {
	display: block;
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	transition: color 160ms ease;
}

.elementor.elementor .jsx-rg-tab.is-active { border-block-end-color: var( --dp-blue ); }
.elementor.elementor .jsx-rg-tab.is-active .jsx-rg-tab__label { color: var( --dp-blue ); }
.elementor.elementor .jsx-rg-tab:hover .jsx-rg-tab__label { color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-rg-tab:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 4px; }

.elementor.elementor .jsx-rg-tabs__panels { display: block; }
.elementor.elementor .jsx-rg-panel { display: block; margin: 0; }
.elementor.elementor .jsx-rg-panel__body { display: block; }

/* `hidden` has to be re-asserted: the rules above set display on the same
   elements the attribute is meant to switch off */
.elementor.elementor .jsx-rg-panel[hidden],
.elementor.elementor .jsx-rg-panel__body[hidden],
.elementor.elementor .jsx-rg-panel__toggle[hidden],
.elementor.elementor .jsx-rg-tabs__list[hidden] { display: none; }

/* the accordion heading is the phone's affordance; the tab label carries the
   name on a desktop, so the heading would simply repeat it */
.elementor.elementor .jsx-rg-panel__heading { margin: 0; }
.elementor.elementor .jsx-rg-panel__heading:has( > .jsx-rg-panel__toggle[hidden] ) { display: none; }

/* --- CTA ------------------------------------------------------------------ */

.elementor.elementor .jsx-rg-cta {
	display: inline-flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	min-width: 190px;
	min-height: 52px;
	padding-inline: 28px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-dark );
	text-decoration: none;
	transition: background-color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-rg-cta::after {
	content: "";
	width: 15px;
	height: 12px;
	background-image: var( --jsx-arrow-white );
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
}

.elementor.elementor .jsx-rg-cta:hover,
.elementor.elementor .jsx-rg-cta:focus-visible { background-color: var( --dp-violet ); border-color: var( --dp-violet ); }

/* --- explore more --------------------------------------------------------- */

.elementor.elementor .jsx-rg-routes {
	width: 100%;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	gap: 40px;
}

.elementor.elementor .jsx-rg-route {
	display: block;
	min-height: 178px;
	padding: 28px 72px 28px 32px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 14px;
	background-image: var( --jsx-arrow-blue );
	background-repeat: no-repeat;
	background-position: right 32px center;
	background-size: 15px 12px;
	text-decoration: none;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.elementor.elementor .jsx-rg-route:hover,
.elementor.elementor .jsx-rg-route:focus-visible {
	border-color: var( --dp-blue );
	box-shadow: 0 8px 24px rgba( 70, 0, 255, 0.10 );
}

.elementor.elementor .jsx-rg-route__title {
	display: block;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 40px;
	line-height: 1.2;
	letter-spacing: -0.01em;
	color: var( --dp-text-on-light );
}

/* --- vertical rhythm ------------------------------------------------------ */

/*
 * Every gap is declared as margin-block-start on the FOLLOWING element, keyed
 * on what precedes it. This block must stay after every rule above that writes
 * `margin` as a shorthand — a later `margin: 0` resets margin-top whatever the
 * specificity.
 */
.elementor.elementor .jsx-rg-inner > * + *,
.elementor.elementor .jsx-rg-title + * { margin-block-start: 24px; }
.elementor.elementor .jsx-rg-eyebrow + * { margin-block-start: 16px; }
.elementor.elementor .jsx-rg-lead + * { margin-block-start: 56px; }
.elementor.elementor .jsx-rg-title--center + .jsx-rg-split { margin-block-start: 56px; }
.elementor.elementor .jsx-rg-title + .elementor-widget-shortcode { margin-block-start: 44px; }
.elementor.elementor .jsx-rg-split + .jsx-rg-split { margin-block-start: 72px; }
.elementor.elementor .jsx-rg-tabs__list + * { margin-block-start: 48px; }

.elementor.elementor .jsx-rg-split__copy > * + * { margin-block-start: 20px; }
.elementor.elementor .jsx-rg-split__copy > .jsx-rg-title + * { margin-block-start: 24px; }
.elementor.elementor .jsx-rg-split__copy > * + .jsx-rg-cta { margin-block-start: 40px; }

/* a grid inner is not a stack: the split's own children are placed by the grid */
.elementor.elementor .jsx-rg-split > * { margin-block-start: 0; }

.elementor.elementor .jsx-rg-route__title { margin-block-start: 8px; }

/* --- 1339 ----------------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-rg-band,
	.elementor.elementor .jsx-rg-hero,
	.elementor.elementor .jsx-rg-nav { padding-inline: 56px; }
	.elementor.elementor .jsx-rg-split,
	.elementor.elementor .jsx-rg-split--figfirst,
	.elementor.elementor .jsx-rg-split--even,
	.elementor.elementor .jsx-rg-split--contact {
		grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1fr );
		gap: 56px;
	}
	.elementor.elementor .jsx-rg-tabs__list { gap: 32px; }
}

/* --- 1024 ----------------------------------------------------------------- */

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-rg-hero__title { font-size: 52px; }
	.elementor.elementor .jsx-rg-title { font-size: 38px; }
	.elementor.elementor .jsx-rg-routes { grid-template-columns: minmax( 0, 1fr ); }
	.elementor.elementor .jsx-rg-route__title { font-size: 32px; }
	.elementor.elementor .jsx-rg-tab__label { font-size: 18px; }
}

/* --- 767 ------------------------------------------------------------------ */

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-rg-hero {
		padding-block: 148px 56px;
		padding-inline: var( --dp-gutter-mobile );
	}
	.elementor.elementor .jsx-rg-hero__title { font-size: 40px; line-height: 1.1; }

	.elementor.elementor .jsx-rg-band,
	.elementor.elementor .jsx-rg-nav { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-rg-band { padding-block: 56px; }

	.elementor.elementor .jsx-rg-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px ); }

	/* the anchor row becomes a scrolling chip strip, as the mobile frame draws */
	.elementor.elementor .jsx-rg-nav__inner { gap: 8px; padding-block: 20px; }
	.elementor.elementor .jsx-rg-nav__link {
		padding: 9px 14px;
		border: 0;
		border-radius: 18px;
		background-color: var( --dp-lavender );
		font-size: 13px;
		line-height: 1.4;
	}
	.elementor.elementor .jsx-rg-nav__link:has( > a.is-current ),
	.elementor.elementor .jsx-rg-nav__link.is-current {
		background-color: var( --dp-blue );
		color: var( --dp-text-on-dark );
	}

	.elementor.elementor .jsx-rg-title { font-size: 30px; }
	.elementor.elementor .jsx-rg-route__title { font-size: 22px; }
	.elementor.elementor .jsx-rg-routes { gap: 16px; }
	.elementor.elementor .jsx-rg-route { min-height: 108px; padding: 22px 56px 22px 24px; background-position: right 24px center; }

	.elementor.elementor .jsx-rg-video__open { aspect-ratio: 350 / 197; border-radius: 16px; }
	.elementor.elementor .jsx-rg-video__play { width: 56px; height: 56px; margin: -28px 0 0 -28px; }
	.elementor.elementor .jsx-rg-video__play::after {
		margin: -8px 0 0 -5px;
		border-block-width: 8px;
		border-inline-start-width: 13px;
	}
	.elementor.elementor .jsx-rg-lightbox { width: 92vw; }
	.elementor.elementor .jsx-rg-lightbox__close { inset-block-start: -56px; }
	.elementor.elementor .jsx-rg-img { aspect-ratio: 350 / 234; }
	.elementor.elementor .jsx-rg-split--figfirst .jsx-rg-img { aspect-ratio: 350 / 250; }
	.elementor.elementor .jsx-rg-split--contact .jsx-rg-img { aspect-ratio: 350 / 314; }
	.elementor.elementor .jsx-rg-care-group .jsx-rg-img { aspect-ratio: 350 / 301; }

	/*
	 * Every split becomes title → photograph → copy. The copy column goes
	 * display: contents so its children are flex items of the split itself —
	 * ordering the column as a block can only put the picture above the heading
	 * or a whole screen below it. Because `contents` removes the column from the
	 * box tree, the order has to be set on the copy elements themselves, not on
	 * `.jsx-rg-split > *`, which no longer matches them.
	 */
	.elementor.elementor .jsx-rg-split,
	.elementor.elementor .jsx-rg-split--figfirst,
	.elementor.elementor .jsx-rg-split--even,
	.elementor.elementor .jsx-rg-split--contact {
		display: flex;
		flex-direction: column;
		align-items: stretch;
		gap: 0;
	}
	.elementor.elementor .jsx-rg-split .jsx-rg-split__copy { display: contents; }

	.elementor.elementor .jsx-rg-split .jsx-rg-title { order: 1; margin-block-start: 0; }
	.elementor.elementor .jsx-rg-split .jsx-rg-img { order: 2; margin-block-start: 18px; }
	.elementor.elementor .jsx-rg-split .jsx-rg-body,
	.elementor.elementor .jsx-rg-split .jsx-rg-cta { order: 3; margin-block-start: 14px; }
	.elementor.elementor .jsx-rg-split .jsx-rg-img + .jsx-rg-body { margin-block-start: 22px; }
	.elementor.elementor .jsx-rg-split .jsx-rg-cta { margin-block-start: 20px; }

	/* Advocacy's second row leads with its picture and has no heading of its own */
	.elementor.elementor .jsx-rg-split--even .jsx-rg-img { order: 1; margin-block-start: 0; }
	.elementor.elementor .jsx-rg-split--even .jsx-rg-body { order: 2; margin-block-start: 22px; }
	.elementor.elementor .jsx-rg-split + .jsx-rg-split { margin-block-start: 22px; }

	/*
	 * Advocacy's first row interleaves: intro, picture, then the rest of the
	 * copy. Its section heading sits outside the split, so the generic
	 * heading-picture-copy order does not apply.
	 */
	.elementor.elementor .jsx-rg-split--advocacy .jsx-rg-body { order: 3; margin-block-start: 24px; }
	.elementor.elementor .jsx-rg-split--advocacy .jsx-rg-body:first-of-type { order: 1; margin-block-start: 18px; }
	.elementor.elementor .jsx-rg-split--advocacy .jsx-rg-img { order: 2; margin-block-start: 22px; }

	/*
	 * The RG Tools band leads with its video on a phone, as every other band
	 * leads with its picture. Scoped with :has() — an `order` on one child
	 * re-sorts the whole container, and the Advocacy band shares this class.
	 */
	.elementor.elementor .jsx-rg-inner--center:has( .jsx-rg-video ) > .jsx-rg-eyebrow { order: 1; }
	.elementor.elementor .jsx-rg-inner--center:has( .jsx-rg-video ) > .jsx-rg-title { order: 2; }
	.elementor.elementor .jsx-rg-inner--center:has( .jsx-rg-video ) > .elementor-widget-shortcode { order: 3; margin-block-start: 18px; }
	.elementor.elementor .jsx-rg-inner--center:has( .jsx-rg-video ) > .jsx-rg-lead { order: 4; margin-block-start: 22px; }

	/*
	 * The group becomes an accordion: the tab list goes, each panel's heading
	 * becomes its trigger and the first panel opens. Every panel stays in the
	 * DOM — this is regulatory copy, so a closed panel is hidden from view,
	 * never from the document.
	 */
	.elementor.elementor .jsx-rg-tabs__list { display: none; }

	.elementor.elementor .jsx-rg-panel { border-block-start: 1px solid var( --dp-line-on-light ); }
	.elementor.elementor .jsx-rg-panel:last-child { border-block-end: 1px solid var( --dp-line-on-light ); }

	.elementor.elementor .jsx-rg-panel__toggle {
		display: flex;
		align-items: center;
		justify-content: space-between;
		gap: 16px;
		width: 100%;
		margin: 0;
		padding: 18px 0;
		border: 0;
		background-color: transparent;
		text-align: start;
		cursor: pointer;
	}
	.elementor.elementor .jsx-rg-panel__toggle:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: -2px; }

	.elementor.elementor .jsx-rg-panel__title {
		display: block;
		margin: 0;
		font-family: var( --dp-font-body );
		font-weight: 600;
		font-size: 18px;
		line-height: 1.35;
		color: var( --dp-text-on-light );
		transition: color 160ms ease;
	}
	.elementor.elementor .jsx-rg-panel__toggle[aria-expanded="true"] .jsx-rg-panel__title { color: var( --dp-blue ); }

	/* a chevron drawn from two borders, so it needs no asset and inherits ink */
	.elementor.elementor .jsx-rg-panel__chev {
		flex: 0 0 auto;
		width: 10px;
		height: 10px;
		border-inline-end: 2px solid var( --dp-blue );
		border-block-end: 2px solid var( --dp-blue );
		transform: translateY( -3px ) rotate( 45deg );
		transition: transform 180ms ease;
	}
	.elementor.elementor .jsx-rg-panel__toggle[aria-expanded="true"] .jsx-rg-panel__chev {
		transform: translateY( 2px ) rotate( -135deg );
	}

	.elementor.elementor .jsx-rg-panel__body { padding-block-end: 24px; }

	/* inside an open panel the picture leads, then the copy */
	.elementor.elementor .jsx-rg-panel__body .jsx-rg-img { margin-block-start: 0; }
	.elementor.elementor .jsx-rg-panel__body .jsx-rg-body { margin-block-start: 22px; }
	.elementor.elementor .jsx-rg-panel__body .jsx-rg-body + .jsx-rg-body { margin-block-start: 14px; }

	.elementor.elementor .jsx-rg-title + .elementor-widget-shortcode { margin-block-start: 18px; }

	/* the mobile half of the scale */
	.elementor.elementor .jsx-rg-inner > * + *,
	.elementor.elementor .jsx-rg-title + * { margin-block-start: 18px; }
	.elementor.elementor .jsx-rg-eyebrow + * { margin-block-start: 12px; }
	.elementor.elementor .jsx-rg-lead + * { margin-block-start: 22px; }
	.elementor.elementor .jsx-rg-title--center + .jsx-rg-split { margin-block-start: 18px; }
	.elementor.elementor .jsx-rg-split__copy > * + * { margin-block-start: 14px; }
	/*
	 * Stacked, the picture sits between a heading and its copy — but `display:
	 * contents` on the copy column means the two are NOT siblings, so the gap
	 * under the picture has to be declared on the heading's successor.
	 */
	.elementor.elementor .jsx-rg-split__copy > .jsx-rg-title + * { margin-block-start: 22px; }
	.elementor.elementor .jsx-rg-route__title { margin-block-start: 6px; }
}

/* === §77 shared component wrapper ======================================= */

/*
 * A component instance is a widget, and a widget cannot sit at the root of a
 * document — Elementor renders nothing for it. It needs a container, and the
 * container must get out of the way: the component's own root is a full-bleed
 * band with its own padding.
 */
.elementor.elementor .jsx-cmp {
	display: block;
	width: 100%;
	padding: 0;
	margin: 0;
}

/* === §78 Careers ========================================================= */

/*
 * Page 15180, from Figma `332:58` (desktop) and `494:3` (mobile 390).
 * Same band system as Investor Relations, Sustainability and Responsible
 * Gaming: 96/96 bands on a 1240 container, a sticky anchor nav, splits that
 * pair copy with artwork. Four blocks come from PHP because they are not
 * layout — two scrolling strips over ACF repeaters, the film, the job board
 * and the testimonial loop — and "Connect with us" is a shared Elementor
 * component, so it carries its own `jsx-ob-*` styles from §70.
 */

/* Elementor's atomic base: flex-direction row and a 10px padding on every
   container. Neutralised once; each layout class sets its own below. */
.elementor.elementor [class*="jsx-car-"] { padding: 0; }

.elementor.elementor .jsx-car-page,
.elementor.elementor .jsx-car-hero,
.elementor.elementor .jsx-car-nav,
.elementor.elementor .jsx-car-band { display: block; }

/* --- hero ----------------------------------------------------------------- */

.elementor.elementor .jsx-car-hero {
	position: relative;
	overflow: hidden;
	/* the frame puts the title on 188 and closes the band on 560; the breadcrumb
	   this build adds, which the frame does not draw, lives in the lower half */
	padding-block: 188px 164px;
	padding-inline: var( --dp-gutter );
	background-color: #0b0618;
	/*
	 * Dark scrim, not navy + brand wash: the header CTA is brand blue (2026-10-03).
	 * Strength settled at .66–.70 the same day: .60 left the 18px sub weak over
	 * light shirts (Jun), .72–.76 was "too dark" (Jun). Worst-case white text in
	 * the headline band is ~7.8:1 here. Same strength on every inner hero.
	 */
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.66 ) 0%, rgba( 11, 6, 24, 0.70 ) 34%, rgba( 11, 6, 24, 0.68 ) 80%, rgba( 11, 6, 24, 0.64 ) 100% ),
		url( "/wp-content/uploads/2026/10/car-hero-careers.jpg" );
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
}

.elementor.elementor .jsx-car-hero__inner {
	position: relative;
	z-index: 1;
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
}

.elementor.elementor .jsx-car-hero__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-car-hero__sub {
	max-width: 560px;
	margin: 32px 0 0;
	font-family: var( --dp-font-body );
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-dark );
}

/* the certification badge hangs off the container's right edge */
.elementor.elementor .jsx-car-hero__badge {
	position: absolute;
	inset-block-start: 180px;
	inset-inline-end: calc( 50% - var( --dp-container ) / 2 );
	width: 118px;
	height: auto;
}

/* --- anchor nav ----------------------------------------------------------- */

.elementor.elementor .jsx-car-nav {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) ); /* + admin bar when logged in, as .jsx-cg-nav */
	z-index: 20;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-car-nav__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	gap: 30px;
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-car-nav__inner::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-car-nav__link {
	display: inline-block;
	margin: 0;
	padding-block: 24px 18px;
	border-block-end: 3px solid transparent;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-car-nav__link:hover { color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-car-nav__link:has( > a.is-current ),
.elementor.elementor .jsx-car-nav__link.is-current {
	color: var( --dp-blue );
	border-block-end-color: var( --dp-blue );
}

.elementor.elementor .jsx-car-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 78px ); }

/* --- bands ---------------------------------------------------------------- */

.elementor.elementor .jsx-car-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-car-band--wash { background-color: #faf9fd; }

/* the two "why work here" bands share one brand gradient */
.elementor.elementor .jsx-car-band--grad {
	background-image: linear-gradient( 115deg, #4600a8 0%, #4600ff 55%, #3a6be8 100% );
}

/*
 * The frame's light stop is #ba46e1, where white 16px body copy lands at
 * 4.16:1 — under the 4.5 AA floor, and the same failure the mobile audit found.
 * Darkened to #ad3fd2 (4.78:1), the smallest step that clears it; revert this
 * one value to go back to the drawn colour.
 */
.elementor.elementor .jsx-car-band--testi {
	background-image: linear-gradient( 93deg, #2c46e4 0%, #ad3fd2 100% );
}

.elementor.elementor .jsx-car-inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

/* --- type ----------------------------------------------------------------- */

.elementor.elementor .jsx-car-title {
	max-width: 900px;
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.015em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-sub {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.3;
	letter-spacing: -0.01em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-lead,
.elementor.elementor .jsx-car-body {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-car-body--ink { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-car-title--light,
.elementor.elementor .jsx-car-sub--light,
.elementor.elementor .jsx-car-lead--light { color: var( --dp-text-on-dark ); }

.elementor.elementor .jsx-car-body a,
.elementor.elementor .jsx-car-note a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }

.elementor.elementor .jsx-car-note {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-dark );
}

/* --- eyebrow -------------------------------------------------------------- */

.elementor.elementor .jsx-car-eyebrow {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.10em;
	text-transform: uppercase;
	color: var( --dp-blue );
}

/*
 * The frame sets this eyebrow in brand light blue, which is 2.23:1 on the
 * gradient and 1.96:1 on the testimonial band. The quarter-disc marker keeps
 * the brand cyan — it is decorative — and only the label turns white.
 */
.elementor.elementor .jsx-car-eyebrow--light { color: var( --dp-text-on-dark ); }

.elementor.elementor .jsx-car-mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

.elementor.elementor .jsx-car-eyebrow__text { margin: 0; font: inherit; letter-spacing: inherit; color: inherit; }

/* --- splits --------------------------------------------------------------- */

.elementor.elementor .jsx-car-split {
	width: 100%;
	display: grid;
	grid-template-columns: minmax( 0, 560px ) 580px;
	gap: 100px;
	align-items: center;
}

.elementor.elementor .jsx-car-split--journey { grid-template-columns: 520px minmax( 0, 640px ); gap: 80px; }
.elementor.elementor .jsx-car-split--culture { grid-template-columns: minmax( 0, 560px ) 580px; gap: 120px; align-items: start; }
.elementor.elementor .jsx-car-split--impact  { grid-template-columns: minmax( 0, 560px ) 580px; gap: 120px; align-items: start; }
.elementor.elementor .jsx-car-split--films   { grid-template-columns: minmax( 0, 560px ) 580px; gap: 100px; align-items: center; }

.elementor.elementor .jsx-car-split__copy {
	min-width: 0;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
}

.elementor.elementor .jsx-car-head2 {
	width: 100%;
	display: grid;
	grid-template-columns: minmax( 0, 600px ) minmax( 0, 640px );
	gap: 60px;
	align-items: start;
}

.elementor.elementor .jsx-car-head2__left { display: flex; flex-direction: column; align-items: flex-start; }

/* --- media ---------------------------------------------------------------- */

.elementor.elementor .jsx-car-photo {
	display: block;
	width: 100%;
	aspect-ratio: 580 / 387;
	border-radius: 12px;
	object-fit: cover;
	object-position: center;
}

.elementor.elementor .jsx-car-photo--tall { aspect-ratio: 520 / 654; }

/*
 * The certification banner carries its headline as pixels, so any crop cuts the
 * words. This one keeps its own proportions instead of the column's 580/387 —
 * it ends up shorter than the photographs below it, which Jun accepted as the
 * cost of the text being readable.
 */
.elementor.elementor .jsx-car-photo--whole {
	aspect-ratio: auto;
	height: auto;
	object-fit: contain;
}

.elementor.elementor .jsx-car-impactfig { position: relative; display: block; }

.elementor.elementor .jsx-car-impactfig__badge {
	position: absolute;
	inset-block-start: 24px;
	inset-inline-start: 24px;
	width: 96px;
	height: auto;
}

/* --- hiring steps --------------------------------------------------------- */

.elementor.elementor .jsx-car-steps {
	width: 100%;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	gap: 32px;
}

.elementor.elementor .jsx-car-step {
	display: flex;
	flex-direction: column;
	min-height: 185px;
	padding: 32px;
	border-radius: 12px;
}

/* each step carries its own sweep, warming across the four */
.elementor.elementor .jsx-car-step--1 { background-image: linear-gradient( 120deg, #6b3fd4, #8e3bb4 ); }
.elementor.elementor .jsx-car-step--2 { background-image: linear-gradient( 120deg, #a8357f, #c43a57 ); }
/* drawn end is #d2542f, where white copy is 4.16:1; #c74d2b gives 4.63:1 */
.elementor.elementor .jsx-car-step--3 { background-image: linear-gradient( 120deg, #b83a66, #c74d2b ); }
.elementor.elementor .jsx-car-step--4 { background-image: linear-gradient( 120deg, #8e3bb4, #c43a57 ); }

.elementor.elementor .jsx-car-step__title {
	margin: 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-car-step__body {
	margin: 14px 0 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-dark );
}

/* --- the aspiration list -------------------------------------------------- */

.elementor.elementor .jsx-car-ticks { display: flex; flex-direction: column; gap: 14px; }
.elementor.elementor .jsx-car-tick { display: flex; align-items: flex-start; gap: 17px; }

.elementor.elementor .jsx-car-tick__dot {
	flex: 0 0 auto;
	width: 7px;
	height: 7px;
	margin-block-start: 10px;
	border-radius: 50%;
	background-color: var( --dp-light-blue );
}

.elementor.elementor .jsx-car-tick__text {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-dark );
}

/* --- CTAs ----------------------------------------------------------------- */

.elementor.elementor .jsx-car-ctarow { display: flex; flex-wrap: wrap; gap: 24px; }

.elementor.elementor .jsx-car-cta {
	display: inline-flex;
	align-items: center;
	gap: 24px;
	min-height: 52px;
	padding-inline: 28px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-dark );
	text-decoration: none;
	transition: background-color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-car-cta::after {
	content: "";
	width: 15px;
	height: 12px;
	background-image: var( --jsx-arrow-white );
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
}

.elementor.elementor .jsx-car-cta:hover { background-color: var( --dp-violet ); border-color: var( --dp-violet ); }

.elementor.elementor .jsx-car-cta--ghost {
	border-color: var( --dp-line-on-light );
	background-color: transparent;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-cta--ghost::after { background-image: var( --jsx-arrow-ink ); }
.elementor.elementor .jsx-car-cta--ghost:hover { background-color: transparent; border-color: var( --dp-text-on-light ); }

/* --- the scrolling strips ------------------------------------------------- */

/*
 * One strip serves both carousels: CSS scroll-snap, so it works with no
 * JavaScript, and the shared reel script only drives the buttons and the rail
 * from its own scrollLeft. A strip with nothing to scroll marks itself static
 * and hides its controls rather than showing a dead button.
 */
.elementor.elementor .jsx-car-reel { position: relative; width: 100%; }

.elementor.elementor .jsx-car-reel__track {
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: 392px;
	gap: 32px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
	padding-block-end: 4px;
}

.elementor.elementor .jsx-car-reel--activities .jsx-car-reel__track { grid-auto-columns: 395px; gap: 28px; }
.elementor.elementor .jsx-car-reel__track::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-car-slide { margin: 0; scroll-snap-align: start; }

.elementor.elementor .jsx-car-slide__img {
	display: block;
	width: 100%;
	aspect-ratio: 392 / 220;
	border-radius: 12px;
	object-fit: cover;
}

.elementor.elementor .jsx-car-reel--activities .jsx-car-slide__img { aspect-ratio: 395 / 263; }

/*
 * Banner artwork carries its headline and the certification badge as pixels, so
 * a cover crop cuts the words off the left edge. Shown whole instead, on a
 * light ground so the letterboxing reads as a frame rather than a gap.
 */
.elementor.elementor .jsx-car-slide__img--contain {
	object-fit: contain;
	background-color: #faf9fd;
}

.elementor.elementor .jsx-car-slide__cap {
	margin: 14px 0 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-car-reel__nav {
	display: flex;
	justify-content: flex-end;
	gap: 12px;
	margin-block-start: 24px;
}

.elementor.elementor .jsx-car-reel__btn {
	position: relative;
	width: 48px;
	height: 48px;
	padding: 0;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 50%;
	background-color: var( --dp-white );
	cursor: pointer;
	transition: background-color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-car-reel__btn::before {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 9px;
	height: 9px;
	margin: -5px 0 0 -3px;
	border-inline-end: 2px solid #a9a4b8;
	border-block-end: 2px solid #a9a4b8;
	transform: rotate( 135deg );
}

.elementor.elementor .jsx-car-reel__btn--next { border-color: var( --dp-violet ); background-color: var( --dp-violet ); }
.elementor.elementor .jsx-car-reel__btn--next::before { margin-inline-start: -6px; border-color: var( --dp-white ); transform: rotate( -45deg ); }
.elementor.elementor .jsx-car-reel__btn:disabled { opacity: 0.45; cursor: default; }
.elementor.elementor .jsx-car-reel__btn:focus-visible { outline: 2px solid var( --dp-light-blue ); outline-offset: 3px; }

.elementor.elementor .jsx-car-reel__rail {
	position: relative;
	height: 2px;
	margin-block-start: 22px;
	border-radius: 1px;
	background-color: rgba( 255, 255, 255, 0.28 );
	overflow: hidden;
}

.elementor.elementor .jsx-car-reel--gptw .jsx-car-reel__rail { background-color: var( --dp-line-on-light ); }

.elementor.elementor .jsx-car-reel__thumb {
	position: absolute;
	inset-block: 0;
	inset-inline-start: 0;
	display: block;
	width: 75%;
	border-radius: 1px;
	background-color: var( --dp-blue );
}

.elementor.elementor .jsx-car-reel--activities .jsx-car-reel__thumb { background-color: var( --dp-white ); }

/* nothing to scroll: no controls, rather than dead ones */
.elementor.elementor [data-dp-reel="static"] .jsx-car-reel__nav,
.elementor.elementor [data-dp-reel="static"] .jsx-car-reel__rail { display: none; }

/* --- the film ------------------------------------------------------------- */

.elementor.elementor .jsx-car-video { display: block; width: 100%; }

.elementor.elementor .jsx-car-video__open {
	position: relative;
	display: block;
	width: 100%;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 12px;
	overflow: hidden;
	background-color: #0b0618;
	aspect-ratio: 580 / 326;
	cursor: pointer;
}

.elementor.elementor .jsx-car-video__poster,
.elementor.elementor .jsx-car-film__poster {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

.elementor.elementor .jsx-car-video__scrim { position: absolute; inset: 0; background-color: rgba( 8, 16, 41, 0.22 ); transition: background-color 180ms ease; }

.elementor.elementor .jsx-car-video__play {
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 72px;
	height: 72px;
	margin: -36px 0 0 -36px;
	border-radius: 50%;
	background-color: var( --dp-white );
	transition: transform 180ms ease;
}

.elementor.elementor .jsx-car-video__play::after {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 0;
	height: 0;
	margin: -12px 0 0 -7px;
	border-block: 12px solid transparent;
	border-inline-start: 18px solid var( --dp-blue );
}

.elementor.elementor .jsx-car-video__open:hover .jsx-car-video__scrim { background-color: rgba( 8, 16, 41, 0.34 ); }
.elementor.elementor .jsx-car-video__open:hover .jsx-car-video__play { transform: scale( 1.06 ); }
.elementor.elementor .jsx-car-video__open:focus-visible { outline: 3px solid var( --dp-blue ); outline-offset: 3px; }

/* --- the filmed testimonials ---------------------------------------------- */

/* --- the video lightbox (Life at DigiPlus + the employee testimonials) ------- */

/*
 * Jun, 2026-10-12: "let's improve the video pop-up UI". .jsx-car-lightbox had no styles at all, so
 * both Careers videos opened in the browser's bare <dialog>: black border, white padding, a scrollbar
 * (the 1080x1920 portrait ran past the viewport) and a close button too small to find.
 *
 * Now the same frame as Responsible Gaming's film: the house navy backdrop, a frameless rounded video.
 * Two differences, both because one of these is portrait:
 *  - the frame is sized from the film's shape, fitted to BOTH viewport edges (min of width and
 *    height x ratio), so a 9:16 testimonial never needs a scrollbar and nothing jumps when the
 *    metadata arrives (preload="none" means no intrinsic size until then).
 *    Landscape 16:9 by default (car-life-at-digiplus.mp4, 2560x1440); 9:16 inside .jsx-car-film.
 *  - the close button is fixed to the viewport's corner, not hung above the frame: a portrait frame
 *    at 86vh leaves no room above it. Nothing on the dialog is transformed, so `fixed` stays
 *    relative to the viewport (the entrance animates the video, the dialog only fades).
 * The page behind stops scrolling while it is open; scrollbar-gutter keeps that from shifting it.
 */
html:has( .jsx-car-lightbox[open] ) { overflow: hidden; scrollbar-gutter: stable; }

.elementor.elementor .jsx-car-lightbox {
	width: fit-content;
	height: fit-content;
	max-width: none;
	max-height: none;
	margin: auto;
	padding: 0;
	border: 0;
	background-color: transparent;
	color: var( --dp-white );
	overflow: visible;
}

.elementor.elementor .jsx-car-lightbox::backdrop {
	background-color: rgba( 8, 16, 41, 0.88 );
	-webkit-backdrop-filter: blur( 6px );
	backdrop-filter: blur( 6px );
}

.elementor.elementor .jsx-car-lightbox__video {
	display: block;
	width: min( 1240px, 92vw, calc( 86dvh * 16 / 9 ) );
	height: auto;
	aspect-ratio: 16 / 9;
	border-radius: 16px;
	background-color: #0b0618;
	box-shadow: 0 24px 80px rgba( 0, 0, 0, 0.5 );
}

.elementor.elementor .jsx-car-film .jsx-car-lightbox__video {
	width: min( 92vw, calc( 86dvh * 9 / 16 ) );
	aspect-ratio: 9 / 16;
}

.elementor.elementor .jsx-car-lightbox__close {
	position: fixed;
	inset-block-start: 24px;
	inset-inline-end: 24px;
	z-index: 1;
	width: 48px;
	height: 48px;
	padding: 0;
	border: 1px solid rgba( 255, 255, 255, 0.4 );
	border-radius: 50%;
	background-color: rgba( 255, 255, 255, 0.08 );
	color: var( --dp-white );
	cursor: pointer;
	transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease;
}

.elementor.elementor .jsx-car-lightbox__close::before,
.elementor.elementor .jsx-car-lightbox__close::after {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 18px;
	height: 2px;
	margin: -1px 0 0 -9px;
	border-radius: 1px;
	background-color: currentColor;
}

.elementor.elementor .jsx-car-lightbox__close::before { transform: rotate( 45deg ); }
.elementor.elementor .jsx-car-lightbox__close::after { transform: rotate( -45deg ); }

.elementor.elementor .jsx-car-lightbox__close:hover,
.elementor.elementor .jsx-car-lightbox__close:focus-visible {
	border-color: var( --dp-white );
	background-color: var( --dp-white );
	color: #0b0618;
}

.elementor.elementor .jsx-car-lightbox__close:focus { outline: none; }
.elementor.elementor .jsx-car-lightbox__close:focus-visible { outline: 2px solid var( --dp-light-blue ); outline-offset: 3px; }

.elementor.elementor .jsx-car-lightbox[open] { animation: jsx-car-lb-fade 200ms ease-out; }
.elementor.elementor .jsx-car-lightbox[open]::backdrop { animation: jsx-car-lb-fade 200ms ease-out; }
.elementor.elementor .jsx-car-lightbox[open] .jsx-car-lightbox__video { animation: jsx-car-lb-rise 260ms cubic-bezier( 0.2, 0.7, 0.2, 1 ); }

@keyframes jsx-car-lb-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes jsx-car-lb-rise { from { opacity: 0; transform: translateY( 12px ) scale( 0.98 ); } to { opacity: 1; transform: none; } }

@media ( prefers-reduced-motion: reduce ) {
	.elementor.elementor .jsx-car-lightbox[open],
	.elementor.elementor .jsx-car-lightbox[open]::backdrop,
	.elementor.elementor .jsx-car-lightbox[open] .jsx-car-lightbox__video { animation: none; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-car-lightbox__close { inset-block-start: 16px; inset-inline-end: 16px; width: 44px; height: 44px; }
	.elementor.elementor .jsx-car-lightbox__video { border-radius: 12px; }
}

.elementor.elementor .jsx-car-films { width: 100%; }

/*
 * The slides sit side by side on a track that translates, rather than being
 * swapped with `hidden` — a cut between two portraits reads as a glitch. The
 * stage clips; the modal lightbox is unaffected because `showModal()` promotes
 * the dialog to the top layer, outside any ancestor's overflow.
 */
.elementor.elementor .jsx-car-films__stage {
	position: relative;
	overflow: hidden;
	border-radius: 6px;
}

.elementor.elementor .jsx-car-films__track {
	display: flex;
	will-change: transform;
	transition: transform 460ms cubic-bezier( 0.22, 0.61, 0.36, 1 );
}

.elementor.elementor .jsx-car-film { flex: 0 0 100%; min-width: 0; }

@media ( prefers-reduced-motion: reduce ) {
	.elementor.elementor .jsx-car-films__track { transition: none; }
}

.elementor.elementor .jsx-car-film__open {
	position: relative;
	display: block;
	width: 100%;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 6px;
	overflow: hidden;
	background-color: #1a1140;
	aspect-ratio: 580 / 640;
	cursor: pointer;
}

.elementor.elementor .jsx-car-film__scrim {
	position: absolute;
	inset: 0;
	background-image: linear-gradient( 180deg, rgba( 26, 17, 64, 0 ) 0%, rgba( 26, 17, 64, 0.1 ) 45%, rgba( 26, 17, 64, 0.88 ) 100% );
}

.elementor.elementor .jsx-car-film__plate {
	position: absolute;
	inset-block-end: 40px;
	inset-inline-start: 36px;
	inset-inline-end: 120px;
	display: flex;
	flex-direction: column;
	gap: 6px;
	text-align: start;
}

.elementor.elementor .jsx-car-film__name {
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.3;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-car-film__role {
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.10em;
	text-transform: uppercase;
	color: var( --dp-text-on-dark );
}

.elementor.elementor .jsx-car-film__play {
	position: absolute;
	inset-block-end: 44px;
	inset-inline-end: 36px;
	width: 72px;
	height: 72px;
	border: 2px solid rgba( 255, 255, 255, 0.55 );
	border-radius: 50%;
	transition: transform 180ms ease;
}

.elementor.elementor .jsx-car-film__play::before {
	content: "";
	position: absolute;
	inset: 6px;
	border-radius: 50%;
	background-color: var( --dp-blue );
}

.elementor.elementor .jsx-car-film__play::after {
	content: "";
	position: absolute;
	inset-block-start: 50%;
	inset-inline-start: 50%;
	width: 0;
	height: 0;
	margin: -9px 0 0 -5px;
	border-block: 9px solid transparent;
	border-inline-start: 13px solid var( --dp-white );
}

.elementor.elementor .jsx-car-film__open:hover .jsx-car-film__play { transform: scale( 1.06 ); }
.elementor.elementor .jsx-car-film__open:focus-visible { outline: 3px solid var( --dp-light-blue ); outline-offset: 3px; }

.elementor.elementor .jsx-car-films__dots { display: flex; justify-content: center; gap: 12px; margin-block-start: 28px; }

.elementor.elementor .jsx-car-dot {
	width: 10px;
	height: 10px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background-color: #c7c7c5;
	cursor: pointer;
	transition: background-color 160ms ease;
}

.elementor.elementor .jsx-car-dot.is-current { background-color: var( --dp-marker-cyan ); }
.elementor.elementor .jsx-car-dot:focus-visible { outline: 2px solid var( --dp-white ); outline-offset: 3px; }

/* --- the written testimonials --------------------------------------------- */

.elementor.elementor .jsx-car-quotes {
	width: 100%;
	display: grid;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	gap: 28px;
}

.elementor.elementor .jsx-car-quote {
	display: flex;
	flex-direction: column;
	margin: 0;
	padding: 28px 24px;
	border-radius: 16px;
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-car-quote__text {
	flex: 1 1 auto;
	margin: 0;
	padding: 0;
	border: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-car-quote__by {
	margin-block-start: 22px;
	padding-block-start: 22px;
	border-block-start: 1px solid var( --dp-line-on-light );
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.elementor.elementor .jsx-car-quote__name {
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-quote__role {
	font-family: var( --dp-font-body );
	font-size: 13px;
	line-height: 1.4;
	color: var( --dp-blue );
}

/* --- the job board -------------------------------------------------------- */

.elementor.elementor .jsx-car-jobs { width: 100%; }

.elementor.elementor .jsx-car-jobs__bar {
	display: grid;
	grid-template-columns: minmax( 0, 1fr ) 420px;
	gap: 40px;
	align-items: center;
}

/* the frame reads count-then-search across; the markup leads with the search,
   because that is the order the phone needs */
.elementor.elementor .jsx-car-jobs__count { order: 1; }
.elementor.elementor .jsx-car-jobs__search { order: 2; }

.elementor.elementor .jsx-car-jobs__count {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 13px;
	line-height: 1.4;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-car-jobs__search { position: relative; display: block; }

.elementor.elementor .jsx-car-jobs__search input {
	width: 100%;
	height: 48px;
	padding-inline: 24px 52px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	background-color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 14px;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-jobs__search input::placeholder { color: var( --dp-text-on-light-muted ); }
.elementor.elementor .jsx-car-jobs__search input:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 1px; }

/* a magnifier drawn from a circle and a bar, so there is no asset to ship */
.elementor.elementor .jsx-car-jobs__go {
	position: absolute;
	inset-block-start: 50%;
	inset-inline-end: 8px;
	width: 36px;
	height: 36px;
	margin-block-start: -18px;
	padding: 0;
	border: 0;
	border-radius: 8px;
	background-color: transparent;
	cursor: pointer;
}

.elementor.elementor .jsx-car-jobs__go::before {
	content: "";
	position: absolute;
	inset-block-start: 10px;
	inset-inline-start: 10px;
	width: 11px;
	height: 11px;
	border: 2px solid var( --dp-text-on-light-muted );
	border-radius: 50%;
}

.elementor.elementor .jsx-car-jobs__go::after {
	content: "";
	position: absolute;
	inset-block-start: 21px;
	inset-inline-start: 21px;
	width: 7px;
	height: 2px;
	background-color: var( --dp-text-on-light-muted );
	transform: rotate( 45deg );
	transform-origin: left center;
}

.elementor.elementor .jsx-car-jobs__cols {
	display: grid;
	grid-template-columns: 320px minmax( 0, 1fr );
	gap: 90px;
	align-items: start;
	margin-block-start: 40px;
}

.elementor.elementor .jsx-car-filters { min-width: 0; margin: 0; padding: 0; border: 0; }

.elementor.elementor .jsx-car-filters__title {
	margin: 0 0 20px;
	padding: 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-filters__list { margin: 0; padding: 0; list-style: none; }
.elementor.elementor .jsx-car-filters__row { margin: 0 0 8px; }

.elementor.elementor .jsx-car-filters__label {
	display: grid;
	grid-template-columns: 16px minmax( 0, 1fr ) auto;
	align-items: center;
	gap: 10px;
	cursor: pointer;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-car-filters__label input {
	width: 16px;
	height: 16px;
	margin: 0;
	accent-color: var( --dp-blue );
}

.elementor.elementor .jsx-car-filters__label:hover .jsx-car-filters__name { color: var( --dp-text-on-light ); }

.elementor.elementor .jsx-car-filters__count {
	min-width: 26px;
	padding-inline: 8px;
	border-radius: 9px;
	background-color: #ede9fe;
	font-size: 13px;
	line-height: 18px;
	text-align: center;
	color: var( --dp-blue );
}

.elementor.elementor .jsx-car-filters__apply,
.elementor.elementor .jsx-car-filters__clear {
	display: inline-block;
	margin-block-start: 18px;
	padding: 10px 20px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	background-color: transparent;
	font-family: var( --dp-font-body );
	font-size: 14px;
	color: var( --dp-blue );
	text-decoration: none;
	cursor: pointer;
}

/*
 * Inline on a desktop the filters apply as they are ticked, so the button is
 * noise — but ONLY there. Inside the bottom sheet it is the whole point: the
 * choices are made together and applied once.
 */
@media ( min-width: 768px ) {
	.elementor.elementor [data-car-jobs="live"] .jsx-car-filters__apply { display: none; }
}

.elementor.elementor .jsx-car-jobs__results { min-width: 0; }

.elementor.elementor .jsx-car-jobs__grid {
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	gap: 28px;
}

.elementor.elementor .jsx-car-job {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	min-height: 184px;
	padding: 24px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 12px;
	background-color: var( --dp-white );
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.elementor.elementor .jsx-car-job:hover { border-color: var( --dp-blue ); box-shadow: 0 8px 24px rgba( 70, 0, 255, 0.08 ); }

.elementor.elementor .jsx-car-job__tag {
	margin: 0;
	padding: 3px 10px;
	border-radius: 6px;
	background-color: #ede9fe;
	font-family: var( --dp-font-body );
	font-size: 13px;
	line-height: 18px;
	color: var( --dp-blue );
}

.elementor.elementor .jsx-car-job__title {
	margin: 14px 0 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-job__loc {
	margin: 10px 0 0;
	padding-inline-start: 20px;
	position: relative;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-car-job__loc::before {
	content: "";
	position: absolute;
	inset-block-start: 7px;
	inset-inline-start: 0;
	width: 10px;
	height: 10px;
	border: 2px solid var( --dp-text-on-light-muted );
	border-radius: 50%;
}

.elementor.elementor .jsx-car-job__link {
	margin-block-start: auto;
	padding-block-start: 14px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-blue );
	text-decoration: none;
}

.elementor.elementor .jsx-car-job__link::after {
	content: "";
	display: inline-block;
	width: 15px;
	height: 12px;
	margin-inline-start: 8px;
	background-image: var( --jsx-arrow-blue );
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
}

.elementor.elementor .jsx-car-job__link:hover { text-decoration: underline; }

.elementor.elementor .jsx-car-jobs__empty {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-car-pager { display: flex; flex-wrap: wrap; gap: 8px; margin-block-start: 36px; }

.elementor.elementor .jsx-car-pager__num,
.elementor.elementor .jsx-car-pager__step {
	min-width: 40px;
	padding: 8px 12px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.4;
	text-align: center;
	color: var( --dp-text-on-light-muted );
	text-decoration: none;
}

.elementor.elementor .jsx-car-pager__num:hover,
.elementor.elementor .jsx-car-pager__step:hover { border-color: var( --dp-blue ); color: var( --dp-blue ); }

.elementor.elementor .jsx-car-pager__num.is-current {
	border-color: var( --dp-blue );
	background-color: var( --dp-blue );
	color: var( --dp-text-on-dark );
}

/* --- vertical rhythm ------------------------------------------------------ */

/*
 * Every gap is a margin-block-start on the FOLLOWING element. This block must
 * stay after every rule above that writes `margin` as a shorthand — a later
 * `margin: 0` resets margin-top whatever the specificity.
 */
.elementor.elementor .jsx-car-inner > * + * { margin-block-start: 56px; }
.elementor.elementor .jsx-car-eyebrow + * { margin-block-start: 36px; }
.elementor.elementor .jsx-car-title + .jsx-car-lead { margin-block-start: 24px; }
.elementor.elementor .jsx-car-lead + .jsx-car-steps { margin-block-start: 56px; }
.elementor.elementor .jsx-car-steps + .jsx-car-note { margin-block-start: 48px; }
.elementor.elementor .jsx-car-split + .jsx-car-title { margin-block-start: 85px; }
.elementor.elementor .jsx-car-split + .jsx-car-sub { margin-block-start: 59px; }
.elementor.elementor .jsx-car-title + .elementor-widget-shortcode,
.elementor.elementor .jsx-car-sub + .elementor-widget-shortcode { margin-block-start: 32px; }
.elementor.elementor .jsx-car-head2 + .elementor-widget-shortcode { margin-block-start: 48px; }
.elementor.elementor .jsx-car-head2 + .jsx-car-split { margin-block-start: 102px; }
/* the frame draws 6 here, because its slide dots sit inside the video column —
   on the page they are the block's last line, and the quote cards need to clear
   them, so this takes the band's own 56 */
.elementor.elementor .jsx-car-split--films + .elementor-widget-shortcode { margin-block-start: 56px; }

.elementor.elementor .jsx-car-split__copy > * + * { margin-block-start: 18px; }
.elementor.elementor .jsx-car-split__copy > .jsx-car-title + * { margin-block-start: 28px; }
.elementor.elementor .jsx-car-split__copy > .jsx-car-eyebrow + * { margin-block-start: 24px; }
.elementor.elementor .jsx-car-split__copy > .jsx-car-sub + * { margin-block-start: 24px; }
.elementor.elementor .jsx-car-split__copy > .jsx-car-lead + .jsx-car-ticks { margin-block-start: 24px; }
.elementor.elementor .jsx-car-split__copy > * + .jsx-car-ctarow { margin-block-start: 40px; }
.elementor.elementor .jsx-car-head2__left > .jsx-car-eyebrow + * { margin-block-start: 36px; }

/* a grid places its own children */
.elementor.elementor .jsx-car-split > *,
.elementor.elementor .jsx-car-head2 > *,
.elementor.elementor .jsx-car-steps > * { margin-block-start: 0; }

/* the shortcode wrapper is what the band actually orders */
.elementor.elementor .jsx-car-inner > .elementor-widget-shortcode,
.elementor.elementor .jsx-car-split > .elementor-widget-shortcode,
.elementor.elementor .elementor-widget-shortcode > .elementor-widget-container,
.elementor.elementor .elementor-widget-shortcode .elementor-shortcode { width: 100%; }

/* the testimonial band leads with a taller card than a heading */
.elementor.elementor .jsx-car-band--testi { padding-block-start: 120px; }

/* --- the filter drawer ---------------------------------------------------- */

/*
 * One fieldset, two presentations. On a desktop (and with no JavaScript at any
 * width) the <dialog> renders inline in the left column — an author rule beats
 * the UA's `dialog:not([open]) { display: none }`. Below 768, once the script
 * has taken over, it becomes the bottom sheet the mobile frame draws, behind a
 * "Click To Open Filters" trigger.
 */
.elementor.elementor .jsx-car-drawer {
	position: static;
	display: block;
	width: 100%;
	max-width: none;
	max-height: none;
	margin: 0;
	padding: 0;
	border: 0;
	background-color: transparent;
	color: inherit;
	overflow: visible;
}

.elementor.elementor .jsx-car-drawer__handle,
.elementor.elementor .jsx-car-drawer__head { display: none; }

.elementor.elementor .jsx-car-drawer__foot { display: flex; flex-wrap: wrap; gap: 12px; }

/*
 * The location control. The native <select> stays in the form as the value
 * carrier and the no-JS fallback; once the script builds the button and listbox
 * over it, it is hidden and only ever set programmatically.
 */
.elementor.elementor .jsx-car-field { position: relative; margin: 0 0 24px; }
.elementor.elementor .jsx-car-field.is-enhanced select { display: none; }

.elementor.elementor .jsx-car-field select,
.elementor.elementor .jsx-car-select__btn {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	width: 100%;
	height: 48px;
	padding-inline: 20px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 24px;
	background-color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
	text-align: start;
	appearance: none;
	cursor: pointer;
	transition: border-color 160ms ease;
}

.elementor.elementor .jsx-car-field.is-set .jsx-car-select__btn { border-color: var( --dp-blue ); color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-car-select__btn:hover { border-color: var( --dp-text-on-light-muted ); }

/* no department combination offers a location: the control says so rather than
   opening onto an empty list */
.elementor.elementor .jsx-car-select__btn[disabled] { opacity: 0.5; cursor: default; }
.elementor.elementor .jsx-car-select__btn[disabled]:hover { border-color: var( --dp-line-on-light ); }
.elementor.elementor .jsx-car-select__btn:focus-visible,
.elementor.elementor .jsx-car-field select:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 1px; }

.elementor.elementor .jsx-car-select__value { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }

.elementor.elementor .jsx-car-select__caret {
	flex: 0 0 auto;
	width: 9px;
	height: 9px;
	margin-block-start: -4px;
	border-inline-end: 1.5px solid var( --dp-text-on-light-muted );
	border-block-end: 1.5px solid var( --dp-text-on-light-muted );
	transform: rotate( 45deg );
	transition: transform 160ms ease;
}

.elementor.elementor .jsx-car-select__btn[aria-expanded="true"] .jsx-car-select__caret {
	margin-block-start: 3px;
	transform: rotate( -135deg );
}

.elementor.elementor .jsx-car-select__list {
	position: absolute;
	inset-inline: 0;
	inset-block-start: calc( 100% + 6px );
	z-index: 30;
	max-height: 260px;
	margin: 0;
	padding: 6px;
	list-style: none;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
	background-color: var( --dp-white );
	box-shadow: 0 16px 32px -12px rgba( 8, 16, 41, 0.22 );
	overflow-y: auto;
	overscroll-behavior: contain;
}

.elementor.elementor .jsx-car-select__opt {
	padding: 10px 14px;
	border-radius: 10px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
	cursor: pointer;
}

.elementor.elementor .jsx-car-select__opt:hover { background-color: #faf9fd; color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-car-select__opt:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: -2px; }

.elementor.elementor .jsx-car-select__opt[aria-selected="true"] {
	background-color: #ede9fe;
	font-weight: 600;
	color: var( --dp-blue );
}

/* the swap keeps the old results in place and dims them, so the column does
   not collapse and the page does not jump under the reader */
.elementor.elementor .jsx-car-jobs.is-loading .jsx-car-jobs__results {
	opacity: 0.45;
	transition: opacity 160ms ease;
	pointer-events: none;
}

/* the trigger only exists once the script can open the sheet */
.elementor.elementor .jsx-car-jobs__trigger {
	display: none;
	align-items: center;
	justify-content: center;
	gap: 12px;
	width: 100%;
	min-height: 52px;
	margin-block-start: 22px;
	padding-inline: 20px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 10px;
	background-color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-light );
	cursor: pointer;
}

/* three sliders, drawn rather than shipped as an asset */
.elementor.elementor .jsx-car-jobs__trigger-icon {
	position: relative;
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
}

.elementor.elementor .jsx-car-jobs__trigger-icon::before,
.elementor.elementor .jsx-car-jobs__trigger-icon::after {
	content: "";
	position: absolute;
	inset-inline: 0;
	height: 2px;
	border-radius: 1px;
	background-color: var( --dp-text-on-light );
	box-shadow: 0 7px 0 0 var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-jobs__trigger-icon::before { inset-block-start: 4px; }
.elementor.elementor .jsx-car-jobs__trigger-icon::after {
	inset-block-start: 3px;
	inset-inline-start: 5px;
	width: 4px;
	height: 4px;
	inset-inline-end: auto;
	border-radius: 50%;
	box-shadow: 7px 7px 0 0 var( --dp-text-on-light );
	background-color: var( --dp-white );
	border: 2px solid var( --dp-text-on-light );
}

.elementor.elementor .jsx-car-jobs__trigger-count {
	min-width: 22px;
	padding-inline: 7px;
	border-radius: 11px;
	background-color: var( --dp-blue );
	font-size: 13px;
	line-height: 22px;
	color: var( --dp-text-on-dark );
}

@media ( max-width: 767px ) {
	.elementor.elementor [data-car-jobs="live"] .jsx-car-jobs__trigger { display: flex; }
	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer:not( [open] ) { display: none; }

	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] {
		position: fixed;
		inset: auto 0 0 0;
		z-index: 60;
		width: 100%;
		max-height: 86vh;
		padding: 0 0 20px;
		border-start-start-radius: 20px;
		border-start-end-radius: 20px;
		background-color: var( --dp-white );
		overflow-y: auto;
		overscroll-behavior: contain;
	}

	.elementor.elementor .jsx-car-drawer::backdrop { background-color: rgba( 8, 16, 41, 0.55 ); }

	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] .jsx-car-drawer__handle {
		display: block;
		width: 40px;
		height: 4px;
		margin: 12px auto 0;
		border-radius: 2px;
		background-color: var( --dp-line-on-light );
	}

	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] .jsx-car-drawer__head {
		display: flex;
		align-items: center;
		justify-content: space-between;
		gap: 16px;
		padding: 20px var( --dp-gutter-mobile ) 16px;
		border-block-end: 1px solid var( --dp-line-on-light );
	}

	.elementor.elementor .jsx-car-drawer__title {
		margin: 0;
		font-family: var( --dp-font-body );
		font-weight: 600;
		font-size: 20px;
		line-height: 1.3;
		color: var( --dp-text-on-light );
	}

	.elementor.elementor .jsx-car-drawer__close {
		position: relative;
		flex: 0 0 auto;
		width: 32px;
		height: 32px;
		padding: 0;
		border: 1px solid var( --dp-line-on-light );
		border-radius: 50%;
		background-color: #faf9fd;
		cursor: pointer;
	}

	.elementor.elementor .jsx-car-drawer__close::before,
	.elementor.elementor .jsx-car-drawer__close::after {
		content: "";
		position: absolute;
		inset-block-start: 50%;
		inset-inline-start: 50%;
		width: 13px;
		height: 1.5px;
		margin: -1px 0 0 -6.5px;
		background-color: var( --dp-text-on-light );
	}

	.elementor.elementor .jsx-car-drawer__close::before { transform: rotate( 45deg ); }
	.elementor.elementor .jsx-car-drawer__close::after { transform: rotate( -45deg ); }

	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] .jsx-car-drawer__body { padding: 24px var( --dp-gutter-mobile ) 0; }
	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] .jsx-car-drawer__foot {
		position: sticky;
		inset-block-end: 0;
		margin-block-start: 20px;
		padding: 16px var( --dp-gutter-mobile ) 0;
		background-color: var( --dp-white );
		box-shadow: 0 -12px 16px -12px rgba( 8, 16, 41, 0.18 );
	}

	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] .jsx-car-filters__apply {
		flex: 1 1 auto;
		margin: 0;
		border-color: var( --dp-blue );
		background-color: var( --dp-blue );
		color: var( --dp-text-on-dark );
	}

	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] .jsx-car-filters__clear { margin: 0; align-self: center; }

	/* the drawer carries the whole list, so it does not need its own scroller */
	.elementor.elementor [data-car-jobs="live"] .jsx-car-drawer[open] .jsx-car-filters__list { max-height: none; overflow: visible; }

	.elementor.elementor .jsx-car-filters__label { grid-template-columns: 24px minmax( 0, 1fr ) auto; gap: 16px; }
	.elementor.elementor .jsx-car-filters__label input { width: 24px; height: 24px; border-radius: 5px; }
	.elementor.elementor .jsx-car-filters__row { margin-block-end: 14px; }
	.elementor.elementor .jsx-car-filters__count { min-width: 44px; border-radius: 11px; line-height: 22px; }

	/* the frame's card: one column, 160 tall, 20 of padding, 12 between */
	.elementor.elementor .jsx-car-job { min-height: 160px; padding: 20px; border-radius: 14px; }
	.elementor.elementor .jsx-car-jobs__grid { gap: 12px; }
	.elementor.elementor .jsx-car-jobs__cols { margin-block-start: 28px; }
	.elementor.elementor .jsx-car-jobs__bar { gap: 16px; }
	/* the phone leads with the search field and puts the count beneath it */
	.elementor.elementor .jsx-car-jobs__search { order: 1; }
	.elementor.elementor .jsx-car-jobs__count { order: 2; }
}

/* --- 1339 ----------------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-car-band,
	.elementor.elementor .jsx-car-hero,
	.elementor.elementor .jsx-car-nav { padding-inline: 56px; }
	.elementor.elementor .jsx-car-hero__badge { inset-inline-end: 56px; }
	.elementor.elementor .jsx-car-split,
	.elementor.elementor .jsx-car-split--journey,
	.elementor.elementor .jsx-car-split--culture,
	.elementor.elementor .jsx-car-split--impact,
	.elementor.elementor .jsx-car-split--films,
	.elementor.elementor .jsx-car-head2 { grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1fr ); gap: 56px; }
	.elementor.elementor .jsx-car-jobs__cols { grid-template-columns: 280px minmax( 0, 1fr ); gap: 48px; }
	.elementor.elementor .jsx-car-jobs__bar { grid-template-columns: minmax( 0, 1fr ) 340px; }
}

/* --- 1024 ----------------------------------------------------------------- */

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-car-hero__title { font-size: 52px; }
	.elementor.elementor .jsx-car-title { font-size: 38px; }
	.elementor.elementor .jsx-car-sub { font-size: 28px; }
	.elementor.elementor .jsx-car-quotes { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); }
	.elementor.elementor .jsx-car-jobs__grid { grid-template-columns: minmax( 0, 1fr ); }
	.elementor.elementor .jsx-car-hero__badge { width: 92px; }
}

/* --- 767 ------------------------------------------------------------------ */

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-car-hero {
		padding-block: 263px 24px;
		padding-inline: var( --dp-gutter-mobile );
	}
	.elementor.elementor .jsx-car-hero__title { font-size: 40px; line-height: 1.1; }
	.elementor.elementor .jsx-car-hero__sub { margin-block-start: 16px; font-size: 16px; }
	/* the frame keeps the badge, smaller and clear of the title */
	.elementor.elementor .jsx-car-hero__badge { inset-block-start: 84px; inset-inline-end: 20px; width: 70px; }

	.elementor.elementor .jsx-car-band,
	.elementor.elementor .jsx-car-nav { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-car-band { padding-block: 56px; }
	.elementor.elementor .jsx-car-band--testi { padding-block-start: 56px; }

	.elementor.elementor .jsx-car-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px ); }

	/* the anchor row becomes a scrolling chip strip */
	.elementor.elementor .jsx-car-nav__inner { gap: 8px; padding-block: 20px; }
	.elementor.elementor .jsx-car-nav__link {
		padding: 9px 14px;
		border: 0;
		border-radius: 18px;
		background-color: var( --dp-lavender );
		font-size: 13px;
		line-height: 1.4;
	}
	.elementor.elementor .jsx-car-nav__link:has( > a.is-current ),
	.elementor.elementor .jsx-car-nav__link.is-current { background-color: var( --dp-blue ); color: var( --dp-text-on-dark ); }

	.elementor.elementor .jsx-car-title { font-size: 30px; }
	.elementor.elementor .jsx-car-sub { font-size: 24px; }

	/*
	 * Every split stacks to eyebrow → title → picture → copy, the order Jun
	 * set for this page. The copy column goes display: contents so its children
	 * become flex items of the split itself — which also means the order has to
	 * be set on those children, not on `.jsx-car-split > *`.
	 */
	.elementor.elementor .jsx-car-split,
	.elementor.elementor .jsx-car-split--journey,
	.elementor.elementor .jsx-car-split--culture,
	.elementor.elementor .jsx-car-split--impact,
	.elementor.elementor .jsx-car-split--films,
	.elementor.elementor .jsx-car-head2 {
		display: flex;
		flex-direction: column;
		align-items: stretch;
		gap: 0;
	}
	.elementor.elementor .jsx-car-split .jsx-car-split__copy,
	.elementor.elementor .jsx-car-head2 .jsx-car-head2__left { display: contents; }

	.elementor.elementor .jsx-car-split .jsx-car-eyebrow { order: 1; margin-block-start: 0; }
	.elementor.elementor .jsx-car-split .jsx-car-title,
	.elementor.elementor .jsx-car-split .jsx-car-sub { order: 2; margin-block-start: 12px; }
	.elementor.elementor .jsx-car-split .jsx-car-photo,
	.elementor.elementor .jsx-car-split .jsx-car-impactfig,
	.elementor.elementor .jsx-car-split .elementor-widget-shortcode { order: 3; margin-block-start: 18px; }
	.elementor.elementor .jsx-car-split .jsx-car-body,
	.elementor.elementor .jsx-car-split .jsx-car-lead,
	.elementor.elementor .jsx-car-split .jsx-car-ticks,
	.elementor.elementor .jsx-car-split .jsx-car-ctarow { order: 4; margin-block-start: 22px; }
	.elementor.elementor .jsx-car-split .jsx-car-body + .jsx-car-body { margin-block-start: 16px; }
	.elementor.elementor .jsx-car-split .jsx-car-ctarow { margin-block-start: 22px; flex-direction: column; gap: 12px; }
	.elementor.elementor .jsx-car-ctarow .jsx-car-cta { justify-content: space-between; width: 100%; min-height: 48px; }
	/*
	 * The first thing in a stacked split carries no top gap, whatever its order.
	 * It needs both selectors: `display: contents` on the copy column means its
	 * children are flex items of the split but NOT its child-selector matches.
	 */
	.elementor.elementor .jsx-car-split > :first-child,
	.elementor.elementor .jsx-car-split__copy > :first-child { margin-block-start: 0; }

	.elementor.elementor .jsx-car-head2 > * + *,
	.elementor.elementor .jsx-car-head2 .jsx-car-body { margin-block-start: 18px; }

	/* the generic rule has to come first: same specificity, later wins */
	.elementor.elementor .jsx-car-photo { aspect-ratio: 350 / 234; }
	.elementor.elementor .jsx-car-photo--tall { aspect-ratio: 350 / 440; }
	/* and the banner keeps its own proportions at every width */
	.elementor.elementor .jsx-car-photo--whole { aspect-ratio: auto; height: auto; }

	/* the steps stack full width */
	.elementor.elementor .jsx-car-steps { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-car-step { min-height: 0; padding: 24px; }

	/* the strips keep a peek slot so the scroll is discoverable */
	.elementor.elementor .jsx-car-reel__track,
	.elementor.elementor .jsx-car-reel--activities .jsx-car-reel__track { grid-auto-columns: 280px; gap: 16px; }
	.elementor.elementor .jsx-car-reel__btn { width: 44px; height: 44px; }
	.elementor.elementor .jsx-car-reel__nav { justify-content: flex-start; margin-block-start: 20px; }

	.elementor.elementor .jsx-car-video__play { width: 56px; height: 56px; margin: -28px 0 0 -28px; }
	.elementor.elementor .jsx-car-video__play::after { margin: -9px 0 0 -5px; border-block-width: 9px; border-inline-start-width: 14px; }

	/* the film card goes full width, its plate above the control */
	.elementor.elementor .jsx-car-film__open { aspect-ratio: 350 / 420; }
	.elementor.elementor .jsx-car-film__plate { inset-block-end: 28px; inset-inline: 20px 92px; }
	.elementor.elementor .jsx-car-film__name { font-size: 24px; }
	.elementor.elementor .jsx-car-film__play { inset-block-end: 28px; inset-inline-end: 20px; width: 56px; height: 56px; }
	.elementor.elementor .jsx-car-film__play::after { margin: -7px 0 0 -4px; border-block-width: 7px; border-inline-start-width: 10px; }

	.elementor.elementor .jsx-car-quotes { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }

	/* the board stacks: search, filters, then the results */
	.elementor.elementor .jsx-car-jobs__bar { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-car-jobs__cols { grid-template-columns: minmax( 0, 1fr ); gap: 32px; margin-block-start: 28px; }
	.elementor.elementor .jsx-car-jobs__grid { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-car-filters__list { max-height: 320px; overflow-y: auto; }

	.elementor.elementor .jsx-car-inner > * + * { margin-block-start: 36px; }
	.elementor.elementor .jsx-car-eyebrow + * { margin-block-start: 12px; }
	.elementor.elementor .jsx-car-title + .jsx-car-lead { margin-block-start: 18px; }
	.elementor.elementor .jsx-car-lead + .jsx-car-steps { margin-block-start: 28px; }
	.elementor.elementor .jsx-car-steps + .jsx-car-note { margin-block-start: 26px; }
	.elementor.elementor .jsx-car-note { font-size: 14px; }
	.elementor.elementor .jsx-car-split + .jsx-car-title { margin-block-start: 40px; }
	.elementor.elementor .jsx-car-split + .jsx-car-sub { margin-block-start: 36px; }
	.elementor.elementor .jsx-car-title + .elementor-widget-shortcode,
	.elementor.elementor .jsx-car-sub + .elementor-widget-shortcode { margin-block-start: 20px; }
	.elementor.elementor .jsx-car-head2 + .elementor-widget-shortcode { margin-block-start: 28px; }
	.elementor.elementor .jsx-car-head2 + .jsx-car-split { margin-block-start: 40px; }
	.elementor.elementor .jsx-car-split--films + .elementor-widget-shortcode { margin-block-start: 40px; }
}

/* === §79 Contact Us ====================================================== */

/*
 * Page 15255, from Figma `373:3` (desktop) and `532:3` (mobile 390).
 * Same band system as the rest of the 2026 set: 96/96 bands on a 1240
 * container, a sticky anchor nav, cards on a #faf9fd wash. Everything is
 * atomic except the contact form itself, which is Elementor Pro's form widget
 * carried over from the live page with its save-to-database, email and
 * reCAPTCHA actions intact — a contact form that silently stops sending is the
 * one defect this page cannot afford.
 */

.elementor.elementor [class*="jsx-ct-"] { padding: 0; }

.elementor.elementor .jsx-ct-page,
.elementor.elementor .jsx-ct-hero,
.elementor.elementor .jsx-ct-nav,
.elementor.elementor .jsx-ct-band { display: block; }

/* --- hero ----------------------------------------------------------------- */

/*
 * The crop is the one the Figma frame settles on: the building drops to the
 * lower third so the headline sits on clean sky, clear of the façade's own
 * digiplus signage.
 */
.elementor.elementor .jsx-ct-hero {
	position: relative;
	overflow: hidden;
	padding-block: 194px 135px;
	padding-inline: var( --dp-gutter );
	background-color: #0b0618;
	/*
	 * Dark scrim, not navy + brand wash: the header CTA is brand blue (2026-10-03).
	 * Strength settled at .66–.70 the same day: .60 left the 18px sub weak over
	 * light shirts (Jun), .72–.76 was "too dark" (Jun). Worst-case white text in
	 * the headline band is ~7.8:1 here. Same strength on every inner hero.
	 */
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.66 ) 0%, rgba( 11, 6, 24, 0.70 ) 34%, rgba( 11, 6, 24, 0.68 ) 80%, rgba( 11, 6, 24, 0.64 ) 100% ),
		url( "/wp-content/uploads/2026/10/contact-hero-ecoprime.jpg" );
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center 4%;
	text-align: center;
}

/*
 * Jun, 2026-10-12: "the building is hiding". `center 4%` was set for the earlier building.jpg; with
 * contact-hero-ecoprime.jpg under `cover` the photo's height grows with the screen while the hero stays
 * 560, so the roof sank to the bottom edge (y≈530 at 1985 wide) and only a sliver of tower showed.
 *
 * The photo (2400 × 1800): roof at 37.8% of its height, the "digiplus" sign 41–45.5%, the text block at
 * 194–425 of the hero. The sign cannot go behind the headline (where it read as part of the copy), so
 * the roof is pinned just under the breadcrumbs — roof ≈ 455 − 1.7% of the width — and the tower, sign
 * included, fills the band below the text at every desktop width. A % position cannot hold that; the
 * offset is computed in px from the photo's rendered width W: top = 455 − (0.378 × 0.75 + 0.017) × W.
 * From 768 up (phones keep their own §92 crop). Below 1540 the photo is drawn 1540 wide (cropped at the sides; the sign stays left of centre under
 * the title) so the sky still reaches the top of the hero.
 */
@media ( min-width: 768px ) {
	.elementor.elementor .jsx-ct-hero {
		--jsx-ct-photo-w: max( 100vw, 1540px );
		--jsx-ct-roof: 455px;
		background-size: cover, var( --jsx-ct-photo-w ) auto;
		background-position: center, center calc( var( --jsx-ct-roof ) - 0.3005 * var( --jsx-ct-photo-w ) );
	}
}

/* 768–1024: the hero is 535 and the breadcrumbs end at 400, so the roof comes up 25 (at 900 wide the old
   `center 4%` put the sign straight behind "We would like to") */
@media ( min-width: 768px ) and ( max-width: 1024px ) {
	.elementor.elementor .jsx-ct-hero { --jsx-ct-roof: 430px; }
}

.elementor.elementor .jsx-ct-hero__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

.elementor.elementor .jsx-ct-hero__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-dark );
}

/* --- eyebrow -------------------------------------------------------------- */

.elementor.elementor .jsx-ct-eyebrow {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.10em;
	text-transform: uppercase;
	color: var( --dp-text-on-light-muted );
}

/*
 * The frame sets the hero eyebrow in brand light blue, which is 4.09:1 on this
 * scrim — under the 4.5 floor for 13px. The quarter-disc marker keeps the brand
 * cyan, since it is decorative; only the label turns white.
 */
.elementor.elementor .jsx-ct-eyebrow--onhero { justify-content: center; color: var( --dp-text-on-dark ); }

.elementor.elementor .jsx-ct-mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

.elementor.elementor .jsx-ct-eyebrow__text { margin: 0; font: inherit; letter-spacing: inherit; color: inherit; }

/* --- anchor nav ----------------------------------------------------------- */

.elementor.elementor .jsx-ct-nav {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 88px ) ); /* + admin bar when logged in, as .jsx-cg-nav */
	z-index: 20;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
	border-block-end: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-ct-nav__inner {
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	gap: 30px;
	overflow-x: auto;
	scrollbar-width: none;
}

.elementor.elementor .jsx-ct-nav__inner::-webkit-scrollbar { display: none; }

.elementor.elementor .jsx-ct-nav__link {
	display: inline-block;
	margin: 0;
	padding-block: 24px 18px;
	border-block-end: 3px solid transparent;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	white-space: nowrap;
	text-decoration: none;
	transition: color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-ct-nav__link:hover { color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-ct-nav__link:has( > a.is-current ),
.elementor.elementor .jsx-ct-nav__link.is-current { color: var( --dp-blue ); border-block-end-color: var( --dp-blue ); }

.elementor.elementor .jsx-ct-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 78px ); }

/* --- bands ---------------------------------------------------------------- */

.elementor.elementor .jsx-ct-band {
	padding-block: 96px;
	padding-inline: var( --dp-gutter );
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-ct-band--wash { background-color: #faf9fd; }

.elementor.elementor .jsx-ct-inner {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
	display: flex;
	flex-direction: column;
	align-items: stretch;
}

/* --- type ----------------------------------------------------------------- */

.elementor.elementor .jsx-ct-title {
	max-width: 900px;
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.015em;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ct-lead {
	max-width: 760px;
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 20px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

/* --- cards ---------------------------------------------------------------- */

.elementor.elementor .jsx-ct-card {
	display: flex;
	flex-direction: column;
	padding: 40px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-ct-icon {
	flex: 0 0 auto;
	width: 24px;
	height: 24px;
	background-color: var( --dp-blue );
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
}

.elementor.elementor .jsx-ct-icon--pin { -webkit-mask-image: var( --jsx-pin ); mask-image: var( --jsx-pin ); }
.elementor.elementor .jsx-ct-icon--tel { -webkit-mask-image: var( --jsx-tel ); mask-image: var( --jsx-tel ); }
.elementor.elementor .jsx-ct-icon--mail { -webkit-mask-image: var( --jsx-mail ); mask-image: var( --jsx-mail ); }

/* --- the head-office card ------------------------------------------------- */

.elementor.elementor .jsx-ct-office { gap: 0; }
.elementor.elementor .jsx-ct-off__row { display: flex; flex-direction: column; align-items: flex-start; }

.elementor.elementor .jsx-ct-off__row--ruled {
	margin-block-start: 36px;
	padding-block-start: 36px;
	border-block-start: 1px solid var( --dp-line-on-light );
}

.elementor.elementor .jsx-ct-off__label {
	margin: 12px 0 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.10em;
	text-transform: uppercase;
	color: var( --dp-text-on-light-muted );
}

.elementor.elementor .jsx-ct-off__text {
	margin: 8px 0 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ct-off__text a { color: inherit; text-decoration: none; }
.elementor.elementor .jsx-ct-off__text a:hover { text-decoration: underline; }

/* --- the "Follow us" card -------------------------------------------------- */

/*
 * Jun, 2026-10-12: the social links under the head-office card, filling the empty foot of column one
 * beside the taller form. One card in row 5 of the split grid (the form spans 1–5); below 768 it
 * stacks last, after the office card.
 *
 * The links come from DigiPlus Settings -> Social Media through [dp_social names="yes"], the same rows
 * the footer draws, so a changed or added network updates both. Labelled pills rather than the footer's
 * bare marks: on a white card, beside an address and a phone number, "Facebook" reads faster than a
 * glyph, and the 48px pill is the touch target.
 */
.elementor.elementor .jsx-ct-follow .jsx-ct-off__label { margin-block-start: 0; }

.elementor.elementor .jsx-ct-follow .jsx-social {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-block-start: 16px;
}

.elementor.elementor .jsx-ct-follow .jsx-social__link {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	min-height: 48px;
	padding-block: 0;
	padding-inline: 16px 20px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 999px;
	background-color: var( --dp-white );
	color: var( --dp-text-on-light );
	font-family: var( --dp-font-body );
	font-size: 15px;
	font-weight: 500;
	line-height: 1;
	text-decoration: none;
	transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease;
}

.elementor.elementor .jsx-ct-follow .jsx-social__link svg {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	color: var( --dp-blue );
	transition: color 160ms ease;
}

.elementor.elementor .jsx-ct-follow .jsx-social__link:hover,
.elementor.elementor .jsx-ct-follow .jsx-social__link:focus-visible {
	border-color: var( --dp-blue );
	background-color: var( --dp-blue );
	color: var( --dp-white );
}

.elementor.elementor .jsx-ct-follow .jsx-social__link:hover svg,
.elementor.elementor .jsx-ct-follow .jsx-social__link:focus-visible svg { color: var( --dp-white ); }

.elementor.elementor .jsx-ct-follow .jsx-social__link:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 2px; }

@media ( prefers-reduced-motion: reduce ) {
	.elementor.elementor .jsx-ct-follow .jsx-social__link,
	.elementor.elementor .jsx-ct-follow .jsx-social__link svg { transition: none; }
}

/* --- the email directory -------------------------------------------------- */

/* `grid-template-rows: auto` is load-bearing: e-grid-base ships a fixed
   two-row template, which leaves an empty row under a single-row grid */
.elementor.elementor .jsx-ct-mails {
	width: 100%;
	display: grid;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	grid-template-rows: auto;
	gap: 20px 41px;
}

.elementor.elementor .jsx-ct-mail {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	min-height: 170px;
	padding: 32px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 16px;
	background-color: var( --dp-white );
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.elementor.elementor .jsx-ct-mail:hover { border-color: var( --dp-blue ); box-shadow: 0 8px 24px rgba( 70, 0, 255, 0.08 ); }

.elementor.elementor .jsx-ct-mail__title {
	margin: 20px 0 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ct-mail__addr {
	margin: 10px 0 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	word-break: break-word;
}

.elementor.elementor .jsx-ct-mail__addr a { color: var( --dp-blue ); text-decoration: none; }
.elementor.elementor .jsx-ct-mail__addr a:hover { text-decoration: underline; }

/* --- the studios ---------------------------------------------------------- */

.elementor.elementor .jsx-ct-studios {
	width: 100%;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	grid-template-rows: auto;
	gap: 40px;
}

.elementor.elementor .jsx-ct-studio { align-items: flex-start; min-height: 183px; }

.elementor.elementor .jsx-ct-studio__title {
	margin: 16px 0 0;
	font-family: var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ct-studio__addr {
	margin: 10px 0 0;
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
}

/* --- explore more --------------------------------------------------------- */

.elementor.elementor .jsx-ct-routes {
	width: 100%;
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	gap: 40px;
}

.elementor.elementor .jsx-ct-route {
	display: block;
	min-height: 178px;
	padding: 28px 72px 28px 32px;
	background-color: var( --dp-white );
	border: 1px solid var( --dp-line-on-light );
	border-radius: 14px;
	background-image: var( --jsx-arrow-blue );
	background-repeat: no-repeat;
	background-position: right 32px center;
	background-size: 15px 12px;
	text-decoration: none;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.elementor.elementor .jsx-ct-route:hover { border-color: var( --dp-blue ); box-shadow: 0 8px 24px rgba( 70, 0, 255, 0.10 ); }
.elementor.elementor .jsx-ct-route .jsx-ct-eyebrow { color: var( --dp-blue ); }

.elementor.elementor .jsx-ct-route__title {
	display: block;
	margin: 8px 0 0;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 40px;
	line-height: 1.2;
	letter-spacing: -0.01em;
	color: var( --dp-text-on-light );
}

/* --- the message band's split --------------------------------------------- */

/*
 * The form card runs the full height of the band, so the eyebrow, heading and
 * intro belong to the LEFT column above the head-office card — they do not sit
 * across the top. The band inner is therefore the grid, and the split goes
 * `display: contents` so its two cards join that grid directly: the office card
 * lands under the copy, the form card spans every row of column two.
 */
.elementor.elementor .jsx-ct-inner--split {
	display: grid;
	grid-template-columns: minmax( 0, 560px ) 580px;
	grid-template-rows: auto auto auto auto 1fr;
	column-gap: 100px;
	align-items: start;
}

/*
 * Every item is placed by hand. Auto-placement sends the lead into column two
 * and `grid-row: 1 / -1` on the card resolves against lines that do not exist
 * in an implicit grid, which pushed the whole left column below the form.
 */
.elementor.elementor .jsx-ct-split { display: contents; }
.elementor.elementor .jsx-ct-inner--split > .jsx-ct-eyebrow { grid-column: 1; grid-row: 1; }
.elementor.elementor .jsx-ct-inner--split > .jsx-ct-title { grid-column: 1; grid-row: 2; }
.elementor.elementor .jsx-ct-inner--split > .jsx-ct-lead { grid-column: 1; grid-row: 3; }
.elementor.elementor .jsx-ct-office { grid-column: 1; grid-row: 4; }
.elementor.elementor .jsx-ct-follow { grid-column: 1; grid-row: 5; }
.elementor.elementor .jsx-ct-formcard { grid-column: 2; grid-row: 1 / span 5; }

/* --- the form ------------------------------------------------------------- */

.elementor.elementor .jsx-ct-formcard { padding: 40px; }
.elementor.elementor .jsx-ct-formcard .elementor-widget-form,
.elementor.elementor .jsx-ct-formcard .elementor-form { width: 100%; }

.elementor.elementor .jsx-ct-formcard .elementor-form-fields-wrapper { display: block; margin: 0; }
.elementor.elementor .jsx-ct-formcard .elementor-field-group { width: 100%; padding: 0; margin-block-start: 24px; }
.elementor.elementor .jsx-ct-formcard .elementor-field-group:first-child { margin-block-start: 0; }

.elementor.elementor .jsx-ct-formcard .elementor-field-label {
	display: block;
	height: 18px;
	margin: 0 0 8px;
	padding: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 18px;
	letter-spacing: 0.10em;
	text-transform: uppercase;
	color: var( --dp-text-on-light );
}

/* height, not min-height: Elementor's own field padding pushes these to 60 */
.elementor.elementor .jsx-ct-formcard .elementor-field-textual,
.elementor.elementor .jsx-ct-formcard .elementor-select-wrapper select {
	width: 100%;
	height: 52px;
	min-height: 52px;
	padding: 0 20px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	background-color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light );
	box-shadow: none;
}

.elementor.elementor .jsx-ct-formcard .elementor-field-textual::placeholder { color: var( --dp-text-on-light-muted ); opacity: 1; }
.elementor.elementor .jsx-ct-formcard .elementor-field-textual:focus-visible,
.elementor.elementor .jsx-ct-formcard .elementor-select-wrapper select:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 1px; }

.elementor.elementor .jsx-ct-formcard textarea.elementor-field-textual { height: 140px; min-height: 140px; padding-block: 14px; resize: vertical; }

/*
 * The inquiry dropdown is a button and a listbox over the native <select>,
 * which stays as the value carrier and the no-JS fallback. Elementor's own
 * wrapper (.elementor-select-wrapper) draws a chevron with a ::before, so that
 * goes once the enhanced control takes over.
 */
.elementor.elementor .jsx-ct-formcard .elementor-select-wrapper select { appearance: none; cursor: pointer; }
.elementor.elementor .jsx-ct-field { position: relative; display: block; }
.elementor.elementor .jsx-ct-field.is-enhanced select { display: none; }
.elementor.elementor .jsx-ct-field.is-enhanced::before { display: none; }

.elementor.elementor .jsx-ct-select__btn {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	width: 100%;
	height: 52px;
	padding-inline: 20px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	background-color: var( --dp-white );
	font-family: var( --dp-font-body );
	font-size: 16px;
	line-height: 1.7;
	color: var( --dp-text-on-light-muted );
	text-align: start;
	cursor: pointer;
	transition: border-color 160ms ease;
}

.elementor.elementor .jsx-ct-field.is-set .jsx-ct-select__btn { border-color: var( --dp-blue ); color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-ct-select__btn:hover { border-color: var( --dp-text-on-light-muted ); }
.elementor.elementor .jsx-ct-select__btn:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 1px; }

.elementor.elementor .jsx-ct-select__value { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }

.elementor.elementor .jsx-ct-select__caret {
	flex: 0 0 auto;
	width: 9px;
	height: 9px;
	margin-block-start: -4px;
	border-inline-end: 1.8px solid var( --dp-text-on-light-muted );
	border-block-end: 1.8px solid var( --dp-text-on-light-muted );
	transform: rotate( 45deg );
	transition: transform 160ms ease;
}

.elementor.elementor .jsx-ct-select__btn[aria-expanded="true"] .jsx-ct-select__caret { margin-block-start: 3px; transform: rotate( -135deg ); }

.elementor.elementor .jsx-ct-select__list {
	position: absolute;
	inset-inline: 0;
	inset-block-start: calc( 100% + 6px );
	z-index: 30;
	max-height: 260px;
	margin: 0;
	padding: 6px;
	list-style: none;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 12px;
	background-color: var( --dp-white );
	box-shadow: 0 16px 32px -12px rgba( 8, 16, 41, 0.22 );
	overflow-y: auto;
	overscroll-behavior: contain;
}

.elementor.elementor .jsx-ct-select__opt {
	padding: 11px 14px;
	border-radius: 8px;
	font-family: var( --dp-font-body );
	font-size: 15px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
	cursor: pointer;
}

.elementor.elementor .jsx-ct-select__opt:hover { background-color: #faf9fd; color: var( --dp-text-on-light ); }
.elementor.elementor .jsx-ct-select__opt:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: -2px; }
.elementor.elementor .jsx-ct-select__opt[aria-selected="true"] { background-color: #ede9fe; font-weight: 600; color: var( --dp-blue ); }

/* --- consent rows --------------------------------------------------------- */

.elementor.elementor .jsx-ct-formcard .elementor-field-type-acceptance { margin-block-start: 27px; }
.elementor.elementor .jsx-ct-formcard .elementor-field-type-acceptance + .elementor-field-type-acceptance { margin-block-start: 20px; }

.elementor.elementor .jsx-ct-formcard .elementor-field-subgroup,
.elementor.elementor .jsx-ct-formcard .elementor-field-option {
	display: flex;
	align-items: flex-start;
	gap: 12px;
}

/*
 * 24×24, not the 20 the first draft of the frame carried: WCAG 2.2 AA sets a
 * 24×24 minimum target and a consent checkbox is the last control that should
 * be hard to hit.
 */
.elementor.elementor .jsx-ct-formcard input[type="checkbox"] {
	flex: 0 0 auto;
	width: 24px;
	height: 24px;
	margin: 0;
	accent-color: var( --dp-blue );
}

.elementor.elementor .jsx-ct-formcard .elementor-field-option label,
.elementor.elementor .jsx-ct-formcard .elementor-field-subgroup label {
	margin: 0;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
	color: var( --dp-text-on-light );
}

.elementor.elementor .jsx-ct-formcard .elementor-field-option a { color: var( --dp-blue ); text-decoration: underline; text-underline-offset: 2px; }

.elementor.elementor .jsx-ct-formcard .elementor-field-type-recaptcha,
.elementor.elementor .jsx-ct-formcard .elementor-field-type-recaptcha_v3 { margin-block-start: 28px; }

/* --- submit --------------------------------------------------------------- */

/* flex so the row hugs the button instead of carrying a line box under it */
.elementor.elementor .jsx-ct-formcard .elementor-field-type-submit { display: flex; margin-block-start: 28px; }

.elementor.elementor .jsx-ct-formcard .elementor-button {
	display: inline-flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	min-width: 190px;
	min-height: 52px;
	padding-inline: 28px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	color: var( --dp-text-on-dark );
	transition: background-color 160ms ease, border-color 160ms ease;
}

.elementor.elementor .jsx-ct-formcard .elementor-button:hover { background-color: var( --dp-violet ); border-color: var( --dp-violet ); }

.elementor.elementor .jsx-ct-formcard .elementor-button-content-wrapper { display: contents; }

.elementor.elementor .jsx-ct-formcard .elementor-button-text::after {
	content: "";
	display: inline-block;
	width: 15px;
	height: 12px;
	margin-inline-start: 24px;
	vertical-align: middle;
	background-image: var( --jsx-arrow-white );
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
}

/* Elementor's own messages, in this page's voice */
.elementor.elementor .jsx-ct-formcard .elementor-message {
	margin-block-start: 16px;
	font-family: var( --dp-font-body );
	font-size: 14px;
	line-height: 1.6;
}

/* --- vertical rhythm ------------------------------------------------------ */

.elementor.elementor .jsx-ct-inner > * + * { margin-block-start: 48px; }
.elementor.elementor .jsx-ct-eyebrow + * { margin-block-start: 32px; }
.elementor.elementor .jsx-ct-title + .jsx-ct-lead { margin-block-start: 27px; }
.elementor.elementor .jsx-ct-title + .jsx-ct-studios { margin-block-start: 67px; }
.elementor.elementor .jsx-ct-lead + .jsx-ct-mails { margin-block-start: 48px; }
/* in the split band the grid places the columns; only the stack inside column
   one carries rhythm, and the form card never inherits it */
.elementor.elementor .jsx-ct-inner--split > * + * { margin-block-start: 0; }
.elementor.elementor .jsx-ct-inner--split .jsx-ct-title { margin-block-start: 32px; }
.elementor.elementor .jsx-ct-inner--split .jsx-ct-lead { margin-block-start: 27px; }
.elementor.elementor .jsx-ct-office { margin-block-start: 74px; }
.elementor.elementor .jsx-ct-follow { margin-block-start: 24px; }
.elementor.elementor .jsx-ct-formcard { margin-block-start: 0; }

/* a grid places its own children */
.elementor.elementor .jsx-ct-mails > *,
.elementor.elementor .jsx-ct-studios > *,
.elementor.elementor .jsx-ct-routes > * { margin-block-start: 0; }

/* --- 1339 ----------------------------------------------------------------- */

@media ( max-width: 1339px ) {
	.elementor.elementor .jsx-ct-band,
	.elementor.elementor .jsx-ct-hero,
	.elementor.elementor .jsx-ct-nav { padding-inline: 56px; }
	.elementor.elementor .jsx-ct-inner--split { grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1fr ); column-gap: 56px; }
	.elementor.elementor .jsx-ct-mails { gap: 20px 24px; }
}

/* --- 1024 ----------------------------------------------------------------- */

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-ct-hero__title { font-size: 52px; }
	.elementor.elementor .jsx-ct-title { font-size: 38px; }
	.elementor.elementor .jsx-ct-mails { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); }
	.elementor.elementor .jsx-ct-routes { grid-template-columns: minmax( 0, 1fr ); }
	.elementor.elementor .jsx-ct-route__title { font-size: 32px; }
}

/* --- 767 ------------------------------------------------------------------ */

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-ct-hero {
		padding-block: 282px 24px;
		padding-inline: var( --dp-gutter-mobile );
		background-position: center 30%;
		text-align: start;
	}
	.elementor.elementor .jsx-ct-hero__title { font-size: 40px; line-height: 1.1; }
	.elementor.elementor .jsx-ct-eyebrow--onhero { justify-content: flex-start; }

	.elementor.elementor .jsx-ct-band,
	.elementor.elementor .jsx-ct-nav { padding-inline: var( --dp-gutter-mobile ); }
	.elementor.elementor .jsx-ct-band { padding-block: 56px; }
	.elementor.elementor .jsx-ct-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px ); }

	/* the anchor rail is three chips and fits 390 exactly — no scrolling */
	.elementor.elementor .jsx-ct-nav__inner { gap: 8px; padding-block: 20px; }
	.elementor.elementor .jsx-ct-nav__link {
		padding: 9px 14px;
		border: 0;
		border-radius: 18px;
		background-color: var( --dp-lavender );
		font-size: 13px;
		line-height: 1.4;
	}
	.elementor.elementor .jsx-ct-nav__link:has( > a.is-current ),
	.elementor.elementor .jsx-ct-nav__link.is-current { background-color: var( --dp-blue ); color: var( --dp-text-on-dark ); }

	.elementor.elementor .jsx-ct-title { font-size: 30px; }
	.elementor.elementor .jsx-ct-lead { font-size: 16px; }

	/*
	 * The form comes FIRST and the head-office card second. Source order would
	 * bury the form under a 356px card in a section called "Send us a message".
	 */
	.elementor.elementor .jsx-ct-inner--split {
		display: flex;
		flex-direction: column;
		align-items: stretch;
	}
	.elementor.elementor .jsx-ct-inner--split .jsx-ct-eyebrow { order: 1; }
	.elementor.elementor .jsx-ct-inner--split .jsx-ct-title { order: 2; margin-block-start: 12px; }
	.elementor.elementor .jsx-ct-inner--split .jsx-ct-lead { order: 3; margin-block-start: 16px; }
	.elementor.elementor .jsx-ct-formcard { order: 4; margin-block-start: 32px; }
	.elementor.elementor .jsx-ct-office { order: 5; margin-block-start: 20px; }
	.elementor.elementor .jsx-ct-follow { order: 6; margin-block-start: 20px; }

	.elementor.elementor .jsx-ct-card { padding: 24px; }
	.elementor.elementor .jsx-ct-formcard { padding: 24px; }
	.elementor.elementor .jsx-ct-off__row--ruled { margin-block-start: 28px; padding-block-start: 28px; }

	.elementor.elementor .jsx-ct-mails { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-ct-mail { min-height: 0; padding: 24px; }
	.elementor.elementor .jsx-ct-studios { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
	.elementor.elementor .jsx-ct-studio { min-height: 0; }
	.elementor.elementor .jsx-ct-routes { gap: 16px; }
	.elementor.elementor .jsx-ct-route { min-height: 136px; padding: 24px 56px 24px 24px; background-position: right 24px center; }
	.elementor.elementor .jsx-ct-route__title { font-size: 22px; }

	.elementor.elementor .jsx-ct-inner > * + * { margin-block-start: 32px; }
	.elementor.elementor .jsx-ct-eyebrow + * { margin-block-start: 12px; }
	.elementor.elementor .jsx-ct-title + .jsx-ct-lead { margin-block-start: 16px; }
	.elementor.elementor .jsx-ct-title + .jsx-ct-studios { margin-block-start: 28px; }
	.elementor.elementor .jsx-ct-lead + .jsx-ct-mails { margin-block-start: 28px; }

	.elementor.elementor .jsx-ct-formcard .elementor-field-group { margin-block-start: 20px; }
	.elementor.elementor .jsx-ct-formcard .elementor-button { width: 100%; }
}

/* ------------------------------------------- 80. Inner-page hero heights */

/*
 * One floor for every inner-page hero, on desktop only (Jun, 2026-10-03):
 *
 *   - Our Brand's hero, raised 25% (440 -> 550 at 1440), sets the floor;
 *   - every other inner hero takes the same `min-height`, so a shorter one
 *     rises to 550 and a taller one is left exactly as it was -- `min-height`
 *     never adds to a box already past it.
 *
 * At 1440 that leaves IR (563), Sustainability (603), Careers (560) and Contact
 * (560) untouched, and lifts Responsible Gaming (545), News (398), Corporate
 * Governance (371), Our Portfolio (369) and the portfolio detail hero (369).
 * Change the floor in one place: --jsx-hero-min.
 *
 * Scoped to 1025 and up, the theme's desktop range (every hero's padding steps
 * at exactly 1024 and 767). Tablet and mobile are untouched, display included.
 *
 * The heroes that were `display: block` become centred flex columns, so any
 * height the floor adds splits above and below the copy, as it already did on
 * the flex heroes. Where the floor does not bite this renders identically to
 * block: every child carries a top margin only (titles are `margin: 0`), so
 * there is no margin collapse for flex to undo.
 *
 * `.jsx-nx-hero` is shared by Our Brand, Corporate Governance and News (only
 * those three documents use it); its own 336px floor sits at the same
 * specificity, which is why this section is last in the file.
 */
@media ( min-width: 1025px ) {
	:root { --jsx-hero-min: 550px; }

	.elementor.elementor :is( .jsx-ir-hero, .jsx-su-hero, .jsx-rg-hero, .jsx-car-hero, .jsx-ct-hero ),
	.jsx-pd .jsx-pd-hero {
		display: flex;
		flex-direction: column;
		justify-content: center;
	}

	.elementor.elementor :is( .jsx-nx-hero, .jsx-pf-hero, .jsx-ir-hero, .jsx-su-hero, .jsx-rg-hero, .jsx-car-hero, .jsx-ct-hero ),
	.jsx-pd .jsx-pd-hero {
		min-height: var( --jsx-hero-min );
	}
}

/* ---------------------------------- 81. Homepage preview cards: filled CTA */

/*
 * The "Go to …" button in each routing-row preview card carries
 * jsx-btn-primary, which is WHITE by design (it was drawn for the dark hero)
 * and sits here on a white card — so it read as loose text with an indent.
 * Jun, 2026-10-03: give it a background. It now takes the house CTA fill
 * (brand blue, white label and arrow, violet on hover), the same as
 * jsx-su-cta / jsx-ir-cta. Shape, size and padding stay jsx-btn-primary's,
 * which is already the house 8px / 48px / 28px.
 *
 * Scoped to the preview cards (children 5-8 of .jsx-routing-rows) so the hero's
 * white button is untouched. White on #4600ff is 7.8:1; on #4600a8, 11.5:1.
 */
.elementor.elementor .jsx-routing-rows > :nth-child(n + 5 of .e-con) .jsx-btn-primary {
	background-color: var( --dp-blue );
	color: var( --dp-text-on-dark );
	transition: background-color 160ms ease;
}

.elementor.elementor .jsx-routing-rows > :nth-child(n + 5 of .e-con) .jsx-btn-primary:hover,
.elementor.elementor .jsx-routing-rows > :nth-child(n + 5 of .e-con) .jsx-btn-primary:focus-visible {
	background-color: var( --dp-violet );
	color: var( --dp-text-on-dark );
}

/* --------------------------------------- 82. Basic page (page.php, non-Elementor) */

/*
 * The default template for pages with no Elementor content — today the legal
 * pages. A lavender-soft title band under the light header, then the article's
 * reading column: .jsx-ar-content supplies the body type (18/1.75, lists,
 * tables, links), so a policy page and an article read the same. Column width
 * is the article's 700px plus air, 800 — legal copy is long-form reading and
 * past ~85 characters a line it stops being comfortable.
 *
 * The header is fixed on light pages (§31), so the band carries its height
 * back as top padding: --jsx-header-h is published by custom.js.
 */
.jsx-basic { background-color: #fff; }

.jsx-basic__inner {
	box-sizing: border-box;
	width: 100%;
	max-width: calc( 800px + 2 * var( --dp-gutter ) );
	margin-inline: auto;
	padding-inline: var( --dp-gutter );
}

.jsx-basic__head {
	padding-block: calc( var( --jsx-header-h, 91px ) + 72px ) 64px;
	background-color: var( --dp-lavender-soft );
}

.jsx-basic__crumbs { margin-block-end: 24px; }

.jsx-basic .jsx-basic__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 56px;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
	overflow-wrap: break-word;
}

/*
 * Bold that actually renders. Elementor Pro's custom-font rule declares the
 * General Sans VARIABLE file at `font-weight: normal`, i.e. 400 only, so the
 * browser clamps every request to 400: `<strong>` (600) and every 500 in this
 * family render Regular, site-wide. The policy pages lean on bold paragraphs as
 * their section headings, so here the same file is declared again under its
 * own name with the file's real axis (125–950). Same URL, so no second
 * download. Scoped to the basic page on purpose — correcting the shared rule
 * would re-weight every button and nav label on the site, which is Jun's call.
 */
@font-face {
	font-family: "General Sans VF";
	src: url( "/wp-content/uploads/2024/02/GeneralSans-Variable-1.ttf" ) format( "truetype" );
	font-weight: 125 950;
	font-style: normal;
	font-display: swap;
}

.jsx-basic__body {
	padding-block: 64px 120px;
	font-family: "General Sans VF", var( --dp-font-body );
}

/* The block editor leaves empty paragraphs either side of every separator. */
.jsx-basic__body p:empty { display: none; }

.jsx-basic__body > :first-child { margin-block-start: 0; }
.jsx-basic__body > :last-child { margin-block-end: 0; }

.jsx-basic__body hr,
.jsx-basic__body .wp-block-separator {
	height: 0;
	margin: 44px 0;
	border: 0;
	border-block-start: 1px solid var( --dp-line-on-light );
	opacity: 1;
}

.jsx-basic__body a { text-underline-offset: 3px; overflow-wrap: anywhere; }

.jsx-basic__pages { margin-block-start: 40px; font-size: 16px; }

@media ( max-width: 1024px ) {
	.jsx-basic__inner { padding-inline: 40px; }
	.jsx-basic__head { padding-block: calc( var( --jsx-header-h, 72px ) + 56px ) 48px; }
	.jsx-basic .jsx-basic__title { font-size: 44px; }
	.jsx-basic__body { padding-block: 56px 96px; }
}

@media ( max-width: 767px ) {
	.jsx-basic__inner { padding-inline: 20px; }
	.jsx-basic__head { padding-block: calc( var( --jsx-header-h, 64px ) + 40px ) 36px; }
	.jsx-basic__crumbs { margin-block-end: 16px; }
	.jsx-basic .jsx-basic__title { font-size: 32px; }
	.jsx-basic__body { padding-block: 40px 72px; }
	.jsx-basic__body hr,
	.jsx-basic__body .wp-block-separator { margin: 32px 0; }
}

/* ------------------------------------- 83. Job detail (Figma page 22: 595:88 / 597:17) */

/*
 * Single job-opening, rendered by template 15317's shortcodes (inc/job-single.php).
 * Plain lavender-soft hero under the white header — Jun, 2026-10-03: no hero
 * image — then the posting in an article-width column beside a sticky summary
 * card, and three more roles. The template renders no Elementor global classes,
 * so every type rule here is declared in full.
 *
 * Bold that renders: the description's headings are promoted <h2>s at 600 and
 * General Sans is clamped to 400 by the shared face (see §82) — so this page
 * uses §82's "General Sans VF" face, same file, real axis.
 */
body.jsx-job { --jsx-job-font: "General Sans VF", var( --dp-font-body ); }

.jsx-job-inner {
	box-sizing: border-box;
	width: 100%;
	max-width: calc( 1240px + 2 * var( --dp-gutter ) );
	margin-inline: auto;
	padding-inline: var( --dp-gutter );
}

/* --- hero --------------------------------------------------------------- */

.jsx-job-hero {
	padding-block: calc( var( --jsx-header-h, 91px ) + 72px ) 72px;
	background-color: var( --dp-lavender-soft );
	font-family: var( --jsx-job-font );
}

.jsx-job-hero__crumbs { margin-block-end: 24px; }

.jsx-job .jsx-job-tag {
	display: inline-block;
	margin: 0 0 16px;
	padding: 4px 10px;
	border-radius: 6px;
	background-color: #fff;
	font-family: var( --jsx-job-font );
	font-size: 13px;
	line-height: 18px;
	color: var( --dp-blue );
}

.jsx-job .jsx-job-hero__title {
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
	overflow-wrap: break-word;
}

.jsx-job .jsx-job-meta {
	display: flex;
	flex-wrap: wrap;
	gap: 8px 28px;
	margin: 24px 0 0;
	padding: 0;
	list-style: none;
	font-size: 16px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-job .jsx-job-meta__item { display: inline-flex; align-items: center; gap: 8px; margin: 0; }
.jsx-job .jsx-job-meta__item svg { flex: 0 0 auto; color: var( --dp-text-on-light-muted ); }

.jsx-job-actions { display: flex; flex-wrap: wrap; gap: 16px; margin-block-start: 32px; }

/* --- buttons: the house CTA shape (8px / 28px / 500, see house-cta memory) --- */

.jsx-job .jsx-job-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	box-sizing: border-box;
	min-height: 52px;
	padding-inline: 28px 24px;
	border: 1px solid transparent;
	border-radius: 8px;
	font-family: var( --jsx-job-font );
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	text-decoration: none;
	transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease;
}

.jsx-job .jsx-job-btn svg { flex: 0 0 auto; transition: transform 160ms ease-out; }
.jsx-job .jsx-job-btn:hover svg { transform: translateX( 2px ); }

.jsx-job .jsx-job-btn--primary {
	border-color: var( --dp-blue );
	background-color: var( --dp-blue );
	color: var( --dp-text-on-dark );
}

.jsx-job .jsx-job-btn--primary:hover,
.jsx-job .jsx-job-btn--primary:focus-visible {
	border-color: var( --dp-violet );
	background-color: var( --dp-violet );
	color: var( --dp-text-on-dark );
}

.jsx-job .jsx-job-btn--ghost {
	border-color: var( --dp-text-on-light );
	background-color: transparent;
	color: var( --dp-text-on-light );
}

.jsx-job .jsx-job-btn--ghost:hover,
.jsx-job .jsx-job-btn--ghost:focus-visible {
	border-color: var( --dp-blue );
	color: var( --dp-blue );
}

.jsx-job .jsx-job-btn--block { width: 100%; }

/* --- body: 760 copy + 380 card, 100 apart = 1240 ----------------------- */

.jsx-job-body { padding-block: 96px 120px; background-color: #fff; }

.jsx-job-body__cols {
	display: grid;
	grid-template-columns: minmax( 0, 760px ) 380px;
	justify-content: space-between;
	gap: 48px;
	align-items: start;
}

.jsx-job-body__main { min-width: 0; }

.jsx-job .jsx-job-content {
	font-family: var( --jsx-job-font );
	font-size: 17px;
	line-height: 1.75;
}

.jsx-job .jsx-job-content > :first-child { margin-block-start: 0; }

.jsx-job .jsx-job-content .jsx-job__heading {
	margin: 48px 0 16px;
	font-family: var( --jsx-job-font );
	font-weight: 600;
	font-size: 22px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.jsx-job .jsx-job-content > .jsx-job__heading:first-child { margin-block-start: 0; }
.jsx-job .jsx-job-content p { margin: 0 0 18px; }
.jsx-job .jsx-job-content ul,
.jsx-job .jsx-job-content ol { margin: 0 0 18px; }
.jsx-job .jsx-job-content li { margin-bottom: 8px; }

.jsx-job .jsx-job-apply {
	display: grid;
	justify-items: start;
	gap: 24px;
	margin-block-start: 48px;
	padding: 36px 40px 40px;
	border-radius: 12px;
	background-color: var( --dp-lavender-soft );
	font-family: var( --jsx-job-font );
	font-size: 17px;
	line-height: 1.7;
	color: var( --dp-text-on-light );
}

.jsx-job .jsx-job-apply__text p { margin: 0; }
.jsx-job .jsx-job-apply__text a { color: var( --dp-blue ); text-underline-offset: 3px; overflow-wrap: anywhere; }

/* --- summary card -------------------------------------------------------- */

.jsx-job .jsx-job-card {
	position: sticky;
	top: calc( var( --jsx-header-offset, 0px ) + var( --jsx-header-h, 91px ) + 24px );
	box-sizing: border-box;
	padding: 32px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 12px;
	background-color: #fff;
	box-shadow: 0 12px 32px rgba( 21, 19, 31, 0.08 );
	font-family: var( --jsx-job-font );
}

.jsx-job .jsx-job-card__label {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 1.3px;
	text-transform: uppercase;
	color: var( --dp-text-on-light-muted );
}

.jsx-job .jsx-job-card__title {
	margin: 12px 0 20px;
	font-family: var( --jsx-job-font );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.jsx-job .jsx-job-card__facts { margin: 0 0 24px; }
.jsx-job .jsx-job-card__facts > div { padding-block: 14px; border-block-start: 1px solid var( --dp-line-on-light ); }
.jsx-job .jsx-job-card__facts dt { margin: 0; font-size: 13px; line-height: 1.4; color: var( --dp-text-on-light-muted ); }
.jsx-job .jsx-job-card__facts dd { margin: 4px 0 0; font-size: 16px; line-height: 1.5; color: var( --dp-text-on-light ); }

.jsx-job .jsx-job-card__note {
	margin: 12px 0 0;
	font-size: 14px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

/* --- share --------------------------------------------------------------- */

.jsx-job .jsx-job-share {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px;
	margin-block-start: 28px;
	padding-block-start: 20px;
	border-block-start: 1px solid var( --dp-line-on-light );
	font-family: var( --jsx-job-font );
}

.jsx-job .jsx-job-share__label { flex: 1 1 auto; margin: 0; font-size: 14px; line-height: 1.5; color: var( --dp-text-on-light ); }
.jsx-job .jsx-job-share__links { display: flex; gap: 12px; }

.jsx-job .jsx-job-share__btn {
	display: inline-grid;
	place-items: center;
	width: 44px;
	height: 44px;
	padding: 0;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 50%;
	background: #fff;
	color: var( --dp-text-on-light );
	cursor: pointer;
	transition: border-color 160ms ease, color 160ms ease;
}

/* Hello Elementor paints every button:hover #c36 — neutralise for the copy button. */
.jsx-job .jsx-job-share__btn:hover,
.jsx-job .jsx-job-share__btn:focus-visible,
.jsx-job .jsx-job-share__btn:active,
.jsx-job .jsx-job-share__btn.is-copied {
	border-color: var( --dp-blue );
	background: #fff;
	color: var( --dp-blue );
}

.jsx-job .jsx-job-share__status { flex-basis: 100%; min-height: 0; font-size: 13px; color: var( --dp-blue ); }
.jsx-job .jsx-job-share__status:empty { display: none; }

/* The share row under the copy is the mobile one; the card carries it on a desktop. */
.jsx-job .jsx-job-share--inline { display: none; }

/* --- more openings ------------------------------------------------------- */

.jsx-job-related { padding-block: 96px; background-color: var( --dp-lavender-soft ); }

.jsx-job .jsx-job-related__head {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 24px 40px;
	margin-block-end: 56px;
}

.jsx-job .jsx-job-related__title {
	max-width: 760px;
	margin: 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 44px;
	line-height: 1.15;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
}

.jsx-job .jsx-job-related__all {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	font-family: var( --jsx-job-font );
	font-size: 20px;
	line-height: 1.4;
	color: var( --dp-blue );
	text-decoration: none;
}

.jsx-job .jsx-job-related__all:hover { text-decoration: underline; text-underline-offset: 4px; }

.elementor.elementor .jsx-job-related__grid { grid-template-columns: repeat( 3, minmax( 0, 1fr ) ); }

/* --- tablet / mobile ----------------------------------------------------- */

@media ( max-width: 1024px ) {
	.jsx-job-inner { padding-inline: 40px; }
	.jsx-job-hero { padding-block: calc( var( --jsx-header-h, 72px ) + 56px ) 56px; }
	.jsx-job .jsx-job-hero__title { font-size: 48px; }
	.jsx-job-body { padding-block: 64px 96px; }
	/* The facts already sit in the hero; the card would only repeat them. */
	.jsx-job-body__cols { grid-template-columns: minmax( 0, 1fr ); }
	.jsx-job .jsx-job-card { display: none; }
	.jsx-job .jsx-job-share--inline { display: flex; margin-block-start: 40px; }
	.jsx-job-related { padding-block: 72px; }
	.jsx-job .jsx-job-related__title { font-size: 36px; }
	.elementor.elementor .jsx-job-related__grid { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); }
}

@media ( max-width: 767px ) {
	.jsx-job-inner { padding-inline: 20px; }
	.jsx-job-hero { padding-block: calc( var( --jsx-header-h, 64px ) + 40px ) 48px; }
	.jsx-job-hero__crumbs { margin-block-end: 20px; }
	.jsx-job .jsx-job-hero__title { font-size: 40px; }
	.jsx-job .jsx-job-meta { gap: 8px 20px; font-size: 14px; }
	.jsx-job-actions { flex-direction: column; gap: 12px; margin-block-start: 28px; }
	.jsx-job .jsx-job-actions .jsx-job-btn { width: 100%; }
	.jsx-job-body { padding-block: 48px 64px; }
	.jsx-job .jsx-job-content { font-size: 16px; line-height: 1.7; }
	.jsx-job .jsx-job-content .jsx-job__heading { margin-block-start: 40px; font-size: 20px; }
	.jsx-job .jsx-job-apply { padding: 28px 24px; }
	.jsx-job .jsx-job-apply .jsx-job-btn { width: 100%; }
	.jsx-job-related { padding-block: 56px 64px; }
	.jsx-job .jsx-job-related__head { margin-block-end: 28px; }
	.jsx-job .jsx-job-related__title { font-size: 30px; }
	.elementor.elementor .jsx-job-related__grid { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
}

/* -------------------- 84. Basic archive + 404 (template-parts/archive.php, 404.php) */

/*
 * Since the 2026-10-03 rollout every archive and 404 that no Elementor template
 * draws comes through these parts. Same band and column as the basic page
 * (§82); the list is a plain reading list — date, linked title, excerpt —
 * because these archives hold reports, profiles and job locations, not
 * imagery.
 */
.jsx-basic .jsx-basic__lead {
	max-width: 640px;
	margin-block-start: 16px;
	font-family: "General Sans VF", var( --dp-font-body );
	font-size: 18px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

.jsx-basic .jsx-basic__lead p { margin: 0; }

.jsx-basic .jsx-basic__list { margin: 0; padding: 0; list-style: none; }

.jsx-basic .jsx-basic__item {
	padding-block: 28px;
	border-block-end: 1px solid var( --dp-line-on-light );
}

.jsx-basic .jsx-basic__item:first-child { padding-block-start: 0; }

.jsx-basic .jsx-basic__date { margin: 0 0 8px; font-size: 14px; line-height: 1.5; color: var( --dp-text-on-light-muted ); }

.jsx-basic .jsx-basic__item-title {
	margin: 0;
	font-family: "General Sans VF", var( --dp-font-body );
	font-weight: 600;
	font-size: 20px;
	line-height: 1.35;
}

.jsx-basic .jsx-basic__item-title a { color: var( --dp-text-on-light ); text-decoration: none; }
.jsx-basic .jsx-basic__item-title a:hover,
.jsx-basic .jsx-basic__item-title a:focus-visible { color: var( --dp-blue ); text-decoration: underline; text-underline-offset: 3px; }

.jsx-basic .jsx-basic__excerpt { margin: 10px 0 0; font-size: 16px; line-height: 1.65; color: var( --dp-text-on-light-muted ); }

.jsx-basic .jsx-basic__pager { margin-block-start: 40px; }
.jsx-basic .jsx-basic__pager .nav-links { display: flex; flex-wrap: wrap; gap: 8px; }

.jsx-basic .jsx-basic__pager .page-numbers {
	display: inline-grid;
	place-items: center;
	min-width: 44px;
	height: 44px;
	padding-inline: 14px;
	box-sizing: border-box;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	font-size: 15px;
	color: var( --dp-text-on-light );
	text-decoration: none;
}

.jsx-basic .jsx-basic__pager .page-numbers.current { border-color: var( --dp-blue ); background-color: var( --dp-blue ); color: #fff; }
.jsx-basic .jsx-basic__pager a.page-numbers:hover { border-color: var( --dp-blue ); color: var( --dp-blue ); }
.jsx-basic .jsx-basic__pager .page-numbers.dots { border-color: transparent; }

/* 404: search + way home */
.jsx-basic .jsx-basic__search { display: flex; gap: 12px; max-width: 560px; margin-block: 32px 24px; }

.jsx-basic .jsx-basic__search input[type="search"] {
	flex: 1 1 auto;
	min-width: 0;
	height: 52px;
	padding-inline: 18px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 8px;
	font: inherit;
	font-size: 16px;
	color: var( --dp-text-on-light );
}

.jsx-basic .jsx-basic__btn {
	flex: 0 0 auto;
	min-height: 52px;
	padding-inline: 28px;
	border: 1px solid var( --dp-blue );
	border-radius: 8px;
	background-color: var( --dp-blue );
	font-family: "General Sans VF", var( --dp-font-body );
	font-weight: 500;
	font-size: 16px;
	color: #fff;
	cursor: pointer;
}

.jsx-basic .jsx-basic__btn:hover,
.jsx-basic .jsx-basic__btn:focus-visible,
.jsx-basic .jsx-basic__btn:active { border-color: var( --dp-violet ); background-color: var( --dp-violet ); color: #fff; }

@media ( max-width: 767px ) {
	.jsx-basic .jsx-basic__item { padding-block: 22px; }
	.jsx-basic .jsx-basic__item-title { font-size: 18px; }
	.jsx-basic .jsx-basic__search { flex-direction: column; }
}

/* §84 addendum: a link styled as the basic button (document downloads) */
.jsx-basic a.jsx-basic__btn--link { display: inline-flex; align-items: center; text-decoration: none; }

/* ------------------------------------- 85. Report detail (template 15322, inc/report-single.php) */

/*
 * Reuses §83's job anatomy (hero, buttons, summary card, share, related head)
 * through the shared `jsx-job` body class; only the document panel and the
 * list are new. Report titles are file-style and long
 * ("17Q_Quarterly Report Q2 2026 (08.04.2026)"), so the H1 steps down from 64.
 */
.jsx-report .jsx-report-hero__title { font-size: 52px; line-height: 1.12; }

.jsx-report .jsx-report-body { padding-block: 72px 96px; }

/* One card: file | facts | actions on a desktop, stacked below 1025. */
.jsx-report .jsx-report-doc {
	display: grid;
	grid-template-columns: minmax( 0, 1.2fr ) minmax( 0, 1.6fr ) auto;
	align-items: center;
	gap: 32px 48px;
	padding: 32px 36px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 12px;
	background-color: #fff;
	box-shadow: 0 12px 32px rgba( 21, 19, 31, 0.06 );
	font-family: var( --jsx-job-font );
}

.jsx-report .jsx-report-doc__file { display: flex; align-items: center; gap: 18px; min-width: 0; }

.jsx-report .jsx-report-doc__icon {
	position: relative;
	flex: 0 0 auto;
	display: inline-grid;
	place-items: center;
	width: 56px;
	height: 64px;
	border-radius: 10px;
	background-color: var( --dp-lavender-soft );
	color: var( --dp-blue );
}

.jsx-report .jsx-report-doc__icon svg { width: 30px; height: 36px; }

.jsx-report .jsx-report-doc__ext {
	position: absolute;
	inset-block-end: 6px;
	padding: 1px 5px;
	border-radius: 3px;
	background-color: var( --dp-blue );
	font-size: 10px;
	font-weight: 600;
	line-height: 1.4;
	letter-spacing: 0.04em;
	color: #fff;
}

.jsx-report .jsx-report-doc__meta { min-width: 0; }
.jsx-report .jsx-report-doc__name { margin: 0; font-weight: 600; font-size: 16px; line-height: 1.4; color: var( --dp-text-on-light ); overflow-wrap: anywhere; }
.jsx-report .jsx-report-doc__size { margin: 4px 0 0; font-size: 14px; line-height: 1.5; color: var( --dp-text-on-light-muted ); }

.jsx-report .jsx-report-doc__facts {
	display: grid;
	grid-template-columns: repeat( auto-fit, minmax( 140px, 1fr ) );
	gap: 16px 32px;
	margin: 0;
	padding-inline-start: 48px;
	border-inline-start: 1px solid var( --dp-line-on-light );
}

.jsx-report .jsx-report-doc__facts dt { margin: 0; font-size: 13px; line-height: 1.4; color: var( --dp-text-on-light-muted ); }
.jsx-report .jsx-report-doc__facts dd { margin: 4px 0 0; font-size: 16px; line-height: 1.45; color: var( --dp-text-on-light ); }

.jsx-report .jsx-report-doc__actions { display: flex; flex-direction: column; gap: 12px; }
.jsx-report .jsx-report-doc__missing { margin: 0; font-size: 17px; color: var( --dp-text-on-light-muted ); }

.jsx-report .jsx-report-share { max-width: 480px; }


/* --- more in this category: a dated list, not cards — these are filings --- */

.jsx-report .jsx-report-list {
	margin: 0;
	padding: 0;
	list-style: none;
	border-block-start: 1px solid var( --dp-line-on-light );
	font-family: var( --jsx-job-font );
}

.jsx-report .jsx-report-list__item {
	display: grid;
	grid-template-columns: 160px minmax( 0, 1fr ) auto;
	align-items: center;
	gap: 24px;
	padding-block: 22px;
	border-block-end: 1px solid var( --dp-line-on-light );
}

.jsx-report .jsx-report-list__date { font-size: 14px; line-height: 1.5; color: var( --dp-text-on-light-muted ); }

.jsx-report .jsx-report-list__title {
	font-weight: 600;
	font-size: 18px;
	line-height: 1.4;
	color: var( --dp-text-on-light );
	text-decoration: none;
	overflow-wrap: anywhere;
}

.jsx-report .jsx-report-list__title:hover,
.jsx-report .jsx-report-list__title:focus-visible { color: var( --dp-blue ); text-decoration: underline; text-underline-offset: 3px; }

.jsx-report .jsx-report-list__dl {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	min-height: 44px;
	font-size: 14px;
	color: var( --dp-blue );
	text-decoration: none;
	white-space: nowrap;
}

.jsx-report .jsx-report-list__dl:hover { text-decoration: underline; text-underline-offset: 3px; }

@media ( max-width: 1024px ) {
	.jsx-report .jsx-report-hero__title { font-size: 40px; }
	.jsx-report .jsx-report-body { padding-block: 56px 72px; }
	.jsx-report .jsx-report-doc { grid-template-columns: minmax( 0, 1fr ); }
	.jsx-report .jsx-report-doc__facts { padding-inline-start: 0; padding-block-start: 24px; border-inline-start: 0; border-block-start: 1px solid var( --dp-line-on-light ); }
	.jsx-report .jsx-report-doc__actions { flex-direction: row; flex-wrap: wrap; }
	/* §83 hides the inline share row on a desktop; the report has no card, so it always shows. */
	.jsx-report .jsx-report-share { display: flex; }
}

@media ( max-width: 767px ) {
	.jsx-report .jsx-report-hero__title { font-size: 30px; }
	.jsx-report .jsx-report-doc { padding: 24px 20px; gap: 24px; }
	.jsx-report .jsx-report-doc__actions { flex-direction: column; }
	.jsx-report .jsx-report-doc__actions .jsx-job-btn { width: 100%; }
	.jsx-report .jsx-report-list__item { grid-template-columns: minmax( 0, 1fr ) auto; gap: 6px 16px; }
	.jsx-report .jsx-report-list__date { grid-column: 1 / -1; }
}

/* §84 addendum: a filmed testimonial — portrait 9:16, so capped in height and left-aligned to the column. */
.jsx-basic .jsx-basic__video { margin: 0 0 32px; }

.jsx-basic .jsx-basic__video video {
	display: block;
	width: auto;
	max-width: 100%;
	height: min( 78vh, 720px );
	aspect-ratio: 9 / 16;
	border-radius: 12px;
	background-color: #0b0618;
	object-fit: cover;
}

/* -------------------- 86. Category + tag archives (template 15323, the News & Updates layout) */

/*
 * Same band, filter bar, featured card, grid and pager as /news-updates/ —
 * the template is a copy of page 14518 and [dp_news_index] narrows itself to
 * the archive's term. Only the hero heading differs: it is printed by
 * [dp_news_archive_head] rather than an atomic heading, so the type the
 * `jsx-display-hero` / `jsx-body-base` global classes give the index is
 * restated here (those classes only generate CSS where a document uses them).
 * Size and colour come from §50's .jsx-nx-hero__title / __sub rules.
 */
.jsx-nx-archive-head { display: grid; justify-items: center; gap: 26px; }

.elementor.elementor .jsx-nx-archive-head__title {
	font-family: var( --dp-font-display );
	font-weight: 400;
	letter-spacing: -0.02em;
	line-height: 1.08;
	overflow-wrap: break-word;
}

.elementor.elementor .jsx-nx-archive-head__sub {
	font-family: var( --dp-font-body );
	font-weight: 400;
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-nx-archive-head__title { line-height: 1.1; }
	.jsx-nx-archive-head { gap: 16px; }
}

/* ---------------------------- 87. Profile detail (Figma page 23: 599:1175 / 601:17) */

/*
 * Template 15324, inc/profile-single.php. §83's hero, card, related head and
 * column come through the `jsx-job` body class; this adds the portrait hero,
 * committee chips and person cards. Portrait 400 square beside the copy, 80 gap
 * — the Figma's 100 → 580 columns.
 */
.jsx-profile .jsx-profile-hero__grid {
	display: grid;
	grid-template-columns: 400px minmax( 0, 1fr );
	align-items: center;
	gap: 80px;
}

.jsx-profile .jsx-profile-hero__portrait {
	overflow: hidden;
	aspect-ratio: 1;
	border-radius: 12px;
	background-color: var( --dp-lavender );
}

.jsx-profile .jsx-profile-hero__portrait img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 1;
	object-fit: cover;
	object-position: center top;
}

.jsx-profile .jsx-profile-tags { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 18px; }
.jsx-profile .jsx-profile-tags .jsx-job-tag { margin: 0; }

.jsx-profile .jsx-profile-hero__title { font-size: 64px; }

.jsx-profile .jsx-profile-hero__role {
	margin: 14px 0 0;
	font-family: var( --jsx-job-font );
	font-size: 20px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-profile .jsx-profile-hero__role--second { margin-block-start: 2px; font-size: 17px; }

.jsx-profile .jsx-profile-hero__label {
	margin: 36px 0 14px;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 1.3px;
	text-transform: uppercase;
	color: var( --dp-text-on-light-muted );
}

.jsx-profile .jsx-profile-chips { display: flex; flex-wrap: wrap; gap: 12px; margin: 0; padding: 0; list-style: none; }

.jsx-profile .jsx-profile-chip {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	padding: 10px 16px;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 999px;
	background-color: #fff;
	font-family: var( --jsx-job-font );
	font-size: 14px;
	line-height: 1.4;
	color: var( --dp-text-on-light );
}

.jsx-profile .jsx-profile-chip::before { content: ""; flex: 0 0 auto; width: 8px; height: 8px; border-radius: 50%; background-color: var( --dp-blue ); }
.jsx-profile .jsx-profile-chip__role { color: var( --dp-text-on-light-muted ); }
.jsx-profile .jsx-profile-chip__role::before { content: "·"; margin-inline-end: 8px; }

/* --- biography + roles card ------------------------------------------- */

.jsx-profile .jsx-profile-body__title {
	margin: 0 0 20px;
	font-family: var( --jsx-job-font );
	font-weight: 600;
	font-size: 22px;
	line-height: 1.3;
	color: var( --dp-text-on-light );
}

.jsx-profile .jsx-job-card__facts dd + dd { margin-block-start: 6px; }

.jsx-profile .jsx-profile-body__people,
.jsx-profile .jsx-profile-card__more { font-family: var( --jsx-job-font ); }

.jsx-profile .jsx-profile-body__people { display: none; margin: 32px 0 0; }

.jsx-profile .jsx-profile-body__people a,
.jsx-profile .jsx-profile-card__more {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	font-size: 16px;
	color: var( --dp-blue );
	text-decoration: none;
}

.jsx-profile .jsx-profile-body__people a:hover,
.jsx-profile .jsx-profile-card__more:hover { text-decoration: underline; text-underline-offset: 3px; }

/* --- the rest of the group -------------------------------------------- */

.jsx-profile .jsx-profile-grid {
	display: grid;
	grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
	gap: 28px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.jsx-profile .jsx-profile-card {
	position: relative;
	display: flex;
	flex-direction: column;
	margin: 0;
	overflow: hidden;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 12px;
	background-color: #fff;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.jsx-profile .jsx-profile-card:hover,
.jsx-profile .jsx-profile-card:focus-within { border-color: var( --dp-blue ); box-shadow: 0 8px 24px rgba( 70, 0, 255, 0.08 ); }

/*
 * The ratio sits on the IMG, not the wrapper: an aspect-ratio box still grows
 * to fit its content (min-height: auto), so Ping Chen's 1829x2560 portrait
 * stretched his card taller than the rest of the row.
 */
.jsx-profile .jsx-profile-card__media { overflow: hidden; background-color: var( --dp-lavender ); }
.jsx-profile .jsx-profile-card__media img { display: block; width: 100%; height: auto; aspect-ratio: 1; object-fit: cover; object-position: center top; }

.jsx-profile .jsx-profile-card__body {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	padding: 20px 24px 24px;
	font-family: var( --jsx-job-font );
}

.jsx-profile .jsx-profile-card__name { margin: 0; font-weight: 600; font-size: 18px; line-height: 1.35; }

/* the name is the one link; it stretches over the whole card */
.jsx-profile .jsx-profile-card__name a { color: var( --dp-text-on-light ); text-decoration: none; }
.jsx-profile .jsx-profile-card__name a::after { content: ""; position: absolute; inset: 0; }
.jsx-profile .jsx-profile-card__name a:focus-visible { outline: none; }
.jsx-profile .jsx-profile-card:has( a:focus-visible ) { outline: 2px solid var( --dp-blue ); outline-offset: 2px; }

.jsx-profile .jsx-profile-card__role { margin: 6px 0 0; font-size: 14px; line-height: 1.5; color: var( --dp-text-on-light-muted ); }

.jsx-profile .jsx-profile-card__cta {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	margin-block-start: auto;
	padding-block-start: 14px;
	font-size: 14px;
	color: var( --dp-blue );
}

@media ( max-width: 1180px ) {
	.jsx-profile .jsx-profile-hero__grid { grid-template-columns: 320px minmax( 0, 1fr ); gap: 56px; }
	.jsx-profile .jsx-profile-hero__title { font-size: 52px; }
}

@media ( max-width: 1024px ) {
	.jsx-profile .jsx-profile-hero__grid { grid-template-columns: minmax( 0, 1fr ); gap: 32px; }
	.jsx-profile .jsx-profile-hero__portrait { max-width: 420px; }
	.jsx-profile .jsx-profile-hero__title { font-size: 48px; }
	/* the roles card is dropped with the rest of §83's card; the hero already lists them */
	.jsx-profile .jsx-profile-body__people { display: block; }
	.jsx-profile .jsx-profile-grid { grid-template-columns: repeat( 3, minmax( 0, 1fr ) ); }
}

@media ( max-width: 767px ) {
	.jsx-profile .jsx-profile-hero__title { font-size: 40px; }
	.jsx-profile .jsx-profile-hero__role { font-size: 17px; }
	.jsx-profile .jsx-profile-hero__label { margin-block-start: 28px; }
	.jsx-profile .jsx-profile-chips { flex-direction: column; align-items: stretch; gap: 10px; }
	.jsx-profile .jsx-profile-chip { border-radius: 12px; }
	.jsx-profile .jsx-profile-grid { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); gap: 12px; }
	.jsx-profile .jsx-profile-card__body { padding: 14px; }
	.jsx-profile .jsx-profile-card__name { font-size: 16px; }
	.jsx-profile .jsx-profile-card__role { font-size: 13px; }
}

/* §86 addendum (Jun, 2026-10-03): archive hero 30% shorter, no filter bar under it. */

/*
 * Desktop: 550 → 385, exactly 30%. The 550 is §80's shared inner-hero floor, so
 * the archive overrides the variable rather than the rule.
 *
 * Tablet and phone cannot take the full 30%: the 88px header sits over the
 * band, and 266 → 186 / 210 → 147 would put the title under it. On a tablet the
 * band hugs its content instead — header + 16 above, 24 below — measured
 * 266 → 245. The phone keeps §50's 210: it is already the shortest band that
 * clears the header (hugging measured 215, i.e. taller), so it is untouched.
 */
body.archive:is( .category, .tag ) .jsx-nx-hero { --jsx-hero-min: 385px; }

@media ( min-width: 1025px ) {
	body.archive:is( .category, .tag ) .elementor.elementor .jsx-nx-hero {
		min-height: 385px;
		padding-block: 96px 56px;
	}
}

@media ( min-width: 768px ) and ( max-width: 1024px ) {
	body.archive:is( .category, .tag ) .elementor.elementor .jsx-nx-hero {
		min-height: 0;
		padding-block: calc( var( --jsx-header-h, 88px ) + 16px ) 24px;
	}
}

/* the grid now starts the body, so it takes the gap the filter bar used to leave */
body.archive:is( .category, .tag ) .jsx-nx-index { padding-block-start: 0; }

/* ------------------- 88. People of DigiPlus: the profile page's person card */

/*
 * Jun, 2026-10-03: the Board / Management grid on Corporate Governance takes
 * the card from the profile page's "Board of Directors" band (§87) — bordered
 * white card, square photo flush to the edges, name, role, "View profile →".
 * The 3-line bio excerpt is gone with it. The tabs and the pop-up are untouched:
 * the card is still the same `.jsx-person__link[data-profile]`, so corp-gov.js
 * binds exactly as before.
 *
 * Scoped to `.jsx-people--cards`, which the Board Committee panels now carry
 * too (Jun, same day) — they keep their 3-up, 900px-wide grid from §60 and take
 * the card. The first rule is the unscoped default for `.jsx-person__body`.
 */
.jsx-person__body { display: flex; flex-direction: column; gap: 8px; }

.jsx-people--cards { gap: 28px; }

.jsx-people--cards .jsx-person { display: flex; min-width: 0; }

.jsx-people--cards .jsx-person__link {
	flex: 1 1 auto;
	gap: 0;
	overflow: hidden;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 12px;
	background-color: #fff;
	transition: border-color 160ms ease, box-shadow 160ms ease;
}

.jsx-people--cards .jsx-person__link:hover,
.jsx-people--cards .jsx-person__link:focus-visible {
	border-color: var( --dp-blue );
	box-shadow: 0 8px 24px rgba( 70, 0, 255, 0.08 );
}

.jsx-people--cards .jsx-person__media { margin: 0; border-radius: 0; }

/* the profile card does not zoom; the border and shadow are the hover */
.jsx-people--cards .jsx-person__link:hover .jsx-person__photo { transform: none; }

.jsx-people--cards .jsx-person__body {
	flex: 1 1 auto;
	gap: 0;
	padding: 20px 24px 24px;
	font-family: "General Sans VF", var( --dp-font-body );
}

.jsx-people--cards .jsx-person__name {
	font-family: "General Sans VF", var( --dp-font-body );
	font-weight: 600;
	font-size: 18px;
	line-height: 1.35;
}

.jsx-people--cards .jsx-person__role { margin-block-start: 6px; font-size: 14px; }

.jsx-people--cards .jsx-person__more {
	margin-block-start: auto;
	padding-block-start: 14px;
	font-weight: 400;
}

.jsx-people--cards .jsx-person__link:hover .jsx-person__more { text-decoration: none; }

@media ( max-width: 767px ) {
	.jsx-people--cards { gap: 12px; }
	.jsx-people--cards .jsx-person__body { padding: 14px; }
	.jsx-people--cards .jsx-person__name { font-size: 16px; }
	.jsx-people--cards .jsx-person__role { font-size: 13px; }
}

/* ------------------------------ 89. Contact confirmation (page 1293, [dp_confirmation]) */

/*
 * One centred band, lavender-soft like the basic page and job hero, tall enough
 * that the footer does not ride up into the middle of the screen. Title is the
 * display face at the basic page's sizes; buttons are §83's.
 */
.jsx-confirm {
	display: grid;
	place-items: center;
	box-sizing: border-box;
	min-height: max( 560px, 72vh );
	padding: calc( var( --jsx-header-h, 91px ) + 72px ) var( --dp-gutter ) 96px;
	background-color: var( --dp-lavender-soft );
	text-align: center;
}

.jsx-confirm__inner { display: grid; justify-items: center; max-width: 720px; }

.jsx-confirm__icon {
	display: grid;
	place-items: center;
	width: 72px;
	height: 72px;
	border-radius: 50%;
	background-color: var( --dp-blue );
	color: #fff;
	box-shadow: 0 12px 32px rgba( 70, 0, 255, 0.22 );
}

.jsx-confirm .jsx-confirm__title {
	margin: 32px 0 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 56px;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
}

.jsx-confirm .jsx-confirm__text {
	margin: 18px 0 0;
	font-family: "General Sans VF", var( --dp-font-body );
	font-size: 18px;
	line-height: 1.6;
	color: var( --dp-text-on-light-muted );
}

.jsx-confirm__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; margin-block-start: 40px; }

@media ( max-width: 1024px ) {
	.jsx-confirm { padding-inline: 40px; }
	.jsx-confirm .jsx-confirm__title { font-size: 44px; }
}

@media ( max-width: 767px ) {
	.jsx-confirm { min-height: 0; padding: calc( var( --jsx-header-h, 64px ) + 56px ) 20px 72px; }
	.jsx-confirm__icon { width: 60px; height: 60px; }
	.jsx-confirm .jsx-confirm__title { margin-block-start: 24px; font-size: 32px; }
	.jsx-confirm .jsx-confirm__text { font-size: 16px; }
	.jsx-confirm__actions { flex-direction: column; align-self: stretch; width: 100%; gap: 12px; margin-block-start: 32px; }
	.jsx-confirm__actions .jsx-job-btn { width: 100%; }
}

/* -------------------------- 90. Key Corporate Events (page 12665, Figma page 24) */

/*
 * inc/key-corp-events.php. Hero: the page's own art (ACF `kce_hero_image`,
 * the 2024/01 swirl) under a lighter scrim than the other inner heroes so the
 * art reads — .62 under the header, .50 below — at the 385 desktop height of the
 * category/tag archives. Timeline: date in a rail (day large), 16:9 photo,
 * title + one sentence; one column on a 2px rail on phones.
 */
.jsx-kce-hero {
	position: relative;
	display: grid;
	place-items: center;
	box-sizing: border-box;
	min-height: 385px;
	padding: calc( var( --jsx-header-h, 91px ) + 24px ) var( --dp-gutter ) 56px;
	background-color: #0b0618;
	background-image:
		linear-gradient( 180deg, rgba( 11, 6, 24, 0.62 ) 0%, rgba( 11, 6, 24, 0.5 ) 50%, rgba( 11, 6, 24, 0.5 ) 100% ),
		var( --jsx-kce-hero, none );
	background-size: cover;
	background-position: center;
	text-align: center;
}

.jsx-kce-hero__inner { display: grid; justify-items: center; gap: 0; max-width: 1240px; }

.jsx-kce-eyebrow {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 500;
	font-size: 13px;
	line-height: 1.4;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: #fff;
}

.jsx-kce-eyebrow__mark {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var( --dp-marker-cyan );
	border-end-end-radius: 14px;
}

.elementor.elementor .jsx-kce-hero__title {
	margin: 18px 0 0;
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 64px;
	line-height: 1.08;
	letter-spacing: -0.02em;
	color: #fff;
}

.jsx-kce-hero__crumbs { margin-block-start: 22px; }

/* --- timeline -------------------------------------------------------------- */

.jsx-kce-timeline {
	box-sizing: border-box;
	padding: 112px var( --dp-gutter ) 120px;
	background-color: #fff;
}

.jsx-kce-list {
	max-width: 1240px;
	margin: 0 auto;
	padding: 0;
	list-style: none;
	font-family: "General Sans VF", var( --dp-font-body );
}

.jsx-kce-event {
	position: relative;
	display: grid;
	grid-template-columns: 220px 580px minmax( 0, 1fr );
	align-items: center;
	margin: 0;
}

.jsx-kce-event + .jsx-kce-event { margin-block-start: 72px; }

/* the dot, then the rail down to the next dot */
.jsx-kce-event::before {
	content: "";
	position: absolute;
	inset-block-start: 8px;
	inset-inline-start: 0;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	background-color: var( --dp-blue );
	box-shadow: 0 0 0 4px #fff;
	z-index: 1;
}

.jsx-kce-event:not( :last-child )::after {
	content: "";
	position: absolute;
	inset-block: 16px -80px;
	inset-inline-start: 7px;
	width: 2px;
	background-color: var( --dp-line-on-light );
}

.jsx-kce-event__date { align-self: start; margin: 0; padding-inline-start: 40px; }
.jsx-kce-event__date time { display: grid; gap: 4px; }

.jsx-kce-event__day {
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 56px;
	line-height: 1;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
}

.jsx-kce-event__month { font-size: 16px; line-height: 1.5; color: var( --dp-text-on-light-muted ); }

/* the full date is what assistive tech reads everywhere; it is SHOWN on phones */
.jsx-kce-event__full {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect( 0 0 0 0 );
	white-space: nowrap;
}

.jsx-kce-event__media { margin: 0; overflow: hidden; border-radius: 12px; background-color: var( --dp-lavender ); }
.jsx-kce-event__media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }

.jsx-kce-event__copy { padding-inline-start: 60px; }

.elementor.elementor .jsx-kce-event__title {
	margin: 0;
	font-family: var( --dp-font-subhead );
	font-weight: 400;
	font-size: 32px;
	line-height: 1.25;
	color: var( --dp-text-on-light );
}

.jsx-kce-event__text { margin: 16px 0 0; font-size: 16px; line-height: 1.7; color: var( --dp-text-on-light-muted ); }

/* --- tablet: date rail + one stacked column ------------------------------ */

@media ( max-width: 1180px ) {
	.jsx-kce-event { grid-template-columns: 180px minmax( 0, 1fr ); align-items: start; }
	.jsx-kce-event__copy { grid-column: 2; padding-inline-start: 0; margin-block-start: 24px; }
}

@media ( max-width: 1024px ) {
	.jsx-kce-hero { min-height: 0; padding: calc( var( --jsx-header-h, 88px ) + 40px ) 40px 56px; }
	.elementor.elementor .jsx-kce-hero__title { font-size: 52px; }
	.jsx-kce-timeline { padding: 72px 40px 96px; }
	.jsx-kce-event { grid-template-columns: 140px minmax( 0, 1fr ); }
	.jsx-kce-event__day { font-size: 44px; }
	.elementor.elementor .jsx-kce-event__title { font-size: 28px; }
}

/* --- phone: one column on a 2px rail, the date as a blue label ------------ */

@media ( max-width: 767px ) {
	.jsx-kce-hero { padding: calc( var( --jsx-header-h, 88px ) + 16px ) 20px 40px; }
	.jsx-kce-eyebrow { font-size: 12px; }
	.elementor.elementor .jsx-kce-hero__title { margin-block-start: 12px; font-size: 40px; line-height: 1.1; }
	.jsx-kce-hero__crumbs { margin-block-start: 14px; }

	.jsx-kce-timeline { padding: 48px 20px 64px; }
	.jsx-kce-event { display: block; padding-inline-start: 24px; border-inline-start: 2px solid var( --dp-line-on-light ); }
	.jsx-kce-event + .jsx-kce-event { margin-block-start: 40px; }
	.jsx-kce-event::before,
	.jsx-kce-event:not( :last-child )::after { content: none; }

	.jsx-kce-event__date { padding: 0; margin-block-end: 12px; }
	.jsx-kce-event__day,
	.jsx-kce-event__month { display: none; }
	.jsx-kce-event__full {
		position: static;
		width: auto;
		height: auto;
		overflow: visible;
		clip: auto;
		font-family: var( --dp-font-subhead );
		font-weight: 500;
		font-size: 13px;
		line-height: 1.4;
		letter-spacing: 0.1em;
		text-transform: uppercase;
		color: var( --dp-blue );
	}

	.jsx-kce-event__media { border-radius: 10px; }
	.jsx-kce-event__copy { margin-block-start: 14px; }
	.elementor.elementor .jsx-kce-event__title { font-size: 22px; line-height: 1.3; font-family: "General Sans VF", var( --dp-font-body ); font-weight: 600; }
	.jsx-kce-event__text { margin-block-start: 10px; }
}

/* -------------------------------------- 91. About Us anchor nav (page 14544) */

/*
 * The bar is Sustainability's (`jsx-su-nav` family, so the shared scroll-spy
 * in custom.js drives it with no new code). The jump offsets match the other
 * anchor-nav pages: header + bar, so a heading lands clear of the sticky bar.
 */
.elementor.elementor .jsx-ob-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 88px ) + 74px ); }

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-ob-band .elementor-menu-anchor { scroll-margin-top: calc( var( --jsx-header-h, 72px ) + 76px ); }
}

/* §91 addendum: "Explore Our Story" (About Us, ob-we-cta) takes the arrow (Jun, 2026-10-03).
   §16 keeps `.jsx-btn-secondary` arrowless site-wide — the homepage's "All News" is unchanged —
   so this is scoped to the About Us bands. Same glyph, size and hover nudge as the primary. */
.elementor.elementor .jsx-ob-band .jsx-btn-secondary {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
}

.elementor.elementor .jsx-ob-band .jsx-btn-secondary::after {
	content: "";
	width: 15px;
	height: 12px;
	flex: 0 0 auto;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

.elementor.elementor .jsx-ob-band .jsx-btn-secondary:hover::after,
.elementor.elementor .jsx-ob-band .jsx-btn-secondary:focus-visible::after { transform: translateX( 3px ); }

/* -------------- 91b. About Us "Our Products": the homepage's head row (Jun, 2026-10-03) */

/*
 * Same arrangement as the homepage block (14405, element 2bf8cb31): title left,
 * button right on one row, the three cards beneath; on a phone title, cards,
 * then button, all left-aligned. The button now carries the homepage's classes
 * (jsx-btn-primary + jsx-ui-button, the white button on the blue band) with
 * the About Us label "View Our Portfolio" unchanged. The cards — and their
 * phone carousel (§36/§69) — are About Us's own and untouched.
 */
@media ( min-width: 768px ) {
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center {
		display: grid;
		grid-template-columns: minmax( 0, 1fr ) auto;
		grid-template-areas: "title cta" "cards cards";
		column-gap: 32px;
		row-gap: 76px;
		align-items: center;
		text-align: start;
	}

	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center > .jsx-display-section { grid-area: title; margin: 0; text-align: start; }
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center > .jsx-btn-primary { grid-area: cta; justify-self: end; margin: 0; }
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center > .jsx-ob-prodgrid { grid-area: cards; }
}

@media ( min-width: 768px ) and ( max-width: 1024px ) {
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center { row-gap: 48px; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center { align-items: stretch; text-align: start; }
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center > .jsx-display-section { text-align: start; }
	/*
	 * Below the cards the band's blue backdrop has ended, so the white button
	 * would sit on white. The homepage solves the same moment with a brand-blue
	 * button on phones (element 16409591's mobile variant) — same here.
	 */
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center > .jsx-btn-primary {
		align-self: flex-start;
		margin-block-start: 8px;
		background-color: var( --dp-blue );
		color: var( --dp-text-on-dark );
	}

	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center > .jsx-btn-primary:hover,
	.elementor.elementor .jsx-ob-products .jsx-ob-stack--center > .jsx-btn-primary:focus-visible {
		background-color: var( --dp-violet );
		color: var( --dp-text-on-dark );
	}
}

/* ----------------- 49b. Header dropdowns: grouped panels (Figma page 21, 2026-10-03) */

/*
 * About Us, Our Portfolio, News & Updates and Sustainability list PAGES, not a
 * page's sections (inc/mega-menu.php → hello_digiplus_mega_grouped). One 320px
 * column per page: the page as a linked heading in ink with an arrow, its
 * sections beneath in muted text (7.3:1 on white). A label item ("Platforms")
 * is the "On this page" caps label over a list of page headings. Investor
 * Relations and Careers keep the single-page "On this page" columns above.
 */
.jsx-mega__groups { display: flex; gap: 48px; }

.jsx-mega__group { display: flex; flex-direction: column; align-items: flex-start; width: 320px; }

.jsx-mega__page {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	padding-block: 2px;
	font-family: "General Sans VF", var( --dp-font-body );
	font-size: 16px;
	font-weight: 500;
	line-height: 1.5;
	color: var( --dp-text-on-light );
	text-decoration: none;
	transition: color 140ms ease;
}

.jsx-mega__page::after {
	content: "";
	width: 15px;
	height: 12px;
	flex: 0 0 auto;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}

.jsx-mega__page:hover,
.jsx-mega__page:focus-visible { color: var( --dp-blue ); }
.jsx-mega__page:hover::after { transform: translateX( 3px ); }

.jsx-mega__list--sections { width: auto; margin-block-start: 14px; gap: 10px; }
.jsx-mega__list--sections .jsx-mega__link { color: var( --dp-text-on-light-muted ); }
.jsx-mega__list--sections .jsx-mega__link:hover,
.jsx-mega__list--sections .jsx-mega__link:focus-visible { color: var( --dp-blue ); }

.jsx-mega__group--label .jsx-mega__label { margin-block-end: 14px; }
.jsx-mega__list--pages { width: auto; gap: 14px; }

/*
 * A menu item whose link is still "#" (its page or site is not confirmed yet — inc/mega-menu.php
 * hello_digiplus_mega_has_url()) prints as a <span>: same type and colour as its neighbours, but
 * no arrow and no hover, so it reads as listed-but-not-yet-linked rather than as a broken link.
 * Doubled .jsx-mega-mobile/.jsx-header-inner selectors match the link colour rules it must beat.
 */
.jsx-mega__page--soon { cursor: default; }
.jsx-mega__page--soon::after { content: none; }
.jsx-mega__page--soon:hover { color: var( --dp-text-on-light ); }
.jsx-mega__link--soon,
.jsx-header-inner.is-compact.is-open .jsx-mega-mobile .jsx-mega__link--soon { cursor: default; }
.jsx-header-inner.is-compact.is-open .jsx-mega-mobile .jsx-mega__link--soon:hover { color: var( --dp-text-on-light ); }

/* the phone accordion's flat list of pages; never shown in the desktop panel */
.jsx-mega__mobile-pages { display: none; }

@media ( max-width: 1339px ) {
	.jsx-mega__groups { gap: 32px; }
	.jsx-mega__group { width: auto; flex: 1 1 0; min-width: 0; }
}

@media all {
	/* multi-page groups expand to their pages on a phone, never to every section */
	.jsx-mega-mobile .jsx-mega__groups { display: none; }

	.jsx-mega-mobile .jsx-mega__mobile-pages {
		display: flex;
		width: auto;
		gap: 0;
		border-inline-start: 2px solid var( --dp-blue );
	}
}

/* §49b addendum: six items on a 1280 laptop.
   Measured: logo 140 + nav 950 + search 44 + 2 × 24 gap = 1,182 of the 1,160 the bar has at 1280
   (40px padding a side below 1340). 4px off each item's leading padding and 2px off the nav gap
   recovers 34px, so the full menu holds at 1280 (12px spare) and collapses only below ~1260.
   custom.js measures the bar with these rules applied, so the switch point follows them. */
@media ( min-width: 1025px ) and ( max-width: 1339px ) {
	.elementor.elementor .jsx-ui-nav.jsx-has-mega { padding-inline-start: 11px; }
	.elementor.elementor .jsx-header-inner > :nth-child( 2 ) { column-gap: 4px; }
}

/* §49b addendum: phone menu — the chevrons sit on the close button's centre line.
   `.jsx-ui-nav.jsx-has-mega { padding-inline-end: 9px }` exists for the desktop bar (room after
   the chevron); in the open compact menu it pushed every chevron 9px left of the ✕ (324 vs 333). */
@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-header-inner.is-compact.is-open .jsx-ui-nav.jsx-has-mega { padding-inline-end: 0; }
}

/* ------------------------------------------- 92. One phone hero for every inner page */

/*
 * Jun, 2026-10-03: the inner-page heroes did not match on a phone, and they were to be left-aligned,
 * breadcrumbs included. Each page carried its own ≤767 hero rule, so at 390 the title started
 * 67px (About Us, Corporate Governance, News, archives), 112 (Portfolio), 148 (Sustainability,
 * Responsible Gaming), 215 (IR), 263 (Careers) or 282px (Contact) down. Title size was 32 or 40px,
 * and only three of the nine heroes read from the left. Heights ran from 210 to 460.
 *
 * One spec now, taken from Our Portfolio's phone hero, which was already left-aligned:
 *   112px top (the 88px fixed header + 24 clear) / 56px bottom, no height floor.
 *   An eyebrow, if present, then 12px down to the title. Title 40/1.1, sub 16/1.6 at 16px below it,
 *   breadcrumbs 16px below that. Everything starts at the left gutter.
 * Height now follows content only: a one-line title with no sub is the shortest hero, and a long
 * sub makes it taller. The 67px heroes sat flush against the logo row for a logged-out visitor
 * (header 0–88, title 67); 112 also fixes that.
 *
 * The padding is a fixed 112, not header-h + 24: --jsx-header-h is published by JS after load,
 * and a variable here would shift the hero when it lands.
 *
 * Phone only. The 768–1024 and desktop heroes (§80's 550 floor) are unchanged.
 */
@media ( max-width: 767px ) {
	.elementor.elementor :is( .jsx-nx-hero, .jsx-pf-hero, .jsx-ir-hero, .jsx-su-hero, .jsx-rg-hero, .jsx-car-hero, .jsx-ct-hero ),
	body .jsx-kce-hero {
		min-height: 0;
		padding-block: 112px 56px;
		padding-inline: var( --dp-gutter-mobile, 20px );
		text-align: start;
	}

	/* flex/grid heroes and their inner columns: pack to the left, not the centre */
	.elementor.elementor .jsx-nx-hero {
		align-items: flex-start;
		justify-content: flex-start;
		gap: 0;
	}
	body .jsx-kce-hero { justify-items: start; align-items: start; }

	.elementor.elementor :is( .jsx-pf-hero__inner, .jsx-su-hero__inner, .jsx-rg-hero__inner, .jsx-car-hero__inner, .jsx-ct-hero__inner ),
	body .jsx-kce-hero__inner,
	.jsx-nx-archive-head {
		align-items: flex-start;
		justify-items: start;
		gap: 0;
		margin-inline: 0;
		text-align: start;
	}

	.elementor.elementor :is( .jsx-pf-eyebrow, .jsx-rg-eyebrow--onhero, .jsx-ct-eyebrow--onhero ),
	body .jsx-kce-eyebrow { justify-content: flex-start; }

	/* eyebrow → title */
	.elementor.elementor :is( .jsx-pf-hero__title, .jsx-rg-hero__title, .jsx-ct-hero__title, .jsx-kce-hero__title ) { margin-block-start: 12px; }
	.elementor.elementor .jsx-pf-hero .jsx-pf-eyebrow + .jsx-pf-hero__title { margin-block-start: 12px; }

	/* title */
	.elementor.elementor :is( .jsx-nx-hero__title, .jsx-nx-archive-head__title, .jsx-pf-hero__title, .jsx-ir-hero__title, .jsx-su-hero__title, .jsx-rg-hero__title, .jsx-car-hero__title, .jsx-ct-hero__title, .jsx-kce-hero__title ) {
		font-size: 40px;
		line-height: 1.1;
		text-align: start;
	}
	.elementor.elementor :is( .jsx-nx-hero__title, .jsx-nx-archive-head__title, .jsx-ir-hero__title, .jsx-su-hero__title, .jsx-car-hero__title ) { margin-block-start: 0; }

	/* sub */
	.elementor.elementor :is( .jsx-nx-hero__sub, .jsx-nx-archive-head__sub, .jsx-ir-hero__sub, .jsx-su-hero__sub, .jsx-car-hero__sub ) {
		max-width: none;
		margin-block-start: 16px;
		margin-inline: 0;
		font-size: 16px;
		line-height: 1.6;
		text-align: start;
	}

	/* breadcrumbs: the shortcode wrapper adds nothing; the trail keeps its own 16px */
	.elementor.elementor :is( .jsx-nx-hero, .jsx-ir-hero, .jsx-su-hero, .jsx-rg-hero, .jsx-car-hero, .jsx-ct-hero ) > .elementor-widget-shortcode {
		align-self: stretch;
		margin: 0;
		text-align: start;
	}
	.elementor.elementor :is( .jsx-nx-hero, .jsx-pf-hero, .jsx-ir-hero, .jsx-su-hero, .jsx-rg-hero, .jsx-car-hero, .jsx-ct-hero ) .jsx-crumbs--onhero,
	body .jsx-kce-hero .jsx-crumbs--onhero {
		margin-block-start: 16px;
		text-align: start;
	}

	/*
	 * Careers: the Great Place to Work badge (70 × 119, top 84, right 20) sat above the copy while the
	 * title started at 263. At 112 it is beside the title and the first lines of the sub, so the sub
	 * keeps 86px clear on the right (badge + 16) and wraps under its own column instead.
	 */
	.elementor.elementor .jsx-car-hero__sub { padding-inline-end: 86px; }

	/*
	 * Contact: the photo (2400 × 1800) is height-bound in a 322px hero, which put the building's
	 * "digiplus" sign at y≈138 — touching the top of the title, where it read as part of the copy.
	 * The 460px hero it was cropped for kept it up at ~197, under the header. Sized to 222% of the hero's
	 * width and right-aligned, the sign (34–52% across the photo) ends left of the viewport at any
	 * phone width: 0.525 × 2.22w − 1.22w < 0. What remains is the tower's right flank and sky, behind
	 * the same scrim. Relative, not a pixel size: a fixed 640px still showed the sign at 601 wide.
	 */
	.elementor.elementor .jsx-ct-hero {
		background-size: cover, 222% auto;
		background-position: center, 100% 45%;
	}
}

/* ------------------------------------------- 93. Homepage careers photo: crop below 1025 */

/*
 * Jun, 2026-10-03: "one of the person's head is cut off". The careers band's photo is a 2:3 portrait
 * (js-careers-team, 1400 × 2099) shown below 1025 as a full-width band (390×300, 620×300, 768–1024×420).
 * Centred, that keeps only the middle 27–51% of the height. The standing woman's head sits about 30%
 * down, so at 620–1024 the crop started below it.
 * At 30% the window opens at 15–22% of the photo's height at every one of those sizes: every face is in,
 * and the crop ends at the seated pair's waists. Desktop (552×620, nearly the whole photo) is unchanged.
 */
@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-careers img.e-image-base { object-position: 50% 30%; }
}

/* ------------------------------------------------------------- 94. Cookie notice */

/*
 * inc/cookie-consent.php + assets/js/cookie-consent.js. The legacy banner's layout carried over: a
 * panel with a 7px brand-blue top rule, 1102 wide, pinned to the foot of the viewport. Jun,
 * 2026-10-03: not black. It is white, a layer like the header (same shadow, stronger), with
 * on-light ink. The buttons take the house CTA shape (8px / 28px / 500) instead of its 80px pills.
 * Accept is filled brand blue and Decline outlined, at the same size, so refusing is as easy to
 * find as agreeing.
 * They are <button>s, so the kit's `.elementor-kit-1247 button` (pink, 80px) and Hello's reset reach
 * them. Every property they set is restated here at (0,2,1) to beat both.
 * z-index sits under Elementor's popups (9999), so the homepage Fortune popup still opens on top.
 * #15131f on #fff is 18:1; white on #4600ff is 7.8:1; the #4600ff outline and focus ring on white are 7.8:1.
 */
.dp-cookie {
	position: fixed;
	inset-inline: 0;
	inset-block-end: 0;
	z-index: 9990;
	box-sizing: border-box;
	width: calc( 100% - 32px );
	max-width: 1102px;
	margin-inline: auto;
	padding: 40px 56px;
	background-color: var( --dp-white );
	border-block-start: 7px solid var( --dp-blue );
	box-shadow: 0 -1px 0 rgba( 11, 6, 24, 0.06 ), 0 -8px 32px rgba( 11, 6, 24, 0.14 );
	color: var( --dp-text-on-light );
	font-family: var( --dp-font-body );
	transform: translateY( 16px );
	opacity: 0;
	transition: transform 240ms ease-out, opacity 240ms ease-out;
}
.dp-cookie[hidden] { display: none; }
.dp-cookie.is-visible { transform: none; opacity: 1; }

.dp-cookie__inner {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 24px 48px;
}

.dp-cookie__text { flex: 1 1 420px; max-width: 640px; }
.dp-cookie__text p {
	margin: 0;
	font-size: 18px;
	line-height: 1.3;
	color: inherit;
}
.dp-cookie__text p + p { margin-block-start: 10px; }
.dp-cookie__text a {
	color: inherit;
	font-weight: 600;
	text-decoration: underline;
	text-underline-offset: 3px;
}
.dp-cookie__text a:hover { color: var( --dp-blue ); }

.dp-cookie__actions { display: flex; flex-wrap: wrap; gap: 12px; }

body .dp-cookie .dp-cookie__btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 140px;
	min-height: 48px;
	margin: 0;
	padding: 12px 28px;
	border: 1px solid var( --dp-text-on-light );
	border-radius: 8px;
	background-color: transparent;
	color: var( --dp-text-on-light );
	font-family: var( --dp-font-body );
	font-size: 16px;
	font-weight: 500;
	line-height: 1.2;
	letter-spacing: 0;
	text-transform: none;
	cursor: pointer;
	transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
}
body .dp-cookie .dp-cookie__btn--accept {
	background-color: var( --dp-blue );
	border-color: var( --dp-blue );
	color: var( --dp-white );
}
body .dp-cookie .dp-cookie__btn:hover {
	background-color: var( --dp-violet-deep );
	border-color: var( --dp-violet-deep );
	color: var( --dp-white );
}
body .dp-cookie .dp-cookie__btn:focus-visible,
.dp-cookie__text a:focus-visible {
	outline: 2px solid var( --dp-blue );
	outline-offset: 3px;
}

@media ( max-width: 767px ) {
	.dp-cookie {
		width: calc( 100% - 32px );
		padding: 24px 20px 20px;
	}
	.dp-cookie__inner { gap: 20px; }
	.dp-cookie__text { flex-basis: 100%; }
	.dp-cookie__text p { font-size: 15px; line-height: 1.45; }
	.dp-cookie__actions { width: 100%; display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
	body .dp-cookie .dp-cookie__btn { min-width: 0; padding-inline: 16px; }
	/* one button left alone takes the row */
	body .dp-cookie .dp-cookie__btn:only-child { grid-column: 1 / -1; }
}

@media ( prefers-reduced-motion: reduce ) {
	.dp-cookie { transition: none; transform: none; }
}

/* --------------------------------------------- 95. Homepage Financial Highlights (native) */

/*
 * Jun, 2026-10-04: the figures must be editable in Elementor, not a shortcode. The [dp_financials]
 * paragraph (5423830e) is replaced by native elements on page 14405:
 *   e-flexbox.jsx-fin                    the row
 *     e-flexbox.jsx-fin__item × 4        one figure, duplicate or delete to add or remove one
 *       e-paragraph.jsx-fin__value       "₱84.2B": counted up by custom.js
 *       e-paragraph.jsx-fin__label       "Revenues"
 *       e-paragraph.jsx-fin__delta       "+12%": a leading + turns it brand blue (custom.js adds .is-up)
 * Values are §7/§21's, measured off the shortcode render: 46/36px figures, 16px label, 13px change,
 * 1px rules with a 30px inset, 4-up → 2-up at 1024 → 2-up without rules at 767.
 * Positions are counted `of .e-con` so the editor's injected overlay child (see §8) cannot shift
 * which item loses its rule.
 */
.elementor.elementor .jsx-fin {
	display: grid;
	grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
	gap: 0;
	width: 100%;
	padding: 0;
}

.elementor.elementor .jsx-fin__item {
	display: block;
	gap: 0;
	min-width: 0;
	padding: 0 24px 0 30px;
	border-inline-start: 1px solid var( --dp-line-on-light );
}
.elementor.elementor .jsx-fin__item:nth-child( 1 of .e-con ) { border-inline-start: 0; padding-inline-start: 0; }

.elementor.elementor :is( .jsx-fin__value, .jsx-fin__label, .jsx-fin__delta ) {
	display: block;
	margin: 0;
	font-family: var( --dp-font-body );
}
.elementor.elementor .jsx-fin__value {
	margin-block-end: 14px;
	font-family: var( --dp-font-display );
	font-size: 46px;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
}
.elementor.elementor .jsx-fin__label {
	font-size: 16px;
	line-height: 1.5;
	color: var( --dp-text-on-light );
}
.elementor.elementor .jsx-fin__delta {
	margin-block-start: 4px;
	font-size: 13px;
	line-height: 1.4;
	color: var( --dp-text-on-light-muted );
}
.elementor.elementor .jsx-fin__delta.is-up { color: var( --dp-blue ); }

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-fin { grid-template-columns: repeat( 2, minmax( 0, 1fr ) ); row-gap: 36px; }
	.elementor.elementor .jsx-fin__item:nth-child( odd of .e-con ) { border-inline-start: 0; padding-inline-start: 0; }
	.elementor.elementor .jsx-fin__value { font-size: 36px; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-fin { column-gap: 20px; row-gap: 28px; }
	.elementor.elementor .jsx-fin__item { border-inline-start: 0; padding-inline: 0; }
}

/* --------------------------------------------------- 96. Homepage hero statistics (native) */

/*
 * Jun, 2026-10-04: the hero statistics too, not a shortcode. [dp_proof] (6f934b39) is replaced by
 * native elements on page 14405:
 *   e-flexbox.jsx-proof                       wrapper: keeps row + note one child of the hero column,
 *                                             so the column's 44px gap does not open up between them
 *     e-flexbox.jsx-proof__row                the ruled row
 *       e-flexbox.jsx-proof__item × 3         one statistic (add .jsx-proof__item--wide for a long
 *                                             value set smaller, like the award)
 *         e-paragraph.jsx-proof__value        "₱84.2B": numbers count up (custom.js)
 *         e-paragraph.jsx-proof__meta         "Revenues, FY2025 · +12%"
 *     e-paragraph.jsx-proof__note             "Verified: …"
 * Values are §7 and §11's, measured off the shortcode render at 1440, 1024 and 390.
 */
.elementor.elementor .jsx-proof { display: block; width: 100%; padding: 0; margin-block-start: 0; }

.elementor.elementor .jsx-proof__row {
	display: grid;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	gap: 0;
	width: 100%;
	padding: 34px 0 0;
	border-block-start: 1px solid rgba( 255, 255, 255, 0.28 );
}

.elementor.elementor .jsx-proof__item {
	display: block;
	gap: 0;
	min-width: 0;
	padding: 0 40px;
	border-inline-start: 1px solid rgba( 255, 255, 255, 0.2 );
}
.elementor.elementor .jsx-proof__item:nth-child( 1 of .e-con ) { border-inline-start: 0; padding-inline-start: 0; }

.elementor.elementor :is( .jsx-proof__value, .jsx-proof__meta, .jsx-proof__note ) { display: block; margin: 0; }

.elementor.elementor .jsx-proof__value {
	margin-block-end: 8px;
	font-family: var( --dp-font-display );
	font-size: 40px;
	font-weight: 400;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-dark );
}
.elementor.elementor .jsx-proof__item--wide .jsx-proof__value {
	font-size: 24px;
	font-weight: 500;
	line-height: 1.25;
}
.elementor.elementor .jsx-proof__meta {
	font-family: var( --dp-font-body );
	font-size: 13px;
	line-height: 1.4;
	color: var( --dp-text-on-dark-muted );
}
.elementor.elementor .jsx-proof__note {
	margin-block-start: 22px;
	font-family: var( --dp-font-body );
	font-size: 11px;
	line-height: 1.4;
	color: var( --dp-text-on-dark-muted );
	opacity: 0.55;
}

@media ( max-width: 1024px ) {
	.elementor.elementor .jsx-proof__row { grid-template-columns: 1fr 1fr; row-gap: 26px; }
	.elementor.elementor .jsx-proof__item:nth-child( odd of .e-con ) { border-inline-start: 0; padding-inline-start: 0; }
	.elementor.elementor .jsx-proof__item:not( .jsx-proof__item--wide ) .jsx-proof__value { font-size: 30px; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-proof__row { grid-template-columns: repeat( 2, 1fr ); column-gap: 20px; row-gap: 24px; }
	.elementor.elementor .jsx-proof__item { border-inline-start: 0; padding-inline: 0; }
	/* the long award value takes its own row rather than wrapping to three lines in a half column */
	.elementor.elementor .jsx-proof__item--wide { grid-column: 1 / -1; }
}

/* ---------------------------------------- 97. Footer link columns: one size on every page */

/*
 * Found by the 2026-10-04 editor sweep. The footer's three link columns are V3 nav-menu widgets
 * (3ac5cb01, 72ab5452, 1c6118e9) given the atomic global class jsx-body-small (14px / 1.6) through
 * their CSS-classes field. Elementor only prints a global class's CSS on documents that use it
 * atomically, so the class reached the footer on the homepage alone: the links were 14px there
 * and 16px on every other page. Stated here once, so the footer no longer depends on which page it
 * sits under.
 */
.elementor-location-footer .elementor-widget-nav-menu.jsx-body-small,
.elementor-location-footer .elementor-widget-nav-menu.jsx-body-small :is( li, a ) {
	font-family: var( --dp-font-body );
	font-size: 14px;
	font-weight: 400;
	line-height: 1.6;
}

/*
 * The current-page link in those columns took the nav-menu widget's active colour, #2000F7, on the
 * black footer: 2.4:1, under the WCAG 2.2 AA 4.5:1 floor (seen on /about-us/, whose "About Us"
 * heading is the active item). The site's on-dark accent, light blue, is 9.9:1 there.
 */
/* out-ranks Elementor's own .elementor-widget-nav-menu .elementor-nav-menu--main .elementor-item.elementor-item-active (accent) */
.elementor-location-footer .elementor-widget-nav-menu .elementor-nav-menu--main .elementor-item.elementor-item-active,
.elementor-location-footer .elementor-widget-nav-menu .elementor-nav-menu--dropdown .elementor-item.elementor-item-active {
	color: var( --dp-light-blue );
}

/* --------------------------------------- 98. Homepage Latest News: "All News" beside the title */

/*
 * Jun, 2026-10-04: "All News" moves to the right of the "Latest News" title on desktop, stays
 * below the articles on phones, and takes the arrow. One button, not two: it was moved in the page
 * data from the foot of the right-hand column (5ec0a11) to the block itself (1cabb5af, now
 * .jsx-news-block), straight after the title, and the block is laid out by grid areas:
 *   desktop/tablet   title · cta   /   filter bar   /   article grid
 *   phone            title / filter bar / article grid / cta
 * The filter bar's 48px and the grid's 40px top margins are their own and carry over unchanged.
 * On a phone the button sits left-aligned, 43px under the articles (the column's gap).
 * With the button gone, the three right-hand cards spread over the full height of the featured card.
 */
.elementor.elementor .jsx-news-block {
	display: grid;
	grid-template-columns: minmax( 0, 1fr ) auto;
	grid-template-areas:
		"title cta"
		"bar   bar"
		"grid  grid";
	column-gap: 24px;
	row-gap: 0;
	align-items: center;
}
.elementor.elementor .jsx-news-block > .jsx-display-section { grid-area: title; margin: 0; }
.elementor.elementor .jsx-news-block > :has( > .jsx-news-tabs, > .jsx-news-tabs-host ) { grid-area: bar; }
.elementor.elementor .jsx-news-block > .jsx-split { grid-area: grid; align-self: stretch; }

.elementor.elementor .jsx-news-block > .jsx-news-all {
	grid-area: cta;
	align-self: center;
	justify-self: end;
	margin: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	white-space: nowrap;
}

/* the arrow: same glyph, size and hover nudge as the primary button (§16) and Explore Our Story (§91) */
.elementor.elementor .jsx-news-all::after {
	content: "";
	width: 15px;
	height: 12px;
	flex: 0 0 auto;
	background-color: currentColor;
	-webkit-mask: var( --jsx-arrow ) no-repeat center / contain;
	mask: var( --jsx-arrow ) no-repeat center / contain;
	transition: transform 160ms ease-out;
}
.elementor.elementor .jsx-news-all:hover::after,
.elementor.elementor .jsx-news-all:focus-visible::after { transform: translateX( 3px ); }

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-news-block {
		grid-template-columns: minmax( 0, 1fr );
		grid-template-areas:
			"title"
			"bar"
			"grid"
			"cta";
	}
	/* Jun, 2026-10-04: left-aligned under the articles on a phone, on the column's edge */
	.elementor.elementor .jsx-news-block > .jsx-news-all { justify-self: start; margin-block-start: 43px; }
}

@media ( prefers-reduced-motion: reduce ) {
	.elementor.elementor .jsx-news-all::after { transition: none; }
}

/* --------------------------------- 99. Homepage Latest News: filter pills from the Edit Page */

/*
 * Jun, 2026-10-04: the pills are no longer Elementor text elements (editable, but an edit there
 * changed nothing live). They are the [dp_news_tabs] shortcode, printed from the homepage's Edit Page
 * "Latest News filters" rows, inside a V3 shortcode widget with the class jsx-news-tabs-host.
 *
 * The widget, its container and Elementor's .elementor-shortcode div are display: contents, so .jsx-news-tabs is the filter bar's flex
 * item exactly as the old atomic container was, and every existing ".jsx-news-tabs > span" rule
 * reaches the pills unchanged. The row's own layout, previously that container's Elementor style
 * (flex row, 12px gap, wrap, centred; width auto, no grow or shrink), is restated here at (0,2,0),
 * under §34's (0,3,0) phone rules, which turn it into a scrolling strip.
 */
.jsx-news-tabs-host,
.jsx-news-tabs-host > .elementor-widget-container,
.jsx-news-tabs-host .elementor-shortcode { display: contents; }

.jsx-news-tabs-host .jsx-news-tabs {
	position: relative;
	display: flex;
	flex-direction: row;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px;
	padding: 0;
	width: auto;
	flex: 0 0 auto;
}

/* ---------------------------------------------- 100. Careers hero: breadcrumbs on the copy column */

/*
 * Jun, 2026-10-04: "the breadcrumbs is not aligned". Above 1440 the hero's copy column
 * (.jsx-car-hero__inner) is capped at 1240 and centred, but the breadcrumb widget sits outside it at
 * full width, so "Home / Careers" stayed at the 100px gutter while the title moved in: 46px out at
 * 1531, 120px at 1680. The other heroes centre their text, so only this left-aligned one showed it.
 * The crumbs now take the same column.
 */
.elementor.elementor .jsx-car-hero > .elementor-widget-shortcode {
	width: 100%;
	max-width: var( --dp-container );
	margin-inline: auto;
}

/* ------------------------------------------- 101. Header main nav: the current section */

/*
 * Jun, 2026-10-04: the main nav shows which section you are in. inc/header-current.php puts
 * aria-current (and .is-current) on that item's link, in the HTML, so it is right on first paint.
 * Same blues as the hover (§29), for the same reason: they invert against each other, so the dark
 * header takes the light blue (#46BCFF, 4.9:1) and every white state takes the brand blue
 * (#4600FF, 7.8:1).
 */
.elementor.elementor .jsx-ui-nav a[aria-current] {
	color: var( --dp-light-blue );
}

/* white states: light header, search open, dropdown open, phone menu open */
body.dp-light-header .elementor.elementor .jsx-ui-nav a[aria-current],
body.dp-search-open .elementor.elementor .jsx-ui-nav a[aria-current],
body.dp-mega-open .elementor.elementor .jsx-ui-nav a[aria-current],
.elementor.elementor .jsx-header-inner.is-compact.is-open .jsx-ui-nav a[aria-current] {
	color: var( --dp-blue );
}

/* ------------------------------------ 102. Job detail hero: the logo mark (Figma 620:17 / 620:21) */

/*
 * Jun, 2026-10-04: a subtle artwork in place of the plain band, from the icon in the logo. This is
 * the mark redrawn, not the PNG: a quarter-disc of r 73.5 centred on the box's top-left corner, a
 * 75 square from (25, 25), and their overlap. All three are tinted against the band's
 * #F3F1FA: deep purple at 8%, #4600FF at 7%, #46BCFF at 18%.
 *
 * Decorative, so it is a background and not an image: nothing for a screen reader, nothing to
 * load. The copy keeps its contrast on the darkest tint (#575269 on #D4E7FB is 5.5:1).
 * The tints are baked against --dp-lavender-soft, so re-derive them if that colour changes.
 * Job singles only: the report hero shares .jsx-job-hero and stays plain.
 *
 * It sits flush under the header (--jsx-header-h, published by custom.js) and bleeds off the
 * right edge. At 1440 that is the Figma's x1020; the section clips the bottom bleed.
 */
/* on :root so other job surfaces can reuse the mark */
:root {
	--jsx-job-mark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23E5DEF3' d='M0 0H73.5C73.5 8.52 72.02 16.98 69.12 25H25V69.12C16.98 72.02 8.52 73.5 0 73.5Z'/><path fill='%23E7E0FA' d='M69.12 25H100V100H25V69.12C45.53 61.69 61.69 45.53 69.12 25Z'/><path fill='%23D4E7FB' d='M25 25H69.12C61.69 45.53 45.53 61.69 25 69.12Z'/></svg>");
}

.jsx-job-hero--mark {
	background-image: var( --jsx-job-mark );
	background-repeat: no-repeat;
	background-size: 460px 460px;
	background-position: right -40px top var( --jsx-header-h, 91px );
}

@media ( max-width: 1024px ) {
	.jsx-job-hero--mark {
		background-size: 340px 340px;
		background-position: right -40px top var( --jsx-header-h, 72px );
	}
}

/* phone: the Figma's 180 box at x262 on 390, clear of the meta row */
@media ( max-width: 767px ) {
	.jsx-job-hero--mark {
		background-size: 180px 180px;
		background-position: right -52px top var( --jsx-header-h, 64px );
	}
}

/*
 * Logged in, below 601px WordPress's admin bar scrolls with the page and pushes the hero down 46px,
 * while the site header stays fixed at the top. Lift the mark by the same 46 so it stays flush.
 * Visitors never have the bar.
 */
@media ( max-width: 600px ) {
	body.admin-bar .jsx-job-hero--mark {
		background-position: right -52px top calc( var( --jsx-header-h, 64px ) - 46px );
	}
}

/* ------------------------------------------- 103. Careers: job details in a pop-up */

/*
 * Jun, 2026-10-04: on the Careers page "View details" opens the job in a pop-up. The board is
 * printed as [dp_car_jobs details="popup"]; View All Jobs keeps going to the job page. Basic
 * information only (Jun): the title and the description, without the job page's hero.
 * The dialog carries .jsx-job, so the job page's own rules (§83: description type)
 * style the content and only the frame is declared here.
 *
 * Body, title and loading rules carry .elementor.elementor: the Careers reset
 * `.elementor.elementor [class*="jsx-car-"] { padding: 0 }` (§78) otherwise zeroes their padding.
 */
.jsx-car-jobmodal {
	--jsx-job-font: "General Sans VF", var( --dp-font-body );
	box-sizing: border-box;
	width: min( 800px, calc( 100% - 48px ) );
	max-width: none;
	max-height: calc( 100dvh - 64px );
	margin: auto;
	padding: 0;
	border: 0;
	border-radius: 16px;
	background-color: #fff;
	color: var( --dp-text-on-light );
	box-shadow: 0 24px 64px rgba( 11, 6, 24, 0.28 );
	overflow: hidden;
}

.jsx-car-jobmodal[open] { display: flex; flex-direction: column; }

.jsx-car-jobmodal::backdrop { background-color: rgba( 11, 6, 24, 0.62 ); }

/* the description scrolls; the close button stays put */
.jsx-car-jobmodal .jsx-car-jobmodal__panel {
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	overscroll-behavior: contain;
}

.elementor.elementor .jsx-car-jobmodal .jsx-car-jobmodal__body { padding: 48px 56px 56px; }

.elementor.elementor .jsx-car-jobmodal .jsx-car-jobmodal__title {
	margin: 0;
	padding-inline-end: 40px; /* clear of the close button */
	font-family: var( --dp-font-display );
	font-weight: 400;
	font-size: 36px;
	line-height: 1.15;
	letter-spacing: -0.02em;
	color: var( --dp-text-on-light );
	overflow-wrap: break-word;
}

.jsx-car-jobmodal .jsx-job-content {
	margin-block-start: 28px;
	padding-block-start: 28px;
	border-block-start: 1px solid rgba( 21, 19, 31, 0.1 );
}

.elementor.elementor .jsx-car-jobmodal .jsx-car-jobmodal__loading {
	margin: 0;
	padding: 56px;
	font-family: var( --jsx-job-font );
	color: var( --dp-text-on-light-muted );
}

/* out-ranks Hello's pink button:hover reset and the kit's button rules */
.jsx-car-jobmodal .jsx-car-jobmodal__close {
	position: absolute;
	inset-block-start: 16px;
	inset-inline-end: 16px;
	z-index: 2;
	display: grid;
	place-items: center;
	width: 44px;
	height: 44px;
	padding: 0;
	border: 1px solid rgba( 21, 19, 31, 0.12 );
	border-radius: 50%;
	background-color: #fff;
	color: var( --dp-text-on-light );
	cursor: pointer;
	transition: color 140ms ease, border-color 140ms ease;
}

.jsx-car-jobmodal .jsx-car-jobmodal__close:is( :hover, :focus, :active ) {
	border-color: var( --dp-blue );
	background-color: #fff;
	color: var( --dp-blue );
}

.jsx-car-jobmodal .jsx-car-jobmodal__close:focus-visible {
	outline: 2px solid var( --dp-blue );
	outline-offset: 2px;
}

@media ( prefers-reduced-motion: no-preference ) {
	.jsx-car-jobmodal[open] { animation: jsx-car-jobmodal-in 200ms ease-out; }
	.jsx-car-jobmodal[open]::backdrop { animation: jsx-car-jobmodal-fade 200ms ease-out; }
}

@keyframes jsx-car-jobmodal-in {
	from { opacity: 0; transform: translateY( 12px ); }
	to { opacity: 1; transform: none; }
}

@keyframes jsx-car-jobmodal-fade {
	from { opacity: 0; }
	to { opacity: 1; }
}

/* phone: a full-screen sheet */
@media ( max-width: 767px ) {
	.jsx-car-jobmodal {
		width: 100%;
		height: 100dvh;
		max-height: 100dvh;
		border-radius: 0;
	}

	.elementor.elementor .jsx-car-jobmodal .jsx-car-jobmodal__body { padding: 68px 20px 48px; }
	.elementor.elementor .jsx-car-jobmodal .jsx-car-jobmodal__title { padding-inline-end: 0; font-size: 28px; }
	.elementor.elementor .jsx-car-jobmodal .jsx-car-jobmodal__loading { padding: 68px 20px; }
	.jsx-car-jobmodal .jsx-car-jobmodal__close { inset-block-start: 12px; inset-inline-end: 12px; }
}

/* ------------------------------------------ 104. Job department and location archives */

/*
 * Jun, 2026-10-04: job categories now use the basic archive (§82) like job locations, instead of the
 * old dark Elementor "Jobs Arhive". On both, each role shows its department (as the job page's tag)
 * and location in place of the excerpt, which is the same "About DigiPlus" boilerplate on every job.
 */
.jsx-basic .jsx-basic__job-meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px 20px;
	margin: 12px 0 0;
	padding: 0;
	list-style: none;
	font-size: 15px;
	line-height: 1.5;
	color: var( --dp-text-on-light-muted );
}

.jsx-basic .jsx-basic__job-meta li { display: inline-flex; align-items: center; gap: 6px; margin: 0; }

/* the department reads as the job page's tag (§83) */
.jsx-basic .jsx-basic__job-dept {
	padding: 3px 10px;
	border-radius: 6px;
	background-color: var( --dp-lavender-soft );
	font-size: 13px;
	line-height: 18px;
	color: var( --dp-blue );
}

.jsx-basic .jsx-basic__job-loc svg { flex: 0 0 auto; width: 18px; height: 18px; }

/* ---------------------------------------------- 105. Testimonial category archives */

/*
 * Jun, 2026-10-04: /cat-testimonial/members/ and /leaders/ on the basic archive (§82). The query
 * fix is in inc/basic-page.php. Each testimonial is the Careers page's quote card (§78
 * .jsx-car-quote: quote, rule, name, role in brand blue) on lavender, since this page is white.
 * Filmed testimonials lead with their poster and link to their page, where the film plays.
 */
.jsx-basic .jsx-basic__eyebrow {
	margin: 0 0 12px;
	font-size: 13px;
	font-weight: 500;
	line-height: 1.4;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var( --dp-blue );
}

.jsx-basic .jsx-basic__quotes {
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	gap: 24px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.jsx-basic .jsx-basic__quote-item { margin: 0; }

.jsx-basic .jsx-basic__quote {
	display: flex;
	flex-direction: column;
	height: 100%;
	margin: 0;
	padding: 28px 24px;
	border-radius: 16px;
	background-color: var( --dp-lavender-soft );
}

.jsx-basic .jsx-basic__quote-poster {
	display: block;
	margin: -28px -24px 22px;
	overflow: hidden;
	border-radius: 16px 16px 0 0;
}

.jsx-basic .jsx-basic__quote-poster img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	object-position: center 20%;
}

.jsx-basic .jsx-basic__quote-text {
	flex: 1 1 auto;
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 15px;
	line-height: 1.65;
	font-style: normal;
	color: var( --dp-text-on-light-muted );
}

.jsx-basic .jsx-basic__quote-text p { margin: 0 0 12px; }
.jsx-basic .jsx-basic__quote-text p:last-child { margin-block-end: 0; }

.jsx-basic .jsx-basic__quote-cite {
	font-style: normal; /* Hello sets figcaption italic */
	display: flex;
	flex-direction: column;
	gap: 4px;
	margin-block-start: 22px;
	padding-block-start: 22px;
	border-block-start: 1px solid var( --dp-line-on-light );
}

/* a film card has no quote above it, so no rule either */
.jsx-basic .jsx-basic__quote-item--film .jsx-basic__quote-cite { margin-block-start: 0; padding-block-start: 0; border: 0; }

.jsx-basic .jsx-basic__quote-name { font-weight: 600; font-size: 20px; line-height: 1.3; color: var( --dp-text-on-light ); }
.jsx-basic .jsx-basic__quote-role { font-size: 13px; line-height: 1.4; color: var( --dp-blue ); }

.jsx-basic .jsx-basic__quote-watch {
	margin-block-start: 10px;
	font-size: 15px;
	font-weight: 500;
	color: var( --dp-blue );
	text-decoration: underline;
	text-underline-offset: 3px;
}

@media ( max-width: 767px ) {
	.jsx-basic .jsx-basic__quotes { grid-template-columns: minmax( 0, 1fr ); gap: 16px; }
}

/* ------------------------------------------ 106. Profile category and committee archives */

/*
 * Jun, 2026-10-04: /profile-category/board-of-directors/ (and management, and the committee pages)
 * list people as the profile page's own cards (§87 .jsx-profile-card, via .jsx-profile on <main>),
 * in Corporate Governance order. The basic archive's 800 column is too narrow for four portraits
 * across, so these archives take the site container.
 */
.jsx-basic--profiles .jsx-basic__inner { max-width: calc( 1240px + 2 * var( --dp-gutter ) ); }
.jsx-basic--profiles { --jsx-job-font: "General Sans VF", var( --dp-font-body ); }


/* ----------------------------------- 107. Homepage S2 · Introduction (Figma 9:35) */

/*
 * Jun, 2026-10-09: "We Are DigiPlus" and "Our Products" are one band, built in Elementor from the
 * approved frame 9:35 with the existing images (no new uploads). Layout lives on the page's own
 * Elementor styles: the two columns stay side by side down to 768 ("this screen size still have a
 * room to put it to the side"; the grid no longer carries .jsx-split) and stack on phones, where the
 * hairline is hidden too.
 *
 * What Elementor cannot express is below: each link row (text + the arrow Jun asked for) is one
 * click target, the heading's link stretched over the row; and the arrow nudges on hover like the
 * house arrow buttons.
 *
 * Keyed to the .jsx-s2-link global class, never to the rows' local style ids: Jun exports this band
 * as a template, and an imported or re-inserted copy gets new ids, so an id rule would silently stop
 * applying on the client's side. The band's mobile spacing lives on its own elements for the same
 * reason (§34 and §37 no longer list S2 ids).
 */
.elementor .jsx-s2-link a::after {
	content: "";
	position: absolute;
	inset: 0;
}

.elementor .jsx-s2-link:hover > :last-child {
	transform: translateX( 3px );
}

@media ( prefers-reduced-motion: reduce ) {
	.elementor .jsx-s2-link:hover > :last-child { transform: none; }
}

/* The cards' 32px gap from the frame (3 × 392 + 2 × 32 = 1240). §-"two sections collapsing early" sets
   24px from 768 up so three cards fit an iPad; that stays for 768–1024, the design value from 1025. */
@media (min-width: 1025px) {
	.elementor .e-con.jsx-product-cards { gap: 32px; }
}

/* -------------------------------- 108. Bold in a portfolio card title = the accent word */

/*
 * Jun, 2026-10-12: the atomic heading editor can only Bold, not add a <span>, and he asked for this
 * on the portfolio cards only ("only apply this boxes under jsx-pf-card class"). On the front end
 * inc/heading-highlight.php rewrites bold in a .jsx-pf-card__title to the accent <span>; this rule makes
 * the Elementor canvas show a bolded brand name the way the page will (brand blue, normal weight).
 * Bold anywhere else on the site stays bold.
 */
.elementor.elementor .jsx-pf-card .jsx-pf-card__title strong,
.elementor.elementor .jsx-pf-card .jsx-pf-card__title b { color: var( --dp-blue ); font-weight: inherit; }

/* ---------------------------------------------------------- 109. Awards logo strip */

/*
 * [digiplus_awards] (inc/awards.php): the logos from DigiPlus Settings -> Awards in a continuous strip.
 * Jun, 2026-10-14: autoplay, infinite, greyscale until hovered, paused on hover.
 *
 * - The loop is pure CSS: two copies of the list on one belt sliding exactly half its width.
 *   --jsx-aw-dur is set inline from the belt's width, so the speed is the same for any number of logos.
 * - Paused on hover over the logos, on keyboard focus on a linked logo, and by the pause button. Hover alone fails WCAG 2.2.2
 *   (anything that moves for over 5 seconds needs a way to stop it) for keyboard and touch users,
 *   hence the button.
 * - prefers-reduced-motion: no motion at all; the strip becomes a row you can swipe or scroll.
 * - Each logo's display width (--jsx-aw-w) is normalised by area in PHP, so wordmarks and badges weigh
 *   the same. Phones show them at 72%.
 * - The band itself: .jsx-aw-band (white, hairlines top and bottom) with an ordinary heading,
 *   .jsx-aw-title, so the strip can sit on any page with or without that band.
 */
/* no side padding: like the Latest News band, the shared .jsx-container sets width and gutter, so the
   two bands line up at every width */
.elementor.elementor .jsx-aw-band {
	padding-block: 48px;
	padding-inline: 0;
	background-color: var( --dp-white );
}

.elementor.elementor .jsx-aw-band > .jsx-container {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	padding-block: 48px 40px;
	border-block: 1px solid var( --dp-line-on-light );
}

/* jsx-display-section is white by default (it was drawn for dark bands); this band is white */
.elementor.elementor .jsx-aw-band .jsx-aw-title { margin: 0 0 40px; color: var( --dp-text-on-light ); }

.jsx-awards {
	position: relative;
	width: 100%;
}

.jsx-awards__viewport {
	overflow: hidden;
	padding-block: 6px; /* room for the hover scale; overflow: hidden clips vertically too */
	/* the logos fade in and out at the edges instead of being cut off by them */
	-webkit-mask-image: linear-gradient( 90deg, transparent 0, #000 7%, #000 93%, transparent 100% );
	mask-image: linear-gradient( 90deg, transparent 0, #000 7%, #000 93%, transparent 100% );
}

.jsx-awards__belt {
	display: flex;
	width: max-content;
	animation: jsx-awards-slide var( --jsx-aw-dur, 60s ) linear infinite;
	will-change: transform;
}

/* hover and focus pause it only over the logos: scoped to the whole strip, a pointer resting on (or focus
   left on) the Play button kept it still after "Play" was pressed */
.jsx-awards__viewport:hover .jsx-awards__belt,
.jsx-awards__viewport:focus-within .jsx-awards__belt,
.jsx-awards.is-paused .jsx-awards__belt { animation-play-state: paused; }

@keyframes jsx-awards-slide { to { transform: translateX( -50% ); } }

.jsx-awards__list {
	display: flex;
	align-items: center;
	gap: var( --jsx-aw-gap, 72px );
	/* the trailing gap makes the two copies exactly equal, so -50% lands on the seam */
	padding: 0 var( --jsx-aw-gap, 72px ) 0 0;
	margin: 0;
	list-style: none;
}

.jsx-awards__item {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 100px;
}

.jsx-awards__link { display: block; line-height: 0; border-radius: 4px; }
.jsx-awards__link:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 6px; }

.jsx-awards__logo {
	display: block;
	width: var( --jsx-aw-w, 120px );
	max-width: none;
	height: auto;
	filter: grayscale( 1 );
	opacity: 0.6;
	transition: filter 300ms ease, opacity 300ms ease, transform 300ms cubic-bezier( 0.2, 0.7, 0.2, 1 );
}

/*
 * A pale logo (measured in PHP: ACGS 0.90) is artwork made for a dark ground. On white it fails twice: in
 * greyscale it vanishes, and in colour on hover its gradient fades out and its white subtitle ("ASEAN
 * Corporate Governance Scorecard") disappears (Jun, 2026-10-14, "something wrong on this image when hover").
 * So it sits on a dark tile, like the badge logos that arrive with their own grounds (Anvil, SiGMA, Global
 * Gaming), instead of being recoloured. Ask the client for a light-background version to drop the tile.
 */
.jsx-awards__item--pale .jsx-awards__logo {
	box-sizing: content-box;
	padding: 12px 16px;
	border-radius: 8px;
	background-color: #15131f;
}

/* Jun, 2026-10-14: "scale up a bit the logo when hover" — 10%, drawn over its neighbours (transform does
   not move them); the 100px item leaves room, so the tallest logo (91px) still fits at 100 */
.jsx-awards__item:hover .jsx-awards__logo,
.jsx-awards__link:focus-visible .jsx-awards__logo {
	filter: none;
	opacity: 1;
	transform: scale( 1.1 );
}

/* pause / play: small, under the strip's right end */
.jsx-awards__toggle {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	margin: 20px 0 0 auto;
	padding: 0;
	border: 1px solid var( --dp-line-on-light );
	border-radius: 50%;
	background-color: var( --dp-white );
	color: var( --dp-text-on-light );
	cursor: pointer;
	transition: border-color 160ms ease, color 160ms ease;
}

.jsx-awards__toggle:hover { border-color: var( --dp-blue ); color: var( --dp-blue ); background-color: var( --dp-white ); }
.jsx-awards__toggle:focus { outline: none; }
.jsx-awards__toggle:focus-visible { outline: 2px solid var( --dp-blue ); outline-offset: 2px; }

/* two bars = pause; a triangle once paused = play */
.jsx-awards__toggle-icon {
	width: 10px;
	height: 12px;
	border-inline: 3px solid currentColor;
	box-sizing: border-box;
}

.jsx-awards.is-paused .jsx-awards__toggle-icon {
	width: 0;
	height: 0;
	margin-inline-start: 3px;
	border-block: 6px solid transparent;
	border-inline-start: 10px solid currentColor;
	border-inline-end: 0;
}

@media ( prefers-reduced-motion: reduce ) {
	.jsx-awards__belt { animation: none; width: auto; }
	.jsx-awards__list[aria-hidden] { display: none; }
	.jsx-awards__viewport { overflow-x: auto; -webkit-mask-image: none; mask-image: none; scrollbar-width: thin; }
	.jsx-awards__toggle { display: none; }
	.jsx-awards__logo { transition: none; }
	.jsx-awards__item:hover .jsx-awards__logo,
	.jsx-awards__link:focus-visible .jsx-awards__logo { transform: none; }
}

@media ( max-width: 767px ) {
	.elementor.elementor .jsx-aw-band { padding-block: 40px; }
	.elementor.elementor .jsx-aw-band > .jsx-container { padding-block: 32px 28px; }
	.elementor.elementor .jsx-aw-band .jsx-aw-title { margin-block-end: 28px; }
	.jsx-awards { --jsx-aw-gap: 40px !important; }
	.jsx-awards__logo { width: calc( var( --jsx-aw-w, 120px ) * 0.72 ); }
	.jsx-awards__item { min-height: 72px; }
}
