/* ═══════════════════════════════════════════════════════════════════════════
   ai-ops-hub.css
   Industry hub layout (6 instances: finance / sales / people / operations /
   engineering / marketing). All scoped under `.ai-ops-hub-body`. Inner
   classes use the `.ai-ops-hub-` prefix.

   Visual parity with home + use-case templates: dark Poppins theme, gradient
   buttons, glassmorphic cards. Compare-table reuses the home's
   `.ao-cell--us` / `.ao-cell-tick` pattern (renamed from --aiops to --us
   here so it matches the prototype semantic).

   Sources:
     Figma node 29129:620 (1440 × 6858 dark home of /finance/)
     Prototype HTML at ai-demos/.../wwwroot/{role}/index.html (light theme,
       used for content + section structure only)
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   LAYOUT PRIMITIVES — full-bleed sections, content max centered
   ═══════════════════════════════════════════════════════════════════════════ */
.ai-ops-hub-body .ai-ops-hub-section {
    position: relative;
    width: 100%;
    /* F-75 (2026-05-23): horizontal padding uses the same centered-anchor
       formula the hero override already uses. At ≤1640px viewports the
       calc resolves ≤ 64px and `max()` returns the flat 64px gutter
       (same behavior as before); at >1640px viewports every section's
       left/right edges align with the hero. Pre-F-75 the flat
       `var(--ao-section-pad-x)` left a visible "step" between hero and
       body sections on wide monitors. */
    padding-top:    var(--ao-section-pad-y);
    padding-bottom: var(--ao-section-pad-y);
    padding-left:   max(var(--ao-section-pad-x), calc(50% - var(--ao-design-half-width) + var(--ao-section-pad-x)));
    padding-right:  max(var(--ao-section-pad-x), calc(50% - var(--ao-design-half-width) + var(--ao-section-pad-x)));
    box-sizing: border-box;
}
.ai-ops-hub-body .ai-ops-hub-section > * {
    max-width: var(--ao-content-max);
    margin-left: auto;
    margin-right: auto;
}

/* Hero left-anchored, no right-anchor max */
.ai-ops-hub-body .ai-ops-hub-section--hero {
    padding-top: var(--ao-hero-pad-top);
    /* v0.1.46: bottom 80 → 100 to match home's section padding rhythm. */
    padding-bottom: var(--ao-section-pad-y);
    /* v1.0.26 (F-045): align hero content to the same x as the nav
       wordmark via the centered-1440 anchor (matches use-case Hero
       v1.0.5 F-023). Without this the hub hero stays at flat 100px
       padding while the nav wordmark drifts right at viewports >1480. */
    padding-left:  max(var(--ao-section-pad-x), calc(50% - var(--ao-design-half-width) + var(--ao-section-pad-x)));
    padding-right: max(var(--ao-section-pad-x), calc(50% - var(--ao-design-half-width) + var(--ao-section-pad-x)));
}

/* Section header — centered + left variants */
.ai-ops-hub-body .ai-ops-uc-shead {
    display: flex;
    flex-direction: column;
    gap: 16px;
    text-align: center;
    align-items: center;
    max-width: var(--ao-shead-max);
    margin: 0 auto 56px;
}
.ai-ops-hub-body .ai-ops-uc-shead > * { margin: 0 !important; }
.ai-ops-hub-body .ai-ops-hub-shead--center {
    align-items: center;
    text-align: center;
}
/* v0.1.47: .ai-ops-hub-h2 + .ai-ops-hub-shead-sub rules deleted — hub
   partials now use .ai-ops-h-h3 + .ai-ops-h-shead-sub (re-scoped to
   .ai-ops-body in home.css), so the same spec applies without
   duplication. Saves ~16 lines. */


/* ═══════════════════════════════════════════════════════════════════════════
   HUB BREADCRUMB — "Home › Finance" sits above the hero content frame.
   v0.1.32: lets visitors navigate up to home from any hub. Absolute-positioned
   at the top-left of the hero (matches the use-case template breadcrumb
   convention).
   ═══════════════════════════════════════════════════════════════════════════ */
.ai-ops-hub-body .ai-ops-hub-breadcrumb {
    position: absolute;
    top: var(--ao-breadcrumb-top);
    /* v1.3.8 (2026-05-18, UI-AUDIT UI-S03): the v1.3.4 `left: 0` assumed
       the containing block was the padding-box of the section, so `0`
       would land flush with the inside of the section's padding. That's
       true for plain `position: relative` containers, but the hub hero
       section uses an asymmetric dynamic `padding-left:
       max(var(--ao-section-pad-x), calc(50% - var(--ao-design-half-width)
       + var(--ao-section-pad-x)))` formula that anchors hero content to
       a centered design grid at viewports >1640. The browser's containing
       block for an absolutely-positioned descendant is the section's
       padding-box edge — but `left: 0` lands at the left padding-box edge
       (which equals padding-left=0 in viewport space, not where the hero
       text starts). At 2560px viewport, hero text starts at x≈524 while
       the breadcrumb was rendering at x=0 — a 524px misalignment caught
       by the 2026-05-18 UI audit on all 6 hubs. Match the hero's same
       formula so the breadcrumb tracks the hero content edge at every
       viewport. */
    left: max(var(--ao-section-pad-x), calc(50% - var(--ao-design-half-width) + var(--ao-section-pad-x)));
    display: inline-flex;
    align-items: center;
    gap: 12px;
    font-family: var(--ao-font);
    font-size: 16px;
    line-height: 1.7;
    letter-spacing: 0.32px;
    color: var(--ao-text-muted);
    z-index: 3;
}
.ai-ops-hub-body .ai-ops-hub-breadcrumb a {
    color: var(--ao-text-muted);
    text-decoration: none;
    transition: color 0.15s ease;
}
.ai-ops-hub-body .ai-ops-hub-breadcrumb a:hover {
    color: var(--ao-link-hover);
}
.ai-ops-hub-body .ai-ops-hub-breadcrumb-sep {
    color: var(--ao-text-faded);
}
.ai-ops-hub-body .ai-ops-hub-breadcrumb-current {
    color: var(--ao-text-primary);
    font-weight: 500;
}


/* ═══════════════════════════════════════════════════════════════════════════
   01 · HERO — eyebrow + H1 + sub + 2 CTAs + footnote + competitor note
   ═══════════════════════════════════════════════════════════════════════════ */
.ai-ops-hub-body .ai-ops-hub-section--hero {
    overflow: hidden;
    /* v1.0.25: section is transparent — `.ai-ops-uc-top` wrapper
       (shared.css) paints the gradient canvas covering Hero + Compare
       so the boundary between them is a continuous tonal slope. */
    background: transparent;
}
/* F-47 (2026-05-22, Stas direction): card-mode hero only. Bleed-mode
   sections carry both `--hero` AND `--hero-bg-video` and already set
   their own sizing via `aspect-ratio: 16/9 + min-height: 580px` (see
   bleed-mode rule below); we must NOT apply the card-mode cap to them.
   The `:not(--hero-bg-video)` guard keeps the two modes isolated.
   Card-mode hero is now a capped-height container so the recording
   can be absolutely positioned, pinned to the section's right edge,
   and stretched to the section's full height. `overflow: hidden`
   (above) clips any natural-width overflow on the left cleanly.
   `position: relative` is the anchor for the absolute video element. */
/* F-47 (2026-05-22, iteration 7 — full .ai-ops-uc-top background,
   FINALLY anchored correctly):
   The base rule `.ai-ops-hub-body .ai-ops-hub-section` (line 22) sets
   `position: relative` on EVERY hub section — that's why prior
   iterations of the video kept anchoring to the section instead of
   `.ai-ops-uc-top`. We explicitly flip the card-mode hero section
   back to `position: static` (higher specificity wins) so the
   absolute video wrapper walks up the DOM and lands on
   `.ai-ops-uc-top` (which is `position: relative` via
   `ai-ops-shared.css:544`). Bleed-mode is explicitly excluded via
   `:not(--hero-bg-video)` so its own positioning stays intact.
   The breadcrumb (also position:absolute) continues to anchor to
   `.ai-ops-uc-top` and lands at the same visual position because
   the section and `.ai-ops-uc-top` share the same left edge (no
   inset between them). */
.ai-ops-hub-body .ai-ops-uc-top {
    overflow: hidden;
}
.ai-ops-hub-body .ai-ops-hub-section--hero:not(.ai-ops-hub-section--hero-bg-video) {
    position: static;
    min-height: 580px;
}
.ai-ops-hub-body .ai-ops-hub-hero-inner {
    max-width: 620px;
    position: relative;
    z-index: 2;
    margin-left: 0;
}

/* Hero 2-column grid (Figma 29476:5452 et al — copy 620, mock 480, gap 80).
   F-105 (2026-05-10): at 1440 viewport, the 1180px grid sat inside a 1240px
   content area with 60px of slack on the right, so the mock image right-edge
   sat 60px short of where compare/benefits sections extend below. Adding
   `justify-content: space-between` pins the mock to the right edge of the
   content area, matching the right edge of every section below for a clean
   vertical scroll alignment. */
.ai-ops-hub-body .ai-ops-hub-hero-grid {
    /* F-47 (2026-05-22, iteration 6): `position: relative` REMOVED.
       It was creating a positioning context that stole the absolute
       video wrapper's anchor from `.ai-ops-uc-top`. The text column
       inside (`.ai-ops-hub-hero-inner`) still has its own
       `position: relative; z-index: 2` so it stays above the video.
       The grid stays as flexbox layout for the text content only —
       the video is no longer flowed inside it. */
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: 64px;
    /* v1.3.4 (2026-05-15): override the inherited `.ai-ops-hub-section > *
       { margin: 0 auto }` rule so the grid's left edge sits flush with the
       section's left padding instead of getting auto-centered inside the
       1280-wide content cap. Keeps hero copy aligned with the breadcrumb
       and the nav wordmark — all three share the same x position. */
    margin-left: 0;
}
/* F-47 (2026-05-22): text column flexes to fill remaining space; cap
   at 600px so the hero copy doesn't grow indefinitely on ultra-wide
   viewports. `min-width: 0` lets the column shrink below its content
   minimum when the visual demands more room. */
.ai-ops-hub-body .ai-ops-hub-hero-grid .ai-ops-hub-hero-inner {
    flex: 1 1 auto;
    min-width: 0;
    max-width: 600px;
}
.ai-ops-hub-body .ai-ops-hub-hero-visual {
    /* F-47 (2026-05-22, iteration 5 — full background): the video
       wrapper now covers the entire hero section (inset: 0 = top:0
       right:0 bottom:0 left:0). The video inside uses object-fit:
       cover with object-position: right so when cropping is needed
       to fill the section, the right-side content of the frame
       (the subject) stays visible. Pattern is identical to bleed-
       mode's `.ai-ops-hub-hero-bg-video` rule but kept under the
       card-mode selector chain so the existing bleed-mode rules
       are unaffected. */
    margin: 0;
    position: absolute;
    inset: 0;
}

/* v1.3.1: video variant — autoplay/muted/loop ambient scene on the right
   side of the hero. Pattern modeled on stand.chat: no controls chrome, the
   video reads as a "window" into a moment. The poster image (first frame)
   loads instantly while the mp4 streams in, so there's no flash of empty
   container. Subtle border-radius + 1px inner stroke + soft halo glow
   reinforces the "screen" feel. */
.ai-ops-hub-body .ai-ops-hub-hero-visual--video {
    /* F-47 (2026-05-22, iteration 3): card-style chrome (border-radius,
       glow shadow, 1px inner stroke) all removed — the video is now a
       background layer, not a window-style card. `position: absolute`
       reinforces the base wrapper's right-pin in case ordering shifts.
       The ::after border pseudo is also removed. */
    position: absolute;
    z-index: 0;
}
/* F-47 (2026-05-22, iteration 5 — full background): left-to-right
   darkening gradient covering the full section so the hero copy stays
   readable on top of the video background. Stronger on the left
   (where text lives) and fades to transparent on the right (where
   the recording's subject sits). Mirrors bleed-mode's overlay. */
.ai-ops-hub-body .ai-ops-hub-hero-visual--video::before {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(
        to right,
        rgba(16, 16, 16, 0.92) 0%,
        rgba(16, 16, 16, 0.75) 25%,
        rgba(16, 16, 16, 0.35) 55%,
        rgba(16, 16, 16, 0) 80%
    );
    z-index: 1;
    pointer-events: none;
}
.ai-ops-hub-body .ai-ops-hub-hero-video {
    /* F-47 (2026-05-22, iteration 5 — full background): fill the
       entire hero section. object-fit: cover scales the video to
       fully cover the section while preserving its aspect ratio
       (crops at edges that overflow). object-position: right keeps
       the right side of each frame visible when cropping is needed
       — the recordings frame their subjects on the right, so this
       preserves them. Standard CSS background-image: cover pattern. */
    display: block;
    width: 100%;
    height: 100%;
    max-width: none;
    aspect-ratio: auto;
    object-fit: cover;
    object-position: right center;
    /* Dark plate fills the bounding box before the first frame paints
       — also covers any letterboxing if a future recording ships at a
       non-16:9 ratio. */
    background: #0e0e0e;
    /* F-47: smooth in so the first paint is the dark plate (which matches
       the surrounding section), then the recording fades in once
       playback starts. JS orchestrator on the bleed variant already
       handles this; the card-mode video relied on autoplay's native
       transition which read as a flash on slow networks. */
    transition: opacity 280ms ease;
}

/* ───────────────────────────────────────────────────────────────────────
   v1.3.4 (Finance + People hubs): full-bleed BACKGROUND video variant.
   Pattern follows the Apple/Stripe/Linear hero — the video covers the
   entire hero section as a backdrop; the text floats on top with a
   horizontal darkening overlay on the text side for legibility.

   Replaces the earlier (v1.3.2) two-column right-side bleed which felt
   cropped at typical viewports.

   Architecture:
   ─ `<section class="...--hero-bg-video">` becomes positioning context
     with overflow hidden.
   ─ A direct-child `<video class="ai-ops-hub-hero-bg-video">` is absolute,
     fills the section via object-fit: cover, z-index 0.
   ─ A direct-child `<div class="ai-ops-hub-hero-bg-overlay">` is absolute,
     z-index 1, paints a left-to-right darkening gradient so the copy on
     the left half stays readable against any frame of the video.
   ─ Breadcrumb + hero-grid sit at z-index 2.
   ─ Hero-grid in bleed mode collapses to single column at full width;
     the inline figure is suppressed in the PHP partial (since the video
     is now the background, not a column).
   ─────────────────────────────────────────────────────────────────────── */
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video {
    position: relative;
    overflow: hidden;
    isolation: isolate; /* contain blend-mode children */
    /* v1.3.4: pin the hero to 16:9 so the video shows uncropped at the
       full width of the viewport. NO max-height — on short-height
       viewports the section grows taller than the visible viewport (user
       scrolls a touch) which is preferable to cropping the recording
       horizontally. A 580px min-height keeps the hero usable even on
       narrow viewports where 16:9 of the actual width would be too short. */
    aspect-ratio: 16 / 9;
    min-height: 580px;
}
/* Override the inherited `.ai-ops-hub-section > * { max-width: 1280px; margin: 0 auto; }`
   rule for the background layers — they MUST bleed past the section's
   left/right padding (which can be hundreds of pixels at wide viewports
   due to the centered design canvas anchor) to fill the viewport edge
   to edge. */
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video > .ai-ops-hub-hero-bg-video,
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video > .ai-ops-hub-hero-bg-poster,
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video > .ai-ops-hub-hero-bg-overlay {
    max-width: none;
    margin: 0;
}
/* Poster: scene-establishing still image. Visible at opacity 1 on load
   (instant first paint), fades to opacity 0 once the video plays. Stays
   visible as the permanent visual on mobile + reduced-motion. */
.ai-ops-hub-body .ai-ops-hub-hero-bg-poster {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
    z-index: 1;
    opacity: 1;
    transition: opacity 600ms ease-out;
    pointer-events: none;
    background: var(--ao-bg-deep, #0e0e0e);
}
.ai-ops-hub-body .ai-ops-hub-hero-bg-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
    z-index: 0;
    background: var(--ao-bg-deep, #0e0e0e);
    pointer-events: none;
    /* Starts hidden; .is-playing on section fades us in. */
    opacity: 0;
    transition: opacity 600ms ease-out;
}
/* JS sets .is-playing when video.play() resolves: crossfades poster out
   while video fades in. */
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video.is-playing .ai-ops-hub-hero-bg-video {
    opacity: 1;
}
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video.is-playing .ai-ops-hub-hero-bg-poster {
    opacity: 0;
}
/* v1.3.5 (2026-05-16): the <video> ships with `loop` — `ended` never
   fires, so the `.is-finished` hook from the prior freeze-on-last-frame
   handler was removed. Note retained for historical context. */
.ai-ops-hub-body .ai-ops-hub-hero-bg-overlay {
    position: absolute;
    inset: 0;
    z-index: 2;
    pointer-events: none;
    /* v1.3.4 (2026-05-15, third pass): standard video-hero gradient
       overlay (the stand.chat / Stripe / Apple-hero pattern). Calibration
       reflects the constraint that the video MODEL can't be forced to
       leave a dark left zone — Runway/Wan generators prioritize visual
       richness over composition rules, so the dashboard / figure keeps
       drifting left across iterations. CSS overlay is deterministic and
       lets us iterate without re-rendering.
       Stops:
         · 0–30%   heavy dark navy (75–92% opacity) — H1/sub/CTAs sit on
                   a near-solid backdrop here.
         · 30–50%  gradient transition — text fades into visible video.
         · 50–70%  light remnant — figure silhouette starts showing through.
         · 70–100% no overlay — FINANCE wordmark, window, agent at full
                   brightness.
       Color rgba(8, 12, 24) matches the site's dark-navy chrome so the
       overlay blends rather than reading as a "darkened" video.
       Per-page opt-out: the overlay div is suppressed in the partial when
       `hero_text_scrim_disabled` ACF field is true — for recordings that
       are intentionally graded for clean text overlay. */
    background:
        linear-gradient(
            to right,
            rgba(8, 12, 24, 0.97) 0%,
            rgba(8, 12, 24, 0.86) 30%,
            rgba(8, 12, 24, 0.42) 50%,
            rgba(8, 12, 24, 0.00) 70%
        );
}
/* Text-shadow safety net — guarantees readability if the gradient ever
   feels too light on a very bright frame (e.g., People hub's office scene).
   Soft, large-radius shadow that's invisible on dark backgrounds and
   adds just enough contrast on lighter ones. Scoped to bleed heroes so
   card-mode hero copy (which sits on the page bg, not on a video) keeps
   the cleaner shadowless typography. */
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video .ai-ops-hub-hero-h1 {
    text-shadow: 0 2px 12px rgba(0, 0, 0, 0.7);
}
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video .ai-ops-hub-hero-eyebrow,
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video .ai-ops-hub-hero-sub,
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video .ai-ops-hub-hero-foot {
    text-shadow: 0 1px 8px rgba(0, 0, 0, 0.6);
}
/* Lift breadcrumb + grid above poster, video, and overlay. */
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video > .ai-ops-hub-breadcrumb,
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video > .ai-ops-hub-hero-grid {
    position: relative;
    z-index: 3;
}
/* v1.3.4 (2026-05-15): in bleed mode the section gets aspect-ratio 16/9 +
   absolute child layers (poster, video, overlay) filling the padding box.
   This combination causes Chrome to resolve the absolute breadcrumb's
   `top: 98px` from INSIDE the section's content area (i.e., padding-top
   gets added on top of `top`), landing the breadcrumb at viewport y=278
   instead of the intended y=98 (~18px below the 80px nav) — on top of
   the H1. Subtracting `--ao-hero-pad-top` (180px) here back-calculates a
   `top: -82px` that lands at the intended viewport y=98. Non-bleed hubs
   resolve `top: 98` correctly without this override, so it stays scoped
   to the bleed selector. */
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video > .ai-ops-hub-breadcrumb {
    top: calc(var(--ao-breadcrumb-top) - var(--ao-hero-pad-top));
}
/* In bleed mode the inline figure column is suppressed by the partial,
   so collapse the grid to a single-column text frame at its natural
   620px max-width. */
.ai-ops-hub-body .ai-ops-hub-section--hero-bg-video .ai-ops-hub-hero-grid--bleed {
    grid-template-columns: minmax(0, 620px);
    justify-content: start;
    gap: 0;
}

/* Mobile: the hero is poster-only (no video fetch). Drop the 16:9 pin so
   the section can grow with content; the poster fills via object-fit
   cover but the section height tracks the text block. Steeper text-side
   overlay for legibility against any frame. */
@media (max-width: 767.98px) {
    .ai-ops-hub-body .ai-ops-hub-section--hero-bg-video {
        aspect-ratio: auto;
        min-height: 580px;
    }
    .ai-ops-hub-body .ai-ops-hub-hero-bg-video {
        display: none;
    }
    .ai-ops-hub-body .ai-ops-hub-hero-bg-overlay {
        background:
            linear-gradient(
                to right,
                rgba(10, 18, 38, 0.95) 0%,
                rgba(10, 18, 38, 0.88) 50%,
                rgba(10, 18, 38, 0.65) 80%,
                rgba(10, 18, 38, 0.35) 100%
            ),
            linear-gradient(
                to bottom,
                rgba(10, 18, 38, 0.0) 50%,
                rgba(10, 18, 38, 0.65) 100%
            );
    }
}

/* Accessibility: respect reduced-motion. Poster permanent, video skipped. */
@media (prefers-reduced-motion: reduce) {
    .ai-ops-hub-body .ai-ops-hub-hero-bg-video {
        display: none;
    }
}
.ai-ops-hub-body .ai-ops-hub-hero-eyebrow {
    margin: 0 0 24px;
}
.ai-ops-hub-body .ai-ops-hub-hero-eyebrow span {
    color: var(--ao-link);
}
.ai-ops-hub-body .ai-ops-hub-hero-h1 {
    font-family: var(--ao-font);
    font-size: 56px;
    font-weight: 700;
    /* v1.0.28 (F-A1/A2/A3): match Figma exactly — line-height 1.05,
       letter-spacing 2px, max-width 620px. Earlier v0.1.46 wider values
       (1.2 / 1.14 / 720) were tuned for readability but drift from
       Figma. */
    line-height: 1.05;
    letter-spacing: 2px;
    color: var(--ao-text-primary);
    max-width: 620px;
    margin: 0 0 24px;
}
.ai-ops-hub-body .ai-ops-hub-hero-sub {
    font-family: var(--ao-font);
    font-size: 19px;
    line-height: 1.55;
    letter-spacing: 0.38px;
    color: var(--ao-text-body);
    /* v1.0.28 (F-A3): max-width 720 → 620 to match Figma text frame. */
    max-width: 620px;
    margin: 0 0 36px;
}
.ai-ops-hub-body .ai-ops-hub-hero-sub strong {
    color: var(--ao-text-primary);
    font-weight: 600;
}
.ai-ops-hub-body .ai-ops-hub-hero-foot {
    margin: 32px 0 28px;
}
.ai-ops-hub-body .ai-ops-hub-hero-competitor {
    font-family: var(--ao-font);
    font-size: 14px;
    line-height: 1.6;
    letter-spacing: 0.28px;
    color: var(--ao-text-muted);
    max-width: 720px;
    margin: 0;
    /* v0.1.46: border solid blue (was faded 40% rgba) per prototype's
       .competitor-edge spec (figma-design.css :321-326). Crisper visual
       anchor than the faded variant. */
    border-left: 2px solid var(--ao-link);
    padding-left: 16px;
}


/* ═══════════════════════════════════════════════════════════════════════════
   02 · COMPARE TABLE — 4 cols × 6 rows; AI Ops column highlighted
   ═══════════════════════════════════════════════════════════════════════════ */
.ai-ops-hub-body .ai-ops-hub-section--compare {
    /* v1.0.29: compare section is transparent so the .ai-ops-uc-top
       wrapper's gradient backdrop flows continuously through both Hero
       AND Compare as one canvas — matches the use-case pattern (Hero +
       Three Steps both transparent, wrapper paints behind both).
       The table-wrap inside still gets its own elevated dark bg
       (#232428) so the table reads correctly on top of the gradient. */
    background: transparent;
}
/* v0.1.47: comparison table chrome lifted off the section bg per the
   prototype's .compare-table spec (figma-design.css :454-457). The wrap
   gets a raised dark bg (#232428) + 1px white-24% border + 16 radius;
   the table header row gets a darker bg (#0E0E0E) for clearer visual
   hierarchy. Cell padding 16 → 18×20 per prototype's .compare-table th/td. */
.ai-ops-hub-body .ai-ops-hub-cmp-wrap {
    border-radius: 16px;
    overflow: hidden;
    margin: 0 auto 32px;
    background: #232428;
    border: 1px solid rgba(255, 255, 255, 0.24);
}
.ai-ops-hub-body .ai-ops-hub-cmp-table {
    width: 100%;
    border-collapse: collapse;
    table-layout: fixed;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table th,
.ai-ops-hub-body .ai-ops-hub-cmp-table td {
    padding: 18px 20px;
    border-bottom: 1px solid var(--ao-bg-card-bord);
    text-align: left;
    vertical-align: middle;
    font-family: var(--ao-font);
    font-size: 16px;
    line-height: 1.7;
    letter-spacing: 0.32px;
    color: var(--ao-text-body);
}
.ai-ops-hub-body .ai-ops-hub-cmp-table thead th {
    background: #0E0E0E;
    color: #fff;
    font-weight: 700;
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: 0.28px;
    line-height: 1.4;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table thead th small {
    display: block;
    font-weight: 400;
    font-size: 12px;
    text-transform: none;
    letter-spacing: 0.24px;
    color: var(--ao-text-faded);
    margin-top: 4px;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table tbody th[scope="row"] {
    color: var(--ao-text-primary);
    font-weight: 500;
    font-size: 15px;
    width: 28%;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table .ao-cell--us {
    /* v1.0.28 (F-B1): tint hue indigo (rgba 79,107,255) → cyan
       (rgba 80,213,255) so it matches the brand gradient `#50d5ff`
       end of --ao-grad-primary instead of an unrelated purple. */
    background: rgba(80, 213, 255, 0.08);
    border-left: 0.5px solid #fff;
    border-right: 0.5px solid #fff;
    color: #fff;
    font-weight: 500;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table thead .ao-cell--us {
    border-top: 0.5px solid #fff;
    border-top-left-radius: 12px;
    border-top-right-radius: 12px;
}
/* F-098 (2026-05-10): the <small> qualifier inside the AI Ops column header
   was inheriting a faded color that failed WCAG AA on the light cyan-tinted
   background. Bump to 0.85 opacity white at 500 weight so axe-core clears
   the `color-contrast` serious violation. */
.ai-ops-hub-body .ai-ops-hub-cmp-table .ao-cell--us[scope="col"] > small,
.ai-ops-hub-body .ai-ops-hub-cmp-table .ao-cell--us small {
    color: rgba(255, 255, 255, 0.85);
    font-weight: 500;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table tbody tr:last-child .ao-cell--us {
    border-bottom: 0.5px solid #fff;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table .ao-cell-tick {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    margin-right: 6px;
    font-weight: 700;
    color: #34d399;
    flex-shrink: 0;
}
.ai-ops-hub-body .ai-ops-hub-cmp-table .ao-cell-text { display: inline; }
.ai-ops-hub-body .ai-ops-hub-cmp-foot {
    font-family: var(--ao-font);
    font-size: 16px;
    color: var(--ao-text-body);
    text-align: center;
    max-width: 700px;
    margin: 0 auto;
    line-height: 1.6;
}


/* ═══════════════════════════════════════════════════════════════════════════
   03 · BENEFITS — 2-col grid of glassmorphic workflow cards
   ═══════════════════════════════════════════════════════════════════════════ */
.ai-ops-hub-body .ai-ops-hub-section--benefits {
    background: var(--ao-bg-section);
}
/* v0.1.52: bumped to 3-col to match Figma 29129:1125 (Group 48096792 has
   3 columns × 8-10 cards). Was 2-col since v0.1.31, but Figma shows 3-col;
   correcting in this release. Below 940 the responsive rule at the bottom
   of the file collapses to 1-col. */
.ai-ops-hub-body .ai-ops-hub-benefits {
    display: grid;
    /* v1.0.26 (F-048): grid 3-col → 2-col per Figma. Cards become
       wider; copy reflows. Mobile responsive at <800 stays 1-col via
       the existing media query below. */
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 24px;
    margin: 0 auto 32px;
}
/* v1.0.26 (F-048): benefit card head flexes the icon frame + h3
   together with the icon at top-left. Icon frame is 56×56, gap 16
   to the heading. */
.ai-ops-hub-body .ai-ops-hub-benefit-head {
    display: flex;
    align-items: flex-start;
    gap: 16px;
    margin: 0 0 16px;
}
/* v0.1.47: benefit-card chrome + headline rules deleted — hub markup
   now uses .ai-ops-h-problem-card + .ai-ops-h-problem-card-h (re-scoped
   to .ai-ops-body) for the chrome and headline. Hub-only behavior
   (anchor link styling + card-link hover effects) stays below as
   .ai-ops-hub-benefit-card additive rules. Saves ~40 lines. */
.ai-ops-hub-body .ai-ops-hub-benefit-card {
    /* Anchor-link reset: hub benefit cards are <a> elements; the home
       .ai-ops-h-problem-card class assumes block-level cards. Override
       text-decoration + inherit color so the link rendering is clean. */
    text-decoration: none;
    color: inherit;
    transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
    /* v1.0.28 (F-C2): padding 32×40 → 24 per Figma benefit card spec.
       Cards become tighter, matching design proportions. */
    padding: 24px;
}
.ai-ops-hub-body .ai-ops-hub-benefit-card:hover {
    border-color: rgba(81, 161, 255, 0.4);
    transform: translateY(-2px);
    box-shadow: 0 8px 32px rgba(81, 161, 255, 0.18);
}
.ai-ops-hub-body .ai-ops-hub-benefit-p {
    font-family: var(--ao-font);
    /* v1.0.28 (F-C3): body 19 → 16 per Figma. Body de-emphasizes vs headline. */
    font-size: 16px;
    line-height: 1.7;
    letter-spacing: 0.32px;
    color: var(--ao-text-body);
    margin: 0;
}
.ai-ops-hub-body .ai-ops-hub-benefit-foot {
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: var(--ao-font);
    font-size: 14px;
    font-weight: 500;
    color: var(--ao-link);
    margin: auto 0 0;
}
.ai-ops-hub-body .ai-ops-hub-benefit-foot .ao-arrow {
    transition: transform 0.15s ease;
}
.ai-ops-hub-body .ai-ops-hub-benefit-card:hover .ao-arrow {
    transform: translateX(4px);
}
.ai-ops-hub-body .ai-ops-hub-benefits-foot {
    text-align: center;
    font-family: var(--ao-font);
    font-size: 16px;
    line-height: 1.6;
    color: var(--ao-text-muted);
    margin: 0 auto;
    max-width: 720px;
}
.ai-ops-hub-body .ai-ops-hub-benefits-foot a,
.ai-ops-hub-body .ai-ops-hub-foot-link {
    color: var(--ao-link);
    text-decoration: underline;
    transition: color 0.15s ease;
}
.ai-ops-hub-body .ai-ops-hub-benefits-foot a:hover,
.ai-ops-hub-body .ai-ops-hub-foot-link:hover {
    color: var(--ao-link-hover);
}


/* ═══════════════════════════════════════════════════════════════════════════
   04 · HOW [ROLE] TEAMS START — 3 numbered steps
   ═══════════════════════════════════════════════════════════════════════════ */
.ai-ops-hub-body .ai-ops-hub-section--start {
    background: var(--ao-bg-section);
}
.ai-ops-hub-body .ai-ops-hub-start-steps {
    display: flex;
    flex-direction: column;
    gap: 24px;
    max-width: 900px;
    margin: 0 auto;
}
/* v0.1.46: step card chrome aligned to home's card pattern (border #575757,
   padding 32×40); step number circle bumped 40→48 per prototype's .start-num
   (figma-design.css :441-450); step title 19→21/1.3/0.42 per prototype's
   .step-h3 (figma-design.css :585-591) — sits cleanly between body 19px
   and benefit-card headline 23px; step body line-height 1.7 → 1.6 to
   match home body rhythm. Step grid column widened 56→64 to host the
   bigger circle without crowding. */
.ai-ops-hub-body .ai-ops-hub-start-step {
    display: grid;
    grid-template-columns: 64px 1fr;
    gap: 24px;
    padding: 32px 40px;
    background: var(--ao-bg-card);
    border: 1px solid #575757;
    border-radius: var(--ao-card-radius);
    align-items: start;
}
.ai-ops-hub-body .ai-ops-hub-start-num {
    /* v1.0.28 (F-D2): step number circle 48 → 64 per Figma. Grid col
       is already 64 — circle now fills its column instead of centering
       inside half of it. Bumped font 19 → 23 to match the new size. */
    width: 64px;
    height: 64px;
    border-radius: 50%;
    background: var(--ao-grad-primary-tighter);
    color: var(--ao-button-dark);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-family: var(--ao-font);
    font-size: 23px;
    font-weight: 700;
    flex-shrink: 0;
}
.ai-ops-hub-body .ai-ops-hub-start-h {
    font-family: var(--ao-font);
    font-size: 21px;
    font-weight: 700;
    line-height: 1.3;
    letter-spacing: 0.42px;
    color: #fff;
    margin: 0 0 8px;
}
.ai-ops-hub-body .ai-ops-hub-start-p {
    font-family: var(--ao-font);
    font-size: 16px;
    line-height: 1.6;
    letter-spacing: 0.32px;
    color: var(--ao-text-body);
    margin: 0;
}


/* v0.1.47: mid-CTA rules deleted — hub partial now uses home's
   .ai-ops-h-section--midcta + .ai-ops-h-midcta-* classes (re-scoped
   to .ai-ops-body in home.css). Saves ~40 lines. */


/* ═══════════════════════════════════════════════════════════════════════════
   06 · BEFORE YOU ASK — 2×2 grid of callout cards
   ═══════════════════════════════════════════════════════════════════════════ */
/* v1.0.26 (F-050): pure CSS gradient bg (palette inspired by Figma
   29273:3292 Human Control section). No bg image. */
.ai-ops-hub-body .ai-ops-hub-section--callouts {
    background-color: var(--ao-bg-section);
    background-image:
        radial-gradient(ellipse 60% 70% at 92% 30%,
            rgba(80, 140, 200, 0.20)  0%,
            rgba(40,  80, 130, 0)    70%),
        radial-gradient(ellipse 60% 70% at 5% 70%,
            rgba(0, 0, 0, 0.30)  0%,
            rgba(0, 0, 0, 0)    70%);
    background-size: 100% 100%, 100% 100%;
    background-position: center, center;
    background-repeat: no-repeat;
}
.ai-ops-hub-body .ai-ops-hub-callouts {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
}
/* v1.0.26 (F-050): per-card colored bottom-edge gradient per Figma
   29320:5837/5839/5843/5841. Each card gets a different `--card-tint`
   via :nth-of-type. Card 1 blue, 2 purple, 3 green, 4 orange.
   Gradient: linear-gradient(180deg, transparent 55.223% → tint 100%)
   at opacity 0.3 (per Figma rectangle node spec). */
.ai-ops-hub-body .ai-ops-hub-callout {
    position: relative;
    overflow: hidden;
}
.ai-ops-hub-body .ai-ops-hub-callout::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg,
        rgba(23, 25, 29, 0)  55.223%,
        var(--card-tint)    100%);
    opacity: 0.3;
    pointer-events: none;
    border-radius: inherit;
    z-index: 0;
}
.ai-ops-hub-body .ai-ops-hub-callout > * {
    position: relative;
    z-index: 1;
}
.ai-ops-hub-body .ai-ops-hub-callout:nth-of-type(1) { --card-tint: rgba( 81, 161, 255, 0.5); }
.ai-ops-hub-body .ai-ops-hub-callout:nth-of-type(2) { --card-tint: rgba(151,  81, 255, 0.5); }
.ai-ops-hub-body .ai-ops-hub-callout:nth-of-type(3) { --card-tint: rgba( 28, 211, 116, 0.5); }
.ai-ops-hub-body .ai-ops-hub-callout:nth-of-type(4) { --card-tint: rgba(255, 127,  81, 0.5); }
/* v0.1.47: callout chrome + headline rules deleted — hub markup now
   uses .ai-ops-h-problem-card + .ai-ops-h-problem-card-h directly.
   Saves ~30 lines. Only the body paragraph stays (no home equivalent
   for "card body paragraph" exact spec). */
.ai-ops-hub-body .ai-ops-hub-callout-p {
    font-family: var(--ao-font);
    font-size: 19px;
    line-height: 1.6;
    letter-spacing: 0.38px;
    color: var(--ao-text-body);
    margin: 0;
}


/* ═══════════════════════════════════════════════════════════════════════════
   07 · ENGAGE — two-column form (mirrors home engage section)
   ═══════════════════════════════════════════════════════════════════════════ */
.ai-ops-hub-body .ai-ops-hub-section--engage {
    /* v1.0.25: engage gradient parity with use-case engage (v1.0.23
       F-040). Top + bottom both resolve to #1a1a1a so the section
       blends into Human Control above and Footer below at every
       viewport. */
    overflow: hidden;
    background-color: #1a1a1a;
    background-image:
        radial-gradient(ellipse 60% 70% at 92% 30%,
            rgba(80, 140, 200, 0.25)  0%,
            rgba(40,  80, 130, 0)    70%),
        radial-gradient(ellipse 60% 70% at 5% 70%,
            rgba(0, 0, 0, 0.40)  0%,
            rgba(0, 0, 0, 0)    70%),
        linear-gradient(180deg,
            #1a1a1a   0%,
            #181a25  20%,
            #161a2c  45%,
            #14182e  60%,
            #181a25  80%,
            #1a1a1a 100%);
    background-size: 100% 100%, 100% 100%, 100% 100%;
    background-position: center, center, center;
    background-repeat: no-repeat;
}
.ai-ops-hub-body .ai-ops-hub-engage-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 80px;
    align-items: start;
}
.ai-ops-hub-body .ai-ops-hub-engage-left {
    display: flex;
    flex-direction: column;
    gap: 24px;
}
.ai-ops-hub-body .ai-ops-hub-engage-left .ai-ops-hub-h2 {
    text-align: left;
}
.ai-ops-hub-body .ai-ops-hub-engage-sub {
    font-family: var(--ao-font);
    font-size: 16px;
    line-height: 1.7;
    letter-spacing: 0.32px;
    color: var(--ao-text-body);
    margin: 0;
}
.ai-ops-hub-body .ai-ops-hub-engage-trust {
    list-style: none;
    margin: 12px 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 12px;
}
.ai-ops-hub-body .ai-ops-hub-engage-trust li {
    display: flex;
    align-items: center;
    gap: 14px;
    font-family: var(--ao-font);
    font-size: 16px;
    font-weight: 500;
    line-height: 1.7;
    letter-spacing: 0.32px;
    color: #fff;
}
.ai-ops-hub-body .ai-ops-hub-engage-trust .ao-cell-tick {
    color: #34d399;
    font-weight: 700;
    width: 18px;
    flex-shrink: 0;
}

.ai-ops-hub-body .ai-ops-hub-engage-form {
    display: flex;
    flex-direction: column;
    gap: 24px;
}
.ai-ops-hub-body .ai-ops-hub-field {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.ai-ops-hub-body .ai-ops-hub-field-label {
    font-family: var(--ao-font);
    font-size: 14px;
    font-weight: 500;
    line-height: 1.55;
    color: #fff;
}
.ai-ops-hub-body .ai-ops-hub-engage-form input,
.ai-ops-hub-body .ai-ops-hub-engage-form textarea {
    font-family: var(--ao-font);
    font-size: 16px;
    line-height: 1.7;
    letter-spacing: 0.32px;
    color: #fff;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid var(--ao-bg-card-bord);
    border-radius: 8px;
    padding: 12px 24px;
    box-sizing: border-box;
    width: 100%;
    transition: border-color 0.15s ease, background 0.15s ease;
}
.ai-ops-hub-body .ai-ops-hub-engage-form input { height: 44px; }
.ai-ops-hub-body .ai-ops-hub-engage-form textarea { resize: vertical; min-height: 96px; }
.ai-ops-hub-body .ai-ops-hub-engage-form input::placeholder,
.ai-ops-hub-body .ai-ops-hub-engage-form textarea::placeholder {
    color: var(--ao-text-faded);
}
.ai-ops-hub-body .ai-ops-hub-engage-form input:focus,
.ai-ops-hub-body .ai-ops-hub-engage-form textarea:focus {
    outline: none;
    border-color: var(--ao-link);
    background: rgba(81, 161, 255, 0.06);
}
.ai-ops-hub-body .ai-ops-hub-engage-submit {
    align-self: flex-start;
    margin-top: 8px;
}
.ai-ops-hub-body .ai-ops-hub-engage-status {
    font-family: var(--ao-font);
    font-size: 14px;
    line-height: 1.7;
    color: var(--ao-text-body);
    margin: 0;
    min-height: 1.7em;
}


/* ═══════════════════════════════════════════════════════════════════════════
   RESPONSIVE
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 1100px) {
    .ai-ops-hub-body .ai-ops-hub-section {
        padding-left: 32px;
        padding-right: 32px;
    }
    .ai-ops-hub-body .ai-ops-hub-cmp-table th,
    .ai-ops-hub-body .ai-ops-hub-cmp-table td {
        font-size: 14px;
        padding: 12px 8px;
    }
    /* F-104 (2026-05-10): breadcrumb was pinned to the centered-1440 anchor
       (`left: max(...)`) — fine on desktop but at narrow viewports it sits at
       x=100 while the hero text reflows to the section's reduced padding-left
       (32px). Re-align it with the hero margin so all hero elements share a
       common left edge below 1100px. */
    .ai-ops-hub-body .ai-ops-hub-breadcrumb {
        left: 32px;
    }
}
@media (max-width: 940px) {
    .ai-ops-hub-body .ai-ops-hub-h2 { font-size: 32px; line-height: 1.2; }
    .ai-ops-hub-body .ai-ops-hub-hero-h1 { font-size: 40px; line-height: 1.1; }
    /* F-47 (2026-05-22): on tablet (≤940) the section drops the
       absolute-positioned video model and reverts to a stacked single-
       column layout. Section height un-caps so content (text + the
       video flowed below it) can determine its own size. Video pulls
       out of absolute positioning, runs full column width, and uses
       its intrinsic 16:9 aspect ratio so it doesn't take huge vertical
       space at narrow viewports. */
    .ai-ops-hub-body .ai-ops-hub-section--hero {
        position: static;
        height: auto;
        min-height: 0;
        max-height: none;
    }
    .ai-ops-hub-body .ai-ops-hub-hero-grid {
        flex-direction: column;
        align-items: stretch;
        gap: 40px;
    }
    .ai-ops-hub-body .ai-ops-hub-hero-grid .ai-ops-hub-hero-inner {
        max-width: 100%;
    }
    .ai-ops-hub-body .ai-ops-hub-hero-visual {
        position: static;
        width: 100%;
    }
    .ai-ops-hub-body .ai-ops-hub-hero-video {
        width: 100%;
        height: auto;
        aspect-ratio: 16 / 9;
    }
    .ai-ops-hub-body .ai-ops-hub-benefits,
    .ai-ops-hub-body .ai-ops-hub-callouts,
    .ai-ops-hub-body .ai-ops-hub-engage-grid {
        grid-template-columns: 1fr;
        gap: 16px;
    }
    .ai-ops-hub-body .ai-ops-hub-cta-break {
        flex-direction: column;
        align-items: stretch;
        text-align: center;
    }
    .ai-ops-hub-body .ai-ops-hub-cmp-wrap {
        overflow-x: auto;
        margin-left: -16px;
        margin-right: -16px;
        padding: 0 16px;
    }
    .ai-ops-hub-body .ai-ops-hub-cmp-table {
        min-width: 720px;
    }
}

/* v1.0.36 (audit F-084): tighter mobile step for hero H1, mirroring home. */
@media (max-width: 480px) {
    .ai-ops-hub-body .ai-ops-hub-hero-h1 {
        font-size: 32px;
        line-height: 1.15;
        letter-spacing: 0.6px;
    }
    .ai-ops-hub-body .ai-ops-hub-h2 {
        font-size: 26px;
        line-height: 1.2;
    }
    /* On phones the device-mock visual adds vertical bulk without value;
       drop it to keep the hero short. Copy + CTAs carry the load. */
    .ai-ops-hub-body .ai-ops-hub-hero-visual {
        display: none;
    }
}
