/**
 * Swiper 11.1.14
 * Most modern mobile touch slider and framework with hardware accelerated transitions
 * https://swiperjs.com
 *
 * Copyright 2014-2024 Vladimir Kharlampidi
 *
 * Released under the MIT License
 *
 * Released on: September 12, 2024
 */

@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA');font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}:host{position:relative;display:block;margin-left:auto;margin-right:auto;z-index:1}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);box-sizing:content-box}.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide{transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.swiper-virtual .swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:var(--swiper-navigation-top-offset,50%);width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next svg,.swiper-button-prev svg{width:100%;height:100%;object-fit:contain;transform-origin:center}.swiper-rtl .swiper-button-next svg,.swiper-rtl .swiper-button-prev svg{transform:rotate(180deg)}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:var(--swiper-navigation-sides-offset,10px);right:auto}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-lock{display:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;font-variant:initial;line-height:1}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:'prev'}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:'next'}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);top:var(--swiper-pagination-top,auto);left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:var(--swiper-pagination-bullet-border-radius,50%);background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:var(--swiper-pagination-right,8px);left:var(--swiper-pagination-left,auto);top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,rgba(0,0,0,.25));position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:var(--swiper-pagination-progressbar-size,4px);height:100%;left:0;top:0}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move;touch-action:none}.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active{pointer-events:auto}.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-cube .swiper-slide-next+.swiper-slide{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden}

/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */

/* Document
========================================================================== */

/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/

*, *:before, *:after {
	box-sizing: border-box;
}


html {
	line-height: 1.15; /* 1 */
	-webkit-text-size-adjust: 100%; /* 2 */
}

/* Sections
========================================================================== */

/**
* Remove the margin in all browsers.
*/

body {
	margin: 0;
	/* Contain horizontal bleed WITHOUT becoming a scroll container. Must be `clip`, NOT `hidden`:
	   on iOS Safari, `overflow-x: hidden` on body turns it into a scroll container and silently
	   BREAKS every `position: sticky` descendant (e.g. the Story Highlights forced-scroll pin) —
	   it works on desktop Chrome but not iOS. `clip` clips the same way but creates no scroll
	   container, so sticky keeps working. (Same rule + reasoning as .body-container-wrapper.) */
	overflow-x: clip;
}

/* Grouping content
========================================================================== */

/**
* Add the correct box sizing in Firefox.
*/

hr {
	box-sizing: content-box;
	height: 0;
}

/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/

pre {
	font-family: monospace, monospace; /* 1 */
	font-size: 1em; /* 2 */
}

/* Text-level semantics
========================================================================== */

/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.
*/

abbr[title] {
	border-bottom: none; /* 1 */
	text-decoration: underline; /* 2 */
	text-decoration: underline dotted; /* 2 */
}

/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/

b,
strong {
	font-weight: 700;
}

/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/

code,
kbd,
samp {
	font-family: monospace, monospace; /* 1 */
	font-size: 1em; /* 2 */
}

/**
* Add the correct font size in all browsers.
*/

small {
	font-size: 80%;
}

/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/

sub,
sup {
	font-size: 75%;
	line-height: 0;
	position: relative;
	vertical-align: baseline;
}

sub {
	bottom: -0.25em;
}

sup {
	top: -0.5em;
}

/* Forms
========================================================================== */

/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/

button,
input,
optgroup,
select,
textarea {
	font-family: inherit; /* 1 */
	font-size: 100%; /* 1 */
	line-height: 1.15; /* 1 */
	margin: 0; /* 2 */
}

/**
* Remove the inheritance of text transform in Edge and Firefox.
* 1. Remove the inheritance of text transform in Firefox.
*/

button,
select { /* 1 */
	text-transform: none;
}

/**
* Correct the inability to style clickable types in iOS and Safari.
*/

button,
[type="button"],
[type="reset"],
[type="submit"] {
	-webkit-appearance: button;
}

/**
* Remove the inner border and padding in Firefox.
*/

button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
	border-style: none;
	padding: 0;
}

/**
* Restore the focus styles unset by the previous rule.
*/

button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
	outline: 1px dotted ButtonText;
}

/**
* Correct the padding in Firefox.
*/

fieldset {
	padding: 0.35em 0.75em 0.625em;
}

/**
* Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers.
*/

legend {
	padding: 0;
}

/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/

progress {
	vertical-align: baseline;
}

/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/

[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
	height: auto;
}

/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/

[type="search"] {
	-webkit-appearance: textfield; /* 1 */
	outline-offset: -2px; /* 2 */
}

/**
* Remove the inner padding in Chrome and Safari on macOS.
*/

[type="search"]::-webkit-search-decoration {
	-webkit-appearance: none;
}

/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/

::-webkit-file-upload-button {
	-webkit-appearance: button; /* 1 */
	font: inherit; /* 2 */
}

/* Interactive
========================================================================== */

/*
* Add the correct display in Edge and Firefox.
*/

details {
	display: block;
}

/*
* Add the correct display in all browsers.
*/

summary {
	display: list-item;
}

svg {
	display: block;
}

img,
svg,
video {
	vertical-align: middle;
	max-width: 100%;
}



/* CSS variables */

:root {
  --column-gap: 2.13%;
  --column-width-multiplier: 8.333;
}

/* Mobile layout */

.row-fluid {
  display: flex;
  flex-wrap: wrap;
  width: 100%;
}


  .row-fluid .span1,
  .row-fluid .span2,
  .row-fluid .span3,
  .row-fluid .span4,
  .row-fluid .span5,
  .row-fluid .span6,
  .row-fluid .span7,
  .row-fluid .span8,
  .row-fluid .span9,
  .row-fluid .span10,
  .row-fluid .span11,
  .row-fluid .span12{
  min-height: 0;
  width: 100%;
}

/* Desktop layout */

@media (min-width: 768px) {
  .row-fluid {
    flex-wrap: nowrap;
    justify-content: space-between;
  }

  
    .row-fluid .span1 {
      width: calc(var(--column-width-multiplier) * 1% * 1 - var(--column-gap) * (11 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span2 {
      width: calc(var(--column-width-multiplier) * 1% * 2 - var(--column-gap) * (10 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span3 {
      width: calc(var(--column-width-multiplier) * 1% * 3 - var(--column-gap) * (9 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span4 {
      width: calc(var(--column-width-multiplier) * 1% * 4 - var(--column-gap) * (8 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span5 {
      width: calc(var(--column-width-multiplier) * 1% * 5 - var(--column-gap) * (7 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span6 {
      width: calc(var(--column-width-multiplier) * 1% * 6 - var(--column-gap) * (6 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span7 {
      width: calc(var(--column-width-multiplier) * 1% * 7 - var(--column-gap) * (5 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span8 {
      width: calc(var(--column-width-multiplier) * 1% * 8 - var(--column-gap) * (4 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span9 {
      width: calc(var(--column-width-multiplier) * 1% * 9 - var(--column-gap) * (3 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span10 {
      width: calc(var(--column-width-multiplier) * 1% * 10 - var(--column-gap) * (2 * var(--column-width-multiplier) / 100));
    }
  
    .row-fluid .span11 {
      width: calc(var(--column-width-multiplier) * 1% * 11 - var(--column-gap) * (1 * var(--column-width-multiplier) / 100));
    }
  
}
.content-wrapper {
  margin: 0 auto;
  padding: 0 1rem;
}

@media screen and (min-width: 1380px) {
  .content-wrapper {
    padding: 0;
  }
}

.dnd-section > .row-fluid {
  margin: 0 auto;
}

.dnd-section .dnd-column {
  padding: 0 0rem;
}

@media (max-width: 768px) {
  .dnd-section .dnd-column {
    padding: 0;
  }
}

:root {
	/* Brand — legacy aliases; the brand colours are now driven by the Theme Settings
	   "Brand colours" group (theme.colours.*). The full 50–950 tint scales below stay fixed;
	   only each scale's BASE shade is theme-driven (see the per-scale "• base ← theme" lines). */
	--white: #FFFFFF;
	--grey: #383f47;
	--cardBorderColour: #E4E4E4;
	--bodyColour: #141517;
	--ctaPrimaryColour: #a1bf24;       /* CTA / Button (lime) */
	--primaryColour: #13192d;   /* dark navy text/base (= Foundation) */

	/* ============================================================
	   Entelect Design System palette
	   Source: Figma — Entelect Design System (node 2092:425)
	   "• base" marks the default/base shade of each scale.
	   ============================================================ */

	/* Foundation (neutral) */
	--foundation-50:  #f5f7fa;
	--foundation-100: #edf0f5;
	--foundation-200: #dde2eb;
	--foundation-300: #bcc4d1;
	--foundation-400: #9da4b2;
	--foundation-500: #7b8194;
	--foundation-600: #555c70;
	--foundation-700: #3b4257;
	--foundation-800: #252c42;
	--foundation-900: #13192d; /* • base ← theme (Foundation dark) */
	--foundation-950: #0d1220;     /* ← theme (Canvas darkest) */

	/* Signal (deep blue) */
	--signal-50:  #f8f9fa;
	--signal-100: #ebeef1;
	--signal-200: #dadfe5;
	--signal-300: #b4bfcb;
	--signal-400: #8f9fb1;
	--signal-500: #6f839a;
	--signal-600: #566d89;
	--signal-700: #385474;
	--signal-800: #1f3e62;
	--signal-900: #062951; /* • base ← theme (Signal deep blue) */
	--signal-950: #052141;

	/* Azure (blue) */
	--azure-50:  #f3f9fc;
	--azure-100: #e8f3f9;
	--azure-200: #cae2f1;
	--azure-300: #a3cde7;
	--azure-400: #75b5da;
	--azure-500: #479cce;
	--azure-600: #1983c2; /* • base ← theme (Primary / Azure) */
	--azure-700: #156fa5;
	--azure-800: #125c88;
	--azure-900: #0e486b;
	--azure-950: #0a344e;

	/* Neon Pulse (lime) — scale defines 50–600 + 950 */
	--neon-pulse-50:  #f7faed;
	--neon-pulse-100: #f1f5de;
	--neon-pulse-200: #e7efc8;
	--neon-pulse-300: #d9e5a7;
	--neon-pulse-400: #c7d97c;
	--neon-pulse-500: #b4cc50; /* ← theme (Accent / Lime) */
	--neon-pulse-600: #a1bf24;    /* • base ← theme (CTA / Button) */
	--neon-pulse-950: #404c0e;

	/* Signal Teal (teal) */
	--signal-teal-50:  #f2f9fa;
	--signal-teal-100: #e6f4f5;
	--signal-teal-200: #bfe3e6;
	--signal-teal-300: #99d2d7;
	--signal-teal-400: #67bbc2;
	--signal-teal-500: #2ca1ab;
	--signal-teal-600: #018e9a; /* • base ← theme (Teal) */
	--signal-teal-700: #017983;
	--signal-teal-800: #01636c;
	--signal-teal-900: #014e55;
	--signal-teal-950: #00393e;

	/* Codebase Green (green) */
	--codebase-green-50:  #f4f9f6;
	--codebase-green-100: #e9f3ec;
	--codebase-green-200: #cde4d4;
	--codebase-green-300: #a8d1b3;
	--codebase-green-400: #7db98e;
	--codebase-green-500: #51a268;
	--codebase-green-600: #268b42; /* • base ← theme (Green) */
	--codebase-green-700: #207638;
	--codebase-green-800: #1b612e;
	--codebase-green-900: #154c24;
	--codebase-green-950: #0f381a;

	/* Semantic — Error (Figma) */
	--error-50:  #fff0ef;
	--error-100: #ffdfdb;
	--error-200: #ffc5c0;
	--error-300: #ff9e96;
	--error-400: #ff6b5e;
	--error-500: #f84233;
	--error-600: #e22618; /* • base */
	--error-700: #ba1f14;
	--error-800: #961d14;
	--error-900: #7a1e17;
	--error-950: #3f0f0b;

	/* Semantic — Warning (Figma) */
	--warning-50:  #fff6ea;
	--warning-100: #ffeacf;
	--warning-200: #fed1a0;
	--warning-300: #fdb169;
	--warning-400: #fa8735;
	--warning-500: #f86816;
	--warning-600: #e74e0f; /* • base */
	--warning-700: #ba390f;
	--warning-800: #8f2e13;
	--warning-900: #712813;
	--warning-950: #3b1409;

	/* Semantic tokens (Figma) */
	--text-primary:  var(--foundation-900); /* = Foundation (theme-driven) */
	--text-accent:   #b4cc50; /* ← theme (Text accent, lime tagline accent) */
	--bg-secondary:  var(--foundation-50);  /* #f5f7fa */
	--panel-primary: var(--white);          /* #ffffff */

	/* Dark-design hairline — opaque slate divider/border used on the dark canvas
	   (e.g. the hero/logo-grid bordered logo grids). From Figma node 195:5526. */
	--border-grid: #272e47;
}
/* ============================================================
   Entelect Design System — elevation / shadow scale
   Source: Figma — Entelect Design System (node 2518:34130)
   Values converted to rem (1rem = 10px). Shadow colour = foundation-900 (#13192d).
   Usage: box-shadow: var(--shadow-md);
   ============================================================ */
:root {
	--shadow-xs:  0 0.1rem 0.2rem 0 rgba(19, 25, 45, 0.08);
	--shadow-sm:  0 0.2rem 0.4rem 0 rgba(19, 25, 45, 0.08);
	--shadow-md:  0 0.4rem 0.8rem 0 rgba(19, 25, 45, 0.1);
	--shadow-lg:  0 0.8rem 1.6rem -0.2rem rgba(19, 25, 45, 0.1);
	--shadow-xl:  0 1.2rem 2.4rem -0.4rem rgba(19, 25, 45, 0.12);
	--shadow-2xl: 0 0.6rem 1.2rem -0.3rem rgba(19, 25, 45, 0.08), 0 2.8rem 5.6rem -1.4rem rgba(19, 25, 45, 0.15);
	--shadow-3xl: 0 1.2rem 2.4rem -0.6rem rgba(19, 25, 45, 0.08), 0 5rem 10rem -2.5rem rgba(19, 25, 45, 0.15);
}
/* ============================================================
   Entelect Design System — corner radius scale
   Source: Figma — Entelect Design System (node 2460:20668)
   Values converted to rem (1rem = 10px).
   Usage: border-radius: var(--radius-base);
   ============================================================ */
:root {
	--radius-none: 0;
	--radius-xs:   0.6rem;   /* 6px  */
	--radius-sm:   0.8rem;   /* 8px  */
	--radius-md:   1.2rem;   /* 12px */
	--radius-base: 1.6rem;   /* 16px */
	--radius-lg:   2rem;     /* 20px */
	--radius-xl:   2.4rem;   /* 24px */
	--radius-max:  999.9rem; /* pill / fully rounded (9999px) */
}





a {
	text-decoration: none;
	color: var(--primaryColour);
}


.btn {
	
    outline: none;
	cursor: pointer;
    font-size: 1.4rem;
	text-wrap: nowrap;
	font-weight: 700;
	text-align: center;
	border-radius: 0.5rem;
	color: var(--white);
	display: inline-flex;
	text-decoration: none;
	padding: 2.2rem 3.5rem;
	transition: all 250ms ease;
	background-color: var(--ctaPrimaryColour);
	border: 0.2rem solid var(--ctaPrimaryColour);

}

.hs-button.primary.large {
	
    outline: none;
	cursor: pointer;
    font-size: 1.4rem;
	text-wrap: nowrap;
	font-weight: 700;
	text-align: center;
	border-radius: 0.5rem;
	color: var(--white);
	display: inline-flex;
	text-decoration: none;
	padding: 2.2rem 3.5rem;
	transition: all 250ms ease;
	background-color: var(--ctaPrimaryColour);
	border: 0.2rem solid var(--ctaPrimaryColour);

	
	box-shadow: 0.5rem 0.5rem 4rem 0 rgba(161, 191, 36, .3);
}
 
.hs-button.primary.large:hover {
	
    color: var(--primaryColour);
	border: 0.2rem solid transparent;
	background-color: var(--white);
	
	box-shadow: 0.5rem 0.5rem 4rem 0 rgba(161, 191, 36, .3);

}


.btn:hover {
	
    color: var(--primaryColour);
	border: 0.2rem solid transparent;
	background-color: var(--white);
	
	box-shadow: 0.5rem 0.5rem 4rem 0 rgba(161, 191, 36, .3);

}


.btn.outline {
	box-shadow: none;
	color: var(--primaryColour);
	background-color: var(--white);
}

.btn.outline:hover {
	color: var(--ctaPrimaryColour);
	background-color: var(--white);
	border: 0.2rem solid var(--ctaPrimaryColour);
	box-shadow: 0.5rem 0.5rem 4rem 0 rgba(161, 191, 36,.3);
}

.btn.filter {
	color: #1F4659;
	border-color: #141517;
	background-color: #fff;
	box-shadow: none;
}

.btn.filter.active {
	color: #fff;
	border-color: #00A9F3;
	background-color: #00A9F3;
}

.btn.filter:hover {
	color: #fff;
	border-color: #00A9F3;
	background-color: #00A9F3;
	box-shadow: none;
}

.btn.link {
	gap: 0.5rem;
	padding: 0;
	border: none;
	font-weight: 600;
	font-size: 1.4rem;
	align-items: center;
	position: relative;
	text-decoration: none;
	transition: all 0ms ease;
	background-color: transparent;
	color: var(--ctaPrimaryColour);
}

.btn.link:before {
	content: "";
	width: 100%;
	display: block;
	bottom: -0.3rem;
	left: 0;
	position: absolute;
	height: 0.2rem;
	background-color: var(--ctaPrimaryColour);
}

.btn.link:after {
	content: "";
	width: 1rem;
	height: 1rem;
	display: block;
	background-repeat: no-repeat;
	background-image: url('https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/Learn%20More%20Arrow.svg');
}


.btn.no-link {
	cursor: auto;
	border: none;
	padding-left: 0;
	padding-right: 0;
	color: var(--primaryColour);
	background-color: transparent;
}




.btn#menu {
	width: 100%;
	padding: 0;
	height: 4rem;
	border: none;
	max-width: 4rem;
	background-color: transparent;
}


.btn.scroll {
	gap: 0.5rem;
	padding: 0;
	border: none;
	color: #141517;
	align-items: center;
	background-color: transparent;
}




.btn.pricing-btn {
	font-size: 1.4rem;
	letter-spacing: 0;
	text-align: center;
	line-height: 1.2rem;
	font-weight: 700;
	padding: 1rem 2.8rem;
}


/* Dark-design lime pill (Figma "Components/Button/Fill/Dark") — solid lime
   pill with dark navy label. Used on the dark Entelect canvas (hero, etc.). */
.btn.pill {
	color: var(--foundation-900);
	font-size: 1.6rem;
	font-weight: var(--fontWeightMedium);
	padding: 1.1rem 2.4rem;
	border-radius: var(--radius-max, 999.9rem);
	background-color: var(--neon-pulse-600);
	border-color: var(--neon-pulse-600);
	box-shadow: none;
}

.btn.pill:hover {
	color: var(--foundation-900);
	background-color: var(--neon-pulse-500);
	border-color: var(--neon-pulse-500);
	box-shadow: 0.4rem 0.4rem 4rem 0 rgba(180, 204, 80, 0.3);
}

/* Glass pill (Figma "Components/Button/Fill/Light" on the dark canvas) — translucent frosted
   pill with white label; the secondary CTA beside a lime pill (e.g. homepage hero "Who we are"). */
.btn.pill.ghost {
	color: var(--white);
	background-color: rgba(255, 255, 255, 0.05);
	border-color: rgba(255, 255, 255, 0.1);
	backdrop-filter: blur(1rem);
	-webkit-backdrop-filter: blur(1rem);
}

.btn.pill.ghost:hover {
	color: var(--white);
	background-color: rgba(255, 255, 255, 0.12);
	border-color: rgba(255, 255, 255, 0.2);
	box-shadow: none;
}
:root {
	--primaryFont: var(--font-primary);   /* alias → Theme Settings "Fonts › Primary" (default DM Sans) */
	--secondaryFont: var(--font-primary); /* alias → same primary family */
	--fontWeightLight: 300;
	--fontWeightRegular: 400;
	--fontWeightMedium: 500;
	--fontWeightSemiBold: 600;
	--fontWeightBold: 700;
}

html { font-size: 62.5%; }

h1, .h1 {
	margin: 0;
	font-size: 6rem;
	letter-spacing: 0;
    line-height: 6.5rem;
	margin-bottom: 2rem;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightSemiBold);
}

@media (max-width: 991px) {
	h1, .h1 {
		font-size: 4rem;
		line-height: 5rem;
	}
}

@media (max-width: 991px) {
	h1 br, .h1 br {
		display: none;
	}
}

.hs-landing-page h1 {
	font-size: 5rem;
    line-height: 6rem;
}

h2 {
	margin: 0;
	font-size: 4.5rem;
	letter-spacing: 0;
	line-height: 5.5rem;
	margin-bottom: 2rem;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightSemiBold);
}

@media (max-width: 768px) {
	h2 {
		font-size: 3.5rem;
		line-height: 4.5rem;
	}
}

h2:last-child {
	margin-bottom: 0;
}

h3 {
	margin: 0;
	font-size: 3rem;
	letter-spacing: 0rem;
	line-height: 1.25;
	margin-bottom: 2rem;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightSemiBold);
}

h3:last-child {
	margin-bottom: 0;
}

h4 {
	margin: 0;
	font-size: 2.5rem;
	letter-spacing: 0;
	line-height: 3rem;
	margin-bottom: 2rem;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightSemiBold);
}

h4:last-child {
	margin-bottom: 0;
}

h5 {
	margin: 0;
	font-size: 2.0rem;
	letter-spacing: 0;
	line-height: 3rem;
	margin-bottom: 2rem;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightSemiBold);
}

@media (max-width: 768px) {
	h5 {
		font-weight: var(--fontWeightMedium);
	}
}

h5:last-child {
	margin-bottom: 0;
}

ul {
	margin: 0;
	padding-left: 1.8rem;
	margin-bottom: 2rem;
}


ul:last-child {
	margin-bottom: 0 
}


p, li {
	margin: 0;
	font-size: 1.6rem;
	letter-spacing: 0;
	line-height: 2.5rem;
	margin-bottom: 2rem;
	font-family: var(--secondaryFont);
	font-weight: var(--fontWeightRegular);
}

p:last-child,
li:last-child {
	margin-bottom: 0
}


/* ============================================================
   Entelect Design System — typography scale (responsive)
   Source: Figma — 2094:6273 (Desktop) / 2103:14494 (Tablet) / 2103:14884 (Mobile)
   px to rem (1rem = 10px). Desktop = base; Tablet overrides at max-width:1024px;
   Mobile overrides at max-width:768px. font-size + line-height are responsive;
   letter-spacing is held at the desktop value (per-breakpoint diffs are sub-pixel).

   Compose a text style with:
     font-family: var(--font-primary); font-weight: var(--fontWeightMedium);
     font-size: var(--text-2xl); line-height: var(--leading-2xl);
     letter-spacing: var(--tracking-2xl);
   Weights: light 300 / regular 400 / medium 500 / semibold 600 (in the :root at top).
   Tagline (uppercase accent): font-family: var(--primaryFont) (DM Sans); text-transform: uppercase;
     + the --tagline-* size scale. (All __tagline elements render DM Sans as of 2026-07-15.)

   NOTE: the site now loads + renders DM Sans (base.html), and --primaryFont/--secondaryFont
   point at --font-primary. The h1-h5 element styles above still use their own rem sizes —
   mapping those onto the --text-* scale is the only remaining (optional) migration step.
   ============================================================ */
:root {
	/* Primary family — driven by the Theme Settings "Fonts › Primary" field (default DM Sans).
	   --primaryFont/--secondaryFont (above) both alias this, so one setting controls all typography. */
	--font-primary: "DM Sans", sans-serif;

	/* Font size — Desktop */
	--text-xs:   1.2rem;
	--text-sm:   1.4rem;
	--text-base: 1.6rem;
	--text-lg:   2rem;
	--text-xl:   2.4rem;
	--text-2xl:  3.2rem;
	--text-3xl:  3.6rem;
	--text-4xl:  4.8rem;
	--text-5xl:  6rem;
	--text-6xl:  8rem;
	--text-7xl:  10.4rem;

	/* Line height — Desktop */
	--leading-xs:   1.6rem;
	--leading-sm:   2rem;
	--leading-base: 2.4rem;
	--leading-lg:   2.8rem;
	--leading-xl:   3.2rem;
	--leading-2xl:  3.8rem;
	--leading-3xl:  4.2rem;
	--leading-4xl:  5.2rem;
	--leading-5xl:  6.2rem;
	--leading-6xl:  8rem;
	--leading-7xl:  9.6rem;

	/* Letter spacing — static across breakpoints */
	--tracking-xs:   0;
	--tracking-sm:   0;
	--tracking-base: 0;
	--tracking-lg:   -0.05rem;
	--tracking-xl:   -0.025rem;
	--tracking-2xl:  -0.05rem;
	--tracking-3xl:  0;
	--tracking-4xl:  0.05rem;
	--tracking-5xl:  0.05rem;
	--tracking-6xl:  0.05rem;
	--tracking-7xl:  0;

	/* Tagline (Tomorrow) */
	--tagline-2xs:  1rem;
	--tagline-xs:   1.2rem;
	--tagline-sm:   1.4rem;
	--tagline-base: 1.6rem;
	--tagline-lg:   2rem;
	--leading-tagline-2xs:  1.2rem;
	--leading-tagline-xs:   1.4rem;
	--leading-tagline-sm:   1.6rem;
	--leading-tagline-base: 2rem;
	--leading-tagline-lg:   2.4rem;
	--tracking-tagline-2xs:  0.075rem;
	--tracking-tagline-xs:   0.12rem;
	--tracking-tagline-sm:   0.14rem;
	--tracking-tagline-base: 0.16rem;
	--tracking-tagline-lg:   0.2rem;
}

/* Tablet — max-width: 1024px */
@media (max-width: 1024px) {
	:root {
		--text-xl:  2.2rem;
		--text-2xl: 2.8rem;
		--text-3xl: 3.2rem;
		--text-5xl: 4.8rem;
		--text-6xl: 6.4rem;
		--text-7xl: 8rem;

		--leading-xl:  2.8rem;
		--leading-2xl: 3.6rem;
		--leading-3xl: 3.6rem;
		--leading-5xl: 5.4rem;
		--leading-6xl: 6.4rem;
		--leading-7xl: 8rem;

		--tagline-lg: 1.8rem;
	}
}

/* Mobile — max-width: 768px */
@media (max-width: 768px) {
	:root {
		--text-lg:  1.8rem;
		--text-xl:  2rem;
		--text-2xl: 2.4rem;
		--text-3xl: 2.8rem;
		--text-5xl: 3.6rem;
		--text-6xl: 4.4rem;
		--text-7xl: 5.6rem;

		--leading-lg:  2.6rem;
		--leading-2xl: 3.2rem;
		--leading-3xl: 3.2rem;
		--leading-5xl: 4.2rem;
		--leading-6xl: 4.8rem;
		--leading-7xl: 5.6rem;

		--tagline-lg:   1.6rem;
		--tagline-base: 1.4rem;
		--leading-tagline-base: 1.6rem;
	}
}


.form form {
	position: relative;
}

.form form fieldset .input {
	margin: 0 !important;
}

.form form fieldset.form-columns-1 {
	display: grid;
	max-width: 100%;
	margin-bottom: 3rem;
	grid-template-columns: repeat(1, 1fr);
}

.form form fieldset.form-columns-2 {
	gap: 3rem;
	display: grid;
	max-width: 100%;
	margin-bottom: 3rem;
	grid-template-columns: repeat(2, 1fr);
}

@media (max-width: 480px) {
	.form form fieldset.form-columns-2 {
		grid-template-columns: repeat(1, 1fr);
	}
}

.form form fieldset.form-columns-2 .hs-form-field {
	width: 100%;
	float: none;
	margin-bottom: 0;
}

.form form fieldset.form-columns-2 .hs-form-field .input {
	margin-right: 0;
	margin-bottom: 0;
}

.form input[type="text"],
.form input[type="email"],
.form input[type="tel"] {
	width: 100% !important;
	height: 5.5rem;
	outline: none;
	display: block;
	border-radius: 0.4rem;
	padding: 0 1rem;
	border: 0.1rem solid #141517;
}

.form select {
	width: 100%;
	height: 5.5rem;
	outline: none;
	display: block;
	border-radius: 0.4rem;
	padding: 0 1rem;
	border: 0.1rem solid #141517;
}

.form textarea {
	width: 100% !important;
	min-height: 10rem;
	outline: none;
	display: block;
	padding: 2rem;
	margin: 0 !important;
	border-radius: 0.4rem;
	border: 0.1rem solid #141517;
}

.form .hs-fieldtype-file > label {
	display: flex;
	cursor: pointer;
	overflow: hidden;
	padding-left: 1rem;
	border-radius: 0.5rem;
	align-items: center;
	border: 0.2rem solid var(--ctaPrimaryColour);
	justify-content: space-between;
}

.form .hs-fieldtype-file > label:after {
	color: #fff;
	content: "Upload";
	padding: 2.33rem 4.88rem;
	background-color: var(--ctaPrimaryColour);
	font-weight: var(--fontWeightBold);
}

.form .hs-fieldtype-file .input {
	display: none;
}

.form .hs-form-field {
	margin-bottom: 0rem;
	position: relative;
}

.form .hs-form-field .hs-error-msgs,
.form .hs_error_rollup .hs-error-msgs {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Per-field errors float under their own input so they never shift the form's layout. */
.form .hs-form-field .hs-error-msgs {
	position: absolute;
}

/* The rollup is a sibling sitting immediately before .hs_submit. Absolute positioning
   collapsed it to zero height, so its message painted on top of the submit button and
   swallowed the click. It stays in flow and pushes the button down instead. */
.form .hs_error_rollup .hs-error-msgs {
	margin-bottom: 1.2rem;
}

.form .hs_error_rollup .hs-error-msgs li label,
.form .hs-form-field .hs-error-msgs li label.hs-error-msg {
	color: red;
	font-size: 1.3rem;
}

.form .legal-consent-container {
	gap: 3.5rem;
	display: flex;
	flex-direction: column;
}

.form .hs-richtext,
.form .hs-richtext p {
	font-size: 1.5rem;
	color: #141517;
	letter-spacing: 0;
	line-height: 2.5rem;
	font-weight: 400;
}


.form .inputs-list {
	list-style: none;
	padding: 0;
}

.form .legal-consent-container .hs-form-booleancheckbox-display {
	display: flex;
	align-items: center;
	justify-content: start;
	position: relative;
/* 	flex-direction: row-reverse;
	justify-content: flex-end; */
}

/* Visually hidden, NOT display:none — the input has to stay focusable and present in
   the accessibility tree. The box you see is the span:before below. position:relative
   on the label keeps this anchored here so focusing it doesn't jump the page. */
.form .legal-consent-container .hs-form-booleancheckbox-display input[type=checkbox] {
	position: absolute;
	width: 0.1rem;
	height: 0.1rem;
	margin: 0;
	padding: 0;
	border: 0;
	opacity: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

.form .legal-consent-container .hs-form-booleancheckbox-display input[type=checkbox]:focus-visible + span:before {
	outline: 0.2rem solid #00A9F3;
	outline-offset: 0.2rem;
}

.form .legal-consent-container .hs-form-booleancheckbox-display span {
	gap: 1.2rem;
	margin: 0;
	display: flex;
	align-items: center;
	font-size: 1.5rem;
	color: #141517;
	letter-spacing: 0;
	line-height: 2.5rem;
	font-weight: 700;
}

.form .legal-consent-container .hs-form-booleancheckbox-display span:before {
	content: '';
	
	width: 2.3rem;
	min-width: 2.3rem;
	height: 2.3rem;
	display: block;
	border-radius: 0.5rem;
	border: 0.1rem solid #00A9F3;
}

.form .legal-consent-container .hs-form-booleancheckbox-display input[type=checkbox]:checked + span:before {
	background-position: center;
	background-repeat: no-repeat;
	background-image: url(https://144479753.fs1.hubspotusercontent-eu1.net/hubfs/144479753/raw_assets/public/entelect_corporate/images/check.svg);
}





.form.subscribe > h3 {
	font-size: 2rem;
	color: var(--white);
	text-transform: uppercase;
}

.form.subscribe input[type="email"] {
	background-color: transparent;
	border: 0.2rem solid var(--white);
}

.form.subscribe input[type="email"]::placeholder {
	color: var(--white);
}

.form.subscribe input[type="submit"] {
	border: none;
	outline: none;
	cursor: pointer;
	padding: 1rem 2rem;
	display: inline-flex;
	font-size: 1.2rem;
	font-weight: 700;
	text-transform: uppercase;
	color: var(--primaryColour);
	background-color: var(--white);
}


.form.subscribe-cta-form form {
	display: flex;
}

.form.subscribe-cta-form form fieldset.form-columns-2 {
	gap: 1rem;
	grid-template-columns: 15ch 1fr;
}

.form.subscribe-cta-form form input[type=submit] {
	height: 4rem;
	outline: none;
	border: none;
	cursor: pointer;
	padding: 0 1.5rem;
	border-radius: 0;
	color: var(--white);
	background-color: var(--primaryColour);
}



.hs-search-field__bar.form form .hs-search-field__input {
	width: 100%;
	height: 5rem;
	max-width: 37rem;
	min-width: 37rem;
	font-size: 1.6rem;
    border-radius: 0.7rem;
	border: 0.2rem solid #141517;
}

.hs-search-field__bar.form form .hs-search-field__input::placeholder {
	color: #000;
	font-weight: 700;
}

.hs-search-field__bar.form form .search-icon {
	width: 2rem;
	height: 2rem;
	top: 0;
	bottom: 0;
	right: 2.3rem;
	margin: auto 0;
	position: absolute;
	background: none;
	border: none;
	outline: none;
	padding: 0;
	display: flex;
    align-items: center;
}

.hs-search-field__bar.form form .search-icon svg {
	width: 100%;
	max-width: 2rem;
}


.form .hs_submit.hs-submit .actions {
	display: flex;
	justify-content: start;
}
.card {
	background: var(--white);
	border: 0.1rem solid var(--cardBorderColour);
	box-shadow: 0.5rem 0.5rem 2.5rem 0.4rem rgba(22,27,48,0.05);
	border-radius: 0.7rem;
}

.container {
	width: 100%;
	margin: 0 auto;
	padding: 0 2rem;
	max-width: var(--containerWidth);
}

.cta-container {
	gap: 1.5rem;
	display: flex;
	align-items: center;
}

.cta-container.right {
	justify-content: end;
}

.cta-container.center {
	justify-content: center;
}

.cta-container.space-between {
	justify-content: space-between;
}

:root {
	--containerWidth: 144rem;
	--verticalSpacing: 8.0rem;
	--swiper-pagination-bottom: -3rem;
	--reveal-ease: cubic-bezier(0.38, 0.21, 0, 0.92);
	--reveal-duration: 0.6s;
	--reveal-shift: 4rem;
}

.no-scroll {
	overflow-y: hidden;
}

* {
	font-family: var(--primaryFont);
}

body {
	font-size: 1.6rem;
	/* Contain horizontal bleed via `clip` (NOT `hidden`) — `hidden` makes body a scroll container and
	   breaks `position: sticky` on iOS Safari (e.g. Story Highlights forced-scroll). Mirrors normalise.css. */
	overflow-x: clip;
}

/* ============================================================
   SCROLL REVEAL — staggered fade + slide-up (entrance on load + on scroll into
   view). Matches the Entelect Framer prototype: each element starts faded out and
   shifted DOWN by --reveal-shift, then fades to 1 and slides up to 0, eased with
   --reveal-ease. A [data-reveal-group] cascades its [data-reveal] descendants in
   40ms steps (the engine in scripts/main.js sets --reveal-delay). Above-the-fold
   groups (the hero) fire on load, so this is the entrance too. Per-element distance
   is tunable via --reveal-shift (Framer used 20–50px). Gated on html.reveal-ready
   (set in <head> before first paint, and only while JS is live) so content is never
   hidden without a way to appear; reduced-motion shows everything instantly.
   See scripts/main.js + templates/layouts/base.html.
   ============================================================ */
html.reveal-ready [data-reveal] {
	opacity: 0;
	transform: translateY(var(--reveal-shift, 4rem));
}

html.reveal-ready [data-reveal].is-revealed {
	opacity: 1;
	transform: translateY(0);
	transition: opacity var(--reveal-duration) var(--reveal-ease),
		transform var(--reveal-duration) var(--reveal-ease);
	transition-delay: var(--reveal-delay, 0ms);
}

/* Slide-in-from-the-left variant — data-reveal="slide-left" slides an element in horizontally
   (translateX instead of the default translateY) while fading in; used for the stories-listing
   filter tabs (grouped → one-by-one). Placed BEFORE the reduced-motion query so that query resets
   the transform under reduced-motion (equal specificity, later rule wins for the start state). */
html.reveal-ready [data-reveal="slide-left"] {
	transform: translateX(calc(-1 * var(--reveal-shift, 4rem)));
}
html.reveal-ready [data-reveal="slide-left"].is-revealed {
	transform: translateX(0);
}

@media (prefers-reduced-motion: reduce) {
	html.reveal-ready [data-reveal] {
		opacity: 1;
		transform: none;
		transition: none;
	}
}

/* Fade-only reveal (no slide) — put data-reveal="fade" on any element to fade it in where it is. */
html.reveal-ready [data-reveal="fade"],
html.reveal-ready [data-reveal="fade"].is-revealed {
	transform: none;
}

/* Slide-only reveal (no fade) — put data-reveal="slide" on an element to slide it up while staying
   fully opaque (used for buttons). */
html.reveal-ready [data-reveal="slide"] {
	opacity: 1;
}

/* Line-by-line reveal for [data-reveal-lines]: starts hidden (no flash of un-split text);
   the engine (scripts/main.js) splits it into .reveal-line clips, each holding a
   .reveal-line__inner that SLIDES UP from behind the clip (masked slide, no fade), staggered
   per line. padding/margin give descenders room inside the clip without changing line spacing. */
html.reveal-ready [data-reveal-lines] {
	opacity: 0;
}
html.reveal-ready [data-reveal-lines].is-split {
	opacity: 1;
}
.reveal-line {
	display: block;
	overflow: hidden;
	padding-bottom: 0.12em;
	margin-bottom: -0.12em;
}
.reveal-line__inner {
	display: block;
}
html.reveal-ready .reveal-line__inner[data-reveal] {
	opacity: 1;
	transform: translateY(115%);
}
html.reveal-ready .reveal-line__inner[data-reveal].is-revealed {
	transform: translateY(0);
}
@media (prefers-reduced-motion: reduce) {
	html.reveal-ready [data-reveal-lines] { opacity: 1; }
	html.reveal-ready .reveal-line__inner[data-reveal] { transform: none; }
}

/* Fade + slide variant ([data-reveal-lines="fade"], e.g. the hero body): each line slides up a
   little AND fades in (no clip), rather than the masked slide-up used for headings. */
[data-reveal-lines="fade"] .reveal-line {
	overflow: visible;
	padding-bottom: 0;
	margin-bottom: 0;
}
html.reveal-ready [data-reveal-lines="fade"] .reveal-line__inner[data-reveal] {
	opacity: 0;
	transform: translateY(1.5rem);
}
html.reveal-ready [data-reveal-lines="fade"] .reveal-line__inner[data-reveal].is-revealed {
	opacity: 1;
	transform: translateY(0);
}

/* ============================================================
   ORBS — reusable decorative glow layer, anchored to a module section.
   Driven by the "Orbs" field group (CONTENT tab) that any module can include;
   rendered as the first child of the section (see SKILL.md "Orbs group").
   The host section must be position:relative with its content above .orbs
   (e.g. .stats / .hero set their .container to z-index:1).
   NO overflow clip here — orbs intentionally BLEED beyond the module and overlap
   neighbouring sections/modules (one continuous ambient glow). For this to work the
   host section must also NOT set overflow:hidden (e.g. .hero delegates its background
   clipping to .hero__bg so .hero itself stays un-clipped). Horizontal bleed is
   contained by body{overflow-x:hidden}. Sits below content, never intercepts clicks.
   ============================================================ */
.orbs {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
}

/* Each orb is a soft radial-gradient circle; side/top/size/colour are set
   per-instance in the module's scope_css (see module.html). Orbs gently float
   in place — transform-only so it's GPU-composited (no layout/paint per frame);
   each is desynced so they drift independently, and motion is disabled under
   prefers-reduced-motion. */
.orb {
	position: absolute;
	animation: orb-float 22s ease-in-out infinite;
}

/* Desync each orb (varied speed + negative start offset) so they don't move in lockstep */
.orb:nth-child(2n) { animation-duration: 26s; animation-delay: -7s; }
.orb:nth-child(3n) { animation-duration: 30s; animation-delay: -14s; }
.orb:nth-child(4n) { animation-duration: 24s; animation-delay: -3s; }

@keyframes orb-float {
	0%   { transform: translate(0, 0); }
	20%  { transform: translate(3.2rem, -2.4rem); }
	40%  { transform: translate(-2.4rem, 2rem); }
	60%  { transform: translate(2rem, 3.2rem); }
	80%  { transform: translate(-3.2rem, -1.6rem); }
	100% { transform: translate(0, 0); }
}

@media (prefers-reduced-motion: reduce) {
	.orb { animation: none; }
}

/* ── Shimmer grid ──────────────────────────────────────────────────────────
   A faint dot matrix with a soft spotlight that brightens the dots near the cursor
   (the Framer "shimmer grid": framer.university/resources/shimmer-grid-component-in-framer,
   as used on the prototype's stats section). Reusable on any position:relative host whose
   content sits above z-index 0. Place `<div class="shimmer-grid" data-shimmer-grid>` as a
   direct child, OUTSIDE .container. Base dots are always visible; ::before is a brighter copy
   revealed only inside a radial spotlight at the cursor (--mx/--my set by scripts/main.js).
   Dot geometry matches Framer (0.6px dot on a 12px grid → 0.06rem / 1.2rem). */
.shimmer-grid {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	background-image: radial-gradient(color-mix(in srgb, var(--foundation-50) 6%, transparent) 0.06rem, transparent 0.14rem);
	background-size: 1.2rem 1.2rem;
	/* Fade the dots out at the top & bottom edges so the grid blends into the section. */
	-webkit-mask-image: linear-gradient(to bottom, transparent, black 18%, black 82%, transparent);
	mask-image: linear-gradient(to bottom, transparent, black 18%, black 82%, transparent);
}

.shimmer-grid::before {
	content: "";
	position: absolute;
	inset: 0;
	background-image: radial-gradient(color-mix(in srgb, var(--foundation-50) 55%, transparent) 0.06rem, transparent 0.14rem);
	background-size: 1.2rem 1.2rem;
	/* Reveal the bright dots only within a soft spotlight centred on the cursor. */
	-webkit-mask-image: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), black, transparent 22rem);
	mask-image: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), black, transparent 22rem);
	opacity: 0;
	transition: opacity 0.45s ease;
}

.shimmer-grid.is-active::before {
	opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
	.shimmer-grid::before { display: none; }
}



.menu-underlay {
	position: fixed;
	inset: 0;
	z-index: 1000;
	display: none;
	background-color: rgba(13, 18, 32, 0.6);
}

.mega-menu-container.menu-open .menu-underlay {
	display: block;
}

.mega-menu-container {
	--menu-bg: var(--signal-900); /* #062951 — overridable via the Background Colour field */
	--menu-text: var(--white);
	--menu-text-dim: var(--foundation-300);
	--menu-hairline: rgba(255, 255, 255, 0.12);
	--menu-hover: rgba(255, 255, 255, 0.06);
	position: relative;
	z-index: 1000;
	background-color: var(--menu-bg);
	color: var(--menu-text);
	font-family: var(--font-primary);
}

/* ---------- Transparent-over-hero nav (dark "industries" pages only) ----------
   The nav is fixed and transparent at the top of the page, gaining its
   background colour once scrolled (state class added by module.js). Scoped via
   :has() so the site's light pages keep their normal solid, in-flow bar. */
body:has(.home-page) .mega-menu-container,
body:has(.industries-page) .mega-menu-container,
body:has(.customer-story-page) .mega-menu-container,
body:has(.customer-stories-page) .mega-menu-container,
body:has(.what-we-do-page) .mega-menu-container,
body:has(.leadership-page) .mega-menu-container,
body:has(.about-page) .mega-menu-container,
body:has(.capabilities-page) .mega-menu-container,
body:has(.plain-page) .mega-menu-container,
body:has(.thank-you-page) .mega-menu-container,
body:has(.error-404-page) .mega-menu-container,
body:has(.error-500-page) .mega-menu-container,
body:has(.contact-page) .mega-menu-container {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	background-color: transparent;
	transition: background-color 0.3s ease, transform 0.35s ease;
}

/* Scrim behind the fixed nav — a ::before that fades top→bottom to transparent
   (NO solid fill, NO hard bottom edge). It extends below the bar so the fade lands
   under the links, keeping the white text readable. Revealed once scrolled and
   hidden again while the nav slides away. Scoped to the dark single-canvas pages
   only; light pages keep their normal solid, in-flow bar. */
body:has(.home-page) .mega-menu-container::before,
body:has(.industries-page) .mega-menu-container::before,
body:has(.customer-story-page) .mega-menu-container::before,
body:has(.customer-stories-page) .mega-menu-container::before,
body:has(.what-we-do-page) .mega-menu-container::before,
body:has(.leadership-page) .mega-menu-container::before,
body:has(.about-page) .mega-menu-container::before,
body:has(.capabilities-page) .mega-menu-container::before,
body:has(.plain-page) .mega-menu-container::before,
body:has(.thank-you-page) .mega-menu-container::before,
body:has(.error-404-page) .mega-menu-container::before,
body:has(.error-500-page) .mega-menu-container::before,
body:has(.contact-page) .mega-menu-container::before {
	content: "";
	position: absolute;
	inset: 0 0 auto 0;
	height: 200%;
	background: linear-gradient(to bottom, var(--menu-bg) 0%, var(--menu-bg) 25%, transparent 100%);
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.3s ease;
	z-index: -1;
}
body:has(.home-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.industries-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.customer-story-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.customer-stories-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.what-we-do-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.leadership-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.about-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.capabilities-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.plain-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.thank-you-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.error-404-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.error-500-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before,
body:has(.contact-page) .mega-menu-container.is-scrolled:not(.is-hidden)::before {
	opacity: 1;
}

/* Hide on scroll-down / show on scroll-up (headroom pattern). Dark fixed pages
   only — a light page's bar is in-flow and scrolls away naturally. */
body:has(.home-page) .mega-menu-container.is-hidden,
body:has(.industries-page) .mega-menu-container.is-hidden,
body:has(.customer-story-page) .mega-menu-container.is-hidden,
body:has(.customer-stories-page) .mega-menu-container.is-hidden,
body:has(.what-we-do-page) .mega-menu-container.is-hidden,
body:has(.leadership-page) .mega-menu-container.is-hidden,
body:has(.about-page) .mega-menu-container.is-hidden,
body:has(.capabilities-page) .mega-menu-container.is-hidden,
body:has(.plain-page) .mega-menu-container.is-hidden,
body:has(.thank-you-page) .mega-menu-container.is-hidden,
body:has(.error-404-page) .mega-menu-container.is-hidden,
body:has(.error-500-page) .mega-menu-container.is-hidden,
body:has(.contact-page) .mega-menu-container.is-hidden {
	transform: translateY(-100%);
}

/* An open dropdown / drawer needs a SOLID bar to connect with the panel below it
   (the scrolled state uses the gradient scrim above, not a solid fill). On light
   pages the bar is already solid navy via the base rule, so this is a no-op there. */
.mega-menu-container.has-open,
.mega-menu-container.menu-open {
	background-color: var(--menu-bg) !important;
}

/* Reset global list/paragraph spacing that would leak into the menu */
.mega-menu-container ul,
.mega-menu-container li {
	margin: 0;
	padding: 0;
	list-style: none;
	line-height: normal;
}

.mega-menu-container a {
	color: var(--menu-text);
	text-decoration: none;
}

.mega-menu-container .ico {
	flex-shrink: 0;
	display: block;
}

/* ---------- Nav bar ---------- */
/* .nav-bar is the positioned ancestor the full-width .dropdown anchors to
   (top:100%; left:0; width:100%). Do NOT add position:relative to .nav-item. */
.mega-menu-container .nav-bar {
	position: relative;
	padding: 1.6rem 0;
}

.mega-menu-container .nav-bar-inner {
	display: flex;
	align-items: center;
	gap: 2.4rem;
	height: 6.4rem;
}

.mega-menu-container .logo {
	display: inline-flex;
	align-items: center;
	flex-shrink: 0;
}

.mega-menu-container .logo img {
	display: block;
	width: auto;
	height: 3.2rem;
}

/* Breathing room between the logo and the nav links (matches the Figma logo
   block + gutter). Desktop only — reset in the drawer at ≤1024px below. */
.mega-menu-container .nav-bar-inner > .logo {
	margin-right: 5rem;
}

.mega-menu-container .nav-toggle {
	display: none;
	align-items: center;
	justify-content: center;
	width: 4rem;
	height: 4rem;
	margin-left: auto;
	padding: 0;
	color: var(--menu-text);
	background: none;
	border: 0;
	cursor: pointer;
}

.mega-menu-container .nav-toggle .ico {
	width: 2.4rem;
	height: 2.4rem;
}

/* ---------- Nav links row ---------- */
.mega-menu-container .nav-links {
	flex: 1;
	display: flex;
	align-items: center;
	gap: 2.4rem;
	min-width: 0;
}

.mega-menu-container .drawer-head {
	display: none;
}

.mega-menu-container .links {
	flex: 1;
	display: flex;
	align-items: center;
	min-width: 0;
}

.mega-menu-container .nav-item {
	display: flex;
	align-items: center;
}

.mega-menu-container .nav-link {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	height: 6.4rem;
	padding: 0 1.2rem;
	font-family: inherit;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightMedium);
	color: var(--menu-text);
	white-space: nowrap;
	background: none;
	border: 0;
	cursor: pointer;
	opacity: 1;
	transition: opacity 200ms ease;
}

.mega-menu-container .nav-link .ico-chevron {
	width: 2rem;
	height: 2rem;
	transition: transform 250ms ease;
}

.mega-menu-container .nav-link:hover {
	opacity: 1;
}

.mega-menu-container .nav-item.is-open > .nav-link .ico-chevron {
	transform: rotate(180deg);
}

/* ---------- CTA pill — right-aligned "Contact Us" (Figma 308:4453) ----------
   .links is flex:1 inside .nav-links, so this sits at the far right of the bar. */
.mega-menu-container .nav-cta {
	display: inline-flex;
	align-items: center;
	gap: 0.6rem;
	flex: none;
	padding: 0.9rem 1rem 0.9rem 1.8rem;
	border-radius: var(--radius-max);
	background: var(--neon-pulse-600);
	color: var(--foundation-950);
	font-family: inherit;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	white-space: nowrap;
	transition: background-color 200ms ease;
}

.mega-menu-container .nav-cta:hover {
	background: var(--neon-pulse-500);
	opacity: 1;
}

.mega-menu-container .nav-cta .ico-arrow {
	width: 2rem;
	height: 2rem;
	flex: none;
	transition: transform 200ms ease;
}

.mega-menu-container .nav-cta:hover .ico-arrow {
	transform: translateX(0.3rem);
}

/* Mobile drawer: full-width pill below the links */
@media (max-width: 1024px) {
	.mega-menu-container .nav-cta {
		width: 100%;
		justify-content: center;
		margin-top: 2rem;
		padding: 1.4rem 2rem;
	}
}

/* Dim every nav-bar control except the open one while a dropdown is active */
.mega-menu-container.has-open .nav-link,
.mega-menu-container.has-open .region-toggle {
	opacity: 0.5;
}

.mega-menu-container.has-open .nav-item.is-open > .nav-link,
.mega-menu-container.has-open .nav-link:hover,
.mega-menu-container.has-open .region-toggle:hover {
	opacity: 1;
}

/* ---------- Dropdown panel (full width) ---------- */
.mega-menu-container .dropdown {
	position: absolute;
	top: 100%;
	left: 0;
	width: 100%;
	z-index: 100;
	display: none;
	background-color: var(--menu-bg);
	box-shadow: var(--shadow-2xl);
}

/* Transparent hover bridge over the nav-bar's bottom padding so the cursor can
   travel from the nav link into the panel without the hover dropping. */
.mega-menu-container .dropdown::before {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 100%;
	height: 2rem;
}

.mega-menu-container .nav-item.is-open > .dropdown {
	display: block;
}

.mega-menu-container .dropdown-inner {
	padding-top: 4rem;
	padding-bottom: 8rem;
}

.mega-menu-container .dropdown-content {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	gap: 6.4rem 2.4rem;
}

.mega-menu-container .copy-header {
	grid-column: 2 / span 10;
	display: flex;
	flex-direction: column;
	gap: 1.3rem;
	max-width: 40rem;
}

.mega-menu-container .copy-header .title {
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--menu-text);
}

.mega-menu-container .copy-header .description {
	margin: 0;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightLight);
	color: var(--menu-text-dim);
}

/* ---------- Sections (level 2) + child column (level 3) ---------- */
.mega-menu-container .menus {
	position: relative;
	grid-column: 2 / span 10;
	display: flex;
}

.mega-menu-container .sections {
	flex: 0 0 50%;
	max-width: 50%;
	display: flex;
	flex-direction: column;
}

.mega-menu-container .section-link {
	display: flex;
	align-items: center;
	gap: 0.8rem;
	width: 100%;
	min-height: 7.2rem;
	padding: 0.6rem 0;
	font-family: inherit;
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightLight);
	color: var(--menu-text);
	text-align: left;
	background: none;
	border: 0;
	cursor: pointer;
	opacity: 0.85;
	transition: opacity 200ms ease;
}

.mega-menu-container .section-link:hover {
	opacity: 1;
}

/* When a child-bearing section is active, dim the other sections */
.mega-menu-container .menus.has-active .section-link {
	opacity: 0.5;
}

.mega-menu-container .menus.has-active .section.is-active > .section-link,
.mega-menu-container .menus.has-active .section-link:hover {
	opacity: 1;
}

.mega-menu-container .section-link .ico-chevron-right {
	width: 2.4rem;
	height: 2.4rem;
}

.mega-menu-container .section-link .ico-arrow {
	width: 2.4rem;
	height: 2.4rem;
	opacity: 0;
	transform: translateX(-0.4rem);
	transition: opacity 200ms ease, transform 200ms ease;
}

.mega-menu-container .section-link:hover .ico-arrow {
	opacity: 1;
	transform: translateX(0);
}

/* Child column (level 3) — revealed to the right of the sections list */
.mega-menu-container .section .children {
	position: absolute;
	top: 0;
	left: 50%;
	right: 0;
	display: none;
	max-height: 60vh;
	overflow-y: auto;
	padding-left: 2.4rem;
}

.mega-menu-container .section.is-active > .children {
	display: block;
}

.mega-menu-container .child-link {
	display: inline-flex;
	align-items: center;
	gap: 0.8rem;
	min-height: 5.2rem;
	padding: 0.4rem 0;
	font-size: 2rem;
	line-height: 2.6rem;
	font-weight: var(--fontWeightLight);
	color: var(--menu-text);
	opacity: 0.72;
	transition: opacity 200ms ease;
}

.mega-menu-container .child-link:hover {
	opacity: 1;
}

.mega-menu-container .child-link .ico-arrow {
	width: 2rem;
	height: 2rem;
	opacity: 0;
	transform: translateX(-0.4rem);
	transition: opacity 200ms ease, transform 200ms ease;
}

.mega-menu-container .child-link:hover .ico-arrow {
	opacity: 1;
	transform: translateX(0);
}

/* ---------- Region / country selector ---------- */
.mega-menu-container .region-selector {
	position: relative;
	flex-shrink: 0;
	margin-left: auto;
}

.mega-menu-container .region-toggle {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	height: 6.4rem;
	padding: 0 1.2rem;
	font-family: inherit;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightMedium);
	color: var(--menu-text);
	background: none;
	border: 0;
	cursor: pointer;
	opacity: 1;
	transition: opacity 200ms ease;
}

.mega-menu-container .region-toggle:hover {
	opacity: 1;
}

.mega-menu-container .region-toggle .flag,
.mega-menu-container .region-link .flag {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 1.6rem;
	height: 1.6rem;
	border-radius: 50%;
	overflow: hidden;
	flex-shrink: 0;
}

.mega-menu-container .region-toggle .flag img,
.mega-menu-container .region-link .flag img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.mega-menu-container .region-toggle .ico-chevron {
	width: 2rem;
	height: 2rem;
	transition: transform 250ms ease;
}

.mega-menu-container .region-selector.is-open .region-toggle .ico-chevron {
	transform: rotate(180deg);
}

.mega-menu-container .region-dropdown {
	position: absolute;
	top: 100%;
	right: 0;
	z-index: 100;
	display: none;
	min-width: 20rem;
	padding: 0.8rem 0;
	background-color: var(--menu-bg);
	border-radius: var(--radius-md);
	box-shadow: var(--shadow-xl);
}

.mega-menu-container .region-selector.is-open .region-dropdown {
	display: block;
}

.mega-menu-container .region-link {
	display: flex;
	align-items: center;
	gap: 1rem;
	padding: 1rem 1.6rem;
	font-size: var(--text-sm);
	color: var(--menu-text);
	opacity: 0.82;
	transition: opacity 200ms ease, background-color 200ms ease;
}

.mega-menu-container .region-link:hover {
	opacity: 1;
	background-color: var(--menu-hover);
}

/* ---------- Focus visibility (a11y) ---------- */
.mega-menu-container a:focus-visible,
.mega-menu-container button:focus-visible {
	outline: 0.2rem solid var(--menu-text);
	outline-offset: 0.2rem;
	border-radius: 0.2rem;
	opacity: 1;
}

/* Label-only items (no link, no dropdown) are not interactive */
.mega-menu-container span.nav-link,
.mega-menu-container span.section-link,
.mega-menu-container span.child-link {
	cursor: default;
}

/* ============================================================
   Tablet landscape and below — full-screen accordion drawer
   ============================================================ */
@media (max-width: 1024px) {
	.mega-menu-container .nav-toggle {
		display: inline-flex;
	}

	.mega-menu-container .nav-bar-inner > .logo {
		margin-right: 0;
	}

	.mega-menu-container .nav-links {
		position: fixed;
		inset: 0;
		z-index: 1001;
		width: 100%;
		height: 100dvh;
		flex-direction: column;
		align-items: stretch;
		gap: 0;
		padding: 2rem 2.4rem 4rem;
		overflow-y: auto;
		background-color: var(--menu-bg);
		visibility: hidden;
		transform: translateX(100%);
		transition: transform 280ms ease, visibility 280ms ease;
	}

	.mega-menu-container.menu-open .nav-links {
		visibility: visible;
		transform: translateX(0);
	}

	/* Sticky: .nav-links is the scrolling drawer and the head is a normal child of it,
	   so on a long menu the close button scrolled away with the rest of the content. */
	.mega-menu-container .drawer-head {
		position: sticky;
		top: 0;
		z-index: 1;
		display: flex;
		align-items: center;
		justify-content: space-between;
		height: 6.4rem;
		margin-bottom: 1.6rem;
		background-color: var(--menu-bg);
	}

	.mega-menu-container .nav-close {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 4rem;
		height: 4rem;
		padding: 0;
		color: var(--menu-text);
		background: none;
		border: 0;
		cursor: pointer;
	}

	.mega-menu-container .nav-close .ico {
		width: 2.4rem;
		height: 2.4rem;
	}

	.mega-menu-container .links {
		flex: none;
		flex-direction: column;
		align-items: stretch;
		width: 100%;
	}

	.mega-menu-container .nav-item {
		display: block;
		width: 100%;
	}

	.mega-menu-container .nav-link {
		display: flex;
		align-items: center;
		justify-content: space-between;
		width: 100%;
		height: auto;
		padding: 1.6rem 0;
		font-size: 1.8rem;
		line-height: 2.4rem;
		opacity: 1;
	}

	/* Accordion dimming on mobile */
	.mega-menu-container.has-open .links .nav-link {
		opacity: 0.45;
	}

	.mega-menu-container.has-open .nav-item.is-open > .nav-link {
		opacity: 1;
	}

	/* Dropdown becomes an in-flow accordion panel that SLIDES open/closed — grid-rows 0fr→1fr
	   animates to the real content height (no max-height magic number, no close-jank). visibility
	   flips (immediate on open, delayed until the slide finishes on close) so collapsed nav links
	   stay out of the tab order + a11y tree. */
	.mega-menu-container .dropdown {
		position: static;
		width: auto;
		background: none;
		box-shadow: none;
		display: grid;
		grid-template-rows: 0fr;
		visibility: hidden;
		transition: grid-template-rows 300ms ease, visibility 0s linear 300ms;
	}

	.mega-menu-container .dropdown::before {
		display: none;
	}

	.mega-menu-container .nav-item.is-open > .dropdown {
		/* keep it a grid so grid-template-rows animates. ⚠️ the DESKTOP base rule
		   `.nav-item.is-open > .dropdown { display:block }` (no media query → active here too, same
		   0,4,0 specificity) would otherwise win and make grid-template-rows inert = snap on open;
		   re-declaring display:grid here (later in source + matching MQ) beats it. */
		display: grid;
		grid-template-rows: 1fr;
		visibility: visible;
		transition: grid-template-rows 300ms ease, visibility 0s;
	}

	.mega-menu-container .dropdown-inner {
		max-width: none;
		overflow: hidden; /* clips the panel while the grid row collapses */
		min-height: 0;
		padding: 0 0 0 1.6rem;
	}
	/* bottom padding only when open, so it doesn't leak past the 0fr collapse */
	.mega-menu-container .nav-item.is-open > .dropdown .dropdown-inner {
		padding-bottom: 0.8rem;
	}

	.mega-menu-container .dropdown-content {
		display: block;
	}

	.mega-menu-container .copy-header {
		display: none;
	}

	.mega-menu-container .menus {
		position: static;
		display: block;
	}

	.mega-menu-container .sections {
		flex: none;
		max-width: none;
		width: 100%;
	}

	.mega-menu-container .section {
		width: 100%;
	}

	.mega-menu-container .section-link {
		justify-content: space-between;
		min-height: 0;
		padding: 1.2rem 0;
		font-size: 1.6rem;
		line-height: 2.2rem;
		letter-spacing: 0;
		opacity: 0.9;
	}

	/* Reuse the right-chevron as an accordion indicator on mobile */
	.mega-menu-container .section-link .ico-chevron-right {
		width: 2rem;
		height: 2rem;
		transform: rotate(90deg);
		transition: transform 250ms ease;
	}

	.mega-menu-container .section.is-active > .section-link .ico-chevron-right {
		transform: rotate(-90deg);
	}

	/* Leaf-section arrow stays visible at rest on touch (no hover) */
	.mega-menu-container .section-link .ico-arrow,
	.mega-menu-container .child-link .ico-arrow {
		display: none;
	}

	.mega-menu-container .section .children {
		position: static;
		max-height: none; /* reset the desktop level-3 column's max-height:60vh + overflow-y:auto */
		overflow: visible;
		padding-left: 1.6rem;
		/* Same accordion slide as the dropdown (level-3 child links). */
		display: grid;
		grid-template-rows: 0fr;
		visibility: hidden;
		transition: grid-template-rows 260ms ease, visibility 0s linear 260ms;
	}
	.mega-menu-container .section .children > ul {
		overflow: hidden; /* clips the child links while the row collapses */
		min-height: 0;
	}

	.mega-menu-container .section.is-active > .children {
		display: grid; /* beat the desktop base's `display:block` (see the dropdown note above) */
		grid-template-rows: 1fr;
		visibility: visible;
		transition: grid-template-rows 260ms ease, visibility 0s;
	}

	.mega-menu-container .child-link {
		min-height: 0;
		padding: 1rem 0;
		font-size: var(--text-sm);
		line-height: var(--leading-sm);
		opacity: 0.85;
	}

	/* Region selector pinned to the bottom of the drawer */
	.mega-menu-container .region-selector {
		margin-left: 0;
		margin-top: 2.4rem;
		padding-top: 2.4rem;
		border-top: 0.1rem solid var(--menu-hairline);
	}

	.mega-menu-container .region-toggle {
		height: auto;
		padding: 0.8rem 0;
		gap: 0.8rem;
	}

	.mega-menu-container .region-dropdown {
		position: static;
		display: none;
		min-width: 0;
		padding: 0.8rem 0 0;
		background: none;
		box-shadow: none;
		border-radius: 0;
	}

	.mega-menu-container .region-selector.is-open .region-dropdown {
		display: block;
	}

	.mega-menu-container .region-link {
		padding: 1rem 0;
	}
}

@media (max-width: 375px) {
	.mega-menu-container .nav-links {
		padding: 1.6rem 2rem 4rem;
	}
}

/* Respect the device's Reduce Motion setting — the drawer + accordions snap open/closed
   instead of sliding (consistent with the rest of the theme's reduced-motion handling).
   ⚠️ must also target the .is-open/.is-active selectors: those re-declare `transition` at a
   higher specificity, so a bare `.dropdown`/`.children` override would lose when open. */
@media (prefers-reduced-motion: reduce) {
	.mega-menu-container .nav-links,
	.mega-menu-container .dropdown,
	.mega-menu-container .nav-item.is-open > .dropdown,
	.mega-menu-container .section .children,
	.mega-menu-container .section.is-active > .children,
	.mega-menu-container .section-link .ico-chevron-right {
		transition: none;
	}
}



.form-banner {
/* 	padding-top: 12rem;
	padding-bottom: 12rem; */
}

.form-banner .container {
	gap: 3rem;
	display: grid;
	grid-template-columns: 1fr minmax(auto, 57rem);
}

@media (max-width: 991px) {
	.form-banner .container {
		grid-template-columns: 1fr;
	}
}

.hs-landing-page .form-banner .form {
	padding: 5rem 3rem;
	border-radius: 0.7rem;
	border: 0.1rem solid #E4E4E4;
	background-color: #FFFFFF;
	box-shadow: 0.5rem 0.5rem 2.5rem 0.4rem rgba(22,27,48,0.05);
}

@media (max-width: 991px) {
	.hs-landing-page .form-banner .form h3 br {
        display: none;
	}
}

























.content-banner {
/* 	padding: var(--verticalSpacing) 0;
	padding: 10rem 0 15rem; */
}

.content-banner .container {
	gap: 13rem;
	display: flex;
	align-items: center;
}

@media (max-width: 991px) {
	.content-banner .container {
		gap: 3rem;
	}
}

@media (max-width: 768px) {
	.content-banner .container {
		flex-direction: column-reverse;
	}
}

.content-banner .container.equal {
	gap: 3rem;
}

.content-banner .image {
	width: 100%;
	flex-grow: 1;
	flex-shrink: 0;
	padding-left: 6.5rem;
	max-width: 37rem;
}

@media (max-width: 991px) {
	.content-banner .image {
		padding-left: 0rem;
	}
}

.content-banner.reverse .image {
	padding-left: 0;
	padding-right: 6.5rem;
}

.content-banner .image img {	
	width: 100%;
}

.content-banner .container.equal .image {
	flex-basis: 50%;
	max-width: 100%;
	flex-shrink: 1;
}

.content-banner .content {
	flex-grow: 1;
	flex-shrink: 1;
}

.content-banner .container.equal .content {
	flex-basis: 50%;
	flex-shrink: 1;
}

.content-banner .content .inner-content {
	max-width: 59rem;
}

@media (max-width: 991px) {
	.content-banner .content .inner-content br {
        display: none;
	}
}

.content-banner .content .inner-content *:last-child {
	margin-bottom: 0;
}

.content-banner .content .inner-content.split ul {
	column-count: 2;
	column-gap: 3rem;
}

.content-banner .content .cta-container  {
	padding-top: 3.5rem;
}

.content-banner .content .inner-content .item-list {
	gap: 3rem;
	display: flex;
	flex-direction: column;
}

.content-banner .content .inner-content .item-list .list {
	gap: 1.5rem;
	display: flex;
	align-items: center;
}

.content-banner .content .inner-content .item-list .list .bullet {
	
	content: "";
	height: 4.5rem;
	min-width: 0.4rem;
	max-width: 0.4rem;
	background-color: var(--primaryColour);
}

.content-banner .content .inner-content .item-list .list span {
	display: block;
	padding: 0.8rem 0;
}










.content-banner.reverse .container {
	flex-direction: row-reverse;
}

@media (max-width: 768px) {
	.content-banner.reverse .container {
		flex-direction: column-reverse;
	}	
}






.content-banner.stacked .container {
	display: grid;
	justify-content: center;
}

.content-banner.stacked .container .image {
	grid-row: 1;
	display: flex;
	max-width: 100%;
	align-items: center;
	grid-column: 1 / -1;
	justify-content: center;
}

.content-banner.stacked .container .content {
	grid-row: 1;
	display: flex;
	grid-column: 1 / -1;
	flex-direction: column;
	justify-content: center;
}

.content-banner.stacked .container .content .inner-content {
	width: 100%;
	max-width: 80rem;
	text-align: center;
}

.content-banner.stacked .container .content .cta-container {
	justify-content: center;
}







































.media-container {
	padding: var(--verticalSpacing) 0;
}

.media-container .container {
	gap: 3rem;
	display: grid;
	align-items: center;
	grid-template-columns: repeat(2, 1fr);
}

@media (max-width: 991px) {
	.media-container .container {
		grid-template-columns: repeat(1, 1fr);
	}
}

.media-container .media iframe {
	border-radius: .7rem;
}




























.blog-preview {
	padding: var(--verticalSpacing) 0;
}

.blog-preview .container {
	gap: 3rem;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}

@media (max-width: 991px) {
	.blog-preview .container {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 480px) {
	.blog-preview .container {
		grid-template-columns: repeat(1, 1fr);
	}
}

.blog-preview .container .post {
	overflow: hidden;
	border-radius: .7rem;
	border: 0.1rem solid #E4E4E4;
	background-color: #FFFFFF;
}

.blog-preview .featured-image {
	margin-bottom: 2rem;
}

.blog-preview .featured-image img {
	width: 100%;
	object-fit: cover;
}

.blog-preview .post-content {
	padding: 0rem 2.5rem 2.5rem;
}

.blog-preview .post-content .tags {
	margin-bottom: 1rem;
}

.blog-preview .post-content .tags,
.blog-preview .post-content .tags a {
	outline: none;
	font-size: 1.6rem;
	font-weight: 600;
	text-decoration: none;
/* 	text-transform: uppercase; */
	color: #00A9F3;
}

.blog-preview .post-content .meta {
	margin-bottom: 4rem;
}

.blog-preview .post-content .meta time {
	margin-bottom: 1rem;
	display: inline-block;
}

.blog-preview .post-content .meta .read-time {
	color: #a9a9a9;
	margin-bottom: 1rem;
	display: inline-block;
}



.blog-preview .post.style-2 {
	overflow: hidden;
	border-radius: 1rem;
	background-color: #fff;
}

.blog-preview .post.style-2 .post-content {
	padding: 0 3rem 3rem;
}

.blog-preview .post.style-2 .cta-container {
	justify-content: end;
}





.blog-preview .post.style-3 .featured-image {
	overflow: hidden;
	border-radius: 1rem;
}

.blog-preview .post.style-3 .btn {
	border: none;
	padding: 0;
	align-items: center;
	color: var(--primaryColour);
	background-color: transparent;
}

.blog-preview .post.style-3 .btn:after {
	content: "";
	width: 2rem;
	height: 2rem;
	display: block;
	background-size: 2rem;
	transition: all 250ms ease;
	background-repeat: no-repeat;
	background-position-y: center;
	background-position-x: center;
	background-image: url('https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/chevron-forward-outline.svg');
}




.slider {
	padding: var(--verticalSpacing) 0;
}

.slider.logos .container .swiper-pagination-bullets.swiper-pagination-horizontal {
	--swiper-pagination-bottom: -5rem;
}

.slider .container {
	position: relative;
}

.slider .container .rich-text {
	margin-bottom: 6.5rem;
}

.slider .slide-content {
	align-items: center;
    display: flex;
    gap: 13rem;
}

.slider .slide-content .featured-image {
	flex-grow: 1;
	flex-shrink: 0;
	max-width: 37rem;
	width: 100%;
}

.slider .slide-content .content {
    flex-grow: 0;
    flex-shrink: 1;
}

.slider .slide-content .content *:last-child{
	margin-bottom: 0;
}

.slider .slide-content.reversed {
	flex-direction: row-reverse;
}


.slider.logos {
    
}

.slider.logos .slide-content .featured-image {
	display: flex;
	max-width: 100%;
	justify-content: center;
}











.call-to-action {
	
}

@media (max-width: 480px) {
	.call-to-action .container {
        padding: 0;
	}	
}

.call-to-action .container .inner-wrapper {
	gap: 3rem;
	display: flex;
	min-height: 27.5rem;
	align-items: center;
	padding: 10rem 12rem;
	background-repeat: no-repeat;
	background-color: var(--grey);
	justify-content: space-between;
	background-position-y: top, bottom;
	background-position-x: left, right;
	background-image: url(https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/CTA%20-%20Pattern%20-%20Left.svg), url(https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/CTA%20-%20Pattern%20-%20Right.svg);
}

@media (max-width: 991px) {
	.call-to-action .container .inner-wrapper {
		padding: 11.5rem 3rem;
	}
}

@media (max-width: 480px) {
	.call-to-action .container .inner-wrapper {
		flex-direction: column;
	}
}

.call-to-action .container .inner-wrapper.style-2 {
	background-image: url(https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/CTA%20-%20Blue%20Pattern%20-%20Left.svg), url(https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/CTA%20-%20Blue%20Pattern%20-%20Right.svg);
}

.call-to-action.newsletter .container .inner-wrapper {
	padding: 0;
	align-items: stretch;
}

.call-to-action.newsletter .container .inner-wrapper .content {
	padding: 6rem 5rem;
	max-width: 74rem;
}

.call-to-action.newsletter .container .inner-wrapper .content.newsletter-sign-up {
	display: flex;
	max-width: 100%;
	align-items: center;
	justify-content: space-between;
}

.call-to-action.newsletter .container .inner-wrapper .featured-image img {
	width: 100%;
	height: 100%;
	display: block;
	object-fit: cover;
}

.call-to-action .content {
	width: 100%;
	max-width: 57rem;
}

@media (max-width: 480px) {
	.call-to-action .content {
		text-align: center;
	}
}

.call-to-action .form .hs-form-field {
	margin-bottom: 0;
}

.call-to-action .form input[type=email] {
	height: 6.5rem;
	width: 25.5rem;
	border-top-right-radius: 0;
	border-bottom-right-radius: 0;
	border-top-left-radius: 0.5rem;
	border-bottom-left-radius: 0.5rem;
	border: 0.2rem solid var(--ctaPrimaryColour);
	background-color: #FFFFFF;
}

.call-to-action .form form input[type=submit] {
	width: 15.5rem;
	height: 6.5rem;
	font-weight: 700;
	font-size: 1.4rem;
	background-color: var(--ctaPrimaryColour);
	border-top-right-radius: 0.5rem;
	border-bottom-right-radius: 0.5rem;
}

















.pricing {
	
}

.pricing .container  {
	gap: 3rem;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}

@media (max-width: 480px) {
	.pricing .container  {
		grid-template-columns: repeat(1, 1fr);
	}
}

.pricing .price-column {
	display: flex;
	border-radius: .7rem;
	flex-direction: column;
	transition: transform 250ms ease;
	background-color: rgba(228,228,228,.6);
}

.pricing .price-column:hover {
	transform: translateY(-1rem);
}

.pricing .price-column .top {
	flex: 1;
	display: flex;
	background: #FFFFFF;
	padding-bottom: 4rem;
	flex-direction: column;
	border: 0.1rem solid #E4E4E4;
	border-radius: 0 0 0.7rem 0.7rem;
	background-position-y: bottom;
	background-position-x: right;
	background-repeat: no-repeat;
	background-size: 27rem;
	border-radius: .7rem;
	box-shadow: 0.5rem 0.5rem 2.5rem 0.4rem rgba(22,27,48,0.05);
	background-image: url('https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/CTA%20-%20Blue%20Pattern%20-%20Right.svg');
}

.pricing .price-column header {
	color: #fff;
	font-weight: 600;
	font-size: 3.0rem;
	letter-spacing: 0;
	line-height: 3.5rem;
	padding: 2.5rem 4rem;
	background-color: #00A9F3;
	border-radius: 0.7rem 0.7rem 0 0;
}

@media (max-width: 991px) {
	.pricing .price-column header {
		padding: 2.5rem 3rem;
	}
}

.pricing .price-column article {
	flex: 1;
	margin-bottom: 4rem;
}

.pricing .price-column .cta-container {
	padding: 0 4rem;
}

@media (max-width: 991px) {
	.pricing .price-column .cta-container {
		padding: 0 2.7rem;
	}	
}

.pricing .price-column .package-details {
	margin-bottom: 4rem;
	padding: 3.5rem 4rem 0;
}

@media (max-width: 991px) {
	.pricing .price-column .package-details {
		padding: 3.5rem 2.7rem 0;
	}
}

.pricing .price-column .pricing-container {
	padding: 0 4rem;
}

@media (max-width: 991px) {
	.pricing .price-column .pricing-container {
		padding: 0 2.7rem;
	}
}

.pricing .price-column .pricing-container .term {
	margin-bottom: 1rem;
}

.pricing .price-column .pricing-container .h1 {
	font-weight: 700;
}


.pricing .price-column .bottom {
	padding: 4rem;
	border-radius: 0.7rem;
}

@media (max-width: 991px) {
	.pricing .price-column .bottom {
		padding: 2.7rem;
	}
}

.pricing .price-column .features {
	gap: 3rem;
	display: flex;
	flex-direction: column;
}

.pricing .price-column .features span {
	gap: 1rem;
	display: flex;
	align-items: center;
}


















.contact-form {
	
}

.contact-form .container {
	max-width: 83rem;
}

























.blog-tags-container {
	margin-bottom: 7.5rem;
}

.blog-tags-container .container {
	display: flex;
	align-items: center;
	justify-content: space-between;
}

.blog-tags-container .tags {
	width: 100%;
	height: 5rem;
	display: flex;
	cursor: pointer;
	padding: 0 2.2rem;
	max-width: 27rem;
    border-radius: 0.7rem;
	position: relative;
	align-items: center;
	background-color: #00A9F3;
	justify-content: space-between;
}

.blog-tags-container .tags:after {
	content: "";
	width: 2rem;
	height: 2rem;
	display: block;
	background-position: center;
	background-repeat: no-repeat;
	transition: transform 250ms ease;
	transform: rotate(-90deg) translateX(0.5rem);
	background-image: url(https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/Arrow%20Down%20-%20White.svg);
}

.blog-tags-container .tags.open:after {
	transform: rotate(90deg) translateX(0.2rem);
}

.blog-tags-container .tags #initial-tag {
	font-size: 1.6rem;
	color: var(--white);
	font-weight: var(--fontWeightBold);
}

.blog-tags-container .tags .list {
	left: 0;
	top: 4.8rem;
	width: 100%;
/* 	display: flex; */
	display: none;
	overflow: hidden;
	position: absolute;
	border-radius: 0.7rem;
	flex-direction: column;
	border: 0.1rem solid #E4E4E4;
	background-color: var(--white);
}

.blog-tags-container .tags.open .list {
	display: flex;
}

.blog-tags-container .tags .list a {
	font-size: 1.6rem;
	padding: 1.3rem 2rem;
	text-decoration: none;
	color: var(--bodyColour);
}

.blog-tags-container .tags .list a:hover {
	background-color: #E4E4E4;
}












.recent-blogs-container {
	margin-bottom: 0rem;
}

.recent-blogs-container.related {
	padding: 10rem;
}

.recent-blogs-container .rich-text {
	margin-bottom: 6.7rem;
}

.recent-blogs-container .posts {
	gap: 3rem;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}

.recent-blogs-container .posts .post {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	border-radius: 0.7rem;
	border: 0.1rem solid #E4E4E4;
	background-color: var(--white);
}

.recent-blogs-container .posts .post:nth-child(1) {
	grid-column: 1 / 3;
	grid-row: 1 / 3;
}

.recent-blogs-container .posts .post:nth-child(1) .featured-image {
	max-height: 49.7rem;
}

.recent-blogs-container .posts .post:nth-child(1) .body .summary-container {
	justify-content: space-between;
}

.recent-blogs-container .posts .post:nth-child(1) .body .summary {
	display: flex;
}

.recent-blogs-container .posts.grid .post:nth-child(1) .body .summary {
	display: none;
}

.recent-blogs-container .posts .post:nth-child(1) .body .post-footer {
	display: flex;
	align-items: end;
	justify-content: space-between;
}

.recent-blogs-container .posts.grid .post:nth-child(1) .body .post-footer {
	display: block;
}

.recent-blogs-container .posts .post:nth-child(1) .body .post-footer .written-author {
	margin-bottom: 0;
}

.recent-blogs-container .posts.grid .post:nth-child(1) .body .post-footer .written-author {
	margin-bottom: 2rem;
}

.recent-blogs-container .posts .post:nth-child(2) {
	grid-column: 3 / -1;
}

.recent-blogs-container .posts .post:nth-child(3) {
	grid-column: 3 / -1;
}

.recent-blogs-container .posts.grid .post:nth-child(1) {
	grid-column: unset;
	grid-row: unset;
}

.recent-blogs-container .posts.grid .post:nth-child(2) {
	grid-column: unset;
}

.recent-blogs-container .posts.grid .post:nth-child(3) {
	grid-column: unset;
}

.recent-blogs-container .posts .post .post-container {
	flex: 1;
	display: flex;
	flex-direction: column;
}

.recent-blogs-container .posts .post .featured-image {
	flex: 1;
	display: flex;
	overflow: hidden;
	max-height: 24rem;
	min-height: 24rem;
	align-items: center;
	justify-content: center;
}

.recent-blogs-container .posts .post .featured-image a {
	display: block;
	width: 100%;
	height: 100%;
}

.recent-blogs-container .posts .post .featured-image img {
	display: block;
	height: 100%;
	width: 100%;
	object-fit: cover;
	object-position: center;
}

.recent-blogs-container .posts .post .body {
	flex: 1;
	display: flex;
	padding: 2.5rem;
	flex-direction: column;
}

.recent-blogs-container .posts .post .body .tag {
	font-size: 1.6rem;
	color: #00A9F3;
	letter-spacing: 0;
	line-height: 1.6rem;
	font-weight: 600;
	display: inline-block;
	text-decoration: none;
	margin-bottom: 2rem;
}

.recent-blogs-container .posts .post .body .blog-post-title {
	color: #161B30;
	letter-spacing: 0;
	line-height: 3rem;
	font-weight: 700;
}

.recent-blogs-container .posts .post .body .blog-post-title a {
	color: inherit;
	text-decoration: none;
}

.recent-blogs-container .posts .post .body .summary-container {
	flex: 1;
	display: flex;
	flex-direction: column;
	justify-content: end;
}

.recent-blogs-container .posts .post .body .summary {
	display: none;
	font-size: 1.6rem;
	color: #161B30;
	letter-spacing: 0;
	line-height: 2.5rem;
	font-weight: 400;
}

.recent-blogs-container .posts .post .body .summary-container .author {
	font-size: 1.6rem;
	color: #161B30;
	letter-spacing: 0;
	line-height: 2.5rem;
	font-weight: 600;
}















.recent-blogs-container .pagination {
    display: flex;
	gap: 0.5rem;
	justify-content: center;
	align-items: center;
	padding-top: 9rem;
}

.recent-blogs-container .pagination .page-number {
	color: #141517;
	font-size: 1.6rem;
	letter-spacing: 0;
	text-align: center;
	line-height: 2.5rem;
	font-weight: 400;
	text-decoration: none;
	padding: 0.5rem 1rem;
}

.recent-blogs-container .pagination .page-number.active {
    color: #00A9F3;
	font-weight: 700;
}

.recent-blogs-container .pagination .previous-posts {
	margin-right: 1rem;
}

.recent-blogs-container .pagination .next-posts {
	margin-left: 1rem;
}






























/* Testimonials slider — Entelect "Quote" design (Figma 195:5547): a dark glass card
   holding a single centred quote; becomes a 1-per-view slider when there's >1 testimonial.
   Field-driven bits (section bg, spacing, orb glows) live in the module's scope_css. */
.testimonial-slider {
	padding: var(--verticalSpacing) 0;
	color: var(--white);
}

.testimonial-slider__heading {
	margin-bottom: 6rem;
	text-align: center;
}

/* Glass card. overflow:hidden clips the orb glows to its rounded corners (per the design). */
.testimonial-slider__card {
	position: relative;
	overflow: hidden;
	border-radius: var(--radius-base);
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	background-color: rgba(255, 255, 255, 0.05);
	-webkit-backdrop-filter: blur(2.5rem);
	backdrop-filter: blur(2.5rem);
}

/* Full-width variant (Width = "Full width"; Figma 196:2100): the card drops its chrome and breaks
   out to the full viewport width so the glows become the section background and the quote centres
   edge-to-edge. The dual calc(50% - 50vw) margins expand the card to the viewport edges from inside
   .container (no fixed 100vw, so no scrollbar overflow); overflow:hidden (from the base rule) keeps
   the glows clipped to the screen. The quote stays capped + centred so lines don't get too long. */
.testimonial-slider.full .testimonial-slider__card {
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	border: 0;
	border-radius: 0;
	background-color: transparent;
	-webkit-backdrop-filter: none;
	backdrop-filter: none;
}

.testimonial-slider.full .testimonial {
	max-width: 106rem;
	margin-inline: auto;
}

/* Full-variant background (Figma 196:2100): unlike the contained card's four corner glows, the
   full-width design has ONE soft glow weighted to the lower-left — an olive→green→teal brightening
   of the bottom-left corner that eases to a faint blue lower-right and fades up into the navy
   (the design's blurred blob + diagonal olive/green/blue colour-blend). The card's corner glows +
   noise are hidden for this variant and replaced by this layered radial-gradient on the bg layer. */
.testimonial-slider.full .ts-glow,
.testimonial-slider.full .testimonial-slider__noise {
	display: none;
}

.testimonial-slider.full .testimonial-slider__bg {
	background:
		radial-gradient(100rem 78rem at 6% 122%, rgba(1, 142, 154, 0.50), transparent 58%),
		radial-gradient(74rem 62rem at 24% 120%, rgba(38, 139, 66, 0.38), transparent 56%),
		radial-gradient(58rem 50rem at -2% 104%, rgba(161, 191, 36, 0.22), transparent 52%),
		radial-gradient(120rem 84rem at 82% 128%, rgba(25, 131, 194, 0.20), transparent 64%);
}

/* BG layer — the design's four blurred glow ellipses (opacity baked into the SVGs) plus a
   noise overlay set to mix-blend-multiply (Figma "BG" group). Clipped by the card. */
.testimonial-slider__bg {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
}

.testimonial-slider .ts-glow {
	position: absolute;
	display: block;
	border-radius: 50%;
}

/* The design's four glows (Figma node colours: azure #1983C2 + teal #018E9A top-left,
   green #268B42 + teal #018E9A bottom-right) at ~50% opacity, anchored to the card corners. */
.testimonial-slider .ts-glow--tl-azure { left: -38rem; top: -58rem; width: 120rem; height: 120rem; background: radial-gradient(circle, rgba(25, 131, 194, 0.45) 0%, rgba(25, 131, 194, 0) 60%); }
.testimonial-slider .ts-glow--tl-teal  { left: -8rem;  top: -30rem; width: 80rem;  height: 80rem;  background: radial-gradient(circle, rgba(1, 142, 154, 0.5) 0%, rgba(1, 142, 154, 0) 62%); }
.testimonial-slider .ts-glow--br-green { right: -10rem; bottom: -34rem; width: 80rem; height: 80rem; background: radial-gradient(circle, rgba(38, 139, 66, 0.45) 0%, rgba(38, 139, 66, 0) 62%); }
.testimonial-slider .ts-glow--br-teal  { right: -42rem; bottom: -58rem; width: 120rem; height: 120rem; background: radial-gradient(circle, rgba(1, 142, 154, 0.45) 0%, rgba(1, 142, 154, 0) 60%); }

.testimonial-slider__noise {
	position: absolute;
	inset: 0;
	mix-blend-mode: multiply;
	opacity: 0.18;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
	background-size: 16rem 16rem;
}

/* ⚠️ `min-width: 0` + an explicit width are LOAD-BEARING, not tidying. Swiper writes its measured
   size onto every slide as an INLINE width; with the default `min-width: auto` those inline widths
   then feed back as the container's automatic minimum size, so one bad measurement is latched and
   amplified instead of corrected. On the homepage that produced a 33,554,432px slider (Chrome's max
   layout unit — i.e. "unbounded"): the quote ran off the page on mobile, and on desktop `overflow:
   hidden` hid it while Swiper's internal size stayed garbage, so the arrows couldn't advance the
   slides. A definite width breaks the feedback loop and lets `update()` recover. */
/* ⚠️ clip-path trims a 1px sliver off the right edge, and it is load-bearing. With slidesPerView:1
   and spaceBetween:0 the slide should exactly equal the container, but Swiper writes a ROUNDED
   pixel width while the 12-col grid resolves to a fractional one — measured 925px inside 925.344px.
   That 0.344px remainder puts the NEXT slide's leading edge inside the visible box on every load,
   a hairline of the following testimonial that reads as a faint vertical line on the dark canvas
   (client, 13 Aug: "one can see the next peeking through"). Present at 1200/1320/1440/1500/1536/
   1600/1680/1920 on the homepage, the only page whose slider holds more than one slide.
   ⚠️ Do NOT "fix" this by forcing the slide to width:100% — that removes the sliver at rest but
   Swiper keeps translating by its rounded value, so the offset ACCUMULATES with every navigation
   (measured 0.344px after one click, 0.688px after two, never resetting on loop). clip-path only
   affects painting, so every measurement Swiper takes is untouched and no drift is introduced.
   1px is safely inside the slide's 16.6% horizontal padding, so no content is ever clipped. */
.testimonial-slider .testimonial-swiper {
	position: relative;
	z-index: 1;
	width: 100%;
	min-width: 0;
	clip-path: inset(0 1px 0 0);
}

.testimonial-slider .testimonial-swiper .swiper-slide {
	min-width: 0;
}

.testimonial-slider .swiper-slide {
	height: auto;
	display: flex;
	box-sizing: border-box;
	padding: 9rem 16.6666%; /* mirrors the design's 2/12 spacers each side + generous vertical */
}

@media (max-width: 64rem) { /* 1024px */
	.testimonial-slider .swiper-slide { padding: 7rem 8%; }
}

@media (max-width: 48rem) { /* 768px */
	.testimonial-slider .swiper-slide { padding: 5rem 2.4rem; }
}

.testimonial {
	width: 100%;
	margin: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 6.4rem;
}

@media (max-width: 48rem) {
	.testimonial { gap: 4rem; }
}

.testimonial__mark {
	display: block;
	width: 6.2rem;
	height: auto;
	flex-shrink: 0;
	transform: rotate(180deg); /* matches the design's rotate-180 on the quote glyph */
}

.testimonial__quote {
	margin: 0;
	font-style: italic;
}

.testimonial__quote p {
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	font-weight: var(--fontWeightLight);
	font-style: italic;
	color: var(--foundation-200);
}

.testimonial__profile {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 1.2rem;
}

.testimonial__photo {
	width: 5.6rem;
	height: 5.6rem;
	flex-shrink: 0;
	overflow: hidden;
	border-radius: var(--radius-max);
	background-color: var(--white);
	border: 0.1rem solid rgba(255, 255, 255, 0.15);
}

.testimonial__photo img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Optional avatar link (per-testimonial profile_link, e.g. LinkedIn): the <a> fills the circle so
   the image sizing rules above still apply; subtle hover/focus cue signals it's clickable. */
.testimonial__photo-link {
	display: block;
	width: 100%;
	height: 100%;
	transition: opacity 0.2s ease;
}
.testimonial__photo-link:hover,
.testimonial__photo-link:focus-visible {
	opacity: 0.82;
}

.testimonial__person {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.4rem;
}

.testimonial__name {
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.testimonial__role {
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	color: var(--foundation-400);
}

.testimonial-slider__pagination {
	position: relative;
	margin-top: 3.2rem;
	text-align: center;
}

.testimonial-slider .swiper-pagination-bullet {
	background-color: var(--foundation-400);
	opacity: 0.4;
}

.testimonial-slider .swiper-pagination-bullet-active {
	background-color: var(--signal-teal-600);
	opacity: 1;
}













/* Feature List — Entelect "Where we operate" design (Figma 195:5548): dark section, left
   two-tone headline + olive tagline, right a vertical list of icon feature cards. Two glow
   orbs behind (Orbs group). Field-driven bg/spacing/orbs live in the module's scope_css. */
.feature-list {
	position: relative;
	color: var(--white);
}

.feature-list .container {
	position: relative;
	z-index: 1;
}

.feature-list__inner {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	column-gap: 2.4rem;
	align-items: start;
}

.feature-list__headline {
	grid-column: 1 / span 6;
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	position: sticky;
	top: 12rem; /* clears the fixed nav; sticks while the taller cards column scrolls past */
}

.feature-list__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.feature-list__heading h2,
.feature-list__heading .h2,
.feature-list__heading h1,
.feature-list__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.feature-list__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Cards column */
.feature-list__cards {
	grid-column: 7 / span 5;
	display: flex;
	flex-direction: column;
	gap: 7.2rem;
	padding-top: 5.6rem;
	max-width: 52rem; /* matches the design's text measure so descriptions wrap the same */
}

.feature-list__card-title,
.feature-list__card-text {
	overflow-wrap: break-word;
}

.feature-list__card {
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
}

.feature-list__icon {
	display: block;
	width: 3.2rem;
	height: 3.2rem;
}

.feature-list__icon img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: left center;
}

.feature-list__copy {
	display: flex;
	flex-direction: column;
	gap: 0.4rem;
}

.feature-list__card-title {
	margin: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.feature-list__card-text p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-600);
}

/* Tablet landscape — stack headline above the cards */
@media (max-width: 64rem) { /* 1024px */
	.feature-list__inner {
		display: flex;
		flex-direction: column;
		gap: 4.8rem;
	}
	.feature-list__headline {
		position: static;
		top: auto;
	}
	.feature-list__cards {
		padding-top: 0;
		gap: 5.6rem;
		max-width: none; /* full width once the layout stacks to one column */
	}
}

@media (max-width: 48rem) { /* 768px */
	.feature-list__cards { gap: 4.8rem; }
	/* --text-4xl never steps down (stays 48px) → too big on mobile; use the stepped --text-3xl (28px) */
	.feature-list__heading h2,
	.feature-list__heading .h2,
	.feature-list__heading h1,
	.feature-list__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
}

/* Customer Stories — Entelect design (Figma 195:5562): dark section, headline row (olive
   tagline + two-tone heading + white pill CTA), then a featured-wide card + two narrow cards,
   each a photo with a bottom gradient + brand logo, title and a "Read story" link. Orbs behind.
   Field-driven bg/spacing/orbs live in the module's scope_css. */
.customer-stories {
	position: relative;
	color: var(--white);
}

.customer-stories .container {
	position: relative;
	z-index: 1;
}

.customer-stories__inner {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

/* Headline row */
.customer-stories__head {
	display: flex;
	align-items: flex-end;
	gap: 2.4rem;
}

.customer-stories__headline {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.customer-stories__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.customer-stories__heading h2,
.customer-stories__heading .h2,
.customer-stories__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.customer-stories__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Pill CTA — translucent glass pill (white text + arrow) on the dark section, per the design */
.customer-stories__cta {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	gap: 0.8rem;
	padding: 0.9rem 1.2rem 0.9rem 2rem;
	border-radius: var(--radius-max);
	background-color: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	-webkit-backdrop-filter: blur(2rem);
	backdrop-filter: blur(2rem);
	color: var(--white);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	white-space: nowrap;
	transition: background-color 0.2s ease;
}

.customer-stories__cta:hover {
	background-color: rgba(255, 255, 255, 0.1);
}

.customer-stories__cta .customer-stories__arrow {
	width: 1.2rem;
	height: 1.2rem;
	color: var(--white);
}

.customer-stories__cta:hover .customer-stories__arrow {
	transform: translateX(0.3rem);
}

/* Cards grid: featured (span 2) + two narrow (span 1) on a 4-track grid */
.customer-stories__grid {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 2.4rem;
	align-items: start;
}

.customer-stories__card {
	grid-column: span 1;
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.customer-stories__card--featured {
	grid-column: span 2;
}

.customer-stories__media {
	position: relative;
	overflow: hidden;
	border-radius: 0.8rem;
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	aspect-ratio: 302 / 403;
	transition: box-shadow 0.3s ease, border-color 0.3s ease;
}

/* Hover glow — same teal border-glow as the expertise-cards cards, on the photo tile. */
.customer-stories__card:hover .customer-stories__media,
.customer-stories__card:focus-within .customer-stories__media {
	border-color: rgba(255, 255, 255, 0.16);
	box-shadow: 0 0 8rem rgba(1, 142, 154, 0.2);
}

.customer-stories__card--featured .customer-stories__media {
	aspect-ratio: 628 / 403;
}

.customer-stories__photo {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 0.5s cubic-bezier(0.38, 0.21, 0, 0.92);
}
/* Photo zoom on hover (client request, "Related Stories") — clipped by .__media overflow:hidden. */
.customer-stories__card:hover .customer-stories__photo,
.customer-stories__card:focus-within .customer-stories__photo {
	transform: scale(1.05);
}
@media (prefers-reduced-motion: reduce) {
	.customer-stories__photo { transition: none; }
	.customer-stories__card:hover .customer-stories__photo,
	.customer-stories__card:focus-within .customer-stories__photo { transform: none; }
}

.customer-stories__shade {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 50%;
	background: linear-gradient(to bottom, rgba(19, 25, 45, 0), rgba(19, 25, 45, 0.6));
	pointer-events: none;
}

.customer-stories__logo {
	position: absolute;
	left: 0;
	bottom: 0;
	display: flex;
	align-items: center;
	padding: 2rem;
}

/* Photo click-through. Visitors try the image before the text link (client, Revert 01) — the same
   feedback that produced .stories-listing__medialink on the index page, so this matches it.
   z-index 1 lifts it over the shade and the logo, both of which are decorative; the card’s hover
   states still fire because the anchor is inside the card. */
.customer-stories__medialink {
	position: absolute;
	inset: 0;
	z-index: 1;
}

.customer-stories__logo img {
	display: block;
	height: auto; /* width set inline per-logo (design dims); height follows the SVG aspect */
	max-width: 100%;
}

.customer-stories__copy {
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
}

.customer-stories__title {
	margin: 0;
	max-width: 35rem;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.customer-stories__link {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	color: var(--foundation-300); /* #bcc4d1 link label, per the design (arrow stays lime below) */
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightMedium);
	white-space: nowrap;
}

.customer-stories__link .customer-stories__arrow {
	width: 1.08rem;
	height: 1.08rem;
	color: #b4cc50; /* lime accent arrow, per the design */
	transition: transform 0.2s ease;
}

.customer-stories__link:hover .customer-stories__arrow {
	transform: translateX(0.3rem);
}

.customer-stories__arrow {
	display: block;
	flex-shrink: 0;
	transition: transform 0.2s ease;
}

/* Tablet landscape — featured full width, two narrow cards side by side */
@media (max-width: 64rem) { /* 1024px */
	.customer-stories__grid {
		grid-template-columns: repeat(2, 1fr);
	}
	.customer-stories__card--featured {
		grid-column: span 2;
	}
	.customer-stories__card--featured .customer-stories__media {
		aspect-ratio: 16 / 7;
	}
}

/* Mobile (Figma 195-5644): single-column stacked cards, smaller headline, and the pill CTA
   relocated to the bottom (full-width, centred). The head becomes display:contents so its
   children (headline + cta) join the inner flex column and can be reordered around the grid. */
@media (max-width: 48rem) { /* 768px */
	.customer-stories__inner {
		gap: 4.8rem;
	}
	.customer-stories__head {
		display: contents;
	}
	.customer-stories__headline {
		flex: none; /* in the column it must not grow vertically */
		width: 100%; /* display:contents drops the stretch — force full width so the heading wraps */
	}
	.customer-stories__heading h2,
	.customer-stories__heading .h2,
	.customer-stories__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.customer-stories__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}
	.customer-stories__cta {
		order: 1; /* after the cards */
		align-self: stretch; /* full width */
		justify-content: center;
		padding: 1.2rem 2rem;
	}
	.customer-stories__grid {
		grid-template-columns: 1fr;
		gap: 4.8rem; /* match the column rhythm — cards shouldn't bunch tighter than the headline/CTA gaps */
		order: 0;
	}
	.customer-stories__card,
	.customer-stories__card--featured {
		grid-column: span 1;
	}
	.customer-stories__media,
	.customer-stories__card--featured .customer-stories__media {
		aspect-ratio: 16 / 10;
	}
}

/* ── Equal layout variant (.customer-stories.equal) — Figma 196:2134 "Related Stories":
   four equal-width cards (no featured span-2), an all-white heading, and a mobile horizontal
   swipe carousel with a peeking next card. Without .equal the module keeps the featured-first
   industries layout (195:5562) unchanged. */
.customer-stories.equal .customer-stories__card,
.customer-stories.equal .customer-stories__card--featured {
	grid-column: span 1;
}
.customer-stories.equal .customer-stories__media,
.customer-stories.equal .customer-stories__card--featured .customer-stories__media {
	aspect-ratio: 302 / 403;
}
/* "Related Stories" heading is a single white colour (vs the featured default's grey + white-strong) */
.customer-stories.equal .customer-stories__heading h2,
.customer-stories.equal .customer-stories__heading .h2,
.customer-stories.equal .customer-stories__heading p {
	color: var(--white);
}

@media (max-width: 64rem) { /* 1024px — equal: 2×2 grid, no wide/letterbox featured card */
	.customer-stories.equal .customer-stories__grid {
		grid-template-columns: repeat(2, 1fr);
	}
	.customer-stories.equal .customer-stories__card--featured {
		grid-column: span 1;
	}
	.customer-stories.equal .customer-stories__card--featured .customer-stories__media {
		aspect-ratio: 302 / 403;
	}
}

@media (max-width: 48rem) { /* 768px — equal: horizontal swipe carousel with a peeking next card
	(the featured/default layout keeps its single-column stack above). CSS scroll-snap, no JS. */
	.customer-stories.equal .customer-stories__grid {
		display: flex;
		flex-wrap: nowrap;
		grid-template-columns: none;
		gap: 2.4rem;
		min-width: 0;
		margin: 0 -2rem; /* bleed to the section edges so the peek reaches the screen edge */
		padding: 0 2rem;
		overflow-x: auto;
		scroll-snap-type: x mandatory;
		scroll-padding-left: 2rem;
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none;
	}
	.customer-stories.equal .customer-stories__grid::-webkit-scrollbar {
		display: none;
	}
	.customer-stories.equal .customer-stories__card,
	.customer-stories.equal .customer-stories__card--featured {
		flex: 0 0 auto;
		width: 82%; /* ~18% of the next card peeks at the right edge, per the design */
		scroll-snap-align: start;
	}
	.customer-stories.equal .customer-stories__media,
	.customer-stories.equal .customer-stories__card--featured .customer-stories__media {
		aspect-ratio: 302 / 403; /* keep the portrait ratio while swiping (not the 16/10 stack ratio) */
	}
}

/* Partners — Entelect "Key Partnerships & Alliances" design (Figma 195:5563): dark section,
   centred headline (olive tagline + two-tone heading + intro), then a bordered 6-col logo grid
   of preloaded white partner SVGs. Two corner orbs behind. Field-driven bg/spacing/orbs in scope_css. */
.partners {
	position: relative;
	color: var(--white);
}

.partners .container {
	position: relative;
	z-index: 1;
}

.partners__inner {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 12rem;
}

.partners__headline {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 2.4rem;
	max-width: 72rem;
	text-align: center;
}

.partners__text {
	display: flex;
	flex-direction: column;
	gap: 2rem;
}

.partners__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.partners__heading h2,
.partners__heading .h2,
.partners__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.partners__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.partners__intro p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-600);
}

/* Logos — two layouts share the bordered .partners__grid frame; CSS toggles which shows at 48rem:
   • --placed (desktop/tablet): the position-based grid — the module renders ceil(logoCount / 6) × 6
     cells (one row for a 6-logo set, two rows for ~7–12), placed by "position"; empty positions render
     blank framed cells (so a row can centre/space). Right/bottom separators cleared on the last column
     (:nth-child(6n)) and last row (:nth-last-child(-n+6)) — works for a 1- or 2-row frame alike.
   • --stacked (mobile ≤48rem): the logos in UPLOADED order, packed into 2 columns with auto rows —
     no blank cells. Holds only real logo cells, so its nth-child border math needs no blank bookkeeping.
   Cells stay transparent so the orbs bleed through. Logos fade in on scroll via [data-reveal]. */
.partners__grid {
	width: 100%;
	border: 0.1rem solid #272e47;
	border-radius: 0.8rem;
	overflow: hidden;
}

/* Desktop/tablet: the position-based 6×2 frame. grid-auto-rows sizes each implicit row. */
.partners__grid--placed {
	display: grid;
	grid-template-columns: repeat(6, 1fr);
	grid-auto-rows: minmax(12rem, auto);
}
.partners__grid--placed .partners__cell:nth-child(6n) {
	border-right: 0; /* last column — the frame supplies the edge */
}
.partners__grid--placed .partners__cell:nth-last-child(-n+6) {
	border-bottom: 0; /* last row (cells 7–12) — the frame supplies the edge */
}

/* Mobile: logos in uploaded order, 2 columns, auto rows. Hidden until ≤48rem (shown in the media
   block below). Only real logo cells, so col-2 (:nth-child(2n)) and the last row (:nth-last-child(-n+2))
   clear cleanly regardless of how many logos there are. */
.partners__grid--stacked {
	display: none;
	grid-template-columns: repeat(2, 1fr);
	grid-auto-rows: minmax(10rem, auto);
}
.partners__grid--stacked .partners__cell:nth-child(2n) {
	border-right: 0; /* right column */
}
.partners__grid--stacked .partners__cell:nth-last-child(-n+2) {
	border-bottom: 0; /* last row */
}
/* ODD logo count: the last logo would otherwise sit alone with an empty slot beside it — span it
   across BOTH columns so it fills the row (its right border clears; the frame supplies the edge). */
.partners__grid--stacked .partners__cell:last-child:nth-child(odd) {
	grid-column: 1 / -1;
	border-right: 0;
}
/* …that spanning cell now forms its own final row, so the 2nd-to-last cell is no longer in the
   last row → restore its bottom separator (the -n+2 rule above had cleared it for the even case). */
.partners__grid--stacked:has(.partners__cell:last-child:nth-child(odd)) .partners__cell:nth-last-child(2) {
	border-bottom: 0.1rem solid #272e47;
}

.partners__cell {
	display: flex;
	align-items: center;
	justify-content: center;
	min-width: 0; /* let the logo's max-width:100% govern — stops wide wordmark SVGs from
	                 forcing the 1fr tracks past the viewport (grid min-width:auto blowout) */
	padding: 2rem;
	border-right: 0.1rem solid #272e47;
	border-bottom: 0.1rem solid #272e47;
}

.partners__logo {
	display: block;
	width: var(--pw); /* intrinsic design width set inline */
	max-width: 100%;
	max-height: 100%;
}

/* Cycling marquee variant (module.animate_logos) — mirrors the hero "Our customers" columns:
   N independent VERTICAL Swipers (one logo visible per column) cycling the logo set, advanced in
   sync by a master timer (inline module JS). The whole frame fades + slides in on scroll (data-reveal
   on the grid), then cycles. Opt-in, so the static industries grids are untouched. The partner SVGs
   are already white, so no brightness/invert filter (unlike the hero's black client logos). */
.partners__grid--cycling {
	display: grid;
	grid-template-columns: repeat(6, 1fr);
	grid-auto-rows: 12rem;
}
.partners__col {
	width: 100%;
	height: 12rem;
	min-width: 0;
	overflow: hidden; /* the vertical Swiper shows one slot; this clips the others */
	border-right: 0.1rem solid #272e47;
}
.partners__grid--cycling .partners__col:nth-child(6n) {
	border-right: 0; /* last column — the frame supplies the edge */
}
.partners__slot {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 12rem;
	padding: 2rem;
	min-width: 0;
}

/* Tablet landscape — keep 6 columns (logos scale down via max-width); just tighten the vertical rhythm. */
@media (max-width: 64rem) { /* 1024px */
	.partners__inner {
		gap: 8rem;
	}
}

/* Mobile (≤768px) — swap the position frame for the uploaded-order 2-column stack (auto rows). */
@media (max-width: 48rem) { /* 768px */
	.partners__inner {
		gap: 6rem;
	}
	.partners__headline {
		gap: 1.2rem;
	}
	.partners__text {
		gap: 1.2rem;
	}
	.partners__heading h2,
	.partners__heading .h2,
	.partners__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.partners__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}
	.partners__grid--placed {
		display: none;
	}
	.partners__grid--stacked {
		display: grid;
	}
	.partners__cell {
		padding: 1.6rem;
	}
	/* Cycling variant: 6 → 3 columns (two rows of 3), like the hero customers on mobile. */
	.partners__grid--cycling {
		grid-template-columns: repeat(3, 1fr);
	}
	.partners__grid--cycling .partners__col:nth-child(6n) {
		border-right: 0.1rem solid #272e47; /* undo the desktop last-col clear */
	}
	.partners__grid--cycling .partners__col:nth-child(3n) {
		border-right: 0; /* 3-col: clear the 3rd + 6th */
	}
	.partners__grid--cycling .partners__col:nth-child(-n+3) {
		border-bottom: 0.1rem solid #272e47; /* divider between the two rows */
	}
}

.section-intro {

}

.section-intro .container {
	max-width: 76.8rem;
}





















.timeline {
	
}

.timeline .thumbs {
	width: 100%;
	max-width: 97rem;
}

.timeline .thumbs .swiper-button-next,
.timeline .thumbs .swiper-button-prev {
	top: unset;
	bottom: 2rem;
	margin-top: 0;
}

@media (max-width: 991px) {
	.timeline .thumbs .swiper-button-next,
	.timeline .thumbs .swiper-button-prev {
		display: none;
	}
}

.timeline .thumbs .swiper-button-next:after,
.timeline .thumbs .swiper-button-prev:after {
	display: none;
}

.timeline .thumbs .swiper-button-next.swiper-button-disabled,
.timeline .thumbs .swiper-button-prev.swiper-button-disabled {
	pointer-events: unset;
	cursor: pointer;
    opacity: 1;
}

.timeline .thumbs:after {
	content: "";
	width: 100%;
	max-width: 80rem;
	height: 0.2rem;
	bottom: 4rem;
	left: 0;
	right: 0;
	margin: auto;
	display: block;
	position: absolute;
	background-color: #141517;
}

@media (max-width: 991px) {
	.timeline .thumbs:after {
		max-width: 64.5rem;
	}
}

.timeline .thumbs .swiper-slide {
	display: flex;
	align-items: center;
	flex-direction: column;
	justify-content: center;
}

.timeline .thumbs .swiper-slide .text {
	width: 100%;
	text-align: center;
	margin-bottom: 4rem;
}

@media (max-width: 991px) {
	.timeline .thumbs .swiper-slide .text {
        font-size: .888rem;
	}
}


.timeline .thumbs .swiper-slide:after {
	content: "";
	display: block;
	width: 8rem;
	height: 8rem;
	max-width: 8rem;
	border-radius: 50%;
	background-color: #00A9F3;
}

@media (max-width: 991px) {
	.timeline .thumbs .swiper-slide:after {
		width: 3rem;
		height: 3rem;
		max-width: 3rem;
		top: -2.5rem;
		position: relative;
	}
}

.timeline .thumbs .swiper-slide.swiper-slide-thumb-active:after {
	background-color: #141517;
}

.timeline .content-slider .swiper-slide {
	padding: 6.5rem 10rem 3rem;
}

@media (max-width: 991px) {
	.timeline .content-slider .swiper-slide {
		padding: 6.5rem 2.5rem 3rem;
	}	
}

.timeline .swiper-slide .card {
	display: flex;
	align-items: center;
	border-radius: 0.7rem;
	background-color: #FFFFFF;
	border: 0.1rem solid #E4E4E4;
	padding: 4rem 4rem 4rem 5.5rem;
	box-shadow: .5rem .5rem 2.5rem .4rem rgba(22,27,48,0.05);
}

@media (max-width: 480px) {
	.timeline .swiper-slide .card {
		gap: 3rem;
		flex-direction: column;
		padding: 3rem 3rem 3rem;
	}
}

.timeline .swiper-slide .card .featured-image {
	width: 100%;
	max-width: 36rem;
	overflow: hidden;
	border-radius: 0.7rem;
}

















/* =========================================================================
   STATS — "Industry depth" (Entelect dark design, Figma 195:5533)
   Dark section on the industries/banking canvas: a left-aligned two-tone
   headline + a 3-col (×2-row) grid of large light-weight stat figures.
   Section bg colour + spacing are field-driven inline (scope_css).
   ========================================================================= */
.stats {
	position: relative;
	color: var(--white);
	/* (Decorative glows now live in the global .orbs background layer.) */
}

.stats .container {
	position: relative;
	z-index: 1;
}

.stats__inner {
	display: flex;
	flex-direction: column;
	gap: 12rem;
}

/* --- Headline (tagline + two-tone heading), constrained to ~5/12 cols --- */
.stats__headline {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	max-width: 52rem;
}

.stats__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.stats__heading {
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	font-weight: var(--fontWeightMedium);
	letter-spacing: var(--tracking-4xl);
	color: var(--foundation-400);
}

.stats__heading h1,
.stats__heading h2,
.stats__heading h3,
.stats__heading p {
	margin: 0;
	font-size: inherit;
	line-height: inherit;
	font-weight: inherit;
	letter-spacing: inherit;
	color: inherit;
}

/* Emphasised words render white (same medium weight, not bolder) */
.stats__heading strong,
.stats__heading b {
	font-weight: inherit;
	color: var(--white);
}

/* Optional intro paragraph under the heading (used by the About "spread" instance) */
.stats__intro {
	margin-top: 2.4rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}
.stats__intro p:last-child { margin-bottom: 0; }

/* --- Stats grid: 3 across, generous row gap --- */
.stats__grid {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	column-gap: 2.4rem;
	row-gap: 12rem;
}

.stats__stat {
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
}

.stats__number {
	margin: 0;
	font-size: var(--text-6xl);
	line-height: var(--leading-6xl);
	font-weight: var(--fontWeightLight);
	letter-spacing: var(--tracking-6xl);
	color: var(--white);
	/* Equal digit widths so the figure doesn't jitter horizontally while counting up. */
	font-variant-numeric: tabular-nums;
}

.stats__label {
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

.stats__label p {
	margin: 0;
	font-size: inherit;
	line-height: inherit;
	font-weight: inherit;
	color: inherit;
}

/* Optional detail list under a stat's label (see item.detail in the module). One step down in size
   and dimmer than the label, so it reads as a breakdown of the figure rather than competing with it.
   Bulleted or plain lists both work; list markers are dropped in favour of a hairline-free stack. */
.stats__detail {
	margin-top: 1.2rem;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-500);
}

.stats__detail ul,
.stats__detail ol {
	margin: 0;
	padding: 0;
	list-style: none;
}

.stats__detail li,
.stats__detail p {
	margin: 0 0 0.4rem;
	font-size: inherit;
	line-height: inherit;
	font-weight: inherit;
	color: inherit;
}

.stats__detail li:last-child,
.stats__detail p:last-child {
	margin-bottom: 0;
}

/* Inline emphasis inside a label (e.g. "Retail, Business and Corporate") */
.stats__label strong,
.stats__label b {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* --- Tablet landscape (≤1024px = 64rem; MQ rem uses the 16px root) ---
   Type sizes come from the responsive type tokens (they step down at
   1024/768 automatically); only layout changes here. */
@media (max-width: 64rem) {
	.stats__inner {
		gap: 8rem;
	}
	.stats__headline {
		max-width: none;
	}
	.stats__grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		row-gap: 8rem;
	}
}

/* --- Mobile (≤768px = 48rem; values per Figma 195:5615 @375) ---
   Tagline steps sm→xs, heading 4xl→3xl, label base→sm; the figure stays on
   --text-6xl (which auto-shrinks to 4.4rem at this breakpoint). Spacing in rem. */
@media (max-width: 48rem) {
	.stats__inner {
		gap: 6.4rem;
	}
	.stats__headline {
		gap: 1.2rem;
	}
	.stats__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}
	.stats__heading {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
		/* Mobile design renders the whole heading white (no grey lead-in) */
		color: var(--white);
	}
	.stats__grid {
		column-gap: 1.6rem;
		row-gap: 6.4rem;
	}
	.stats__stat {
		gap: 1.2rem;
	}
	.stats__label {
		font-size: var(--text-sm);
		line-height: var(--leading-sm);
	}
}











.cards-grid {
	
}

.cards-grid .rich-text-editor {
	grid-column: 1 / -1;
	margin-bottom: 0.5rem;
}

.cards-grid .card .cta-container {
	padding-top: 5rem;
}

.cards-grid .container {
	gap: 3rem;
}

.cards-grid.three-column .container {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}

@media (max-width: 991px) {
	.cards-grid.three-column .container {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 480px) {
	.cards-grid.three-column .container {
		grid-template-columns: repeat(1, 1fr);
	}
}

.cards-grid.two-column .container {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
}

@media (max-width: 480px) {
	.cards-grid.two-column .container {
		grid-template-columns: repeat(1, 1fr);
	}
}

.cards-grid.style-3 .container {
	row-gap: 6rem;
}

.cards-grid .card {
	display: flex;
	padding: 4rem 4rem;
	flex-direction: column;
	background-position-x: right;
	background-repeat: no-repeat;
	background-position-y: bottom;
	transition: background-color 250ms ease;
}

.cards-grid.style-2 .card {
	border: none;
	padding: 0rem 0;
	box-shadow: none;
	background-color: transparent;
}

.cards-grid .card:hover {
	background-color: #00A9F3;
	border: 0.1rem solid transparent;
	box-shadow: 0.5rem 0.5rem 2.5rem 0.4rem rgba(0,169,243,0.25);
	background-image: url('https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/Service%20-%20Blue%20-%20Pattern%20%281%29.svg');
}

.cards-grid.style-2 .card:hover {
	border: none;
	box-shadow: none;
	background-image: none;
	background-color: transparent;
}

.cards-grid.style-3 .card {
	gap: 2.3rem;
	padding: 0;
	display: grid;
	box-shadow: none;
	border: none;
	background-color: transparent;
	grid-template-columns: 8rem 1fr;
}

.cards-grid.style-3 .card .card-body {
	margin-bottom: 0;
}

.cards-grid.style-3 .card:hover {
	background-image: none;
}

.cards-grid.style-3 .card:hover .card-body > * {
	color: inherit;
}


.cards-grid.style-4 .card {
	background-size: 26.0rem;
	background-image: url('https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/CTA%20-%20Blue%20Pattern%20-%20Right.svg');
}


.cards-grid .card .icon {
	margin-bottom: 3.5rem;
}

.cards-grid .card .icon img.hover-icon {
	display: none;
}

.cards-grid .card:hover .icon img {
	display: none;
}

.cards-grid .card:hover .icon img.hover-icon {
	display: inline-block;
}

.cards-grid.style-2 .card .icon {
	margin-bottom: 4.5rem;
}

.cards-grid .card .card-body {
	flex: 1;
/* 	margin-bottom: 8rem; */
}

.cards-grid.style-2 .card .card-body {
	margin: 0;
}

.cards-grid .card:hover .card-body > * {
	color: var(--white);
}

.cards-grid.style-2 .card:hover .card-body > * {
	color: inherit;
}

.cards-grid .card:hover .btn.link {
	color: var(--white);
}

.cards-grid .card:hover .btn.link:before {
	background-color: var(--white);
}

.cards-grid .card:hover .btn.link:after {
	content: "";
	width: 1rem;
	height: 1rem;
	display: block;
	background-repeat: no-repeat;
	background-image: url('https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/Learn%20More%20Arrow%20-%20White.svg');
}












.icon-columns {
	
}

.icon-columns .container {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
}

@media (max-width: 480px) {
	.icon-columns .container {
		gap: 3rem;
		grid-template-columns: repeat(2, 1fr);
	}
}

.icon-columns .column {
	display: flex;
	flex-direction: column;
	align-items: center;
/* 	justify-content: center; */
}

.icon-columns .column .icon {
	margin-bottom: 2.5rem;
}











.teams {
		
}

.teams .teams-filters {
	gap: 3rem;
	display: flex;
	margin-bottom: 6.5rem;
	justify-content: center;
}

@media (max-width: 991px) {
	.teams .teams-filters {
		overflow-x: scroll;
		justify-content: start;
	}
}

.teams .members {
	gap: 2rem;
    display: grid;
	grid-template-columns: repeat(3, 1fr);
}

@media (max-width: 991px) {
	.teams .members {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 480px) {
	.teams .members {
		grid-template-columns: repeat(1, 1fr);
	}
}

.teams .members .member {
	padding: 1.5rem;
	cursor: pointer;
    border-radius: 2rem;
	border: 0.1rem solid #f7f7f7;
	transition: background-color 250ms ease;
}

.teams .members .description {
	grid-column: 1 / -1;
    border-radius: 0.7rem;
	padding: 5.5rem 7rem;
	background-color: #E4E4E4;
	position: relative;
}

.teams .members .description .close {
	top: 2rem;
	right: 2rem;
	width: 3rem;
	height: 3rem;
	border: none;
	z-index: 1001;
	outline: none;
	cursor: pointer;
	position: absolute;
	background-color: transparent;
	background-image: url(https://20155276.fs1.hubspotusercontent-na1.net/hubfs/20155276/Close%20Button.svg);
}

.teams .members .member:hover,
.teams .members .member.active {
	background-color: #E4E4E4;
}

.teams .members .member .member-image {
	height: 31.6rem;
	overflow: hidden;
	border-radius: 0.7rem;
}

.teams .members .member .member-image img {
	width: 100%;
}

.teams .members .member .member-info {
	display: flex;
	padding: 1.5rem 0.5rem;
	justify-content: space-between;
}

.teams .members .member .member-info span {
	display: block;
}

.teams .members .member .member-info .chevron {
	width: max-content;
	display: inline-block;
	margin-top: 1rem;
	transition: transform 250ms ease;
}

.teams .members .member.active .member-info .chevron {
	transform: rotate(180deg);
}

.teams .members .member .member-info .title {
	font-size: 2.2rem;
	color: #141517;
	letter-spacing: 0;
	font-weight: 700;
	margin-bottom: 0;
}

















.blog-featured-image {
	padding-bottom: 11rem;
}

.blog-featured-image img {
	border-radius: 0.7rem;
}


.blog-post-content .container {
	display: grid;
	grid-template-columns: minmax(auto, 26.5rem) minmax(auto, 80rem) 1fr;
}

.blog-post-content .anchors ul {
	gap: 0.5rem;
	padding: 0;
	display: flex;
	align-items: start;
	flex-direction: column;
}

.blog-post-content .anchors ul a {
	gap: 1.2rem;
	display: inline-flex;
	align-items: center;
	opacity: 0.4;
	font-size: 1.4rem;
	color: #141517;
	letter-spacing: 0;
	line-height: 2.5rem;
	font-weight: 600;
	text-decoration: none;
}

.blog-post-content .anchors ul a:before {
	content: '';
	width: 0.8rem;
	height: 0.8rem;
	display: block;
	border-radius: 50%;
	background-color: #141517;
}

.blog-post-content .anchors ul a:hover:before {
	content: '';
	width: 1.2rem;
	height: 1.2rem;
	display: block;
	border-radius: 50%;
	background-color: #00A9F3;
}

.blog-post-content .anchors ul a:hover,
.blog-post-content .anchors ul a.active {
	opacity: 1;
	font-size: 1.6rem;
}

.blog-post-content .categories {
	display: flex;
	margin-bottom: 1rem;
}

.blog-post-content .categories .category {
	font-size: 1.6rem;
	color: #00A9F3;
	letter-spacing: 0;
	line-height: 3.253rem;
	text-decoration: none;
	font-weight: var(--fontWeightSemiBold);
}

.blog-post-content .content {
	padding-bottom: 5rem;
}

.blog-post-content .content h1 {
	font-size: 5.2rem;
	color: #141517;
	margin-bottom: 1.5rem;
	letter-spacing: 0;
	line-height: 6.5rem;
}

.blog-post-content .blog-details {
	gap: 1rem;
	display: flex;
	align-items: center;
	margin-bottom: 6.5rem;
}

.blog-post-content .blog-details a,
.blog-post-content .blog-details > span,
.blog-post-content .blog-details time {
	color: #141517;
	font-size: 2.0rem;
	text-decoration: none;
	font-weight: var(--fontWeightSemiBold);
}


.blog-post-content .blog-share {
	display: flex;
	flex-direction: column;
	align-items: center;
}

.blog-post-content .blog-share .line {
	width: 0.2rem;
	height: 3.5rem;
	margin-top: 1.8rem;
	margin-bottom: 2rem;
	display: inline-flex;
	background-color: #00A9F3;
}

.blog-post-content .blog-share a {
	display: inline-flex;
	margin-bottom: 1.4rem;
}

.blog-post-content .blog-share a:last-child {
	margin-bottom: 0;
}


.blog-post-content .blog-summary {
	padding: 7rem;
	margin-top: 5rem;
	margin-bottom: 6.5rem;
}




/* ============================================================
   Industries page — dark single canvas
   The whole page sits on one navy surface; modules are transparent.
   ============================================================ */
/* Contain the orbs' horizontal bleed site-wide (they cause sideways overflow on mobile). Applied to the
   global page wrapper — base.html's <main class="body-container-wrapper"> that wraps every page's body —
   so it covers all current and future pages with no per-page CSS. Must be `clip`, NOT `hidden`: `hidden`
   makes this a scroll container and breaks every `position: sticky` (nav, filter tabs, story-impact,
   story-highlights); `clip` clips without creating one. X-only, so overflow-y stays visible → the orbs
   still bleed vertically across sections. (The nav + footer sit OUTSIDE this <main>, so they're unaffected;
   body{overflow-x:hidden} doesn't catch the bleed — it propagates to the viewport but the absolutely
   positioned orbs aren't clipped at body level.) */
.body-container-wrapper {
	overflow-x: clip;
}

.industries-page,
.customer-story-page,
.customer-stories-page,
.what-we-do-page,
.leadership-page,
.about-page,
.capabilities-page,
.plain-page,
.contact-page,
.thank-you-page,
.error-404-page,
.error-500-page {
	background-color: var(--foundation-950);
}

/* Dark canvas: section module backgrounds are transparent so the page surface is CONTINUOUS and the
   orb glows bleed ACROSS section boundaries. Without this, each module paints its own opaque
   #0d1220 bg and the next section's box clips the previous section's orb bleed → hard cut-off.
   (Every section's own bg is #0d1220 = the canvas, so this is visually identical except the orbs
   now flow between sections.) !important overrides the field-driven background-color set in each
   module's scope_css. */
.customer-story-page section,
.customer-stories-page section,
.what-we-do-page section,
.leadership-page section,
.about-page section,
.capabilities-page section,
.plain-page section,
.contact-page section,
.thank-you-page section,
.error-404-page section,
.error-500-page section {
	background-color: transparent !important;
}


/* ============================================================
   Hero — modules/hero.module  (industry / banking landing hero)
   Full-bleed background photo fading into the navy canvas, a split
   headline (top-left) + copy & lime pill CTA (below-right), and a
   bordered "Our customers" logo grid. Figma 195:5507 / 195:5588.
   ============================================================ */
.hero {
	position: relative;
	color: var(--white);
	background-color: var(--foundation-950);
	/* No overflow:hidden here — so Orbs can bleed across sections. The background
	   photo's oversize/pan is clipped by .hero__bg (below) instead. */
}

/* Content sits above the background layer. Width + gutters come from the global .container. */
.hero .container {
	position: relative;
	z-index: 1;
}

/* --- Background photo + navy gradient fade --- */
.hero__bg {
	position: absolute;
	inset: 0;
	z-index: 0;
	overflow: hidden;
}

/* Background zoom-out entrance: the whole bg layer starts scaled up (Framer bg = scale(1.1))
   and settles to natural size as it fades in, driven by the [data-reveal] engine. Clipped by
   .hero__bg's overflow:hidden so it never spills into neighbouring sections; the showcase
   image keeps its own pan/scale transform (this scale is on the wrapper). Gated on
   html.reveal-ready so no-JS shows the bg normally. */
.hero__bg-inner {
	position: absolute;
	inset: 0;
}
html.reveal-ready .hero .hero__bg-inner[data-reveal] {
	transform: scale(1.2);
	transform-origin: center;
}
html.reveal-ready .hero .hero__bg-inner[data-reveal].is-revealed {
	transform: scale(1);
}

.hero__bg-img {
	position: absolute;
	top: -6rem;
	left: -6rem;
	width: calc(100% + 12rem);
	height: calc(100% + 12rem);
	max-width: none;  /* override normalise's `img,svg,video { max-width:100% }` — it would cap the oversize back to 100% and left-shift the image (off-centre) */
	max-height: none;
	object-fit: cover;
	object-position: center;
	/* flip + translate + scale (field-driven) are set inline via scope_css in module.html.
	   The symmetric 6rem oversize + object-position:center means 0/0/100% sits dead-centre;
	   the oversize gives translate room to pan without exposing an edge. */
}

.hero__bg-gradient {
	position: absolute;
	inset: 0;
	/* Fade the photo out toward the bottom so it dissolves into the navy canvas and blends
	   seamlessly into the section below — a stronger, smoother lower ramp that reaches solid
	   --foundation-950 by ~88% (leaving a solid navy band at the hero's foot). */
	background: linear-gradient(180deg,
		transparent 0%,
		color-mix(in srgb, var(--foundation-950) 55%, transparent) 50%,
		color-mix(in srgb, var(--foundation-950) 88%, transparent) 70%,
		var(--foundation-950) 88%);
}

/* --- Style 2 variant (Figma 308:4260): an abstract gradient background IMAGE
   (images/hero/style-2-bg.jpg — teal top-left, azure lower-right) + a dot-pattern
   overlay + a bottom fade into the canvas, and no "Our customers" logo strip.
   The .hero__bg colour is what shows BEFORE the art paints. --- */

/* ⚠️ FLAT NAVY, not a gradient. This used to carry teal/green/azure radial-gradients as a
   "load-time fallback", but .hero__bg-inner is a [data-reveal] element — it starts at opacity 0
   and fades in — so those gradients were visible through it on every single load, reading as a
   momentary DIFFERENT background before the real art appeared (client, 13 Aug: "the abstract
   images on the What We Do header take a second to load, and in that second you can see a
   different gradient"). Matching the canvas colour makes the pre-paint state invisible.
   Note this is the SHARED style-2 default; .leadership-page / .about-page / the system pages
   each override it below with a fallback matched to their own art. */
.hero.style-2 .hero__bg {
	background: var(--foundation-950);
}

/* Leadership hero uses its own glow art (green lower-left, teal right, blue lower-centre);
   match the pre-load fallback so there's no colour flash before the image paints. */
.leadership-page .hero.style-2 .hero__bg {
	background:
		radial-gradient(40% 45% at 20% 46%, color-mix(in srgb, var(--codebase-green-600) 30%, transparent), transparent 62%),
		radial-gradient(42% 55% at 92% 46%, color-mix(in srgb, var(--signal-teal-600) 30%, transparent), transparent 60%),
		radial-gradient(45% 45% at 48% 82%, color-mix(in srgb, var(--azure-600) 28%, transparent), transparent 62%),
		radial-gradient(30% 35% at 4% 4%, color-mix(in srgb, var(--azure-600) 16%, transparent), transparent 60%);
}

/* The abstract gradient art fills the hero background. */
.hero.style-2 .hero__bg-art {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	max-width: none;
	object-fit: cover;
	object-position: center top;
}

/* Style-2 dots are now the reusable `.shimmer-grid` (identical to the stats module) —
   fine dot matrix + cursor spotlight — placed as a direct child of the section in
   module.html (see the "Shimmer grid" block near the top of this file). This replaced the
   old coarse `.hero__dots` overlay 2026-07-16; the background image stays dot-free. */

.hero.style-2 .hero__bg::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 45%;
	background: linear-gradient(to bottom, transparent, var(--foundation-950));
	pointer-events: none;
}

.hero.style-2 .hero__customers {
	display: none;
}

/* --- Home variant (Figma 466:8387): looping background VIDEO colour-graded to the brand
   palette, shimmer-grid dots, dual pill CTAs, and a STATIC 6-across frosted logo grid.
   The video (or its poster fallback) cover-fills the hero; a mix-blend-mode:color gradient
   recolours it to the brand teal/azure/lime; the top fades from the canvas colour (so the
   nav area stays dark) and the bottom dissolves into --foundation-950 like the showcase. --- */
.hero.home .hero__video {
	position: absolute;
	/* TOP-anchored box, clipped below by .hero__bg. A taller box shifts the visible framing LOWER;
	   a shorter one lifts the bright footage UP toward the vertical middle (behind the copy /
	   customers) to match Figma 466:8387. Height is the single lever — tune to move it more/less. */
	top: 0;
	bottom: auto;
	left: 0;
	right: 0;
	width: 100%;
	height: 95%;
	max-width: none;
	object-fit: cover;
	object-position: center top;
}

/* The poster still sits UNDER the video (same box, same class) and paints immediately — it is the
   hero's LCP image. The video covers it once it starts, so the swap is invisible.
   ⚠️ NO z-index on either — the grade / top-fade / bottom-gradient overlays that follow them in the
   DOM are all z-index:auto, so ANY positive z-index here lifts the video ABOVE them: the
   mix-blend-mode:color grade stops tinting the footage (raw green particles show through) and the
   bottom fade disappears. Paint order is entirely DOM order; leave it that way. */

/* ⚠️ `pointer-events: none` was REMOVED from the video (it lived here until 2026-08-12) and must not
   come back. WebKit's own media-controls container declares `pointer-events: inherit`, so it made the
   start-playback button non-interactive while still fully visible — the client's "a play button which
   we cannot tap". The chrome itself is now prevented at source by omitting the `autoplay` attribute
   (see module.html), which is the only reliable lever.
   A CSS block targeting ::-webkit-media-controls / -start-playback-button / -overlay-play-button was
   removed at the same time: it never did anything. Those pseudo-elements are not in WebKit's selector
   registry (the overlay one is a Blink construct that never applied to Safari), and because a selector
   list is non-forgiving, the invalid members dropped the entire rule. Modern WebKit controls are a
   closed UA shadow root with no author-styleable surface — do not try to style them. */

/* The video is not playing (not yet started, refused, stalled, or Reduce Motion) — hide it so the
   poster underneath stands in. `opacity` rather than display/visibility is deliberate: those two DO
   make WebKit treat the element as invisible and refuse playback, whereas opacity is never consulted
   by its visibility gate, so the video can still start while hidden and be revealed once it moves. */
.hero.home.hero--video-blocked video.hero__video {
	opacity: 0;
}

/* Brand colour-grade (mix-blend-mode:color re-tints the footage without crushing luminance).
   AZURE/BLUE-dominant to match the design — a teal edge + navy corners, and NO lime/green
   stops (the earlier neon-pulse + codebase-green stops threw a harsh green band over the
   footage). Reduced opacity so the blue footage still reads through as a tint, not a recolor. */
.hero.home .hero__video-grade {
	position: absolute;
	inset: 0;
	pointer-events: none;
	mix-blend-mode: color;
	/* Higher opacity + PURE azure→deep-navy stops (the old teal stop = signal-teal-600 #018e9a is a
	   green-teal → it threw a green cast on the right; dropped it). mix-blend:color re-hues the
	   footage toward blue, and the higher opacity overrides more of the placeholder's green particles. */
	opacity: 0.9;
	background-image: linear-gradient(88deg,
		color-mix(in srgb, var(--azure-600) 72%, transparent) 0%,
		color-mix(in srgb, var(--azure-600) 80%, transparent) 55%,
		color-mix(in srgb, var(--signal-900) 82%, transparent) 100%);
}

/* Top fade — the video dissolves up into the hero's own background colour so the headline
   band + fixed nav sit on a calm dark field (the design masks the video below ~y=312). */
.hero.home .hero__video-top-fade {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 34%;
	pointer-events: none;
	background: linear-gradient(to bottom, #05091f 0%, rgba(5, 9, 31, 0.85) 40%, transparent 100%);
}

/* Bottom fade — reuse .hero__bg-gradient (446px ramp → foundation-950) sized like the design. */
.hero.home .hero__bg-gradient {
	top: auto;
	height: 44.6rem;
}

/* The static glass logo grid (replaces the .hero__logos slider on this variant): 6 columns,
   1px gaps (the canvas showing through draws the separators), rounded clip, frosted cells. */
.hero.home .hero__logo-grid {
	display: grid;
	grid-template-columns: repeat(6, minmax(0, 1fr));
	gap: 0.1rem;
	width: 100%;
	border-radius: 0.8rem;
	overflow: hidden;
}

.hero.home .hero__logo-cell {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 12rem;
	padding: 2rem;
	min-width: 0;
	/* frosted-glass blocks: slightly transparent + blurred so the background video shows through blurry */
	background-color: rgba(255, 255, 255, 0.05);
	backdrop-filter: blur(1.5rem);
	-webkit-backdrop-filter: blur(1.5rem);
}

/* Same per-logo sizing + white-silhouette treatment as the showcase slider. */
.hero.home .hero__grid-logo {
	max-width: 100%;
	max-height: 3.2rem;
	object-fit: contain;
	filter: brightness(0) invert(1);
}

/* Home dots: the design's "Pattern - Dots" sits at ~20% over the video — the shimmer grid's
   6% base (tuned for flat navy) disappears against the bright footage, so boost it here. */
.hero.home .shimmer-grid {
	background-image: radial-gradient(color-mix(in srgb, var(--foundation-50) 20%, transparent) 0.06rem, transparent 0.14rem);
	/* ⚠️ Clear the dots ABOVE the "Our customers" block so the logo strip is never veiled by them
	   (client 2026-08-04: "the dots overlay is on top of the logos — put the logos on top").
	   The global mask only starts fading at 82%, but the block starts at 71.7% and the marquee at
	   82.2%, so the strip sat in full dots. Worse, the glass cells' backdrop-filter SAMPLES this
	   layer, compositing the dot texture into every panel — which is why raising z-index wouldn't
	   have fixed it (the container is already z-index 1 above these dots at 0). Ending the layer at
	   70% keeps the dots over the video/headline, where the design wants them, and hands the strip
	   a clean canvas. Only the home variant renders a shimmer-grid over a logo strip — the showcase
	   (industry) hero has no dot layer at all, so this stays scoped here. */
	-webkit-mask-image: linear-gradient(to bottom, transparent, black 18%, black 55%, transparent 70%);
	mask-image: linear-gradient(to bottom, transparent, black 18%, black 55%, transparent 70%);
}

/* Home headline spans WIDE (Figma 466:8398 = cols 1-10, not the showcase's 6) so
   "AI-Accelerated Engineering." fits on one line and the headline reads as the design's
   wide 3-line block instead of a cramped 4-line wrap. */
.hero.home .hero__headline-col {
	grid-column: 1 / span 10;
}

/* Three lines, BALANCED — "AI-Accelerated Engineering." / "Global Delivery." / "Personal Focus."
   The original build matched Figma 466:8398's literal wrap ("Global Delivery. Personal" / "Focus."),
   but the client overrode it in the homepage feedback: "Is there anyway we can shrink the width of
   this box so that focus does not sit by itself on the last line?" text-wrap:balance solves the
   orphan for ANY copy they later type (a hard width cap only worked for today's wording); browsers
   without balance keep the old wrap, which is just the design's own line-breaking. */
.hero.home .hero__headline {
	max-width: 100rem;
}
.hero.home .hero__headline,
.hero.home .hero__headline h1,
.hero.home .hero__headline .h1,
.hero.home .hero__headline p {
	text-wrap: balance;
}

/* Home copy block sits LEFT, under the headline (Figma 466:8399: Body Copy = cols 1-6) —
   the showcase's right-column placement doesn't apply on this variant. */
.hero.home .hero__copy-col {
	grid-column: 1 / span 6;
	grid-row: 2;
	margin-top: 4.4rem; /* the design's 44px headline→copy gap */
}

/* Home customers block: no frosted full-bleed bar (the design's glass lives on the grid
   CELLS instead), tighter head→grid rhythm. */
.hero.home .hero__customers {
	padding: 0;
	gap: 4rem;
}

/* No full-bleed bar on this variant — the glass lives on the grid CELLS instead (frosted
   blocks: slightly transparent + blurred, so the background video shows through blurry). */
.hero.home .hero__customers::before {
	content: none;
}

.hero.home .hero__customers-sub {
	color: var(--foundation-400);
}

/* Home hero mobile — full-cover video stays (no photo band), grid drops to 3 columns. */
@media (max-width: 61.9375rem) { /* 991px */
	.hero.home .hero__bg {
		height: auto;
		bottom: 0;
	}
	/* Home hero mobile (Figma 378:4968): the video sits HIGH as a top band and fades out into the navy
	   below, so the tagline / headline / copy / CTAs read on dark. */
	.hero.home .hero__video {
		height: 66%; /* lift the footage into a top band (base is 95%) — single lever, tune to move it */
	}
	.hero.home .hero__bg-gradient {
		top: auto;
		bottom: 0;
		height: 82%;
		background: linear-gradient(to top,
			var(--foundation-950) 0%,
			var(--foundation-950) 34%,
			transparent 100%); /* dissolve the video's lower edge into the navy canvas — deeper fade */
	}
	/* CTAs fill the row side-by-side (Revert-01: full-width on mobile). */
	.hero.home .hero__cta {
		flex-wrap: nowrap;
		gap: 1.2rem;
	}
	.hero.home .hero__cta .btn {
		flex: 1 1 0;
		justify-content: center;
		text-align: center;
	}
	.hero.home .hero__logo-grid {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
	.hero.home .hero__logo-cell {
		height: 9rem;
		padding: 1.6rem;
	}
	/* Match Figma 466:8485: the mobile home headline is larger (~44px = --text-6xl) than the
	   general hero's 3.6rem override, so it wraps to 4 lines by clause
	   (AI-Accelerated / Engineering. / Global Delivery. / Personal Focus.) rather than
	   splitting mid-clause. Higher specificity than the base .hero__headline mobile rule. */
	.hero.home .hero__headline {
		font-size: var(--text-6xl);
		line-height: var(--leading-6xl);
		font-weight: var(--fontWeightMedium);
	}
}

/* --- Content shell --- */
.hero__content {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

/* --- Intro: headline (row 1, left) + copy/CTA (row 2, right) --- */
.hero__intro {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	column-gap: 2.4rem;
	align-items: start;
}

.hero__headline-col {
	grid-column: 1 / span 6;
	grid-row: 1;
	display: flex;
	flex-direction: column;
	gap: 3.2rem;
}

.hero__copy-col {
	grid-column: 8 / span 5;
	grid-row: 2;
	display: flex;
	flex-direction: column;
	gap: 3.2rem;
	padding-right: 4rem;
}

.hero__copy-top {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.hero__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-base);
	line-height: var(--leading-tagline-base);
	letter-spacing: var(--tracking-tagline-base);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--neon-pulse-500);
}

.hero__headline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-6xl);
	line-height: var(--leading-6xl);
	letter-spacing: var(--tracking-6xl);
	font-weight: var(--fontWeightRegular);
	color: var(--white);
}

.hero__accent {
	display: block;
	width: 4rem;
	height: 0.3rem;
	background-color: var(--neon-pulse-500);
}

.hero__body p {
	margin-bottom: 1.6rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	color: var(--white);
}

.hero__body p:last-child {
	margin-bottom: 0;
}

.hero__cta {
	display: flex;
	align-items: center;
	gap: 1.6rem; /* Figma "Buttons" frame gap-16px (home variant renders two pills) */
	flex-wrap: wrap;
}

/* --- "Our customers" --- */
.hero__customers {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 4rem;
	/* Vertical breathing room for the frosted bar (Framer wrapper padding 40px 0 →
	   4rem 0; NO horizontal padding — the global .container already aligns the content). */
	padding: 4rem 0;
}

/* Full-bleed frosted-glass bar behind the WHOLE "Our customers" block (heading +
   subtitle + logo strip) — matches the Framer wrapper (DIV.framer-15c386c): the single
   element carrying backdrop-filter blur(10px) + rgba(0,0,0,.25), edge to edge. It's a
   ::before so the bar spans the viewport while the content stays aligned to .container
   (Framer heading left = container-aligned, NOT the viewport edge). z-index:-1 keeps it
   behind the in-flow children; the blur samples the hero photo (which paints earlier).
   Do NOT put overflow:hidden on .hero__customers — it would clip this full-bleed layer. */
.hero__customers::before {
	content: "";
	position: absolute;
	top: 0;
	bottom: 0;
	left: calc(50% - 50vw);
	width: 100vw;
	background: rgba(0, 0, 0, 0.25);
	backdrop-filter: blur(1rem);
	-webkit-backdrop-filter: blur(1rem);
	/* Fade the blurred bar in at its TOP and out at its bottom (the mask fades the blur + tint
	   together), so neither edge reads as a hard line. ⚠️ The top ramp is the fix for the client's
	   Revert-02 note — *"the original design had the bottom of the header image fade out into the
	   background colour and logo lockup section. It is now a hard line."* The mask used to be
	   opaque from 0%, so `rgba(0,0,0,.25)` + `blur(1rem)` switched on instantly across a photo
	   that is still ~18% visible there (`.hero__bg-gradient` only reaches solid canvas at 88% of
	   the hero) — a dead-straight edge at the top of `.hero__customers`. Ramping to opaque by 46%
	   lets the photo keep dissolving THROUGH the heading and into the lockup; 46% is just above
	   where the logo strip starts (measured 49% desktop / 38–52% mobile across the 4 industry
	   pages), so the white logo silhouettes keep the bar's full contrast behind them. */
	-webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 46%, black 68%, transparent 100%);
	mask-image: linear-gradient(to bottom, transparent 0%, black 46%, black 68%, transparent 100%);
	z-index: -1;
	pointer-events: none;
}

.hero__customers-head {
	display: flex;
	flex-direction: column;
	gap: 1.2rem;
}

.hero__customers-title {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-3xl);
	line-height: var(--leading-3xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.hero__customers-sub {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* The logos are 6 vertical Swiper columns inside a bordered, transparent rounded frame
   (Figma 195:5523): a full outer border + per-column dividers (both #272e47, same as the
   sibling `partners` grid) frame the row; border-radius + overflow:hidden clip the corners.
   The frosted bar lives on the parent .hero__customers, so this frame stays transparent. */
.hero__logos {
	display: grid;
	grid-template-columns: repeat(var(--ncols, 6), 1fr);
	grid-auto-rows: 12rem;
	border: 0.1rem solid var(--border-grid);
	border-radius: 0.8rem;
	overflow: hidden;
}

/* Each of the 6 columns is an independent VERTICAL Swiper (one logo visible at a time,
   cycling). border-right draws the separators between columns; overflow clips the slide. */
.hero__logo-col {
	width: 100%;
	min-width: 0; /* grid item: kill the min-content floor so a wide logo can't blow the track out */
	height: 12rem;
	overflow: hidden;
	border-right: 0.1rem solid var(--border-grid);
}
.hero__logo-col:last-child {
	border-right: 0;
}

/* Slide = one slot; the vertical Swiper sizes it to the column height. */
.hero__logo {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 12rem;
	padding: 2rem;
}

/* Logos are tightly-cropped marks with an intrinsic px size (= their Figma
   bounding box; the grid row is a constant 12rem so 1 unit ≈ 1px), rendered at
   their natural relative sizes and capped so none dominates. */
.hero__logo img {
	/* Size is driven PER-LOGO by the image field's own width/height (set on HubSpot via the image
	   size controls) — NOT a forced uniform height, which made wide logos (Shoprite) dominate and
	   compact ones (MTN) look tiny. The definite width/height ATTRS the module renders keep the img
	   from collapsing to 0 as a flex item in the vertical slide (a viewBox-only SVG has no intrinsic
	   size). max-* are only safety caps; object-fit preserves aspect if a set box mismatches. */
	max-width: 100%;
	max-height: 3.2rem;
	object-fit: contain;
	/* Client logos ship as their brand artwork (mostly solid black, some colour); force them to a
	   uniform white silhouette for the dark hero. Already-white logos are unaffected. */
	filter: brightness(0) invert(1);
}

/* ============================================================
   HERO — LOGO MARQUEE  (logo_layout = marquee-1 | marquee-2)
   Figma 876:2795 "NEW LOGO LOCKUP DESIGN". Logo strips glide sideways in a seamless loop: the
   homepage runs TWO strips in opposite directions (top left→right, bottom right→left), each
   industry page runs ONE strip right→left. Opt-in via the module's `logo_layout` field — the
   original grid/columns layout is untouched and stays the default, so this is a one-flag revert.
   Pure CSS transform animation: no Swiper, no timers, count-agnostic.

   ⚠️ Widths are EXPLICIT, never `max-content`. The logos carry width="500" attrs, and WebKit sizes
   a max-content flex container from that intrinsic width rather than the cell's flex-basis — each
   set measured 9 × (500+32) = 4786px instead of 9 × 140px, leaving a ~3.5k void that pushed every
   logo off-screen. Chrome caps it via max-width:100%, iOS Safari does NOT, so desktop looked
   perfect while the phone showed an empty strip. Deriving the width from the cell count
   (--marquee-set-cells, emitted per row in the module's scope_css) removes the intrinsic-size
   dependency and behaves identically in both engines.
   ============================================================ */
.hero__marquee {
	display: flex;
	flex-direction: column;
	gap: 0.1rem; /* canvas showing through = the divider between the two strips */
	min-width: 0; /* flex-item guard — the wide track must not set a min-content floor */
	/* (dual-layout marquees: the mobile variant is hidden here and swapped in by the 991px media
	   query further down; pages with a single layout render neither modifier class) */
	/* Cell width lives HERE (not in the module's scope_css) so the mobile override below can win —
	   a scoped <style> block loads after main.css and would otherwise beat the media query. */
	--marquee-cell: 21.3rem; /* Figma Logo Block 212.5px */
	--marquee-copies: 4;
}

.hero__marquee--mobile {
	display: none;
}

.hero__marquee-row {
	/* Full-bleed: break out of .container so logos run off both screen edges (the Figma grid is
	   1460 wide against a 1280 content box). Same technique as .hero__customers::before. */
	width: 100vw;
	margin-left: calc(50% - 50vw);
	min-width: 0;
	overflow: hidden;
	/* Soft edge fade — the design's two 305px rectangles at the strip ends. */
	-webkit-mask-image: linear-gradient(to right, transparent 0, black 14rem, black calc(100% - 14rem), transparent 100%);
	mask-image: linear-gradient(to right, transparent 0, black 14rem, black calc(100% - 14rem), transparent 100%);
}

.hero__marquee-track {
	display: flex;
	width: calc(var(--marquee-set-cells, 6) * var(--marquee-cell) * var(--marquee-copies));
	animation: hero-marquee 40s linear infinite; /* duration set per row in scope_css */
	will-change: transform;
}

/* Bottom strip travels the other way (brief: "top left to right, bottom right to left"). */
.hero__marquee-row--reverse .hero__marquee-track {
	animation-direction: reverse;
}

.hero__marquee-set {
	display: flex;
	flex: 0 0 auto;
	width: calc(var(--marquee-set-cells, 6) * var(--marquee-cell));
	min-width: 0;
}

.hero__marquee-cell {
	flex: 0 0 var(--marquee-cell);
	min-width: 0; /* the img's 500px width attr must never become this cell's floor */
	height: 12rem;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 2rem;
}

/* Same white-silhouette treatment as the static layouts: client logos ship as black brand art, so
   force a uniform white. Definite width/height attrs stop viewBox-only SVGs collapsing. */
.hero__marquee-logo {
	max-width: 100%;
	/* max-height: 3.2rem; */
	object-fit: contain;
	filter: brightness(0) invert(1);
}

/* ---- SHOWCASE (industry pages): BORDERED PANELS ----
   Transparent cells with hairline separators, so the hero photo reads through the strip — the same
   treatment as the static .hero__logos frame, minus the rounded corners (it's full-bleed now). */
.hero__marquee-row {
	border-top: 0.1rem solid var(--border-grid);
	border-bottom: 0.1rem solid var(--border-grid);
}
.hero__marquee-row + .hero__marquee-row {
	border-top: 0; /* two strips: don't double the line where they meet */
}
.hero__marquee-cell {
	border-right: 0.1rem solid var(--border-grid);
}

/* ---- HOME variant: FROSTED GLASS BLOCKS ----
   Figma Logo Block 876:2802 — Components/Card/Glass/bg-card #ffffff0d + Background Blur bg-blur-md
   (15px), i.e. exactly the static homepage .hero__logo-cell. The 1px separator is drawn as a
   canvas-coloured border INSIDE the box (border-box), so the cell pitch stays exactly
   --marquee-cell and the width maths above still holds. */
.hero.home .hero__marquee-row {
	border: 0;
}
.hero.home .hero__marquee-cell {
	background-color: rgba(255, 255, 255, 0.05);
	-webkit-backdrop-filter: blur(1.5rem);
	backdrop-filter: blur(1.5rem);
	border-right: 0.1rem solid var(--foundation-950);
}

@keyframes hero-marquee {
	from { transform: translateX(0); }
	to   { transform: translateX(var(--marquee-shift, -25%)); }
}

/* No motion → a static strip (the first set is the one in view). */
@media (prefers-reduced-motion: reduce) {
	.hero__marquee-track { animation: none; }
}

@media (max-width: 61.9375rem) { /* 991px */
	/* Narrower cells + shorter rows on a phone (matches the old mobile row height) so ~2.5 logos
	   are in view. Overriding the VAR (not flex-basis) keeps the set/track calc widths in step. */
	.hero__marquee { --marquee-cell: 14rem; }
	/* Dual-layout marquee (a per-breakpoint strip count, e.g. 2 strips desktop / 3 on mobile —
	   Revert 01's "Can we add another logo strip so there are 3?" was a MOBILE note): below 991px
	   the desktop variant hides and the mobile one shows. Single-layout pages render neither
	   modifier class, so nothing changes for them. Base rule for --mobile sits just below. */
	.hero__marquee--desktop { display: none; }
	.hero__marquee--mobile { display: flex; }
	.hero__marquee-cell {
		height: 9rem;
		padding: 1.6rem;
	}
	.hero__marquee-logo { max-height: 2.6rem; }
	.hero__marquee-row {
		-webkit-mask-image: linear-gradient(to right, transparent 0, black 6rem, black calc(100% - 6rem), transparent 100%);
		mask-image: linear-gradient(to right, transparent 0, black 6rem, black calc(100% - 6rem), transparent 100%);
	}
}

/* --- Mobile (≤991px = 61.9375rem; MQ rem uses the 16px root, so 991/16 = 61.9375) --- */
@media (max-width: 61.9375rem) {
	/* Mobile: the photo becomes a band at the top (per the design); everything
	   below it sits on the navy canvas. The gradient fades the band's lower 30rem. */
	/* ⚠️ max-height is load-bearing. This 48rem band is the SHOWCASE variant's mobile photo crop,
	   but the rule is unscoped, so it also sizes the style-2 heroes. On a hero SHORTER than 48rem
	   the band overhangs the section and paints over the content below it — measured 209px over
	   "1. Introduction" on /privacy-policy, whose hero is only 271px because the page has almost
	   no hero content (client, 13 Aug: "the text creeps into the header" on mobile).
	   Capping to the hero's own height fixes that and is a verified no-op everywhere else: every
	   other hero on mobile is taller than 480px (showcase 919, capabilities 615, what-we-do 687,
	   leadership 679, about 1031; the home variant overrides this rule outright). */
	.hero__bg {
		height: 48rem;
		max-height: 100%;
		bottom: auto;
	}

	.hero__bg-gradient {
		top: auto;
		height: 30rem;
	}

	/* The mobile crop is a tall portrait of a landscape photo; anchor to the right
	   so the subject (not the empty middle) is framed, matching the design. */
	.hero__bg-img {
		object-position: 100% center;
	}

	.hero__content {
		gap: 4.8rem;
	}

	.hero__intro {
		display: flex;
		flex-direction: column;
		gap: 3.2rem;
	}

	.hero__headline-col,
	.hero__copy-col {
		gap: 1.6rem;
		padding-right: 0;
	}

	.hero__headline {
		font-size: 3.6rem;
		line-height: 4.2rem;
		font-weight: var(--fontWeightMedium);
	}

	.hero__accent {
		width: 3.2rem;
	}

	.hero__body p {
		font-size: var(--text-sm);
		line-height: var(--leading-sm);
	}

	.hero__customers {
		gap: 3.2rem;
		/* Tighter bar padding on mobile (matches the reduced gap). */
		padding: 3.2rem 0;
	}

	.hero__customers-title {
		font-size: var(--text-2xl);
		line-height: var(--leading-2xl);
	}

	/* 6 columns is too tight on a phone → 3 columns (the 6 vertical sliders wrap to a 3×2 grid). */
	.hero__logos {
		grid-template-columns: repeat(var(--mcols, 3), 1fr);
		grid-auto-rows: 9rem;
	}
	.hero__logo-col {
		height: 9rem;
	}
	/* Mobile column count (--mcols) + the per-row right-border clear (:nth-child(mcols·n)) and the
	   inter-row divider are FIELD-DRIVEN — emitted per-instance in the module's scope_css, because
	   the count depends on the logo count. (Desktop's single-row :last-child clear stays above.) */
	.hero__logo {
		height: 9rem;
		padding: 1.6rem;
	}
}

/* What We Do / Leadership (style-2) hero — mobile matches Figma 308-4454: a larger, lighter
   headline (~44px via the responsive --text-6xl) + 16px body. Scoped to .style-2 so the
   showcase (industries) hero mobile is untouched. */
@media (max-width: 48rem) { /* 768px */
	.hero.style-2 .hero__headline {
		font-size: var(--text-6xl);
		line-height: var(--leading-6xl);
		font-weight: var(--fontWeightRegular);
	}
	.hero.style-2 .hero__body p {
		font-size: var(--text-base);
		line-height: var(--leading-base);
	}
}


/* ============================================================
   CTA Form — modules/cta-form.module  ("CTA – Above Footer", Figma 195:5583)
   Dark section: a glass card on the navy canvas with a left text column
   (lime tagline + two-tone heading + copy) and a right HubSpot form, over a
   decorative particle "globe" + corner orb glows. Field-driven background /
   spacing / orbs live in module.html scope_css; the dark form styling below
   overrides the light defaults in _forms.css.
   ============================================================ */
.cta-form {
	position: relative;
	color: var(--white);
	/* No overflow:hidden — the globe pokes out top/bottom and orbs bleed (per design). */
}

/* Content sits above the decorative layers. Width + gutters from the global .container. */
.cta-form .container {
	position: relative;
	z-index: 1;
}

/* Decorative particle globe — centred on the section, blended into the canvas so the
   dotted clusters glow above and below the card. */
.cta-form__globe {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	z-index: 0;
	display: block;
	width: 134rem;
	max-width: none; /* oversize the section (globe pokes out top + bottom behind the card) */
	aspect-ratio: 1200 / 1052; /* the WebGL <canvas> needs an explicit box; JS sizes its buffer to this */
	pointer-events: none;
	mix-blend-mode: plus-lighter;
	opacity: 0.9;
}

/* Glass card */
.cta-form__card {
	position: relative;
	overflow: hidden; /* clips the baked glow to the rounded corners */
	padding: 8rem;
	border-radius: 0.8rem;
	/* Frosted-glass panel (Figma 195:5583): kept very translucent so the particle globe behind it
	   reads THROUGH the card (per the design), with the design's teal glow bleeding in from the
	   top-right corner and a faint top-left sheen + border to keep the panel defined. The blur is
	   light (1.5rem) on purpose — a heavy backdrop blur would smear the globe into nothing. */
	background-color: rgba(255, 255, 255, 0.025);
	background-image:
		radial-gradient(72% 95% at 92% -10%, rgba(26, 154, 178, 0.3) 0%, rgba(26, 154, 178, 0.08) 36%, transparent 62%),
		linear-gradient(135deg, rgba(255, 255, 255, 0.045) 0%, rgba(255, 255, 255, 0.01) 55%);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	-webkit-backdrop-filter: blur(0.3rem);
	backdrop-filter: blur(0.3rem);
}

.cta-form__content {
	position: relative;
	z-index: 1;
	display: flex;
	align-items: flex-start;
	gap: 8rem;
}

/* --- Left: text column --- */
.cta-form__text {
	flex: 1 1 0;
	min-width: 0;
	padding-right: 12rem;
}

.cta-form__text-block {
	display: flex;
	flex-direction: column;
	gap: 1.2rem;
}

.cta-form__copy {
	display: flex;
	flex-direction: column;
	gap: 1.2rem;
}

.cta-form__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-xs);
	line-height: var(--leading-tagline-xs);
	letter-spacing: var(--tracking-tagline-xs);
	text-transform: uppercase;
	color: var(--neon-pulse-500);
}

.cta-form__heading h2,
.cta-form__heading .h2,
.cta-form__heading h1,
.cta-form__heading p {
	margin: 0;
	font-size: var(--text-3xl);
	line-height: var(--leading-3xl);
	letter-spacing: var(--tracking-3xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-400);
}

.cta-form__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.cta-form__description p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	letter-spacing: var(--tracking-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* --- Right: form column --- */
.cta-form__form-col {
	flex: 1 1 0;
	min-width: 0;
	padding-top: 2.4rem;
}

/* Dark form — overrides the light _forms.css for the glass card.
   (Field/column layout itself comes from the form's setup in HubSpot.) */
.cta-form .form fieldset {
	margin-bottom: 3.2rem;
}

.cta-form .form fieldset:last-of-type {
	margin-bottom: 2.4rem;
}

.cta-form .form fieldset.form-columns-2 {
	gap: 1.6rem;
}

.cta-form .form .hs-form-field > label {
	display: block;
	margin-bottom: 0.4rem;
	color: var(--foundation-300);
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightLight);
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
}

.cta-form .form .hs-form-field > label .hs-form-required {
	color: var(--neon-pulse-500);
}

.cta-form .form input[type="text"],
.cta-form .form input[type="email"],
.cta-form .form input[type="tel"],
.cta-form .form input[type="number"],
.cta-form .form select,
.cta-form .form textarea {
	width: 100% !important;
	height: auto;
	padding: 0.8rem 0;
	border: none;
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.2);
	border-radius: 0;
	background-color: transparent;
	color: var(--white);
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	transition: border-color 200ms ease;
	/* NB: no backdrop-filter on fields — nested inside the card's own backdrop-filter
	   it paints a visible grey frosted pane over each input (defeats the underline look). */
}

.cta-form .form textarea {
	min-height: 11.4rem;
	padding: 1.2rem 0;
	resize: vertical;
}

.cta-form .form input::placeholder,
.cta-form .form textarea::placeholder {
	color: var(--foundation-400);
}

.cta-form .form input:focus,
.cta-form .form select:focus,
.cta-form .form textarea:focus {
	border-bottom-color: var(--neon-pulse-500);
}

/* Select — hide the native control and draw the design's white chevron-down */
.cta-form .form select {
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	cursor: pointer;
	padding-right: 2.4rem;
	background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%3E%3Cpath%20d='M5%207.5%2010%2012.5%2015%207.5'%20stroke='%23ffffff'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 0 center;
	background-size: 2rem 2rem;
}

/* The OS-rendered option list sits on a light surface — keep its text dark/readable */
.cta-form .form select option {
	color: var(--foundation-900);
}

/* Location field enhanced into a searchable country combobox (modules/cta-form.module/module.js).
   The native <select> is kept but visually hidden (still the value/submission source); the text
   input reuses the shared input styling (it's an input[type=text]) + a chevron, and the filtered
   dropdown is a dark panel readable over the particle globe behind the glass card. */
:is(.cta-form, .contact-hero) .form .cta-combo {
	position: relative;
}
:is(.cta-form, .contact-hero) .form .cta-combo__native {
	position: absolute;
	width: 0.1rem;
	height: 0.1rem;
	padding: 0;
	margin: -0.1rem;
	overflow: hidden;
	clip: rect(0 0 0 0);
	border: 0;
	opacity: 0;
	pointer-events: none;
}
:is(.cta-form, .contact-hero) .form .cta-combo__input {
	padding-right: 2.4rem;
	cursor: text;
	background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%3E%3Cpath%20d='M5%207.5%2010%2012.5%2015%207.5'%20stroke='%23ffffff'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 0 center;
	background-size: 2rem 2rem;
}
:is(.cta-form, .contact-hero) .form .cta-combo__list {
	position: absolute;
	top: calc(100% + 0.4rem);
	left: 0;
	right: 0;
	z-index: 30;
	margin: 0;
	padding: 0.4rem 0;
	list-style: none;
	max-height: 22rem;
	overflow-y: auto;
	background: rgba(13, 18, 32, 0.98);
	border: 0.1rem solid rgba(255, 255, 255, 0.15);
	border-radius: 0.6rem;
	box-shadow: var(--shadow-lg);
	display: none;
}
:is(.cta-form, .contact-hero) .form .cta-combo.is-open .cta-combo__list {
	display: block;
}
:is(.cta-form, .contact-hero) .form .cta-combo__option {
	padding: 0.9rem 1.4rem;
	color: var(--foundation-200);
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	cursor: pointer;
}
:is(.cta-form, .contact-hero) .form .cta-combo__option:hover,
:is(.cta-form, .contact-hero) .form .cta-combo__option.is-active {
	background: rgba(255, 255, 255, 0.08);
	color: var(--white);
}
:is(.cta-form, .contact-hero) .form .cta-combo__option[aria-selected="true"] {
	color: var(--neon-pulse-500);
}
:is(.cta-form, .contact-hero) .form .cta-combo__empty {
	padding: 0.9rem 1.4rem;
	color: var(--foundation-400);
	font-size: var(--text-base);
}

/* Post-submit "thank you" message — HubSpot swaps the form for this on success. Style it legibly
   on the dark glass card (white, readable size + breathing room) so it reads as a real confirmation. */
:is(.cta-form, .contact-hero) .form .submitted-message,
:is(.cta-form, .contact-hero) .form .hs-form__submitted-message {
	color: var(--white);
	font-family: var(--primaryFont);
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	padding: 1.6rem 0;
}
:is(.cta-form, .contact-hero) .form .submitted-message p,
:is(.cta-form, .contact-hero) .form .hs-form__submitted-message p {
	color: var(--white);
	margin: 0;
}

/* Form rich text / consent copy (light by default → would vanish on the dark card) */
.cta-form .form .hs-richtext,
.cta-form .form .hs-richtext p,
.cta-form .form .legal-consent-container .hs-form-booleancheckbox-display span {
	color: var(--foundation-300);
}

/* ⚠️ Links inside that consent copy need their OWN colour — the rule above sets the wrapper, but
   an <a> does not inherit it: the global `a { color: var(--primaryColour) }` in
   elements/_buttons.css wins, painting the legal team's privacy-policy link #13192d (near-black)
   on the dark glass card at ~1.05:1 contrast. The client read that as the text "cutting off".
   Lime + underline so it is unmistakably a link. Scoped to both dark form surfaces. */
:is(.cta-form, .contact-hero) .form .hs-richtext a,
:is(.cta-form, .contact-hero) .form .legal-consent-container a {
	color: var(--neon-pulse-500);
	text-decoration: underline;
	text-underline-offset: 0.2rem;
}

:is(.cta-form, .contact-hero) .form .hs-richtext a:hover,
:is(.cta-form, .contact-hero) .form .legal-consent-container a:hover {
	color: var(--white);
}

/* Submit — lime pill (matches .btn.pill / the footer newsletter button) */
.cta-form .form .hs_submit .actions {
	display: flex;
	justify-content: flex-start;
	margin: 0;
	padding: 0;
}

.cta-form .form .hs-button.primary.large {
	width: auto;
	padding: 1.1rem 2.4rem;
	color: var(--foundation-900);
	font-size: 1.6rem;
	font-weight: var(--fontWeightMedium);
	border: 0.2rem solid var(--neon-pulse-600);
	border-radius: var(--radius-max, 999.9rem);
	background-color: var(--neon-pulse-600);
	box-shadow: none;
	transition: all 250ms ease;
}

.cta-form .form .hs-button.primary.large:hover {
	color: var(--foundation-900);
	background-color: var(--neon-pulse-500);
	border-color: var(--neon-pulse-500);
	box-shadow: 0.4rem 0.4rem 4rem 0 rgba(180, 204, 80, 0.3);
}

/* --- Tablet landscape (≤1024px = 64rem) --- */
@media (max-width: 64rem) {
	.cta-form__card {
		padding: 4.8rem;
	}
	.cta-form__content {
		gap: 4.8rem;
	}
	.cta-form__text {
		padding-right: 4rem;
	}
}

/* --- Tablet / mobile (≤768px = 48rem): stack the two columns --- */
@media (max-width: 48rem) {
	/* Globe PEEKS as a dome at the TOP, above the card (Figma 482:23279) — top-anchored (not centred)
	   and the card is pushed down to reveal the dome band. Oversized + centred horizontally so the
	   visible arc is wide and shallow like the design. */
	.cta-form__globe {
		top: -6rem; /* pull the sphere up so the dome dots reach near the top (less dead space above) */
		left: 50%;
		transform: translateX(-50%);
		width: 62rem;
	}
	.cta-form__card {
		margin-top: 11rem; /* clears space for the globe dome peeking above the card */
		padding: 3.2rem;
		/* More opaque on mobile so the globe sitting behind the card's lower half doesn't bleed
		   through the form fields (the design's mobile card body reads as solid dark navy). */
		background-color: rgba(10, 15, 28, 0.66);
	}
	.cta-form__content {
		flex-direction: column;
		gap: 4rem;
	}
	.cta-form__text {
		padding-right: 0;
	}
	.cta-form__form-col {
		padding-top: 0;
		width: 100%; /* fill the stacked column (the content's align-items:flex-start won't stretch it) */
	}
	.cta-form .form fieldset.form-columns-2 {
		grid-template-columns: 1fr;
	}
	/* Full-width, centred submit pill (design 308:4454) */
	.cta-form .form .hs_submit .actions {
		justify-content: center;
	}
	.cta-form .form .hs-button.primary.large {
		width: 100%;
		text-align: center;
	}
	/* Heading a tier smaller on mobile so it sits better against the form fields */
	.cta-form__heading h2,
	.cta-form__heading .h2,
	.cta-form__heading h1,
	.cta-form__heading p {
		font-size: var(--text-2xl);
		line-height: var(--leading-2xl);
		letter-spacing: var(--tracking-2xl);
	}
}












.contact-details {
	
}

.contact-details .container {
	display: grid;
	grid-template-columns: 1fr minmax(auto, 77rem);
}

@media (max-width: 991px) {
	.contact-details .container {
		gap: 3rem;
		grid-template-columns: 1fr;
	}
}

.contact-details .details .rich-text {
	margin-bottom: 3.5rem;
}

.contact-details .map {
	display: flex;
	width: 100%;
	height: 35rem;
}

.contact-details .map iframe {
	width: 100%;
	height: 100%;
}

.contact-details .contact-info {
	gap: 2.5rem;
	display: flex;
	flex-direction: column;
}

.contact-details .contact-info .row {
	gap: 1.8rem;
	display: flex;
}

.contact-details .contact-info a {}










footer.footer {
	position: relative;
	padding: 8rem 0;
	background-color: var(--foundation-950);
	color: var(--foundation-200);
}

footer.footer .container {
	gap: 6.4rem;
	display: flex;
	flex-direction: column;
}

footer.footer .divider {
	width: 100%;
	height: 0.1rem;
	background-color: rgba(255, 255, 255, 0.1);
}

footer.footer .logo img {
	display: block;
	width: auto;
	height: 3.2rem;
}

/* Newsletter */
footer.footer .newsletter {
	gap: 2.4rem;
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
}

footer.footer .newsletter .intro {
	flex: 1 1 auto;
	max-width: 42rem;
}

footer.footer .newsletter .tagline {
	display: block;
	margin-bottom: 0.8rem;
	text-transform: uppercase;
	color: var(--neon-pulse-500);
	font-family: var(--font-primary);
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-2xs);
	line-height: var(--leading-tagline-2xs);
	letter-spacing: var(--tracking-tagline-2xs);
}

footer.footer .newsletter .heading {
	margin: 0;
	color: var(--white);
	font-family: var(--font-primary);
	font-weight: var(--fontWeightMedium);
	font-size: var(--text-xl);
	line-height: var(--leading-xl);
	letter-spacing: var(--tracking-xl);
}

footer.footer .newsletter-form {
	flex: 0 0 auto;
	width: 63.2rem;
	max-width: 100%;
}

/* Newsletter form (HubSpot form styled to the design) */
footer.footer .newsletter-form form {
	gap: 2.4rem;
	display: flex;
	align-items: flex-end;
}

footer.footer .newsletter-form .hs-form-field {
	flex: 1 1 auto;
}

footer.footer .newsletter-form label {
	display: block;
	margin-bottom: 0.8rem;
	color: var(--foundation-300);
	font-weight: var(--fontWeightLight);
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
}

footer.footer .newsletter-form label .hs-form-required {
	color: var(--neon-pulse-500);
}

footer.footer .newsletter-form input[type="email"] {
	width: 100% !important;
	height: auto;
	border: none;
	border-radius: 0;
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.2);
	background-color: transparent;
	background-image: url('https://144479753.fs1.hubspotusercontent-eu1.net/hubfs/144479753/raw_assets/public/entelect_corporate/images/footer-mail.svg');
	background-repeat: no-repeat;
	background-position: left center;
	background-size: 2rem;
	padding: 0.8rem 0 0.8rem 3.2rem;
	color: var(--white);
	font-size: var(--text-base);
	line-height: var(--leading-base);
}

footer.footer .newsletter-form input[type="email"]::placeholder {
	color: var(--foundation-500);
}

footer.footer .newsletter-form .hs_submit .actions {
	margin: 0;
	padding: 0;
}

footer.footer .newsletter-form input[type="submit"],
footer.footer .newsletter-form .hs-button {
	cursor: pointer;
	border-radius: 5.2rem;
	padding: 0.8rem 2rem;
	background-color: #abc546;
	border: 0.1rem solid rgba(0, 0, 0, 0.2);
	color: #273000;
	box-shadow: none;
	font-family: var(--font-primary);
	font-weight: var(--fontWeightMedium);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	transition: background-color 250ms ease;
}

footer.footer .newsletter-form input[type="submit"]:hover,
footer.footer .newsletter-form .hs-button:hover {
	background-color: var(--neon-pulse-600);
}

/* Link columns */
footer.footer .links {
	gap: 1.6rem;
	display: grid;
	grid-template-columns: repeat(4, 1fr);
}

footer.footer .col-heading {
	display: block;
	margin: 0 0 2.4rem;
	color: var(--foundation-500);
	font-weight: var(--fontWeightRegular);
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
}

footer.footer .link-list {
	gap: 1.2rem;
	margin: 0;
	padding: 0;
	display: flex;
	list-style: none;
	flex-direction: column;
}

/* Reset the global `li { margin-bottom: 2rem; line-height: 2.5rem }` so the flex gap controls spacing */
footer.footer li {
	margin: 0;
	line-height: var(--leading-base);
}

footer.footer .link {
	display: inline-flex;
	align-items: center;
	text-decoration: none;
	color: var(--foundation-200);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	opacity: 0.8;
	transition: opacity 250ms ease;
}

footer.footer .link:hover {
	opacity: 1;
}

/* The page you are currently on. Lime rather than just full-opacity white, because hover already
   takes the link to opacity 1 — a "you are here" state that looked identical to hover would not
   read as one. Matches how the site marks a current selection elsewhere (the stories-listing active
   tab and the location-map active chip both use the lime accent). Styled off aria-current rather
   than a class: main.js sets the standard semantic, so the styling and the screen-reader
   announcement stay in lockstep and cannot drift apart. */
footer.footer .link[aria-current="page"] {
	color: var(--neon-pulse-500);
	opacity: 1;
	font-weight: var(--fontWeightMedium);
}

footer.footer .link:focus-visible {
	opacity: 1;
	outline: 0.2rem solid var(--neon-pulse-500);
	outline-offset: 0.4rem;
}

/* Legal */
footer.footer .legal {
	gap: 2.4rem;
	display: flex;
	align-items: center;
	justify-content: space-between;
}

footer.footer .legal .copyright {
	margin: 0;
	color: var(--foundation-500);
	font-size: var(--text-base);
	line-height: var(--leading-base);
}

/* — end of MO Theme stylesheet — */

footer.footer .legal-links {
	gap: 2.4rem;
	margin: 0;
	padding: 0;
	display: flex;
	list-style: none;
}

footer.footer .legal-links .link {
	opacity: 1;
	color: var(--foundation-300);
}

/* Tablet */
@media (max-width: 1024px) {
	footer.footer .container {
		gap: 4.8rem;
	}
	footer.footer .newsletter {
		gap: 2.4rem;
		flex-direction: column;
		align-items: stretch;
	}
	footer.footer .newsletter .intro,
	footer.footer .newsletter-form {
		width: 100%;
		max-width: 100%;
	}
	footer.footer .links {
		gap: 4.8rem 1.6rem;
		grid-template-columns: repeat(2, 1fr);
	}
}

/* Mobile */
@media (max-width: 768px) {
	footer.footer {
		padding: 6rem 0;
	}
	footer.footer .container {
		gap: 4rem;
	}
	footer.footer .newsletter-form form {
		gap: 1.6rem;
		flex-direction: column;
		align-items: stretch;
	}
	footer.footer .newsletter-form input[type="submit"],
	footer.footer .newsletter-form .hs-button {
		width: 100%;
	}
	footer.footer .links {
		gap: 4rem;
		grid-template-columns: 1fr;
	}
	footer.footer .legal {
		gap: 1.6rem;
		flex-direction: column;
		align-items: flex-start;
	}
}


/* ============================================================
   Story Hero — modules/story-hero.module  (customer-story case-study hero)
   Full-bleed photo fading into the navy canvas, a headline (white, ~8/12 cols)
   with a lime brand tagline, then a 4-up impact-stats row. Figma 196:2002
   (desktop) / 196:2140 (mobile, photo → top band + 2×2 stats). bg colour +
   spacing are field-driven inline (scope_css). No orbs (per the design).
   ============================================================ */
.story-hero {
	position: relative;
	color: var(--white);
}

/* Content sits above the background layer. Width + gutters come from the global .container. */
.story-hero .container {
	position: relative;
	z-index: 1;
}

/* --- Background photo + navy gradient fade --- */
.story-hero__bg {
	position: absolute;
	inset: 0;
	z-index: 0;
	overflow: hidden;
	opacity: 0.7;
}

.story-hero__photo {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

.story-hero__fade {
	position: absolute;
	inset: 0;
	/* Photo stays clear for the top ~40%, then fades to solid navy by ~73% — lighter than the
	   Figma overlay so more of the hero photo shows, while staying solid where the stats row begins. */
	background: linear-gradient(180deg,
		rgba(13, 18, 32, 0) 40%,
		rgba(13, 18, 32, 0.75) 58%,
		rgba(13, 18, 32, 0.94) 68%,
		var(--foundation-950) 73%);
}

/* --- Content shell --- */
.story-hero__inner {
	display: flex;
	flex-direction: column;
	gap: 12rem; /* gap-lg 120px, headline → stats */
}

/* --- Headline (≈ 8/12 columns) --- */
.story-hero__headline {
	display: flex;
	flex-direction: column;
	gap: 3.2rem;
	max-width: 85rem;
}

.story-hero__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-base);
	line-height: var(--leading-tagline-base);
	letter-spacing: var(--tracking-tagline-base);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--neon-pulse-500); /* lime, matching the .hero tagline */
}

.story-hero__heading {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-6xl);
	line-height: var(--leading-6xl);
	letter-spacing: var(--tracking-6xl);
	font-weight: var(--fontWeightRegular);
	color: var(--white);
}

/* --- Impact stats row --- */
.story-hero__stats {
	display: flex;
	gap: 2.4rem;
}

.story-hero__stat {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2.4rem; /* accent line → figure */
}

.story-hero__stat-line {
	width: 3.2rem;
	height: 0.3rem;
	background-color: var(--neon-pulse-500);
}

.story-hero__stat-body {
	display: flex;
	flex-direction: column;
	gap: 1.2rem;
	max-width: 20rem;
}

.story-hero__figure {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightLight);
	color: var(--white);
}

.story-hero__label {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* Mobile (Figma 196:2140): photo → top band, headline overlays its faded lower portion,
   smaller type tiers, and the stats wrap to a 2×2 grid. */
@media (max-width: 48rem) { /* 768px */
	.story-hero__bg {
		height: 48rem; /* photo becomes a top band */
	}
	.story-hero__inner {
		gap: 6.4rem;
	}
	.story-hero__headline {
		gap: 1.6rem;
		max-width: none;
	}
	.story-hero__heading {
		font-size: var(--text-5xl);
		line-height: var(--leading-5xl);
		letter-spacing: var(--tracking-5xl);
		font-weight: var(--fontWeightMedium);
	}
	.story-hero__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}
	.story-hero__stats {
		display: grid;
		grid-template-columns: repeat(2, 1fr);
		column-gap: 1.6rem;
		row-gap: 4.8rem;
	}
	.story-hero__stat {
		gap: 1rem; /* design: 6px accent-line pad + 4px gap */
	}
	.story-hero__stat-line {
		width: 2.4rem;
	}
	.story-hero__stat-body {
		gap: 0.8rem;
	}
	.story-hero__figure {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
		font-weight: var(--fontWeightRegular); /* design: figure is Regular on mobile (Light on desktop) */
	}
	.story-hero__label {
		font-size: var(--text-sm);
		line-height: var(--leading-sm);
	}
}


/* ============================================================
   Story Intro — modules/story-intro.module  (customer-story intro band)
   Dark section, 12-col grid: LEFT (cols 1-6) = brand logo (top) + tag pills
   (bottom, justify-between); RIGHT (cols 7-11) = intro paragraph. Two orbs.
   Figma 196:2035 (desktop) / 196:2159 (mobile → single column). bg + spacing
   + orbs are field-driven inline (scope_css).
   ============================================================ */
.story-intro {
	position: relative;
	color: var(--white);
}

.story-intro .container {
	position: relative;
	z-index: 1;
}

.story-intro__content {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	gap: 2.4rem;
	align-items: stretch;
}

/* Left column stretches to the paragraph's height; logo pinned top, tags bottom. */
.story-intro__left {
	grid-column: 1 / span 6;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	gap: 2.4rem;
}

.story-intro__right {
	grid-column: 7 / span 5;
}

/* ⚠️ NO width/height here — the brand logo is sized ENTIRELY by the module's image field, and both
   dimensions must come through. A hardcoded `width: 16.8rem` (the Capitec wordmark's width at the
   design's 24px block height, Figma 196:2042) lived here and silently discarded every size the
   editor set: the client raised "logo resize doesn't work" THREE times before this was found, and
   it also rendered square marks like Absa as a 168x168 slab. `height: auto` is deliberately absent
   too — it would override the field's height and leave only width adjustable.
   The mobile override that pinned 12.6rem was removed with it. */
.story-intro__logo img {
	display: block;
	max-width: 100%;
}

.story-intro__tags {
	display: flex;
	flex-wrap: wrap;
	gap: 0.8rem;
}

.story-intro__tag {
	display: inline-flex;
	align-items: center;
	padding: 0.4rem 0.8rem;
	border-radius: 0.6rem;
	background-color: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	letter-spacing: var(--tracking-sm);
	font-weight: var(--fontWeightRegular);
	color: var(--foundation-300);
	white-space: nowrap;
}

.story-intro__copy p {
	margin: 0 0 1.6rem;
	font-size: var(--text-xl);
	line-height: var(--leading-xl);
	letter-spacing: var(--tracking-xl);
	font-weight: var(--fontWeightLight);
	color: var(--white);
}

.story-intro__copy p:last-child {
	margin-bottom: 0;
}

/* Mobile (Figma 196:2159): single column — logo + tags, then the copy; copy steps to text-lg. */
@media (max-width: 48rem) { /* 768px */
	.story-intro__content {
		grid-template-columns: 1fr;
		gap: 4.8rem;
	}
	.story-intro__left,
	.story-intro__right {
		grid-column: 1;
	}
	.story-intro__left {
		justify-content: flex-start;
		gap: 2.4rem;
	}
	.story-intro__copy p {
		font-size: var(--text-lg);
		line-height: var(--leading-lg);
		letter-spacing: var(--tracking-lg);
	}
}


/* ============================================================
   Story Highlights — modules/story-highlights.module
   Tagline + two-tone heading, then a horizontal row of glass "highlight" cards over a teal/azure
   glow + wave. On DESKTOP the section PINS (position:sticky) and the card track SCRUBS horizontally
   as the page scrolls (driven by module.js), releasing at the last card → normal scroll resumes.
   On tablet/mobile (≤1024px) it's a normal section + native scroll-snap swipe carousel (no JS).
   Figma 196:2049 / 196:2172.
   ============================================================ */
.story-highlights {
	position: relative;
	color: var(--white);
}

/* The pinned stage (desktop). module.js sets the parent section's height so this stays stuck while
   the track scrubs; the content is centred in the viewport and padded clear of the fixed nav.
   Reset to a normal block on tablet/mobile (≤64rem) below. */
/* DEFAULT (no .is-pinned) = a normal block. This is the fallback shown with no-JS, under
   prefers-reduced-motion, and on tablet/mobile (≤1024px); the viewport below is then a native
   scroll-snap swipe carousel. module.js adds .is-pinned ONLY on desktop (>1024px, motion allowed),
   so every pinned style is scoped under .is-pinned — reduced-motion/no-JS desktop no longer get a
   clipped, un-scrollable 100vh stage. */
.story-highlights__sticky {
	position: static;
}

/* Pinned scroll-scrub stage (desktop, JS-enabled). The content is vertically CENTRED — which clears
   the fixed nav for free — and the card height is capped in vh (see .is-pinned .__card below), so the
   whole stage always fits the viewport with no clipping at any height. That's why the pin no longer
   needs the old "does it fit vertically?" bail that broke on shorter laptops. */
.story-highlights.is-pinned .story-highlights__sticky {
	/* JS drives the pin with position:FIXED (see module.js) — NOT sticky, which iOS Safari breaks under
	   an overflow:clip ancestor (worked on desktop/Android, never iOS). Defaults here to the BEFORE state
	   (absolute at the section top, relative to the position:relative section) so it's sane before the
	   first JS frame; module.js then overrides position/top/bottom inline as you scroll. */
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100vh; /* fallback */
	height: 100svh; /* mobile-safe: excludes the dynamic URL bar */
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 11rem 0 4rem; /* top keeps the (centred) content clear of the ~9.6rem fixed nav */
	overflow: hidden;
}

.story-highlights .container {
	position: relative;
	z-index: 1;
}

/* Decorative wave (Figma 196:2050) — a LIVE three.js particle wave rendered into this <canvas> via
   the shared engine (scripts/three-wave.js; preset chosen by the module's "Wave Style" field). Direct
   child of .__sticky (fills it via inset:0), so it spans the full-bleed section behind the content and
   pins with the sticky stage. z-index:0 sits it with the orbs, above the section background but below
   .container (z-index:1). Off-screen-paused; under reduced-motion the engine draws one static frame. */
.story-highlights__wave {
	position: absolute;
	inset: 0;
	z-index: 0;
	display: block;
	width: 100%;
	height: 100%;
	pointer-events: none;
}

/* Headline (left ~5/12 cols on desktop): lime Tomorrow tagline + two-tone heading. */
.story-highlights__head {
	max-width: 52rem;
	margin-bottom: 8rem;
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.story-highlights__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--text-accent);
}

.story-highlights__heading h2,
.story-highlights__heading .h2 {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.story-highlights__heading strong {
	color: var(--white);
	font-weight: inherit;
}

/* Carousel viewport — clips the track and breaks out of .container full-bleed on BOTH sides, so the
   track is only ever cut by the SCREEN edges (never the container gutter). calc(50% - 50vw) per side
   is the exact distance from the centred container edge to the screen edge → the viewport is 100vw.
   The track is then padded left by the gutter so the first card still starts aligned to the container
   initially, while every card stays fully visible as it scrubs left (it only exits at the screen edge).
   On desktop overflow is hidden + module.js translates the track; on mobile (reset below) it's a native
   scroll-snap carousel. */
/* DEFAULT viewport = native horizontal scroll-snap carousel. Full-bleed RIGHT only, so the first card
   starts aligned to the container-left; cards snap and can be swiped. Used no-JS / reduced-motion / mobile. */
.story-highlights__viewport {
	margin-right: calc(50% - 50vw);
	overflow-x: auto;
	overflow-y: hidden;
	scroll-snap-type: x proximity;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;
}
.story-highlights__viewport::-webkit-scrollbar {
	display: none;
}

/* Pinned viewport: full-bleed BOTH sides + clipped; module.js translates the track (no native scroll). */
.story-highlights.is-pinned .story-highlights__viewport {
	margin-left: calc(50% - 50vw);
	overflow: hidden;
	scroll-snap-type: none;
}

/* --- Drag the cards ---------------------------------------------------------------------------
   module.js turns a horizontal drag into page scroll while pinned, and into scrollLeft in the
   carousel fallback. Only two things are needed from CSS. */

/* ⚠️ touch-action is scoped to the PINNED state on purpose. Pinned, the viewport has no native
   horizontal scroll (overflow:hidden), so pan-y correctly says "browser keeps vertical — which IS
   the scrub — and we take horizontal". In the CAROUSEL fallback the viewport is a real overflow-x
   scroller: declaring pan-y there would tell the browser to stop panning it horizontally and hand
   touch to us, costing the platform momentum and scroll-snap for no gain. So the carousel keeps
   touch-action:auto and module.js ignores TOUCH pointers there, handling only mouse/pen.
   ⚠️ Note pan-Y, not pan-x. CLAUDE.md records pan-x on the stories-listing tabs DISABLING vertical
   panning rather than delegating it, which froze the page under a thumb. Same property, opposite
   axis, opposite outcome. */
.story-highlights.is-pinned .story-highlights__viewport {
	touch-action: pan-y;
}

.story-highlights__viewport {
	cursor: grab;
}

/* Set on the SECTION (not the viewport) so the grabbing cursor and the selection lock hold even
   when the pointer leaves the viewport mid-drag — pointer capture keeps the gesture alive, and the
   cursor should not flicker back to grab while it is still being dragged. */
.story-highlights.is-dragging,
.story-highlights.is-dragging .story-highlights__viewport {
	cursor: grabbing;
}

.story-highlights.is-dragging {
	user-select: none;
	-webkit-user-select: none;
}

.story-highlights__track {
	display: flex;
	gap: 2.4rem;
	width: max-content;
	/* Carousel only (the pinned rules below set both paddings explicitly). The viewport is full-bleed
	   to the RIGHT, so without this the last card ends flush against the screen edge while the first
	   starts at the container gutter — it reads as the row running off the page. Mirrors the gutter. */
	padding-right: 2rem;
}

/* Pinned track: pad both ends by the container gutter (144rem container, 2rem pad → half-content =
   70rem) so the first card lines up under the heading and there's symmetric trailing space before the
   pin releases. The scrub distance = track.scrollWidth − viewport, so this padding extends the scrub
   by the same amount at each end. module.js translates this track. */
.story-highlights.is-pinned .story-highlights__track {
	padding-left: max(2rem, calc(50vw - 70rem));
	padding-right: max(2rem, calc(50vw - 70rem));
	will-change: transform;
}

/* Glass card: fixed-width, icon top, copy below (equal heights).
   Height is CONTENT-DRIVEN — no floor. The track is a flex row, so every card stretches to the
   tallest card's natural content; the air between icon and copy is a REAL gap (the icon's
   margin-bottom) rather than leftover slack, so the tallest card keeps its spacing instead of
   collapsing to a squish. Shorter cards still bottom-align their copy via .__copy{margin-top:auto}. */
.story-highlights__card {
	flex: 0 0 36rem;
	display: flex;
	flex-direction: column;
	box-sizing: border-box;
	scroll-snap-align: start; /* carousel (default / mobile) */
	padding: 3.2rem;
	border-radius: var(--radius-sm);
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	background-color: rgba(255, 255, 255, 0.05);
	-webkit-backdrop-filter: blur(4rem);
	backdrop-filter: blur(4rem);
}

/* Pinned: height stays CONTENT-DRIVEN (same as the carousel) — no viewport-derived floor or cap.
   A fixed vh/svh height under-ran the content on short real viewports (phone svh 580–664 with browser
   chrome): the copy's margin-top:auto collapsed (icon touching title), then the text crossed the card
   border where the pinned viewport's overflow:hidden clipped it — the Revert-02 "squished cards / text
   cutting off". Sizing to content can't under-run by construction; if the resulting stage genuinely
   can't fit the viewport, module.js's fit guard drops the whole module back to the swipe carousel. */
.story-highlights.is-pinned .story-highlights__card {
	height: auto;
}

/* COMPACT PINNED STAGE — short desktop windows (i.e. a browser that is not fullscreen).
   The pin engages only if the head + one card fit the viewport, and a content-sized card doesn't
   shrink to help — so the requirement is a CONSTANT (~856px at full size) while the window is not.
   Fullscreen on a 1366×768 laptop gives 768px and pins; the same window un-maximised gives ~630px
   and silently fell back to the swipe carousel, which is why it read as "works fullscreen, does
   nothing windowed". The threshold is width-INVARIANT (measured identical at 1280–1920): the card is
   a fixed flex-basis and the head a fixed max-width, so only height matters.

   Two tiers, so a window only gives up as much design as it has to. TIER 1 (≤896px) trims the stage;
   TIER 2 (≤704px) also steps the heading down and goes wider still — a wider card is the biggest
   single lever because it wraps the copy on fewer lines. Target: the worst page (MTN, the longest
   card copy of the 11 pages using this module) must fit inside 560px, which is module.js's own
   `mqTall` floor — then the fit guard can NEVER be the binding constraint on a desktop window, and
   there's headroom for a future story with longer copy. Padding-top stays ≥9.6rem in both tiers: the
   fixed nav is exactly 9.6rem (1.6rem×2 + 6.4rem inner) and the content is centred with the padding
   as its floor, so anything less puts the tagline under the nav when it reappears on scroll-up.
   Scoped to .is-pinned throughout, so the carousel fallback and tall windows are untouched. */
@media (min-width: 64.0625rem) and (max-height: 56rem) { /* >1024px wide, ≤896px tall */
	.story-highlights.is-pinned .story-highlights__sticky {
		padding: 9.6rem 0 3rem;
	}
	.story-highlights.is-pinned .story-highlights__head {
		margin-bottom: 2.4rem;
	}
	.story-highlights.is-pinned .story-highlights__card {
		flex-basis: 42rem;
		padding: 2.4rem;
	}
	.story-highlights.is-pinned .story-highlights__icon {
		margin-top: 0;
		margin-bottom: 2rem;
	}
	.story-highlights.is-pinned .story-highlights__icon img {
		width: 5.6rem;
		height: 5.6rem;
	}
	/* the wider card earns the title its full measure, so long titles lose a line */
	.story-highlights.is-pinned .story-highlights__title {
		max-width: none;
	}
}

/* TIER 2 — a genuinely small window (un-maximised, or a maximised 1366×768 / 150%-scaled 1080p
   laptop, both ~630px of viewport). Only the deltas from tier 1 are declared. */
@media (min-width: 64.0625rem) and (max-height: 44rem) { /* >1024px wide, ≤704px tall */
	.story-highlights.is-pinned .story-highlights__sticky {
		padding: 9.6rem 0 2rem;
	}
	.story-highlights.is-pinned .story-highlights__head {
		margin-bottom: 1.6rem;
	}
	.story-highlights.is-pinned .story-highlights__heading h2,
	.story-highlights.is-pinned .story-highlights__heading .h2 {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.story-highlights.is-pinned .story-highlights__card {
		flex-basis: 52rem;
		padding: 2rem;
	}
	.story-highlights.is-pinned .story-highlights__icon {
		margin-bottom: 1.6rem;
	}
	.story-highlights.is-pinned .story-highlights__icon img {
		width: 4.8rem;
		height: 4.8rem;
	}
	.story-highlights.is-pinned .story-highlights__copy {
		gap: 0.8rem;
		padding-bottom: 0;
	}
}

.story-highlights__icon {
	display: block;
	margin-top: 1.6rem;
	/* Guaranteed separation from the copy. With a content-driven card height there is no leftover
	   slack for margin-top:auto to distribute, so this gap IS the design's air. Every 1rem here also
	   moves the viewport height at which the pin's fit guard hands over to the carousel by 10px. */
	margin-bottom: 4rem;
}

.story-highlights__icon img {
	display: block;
	width: 8.8rem;
	height: 8.8rem;
}

.story-highlights__copy {
	margin-top: auto;
	padding-bottom: 0.8rem;
	display: flex;
	flex-direction: column;
	gap: 1.2rem;
}

.story-highlights__title {
	margin: 0;
	max-width: 27rem;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.story-highlights__body p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	letter-spacing: var(--tracking-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

/* Tablet + mobile (≤64rem): the pin runs here too (forced scroll on portrait phones/tablets). Unlike the
   desktop scrub (which shows several cards and left-aligns the first), here the pinned card is ~80vw and
   the track is CENTRED, so the focused card sits dead-centre and fully visible — small peeks of the
   neighbours, never cut off (the fix for the mobile "cards cut off" report). When .is-pinned is absent
   (short/landscape, reduced-motion, no-JS) the DEFAULT scroll-snap swipe carousel applies instead. */
@media (max-width: 64rem) { /* 1024px */
	.story-highlights__head {
		max-width: none;
		margin-bottom: 6rem;
	}
	/* Centre each card in the scrub: card ~80vw + track padded (100vw − card)/2 each end → at scrub step k
	   card k lands dead-centre (module.js translates the track by k·(card+gap)), so it's always full. */
	.story-highlights.is-pinned .story-highlights__card {
		flex-basis: min(80vw, 42rem);
	}
	.story-highlights.is-pinned .story-highlights__track {
		padding-left: calc((100vw - min(80vw, 42rem)) / 2);
		padding-right: calc((100vw - min(80vw, 42rem)) / 2);
	}
}

/* Mobile (Figma 196:2172): heading steps to text-3xl, narrower cards (peek), wave repositioned. */
@media (max-width: 48rem) { /* 768px */
	.story-highlights__head {
		margin-bottom: 4.8rem;
	}
	.story-highlights__heading h2,
	.story-highlights__heading .h2 {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	/* Non-pinned fallback (short/landscape, reduced-motion, no-JS) = swipe-carousel cards: ~85vw so ONE
	   card fills the screen with a peek of the next (Figma 196:2172), capped at 34rem. */
	.story-highlights__card {
		flex-basis: min(85vw, 34rem);
	}

	/* COMPACT PINNED STAGE — phones. Same problem as the desktop tiers: the card is content-sized, so
	   the stage requirement is a constant while the phone's viewport is not. On the longest-copy story
	   (RGA) the stage needed 738px, but a phone only offers its svh — ~745 on an iPhone 15, ~713 on a
	   13 mini — so the fit guard handed over to the swipe carousel on most real devices and the forced
	   sideways scroll silently disappeared. Trimming the icon, the card padding and the gaps brings the
	   requirement to ~670px, which every modern phone clears.
	   ⚠️ The card WIDTH is deliberately left at 80vw: widening it to 88–92vw would save another ~30px
	   but shrinks the neighbouring card's peek from 23px to 7px (or none), and that peek is the only
	   affordance telling people the cards can be swiped at all. Coverage below ~670px is not worth
	   losing it — those viewports get the carousel, which is a fine fallback.
	   Padding-top stays 8rem (unchanged) — it is the nav clearance and already the tightest it can be. */
	.story-highlights.is-pinned .story-highlights__sticky {
		padding: 8rem 0 2rem;
	}
	.story-highlights.is-pinned .story-highlights__head {
		margin-bottom: 1.6rem;
	}
	.story-highlights.is-pinned .story-highlights__card {
		padding: 2.4rem;
	}
	.story-highlights.is-pinned .story-highlights__icon {
		margin-bottom: 2.4rem;
	}
	.story-highlights.is-pinned .story-highlights__icon img {
		width: 6.4rem;
		height: 6.4rem;
	}
	.story-highlights.is-pinned .story-highlights__copy {
		gap: 0.8rem;
	}
}


/* ============================================================
   Story Impact — modules/story-impact.module
   Two columns: LEFT = tagline + two-tone heading + bordered portrait;
   RIGHT = intro copy, two large stats, then a numbered "critical
   business units" list. Two corner orbs. Figma 196:2101.
   ============================================================ */
.story-impact {
	position: relative;
	color: var(--white);
}

.story-impact .container {
	position: relative;
	z-index: 1;
}

.story-impact__inner {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 2.4rem;
	align-items: start;
}

/* LEFT — head + portrait, constrained to 5/6 of the column (design cols 1–5 of 6).
   Sticky: pins while the taller right column scrolls past (the grid's align-items:start keeps it
   its natural height, so it has room to stick within the inner grid). Reset to static when stacked. */
.story-impact__left {
	display: flex;
	flex-direction: column;
	gap: 12rem;
	position: sticky;
	top: 12rem; /* clears the fixed nav */
}

.story-impact__head {
	width: 83.333%;
	position: relative;
	z-index: 2; /* above the morphing image behind it */
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.story-impact__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--text-accent);
}

.story-impact__heading h2,
.story-impact__heading .h2 {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.story-impact__heading strong {
	color: var(--white);
	font-weight: inherit;
}

/* The portrait (.story-impact__media) and its one-shot scale reveal were REMOVED 2026-08-06 at the
   client's request (Revert 01: "remove the image from the layout and animation"). The left column is
   now just the sticky heading beside the tall right column — the same composition as the homepage
   stats "spread". Don't reintroduce without a written instruction. */

/* RIGHT — intro, stats, units stacked. */
.story-impact__right {
	display: flex;
	flex-direction: column;
	gap: 12rem;
	position: relative;
	z-index: 2; /* above the left column's morphing image while it's full-bleed */
}

.story-impact__intro {
	max-width: 83.333%;
	padding-top: 8rem; /* design body-copy pt-80 — drops the intro to align with the left heading */
}

.story-impact__intro p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	letter-spacing: var(--tracking-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* Stats */
.story-impact__stats {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

.story-impact__stat {
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
}

.story-impact__figure {
	margin: 0;
	font-size: var(--text-6xl);
	line-height: var(--leading-6xl);
	letter-spacing: var(--tracking-6xl);
	font-weight: var(--fontWeightLight);
	color: var(--white);
}

.story-impact__caption {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

/* Business units list */
.story-impact__units {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

.story-impact__units-heading h2,
.story-impact__units-heading h3,
.story-impact__units-heading .h3 {
	margin: 0;
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.story-impact__units-heading strong {
	color: var(--white);
	font-weight: inherit;
}

.story-impact__list {
	list-style: none;
	margin: 0;
	padding: 0;
	border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
}

/* margin:0 resets the global li margin/line-height so padding controls the row rhythm. */
.story-impact__item {
	margin: 0;
	display: flex;
	align-items: flex-start;
	padding: 4rem 0;
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.1);
}

.story-impact__num {
	flex-shrink: 0;
	width: 4rem;
	padding-top: 0.7rem;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-500);
}

.story-impact__unit {
	flex: 1;
	min-width: 0;
	font-size: var(--text-xl);
	line-height: var(--leading-xl);
	letter-spacing: var(--tracking-xl);
	font-weight: var(--fontWeightRegular);
	color: var(--white);
}

/* Tablet/landscape + mobile — collapse to one column. */
@media (max-width: 64rem) { /* 1024px */
	.story-impact__inner {
		grid-template-columns: 1fr;
		gap: 8rem;
	}
	.story-impact__left,
	.story-impact__right {
		gap: 8rem;
	}
	.story-impact__left {
		position: static; /* not sticky once stacked — it would overlap the right column below it */
		top: auto;
	}
	.story-impact__head {
		width: 100%;
	}
	.story-impact__intro {
		width: 100%;
		max-width: none;
		padding-top: 0;
	}
	.story-impact__stats {
		gap: 6rem;
	}
}

@media (max-width: 48rem) { /* 768px */
	.story-impact__left,
	.story-impact__right {
		gap: 6rem;
	}
	.story-impact__units {
		gap: 4rem;
	}
	.story-impact__item {
		padding: 3rem 0;
	}
}


/* ============================================================
   Page Hero — modules/page-hero.module
   Simple dark headline hero: lime Tomorrow tagline + large white headline. Figma 196:77.
   ============================================================ */
.page-hero {
	position: relative;
	color: var(--white);
}

.page-hero__inner {
	max-width: 84rem; /* ~7/12 cols, per the design */
	display: flex;
	flex-direction: column;
	gap: 3.2rem;
}

.page-hero__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-size: var(--tagline-base);
	line-height: var(--leading-tagline-base);
	letter-spacing: var(--tracking-tagline-base);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--text-accent);
}

.page-hero__heading h1,
.page-hero__heading h2,
.page-hero__heading .h1 {
	margin: 0;
	font-size: var(--text-6xl);
	line-height: var(--leading-6xl);
	letter-spacing: var(--tracking-6xl);
	font-weight: var(--fontWeightRegular);
	color: var(--white);
}

@media (max-width: 48rem) {
	.page-hero__inner {
		max-width: none;
		gap: 2rem;
	}
}


/* ============================================================
   Stories Listing — modules/stories-listing.module
   Filterable list of large customer-story cards (copy-left / photo-right with brand logo + tags),
   a line-style tab filter, and a "Load more" button, over 4 alternating orbs. Tab filter + load-more
   are client-side (module.js, DOM-driven). Figma 196:75 (desktop) / 196:224 (mobile).
   ============================================================ */
.stories-listing {
	position: relative;
	color: var(--white);
}

.stories-listing .container {
	position: relative;
	z-index: 1;
}

/* Pill tab bar: a FULL-WIDTH top rule (the hero/listing divider — breaks out of .container to the
   viewport edges via the ::before), and a container-width bottom rule, per the design.
   The row keeps its 8.8rem height exactly: Figma's pill row is padding-block 26 + a 36 pill + 26,
   the same 88 the line row got from a bare 88-tall tab. So swapping to pills moves nothing below it. */
/* ⚠️ NOT sticky. It was `position: sticky; top: 9.6rem` with a z-index above the cards, and the
   client rejected that (2026-08-04): "This is sticky on a scroll, and looks wrong when the images
   move behind it. Please can it stay at the top of the page." So the bar now scrolls away with the
   content. The translucent bg + backdrop-blur only existed to stop cards showing through while it
   floated, so they go too — on the flat canvas they'd just read as a slightly-off panel. The
   hairline rule stays (it's the design's divider under the filters). */
.stories-listing__tabs {
	position: relative;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.8rem;
	padding: 2.2rem 0;
	margin-bottom: 8rem;
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.1);
}

.stories-listing__tabs::before {
	content: "";
	position: absolute;
	top: 0;
	left: calc(50% - 50vw);
	width: 100vw;
	height: 0.1rem;
	background-color: rgba(255, 255, 255, 0.1);
}

/* PILL filter — Figma "Tab Wrapper - Pill" (196:205, pills 196:208-196:212). The designer BUILT this
   row and then switched it off (hidden="true") in favour of the line row, so the client request for
   pills (2026-08-18) is a switch to the design's own parked alternative, not an invention.
   Spec: height 36, radius 8, 12 side padding, row gap 8, label text-sm/Medium (14/20, DM Sans 500).
   ⚠️ The unselected label is Text/text-secondary (#bcc4d1 = --foundation-300), NOT the line tab
   text-tertiary — the pill fill carries some of the contrast, so the design lightens the label.
   ⚠️ There is no lime here. The line row signalled "current" with a 0.2rem lime underline; the pill
   row signals it by INVERTING the surface to solid white. Lime stays the accent elsewhere. */
.stories-listing__tab {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin: 0;
	/* ⚠️ This pill deliberately follows the MEGA-MENU "Contact Us" button
	   (.mega-menu-container .nav-cta, ~line 490) rather than Figma's filter pill. Trialled against
	   the designed one and approved by the client 2026-08-18 ("this actually looks great, let's lock
	   this in"). Differences from Figma 196:205: fully-rounded --radius-max instead of the 8px
	   --radius-sm, --text-base instead of --text-sm, and 0.9/1.8rem padding — so the pill stands
	   4.4rem tall rather than 3.6rem, which is why the row padding above is 2.2rem and not Figma's
	   2.6rem (2.2 + 4.4 + 2.2 still lands on exactly 8.8rem, so nothing below the bar moves).
	   Keep it in step with .nav-cta: if that button is ever restyled, this should follow it. */
	padding: 0.9rem 1.8rem;
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	border-radius: var(--radius-max);
	background-color: rgba(255, 255, 255, 0.05);
	cursor: pointer;
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-300);
	white-space: nowrap;
	transition: color 0.2s ease, background-color 0.2s ease;
}

/* Figma draws no hover for the pill, but a control needs an affordance — this is the smallest one
   that fits: the same glass step the Button/Fill/Light token uses, nudged one stop brighter. */
.stories-listing__tab:hover {
	background-color: rgba(255, 255, 255, 0.12);
	border-color: rgba(255, 255, 255, 0.2);
	color: var(--white);
}

/* Figma paints the selected pill with a separate absolutely-positioned _Tab Indicator behind it,
   because that row is single-select and the indicator slides between tabs. Ours is MULTI-select
   (client 2026-08-04), so several pills are pressed at once and one sliding indicator is impossible
   — each selected pill paints its own fill instead. Same rendering, one fewer element.
   ⚠️ DEPARTS FROM FIGMA, whose selected pill is a SOLID WHITE fill (Background/bg-primary-inverted)
   with a dark label. This follows .nav-cta instead: lime fill + --foundation-950 label, which
   measures 8.30:1 and passes AAA.
   ⚠️ Worth knowing why it landed here, so it does not get "simplified" back: an earlier pass shipped
   lime + WHITE on the client's instruction, which measured 2.10:1 against a 4.5:1 AA floor (and
   1.80:1 on the lighter --neon-pulse-500). Pointing the styling at the mega-menu pill fixed that as
   a side effect, because that button had already solved the same problem with a dark label.
   ⚠️ The per-card .stories-listing__tag.is-match is STILL lime + white (2.10:1). That mismatch is
   deliberate, not an oversight — the client reviewed the two side by side on 2026-08-18 and kept it. */
.stories-listing__tab.is-active {
	background-color: var(--neon-pulse-600);
	border-color: var(--neon-pulse-600);
	color: var(--foundation-950);
}

/* The nav CTA brightens to --neon-pulse-500 on hover; with a DARK label that reads correctly and
   actually improves contrast, so the trial adopts it rather than the glow the white-label version
   needed. The base :hover cannot reach this state anyway — equal specificity, .is-active is later. */
.stories-listing__tab.is-active:hover {
	background-color: var(--neon-pulse-500);
	border-color: var(--neon-pulse-500);
}

/* The line tab had no focus style of its own — the underline doubled as one. A pill needs an explicit
   ring, and it must sit INSIDE the bar: the mobile row is overflow-y:hidden, so a large offset would
   be clipped. 0.2rem + 0.2rem clears the 1.2rem mobile row padding comfortably. */
.stories-listing__tab:focus-visible {
	outline: 0.2rem solid var(--text-accent);
	outline-offset: 0.2rem;
}

/* Visually-hidden live region for the result count. The theme has no sr-only utility, so this is
   scoped to the module rather than added globally for a single consumer. */
.stories-listing__status {
	position: absolute;
	width: 0.1rem;
	height: 0.1rem;
	margin: -0.1rem;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* Card list */
.stories-listing__grid {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

/* --- Simulated-API loading state -------------------------------------------------------------
   The client asked for "a quick loading indicator, like really fast, while applying filters", so a
   filter change reads as a fetch rather than an instant local toggle (2026-08-18). The filtering
   itself is still entirely client-side and synchronous — this is presentation only, and module.js
   owns the timing.
   ⚠️ The skeleton cards deliberately REUSE .stories-listing__card / __copy / __media, so they
   inherit the real card flex row, the 400/300 media aspect-ratio and the ≤64rem stack-and-reorder
   for free. No card geometry is duplicated here, so the skeleton cannot drift from the real card
   when the card changes.
   Nothing in the design system covers this: the DS has no skeleton, spinner or shimmer component
   and no Components/Chip token group, so it is built from theme tokens. */
.stories-listing__skeletons {
	display: none;
}

.stories-listing.is-loading .stories-listing__grid {
	display: none;
}

.stories-listing.is-loading .stories-listing__skeletons {
	display: flex;
	flex-direction: column;
	gap: 8rem;
	pointer-events: none;
}

/* One placeholder block: a flat glass fill with a sheen travelling across it. background-size is
   200% so the gradient is twice the block width, which is what lets background-position carry it
   fully out of frame at both ends instead of stalling at the edges. */
.stories-listing__sk {
	overflow: hidden;
	background-color: rgba(255, 255, 255, 0.05);
	background-image: linear-gradient(
		90deg,
		transparent 0%,
		rgba(255, 255, 255, 0.07) 50%,
		transparent 100%
	);
	background-repeat: no-repeat;
	background-size: 200% 100%;
	animation: stories-listing-sheen 1.1s linear infinite;
}

@keyframes stories-listing-sheen {
	from { background-position: -100% 0; }
	to { background-position: 200% 0; }
}

.stories-listing__sk-lines {
	display: flex;
	flex-direction: column;
	gap: 1.2rem;
}

.stories-listing__sk--tag {
	width: 8rem;
	height: 2.8rem;
	border-radius: var(--radius-xs);
}

/* No width: a span in this column flex stretches, which gives the full-width title line. */
.stories-listing__sk--line {
	height: 2.8rem;
	border-radius: var(--radius-xs);
}

.stories-listing__sk--short {
	width: 55%;
}

.stories-listing__sk--link {
	width: 16rem;
	height: 2.4rem;
	border-radius: var(--radius-xs);
}

/* The sheen is decorative motion, so under reduced-motion the placeholder stays but holds still.
   (module.js also skips the delay entirely in that case, so this is belt-and-braces.) */
@media (prefers-reduced-motion: reduce) {
	.stories-listing__sk {
		animation: none;
	}
}

.stories-listing__card {
	display: flex;
	align-items: stretch;
	gap: 2.4rem;
}

/* `hidden` must win over display:flex (JS toggles it for filter + load-more). */
.stories-listing__card[hidden],
.stories-listing__more[hidden] {
	display: none;
}

.stories-listing__copy {
	flex: 1 1 0;
	min-width: 0;
	display: flex;
	flex-direction: column;
	justify-content: flex-start; /* top-align the copy with the photo, per the design (items-start) */
	gap: 4rem;
}

.stories-listing__cardhead {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.stories-listing__tags {
	display: flex;
	flex-wrap: wrap;
	gap: 0.8rem;
}

.stories-listing__tag {
	display: inline-flex;
	align-items: center;
	padding: 0.4rem 0.8rem;
	border-radius: 0.6rem;
	background-color: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightRegular);
	color: var(--foundation-300);
	white-space: nowrap;
	transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

/* A card tag turns lime when it is the tag that CAUSED the match, so the row answers "why is this
   story in my results?" at a glance (client 2026-08-18). module.js sets .is-match by comparing each
   tag's data-industry against the selected filters, so with "All" chosen the selection is empty,
   nothing matches, and every tag renders in its normal glass state — which is what was asked for.
   On a card with two industries where only one is filtered, only that one lights up.
   border-color goes lime too, or the fill would sit inside a visible grey outline.
   ⚠️ Contrast: white on #a1bf24 is 2.10:1 against a 4.5:1 AA floor, and it bites slightly harder
   here than it would elsewhere because the tag is --text-sm Regular rather than Medium.
   ⚠️ Note the active PILL above is NOT the same — it takes a dark --foundation-950 label (8.30:1)
   from .nav-cta. The two intentionally differ: the client reviewed them side by side on 2026-08-18
   and kept this one white. One-word fix if it is ever audited: color: var(--foundation-900). */
.stories-listing__tag.is-match {
	background-color: var(--neon-pulse-600);
	border-color: var(--neon-pulse-600);
	color: var(--white);
}

.stories-listing__title {
	margin: 0;
	max-width: 48rem;
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.stories-listing__link {
	display: inline-flex;
	align-items: center;
	gap: 0.8rem;
	width: fit-content;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Lime arrow, white label — per Figma 482:27334 (the "Read X's story" Button component), whose
   Default AND Hover arrow vectors are both #B4CC50 = --neon-pulse-500. The glyph itself is already
   byte-identical to the exported asset, so only the colour was wrong. Matches customer-stories. */
.stories-listing__arrow {
	width: 1.2rem;
	height: 1.2rem;
	flex-shrink: 0;
	color: var(--neon-pulse-500);
	transition: transform 0.2s ease;
}

.stories-listing__link:hover .stories-listing__arrow {
	transform: translateX(0.4rem);
}

/* Stretched click target over the whole photo (item 1, 13-Aug brief). Sits above the photo, shade
   and logo — none of which are interactive — so the entire image clicks through to the story. */
.stories-listing__medialink {
	position: absolute;
	inset: 0;
	z-index: 1;
}

/* Media — rounded photo with a bottom gradient + white brand logo bottom-left. */
.stories-listing__media {
	flex: 1 1 0;
	min-width: 0;
	position: relative;
	aspect-ratio: 400 / 300;
	overflow: hidden;
	border-radius: var(--radius-sm);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	transition: box-shadow 0.3s ease, border-color 0.3s ease;
}

/* Hover glow — same teal border-glow as the customer-stories / expertise-cards cards. */
.stories-listing__card:hover .stories-listing__media,
.stories-listing__card:focus-within .stories-listing__media {
	border-color: rgba(255, 255, 255, 0.16);
	box-shadow: 0 0 8rem rgba(1, 142, 154, 0.2);
}

.stories-listing__photo {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 0.5s cubic-bezier(0.38, 0.21, 0, 0.92);
}
/* Photo zoom on hover (client request) — clipped by .__media overflow:hidden. */
.stories-listing__card:hover .stories-listing__photo,
.stories-listing__card:focus-within .stories-listing__photo {
	transform: scale(1.05);
}
@media (prefers-reduced-motion: reduce) {
	.stories-listing__photo { transition: none; }
	.stories-listing__card:hover .stories-listing__photo,
	.stories-listing__card:focus-within .stories-listing__photo { transform: none; }
}

.stories-listing__shade {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 50%;
	pointer-events: none;
	background: linear-gradient(to bottom, rgba(19, 25, 45, 0), rgba(19, 25, 45, 0.6));
}

/* `right: 2rem` gives the (otherwise shrink-wrapped) box a width to cap against, so the per-story
   "Brand logo size" field can be pushed to 250% without the mark running off the photo. The logo
   still sits flush left — the box has no paint of its own. */
.stories-listing__logo {
	position: absolute;
	left: 2rem;
	right: 2rem;
	bottom: 2rem;
}

.stories-listing__logo img {
	display: block;
	height: auto;
	max-width: 100%;
}

/* Load more */
.stories-listing__actions {
	display: flex;
	justify-content: center;
	margin-top: 8rem;
}

.stories-listing__more {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 1.2rem 3.2rem;
	border-radius: var(--radius-max);
	border: 0.1rem solid rgba(255, 255, 255, 0.2);
	background: transparent;
	cursor: pointer;
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
	transition: background-color 0.2s ease, border-color 0.2s ease;
}

.stories-listing__more:hover {
	background-color: rgba(255, 255, 255, 0.08);
	border-color: rgba(255, 255, 255, 0.4);
}

/* Tablet/mobile (Figma 196:224): cards stack image-top / copy-below; tabs scroll horizontally. */
@media (max-width: 64rem) { /* 1024px */
	.stories-listing__card {
		flex-direction: column;
		gap: 2.4rem;
	}
	/* In the auto-height column, reset flex:1 1 0 (it would collapse the items) to natural sizing
	   so the photo keeps its aspect-ratio height and the copy uses its content height. */
	.stories-listing__copy,
	.stories-listing__media {
		flex: none;
		width: 100%;
	}
	.stories-listing__media {
		order: -1; /* photo on top, copy below */
	}
	.stories-listing__copy {
		justify-content: flex-start;
		gap: 2.4rem;
	}
	.stories-listing__title {
		max-width: none;
	}
}

@media (max-width: 48rem) { /* 768px */
	.stories-listing__tabs {
		--sl-fade: 4rem; /* width of the right-edge fade below; module.js reads this */
		flex-wrap: nowrap;
		gap: 0.8rem;
		/* 0.8rem + the 4.4rem pill + 0.8rem = 6rem, exactly Figma's 60px mobile filter row (196:366).
		   Figma has no mobile PILL row — only the line one — so the pill keeps its desktop geometry
		   and only the row padding steps down. */
		padding: 0.8rem 0;
		margin-bottom: 5rem;
		overflow-x: auto;
		/* ⚠️ overflow-y MUST stay hidden: `overflow-x: auto` forces the other axis off `visible`, so any
		   vertical overflow at all turns this into a Y scroll container that iOS will rubber-band. The
		   original culprit was the active tab's -0.1rem underline overhang; the pill row has no overhang
		   (the fill sits inside the row padding), but this stays as the guard that stopped that bug —
		   the focus ring is the next thing that could reach past the edge.
		   `touch-action: pan-x` was REMOVED: it was added to make "a vertical drag scroll the page, not
		   the tab bar", but pan-x DISABLES vertical panning for that gesture rather than delegating it,
		   and `overscroll-behavior: none` then blocked Y scroll-chaining too — together they froze the
		   page whenever a thumb landed on the filter bar (measured: 0px of page scroll). Constrain X
		   only; with no vertical overflow left, a vertical drag chains to the page on its own. */
		overflow-y: hidden;
		overscroll-behavior-x: contain;
		scrollbar-width: none;
		/* Full-bleed to 100vw + draw BOTH rules as borders so they span the whole screen and stay put
		   when the filters scroll horizontally (the desktop ::before is absolute → it scrolls with the
		   content). padding-left restores the page gutter so the first tab lines up with the content.
		   NO padding-right — the sticky ::after fade pins to right:0 (the padding edge), so any
		   padding-right would leave an un-faded strip between the fade and the screen edge. */
		margin-left: calc(50% - 50vw);
		margin-right: calc(50% - 50vw);
		padding-left: 2rem;
		border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
	}
	.stories-listing__tabs::before {
		display: none; /* the absolute top rule scrolls with the overflow; border-top (above) replaces it */
	}
	.stories-listing__tabs::-webkit-scrollbar {
		display: none;
	}
	/* Right-edge fade — a "there's more →" scroll affordance. A sticky flex ::after pinned to the
	   scrollport's right edge, fading the tabs into the canvas colour. margin-left:-4rem cancels its
	   flex footprint so it adds no scroll width; it's an opaque-to-canvas gradient (not a mask) so the
	   cards scrolling behind the sticky bar never show through the faded edge. pointer-events:none. */
	.stories-listing__tabs::after {
		content: "";
		position: sticky;
		right: 0;
		flex: 0 0 var(--sl-fade);
		align-self: stretch;
		margin-left: calc(var(--sl-fade) * -1);
		background: linear-gradient(to right, rgba(13, 18, 32, 0), #0d1220 80%);
		pointer-events: none;
		transition: opacity 0.2s ease;
	}

	/* Scrolled to the end there is nothing left to reveal, so the affordance is just covering the
	   last pill — which is what the client hit selecting "Related Industries", the last filter.
	   module.js also scrolls a newly selected pill clear of the fade. */
	.stories-listing__tabs.is-at-end::after {
		opacity: 0;
	}
	.stories-listing__tab {
		flex-shrink: 0;
	}
	.stories-listing__grid {
		gap: 5rem;
	}
	.stories-listing.is-loading .stories-listing__skeletons {
		gap: 5rem;
	}
	.stories-listing__actions {
		margin-top: 5rem;
	}
}


/* ============================================================
   Work Spotlight — modules/work-spotlight.module
   A single case highlight: tagline + white heading + grey intro on top, then a
   left single-open accordion (driven by the shared accordion helper in main.js)
   and a right rounded cover image. Dark canvas + orbs. Figma 308:4274 / 308:4466.
   ============================================================ */
.work-spotlight {
	position: relative;
	color: var(--white);
}

.work-spotlight .container {
	position: relative;
	z-index: 1;
}

.work-spotlight__inner {
	display: flex;
	flex-direction: column;
	gap: 12rem;
}

/* Header (tagline + heading + intro), constrained to ~7/12 cols */
.work-spotlight__header {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	max-width: 73rem;
}

.work-spotlight__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--text-accent);
}

.work-spotlight__heading h1,
.work-spotlight__heading h2,
.work-spotlight__heading .h2,
.work-spotlight__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Two-tone on the SITE convention: grey lead-in + white <strong>. The base used to be white, which
   made a <strong> invisible (white-on-white) — the client's homepage note "Hightlight/bold
   functionality not working here" on "Our global <strong>delivery capability</strong>". Applied via
   :has(strong) exactly like .partnerships__heading, so a heading typed WITHOUT a strong keeps
   rendering all-white and no existing page shifts unless its heading already uses bold. */
.work-spotlight__heading:has(strong) h1,
.work-spotlight__heading:has(strong) h2,
.work-spotlight__heading:has(strong) .h2,
.work-spotlight__heading:has(strong) p {
	color: var(--foundation-500);
}

.work-spotlight__heading strong {
	color: var(--white);
	font-weight: inherit;
}

.work-spotlight__intro {
	max-width: 52rem;
}

.work-spotlight__intro p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

/* Body: accordion (5/12) + image (6/12, offset one column) */
.work-spotlight__body {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	column-gap: 2.4rem;
	align-items: center; /* media sits inline (vertically centred) with the left-column content */
}

.work-spotlight__list {
	grid-column: 1 / span 5;
}

.work-spotlight__item {
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.1);
}

.work-spotlight__item:first-child {
	border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
}

/* Row header is the toggle button: title left + a +/- glass circle right */
.work-spotlight__head {
	width: 100%;
	display: flex;
	align-items: center;
	gap: 4rem;
	padding: 2.4rem 0;
	background: transparent;
	border: 0;
	cursor: pointer;
	text-align: left;
	color: inherit;
}

.work-spotlight__item-title {
	flex: 1 1 auto;
	min-width: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Shared accordion toggle — the +/- glass circle used by work-spotlight and
   delivery-stories. Open state is driven by .is-open on [data-accordion-item]. */
.accordion-toggle {
	position: relative;
	flex: none;
	width: 4rem;
	height: 4rem;
	border-radius: var(--radius-max);
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
}

.accordion-toggle::before,
.accordion-toggle::after {
	content: "";
	position: absolute;
	left: 50%;
	top: 50%;
	width: 1.4rem;
	height: 0.2rem;
	background: var(--white);
	transform: translate(-50%, -50%);
}

.accordion-toggle::after {
	transform: translate(-50%, -50%) rotate(90deg);
	transition: opacity 0.3s ease;
}

[data-accordion-item].is-open .accordion-toggle::after {
	opacity: 0; /* plus → minus */
}

/* Collapsible panel: grid-rows 0fr → 1fr; inner clips its overflow */
.work-spotlight__panel {
	display: grid;
	grid-template-rows: 0fr;
	transition: grid-template-rows 0.35s ease;
}

.work-spotlight__item.is-open .work-spotlight__panel {
	grid-template-rows: 1fr;
}

.work-spotlight__panel-inner {
	overflow: hidden;
	min-height: 0;
}

/* Padding only when open, so a collapsed panel clips fully to zero (no leaking padding). */
.work-spotlight__item.is-open .work-spotlight__panel-inner {
	padding-bottom: 2.4rem;
}

.work-spotlight__panel-inner p {
	margin: 0;
	padding-right: 2.4rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

/* Image (6/12, offset one column from the list) */
.work-spotlight__media {
	grid-column: 7 / span 6;
	aspect-ratio: 1 / 1;
	border-radius: 0.8rem;
	overflow: hidden;
}

.work-spotlight__media img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Tablet/mobile — stack: image on top, accordion below */
@media (max-width: 64rem) { /* 1024px */
	.work-spotlight__inner {
		gap: 6.4rem;
	}
	.work-spotlight__body {
		display: flex;
		flex-direction: column;
		gap: 4rem;
	}
	.work-spotlight__media {
		order: -1;
		width: 100%;
		max-width: 44rem;
	}
}

@media (max-width: 48rem) { /* 768px — --text-4xl doesn't step down, so use --text-3xl (28px) */
	.work-spotlight__heading h1,
	.work-spotlight__heading h2,
	.work-spotlight__heading .h2,
	.work-spotlight__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
}

@media (prefers-reduced-motion: reduce) {
	.work-spotlight__panel {
		transition: none;
	}
}


/* ============================================================
   Delivery Stories — modules/delivery-stories.module
   Tagline + two-tone heading, then a vertical single-open accordion of case
   studies (brand logo + title rows; open reveals a wide image + Context /
   Approach / Outcome). Shared accordion helper in main.js. Dark canvas + orb.
   Figma 308:4358 / 308:4547.
   ============================================================ */
.delivery-stories {
	position: relative;
	color: var(--white);
}

.delivery-stories .container {
	position: relative;
	z-index: 1;
}

.delivery-stories__inner {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

.delivery-stories__header {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.delivery-stories__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--text-accent);
}

.delivery-stories__heading h1,
.delivery-stories__heading h2,
.delivery-stories__heading .h2,
.delivery-stories__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.delivery-stories__heading strong {
	color: var(--white);
	font-weight: inherit;
}

/* Accordion rows */
.delivery-stories__item {
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.1);
}

.delivery-stories__item:first-child {
	border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
}

.delivery-stories__head {
	width: 100%;
	display: flex;
	align-items: center;
	gap: 2.4rem;
	padding: 2.4rem 0;
	background: transparent;
	border: 0;
	cursor: pointer;
	text-align: left;
	color: inherit;
}

.delivery-stories__brand {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	align-items: center;
	gap: 2.4rem;
}

.delivery-stories__logo {
	flex: none;
	width: 5.6rem;
	height: 5.6rem;
	border-radius: 0.8rem;
	overflow: hidden;
	display: flex;
	align-items: center;
	justify-content: center;
}

.delivery-stories__logo img {
	display: block;
	max-width: 76%;
	max-height: 76%;
	width: auto;
	height: auto;
	object-fit: contain;
}

.delivery-stories__title {
	flex: 1 1 auto;
	min-width: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Collapsible panel */
.delivery-stories__panel {
	display: grid;
	grid-template-rows: 0fr;
	transition: grid-template-rows 0.4s ease;
}

.delivery-stories__item.is-open .delivery-stories__panel {
	grid-template-rows: 1fr;
}

.delivery-stories__panel-inner {
	overflow: hidden;
	min-height: 0;
	display: flex;
	flex-direction: column;
	gap: 3.2rem;
}

.delivery-stories__item.is-open .delivery-stories__panel-inner {
	padding-bottom: 4rem;
}

.delivery-stories__media {
	border-radius: 0.8rem;
	overflow: hidden;
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	aspect-ratio: 8 / 3;
}

.delivery-stories__media img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.delivery-stories__text {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 1.6rem;
}

.delivery-stories__col {
	display: flex;
	flex-direction: column;
	gap: 0.4rem;
	padding-right: 4.8rem;
}

.delivery-stories__label {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.delivery-stories__body p {
	margin: 0;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

/* Tablet/mobile — stack the 3 columns; taller image ratio */
@media (max-width: 64rem) { /* 1024px */
	.delivery-stories__text {
		grid-template-columns: 1fr;
		gap: 2.4rem;
	}
	.delivery-stories__col {
		padding-right: 0;
	}
	.delivery-stories__media {
		aspect-ratio: 16 / 9;
	}
}

@media (max-width: 48rem) { /* 768px */
	.delivery-stories__inner {
		gap: 5rem;
	}
	.delivery-stories__logo {
		width: 4.8rem;
		height: 4.8rem;
	}
	/* --text-4xl doesn't step down → oversized on mobile; use --text-3xl */
	.delivery-stories__heading h1,
	.delivery-stories__heading h2,
	.delivery-stories__heading .h2,
	.delivery-stories__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
}

@media (prefers-reduced-motion: reduce) {
	.delivery-stories__panel {
		transition: none;
	}
}


/* ============================================================
   Expertise Cards — modules/expertise-cards.module
   Tagline + heading, then a row of translucent glass cards (title + "Learn more"
   link, hover-revealed description + teal border glow) over a decorative wave.
   Desktop 4-up grid; tablet 2-up; mobile scroll-snap carousel + pagination dots
   (module.js). Reuses the story-highlights wave PNG. Figma 308:4342 / 308:4530.
   ============================================================ */
.expertise-cards {
	position: relative;
	color: var(--white);
	/* Swiper pagination dots (mobile) — white active, white/20% inactive, per the design */
	--swiper-pagination-bullet-size: 0.6rem;
	--swiper-pagination-bullet-inactive-color: #ffffff;
	--swiper-pagination-bullet-inactive-opacity: 0.2;
	--swiper-pagination-color: #ffffff;
	--swiper-pagination-bullet-opacity: 1;
}

.expertise-cards .container {
	position: relative;
	z-index: 1;
}

/* Decorative wave behind the cards (reuses the story-highlights particle-wave PNG fallback). */
/* Three.js particle-wave <canvas> layer (fills the section behind the cards). The wave is
   edge-faded + transparent in the shader, so no hard edges; opacity keeps it subtle. */
.expertise-cards__wave {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	display: block;
	width: 100%;
	height: 100%;
	opacity: 0.7;
}

.expertise-cards__inner {
	display: flex;
	flex-direction: column;
	gap: 5.6rem;
}

.expertise-cards__header {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.expertise-cards__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans (was --font-tagline / Tomorrow) */
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--text-accent);
}

.expertise-cards__heading h1,
.expertise-cards__heading h2,
.expertise-cards__heading .h2,
.expertise-cards__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.expertise-cards__heading strong {
	color: var(--white);
	font-weight: inherit;
}

/* Card layout — desktop/tablet = CSS grid on .__track; mobile (≤768) = Swiper carousel.
   Swiper is only initialised on mobile, so the .swiper/.swiper-wrapper/.swiper-slide classes
   are inert above 768px, where the media queries below re-assert the grid. */
.expertise-cards__grid {
	position: relative;
}

/* Glass card: translucent white + heavy blur, title top, "Learn more" link bottom. */
.expertise-cards__card {
	position: relative;
	display: flex;
	flex-direction: column;
	padding: 3.2rem;
	aspect-ratio: 302 / 460;
	height: auto; /* override swiper.css .swiper-slide{height:100%} so aspect-ratio drives height */
	border-radius: 0.8rem;
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	-webkit-backdrop-filter: blur(4rem);
	backdrop-filter: blur(4rem);
	overflow: hidden;
	/* Glow/hover states ease LINEARLY (client request) — an even fade-in of the teal glow + border,
	   long enough to read as a gradual transition rather than a fast/instant snap. */
	transition: box-shadow 0.5s linear, border-color 0.5s linear;
}

.expertise-cards__card:hover {
	border-color: rgba(255, 255, 255, 0.16);
	box-shadow: 0 0 8rem rgba(1, 142, 154, 0.2); /* teal border glow, per the design */
}

.expertise-cards__card-copy {
	flex: 1 1 auto;
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
}

.expertise-cards__card-title {
	margin: 0;
	font-size: var(--text-xl);
	line-height: var(--leading-xl);
	letter-spacing: var(--tracking-xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Description is hidden at rest and, on hover, slides in from the left while fading in. */
.expertise-cards__card-desc {
	opacity: 0;
	transform: translateX(-2rem);
	transition: opacity 0.5s linear, transform 0.5s linear; /* linear hover reveal, matching the glow */
}

.expertise-cards__card:hover .expertise-cards__card-desc,
.expertise-cards__card:focus-within .expertise-cards__card-desc {
	opacity: 1;
	transform: translateX(0);
}

.expertise-cards__card-desc p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300); /* text-secondary #bcc4d1 — matches the design */
}

.expertise-cards__card-link {
	margin-top: 2.4rem;
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	width: fit-content;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Anchor variant: make the whole card clickable via a stretched hit area. */
a.expertise-cards__card-link::after {
	content: "";
	position: absolute;
	inset: 0;
}

.expertise-cards__arrow {
	width: 2.2rem;
	height: 2.2rem;
	flex-shrink: 0;
	color: var(--neon-pulse-500); /* lime arrow */
	transition: transform 0.2s ease;
}

.expertise-cards__card:hover .expertise-cards__arrow {
	transform: translateX(0.4rem);
}

/* Mobile carousel navigation row (prev · dots · next) — hidden on desktop/tablet */
.expertise-cards__nav {
	display: none;
}

.expertise-cards__navbtn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 4rem;
	height: 4rem;
	flex: none;
	padding: 0;
	border-radius: var(--radius-max);
	background: rgba(255, 255, 255, 0.08);
	border: 0.1rem solid rgba(255, 255, 255, 0.14);
	-webkit-backdrop-filter: blur(1rem);
	backdrop-filter: blur(1rem);
	color: var(--white);
	cursor: pointer;
	transition: background-color 0.2s ease, opacity 0.2s ease;
}

.expertise-cards__navbtn:hover {
	background: rgba(255, 255, 255, 0.16);
}

.expertise-cards__navbtn svg {
	width: 2rem;
	height: 2rem;
}

.expertise-cards__navbtn.swiper-button-disabled {
	opacity: 0.35;
	cursor: default;
}

/* Swiper pagination dots — sit inline in the nav row (not absolutely positioned) */
.expertise-cards__pagination {
	position: static;
	width: auto;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.6rem;
}

/* ≥769px — CSS grid (Swiper is NOT initialised at these widths, so re-assert the grid) */
@media (min-width: 48.0625rem) {
	.expertise-cards__grid {
		overflow: visible;
	}
	.expertise-cards__track {
		display: grid;
		grid-template-columns: repeat(4, 1fr);
		gap: 2.4rem;
		height: auto;
		transform: none !important;
	}
}

/* Tablet 769–1024px — 2-up grid */
@media (min-width: 48.0625rem) and (max-width: 64rem) {
	.expertise-cards__track {
		grid-template-columns: repeat(2, 1fr);
	}
	.expertise-cards__card {
		aspect-ratio: 302 / 360;
	}
}

/* Mobile ≤768px — Swiper carousel + visible descriptions + nav row */
@media (max-width: 48rem) {
	/* The Swiper container is a flex item in the column-flex .__inner; its default min-width:auto lets
	   it grow to the slides' combined width and blow past the viewport (→ last cards cut off / the
	   whole carousel spills off-screen). Pin it to the parent width + min-width:0 so overflow:hidden
	   clips the track and Swiper scrolls within the screen. */
	.expertise-cards__grid {
		width: 100%;
		min-width: 0;
	}
	/* --text-4xl never steps down (48px) → oversized; use --text-3xl (28px, 1 line) per the design */
	.expertise-cards__heading h1,
	.expertise-cards__heading h2,
	.expertise-cards__heading .h2,
	.expertise-cards__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.expertise-cards__card {
		/* Swiper runs slidesPerView:'auto' → it reads this width. 84% leaves the next card peeking. */
		width: 84%;
		max-width: 34rem;
		aspect-ratio: 302 / 420;
		/* No hover on touch → show the fuller "hover" glass (design mobile uses bg-card-hover 0.1) */
		background: rgba(255, 255, 255, 0.1);
	}
	/* On mobile the wave is smaller than the section, so its image edges + filament strands read
	   as hard diagonal lines. Scale it beyond the section (edges off-screen) + soften to an ambient glow. */
	.expertise-cards__wave {
		opacity: 0.5;
	}
	/* No hover on touch → show the description at rest (per the mobile design). */
	.expertise-cards__card-desc {
		opacity: 1;
		transform: none;
	}
	.expertise-cards__nav {
		display: flex;
		align-items: center;
		justify-content: space-between;
		width: 100%;
		max-width: 34.3rem;
		margin: 0 auto;
	}
}

@media (prefers-reduced-motion: reduce) {
	.expertise-cards__card,
	.expertise-cards__arrow,
	.expertise-cards__card-desc,
	.expertise-cards__navbtn {
		transition: none;
	}
}


/* ============================================================
   Leadership Grid — modules/leadership-grid.module
   A labelled group header + a 3-col grid of portrait leadership cards (photo +
   name + title; optional hover bio + LinkedIn). Placed twice (C-Suite; Executive
   Regional & Delivery). Dark canvas + orbs. Figma 308:2044 (card 308:2048).
   ============================================================ */
.leadership-grid {
	position: relative;
	color: var(--white);
}

.leadership-grid .container {
	position: relative;
	z-index: 1;
}

.leadership-grid__inner {
	display: flex;
	flex-direction: column;
	gap: 4rem;
}

/* Optional top divider between two stacked groups */
.leadership-grid.has-divider .leadership-grid__inner {
	border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
	padding-top: 8rem;
}

.leadership-grid__heading {
	margin: 0;
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.leadership-grid__grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	column-gap: 2.4rem;
	row-gap: 8rem;
}

.leadership-grid__card {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

/* Portrait photo, rounded, aspect 410:514 */
.leadership-grid__media {
	position: relative;
	aspect-ratio: 410 / 514;
	border-radius: 0.8rem;
	overflow: hidden;
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	/* Card backdrop = the real Figma teal blur asset (308:2048), covering the frame. The CSS
	   radial-gradient below it is a fallback if the image fails to load. This IS the card's
	   background — a (transparent-PNG) portrait sits ON TOP. */
	background:
		url("https://144479753.fs1.hubspotusercontent-eu1.net/hubfs/144479753/raw_assets/public/entelect_corporate/images/leadership/card-backdrop.png") center / cover no-repeat,
		radial-gradient(120% 110% at 50% 78%, #16454f 0%, #134149 42%, #0f3b45 72%, #0c3540 100%);
}

/* Transparent-background PNG portrait, layered ON TOP of the teal backdrop: bottom-anchored,
   natural aspect, centred, sized to the frame height (person floats on the teal). max-width:none
   overrides normalise's img{max-width:100%}. Centred via auto side margins. The photo stays put —
   on hover the bio panel sweeps up OVER it (below); the photo itself does not move. */
.leadership-grid__photo {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	margin-inline: auto;
	display: block;
	width: auto;
	height: 100%;
	max-width: none;
	object-fit: contain;
	object-position: bottom center;
}

/* Optional second portrait — wipes up over the main one on hover (clip-path eases both ways) */
.leadership-grid__hover {
	position: absolute;
	inset: 0;
	overflow: hidden;
	clip-path: inset(100% 0 0 0);
	transition: clip-path 0.4s ease;
}
/* ⚠️ Hover-driven reveals are gated to hover-capable FINE pointers. On touch, a tap latches sticky
   :hover on the card — and because the opened panel is a CHILD of the card, the closing tap lands on
   the panel and re-hovers the card, so an unguarded :hover rule holds the panel open forever no
   matter how many times the JS toggles .is-open off (the client's "once you try to collapse it it
   will not go back" — Revert 01). Touch devices use ONLY the .is-open class set by module.js. */
@media (hover: hover) and (pointer: fine) {
	.leadership-grid__card:hover .leadership-grid__hover {
		clip-path: inset(0 0 0 0);
	}
}
.leadership-grid__card.is-open .leadership-grid__hover {
	clip-path: inset(0 0 0 0);
}

/* Hover (desktop) — or tap / Enter / Space (touch + keyboard) — reveals the bio + socials,
   which sweep up over the photo. */
.leadership-grid__card.is-expandable {
	cursor: pointer;
}
.leadership-grid__card.is-expandable:focus-visible {
	outline: 0.2rem solid #018e9a;
	outline-offset: 0.3rem;
}
.leadership-grid__panel {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
	padding: 2.8rem;
	/* NAVY, matching the page canvas — the panel used to be rgba(9,26,33,.92), a dark teal that the
	   client read as green (Revert 02: "change the colour of the background when the text pops up to
	   the navy blue in the background instead of the green"). */
	background: color-mix(in srgb, var(--foundation-950) 92%, transparent);
	backdrop-filter: blur(1.2rem);
	-webkit-backdrop-filter: blur(1.2rem);
	transform: translateY(100%);
	visibility: hidden;
	transition: transform 0.4s ease, visibility 0s linear 0.4s;
}
/* Hover half gated to hover-capable fine pointers — see the note on .leadership-grid__hover above.
   .is-open stays unconditional: it is the ONLY open-trigger on touch, and the keyboard path too. */
@media (hover: hover) and (pointer: fine) {
	.leadership-grid__card.is-expandable:hover .leadership-grid__panel {
		transform: translateY(0);
		visibility: visible;
		transition: transform 0.4s ease, visibility 0s linear 0s;
	}
}
.leadership-grid__card.is-open .leadership-grid__panel {
	transform: translateY(0);
	visibility: visible;
	transition: transform 0.4s ease, visibility 0s linear 0s;
}

.leadership-grid__bio {
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	scrollbar-width: thin;
	scrollbar-color: rgba(255, 255, 255, 0.3) transparent;
}
.leadership-grid__bio::-webkit-scrollbar {
	width: 0.6rem;
}
.leadership-grid__bio::-webkit-scrollbar-thumb {
	background: rgba(255, 255, 255, 0.25);
	border-radius: var(--radius-max);
}
.leadership-grid__bio p {
	margin: 0 0 1.2rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300); /* text-secondary #bcc4d1 */
}
.leadership-grid__bio p:last-child {
	margin-bottom: 0;
}

.leadership-grid__socials {
	display: flex;
	gap: 1.2rem;
	flex: none;
	margin-top: auto;
}
.leadership-grid__social {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 3.6rem;
	height: 3.6rem;
	border-radius: var(--radius-max);
	background: rgba(255, 255, 255, 0.1);
	color: var(--white);
	flex: none;
	transition: background 0.2s ease;
}
.leadership-grid__social:hover {
	background: rgba(255, 255, 255, 0.2);
}
.leadership-grid__social svg {
	width: 1.8rem;
	height: 1.8rem;
}

/* Name/title on the left, the touch-only bio chevron pinned right (see .leadership-grid__chev). */
.leadership-grid__meta {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: 1.6rem;
}

.leadership-grid__meta-text {
	display: flex;
	flex-direction: column;
	gap: 0.4rem;
	flex: 1 1 auto;
	min-width: 0;
}

/* Bio-reveal affordance. The client's 28-Jul mobile note — "It isn't obvious on mobile that you need
   to click on the profile to view their bios. Can we add a the accordion icon (the arrow head,
   preferably) next to the names" — plus a hand-drawn chevron sketched at the right-hand end of the
   name row (an Ink annotation in Leadership - Mobile - Feedback - V2.pdf).
   Hidden on hover-capable pointers: there the bio already reveals on hover, and the desktop design
   is signed off. Shown wherever the device can't hover, and at tablet/mobile widths as well so it is
   still testable by resizing a desktop browser.
   ⚠️ Decorative only — aria-hidden, not a <button>. The CARD carries role="button"/aria-expanded, so
   keyboard and AT already work; a nested button would only add nested interactive content.
   Rest state points UP (matching the sketch AND the panel's motion — the bio slides UP over the
   photo); it flips to point down when open. To switch to the conventional down-at-rest, drop the
   rotate(180deg) here and put it on the .is-open rule instead. */
.leadership-grid__chev {
	display: none;
	flex: none;
	align-items: center;
	justify-content: center;
	width: 3.2rem;
	height: 3.2rem;
	border-radius: var(--radius-max);
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	color: var(--white);
	transform: rotate(180deg);
	transition: transform 0.4s ease, background 0.2s ease;
}

.leadership-grid__chev svg {
	width: 1.6rem;
	height: 1.6rem;
}

.leadership-grid__card.is-open .leadership-grid__chev {
	transform: rotate(0deg);
	background: rgba(255, 255, 255, 0.14);
}

@media (hover: none), (max-width: 64rem) { /* no hover at all, or tablet-and-below widths */
	.leadership-grid__card.is-expandable .leadership-grid__chev {
		display: inline-flex;
	}
}

@media (prefers-reduced-motion: reduce) {
	.leadership-grid__chev { transition: none; }
}

.leadership-grid__name {
	margin: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.leadership-grid__title {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300); /* text-secondary #bcc4d1 */
}

/* Tablet — 2 columns */
@media (max-width: 64rem) { /* 1024px */
	.leadership-grid__grid {
		grid-template-columns: repeat(2, 1fr);
		row-gap: 5.6rem;
	}
	.leadership-grid.has-divider .leadership-grid__inner {
		padding-top: 5.6rem;
	}
}

/* Mobile — single centred column */
@media (max-width: 48rem) { /* 768px */
	.leadership-grid__grid {
		grid-template-columns: 1fr;
		row-gap: 4rem;
		justify-items: center;
	}
	.leadership-grid__card {
		width: 100%;
		max-width: 40rem;
	}
}

/* ============================================================
   HOMEPAGE (Figma 378:4327) — dark single-canvas page.
   .home-page wrapper = the navy canvas (like .industries-page etc.); sections stay
   transparent so orbs bleed continuously across them.
   ============================================================ */
.home-page {
	background-color: var(--foundation-950);
}

.home-page section {
	position: relative;
	background-color: transparent !important;
}

.home-page .container {
	position: relative;
	z-index: 1;
}

/* ============================================================
   INDUSTRY CARDS (homepage "Our Industries", Figma 378:4400)
   ============================================================ */
.industry-cards {
	position: relative;
}

.industry-cards__inner {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

.industry-cards__headline {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	/* Figma 378:4405 wraps the heading to 3 lines ("We build software for" (grey, forced <br>) /
	   "mission-critical financial" / "systems"). Measured @48px: grey=447, "…financial"=515,
	   full white=699px — so the cap must sit in [515, 699) to drop "systems" to its own line.
	   Live DM Sans renders ~tighter than the Figma canvas, so the design's 7-col (740px) fits
	   the white run on one line; 68rem = 680px reproduces the design's break. Mobile (<680px
	   viewport) is unaffected and already wraps to 3 lines. */
	max-width: 68rem;
}

.industry-cards__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.industry-cards__heading h2,
.industry-cards__heading .h2,
.industry-cards__heading p {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.industry-cards__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.industry-cards__grid {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 2.4rem;
}

.industry-cards__card {
	position: relative;
	display: block;
	aspect-ratio: 302 / 460;
	border-radius: 0.8rem;
	overflow: hidden;
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	transition: border-color 0.3s ease, box-shadow 0.3s ease;
}

.industry-cards__photo {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 0.4s ease;
}

/* Top shade so the title reads over any photo. */
.industry-cards__shade {
	position: absolute;
	inset: 0;
	background: linear-gradient(to bottom, rgba(13, 18, 32, 0.75) 0%, rgba(13, 18, 32, 0.25) 30%, transparent 55%);
	pointer-events: none;
}

/* Full darkening overlay so the description + CTA read: off at rest on desktop, fades in on
   hover (with the copy), always on ≤768px (see the mobile block). */
.industry-cards__overlay {
	position: absolute;
	inset: 0;
	background: rgba(13, 18, 32, 0.55);
	opacity: 0;
	transition: opacity 0.35s ease;
	pointer-events: none;
}

.industry-cards__content {
	position: absolute;
	inset: 0;
	z-index: 1;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	gap: 1.6rem;
	padding: 2.4rem;
}

.industry-cards__copy {
	display: flex;
	flex-direction: column;
	gap: 0.8rem;
}

.industry-cards__title {
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Description + CTA: hidden on desktop, fade in on hover (mobile shows them — see below). */
.industry-cards__desc {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-200);
	opacity: 0;
	transition: opacity 0.35s ease;
}

.industry-cards__cta {
	display: inline-flex;
	align-items: center;
	gap: 0.8rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
	opacity: 0;
	transition: opacity 0.35s ease;
}

.industry-cards__cta-arrow {
	flex: none;
	color: var(--neon-pulse-500); /* lime arrow per the design */
}

.industry-cards__card:hover {
	border-color: color-mix(in srgb, var(--signal-teal-600) 60%, transparent);
	box-shadow: 0 0 3rem 0 color-mix(in srgb, var(--signal-teal-600) 25%, transparent);
}

.industry-cards__card:hover .industry-cards__photo {
	transform: scale(1.05);
}

/* Desktop hover (or keyboard focus): darken + fade the description + CTA in. */
.industry-cards__card:hover .industry-cards__overlay,
.industry-cards__card:focus-within .industry-cards__overlay {
	opacity: 1;
}

.industry-cards__card:hover .industry-cards__desc,
.industry-cards__card:hover .industry-cards__cta,
.industry-cards__card:focus-within .industry-cards__desc,
.industry-cards__card:focus-within .industry-cards__cta {
	opacity: 1;
}

@media (max-width: 64rem) { /* 1024px */
	.industry-cards__grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (max-width: 48rem) { /* 768px */
	.industry-cards__inner {
		gap: 5.6rem;
	}
	.industry-cards__grid {
		grid-template-columns: 1fr; /* single column ≤768px */
		gap: 1.6rem;
	}
	.industry-cards__card {
		aspect-ratio: 343 / 424; /* mobile design proportion (Figma 378:4733) */
	}
	/* Content is always visible on mobile (no hover) — show the overlay + description + CTA. */
	.industry-cards__overlay,
	.industry-cards__desc,
	.industry-cards__cta {
		opacity: 1;
	}
	.industry-cards__heading h2,
	.industry-cards__heading .h2,
	.industry-cards__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.industry-cards__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}
	.industry-cards__title {
		top: 1.6rem;
		left: 1.6rem;
		right: 1.6rem;
		font-size: var(--text-base);
		line-height: var(--leading-base);
	}
}

/* ============================================================
   CAPABILITY BANNER (homepage "AI Applied Engineering", Figma 378:4388)
   ============================================================ */
.capability-banner {
	position: relative;
}

.capability-banner__copy {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	max-width: 84rem; /* Figma 378:4394 — the heading column is ~845px (wider than the intro below) */
}

.capability-banner__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.capability-banner__heading h2,
.capability-banner__heading .h2,
.capability-banner__heading p {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-4xl); /* Figma 378:4394 — large 5-line heading (was --text-3xl) */
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.capability-banner__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.capability-banner__intro {
	max-width: 62rem; /* Figma 378:4395 — intro (~620px) is narrower than the heading above it */
}

.capability-banner__intro p {
	margin: 0 0 1.2rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

.capability-banner__intro p:last-child {
	margin-bottom: 0;
}

.capability-banner__cta {
	margin-top: 0.8rem;
}

/* Full-bleed artwork flush at the section's foot — Figma 378:4398. The image is used AS IS at
   NATURAL scale (no cover-zoom → not blown up); the clip is a touch shorter than the image's own
   height so the scroll parallax ([data-parallax] in main.js) drifts it vertically without exposing
   an edge. Editor rotate/flip via --img-rotate / --img-flip (module scope_css). */
.capability-banner__media {
	position: relative;
	margin-top: 8rem; /* Figma 378:4389 pb-80 → 80px between the copy and the image */
	width: 100%;
	height: 46vw; /* full-bleed band; the swirl (16:9) is ~56vw tall, so most shows — the complete shape,
	                 NOT a zoomed sub-crop. Sized a touch shorter than 50vw to leave pan headroom. */
	max-height: 68rem; /* Figma 378:4398 (720) less the pan headroom */
	overflow: hidden;
}

.capability-banner__img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	/* Parallax = a vertical PAN through the cover crop (no zoom, image used as-is). --parallax-y is a
	   PERCENT (set by main.js), so 50% ± (≤45%) stays inside 0–100% → never exposes an edge, at any
	   width. (A px clamp fails here: cover's object-position free space is negative.) */
	object-position: center calc(50% + var(--parallax-y, 0%));
	transform: rotate(var(--img-rotate, 0deg)) scaleX(var(--img-flip, 1)); /* editor rotate + flip only */
	will-change: object-position;
}
/* Reduced motion: the parallax engine no-ops, so --parallax-y stays 0 and the pan sits centred + static. */

@media (max-width: 48rem) { /* 768px */
	.capability-banner__media {
		margin-top: 6rem;
		height: 50rem; /* Figma 482:28844 — mobile Image frame is 375×500 (full-bleed, 500px tall) */
		max-height: none;
	}
	.capability-banner__img { /* parallax pan off on mobile — static centred cover */
		object-position: center;
	}
	.capability-banner__heading h2,
	.capability-banner__heading .h2,
	.capability-banner__heading p {
		font-size: var(--text-3xl); /* steps down from --text-4xl (was --text-2xl) */
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.capability-banner__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}
	/* Full-width CTA on mobile — Figma 482:28853 (SECONDARY BUTTON is 343px = full content width). */
	.capability-banner__cta .btn {
		display: flex;
		width: 100%;
		justify-content: center;
	}
}

/* ============================================================
   STATS — "spread" layout (homepage "The Numbers", Figma 378:4411):
   heading pinned left, figures in 2 columns on the right with a
   generous vertical rhythm. Reuses all the stats module internals.
   ============================================================ */
.stats.spread .stats__inner {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	column-gap: 2.4rem;
	align-items: start;
}

.stats.spread .stats__headline {
	grid-column: 1 / span 5;
	position: sticky;
	top: 14rem; /* keeps the heading in view while the figures scroll (clears the fixed nav) */
}

.stats.spread .stats__grid {
	grid-column: 7 / span 6;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	row-gap: 16rem;
}

@media (max-width: 64rem) { /* 1024px */
	.stats.spread .stats__inner {
		display: flex;
		flex-direction: column;
		gap: 8rem;
	}
	.stats.spread .stats__headline {
		position: static;
	}
	.stats.spread .stats__grid {
		row-gap: 8rem;
	}
}

/* Mobile (≤768px = 48rem) — Figma 378:4740: the spread stays a 2-column grid, heading
   pinned LEFT (sticky) + all figures in a SINGLE column on the RIGHT (16px gutter, ~64px
   between stats). Overrides the ≤64rem flex-column collapse above. */
@media (max-width: 48rem) { /* 768px */
	.stats.spread .stats__inner {
		display: grid;
		grid-template-columns: 1fr 1fr;
		column-gap: 1.6rem;
		align-items: start;
	}
	.stats.spread .stats__headline {
		grid-column: 1;
		position: sticky;
		top: 8rem; /* keeps the heading in view while the figures scroll (clears the fixed mobile nav) */
		max-width: none;
	}
	.stats.spread .stats__grid {
		grid-column: 2;
		grid-template-columns: minmax(0, 1fr);
		row-gap: 6.4rem;
	}
}

/* ============================================================
   AWARDS (homepage "Our Awards", Figma 378:4428)
   ============================================================ */
.awards {
	position: relative;
}

.awards__inner {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

.awards__headline {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 1.6rem;
	max-width: 72rem;
	margin: 0 auto;
	text-align: center;
}

.awards__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.awards__heading h2,
.awards__heading .h2,
.awards__heading p {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-3xl);
	line-height: var(--leading-3xl);
	letter-spacing: var(--tracking-3xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.awards__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Two award slots per row; a lone last award spans the full row, centred
   (same odd-count trick as the partners mobile grid). */
.awards__grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	row-gap: 5.6rem;
	column-gap: 2.4rem;
}

.awards__item {
	display: flex;
	align-items: center;
	justify-content: space-between; /* laurels pushed to the item edges, body centred (Figma 482:22954) */
	gap: 1.6rem;
	max-width: 48rem; /* design item is max-w-480px, centred in its column */
	width: 100%;
	margin-inline: auto;
}

.awards__item:last-child:nth-child(odd) {
	grid-column: 1 / -1;
}

.awards__laurel {
	flex: none;
	width: 4.4rem;
	height: 8.6rem;
}

.awards__laurel--right {
	transform: scaleX(-1);
}

.awards__body {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.8rem;
	text-align: center;
	min-width: 0;
}

/* Logo tinted to the design's uniform grey. The source <img> is hidden (kept only to size the box to the
   logo's natural, capped proportions); the ::after paints the logo SHAPE in --foundation-400 (#9da4b2) via
   a mask, so every logo reads as the same muted grey as the Figma design regardless of its source colour. */
.awards__logo {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	max-width: 20rem;
}
.awards__logo img {
	display: block;
	width: auto;
	height: auto;
	max-height: 2rem;
	max-width: 20rem;
	object-fit: contain;
	opacity: 0; /* coloured source hidden; the ::after grey mask is what renders */
}
.awards__logo::after {
	content: "";
	position: absolute;
	inset: 0;
	background-color: var(--foundation-400); /* #9da4b2 — the design's uniform logo grey (text-tertiary) */
	-webkit-mask: var(--awards-logo) center / contain no-repeat;
	mask: var(--awards-logo) center / contain no-repeat;
	pointer-events: none;
}
/* Fallback: if mask isn't supported, show the source logo instead of a solid grey block. */
@supports not ((-webkit-mask: url("#")) or (mask: url("#"))) {
	.awards__logo img { opacity: 1; }
	.awards__logo::after { display: none; }
}

.awards__title {
	margin: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.awards__years {
	margin: 0;
	display: flex;
	gap: 0.9rem;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400); /* #9da4b2 — design text-tertiary (was --foundation-500, too dark) */
}

@media (max-width: 64rem) { /* 1024px */
	.awards__grid {
		grid-template-columns: 1fr;
		row-gap: 4rem;
	}
	.awards__item:last-child:nth-child(odd) {
		grid-column: auto;
	}
}

@media (max-width: 48rem) { /* 768px */
	.awards__inner {
		gap: 5.6rem;
	}
	.awards__heading h2,
	.awards__heading .h2,
	.awards__heading p {
		font-size: var(--text-2xl);
		line-height: var(--leading-2xl);
	}
	.awards__laurel {
		width: 3.2rem;
		height: 6.3rem;
	}
	.awards__item {
		gap: 1.6rem;
	}
}

/* ============================================================
   ANNOUNCEMENT BANNER (homepage Gartner card, Figma 466:8029)
   ============================================================ */
/* ============================================================
   CTA — "Announcement Card" variant (Figma 466:8029). A glass card in the
   cta-form family: a top-left blue/teal glow easing to navy at the bottom-right,
   a particle globe rising as a horizon at the card foot, and centred heading +
   subheading + pill. Selected via the module's Usage dropdown (usage="announcement").
   ============================================================ */
.call-to-action.announcement {
	position: relative;
}

.cta-announcement__card {
	position: relative;
	isolation: isolate;
	display: flex;
	flex-direction: column;
	align-items: center;
	min-height: 47rem;
	padding: 8rem 3.2rem 0; /* 80px top (Figma) — the copy sits in the clean upper field */
	border-radius: 0.8rem;
	overflow: hidden;
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	/* Blue/teal glow strongest TOP-LEFT → navy toward the bottom-right (the Figma glow blobs). */
	background:
		radial-gradient(90% 130% at 2% -10%, color-mix(in srgb, var(--azure-600) 55%, transparent), transparent 55%),
		radial-gradient(70% 110% at 34% -25%, color-mix(in srgb, var(--signal-teal-600) 42%, transparent), transparent 55%),
		radial-gradient(85% 120% at 104% 42%, color-mix(in srgb, var(--azure-600) 26%, transparent), transparent 60%),
		linear-gradient(158deg, #0b2338 0%, #08172c 55%, #060f20 100%);
}

/* Particle globe placed large + low so only its top dome shows as a horizon at the card
   foot (Figma globe: top ~16%, ~112% wide, centred). z-index 0 — behind the content. */
.cta-announcement__globe {
	position: absolute;
	left: 50%;
	top: 20%;
	transform: translateX(-50%);
	width: 108%;
	max-width: none;
	aspect-ratio: 1 / 1; /* the WebGL <canvas> needs an explicit box; the globe sphere sits centred in it */
	pointer-events: none;
	z-index: 0;
	mix-blend-mode: plus-lighter; /* dots add light over the card's glow, like the cta-form globe */
	opacity: 0.9;
}

.cta-announcement__content {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 1.2rem;
	text-align: center;
	max-width: 76rem;
}

.cta-announcement__heading {
	margin: 0;
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.cta-announcement__sub {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

.cta-announcement__cta {
	margin-top: 2.4rem; /* Figma button-wrapper pt 24px */
}

.cta-announcement__cta .btn.pill {
	display: inline-flex;
	align-items: center;
	gap: 0.8rem;
}

@media (max-width: 48rem) { /* 768px */
	/* Inset the card from the screen edges so it reads as a card, not a full-width band (client: "we need
	   padding on the sides on mobile"). It was rendering full-bleed (edge-to-edge). */
	.cta-announcement__card {
		margin-left: 1.6rem;
		margin-right: 1.6rem;
		min-height: 46rem;
		padding: 6rem 2.4rem 0;
	}
	.cta-announcement__heading {
		font-size: var(--text-xl); /* keeps the heading wrapping to ~2 lines on a phone (text-2xl would be 3+) */
		line-height: var(--leading-xl);
	}
	/* Taller/narrower card → push the globe dome below the copy so the text stays clean. */
	.cta-announcement__globe {
		width: 150%;
		top: 52%; /* pushed lower → bigger gap between the CTA and the globe dome on mobile */
	}
}

/* ============================================================
   CUSTOMER STORIES — "home" layout (Figma 468:4608): the first story
   renders as a big photo with its copy BESIDE it; the rest in a 3-across
   row of wide (16:9-ish) cards. Reuses the customer-stories internals.
   ============================================================ */
/* Headline row: the design (Figma 468:4613) holds the heading to ~847px on the left so it
   wraps to 3 lines, with the "Explore all customer stories" pill parked at the far right.
   The base rule makes .__headline flex:1 (grabs the full width → one long line here), so cap it. */
.customer-stories.home .customer-stories__head {
	justify-content: space-between;
}
.customer-stories.home .customer-stories__headline {
	flex: 0 1 auto;
	max-width: 84rem; /* ≈ Figma 468:4614 (847px) — reproduces the 3-line grey/white break */
}

/* One grid drives the whole layout: the featured card spans all three tracks
   (with its copy beside the photo), the remaining cards flow 3-across below. */
.customer-stories.home .customer-stories__grid {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	column-gap: 2.4rem;
	row-gap: 8rem;
}

.customer-stories.home .customer-stories__card--featured {
	grid-column: 1 / -1;
	display: grid;
	grid-template-columns: 2fr 1fr;
	column-gap: 2.4rem;
	align-items: start;
}

.customer-stories.home .customer-stories__card--featured .customer-stories__media {
	aspect-ratio: 845 / 445;
}

.customer-stories.home .customer-stories__card--featured .customer-stories__copy {
	padding-top: 0;
}

.customer-stories.home .customer-stories__card--featured .customer-stories__title {
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	max-width: none;
}

.customer-stories.home .customer-stories__desc p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

/* The remaining stories: wide (16:9-ish) cards, copy below the photo. */
.customer-stories.home .customer-stories__card:not(.customer-stories__card--featured) {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.customer-stories.home .customer-stories__card:not(.customer-stories__card--featured) .customer-stories__media {
	aspect-ratio: 411 / 244;
}

@media (max-width: 64rem) { /* 1024px */
	.customer-stories.home .customer-stories__grid {
		grid-template-columns: 1fr;
		row-gap: 4.8rem;
	}
	.customer-stories.home .customer-stories__card--featured {
		grid-template-columns: 1fr;
		row-gap: 2.4rem;
	}
}

/* ============================================================
   WORK SPOTLIGHT — per-item media swap + "plain" image style
   (homepage "Global Delivery", Figma 378:4594)
   ============================================================ */
/* Stacked per-item images crossfade inside the media frame. */
.work-spotlight__media {
	position: relative;
}

.work-spotlight__swap {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	opacity: 0;
	transition: opacity 0.45s ease;
}

.work-spotlight__swap.is-active {
	opacity: 1;
}

/* Plain style: no photo-card frame — the artwork floats on the canvas over a soft glow. */
.work-spotlight.plain-image .work-spotlight__media {
	border: 0;
	border-radius: 0;
	background: none;
	overflow: visible;
}

.work-spotlight.plain-image .work-spotlight__media::before {
	content: "";
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	width: 58rem;
	height: 58rem;
	max-width: 120%;
	border-radius: 50%;
	background: radial-gradient(circle, color-mix(in srgb, var(--azure-600) 22%, transparent), transparent 68%);
	pointer-events: none;
}

.work-spotlight.plain-image .work-spotlight__swap {
	inset: auto;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	width: min(36rem, 92%); /* Figma pictogram ~360px, centred over the glow (was filling the panel) */
	height: auto;
	object-fit: contain;
	padding: 0;
}

/* Homepage "Global Delivery" (Figma 378:4594) is a feature LIST, not the What We Do accordion:
   inactive titles greyed → white when the item is open, and a small chevron (›) toggle that just
   recolours (grey→white) instead of the +/- glass circle. Scoped to .plain-image (homepage only). */
/* Homepage feedback: "Shorten this gap too please" — the space between the intro copy and the
   accordion list. The base .work-spotlight__inner gap is 12rem; the Global Delivery composition
   reads better tighter. Scoped to .plain-image so the What We Do case-study layout keeps its 12rem. */
.work-spotlight.plain-image .work-spotlight__inner {
	gap: 6.4rem;
}

.work-spotlight.plain-image .work-spotlight__head {
	align-items: flex-start;
}

.work-spotlight.plain-image .work-spotlight__item-title {
	color: var(--foundation-500);
	transition: color 0.3s ease;
}

.work-spotlight.plain-image .work-spotlight__item.is-open .work-spotlight__item-title {
	color: var(--white);
}

.work-spotlight.plain-image .accordion-toggle {
	width: 2rem;
	height: 2rem;
	margin-top: 0.4rem;
	border: 0;
	background: none;
	background-color: var(--foundation-500);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M8.33333 15L7.15833 13.825L10.975 10L7.15833 6.175L8.33333 5L13.3333 10L8.33333 15Z' fill='%23000'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M8.33333 15L7.15833 13.825L10.975 10L7.15833 6.175L8.33333 5L13.3333 10L8.33333 15Z' fill='%23000'/%3E%3C/svg%3E") center / contain no-repeat;
	transition: background-color 0.3s ease;
}

.work-spotlight.plain-image .accordion-toggle::before,
.work-spotlight.plain-image .accordion-toggle::after {
	display: none;
}

.work-spotlight.plain-image .work-spotlight__item.is-open .accordion-toggle {
	background-color: var(--white);
}

/* ============================================================
   LEADERSHIP CAROUSEL (homepage "Our People", Figma 378:4595)
   ============================================================ */
.leadership-carousel {
	position: relative;
}

.leadership-carousel__inner {
	display: flex;
	flex-direction: column;
	gap: 6.4rem;
}

.leadership-carousel__head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 2.4rem;
}

.leadership-carousel__headline {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	max-width: 63rem;
}

.leadership-carousel__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.leadership-carousel__heading h2,
.leadership-carousel__heading .h2,
.leadership-carousel__heading p {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.leadership-carousel__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.leadership-carousel__intro p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
	max-width: 63rem;
}

.leadership-carousel__cta {
	flex: none;
}

/* The below-carousel CTA is mobile-only (desktop uses the one in the head, top-right). */
.leadership-carousel__cta--below {
	display: none;
}

/* Dot pagination — mobile only (desktop uses the scrollbar + arrows). */
.leadership-carousel__dots.swiper-pagination {
	position: static;
	display: none;
	width: auto;
	margin: 0; /* NO auto margins — they'd absorb the free space and break the controls space-between */
	--swiper-pagination-color: var(--white);
	--swiper-pagination-bullet-inactive-color: var(--white);
	--swiper-pagination-bullet-inactive-opacity: 0.25;
	--swiper-pagination-bullet-size: 0.8rem;
}

/* Cards: fixed-width slides (Swiper slidesPerView:'auto'), teal-backdrop frame +
   transparent cutout portrait — the same treatment as the leadership grid. */
.leadership-carousel__viewport {
	width: 100%;
	overflow: hidden;
}

.leadership-carousel__slide {
	width: 41rem;
	display: flex;
	flex-direction: column;
	gap: 0.8rem;
}

.leadership-carousel__frame {
	position: relative;
	aspect-ratio: 410 / 514;
	border-radius: 0.8rem;
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	overflow: hidden;
	/* Teal blur backdrop (real Figma asset) with a gradient fallback while it loads. */
	background:
		url("https://144479753.fs1.hubspotusercontent-eu1.net/hubfs/144479753/raw_assets/public/entelect_corporate/images/leadership/card-backdrop.png") center / cover no-repeat,
		radial-gradient(120% 90% at 50% 10%, #0d3c46 0%, #092530 55%, #071a22 100%);
}

/* --- Bio reveal (item 4, 13-Aug brief). Mirrors leadership-grid so the two leadership sections
   behave identically: the panel sweeps up over the photo, full bio scrolls if it overflows, social
   links pinned at the foot. The frame already has position:relative + overflow:hidden. --- */
.leadership-carousel__frame.is-expandable {
	cursor: pointer;
}

.leadership-carousel__panel {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
	padding: 2.8rem;
	background: color-mix(in srgb, var(--foundation-950) 92%, transparent);
	backdrop-filter: blur(1.2rem);
	-webkit-backdrop-filter: blur(1.2rem);
	transform: translateY(100%);
	visibility: hidden;
	transition: transform 0.4s ease, visibility 0s linear 0.4s;
}

/* Hover half gated to hover-capable fine pointers, so a touch device never gets a stuck panel
   from an emulated hover. Touch uses .is-open from module.js instead. */
@media (hover: hover) and (pointer: fine) {
	.leadership-carousel__frame.is-expandable:hover .leadership-carousel__panel {
		transform: translateY(0);
		visibility: visible;
		transition: transform 0.4s ease, visibility 0s linear 0s;
	}
}

.leadership-carousel__frame.is-open .leadership-carousel__panel {
	transform: translateY(0);
	visibility: visible;
	transition: transform 0.4s ease, visibility 0s linear 0s;
}

/* Full bios can be 1,200-1,600 characters, so the bio is the scroll owner. flex + min-height:0 is
   required — a percentage height would not resolve here. */
.leadership-carousel__bio {
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	overscroll-behavior: contain;
	scrollbar-width: thin;
	scrollbar-color: rgba(255, 255, 255, 0.3) transparent;
}

.leadership-carousel__bio::-webkit-scrollbar {
	width: 0.6rem;
}

.leadership-carousel__bio::-webkit-scrollbar-thumb {
	background: rgba(255, 255, 255, 0.25);
	border-radius: var(--radius-max);
}

.leadership-carousel__bio p {
	margin: 0 0 1.2rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

.leadership-carousel__bio p:last-child {
	margin-bottom: 0;
}

.leadership-carousel__socials {
	display: flex;
	gap: 1.2rem;
	flex: none;
	margin-top: auto;
}

.leadership-carousel__social {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 3.6rem;
	height: 3.6rem;
	border-radius: var(--radius-max);
	background: rgba(255, 255, 255, 0.1);
	color: var(--white);
	flex: none;
	transition: background 0.2s ease;
}

.leadership-carousel__social:hover {
	background: rgba(255, 255, 255, 0.2);
}

.leadership-carousel__social svg {
	width: 1.8rem;
	height: 1.8rem;
}

/* Name/role on the left, the touch-only chevron pinned right. */
.leadership-carousel__meta {
	display: flex;
	align-items: center;
	gap: 1.2rem;
	margin-top: 1.6rem;
}

.leadership-carousel__meta-text {
	min-width: 0;
}

/* Hidden wherever hover works — there the panel is discoverable by hovering. Shown on touch, where
   it is the only cue that the card opens (same reasoning as leadership-grid's chevron). */
.leadership-carousel__chev {
	display: none;
	flex: none;
	align-items: center;
	justify-content: center;
	width: 3.2rem;
	height: 3.2rem;
	margin-left: auto;
	border-radius: var(--radius-max);
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	color: var(--white);
	transform: rotate(180deg);
	transition: transform 0.4s ease, background 0.2s ease;
}

/* The SVG carries only a viewBox, so with no explicit size it has no intrinsic
   dimensions and the circle renders empty. .leadership-grid__chev svg sizes its copy
   the same way; this rule was missed when the chevron was brought over. */
.leadership-carousel__chev svg {
	width: 1.6rem;
	height: 1.6rem;
}

@media (hover: none), (pointer: coarse) {
	.leadership-carousel__chev {
		display: inline-flex;
	}
}

.leadership-carousel__frame.is-open ~ .leadership-carousel__meta .leadership-carousel__chev,
.leadership-carousel__slide:has(.is-open) .leadership-carousel__chev {
	transform: rotate(0deg);
	background: rgba(255, 255, 255, 0.14);
}

.leadership-carousel__photo {
	position: absolute;
	left: 50%;
	bottom: 0;
	transform: translateX(-50%);
	height: 100%;
	width: auto;
	max-width: none;
	object-fit: contain;
	object-position: bottom center;
}

.leadership-carousel__name {
	margin: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.leadership-carousel__role {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* Controls: draggable progress line + round glass arrows (Figma 378:4595 bottom). */
.leadership-carousel__controls {
	display: flex;
	align-items: center;
	gap: 4.8rem;
}

/* ⚠️ Keep the scrollbar in the flex row (scrollbar left, arrows right, ONE line). The vendored
   swiper.css `.swiper-scrollbar.swiper-scrollbar-horizontal` (0,2,0) sets position:absolute +
   full width, which pulls it out of the row → arrows drop onto their own line. Override with a
   higher-specificity selector (0,3,0) and reset the absolute offsets so flex:1 governs. */
.leadership-carousel__controls .leadership-carousel__scrollbar.swiper-scrollbar {
	position: relative;
	left: auto;
	right: auto;
	top: auto;
	bottom: auto;
	flex: 1;
	width: auto;
	height: 0.2rem;
	border-radius: 999.9rem;
	background: rgba(255, 255, 255, 0.12);
}

.leadership-carousel__scrollbar .swiper-scrollbar-drag {
	height: 100%;
	border-radius: 999.9rem;
	background: var(--foundation-300);
	cursor: grab;
}

.leadership-carousel__nav {
	display: flex;
	gap: 1.6rem;
}

.leadership-carousel__arrow {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 4.8rem;
	height: 4.8rem;
	padding: 0;
	border-radius: 50%;
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	background: rgba(255, 255, 255, 0.05);
	color: var(--white);
	cursor: pointer;
	transition: background-color 0.2s ease, border-color 0.2s ease, opacity 0.2s ease;
}

.leadership-carousel__arrow:hover {
	background: rgba(255, 255, 255, 0.12);
	border-color: rgba(255, 255, 255, 0.2);
}

.leadership-carousel__arrow.swiper-button-disabled {
	opacity: 0.35;
	cursor: default;
	pointer-events: none;
}

@media (max-width: 64rem) { /* 1024px */
	.leadership-carousel__head {
		flex-direction: column;
		align-items: flex-start;
	}
	.leadership-carousel__slide {
		width: 32rem;
	}
}

@media (max-width: 48rem) { /* 768px */
	.leadership-carousel__inner {
		gap: 4.8rem;
	}
	.leadership-carousel__heading h2,
	.leadership-carousel__heading .h2,
	.leadership-carousel__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.leadership-carousel__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}
	.leadership-carousel__slide {
		width: 27rem;
	}
	/* CTA drops below the carousel; the scrollbar → DOTS on the left, prev/next arrows kept on the
	   right (Figma 378:4915: dots left / arrows right, then the full-width CTA below). */
	.leadership-carousel__cta--head { display: none; }
	.leadership-carousel__cta--below {
		display: block;
		align-self: stretch;
	}
	.leadership-carousel__cta--below .btn {
		display: flex;
		width: 100%;
		justify-content: center;
	}
	.leadership-carousel__scrollbar { display: none; }
	.leadership-carousel__dots.swiper-pagination {
		display: flex;
		align-items: center;
	}
	.leadership-carousel__controls {
		gap: 2.4rem;
		justify-content: space-between;
		align-items: center;
	}
}

/* ============================================================
   TESTIMONIALS SLIDER — "split" layout (homepage "Customer
   testimonials", Figma 378:4596): heading left, big italic quote +
   profile + prev/next arrows right. No card chrome.
   ============================================================ */
.testimonial-slider.split .testimonial-slider__split {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	column-gap: 2.4rem;
	align-items: start;
}

.testimonial-slider.split .testimonial-slider__intro-col {
	grid-column: 1 / span 4;
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	text-align: left; /* base card layout centres the heading/tagline — left-align for split */
}

.testimonial-slider.split .testimonial-slider__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.testimonial-slider.split .testimonial-slider__heading {
	margin: 0;
	text-align: left; /* override the base card heading's centre-align */
}

.testimonial-slider.split .testimonial-slider__heading h2,
.testimonial-slider.split .testimonial-slider__heading .h2,
.testimonial-slider.split .testimonial-slider__heading p {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.testimonial-slider.split .testimonial-slider__heading strong {
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.testimonial-slider.split .testimonial-slider__quote-col {
	grid-column: 5 / span 8;
	display: flex;
	flex-direction: column;
	gap: 4.8rem;
	padding-top: 22rem; /* the quote block starts ~224px down (Figma 378:4600 y=224), below the heading */
	min-width: 0; /* grid/flex item: never let the slider's measured width dictate the column */
}

/* ⚠️ Reset the base card-layout slide padding (9rem 16.6666% — the 2/12 side spacers) which
   otherwise insets the quote to ~617px + centres it. In split the quote fills the 66% column. */
.testimonial-slider.split .swiper-slide {
	display: block;
	padding: 0;
}

.testimonial-slider.split .testimonial {
	width: 100%;
	max-width: none;
	margin: 0;
	display: flex;
	flex-direction: column;
	align-items: flex-start; /* base card layout centres this — left-align for split */
	gap: 6.4rem; /* Figma: 64px between quote text and the bottom row */
	text-align: left;
}

.testimonial-slider.split .testimonial__quote,
.testimonial-slider.split .testimonial__quote p {
	margin: 0;
	font-size: var(--text-2xl);
	line-height: 1.4;
	font-weight: var(--fontWeightLight);
	font-style: italic;
	color: var(--foundation-200);
}

.testimonial-slider.split .testimonial__profile {
	display: flex;
	flex-direction: row; /* base card layout is a centred column — split is avatar BESIDE name */
	align-items: center;
	gap: 1.6rem;
	margin: 0;
}

.testimonial-slider.split .testimonial__photo {
	width: 4.8rem;
	height: 4.8rem;
	border-radius: 50%;
	overflow: hidden;
	background: var(--white);
	flex: none;
}

.testimonial-slider.split .testimonial__photo img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.testimonial-slider.split .testimonial__person {
	display: flex;
	flex-direction: column;
	align-items: flex-start; /* base card layout centres these → role indents under name; left-align */
	gap: 0.2rem;
}

.testimonial-slider.split .testimonial__name {
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.testimonial-slider.split .testimonial__role {
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-400);
}

/* prev/next round glass arrows pinned to the quote column's lower-right */
.testimonial-slider.split .testimonial-slider__nav {
	display: flex;
	justify-content: flex-end;
	gap: 1.6rem;
	margin-top: -4.8rem; /* rides up beside the profile row */
}

.testimonial-slider.split .testimonial-slider__arrow {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 4.8rem;
	height: 4.8rem;
	padding: 0;
	border-radius: 50%;
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	background: rgba(255, 255, 255, 0.05);
	color: var(--white);
	cursor: pointer;
	transition: background-color 0.2s ease, border-color 0.2s ease, opacity 0.2s ease;
}

.testimonial-slider.split .testimonial-slider__arrow:hover {
	background: rgba(255, 255, 255, 0.12);
	border-color: rgba(255, 255, 255, 0.2);
}

@media (max-width: 64rem) { /* 1024px */
	.testimonial-slider.split .testimonial-slider__split {
		display: flex;
		flex-direction: column;
		gap: 4.8rem;
		/* ⚠️ The desktop rule sets `align-items: start`, which is right for the GRID (align the two
		   columns to the top). Here the same container is a flex COLUMN, where align-items governs the
		   HORIZONTAL axis instead — so `start` sized each child to its content rather than the
		   container, and the slider's measured width (see .testimonial-swiper) escaped to 33,554,432px,
		   running the quote off the screen. Stretch is what a stacked mobile layout wants. */
		align-items: stretch;
	}
	.testimonial-slider.split .testimonial-slider__quote-col {
		padding-top: 0;
	}
	.testimonial-slider.split .testimonial__quote,
	.testimonial-slider.split .testimonial__quote p {
		font-size: var(--text-xl);
		line-height: var(--leading-xl);
	}
	.testimonial-slider.split .testimonial {
		gap: 4rem;
	}
	.testimonial-slider.split .testimonial-slider__nav {
		margin-top: 0;
	}
}



















































/* ============================================================
   ABOUT PAGE — new module blocks (appended 2026-07-21)
   ============================================================ */

/* ---------- about-carousel ---------- */
/* ============================================================
   about-carousel — full-bleed 100vw image carousel (About page)
   FULL-BLEED: no .container (deliberate). Structural CSS only;
   field-driven bg colour / spacing / focal point live inline.
   ============================================================ */
.about-carousel {
	position: relative;
	width: 100vw;
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	overflow: hidden;
}

/* The band itself — desktop landscape 9/5, cropped square on mobile */
.about-carousel__viewport {
	position: relative;
	width: 100%;
	aspect-ratio: 9 / 5;
	overflow: hidden;
}

.about-carousel__swiper {
	width: 100%;
	height: 100%;
}

.about-carousel__swiper .swiper-wrapper {
	height: 100%;
}

.about-carousel__slide {
	width: 100%;
	height: 100%;
}

.about-carousel__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center center;
}

/* (1) Top scrim — dissolves the band into the navy canvas above */
.about-carousel__gradient {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 33.7rem;
	pointer-events: none;
	z-index: 2;
	background: linear-gradient(
		180deg,
		var(--foundation-950) 0%,
		color-mix(in srgb, var(--foundation-950) 93%, transparent) 28%,
		color-mix(in srgb, var(--foundation-950) 75%, transparent) 55%,
		transparent 100%
	);
}

/* (2) Prev / next arrow buttons — dark-glass circles */
.about-carousel__buttons {
	position: absolute;
	top: 50%;
	left: 0;
	transform: translateY(-50%);
	width: 100%;
	display: flex;
	justify-content: space-between;
	padding-inline: 8rem;
	pointer-events: none;
	z-index: 3;
}

.about-carousel__btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 1.6rem;
	border-radius: var(--radius-max);
	border: 0.1rem solid color-mix(in srgb, var(--foundation-950) 10%, transparent);
	background: color-mix(in srgb, var(--foundation-950) 25%, transparent);
	backdrop-filter: blur(3rem);
	-webkit-backdrop-filter: blur(3rem);
	cursor: pointer;
	pointer-events: auto;
	transition: background 0.25s ease;
}

.about-carousel__btn:hover {
	background: color-mix(in srgb, var(--foundation-950) 35%, transparent);
}

.about-carousel__btn img {
	display: block;
	width: 1.4rem;
	height: 1.4rem;
}

.about-carousel__btn.swiper-button-disabled {
	opacity: 0.35;
	cursor: default;
}

/* (3) Pagination — glass dot pill */
.about-carousel__pagination.swiper-pagination {
	position: absolute;
	left: 50%;
	transform: translateX(-50%);
	bottom: 5.6rem;
	width: auto;
	display: flex;
	align-items: center;
	gap: 0.6rem;
	padding: 0.8rem;
	border-radius: var(--radius-max);
	border: 0.1rem solid color-mix(in srgb, var(--foundation-950) 15%, transparent);
	background: color-mix(in srgb, var(--foundation-950) 15%, transparent);
	backdrop-filter: blur(2rem);
	-webkit-backdrop-filter: blur(2rem);
	z-index: 3;
	--swiper-pagination-bullet-size: 0.6rem;
	--swiper-pagination-color: #fff;
	--swiper-pagination-bullet-inactive-color: #fff;
	--swiper-pagination-bullet-inactive-opacity: 0.2;
}

.about-carousel__pagination.swiper-pagination .swiper-pagination-bullet {
	margin: 0;
}

/* ── Mobile ≤768px — square crop + tighter chrome ── */
@media (max-width: 48rem) {
	.about-carousel__viewport {
		aspect-ratio: 1 / 1;
	}
	.about-carousel__gradient {
		height: 12rem;
	}
	.about-carousel__buttons {
		padding-inline: 1.6rem;
	}
	.about-carousel__btn {
		padding: 1rem;
	}
	.about-carousel__btn img {
		width: 1.2rem;
		height: 1.2rem;
	}
	.about-carousel__pagination.swiper-pagination {
		bottom: 2.4rem;
	}
}

/* Reduced motion — kill the button transition */
@media (prefers-reduced-motion: reduce) {
	.about-carousel__btn {
		transition: none;
	}
}

/* ---------- intro-statement ---------- */
/* ============================================================
   INTRO STATEMENT — centred gradient-text statement (About page).
   Field-driven bg colour / spacing + per-orb glows are inline (scope_css).
   Figma: desktop 482:22908 / mobile 482:23109.
   ============================================================ */
.intro-statement {
	position: relative;
	color: var(--white);
}

.intro-statement .container {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	align-items: center;
}

.intro-statement__text {
	max-width: 104.2rem;
	text-align: center;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	/* Gradient text — azure -> teal -> codebase green, left to right. */
	background: linear-gradient(to right, var(--azure-600) 7%, var(--signal-teal-600) 49%, var(--codebase-green-600) 118%);
	-webkit-background-clip: text;
	background-clip: text;
	color: transparent;
	-webkit-text-fill-color: transparent;
}

/* The [data-reveal-lines] engine (scripts/main.js › splitBlock) replaces the <p>'s text
   with per-line <span class="reveal-line"><span class="reveal-line__inner" data-reveal>…</span></span>.
   background-clip:text on the <p> cannot clip the child glyphs, so the gradient must also
   live on the glyph-bearing .reveal-line__inner. Each line therefore carries the full
   gradient across its own width (per-line, not one continuous sweep across all lines). */
.intro-statement__text .reveal-line__inner {
	background: linear-gradient(to right, var(--azure-600) 7%, var(--signal-teal-600) 49%, var(--codebase-green-600) 118%);
	-webkit-background-clip: text;
	background-clip: text;
	color: transparent;
	-webkit-text-fill-color: transparent;
}

/* ⚠️ Ghost fix: `background-clip:text` on the <p> clips the gradient to ALL its
   descendant text, so once the engine splits the <p> into lines the <p> keeps
   painting a STATIC gradient copy of the text (at final position) UNDER the
   animating .reveal-line__inner lines — the "initial text" the reveal lands on.
   Once split (has .reveal-line children) the gradient lives on the inners, so
   strip it from the <p>. The base rule above still carries the gradient for the
   un-split fallback (no-JS / reduced-motion), where the <p> renders its own text. */
.intro-statement__text:has(.reveal-line) {
	background: none;
	-webkit-background-clip: border-box;
	background-clip: border-box;
}

/* Force the per-line clip to actually contain the gradient glyphs. The masked slide-up
   hides each line by translating .reveal-line__inner below the .reveal-line overflow:hidden
   clip — but a plain overflow clip does NOT contain a background-clip:text (gradient) child
   (its composited text-fill escapes), so the "hidden" line leaked. `contain: paint` makes
   .reveal-line a hard paint boundary that clips the gradient text, so the slide reads cleanly.
   Scoped to intro-statement — the hero's solid-colour line reveal is unaffected. */
.intro-statement .reveal-line {
	contain: paint;
}

/* Mobile keeps the large --text-4xl size (per design); just guarantee no horizontal
   overflow on very narrow (<=375px) screens by allowing long words to wrap. */
@media (max-width: 23.4375rem) {
	.intro-statement__text {
		overflow-wrap: break-word;
		word-break: break-word;
	}
}

/* ---------- location-map ---------- */
/* =========================================================================
   LOCATION MAP — "Where We Operate" interactive world map (Entelect dark
   design, Figma 482:22931 desktop / 482:23132 mobile, on about.html)
   Centred head (tagline + heading + body) over a dotted world-map SVG with
   grey location pins; the active pin is a lime dot + halo with a tooltip.
   Section bg colour + spacing + per-orb glows are field-driven inline
   (scope_css). Everything static / structural lives here under .location-map.
   ========================================================================= */
.location-map {
	position: relative;
	color: var(--white);
}

.location-map .container {
	position: relative;
	z-index: 1;
}

/* --- Head: centred tagline + heading + body --- */
.location-map__head {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 2rem;
	max-width: 84.7rem;
	margin: 0 auto;
	text-align: center;
}

.location-map__tagline {
	margin: 0;
	/* the 2.4rem tagline→text gap (design) on top of the 2rem column gap */
	margin-bottom: 0.4rem;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--neon-pulse-500);
}

.location-map__heading {
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	font-weight: var(--fontWeightMedium);
	letter-spacing: var(--tracking-4xl);
	color: var(--white);
}

.location-map__heading h1,
.location-map__heading h2,
.location-map__heading h3,
.location-map__heading p {
	margin: 0;
	font-size: inherit;
	line-height: inherit;
	font-weight: inherit;
	letter-spacing: inherit;
	color: inherit;
}

/* Optional two-tone: base stays white, <strong> also white (bold emphasis) */
.location-map__heading strong,
.location-map__heading b {
	font-weight: inherit;
	color: var(--white);
}

.location-map__body {
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

.location-map__body p {
	margin: 0;
	font-size: inherit;
	line-height: inherit;
	font-weight: inherit;
	color: inherit;
}

/* --- Map --- */
.location-map__map {
	position: relative;
	height: 55.9rem;
	margin-top: 8rem;
}

/* (a) soft teal glow behind the map */
.location-map__glow {
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	width: 94.8rem;
	height: 55.9rem;
	max-width: none;
	background: radial-gradient(ellipse, color-mix(in srgb, var(--signal-teal-600) 18%, transparent), transparent 70%);
	z-index: 0;
	pointer-events: none;
}

/* (b) map + pins share this map-sized box (centred, height-bound) so each pin's left/top %
   is relative to the MAP art, not the wider wrapper -> pins land on their countries. */
.location-map__plot {
	position: absolute;
	left: 50%;
	top: 0;
	transform: translateX(-50%);
	height: 100%;
	aspect-ratio: 1140 / 559;
	z-index: 1;
}

/* dotted world-map SVG (transparent - dots only; baked bg stripped so the glow shows through) */
.location-map__world {
	display: block;
	width: 100%;
	height: 100%;
	max-width: none; /* override normalise img{max-width:100%} */
}

/* (c) location pins — pos_x/pos_y (inline left/top %) mark the dot CENTRE */
.location-map__dot {
	position: absolute;
	transform: translate(-50%, -50%);
	width: 0.8rem;
	height: 0.8rem;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: #bfc2cc; /* grey pin — no exact palette token; local literal per spec */
	cursor: pointer;
	/* smooth grow/shrink + glow as the active state moves from one pin to another (JS-driven) */
	transition: width 0.2s ease, height 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
	z-index: 2;
}

.location-map__dot.is-active {
	width: 1.6rem;
	height: 1.6rem;
	background: var(--neon-pulse-600);
	/* soft static glow so the active pin reads as highlighted between ping pulses */
	box-shadow: 0 0 1.6rem 0.1rem color-mix(in srgb, var(--neon-pulse-500) 40%, transparent);
	/* the active pin shows its tooltip by default → lift it above sibling pins so their dots
	   (each z-index:2, its own stacking context) don't paint over the tooltip (e.g. Zimbabwe over SA) */
	z-index: 3;
}

/* a hovered / focused / tapped pin (and its tooltip) rises above everything, incl. the active one */
.location-map__dot:hover,
.location-map__dot:focus-visible,
.location-map__dot.is-open {
	z-index: 4;
}

/* Expanding "ping" ring: a lime border that grows out from the active pin and fades away, looping
   (a radar-ping). Sized to the dot (width/height:100% + scale) so it adapts to the smaller mobile
   pin automatically. box-sizing:border-box keeps the ring's outer edge flush with the pin at scale 1. */
.location-map__dot.is-active::before {
	content: "";
	position: absolute;
	left: 50%;
	top: 50%;
	width: 100%;
	height: 100%;
	box-sizing: border-box;
	border-radius: 50%;
	border: 0.1rem solid var(--neon-pulse-500);
	transform: translate(-50%, -50%) scale(1);
	opacity: 0.8;
	z-index: -1;
	pointer-events: none;
	animation: location-map-ping 2.4s ease-out infinite;
}

@keyframes location-map-ping {
	0%   { transform: translate(-50%, -50%) scale(1);   opacity: 0.8; }
	100% { transform: translate(-50%, -50%) scale(4.5); opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
	.location-map__dot.is-active::before { animation: none; }
	.location-map__dot { transition: none; }
}

/* --- Tooltip --- */
.location-map__tooltip {
	position: absolute;
	z-index: 1; /* above the active pin's ::before halo (z-index:-1); the pin's own z-index lifts it over other pins */
	bottom: calc(100% + 1rem);
	left: 50%;
	/* --tip-shift (px, set by module.js) nudges the pill horizontally so it never runs off the screen
	   edge when its hub sits near the map edge (e.g. UK/NZ on mobile); the arrow below counter-shifts to
	   keep pointing at the dot. 0 by default (centred). */
	transform: translateX(calc(-50% + var(--tip-shift, 0px))) translateY(0.4rem);
	background: var(--neon-pulse-600);
	color: var(--foundation-900);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	padding: 0.4rem 1.2rem;
	border-radius: 0.4rem;
	white-space: nowrap;
	box-shadow: 0 0.8rem 0.8rem color-mix(in srgb, var(--foundation-900) 50%, transparent);
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.2s ease, transform 0.2s ease;
}

/* downward triangle beneath the tooltip */
.location-map__tooltip::after {
	content: "";
	position: absolute;
	top: 100%;
	left: calc(50% - var(--tip-shift, 0px)); /* counter the pill's --tip-shift so the arrow stays over the dot */
	transform: translateX(-50%);
	border-left: 1.1rem solid transparent;
	border-right: 1.1rem solid transparent;
	border-top: 1.2rem solid var(--neon-pulse-600);
}

/* Only the active pin shows its tooltip. Hover / tap / focus moves the .is-active state (module.js)
   to that pin — so exactly one tooltip is ever visible, and it's the last one you interacted with. */
.location-map__dot.is-active .location-map__tooltip {
	opacity: 1;
	transform: translateX(calc(-50% + var(--tip-shift, 0px))) translateY(0);
}

/* ============================================================
   STATIC MAP (Style tab → "Static map (all pins shown)")
   Client revert 2026-09-18: "make all the pins visible, so that the globe isn't interactive, but
   rather static". Every hub gets the lime pin + its label, and nothing responds to hover or tap.
   The radar ping stays off here — it is an attention cue for ONE active pin; seven of them pulsing
   is noise. Labels collide at these pin spacings (measured: SA/Zimbabwe 35px apart with a 90px
   label overlap, UK/Netherlands 29px apart with 120px), so module.js flips whichever label would
   land on an already-placed one to .is-below and the arrow flips with it.
   ============================================================ */
.location-map.is-static .location-map__dot {
	width: 1.6rem;
	height: 1.6rem;
	background: var(--neon-pulse-600);
	box-shadow: 0 0 1.6rem 0.1rem color-mix(in srgb, var(--neon-pulse-500) 40%, transparent);
	cursor: default;
	pointer-events: none;
}

.location-map.is-static .location-map__dot::before {
	content: none; /* no ping */
}

.location-map.is-static .location-map__tooltip {
	opacity: 1;
	transform: translateX(calc(-50% + var(--tip-shift, 0px))) translateY(0);
	transition: none; /* nothing animates in, so a transition would only show on resize reflow */
}

/* Flipped label: sits under its pin instead of over it, arrow on top. */
.location-map.is-static .location-map__dot.is-below .location-map__tooltip {
	bottom: auto;
	top: calc(100% + 1rem);
}

.location-map.is-static .location-map__dot.is-below .location-map__tooltip::after {
	top: auto;
	bottom: 100%;
	border-top: 0;
	border-bottom: 1.2rem solid var(--neon-pulse-600);
}

/* Lift whichever pin owns the label being read so a neighbour's dot never paints over it. */
.location-map.is-static .location-map__dot {
	z-index: 3;
}

/* --- Mobile (≤48rem / 768px): zoom + pan the map to Africa --- */
/* Mobile country selector: hidden on desktop (hover works there); the 48rem block below shows it. */
.location-map__selector {
	display: none;
}

@media (max-width: 48rem) {
	.location-map {
		padding-left: 1.6rem;
		padding-right: 1.6rem;
	}

	.location-map__head {
		gap: 1.2rem;
	}

	.location-map__tagline {
		margin-bottom: 0.4rem;
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}

	.location-map__heading {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}

	/* Map matches Figma 482:23134 mobile EXACTLY: a full-bleed window 31.5rem (315px) tall showing the
	   world map (aspect 1140/559) scaled to that height (~642px wide) and PANNED so its centre sits 12.6rem
	   (126px) left of centre — the eastern hemisphere (Africa → India → Australia/NZ) fills the frame and
	   the AMERICAS ARE INTENTIONALLY EXCLUDED (design map = 643px wide, centre at 50%−126.06px). overflow
	   clips to the window; the dots ride the plot on their % positions. Full-bleed to match the w-full
	   wrapper. ⚠️ Do NOT "fix" this to show the whole world — the partial map is the design. */
	.location-map__map {
		width: 100vw;
		margin-left: calc(50% - 50vw);
		margin-right: calc(50% - 50vw);
		height: 31.5rem;
		margin-top: 6.4rem;
		overflow: hidden;
	}

	/* ⚠️ The glow must stay INSIDE the 31.5rem map window. .location-map__map has overflow:hidden
	   here (it clips the deliberately panned plot), so any part of this glow reaching the window's
	   top or bottom edge is HARD-CUT and reads as a straight bright line across the section — that
	   was the client's 28-Jul mobile note, "the gradient is cut off by the section above and it
	   results in a harsh line". It was 39.1rem tall in a 31.5rem window, bleeding 3.8rem past each
	   edge (measured). At 29rem the gradient's 70% transparent stop lands ~1.4rem inside the window
	   edge, so it fades out completely before it can be clipped. Do not raise this above ~31rem. */
	.location-map__glow {
		width: 31.6rem;
		height: 29rem;
	}

	.location-map__plot {
		transform: translateX(calc(-50% - 12.6rem));
	}

	.location-map__dot.is-active {
		width: 1.2rem;
		height: 1.2rem;
	}

	/* On phones the dots are DISPLAY-ONLY and the selector chips below are the control. Measured on
	   a real iPhone: 8x8px pins with UK/NL 16.6px apart — 0 of 7 dead-centre taps registered, so no
	   hit-box enlargement can rescue them (Revert 02: the client proposed the selector themselves). */
	.location-map__dot {
		pointer-events: none;
	}

	/* ⚠️ overflow-y MUST be hidden. Setting `overflow-x: auto` forces the other axis off `visible`,
	   so this row computed to `overflow-y: auto` — and the active chip's underline (below) gave it
	   1px of real vertical overflow. On iOS even 1px of scrollability makes a container swallow a
	   vertical drag instead of passing it to the page, so the row detached and rubber-banded: the
	   client's "the filters can be pulled down and stretched". overscroll-behavior-x stops the
	   horizontal overscroll bouncing or chaining into a back-swipe.
	   Do NOT add overscroll-behavior-y — blocking Y chaining would stop the PAGE scrolling whenever
	   a drag starts on the chips. (`-webkit-overflow-scrolling: touch` removed: a no-op since iOS 13
	   and the legacy momentum mode that rubber-banded.) */
	.location-map__selector {
		display: flex;
		gap: 2.8rem;
		overflow-x: auto;
		overflow-y: hidden;
		overscroll-behavior-x: contain;
		scrollbar-width: none;
		margin-top: 1.6rem;
		border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
		border-bottom: 0.1rem solid rgba(255, 255, 255, 0.1);
	}

	.location-map__selector::-webkit-scrollbar {
		display: none;
	}
}

/* Mobile country selector — the Customer Stories filter-tab treatment (the client's stated
   reference): quiet grey labels, white + lime underline when active, horizontally scrollable.
   ⚠️ The desktop `display:none` lives ABOVE the 48rem media block (source order — equal specificity
   means the later rule wins, and the mobile `display:flex` must be the later one). */
.location-map__chip {
	position: relative;
	flex: none;
	margin: 0;
	padding: 0 0.2rem;
	height: 5.6rem; /* a real ≥44px touch target — the whole point of this control */
	border: 0;
	background: transparent;
	cursor: pointer;
	font-family: var(--primaryFont);
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-400);
	white-space: nowrap;
	transition: color 0.2s ease;
}

.location-map__chip.is-active {
	color: var(--white);
}

/* ⚠️ `bottom: 0`, never a negative value — the row above is a horizontal scroll container, and any
   overhang here becomes vertical overflow that lets the whole strip be dragged down on iOS. Sitting
   flush inside the chip puts the bar directly on top of the container's bottom rule, as designed. */
.location-map__chip.is-active::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 0.2rem;
	background-color: var(--text-accent);
}

.location-map__chip:focus-visible {
	outline: 0.2rem solid var(--neon-pulse-500);
	outline-offset: -0.4rem;
}

/* ============================================================
   Rich Text — modules/rich-text.module
   Long-form copy (privacy policy, terms, cookie policy) on the dark canvas. Built because the
   only richtext module in the theme was the legacy `content` module, which overrides .container
   with max-width:97rem + margin:0 — so it never lines up with the rest of the page. Here the
   .container is left alone and the reading-width cap sits on .rich-text__body instead.
   Styles the OUTPUT of the editor, so authors write plain Heading 2 / paragraph / list and get
   the right result without reaching for inline colours.
   ============================================================ */
.rich-text {
	position: relative;
}

/* ~82rem keeps long-form text near the 65-75 character measure that stays readable. `full`
   removes the cap for anyone who wants edge-to-edge copy. */
.rich-text__body {
	max-width: 82rem;
}

.rich-text.full .rich-text__body {
	max-width: none;
}

.rich-text__body > :first-child {
	margin-top: 0;
}

.rich-text__body > :last-child {
	margin-bottom: 0;
}

.rich-text__body h2 {
	margin-top: 6.4rem;
	margin-bottom: 2.4rem;
	color: var(--white);
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
}

.rich-text__body h3 {
	margin-top: 4rem;
	margin-bottom: 1.6rem;
	color: var(--white);
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
}

.rich-text__body p,
.rich-text__body li {
	margin-bottom: 1.6rem;
	color: var(--foundation-300);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	letter-spacing: var(--tracking-base);
}

.rich-text__body ul,
.rich-text__body ol {
	margin: 0 0 1.6rem;
	padding-left: 2.4rem;
}

.rich-text__body li {
	margin-bottom: 0.8rem;
}

.rich-text__body strong {
	color: var(--white);
	font-weight: var(--fontWeightMedium);
}

/* Lime + underlined, matching the form consent links — a policy page is exactly where a link
   must not disappear into the body colour. */
.rich-text__body a {
	color: var(--neon-pulse-500);
	text-decoration: underline;
	text-underline-offset: 0.2rem;
}

.rich-text__body a:hover {
	color: var(--white);
}

@media (max-width: 48rem) { /* 768px */
	.rich-text__body h2 {
		margin-top: 4.8rem;
		font-size: var(--text-xl);
		line-height: var(--leading-xl);
		letter-spacing: var(--tracking-xl);
	}
	.rich-text__body h3 {
		margin-top: 3.2rem;
	}
}

/* ---------- impact-bento ---------- */
/* ============================================================
   Impact Bento — modules/impact-bento.module
   Entelect "Foundation" impact-stats bento: left-aligned two-tone headline +
   intro over ~half the width, then a 5-card glass bento grid (tall left card +
   2x2 right) that becomes a mobile Swiper carousel. Dark canvas + wave + orbs.
   Figma 482:23054 (desktop) / 482:23233 (mobile).
   ============================================================ */
.impact-bento {
	position: relative;
	overflow: hidden;
	color: var(--white);
}

/* Decorative LIVE three.js particle-wave <canvas> (the SAME wave as expertise-cards). Behind
   content; the wave is edge-faded + transparent in the shader, so opacity just keeps it subtle. */
.impact-bento__wave {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	display: block;
	width: 100%;
	height: 100%;
	opacity: 0.7;
}

@media (max-width: 48rem) {
	.impact-bento__wave { opacity: 0.5; }
}

.impact-bento .container {
	position: relative;
	z-index: 1;
}

.impact-bento__inner {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

/* ---- Headline (left-aligned, ~half width) ---- */
.impact-bento__headline {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 2rem;
	max-width: 63rem;
}

.impact-bento__tagline {
	margin: 0;
	color: var(--neon-pulse-500);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
}

.impact-bento__heading {
	color: var(--foundation-500);
}

.impact-bento__heading h1,
.impact-bento__heading h2,
.impact-bento__heading h3,
.impact-bento__heading .h1,
.impact-bento__heading p {
	margin: 0;
	color: inherit;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
}

.impact-bento__heading strong {
	color: var(--white);
	font-weight: var(--fontWeightMedium);
}

.impact-bento__intro,
.impact-bento__intro p {
	margin: 0;
	color: var(--foundation-300);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	letter-spacing: var(--tracking-base);
	font-weight: var(--fontWeightLight);
}

/* ---- Bento grid (desktop / tablet) ---- */
.impact-bento__grid {
	position: relative;
	width: 100%;
}

.impact-bento__track {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	grid-template-rows: repeat(2, 1fr);
	grid-auto-flow: column;
	gap: 2.4rem;
	height: 52.9rem;
}

.impact-bento__card:first-child {
	grid-row: 1 / 3;
}

/* ---- Glass card ---- */
.impact-bento__card {
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	padding: 3.1rem;
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	-webkit-backdrop-filter: blur(4rem);
	backdrop-filter: blur(4rem);
	border-radius: 0.8rem;
	overflow: hidden;
}

.impact-bento__figure {
	margin: 0;
	color: var(--white);
	font-size: var(--text-6xl);
	line-height: var(--leading-6xl);
	letter-spacing: var(--tracking-6xl);
	font-weight: var(--fontWeightLight);
}

.impact-bento__caption {
	color: var(--foundation-300);
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightLight);
}

/* ---- Mobile nav (hidden on desktop) ---- */
/* Optional button under the stats grid (client's 28-Jul About request: "Learn about the Foundation").
   Renders only when the instance sets both a label and a link, so other pages are unaffected. */
.impact-bento__cta {
	display: flex;
	margin-top: 6.4rem;
}

@media (max-width: 48rem) { /* 768px */
	.impact-bento__cta {
		margin-top: 4rem;
	}
	/* Match the full-width CTA treatment used elsewhere on mobile. */
	.impact-bento__cta .btn {
		display: flex;
		flex: 1 1 auto;
		width: 100%;
		justify-content: center;
	}
}

.impact-bento__nav {
	display: none;
}

.impact-bento__navbtn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 4rem;
	height: 4rem;
	flex: none;
	padding: 0;
	border-radius: var(--radius-max);
	background: rgba(255, 255, 255, 0.08);
	border: 0.1rem solid rgba(255, 255, 255, 0.14);
	-webkit-backdrop-filter: blur(1rem);
	backdrop-filter: blur(1rem);
	color: var(--white);
	cursor: pointer;
	transition: background-color 0.2s ease, opacity 0.2s ease;
}

.impact-bento__navbtn:hover {
	background: rgba(255, 255, 255, 0.16);
}

.impact-bento__navbtn svg {
	width: 2rem;
	height: 2rem;
}

.impact-bento__navbtn.swiper-button-disabled {
	opacity: 0.35;
	cursor: default;
}

/* Swiper pagination dots — sit inline in the nav row (not absolutely positioned) */
.impact-bento__dots {
	position: static;
	width: auto;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.6rem;
	--swiper-pagination-color: var(--white);
	--swiper-pagination-bullet-inactive-color: var(--white);
	--swiper-pagination-bullet-inactive-opacity: 0.2;
	--swiper-pagination-bullet-size: 0.8rem;
}

/* ≥769px — CSS grid (Swiper is NOT initialised at these widths, so re-assert the grid) */
@media (min-width: 48.0625rem) {
	.impact-bento__grid {
		overflow: visible;
	}
	.impact-bento__track {
		transform: none !important;
		height: 52.9rem;
	}
	.impact-bento__card {
		height: auto;
	}
}

/* ---- Mobile (≤768px): Swiper carousel ---- */
@media (max-width: 48rem) {
	.impact-bento__inner {
		gap: 4.8rem;
	}
	.impact-bento__headline {
		max-width: none;
	}
	.impact-bento__heading h1,
	.impact-bento__heading h2,
	.impact-bento__heading h3,
	.impact-bento__heading .h1,
	.impact-bento__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.impact-bento__tagline {
		font-size: var(--tagline-xs);
		line-height: var(--leading-tagline-xs);
		letter-spacing: var(--tracking-tagline-xs);
	}

	.impact-bento__grid {
		width: 100%;
		min-width: 0;
		overflow: hidden;
	}
	.impact-bento__track {
		display: flex;
		grid-template-columns: none;
		grid-template-rows: none;
		grid-auto-flow: row;
		gap: 0;
		height: auto;
	}
	.impact-bento__card,
	.impact-bento__card:first-child {
		grid-row: auto;
		width: 80%;
		max-width: 30rem;
		width: 30.2rem;
		height: 42.4rem;
		padding: 2.4rem 2.4rem 3.2rem;
	}

	.impact-bento__nav {
		display: flex;
		align-items: center;
		justify-content: space-between;
		width: 100%;
		max-width: 34.3rem;
		margin: 0 auto;
	}
}

@media (prefers-reduced-motion: reduce) {
	.impact-bento__card,
	.impact-bento__navbtn {
		transition: none;
	}
}

/* ---------- certifications ---------- */
/* ============================================================
   Certifications — modules/certifications.module
   Header (tagline + two-tone heading) on the left, a single-open
   accordion list of certifications on the right (fixed 62.8rem column).
   Uses the shared global accordion helper ([data-accordion] +
   .accordion-toggle) and the scroll-reveal engine. Dark canvas + orbs.
   Figma 482:23081 (desktop) / 482:23265 (mobile).
   ============================================================ */
.certifications {
	position: relative;
	color: var(--white);
}

.certifications .container {
	position: relative;
	z-index: 1;
}

.certifications__inner {
	display: flex;
	align-items: flex-start;
	gap: 2.4rem;
}

/* Header — tagline + heading, constrained block */
.certifications__header {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	max-width: 48rem;
}

.certifications__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	font-weight: var(--fontWeightRegular);
	text-transform: uppercase;
	color: var(--text-accent);
}

.certifications__heading h1,
.certifications__heading h2,
.certifications__heading .h2,
.certifications__heading h3,
.certifications__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-500);
}

.certifications__heading strong {
	color: var(--white);
	font-weight: inherit;
}

/* List — fixed right column */
.certifications__list {
	flex: 0 0 62.8rem;
	max-width: 62.8rem;
}

.certifications__item {
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.1);
}

.certifications__item:first-child {
	border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
}

/* Row header is the toggle button: title left + a +/- glass circle right */
.certifications__head {
	width: 100%;
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 2.4rem;
	padding: 3.2rem 0;
	background: none;
	border: 0;
	cursor: pointer;
	text-align: left;
	color: inherit;
}

.certifications__title {
	flex: 1 1 auto;
	min-width: 0;
	font-size: var(--text-xl);
	line-height: var(--leading-xl);
	letter-spacing: var(--tracking-xl);
	font-weight: var(--fontWeightMedium);
	color: var(--foundation-300);
}

.certifications__item.is-open .certifications__title {
	color: var(--white);
}

/* Hover / focus state (Figma accordion): the row title lightens to white and the +/- toggle button
   brightens — matching the open-state emphasis + the "Read our statement" button's hover. Scoped to
   .certifications__head so the shared .accordion-toggle used by other modules is unaffected. */
.certifications__title {
	transition: color 0.2s ease;
}
.certifications__head:hover .certifications__title,
.certifications__head:focus-visible .certifications__title {
	color: var(--white);
}
.certifications__head .accordion-toggle {
	transition: background-color 0.2s ease, border-color 0.2s ease;
}
.certifications__head:hover .accordion-toggle,
.certifications__head:focus-visible .accordion-toggle {
	background: rgba(255, 255, 255, 0.1);
	border-color: rgba(255, 255, 255, 0.2);
}

/* Collapsible panel: grid-rows 0fr → 1fr; inner clips its overflow */
.certifications__panel {
	display: grid;
	grid-template-rows: 0fr;
	transition: grid-template-rows 0.35s ease;
}

.certifications__item.is-open .certifications__panel {
	grid-template-rows: 1fr;
}

.certifications__panel-inner {
	overflow: hidden;
	min-height: 0;
	display: flex;
	flex-direction: column;
	gap: 3.2rem;
	padding-bottom: 0;
}

/* Padding only when open, so a collapsed panel clips fully to zero (no leaking padding). */
.certifications__item.is-open .certifications__panel-inner {
	padding-bottom: 3.2rem;
}

.certifications__statement p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* "Read our statement" — compact dark glass pill that opens the statement pop-up (Figma 482:23082) */
.certifications__cta {
	align-self: flex-start;
	display: inline-flex;
	align-items: center;
	padding: 1.1rem 2rem;
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	border-radius: var(--radius-max);
	cursor: pointer;
	-webkit-backdrop-filter: blur(1rem);
	backdrop-filter: blur(1rem);
	transition: background-color 0.2s ease, border-color 0.2s ease;
}
.certifications__cta:hover,
.certifications__cta:focus-visible {
	background: rgba(255, 255, 255, 0.1);
	border-color: rgba(255, 255, 255, 0.2);
}

/* ============================================================
   Statement pop-up (Figma 468:5209 desktop / 468:5538 mobile) — a Swiper of full statements.
   Moved to <body> on init; centred card over a blurred navy backdrop; bottom Prev/counter/Next bar.
   ============================================================ */
.certifications__modal {
	position: fixed;
	inset: 0;
	z-index: 1000;
	display: none;
	align-items: center;
	justify-content: center;
	padding: 4rem 2rem;
}
.certifications__modal.is-open { display: flex; }

.certifications__modal-backdrop {
	position: absolute;
	inset: 0;
	background: rgba(19, 25, 45, 0.8);
	-webkit-backdrop-filter: blur(1rem);
	backdrop-filter: blur(1rem);
}

.certifications__modal-card {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	width: min(64rem, 100%);
	max-height: 100%;
	/* Slightly translucent glass so the blurred backdrop reads through — "a little transparency". */
	background: color-mix(in srgb, var(--foundation-950) 80%, transparent);
	-webkit-backdrop-filter: blur(4rem);
	backdrop-filter: blur(4rem);
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	border-radius: var(--radius-base);
	overflow: hidden;
	box-shadow: var(--shadow-2xl);
}

.certifications__modal-close {
	position: absolute;
	top: 1.6rem;
	right: 1.6rem;
	z-index: 3;
	width: 4rem;
	height: 4rem;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: var(--white);
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	border-radius: var(--radius-max);
	cursor: pointer;
	-webkit-backdrop-filter: blur(1rem);
	backdrop-filter: blur(1rem);
	transition: background-color 0.2s ease;
}
.certifications__modal-close:hover { background: rgba(255, 255, 255, 0.12); }
.certifications__modal-close svg { width: 1.3rem; height: 1.3rem; }

/* Swiper fills the space above the nav bar; each slide scrolls internally.
   ⚠️ Sized by a FLEX chain (min-height:0 all the way down), NOT height:100% — the desktop card is
   height:auto + max-height:100%, and per css-flexbox §9.8 a max-height-clamped auto height is NOT a
   definite size, so a %-height chain resolves to auto → the slide grows to its content and the
   designated scroll owner (.certifications__slide-inner) never gets a scrollbar (the Revert-02
   "statement doesn't scroll on desktop"). Flex-shrink needs no definite percentage base, so this
   works with the desktop max-height AND the mobile height:100% alike. The explicit height:auto on
   wrapper/slide is REQUIRED — it overrides the vendored swiper.css height:100%. */
.certifications__modal-swiper {
	flex: 1 1 auto;
	min-height: 0;
	width: 100%;
	overflow: hidden;
	display: flex;
	flex-direction: column;
}
.certifications__modal-swiper .swiper-wrapper { height: auto; flex: 1 1 auto; min-height: 0; }
.certifications__modal-swiper .swiper-slide { height: auto; display: flex; flex-direction: column; box-sizing: border-box; }
.certifications__slide-inner {
	height: auto;
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	padding: 4rem;
	box-sizing: border-box;
}

.certifications__slide-head {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: 1.6rem;
	padding-right: 4rem; /* clear the close button */
}
/* logo left, title + link stacked to its right — all on one line */
.certifications__slide-meta {
	display: flex;
	flex-direction: column;
	gap: 0.4rem;
	min-width: 0;
}
.certifications__avatar {
	width: 6.4rem;
	height: 6.4rem;
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--white);
	border-radius: 0.8rem;
	overflow: hidden;
}
.certifications__avatar img { max-width: 72%; max-height: 72%; object-fit: contain; }
.certifications__slide-title {
	margin: 0;
	font-size: var(--text-xl);
	line-height: var(--leading-xl);
	letter-spacing: var(--tracking-xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}
.certifications__slide-url {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	width: fit-content;
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}
.certifications__slide-url-icon {
	display: inline-flex;
	color: var(--text-accent);
}
.certifications__slide-url-icon svg { width: 1.6rem; height: 1.6rem; }

.certifications__slide-divider {
	display: block;
	height: 0.1rem;
	margin: 2.4rem 0;
	background: rgba(255, 255, 255, 0.1);
}

.certifications__slide-body p {
	margin: 0 0 1.6rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}
.certifications__slide-body p:last-child { margin-bottom: 0; }

/* --- Rich-text output inside a certification statement ------------------------------------------
   Applies to BOTH the inline blurb in the accordion row and the full statement in the pop-up.

   ⚠️ Until the ESG statement was switched on (2026-08-18) every statement was a single <p>, so only
   `p` had ever been styled here. The first statement to use real formatting exposed three gaps at
   once, all of which rendered BLACK on the dark canvas:
     1. <h4> — and the <strong> inside it — fell through to the GLOBAL light-page type styles in
        _typography.css, landing at 25px in the default near-black.
     2. Loose TEXT NODES. This content separates paragraphs with <br><br> instead of wrapping them
        in <p>, so that text had nothing to inherit a colour from except the container — which set
        none. That is why the fix must put `color` on the container itself and not only on `p`.
     3. <ul>/<li> took the global list styling intended for light pages.

   So: the container carries the base colour, and every tag the editor can emit is styled. Values
   deliberately mirror .rich-text__body so a statement and a rich-text block read identically.
   ------------------------------------------------------------------------------------------------ */
.certifications__statement,
.certifications__slide-body {
	color: var(--foundation-300);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
}

.certifications__statement > :first-child,
.certifications__slide-body > :first-child {
	margin-top: 0;
}

.certifications__statement > :last-child,
.certifications__slide-body > :last-child {
	margin-bottom: 0;
}

.certifications__statement :is(h2, h3, h4, h5, h6),
.certifications__slide-body :is(h2, h3, h4, h5, h6) {
	margin: 3.2rem 0 1.6rem;
	color: var(--white);
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
}

.certifications__statement :is(ul, ol),
.certifications__slide-body :is(ul, ol) {
	margin: 0 0 1.6rem;
	padding-left: 2.4rem;
}

.certifications__statement li,
.certifications__slide-body li {
	margin-bottom: 0.8rem;
	color: var(--foundation-300);
	font-size: var(--text-base);
	line-height: var(--leading-base);
}

/* The editor wraps each list item's text in its own <p>. That <p> must not keep the paragraph
   bottom-margin inside an <li>, or every list renders double-spaced. */
.certifications__statement li p,
.certifications__slide-body li p {
	margin-bottom: 0;
}

.certifications__statement strong,
.certifications__slide-body strong {
	color: var(--white);
	font-weight: var(--fontWeightMedium);
}

/* A <strong> inside a heading must not fight the heading for size — the heading owns that. This is
   exactly the shape the ESG statement uses: <h4><strong>Our Commitment</strong></h4>. */
.certifications__statement :is(h2, h3, h4, h5, h6) strong,
.certifications__slide-body :is(h2, h3, h4, h5, h6) strong {
	font-size: inherit;
	line-height: inherit;
}

.certifications__statement a,
.certifications__slide-body a {
	color: var(--neon-pulse-500);
	text-decoration: underline;
	text-underline-offset: 0.2rem;
}

.certifications__statement a:hover,
.certifications__slide-body a:hover {
	color: var(--white);
}

/* Bottom nav bar — glass, Prev / counter / Next */
.certifications__modal-nav {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.6rem;
	padding: 2rem 2.4rem;
	background: rgba(255, 255, 255, 0.05);
	border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
	-webkit-backdrop-filter: blur(2rem);
	backdrop-filter: blur(2rem);
}
.certifications__nav-btn {
	display: inline-flex;
	align-items: center;
	gap: 0.6rem;
	padding: 0.9rem 1.8rem;
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	border-radius: var(--radius-max);
	cursor: pointer;
	transition: background-color 0.2s ease, opacity 0.2s ease;
}
.certifications__nav-btn:hover { background: rgba(255, 255, 255, 0.12); }
.certifications__nav-btn.swiper-button-disabled { opacity: 0.35; pointer-events: none; }
.certifications__nav-icon { display: inline-flex; }
.certifications__nav-icon svg { width: 1.3rem; height: 1.3rem; }
.certifications__counter {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-variant-numeric: tabular-nums;
}
.certifications__counter-cur { color: var(--white); }
.certifications__counter-sep,
.certifications__counter-total { color: var(--foundation-500); }

/* Mobile (≤768px): the card is full-screen (Figma 468:5538). */
@media (max-width: 48rem) {
	.certifications__modal { padding: 0; }
	.certifications__modal-card {
		width: 100%;
		max-height: 100%;
		height: 100%;
		border: 0;
		border-radius: 0;
	}
	.certifications__modal-close { top: 7.2rem; }
	.certifications__slide-inner { padding: 2.4rem 1.6rem; padding-top: 11rem; }
	.certifications__modal-nav { padding: 2.4rem 1.6rem 4rem; }
}

@media (prefers-reduced-motion: reduce) {
	.certifications__cta,
	.certifications__modal-close,
	.certifications__nav-btn,
	.certifications__title,
	.certifications__head .accordion-toggle { transition: none; }
}

/* Tablet/mobile — stack: header above the list, both full width */
@media (max-width: 64rem) { /* 1024px */
	.certifications__inner {
		flex-direction: column;
		gap: 6.4rem;
	}
	.certifications__header,
	.certifications__list {
		flex: none;
		width: 100%;
		max-width: none;
	}
}

@media (max-width: 48rem) { /* 768px — --text-4xl doesn't step down, so use --text-3xl */
	.certifications__heading h1,
	.certifications__heading h2,
	.certifications__heading .h2,
	.certifications__heading h3,
	.certifications__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.certifications__title {
		font-size: var(--text-lg);
		line-height: var(--leading-lg);
		letter-spacing: var(--tracking-lg);
	}
}

@media (prefers-reduced-motion: reduce) {
	.certifications__panel {
		transition: none;
	}
}

/* ---------- About page polish (scoped) ---------- */
/* Hero "Our Story": body copy sits at cols 7–11 (design) vs the built cols 8–12. */
.about-page .hero__copy-col { grid-column: 7 / span 5; padding-right: 0; }

/* Mobile: centre the hero CTA pill (Revert 01 — "Header section CTA should be centered").
   .hero__cta is a flex row defaulting to flex-start; scoped to .about-page so the other style-2
   heroes (what-we-do, leadership) and the full-width thank-you/404/500 CTA pattern stay untouched. */
@media (max-width: 48rem) { /* 768px */
	.about-page .hero__cta { justify-content: center; }
}
/* Thank You / 404 / 500 heroes (Figma 740:*) — body copy at cols 7–11, same split as About. */
.thank-you-page .hero__copy-col,
.error-404-page .hero__copy-col,
.error-500-page .hero__copy-col { grid-column: 7 / span 5; padding-right: 0; }

/* ---- Mirror the Figma page grid on these templates (design tokens on 740:6197:
   margin 80 / gutter 24 / content-min 1280 / content-max 1600). The theme's global
   .container is 1440 max + 2rem padding = 1400 inner, which put the content 60px too far
   left and made every column ~50px wider than the design (so the hero body copy wrapped a
   word early). 176rem cap + 8rem padding reproduces the design exactly: at 1440 → 1280
   content, at 1600 → 1440, at ≥1760 → 1600 capped. Mobile/tablet step down to the 375-frame
   margin (16px). ---- */
.thank-you-page .container,
.error-404-page .container,
.error-500-page .container {
	max-width: 176rem;
	padding-left: 8rem;
	padding-right: 8rem;
}
@media (max-width: 64rem) { /* 1024px */
	.thank-you-page .container,
	.error-404-page .container,
	.error-500-page .container { padding-left: 4rem; padding-right: 4rem; }
}
@media (max-width: 48rem) { /* 768px — design mobile frames inset content by 16px */
	.thank-you-page .container,
	.error-404-page .container,
	.error-500-page .container { padding-left: 1.6rem; padding-right: 1.6rem; }
}

/* Button = Figma "PRIMARY BUTTON" (740:6214): 8px padding + 16/24 label ⇒ exactly 40px tall
   (the global .btn.pill is 11px padding + a 2px border + lh 18.4 ⇒ 44px). Scoped to these
   pages so the shared pill on already-approved pages is untouched. */
.thank-you-page .hero__cta .btn.pill,
.error-404-page .hero__cta .btn.pill,
.error-500-page .hero__cta .btn.pill {
	padding: 0.8rem 2rem;
	line-height: 2.4rem;
	border-width: 0;
}

/* Mobile: the hero CTA spans the column (matches the full-width button treatment used on the
   other mobile designs, e.g. capability-banner). `.hero__cta` is a flex row, so the button needs
   the width AND the row must not keep it at content width. */
@media (max-width: 48rem) { /* 768px */
	.thank-you-page .hero__cta,
	.error-404-page .hero__cta,
	.error-500-page .hero__cta {
		align-self: stretch;
	}
	.thank-you-page .hero__cta .btn,
	.error-404-page .hero__cta .btn,
	.error-500-page .hero__cta .btn {
		display: flex;
		flex: 1 1 auto;
		width: 100%;
		justify-content: center;
	}
}
/* These heroes use the exact Figma hero-bg ART as the style-2 background image — the art is
   DOT-FREE and has NO baked bottom gradient, so the interactive `.shimmer-grid` draws the dots
   (base grid + cursor spotlight, like every other style-2 hero) and `.hero__bg::after` is the
   single bottom fade. Figma's "Pattern - Dots" layer is opacity-20, so bump the base dots from
   the global 6% to 20% (same treatment as .hero.home). */
.thank-you-page .hero .shimmer-grid,
.error-404-page .hero .shimmer-grid,
.error-500-page .hero .shimmer-grid {
	background-image: radial-gradient(color-mix(in srgb, var(--foundation-50) 20%, transparent) 0.06rem, transparent 0.14rem);
}
/* Figma "Gradient" = the bottom 273px of a 771px hero → 35% (vs the style-2 default 45%). */
.thank-you-page .hero.style-2 .hero__bg::after,
.error-404-page .hero.style-2 .hero__bg::after,
.error-500-page .hero.style-2 .hero__bg::after { height: 35%; }
.thank-you-page .hero.style-2 .hero__bg,
.error-404-page .hero.style-2 .hero__bg,
.error-500-page .hero.style-2 .hero__bg {
	background:
		linear-gradient(115deg, transparent 45%, color-mix(in srgb, var(--azure-600) 32%, transparent) 70%, transparent 92%),
		radial-gradient(52% 62% at 6% 80%, color-mix(in srgb, var(--signal-teal-600) 34%, transparent), transparent 70%),
		var(--foundation-950);
}
/* Pre-load fallback gradient so there's no flash before the glow bg image paints (mirrors .leadership-page). */
.about-page .hero.style-2 .hero__bg {
	background:
		radial-gradient(60% 60% at 22% 18%, color-mix(in srgb, var(--signal-teal-600) 45%, transparent), transparent 70%),
		radial-gradient(55% 55% at 82% 72%, color-mix(in srgb, var(--azure-600) 40%, transparent), transparent 70%),
		var(--foundation-950);
}
/* The mobile-only hairline divider between Location and Awards (which the Figma mobile frame showed)
   was REMOVED 2026-08-04 at the client's request: "Pleaee remove this line /divider". Do not
   reinstate it from the design — the client overrode the design here. */


/* ================= CONTACT PAGE MODULES (2026-07-21) ================= */

/* ---- offices ---- */
/* ============================================================
   Offices — "Other Offices" region + office grid (Figma 482:21193)
   ============================================================ */
.offices {
	position: relative;
	color: var(--white);
}

.offices .container {
	position: relative;
	z-index: 1;
}

/* Head */
.offices__head {
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
	margin-bottom: 7.2rem;
}

.offices__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans */
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-base);
	line-height: var(--leading-tagline-base);
	letter-spacing: var(--tracking-tagline-base);
	text-transform: uppercase;
	color: var(--text-accent);
}

.offices__heading h2,
.offices__heading .h2,
.offices__heading h1,
.offices__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Regions */
.offices__regions {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

.offices__region {
	display: flex;
	flex-direction: column;
	gap: 8rem;
}

.offices__region-name {
	margin: 0;
	padding-bottom: 2.4rem;
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.1);
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Cards grid — 3-up, 8rem gaps (matches the 373.33px card / 80px gap design) */
.offices__grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	column-gap: 8rem;
	row-gap: 8rem;
}

.offices__card {
	display: flex;
	flex-direction: column;
}

.offices__city {
	margin: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.offices__detail {
	display: flex;
	flex-direction: column;
	gap: 1.6rem;
	margin-top: 3.6rem;
}

.offices__address,
.offices__phone {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* The Address field is a multi-line text field, so the editor's line breaks come through as real
   newlines in the markup. `pre-line` renders them as line breaks while still collapsing runs of
   spaces and allowing normal wrapping — which is why the module needs no nl2br filter. */
.offices__address {
	white-space: pre-line;
}

/* Phone numbers are real tel: links (tap-to-call), keeping the surrounding text colour. Without
   this, the global a{color:var(--primaryColour)} paints them #13192d — invisible on the navy canvas
   (contrast 1.07:1), which is exactly what iOS users reported when Safari injected its OWN tel:
   anchors around the then-plain-text numbers (Revert 01). The [x-apple-data-detectors] guard is
   belt-and-braces for any number iOS still auto-detects elsewhere (addresses, dates, etc.). */
.offices__phone a,
.head-office__value a {
	color: inherit;
	text-decoration: none;
}

a[x-apple-data-detectors] {
	color: inherit !important;
	text-decoration: none !important;
}

/* A REAL embedded Google Map per office (Revert 01: "the actual Google map instead of the images"),
   located by the office's own address. Same footprint as the old thumbnail so the card grid is
   unchanged. The iframes are loading="lazy" in the markup — with 11 of them on one page that is the
   whole PageSpeed story.
   The DARK look comes from a filter (Google's keyless embed has no styling API): invert + hue-rotate
   flips the light map into the site's navy world while keeping labels legible and water/parks the
   right hue. Interaction still works — the filter is purely visual. */
.offices__map-embed {
	width: 100%;
	aspect-ratio: 373 / 200;
	margin-top: 2.4rem;
	border-radius: var(--radius-base);
	overflow: hidden;
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	background: var(--foundation-900); /* paints the slot before the lazy iframe arrives */
}

.offices__map-embed iframe,
.head-office__map iframe {
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
	filter: invert(0.88) hue-rotate(180deg) saturate(0.55) contrast(0.92) brightness(0.92);
}

/* Tablet landscape — 2 columns */
@media (max-width: 64rem) { /* 1024px */
	.offices__grid {
		grid-template-columns: repeat(2, 1fr);
		column-gap: 4.8rem;
		row-gap: 6.4rem;
	}
}

/* Mobile — 1 column; step the heading down (text-4xl never steps on its own) */
@media (max-width: 48rem) { /* 768px */
	.offices__head {
		margin-bottom: 4.8rem;
	}
	.offices__heading h2,
	.offices__heading .h2,
	.offices__heading h1,
	.offices__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.offices__regions,
	.offices__region {
		gap: 4.8rem;
	}
	.offices__grid {
		grid-template-columns: 1fr;
		row-gap: 4.8rem;
	}
}

/* ---- head-office ---- */
/* ============================================================
   Head Office — location details + full-bleed map (Figma 482:21161)
   Dark, transparent-over-canvas section: LEFT tagline + heading (cols 1-5),
   RIGHT info card (Address / Phone / Parking, cols 7-11), then a full-bleed
   map flush below. Field-driven bg/spacing/orbs live in the module's scope_css.
   ============================================================ */
.head-office {
	position: relative;
	color: var(--white);
}

.head-office .container {
	position: relative;
	z-index: 1;
}

.head-office__grid {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	column-gap: 2.4rem;
	align-items: start;
}

/* Left — tagline + heading */
.head-office__text {
	grid-column: 1 / span 5;
	display: flex;
	flex-direction: column;
	gap: 2.4rem;
}

.head-office__tagline {
	margin: 0;
	font-family: var(--primaryFont); /* DM Sans */
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-sm);
	line-height: var(--leading-tagline-sm);
	letter-spacing: var(--tracking-tagline-sm);
	text-transform: uppercase;
	color: var(--text-accent);
}

.head-office__heading h2,
.head-office__heading .h2,
.head-office__heading h1,
.head-office__heading p {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Right — info card (3 rows) */
.head-office__card {
	grid-column: 7 / span 5;
	display: flex;
	flex-direction: column;
	gap: 4rem;
}

.head-office__row {
	display: flex;
	gap: 1.6rem;
	align-items: flex-start;
}

.head-office__icon {
	flex-shrink: 0;
	width: 2.4rem;
	height: 2.4rem;
	color: var(--foundation-400); /* icons use fill:currentColor */
}

.head-office__icon svg {
	display: block;
	width: 100%;
	height: 100%;
}

.head-office__detail {
	display: flex;
	flex-direction: column;
	gap: 0.8rem;
}

.head-office__label {
	margin: 0;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.head-office__value,
.head-office__value p {
	margin: 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

/* Second address block (PO Box line) sits with a wider gap from the street
   address: 0.8rem column gap + 1.6rem margin = 2.4rem total. */
.head-office__pobox {
	margin-top: 1.6rem;
}

/* Full-bleed map, flush below the details. Direct child of the section (outside
   .container); calc(50% - 50vw) margins break it out to the viewport edges. */
.head-office__map {
	display: block;
	margin-top: 8rem;
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
}

/* Full-bleed REAL embedded Google Map (Revert 01) — same 64rem window the old screenshot filled.
   Shares the dark filter with .offices__map-embed iframe (rule above, in the offices block). */
.head-office__map {
	height: 64rem;
	background: var(--foundation-900); /* paints the band before the lazy iframe arrives */
}

/* Tablet landscape — stack the text above the card */
@media (max-width: 64rem) { /* 1024px */
	.head-office__grid {
		display: flex;
		flex-direction: column;
		gap: 4.8rem;
	}
	.head-office__map {
		margin-top: 8rem;
	}
	.head-office__map {
		height: 48rem;
	}
}

/* Mobile — --text-4xl never steps down (stays 48px), so drop the heading to
   the stepped --text-3xl; shorten the map. */
@media (max-width: 48rem) { /* 768px */
	.head-office__heading h2,
	.head-office__heading .h2,
	.head-office__heading h1,
	.head-office__heading p {
		font-size: var(--text-3xl);
		line-height: var(--leading-3xl);
		letter-spacing: var(--tracking-3xl);
	}
	.head-office__map {
		height: 36rem;
	}
}

/* ---- business-areas ---- */
/* ============================================================
   business-areas — "Learn more about other areas of our business"
   Two glass cards, each with a wireframe graphic + teal glow bleeding
   off the right edge (Figma 482:21154). Dark, transparent over the
   page canvas. Field-driven bg / spacing / orbs live inline in
   module.html; structural layout is here.
   ============================================================ */
.business-areas {
	position: relative;
}

.business-areas .container {
	position: relative;
	z-index: 1;
}

/* Head — editable richtext heading, capped so it wraps to ~2 lines */
.business-areas__head {
	margin-bottom: 6.4rem;
}

.business-areas__heading h2,
.business-areas__heading .h2,
.business-areas__heading p {
	margin: 0;
	max-width: 40rem;
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Grid — two cards side by side */
.business-areas__grid {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 2.4rem;
}

/* Card — glass panel; the wireframe graphic is clipped by overflow:hidden */
.business-areas__card {
	position: relative;
	display: flex;
	min-height: 28rem;
	padding: 3.2rem;
	overflow: hidden;
	border-radius: 0.8rem;
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	-webkit-backdrop-filter: blur(8rem);
	backdrop-filter: blur(8rem);
	transition: box-shadow 0.3s ease, border-color 0.3s ease;
}

.business-areas__card:hover {
	border-color: rgba(255, 255, 255, 0.16);
	box-shadow: 0 0 8rem 0 rgba(1, 142, 154, 0.2); /* teal border-glow, per the design */
}

/* Decorative graphic (right) — teal glow + wireframe img, BEHIND the content.
   z-index:-1 keeps it above the card's glass background but below the copy,
   so the stretched-link ::after still resolves to the card (not the content). */
.business-areas__graphic {
	position: absolute;
	right: 0;
	top: 0;
	bottom: 0;
	width: 26rem;
	z-index: -1;
	pointer-events: none;
}

.business-areas__glow {
	position: absolute;
	top: 50%;
	right: 0;
	transform: translate(25%, -50%);
	width: 54rem;
	height: 54rem;
	border-radius: 50%;
	background: radial-gradient(circle, rgba(1, 142, 154, 0.28), transparent 70%);
}

/* Sized by HEIGHT, not width: the art is square and runs the full card height, bleeding off the
   card's right edge, which .business-areas__card's overflow:hidden clips (Figma 482:21154).
   ⚠️ max-width:none is REQUIRED — normalise's img{max-width:100%} otherwise caps the art to the
   26rem .business-areas__graphic box.
   ⚠️ The two SVGs must NOT carry preserveAspectRatio="none" / width="100%" / height="100%" on their
   root. With those, the browser reports naturalWidth/Height as the 300x150 replaced-element
   fallback — no intrinsic ratio — so the square art was stretched into a 2:1 strip. That was the
   client's 28-Jul "these images are squashed on desktop vs. mobile". viewBox only. */
.business-areas__img {
	position: absolute;
	top: 0;
	right: 0;
	transform: translateX(20%); /* bleed off the right edge, per the design */
	width: auto;
	max-width: none;
	height: 100%;
	object-fit: contain;
}

/* Card content — left column, cleared of the graphic; link pinned to the foot */
.business-areas__content {
	display: flex;
	flex-direction: column;
	flex: 1;
	min-width: 0;
	padding-top: 0.8rem;
	padding-right: 24rem;
}

.business-areas__title {
	margin: 0;
	font-size: var(--text-xl);
	line-height: var(--leading-xl);
	letter-spacing: var(--tracking-xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

.business-areas__body {
	margin: 0.8rem 0 0;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}

.business-areas__link {
	margin-top: auto;
	padding-top: 2.4rem;
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	width: fit-content;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

/* Whole card clickable via a stretched hit area (resolves to the card) */
a.business-areas__link::after {
	content: "";
	position: absolute;
	inset: 0;
}

/* External-link icon (Figma 482:21158) — a clipped box holding two stacked copies that
   slide-swap on hover (the design's Default → Hover state). Link opens in a new tab. */
/* Figma 482:21159 "Button": the arrow glyph is 14px, centred in a 24px icon frame (≈5rem/10 of
   breathing room each side) with a 0.4rem gap to the label. The frame clips two stacked copies that
   slide-swap on hover. Glyphs are centred via margins (NOT transform) so the slide transform is free. */
.business-areas__icon {
	position: relative;
	width: 2.4rem;
	height: 2.4rem;
	flex-shrink: 0;
	overflow: hidden;
	color: var(--text-accent); /* lime */
}

.business-areas__icon-svg {
	position: absolute;
	top: 50%;
	left: 50%;
	width: 1.4rem;
	height: 1.4rem;
	margin: -0.7rem 0 0 -0.7rem; /* centre the 14px glyph in the 24px frame */
	transition: transform 0.35s cubic-bezier(0.38, 0.21, 0, 0.92);
}
.business-areas__icon-svg:nth-child(2) {
	transform: translateX(-2.4rem); /* second copy waits off to the left (clears the frame) */
}
.business-areas__card:hover .business-areas__icon-svg:nth-child(1) {
	transform: translateX(2.4rem); /* first copy exits to the right */
}
.business-areas__card:hover .business-areas__icon-svg:nth-child(2) {
	transform: translateX(0); /* second copy slides in to centre */
}

@media (prefers-reduced-motion: reduce) {
	.business-areas__icon-svg { transition: none; }
	.business-areas__card:hover .business-areas__icon-svg:nth-child(1) { transform: translateX(0); }
	.business-areas__card:hover .business-areas__icon-svg:nth-child(2) { transform: translateX(-2.4rem); }
}

/* Tablet / mobile — stack to one column */
@media (max-width: 64rem) { /* 1024px */
	.business-areas__grid {
		grid-template-columns: 1fr;
	}
}

/* Mobile — tighten the head gap and give the copy more room */
@media (max-width: 48rem) { /* 768px */
	.business-areas__head {
		margin-bottom: 6rem;
	}
	.business-areas__content {
		padding-right: 10rem;
	}
	.business-areas__glow {
		width: 40rem;
		height: 40rem;
	}
	/* The art is height-driven now (see .business-areas__img above), so it scales with the card on
	   its own — no width/height override needed here. Pull it further off the right edge so it
	   crowds the copy less on a narrow card. */
	.business-areas__img {
		transform: translateX(34%);
	}
}

/* ---- contact-hero ---- */
/* ============================================================
   CONTACT HERO — Entelect page hero + contact form (Figma 482:21068)
   Dark, transparent over the page canvas. Photo bg (right half, faded
   left+bottom) + shimmer-grid dots + azure orb bottom-left behind a
   left headline and a right glass form card.
   Field-driven CSS (bg colour, spacing, per-orb glows) is inline in
   modules/contact-hero.module/module.html.
   ============================================================ */
.contact-hero {
	position: relative;
	overflow: visible; /* let the orb bleed (contained by body{overflow-x:hidden}); do NOT clip */
	color: var(--white);
	/* Spacing pinned here (was field-driven in the old contact-hero module; the hero-variant
	   render can't reliably take a module-tag group override). Top clears the fixed nav. */
	padding: 17.6rem 0 8rem;
}

@media (max-width: 48rem) { /* 768px — halve the spacing on mobile */
	.contact-hero { padding-top: 8.8rem; padding-bottom: 4rem; }
}

/* Content sits above the decorative layers. Width + gutters from the global .container. */
.contact-hero .container {
	position: relative;
	z-index: 1;
}

/* --- Background: abstract brand gradient (Figma 482:21069) — teal glow top-right + azure glow
   bottom-left on the navy canvas + a bottom navy fade. Pure CSS (no image request). --- */
.contact-hero__bg {
	position: absolute;
	inset: 0;
	z-index: 0;
	overflow: hidden;
	background:
		radial-gradient(80rem 62rem at 100% 26%, color-mix(in srgb, var(--signal-teal-600) 80%, transparent), transparent 62%),
		radial-gradient(88rem 72rem at 0% 84%, color-mix(in srgb, var(--azure-600) 85%, transparent), transparent 60%),
		var(--foundation-950);
}

.contact-hero__fade {
	position: absolute;
	inset: 0;
	/* Bottom band easing up to solid navy (Figma "Gradient" layer, ~566px). */
	background: linear-gradient(to top, var(--foundation-950), transparent 56.6rem);
}

/* --- 12-col layout: headline left (1-6), glass form card right (7-12) --- */
.contact-hero__grid {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	column-gap: 2.4rem;
	align-items: start;
}

.contact-hero__text {
	grid-column: 1 / span 6;
	align-self: start;
	display: flex;
	flex-direction: column;
	gap: 3.2rem;
	/* Match the Figma "Text Block" width (628px) so the headline wraps exactly as designed
	   ("Let's talk about" / "what you're" / "building"). The 6-col track is wider than this. */
	max-width: 62.8rem;
}

.contact-hero__tagline {
	margin: 0;
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightRegular);
	font-size: var(--tagline-base);
	line-height: var(--leading-tagline-base);
	letter-spacing: var(--tracking-tagline-base);
	text-transform: uppercase;
	color: var(--text-accent);
}

.contact-hero__heading {
	margin: 0;
	font-family: var(--primaryFont);
	font-size: var(--text-6xl);
	line-height: var(--leading-6xl);
	letter-spacing: var(--tracking-6xl);
	font-weight: var(--fontWeightRegular);
	color: var(--white);
}

/* --- Right: glass form card --- */
.contact-hero__form-card {
	grid-column: 7 / span 6;
	align-self: stretch;
	position: relative;
	overflow: hidden; /* clip the frosted panel to the rounded corners */
	padding: 4rem;
	border-radius: var(--radius-sm); /* 0.8rem, per Figma */
	background-color: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	-webkit-backdrop-filter: blur(8rem);
	backdrop-filter: blur(8rem);
}

/* --- Dark form — overrides the light _forms.css for the glass card.
   (Field / column layout itself comes from the form's setup in HubSpot.) --- */
.contact-hero .form fieldset {
	margin-bottom: 2.4rem;
}

.contact-hero .form fieldset:last-of-type {
	margin-bottom: 2.4rem;
}

.contact-hero .form fieldset.form-columns-2 {
	gap: 1.6rem;
}

.contact-hero .form .hs-form-field > label {
	display: block;
	margin-bottom: 0.4rem;
	color: var(--foundation-300);
	font-family: var(--primaryFont);
	font-weight: var(--fontWeightLight);
	font-size: var(--text-sm);
	line-height: var(--leading-sm);
}

.contact-hero .form .hs-form-field > label .hs-form-required {
	color: var(--neon-pulse-500);
}

.contact-hero .form input[type="text"],
.contact-hero .form input[type="email"],
.contact-hero .form input[type="tel"],
.contact-hero .form input[type="number"],
.contact-hero .form select,
.contact-hero .form textarea {
	width: 100% !important;
	height: auto;
	padding: 0.8rem 0;
	border: none;
	border-bottom: 0.1rem solid rgba(255, 255, 255, 0.2);
	border-radius: 0;
	background-color: transparent;
	color: var(--white);
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	transition: border-color 200ms ease;
	/* NB: no backdrop-filter on fields — nested in the card's blur it paints grey panes. */
}

.contact-hero .form textarea {
	min-height: 9rem;
	padding: 1.2rem 0;
	resize: vertical;
}

.contact-hero .form input::placeholder,
.contact-hero .form textarea::placeholder {
	color: var(--foundation-400);
}

.contact-hero .form input:focus,
.contact-hero .form select:focus,
.contact-hero .form textarea:focus {
	border-bottom-color: var(--neon-pulse-500);
}

/* Select — hide the native control and draw the design's white chevron-down */
.contact-hero .form select {
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	cursor: pointer;
	padding-right: 2.4rem;
	background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%3E%3Cpath%20d='M5%207.5%2010%2012.5%2015%207.5'%20stroke='%23ffffff'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 0 center;
	background-size: 2rem 2rem;
}

/* The OS-rendered option list sits on a light surface — keep its text dark/readable */
.contact-hero .form select option {
	color: var(--foundation-900);
}

/* Form rich text / consent copy (light by default → would vanish on the dark card) */
.contact-hero .form .hs-richtext,
.contact-hero .form .hs-richtext p,
.contact-hero .form .legal-consent-container .hs-form-booleancheckbox-display span {
	color: var(--foundation-300);
}

/* Submit — lime pill (matches .btn.pill / the cta-form submit). Button text ("Send Message")
   comes from the form's setup in HubSpot. */
.contact-hero .form .hs_submit .actions {
	display: flex;
	justify-content: flex-start;
	margin: 0;
	padding: 0;
}

.contact-hero .form .hs-button.primary.large {
	width: auto;
	padding: 1.1rem 2.4rem;
	color: var(--foundation-900);
	font-size: var(--text-base);
	font-weight: var(--fontWeightMedium);
	border: 0.2rem solid var(--neon-pulse-600);
	border-radius: var(--radius-max);
	background-color: var(--neon-pulse-600);
	box-shadow: none;
	transition: all 250ms ease;
}

.contact-hero .form .hs-button.primary.large:hover {
	color: var(--foundation-900);
	background-color: var(--neon-pulse-500);
	border-color: var(--neon-pulse-500);
	box-shadow: 0.4rem 0.4rem 4rem 0 rgba(180, 204, 80, 0.3);
}

/* --- Tablet landscape (≤1024px = 64rem) --- */
@media (max-width: 64rem) {
	.contact-hero__grid {
		column-gap: 4rem;
	}
	.contact-hero__form-card {
		padding: 3.2rem;
	}
}

/* --- Tablet / mobile (≤768px = 48rem): stack the columns, form full width --- */
@media (max-width: 48rem) {
	.contact-hero__grid {
		grid-template-columns: 1fr;
		row-gap: 4.8rem;
	}
	.contact-hero__text {
		grid-column: 1 / -1;
	}
	.contact-hero__form-card {
		grid-column: 1 / -1;
		padding: 2.4rem;
		-webkit-backdrop-filter: blur(2rem);
		backdrop-filter: blur(2rem);
	}
	.contact-hero .form fieldset.form-columns-2 {
		grid-template-columns: 1fr;
	}
	/* Full-width, centred submit pill */
	.contact-hero .form .hs_submit .actions {
		justify-content: center;
	}
	.contact-hero .form .hs-button.primary.large {
		width: 100%;
		text-align: center;
	}
}


/* ============================================================
   Partnerships — modules/partnerships.module
   A grid of glass partner cards (logo + name); clicking one opens a shared detail
   pop-up that SLIDES UP from the bottom and cycles every partner (Prev / Next).
   Figma 468:4829 (grid) / 468:5097 (modal).
   ============================================================ */
.partnerships {
	position: relative;
	overflow: visible;
	color: var(--white);
}
.partnerships .container { position: relative; z-index: 1; }

.partnerships__inner {
	display: flex;
	flex-direction: column;
	gap: 12rem; /* Figma: 120px between heading and grid */
}

.partnerships__header { max-width: 84rem; }
.partnerships__tagline {
	margin: 0 0 1.6rem;
	font-family: var(--primaryFont);
	font-size: var(--tagline-base);
	line-height: 1.2;
	color: var(--text-accent);
}
/* h1/h2/h3/.h2 included so a heading typed as "Heading 2" in the rich-text editor sizes identically
   to a paragraph one (without this it fell through to the 45px global h2 instead of --text-4xl). */
.partnerships__heading,
.partnerships__heading p,
.partnerships__heading h1,
.partnerships__heading h2,
.partnerships__heading h3,
.partnerships__heading .h2 {
	margin: 0;
	font-size: var(--text-4xl);
	line-height: var(--leading-4xl);
	letter-spacing: var(--tracking-4xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}
/* Two-tone follows the SITE convention: grey lead-in + white <strong> — this module used to invert
   it (white base + lime strong), which is what the client hit reusing it on the Data & AI page
   ("it's green and white, not grey and white", Revert 01). The grey base applies only when the
   heading actually contains a <strong> (:has, already used elsewhere in this theme), so a heading
   typed WITHOUT one — like the live Capabilities page's "Enterprise Partnerships" — keeps rendering
   all-white with no page edit. Browsers without :has degrade to all-white, never to broken. */
.partnerships__heading:has(strong),
.partnerships__heading:has(strong) p,
.partnerships__heading:has(strong) h1,
.partnerships__heading:has(strong) h2,
.partnerships__heading:has(strong) h3,
.partnerships__heading:has(strong) .h2 {
	color: var(--foundation-500);
}
.partnerships__heading strong { color: var(--white); font-weight: inherit; }

/* --- Card grid --- */
.partnerships__grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 2.4rem;
}
.partnerships__card {
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	min-height: 24rem; /* Figma card 240px */
	padding: 2.4rem;
	text-align: left;
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.08);
	border-radius: 0.8rem;
	cursor: pointer;
	font-family: var(--primaryFont);
	-webkit-backdrop-filter: blur(0.4rem);
	backdrop-filter: blur(0.4rem);
	box-shadow: 0 0 0 rgba(1, 142, 154, 0);
	transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),
		border-color 0.4s ease, background-color 0.4s ease, box-shadow 0.5s ease;
	will-change: transform;
}
.partnerships__card:hover,
.partnerships__card:focus-visible {
	border-color: color-mix(in srgb, var(--signal-teal-600) 60%, transparent);
	background: rgba(255, 255, 255, 0.08);
	transform: translateY(-0.6rem);
	box-shadow: 0 1.6rem 4rem color-mix(in srgb, var(--signal-teal-600) 16%, transparent);
	outline: none;
}
.partnerships__card-top {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1.6rem;
}
.partnerships__avatar {
	width: 4.8rem;
	height: 4.8rem;
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--white);
	border-radius: 0.8rem;
	overflow: hidden;
}
.partnerships__avatar img { max-width: 72%; max-height: 72%; object-fit: contain; }

.partnerships__card-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 3.2rem;
	height: 3.2rem;
	color: var(--white);
	background: rgba(255, 255, 255, 0.08);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	border-radius: var(--radius-max);
	opacity: 0;
	transform: scale(0.85);
	transition: opacity 0.4s ease, transform 0.5s cubic-bezier(0.22, 1, 0.36, 1), background-color 0.3s ease;
}
.partnerships__card-icon svg { width: 1.6rem; height: 1.6rem; }
.partnerships__card:hover .partnerships__card-icon,
.partnerships__card:focus-visible .partnerships__card-icon {
	opacity: 1;
	transform: scale(1);
	background: rgba(255, 255, 255, 0.14);
}
@media (hover: none) {
	.partnerships__card-icon { opacity: 0.7; transform: scale(1); } /* touch: no hover state, keep it visible */
}
.partnerships__card-name {
	margin-top: 2rem;
	font-size: var(--text-lg);
	line-height: var(--leading-lg);
	letter-spacing: var(--tracking-lg);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}

@media (max-width: 64rem) { /* 1024 — tablet: 2 columns; step the never-shrinking text-4xl heading down */
	.partnerships__inner { gap: 6rem; }
	.partnerships__grid { grid-template-columns: repeat(2, 1fr); }
	.partnerships__heading,
	.partnerships__heading p { font-size: var(--text-3xl); line-height: var(--leading-3xl); }
}
@media (max-width: 48rem) { /* 768 — mobile: single column */
	.partnerships__grid { grid-template-columns: 1fr; }
	.partnerships__card { min-height: 0; }
}

/* ===== Detail pop-up — slides UP from the bottom, cycles every partner ===== */
.partnerships__modal {
	position: fixed;
	inset: 0;
	z-index: 1000;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 4rem 2rem;
	visibility: hidden; /* JS keeps .is-closing on until the card's slide-down transitionend fires,
	                       so the card fully slides DOWN before the modal hides (see module.js). */
}
.partnerships__modal.is-open,
.partnerships__modal.is-closing { visibility: visible; }

.partnerships__modal-backdrop {
	position: absolute;
	inset: 0;
	background: rgba(19, 25, 45, 0.8);
	-webkit-backdrop-filter: blur(1rem);
	backdrop-filter: blur(1rem);
	opacity: 0;
	transition: opacity 0.4s ease;
}
.partnerships__modal.is-open .partnerships__modal-backdrop { opacity: 1; }

.partnerships__modal-card {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	width: min(84.6rem, 100%); /* Figma 846px */
	max-height: 100%;
	/* Translucent glass — the Figma dark-mode token Components/Card/Glass/bg-card = #ffffff0d
	   (rgba 255,255,255,.05) with an 80px backdrop blur (bg-blur-2xl). The rgba(19,25,45,.8) overlay
	   + blurred page behind give it its blue cast, so the card reads as deep translucent blue-navy,
	   NOT opaque black. (Figma 468:5210.) */
	background: rgba(255, 255, 255, 0.05);
	-webkit-backdrop-filter: blur(8rem);
	backdrop-filter: blur(8rem);
	border: 0.1rem solid rgba(255, 255, 255, 0.1);
	border-radius: 1.6rem; /* Figma 16px */
	overflow: hidden;
	box-shadow: var(--shadow-2xl);
	transform: translateY(110%); /* start below the fold → slide up into place */
	transition: transform 0.55s cubic-bezier(0.38, 0.21, 0, 0.92);
	will-change: transform;
}
.partnerships__modal.is-open .partnerships__modal-card { transform: translateY(0); }
@media (prefers-reduced-motion: reduce) {
	.partnerships__modal-card { transition: none; transform: none; }
	.partnerships__modal-backdrop { transition: none; }
}

.partnerships__modal-close {
	position: absolute;
	top: 2.4rem;
	right: 2.4rem;
	z-index: 3;
	width: 4rem;
	height: 4rem;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: var(--white);
	background: rgba(255, 255, 255, 0.08);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	border-radius: var(--radius-max);
	cursor: pointer;
	-webkit-backdrop-filter: blur(1rem);
	backdrop-filter: blur(1rem);
	transition: background-color 0.2s ease;
}
.partnerships__modal-close:hover { background: rgba(255, 255, 255, 0.16); }
.partnerships__modal-close svg { width: 1.3rem; height: 1.3rem; }

/* Panels — only the active partner is shown; each fills the space above the nav and scrolls. */
.partnerships__panels { flex: 1 1 auto; min-height: 0; display: flex; }
.partnerships__panel { display: none; }
.partnerships__panel.is-active { display: flex; flex-direction: column; width: 100%; min-height: 0; }

.partnerships__panel-head {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	gap: 2.4rem;
	padding: 3.9rem 8rem 2.4rem 3.9rem; /* right cleared for the close button */
}
.partnerships__avatar--lg {
	width: 8rem;
	height: 8rem;
	border-radius: 0.8rem;
}
.partnerships__panel-meta { display: flex; flex-direction: column; gap: 0.9rem; min-width: 0; }
.partnerships__panel-title {
	margin: 0;
	font-size: var(--text-2xl);
	line-height: var(--leading-2xl);
	letter-spacing: var(--tracking-2xl);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}
.partnerships__panel-url {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	width: fit-content;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
}
.partnerships__panel-url-icon { display: inline-flex; color: var(--text-accent); }
.partnerships__panel-url-icon svg { width: 1.6rem; height: 1.6rem; }

.partnerships__panel-body {
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	padding: 0 3.9rem 3.9rem;
}
.partnerships__statement p {
	margin: 0 0 1.6rem;
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightLight);
	color: var(--foundation-300);
}
.partnerships__statement p:last-child { margin-bottom: 0; }

/* Bottom nav — glass, Prev / counter / Next */
.partnerships__modal-nav {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.6rem;
	padding: 2.4rem 4rem;
	background: rgba(255, 255, 255, 0.05);
	border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
	-webkit-backdrop-filter: blur(2rem);
	backdrop-filter: blur(2rem);
}
.partnerships__nav-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.6rem;
	min-width: 11rem; /* Figma 110px */
	padding: 0.9rem 1.8rem;
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-weight: var(--fontWeightMedium);
	color: var(--white);
	background: rgba(255, 255, 255, 0.05);
	border: 0.1rem solid rgba(255, 255, 255, 0.12);
	border-radius: var(--radius-max);
	cursor: pointer;
	transition: background-color 0.2s ease;
}
.partnerships__nav-btn:hover { background: rgba(255, 255, 255, 0.12); }
.partnerships__nav-icon { display: inline-flex; }
.partnerships__nav-icon svg { width: 1.3rem; height: 1.3rem; }
.partnerships__counter {
	display: inline-flex;
	align-items: center;
	gap: 0.4rem;
	font-family: var(--primaryFont);
	font-size: var(--text-base);
	line-height: var(--leading-base);
	font-variant-numeric: tabular-nums;
}
.partnerships__counter-cur { color: var(--white); }
.partnerships__counter-sep,
.partnerships__counter-total { color: var(--foundation-400); }

/* Mobile (≤768px) — a true bottom sheet: full-width, rounded top only, slides up from the bottom. */
@media (max-width: 48rem) {
	.partnerships__modal { padding: 0; align-items: flex-end; }
	.partnerships__modal-card {
		width: 100%;
		max-height: 92vh;
		border-radius: 1.6rem 1.6rem 0 0;
		border-bottom: none;
		transform: translateY(100%);
	}
	.partnerships__modal-close { top: 2rem; right: 2rem; }
	.partnerships__panel-head { gap: 1.6rem; padding: 3.2rem 7rem 2rem 2.4rem; }
	.partnerships__avatar--lg { width: 6.4rem; height: 6.4rem; }
	.partnerships__panel-title { font-size: var(--text-xl); line-height: var(--leading-xl); }
	.partnerships__panel-body { padding: 0 2.4rem 2.4rem; }
	.partnerships__modal-nav { padding: 1.8rem 2.4rem; }
	.partnerships__nav-btn { min-width: 0; }
}