/* ==========================================================================
   Fabrix.ai — site.css
   The one custom stylesheet for the v2.0 framework. It loads AFTER
   Bootstrap 5.3.3: Bootstrap supplies reboot, grid and utilities, and this
   file supplies the brand layer on top.

     1. Tokens            Bootstrap variable overrides + brand tokens
     2. Base              type, links, anchors
     3. Navigation        #nav-main mega menu + mobile drawer
     4. Footer            .fx-footer
     5. Page components   .fx-page sections, cards, grids, tabs, CTA
     6. Page skins        per-page backgrounds only
     7. Runtime states    content injection

   Rules of the road
   - Prefer a Bootstrap utility over a new rule.
   - Components use class selectors only, namespaced .fx-*. Never style a bare
     element outside section 2, or page CSS will leak into the nav and footer.
   ========================================================================== */

/* 0. Bootstrap 5.3.3 subset ==================================================
   Pages converted from the legacy site do not load Bootstrap's CSS: their own
   stylesheet (dist/css/pages/) already holds every Bootstrap rule they used,
   and the full framework would restyle their markup (.btn, .nav-tabs...).
   This is the part of Bootstrap the shared chrome needs on those pages:
   reboot and root variables, the footer grid/utilities (scoped to .fx-footer),
   and the widgets app.js creates (video modal, tabs/collapse states,
   .visually-hidden). Rules are copied verbatim from bootstrap@5.3.3, so pages
   that do load Bootstrap see identical values. Generated; do not hand-edit.
   ========================================================================== */
*,
*::before,
*::after { box-sizing: border-box; }
[hidden] { display: none !important; }
:root, [data-bs-theme="light"] { --bs-blue: #0d6efd; --bs-indigo: #6610f2; --bs-purple: #6f42c1; --bs-pink: #d63384; --bs-red: #dc3545; --bs-orange: #fd7e14; --bs-yellow: #ffc107; --bs-green: #198754; --bs-teal: #20c997; --bs-cyan: #0dcaf0; --bs-black: #000; --bs-white: #fff; --bs-gray: #6c757d; --bs-gray-dark: #343a40; --bs-gray-100: #f8f9fa; --bs-gray-200: #e9ecef; --bs-gray-300: #dee2e6; --bs-gray-400: #ced4da; --bs-gray-500: #adb5bd; --bs-gray-600: #6c757d; --bs-gray-700: #495057; --bs-gray-800: #343a40; --bs-gray-900: #212529; --bs-primary: #0d6efd; --bs-secondary: #6c757d; --bs-success: #198754; --bs-info: #0dcaf0; --bs-warning: #ffc107; --bs-danger: #dc3545; --bs-light: #f8f9fa; --bs-dark: #212529; --bs-primary-rgb: 13,110,253; --bs-secondary-rgb: 108,117,125; --bs-success-rgb: 25,135,84; --bs-info-rgb: 13,202,240; --bs-warning-rgb: 255,193,7; --bs-danger-rgb: 220,53,69; --bs-light-rgb: 248,249,250; --bs-dark-rgb: 33,37,41; --bs-primary-text-emphasis: #052c65; --bs-secondary-text-emphasis: #2b2f32; --bs-success-text-emphasis: #0a3622; --bs-info-text-emphasis: #055160; --bs-warning-text-emphasis: #664d03; --bs-danger-text-emphasis: #58151c; --bs-light-text-emphasis: #495057; --bs-dark-text-emphasis: #495057; --bs-primary-bg-subtle: #cfe2ff; --bs-secondary-bg-subtle: #e2e3e5; --bs-success-bg-subtle: #d1e7dd; --bs-info-bg-subtle: #cff4fc; --bs-warning-bg-subtle: #fff3cd; --bs-danger-bg-subtle: #f8d7da; --bs-light-bg-subtle: #fcfcfd; --bs-dark-bg-subtle: #ced4da; --bs-primary-border-subtle: #9ec5fe; --bs-secondary-border-subtle: #c4c8cb; --bs-success-border-subtle: #a3cfbb; --bs-info-border-subtle: #9eeaf9; --bs-warning-border-subtle: #ffe69c; --bs-danger-border-subtle: #f1aeb5; --bs-light-border-subtle: #e9ecef; --bs-dark-border-subtle: #adb5bd; --bs-white-rgb: 255,255,255; --bs-black-rgb: 0,0,0; --bs-font-sans-serif: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; --bs-font-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); --bs-body-font-family: var(--bs-font-sans-serif); --bs-body-font-size: 1rem; --bs-body-font-weight: 400; --bs-body-line-height: 1.5; --bs-body-color: #212529; --bs-body-color-rgb: 33,37,41; --bs-body-bg: #fff; --bs-body-bg-rgb: 255,255,255; --bs-emphasis-color: #000; --bs-emphasis-color-rgb: 0,0,0; --bs-secondary-color: rgba(33, 37, 41, 0.75); --bs-secondary-color-rgb: 33,37,41; --bs-secondary-bg: #e9ecef; --bs-secondary-bg-rgb: 233,236,239; --bs-tertiary-color: rgba(33, 37, 41, 0.5); --bs-tertiary-color-rgb: 33,37,41; --bs-tertiary-bg: #f8f9fa; --bs-tertiary-bg-rgb: 248,249,250; --bs-heading-color: inherit; --bs-link-color: #0d6efd; --bs-link-color-rgb: 13,110,253; --bs-link-decoration: underline; --bs-link-hover-color: #0a58ca; --bs-link-hover-color-rgb: 10,88,202; --bs-code-color: #d63384; --bs-highlight-color: #212529; --bs-highlight-bg: #fff3cd; --bs-border-width: 1px; --bs-border-style: solid; --bs-border-color: #dee2e6; --bs-border-color-translucent: rgba(0, 0, 0, 0.175); --bs-border-radius: 0.375rem; --bs-border-radius-sm: 0.25rem; --bs-border-radius-lg: 0.5rem; --bs-border-radius-xl: 1rem; --bs-border-radius-xxl: 2rem; --bs-border-radius-2xl: var(--bs-border-radius-xxl); --bs-border-radius-pill: 50rem; --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); --bs-focus-ring-width: 0.25rem; --bs-focus-ring-opacity: 0.25; --bs-focus-ring-color: rgba(13, 110, 253, 0.25); --bs-form-valid-color: #198754; --bs-form-valid-border-color: #198754; --bs-form-invalid-color: #dc3545; --bs-form-invalid-border-color: #dc3545; }
.fx-footer *,
::after,
::before { box-sizing: border-box; }
@media (prefers-reduced-motion: no-preference) {
:root { scroll-behavior: smooth; }
}
body { margin: 0px; font-family: var(--bs-body-font-family); font-size: var(--bs-body-font-size); font-weight: var(--bs-body-font-weight); line-height: var(--bs-body-line-height); color: var(--bs-body-color); text-align: var(--bs-body-text-align); background-color: var(--bs-body-bg); text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; }
hr { margin: 1rem 0px; color: inherit; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: none; border-top: var(--bs-border-width) solid; opacity: 0.25; }
h1,
h2,
h3,
h4,
h5,
h6 { margin-top: 0px; margin-bottom: 0.5rem; font-weight: 500; line-height: 1.2; color: var(--bs-heading-color); }
h1 { font-size: calc(1.375rem + 1.5vw); }
@media (min-width: 1200px) {
h1 { font-size: 2.5rem; }
}
h2 { font-size: calc(1.325rem + 0.9vw); }
@media (min-width: 1200px) {
h2 { font-size: 2rem; }
}
h3 { font-size: calc(1.3rem + 0.6vw); }
@media (min-width: 1200px) {
h3 { font-size: 1.75rem; }
}
h4 { font-size: calc(1.275rem + 0.3vw); }
@media (min-width: 1200px) {
h4 { font-size: 1.5rem; }
}
h5 { font-size: 1.25rem; }
h6 { font-size: 1rem; }
p { margin-top: 0px; margin-bottom: 1rem; }
ol,
ul { padding-left: 2rem; }
ol,
ul { margin-top: 0px; margin-bottom: 1rem; }
ol ol,
ol ul,
ul ol,
ul ul { margin-bottom: 0px; }
b,
strong { font-weight: bolder; }
small { font-size: 0.875em; }
a { color: rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1)); text-decoration: underline; }
a:hover { --bs-link-color-rgb: var(--bs-link-hover-color-rgb); }
a:not([href]):not([class]),
a:not([href]):not([class]):hover { color: inherit; text-decoration: none; }
a > code { color: inherit; }
img,
svg { vertical-align: middle; }
button { border-radius: 0px; }
button:focus:not(:focus-visible) { outline: 0px; }
button { margin: 0px; font-family: inherit; font-size: inherit; line-height: inherit; }
button { text-transform: none; }
#nav-main [type="button"],
button { appearance: button; }
button:not(:disabled) { cursor: pointer; }
.fx-footer ::-webkit-datetime-edit-day-field,
.fx-footer ::-webkit-datetime-edit-fields-wrapper,
.fx-footer ::-webkit-datetime-edit-hour-field,
.fx-footer ::-webkit-datetime-edit-minute,
.fx-footer ::-webkit-datetime-edit-month-field,
.fx-footer ::-webkit-datetime-edit-text,
.fx-footer ::-webkit-datetime-edit-year-field { padding: 0px; }
.fx-footer ::-webkit-inner-spin-button { height: auto; }
.fx-footer ::-webkit-search-decoration { appearance: none; }
.fx-footer ::-webkit-color-swatch-wrapper { padding: 0px; }
.fx-footer ::-webkit-file-upload-button { font: inherit; appearance: button; }
.fx-footer .list-unstyled { padding-left: 0px; list-style: none; }
.fx-footer .container { --bs-gutter-x: 1.5rem; --bs-gutter-y: 0; width: 100%; padding-right: calc(var(--bs-gutter-x) * .5); padding-left: calc(var(--bs-gutter-x) * .5); margin-right: auto; margin-left: auto; }
@media (min-width: 576px) {
.fx-footer .container { max-width: 540px; }
}
@media (min-width: 768px) {
.fx-footer .container { max-width: 720px; }
}
@media (min-width: 992px) {
.fx-footer .container { max-width: 960px; }
}
@media (min-width: 1200px) {
.fx-footer .container { max-width: 1140px; }
}
@media (min-width: 1400px) {
.fx-footer .container { max-width: 1320px; }
}
:root { --bs-breakpoint-xs: 0; --bs-breakpoint-sm: 576px; --bs-breakpoint-md: 768px; --bs-breakpoint-lg: 992px; --bs-breakpoint-xl: 1200px; --bs-breakpoint-xxl: 1400px; }
.fx-footer .row { --bs-gutter-x: 1.5rem; --bs-gutter-y: 0; display: flex; flex-wrap: wrap; margin-top: calc(-1 * var(--bs-gutter-y)); margin-right: calc(-.5 * var(--bs-gutter-x)); margin-left: calc(-.5 * var(--bs-gutter-x)); }
.fx-footer .row > * { flex-shrink: 0; width: 100%; max-width: 100%; padding-right: calc(var(--bs-gutter-x) * .5); padding-left: calc(var(--bs-gutter-x) * .5); margin-top: var(--bs-gutter-y); }
@media (min-width: 768px) {
.fx-footer .col-md-6 { flex: 0 0 auto; width: 50%; }
}
@media (min-width: 992px) {
.fx-footer .col-lg-2 { flex: 0 0 auto; width: 16.6667%; }
.fx-footer .col-lg-3 { flex: 0 0 auto; width: 25%; }
}
.btn.active,
.btn.show { color: var(--bs-btn-active-color); background-color: var(--bs-btn-active-bg); border-color: var(--bs-btn-active-border-color); }
.btn.active:focus-visible,
.btn.show:focus-visible { box-shadow: var(--bs-btn-focus-box-shadow); }
.fade { transition: opacity 0.15s linear; }
@media (prefers-reduced-motion: reduce) {
.fade { transition: none; }
}
.fade:not(.show) { opacity: 0; }
.collapse:not(.show) { display: none; }
.collapsing { height: 0px; overflow: hidden; transition: height 0.35s; }
@media (prefers-reduced-motion: reduce) {
.collapsing { transition: none; }
}
.collapsing.collapse-horizontal { width: 0px; height: auto; transition: width 0.35s; }
@media (prefers-reduced-motion: reduce) {
.collapsing.collapse-horizontal { transition: none; }
}
.dropdown-item.active { color: var(--bs-dropdown-link-active-color); text-decoration: none; background-color: var(--bs-dropdown-link-active-bg); }
.dropdown-menu.show { display: block; }
.btn-group-vertical > .btn.active,
.btn-group > .btn.active { z-index: 1; }
.fx-footer .nav { --bs-nav-link-padding-x: 1rem; --bs-nav-link-padding-y: 0.5rem; --bs-nav-link-font-weight: ; --bs-nav-link-color: var(--bs-link-color); --bs-nav-link-hover-color: var(--bs-link-hover-color); --bs-nav-link-disabled-color: var(--bs-secondary-color); display: flex; flex-wrap: wrap; padding-left: 0px; margin-bottom: 0px; list-style: none; }
.nav-tabs .nav-item.show .nav-link,
.nav-tabs .nav-link.active { color: var(--bs-nav-tabs-link-active-color); background-color: var(--bs-nav-tabs-link-active-bg); border-color: var(--bs-nav-tabs-link-active-border-color); }
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link { color: var(--bs-nav-pills-link-active-color); background-color: var(--bs-nav-pills-link-active-bg); }
.nav-underline .nav-link.active,
.nav-underline .show > .nav-link { font-weight: 700; color: var(--bs-nav-underline-link-active-color); border-bottom-color: currentcolor; }
.tab-content > .tab-pane { display: none; }
.tab-content > .active { display: block; }
.navbar-nav .nav-link.active,
.navbar-nav .nav-link.show { color: var(--bs-navbar-active-color); }
.card-header-tabs .nav-link.active { background-color: var(--bs-card-bg); border-bottom-color: var(--bs-card-bg); }
.breadcrumb-item.active { color: var(--bs-breadcrumb-item-active-color); }
.active > .page-link,
.page-link.active { z-index: 3; color: var(--bs-pagination-active-color); background-color: var(--bs-pagination-active-bg); border-color: var(--bs-pagination-active-border-color); }
.alert-dismissible .btn-close { position: absolute; top: 0px; right: 0px; z-index: 2; padding: 1.25rem 1rem; }
.list-group-item.active { z-index: 2; color: var(--bs-list-group-active-color); background-color: var(--bs-list-group-active-bg); border-color: var(--bs-list-group-active-border-color); }
.list-group-item + .list-group-item.active { margin-top: calc(-1 * var(--bs-list-group-border-width)); border-top-width: var(--bs-list-group-border-width); }
.list-group-horizontal > .list-group-item.active { margin-top: 0px; }
.list-group-horizontal > .list-group-item + .list-group-item.active { margin-left: calc(-1 * var(--bs-list-group-border-width)); border-left-width: var(--bs-list-group-border-width); }
@media (min-width: 576px) {
.list-group-horizontal-sm > .list-group-item.active { margin-top: 0px; }
.list-group-horizontal-sm > .list-group-item + .list-group-item.active { margin-left: calc(-1 * var(--bs-list-group-border-width)); border-left-width: var(--bs-list-group-border-width); }
}
@media (min-width: 768px) {
.list-group-horizontal-md > .list-group-item.active { margin-top: 0px; }
.list-group-horizontal-md > .list-group-item + .list-group-item.active { margin-left: calc(-1 * var(--bs-list-group-border-width)); border-left-width: var(--bs-list-group-border-width); }
}
@media (min-width: 992px) {
.list-group-horizontal-lg > .list-group-item.active { margin-top: 0px; }
.list-group-horizontal-lg > .list-group-item + .list-group-item.active { margin-left: calc(-1 * var(--bs-list-group-border-width)); border-left-width: var(--bs-list-group-border-width); }
}
@media (min-width: 1200px) {
.list-group-horizontal-xl > .list-group-item.active { margin-top: 0px; }
.list-group-horizontal-xl > .list-group-item + .list-group-item.active { margin-left: calc(-1 * var(--bs-list-group-border-width)); border-left-width: var(--bs-list-group-border-width); }
}
@media (min-width: 1400px) {
.list-group-horizontal-xxl > .list-group-item.active { margin-top: 0px; }
.list-group-horizontal-xxl > .list-group-item + .list-group-item.active { margin-left: calc(-1 * var(--bs-list-group-border-width)); border-left-width: var(--bs-list-group-border-width); }
}
.btn-close { --bs-btn-close-color: #000; --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); --bs-btn-close-opacity: 0.5; --bs-btn-close-hover-opacity: 0.75; --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); --bs-btn-close-focus-opacity: 1; --bs-btn-close-disabled-opacity: 0.25; --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); box-sizing: content-box; width: 1em; height: 1em; padding: 0.25em; color: var(--bs-btn-close-color); background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; border: 0px; border-radius: 0.375rem; opacity: var(--bs-btn-close-opacity); }
.btn-close:hover { color: var(--bs-btn-close-color); text-decoration: none; opacity: var(--bs-btn-close-hover-opacity); }
.btn-close:focus { outline: 0px; box-shadow: var(--bs-btn-close-focus-shadow); opacity: var(--bs-btn-close-focus-opacity); }
.btn-close.disabled,
.btn-close:disabled { pointer-events: none; -webkit-user-select: none; user-select: none; opacity: var(--bs-btn-close-disabled-opacity); }
.btn-close-white { filter: var(--bs-btn-close-white-filter); }
[data-bs-theme="dark"] .btn-close { filter: var(--bs-btn-close-white-filter); }
.toast:not(.show) { display: none; }
.toast-header .btn-close { margin-right: calc(-.5 * var(--bs-toast-padding-x)); margin-left: var(--bs-toast-padding-x); }
.modal { --bs-modal-zindex: 1055; --bs-modal-width: 500px; --bs-modal-padding: 1rem; --bs-modal-margin: 0.5rem; --bs-modal-color: ; --bs-modal-bg: var(--bs-body-bg); --bs-modal-border-color: var(--bs-border-color-translucent); --bs-modal-border-width: var(--bs-border-width); --bs-modal-border-radius: var(--bs-border-radius-lg); --bs-modal-box-shadow: var(--bs-box-shadow-sm); --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); --bs-modal-header-padding-x: 1rem; --bs-modal-header-padding-y: 1rem; --bs-modal-header-padding: 1rem 1rem; --bs-modal-header-border-color: var(--bs-border-color); --bs-modal-header-border-width: var(--bs-border-width); --bs-modal-title-line-height: 1.5; --bs-modal-footer-gap: 0.5rem; --bs-modal-footer-bg: ; --bs-modal-footer-border-color: var(--bs-border-color); --bs-modal-footer-border-width: var(--bs-border-width); position: fixed; top: 0px; left: 0px; z-index: var(--bs-modal-zindex); display: none; width: 100%; height: 100%; overflow: hidden auto; outline: 0px; }
.modal-dialog { position: relative; width: auto; margin: var(--bs-modal-margin); pointer-events: none; }
.modal.fade .modal-dialog { transition: transform 0.3s ease-out; transform: translate(0px, -50px); }
@media (prefers-reduced-motion: reduce) {
.modal.fade .modal-dialog { transition: none; }
}
.modal.show .modal-dialog { transform: none; }
.modal.modal-static .modal-dialog { transform: scale(1.02); }
.modal-dialog-scrollable { height: calc(100% - var(--bs-modal-margin) * 2); }
.modal-dialog-scrollable .modal-content { max-height: 100%; overflow: hidden; }
.modal-dialog-scrollable .modal-body { overflow-y: auto; }
.modal-dialog-centered { display: flex; align-items: center; min-height: calc(100% - var(--bs-modal-margin) * 2); }
.modal-content { position: relative; display: flex; flex-direction: column; width: 100%; color: var(--bs-modal-color); pointer-events: auto; background-color: var(--bs-modal-bg); background-clip: padding-box; border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); border-radius: var(--bs-modal-border-radius); outline: 0px; }
.modal-backdrop { --bs-backdrop-zindex: 1050; --bs-backdrop-bg: #000; --bs-backdrop-opacity: 0.5; position: fixed; top: 0px; left: 0px; z-index: var(--bs-backdrop-zindex); width: 100vw; height: 100vh; background-color: var(--bs-backdrop-bg); }
.modal-backdrop.fade { opacity: 0; }
.modal-backdrop.show { opacity: var(--bs-backdrop-opacity); }
.modal-header { display: flex; flex-shrink: 0; align-items: center; padding: var(--bs-modal-header-padding); border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); border-top-left-radius: var(--bs-modal-inner-border-radius); border-top-right-radius: var(--bs-modal-inner-border-radius); }
.modal-header .btn-close { padding: calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5); margin: calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto; }
.modal-title { margin-bottom: 0px; line-height: var(--bs-modal-title-line-height); }
.modal-body { position: relative; flex: 1 1 auto; padding: var(--bs-modal-padding); }
.modal-footer { display: flex; flex-shrink: 0; flex-wrap: wrap; align-items: center; justify-content: flex-end; padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5); background-color: var(--bs-modal-footer-bg); border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); border-bottom-right-radius: var(--bs-modal-inner-border-radius); border-bottom-left-radius: var(--bs-modal-inner-border-radius); }
.modal-footer > * { margin: calc(var(--bs-modal-footer-gap) * .5); }
@media (min-width: 576px) {
.modal { --bs-modal-margin: 1.75rem; --bs-modal-box-shadow: var(--bs-box-shadow); }
.modal-dialog { max-width: var(--bs-modal-width); margin-right: auto; margin-left: auto; }
.modal-sm { --bs-modal-width: 300px; }
}
@media (min-width: 992px) {
.modal-lg,
.modal-xl { --bs-modal-width: 800px; }
}
@media (min-width: 1200px) {
.modal-xl { --bs-modal-width: 1140px; }
}
.modal-fullscreen { width: 100vw; max-width: none; height: 100%; margin: 0px; }
.modal-fullscreen .modal-content { height: 100%; border: 0px; border-radius: 0px; }
.modal-fullscreen .modal-footer,
.modal-fullscreen .modal-header { border-radius: 0px; }
.modal-fullscreen .modal-body { overflow-y: auto; }
@media (max-width: 575.98px) {
.modal-fullscreen-sm-down { width: 100vw; max-width: none; height: 100%; margin: 0px; }
.modal-fullscreen-sm-down .modal-content { height: 100%; border: 0px; border-radius: 0px; }
.modal-fullscreen-sm-down .modal-footer,
.modal-fullscreen-sm-down .modal-header { border-radius: 0px; }
.modal-fullscreen-sm-down .modal-body { overflow-y: auto; }
}
@media (max-width: 767.98px) {
.modal-fullscreen-md-down { width: 100vw; max-width: none; height: 100%; margin: 0px; }
.modal-fullscreen-md-down .modal-content { height: 100%; border: 0px; border-radius: 0px; }
.modal-fullscreen-md-down .modal-footer,
.modal-fullscreen-md-down .modal-header { border-radius: 0px; }
.modal-fullscreen-md-down .modal-body { overflow-y: auto; }
}
@media (max-width: 991.98px) {
.modal-fullscreen-lg-down { width: 100vw; max-width: none; height: 100%; margin: 0px; }
.modal-fullscreen-lg-down .modal-content { height: 100%; border: 0px; border-radius: 0px; }
.modal-fullscreen-lg-down .modal-footer,
.modal-fullscreen-lg-down .modal-header { border-radius: 0px; }
.modal-fullscreen-lg-down .modal-body { overflow-y: auto; }
}
@media (max-width: 1199.98px) {
.modal-fullscreen-xl-down { width: 100vw; max-width: none; height: 100%; margin: 0px; }
.modal-fullscreen-xl-down .modal-content { height: 100%; border: 0px; border-radius: 0px; }
.modal-fullscreen-xl-down .modal-footer,
.modal-fullscreen-xl-down .modal-header { border-radius: 0px; }
.modal-fullscreen-xl-down .modal-body { overflow-y: auto; }
}
@media (max-width: 1399.98px) {
.modal-fullscreen-xxl-down { width: 100vw; max-width: none; height: 100%; margin: 0px; }
.modal-fullscreen-xxl-down .modal-content { height: 100%; border: 0px; border-radius: 0px; }
.modal-fullscreen-xxl-down .modal-footer,
.modal-fullscreen-xxl-down .modal-header { border-radius: 0px; }
.modal-fullscreen-xxl-down .modal-body { overflow-y: auto; }
}
.tooltip.show { opacity: var(--bs-tooltip-opacity); }
.carousel-item.active { display: block; }
.active.carousel-item-end { transform: translateX(100%); }
.active.carousel-item-start { transform: translateX(-100%); }
.carousel-fade .carousel-item.active { z-index: 1; opacity: 1; }
.carousel-fade .active.carousel-item-end,
.carousel-fade .active.carousel-item-start { z-index: 0; opacity: 0; transition: opacity 0.6s; }
@media (prefers-reduced-motion: reduce) {
.carousel-fade .active.carousel-item-end,
.carousel-fade .active.carousel-item-start { transition: none; }
}
.carousel-indicators .active { opacity: 1; }
@media (max-width: 575.98px) {
.offcanvas-sm.show:not(.hiding) { transform: none; }
.offcanvas-sm.show { visibility: visible; }
}
@media (max-width: 767.98px) {
.offcanvas-md.show:not(.hiding) { transform: none; }
.offcanvas-md.show { visibility: visible; }
}
@media (max-width: 991.98px) {
.offcanvas-lg.show:not(.hiding) { transform: none; }
.offcanvas-lg.show { visibility: visible; }
}
@media (max-width: 1199.98px) {
.offcanvas-xl.show:not(.hiding) { transform: none; }
.offcanvas-xl.show { visibility: visible; }
}
@media (max-width: 1399.98px) {
.offcanvas-xxl.show:not(.hiding) { transform: none; }
.offcanvas-xxl.show { visibility: visible; }
}
.offcanvas.show:not(.hiding) { transform: none; }
.offcanvas.show { visibility: visible; }
.offcanvas-backdrop.fade { opacity: 0; }
.offcanvas-backdrop.show { opacity: 0.5; }
.offcanvas-header .btn-close { padding: calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5); margin: calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto; }
.ratio { position: relative; width: 100%; }
.ratio::before { display: block; padding-top: var(--bs-aspect-ratio); content: ""; }
.ratio > * { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; }
.ratio-1x1 { --bs-aspect-ratio: 100%; }
.ratio-4x3 { --bs-aspect-ratio: 75%; }
.ratio-16x9 { --bs-aspect-ratio: 56.25%; }
.ratio-21x9 { --bs-aspect-ratio: 42.8571428571%; }
.visually-hidden,
.visually-hidden-focusable:not(:focus):not(:focus-within) { width: 1px !important; height: 1px !important; padding: 0px !important; margin: -1px !important; overflow: hidden !important; clip: rect(0px, 0px, 0px, 0px) !important; white-space: nowrap !important; border: 0px !important; }
.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),
.visually-hidden:not(caption) { position: absolute !important; }
.fx-footer .justify-content-center { justify-content: center !important; }
.fx-footer .text-end { text-align: right !important; }
.fx-footer .text-center { text-align: center !important; }
@media (min-width: 768px) {
.fx-footer .justify-content-md-start { justify-content: flex-start !important; }
}

/* 1. Tokens ================================================================ */
/* Metric-matched fallback for Montserrat -------------------------------------
   Montserrat loads from Google Fonts with font-display: swap, so the first
   paint uses the platform sans-serif and the page re-lays out when the webfont
   arrives. Measured on this site at 100px:

                    avg glyph width   ascent   descent   line box
     Montserrat           62.59         97%      25%       122%
     platform sans        57.43         91%      21%       112%

   Montserrat is 8.98% wider and its line box is 10 points taller, so the swap
   both re-wraps text and grows every line - it moved 5 of 25 sampled elements,
   the largest by 27px, and grew the page by 101px. That is the field CLS of
   0.19 that Search Console reports on 101 mobile URLs.

   This re-describes the local sans-serif with Montserrat's metrics so the
   fallback occupies the same space and the swap becomes invisible. The numbers
   are derived from the measurements above, not guessed:
     size-adjust      = 62.585 / 57.429            = 108.98%
     ascent-override  = 97%  / 1.0898              =  89.01%
     descent-override = 25%  / 1.0898              =  22.94%

   unicode-range covers Latin plus general punctuation (em dash, curly quotes,
   ellipsis) and stops before U+2190 arrows and U+2713 dingbats, which Montserrat
   does not contain - those keep rendering in the unadjusted platform font, at
   exactly the width they have today. */
/* Montserrat, self-hosted. Was two render-blocking requests to
   fonts.googleapis.com + fonts.gstatic.com: a stylesheet that then revealed the
   font file, so the font could not start downloading until both round trips had
   finished (Lighthouse measured that chain at 1,960ms). Served from our own
   origin it is one request on a connection the browser already has open.
   Variable font: one file covers weights 100-900. unicode-range is kept, so a
   subset is only fetched when the page actually uses those characters. */
@font-face {
  font-family: "Montserrat";
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/montserrat-latin-ext-italic.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Montserrat";
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/montserrat-latin-italic.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/montserrat-latin-ext-normal.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/montserrat-latin-normal.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Montserrat Fallback";
  src: local("Arial"), local("Helvetica Neue"), local("Roboto");
  size-adjust: 108.98%;
  ascent-override: 89.01%;
  descent-override: 22.94%;
  line-gap-override: 0%;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+20AC, U+2122;
}

:root {
  /* Bootstrap 5.3 variables: this is how the brand reaches every component. */
  /* Glyphs Montserrat lacks (→, ✓) still fall back to the platform sans-serif:
     "Montserrat Fallback" below carries a unicode-range that deliberately stops
     short of the arrow and dingbat blocks, so their width is unchanged. */
  --bs-body-font-family: "Montserrat", "Montserrat Fallback", sans-serif;
  --bs-body-font-size: 1.1rem;
  --bs-body-line-height: 1.65;
  --bs-body-color: #718096;
  --bs-body-color-rgb: 113, 128, 150;
  --bs-heading-color: #000e28;
  --bs-link-color: #2b284a;
  --bs-link-color-rgb: 43, 40, 74;
  --bs-link-hover-color: #e14f29;
  --bs-link-hover-color-rgb: 225, 79, 41;

  /* Brand */
  --fx-accent: #e14f29;
  --fx-accent-2: #c4401f;
  --fx-ink: #252525;
  --fx-muted: rgba(11, 11, 20, .72);
  --fx-line: #e4e4e8;
  --fx-line-strong: #a4a4b2;
  --fx-dark: #0b0b14;
  --fx-darker: #080c16;
  --fx-soft: #fafafa;
  --fx-navy: #171347;

  /* Navigation */
  --nh: 68px;
  --ink: #0b0d14;
  --ink2: #374151;
  --ink3: #6b7280;
  --ink4: #9ca3af;
  --surf: #ffffff;
  --surf2: #f7f8fb;
  --surf3: #eef0f5;
  --bdr: rgba(15, 20, 40, .08);
  --bdr2: rgba(15, 20, 40, .14);
  --shadow: 0 16px 56px rgba(11, 13, 20, .14), 0 2px 8px rgba(11, 13, 20, .07);
  --r: 12px;

  /* Anchor jumps clear the sticky nav. app.js reads the same value. */
  --fx-scroll-offset: 90px;
}

/* 2. Base ================================================================== */
/* Every <img> now carries width/height so the browser can reserve its box
   before the bytes arrive - a layout-shift fix. Those attributes are a
   presentational hint, and a hint still counts as a USED height, which
   silently disables any `aspect-ratio` a stylesheet sets: aspect-ratio only
   drives a dimension that is auto. The video-library thumbnails collapsed that
   way - the CSS asked for 2.2/1 and got 246x440, because height="440" won.

   `height: auto` hands sizing back to CSS and leaves the attributes doing the
   only job they are there for: declaring the ratio up front. 251 page rules set
   an img width without a height, so it belongs here rather than in each of them.
   It is a single element selector, so any real height - a class, an inline
   style, a page rule - still beats it. */
img { height: auto; }

/* overflow-x: clip keeps anything wider than the viewport (the off-canvas
   mobile nav, a long counter) from widening the page on phones. Not hidden:
   that would make <body> a scroll container and un-stick the sticky nav. */
body {
  overflow-x: clip;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
@media (max-width: 991.98px) {
  html { overflow-x: hidden; }
}
h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
  font-weight: 700;
}
a {
  text-decoration: none;
  transition: color .2s ease-in-out;
}
/* Both anchor styles: the homepage still uses legacy <a name="…"> targets. */
[id],
a[name] {
  scroll-margin-top: var(--fx-scroll-offset);
}
/* Hidden holder for <symbol> icon sprites. Not display:none - some engines
   refuse to paint <use> references into a display:none subtree. */
.fx-sprite {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
}

/* 3. Navigation ============================================================ */
/* Event band: a solid strip above the nav. It stays in normal flow rather than
   sticking, so scrolling takes it away and leaves the nav pinned by itself. */
.fx-eventbar {
  position: relative;
  z-index: 1;
  background: #fff3cd;
  color: var(--fx-ink);
}
/* Two class names on purpose. The band now lives inside the page content, and
   page CSS resets margins and padding with `.page-home *` (0,1,1) from a sheet
   that loads after this one - a single class would lose to it. */
.fx-eventbar .fx-eventbar__msg {
  max-width: 1320px;
  margin: 0 auto;
  padding: 12px 24px;
  text-align: center;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.4;
}
/* Same reason as the message rule above: `.page-home a` (0,1,1) sets its own
   link colour from a sheet that loads later, so this needs to out-specify it.
   The accent is written out rather than taken from --fx-accent, which page CSS
   is free to redefine inside its own scope. */
.fx-eventbar a.fx-eventbar__link {
  color: #e14f29;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.fx-eventbar a.fx-eventbar__link:hover { color: #c4401f; }
@media (max-width: 991.98px) {
  .fx-eventbar .fx-eventbar__msg { padding: 10px 16px; font-size: 13px; }
}

#nav-main {
  position: sticky;
  top: 0;
  z-index: 500;
  height: var(--nh);
  background: #000;
  box-shadow: 0 1px 0 rgba(255, 255, 255, .07);
}
#nav-main button {
  border: 0;
  background: none;
  cursor: pointer;
}
.nav-inner {
  display: flex;
  align-items: center;
  width: 100%;
  max-width: 1440px;
  height: 100%;
  margin: 0 auto;
  padding: 0 32px;
}
.logo {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  margin-right: 32px;
}
.logo img {
  display: block;
  width: 170px;
  height: 25px;
}

/* Desktop list */
.nav-list {
  display: flex;
  flex: 1;
  align-items: center;
  justify-content: center;   /* items centred between logo and Request Demo, as FX-New-Repo/menu.html */
  height: 100%;
  margin: 0 0 16px;
  padding: 0;
  list-style: none;
}
.nav-item-main {
  position: relative;
  display: flex;
  align-items: center;
  height: 100%;
}
#nav-main .nav-trigger,
#nav-main .nav-link-main {
  display: flex;
  align-items: center;
  gap: 5px;
  height: 100%;
  margin-top: 16px;
  padding: 0 14px;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.65;
  color: #fff;
  white-space: nowrap;
  transition: color .15s;
}
#nav-main .nav-item-main.open .nav-trigger { color: var(--fx-accent); }
#nav-main a:focus-visible,
#nav-main button:focus-visible {
  outline: 2px solid var(--fx-accent);
  outline-offset: 2px;
}
.chev {
  flex-shrink: 0;
  width: 13px;
  height: 13px;
  opacity: .55;
  transition: transform .3s cubic-bezier(.34, 1.56, .64, 1), opacity .15s;
}
.nav-item-main.open .chev {
  transform: rotate(180deg);
  opacity: 1;
  color: var(--fx-accent);
}

/* CTA */
.nav-cta {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: 10px;
  margin-left: auto;
}
.fx-btn-demo {
  display: block;
  padding: 4px 20px;
  border: 2px solid var(--fx-accent);
  border-radius: 32px;
  background: var(--fx-accent);
  font-size: .85rem;
  font-weight: 700;
  line-height: 1.5;
  letter-spacing: .01em;
  color: #fff;
  transition: background .15s, border-color .15s, transform .1s;
}
.fx-btn-demo:hover {
  border-color: var(--fx-accent-2);
  background: var(--fx-accent-2);
  color: #fff;
  transform: translateY(-1px);
}

/* Hamburger */
#nav-main .ham {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 40px;
  height: 40px;
  margin-left: 12px;
  padding: 8px;
  border-radius: 8px;
  transition: background .15s;
}
#nav-main .ham:hover { background: rgba(255, 255, 255, .08); }
.ham span {
  display: block;
  width: 22px;
  height: 2px;
  border-radius: 2px;
  background: rgba(255, 255, 255, .85);
  transform-origin: center;
  transition: transform .28s cubic-bezier(.4, 0, .2, 1), opacity .2s, width .2s;
}
.ham.is-open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.ham.is-open span:nth-child(2) { width: 0; opacity: 0; }
.ham.is-open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* Backdrop */
#backdrop {
  display: none;
  position: fixed;
  inset: var(--nh) 0 0 0;
  z-index: 400;
  background: rgba(11, 13, 20, .35);
  -webkit-backdrop-filter: blur(5px); /* Safari */
  backdrop-filter: blur(5px);
}
#backdrop.on { display: block; }

/* Mega dropdowns */
.drop-wrap {
  position: fixed;
  top: var(--nh);
  z-index: 450;
  pointer-events: none;
}
.drop {
  overflow: hidden;
  border: 1px solid var(--bdr2);
  border-radius: var(--r);
  background: var(--surf);
  box-shadow: var(--shadow);
  opacity: 0;
  transform: translateY(-8px) scale(.98);
  transform-origin: top center;
  transition: opacity .22s cubic-bezier(.16, 1, .3, 1), transform .26s cubic-bezier(.16, 1, .3, 1);
  pointer-events: none;
}
.nav-item-main.open .drop {
  opacity: 1;
  transform: translateY(0) scale(1);
  pointer-events: auto;
}
.nav-item-main.open .drop-wrap { pointer-events: auto; }

/* Platform: sidebar + panels */
.plat-shell {
  display: grid;
  grid-template-columns: 210px 1fr;
  min-height: 300px; /* the Agentic AI panel's height, so switching tabs does not resize the menu */
}
.plat-side {
  padding: 24px 0;
  border-right: 1px solid var(--bdr);
  background: var(--surf2);
}
.side-label {
  display: block;
  padding: 0 20px 12px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ink4);
}
/* Text stays the site link colour in every state. In the original a link sat
   inside the button and that link's colour is what rendered. */
#nav-main .side-btn {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 11px 20px;
  border-left: 2px solid transparent;
  font-size: 13.5px;
  font-weight: 600;
  line-height: 1.65;
  color: var(--bs-link-color);
  text-align: left;
  white-space: nowrap;
  transition: background .1s;
}
/* Nav icons: 24px line glyphs from the sprite in nav.html, stroked in currentColor. */
.side-ico,
.mi-ico {
  flex-shrink: 0;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: color .1s;
}
.side-ico {
  width: 18px;
  height: 18px;
  color: var(--ink4);
}
#nav-main .side-btn:hover { background: var(--surf3); }
#nav-main .side-btn.sel {
  border-left-color: var(--fx-accent);
  background: var(--surf3);
  font-weight: 700;
}
#nav-main .side-btn:hover .side-ico,
.side-btn.sel .side-ico { color: var(--fx-accent); }
.plat-panels { overflow: hidden; }
.panel {
  display: none;
  padding: 40px 30px 16px;
}
.panel.on { display: block; }
/* Section label only the mobile drawer needs: on desktop the sidebar names the panel. */
.panel-lbl { display: none; }
.pcols {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}
.pcol { padding: 0 20px 4px; }
.pcol + .pcol { border-left: 1px solid var(--bdr); }
.pcol:first-child { padding-left: 0; }
.pcol:last-child { padding-right: 0; }
.pgrid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 300px));
  column-gap: 32px;
}
/* The bottom item of each column carries no divider. */
@media (min-width: 1101px) {
  .pgrid .mi:nth-last-child(-n+2) { border-bottom: 0; }
}
.sec-lbl {
  margin-bottom: 6px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--fx-accent);
  white-space: nowrap;
}
.mi {
  display: flex;
  align-items: center;
  padding: 15px 12px;
  border-bottom: 1px solid var(--bdr);
  border-radius: 7px;
  font-size: 14px;
  font-weight: 600;
  color: var(--ink);
  white-space: nowrap;
  transition: background .1s, color .1s;
}
.mi:last-child { border-bottom: 0; }
.mi:hover {
  background: var(--surf2);
  color: var(--fx-accent);
}
.arr {
  flex-shrink: 0;
  order: -1;
  width: 13px;
  height: 13px;
  margin-right: 8px;
  opacity: .4;
  color: var(--fx-accent);
  transition: opacity .15s, transform .15s;
}
.mi:hover .arr {
  opacity: 1;
  transform: translateX(2px);
}
.mi-ico {
  width: 20px;
  height: 20px;
  margin-right: 12px;
  color: var(--ink3);
}
.mi:hover .mi-ico,
.mi:focus-visible .mi-ico { color: var(--fx-accent); }

/* Products */
.agents-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  padding: 26px 28px 20px;
}
.ag-col + .ag-col {
  padding-left: 24px;
  border-left: 1px solid var(--bdr);
}
.ag-col:first-child { padding-right: 24px; }

/* Solutions */
.sol-grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  padding: 26px 28px 20px;
}
.sol-col + .sol-col {
  padding-left: 24px;
  border-left: 1px solid var(--bdr);
}
.sol-col:first-child { padding-right: 24px; }
.sol-col:nth-child(2) { padding: 0 24px; }

/* Mobile: the same list becomes a full-screen accordion drawer. */
@media (max-width: 1100px) {
  #nav-main .ham { display: flex; flex-shrink: 0; }
  .nav-cta .fx-btn-demo { display: none; }
  .nav-list {
    position: fixed;
    top: var(--nh);
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 480;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    height: calc(100vh - var(--nh));
    margin: 0;
    padding-bottom: 80px;
    overflow-x: hidden;
    overflow-y: auto;
    background: var(--surf);
    transform: translateX(100%);
    transition: transform .32s cubic-bezier(.16, 1, .3, 1);
  }
  .nav-list.mob-open { transform: translateX(0); }
  .nav-item-main {
    position: static;
    flex-direction: column;
    align-items: stretch;
    width: 100%;
    height: auto;
    border-bottom: 1px solid var(--bdr);
  }
  #nav-main .nav-trigger,
  #nav-main .nav-link-main {
    justify-content: space-between;
    width: 100%;
    height: auto;
    margin-top: 0;
    padding: 16px 20px;
    background: var(--surf);
    font-size: 15px;
    font-weight: 700;
    color: var(--ink);
    transition: background .1s, color .1s;
  }
  #nav-main .nav-trigger:hover,
  #nav-main .nav-link-main:hover,
  #nav-main .nav-item-main.open > .nav-trigger {
    background: var(--surf2);
    color: var(--fx-accent);
  }
  /* Dark enough to read against the white drawer; the desktop nav keeps its own
     light chevrons, which sit on black. */
  .chev {
    width: 18px;
    height: 18px;
    opacity: 1;
    color: var(--ink2);
  }
  .nav-item-main.open > .nav-trigger .chev {
    transform: rotate(180deg);
    opacity: 1;
    color: var(--fx-accent);
  }
  .drop-wrap {
    position: static;
    left: auto !important;
    width: 100% !important;
    max-height: 0;
    overflow: hidden;
    pointer-events: auto;
    transition: max-height .38s cubic-bezier(.16, 1, .3, 1);
  }
  .nav-item-main.open .drop-wrap { max-height: 3000px; }
  .drop {
    border: 0;
    border-radius: 0;
    box-shadow: none;
    opacity: 1;
    transform: none;
    pointer-events: auto;
  }
  .plat-shell { display: block; }
  .plat-side {
    display: flex;
    flex-direction: column;
    padding: 0;
    border-right: 0;
    background: transparent;
  }
  .side-label { display: none; }
  #nav-main .side-btn,
  #nav-main .side-btn.sel {
    padding: 12px 20px;
    border-left: 0;
    border-bottom: 1px solid var(--bdr);
    background: var(--surf2);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--ink4);
    cursor: default;
    pointer-events: none;
  }
  .side-ico { display: none; }
  .plat-panels { overflow: visible; }
  .panel {
    display: block;
    padding: 0;
  }
  .panel-lbl { display: block; }
  .pcols,
  .pgrid,
  .agents-grid,
  .sol-grid { display: block; }
  .agents-grid,
  .sol-grid,
  .pcol,
  .pcol + .pcol,
  .ag-col,
  .ag-col:first-child,
  .ag-col + .ag-col,
  .sol-col,
  .sol-col:first-child,
  .sol-col + .sol-col,
  .sol-col:nth-child(2) {
    padding: 0;
    border-left: 0;
  }
  .sec-lbl {
    display: block;
    margin: 0;
    padding: 10px 20px 4px;
    border-top: 1px solid var(--bdr);
    background: var(--surf2);
  }
  .pcol:first-child .sec-lbl { border-top: 0; }
  .ag-col:first-child,
  .sol-col { border-bottom: 1px solid var(--bdr); }
  .sol-col:last-child { border-bottom: 0; }
  .mi {
    padding: 16px 20px;
    border-radius: 0;
    white-space: normal;
  }
}

/* 4. Footer ================================================================ */
/* Dark panel with rounded top corners: five columns (logo + address first), and a bottom bar
   (copyright, legal links, social icons). */
.fx-footer {
  position: relative;
  z-index: 1; /* above fixed page backdrops such as the homepage's particle canvas */
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 32px 32px 0 0;
  background: #000;
  color: rgba(255, 255, 255, .72);
}
.fx-footer-top { padding: 88px 0 64px; }
.fx-footer-brand { display: inline-flex; margin: 0 0 24px; }
.fx-footer-logo { display: block; width: 170px; height: 25px; } /* same size as the header logo */
/* same row as the header (.nav-inner): 1440px wide, 32px side padding, so the footer's first
   column starts exactly under the header logo */
.fx-footer .container { max-width: 1440px; padding-right: 32px; padding-left: 32px; }
.fx-footer-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 40px 32px;
}
.fx-footer-col { min-width: 0; }
.fx-footer-title {
  margin: 0 0 18px;
  color: #fff;
  font-size: 16px;
  font-weight: 600;
  line-height: 1.3;
  text-decoration: none;
}
.fx-footer-group,
.fx-footer a.fx-footer-group {
  display: block;
  margin: 14px 0 8px;
  color: rgba(255, 255, 255, .45);
  font-size: 10px;
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: .08em;
  text-transform: uppercase;
  text-decoration: none;
}
.fx-footer-title + .fx-footer-group { margin-top: 0; }
.fx-footer a.fx-footer-group:hover { color: #fff; }
.fx-footer-links { margin: 0; padding: 0; list-style: none; }
.fx-footer-links li { margin: 0 0 10px; font-size: 14px; line-height: 1.4; }
.fx-footer-links a,
.fx-footer-addr,
.fx-footer-addr a {
  color: rgba(255, 255, 255, .72);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.45;
  text-decoration: none;
  transition: color .2s ease;
}
.fx-footer-addr { margin: 0 0 10px; max-width: 240px; }
.fx-footer-links a:hover,
.fx-footer-addr a:hover { color: #fff; }
.fx-footer a:focus-visible { outline: 2px solid var(--fx-accent); outline-offset: 3px; border-radius: 4px; }
.fx-footer-soc { display: block; width: 72px; height: auto; margin-top: 24px; }
.fx-footer-bottom { padding: 0 0 32px; }
.fx-footer-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 20px 32px;
  padding-top: 32px;
  border-top: 1px solid rgba(255, 255, 255, .1);
}
.fx-footer-copy {
  flex: 1 1 0;
  margin: 0;
  color: rgba(255, 255, 255, .6);
  font-size: 14px;
}
.fx-footer-legal {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px 28px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.fx-footer-legal a {
  color: rgba(255, 255, 255, .72);
  font-size: 14px;
  text-decoration: none;
  transition: color .2s ease;
}
.fx-footer-legal a:hover { color: #fff; }
.fx-social {
  display: flex;
  flex: 1 1 0;
  justify-content: flex-end;
  gap: 12px;
}
.fx-social a {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: rgba(255, 255, 255, .08);
  color: rgba(255, 255, 255, .85);
  transition: background-color .2s ease, color .2s ease;
}
.fx-social a:hover { background: rgba(255, 255, 255, .16); color: #fff; }
.fx-social svg { width: 15px; height: 15px; fill: currentColor; }
@media (max-width: 1199.98px) {
  .fx-footer-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 991.98px) {
  .fx-footer { border-radius: 24px 24px 0 0; }
  .fx-footer-top { padding: 72px 0 56px; }
  .fx-footer-bar { flex-direction: column; align-items: center; text-align: center; }
  .fx-footer-copy, .fx-social { flex: 0 0 auto; }
  .fx-social { justify-content: center; }
}
@media (max-width: 767.98px) {
  .fx-footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 36px 24px; }
  /* The address column is full width here, so the SOC badge sits beside the
     address instead of under it. Grid placement only - the badge is already a
     sibling of the two address lines, so the markup is unchanged. */
  .fx-footer-col--address {
    grid-column: 1 / -1;
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    column-gap: 20px;
    align-items: start;
  }
  .fx-footer-brand { grid-column: 1 / -1; }
  .fx-footer-soc { grid-column: 2; grid-row: 2 / span 2; align-self: center; margin-top: 0; }
}
@media (max-width: 575px) {
  .fx-footer { border-radius: 20px 20px 0 0; }
  .fx-footer-top { padding: 56px 0 40px; }
}

/* 5. Page components ======================================================= */
/* Everything below is scoped to .fx-page, the <main> element each page's
   content is injected into, so none of it can reach the nav or footer.
   Pages built from these components add .fx-ink for their dark body text;
   pages that keep their own type colours (the homepage) leave it off. */
.fx-ink {
  color: var(--fx-ink);
}
/* Section shell: wide side gutters and a tall vertical rhythm. Hairline top
   borders separate light bands; dark bands drop the border. */
.fx-page .fx-sec {
  padding: 76px 64px;
  border-top: 1px solid var(--fx-line);
  background: #ffffff;
}
.fx-page .fx-wrap {
  max-width: 1280px;
  margin: 0 auto;
}
.fx-page .fx-eyebrow {
  margin: 0 0 32px;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: .35px;
  text-transform: uppercase;
  color: var(--fx-accent);
}

/* Pill buttons */
.fx-page .fx-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 10px 32px;
  border: 0;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.15;
  text-decoration: none;
  transition: opacity .2s ease;
}
.fx-page .fx-btn:hover,
.fx-page .fx-btn:focus {
  opacity: .9;
  text-decoration: none;
}
.fx-page .fx-btn-dark {
  background: var(--fx-dark);
  color: #ffffff;
}
.fx-page .fx-btn-light {
  background: #ffffff;
  color: var(--fx-ink);
}
.fx-page a:focus-visible,
.fx-page button:focus-visible {
  outline: 2px solid var(--fx-accent);
  outline-offset: 3px;
}

/* Hero */
.fx-page .fx-hero {
  position: relative;
  overflow: hidden;
  padding-top: 132px;
  padding-bottom: 132px;
  border-top: 0;
  background: var(--fx-hero-bg, none) center center / cover no-repeat, var(--fx-dark);
  text-align: center;
}
/* Dark wash that keeps hero copy legible over the background photo. */
.fx-page .fx-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(11, 11, 20, .62) 0%, rgba(11, 11, 20, .48) 55%, rgba(11, 11, 20, .68) 100%);
}
.fx-page .fx-hero > .fx-wrap {
  position: relative;
  z-index: 1;
}
.fx-page .fx-hero h1 {
  max-width: 20ch;
  margin: 0 auto;
  font-size: clamp(2.25rem, 5vw, 4rem);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -.025em;
  color: #ffffff;
}
.fx-page .fx-hero-sub {
  max-width: 42rem;
  margin: 32px auto 0;
  font-size: clamp(1rem, 1.6vw, 1.375rem);
  font-weight: 500;
  line-height: 1.4;
  color: #ffffff;
}

/* Section headings */
.fx-page .fx-sec-h2 {
  max-width: 22ch;
  margin: 0;
  font-size: clamp(1.85rem, 4vw, 3.25rem);
  font-weight: 600;
  line-height: 1.1;
  letter-spacing: -.025em;
  color: var(--fx-ink);
}
/* A heading that should hold one line instead of taking the 22ch cap. */
.fx-page .fx-sec-h2.fx-h2-full {
  max-width: none;
}
.fx-page .fx-sec-intro {
  max-width: 46rem;
  margin: 24px 0 0;
  font-size: 18px;
  line-height: 1.5;
  color: var(--fx-muted);
}
/* Wider measure, so a long intro sets on two lines at desktop, not four. */
.fx-page .fx-intro-wide {
  max-width: 72rem;
}
/* Centred header. Auto side margins matter as much as text-align: the heading
   and intro are max-width capped, so text-align alone would centre the text
   inside a block still parked against the left edge. */
.fx-page .fx-head-center {
  text-align: center;
}
.fx-page .fx-head-center .fx-sec-h2,
.fx-page .fx-head-center .fx-sec-intro {
  margin-right: auto;
  margin-left: auto;
}

/* Two-up "shift" cards */
.fx-page .fx-shift-grid {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  gap: 24px;
  margin-top: 56px;
}
.fx-page .fx-shift-card {
  padding: 32px;
  border: 1px solid var(--fx-line-strong);
  border-radius: 12px;
  background: #ffffff;
}
.fx-page .fx-shift-card h3 {
  margin: 0 0 20px;
  font-size: 22px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--fx-ink);
}
.fx-page .fx-shift-card p {
  margin: 0 0 16px;
  font-size: 16px;
  line-height: 1.55;
  color: var(--fx-muted);
}
.fx-page .fx-shift-card p:last-child {
  margin-bottom: 0;
}
.fx-page .fx-shift-card strong {
  font-weight: 600;
  color: var(--fx-ink);
}
.fx-page .fx-check-list {
  margin: 20px 0 0;
  padding: 0;
  list-style: none;
}
.fx-page .fx-check-list li {
  position: relative;
  padding: 0 0 12px 28px;
  font-size: 16px;
  line-height: 1.45;
  color: var(--fx-ink);
}
.fx-page .fx-check-list li::before {
  content: "\2713";
  position: absolute;
  top: 0;
  left: 0;
  font-weight: 600;
  color: var(--fx-accent);
}
.fx-page .fx-check-list li:last-child {
  padding-bottom: 0;
}

/* Capability cards: icon on the left, name as a bold lead-in. */
.fx-page .fx-cap-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 24px;
  margin-top: 56px;
}
.fx-page .fx-cap-card {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  padding: 24px;
  border: 1px solid var(--fx-line);
  border-radius: 12px;
  background: #ffffff;
}
/* A last card alone on its row centres under the grid. */
.fx-page .fx-cap-card:last-child:nth-child(3n+1) {
  grid-column: 2;
}
.fx-page .fx-cap-card p {
  margin: 0;
  font-size: 17px;
  line-height: 1.5;
  color: var(--fx-muted);
}
.fx-page .fx-cap-card strong {
  font-weight: 700;
  color: var(--fx-ink);
}
.fx-page .fx-cap-icon {
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  color: var(--fx-accent);
}

/* Figures */
.fx-page .fx-figure {
  margin: 56px 0 0;
  padding: 0;
}
.fx-page .fx-figure img {
  display: block;
  width: 100%;
  height: auto;
  border: 1px solid var(--fx-line);
  border-radius: 12px;
  background: #ffffff;
}
.fx-page .fx-figure figcaption {
  margin-top: 16px;
  font-size: 14px;
  line-height: 1.5;
  color: var(--fx-muted);
}
/* The 40rem cap is what splits the caption over two lines. */
.fx-page .fx-cap-center {
  max-width: 40rem;
  margin-right: auto;
  margin-left: auto;
  text-align: center;
}

/* Comparison band: light band, tabs above a dark board. The tabs and panes
   are Bootstrap's Tab component (data-bs-toggle="tab"); only the skin is here. */
.fx-page .fx-cmp-sec {
  padding-top: 80px;
  padding-bottom: 80px;
}
.fx-page .fx-cmp-sec h2 {
  margin: 0;
  font-size: clamp(1.85rem, 4vw, 3.25rem);
  font-weight: 600;
  line-height: 1.1;
  letter-spacing: -.025em;
  color: var(--fx-ink);
}
.fx-page .fx-tabs {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
  margin: 48px 0 0;
}
.fx-page .fx-tab {
  padding: 9px 20px;
  border: 1px solid var(--fx-line);
  border-radius: 999px;
  background: var(--fx-line);
  font-size: 14px;
  font-weight: 600;
  line-height: 1.65;
  color: var(--fx-muted);
  cursor: pointer;
  transition: background .2s ease, color .2s ease;
}
.fx-page .fx-tab.active {
  border-color: var(--fx-dark);
  background: var(--fx-dark);
  color: #ffffff;
}
.fx-page .fx-cmp-board {
  max-width: 952px;
  margin: 24px auto 0;
  padding: 32px;
  border-radius: 16px;
  background: var(--fx-dark);
}
.fx-page .fx-flow {
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: 10px;
  padding: 24px;
  overflow-x: auto;
  border: 1px solid rgba(250, 250, 250, .14);
  border-radius: 12px;
  background: rgba(250, 250, 250, .04);
}
.fx-page .fx-flow-label {
  flex: 0 0 auto;
  margin: 0;
  font-size: 13px;
  letter-spacing: .35px;
  text-transform: uppercase;
  white-space: nowrap;
  color: rgba(250, 250, 250, .5);
}
.fx-page .fx-chip,
.fx-page .fx-flow-out {
  flex: 0 0 auto;
  padding: 6px 14px;
  border: 1px solid rgba(250, 250, 250, .2);
  border-radius: 999px;
  font-size: 14px;
  white-space: nowrap;
  color: rgba(250, 250, 250, .85);
}
.fx-page .fx-flow-arrow {
  flex: 0 0 auto;
  font-size: 16px;
  color: rgba(250, 250, 250, .45);
}
.fx-page .fx-flow-out {
  border-color: rgba(225, 79, 41, .45);
  background: rgba(225, 79, 41, .16);
  color: #ffffff;
}
.fx-page .fx-cmp {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0 40px;
  margin: 32px 0 0;
  padding: 0;
  list-style: none;
}
.fx-page .fx-cmp li {
  display: flex;
  gap: 12px;
  padding: 16px 0;
  border-bottom: 1px solid rgba(250, 250, 250, .12);
  font-size: 16px;
  line-height: 1.4;
  color: rgba(250, 250, 250, .82);
}
.fx-page .fx-mark {
  flex: 0 0 auto;
  width: 20px;
  font-weight: 600;
}
.fx-page .fx-mark-no,
.fx-page .fx-panel-foot-no {
  color: #f87171;
}
.fx-page .fx-mark-yes,
.fx-page .fx-panel-foot-yes {
  color: #4ade80;
}
.fx-page .fx-panel-foot {
  margin: 28px 0 0;
  font-size: 18px;
  line-height: 1.5;
}

/* Soft band + cards */
.fx-page .fx-soft-sec {
  padding-top: 96px;
  padding-bottom: 96px;
  background: var(--fx-soft);
}
.fx-page .fx-grid-3,
.fx-page .fx-grid-4,
.fx-page .fx-grid-5 {
  display: grid;
  gap: 24px;
  margin-top: 56px;
}
.fx-page .fx-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.fx-page .fx-grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; }
.fx-page .fx-grid-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.fx-page .fx-card {
  display: flex;
  flex-direction: column;
  padding: 32px;
  border: 1px solid var(--fx-line-strong);
  border-radius: 12px;
  background: #ffffff;
}
.fx-page .fx-card h3 {
  margin: 0;
  font-size: 22px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--fx-ink);
}
/* Narrow five-across columns step headings down a size, so the longest
   (Data Enrichment) holds one line. */
.fx-page .fx-grid-5 .fx-card h3 {
  font-size: 18px;
}
.fx-page .fx-card-kicker {
  margin: 6px 0 0;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: .35px;
  text-transform: uppercase;
  color: var(--fx-accent);
}
.fx-page .fx-card-sub {
  margin: 16px 0 0;
  font-size: 16px;
  line-height: 1.45;
  color: var(--fx-muted);
}
.fx-page .fx-card-list {
  margin: 24px 0 0;
  padding: 0;
  list-style: none;
}
.fx-page .fx-card-list li {
  position: relative;
  padding: 0 0 12px 20px;
  font-size: 16px;
  line-height: 1.45;
  color: var(--fx-ink);
}
.fx-page .fx-card-list li::before {
  content: "";
  position: absolute;
  top: 9px;
  left: 0;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--fx-accent);
}
.fx-page .fx-card-meta {
  margin: auto 0 0;
  padding-top: 24px;
  border-top: 1px solid var(--fx-line);
  font-size: 14px;
  line-height: 1.8;
  color: var(--fx-muted);
}
.fx-page .fx-card-meta span {
  display: block;
}
.fx-page .fx-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  margin-bottom: 18px;
  border-radius: 12px;
  background: rgba(225, 79, 41, .1);
  font-size: 16px;
  font-weight: 700;
  color: var(--fx-accent);
}

/* Benefits row */
.fx-page .fx-benefit {
  padding: 0 32px;
  border-left: 1px solid var(--fx-line);
}
.fx-page .fx-benefit:first-child {
  padding-left: 0;
  border-left: 0;
}
.fx-page .fx-benefit-icon {
  display: block;
  width: 38px;
  height: 38px;
  margin-bottom: 20px;
  color: var(--fx-accent);
}
.fx-page .fx-benefit h3 {
  margin: 0 0 16px;
  font-size: 22px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--fx-ink);
}
.fx-page .fx-benefit p {
  margin: 0;
  font-size: 16px;
  line-height: 1.5;
  color: var(--fx-muted);
}

/* Closing CTA */
.fx-page .fx-cta-sec {
  padding-top: 56px;
  padding-bottom: 56px;
  border-top: 0;
  background: var(--fx-darker);
  text-align: center;
}
.fx-page .fx-cta-sec h2 {
  max-width: none;
  margin: 0 auto;
  font-size: clamp(1.5rem, 3vw, 2.75rem);
  font-weight: 500;
  line-height: 1.1;
  letter-spacing: -.025em;
  color: #ffffff;
}
.fx-page .fx-cta-sec p {
  max-width: 46rem;
  margin: 24px auto 0;
  font-size: 18px;
  line-height: 1.5;
  color: rgba(250, 250, 250, .6);
}
.fx-page .fx-cta-sec .fx-btn {
  margin-top: 28px;
}

/* Article with a sticky table of contents (case studies, long-form articles).
   The TOC is the .nav-sidebar the whitepaper scrollspy in app.js binds to, so
   the active link tracks the section scrolled past with no page-specific JS. */
.fx-page .fx-article-layout {
  display: grid;
  /* The article is capped, not fluid: inside the 1280px .fx-wrap a free column
     runs to 976px at 1440px wide, which is ~120 characters of 17.6px body copy.
     820px keeps the measure near 75. */
  grid-template-columns: 240px minmax(0, 820px);
  gap: 64px;
  align-items: start;
}
.fx-page .fx-toc {
  position: sticky;
  top: 92px; /* clears the 68px sticky #nav-main */
  max-height: calc(100vh - 116px);
  overflow-y: auto;
  overscroll-behavior: contain;
}
.fx-page .fx-toc-title {
  margin: 0 0 16px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .35px;
  text-transform: uppercase;
  color: var(--fx-muted);
}
.fx-page .fx-toc ul {
  margin: 0;
  padding: 0;
  list-style: none;
  border-left: 1px solid var(--fx-line);
}
.fx-page .fx-toc li + li {
  margin-top: 4px;
}
.fx-page .fx-toc a {
  display: block;
  padding: 6px 0 6px 16px;
  margin-left: -1px;
  border-left: 2px solid transparent;
  font-size: 14px;
  line-height: 1.35;
  color: var(--fx-muted);
  text-decoration: none;
}
.fx-page .fx-toc a:hover,
.fx-page .fx-toc a:focus {
  color: var(--fx-ink);
  text-decoration: none;
}
.fx-page .fx-toc a.active {
  border-left-color: var(--fx-accent);
  font-weight: 600;
  color: var(--fx-accent);
}
.fx-page .fx-article-title {
  margin: 0 0 32px;
  font-size: clamp(1.9rem, 1.35rem + 1.8vw, 2.75rem);
  font-weight: 600;
  line-height: 1.15;
  letter-spacing: -.025em;
  color: var(--fx-ink);
}
.fx-page .fx-article-lead {
  margin: -16px 0 32px;
  font-size: clamp(1.0625rem, .98rem + .32vw, 1.3rem);
  line-height: 1.5;
  color: var(--fx-muted);
}
.fx-page .fx-article > section + section {
  margin-top: 56px;
}
.fx-page .fx-article h2 {
  margin: 0 0 20px;
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -.02em;
  color: var(--fx-ink);
}
.fx-page .fx-article h3 {
  margin: 32px 0 12px;
  font-size: 20px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--fx-ink);
}
.fx-page .fx-article p {
  margin: 0 0 16px;
  color: var(--fx-muted);
}
.fx-page .fx-article p:last-child {
  margin-bottom: 0;
}
/* Highlights panel: the summary that opens the article, on the soft band. */
.fx-page .fx-highlights {
  padding: 28px 32px;
  border-radius: 16px; /* site radius scale: cards, panels and frames */
  background: var(--fx-soft);
}
.fx-page .fx-highlights h2 {
  margin: 0 0 12px;
  font-size: 18px;
}
.fx-page .fx-highlights ul {
  margin: 0;
}
/* Pull quote inside an article. */
.fx-page .fx-pullquote {
  margin: 32px 0;
  padding: 4px 0 4px 24px;
  border-left: 3px solid var(--fx-accent);
}
.fx-page .fx-pullquote blockquote {
  margin: 0;
  font-size: 19px;
  font-style: italic;
  line-height: 1.5;
  color: var(--fx-ink);
}
.fx-page .fx-pullquote figcaption {
  margin-top: 12px;
  font-size: 14px;
  font-weight: 600;
  color: var(--fx-muted);
}

/* Responsive */
@media (max-width: 1199.98px) {
  .fx-page .fx-grid-5 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
  .fx-page .fx-grid-4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    row-gap: 40px;
  }
  .fx-page .fx-benefit:nth-child(3) {
    padding-left: 0;
    border-left: 0;
  }
}
@media (max-width: 991.98px) {
  .fx-page .fx-sec {
    padding: 56px 32px;
  }
  .fx-page .fx-article-layout {
    grid-template-columns: minmax(0, 1fr);
    gap: 40px;
  }
  .fx-page .fx-toc {
    position: static;
    max-height: none;
    overflow: visible;
  }
  .fx-page .fx-hero {
    padding-top: 112px;
    padding-bottom: 80px;
  }
  .fx-page .fx-figure {
    margin-top: 32px;
  }
  .fx-page .fx-shift-grid,
  .fx-page .fx-grid-3,
  .fx-page .fx-cmp {
    grid-template-columns: minmax(0, 1fr);
  }
  .fx-page .fx-cmp {
    gap: 0;
  }
  .fx-page .fx-grid-5,
  .fx-page .fx-cap-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .fx-page .fx-cmp-board {
    padding: 24px;
  }
  .fx-page .fx-cap-card:last-child:nth-child(3n+1) {
    grid-column: auto;
  }
  .fx-page .fx-cap-card:last-child:nth-child(2n+1) {
    grid-column: 1 / -1;
    width: calc(50% - 12px);
    margin: 0 auto;
  }
}
@media (max-width: 767.98px) {
  .fx-page .fx-sec {
    padding: 48px 16px;
  }
  .fx-page .fx-hero {
    padding-top: 96px;
    padding-bottom: 64px;
  }
  .fx-page .fx-grid-5,
  .fx-page .fx-cap-grid,
  .fx-page .fx-grid-4 {
    grid-template-columns: minmax(0, 1fr);
  }
  .fx-page .fx-cap-card:last-child:nth-child(2n+1) {
    width: auto;
  }
  .fx-page .fx-benefit {
    padding-left: 0;
    border-left: 0;
  }
  .fx-page .fx-cta-sec {
    padding-top: 72px;
    padding-bottom: 72px;
  }
}

/* Icons: see dist/src/css/icons.css (compiled into site-pages.css, which every
   page with converted icons loads, including pages without site.css). */

/* Carousel ([data-fx-carousel]) -------------------------------------------- */
/* Native scroll-snap carousel, driven by app.js. The container's first child
   is the track, the track's children are the slides. Configure per page with
   --fx-carousel-per-view and --fx-carousel-gap (breakpoints in page CSS).
   app.js sets --fx-bleed-l / --fx-bleed-r when the container also has
   .overflow-visible, so slides run out to the viewport edges. */
[data-fx-carousel] {
  --fx-carousel-per-view: 1;
  --fx-carousel-gap: 16px;
  --fx-bleed-l: 0px;
  --fx-bleed-r: 0px;
}
/* width:auto, not 100%: with the bleed margins and padding it resolves to the
   container width under either box-sizing model. */
[data-fx-carousel] > :first-child {
  display: flex;
  align-items: flex-start;
  width: auto;
  gap: var(--fx-carousel-gap);
  margin: 0 calc(-1 * var(--fx-bleed-r)) 0 calc(-1 * var(--fx-bleed-l));
  padding: 0 var(--fx-bleed-r) 0 var(--fx-bleed-l);
  overflow-x: auto;
  overflow-y: hidden;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scroll-padding: 0 var(--fx-bleed-r) 0 var(--fx-bleed-l);
  scrollbar-width: none;
  transform: none;
  transition: height .3s ease;
}
[data-fx-carousel] > :first-child::-webkit-scrollbar {
  display: none;
}
[data-fx-carousel] > :first-child > * {
  flex: 0 0 calc((100% - (var(--fx-carousel-per-view) - 1) * var(--fx-carousel-gap)) / var(--fx-carousel-per-view));
  min-width: 0;
  margin-right: 0;
  scroll-snap-align: start;
}
@media (prefers-reduced-motion: no-preference) {
  [data-fx-carousel] > :first-child {
    scroll-behavior: smooth;
  }
}

/* Legacy zoom-img lightbox (#modal + img.modal-target, bound in app.js) -------
   Pages converted from the legacy site carry Bootstrap's own .modal and
   .modal-content rules in their page stylesheet, which loads after this file
   and used to win: the image picked up .modal-content's width:100%, border and
   panel background and filled the viewport. Id selectors settle it regardless
   of order. app.js opens the dialog with display:flex, so the image and its
   caption centre on both axes. */
#modal.modal {
  z-index: 1090;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background: rgba(8, 11, 22, .82);
  overflow: auto;
}
#modal .modal-content {
  /* Bootstrap's .modal-content is display:flex; on this <img> that collapses
     the replaced content to 0x0. */
  display: block;
  width: auto;
  max-width: min(900px, 92vw);
  max-height: 78vh;
  height: auto;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 16px;
  background: #fff;
  box-shadow: 0 24px 60px rgba(0, 0, 0, .35);
  object-fit: contain;
}
#modal .modal-caption {
  max-width: min(900px, 92vw);
  margin: 16px 0 0;
  text-align: center;
  font-size: .95rem;
  line-height: 1.5;
  color: #fff;
}
#modal .modal-close {
  position: fixed;
  top: 14px;
  right: 22px;
  font-size: 34px;
  line-height: 1;
  color: #fff;
}

/* Video modal ([data-glightbox] links, opened by app.js) --------------------- */
.fx-video-modal .modal-content {
  border: 0;
  border-radius: 16px;              /* the site-wide box radius (perf.py RADIUS) */
  background: #000;
}
/* The corners are clipped on the ratio wrapper, not on .modal-content: the close
   button is positioned above the dialog (top: -2.5rem), and clipping the content
   would cut it off. */
.fx-video-modal .ratio {
  overflow: hidden;
  border-radius: 16px;
}
/* A browser gives every iframe a 1.6px inset border of its own - that is the pale
   frame that shows around an embedded video. It is never wanted in a popup. */
.fx-video-modal iframe,
.fx-media-modal iframe {
  border: 0;
}
.fx-video-modal .btn-close {
  position: absolute;
  top: -2.5rem;
  right: 0;
  opacity: .85;
}
/* Frosted backdrop behind the video. The opacity comes down from .92 so the
   blurred page is actually visible through it - at .92 the black covers
   everything and the blur would be wasted. */
body.fx-video-open .modal-backdrop.show {
  opacity: .72;
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

/* Legacy .avatar-* are fixed width+height circles, but carry no flex-shrink.
   Next to wrapping text in a flex row they squash into ellipses of differing
   widths (17 of 18 on /aiops-solution/ at 390px). They must never shrink. */
.fx-page .avatar-30,
.fx-page .avatar-60,
.fx-page .avatar-80,
.fx-page .avatar-90,
.fx-page .avatar-100,
.fx-page .avatar-120,
.fx-page .avatar-220 {
  flex-shrink: 0;
}

/* Fixed-size diagrams scaled to fit their column (app.js scaleCanvas).
   The element carries --fxc-w / --fxc-h, its design size in px. The wrapper
   reserves the right height on its own via aspect-ratio; app.js only keeps
   --fxc-s in step with the wrapper's width. */
.fx-page [data-fx-scale-canvas] {
  --fxc-s: 1;
  position: relative;
  width: 100%;
  aspect-ratio: var(--fxc-w) / var(--fxc-h);
  overflow: hidden;
}
.fx-page [data-fx-scale-canvas] > * {
  position: absolute;
  top: 0;
  left: 0;
  width: calc(var(--fxc-w) * 1px);
  height: calc(var(--fxc-h) * 1px);
  transform: scale(var(--fxc-s));
  transform-origin: top left;
}

/* 6. Page skins ============================================================ */
/* Background photos only. url() here resolves from dist/css/. */
.page-governed-vibeops .fx-hero {
  --fx-hero-bg: url("../../images/background/governed-vibeops-bgr.jpg");
}

/* Lightbox for images and inline content (app.js videoModal) */
.fx-media-modal .modal-dialog { width: auto; max-width: min(1200px, 94vw); }
.fx-media-modal .modal-content {
  position: relative;
  overflow: visible;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
}
.fx-media-modal .btn-close {
  position: fixed;
  top: 18px;
  right: 18px;
  z-index: 2;
  padding: 10px;
  border-radius: 999px;
  background-color: rgba(255, 255, 255, .92);
  opacity: 1;
}
/* Fit the image to the viewport instead of forcing it to the dialog's width:
   tall screenshots were overflowing the top and bottom of the screen. Matches
   the agentops zoom overlay, which already sized this way. */
.fx-media-modal__body img,
.fx-media-modal__body svg {
  display: block;
  max-width: 100%;
  max-height: 88vh;
  width: auto;
  height: auto;
  margin-inline: auto;
  object-fit: contain;
  border-radius: 14px;
}

/* Inline content (a cloned diagram): a white card with breathing room around it,
   instead of the content running to the edge of the popup. */
.fx-media-modal__inline {
  --fx-pad: clamp(20px, 4vw, 56px);
  /* --fx-ar (width / height of the drawing) is set by app.js */
  max-width: calc((88vh - 2 * var(--fx-pad)) * var(--fx-ar, 100) + 2 * var(--fx-pad));
  margin-inline: auto;
  padding: var(--fx-pad);
  border-radius: 18px;
  background: #fff;
}
.fx-media-modal__inline svg {
  width: 100%;
  max-height: none;
  border-radius: 0;
}

/* 7. Runtime states ======================================================== */
/* Only an older payload shell's <main> is empty until support.js fills it.
   Reserve height so the footer does not flash up under the nav. */
.fx-page[aria-busy="true"] {
  min-height: 100vh;
}

/* In-page navigation crossfade (document.startViewTransition). The nav gets
   its own name so it stays put while the content fades beneath it. */
#nav-main {
  view-transition-name: fx-nav;
}
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: .18s;
}
