/* ============================================
   CHEMINSIGHT DESIGN SYSTEM - CSS
   ============================================ */

/* ROOT CSS VARIABLES */
:root {
    /* Color Palette */
    --primary: #071A2E;
    --primary-light: #0A2742;
    --secondary: #0E76FD;
    --secondary-light: #3B91FE;
    --accent: #00C8A3;
    --accent-light: #33D9B3;
    
    --white: #FFFFFF;
    --light-grey: #F7F8FA;
    --light-grey-2: #F1F5F9;
    --medium-grey: #64748B;
    --dark-grey: #1E293B;
    --border-color: #E2E8F0;
    
    /* Typography */
    --font-display: 'Space Grotesk', sans-serif;
    --font-body: 'Inter', sans-serif;
    
    /* Spacing Scale (8px base) */
    --spacing-xs: 8px;
    --spacing-sm: 16px;
    --spacing-md: 24px;
    --spacing-lg: 32px;
    --spacing-xl: 48px;
    --spacing-2xl: 56px;
    --spacing-3xl: 64px;
    --spacing-4xl: 80px;
    
    /* Border Radius */
    --radius-sm: 4px;
    --radius-md: 8px;
    --radius-lg: 12px;
    --radius-xl: 16px;
    
    /* Shadows */
    --shadow-sm: 0 2px 4px rgba(7, 26, 46, 0.08);
    --shadow-md: 0 4px 8px rgba(7, 26, 46, 0.12);
    --shadow-lg: 0 8px 16px rgba(7, 26, 46, 0.15);
    --shadow-xl: 0 16px 32px rgba(7, 26, 46, 0.20);
    --shadow-hover: 0 8px 24px rgba(14, 118, 253, 0.2);
    
    /* Animation Timings */
    --transition-fast: 200ms ease-out;
    --transition-normal: 300ms ease-out;
    --transition-slow: 500ms ease-out;
    
    /* Z-Index Scale */
    --z-dropdown: 1000;
    --z-fixed: 1020;
    --z-modal: 1050;
    
    /* Container Width */
    --container-width: 1280px;
    --container-padding: 40px;
}

/* ============================================
   RESET & BASE STYLES
   ============================================ */

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

html {
    scroll-behavior: smooth;
}

body {
    font-family: var(--font-body);
    font-size: 16px;
    line-height: 1.6;
    color: var(--dark-grey);
    background-color: var(--white);
    overflow-x: hidden;
}

/* ============================================
   TYPOGRAPHY
   ============================================ */

h1, h2, h3, h4, h5, h6 {
    font-family: var(--font-display);
    font-weight: 600;
    line-height: 1.2;
    margin-bottom: var(--spacing-md);
    color: var(--primary);
}

h1 {
    font-size: 48px;
    font-weight: 700;
    letter-spacing: -0.5px;
}

h2 {
    font-size: 36px;
    font-weight: 700;
    letter-spacing: -0.3px;
}

h3 {
    font-size: 28px;
    font-weight: 600;
    letter-spacing: -0.1px;
}

h4 {
    font-size: 24px;
    font-weight: 600;
    letter-spacing: 0;
}

h5 {
    font-size: 20px;
    font-weight: 600;
    letter-spacing: 0;
}

h6 {
    font-size: 16px;
    font-weight: 600;
    letter-spacing: 0.3px;
}

p {
    margin-bottom: var(--spacing-md);
    line-height: 1.6;
}

a {
    color: var(--secondary);
    text-decoration: none;
    transition: color var(--transition-fast);
}

a:hover {
    color: var(--secondary-light);
}

/* ============================================
   LAYOUT & GRID
   ============================================ */

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

/* ============================================
   NAVIGATION BAR
   ============================================ */

.navbar {
    position: sticky;
    top: 0;
    z-index: var(--z-fixed);
    background: rgba(255, 255, 255, 0.95);
    backdrop-filter: blur(10px);
    border-bottom: 1px solid var(--border-color);
    /* Reduced from --spacing-md so the larger 50px logo keeps the
       navbar at a balanced height (~82px) rather than ballooning */
    padding: var(--spacing-sm) 0;
}

.navbar-container {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: 0 var(--container-padding);
    display: grid;
    /* Logo sizes to content, the middle track absorbs the slack, the
       hamburger sizes to content. This keeps a real gap between the logo
       and the menu and lands the CTA on the same content edge as the
       hero/footer grid (previously 1fr auto 1fr, which pinned the menu
       hard against the logo and left 50px dead space on the right). */
    grid-template-columns: auto 1fr auto;
    align-items: center;
    /* stacking/positioning context for the navbar row (the dropdown panels
       now anchor to their own <li> so they centre under their trigger) */
    position: relative;
}

.navbar-logo {
    grid-column: 1;
    justify-self: start;
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    font-family: var(--font-display);
    font-size: 18px;
    font-weight: 700;
    color: var(--primary);
    cursor: pointer;
}

.navbar-menu {
    grid-column: 2;
    justify-self: end;
    display: flex;
    list-style: none;
    /* 32px, not --spacing-xl (48px). The container caps at 1280px, so its
       content box never exceeds 1240px — but logo + menu at a 48px gap needs
       ~1336px. The row therefore overflowed at every viewport above 1280px,
       hanging the Contact button past the right edge; the first step-down
       below only kicked in at 1280px and under, where it was already moot. */
    gap: 30px;
    align-items: center;
    /* guaranteed breathing room after the logo (it used to be 0) */
    margin-left: var(--spacing-md);
}

/* Nav labels must never wrap mid-item — "Modular Skids" and "Contact Now"
   were breaking onto two lines whenever the row got tight. */
.navbar-menu > li {
    flex: 0 0 auto;
}

.navbar-menu a {
    font-size: 15.5px;
    font-weight: 500;
    color: var(--dark-grey);
    white-space: nowrap;
    transition: color var(--transition-fast);
}

.navbar-menu a:hover {
    color: var(--secondary);
}

.navbar-menu a.active-nav:not(.navbar-cta) {
    color: var(--secondary);
}

.navbar-menu a.active-nav:not(.navbar-cta)::after {
    content: "";
    display: block;
    height: 2px;
    background: var(--secondary);
    border-radius: 2px;
    margin-top: 4px;
}

/* Header CTA — icon only. The label stays in the DOM as .sr-only so the link
   keeps an accessible name, and title= gives a hover tooltip for sighted
   users, since a bare handset icon is less explicit than the old text. */
.navbar-cta {
    position: relative;
    /* Above the dropdown panels' hover bridge — the CTA is taller than the
       menu labels, so its lower edge would otherwise sit under the bridge of
       an open Industries panel and stop taking clicks. */
    z-index: calc(var(--z-dropdown) + 1);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    padding: 0;
    border-radius: 50%;
    background: var(--primary);
    color: var(--white) !important;
    transition: background var(--transition-fast), transform var(--transition-fast),
                box-shadow var(--transition-fast);
}
.navbar-cta svg {
    position: relative;
    z-index: 1;
    width: 19px;
    height: 19px;
}

/* Slow expanding ring, like a call cue. It lives on a pseudo-element behind
   the icon and animates only transform/opacity, so it never affects layout. */
.navbar-cta::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 2px solid var(--primary);
    opacity: 0;
    animation: ctaPulse 2.6s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
    pointer-events: none;
}
@keyframes ctaPulse {
    0%   { transform: scale(1);    opacity: 0.5; }
    70%  { transform: scale(1.65); opacity: 0; }
    100% { transform: scale(1.65); opacity: 0; }
}

.navbar-cta:hover {
    background: var(--primary-light);
    transform: translateY(-2px);
    box-shadow: var(--shadow-hover);
}
/* Handset gives a short shake on hover. */
.navbar-cta:hover svg { animation: ctaRing 0.6s ease-in-out; }
@keyframes ctaRing {
    0%, 100% { transform: rotate(0); }
    20% { transform: rotate(-14deg); }
    40% { transform: rotate(12deg); }
    60% { transform: rotate(-8deg); }
    80% { transform: rotate(5deg); }
}

@media (prefers-reduced-motion: reduce) {
    .navbar-cta::after,
    .navbar-cta:hover svg { animation: none !important; }
    .navbar-cta:hover { transform: none; }
}

.hamburger {
    grid-column: 3;
    justify-self: end;
    display: none;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    gap: 6px;
    background: none;
    border: none;
    cursor: pointer;
    /* 24x18 bars were below the 24x24 minimum touch target. Padding grows
       the hit area to 44x38; the negative margin keeps the bars optically
       aligned with the container edge, so nothing moves visually. */
    padding: 10px;
    margin-right: -10px;
}

.hamburger span {
    width: 24px;
    height: 2px;
    background: var(--primary);
    transition: all var(--transition-fast);
}

/* ============================================
   BUTTONS
   ============================================ */

.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--spacing-xs);
    padding: 12px 24px;
    border: 2px solid transparent;
    border-radius: var(--radius-lg);
    font-family: var(--font-body);
    font-size: 16px;
    font-weight: 600;
    cursor: pointer;
    transition: all var(--transition-fast);
    white-space: nowrap;
    text-decoration: none;
}

.btn-primary {
    background: var(--primary);
    color: var(--white);
}

.btn-primary:hover {
    background: var(--primary-light);
    box-shadow: var(--shadow-hover);
    transform: translateY(-2px);
}

.btn-secondary {
    background: transparent;
    color: var(--secondary);
    border-color: var(--secondary);
}

.btn-secondary:hover {
    background: var(--secondary);
    color: var(--white);
    box-shadow: var(--shadow-hover);
    transform: translateY(-2px);
}

.btn-lg {
    padding: 16px 32px;
    font-size: 18px;
}

.btn-sm {
    padding: 8px 16px;
    font-size: 14px;
}

/* ============================================
   HERO SECTION
   ============================================ */

/* ============================================
   HOME — full-screen cinematic video hero
   ============================================ */

.hero.hero--video {
    position: relative;
    /* Honour a shorter hero, but keep a px floor so the floating cards always
       have room to sit in separate vertical bands (no overlap on short viewports) */
    min-height: max(70vh, 700px);
    display: flex;
    align-items: center;
    padding: var(--spacing-3xl) 0;
    overflow: hidden;
    isolation: isolate;
    background: var(--primary); /* dark fallback — no flash, no CLS */
}

/* Full-bleed background video */
.hero-bg-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: 0;
    filter: brightness(0.78) saturate(1.05);
    transform: translateZ(0);
    will-change: transform, opacity;
    animation:
        heroReveal 1.2s ease-out both,
        heroZoom 26s ease-in-out 1.2s infinite alternate;
}

/* Layered premium atmosphere: readability gradient + blue glow + teal mesh + vignette */
.hero-overlay {
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    background:
        radial-gradient(circle at 78% 28%, rgba(14, 118, 253, 0.30) 0%, rgba(14, 118, 253, 0) 55%),
        radial-gradient(circle at 12% 82%, rgba(0, 200, 163, 0.14) 0%, rgba(0, 200, 163, 0) 50%),
        radial-gradient(ellipse at 50% 50%, rgba(3, 12, 22, 0) 52%, rgba(3, 12, 22, 0.55) 100%),
        linear-gradient(180deg, rgba(7, 26, 46, 0.20) 0%, rgba(7, 26, 46, 0) 30%, rgba(3, 12, 22, 0.62) 100%),
        linear-gradient(90deg, rgba(7, 26, 46, 0.92) 0%, rgba(7, 26, 46, 0.72) 32%, rgba(7, 26, 46, 0.35) 62%, rgba(7, 26, 46, 0.52) 100%);
}

.hero.hero--video .hero-container {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: 0 var(--container-padding);
    width: 100%;
    position: relative;
    z-index: 2;
}

.hero-content {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-lg);
    min-width: 0;
}

/* Badge pill above the heading */
.hero-badge-pill {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    align-self: flex-start;
    padding: 7px 16px;
    background: rgba(255, 255, 255, 0.7);
    border: 1px solid var(--border-color);
    border-radius: 999px;
    font-family: var(--font-body);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.6px;
    text-transform: uppercase;
    color: var(--medium-grey);
    box-shadow: var(--shadow-sm);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    animation: fadeInUp 0.6s ease-out both;
}

.hero-badge-pill .dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--secondary);
    box-shadow: 0 0 0 4px rgba(14, 118, 253, 0.15);
}

.hero-title {
    font-size: 64px;
    line-height: 1.12;
    color: var(--primary);
    margin: 0;
    animation: fadeInUp 0.7s ease-out 0.05s both;
}

.hero-subtitle {
    font-size: 18px;
    line-height: 1.7;
    color: var(--medium-grey);
    margin: 0;
    max-width: 90%;
    animation: fadeInUp 0.7s ease-out 0.15s both;
}

.hero-ctas {
    display: flex;
    gap: var(--spacing-md);
    flex-wrap: wrap;
    animation: fadeInUp 0.7s ease-out 0.3s both;
}

/* ---- Full-screen video hero: content over dark video ---- */
.hero--video .hero-content {
    max-width: 760px;
    gap: var(--spacing-md);
}

.hero--video .hero-badge-pill {
    background: rgba(255, 255, 255, 0.12);
    border-color: rgba(255, 255, 255, 0.28);
    color: #fff;
    box-shadow: 0 4px 18px rgba(0, 0, 0, 0.25);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    animation: fadeInUp 0.6s ease-out 0.05s both;
}

.hero--video .hero-badge-pill .dot {
    box-shadow: 0 0 0 4px rgba(14, 118, 253, 0.30);
}

.hero--video .hero-title {
    color: #fff;
    font-size: clamp(40px, 5vw, 66px);
    line-height: 1.1;
    letter-spacing: -0.5px;
    text-shadow: 0 2px 30px rgba(0, 0, 0, 0.35);
    animation: fadeInUp 0.8s ease-out 0.15s both;
}

.hero--video .hero-subtitle {
    color: rgba(255, 255, 255, 0.82);
    max-width: 560px;
    text-shadow: 0 1px 16px rgba(0, 0, 0, 0.35);
    animation: fadeInUp 0.8s ease-out 0.28s both;
}

.hero--video .hero-ctas {
    animation: fadeInUp 0.8s ease-out 0.42s both;
    margin-top: var(--spacing-xs);
}

/* Premium buttons over the video: glow + lift */
.hero--video .btn-primary {
    position: relative;
    z-index: 1;
    color: #fff;
    background: var(--secondary);
    border-color: var(--secondary);
    box-shadow: 0 10px 30px rgba(14, 118, 253, 0.45);
}

.hero--video .btn-primary:hover {
    color: #fff;
    background: var(--secondary-light);
    border-color: var(--secondary-light);
    box-shadow: 0 14px 40px rgba(14, 118, 253, 0.6);
    transform: translateY(-3px);
}

.hero--video .btn-secondary {
    position: relative;
    z-index: 1;
    color: #fff;
    border-color: rgba(255, 255, 255, 0.6);
    background: rgba(255, 255, 255, 0.08);
}

.hero--video .btn-secondary:hover {
    background: #fff;
    color: var(--primary);
    border-color: #fff;
    box-shadow: 0 12px 34px rgba(0, 0, 0, 0.3);
    transform: translateY(-3px);
}

/* ---- Floating glassmorphism KPI cards ---- */
.hero-kpis {
    position: absolute;
    inset: 0;
    z-index: 2;
    pointer-events: none;
}

.hero--video .glass-card {
    position: absolute;
    pointer-events: auto;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 18px;
    min-width: 118px;
    background: rgba(255, 255, 255, 0.10);
    -webkit-backdrop-filter: blur(16px) saturate(140%);
    backdrop-filter: blur(16px) saturate(140%);
    border: 1px solid rgba(255, 255, 255, 0.22);
    border-radius: var(--radius-lg);
    box-shadow: 0 14px 40px rgba(0, 0, 0, 0.30);
    color: #fff;
    transition: transform var(--transition-normal), background var(--transition-normal), box-shadow var(--transition-normal);
    will-change: transform;
    animation: fadeInUp 0.7s ease-out both, cardFloat 6s ease-in-out infinite;
}

.hero--video .glass-card:hover {
    transform: translateY(-5px) scale(1.03);
    background: rgba(255, 255, 255, 0.18);
    box-shadow: 0 20px 50px rgba(0, 0, 0, 0.38);
}

/* KPI-flavoured glass cards reuse .kpi-card/.kpi-value/.kpi-label — recolor for dark */
.hero--video .gc-kpi {
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
    padding: 13px 18px;
    text-align: left;
    background: rgba(255, 255, 255, 0.10);
    border: 1px solid rgba(255, 255, 255, 0.22);
    box-shadow: 0 14px 40px rgba(0, 0, 0, 0.30);
}

.hero--video .gc-kpi .kpi-value {
    color: #fff;
    font-size: 28px;
    margin-bottom: 0;
}

.hero--video .gc-kpi .kpi-value span:last-child {
    color: var(--secondary-light);
}

.hero--video .gc-kpi .kpi-label {
    color: rgba(255, 255, 255, 0.80);
    font-size: 13px;
}

.hero--video .gc-text strong {
    display: block;
    font-family: var(--font-display);
    font-size: 18px;
    font-weight: 700;
    line-height: 1.1;
    color: #fff;
}

.hero--video .gc-text span {
    font-size: 12px;
    color: rgba(255, 255, 255, 0.78);
}

.hero--video .gc-e {
    font-family: var(--font-display);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.3px;
    white-space: nowrap;
}

.hero--video .gc-e span {
    color: rgba(255, 255, 255, 0.45);
    margin: 0 4px;
}

.hero--video .gc-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    flex-shrink: 0;
    border-radius: var(--radius-md);
    background: linear-gradient(135deg, rgba(14, 118, 253, 0.6), rgba(0, 200, 163, 0.6));
    color: #fff;
}

/* Card placement — all top-based so the vertical bands stay evenly spaced at any
   hero height. Each card owns its own band (no overlap) on the right half, never
   crossing the left content. Horizontal stagger keeps it scattered, not a column. */
.hero--video .gc-a { top: 8%; right: 7%; animation-delay: 0.55s, 0s; }
.hero--video .gc-d { top: 27%; right: 4%; flex-direction: row; animation-delay: 1s, 3s; }
.hero--video .gc-b { top: 45%; right: 20%; animation-delay: 0.7s, 1.1s; }
.hero--video .gc-c { top: 63%; right: 6%; animation-delay: 0.85s, 2.2s; }
.hero--video .gc-e { top: 82%; right: 12%; animation-delay: 1.15s, 1.7s; }

/* ---- Scroll indicator ---- */
.hero-scroll {
    position: absolute;
    left: 50%;
    bottom: 26px;
    transform: translateX(-50%);
    z-index: 3;
    display: flex;
    align-items: center;
    justify-content: center;
    text-decoration: none;
    animation: fadeInUp 1s ease-out 0.9s both, heroBob 2.4s ease-in-out 1.9s infinite;
}

.hero-scroll-mouse {
    display: block;
    width: 26px;
    height: 42px;
    border: 2px solid rgba(255, 255, 255, 0.6);
    border-radius: 14px;
    position: relative;
}

.hero-scroll-wheel {
    position: absolute;
    left: 50%;
    top: 8px;
    width: 4px;
    height: 8px;
    margin-left: -2px;
    border-radius: 2px;
    background: #fff;
    animation: heroScroll 1.8s ease-in-out infinite;
}

.hero-scroll:hover .hero-scroll-mouse {
    border-color: #fff;
}

@keyframes heroScroll {
    0% { transform: translateY(0); opacity: 1; }
    70% { opacity: 1; }
    100% { transform: translateY(12px); opacity: 0; }
}

@keyframes heroBob {
    0%, 100% { transform: translateX(-50%) translateY(0); }
    50% { transform: translateX(-50%) translateY(6px); }
}

/* KPI Cards */
.kpi-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--spacing-md);
    margin-top: var(--spacing-lg);
}

.kpi-card {
    background: var(--white);
    padding: var(--spacing-lg);
    border-radius: var(--radius-lg);
    border: 1px solid var(--border-color);
    box-shadow: var(--shadow-sm);
    text-align: center;
    animation: fadeInUp 0.6s ease-out 0.2s both;
}

.kpi-value {
    font-family: var(--font-display);
    font-size: 36px;
    font-weight: 700;
    color: var(--secondary);
    margin-bottom: var(--spacing-xs);
}

.kpi-value span:last-child {
    font-size: 24px;
    margin-left: 4px;
}

.kpi-label {
    font-size: 14px;
    font-weight: 500;
    color: var(--medium-grey);
}

/* Hero Visual */
.hero-visual {
    position: relative;
    height: 500px;
}

.process-diagram {
    width: 100%;
    height: 100%;
    filter: drop-shadow(0 16px 32px rgba(14, 118, 253, 0.15));
}

.vessel {
    animation: float 3s ease-in-out infinite;
}

.flow-line {
    opacity: 0.8;
}

.particle {
    animation: flowDown 2s ease-in infinite;
}

.particle-1 { animation-delay: 0s; }
.particle-2 { animation-delay: 0.5s; }
.particle-3 { animation-delay: 1s; }
.particle-4 { animation-delay: 1.5s; }

@keyframes float {
    0%, 100% { transform: translateY(0px); }
    50% { transform: translateY(-12px); }
}

@keyframes flowDown {
    0% { 
        opacity: 0;
        transform: translateY(-20px);
    }
    10% { 
        opacity: 1;
    }
    90% { 
        opacity: 1;
    }
    100% { 
        opacity: 0;
        transform: translateY(120px);
    }
}

.visual-labels {
    position: absolute;
    top: 50%;
    left: -80px;
    transform: translateY(-50%);
    display: flex;
    flex-direction: column;
    gap: var(--spacing-lg);
}

.label {
    font-size: 12px;
    font-weight: 600;
    color: var(--secondary);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    opacity: 0;
    animation: fadeInLeft 0.6s ease-out forwards;
}

.label-1 { animation-delay: 0.3s; }
.label-2 { animation-delay: 0.5s; }
.label-3 { animation-delay: 0.7s; }

@keyframes fadeInLeft {
    from {
        opacity: 0;
        transform: translateX(-20px);
    }
    to {
        opacity: 1;
        transform: translateX(0);
    }
}

@keyframes fadeInUp {
    from {
        opacity: 0;
        transform: translateY(20px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* Hero video — cinematic reveal + very subtle infinite zoom */
@keyframes heroReveal {
    from { opacity: 0; transform: scale(1.04); }
    to   { opacity: 1; transform: scale(1); }
}

@keyframes heroZoom {
    from { transform: scale(1); }
    to   { transform: scale(1.06); }
}

/* Floating glassmorphism cards */
@keyframes cardFloat {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-10px); }
}

/* ============================================
   TRUSTED BY SECTION
   ============================================ */

.trusted-by {
    padding: var(--spacing-3xl) 0;
    background: var(--light-grey);
    border-top: 1px solid var(--border-color);
    border-bottom: 1px solid var(--border-color);
}

.trusted-by h2 {
    text-align: center;
    margin-bottom: var(--spacing-2xl);
}

.logo-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
    gap: var(--spacing-xl);
    align-items: center;
}

.logo-item {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--spacing-lg);
    background: var(--white);
    border-radius: var(--radius-lg);
    border: 1px solid var(--border-color);
    transition: all var(--transition-fast);
}

.logo-item:hover {
    box-shadow: var(--shadow-md);
    transform: translateY(-4px);
}

/* ============================================
   SERVICES SECTION
   ============================================ */

.services {
    padding: var(--spacing-2xl) 0 var(--spacing-3xl);
    background: linear-gradient(180deg, #E9F1FD 0%, #F7FBFF 70%);
    position: relative;
    overflow: hidden;
}
.services::before {
    content: "";
    position: absolute;
    top: -140px;
    right: -140px;
    width: 460px;
    height: 460px;
    background: radial-gradient(circle, rgba(0, 200, 163, 0.10), transparent 70%);
    pointer-events: none;
}
.services::after {
    content: "";
    position: absolute;
    bottom: -160px;
    left: -160px;
    width: 460px;
    height: 460px;
    background: radial-gradient(circle, rgba(14, 118, 253, 0.08), transparent 70%);
    pointer-events: none;
}
.services .container {
    position: relative;
    z-index: 1;
}

.section-header {
    text-align: center;
    margin-bottom: var(--spacing-lg);
    max-width: 600px;
    margin-left: auto;
    margin-right: auto;
}

/* Creative asymmetric section header: title left, supporting copy + link right */
.section-head-row {
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    gap: var(--spacing-2xl);
    margin-bottom: var(--spacing-xl);
    flex-wrap: wrap;
}

.section-head-row .shr-title {
    flex: 1 1 340px;
}

.section-head-row .shr-title h2 {
    margin-bottom: 0;
}
.section-head-row .shr-title p {
    margin: 14px 0 0;
    color: var(--medium-grey);
    font-size: 16px;
    line-height: 1.65;
    max-width: 560px;
}

.section-head-row .shr-aside {
    flex: 1 1 300px;
    max-width: 460px;
    display: flex;
    flex-direction: column;
    /* Hangs off the right end of the header row, opposite the title, rather
       than starting wherever the title's column happens to end. Text inside
       stays left-aligned - only the block is pushed over. */
    margin-left: auto;
    align-items: flex-end;
    gap: var(--spacing-md);
}

.section-head-row .shr-aside p {
    margin: 0;
    color: var(--medium-grey);
    font-size: 16px;
    line-height: 1.6;
}

@media (max-width: 768px) {
    .section-head-row {
        align-items: flex-start;
        gap: var(--spacing-md);
        margin-bottom: var(--spacing-lg);
    }
}

.section-header h2 {
    margin-bottom: var(--spacing-md);
}

.section-header p {
    font-size: 18px;
    color: var(--medium-grey);
    margin: 0;
}

.services-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: var(--spacing-xl);
}

.service-card {
    background: var(--white);
    padding: var(--spacing-xl);
    border-radius: var(--radius-xl);
    border: 1px solid var(--border-color);
    box-shadow: var(--shadow-sm);
    transition: all var(--transition-normal);
    display: flex;
    flex-direction: column;
    gap: var(--spacing-md);
}

.service-card:hover {
    box-shadow: var(--shadow-xl);
    transform: translateY(-8px);
    border-color: var(--secondary);
}

.card-icon {
    width: 60px;
    height: 60px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, rgba(14, 118, 253, 0.1), rgba(0, 200, 163, 0.1));
    border-radius: var(--radius-lg);
    color: var(--secondary);
    transition: all var(--transition-fast);
}

.service-card:hover .card-icon {
    transform: rotate(8px);
    background: linear-gradient(135deg, rgba(14, 118, 253, 0.2), rgba(0, 200, 163, 0.2));
}

.card-icon svg {
    width: 32px;
    height: 32px;
}

.service-card h3 {
    margin-bottom: var(--spacing-sm);
    font-size: 20px;
}

.service-card p {
    font-size: 14px;
    color: var(--medium-grey);
    line-height: 1.6;
    margin-bottom: 0;
}

.card-link {
    font-weight: 600;
    font-size: 14px;
    color: var(--secondary);
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-top: auto;
}

.card-link:hover {
    color: var(--secondary-light);
}

/* ============================================
   WHY US SECTION
   ============================================ */

.why-us {
    padding: var(--spacing-3xl) 0;
    background: linear-gradient(135deg, #E9F1FB 0%, #EAF8F3 100%);
}

.why-us-content {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--spacing-4xl);
    align-items: center;
}

.why-us-text h2 {
    margin-bottom: var(--spacing-md);
}

.why-us-text > p {
    font-size: 18px;
    color: var(--medium-grey);
    margin-bottom: var(--spacing-xl);
}

.benefits-list {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: var(--spacing-lg);
}

.benefits-list li {
    display: flex;
    gap: var(--spacing-md);
    align-items: flex-start;
}

.benefit-icon {
    width: 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--accent);
    color: var(--white);
    border-radius: 50%;
    font-size: 20px;
    flex-shrink: 0;
    font-weight: 700;
}

.benefits-list h4 {
    margin-bottom: var(--spacing-xs);
    font-size: 18px;
}

.benefits-list p {
    font-size: 14px;
    color: var(--medium-grey);
    margin: 0;
}

.why-us-stats {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--spacing-lg);
}

.stat-box {
    background: var(--white);
    padding: var(--spacing-xl);
    border-radius: var(--radius-xl);
    border: 1px solid var(--border-color);
    text-align: center;
    transition: all var(--transition-fast);
}

.stat-box:hover {
    box-shadow: var(--shadow-lg);
    border-color: var(--secondary);
}

.stat-number {
    font-family: var(--font-display);
    font-size: 44px;
    font-weight: 700;
    color: var(--secondary);
    margin-bottom: var(--spacing-sm);
}

.stat-label {
    font-size: 14px;
    font-weight: 500;
    color: var(--medium-grey);
}

/* ============================================
   PROCESS SECTION
   ============================================ */

.process {
    padding: var(--spacing-3xl) 0;
}

.timeline {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-2xl);
    position: relative;
    padding-left: 60px;
}

.timeline-item {
    position: relative;
    display: flex;
    gap: var(--spacing-lg);
    animation: fadeInUp 0.6s ease-out forwards;
    opacity: 0;
}

.timeline-item:nth-child(1) { animation-delay: 0.1s; }
.timeline-item:nth-child(3) { animation-delay: 0.2s; }
.timeline-item:nth-child(5) { animation-delay: 0.3s; }
.timeline-item:nth-child(7) { animation-delay: 0.4s; }
.timeline-item:nth-child(9) { animation-delay: 0.5s; }
.timeline-item:nth-child(11) { animation-delay: 0.6s; }

.timeline-dot {
    width: 40px;
    height: 40px;
    background: var(--light-grey);
    border: 3px solid var(--border-color);
    border-radius: 50%;
    flex-shrink: 0;
    position: absolute;
    left: -60px;
    top: 0;
    transition: all var(--transition-fast);
}

.timeline-dot.timeline-active {
    background: var(--secondary);
    border-color: var(--secondary);
    box-shadow: 0 0 0 4px rgba(14, 118, 253, 0.1);
}

.timeline-content {
    padding: var(--spacing-lg);
    background: var(--white);
    border-radius: var(--radius-lg);
    border: 1px solid var(--border-color);
    box-shadow: var(--shadow-sm);
    transition: all var(--transition-fast);
}

.timeline-content:hover {
    box-shadow: var(--shadow-lg);
    border-color: var(--secondary);
}

.timeline-content h3 {
    margin-bottom: var(--spacing-xs);
    font-size: 20px;
}

.timeline-content p {
    font-size: 14px;
    color: var(--medium-grey);
    margin: 0;
}

.timeline-connector {
    display: none;
}

/* ============================================
   INDUSTRIES SECTION
   ============================================ */

.industries {
    padding: var(--spacing-3xl) 0;
    background: #EDF2F8;
}

.industries-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: var(--spacing-xl);
}

.industry-card {
    background: var(--white);
    padding: var(--spacing-xl);
    border-radius: var(--radius-xl);
    border: 1px solid var(--border-color);
    box-shadow: var(--shadow-sm);
    text-align: center;
    transition: all var(--transition-normal);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--spacing-md);
}

.industry-card:hover {
    box-shadow: var(--shadow-lg);
    transform: translateY(-8px);
    border-color: var(--accent);
}

.industry-icon {
    font-size: 48px;
    transition: transform var(--transition-fast);
}

.industry-card:hover .industry-icon {
    transform: scale(1.2) rotate(-12deg);
}

.industry-card h3 {
    margin: 0;
    font-size: 18px;
}

.industry-card p {
    font-size: 14px;
    color: var(--medium-grey);
    margin: 0;
}

/* ============================================
   CTA SECTION
   ============================================ */

.cta-section {
    padding: var(--spacing-4xl);
    background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%);
    color: var(--white);
    text-align: center;
    border-radius: var(--radius-xl);
    margin: var(--spacing-3xl) 0;
}

.cta-section h2 {
    color: var(--white);
    margin-bottom: var(--spacing-md);
}

.cta-section p {
    font-size: 18px;
    margin-bottom: var(--spacing-xl);
    opacity: 0.95;
}

.cta-section .btn {
    margin: 0 auto;
}

/* ============================================
   FOOTER
   ============================================ */

/* ============================================
   RESPONSIVE DESIGN
   ============================================ */

/* Navbar step-down scale.
   At the full 48px gap the menu is 980px wide and needs a ~1260px viewport
   to sit beside the 176px logo inside the container. These steps tighten
   ONLY the gap — font size, weight and colour are untouched — so the row
   degrades evenly instead of squeezing and wrapping its labels.
   Below 1025px the menu cannot fit at all and the mobile drawer takes over. */
/* Menu gap step-down ladder, derived rather than guessed.
   Measured: the menu is 746px wide at zero gap and carries 8 gaps; the logo is
   176px and the menu holds a 24px margin beside it; the container's content
   box is min(1280px, viewport) - 80. Fitting the row therefore requires

       gap <= (min(1280px, viewport) - 1026px) / 8

   so each step below is the largest round gap that still satisfies that at the
   narrowest viewport in its band, with a few px to spare. The previous ladder
   stepped at round viewport numbers with no such derivation, which left the
   row overflowing - and a horizontal scrollbar on every page - from 1025px all
   the way to 1273px. */
@media (max-width: 1279px) {
    .navbar-menu { gap: 26px; }
}

@media (max-width: 1239px) {
    .navbar-menu { gap: 21px; }
}

@media (max-width: 1199px) {
    .navbar-menu { gap: 16px; }
}

@media (max-width: 1159px) {
    .navbar-menu { gap: 11px; }
}

@media (max-width: 1119px) {
    .navbar-menu { gap: 7px; }
}

/* Below this the formula gives a gap under 7px: the desktop row simply cannot
   be made to fit, so the drawer takes over rather than the Contact button
   hanging off the edge. */
@media (max-width: 1089px) {
    .navbar-menu { display: none; }
    .hamburger { display: flex; }
}

@media (max-width: 1024px) {
    .hero-container {
        grid-template-columns: minmax(0, 1fr);
        gap: var(--spacing-2xl);
    }

    .hero-title {
        font-size: 40px;
    }

    .hero-subtitle {
        max-width: 100%;
    }

    .why-us-content {
        grid-template-columns: 1fr;
        gap: var(--spacing-2xl);
    }

}

@media (max-width: 768px) {
    :root {
        --spacing-lg: 24px;
        --spacing-xl: 32px;
        --spacing-2xl: 44px;
        --spacing-3xl: 52px;
        --container-padding: 20px;
    }

    h1 {
        font-size: 36px;
    }

    h2 {
        font-size: 28px;
    }

    .hero-title {
        font-size: 32px;
    }

    .hero-subtitle {
        font-size: 16px;
    }

    .hero-ctas {
        gap: var(--spacing-sm);
    }

    .btn {
        font-size: 14px;
        padding: 10px 20px;
    }

    .btn-lg {
        padding: 12px 24px;
        font-size: 16px;
    }

    .kpi-grid {
        grid-template-columns: repeat(auto-fit, minmax(92px, 1fr));
        gap: var(--spacing-sm);
    }

    .services-grid {
        grid-template-columns: 1fr;
    }

    .why-us-stats {
        grid-template-columns: 1fr;
    }

    .timeline {
        padding-left: 40px;
    }

    .timeline-dot {
        width: 32px;
        height: 32px;
        left: -50px;
    }

    .industries-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 480px) {
    h1 {
        font-size: 28px;
    }

    h2 {
        font-size: 22px;
    }

    h3 {
        font-size: 20px;
    }

    .hero-title {
        font-size: 26px;
    }

    /* Stack CTAs full-width on mobile */
    .hero-ctas {
        flex-direction: column;
        align-items: stretch;
    }

    .hero-ctas .btn {
        width: 100%;
    }

    .navbar-logo {
        font-size: 16px;
        gap: 8px;
    }

    /* .navbar-logo img height override moved next to the base rule below —
       it was declared here but the later base rule overrode it, so the
       intended 44px phone logo never applied. */

    .kpi-card {
        padding: var(--spacing-md);
    }

    .kpi-value {
        font-size: 28px;
    }

    .logo-grid {
        grid-template-columns: repeat(2, 1fr);
        gap: var(--spacing-md);
    }

    .industries-grid {
        grid-template-columns: 1fr;
    }

    .cta-section {
        padding: var(--spacing-xl);
        margin: var(--spacing-xl) 0;
    }
}

/* ============================================
   ACCESSIBILITY
   ============================================ */

@media (prefers-reduced-motion: reduce) {
    * {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }
}

/* Focus visible for keyboard navigation */
*:focus-visible {
    outline: 2px solid var(--secondary);
    outline-offset: 2px;
}

/* ============================================
   UTILITY CLASSES
   ============================================ */

.text-center {
    text-align: center;
}

.mt-0 { margin-top: 0; }
.mb-0 { margin-bottom: 0; }

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border-width: 0;
}

.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 2000;
    background: var(--primary);
    color: var(--white);
    padding: 12px 20px;
    border-radius: 0 0 var(--radius-md) 0;
    font-weight: 600;
}

.skip-link:focus {
    left: 0;
    color: var(--white);
}

/* ============================================
   NAVBAR — LOGO IMAGE + DROPDOWN MENUS
   (shared header across all pages)
   ============================================ */

.navbar-logo img {
    height: 54px;
    width: auto;
    display: block;
}

/* Phone logo step-down (declared here so it wins on source order) */
@media (max-width: 480px) {
    .navbar-logo img {
        height: 44px;
    }
}

/* Panels are anchored to their own <li> so each one centres under the label
   that opens it. The old container-anchoring right-aligned every panel to the
   site's content edge, which left the Services panel visibly off-centre from
   its trigger. Centring alone would push wide panels off-screen at narrow
   desktop widths, so initializeDropdownAlign() measures the overflow and
   feeds the correction back as --dd-shift. */
.navbar-menu .has-dropdown {
    position: relative;
}

/* Hover bridge across the gap between the label and its panel.
   It hangs off the <li>, not off .dropdown — the panel sets `overflow: hidden
   auto` for its max-height guard, which clips any pseudo-element reaching
   above its content box. Only declared while the menu is open, so it never
   sits over the page otherwise, and it spans the panel's full width so a
   diagonal move to the far column stays inside the trigger the whole way. */
.navbar-menu .has-dropdown:hover::after,
.navbar-menu .has-dropdown:focus-within::after,
.navbar-menu .has-dropdown.dd-open::after {
    content: "";
    position: absolute;
    top: 100%;
    left: 50%;
    width: var(--dd-bridge-w, 300px);
    height: 16px;
    transform: translateX(calc(-50% + var(--dd-shift, 0px)));
}

.navbar-menu .menu-trigger {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    cursor: pointer;
}

.navbar-menu .menu-trigger svg {
    width: 12px;
    height: 12px;
    transition: transform var(--transition-fast);
}

.navbar-menu .has-dropdown:hover .menu-trigger svg,
.navbar-menu .has-dropdown:focus-within .menu-trigger svg {
    transform: rotate(180deg);
}

.dropdown {
    position: absolute;
    top: calc(100% + 14px);
    left: 50%;
    transform: translateX(calc(-50% + var(--dd-shift, 0px))) translateY(8px);
    min-width: 460px;
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-xl);
    padding: var(--spacing-md);
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 4px 16px;
    opacity: 0;
    visibility: hidden;
    transition: opacity 180ms ease-out, transform 180ms ease-out,
                visibility 180ms ease-out;
    z-index: var(--z-dropdown);
}

.dropdown.dropdown-single {
    grid-template-columns: 1fr;
    min-width: 260px;
}

/* Wide 3-column mega menu (e.g. Industries). Centred under its trigger and
   sized against the viewport — sizing against 100% would now resolve against
   the narrow <li> the panel hangs off. */
.dropdown.dropdown-mega {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    min-width: 0;
    width: min(660px, calc(100vw - var(--container-padding) * 2));
    max-height: calc(100vh - 120px);
    overflow: hidden auto;
}

/* Compact (title-only) dropdown links for large menus */
.dropdown a.dd-compact {
    padding: 9px 12px;
    font-weight: 600;
}

/* Grouped, categorised services mega-menu.
   Was min-width:960px with 190px column minimums, which forced the panel to
   1002px — wider than its own declared box. Declaring the width explicitly
   and letting the columns flex keeps the same ~190px columns at desktop
   while allowing the panel to shrink instead of overflow. */
.dropdown.dropdown-grouped {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    min-width: 0;
    width: min(780px, calc(100vw - var(--container-padding) * 2));
    padding: var(--spacing-lg) var(--spacing-xl);
    gap: 2px var(--spacing-xl);
    align-content: start;
}
.dd-group { display: block; }
.dd-head {
    font-family: var(--font-display);
    font-size: 15.5px;
    line-height: 1.25;
    text-transform: none;
    letter-spacing: 0;
    color: var(--secondary);
    font-weight: 700;
    /* The old 54px reserve (two lines' worth) aligned the underlines but left
       ~35px of empty panel above every single-line heading. All three headings
       fit on one line at every width the desktop menu is shown at, so the
       reserve only ever cost vertical space. */
    min-height: 0;
    display: flex;
    align-items: flex-end;
    margin: 0 0 10px;
    padding-bottom: 8px;
    border-bottom: 2px solid rgba(14, 118, 253, 0.18);
}
.dd-group a {
    display: block;
    padding: 8px 10px;
    border-radius: var(--radius-sm);
    font-size: 15px;
    line-height: 1.35;
    font-weight: 500;
    color: var(--dark-grey);
    transition: background var(--transition-fast), color var(--transition-fast);
}
.dd-group a:hover { background: var(--light-grey); color: var(--secondary); }
.dropdown-grouped .dropdown-footer {
    grid-column: 1 / -1;
    margin-top: var(--spacing-md);
    padding-top: var(--spacing-md);
    border-top: 1px solid var(--border-color);
}
/* The former @media (max-width:1180px) right-edge "flip" has been removed —
   the panels are now container-anchored and contained at every width. */

/* Right-side vertical action rail */
.side-rail {
    position: fixed;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    z-index: 900;
    display: flex;
    flex-direction: column;
    gap: 3px;
}
.side-rail .sr-btn {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 46px;
    height: 46px;
    padding: 0 11px;
    overflow: hidden;
    white-space: nowrap;
    color: var(--white);
    border-radius: 10px 0 0 10px;
    box-shadow: -2px 3px 12px rgba(0, 0, 0, 0.18);
    transition: width var(--transition-normal), filter var(--transition-fast);
}
.side-rail .sr-ic { display: flex; flex-shrink: 0; }
.side-rail .sr-btn svg { width: 24px; height: 24px; }
.side-rail .sr-label { opacity: 0; font-size: 14px; font-weight: 600; transition: opacity var(--transition-fast); }
.side-rail .sr-btn:hover { width: 168px; filter: brightness(1.08); }
.side-rail .sr-btn:hover .sr-label { opacity: 1; }
.sr-email { background: var(--secondary); }
.sr-linkedin { background: #0A66C2; }
.sr-careers { background: var(--primary); }
@media (max-width: 768px) { .side-rail { display: none; } }

/* ============================================
   MODAL — consultation / inquiry dialog
   ============================================ */

.modal {
    position: fixed;
    inset: 0;
    z-index: 2000;
    display: none;
}
.modal.open { display: block; }
body.modal-open { overflow: hidden; }

.modal-overlay {
    position: absolute;
    inset: 0;
    background: rgba(7, 26, 46, 0.62);
    -webkit-backdrop-filter: blur(3px);
    backdrop-filter: blur(3px);
}

.modal-dialog {
    position: relative;
    z-index: 1;
    max-width: 640px;
    margin: 6vh auto;
    background: var(--white);
    border-radius: var(--radius-xl);
    box-shadow: var(--shadow-xl);
    padding: var(--spacing-2xl);
    max-height: 88vh;
    overflow-y: auto;
    animation: modalIn 0.25s ease-out;
}
@keyframes modalIn {
    from { opacity: 0; transform: translateY(24px); }
    to { opacity: 1; transform: none; }
}

.modal-dialog h3 {
    font-size: 26px;
    margin: 0 0 6px;
}
.modal-sub {
    color: var(--medium-grey);
    margin-bottom: var(--spacing-lg);
}

.modal-close {
    position: absolute;
    top: 16px;
    right: 16px;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    border: none;
    background: var(--light-grey);
    color: var(--medium-grey);
    font-size: 24px;
    line-height: 1;
    cursor: pointer;
    transition: background var(--transition-fast), color var(--transition-fast);
}
.modal-close:hover { background: var(--border-color); color: var(--primary); }

/* Compact form inside the modal so it fits without scrolling */
.modal-dialog { padding: var(--spacing-xl) var(--spacing-2xl) var(--spacing-lg); }
.modal-dialog .eyebrow { margin-bottom: 6px; }
.modal-dialog h3 { font-size: 24px; }
.modal-sub { margin-bottom: var(--spacing-md); font-size: 14px; }

.modal-form .form-grid { gap: 14px 20px; }
.modal-form .form-group { margin-bottom: 0; gap: 5px; }
.modal-form .form-control { padding: 9px 12px; }
.modal-form textarea.form-control { min-height: 76px; }
.modal-form .btn { margin-top: 16px; }
.modal-form .form-note { margin-top: 10px; margin-bottom: 0; font-size: 13px; }

@media (max-width: 600px) {
    .modal-dialog { margin: 0; min-height: 100%; border-radius: 0; padding: var(--spacing-lg); }
}

/* ============================================
   HOME — tabbed services showcase
   ============================================ */

.svc-tabs { margin-top: var(--spacing-md); }

.svc-tablist {
    display: flex;
    flex-wrap: wrap;
    border-bottom: 1px solid var(--border-color);
}
.svc-tab {
    position: relative;
    flex: 1 1 200px;
    background: none;
    border: none;
    border-bottom: 3px solid transparent;
    margin-bottom: -1px;
    padding: 18px 16px;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 18px;
    color: var(--primary);
    cursor: pointer;
    transition: color 260ms cubic-bezier(0.22, 0.61, 0.36, 1),
                transform 260ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
/* The active underline is drawn by this bar rather than the button's own
   border-bottom, so it can sweep in from the left. The transparent 3px border
   is kept for layout, which means the tab box never changes size. */
.svc-tab::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: -3px;
    height: 3px;
    background: var(--secondary);
    opacity: 0;
    transform: translateY(0) scaleX(0);
    transform-origin: left center;
    transition: transform 420ms cubic-bezier(0.22, 0.61, 0.36, 1),
                opacity 260ms ease-out;
    pointer-events: none;
}
.svc-tab:hover { color: var(--secondary); }
.svc-tab.active { color: var(--secondary); }
.svc-tab.active::after { opacity: 1; transform: translateY(0) scaleX(1); }

.svc-panels {
    position: relative;
    margin-top: var(--spacing-lg);
    border-radius: var(--radius-xl);
    overflow: hidden;
    box-shadow: var(--shadow-lg);
}
/* The slider rail. Every panel sits side by side at full width and the rail
   itself is translated, so changing tabs slides the deck across rather than
   cross-fading in place. JS only ever sets the transform on .svc-track. */
.svc-track {
    display: flex;
    align-items: stretch;
    width: 100%;
    transform: translate3d(0, 0, 0);
    transition: transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1);
    /* Vertical scrolling stays with the page; horizontal drags are ours. */
    touch-action: pan-y;
}
/* While a finger/pointer is dragging, the rail must track it 1:1. */
.svc-track.is-dragging { transition: none; }

/* ---- Slider controls ----
   Parked bottom-right, clear of the blue callout on every breakpoint, so the
   deck reads as something that moves before anyone touches it. */
.svc-nav {
    position: absolute;
    right: 28px;
    bottom: 28px;
    z-index: 2;
    display: flex;
    gap: 10px;
}
.svc-arrow {
    width: 48px;
    height: 48px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 1px solid rgba(255, 255, 255, 0.45);
    border-radius: 50%;
    background: rgba(6, 22, 38, 0.34);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    color: var(--white);
    cursor: pointer;
    transition: background-color 260ms cubic-bezier(0.22, 0.61, 0.36, 1),
                border-color 260ms cubic-bezier(0.22, 0.61, 0.36, 1),
                transform 260ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.svc-arrow svg { width: 18px; height: 18px; }
.svc-arrow:focus-visible { outline: 2px solid var(--white); outline-offset: 3px; }

/* The auto-advance timer, drawn. It also tells the visitor the deck is paused
   while they are hovering or dragging it. .is-auto is added by JS only when the
   timer is actually running, so it never appears for a reduced-motion viewer. */
.svc-progress {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 3px;
    z-index: 2;
    background: rgba(255, 255, 255, 0.22);
    opacity: 0;
    transition: opacity 300ms ease-out;
    pointer-events: none;
}
.svc-panels.is-auto .svc-progress { opacity: 1; }
.svc-progress span {
    display: block;
    width: 100%;
    height: 100%;
    background: var(--secondary);
    transform: scaleX(0);
    transform-origin: left center;
}
.svc-panels.is-auto .svc-progress span {
    animation: svcProgress var(--svc-interval, 5000ms) linear forwards;
}
.svc-panels.is-paused .svc-progress span { animation-play-state: paused; }
@keyframes svcProgress {
    from { transform: scaleX(0); }
    to   { transform: scaleX(1); }
}
.svc-panel {
    position: relative;
    flex: 0 0 100%;
    width: 100%;
    min-height: 460px;
    background-size: cover;
    background-position: center;
}

/* darken the plant image for contrast (left-weighted) */
.svc-panel::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(90deg, rgba(6,22,38,0.72) 0%, rgba(6,22,38,0.35) 45%, rgba(6,22,38,0.05) 75%);
}

.svc-callout {
    position: relative;
    z-index: 1;
    width: 380px;
    max-width: 82%;
    min-height: 300px;
    padding: 44px 40px 60px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    background: linear-gradient(135deg, #1E86FF 0%, #0a53c2 100%);
    -webkit-clip-path: polygon(0 0, 100% 0, 100% 74%, 84% 100%, 0 100%);
    clip-path: polygon(0 0, 100% 0, 100% 74%, 84% 100%, 0 100%);
}
.svc-callout p {
    color: var(--white);
    font-size: 19px;
    font-weight: 600;
    line-height: 1.5;
    margin: 0 0 28px;
}
.svc-explore {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    color: var(--white);
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 18px;
    transition: text-shadow 280ms ease-out;
}
.svc-explore svg {
    width: 20px;
    height: 20px;
    transition: transform 300ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.svc-explore:hover { color: var(--white); }

@media (max-width: 640px) {
    .svc-tab { flex-basis: 50%; font-size: 15px; padding: 14px 10px; }
    .svc-panel { min-height: 380px; }
    .svc-callout { max-width: 100%; width: 100%; clip-path: none; -webkit-clip-path: none; padding: 28px 24px; min-height: 0; }
    .svc-panel::after { background: linear-gradient(180deg, rgba(6,22,38,0.2), rgba(6,22,38,0.5)); }
    .svc-nav { right: 16px; bottom: 16px; gap: 8px; }
    .svc-arrow { width: 40px; height: 40px; }
    .svc-arrow svg { width: 16px; height: 16px; }
}

/* The home showcase intro runs the full container width — .section-head-row
   caps its supporting copy at 560px for the two-column headers used elsewhere,
   which this single-column header does not need. Scoped to .svc-head so every
   other .section-head-row keeps its original measure. */
.services .svc-head .shr-title p { max-width: none; }

/* ============================================
   HOME — tabbed services showcase: motion layer
   --------------------------------------------
   Purely additive. Every rule that hides something for an entrance is scoped
   to .services.svc-anim, a class JS adds at runtime — with scripting off (or
   broken) the section renders exactly as it did before, fully visible.
   Only opacity / transform / filter are animated, so nothing here reflows or
   contributes to CLS.
   ============================================ */

/* ---- 1. Section entrance (staggered fade + rise) ---- */

.services.svc-anim .svc-head .eyebrow,
.services.svc-anim .svc-head h2,
.services.svc-anim .svc-head p,
.services.svc-anim .svc-tablist,
.services.svc-anim .svc-panels,
.services.svc-anim .container > .text-center {
    opacity: 0;
    transform: translate3d(0, 18px, 0);
    transition: opacity 620ms cubic-bezier(0.22, 0.61, 0.36, 1),
                transform 620ms cubic-bezier(0.22, 0.61, 0.36, 1);
    will-change: opacity, transform;
}
.services.svc-anim .svc-head h2 { transition-delay: 90ms; }
.services.svc-anim .svc-head p { transition-delay: 170ms; }
.services.svc-anim .svc-tablist { transition-delay: 250ms; }
.services.svc-anim .svc-panels { transition-delay: 330ms; }
.services.svc-anim .container > .text-center { transition-delay: 430ms; }

.services.svc-anim.in-view .svc-head .eyebrow,
.services.svc-anim.in-view .svc-head h2,
.services.svc-anim.in-view .svc-head p,
.services.svc-anim.in-view .svc-tablist,
.services.svc-anim.in-view .svc-panels,
.services.svc-anim.in-view .container > .text-center {
    opacity: 1;
    transform: translate3d(0, 0, 0);
}
/* Once the entrance has played, drop the compositor hint AND the transform.
   A lingering translate3d() keeps the element on its own composited layer,
   which switches text from subpixel to greyscale antialiasing — a visible
   change to how the type renders. Resetting to none restores it exactly. */
.services.svc-anim.motion-done .svc-head .eyebrow,
.services.svc-anim.motion-done .svc-head h2,
.services.svc-anim.motion-done .svc-head p,
.services.svc-anim.motion-done .svc-tablist,
.services.svc-anim.motion-done .svc-panels,
.services.svc-anim.motion-done .container > .text-center {
    will-change: auto;
    transform: none;
}

/* The tab underline sweeps in only after the tab strip itself has arrived. */
.services.svc-anim .svc-tab.active::after { transform: translateY(0) scaleX(0); }
.services.svc-anim.in-view .svc-tab.active::after {
    transform: translateY(0) scaleX(1);
    transition-delay: 420ms;
}
.services.svc-anim.in-view.svc-interacted .svc-tab.active::after { transition-delay: 0ms; }

/* ---- 2. Image layer ----
   A duplicate of the panel's own background that can be scaled without moving
   the blue callout sitting on top of it. It inherits the inline
   background-image from .svc-panel, so no markup change is needed. */

.svc-panel { --svc-img-scale: 1; }
.svc-panel::before {
    content: "";
    position: absolute;
    inset: 0;
    background-image: inherit;
    background-size: cover;
    background-position: center;
    transform: scale(var(--svc-img-scale));
    transform-origin: center center;
    transition: transform 1300ms cubic-bezier(0.22, 0.61, 0.36, 1);
    pointer-events: none;
}
/* Starts fractionally zoomed in, settles to 1 as the section reveals. */
.services.svc-anim:not(.in-view) .svc-panel { --svc-img-scale: 1.06; }

/* ---- 3. Blue callout: slides in from the left on reveal and on tab change ---- */

@keyframes svcCalloutIn {
    from { opacity: 0; transform: translate3d(-28px, 0, 0); }
    to   { opacity: 1; transform: none; }
}
.svc-callout {
    transition: background 320ms ease-out;
}
.services.svc-anim .svc-panel.active .svc-callout { opacity: 0; }
.services.svc-anim.in-view .svc-panel.active .svc-callout {
    opacity: 1;
    animation: svcCalloutIn 620ms cubic-bezier(0.22, 0.61, 0.36, 1) 380ms both;
}
/* Once the deck slides, the incoming panel already carries its callout across
   the viewport — replaying the callout's own entrance on top of that reads as
   two separate moves. So after the first tab change the callout simply rides
   along with the panel; the entrance animation is kept for the first reveal. */
.services.svc-anim.in-view.svc-interacted .svc-panel .svc-callout {
    opacity: 1;
    animation: none;
}

/* ---- 4. Hover micro-interactions (pointer devices only) ---- */

@media (hover: hover) and (pointer: fine) {
    .svc-arrow:hover {
        background: var(--secondary);
        border-color: var(--secondary);
        transform: translateY(-2px);
    }
    .svc-tab:hover { transform: translateY(-2px); }
    /* Counter-shift keeps the underline pinned to the tab strip while the
       label lifts, so the bar never appears to detach. The .svc-anim.in-view
       variants exist purely to out-weigh the entrance rule in section 1. */
    .svc-tab:hover::after,
    .services.svc-anim.in-view .svc-tab:hover::after {
        opacity: 0.32;
        transform: translateY(2px) scaleX(1);
    }
    .svc-tab.active:hover::after,
    .services.svc-anim.in-view .svc-tab.active:hover::after {
        opacity: 1;
        transform: translateY(2px) scaleX(1);
    }

    .svc-panel:hover { --svc-img-scale: 1.03; }
    .svc-panel:hover::before { transition-duration: 750ms; }

    /* Same gradient, a touch brighter — keeps the shape, colour family and
       text rendering identical while acknowledging the pointer. */
    .svc-callout:hover {
        background: linear-gradient(135deg, #2B92FF 0%, #0d5fd6 100%);
    }

    .svc-explore:hover svg { transform: translateX(6px); }
    .svc-explore:hover { text-shadow: 0 0 14px rgba(255, 255, 255, 0.4); }

    .services .btn-secondary:hover svg { transform: translateX(4px); }
}

/* ---- 5. "View all services" button ---- */

.services .btn-secondary {
    transition: background-color 280ms cubic-bezier(0.22, 0.61, 0.36, 1),
                border-color 280ms cubic-bezier(0.22, 0.61, 0.36, 1),
                color 280ms cubic-bezier(0.22, 0.61, 0.36, 1),
                box-shadow 280ms cubic-bezier(0.22, 0.61, 0.36, 1),
                transform 280ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.services .btn-secondary svg {
    transition: transform 280ms cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* ---- 6. Responsive: shorter travel, faster timing on small screens ---- */

@media (max-width: 640px) {
    .services.svc-anim .svc-head .eyebrow,
    .services.svc-anim .svc-head h2,
    .services.svc-anim .svc-head p,
    .services.svc-anim .svc-tablist,
    .services.svc-anim .svc-panels,
    .services.svc-anim .container > .text-center {
        transform: translate3d(0, 10px, 0);
        transition-duration: 440ms;
    }
    .services.svc-anim .svc-head h2 { transition-delay: 60ms; }
    .services.svc-anim .svc-head p { transition-delay: 110ms; }
    .services.svc-anim .svc-tablist { transition-delay: 160ms; }
    .services.svc-anim .svc-panels { transition-delay: 210ms; }
    .services.svc-anim .container > .text-center { transition-delay: 270ms; }

    .services.svc-anim:not(.in-view) .svc-panel { --svc-img-scale: 1.04; }
    .svc-panel::before { transition-duration: 900ms; }

    .services.svc-anim.in-view .svc-tab.active::after { transition-delay: 260ms; }

    .services.svc-anim.in-view .svc-panel.active .svc-callout {
        animation-name: svcCalloutInSm;
        animation-duration: 460ms;
        animation-delay: 240ms;
    }
    /* Small screens slide too, so the callout rides in with its panel rather
       than running its own entrance a second time. */
    .services.svc-anim.in-view.svc-interacted .svc-panel .svc-callout,
    .services.svc-anim.in-view.svc-interacted .svc-panel.active .svc-callout {
        animation: none;
    }
}
@keyframes svcCalloutInSm {
    from { opacity: 0; transform: translate3d(-14px, 0, 0); }
    to   { opacity: 1; transform: none; }
}

/* ---- 7. Reduced motion: show everything, move nothing ---- */

@media (prefers-reduced-motion: reduce) {
    .services.svc-anim .svc-head .eyebrow,
    .services.svc-anim .svc-head h2,
    .services.svc-anim .svc-head p,
    .services.svc-anim .svc-tablist,
    .services.svc-anim .svc-panels,
    .services.svc-anim .container > .text-center,
    .services.svc-anim .svc-panel.active .svc-callout,
    .services.svc-anim.in-view .svc-panel.active .svc-callout {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
        animation: none !important;
        will-change: auto !important;
    }
    .svc-panel,
    .services.svc-anim:not(.in-view) .svc-panel,
    .svc-panel:hover { --svc-img-scale: 1 !important; }
    .svc-panel::before,
    .svc-panel.active { transition: none !important; animation: none !important; }
    /* The rail still jumps to the selected panel — it just gets there
       instantly, with no horizontal travel. */
    .svc-track { transition: none !important; }
    /* Auto-advance never starts for this viewer, so its timer bar stays put. */
    .svc-progress span { animation: none !important; }
    .svc-arrow,
    .svc-arrow:hover { transition: none !important; transform: none !important; }
    .svc-tab,
    .svc-tab::after { transition: none !important; }
    .svc-tab:hover { transform: none !important; }
    .svc-tab:hover::after { transform: translateY(0) scaleX(1) !important; }
    .services.svc-anim .svc-tab.active::after,
    .services.svc-anim.in-view .svc-tab.active::after {
        opacity: 1 !important;
        transform: translateY(0) scaleX(1) !important;
        transition-delay: 0ms !important;
    }
    .svc-explore:hover svg,
    .services .btn-secondary:hover svg { transform: none !important; }
    .svc-callout,
    .svc-callout:hover { transition: none !important; }
    .svc-explore,
    .svc-explore:hover { transition: none !important; text-shadow: none !important; }
}

/* ============================================
   HOME — About section (large heading + stats row)
   ============================================ */

.about-home {
    background: #F4F7FB;
}
.about-home-top {
    align-items: center;
}
.about-home h2 {
    font-size: clamp(30px, 3.6vw, 46px);
    line-height: 1.12;
    margin-bottom: var(--spacing-md);
}
.about-home p {
    color: var(--medium-grey);
    font-size: 17px;
    line-height: 1.7;
    margin-bottom: var(--spacing-lg);
}
.about-home .media-frame {
    aspect-ratio: 4 / 3;
    border-radius: var(--radius-xl);
    overflow: hidden;
    box-shadow: var(--shadow-lg);
}

.about-stats {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--spacing-xl);
    margin-top: var(--spacing-2xl);
    padding-top: var(--spacing-2xl);
    border-top: 1px solid var(--border-color);
}
.about-stat .as-num {
    font-family: var(--font-display);
    font-size: clamp(34px, 3.6vw, 52px);
    font-weight: 700;
    line-height: 1;
    margin-bottom: 8px;
}
.about-stat .as-label {
    color: var(--medium-grey);
    font-size: 15px;
    font-weight: 500;
}
/* About page: the same counter row as the homepage, but standing alone as its
   own band. On the homepage it sits at the foot of a section, so it carries a
   top border and 56px of lead-in — as a standalone band that doubles up with
   the section padding, hence the reset. Light background because the counter
   is designed for one (grey labels, hairline rule), and it keeps the page from
   running three dark sections back to back. */
.about-stats-band { background: #F4F7FB; }
.about-stats-band .about-stats {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
}

@media (max-width: 768px) {
    .about-stats { grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); }
}
@media (max-width: 420px) {
    .about-stats { grid-template-columns: 1fr; }
}

/* ============================================
   REDESIGNED FOOTER
   ============================================ */

.footer {
    background: #061626;
    color: rgba(255, 255, 255, 0.7);
    padding: 0;
}

/* CTA strip */
.footer-cta {
    border-bottom: 1px solid rgba(255, 255, 255, 0.1);
    background: linear-gradient(90deg, rgba(14, 118, 253, 0.20), rgba(14, 118, 253, 0.04));
    padding: var(--spacing-2xl) 0;
}

/* keep footer icons small (unsized inline SVGs default huge) */
.footer a svg {
    width: 16px;
    height: 16px;
    flex-shrink: 0;
    vertical-align: middle;
}
.footer-cta-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--spacing-xl);
    flex-wrap: wrap;
}
.footer-cta-text h3 {
    color: var(--white);
    font-size: clamp(22px, 2.4vw, 30px);
    margin: 0 0 6px;
}
.footer-cta-text p { margin: 0; color: rgba(255, 255, 255, 0.72); }

/* main grid */
.footer-social { display: flex; gap: 10px; }
.footer-social a {
    width: 38px;
    height: 38px;
    border-radius: 50%;
    border: 1px solid transparent;
    background: rgba(255, 255, 255, 0.08);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: rgba(255, 255, 255, 0.72);
    transition: background var(--transition-fast), border-color var(--transition-fast),
                color var(--transition-fast), transform var(--transition-fast);
}
.footer-social a:hover {
    background: rgba(14, 118, 253, 0.16);
    border-color: var(--secondary);
    color: var(--white);
    transform: translateY(-2px);
}
.footer-social svg { width: 16px; height: 16px; }
/* The LinkedIn mark is a solid glyph while the mail mark is a 2px outline, so
   side by side the mail icon read noticeably lighter. Thickening its stroke
   evens out the optical weight — CSS overrides the presentation attribute. */
.footer-social svg[fill="none"] :is(path, rect, circle) { stroke-width: 2.2; }

/* ---- Footer directory: four columns ruled like a table ----
   Column headings sit in a band of their own with a rule beneath, and the
   columns are divided by hairlines that carry straight down through the
   bottom bar. Achieved with gap:0 and per-cell padding - a grid gutter would
   break each divider into segments. The bottom bar reuses the same template,
   which is what keeps its rules in line with the ones above it. */
.footer-grid {
    display: grid;
    /* The last track is as wide as the first: it has to hold the copyright on
       one line, which is what squares the bottom bar off against the reference
       rather than letting it wrap to two. */
    grid-template-columns: 1.4fr 0.95fr 1.25fr 1.4fr;
    gap: 0;
    /* stretch, not start: the columns must run the full height of the band or
       each divider would stop wherever its own list happened to end, leaving
       four rules of four different lengths. */
    align-items: stretch;
    position: relative;
    /* Full-bleed. The element carries .container for its box model, but the
       directory is meant to span the window - so the max-width is dropped and
       the page gutter is replaced with a narrow edge inset. */
    max-width: none;
    width: 100%;
    /* No padding on the block itself. The top is flush so the heading band
       starts straight under the CTA strip rather than after a band of empty
       navy, and the bottom padding lives on the cells so the dividers run all
       the way down to the bottom bar's rule. */
    padding: 0;
}

/* The continuous rule under the heading band. A border on each <h5> would be
   interrupted at every cell's padding; one absolutely positioned line is not.
   Its offset is the grid's top padding plus the fixed heading height below. */
.footer-grid::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 64px;                        /* the heading band's height, which is now flush to the top */
    height: 1px;
    background: rgba(255, 255, 255, 0.12);
}

/* The inset lives on the cells, not on the grid, so the heading rule and the
   column dividers reach the window edges while the text still stands clear of
   them. The last cell is inset further to clear the fixed side rail and the
   back-to-top button, which sit over that corner. */
.fg-col {
    padding: 0 var(--spacing-xl) var(--spacing-lg);
    min-width: 0;
    display: flex;
    flex-direction: column;
}
.fg-col:first-child { padding-left: var(--spacing-md); }
.fg-col:last-child { padding-left: var(--spacing-md); padding-right: 72px; }
.fg-col + .fg-col { border-left: 1px solid rgba(255, 255, 255, 0.12); }

/* Fixed so all four headings share one baseline and the rule below them lands
   at a single known offset. Every heading is one short line at every width the
   ruled layout is used at. */
.fg-col > h5 {
    height: 64px;
    display: flex;
    align-items: center;
    margin: 0;
    font-family: var(--font-display);
    font-size: 16px;
    font-weight: 700;
    letter-spacing: 0;
    text-transform: none;
    color: var(--white);
}

.fg-body {
    padding-top: var(--spacing-lg);
    list-style: none;
    margin: 0;
    flex: 1;                          /* fills the column so its last row can sit at the foot */
}
ul.fg-body {
    display: flex;
    flex-direction: column;
    gap: 13px;
}
.fg-body li { margin: 0; line-height: 1.45; }
.fg-col a { color: rgba(255, 255, 255, 0.68); font-size: 15px; transition: color var(--transition-fast); }
.fg-col a:hover { color: var(--white); }
.fg-col .footer-all { color: #4a97ff; font-weight: 600; }

/* --- contact column --- */
.fg-contact .fg-body {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-lg);
}
/* The contact details are much shorter than the three link lists, so left to
   itself this column stopped a long way above the others and the band's bottom
   rule ran under a lot of nothing. Dropping the social row to the foot squares
   the four columns off against each other. */
.fg-contact .footer-follow { margin-top: auto; }
.footer-blurb {
    margin: 0;
    color: rgba(255, 255, 255, 0.62);
    font-size: 15px;
    line-height: 1.65;
}
.footer-contact-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 18px;
}
.footer-contact-list li {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    margin: 0;
    color: rgba(255, 255, 255, 0.68);
    font-size: 15px;
    line-height: 1.55;
}
.footer-contact-list li svg { width: 18px; height: 18px; flex-shrink: 0; margin-top: 2px; color: var(--accent-light); }

.footer-follow > span { display: block; color: var(--white); font-weight: 600; font-size: 14px; margin-bottom: 12px; }

/* --- bottom bar --- */
.footer-bottom {
    border-top: 1px solid rgba(255, 255, 255, 0.12);
    padding: 0;
}
.footer-grid-bottom {
    padding-top: var(--spacing-md);
    padding-bottom: var(--spacing-md);
    align-items: center;
}
/* No heading band down here, so the rule that divides it does not apply. */
.footer-grid-bottom::before { content: none; }
.footer-grid-bottom .fg-col {
    align-self: stretch;
    display: flex;
    flex-direction: row;            /* .fg-col is a column above; not down here */
    align-items: center;
    padding-bottom: 0;
}
.footer-logo { height: 38px; width: auto; filter: brightness(0) invert(1); }
/* 12px so the entity name holds one line in the last track at the widths the
   four-column grid is used at. */
.footer-copy { color: rgba(255, 255, 255, 0.5); font-size: 12px; line-height: 1.5; }
.footer-grid-bottom a { font-size: 14px; }

/* Below the desktop grid the ruled table stops being readable: four columns
   squeeze "Instrumentation & Control" onto three lines, and vertical rules
   between narrow columns read as clutter. Two columns, separated by rules
   between rows instead.

   The cells are addressed by their position in the DOM, and .fg-contact spans
   the full width, so the four children land as: row 1 = contact, row 2 =
   Company (left) + Services (right), row 3 = Industries (left). Only the third
   child is ever in the right-hand column - an :nth-child(even) rule would put
   a left border on the two cells that start a row. */
@media (max-width: 1024px) {
    .footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .footer-grid::before { content: none; }
    /* `.fg-col + .fg-col` carries the desktop divider at (0,2,0); a bare
       `.fg-col` reset is a weight lighter and loses to it, so the adjacent
       selector has to be named here to clear the border. */
    .fg-col,
    .fg-col + .fg-col,
    .fg-col:first-child,
    .fg-col:last-child {
        padding: var(--spacing-lg) 0;
        border-left: 0;
        border-top: 1px solid rgba(255, 255, 255, 0.12);
    }
    .fg-contact {
        grid-column: 1 / -1;
        border-top: 0;
        padding-top: 0;
    }
    .fg-col:nth-child(3) {
        padding-left: var(--spacing-xl);
        border-left: 1px solid rgba(255, 255, 255, 0.12);
    }
    .fg-col > h5 { height: auto; margin-bottom: var(--spacing-md); }
    .fg-body { padding-top: 0; }

    .footer-grid-bottom { grid-template-columns: 1fr; gap: var(--spacing-md); }
    .footer-grid-bottom .fg-col,
    .footer-grid-bottom .fg-col:nth-child(3) {
        padding: 0;
        border: 0;
    }
}

@media (max-width: 560px) {
    .footer-grid { grid-template-columns: 1fr; }
    .fg-col,
    .fg-col:nth-child(3) {
        padding: var(--spacing-lg) 0;
        border-left: 0;
    }
}

@media (max-width: 900px) {
    .footer-cta-inner { flex-direction: column; align-items: flex-start; }
}
/* ============================================
   ABOUT — Core Values (dark, notched cards)
   ============================================ */

.core-values {
    background: linear-gradient(160deg, #071A2E 0%, #0A2742 100%);
    padding: var(--spacing-4xl) 0;
}
.core-values .section-header h2 { color: var(--white); }
.core-values .section-header p { color: rgba(255, 255, 255, 0.72); }

.cv-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--spacing-lg);
}
.cv-card {
    position: relative;
    background: var(--white);
    padding: 36px 26px 46px;
    clip-path: polygon(0 0, 100% 0, 100% calc(100% - 32px), calc(100% - 32px) 100%, 0 100%);
    filter: drop-shadow(0 12px 26px rgba(0, 0, 0, 0.30));
    transition: transform var(--transition-normal);
}
.cv-card:hover { transform: translateY(-6px); }
.cv-card .cv-top { position: absolute; top: 0; left: 0; right: 0; height: 6px; }
.cv-card .cv-icon { width: 46px; height: 46px; color: var(--primary); margin-bottom: 18px; }
.cv-card .cv-icon svg { width: 100%; height: 100%; }
.cv-card h3 { color: var(--primary); font-size: 21px; line-height: 1.2; margin: 0 0 12px; }
.cv-card p { color: var(--medium-grey); font-size: 15px; line-height: 1.6; margin: 0; }

@media (max-width: 900px) { .cv-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 520px) { .cv-grid { grid-template-columns: 1fr; } }

/* ============================================
   TESTIMONIALS — 3-card grid
   ============================================ */

.testi-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--spacing-lg);
}
.testi-card {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    padding: var(--spacing-xl);
    box-shadow: var(--shadow-sm);
    display: flex;
    flex-direction: column;
    transition: box-shadow var(--transition-normal), transform var(--transition-normal);
}
.testi-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-4px); }
.testi-quote-mark {
    font-family: var(--font-display);
    font-size: 54px;
    line-height: 0.5;
    color: var(--accent);
    margin-bottom: var(--spacing-sm);
}
.testi-text {
    color: var(--primary);
    font-size: 16px;
    line-height: 1.65;
    flex: 1;
    margin: 0 0 var(--spacing-lg);
}
.testi-author { display: flex; align-items: center; gap: 12px; }
.testi-avatar {
    width: 46px;
    height: 46px;
    border-radius: 50%;
    flex-shrink: 0;
    background: linear-gradient(135deg, var(--secondary), var(--accent));
    color: var(--white);
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 15px;
}
.testi-author strong { display: block; color: var(--primary); font-size: 15px; }
.testi-author span { color: var(--medium-grey); font-size: 13px; }

@media (max-width: 992px) { .testi-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 640px) { .testi-grid { grid-template-columns: 1fr; } }

/* ============================================
   CAREERS — positions + apply sidebar
   ============================================ */

.careers-layout {
    display: grid;
    grid-template-columns: 1.55fr 1fr;
    gap: var(--spacing-2xl);
    align-items: start;
}
.careers-roles {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--spacing-md);
}
.careers-apply { position: sticky; top: 100px; }
.careers-apply-card > p { margin-bottom: var(--spacing-md); }
.careers-apply-card .form-grid { gap: 12px; }
.careers-apply-card textarea.form-control { min-height: 88px; }
.careers-apply-card {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    padding: var(--spacing-xl);
    box-shadow: var(--shadow-md);
}
.careers-apply-card h3 { margin: 0 0 4px; font-size: 22px; }
.careers-apply-card > p { color: var(--medium-grey); font-size: 14px; margin-bottom: var(--spacing-md); }
/* strip the inner form's own card styling + go single-column */
.careers-apply-card .form-card { padding: 0; border: 0; box-shadow: none; background: none; }
.careers-apply-card .form-grid { grid-template-columns: 1fr; gap: 14px; }
.careers-apply-card .form-group { margin-bottom: 0; }
.careers-apply-card .form-control { padding: 10px 12px; }
.careers-apply-card textarea.form-control { min-height: 96px; }

@media (max-width: 992px) {
    .careers-layout { grid-template-columns: 1fr; }
    .careers-apply { position: static; }
}
@media (max-width: 620px) {
    .careers-roles { grid-template-columns: 1fr; }
}

/* ---- Open positions band ----
   Deliberately NOT .section-alt: on inner pages that class is flipped to dark
   navy site-wide, and this band sits directly under the dark "What we offer"
   section. A very light blue-grey keeps the page rhythm Dark → Light → Dark
   (CTA) → Dark (footer) while leaving the white cards and navy type as-is. */
.careers-positions {
    background: linear-gradient(180deg, #F4F8FD 0%, #FAFCFF 100%);
    padding: var(--spacing-4xl) 0;
}
/* Room to breathe between the heading and the first row of cards. */
.careers-positions .section-header.left { margin-bottom: var(--spacing-xl); }

/* Wider gutter between the two columns and between the job cards themselves. */
.careers-positions .careers-layout { gap: var(--spacing-2xl); }
.careers-positions .careers-roles { gap: var(--spacing-lg); }

/* Both columns start on the same line: the sticky offset is what the apply
   card scrolls to, not where it begins, so nothing is pushed down. */
.careers-positions .careers-apply,
.careers-positions .careers-roles { margin-top: 0; }

/* The form column reads as an equal partner to the listings rather than a
   narrow sidebar — a little more inner padding and a slightly deeper shadow. */
.careers-positions .careers-apply-card {
    padding: var(--spacing-xl) var(--spacing-xl) var(--spacing-lg);
    box-shadow: 0 14px 40px rgba(6, 22, 38, 0.08);
}

@media (max-width: 992px) {
    /* Stacked: the form goes full width under the listings. */
    .careers-positions { padding: var(--spacing-3xl) 0; }
    .careers-positions .careers-layout { gap: var(--spacing-xl); }
    .careers-positions .careers-apply { width: 100%; }
}
@media (max-width: 640px) {
    .careers-positions { padding: var(--spacing-2xl) 0; }
    .careers-positions .careers-apply-card { padding: var(--spacing-md); }
}

/* ---- Apply form: consistent field rhythm ---- */

/* One gap value for every field in the column, so labels and inputs step
   down the card evenly. */
.careers-apply-card .form-grid { gap: var(--spacing-sm); }

/* Matching heights across text inputs and selects. */
.careers-apply-card .form-control { padding: 11px 14px; }
.careers-apply-card :is(input, select).form-control { height: 44px; }
.careers-apply-card textarea.form-control { min-height: 104px; padding-top: 10px; }

/* Clear separation between the last field and the submit button. */
.careers-apply-card .form-card > button[type="submit"] { margin-top: var(--spacing-md); }

/* ---- File upload field ----
   The native control is kept (it is the real input, and the <label for> still
   points at it) but made invisible and stretched over the whole field, so a
   click anywhere opens the picker and the field stays keyboard-focusable.
   Everything visible is our own markup, matched to .form-control. */

.file-field {
    position: relative;
    display: flex;
    align-items: center;
    gap: 10px;
    height: 44px;
    padding: 5px 14px 5px 5px;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    background: var(--white);
    transition: all var(--transition-fast);
}
.file-field input[type="file"] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
}
.file-field .ff-btn {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    flex-shrink: 0;
    height: 32px;
    padding: 0 14px;
    border-radius: var(--radius-md);
    background: #EAF2FD;
    color: var(--secondary);
    font-size: 14px;
    font-weight: 600;
    white-space: nowrap;
    transition: background var(--transition-fast);
}
.file-field .ff-btn svg { width: 15px; height: 15px; flex-shrink: 0; }

/* The chosen filename — greyed while empty, and truncated rather than allowed
   to widen the card on a long filename. */
.file-field .ff-name {
    min-width: 0;
    flex: 1 1 auto;
    font-size: 14px;
    color: var(--medium-grey);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.file-field.has-file .ff-name { color: var(--dark-grey); font-weight: 500; }
.file-field.has-file .ff-btn { background: #E3EDFB; }

.file-field:hover { border-color: #C3D6EE; }
.file-field:hover .ff-btn { background: #DCE9FB; }

/* Focus ring matches .form-control:focus exactly — :focus-within picks up the
   real input inside, which is what actually receives focus. */
.file-field:focus-within {
    border-color: var(--secondary);
    box-shadow: 0 0 0 3px rgba(14, 118, 253, 0.12);
}

.form-file .form-hint {
    font-size: 12px;
    color: var(--medium-grey);
    line-height: 1.4;
}

/* ============================================
   INSIGHTS — article (inner) page
   ============================================ */

.article-wrap { max-width: 820px; }
.article-hero-img { aspect-ratio: 21 / 9; margin-bottom: var(--spacing-lg); border-radius: var(--radius-xl); overflow: hidden; }

.article-meta {
    display: flex;
    align-items: center;
    gap: 14px;
    padding-bottom: var(--spacing-lg);
    margin-bottom: var(--spacing-lg);
    border-bottom: 1px solid var(--border-color);
}
.article-avatar {
    width: 46px;
    height: 46px;
    border-radius: 50%;
    flex-shrink: 0;
    background: linear-gradient(135deg, var(--secondary), var(--accent));
    color: var(--white);
    font-family: var(--font-display);
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
}
.article-meta strong { display: block; color: var(--primary); font-size: 15px; }
.article-meta span { font-size: 13px; color: var(--medium-grey); }

.article-body { font-size: 17px; line-height: 1.75; color: var(--dark-grey); }
.article-body .lead { font-size: 21px; line-height: 1.6; color: var(--primary); font-weight: 500; margin-bottom: var(--spacing-lg); }
.article-body h2 { font-size: 26px; margin: var(--spacing-xl) 0 var(--spacing-sm); color: var(--primary); }
.article-body p { margin-bottom: var(--spacing-md); }
.article-body ul { margin: 0 0 var(--spacing-md) 22px; }
.article-body li { margin-bottom: 8px; }
.article-body a { color: var(--secondary); font-weight: 600; text-decoration: underline; text-underline-offset: 2px; }

.takeaways {
    background: linear-gradient(135deg, rgba(14,118,253,0.06), rgba(0,200,163,0.06));
    border-left: 4px solid var(--secondary);
    border-radius: var(--radius-md);
    padding: var(--spacing-lg) var(--spacing-xl);
    margin: var(--spacing-xl) 0;
}
.takeaways h3 { font-size: 18px; margin: 0 0 12px; color: var(--primary); }
.takeaways ul { list-style: none; margin: 0; padding: 0; }
.takeaways li { position: relative; padding-left: 26px; margin-bottom: 10px; font-size: 15px; color: var(--dark-grey); line-height: 1.55; }
.takeaways li::before { content: "\2713"; position: absolute; left: 0; color: var(--accent); font-weight: 700; }

.article-cta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--spacing-lg);
    flex-wrap: wrap;
    margin-top: var(--spacing-2xl);
    padding: var(--spacing-xl);
    background: linear-gradient(160deg, #071A2E, #0A2742);
    border-radius: var(--radius-xl);
}
.article-cta h3 { color: var(--white); font-size: 20px; margin: 0 0 4px; }
.article-cta p { color: rgba(255,255,255,0.75); margin: 0; font-size: 15px; }

/* ============================================
   CONTACT — redesigned
   ============================================ */

.contact-cards {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--spacing-lg);
    margin-bottom: var(--spacing-2xl);
}
.contact-card {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    padding: var(--spacing-xl);
    box-shadow: var(--shadow-sm);
    transition: box-shadow var(--transition-normal), transform var(--transition-normal);
}
.contact-card:hover { box-shadow: var(--shadow-md); transform: translateY(-4px); }
.contact-card .cc-icon {
    width: 52px;
    height: 52px;
    border-radius: 14px;
    background: linear-gradient(135deg, rgba(14, 118, 253, 0.12), rgba(0, 200, 163, 0.12));
    color: var(--secondary);
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 16px;
}
.contact-card .cc-icon svg { width: 24px; height: 24px; }
.contact-card h4 { color: var(--primary); font-size: 17px; margin: 0 0 6px; }
.contact-card p { color: var(--medium-grey); font-size: 14px; line-height: 1.6; margin: 0; }
.contact-card a { color: var(--secondary); font-weight: 600; }

.contact-grid {
    display: grid;
    grid-template-columns: 1.5fr 1fr;
    gap: var(--spacing-2xl);
    align-items: start;
}
.contact-form-wrap {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    padding: var(--spacing-xl);
    box-shadow: var(--shadow-md);
    align-self: start;
}
.contact-form-wrap h2 { margin-bottom: 6px; }
/* compact form: remove double row-spacing so the card isn't tall */
.contact-form-wrap .form-grid { gap: 16px 20px; }
.contact-form-wrap .form-group { margin-bottom: 0; }
.contact-form-wrap .form-control { padding: 10px 12px; }
.contact-form-wrap textarea.form-control { min-height: 110px; }
.contact-form-wrap .btn { margin-top: 16px; }
.contact-form-wrap .form-note { margin-top: 12px; margin-bottom: 0; }
.contact-aside { display: flex; flex-direction: column; gap: var(--spacing-lg); }
.contact-aside .map-frame { width: 100%; height: 300px; border: 0; border-radius: var(--radius-xl); display: block; }
.contact-aside-panel {
    background: linear-gradient(160deg, #071A2E 0%, #0A2742 100%);
    color: var(--white);
    border-radius: var(--radius-xl);
    padding: var(--spacing-xl);
}
.contact-aside-panel h3 { color: var(--white); font-size: 20px; margin: 0 0 8px; }
.contact-aside-panel p { color: rgba(255, 255, 255, 0.75); font-size: 15px; margin: 0 0 6px; }
.contact-aside-panel a { color: var(--accent-light); font-weight: 600; }

.contact-next {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    padding: var(--spacing-xl);
    box-shadow: var(--shadow-sm);
}
.contact-next h3 { font-size: 18px; margin: 0 0 18px; color: var(--primary); }
.cn-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 18px; }
.cn-steps li { display: flex; gap: 14px; align-items: flex-start; }
.cn-num {
    width: 30px;
    height: 30px;
    border-radius: 50%;
    flex-shrink: 0;
    background: linear-gradient(135deg, var(--secondary), var(--accent));
    color: var(--white);
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 14px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.cn-steps strong { display: block; color: var(--primary); font-size: 15px; margin-bottom: 3px; }
.cn-steps p { margin: 0; color: var(--medium-grey); font-size: 13px; line-height: 1.55; }

/* stacked contact-info card under the map */
.contact-info-card {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    padding: 6px var(--spacing-xl);
    box-shadow: var(--shadow-sm);
}
.ci-row { display: flex; gap: 14px; align-items: flex-start; padding: 16px 0; border-bottom: 1px solid var(--border-color); }
.ci-row:last-child { border-bottom: 0; }
.ci-row .ci-ic {
    width: 42px;
    height: 42px;
    border-radius: 12px;
    flex-shrink: 0;
    background: linear-gradient(135deg, rgba(14, 118, 253, 0.12), rgba(0, 200, 163, 0.12));
    color: var(--secondary);
    display: flex;
    align-items: center;
    justify-content: center;
}
.ci-row .ci-ic svg { width: 20px; height: 20px; }
.ci-row h4 { color: var(--primary); font-size: 15px; margin: 0 0 3px; }
.ci-row p { color: var(--medium-grey); font-size: 14px; line-height: 1.5; margin: 0; }
.ci-row a { color: var(--secondary); font-weight: 600; }

@media (max-width: 900px) {
    .contact-cards { grid-template-columns: 1fr; }
    .contact-grid { grid-template-columns: 1fr; }
}

/* ============================================
   ABOUT — testimonials grid (3-up)
   ============================================ */

.testimonials-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: var(--spacing-lg);
}
.tcard {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    padding: var(--spacing-xl);
    box-shadow: var(--shadow-sm);
    display: flex;
    flex-direction: column;
    transition: box-shadow var(--transition-normal), transform var(--transition-normal);
}
.tcard:hover { box-shadow: var(--shadow-lg); transform: translateY(-5px); }
.tcard .t-stars { color: #F5A623; letter-spacing: 2px; font-size: 14px; margin-top: 5px; }
.tcard blockquote {
    margin: 0 0 var(--spacing-sm);
    font-size: 16px;
    line-height: 1.65;
    color: var(--dark-grey);
    flex: 1;
    position: relative;
}
.tcard blockquote::before {
    content: "\201C";
    display: block;
    font-family: var(--font-display);
    font-size: 44px;
    line-height: 0.5;
    color: var(--accent);
    opacity: 0.5;
    margin-bottom: 10px;
}
.tcard blockquote::before {
    content: "\201C";
    display: block;
    font-family: var(--font-display);
    font-size: 46px;
    line-height: 0.6;
    color: var(--accent);
    opacity: 0.55;
    margin-bottom: 8px;
}
.tcard .t-author { display: flex; align-items: center; gap: 12px; }
.tcard .t-info { display: flex; flex-direction: column; }
.tcard .t-avatar {
    width: 46px;
    height: 46px;
    border-radius: 50%;
    flex-shrink: 0;
    background: linear-gradient(135deg, var(--secondary), var(--accent));
    color: var(--white);
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 16px;
}
.tcard .t-name { display: block; font-weight: 700; color: var(--primary); font-size: 15px; }
.tcard .t-role { display: block; font-size: 13px; color: var(--medium-grey); }

/* ============================================
   HOME — Careers band
   ============================================ */

.career-band {
    display: grid;
    grid-template-columns: 1fr 1fr;
    border-radius: var(--radius-xl);
    overflow: hidden;
    box-shadow: var(--shadow-lg);
    min-height: 380px;
}
.career-media { position: relative; min-height: 260px; }
.career-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.career-panel {
    background: linear-gradient(160deg, #061626 0%, #0A2742 60%, #0d3358 100%);
    color: var(--white);
    padding: var(--spacing-3xl) var(--spacing-2xl);
    display: flex;
    flex-direction: column;
    justify-content: center;
}
.career-panel .eyebrow { color: var(--accent); }
.career-panel h2 {
    color: var(--white);
    font-size: clamp(28px, 3.2vw, 40px);
    line-height: 1.15;
    margin-bottom: var(--spacing-md);
}
.career-panel p {
    color: rgba(255, 255, 255, 0.8);
    font-size: 17px;
    line-height: 1.7;
    margin-bottom: var(--spacing-lg);
    max-width: 460px;
}
.career-panel .btn { align-self: flex-start; }

@media (max-width: 768px) {
    .career-band { grid-template-columns: 1fr; }
    .career-media { height: 240px; }
    .career-panel { padding: var(--spacing-2xl) var(--spacing-xl); }
}

/* ============================================
   HOME — dark "Why us" + creative animated Process
   ============================================ */

.why-us,
.process {
    background: linear-gradient(165deg, #061626 0%, #0A2742 58%, #0D3358 100%);
    position: relative;
    overflow: hidden;
}

/* Readable text on the dark background */
.why-us-text h2,
.why-us-text h4,
.process .section-header h2 { color: var(--white); }
.why-us-text > p,
.why-us-text .benefits-list p,
.process .section-header p { color: rgba(255, 255, 255, 0.72); }

/* Faint blueprint dot field for depth */
.process::before {
    content: "";
    position: absolute;
    inset: 0;
    background-image: radial-gradient(rgba(255, 255, 255, 0.06) 1px, transparent 1.6px);
    background-size: 30px 30px;
    opacity: 0.6;
    pointer-events: none;
}
.process .container { position: relative; z-index: 1; }

.process .ps-content h3 { color: var(--white); }
.process .ps-content p { color: rgba(255, 255, 255, 0.62); }

/* Animated flowing connector line between steps */
.process .process-step::before {
    background: linear-gradient(90deg,
        rgba(0, 200, 163, 0) 0%,
        rgba(0, 200, 163, 0.9) 25%,
        rgba(14, 118, 253, 1) 50%,
        rgba(0, 200, 163, 0.9) 75%,
        rgba(0, 200, 163, 0) 100%);
    background-size: 200% 100%;
    opacity: 1;
    animation: psFlow 3s linear infinite;
}
@keyframes psFlow {
    0% { background-position: 150% 0; }
    100% { background-position: -150% 0; }
}

/* Glowing nodes with a rotating conic-gradient halo */
.process .ps-node {
    box-shadow: 0 0 0 6px rgba(14, 118, 253, 0.12), 0 6px 26px rgba(0, 200, 163, 0.45);
    animation: psPulse 2.8s ease-in-out infinite;
}
.process .ps-node::after {
    content: "";
    position: absolute;
    inset: -6px;
    border-radius: 50%;
    z-index: -1;
    background: conic-gradient(from 0deg, transparent 0deg, rgba(0, 200, 163, 0.95) 90deg, transparent 150deg);
    animation: psSpin 3.5s linear infinite;
}
.process .ps-node:hover { transform: translateY(-4px) scale(1.08); }
@keyframes psSpin { to { transform: rotate(1turn); } }
@keyframes psPulse {
    0%, 100% { box-shadow: 0 0 0 6px rgba(14, 118, 253, 0.12), 0 0 16px rgba(0, 200, 163, 0.35); }
    50% { box-shadow: 0 0 0 11px rgba(14, 118, 253, 0.06), 0 0 36px rgba(0, 200, 163, 0.7); }
}

/* Out-of-phase halos so the row feels alive, not synchronised */
.process .process-step:nth-child(2) .ps-node::after { animation-delay: -0.6s; }
.process .process-step:nth-child(3) .ps-node::after { animation-delay: -1.2s; }
.process .process-step:nth-child(4) .ps-node::after { animation-delay: -1.8s; }
.process .process-step:nth-child(5) .ps-node::after { animation-delay: -2.4s; }
.process .process-step:nth-child(6) .ps-node::after { animation-delay: -3s; }

/* Keep the white stat cards popping on the dark why-us */
.why-us .stat-box { box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25); }

@media (prefers-reduced-motion: reduce) {
    .process .ps-node,
    .process .ps-node::after,
    .process .process-step::before { animation: none; }
}

/* .dd-open is held by initializeDropdowns() for a beat after the pointer
   leaves. There is a real gap between the label and the panel, and it belongs
   to neither, so on :hover alone a slow move towards the panel crossed dead
   space and dismissed the menu before it arrived. */
.has-dropdown:hover .dropdown,
.has-dropdown:focus-within .dropdown,
.has-dropdown.dd-open .dropdown {
    opacity: 1;
    visibility: visible;
    transform: translateX(calc(-50% + var(--dd-shift, 0px))) translateY(0);
}

.navbar-menu .has-dropdown.dd-open .menu-trigger svg {
    transform: rotate(180deg);
}

.dropdown a {
    display: block;
    padding: 10px 12px;
    border-radius: var(--radius-md);
    font-size: 15px;
    font-weight: 500;
    color: var(--dark-grey);
    transition: all var(--transition-fast);
}

.dropdown a:hover {
    background: var(--light-grey);
    color: var(--secondary);
}

/* .navbar-menu a sets white-space: nowrap so top-level labels like
   "Modular Skids" never break mid-item. That inherits into the mega-menu,
   where the description text then renders on a single line and spills across
   the neighbouring columns. Panel content must wrap normally. */
.dropdown a { white-space: normal; }

.dropdown a span {
    display: block;
    font-size: 12px;
    color: var(--medium-grey);
    font-weight: 400;
    margin-top: 2px;
}

.dropdown-footer {
    grid-column: 1 / -1;
    margin-top: 8px;
    padding-top: 12px;
    border-top: 1px solid var(--border-color);
}

.dropdown-footer a {
    color: var(--secondary);
    font-weight: 600;
}

/* Mobile drawer */
.mobile-drawer {
    position: fixed;
    inset: 0;
    z-index: var(--z-modal);
    visibility: hidden;
    pointer-events: none;
}

.mobile-drawer.open {
    visibility: visible;
    pointer-events: auto;
}

.mobile-drawer-overlay {
    position: absolute;
    inset: 0;
    background: rgba(7, 26, 46, 0.5);
    opacity: 0;
    transition: opacity var(--transition-normal);
}

.mobile-drawer.open .mobile-drawer-overlay {
    opacity: 1;
}

.mobile-drawer-panel {
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: min(360px, 85vw);
    background: var(--white);
    box-shadow: var(--shadow-xl);
    padding: var(--spacing-lg);
    overflow-y: auto;
    transform: translateX(100%);
    transition: transform var(--transition-normal);
    display: flex;
    flex-direction: column;
    gap: var(--spacing-sm);
}

.mobile-drawer.open .mobile-drawer-panel {
    transform: translateX(0);
}

.mobile-drawer-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: var(--spacing-sm);
}

.mobile-drawer-head img {
    height: 34px;
}

.drawer-close {
    background: none;
    border: none;
    font-size: 28px;
    line-height: 1;
    cursor: pointer;
    color: var(--primary);
}

.mobile-nav {
    list-style: none;
    display: flex;
    flex-direction: column;
}

.mobile-nav > li {
    border-bottom: 1px solid var(--border-color);
}

.mobile-nav a,
.mobile-nav .m-trigger {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 14px 4px;
    font-size: 16px;
    font-weight: 600;
    color: var(--primary);
    background: none;
    border: none;
    text-align: left;
    cursor: pointer;
}

.mobile-sub {
    list-style: none;
    max-height: 0;
    overflow: hidden;
    transition: max-height var(--transition-normal);
}

.mobile-sub.open {
    max-height: 600px;
}

.mobile-sub a {
    font-size: 14px;
    font-weight: 500;
    color: var(--medium-grey);
    padding: 10px 16px;
}

.m-trigger svg {
    width: 14px;
    height: 14px;
    transition: transform var(--transition-fast);
}

.m-trigger.open svg {
    transform: rotate(180deg);
}

.mobile-drawer .btn {
    margin-top: var(--spacing-md);
}

/* ============================================
   PAGE HERO (inner pages) + BREADCRUMB
   ============================================ */

.page-hero {
    background:
        radial-gradient(900px 520px at 88% -15%, rgba(14, 118, 253, 0.38), transparent 60%),
        radial-gradient(720px 520px at 102% 120%, rgba(0, 200, 163, 0.20), transparent 55%),
        linear-gradient(135deg, #061626 0%, #0A2742 55%, #0d3358 100%);
    color: var(--white);
    padding: var(--spacing-3xl) 0;
    position: relative;
    overflow: hidden;
}

/* Soft dotted "blueprint" field that fades in from the right */
.page-hero::after {
    content: "";
    position: absolute;
    inset: 0;
    background-image: radial-gradient(rgba(255, 255, 255, 0.12) 1px, transparent 1.6px);
    background-size: 26px 26px;
    -webkit-mask-image: linear-gradient(90deg, transparent 28%, #000 100%);
    mask-image: linear-gradient(90deg, transparent 28%, #000 100%);
    opacity: 0.55;
    pointer-events: none;
}

/* Thin accent line at the foot of the hero for a crafted edge */
.page-hero::before {
    content: "";
    position: absolute;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 3px;
    background: linear-gradient(90deg, var(--secondary), var(--accent));
    opacity: 0.9;
}

/* Secondary CTA legibility on the dark hero */
.page-hero .btn-secondary {
    color: var(--white);
    border-color: rgba(255, 255, 255, 0.55);
}
.page-hero .btn-secondary:hover {
    background: var(--white);
    color: var(--primary);
    border-color: var(--white);
}

/* Internal-link pills (e.g. "industries we serve" on a service page) */
.pill-links {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
}
.pill-links a {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 10px 18px;
    border: 1px solid var(--border-color);
    border-radius: 100px;
    background: var(--white);
    font-weight: 600;
    font-size: 14px;
    color: var(--primary);
    transition: all var(--transition-fast);
}
.pill-links a svg { width: 14px; height: 14px; }
.pill-links a:hover {
    border-color: var(--secondary);
    color: var(--secondary);
    box-shadow: var(--shadow-sm);
    transform: translateY(-2px);
}

/* Sticky inquiry aside used on detail pages */
.detail-aside {
    position: sticky;
    top: 100px;
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    box-shadow: var(--shadow-md);
    padding: var(--spacing-xl);
}
.detail-aside h3 { font-size: 20px; }
.detail-aside .btn { width: 100%; margin-top: var(--spacing-sm); }
.detail-aside .aside-contact {
    margin-top: var(--spacing-md);
    padding-top: var(--spacing-md);
    border-top: 1px solid var(--border-color);
    font-size: 14px;
    color: var(--medium-grey);
}
.detail-aside .aside-contact a { font-weight: 600; }

.page-hero .container {
    position: relative;
    z-index: 1;
}

.page-hero-inner {
    max-width: 760px;
}

.page-hero h1 {
    color: var(--white);
    font-size: 48px;
    margin-bottom: var(--spacing-md);
}

.page-hero p {
    font-size: 18px;
    color: rgba(255, 255, 255, 0.82);
    margin-bottom: var(--spacing-lg);
    max-width: 640px;
}

/* About hero carries a three-part message — a one-line promise, the supporting
   detail, then a closing commitment — so its paragraphs need a hierarchy and a
   tighter rhythm than the single-paragraph heroes on every other inner page.
   Scoped to .page-hero-about so those are untouched. */
.page-hero-about .ph-lead {
    font-size: 22px;
    font-weight: 600;
    color: var(--white);
    margin-bottom: var(--spacing-sm);
}
.page-hero-about p { margin-bottom: var(--spacing-sm); }
.page-hero-about .ph-kicker {
    font-weight: 600;
    color: var(--accent-light);
    margin-bottom: 0;
}
@media (max-width: 768px) {
    .page-hero-about .ph-lead { font-size: 19px; }
}

.eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    font-size: 17px;
    font-weight: 700;
    letter-spacing: 1.6px;
    text-transform: uppercase;
    color: var(--accent);
    margin-bottom: var(--spacing-sm);
}
.eyebrow::before {
    content: "";
    width: 26px;
    height: 2px;
    background: currentColor;
    border-radius: 2px;
}
.section-header { }
.section-header .eyebrow { justify-content: center; }
.section-head-row .eyebrow { font-size: 17px; margin-bottom: 12px; }

.breadcrumb {
    padding: var(--spacing-md) 0;
    border-bottom: 1px solid var(--border-color);
    background: var(--light-grey);
}

.breadcrumb ol {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    font-size: 13px;
}

.breadcrumb li {
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--medium-grey);
}

.breadcrumb li::after {
    content: "/";
    color: var(--border-color);
}

.breadcrumb li:last-child::after {
    content: "";
}

.breadcrumb a {
    color: var(--medium-grey);
    font-weight: 500;
}

.breadcrumb a:hover {
    color: var(--secondary);
}

.breadcrumb li[aria-current] {
    color: var(--primary);
    font-weight: 600;
}

/* ============================================
   GENERIC SECTION & LAYOUT HELPERS
   ============================================ */

.section {
    padding: var(--spacing-3xl) 0;
}

/* The related-services row ends in its own arrows, which already read as the
   end of the section; a full 64px band under them before the closing CTA left
   an obvious hole. */
.section:has(> .container > .rel-slider) {
    padding-bottom: var(--spacing-lg);
}

.section-sm {
    padding: var(--spacing-2xl) 0;
}

.section-alt {
    background: #EDF2F8;
}

.section-header.left {
    text-align: left;
    margin-left: 0;
    margin-right: 0;
    max-width: 720px;
}

/* Caps a block of section copy with a summary statement — heavier and in the
   brand navy so it reads as a conclusion rather than one more body paragraph. */
.closing-line {
    font-weight: 600;
    color: var(--primary);
    margin-top: var(--spacing-md);
}

.lead {
    font-size: 18px;
    color: var(--medium-grey);
    line-height: 1.7;
}

.split {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--spacing-4xl);
    /* Both columns start at the top of the row. Centring floated the image
       halfway down whenever the copy column was the taller of the two, which
       left the section opening with a band of empty space beside the heading. */
    align-items: start;
}

.split.split-narrow {
    gap: var(--spacing-2xl);
}

.split img,
.media-frame {
    width: 100%;
    border-radius: var(--radius-xl);
    box-shadow: var(--shadow-lg);
}

.media-frame {
    aspect-ratio: 4 / 3;
    background: linear-gradient(135deg, rgba(14,118,253,0.08), rgba(0,200,163,0.08));
    border: 1px solid var(--border-color);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--secondary);
    overflow: hidden;
}

/* Section images (service, industry and insight overviews) show the whole
   photo: the frame follows the image's own ratio instead of a fixed 4/3 box,
   and the column starts it at the top rather than floating it half way down.
   Stretching the frame to the copy's full height was tried and reverted - the
   source art runs 0.67 to 2.07 in aspect, so filling a tall column meant
   cropping the wide drawings down to a strip. */
.split .media-frame {
    aspect-ratio: auto;
    width: 100%;
    height: auto;
}

/* Full width of the column, because ten of the source files are narrower than
   it and would otherwise sit as small islands beside full-height copy. Height
   follows the ratio, so nothing is cropped; the cap stops a portrait shot from
   running away with the section and contain keeps those few uncropped. */
.split .media-frame > img {
    width: 100%;
    height: auto;
    max-height: 620px;
    object-fit: contain;
}

.check-list {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: var(--spacing-md);
    margin-top: var(--spacing-lg);
}

.check-list li {
    display: flex;
    gap: var(--spacing-sm);
    align-items: flex-start;
    font-size: 15px;
}

.check-list li::before {
    content: "✓";
    flex-shrink: 0;
    width: 24px;
    height: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: rgba(0, 200, 163, 0.12);
    color: var(--accent);
    border-radius: 50%;
    font-weight: 700;
    font-size: 13px;
}

/* Card grid (services, industries, generic) */
/* SERVICES PAGE — service groups
   Mirrors the header's Services dropdown: a category heading with its own
   services beneath it, so the page and the menu present the same structure. */
.svc-group + .svc-group { margin-top: var(--spacing-2xl); }
.svc-group-head {
    font-size: 22px;
    font-weight: 700;
    color: var(--primary);
    margin: 0 0 var(--spacing-lg);
    padding-bottom: 12px;
    border-bottom: 1px solid var(--border-color);
}
@media (max-width: 640px) {
    .svc-group + .svc-group { margin-top: var(--spacing-xl); }
    .svc-group-head { font-size: 19px; margin-bottom: var(--spacing-md); }
}

.card-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
    gap: var(--spacing-xl);
}

/* Projects sit closer together than the site's other card rows - seventeen of
   them at a 48px gutter read as scattered rather than as one grid. */
.card-grid:has(.project-card) { gap: var(--spacing-lg); }

.card-grid.cols-2 { grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); }
.card-grid.cols-4 { grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }

.feature-card {
    background: var(--white);
    padding: var(--spacing-xl);
    border-radius: var(--radius-xl);
    border: 1px solid var(--border-color);
    box-shadow: var(--shadow-sm);
    transition: all var(--transition-normal);
    display: flex;
    flex-direction: column;
    gap: var(--spacing-sm);
    text-decoration: none;
    color: inherit;
}

.feature-card:hover {
    box-shadow: var(--shadow-xl);
    transform: translateY(-6px);
    border-color: var(--secondary);
}

/* No lift in the Related services row: the cards sit in an auto-advancing
   track, and a card jumping 6px as the pointer crosses it fought the slide.
   The shadow and border still carry the hover state. */
.rel-track .feature-card:hover {
    transform: none;
    box-shadow: var(--shadow-sm);
}

.feature-card .card-icon {
    margin-bottom: var(--spacing-xs);
}

.feature-card h3 {
    font-size: 20px;
    margin: 0;
    color: var(--primary);
}

.feature-card p {
    font-size: 14px;
    color: var(--medium-grey);
    margin: 0;
}

/* The services index carries the same Overview paragraphs, clamped at five
   lines rather than four - those cards are the page's main content, not a
   footnote slider, so they can afford the extra line. The five lines are
   reserved whether the copy fills them or not, so a two-line title beside a
   one-line title still leaves every description and every "Explore service"
   link on one baseline. */
/* Two lines reserved on the title as well - the names run from "FEED" to
   "Chiller & Cooling Tower Modular Systems", and a one-line title beside a
   two-line one dropped its whole card out of step with the rest of the row. */
.svc-card h3 {
    min-height: calc(20px * 1.3 * 2);
    line-height: 1.3;
}

.svc-card p {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 5;
    line-clamp: 5;
    overflow: hidden;
    line-height: 1.55;
    min-height: calc(14px * 1.55 * 5);
}

/* Related-services cards carry the linked page's own Overview paragraph, which
   runs 240-410 characters — far past what a card can show. Clamping at four
   lines, with the same four lines reserved whether the copy fills them or not,
   keeps every description block the same height so the titles, descriptions
   and "Explore" links read as one grid instead of a ragged row. */
.rel-track .feature-card p {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 4;
    line-clamp: 4;
    overflow: hidden;
    line-height: 1.55;
    min-height: calc(14px * 1.55 * 4);
}

/* `auto` rather than a fixed gap: the cards in a row are equal height, so this
   is what drops every "Explore service" link onto the same baseline no matter
   how many lines the title and description above it run to. The card's own
   `gap` still guarantees clear space above the link. */
.feature-card .card-link {
    margin-top: auto;
    padding-top: var(--spacing-xs);
}

.tag {
    display: inline-block;
    font-size: 12px;
    font-weight: 600;
    padding: 4px 12px;
    border-radius: 100px;
    background: rgba(14, 118, 253, 0.1);
    color: var(--secondary);
}

.tag.tag-accent {
    background: rgba(0, 200, 163, 0.12);
    color: #00997d;
}

/* Stats band */
.stats-band {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: var(--spacing-xl);
    text-align: center;
}

.stats-band .stat-number {
    font-size: 48px;
}

/* ============================================
   PROJECTS / PORTFOLIO
   ============================================ */

.filter-bar {
    display: flex;
    flex-wrap: wrap;
    gap: var(--spacing-sm);
    margin-bottom: var(--spacing-2xl);
    justify-content: center;
}

.filter-btn {
    padding: 8px 20px;
    border: 1px solid var(--border-color);
    background: var(--white);
    border-radius: 100px;
    font-family: var(--font-body);
    font-size: 14px;
    font-weight: 500;
    color: var(--medium-grey);
    cursor: pointer;
    transition: all var(--transition-fast);
}

.filter-btn:hover {
    border-color: var(--secondary);
    color: var(--secondary);
}

.filter-btn.active {
    background: var(--primary);
    border-color: var(--primary);
    color: var(--white);
}

.project-card {
    border-radius: var(--radius-xl);
    overflow: hidden;
    border: 1px solid var(--border-color);
    background: var(--white);
    box-shadow: var(--shadow-sm);
    transition: all var(--transition-normal);
    display: flex;
    flex-direction: column;
}

.project-card:hover {
    box-shadow: var(--shadow-xl);
    transform: translateY(-4px);
}

.project-thumb {
    aspect-ratio: 16 / 10;
    background: linear-gradient(135deg, var(--primary), var(--secondary));
    display: flex;
    align-items: center;
    justify-content: center;
    color: rgba(255,255,255,0.9);
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 18px;
    padding: var(--spacing-lg);
    text-align: center;
}

.project-body {
    padding: var(--spacing-lg);
    display: flex;
    flex-direction: column;
    gap: var(--spacing-xs);
}

.project-body h3 {
    font-size: 18px;
    margin: 0;
}

.project-meta {
    font-size: 13px;
    color: var(--medium-grey);
}

.is-hidden { display: none !important; }

/* ============================================
   INSIGHTS / BLOG
   ============================================ */

.post-card {
    display: flex;
    flex-direction: column;
    border-radius: var(--radius-xl);
    overflow: hidden;
    border: 1px solid var(--border-color);
    background: var(--white);
    box-shadow: var(--shadow-sm);
    transition: all var(--transition-normal);
}

.post-card:hover {
    box-shadow: var(--shadow-xl);
    transform: translateY(-6px);
}

.post-thumb {
    aspect-ratio: 16 / 9;
    background: linear-gradient(135deg, rgba(14,118,253,0.15), rgba(0,200,163,0.15));
}

.post-body {
    padding: var(--spacing-lg);
    display: flex;
    flex-direction: column;
    gap: var(--spacing-xs);
}

.post-body h3 {
    font-size: 20px;
    margin: 4px 0;
}

.post-body h3 a { color: var(--primary); }
.post-body h3 a:hover { color: var(--secondary); }

.post-meta {
    font-size: 13px;
    color: var(--medium-grey);
}

/* ============================================
   ACCORDION (FAQ)
   ============================================ */

.accordion {
    max-width: 820px;
    margin: 0 auto;
}

.accordion-item {
    border-bottom: 1px solid var(--border-color);
}

.accordion-trigger {
    width: 100%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--spacing-md);
    padding: var(--spacing-lg) 0;
    background: none;
    border: none;
    font-family: var(--font-display);
    font-size: 18px;
    font-weight: 600;
    color: var(--primary);
    text-align: left;
    cursor: pointer;
}

.accordion-trigger .icon {
    flex-shrink: 0;
    font-size: 24px;
    line-height: 1;
    transition: transform var(--transition-fast);
    color: var(--secondary);
}

.accordion-trigger[aria-expanded="true"] .icon {
    transform: rotate(45deg);
}

.accordion-panel {
    max-height: 0;
    overflow: hidden;
    transition: max-height var(--transition-normal);
}

.accordion-panel-inner {
    padding-bottom: var(--spacing-lg);
    color: var(--medium-grey);
    font-size: 15px;
    line-height: 1.7;
}

/* ============================================
   FORMS (contact, careers)
   ============================================ */

.form-card {
    background: var(--white);
    padding: var(--spacing-2xl);
    border-radius: var(--radius-xl);
    border: 1px solid var(--border-color);
    box-shadow: var(--shadow-md);
}

.form-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--spacing-md);
}

.form-group {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-bottom: var(--spacing-md);
}

.form-group.full { grid-column: 1 / -1; }

.form-group label {
    font-size: 13px;
    font-weight: 600;
    color: var(--dark-grey);
}

.form-group label .req { color: #e23d3d; }

.form-control {
    width: 100%;
    padding: 12px 14px;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    font-family: var(--font-body);
    font-size: 15px;
    color: var(--dark-grey);
    background: var(--white);
    transition: all var(--transition-fast);
}

.form-control:focus {
    outline: none;
    border-color: var(--secondary);
    box-shadow: 0 0 0 3px rgba(14, 118, 253, 0.12);
}

textarea.form-control {
    resize: vertical;
    min-height: 130px;
}

.form-note {
    font-size: 13px;
    color: var(--medium-grey);
    margin-top: var(--spacing-sm);
}

.form-success {
    display: none;
    background: rgba(0, 200, 163, 0.1);
    border: 1px solid var(--accent);
    color: #00997d;
    padding: var(--spacing-md);
    border-radius: var(--radius-md);
    font-weight: 600;
    margin-bottom: var(--spacing-md);
}

.form-success.show { display: block; }

.form-error {
    display: none;
    background: rgba(220, 38, 38, 0.08);
    border: 1px solid #dc2626;
    color: #b91c1c;
    padding: var(--spacing-md);
    border-radius: var(--radius-md);
    font-weight: 600;
    margin-bottom: var(--spacing-md);
}

.form-error.show { display: block; }

/* reCAPTCHA v3 honeypot — visually hidden, off-screen for bots */
.hp {
    position: absolute !important;
    left: -9999px !important;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* Contact info list */
.contact-info {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: var(--spacing-lg);
}

.contact-info li {
    display: flex;
    gap: var(--spacing-md);
    align-items: flex-start;
}

.contact-info .ci-icon {
    flex-shrink: 0;
    width: 44px;
    height: 44px;
    border-radius: var(--radius-md);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: rgba(14, 118, 253, 0.1);
    color: var(--secondary);
}

.contact-info h4 { font-size: 16px; margin-bottom: 2px; }
.contact-info p, .contact-info a { font-size: 15px; color: var(--medium-grey); margin: 0; }
.contact-info a:hover { color: var(--secondary); }

.map-frame {
    width: 100%;
    border: 0;
    border-radius: var(--radius-xl);
    min-height: 320px;
}

/* ============================================
   CTA BAND (reusable)
   ============================================ */

.cta-band {
    background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%);
    color: var(--white);
    text-align: center;
    padding: var(--spacing-4xl) var(--spacing-xl);
    border-radius: var(--radius-xl);
}

.cta-band h2 { color: var(--white); margin-bottom: var(--spacing-md); }
.cta-band p { font-size: 18px; opacity: 0.92; margin-bottom: var(--spacing-xl); max-width: 600px; margin-left: auto; margin-right: auto; }

.cta-band .hero-ctas { justify-content: center; }
.cta-band .btn-secondary { color: var(--white); border-color: rgba(255,255,255,0.5); }
.cta-band .btn-secondary:hover { background: var(--white); color: var(--primary); }

/* ============================================
   EXPANDED FOOTER
   ============================================ */

/* The .footer-social rules that used to sit here were a duplicate left over
   from the previous footer markup (its siblings .footer-brand / .footer-main
   appear in zero pages). Being later in the file they silently overrode the
   real definition further up — which is why the buttons kept their old square
   shape and a 24px top margin that knocked them out of line with the address.
   Removed so the single definition above governs. */

/* ============================================
   FLOATING WHATSAPP / CALL CTA (mobile)
   ============================================ */

.floating-cta {
    position: fixed;
    right: 20px;
    bottom: 20px;
    z-index: var(--z-fixed);
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.floating-cta a,
.floating-cta button {
    width: 52px;
    height: 52px;
    border: none;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--white);
    box-shadow: var(--shadow-lg);
    cursor: pointer;
    transition: transform var(--transition-fast), opacity var(--transition-fast), visibility var(--transition-fast);
}

.floating-cta a:hover,
.floating-cta button:hover { transform: scale(1.08); }
.floating-cta .fc-whatsapp { background: #25D366; }
.floating-cta svg { width: 26px; height: 26px; }

/* Back-to-top: hidden until the user scrolls down */
.floating-cta .fc-top {
    background: var(--primary);
    opacity: 0;
    visibility: hidden;
    transform: scale(0.8);
}
.floating-cta .fc-top.show {
    opacity: 1;
    visibility: visible;
    transform: scale(1);
}
.floating-cta .fc-top svg { width: 22px; height: 22px; }

/* ============================================
   RESPONSIVE — INNER PAGES
   ============================================ */

@media (max-width: 1024px) {
    .split { grid-template-columns: 1fr; gap: var(--spacing-2xl); }
    .page-hero h1 { font-size: 38px; }
}

@media (max-width: 768px) {
    /* .navbar-menu / .hamburger display swap lives in the 1024px block above;
       the duplicate that used to sit here has been removed. */
    .page-hero { padding: var(--spacing-2xl) 0; }
    .page-hero h1 { font-size: 30px; }
    .page-hero p { font-size: 16px; }
    .form-grid { grid-template-columns: 1fr; }
    .stats-band .stat-number { font-size: 38px; }
    .cta-band { padding: var(--spacing-2xl) var(--spacing-md); }
}


/* ============================================
   REFINEMENTS — arrow icons, images, spacing
   ============================================ */

/* Proper, consistently-sized inline arrow / chevron icons.
   (Inline SVGs without width/height would otherwise default to 300x150.) */
.card-link svg,
.dropdown-footer a svg,
.btn svg {
    width: 16px;
    height: 16px;
    flex-shrink: 0;
    display: inline-block;
    vertical-align: middle;
}

.btn svg { width: 18px; height: 18px; }

.card-link {
    transition: gap var(--transition-fast);
}

/* Subtle arrow nudge on hover for affordance */
.feature-card:hover .card-link,
.card-link:hover {
    gap: 8px;
}

/* Real imagery inside media frames and thumbnails */
.media-frame {
    padding: 0;
}

.media-frame img,
.media-img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    border-radius: inherit;
}

.project-thumb,
.post-thumb {
    position: relative;
    overflow: hidden;
}

.project-thumb img,
.post-thumb img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* Project thumb keeps a navy gradient scrim so the title stays legible */
.project-thumb::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg, rgba(7, 26, 46, 0.15) 0%, rgba(7, 26, 46, 0.78) 100%);
}

.project-thumb .thumb-label {
    position: relative;
    z-index: 1;
}

/* ============================================
   HOME — full-screen video hero: responsive
   ============================================ */

@media (max-width: 1024px) {
    .hero--video .hero-content { max-width: 540px; }
    .hero--video .glass-card { transform: scale(0.92); }
    .hero--video .glass-card:hover { transform: translateY(-5px) scale(0.95); }
    .hero--video .gc-a { right: 5%; }
    .hero--video .gc-d { right: 4%; }
    .hero--video .gc-b { right: 16%; }
    .hero--video .gc-c { right: 5%; }
    .hero--video .gc-e { right: 8%; }
}

@media (max-width: 768px) {
    .hero.hero--video {
        min-height: 86vh;
        padding: var(--spacing-2xl) 0;
    }

    /* Stronger, evenly-dark overlay so text stays readable over the video */
    .hero--video .hero-overlay {
        background:
            radial-gradient(circle at 80% 18%, rgba(14, 118, 253, 0.22) 0%, rgba(14, 118, 253, 0) 55%),
            linear-gradient(180deg, rgba(3, 12, 22, 0.58) 0%, rgba(3, 12, 22, 0.34) 45%, rgba(3, 12, 22, 0.78) 100%);
    }

    .hero--video .hero-content { max-width: 100%; }

    /* KPI cards leave the floating layer and become an in-flow glass row */
    .hero-kpis {
        position: static;
        inset: auto;
        display: flex;
        flex-wrap: wrap;
        gap: 12px;
        margin-top: var(--spacing-lg);
        pointer-events: auto;
    }

    .hero--video .glass-card {
        position: static;
        transform: none;
        animation: fadeInUp 0.7s ease-out both;
    }

    .hero--video .glass-card:hover { transform: translateY(-4px); }

    /* Only the three numeric KPIs on mobile */
    .hero--video .gc-d,
    .hero--video .gc-e { display: none; }

    .hero--video .gc-kpi {
        flex: 1 1 0;
        min-width: 0;
        padding: 13px 14px;
    }
    .hero--video .gc-kpi .kpi-value { font-size: 26px; }
    .hero--video .gc-kpi .kpi-label { font-size: 12px; }

    /* Stack CTAs full-width */
    .hero--video .hero-ctas {
        flex-direction: column;
        align-items: stretch;
    }
    .hero--video .hero-ctas .btn { width: 100%; }

    /* Scroll indicator hidden when the layout is content-tall */
    .hero-scroll { display: none; }
}

@media (max-width: 480px) {
    .hero--video .gc-kpi { padding: 11px 12px; }
    .hero--video .gc-kpi .kpi-value { font-size: 23px; }
    .hero--video .gc-kpi .kpi-label { font-size: 11px; }
}

/* ============================================
   HOME — industry image tiles
   ============================================ */

.industry-tile {
    display: flex;
    flex-direction: column;
    background: var(--white);
    border-radius: var(--radius-xl);
    overflow: hidden;
    box-shadow: var(--shadow-md);
    text-decoration: none;
    transition: box-shadow var(--transition-normal), transform var(--transition-normal);
}

/* photo on top */
.industry-tile img {
    width: 100%;
    height: 190px;
    object-fit: cover;
    display: block;
    transition: transform 0.6s ease;
}

.industry-tile:hover {
    transform: translateY(-6px);
    box-shadow: var(--shadow-xl);
}
.industry-tile:hover img { transform: scale(1.05); }

/* readable text content below the photo */
.industry-tile .it-body {
    padding: 20px 22px 24px;
}
.industry-tile h3 {
    color: var(--primary);
    margin: 0 0 6px;
    font-size: 19px;
}
.industry-tile p {
    color: var(--medium-grey);
    font-size: 14px;
    line-height: 1.55;
    margin: 0 0 12px;
}
.industry-tile .it-arrow {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--secondary);
    font-size: 14px;
    font-weight: 600;
}
.industry-tile .it-arrow svg { width: 15px; height: 15px; }

/* Wide image CTA tile that fills the empty grid cells */
.industry-cta {
    grid-column: span 2;
    position: relative;
    display: flex;
    align-items: flex-end;
    min-height: 320px;
    border-radius: var(--radius-xl);
    overflow: hidden;
    box-shadow: var(--shadow-md);
    text-decoration: none;
    transition: box-shadow var(--transition-normal), transform var(--transition-normal);
}
.industry-cta img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.6s ease;
}
.industry-cta::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(115deg, rgba(6, 22, 38, 0.92) 0%, rgba(6, 22, 38, 0.6) 55%, rgba(6, 22, 38, 0.2) 100%);
}
.industry-cta:hover { transform: translateY(-6px); box-shadow: var(--shadow-xl); }
.industry-cta:hover img { transform: scale(1.05); }
.industry-cta .ic-body { position: relative; z-index: 1; padding: var(--spacing-xl); max-width: 460px; }
.industry-cta .ic-body .eyebrow { color: var(--accent-light); }
.industry-cta h3 { color: var(--white); font-size: 24px; margin: 0 0 8px; }
.industry-cta p { color: rgba(255, 255, 255, 0.82); font-size: 14px; line-height: 1.6; margin: 0 0 14px; }
.industry-cta .it-arrow { display: inline-flex; align-items: center; gap: 8px; color: var(--white); font-weight: 600; }
.industry-cta .it-arrow svg { width: 16px; height: 16px; }

@media (max-width: 900px) { .industry-cta { grid-column: span 2; } }
@media (max-width: 560px) { .industry-cta { grid-column: span 1; min-height: 260px; } }

/* ============================================
   HOME — horizontal process flow (stepper)
   ============================================ */

.process-flow {
    display: flex;
    align-items: flex-start;
}

.process-step {
    flex: 1;
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: 0 14px;
}

/* connecting line from each node back to the previous one */
.process-step::before {
    content: "";
    position: absolute;
    top: 27px;
    left: -50%;
    width: 100%;
    height: 3px;
    background: linear-gradient(90deg, var(--secondary), var(--accent));
    opacity: 0.35;
    z-index: 0;
}
.process-step:first-child::before { display: none; }

.ps-node {
    position: relative;
    z-index: 1;
    width: 54px;
    height: 54px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 20px;
    color: var(--white);
    background: linear-gradient(135deg, var(--secondary), var(--accent));
    box-shadow: 0 0 0 6px rgba(14, 118, 253, 0.08);
    margin-bottom: var(--spacing-lg);
    transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.process-step:hover .ps-node {
    transform: translateY(-4px) scale(1.05);
    box-shadow: 0 8px 18px rgba(14, 118, 253, 0.25);
}

.ps-content h3 {
    font-size: 18px;
    margin: 0 0 6px;
}
.ps-content p {
    font-size: 13px;
    color: var(--medium-grey);
    margin: 0;
    line-height: 1.55;
}

@media (max-width: 900px) {
    .process-flow {
        flex-direction: column;
        gap: var(--spacing-lg);
        padding-left: var(--spacing-xs);
    }
    .process-step {
        flex-direction: row;
        align-items: flex-start;
        text-align: left;
        gap: var(--spacing-md);
        padding: 0;
    }
    .process-step::before {
        top: calc(-1 * var(--spacing-lg));
        left: 27px;
        width: 3px;
        height: var(--spacing-lg);
        opacity: 0.5;
    }
    .ps-node {
        margin-bottom: 0;
        flex-shrink: 0;
    }
}

/* ============================================
   ABOUT — team, testimonial, certifications
   ============================================ */

.team-card {
    background: var(--white);
    padding: var(--spacing-xl);
    border-radius: var(--radius-xl);
    border: 1px solid var(--border-color);
    text-align: center;
    transition: all var(--transition-normal);
}
.team-card:hover {
    box-shadow: var(--shadow-lg);
    transform: translateY(-6px);
    border-color: var(--secondary);
}
.team-avatar {
    width: 88px;
    height: 88px;
    border-radius: 50%;
    margin: 0 auto var(--spacing-md);
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 30px;
    color: var(--white);
    background: linear-gradient(135deg, var(--secondary), var(--accent));
}
.team-card h3 { font-size: 18px; margin: 0 0 4px; }
.team-card p { font-size: 14px; color: var(--medium-grey); margin: 0; }

/* Principle / value cards with numbered or icon header */
.num-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    border-radius: var(--radius-md);
    background: linear-gradient(135deg, rgba(14,118,253,0.12), rgba(0,200,163,0.12));
    color: var(--secondary);
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 18px;
    margin-bottom: var(--spacing-xs);
}

/* Testimonial */
.testimonial {
    max-width: 860px;
    margin: 0 auto;
    text-align: center;
    position: relative;
}
.testimonial .quote-mark {
    font-family: var(--font-display);
    font-size: 80px;
    line-height: 0.7;
    color: var(--accent);
    opacity: 0.35;
}
.testimonial blockquote {
    font-family: var(--font-display);
    font-size: 28px;
    line-height: 1.4;
    color: var(--primary);
    margin: var(--spacing-sm) 0 var(--spacing-lg);
    font-weight: 500;
}
.testimonial cite {
    font-style: normal;
    font-size: 15px;
    color: var(--medium-grey);
    font-weight: 600;
}

/* Certifications */
.cert-grid {
    display: flex;
    flex-wrap: wrap;
    gap: var(--spacing-sm);
    justify-content: center;
}
.cert-item {
    padding: 10px 20px;
    border: 1px solid var(--border-color);
    border-radius: 100px;
    background: var(--white);
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 14px;
    color: var(--primary);
    box-shadow: var(--shadow-sm);
}

@media (max-width: 768px) {
    .testimonial blockquote { font-size: 22px; }
}


.clients-section{
    padding:var(--spacing-3xl) 0;
    background:#fff;
    overflow:hidden;
}

/* Clients band on a light page.
   The section is white on the homepage, where it follows the dark hero and
   separates itself. On a page whose neighbours are already white it needs its
   own tint — and because .client-card is #f7f8fb, a tinted band would swallow
   the cards, so they flip to white here and pick up a soft shadow instead. */
.clients-section-alt { background: #F4F7FB; }
.clients-section-alt .client-card {
    background: #fff;
    box-shadow: 0 2px 10px rgba(6, 22, 38, 0.06);
}

.clients-section .shr-title{
    text-align:center;
}

.clients-section h2{
    font-size:42px;
    margin-top:12px;
    font-weight:700;
}

.clients-section h2 span{
    color:#2f6fd2;
}

.clients-slider{
    margin-top:60px;
    overflow:hidden;
}

.clients-track{
    display:flex;
    gap:28px;
    width:max-content;
    animation:scrollClients 35s linear infinite;
}

.client-card{
    width:180px;
    height:110px;
    background:#f7f8fb;
    border-radius:14px;
    display:flex;
    align-items:center;
    justify-content:center;
    flex-shrink:0;
    transition:.3s;
}

.client-card:hover{
    transform:translateY(-6px);
    box-shadow:0 15px 35px rgba(0,0,0,.08);
}

.client-card img{
    max-width:130px;
    max-height:60px;
    object-fit:contain;
    transition:transform .3s;
}

.client-card:hover img{
    transform:scale(1.06);
}

@keyframes scrollClients{

    from{
        transform:translateX(0);
    }

    to{
        transform:translateX(-50%);
    }

}

@media(max-width:768px){

.client-card{
    width:140px;
    height:90px;
}

.client-card img{
    max-width:90px;
}

.clients-section h2{
    font-size:30px;
}

}

/* ============================================
   DARK / LIGHT SECTION BALANCE (final polish)
   Backgrounds & text legibility only — layout,
   structure, spacing and content are unchanged.
   Mirrors the existing dark surfaces (.cta-band /
   .page-hero) using only the brand navy.

   Two mechanisms, no HTML edits:
   1. Homepage bespoke sections (.why-us, .process)
      + the reusable .section-dark utility.
   2. Inner pages (scoped via main:has(.page-hero),
      which excludes the homepage's .hero) flip their
      alternating .section-alt bands from light-grey
      to dark navy — the site was already authored to
      alternate .section / .section-alt, so this yields
      a clean White -> Dark -> White -> Dark rhythm.
      No page has two consecutive .section-alt, so this
      never produces 3+ dark bands in a row.
   ============================================ */

/* ---- 1. Dark section backgrounds ---- */
.section-dark,
.why-us,
.process,
main:has(.page-hero) .section-alt {
    background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%);
    color: rgba(255, 255, 255, 0.82);
}

/* Hairline divider so the two consecutive dark homepage
   sections (why-us + process) read as distinct bands */
.process {
    border-top: 1px solid rgba(255, 255, 255, 0.08);
}

/* ---- 2. On-dark text legibility ---- */
.section-dark :where(h2, h3, h4, h5),
.why-us :where(h2, h3, h4, h5),
.process :where(h2, h3, h4, h5),
main:has(.page-hero) .section-alt :where(h2, h3, h4, h5) {
    color: var(--white);
}

.section-dark :where(p, li, .lead),
.why-us :where(p, li, .lead),
.process :where(p, li, .lead),
main:has(.page-hero) .section-alt :where(p, li, .lead, blockquote, cite) {
    color: rgba(255, 255, 255, 0.82);
}

.section-dark .eyebrow,
.why-us .eyebrow,
.process .eyebrow,
main:has(.page-hero) .section-alt .eyebrow {
    color: var(--accent-light);
}

/* FAQ accordion on dark */
main:has(.page-hero) .section-alt .accordion-item {
    border-bottom-color: rgba(255, 255, 255, 0.14);
}
main:has(.page-hero) .section-alt .accordion-trigger {
    color: var(--white);
}
main:has(.page-hero) .section-alt .accordion-trigger .icon {
    color: var(--accent-light);
}

/* ---- 3. White cards keep their light styling on dark ----
   (re-assert readable dark text inside the white surfaces so
   the section-level lightening above does not bleed into them) */
main:has(.page-hero) .section-alt :is(
    .feature-card, .detail-aside, .stat-box, .team-card, .cert-item,
    .service-card, .industry-card, .post-card, .project-card,
    .form-card, .kpi-card, .logo-item) {
    color: var(--dark-grey);
}
main:has(.page-hero) .section-alt :is(
    .feature-card, .detail-aside, .team-card, .service-card,
    .industry-card, .post-card, .project-card) :where(h2, h3, h4, h5) {
    color: var(--primary);
}
main:has(.page-hero) .section-alt :is(
    .feature-card, .detail-aside, .team-card, .service-card,
    .industry-card, .post-card, .project-card, .form-card) :where(p, li) {
    color: var(--medium-grey);
}

/* ---- 4. Stats bands sit directly on the navy (no card),
   so brighten the numbers/labels for contrast ---- */
main:has(.page-hero) .section-alt .stats-band .stat-number {
    color: var(--accent-light);
}
main:has(.page-hero) .section-alt .stats-band .stat-label {
    color: rgba(255, 255, 255, 0.78);
}

/* ---- 5. Secondary buttons stay legible on dark (matches .page-hero) ---- */
.section-dark .btn-secondary,
.why-us .btn-secondary,
.process .btn-secondary,
main:has(.page-hero) .section-alt .btn-secondary {
    color: var(--white);
    border-color: rgba(255, 255, 255, 0.55);
}
.section-dark .btn-secondary:hover,
.why-us .btn-secondary:hover,
.process .btn-secondary:hover,
main:has(.page-hero) .section-alt .btn-secondary:hover {
    background: var(--white);
    color: var(--primary);
    border-color: var(--white);
}
/* ============================================
   MODULAR SKIDS — skid system catalogue
   Light band carrying white cards: the spec lists are dense, so they need a
   light surface, and the tint separates the band from the white sections
   either side of it.
   ============================================ */

.skids-catalog { background: #F4F7FB; }

.skid-card {
    background: var(--white);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-xl);
    box-shadow: 0 10px 34px rgba(6, 22, 38, 0.06);
    padding: var(--spacing-xl);
    overflow: hidden;
}
.skid-card + .skid-card { margin-top: var(--spacing-xl); }

/* ---- top half: photo beside the description ---- */
.skid-head {
    display: grid;
    grid-template-columns: minmax(0, 0.85fr) minmax(0, 1fr);
    gap: var(--spacing-xl);
    align-items: center;
}
/* Alternate the photo side so a run of four cards doesn't read as a list. */
.skid-card:nth-child(even) .skid-media { order: 2; }

.skid-media {
    border-radius: var(--radius-lg);
    overflow: hidden;
    background: #EEF3FA;
}
.skid-media img {
    display: block;
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: cover;
}
.skid-intro h3 {
    font-size: 26px;
    color: var(--primary);
    margin: 6px 0 12px;
}
.skid-intro p {
    color: var(--medium-grey);
    line-height: 1.7;
    margin: 0 0 var(--spacing-md);
}

/* ---- bottom half: the three spec columns ---- */
.skid-specs {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--spacing-lg);
    margin-top: var(--spacing-lg);
    padding-top: var(--spacing-lg);
    border-top: 1px solid var(--border-color);
}
.skid-spec h4 {
    font-family: var(--font-display);
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 1px;
    text-transform: uppercase;
    color: var(--secondary);
    margin: 0 0 14px;
}
.skid-spec ul { list-style: none; margin: 0; padding: 0; }
.skid-spec li {
    position: relative;
    padding-left: 16px;
    margin-bottom: 10px;
    font-size: 14.5px;
    line-height: 1.5;
    color: var(--medium-grey);
}
/* Square marker rather than a bullet — reads as a datasheet, not prose. */
.skid-spec li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 8px;
    width: 5px;
    height: 5px;
    border-radius: 1px;
    background: var(--accent);
}
.skid-spec li b {
    display: block;
    font-weight: 600;
    color: var(--dark-grey);
}

@media (max-width: 900px) {
    .skid-card { padding: var(--spacing-lg); }
    .skid-head { grid-template-columns: 1fr; gap: var(--spacing-lg); }
    /* Stacked, the photo always leads — the alternating order only makes
       sense while the two sit side by side. */
    .skid-card:nth-child(even) .skid-media { order: 0; }
    .skid-specs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
    .skid-card { padding: var(--spacing-md); }
    .skid-intro h3 { font-size: 21px; }
    .skid-specs { grid-template-columns: 1fr; gap: var(--spacing-md); }
}

/* ============================================
   TESTIMONIALS — slider
   A scroll-snap track rather than a transform carousel: with no JS it stays a
   perfectly usable horizontally-scrollable list, and it keeps native touch
   and keyboard scrolling for free.
   ============================================ */

.tslider { position: relative; }

.tslider-track {
    display: flex;
    align-items: stretch;
    gap: var(--spacing-lg);
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    /* .tcard lifts 5px on hover and carries a shadow — the padding stops the
       overflow container clipping either, and the negative margin keeps the
       cards optically aligned with the section above. */
    padding: 6px 6px 12px;
    margin: -6px -6px -12px;
    scrollbar-width: none;
    -ms-overflow-style: none;
}
.tslider-track::-webkit-scrollbar { display: none; }

/* Three across on desktop; the gap is subtracted so the third card ends flush
   with the container rather than spilling. */
.tslider-track > .tcard {
    flex: 0 0 calc((100% - var(--spacing-lg) * 2) / 3);
    scroll-snap-align: start;
}

.tslider-nav {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--spacing-md);
    margin-top: var(--spacing-lg);
}
.ts-arrow {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border: 1px solid var(--border-color);
    border-radius: 50%;
    background: var(--white);
    color: var(--primary);
    cursor: pointer;
    transition: background var(--transition-fast), border-color var(--transition-fast),
                color var(--transition-fast), opacity var(--transition-fast);
}
.ts-arrow svg { width: 16px; height: 16px; }
.ts-arrow:hover:not(:disabled) {
    background: var(--secondary);
    border-color: var(--secondary);
    color: var(--white);
}
.ts-arrow:disabled { opacity: 0.35; cursor: default; }

.ts-dots { display: flex; align-items: center; gap: 8px; }
.ts-dot {
    width: 8px;
    height: 8px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: #C7D5E6;
    cursor: pointer;
    transition: background var(--transition-fast), width var(--transition-fast),
                border-radius var(--transition-fast);
}
.ts-dot.active {
    width: 22px;
    border-radius: 4px;
    background: var(--secondary);
}

@media (max-width: 992px) {
    .tslider-track > .tcard { flex-basis: calc((100% - var(--spacing-lg)) / 2); }
}
@media (max-width: 640px) {
    .tslider-track > .tcard { flex-basis: 100%; }
}
@media (prefers-reduced-motion: reduce) {
    .tslider-track { scroll-behavior: auto; }
}

/* ============================================
   PROJECTS — card body + collapsible scope
   Each project carries a scope list of 7–21 items. Printing them all inline
   would bury the cards, so they sit in a native <details>: closed by default,
   no JS needed, and still present for search engines and Ctrl+F.
   ============================================ */

.project-desc {
    font-size: 14px;
    color: var(--medium-grey);
    line-height: 1.6;
    margin: 0;
}
.project-result {
    font-size: 13.5px;
    color: var(--dark-grey);
    line-height: 1.55;
    margin: 10px 0 0;
}
.project-result b { color: var(--primary); }



/* ============================================
   PROJECTS — cards and detail dialog
   ============================================ */

/* Every card is a grid row of its own, so the thumbnail, the tag, the title
   and the footer link all sit on the same baseline across a row — that
   alignment is what the old cards lacked. `1fr` on the description is what
   pins the footer link to the bottom of every card regardless of copy length. */
.project-card {
    display: grid;
    grid-template-rows: auto 1fr;
    cursor: pointer;
    /* accent per sector, defaulting to the brand blue */
    --prj-accent: var(--secondary);
    --prj-accent-soft: #EAF2FD;
}
.project-card[data-category~="pharmaceutical"] { --prj-accent: #1E7A5A; --prj-accent-soft: #E3F3EC; }
.project-card[data-category~="oil-gas"]        { --prj-accent: #B45A12; --prj-accent-soft: #FBEEE1; }
.project-card[data-category~="specialty"]      { --prj-accent: #6B3FA0; --prj-accent-soft: #F0E9F8; }
.project-card[data-category~="research"]       { --prj-accent: #0F6E8C; --prj-accent-soft: #E2F1F6; }

/* The sector colour as a rule along the bottom edge — the one place the card
   carries its category as colour rather than as another line of text. */
.project-card::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 3px;
    background: var(--prj-accent);
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.project-card { position: relative; }
.project-card:hover::after,
.project-card:focus-visible::after { transform: scaleX(1); }
.project-card:focus-visible {
    outline: 2px solid var(--prj-accent);
    outline-offset: 3px;
}

.project-card .project-thumb { aspect-ratio: 16 / 10; }
.project-card .project-thumb img { transition: transform 600ms cubic-bezier(0.22, 0.61, 0.36, 1); }
.project-card:hover .project-thumb img { transform: scale(1.05); }
/* The thumbnail no longer carries the title, so it needs only a light wash to
   keep it from competing with the card body. */
.project-card .project-thumb::after {
    background: linear-gradient(180deg, rgba(7, 26, 46, 0) 55%, rgba(7, 26, 46, 0.22) 100%);
}

/* The sector tag rides on the thumbnail rather than opening the body. It puts
   the category colour over the image where the eye already is, and it gives
   the body back a line so the card can lead with its title. Opaque rather
   than tinted, because it has to stay legible over seventeen different
   photographs. */
.project-thumb .tag {
    position: absolute;
    top: 12px;
    left: 12px;
    z-index: 2;                       /* above the thumbnail's gradient scrim */
    background: rgba(255, 255, 255, 0.94);
    color: var(--prj-accent);
    text-transform: uppercase;
    letter-spacing: 0.6px;
    font-size: 11px;
    font-weight: 700;
    padding: 5px 11px;
    box-shadow: 0 2px 8px rgba(7, 26, 46, 0.18);
    max-width: calc(100% - 24px);
}

.project-body {
    padding: var(--spacing-lg);
    display: flex;
    flex-direction: column;
    gap: 10px;
}

/* Fallback for a project card whose tag is still in the body rather than on
   the thumbnail - the home page's commented-out Featured Projects row is
   built that way, so it stays styled if it is ever switched back on. */
.project-body .tag-accent {
    align-self: flex-start;
    background: var(--prj-accent-soft);
    color: var(--prj-accent);
    text-transform: uppercase;
    letter-spacing: 0.6px;
    font-size: 11px;
    font-weight: 700;
}

/* Two lines reserved on the title and three on the description. The copy is
   uneven - titles run one or two lines, descriptions three to five, and one
   card in seventeen carries a Result line - so without a reserved block every
   card in a row started its meta, its copy and its footer at a different
   height. Now the whole grid lines up and the clamp keeps a long description
   from being the one that sets the row height. */
.project-body h3 {
    font-size: 19px;
    line-height: 1.3;
    margin: 0;
    text-wrap: balance;
    min-height: calc(19px * 1.3 * 2);
}

.project-meta {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.2px;
    color: var(--medium-grey);
    margin: 0;
}
.project-meta .meta-pin { width: 11px; height: 11px; flex-shrink: 0; color: var(--prj-accent); }

.project-desc {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    line-clamp: 3;
    overflow: hidden;
    min-height: calc(14px * 1.6 * 3);
    margin: 0;
}

/* An annotation, not a second card. The old filled block gave the one card
   that carries a Result far more weight than the sixteen that do not. */
.project-result {
    margin: 0;
    padding: 2px 0 2px 12px;
    border-left: 2px solid var(--prj-accent);
    font-size: 13px;
    line-height: 1.5;
}
.project-result b { color: var(--prj-accent); text-transform: uppercase; font-size: 11px; letter-spacing: 0.5px; }

.project-cta {
    display: flex;
    align-items: center;
    gap: 8px;
    /* pins the footer to the bottom now that .project-desc is a fixed block */
    margin-top: auto;
    padding-top: 14px;
    border-top: 1px solid var(--border-color);
    font-family: var(--font-display);
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 0.6px;
    text-transform: uppercase;
    color: var(--prj-accent);
}
.project-cta svg { width: 16px; height: 16px; margin-left: auto; transition: transform 300ms cubic-bezier(0.22, 0.61, 0.36, 1); }
.project-card:hover .project-cta svg { transform: translateX(5px); }

/* ---- detail dialog ---- */
.project-modal .modal-dialog {
    max-width: 620px;
    /* Defaults for the sector accent; JS copies the clicked card's own values
       over these so the dialog is coloured like the card it came from. */
    --prj-accent: var(--secondary);
    --prj-accent-soft: #EAF2FD;
}
.project-modal .tag-accent {
    display: inline-block;
    margin-bottom: 12px;
    background: var(--prj-accent-soft);
    color: var(--prj-accent);
    text-transform: uppercase;
    letter-spacing: 0.6px;
    font-size: 11px;
    font-weight: 700;
}
.project-modal .pm-scope-head { color: var(--prj-accent); }
.project-modal h3 { margin: 0 0 8px; font-size: 24px; line-height: 1.2; }
.pm-meta {
    font-size: 14px;
    color: var(--medium-grey);
    margin: 0 0 var(--spacing-md);
}
.pm-desc {
    font-size: 15px;
    line-height: 1.65;
    color: var(--dark-grey);
    margin: 0 0 var(--spacing-md);
}
.project-modal .project-result { margin-bottom: var(--spacing-md); }
.pm-scope-head {
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 0.6px;
    text-transform: uppercase;
    color: var(--secondary);
    margin: 0 0 12px;
    padding-top: var(--spacing-md);
    border-top: 1px solid var(--border-color);
}
.pm-scope {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px var(--spacing-lg);
}
.pm-scope li {
    position: relative;
    padding-left: 16px;
    font-size: 14px;
    line-height: 1.5;
    color: var(--medium-grey);
}
.pm-scope li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 7px;
    width: 5px;
    height: 5px;
    border-radius: 1px;
    background: var(--prj-accent);
}

@media (max-width: 560px) {
    .pm-scope { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
    .project-card::after,
    .project-card .project-thumb img,
    .project-cta svg { transition: none !important; }
    .project-card:hover .project-thumb img { transform: none; }
}

/* ============================================
   SERVICE PAGES — related services slider
   ============================================ */

/* Native horizontal scrolling with snap points rather than a transform track:
   touch swipe, trackpad and keyboard all come for free, and the card widths
   stay in CSS so the breakpoints are the only thing that decides how many are
   in view. The arrows just call scrollBy(). */
.rel-slider {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-lg);
}
.rel-track {
    display: flex;
    gap: var(--spacing-xl);
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    /* the cards carry a shadow (and the post cards a hover lift) that would
       otherwise be clipped by the scroller */
    padding: 8px 4px 8px;
    margin: -8px -4px -8px;
    /* Without this, scroll-snap aligns the first card to the scrollport edge
       rather than to the padding, resting at scrollLeft: 4 and shaving that
       padding straight back off - the first card lost its left border. */
    scroll-padding-left: 4px;
    scrollbar-width: none;
    -ms-overflow-style: none;
}
.rel-track::-webkit-scrollbar { display: none; }
.rel-track:focus-visible { outline: 2px solid var(--secondary); outline-offset: 4px; }

.rel-track > .feature-card,
.rel-track > .post-card {
    flex: 0 0 calc((100% - var(--spacing-xl) * 2) / 3);
    min-width: 0;
    scroll-snap-align: start;
}

.rel-controls {
    display: flex;
    justify-content: center;
    gap: 12px;
}
.rel-arrow {
    width: 44px;
    height: 44px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 1px solid var(--border-color);
    border-radius: 50%;
    background: var(--white);
    color: var(--primary);
    cursor: pointer;
    transition: background-color var(--transition-fast),
                border-color var(--transition-fast),
                color var(--transition-fast),
                opacity var(--transition-fast);
}
.rel-arrow svg { width: 16px; height: 16px; }
.rel-arrow:hover:not([disabled]) {
    background: var(--secondary);
    border-color: var(--secondary);
    color: var(--white);
}
.rel-arrow:focus-visible { outline: 2px solid var(--secondary); outline-offset: 3px; }
/* Disabled at the ends rather than wrapping: with a scroller, a jump back to
   the far end reads as a glitch instead of a loop. */
.rel-arrow[disabled] { opacity: 0.35; cursor: default; }

@media (max-width: 900px) {
    .rel-track > .feature-card,
    .rel-track > .post-card { flex-basis: calc((100% - var(--spacing-xl)) / 2); }
}
@media (max-width: 600px) {
    .rel-track { gap: var(--spacing-lg); }
    .rel-track > .feature-card,
    .rel-track > .post-card { flex-basis: 100%; }
}
@media (prefers-reduced-motion: reduce) {
    .rel-track { scroll-behavior: auto; }
    .rel-arrow { transition: none; }
}

/* Long deliverable lists run two-up once the column is wide enough to take
   them; below that they stay single file rather than wrapping every label. */
@media (min-width: 1100px) {
    .check-list.check-list-2col {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 0 var(--spacing-lg);
    }
    .check-list.check-list-2col li { break-inside: avoid; }
}

/* Engineering drawings are documents: shown whole rather than cropped to a
   photo ratio, and never scaled past their own pixel width, which is what
   keeps dimension callouts and tag text legible. The frame takes its height
   from the drawing, so there are no letterbox bands either. */
.media-frame.media-drawing {
    aspect-ratio: auto;
    max-width: 460px;
    margin-inline: auto;
    padding: 14px;
    background: var(--white);
}
.media-frame.media-drawing img {
    height: auto;
    max-width: 100%;
    object-fit: contain;
    border-radius: var(--radius-sm);
}

/* ============================================
   SPEC TABLES (technical data, materials)
   ============================================ */

/* Wide tables scroll inside their own box so the page body never scrolls
   sideways on a phone. */
.spec-scroll {
    overflow-x: auto;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    background: var(--white);
    box-shadow: var(--shadow-sm);
}
.spec-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 15px;
    line-height: 1.55;
    /* figures in the range column line up rather than drifting */
    font-variant-numeric: tabular-nums;
}
.spec-table thead th {
    text-align: left;
    font-family: var(--font-display);
    font-size: 12.5px;
    font-weight: 700;
    letter-spacing: 0.8px;
    text-transform: uppercase;
    color: var(--secondary);
    background: var(--light-grey);
    padding: 14px var(--spacing-lg);
    border-bottom: 1px solid var(--border-color);
    white-space: nowrap;
}
.spec-table tbody th {
    text-align: left;
    font-weight: 600;
    color: var(--primary);
    width: 34%;
    min-width: 190px;
    padding: 14px var(--spacing-lg);
    vertical-align: top;
}
.spec-table td {
    color: var(--medium-grey);
    padding: 14px var(--spacing-lg);
    vertical-align: top;
}
.spec-table tbody tr + tr th,
.spec-table tbody tr + tr td { border-top: 1px solid var(--border-color); }
.spec-table tbody tr:nth-child(odd) th,
.spec-table tbody tr:nth-child(odd) td { background: rgba(14, 118, 253, 0.025); }

@media (max-width: 560px) {
    .spec-table { font-size: 14px; }
    .spec-table thead th,
    .spec-table tbody th,
    .spec-table td { padding: 12px var(--spacing-md); }
}
