/*
 * gpd/cms — Public site stylesheet ("Editorial Workshop")
 * --------------------------------------------------------
 * Companion to the admin theme + editor stylesheet. Same tokens, same
 * typography pair, applied to the public-facing site chrome (header,
 * footer, layout) and the 25 built-in block partials.
 *
 * Brand tokens (`--brand-*`, served at /brand.css) remain authoritative
 * for colour. The editorial layer here adds typography, spacing,
 * hairline rules, and motion that work on top of any brand palette.
 *
 * Light + dark variants ship side-by-side. By default the public site
 * respects the visitor's `prefers-color-scheme`; consumers can opt out
 * by setting `data-cms-theme="light"` on <html>, or build their own
 * toggle and persist via the same `cms:theme` localStorage key the
 * editor uses.
 *
 * Wire-up (in your app.css, after Tailwind):
 *
 *     @import "tailwindcss";
 *     @import "../../vendor/gpd/cms/resources/css/cms.css";
 *     @import "../../vendor/gpd/cms/resources/css/cms-public.css";
 *
 * Layer architecture:
 *   The entire stylesheet is wrapped in @layer base (declared first in
 *   cms.css as `@layer base, tokens, template-overrides, page-overrides`).
 *   Unlayered consumer CSS retains the highest priority. Per-record overrides
 *   emitted by StyleOverrideRenderer into template-overrides / page-overrides
 *   beat base without needing !important.
 *
 * @import must appear before any other rules (CSS spec §6.3). The font
 * import therefore lives outside @layer base; everything else is inside.
 */

@import url('https://fonts.bunny.net/css?family=fraunces:400,500,600,700,400i,500i,600i|ibm-plex-sans:300,400,500,600|ibm-plex-mono:400,500&display=swap');

@layer base {

/* -----------------------------------------------------------------
 * 1. Tokens — light (default) and dark (system pref OR data-attr)
 * ----------------------------------------------------------------- */
:root {
    /*
     * Foundational palette and typography derive from brand tokens
     * (served at /brand.css) when defined, falling back to the package's
     * "Editorial Workshop" defaults. A site that publishes brand tokens
     * via the admin overrides these automatically — no edits needed.
     *
     * Mapping:
     *   --cms-paper, --cms-paper-2, --cms-paper-3 → --brand-bg, --brand-bg-light, --brand-bg-lighter
     *   --cms-ink, --cms-ink-dim, --cms-ink-muted → --brand-text, --brand-text-light, --brand-text-muted
     *   --cms-rule → --brand-border
     *   --cms-font-display/sans/mono → --brand-font-heading/body/mono
     */
    --cms-paper:        var(--brand-bg, #faf8f4);
    --cms-paper-2:      var(--brand-bg-light, #f4f0e7);
    --cms-paper-3:      var(--brand-bg-lighter, #ede8db);
    --cms-elevated:     var(--brand-bg-light, #ffffff);

    --cms-ink:          var(--brand-text, #15171c);
    --cms-ink-strong:   var(--brand-text, #0a0b0e);
    --cms-ink-dim:      var(--brand-text-light, #4f535d);
    --cms-ink-muted:    var(--brand-text-muted, #8b8e98);
    --cms-ink-faint:    var(--brand-text-muted, #b2b3bb);

    --cms-rule:         var(--brand-border, #e8e2d3);
    --cms-rule-strong:  var(--brand-border, #cdc6b3);

    --cms-accent-public:    var(--brand-primary, #2238c2);
    --cms-on-accent-public: var(--brand-on-primary, #ffffff);

    /* Scheme-aware text/link tokens — overridable per-Section via the
     * [data-cms-bg="dark"] selector so dark-background sections get
     * adapted text/link colors automatically without per-block CSS. */
    --cms-text:         #15171c;
    --cms-text-strong:  #0a0b0e;
    --cms-text-muted:   #6b7280;
    --cms-link:         var(--brand-primary, #2238c2);
    --cms-link-hover:   var(--brand-primary, #2238c2);

    /* Shared typography scale. All blocks reference these instead of
     * hardcoding sizes / spacing — gives a single place to tune, and
     * lets contexts (Column compact mode, etc.) override the scale
     * for everything inside without per-block CSS.
     *
     * Sizes use clamp() for fluid scaling: smaller floor on mobile,
     * larger ceiling on desktop. Removes hard breakpoint cliffs in
     * typography. The vw-based middle term scales linearly between. */
    --cms-text-size-xs:     clamp(0.6875rem, 0.625rem + 0.25vw, 0.75rem);
    --cms-text-size-sm:     clamp(0.8125rem, 0.75rem + 0.25vw, 0.875rem);
    --cms-text-size:        clamp(0.9375rem, 0.875rem + 0.25vw, 1rem);
    --cms-text-size-lg:     clamp(1rem, 0.9375rem + 0.5vw, 1.125rem);

    --cms-heading-size-sm:  clamp(0.9375rem, 0.875rem + 0.5vw, 1rem);
    --cms-heading-size:     clamp(1rem, 0.875rem + 0.625vw, 1.125rem);
    --cms-heading-size-lg:  clamp(1.25rem, 1rem + 1vw, 1.5rem);
    --cms-heading-size-xl:  clamp(1.5rem, 1rem + 2vw, 2rem);

    --cms-line-height:        1.5;
    --cms-line-height-tight:  1.25;
    --cms-line-height-loose:  1.65;

    --cms-spacing-y-xs:     0.25rem;
    --cms-spacing-y-sm:     0.5rem;
    --cms-spacing-y:        0.75rem;
    --cms-spacing-y-lg:     1.25rem;
    --cms-spacing-y-xl:     2rem;

    --cms-shadow-sm:    0 1px 0 0 rgba(20, 22, 28, .04);
    --cms-shadow:       0 8px 28px -16px rgba(20, 22, 28, .14);
    --cms-shadow-lg:    0 24px 56px -32px rgba(20, 22, 28, .22);

    --cms-ease:     cubic-bezier(0.32, 0.72, 0, 1);
    --cms-dur:      180ms;
    --cms-dur-long: 320ms;

    --cms-font-display: var(--brand-font-heading, 'Fraunces', 'Iowan Old Style', 'Georgia', serif);
    --cms-font-sans:    var(--brand-font-body, 'IBM Plex Sans', system-ui, sans-serif);
    --cms-font-mono:    var(--brand-font-mono, 'IBM Plex Mono', 'SF Mono', monospace);

    --cms-radius-xs: 4px;
    --cms-radius-sm: 6px;
    --cms-radius:    10px;
    --cms-radius-lg: 14px;
    --cms-radius-xl: 18px;

    /* Default section width — block partials use these for max-width */
    --cms-content-width:  60rem;
    --cms-content-wide:   72rem;
    --cms-content-narrow: 42rem;

    /* Default vertical rhythm */
    --cms-section-y:  4.5rem;
    --cms-section-y-sm: 2.5rem;
    --cms-section-y-lg: 6.5rem;
}

/*
 * Dark-mode overrides — same brand-token-first pattern. When brand tokens
 * are defined, they win regardless of light/dark mode (a brand identity
 * is absolute, not mode-conditional). Sites without brand tokens still
 * get the editorial dark palette as a fallback. Sites that genuinely
 * need separate light/dark brand palettes can override these rules
 * directly in their own stylesheet.
 */
@media (prefers-color-scheme: dark) {
    :root:not([data-cms-theme="light"]) {
        --cms-paper:        var(--brand-bg, #0c0e12);
        --cms-paper-2:      var(--brand-bg-light, #14171d);
        --cms-paper-3:      var(--brand-bg-lighter, #1a1d24);
        --cms-elevated:     var(--brand-bg-light, #1a1d24);

        --cms-ink:          var(--brand-text, #f0eadc);
        --cms-ink-strong:   var(--brand-text, #ffffff);
        --cms-ink-dim:      var(--brand-text-light, #a0a4ae);
        --cms-ink-muted:    var(--brand-text-muted, #686c76);
        --cms-ink-faint:    var(--brand-text-muted, #45495a);

        --cms-rule:         var(--brand-border, #20242c);
        --cms-rule-strong:  var(--brand-border, #2d323d);

        --cms-shadow-sm:    0 1px 0 0 rgba(0, 0, 0, .25);
        --cms-shadow:       0 12px 36px -16px rgba(0, 0, 0, .55);
        --cms-shadow-lg:    0 32px 72px -32px rgba(0, 0, 0, .8);
    }
}

[data-cms-theme="dark"] {
    --cms-paper:        var(--brand-bg, #0c0e12);
    --cms-paper-2:      var(--brand-bg-light, #14171d);
    --cms-paper-3:      var(--brand-bg-lighter, #1a1d24);
    --cms-elevated:     var(--brand-bg-light, #1a1d24);

    --cms-ink:          var(--brand-text, #f0eadc);
    --cms-ink-strong:   var(--brand-text, #ffffff);
    --cms-ink-dim:      var(--brand-text-light, #a0a4ae);
    --cms-ink-muted:    var(--brand-text-muted, #686c76);
    --cms-ink-faint:    var(--brand-text-muted, #45495a);

    --cms-rule:         var(--brand-border, #20242c);
    --cms-rule-strong:  var(--brand-border, #2d323d);

    --cms-shadow-sm:    0 1px 0 0 rgba(0, 0, 0, .25);
    --cms-shadow:       0 12px 36px -16px rgba(0, 0, 0, .55);
    --cms-shadow-lg:    0 32px 72px -32px rgba(0, 0, 0, .8);
}

/* -----------------------------------------------------------------
 * 1.5. WORKAROUND: Re-resolve brand-token-derived vars on a second
 * :root rule so they pick up the actual brand values from /brand.css.
 * The original :root rule (above) declares these as
 * `var(--brand-*, fallback)` — but Chrome appears to lock those to
 * the fallback when --brand-* isn't present at parse time of THAT
 * specific :root rule. Re-declaring identically in a SECOND :root
 * rule resolves correctly because var() lookup happens after both
 * sheets have contributed to :root.
 *
 * Without this block, sites with brand tokens get cms-public.css's
 * editorial defaults (#15171c text, #faf8f4 paper) instead of their
 * brand text/bg colors. The ink color cascade is the most painful —
 * dark-on-dark in any section using brand-bg.
 * ----------------------------------------------------------------- */
:root {
    --cms-paper:        var(--brand-bg, #faf8f4);
    --cms-paper-2:      var(--brand-bg-light, #f4f0e7);
    --cms-paper-3:      var(--brand-bg-lighter, #ede8db);
    --cms-elevated:     var(--brand-bg-light, #ffffff);

    --cms-ink:          var(--brand-text, #15171c);
    --cms-ink-strong:   var(--brand-text, #0a0b0e);
    --cms-ink-dim:      var(--brand-text-light, #4f535d);
    --cms-ink-muted:    var(--brand-text-muted, #8b8e98);
    --cms-ink-faint:    var(--brand-text-muted, #b2b3bb);

    --cms-rule:         var(--brand-border, #e8e2d3);
    --cms-rule-strong:  var(--brand-border, #cdc6b3);

    /* Scheme-aware text/link tokens — light scheme defaults. */
    --cms-text:         var(--brand-text, #15171c);
    --cms-text-strong:  var(--brand-text, #0a0b0e);
    --cms-text-muted:   var(--brand-text-muted, #6b7280);
    --cms-link:         var(--brand-primary, #2238c2);
    --cms-link-hover:   var(--brand-primary, #2238c2);

    /* Re-declare the typography scale here too so the workaround
     * block fully replaces the original :root for these tokens.
     * Fluid sizing via clamp() — see comment above for rationale. */
    --cms-text-size-xs:     clamp(0.6875rem, 0.625rem + 0.25vw, 0.75rem);
    --cms-text-size-sm:     clamp(0.8125rem, 0.75rem + 0.25vw, 0.875rem);
    --cms-text-size:        clamp(0.9375rem, 0.875rem + 0.25vw, 1rem);
    --cms-text-size-lg:     clamp(1rem, 0.9375rem + 0.5vw, 1.125rem);

    --cms-heading-size-sm:  clamp(0.9375rem, 0.875rem + 0.5vw, 1rem);
    --cms-heading-size:     clamp(1rem, 0.875rem + 0.625vw, 1.125rem);
    --cms-heading-size-lg:  clamp(1.25rem, 1rem + 1vw, 1.5rem);
    --cms-heading-size-xl:  clamp(1.5rem, 1rem + 2vw, 2rem);

    --cms-line-height:        1.5;
    --cms-line-height-tight:  1.25;
    --cms-line-height-loose:  1.65;

    --cms-spacing-y-xs:     0.25rem;
    --cms-spacing-y-sm:     0.5rem;
    --cms-spacing-y:        0.75rem;
    --cms-spacing-y-lg:     1.25rem;
    --cms-spacing-y-xl:     2rem;
}

/* -----------------------------------------------------------------
 * 1.7. Density override (data-cms-density="compact")
 *
 * Column blocks emit data-cms-density="compact" because columns are
 * inherently narrower contexts where blog-post-scale typography
 * (1.0625rem body, 2.25rem h1) feels oversized. Compact mode shrinks
 * the entire scale uniformly so footer columns, sidebar columns, and
 * any narrow-context placement get appropriate sizing without
 * per-block CSS. Everything inside cascades.
 * ----------------------------------------------------------------- */
[data-cms-density="compact"] {
    --cms-text-size-xs:     clamp(0.625rem, 0.5625rem + 0.25vw, 0.6875rem);
    --cms-text-size-sm:     clamp(0.75rem, 0.6875rem + 0.25vw, 0.8125rem);
    --cms-text-size:        clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem);
    --cms-text-size-lg:     clamp(0.9375rem, 0.875rem + 0.25vw, 1rem);

    --cms-heading-size-sm:  clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem);
    --cms-heading-size:     clamp(1rem, 0.9375rem + 0.25vw, 1.0625rem);
    --cms-heading-size-lg:  clamp(1.125rem, 1rem + 0.5vw, 1.25rem);
    --cms-heading-size-xl:  clamp(1.25rem, 1rem + 1vw, 1.5rem);

    --cms-line-height:        1.45;
    --cms-line-height-loose:  1.55;

    --cms-spacing-y-xs:     0.1875rem;
    --cms-spacing-y-sm:     0.375rem;
    --cms-spacing-y:        0.5rem;
    --cms-spacing-y-lg:     0.875rem;
    --cms-spacing-y-xl:     1.5rem;
}

/* -----------------------------------------------------------------
 * 1.8. Container queries — Section establishes context, Row/Nav adapt
 *
 * Container queries respond to the parent ELEMENT's width, not the
 * viewport. This means the same Row works correctly whether it's in
 * a 1200px section or a 320px sidebar — without per-block media
 * queries. Baseline-supported across browsers (Chrome 105+, Firefox
 * 110+, Safari 16+).
 *
 * Section establishes the container context. Row stacks columns
 * when the container is below ~700px (typical "tablet portrait or
 * smaller"). Navigation switches horizontal→vertical at ~600px.
 * ----------------------------------------------------------------- */
.cms-block-section {
    container-type: inline-size;
    container-name: cms-section;
}

@container cms-section (max-width: 700px) {
    /* Stack columns vertically when the section is narrow. The
     * `mobileStack` field on Row gates this — sites that want a
     * 4-column layout to stay 4-column on mobile (e.g. logo strip)
     * can disable mobileStack.
     *
     * !important is necessary because Row's blade view emits
     * flex-direction/flex/max-width as inline `style` attributes,
     * which beat external CSS rules without !important. The
     * alternative is moving every Row layout prop to a class
     * modifier — bigger refactor; revisit when adding more
     * responsive overrides. */
    .cms-block-row.cms-block-row--mobile-stack {
        flex-direction: column !important;
    }
    .cms-block-row.cms-block-row--mobile-stack > .cms-block-column {
        flex: 1 1 100% !important;
        max-width: 100% !important;
    }
    /* Mobile-reverse-order */
    .cms-block-row.cms-block-row--mobile-reverse {
        flex-direction: column-reverse !important;
    }
}

@container cms-section (max-width: 768px) {
    /* When the section is narrow, hide the inline horizontal nav and
     * reveal the hamburger toggle. The drawer markup is always in
     * the DOM (Alpine x-show toggles it) so revealing the toggle is
     * enough — the drawer panel itself is position:fixed and lives
     * outside the container query world.
     *
     * Vertical-orientation navs keep their inline layout — they're
     * already a stacked list, no collapse needed. */
    .cms-block-nav:not(.cms-block-nav--vertical) .cms-block-nav__inline {
        display: none;
    }
    .cms-block-nav:not(.cms-block-nav--vertical) .cms-block-nav__toggle {
        display: inline-flex;
    }

    /* Hamburger is the universal mobile-nav-on-the-right pattern.
     * When the nav collapses, override the editor's `align` (which
     * controls expanded-state alignment) and push the toggle to the
     * right edge of the section using auto margins. Works whether
     * or not the optional heading is present (with heading: heading
     * on left, hamburger on right; without: hamburger on right). */
    .cms-block-nav:not(.cms-block-nav--vertical) {
        align-items: center;
        padding-block: var(--cms-spacing-y-sm);
    }
    .cms-block-nav:not(.cms-block-nav--vertical) .cms-block-nav__toggle {
        margin-left: auto;
    }
}

/* -----------------------------------------------------------------
 * 1.9. Section padding scales fluidly with viewport width
 *
 * Section's hardcoded padding sizes (8/16/32/64px for sm/md/lg/xl)
 * felt cramped on mobile and stingy on desktop. Use clamp() with
 * vw-based middle term so padding shrinks to ~half on phone and
 * grows to ~150% on wide desktop without any breakpoint cliffs.
 * Scoped to the Section block so other blocks keep their own
 * padding scales.
 * ----------------------------------------------------------------- */
.cms-block-section {
    --cms-section-pad-sm:  clamp(0.375rem, 0.25rem + 0.5vw, 0.5rem);
    --cms-section-pad-md:  clamp(0.75rem, 0.5rem + 1vw, 1rem);
    --cms-section-pad-lg:  clamp(1rem, 0.5rem + 2vw, 2rem);
    --cms-section-pad-xl:  clamp(1.5rem, 0.75rem + 3vw, 4rem);
}

/* -----------------------------------------------------------------
 * 1.6. Section scheme overrides (data-cms-bg="dark" / "light")
 *
 * Section blocks emit `data-cms-bg="light"` or `data-cms-bg="dark"`
 * based on their bgScheme prop (or auto-detected luminance of
 * bgColor). Descendant prose / nav / company-contact rules read
 * `--cms-text`, `--cms-text-muted`, `--cms-link` via cascade — so
 * dark sections automatically invert their child text without
 * per-block CSS.
 *
 * Both selectors explicitly redeclare the scheme tokens so that
 * a nested section flips the token chain cleanly regardless of its
 * ancestor's context (e.g. a light section inside a dark section
 * restores light values; relying on inheritance alone would keep
 * the dark values active).
 *
 * Text tokens use SCHEME-SPECIFIC brand tokens (--brand-text-on-light,
 * --brand-text-on-dark, etc.) rather than the generic --brand-text.
 * Reason: a brand whose primary design is dark-mode would set
 * --brand-text to a light colour, which would then resolve the
 * [data-cms-bg="light"] override back to a light value — defeating
 * the scheme flip. Scheme-specific tokens let brands opt-in to
 * per-scheme overrides without colliding with the generic token.
 * Fallbacks are hardcoded so out-of-the-box brands get correct
 * defaults without setting anything.
 *
 * The following brand tokens are recognised by the scheme overrides
 * (all optional — hardcoded fallbacks apply when unset):
 *   --brand-text-on-light, --brand-text-on-dark
 *   --brand-text-strong-on-light, --brand-text-strong-on-dark
 *   --brand-text-muted-on-light, --brand-text-muted-on-dark
 *   --brand-elevated-on-light, --brand-elevated-on-dark
 *   --brand-rule-on-light, --brand-rule-on-dark
 *   --brand-rule-strong-on-light, --brand-rule-strong-on-dark
 *
 * Surface tokens (--cms-elevated, --cms-rule, --cms-rule-strong) also flip
 * with scheme so cards / inputs / borders nested inside a scheme-overridden
 * section get a surface that contrasts against the section's declared bg
 * rather than the page-level default. Without this, an input on a light
 * section embedded in a dark-scheme page would render its dark elevated
 * surface alongside the section's light bg, with text now flipped dark —
 * collapsing to dark-on-dark and erasing the input visually.
 *
 * The legacy --cms-ink-* chain (ink / ink-strong / ink-dim / ink-muted /
 * ink-faint) used by older block CSS is aliased to the text chain inside
 * each scheme block so it flips with data-cms-bg too. The 5-step ink
 * gradation collapses to 3 steps in scheme-flipped contexts (dim, muted,
 * faint all map to --cms-text-muted) — acceptable since the unscoped
 * baseline keeps the original gradation, and most user-facing text uses
 * ink or ink-strong (which have direct text-* analogs).
 * ----------------------------------------------------------------- */
[data-cms-bg="dark"] {
    --cms-text:         var(--brand-text-on-dark, #e8e8e8);
    --cms-text-strong:  var(--brand-text-strong-on-dark, #ffffff);
    --cms-text-muted:   var(--brand-text-muted-on-dark, #a0a4ae);
    --cms-link:         var(--brand-primary, #FFB627);
    --cms-link-hover:   var(--brand-accent-orange, #b84a00);
    /* Surface tokens — flip with scheme so cards/inputs contrast correctly. */
    --cms-elevated:     var(--brand-elevated-on-dark, #1a1d24);
    --cms-rule:         var(--brand-rule-on-dark, #20242c);
    --cms-rule-strong:  var(--brand-rule-strong-on-dark, #2d323d);
    /* Legacy --cms-ink-* chain — alias to text-* so it flips with scheme */
    --cms-ink:          var(--cms-text);
    --cms-ink-strong:   var(--cms-text-strong);
    --cms-ink-dim:      var(--cms-text-muted);
    --cms-ink-muted:    var(--cms-text-muted);
    --cms-ink-faint:    var(--cms-text-muted);
}

[data-cms-bg="light"] {
    --cms-text:         var(--brand-text-on-light, #15171c);
    --cms-text-strong:  var(--brand-text-strong-on-light, #0a0b0e);
    --cms-text-muted:   var(--brand-text-muted-on-light, #6b7280);
    --cms-link:         var(--brand-primary, #2238c2);
    --cms-link-hover:   var(--brand-primary, #2238c2);
    /* Surface tokens — flip with scheme so cards/inputs contrast correctly. */
    --cms-elevated:     var(--brand-elevated-on-light, #ffffff);
    --cms-rule:         var(--brand-rule-on-light, #e8e2d3);
    --cms-rule-strong:  var(--brand-rule-strong-on-light, #cdc6b3);
    /* Legacy --cms-ink-* chain — alias to text-* so it flips with scheme */
    --cms-ink:          var(--cms-text);
    --cms-ink-strong:   var(--cms-text-strong);
    --cms-ink-dim:      var(--cms-text-muted);
    --cms-ink-muted:    var(--cms-text-muted);
    --cms-ink-faint:    var(--cms-text-muted);
}

/* -----------------------------------------------------------------
 * 2. Body baseline
 * ----------------------------------------------------------------- */
.cms-public-body {
    background-color: var(--cms-paper);
    color: var(--cms-ink);
    font-family: var(--cms-font-sans);
    font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11', 'ss01';
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
    transition: background-color var(--cms-dur-long) var(--cms-ease),
                color var(--cms-dur-long) var(--cms-ease);
}

/* -----------------------------------------------------------------
 * 3. Site header — refined editorial bar
 * ----------------------------------------------------------------- */
.cms-site-header {
    position: sticky;
    top: 0;
    z-index: 40;
    background-color: color-mix(in oklab, var(--cms-paper) 88%, transparent);
    backdrop-filter: blur(14px) saturate(140%);
    -webkit-backdrop-filter: blur(14px) saturate(140%);
    border-bottom: 1px solid var(--cms-rule);
    transition: box-shadow var(--cms-dur) var(--cms-ease),
                border-color var(--cms-dur) var(--cms-ease);
}

.cms-site-header[data-stuck="true"] {
    box-shadow: var(--cms-shadow-sm);
    border-bottom-color: var(--cms-rule-strong);
}

.cms-site-header-inner {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    padding: 1.125rem 1.5rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 2rem;
}

.cms-site-brand {
    display: inline-flex;
    align-items: baseline;
    gap: 0.5rem;
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: 1.0625rem;
    letter-spacing: -0.012em;
    color: var(--cms-ink-strong);
    text-decoration: none;
    font-variation-settings: 'opsz' 18, 'SOFT' 30;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-site-brand::after {
    content: '·';
    color: var(--cms-accent-public);
    font-weight: 600;
    margin-left: 0.125rem;
    transform: translateY(-1px);
}

.cms-site-brand:hover {
    color: var(--cms-accent-public);
}

.cms-site-nav {
    display: flex;
    align-items: center;
    gap: 1rem;
    position: relative;
}

.cms-site-nav-list-wrap {
    display: none;
}

@media (min-width: 768px) {
    .cms-site-nav-list-wrap { display: block; }
}

.cms-site-nav-list-inline,
.cms-site-nav-list-stacked {
    border: 0;
    background: transparent;
}

.cms-site-nav-list-inline ul {
    display: flex;
    align-items: center;
    gap: 1.75rem;
    list-style: none;
    margin: 0;
    padding: 0;
}

.cms-site-nav-list-inline ul ul {
    /* Sub-menus: rendered as a column dropdown if styled in future. */
    display: none;
}

.cms-site-nav-list-stacked ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.875rem;
}

.cms-site-nav-list-stacked ul ul {
    margin-top: 0.5rem;
    margin-left: 1rem;
    padding-top: 0.25rem;
    border-left: 1px solid var(--cms-rule);
    padding-left: 0.875rem;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.cms-site-nav-link {
    position: relative;
    font-family: var(--cms-font-sans);
    font-weight: 500;
    font-size: 0.875rem;
    color: var(--cms-ink-dim);
    text-decoration: none;
    padding: 0.25rem 0;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-site-nav-link::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: -2px;
    height: 1px;
    background: var(--cms-accent-public);
    transform: scaleX(0);
    transform-origin: right;
    transition: transform var(--cms-dur-long) var(--cms-ease);
}

.cms-site-nav-link:hover,
.cms-site-nav-link[aria-current="page"] {
    color: var(--cms-ink-strong);
}

.cms-site-nav-link:hover::after,
.cms-site-nav-link[aria-current="page"]::after {
    transform: scaleX(1);
    transform-origin: left;
}

.cms-mobile-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    background: transparent;
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius-sm);
    color: var(--cms-ink-dim);
    cursor: pointer;
    transition: all var(--cms-dur) var(--cms-ease);
}

@media (min-width: 768px) {
    .cms-mobile-toggle { display: none; }
}

.cms-mobile-toggle:hover {
    color: var(--cms-ink-strong);
    background: var(--cms-paper-2);
    border-color: var(--cms-rule-strong);
}

.cms-mobile-drawer {
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    background: var(--cms-paper);
    border-bottom: 1px solid var(--cms-rule);
    padding: 1rem 1.5rem 1.25rem;
    box-shadow: var(--cms-shadow);
}

@media (min-width: 768px) {
    .cms-mobile-drawer { display: none !important; }
}

/* -----------------------------------------------------------------
 * 4. Site footer — three-column with editorial flourishes
 * ----------------------------------------------------------------- */
.cms-site-footer {
    background-color: var(--cms-paper-2);
    color: var(--cms-ink-dim);
    border-top: 1px solid var(--cms-rule);
    padding: var(--cms-section-y) 0 1.5rem;
    margin-top: auto;
}

.cms-site-footer-inner {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    padding: 0 1.5rem;
    display: grid;
    gap: 2.5rem;
    grid-template-columns: 1fr;
}

@media (min-width: 768px) {
    .cms-site-footer-inner {
        grid-template-columns: 2fr 1fr 1fr;
    }
}

.cms-site-footer-brand {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: 1.25rem;
    color: var(--cms-ink-strong);
    text-decoration: none;
    letter-spacing: -0.01em;
    font-variation-settings: 'opsz' 24, 'SOFT' 30;
}

.cms-site-footer-tagline {
    font-family: var(--cms-font-display);
    font-style: italic;
    font-weight: 400;
    font-size: 1rem;
    color: var(--cms-ink-dim);
    margin-top: 0.625rem;
    max-width: 24rem;
    line-height: 1.45;
    font-variation-settings: 'opsz' 14, 'SOFT' 50;
}

.cms-site-footer-heading {
    font-family: var(--cms-font-sans);
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--cms-ink-muted);
    margin-bottom: 0.875rem;
}

.cms-site-footer-list-wrap ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    font-size: 0.875rem;
}

.cms-site-footer-list-wrap ul ul {
    margin-top: 0.4rem;
    margin-left: 0.5rem;
    padding-left: 0.625rem;
    border-left: 1px solid var(--cms-rule);
}

.cms-site-footer-link,
.cms-site-footer-contact a {
    color: var(--cms-ink-dim);
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-site-footer-link:hover,
.cms-site-footer-contact a:hover {
    color: var(--cms-ink-strong);
}

.cms-site-footer-legal ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    gap: 1.25rem;
}

.cms-site-footer-legal-link {
    color: var(--cms-ink-muted);
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-site-footer-legal-link:hover {
    color: var(--cms-ink);
}

.cms-site-footer-contact {
    font-size: 0.875rem;
    line-height: 1.5;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.cms-site-footer-contact .muted {
    color: var(--cms-ink-muted);
}

.cms-site-footer-rule {
    max-width: var(--cms-content-wide);
    margin: 3rem auto 0;
    padding: 0 1.5rem;
}

.cms-site-footer-rule::before {
    content: '';
    display: block;
    height: 1px;
    background: var(--cms-rule);
    margin-bottom: 1.25rem;
}

.cms-site-footer-bottom {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    font-family: var(--cms-font-mono);
    font-size: 0.75rem;
    color: var(--cms-ink-muted);
    letter-spacing: 0;
}

@media (min-width: 768px) {
    .cms-site-footer-bottom {
        flex-direction: row;
        justify-content: space-between;
    }
}

.cms-site-footer-bottom nav ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    gap: 1.25rem;
}

.cms-site-footer-bottom a {
    color: var(--cms-ink-muted);
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-site-footer-bottom a:hover {
    color: var(--cms-ink);
}

/* -----------------------------------------------------------------
 * 5. Reusable block atoms — eyebrow, headline, body, CTA buttons
 * ----------------------------------------------------------------- */
.cms-eyebrow {
    display: inline-block;
    font-family: var(--cms-font-sans);
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--cms-accent-public);
    margin-bottom: 0.6875rem;
}

.cms-eyebrow::before {
    content: '— ';
    color: var(--cms-ink-faint);
    margin-right: 0.125rem;
}

.cms-block-headline {
    font-family: var(--cms-font-display);
    font-weight: 500;
    color: var(--cms-ink-strong);
    letter-spacing: -0.018em;
    line-height: 1.05;
    margin: 0;
    font-variation-settings: 'opsz' 36, 'SOFT' 30;
}

.cms-block-headline--xl {
    font-size: clamp(2.4rem, 5vw, 3.75rem);
}

.cms-block-headline--lg {
    font-size: clamp(2rem, 4vw, 2.75rem);
    font-variation-settings: 'opsz' 30, 'SOFT' 30;
}

.cms-block-headline--md {
    font-size: clamp(1.5rem, 2.5vw, 2rem);
    font-variation-settings: 'opsz' 22, 'SOFT' 30;
}

.cms-block-body {
    font-family: var(--cms-font-sans);
    font-size: 1.0625rem;
    line-height: 1.55;
    color: var(--cms-ink-dim);
    margin: 1rem 0 0;
    max-width: 36rem;
}

.cms-block-section {
    padding: var(--cms-section-y) 1.5rem;
    background: var(--brand-bg, var(--cms-paper));
    color: var(--cms-ink);
}

.cms-block-section--sunken {
    background: var(--cms-paper-2);
    border-block: 1px solid var(--cms-rule);
}

.cms-block-section--inverted {
    background: var(--cms-ink);
    color: var(--cms-paper);
}

.cms-block-section--inverted .cms-block-headline,
.cms-block-section--inverted .cms-block-body {
    color: var(--cms-paper);
}

.cms-block-section--inverted .cms-eyebrow {
    color: color-mix(in oklab, var(--cms-accent-public) 70%, var(--cms-paper));
}

.cms-block-container {
    max-width: var(--cms-content-width);
    margin-inline: auto;
}

.cms-block-container--wide {
    max-width: var(--cms-content-wide);
}

.cms-block-container--narrow {
    max-width: var(--cms-content-narrow);
}

.cms-block-container--center {
    text-align: center;
}

.cms-block-container--center .cms-block-body {
    margin-inline: auto;
}

/* CTA buttons — solid (primary) and ghost (secondary) */
.cms-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.75rem 1.25rem;
    font-family: var(--cms-font-sans);
    font-weight: 500;
    font-size: 0.9375rem;
    letter-spacing: -0.005em;
    border-radius: var(--cms-radius-sm);
    border: 1px solid transparent;
    text-decoration: none;
    cursor: pointer;
    transition: all var(--cms-dur) var(--cms-ease);
    box-shadow: var(--cms-shadow-sm);
}

.cms-btn--primary {
    background-color: var(--cms-accent-public);
    color: var(--cms-on-accent-public);
    border-color: var(--cms-accent-public);
}

.cms-btn--primary:hover {
    background-color: color-mix(in oklab, var(--cms-accent-public) 88%, var(--cms-ink-strong));
    transform: translateY(-1px);
    box-shadow: var(--cms-shadow);
}

.cms-btn--ghost,
.cms-btn--secondary {
    background-color: transparent;
    color: var(--cms-ink-strong);
    border-color: var(--cms-rule-strong);
}

.cms-btn--ghost:hover,
.cms-btn--secondary:hover {
    border-color: var(--cms-ink-strong);
    background-color: var(--cms-paper-2);
}

.cms-btn--inverted-primary {
    background-color: var(--cms-paper);
    color: var(--cms-ink-strong);
    border-color: var(--cms-paper);
}

.cms-btn--inverted-ghost {
    background-color: transparent;
    color: var(--cms-paper);
    border-color: color-mix(in oklab, var(--cms-paper) 50%, transparent);
}

.cms-btn--inverted-ghost:hover {
    border-color: var(--cms-paper);
    background-color: color-mix(in oklab, var(--cms-paper) 12%, transparent);
}

.cms-btn-row {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 0.625rem;
    margin-top: 1.75rem;
}

.cms-btn-row--center {
    justify-content: center;
}

/* Button block size + layout modifiers */
.cms-btn--sm {
    padding: 0.5rem 0.875rem;
    font-size: 0.8125rem;
}

.cms-btn--lg {
    padding: 1rem 1.75rem;
    font-size: 1.0625rem;
}

.cms-btn--block {
    width: 100%;
    justify-content: center;
}

/* Button block wrapper alignment */
.cms-block-button {
    display: flex;
}

.cms-block-button--align-left {
    justify-content: flex-start;
}

.cms-block-button--align-center {
    justify-content: center;
}

.cms-block-button--align-right {
    justify-content: flex-end;
}

/* -----------------------------------------------------------------
 * 6. Block — hero (full bleed)
 * ----------------------------------------------------------------- */
.cms-block-hero {
    position: relative;
    padding: var(--cms-section-y-lg) 1.5rem;
    color: var(--cms-paper);
    overflow: hidden;
    isolation: isolate;
}

.cms-block-hero--gradient {
    background: linear-gradient(135deg,
        var(--brand-primary, #2238c2) 0%,
        var(--brand-secondary, #1c2e9d) 100%);
}

.cms-block-hero--image {
    background-size: cover;
    background-position: center;
}

.cms-block-hero--image::before,
.cms-block-hero--video::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg,
        color-mix(in oklab, var(--cms-ink-strong) 55%, transparent) 0%,
        color-mix(in oklab, var(--cms-ink-strong) 75%, transparent) 100%);
    z-index: -1;
}

.cms-block-hero--image::after {
    content: '';
    position: absolute;
    inset: 0;
    background: inherit;
    background-size: inherit;
    background-position: inherit;
    z-index: -2;
}

/* Background-video variant: keep the brand gradient as the base fallback
 * (shown if the video is transparent, still loading, or fails), with the
 * decorative <video> layered above it and below the dark overlay. */
.cms-block-hero--video {
    background: linear-gradient(135deg,
        var(--brand-primary, #2238c2) 0%,
        var(--brand-secondary, #1c2e9d) 100%);
}

.cms-block-hero .cms-hero-bg-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: -2;
    pointer-events: none;
}

.cms-block-hero-inner {
    max-width: 50rem;
    margin-inline: auto;
    text-align: center;
    position: relative;
    z-index: 1;
}

.cms-block-hero .cms-eyebrow {
    color: color-mix(in oklab, var(--cms-paper) 80%, var(--brand-primary, #fff));
    margin-bottom: 1rem;
}

.cms-block-hero .cms-block-headline {
    color: var(--cms-paper);
    font-size: clamp(2.5rem, 5.5vw, 4rem);
    font-variation-settings: 'opsz' 48, 'SOFT' 30;
}

.cms-block-hero .cms-block-body {
    color: color-mix(in oklab, var(--cms-paper) 88%, transparent);
    margin: 1.25rem auto 0;
    font-size: 1.125rem;
    max-width: 36rem;
}

/* -----------------------------------------------------------------
 * 7. Block — hero-split (asymmetric two-column)
 * ----------------------------------------------------------------- */
.cms-block-hero-split {
    padding: var(--cms-section-y-lg) 1.5rem;
}

.cms-block-hero-split-grid {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    display: grid;
    gap: 3.5rem;
    grid-template-columns: 1fr;
    align-items: center;
}

@media (min-width: 900px) {
    .cms-block-hero-split-grid {
        grid-template-columns: 1.05fr 1fr;
    }
    .cms-block-hero-split--media-left .cms-block-hero-split-grid {
        grid-template-columns: 1fr 1.05fr;
    }
    .cms-block-hero-split--media-left .cms-block-hero-split-content {
        order: 2;
    }
    .cms-block-hero-split--media-left .cms-block-hero-split-media {
        order: 1;
    }
}

.cms-block-hero-split-media {
    position: relative;
}

.cms-block-hero-split-media img,
.cms-block-hero-split-video {
    width: 100%;
    height: auto;
    border-radius: var(--cms-radius-lg);
    box-shadow: var(--cms-shadow-lg);
    border: 1px solid var(--cms-rule);
}

/* The media-column video is decorative and shares the image's framing.
 * A brand-gradient base keeps the column from flashing blank while the clip
 * loads or if it fails to play (the poster covers it once available). */
.cms-block-hero-split-video {
    display: block;
    aspect-ratio: 16 / 10;
    object-fit: cover;
    background: linear-gradient(135deg,
        var(--brand-primary, #2238c2) 0%,
        var(--brand-secondary, #1c2e9d) 100%);
}

.cms-block-hero-split-media::before {
    content: '';
    position: absolute;
    inset: -1.25rem -1.25rem auto auto;
    width: 4rem;
    height: 4rem;
    background: var(--cms-accent-public);
    border-radius: var(--cms-radius);
    z-index: -1;
    opacity: 0.85;
}

/* -----------------------------------------------------------------
 * 8. Block — page-header (compact title block with hairline)
 * ----------------------------------------------------------------- */
.cms-block-page-header {
    padding: var(--cms-section-y-lg) 1.5rem var(--cms-section-y-sm);
}

.cms-block-page-header-inner {
    max-width: var(--cms-content-width);
    margin-inline: auto;
}

.cms-block-page-header--center .cms-block-page-header-inner {
    text-align: center;
}

.cms-block-page-header--center .cms-block-body {
    margin-inline: auto;
}

.cms-block-page-header .cms-block-headline {
    font-size: clamp(2rem, 4vw, 2.75rem);
}

/* -----------------------------------------------------------------
 * 9. Block — rich-text (.cms-prose, the typography star)
 *
 * Leaf-block layout principle: blocks fill their column's content
 * area edge-to-edge horizontally, and the surrounding Section/Column
 * provides the outer padding. Adding horizontal padding here would
 * double-indent any RichText placed inside a multi-column footer or
 * sidebar, breaking baseline alignment with sibling blocks
 * (Navigation, CompanyContact, etc.). Vertical padding stays so
 * the block has breathing room when stacked. Background is left
 * transparent so the block inherits its parent Section's scheme
 * — authors who want a "card" appearance wrap the RichText in a
 * Column with its own padding/background.
 * ----------------------------------------------------------------- */
.cms-block-rich-text {
    padding: var(--cms-section-y-sm) 0;
    background: transparent;
}

.cms-prose {
    max-width: var(--cms-content-narrow);
    margin-inline: auto;
    font-family: var(--cms-font-sans);
    font-size: var(--cms-text-size);
    line-height: var(--cms-line-height-loose);
    color: var(--cms-text);
}

.cms-prose--wide {
    max-width: var(--cms-content-wide);
}

.cms-prose > * + * {
    margin-top: var(--cms-spacing-y);
}

/* First-child resets so headings flush to the top of their column,
 * keeping multi-column footers / sidebars baseline-aligned. */
.cms-prose > :first-child,
.cms-block-company-contact > :first-child {
    margin-top: 0;
}

.cms-prose h1,
.cms-prose h2,
.cms-prose h3,
.cms-prose h4 {
    font-family: var(--cms-font-display);
    font-weight: 500;
    color: var(--cms-text-strong);
    letter-spacing: -0.018em;
    line-height: var(--cms-line-height-tight);
    font-variation-settings: 'opsz' 24, 'SOFT' 30;
}

.cms-prose h1 { font-size: var(--cms-heading-size-xl); margin-top: var(--cms-spacing-y-xl); }
.cms-prose h2 { font-size: var(--cms-heading-size-lg); margin-top: var(--cms-spacing-y-xl); }
.cms-prose h3 { font-size: var(--cms-heading-size); margin-top: var(--cms-spacing-y-lg); }
.cms-prose h4 { font-size: var(--cms-heading-size-sm); margin-top: var(--cms-spacing-y-lg); }

/* Drop-cap is opt-in via the `cms-prose--dropcap` modifier (RichText
 * block has a `dropCap` toggle). Was applied to every first paragraph
 * by default — fine for blog posts, jarring everywhere else. */
.cms-prose--dropcap p:first-of-type::first-letter {
    font-family: var(--cms-font-display);
    font-size: 3.25em;
    float: left;
    line-height: 0.9;
    margin: 0.05em 0.1em -0.05em 0;
    color: var(--cms-link);
    font-weight: 500;
    font-variation-settings: 'opsz' 144, 'SOFT' 30;
}

.cms-prose blockquote {
    margin: 2rem 0 2rem 0;
    padding: 0.5rem 0 0.5rem 1.5rem;
    border-left: 2px solid var(--cms-accent-public);
    font-family: var(--cms-font-display);
    font-style: italic;
    font-size: 1.25rem;
    line-height: 1.5;
    color: var(--cms-ink-strong);
    font-variation-settings: 'opsz' 18, 'SOFT' 50;
}

.cms-prose blockquote p:first-of-type::first-letter {
    font-size: inherit;
    float: none;
    margin: 0;
    color: inherit;
    font-weight: inherit;
}

.cms-prose a {
    color: var(--cms-link);
    text-decoration: none;
    background-image: linear-gradient(currentColor, currentColor);
    background-size: 100% 1px;
    background-position: 0 100%;
    background-repeat: no-repeat;
    transition: background-size var(--cms-dur-long) var(--cms-ease), color var(--cms-dur) var(--cms-ease);
}

.cms-prose a:hover {
    color: var(--cms-link-hover);
    background-size: 100% 2px;
}

.cms-prose ul,
.cms-prose ol {
    padding-left: 1.5rem;
}

/* Re-assert list markers. Consumer resets (notably Tailwind Preflight's
   `ol,ul,menu{list-style:none}`) strip them; the .cms-prose ul/ol selector
   (specificity 0,1,1) beats the bare element reset (0,0,1) regardless of
   stylesheet load order, so prose lists always render bullets/numbers. */
.cms-prose ul {
    list-style: disc;
}

.cms-prose ol {
    list-style: decimal;
}

.cms-prose ul li::marker {
    color: var(--cms-accent-public);
}

.cms-prose code {
    font-family: var(--cms-font-mono);
    font-size: 0.875em;
    background: var(--cms-paper-3);
    color: var(--cms-ink-strong);
    padding: 0.125em 0.375em;
    border-radius: var(--cms-radius-xs);
    border: 1px solid var(--cms-rule);
}

.cms-prose pre {
    font-family: var(--cms-font-mono);
    font-size: 0.875rem;
    background: var(--cms-paper-3);
    color: var(--cms-ink);
    padding: 1.25rem 1.5rem;
    border-radius: var(--cms-radius);
    border: 1px solid var(--cms-rule);
    overflow-x: auto;
}

.cms-prose pre code {
    background: transparent;
    border: none;
    padding: 0;
    font-size: inherit;
}

.cms-prose hr {
    border: 0;
    border-top: 1px solid var(--cms-rule);
    margin: 2.5rem auto;
    max-width: 8rem;
    text-align: center;
}

.cms-prose hr::after {
    content: '·  ·  ·';
    display: block;
    color: var(--cms-ink-muted);
    margin-top: -0.875rem;
    background: var(--brand-bg, var(--cms-paper));
    padding: 0 1rem;
    width: fit-content;
    margin-inline: auto;
    letter-spacing: 0.5em;
    font-size: 0.875rem;
}

.cms-prose img {
    width: 100%;
    height: auto;
    border-radius: var(--cms-radius);
    border: 1px solid var(--cms-rule);
}

/* -----------------------------------------------------------------
 * 10. Block — CTA (centered) and CTA banner (full-bleed)
 * ----------------------------------------------------------------- */
.cms-block-cta {
    padding: var(--cms-section-y) 1.5rem;
    text-align: center;
}

.cms-block-cta-banner {
    padding: var(--cms-section-y) 1.5rem;
    text-align: center;
    color: var(--cms-paper);
    position: relative;
    overflow: hidden;
}

.cms-block-cta-banner--gradient {
    background: linear-gradient(135deg,
        var(--brand-primary, #2238c2) 0%,
        var(--brand-secondary, #1c2e9d) 100%);
}

.cms-block-cta-banner--solid {
    background: var(--brand-primary, #2238c2);
}

.cms-block-cta-banner--subtle {
    background: var(--cms-paper-2);
    color: var(--cms-ink);
    border-block: 1px solid var(--cms-rule);
}

.cms-block-cta-banner--subtle .cms-block-headline {
    color: var(--cms-ink-strong);
}

.cms-block-cta-banner--subtle .cms-block-body {
    color: var(--cms-ink-dim);
}

.cms-block-cta-banner-inner {
    max-width: 50rem;
    margin-inline: auto;
    position: relative;
    z-index: 1;
}

.cms-block-cta-banner:not(.cms-block-cta-banner--subtle) .cms-block-headline,
.cms-block-cta-banner:not(.cms-block-cta-banner--subtle) .cms-block-body {
    color: var(--cms-paper);
}

.cms-block-cta-banner:not(.cms-block-cta-banner--subtle) .cms-block-body {
    color: color-mix(in oklab, var(--cms-paper) 86%, transparent);
}

/* -----------------------------------------------------------------
 * 11. Block — divider variants
 * ----------------------------------------------------------------- */
.cms-block-divider--space {
    height: var(--cms-section-y);
}

.cms-block-divider--rule {
    padding: calc(var(--cms-section-y) / 2) 1.5rem;
}

.cms-block-divider--rule hr {
    border: 0;
    border-top: 1px solid var(--cms-rule);
    max-width: var(--cms-content-wide);
    margin: 0 auto;
}

.cms-block-divider--dots {
    padding: calc(var(--cms-section-y) / 2) 1.5rem;
    text-align: center;
    color: var(--cms-ink-faint);
    letter-spacing: 0.6em;
    font-size: 1rem;
}

.cms-block-divider--ornament {
    padding: calc(var(--cms-section-y) / 2) 1.5rem;
    text-align: center;
}

.cms-block-divider--ornament::before {
    content: '·    ·    ·';
    color: var(--cms-accent-public);
    letter-spacing: 0.5em;
    font-family: var(--cms-font-display);
    font-size: 1.125rem;
    font-style: italic;
}

.cms-block-divider--wave {
    height: var(--cms-section-y-sm);
    position: relative;
}

.cms-block-divider--wave svg {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
}

/* -----------------------------------------------------------------
 * 12. Block — media-text (image + copy, alternating sides)
 * ----------------------------------------------------------------- */
.cms-block-media-text {
    padding: var(--cms-section-y) 1.5rem;
}

.cms-block-media-text-grid {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    display: grid;
    gap: 3rem;
    grid-template-columns: 1fr;
    align-items: center;
}

@media (min-width: 800px) {
    .cms-block-media-text-grid {
        grid-template-columns: 1fr 1fr;
    }
    .cms-block-media-text--media-right .cms-block-media-text-content {
        order: 1;
    }
    .cms-block-media-text--media-right .cms-block-media-text-media {
        order: 2;
    }
}

.cms-block-media-text-media img {
    width: 100%;
    height: auto;
    border-radius: var(--cms-radius);
    border: 1px solid var(--cms-rule);
    box-shadow: var(--cms-shadow);
}

/* -----------------------------------------------------------------
 * 13. Block — image (figure with caption)
 * ----------------------------------------------------------------- */
.cms-block-image {
    padding: var(--cms-section-y-sm) 1.5rem;
}

.cms-block-image-figure {
    margin: 0;
    max-width: var(--cms-content-wide);
    margin-inline: auto;
}

.cms-block-image-figure--narrow {
    max-width: var(--cms-content-narrow);
}

.cms-block-image-figure img {
    width: 100%;
    height: auto;
    border-radius: var(--cms-radius);
    border: 1px solid var(--cms-rule);
}

.cms-block-image-caption {
    margin-top: 0.875rem;
    text-align: center;
    font-family: var(--cms-font-display);
    font-style: italic;
    font-size: 0.9375rem;
    color: var(--cms-ink-dim);
    font-variation-settings: 'opsz' 14, 'SOFT' 50;
}

/* -----------------------------------------------------------------
 * 14. Block — feature grid / card grid / stat list
 * ----------------------------------------------------------------- */
.cms-block-feature-grid,
.cms-block-card-grid,
.cms-block-stat-list,
.cms-block-logo-grid,
.cms-block-image-gallery,
.cms-block-testimonials,
.cms-block-timeline,
.cms-block-faq,
.cms-block-newsletter {
    padding: var(--cms-section-y) 1.5rem;
}

.cms-block-stat-list {
    background: var(--cms-paper-2);
    border-block: 1px solid var(--cms-rule);
}

.cms-block-grid {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    display: grid;
    gap: 2rem;
    grid-template-columns: 1fr;
    margin-top: 2.5rem;
}

@media (min-width: 640px) {
    .cms-block-grid--cols-2 { grid-template-columns: repeat(2, 1fr); }
    .cms-block-grid--cols-3 { grid-template-columns: repeat(2, 1fr); }
    .cms-block-grid--cols-4 { grid-template-columns: repeat(2, 1fr); }
    .cms-block-grid--cols-5 { grid-template-columns: repeat(3, 1fr); }
}

@media (min-width: 1000px) {
    .cms-block-grid--cols-3 { grid-template-columns: repeat(3, 1fr); }
    .cms-block-grid--cols-4 { grid-template-columns: repeat(4, 1fr); }
    .cms-block-grid--cols-5 { grid-template-columns: repeat(5, 1fr); }
}

.cms-feature-card,
.cms-card {
    position: relative;
    padding: 1.5rem;
    background: var(--cms-elevated);
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius);
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-feature-card:hover,
.cms-card:hover {
    border-color: var(--cms-rule-strong);
    transform: translateY(-2px);
    box-shadow: var(--cms-shadow);
}

.cms-feature-card--linked {
    display: block;
    color: inherit;
    text-decoration: none;
}

.cms-feature-card--linked:hover {
    text-decoration: none;
}

.cms-feature-card-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    margin-bottom: 1rem;
    background: var(--cms-accent-soft, color-mix(in oklab, var(--cms-accent-public) 14%, var(--cms-elevated)));
    color: var(--cms-accent-public);
    border-radius: var(--cms-radius-sm);
    font-family: var(--cms-font-display);
    font-style: italic;
    font-size: 1.125rem;
    font-weight: 500;
}

.cms-feature-card-title,
.cms-card-title {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: 1.25rem;
    color: var(--cms-ink-strong);
    margin: 0 0 0.5rem;
    letter-spacing: -0.012em;
    font-variation-settings: 'opsz' 18, 'SOFT' 30;
}

.cms-feature-card-body,
.cms-card-body {
    font-size: 0.9375rem;
    line-height: 1.55;
    color: var(--cms-ink-dim);
    margin: 0;
}

.cms-card {
    overflow: hidden;
    padding: 0;
}

.cms-card-image {
    aspect-ratio: 16 / 10;
    background-size: cover;
    background-position: center;
    background-color: var(--cms-paper-3);
}

.cms-card-content {
    padding: 1.25rem 1.5rem 1.5rem;
}

.cms-card-meta {
    font-family: var(--cms-font-mono);
    font-size: 0.6875rem;
    color: var(--cms-ink-muted);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    margin-bottom: 0.4rem;
}

/* Stat list — large serif numerals */
.cms-stat-item {
    text-align: center;
    padding: 1rem 0.5rem;
}

.cms-stat-value {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: clamp(2.5rem, 4vw, 3.25rem);
    line-height: 1;
    color: var(--cms-ink-strong);
    letter-spacing: -0.02em;
    font-variation-settings: 'opsz' 48, 'SOFT' 30;
    font-variant-numeric: tabular-nums lining-nums;
    display: block;
    margin-bottom: 0.5rem;
}

.cms-stat-value-accent {
    color: var(--cms-accent-public);
}

.cms-stat-label {
    font-family: var(--cms-font-sans);
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--cms-ink-muted);
}

/* Logo grid — quiet, evenly spaced */
.cms-logo-grid {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 2rem 3rem;
    margin-top: 2.5rem;
    align-items: center;
}

@media (min-width: 768px) { .cms-logo-grid { grid-template-columns: repeat(4, 1fr); } }
@media (min-width: 1100px) { .cms-logo-grid { grid-template-columns: repeat(5, 1fr); } }

.cms-logo-grid img {
    max-height: 2.25rem;
    width: auto;
    margin-inline: auto;
    opacity: 0.75;
    filter: grayscale(20%);
    transition: opacity var(--cms-dur) var(--cms-ease),
                filter var(--cms-dur) var(--cms-ease);
}

.cms-logo-grid img:hover {
    opacity: 1;
    filter: grayscale(0);
}

/* -----------------------------------------------------------------
 * 15. Block — testimonial
 * ----------------------------------------------------------------- */
.cms-testimonial {
    background: var(--cms-elevated);
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius-lg);
    padding: 2rem;
    position: relative;
}

.cms-testimonial::before {
    content: '"';
    position: absolute;
    top: 1rem;
    left: 1.5rem;
    font-family: var(--cms-font-display);
    font-size: 4rem;
    line-height: 1;
    color: var(--cms-accent-public);
    opacity: 0.4;
    font-style: italic;
    font-variation-settings: 'opsz' 144;
}

.cms-testimonial-quote {
    font-family: var(--cms-font-display);
    font-style: italic;
    font-size: 1.0625rem;
    line-height: 1.5;
    color: var(--cms-ink);
    margin: 0 0 1.25rem;
    font-variation-settings: 'opsz' 18, 'SOFT' 50;
    position: relative;
    z-index: 1;
}

.cms-testimonial-attrib {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    border-top: 1px solid var(--cms-rule);
    padding-top: 1rem;
}

.cms-testimonial-avatar {
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 50%;
    object-fit: cover;
    background: var(--cms-paper-2);
}

.cms-testimonial-name {
    font-family: var(--cms-font-sans);
    font-weight: 500;
    font-size: 0.875rem;
    color: var(--cms-ink-strong);
}

.cms-testimonial-role {
    font-family: var(--cms-font-sans);
    font-size: 0.75rem;
    color: var(--cms-ink-muted);
}

/* Single-testimonial layout */
.cms-block-testimonials--single .cms-testimonial {
    max-width: 48rem;
    margin-inline: auto;
    padding: 2.5rem 2.5rem 2rem;
    text-align: left;
}

.cms-block-testimonials--single .cms-testimonial-quote {
    font-size: 1.375rem;
    line-height: 1.45;
}

/* -----------------------------------------------------------------
 * 16. Block — timeline
 * ----------------------------------------------------------------- */
.cms-timeline {
    max-width: var(--cms-content-width);
    margin-inline: auto;
    margin-top: 2.5rem;
    position: relative;
}

.cms-timeline::before {
    content: '';
    position: absolute;
    left: 0.625rem;
    top: 0.5rem;
    bottom: 0.5rem;
    width: 1px;
    background: var(--cms-rule);
}

.cms-timeline-item {
    position: relative;
    padding-left: 2.5rem;
    padding-bottom: 2.25rem;
}

.cms-timeline-item:last-child {
    padding-bottom: 0;
}

.cms-timeline-item::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0.4rem;
    width: 0.875rem;
    height: 0.875rem;
    border-radius: 50%;
    background: var(--cms-paper);
    border: 2px solid var(--cms-accent-public);
    box-shadow: 0 0 0 4px var(--brand-bg, var(--cms-paper));
}

.cms-timeline-date {
    font-family: var(--cms-font-mono);
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--cms-accent-public);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    margin-bottom: 0.4rem;
    display: block;
}

.cms-timeline-title {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: 1.25rem;
    color: var(--cms-ink-strong);
    margin: 0 0 0.5rem;
    letter-spacing: -0.012em;
    font-variation-settings: 'opsz' 20, 'SOFT' 30;
}

.cms-timeline-body {
    font-size: 0.9375rem;
    line-height: 1.55;
    color: var(--cms-ink-dim);
    margin: 0;
}

/* -----------------------------------------------------------------
 * 17. Block — FAQ accordion
 * ----------------------------------------------------------------- */
.cms-faq {
    max-width: var(--cms-content-width);
    margin-inline: auto;
    margin-top: 2.5rem;
}

.cms-faq-item {
    border-bottom: 1px solid var(--cms-rule);
}

.cms-faq-item summary {
    cursor: pointer;
    list-style: none;
    padding: 1.25rem 0;
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: 1.125rem;
    color: var(--cms-ink-strong);
    letter-spacing: -0.008em;
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 1.5rem;
    transition: color var(--cms-dur) var(--cms-ease);
    font-variation-settings: 'opsz' 18, 'SOFT' 30;
}

.cms-faq-item summary::-webkit-details-marker {
    display: none;
}

.cms-faq-item summary::after {
    content: '+';
    flex-shrink: 0;
    font-family: var(--cms-font-mono);
    font-weight: 400;
    font-size: 1.5rem;
    color: var(--cms-accent-public);
    line-height: 1;
    transition: transform var(--cms-dur-long) var(--cms-ease);
}

.cms-faq-item[open] summary::after {
    transform: rotate(45deg);
}

.cms-faq-item summary:hover {
    color: var(--cms-accent-public);
}

.cms-faq-item-body {
    padding: 0 0 1.5rem;
    font-size: 0.9375rem;
    line-height: 1.6;
    color: var(--cms-ink-dim);
    max-width: 42rem;
}

/* -----------------------------------------------------------------
 * 18. Block — newsletter signup
 * ----------------------------------------------------------------- */
.cms-newsletter {
    max-width: 36rem;
    margin-inline: auto;
    text-align: center;
    margin-top: 2rem;
}

.cms-newsletter-form {
    display: flex;
    gap: 0.5rem;
    margin-top: 1.5rem;
    align-items: stretch;
}

@media (max-width: 520px) {
    .cms-newsletter-form { flex-direction: column; }
}

.cms-newsletter-input {
    flex: 1;
    padding: 0.75rem 0.875rem;
    background: var(--cms-elevated);
    border: 1px solid var(--cms-rule-strong);
    border-radius: var(--cms-radius-sm);
    color: var(--cms-ink);
    font-family: var(--cms-font-sans);
    font-size: 0.9375rem;
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-newsletter-input:focus {
    outline: none;
    border-color: var(--cms-accent-public);
    box-shadow: 0 0 0 3px color-mix(in oklab, var(--cms-accent-public) 18%, transparent);
}

/* -----------------------------------------------------------------
 * 19. Block — image gallery
 * ----------------------------------------------------------------- */
.cms-gallery {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    margin-top: 2.5rem;
    display: grid;
    gap: 0.75rem;
    grid-template-columns: 1fr;
}

@media (min-width: 600px) { .cms-gallery--cols-2 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 600px) { .cms-gallery--cols-3 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 900px) { .cms-gallery--cols-3 { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 600px) { .cms-gallery--cols-4 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .cms-gallery--cols-4 { grid-template-columns: repeat(4, 1fr); } }

.cms-gallery img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    aspect-ratio: 4 / 3;
    border-radius: var(--cms-radius);
    border: 1px solid var(--cms-rule);
    transition: transform var(--cms-dur-long) var(--cms-ease);
}

.cms-gallery a {
    overflow: hidden;
    border-radius: var(--cms-radius);
    display: block;
}

.cms-gallery a:hover img {
    transform: scale(1.03);
}

/* -----------------------------------------------------------------
 * 20. Block — video embed + map embed (16:9 frames)
 * ----------------------------------------------------------------- */
.cms-block-video,
.cms-block-map {
    padding: var(--cms-section-y-sm) 1.5rem;
}

.cms-embed-frame {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    aspect-ratio: 16 / 9;
    background: var(--cms-paper-3);
    border-radius: var(--cms-radius);
    border: 1px solid var(--cms-rule);
    overflow: hidden;
}

.cms-embed-frame iframe,
.cms-embed-frame video {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
}

.cms-block-map .cms-block-headline {
    margin-bottom: 1.5rem;
    text-align: center;
}

/* -----------------------------------------------------------------
 * 21. Block — hero carousel
 * ----------------------------------------------------------------- */
.cms-hero-carousel {
    position: relative;
    overflow: hidden;
    background: var(--cms-ink);
    /* New stacking context so a shared background <video> (z-index:-1) sits
     * above the section's own background but below the track / slides / dots /
     * controls. Harmless for carousels without a shared backdrop. */
    isolation: isolate;
}

/* Shared "video backdrop": one continuous video behind the whole carousel,
 * covering every aspect (incl. fullscreen). Slides render transparent in this
 * mode so it shows through; each active slide keeps its ::before scrim for text
 * legibility over the moving video. */
.cms-hero-carousel-bg-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: -1;
    pointer-events: none;
}

.cms-hero-carousel--wide  { aspect-ratio: 21 / 9; }
.cms-hero-carousel--short { aspect-ratio: 16 / 7; }
.cms-hero-carousel--tall  { aspect-ratio: 4 / 3; }

/* Fullscreen: fills the first viewport on load.
 * Uses 100svh (small viewport height — stable, no reflow as URL bar
 * retracts) with a 600 px floor so laptop screens with stubby aspect
 * ratios don't get crushed. 100svh is Baseline Widely Available as of
 * mid-2025 (Chrome 108+, Safari 15.4+, Firefox 101+). */
.cms-hero-carousel--fullscreen {
    min-height: max(100svh, 600px);
    /* Absolute-stack mode has no native horizontal scroll-snap; the JS handles
       horizontal swipe via Pointer Events. `pan-y` keeps vertical page scroll
       native while letting horizontal gestures reach the script. */
    touch-action: pan-y;
}

/* Fullscreen layout: switch the track from flex-scroll-snap to
 * absolute-stack. Reason: the wrapper above uses `min-height` (not
 * an explicit `height`), so the track's default `height: 100%` does
 * not resolve and slides collapse. Absolute positioning via
 * `inset: 0` lets the track and slides inherit the wrapper's
 * rendered height directly. The default flex-scroll-snap model
 * doesn't fit fullscreen anyway — viewport-wide slides can't be
 * horizontally swiped meaningfully, and the autoplay crossfade
 * (opacity transitions on `.cms-hc-slide--active`) works identically
 * on absolutely-positioned siblings. */
.cms-hero-carousel--fullscreen .cms-hero-carousel-track {
    position: absolute;
    inset: 0;
    height: auto;
    width: auto;
}

.cms-hero-carousel--fullscreen .cms-hero-carousel-track > .cms-hero-carousel-slide {
    position: absolute;
    inset: 0;
    flex: none;
    scroll-snap-align: none;
}

.cms-hero-carousel-slide {
    position: absolute;
    inset: 0;
    background-size: cover;
    background-position: center;
    display: flex;
    align-items: center;
    justify-content: center;
    /* New stacking context so a background <video> (z-index:-1) sits above the
     * slide's own background but below the ::before overlay (0) and content (1).
     * Harmless for slides without a video. */
    isolation: isolate;
}

/* Decorative background video for a carousel slide — covers the slide,
 * beneath the gradient overlay and content. */
.cms-hero-carousel-slide .cms-hero-bg-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: -1;
    pointer-events: none;
}

.cms-hero-carousel-slide::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg,
        color-mix(in oklab, var(--cms-ink-strong) 50%, transparent) 0%,
        color-mix(in oklab, var(--cms-ink-strong) 70%, transparent) 100%);
}

.cms-hero-carousel-content {
    position: relative;
    text-align: center;
    color: var(--cms-paper);
    max-width: 44rem;
    padding: 0 1.5rem;
    z-index: 1;
}

.cms-hero-carousel-content .cms-block-headline {
    color: var(--cms-paper);
}

.cms-hero-carousel-dots {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 1.25rem;
    display: flex;
    gap: 0.5rem;
    justify-content: center;
    z-index: 2;
}

.cms-hero-carousel-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: color-mix(in oklab, var(--cms-paper) 40%, transparent);
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-hero-carousel-dot--active {
    background: var(--cms-paper);
    width: 24px;
    border-radius: 3px;
}

/* Autoplay pause/play button — WCAG 2.2.2 user control */
.cms-hero-carousel-autoplay-btn {
    position: absolute;
    bottom: 1.25rem;
    right: 1rem;
    z-index: 3;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: 50%;
    border: none;
    cursor: pointer;
    background: color-mix(in oklab, var(--cms-paper) 20%, transparent);
    color: var(--cms-paper);
    transition: background var(--cms-dur) var(--cms-ease);
}
.cms-hero-carousel-autoplay-btn:hover,
.cms-hero-carousel-autoplay-btn:focus-visible {
    background: color-mix(in oklab, var(--cms-paper) 35%, transparent);
    outline: 2px solid var(--cms-paper);
    outline-offset: 2px;
}

/* Show play icon only when paused (aria-pressed=true) */
.cms-hero-carousel-autoplay-btn .cms-hc-icon--play  { display: none; }
.cms-hero-carousel-autoplay-btn .cms-hc-icon--pause { display: block; }
.cms-hero-carousel-autoplay-btn[aria-pressed="true"] .cms-hc-icon--play  { display: block; }
.cms-hero-carousel-autoplay-btn[aria-pressed="true"] .cms-hc-icon--pause { display: none; }

/* Prev/next arrows — fullscreen (absolute-stack) manual navigation. */
.cms-hero-carousel-arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    z-index: 3;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.75rem;
    height: 2.75rem;
    border: none;
    border-radius: 50%;
    cursor: pointer;
    background: color-mix(in oklab, var(--cms-ink-strong) 45%, transparent);
    color: var(--cms-paper);
    transition: background var(--cms-dur) var(--cms-ease);
}

.cms-hero-carousel-arrow--prev { left: 1rem; }
.cms-hero-carousel-arrow--next { right: 1rem; }

.cms-hero-carousel-arrow:hover,
.cms-hero-carousel-arrow:focus-visible {
    background: color-mix(in oklab, var(--cms-ink-strong) 65%, transparent);
    outline: 2px solid var(--cms-paper);
    outline-offset: 2px;
}

/* Track — scroll-snap container (class replaces per-instance ID selector) */
.cms-hero-carousel-track {
    display: flex;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    scrollbar-width: none;
    -ms-overflow-style: none;
    position: relative;
    width: 100%;
    height: 100%;
}

.cms-hero-carousel-track::-webkit-scrollbar {
    display: none;
}

.cms-hero-carousel-track > .cms-hero-carousel-slide {
    position: relative;
    flex: 0 0 100%;
    scroll-snap-align: start;
}

@media (prefers-reduced-motion: reduce) {
    .cms-hero-carousel-track {
        scroll-behavior: auto;
    }
}

/* Crossfade / absolute-stack mode: slides overlap and only the active one is
   visible; JS toggles `.cms-hc-slide--active`. The `--crossfade` class is
   emitted by the blade when autoplay is on OR the carousel is fullscreen (and
   slideCount>1), so manual navigation (dots/arrows/swipe/keyboard) works even
   with autoplay off. */
.cms-hero-carousel--crossfade > .cms-hero-carousel-track > .cms-hero-carousel-slide {
    opacity: 0;
    /* A transparent slide still takes clicks and keyboard focus, and the last
       slide in the stack sits on top of the others, so hidden slides swallowed
       clicks meant for the active slide's buttons. Drop them out of
       hit-testing at once, and out of the tab order once the fade has ended. */
    pointer-events: none;
    visibility: hidden;
    transition: opacity 0.7s ease, visibility 0s linear 0.7s;
}

.cms-hero-carousel--crossfade > .cms-hero-carousel-track > .cms-hero-carousel-slide.cms-hc-slide--active {
    opacity: 1;
    pointer-events: auto;
    visibility: visible;
    transition: opacity 0.7s ease;
}

/* No reduced-motion carve-out here on purpose. The crossfade controller runs
   for every visitor (see hero-carousel.blade.php), so the active-slide-only
   rules above must apply universally: the old `opacity: 1` fallback would have
   made rotation invisible on non-fullscreen carousels, and showing every slide
   at once is what stacked fullscreen slides overlapped through. Transitions are
   still flattened for reduced-motion users site-wide by §26, so those visitors
   get instant slide switches rather than a 0.7s fade. */

/* -----------------------------------------------------------------
 * 22. Forms (contact, livewire)
 * ----------------------------------------------------------------- */
.cms-form {
    display: grid;
    gap: 1rem;
}

.cms-form-row {
    display: grid;
    gap: 0.4rem;
}

.cms-form-label {
    font-family: var(--cms-font-sans);
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--cms-ink-dim);
    letter-spacing: 0.005em;
}

.cms-form-input,
.cms-form-textarea,
.cms-form-select {
    padding: 0.625rem 0.875rem;
    font-family: var(--cms-font-sans);
    font-size: 0.9375rem;
    background: var(--cms-elevated);
    border: 1px solid var(--cms-rule-strong);
    border-radius: var(--cms-radius-sm);
    color: var(--cms-ink);
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-form-input::placeholder,
.cms-form-textarea::placeholder {
    color: var(--cms-ink-faint);
    font-style: italic;
    font-family: var(--cms-font-display);
}

.cms-form-input:focus,
.cms-form-textarea:focus,
.cms-form-select:focus {
    outline: none;
    border-color: var(--cms-accent-public);
    box-shadow: 0 0 0 3px color-mix(in oklab, var(--cms-accent-public) 18%, transparent);
}

.cms-form-error {
    font-family: var(--cms-font-display);
    font-style: italic;
    font-size: 0.8125rem;
    color: var(--cms-danger, #a73318);
    font-variation-settings: 'opsz' 14, 'SOFT' 50;
}

.cms-form-success {
    padding: 1.25rem;
    background: color-mix(in oklab, var(--cms-accent-public) 10%, var(--cms-paper));
    border: 1px solid var(--cms-accent-public);
    border-radius: var(--cms-radius);
    color: var(--cms-ink-strong);
    font-family: var(--cms-font-display);
    font-style: italic;
    font-size: 1rem;
}

/* -----------------------------------------------------------------
 * 23. Blog index, post-card, byline
 * ----------------------------------------------------------------- */
.cms-blog-archive {
    padding: var(--cms-section-y) 1.5rem;
    max-width: var(--cms-content-wide);
    margin-inline: auto;
}

.cms-blog-archive-header {
    text-align: center;
    border-bottom: 1px solid var(--cms-rule);
    padding-bottom: 2.5rem;
    margin-bottom: 3rem;
}

.cms-blog-archive-meta {
    font-family: var(--cms-font-mono);
    font-size: 0.75rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--cms-ink-muted);
    margin-bottom: 0.75rem;
}

.cms-blog-archive-title {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: clamp(2.25rem, 4vw, 3rem);
    color: var(--cms-ink-strong);
    letter-spacing: -0.02em;
    margin: 0;
    font-variation-settings: 'opsz' 36, 'SOFT' 30;
}

.cms-post-card {
    background: var(--cms-elevated);
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius-lg);
    overflow: hidden;
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-post-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--cms-shadow);
    border-color: var(--cms-rule-strong);
}

.cms-post-card-image {
    aspect-ratio: 16 / 9;
    background-size: cover;
    background-position: center;
    background-color: var(--cms-paper-3);
    border-bottom: 1px solid var(--cms-rule);
}

.cms-post-card-content {
    padding: 1.5rem;
}

.cms-post-card-meta {
    font-family: var(--cms-font-mono);
    font-size: 0.6875rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--cms-ink-muted);
    margin-bottom: 0.5rem;
}

.cms-post-card-title {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: 1.375rem;
    color: var(--cms-ink-strong);
    margin: 0 0 0.5rem;
    line-height: 1.2;
    letter-spacing: -0.014em;
    font-variation-settings: 'opsz' 22, 'SOFT' 30;
}

.cms-post-card-title a {
    color: inherit;
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-post-card-title a:hover {
    color: var(--cms-accent-public);
}

.cms-post-card-excerpt {
    font-size: 0.9375rem;
    line-height: 1.55;
    color: var(--cms-ink-dim);
    margin: 0;
}

.cms-byline {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-family: var(--cms-font-display);
    font-style: italic;
    font-size: 0.875rem;
    color: var(--cms-ink-dim);
    font-variation-settings: 'opsz' 14, 'SOFT' 50;
}

.cms-byline-avatar {
    width: 1.5rem;
    height: 1.5rem;
    border-radius: 50%;
}

.cms-byline-time {
    font-family: var(--cms-font-mono);
    font-style: normal;
    font-size: 0.75rem;
    color: var(--cms-ink-muted);
    letter-spacing: 0;
}

/* -----------------------------------------------------------------
 * 24. Pagination
 * ----------------------------------------------------------------- */
.cms-pagination {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 0.375rem;
    margin-top: 3rem;
    font-family: var(--cms-font-mono);
    font-size: 0.8125rem;
}

.cms-pagination a,
.cms-pagination span {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.25rem;
    height: 2.25rem;
    padding: 0 0.5rem;
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius-sm);
    color: var(--cms-ink-dim);
    text-decoration: none;
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-pagination a:hover {
    border-color: var(--cms-rule-strong);
    color: var(--cms-ink-strong);
}

.cms-pagination .cms-pagination-current {
    background: var(--cms-accent-public);
    border-color: var(--cms-accent-public);
    color: var(--cms-on-accent-public);
}

.cms-pagination-disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

/* -----------------------------------------------------------------
 * 25. Breadcrumbs
 * ----------------------------------------------------------------- */
.cms-breadcrumbs {
    max-width: var(--cms-content-wide);
    margin-inline: auto;
    padding: 1.25rem 1.5rem 0;
    font-family: var(--cms-font-mono);
    font-size: 0.75rem;
    color: var(--cms-ink-muted);
    letter-spacing: 0.02em;
}

.cms-breadcrumbs ol {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    align-items: baseline;
}

.cms-breadcrumbs li + li::before {
    content: '/';
    color: var(--cms-ink-faint);
    margin-right: 0.4rem;
}

.cms-breadcrumbs a {
    color: var(--cms-ink-muted);
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-breadcrumbs a:hover {
    color: var(--cms-ink-strong);
}

.cms-breadcrumbs li:last-child {
    color: var(--cms-ink);
}

/* -----------------------------------------------------------------
 * 23.5. Single post layout
 * ----------------------------------------------------------------- */
.cms-post {
    padding: var(--cms-section-y) 1.5rem;
    max-width: 44rem;
    margin-inline: auto;
}

.cms-post-header {
    text-align: center;
    margin-bottom: 3rem;
    border-bottom: 1px solid var(--cms-rule);
    padding-bottom: 2.25rem;
}

.cms-post-kicker {
    margin-bottom: 1.25rem;
}

.cms-post-kicker a {
    color: inherit;
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-post-kicker a:hover {
    color: var(--cms-accent-public);
}

.cms-post-title {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: clamp(2.25rem, 5vw, 3.5rem);
    line-height: 1.05;
    letter-spacing: -0.022em;
    color: var(--cms-ink-strong);
    margin: 0 0 1rem;
    font-variation-settings: 'opsz' 48, 'SOFT' 30;
}

.cms-post-excerpt {
    font-family: var(--cms-font-display);
    font-style: italic;
    font-weight: 400;
    font-size: 1.25rem;
    line-height: 1.45;
    color: var(--cms-ink-dim);
    max-width: 36rem;
    margin: 0 auto 1.75rem;
    font-variation-settings: 'opsz' 18, 'SOFT' 50;
}

.cms-post-featured {
    margin: 0 -1.5rem 3rem;
    border-radius: 0;
    overflow: hidden;
}

.cms-post-featured img {
    width: 100%;
    height: auto;
    display: block;
    border-radius: var(--cms-radius);
    border: 1px solid var(--cms-rule);
}

.cms-post-body {
    font-family: var(--cms-font-sans);
    font-size: 1.0625rem;
    line-height: 1.65;
    color: var(--cms-ink);
}

.cms-post-tags {
    margin-top: 3.5rem;
    padding-top: 1.75rem;
    border-top: 1px solid var(--cms-rule);
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.625rem;
}

.cms-post-tags-label {
    font-family: var(--cms-font-sans);
    font-size: 0.6875rem;
    font-weight: 500;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--cms-ink-muted);
    margin-right: 0.5rem;
}

.cms-post-tag {
    display: inline-flex;
    align-items: center;
    padding: 0.25rem 0.625rem;
    font-family: var(--cms-font-mono);
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--cms-ink-dim);
    background: var(--cms-paper-2);
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius-xs);
    text-decoration: none;
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-post-tag:hover {
    color: var(--cms-accent-public);
    border-color: var(--cms-accent-public);
}

.cms-post-card-excerpt {
    font-family: var(--cms-font-sans);
    font-size: 0.9375rem;
    line-height: 1.55;
    color: var(--cms-ink-dim);
    margin: 0;
}

/* -----------------------------------------------------------------
 * 25.5. Block — navigation (in-page nav)
 * ----------------------------------------------------------------- */
.cms-block-nav {
    padding: 1.5rem;
    display: flex;
}

.cms-block-nav-align--left   { justify-content: flex-start; }
.cms-block-nav-align--center { justify-content: center; }
.cms-block-nav-align--right  { justify-content: flex-end; }

.cms-block-nav-list > ul {
    display: flex;
    gap: 1.75rem;
    list-style: none;
    margin: 0;
    padding: 0;
    flex-wrap: wrap;
}

/* Vertical variant — for footer-column nav placements. The Navigation
 * block has an `orientation` field that emits this class. */
.cms-block-nav--vertical {
    padding: 0;
    display: block;
}

.cms-block-nav--vertical .cms-block-nav-list > ul {
    flex-direction: column;
    gap: 0.5rem;
    flex-wrap: nowrap;
}

.cms-block-nav-link {
    font-family: var(--cms-font-sans);
    font-weight: 500;
    font-size: var(--cms-text-size-sm);
    color: var(--cms-text);
    text-decoration: none;
    padding: var(--cms-spacing-y-xs) 0;
    border-bottom: 1px solid transparent;
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-block-nav-link:hover,
.cms-block-nav-link[aria-current="page"] {
    color: var(--cms-accent-public);
    border-bottom-color: var(--cms-accent-public);
}

/* Optional heading for the Navigation block — used by footer-column
 * placements where the nav needs a "Company"/"Services" label.
 * Matches CompanyContact heading styling for cross-block consistency. */
.cms-block-nav__heading {
    color: var(--cms-text-strong);
    font-family: var(--cms-font-display);
    font-weight: 500;
    letter-spacing: -0.018em;
    line-height: var(--cms-line-height-tight);
    margin: 0 0 var(--cms-spacing-y);
    font-size: var(--cms-heading-size);
    font-variation-settings: 'opsz' 24, 'SOFT' 30;
}

/* Hamburger toggle button — hidden by default, shown via container
 * query when section narrows (see §1.8). */
.cms-block-nav__toggle {
    display: none;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    padding: 0;
    background: transparent;
    border: 1px solid currentColor;
    border-radius: var(--cms-radius-sm);
    color: var(--cms-text);
    cursor: pointer;
    transition: background var(--cms-dur) var(--cms-ease);
}

.cms-block-nav__toggle:hover {
    background: color-mix(in oklab, currentColor 8%, transparent);
}

/* x-cloak hides Alpine-controlled elements until Alpine initialises
 * (prevents flash of drawer content on initial paint). */
[x-cloak] {
    display: none !important;
}

/* Drawer container — full-screen overlay holding backdrop + panel.
 * Toggled via Alpine x-show in navigation.blade.php. */
.cms-block-nav__drawer {
    position: fixed;
    inset: 0;
    z-index: 200;
    display: block;
}

.cms-block-nav__backdrop {
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    backdrop-filter: blur(2px);
}

.cms-block-nav__panel {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    width: min(85vw, 320px);
    background: var(--cms-paper);
    color: var(--cms-text);
    box-shadow: var(--cms-shadow-lg);
    padding: 1.25rem 1.5rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
    overflow-y: auto;
    transition: transform 240ms var(--cms-ease);
}

/* Alpine x-transition class hooks: enter-start = before-enter
 * (off-screen right), enter-end = after-enter (on-screen). */
.cms-block-nav__panel--enter-start {
    transform: translateX(100%);
}

.cms-block-nav__panel--enter-end {
    transform: translateX(0);
}

.cms-block-nav__close {
    align-self: flex-end;
    width: 2.25rem;
    height: 2.25rem;
    padding: 0;
    background: transparent;
    border: 1px solid currentColor;
    border-radius: var(--cms-radius-sm);
    color: inherit;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.cms-block-nav__close:hover {
    background: color-mix(in oklab, currentColor 8%, transparent);
}

/* Drawer-mode list always vertical, larger touch targets. */
.cms-block-nav-list--drawer ul {
    flex-direction: column !important;
    gap: 0 !important;
    flex-wrap: nowrap !important;
    align-items: stretch !important;
}

.cms-block-nav-list--drawer .cms-block-nav-link {
    display: block;
    padding: 0.875rem 0;
    font-size: var(--cms-text-size-lg);
    border-bottom: 1px solid var(--cms-rule);
}

.cms-block-nav-list--drawer .cms-block-nav-link[aria-current="page"] {
    border-bottom-color: var(--cms-accent-public);
}

/* Sub-menu disclosure — parent item wraps link + chevron button
 * side-by-side. Children list hidden by default; shown via Alpine
 * x-show (JS) and also via CSS :hover for pointer users (progressive
 * enhancement: works without JS for mouse, JS adds touch/keyboard). */
.cms-nav-item--has-children {
    position: relative;
}

.cms-nav-item__parent-wrap {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
}

.cms-nav-item__chevron {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: transparent;
    border: none;
    padding: 0.125rem 0.25rem;
    color: inherit;
    cursor: pointer;
    opacity: 0.65;
    transition: opacity var(--cms-dur) var(--cms-ease);
    line-height: 1;
}

.cms-nav-item__chevron:hover,
.cms-nav-item__chevron:focus-visible {
    opacity: 1;
    outline: 2px solid var(--cms-accent-public);
    outline-offset: 2px;
    border-radius: 2px;
}

/* Sub-menu list — flex column layout is the authoritative display value.
 * Hidden before Alpine initialises via x-cloak ([x-cloak] { display: none !important }).
 * Alpine x-show manages open/closed by adding style="display: none" (closed)
 * or removing the inline style entirely (open) — the inline none beats the
 * class-level flex to hide, and its removal reveals the flex layout cleanly.
 * No !important or attribute-selector hacks needed. */
.cms-nav-sub-menu {
    display: flex;
    flex-direction: column;
    gap: 0;
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 50;
    min-width: 180px;
    background: var(--cms-paper);
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius-sm);
    box-shadow: var(--cms-shadow);
    padding: 0.375rem 0;
    list-style: none;
    margin: 0;
}

/* CSS :hover fallback for pointer devices (augments, not replaces, JS). */
.cms-nav-item--has-children:hover > .cms-nav-sub-menu {
    display: flex;
}

.cms-nav-sub-menu li {
    display: block;
}

.cms-nav-sub-menu .cms-block-nav-link {
    display: block;
    padding: 0.5rem 1rem;
    white-space: nowrap;
    border-bottom: none;
}

.cms-nav-sub-menu .cms-block-nav-link:hover,
.cms-nav-sub-menu .cms-block-nav-link[aria-current="page"] {
    background: color-mix(in oklab, var(--cms-accent-public) 8%, transparent);
    border-bottom: none;
}

/* Trailing CTA — pushed flush-right inside the horizontal flex nav.
 * For vertical-orientation navs the auto-margin has no effect and
 * the button simply renders below the list. */
.cms-block-nav__cta {
    margin-left: auto;
    flex-shrink: 0;
    align-self: center;
}

/* Vertical nav: reset margin so the CTA stacks naturally below the list. */
.cms-block-nav--vertical .cms-block-nav__cta {
    margin-left: 0;
    margin-top: var(--cms-spacing-y-sm);
    align-self: flex-start;
}

/* -----------------------------------------------------------------
 * 25.6. Card body / link supplements
 * ----------------------------------------------------------------- */
.cms-card-body,
.cms-feature-card-body {
    font-family: var(--cms-font-sans);
    font-size: 0.9375rem;
    line-height: 1.55;
    color: var(--cms-ink-dim);
    margin: 0;
}

.cms-card-link {
    display: inline-flex;
    align-items: baseline;
    gap: 0.25rem;
    font-family: var(--cms-font-sans);
    font-size: 0.8125rem;
    font-weight: 500;
    letter-spacing: 0.005em;
    color: var(--cms-accent-public);
    text-decoration: none;
    transition: gap var(--cms-dur) var(--cms-ease);
}

.cms-card-link:hover {
    gap: 0.4rem;
}

/* -----------------------------------------------------------------
 * 26. Reduced motion
 * ----------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    .cms-public-body,
    .cms-public-body *,
    .cms-public-body *::before,
    .cms-public-body *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* -----------------------------------------------------------------
 * 27. Popup overlay
 * ----------------------------------------------------------------- */
.cms-popup-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.5);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 9999;
}

.cms-popup-card {
    background: var(--brand-surface, white);
    color: var(--brand-text, black);
    padding: 2rem;
    border-radius: 0.5rem;
    max-width: 32rem;
    width: calc(100% - 2rem);
    position: relative;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
}

.cms-popup-close {
    position: absolute;
    top: 0.5rem;
    right: 0.75rem;
    background: transparent;
    border: 0;
    font-size: 1.5rem;
    cursor: pointer;
    line-height: 1;
    color: inherit;
    opacity: 0.6;
    transition: opacity var(--cms-dur, 150ms) var(--cms-ease, ease);
}

.cms-popup-close:hover {
    opacity: 1;
}

.cms-popup-body {
    margin-top: 0.75rem;
}

.cms-popup-cta {
    display: inline-block;
    margin-top: 1rem;
    padding: 0.625rem 1.25rem;
    background: var(--brand-primary, #2563eb);
    color: white;
    text-decoration: none;
    border-radius: 0.375rem;
    font-family: var(--cms-font-sans);
    font-size: 0.9375rem;
    font-weight: 500;
    transition: opacity var(--cms-dur, 150ms) var(--cms-ease, ease);
}

.cms-popup-cta:hover {
    opacity: 0.9;
}

/* -----------------------------------------------------------------
 * 27b. Columns block — multi-column layout primitive
 *      Mobile: single column (or reverse-stacked). Tablet+ ≥768px: 2/3/4 cols.
 * ----------------------------------------------------------------- */
.cms-block-columns {
    display: grid;
    grid-template-columns: 1fr;
    align-items: flex-start;
}

.cms-block-columns__col {
    min-width: 0; /* let grid children shrink */
}

/* Gaps */
.cms-block-columns--gap-sm { gap: 1rem; }
.cms-block-columns--gap-md { gap: 1.5rem; }
.cms-block-columns--gap-lg { gap: 2rem; }

/* Vertical alignment */
.cms-block-columns--align-start   { align-items: flex-start; }
.cms-block-columns--align-center  { align-items: center; }
.cms-block-columns--align-end     { align-items: flex-end; }
.cms-block-columns--align-stretch { align-items: stretch; }

/* Mobile reverse-stack: flip order on small screens */
.cms-block-columns--mobile-stack-reverse {
    direction: rtl; /* trick: reverse visual order without changing source */
}
.cms-block-columns--mobile-stack-reverse > .cms-block-columns__col {
    direction: ltr; /* restore content direction inside cells */
}

/* Tablet+: switch to multi-column grid */
@media (min-width: 768px) {
    .cms-block-columns--cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .cms-block-columns--cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .cms-block-columns--cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }

    /* On tablet+ the reverse-stack trick is unnecessary — restore normal flow */
    .cms-block-columns--mobile-stack-reverse {
        direction: ltr;
    }
}

/* -----------------------------------------------------------------
 * 27.5. Block — company contact (Site-Settings-driven contact card)
 * ----------------------------------------------------------------- */
.cms-block-company-contact {
    color: var(--cms-text);
    font-family: var(--cms-font-sans);
    font-size: var(--cms-text-size);
    line-height: var(--cms-line-height);
}

.cms-block-company-contact__heading {
    color: var(--cms-text-strong);
    font-family: var(--cms-font-display);
    font-weight: 500;
    letter-spacing: -0.018em;
    line-height: var(--cms-line-height-tight);
    margin: 0 0 var(--cms-spacing-y);
    font-size: var(--cms-heading-size);
    font-variation-settings: 'opsz' 24, 'SOFT' 30;
}

.cms-block-company-contact > * + * {
    margin-top: var(--cms-spacing-y-sm);
}

.cms-block-company-contact a {
    color: var(--cms-link);
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}

.cms-block-company-contact a:hover {
    color: var(--cms-link-hover);
    text-decoration: underline;
}

/* Reset browser <address> tag default italic */
.cms-block-company-contact__address,
.cms-block-company-contact address {
    font-style: normal;
}

.cms-block-company-contact__address p {
    margin: 0;
}

.cms-block-company-contact__hours p {
    margin: 0;
    color: var(--cms-text-muted);
    font-size: var(--cms-text-size-sm);
}

/* -----------------------------------------------------------------
 * 28. Editor-only placeholder blocks
 *     Shown only in the visual editor canvas, never on public pages.
 * ----------------------------------------------------------------- */
@media not print {
    .cms-block-nav--editor-placeholder,
    .cms-block-breadcrumbs--editor-placeholder,
    .cms-block-content-slot--editor-placeholder,
    .cms-block-company-contact--editor-placeholder,
    .cms-block-part-reference--editor-placeholder {
        padding: 0.75rem 1rem;
        border: 1px dashed currentColor;
        border-radius: 0.375rem;
        font-size: 0.875rem;
        opacity: 0.7;
    }
}


/* -----------------------------------------------------------------
 * Block — content list (dynamic record listing)
 * ----------------------------------------------------------------- */
.cms-block-content-list {
    padding: var(--cms-section-y) 1.5rem;
}

.cms-block-content-list__heading {
    margin-bottom: 2rem;
}

.cms-block-content-list__empty {
    color: var(--cms-ink-dim);
    font-size: 0.9375rem;
    margin-top: 1rem;
}

/* -- Grid layout (default: 3-col responsive) ---------------------- */
.cms-block-content-list--grid .cms-block-content-list__items {
    display: grid;
    gap: 2rem;
    grid-template-columns: 1fr;
    max-width: var(--cms-content-wide);
    margin-inline: auto;
}

@media (min-width: 640px) {
    .cms-block-content-list--grid .cms-block-content-list__items {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 1000px) {
    .cms-block-content-list--grid .cms-block-content-list__items {
        grid-template-columns: repeat(3, 1fr);
    }
}

/* -- List layout (vertical stack) --------------------------------- */
.cms-block-content-list--list .cms-block-content-list__items {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    max-width: var(--cms-content-wide);
    margin-inline: auto;
}

.cms-block-content-list--list .cms-block-content-list__item {
    display: flex;
    gap: 1.5rem;
    align-items: flex-start;
}

.cms-block-content-list--list .cms-block-content-list__image,
.cms-block-content-list--list .cms-block-content-list__image-link {
    flex: 0 0 9rem;
    width: 9rem;
}

.cms-block-content-list--list .cms-block-content-list__content {
    flex: 1;
}

/* -- Featured layout (first item full-width, rest 2-col) ---------- */
.cms-block-content-list--featured .cms-block-content-list__items {
    display: grid;
    gap: 2rem;
    grid-template-columns: 1fr;
    max-width: var(--cms-content-wide);
    margin-inline: auto;
}

.cms-block-content-list--featured .cms-block-content-list__item:first-child {
    grid-column: 1 / -1;
}

@media (min-width: 640px) {
    .cms-block-content-list--featured .cms-block-content-list__items {
        grid-template-columns: repeat(2, 1fr);
    }

    .cms-block-content-list--featured .cms-block-content-list__item:first-child {
        grid-column: 1 / -1;
    }
}

/* -- Shared item styling ------------------------------------------ */
.cms-block-content-list__item {
    position: relative;
    background: var(--cms-elevated);
    border: 1px solid var(--cms-rule);
    border-radius: var(--cms-radius);
    overflow: hidden;
    transition: all var(--cms-dur) var(--cms-ease);
}

.cms-block-content-list__item:hover {
    border-color: var(--cms-rule-strong);
    transform: translateY(-2px);
    box-shadow: var(--cms-shadow);
}

.cms-block-content-list--list .cms-block-content-list__item {
    padding: 1rem;
}

.cms-block-content-list__image-link {
    display: block;
}

.cms-block-content-list__image {
    aspect-ratio: 16 / 10;
    background-size: cover;
    background-position: center;
    background-color: var(--cms-paper-3);
}

.cms-block-content-list__image--empty {
    aspect-ratio: 16 / 10;
    background-color: var(--cms-paper-3);
}

.cms-block-content-list--list .cms-block-content-list__image,
.cms-block-content-list--list .cms-block-content-list__image--empty {
    aspect-ratio: 4 / 3;
    border-radius: var(--cms-radius-sm);
}

.cms-block-content-list__content {
    padding: 1.25rem 1.5rem 1.5rem;
}

.cms-block-content-list--list .cms-block-content-list__content {
    padding: 0;
}

.cms-block-content-list__title {
    font-family: var(--cms-font-display);
    font-weight: 500;
    font-size: 1.125rem;
    color: var(--cms-ink-strong);
    margin: 0 0 0.5rem;
    letter-spacing: -0.012em;
    font-variation-settings: 'opsz' 18, 'SOFT' 30;
}

.cms-block-content-list__title-link {
    color: inherit;
    text-decoration: none;
}

.cms-block-content-list__title-link:hover {
    color: var(--cms-accent-public);
}

.cms-block-content-list__excerpt {
    font-size: 0.9375rem;
    line-height: 1.55;
    color: var(--cms-ink-dim);
    margin: 0 0 1rem;
}

.cms-block-content-list__read-more {
    display: inline-block;
    margin-top: 0.5rem;
}

/* Featured-first: make the hero item's image taller */
.cms-block-content-list--featured .cms-block-content-list__item:first-child .cms-block-content-list__image,
.cms-block-content-list--featured .cms-block-content-list__item:first-child .cms-block-content-list__image--empty {
    aspect-ratio: 16 / 7;
}

/* -----------------------------------------------------------------
 * Back-to-top block
 * ----------------------------------------------------------------- */
.cms-back-to-top {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    border: 1px solid var(--cms-rule, currentColor);
    border-radius: var(--cms-radius-md, 6px);
    background: transparent;
    color: inherit;
    cursor: pointer;
    transition: background-color 0.2s, color 0.2s, transform 0.2s, opacity 0.3s, visibility 0.3s;
    opacity: 0;
    visibility: hidden;
}
.cms-back-to-top--visible {
    opacity: 1;
    visibility: visible;
}
.cms-back-to-top:hover {
    transform: translateY(-2px);
}
.cms-back-to-top--fixed {
    position: fixed;
    right: 1.5rem;
    bottom: 1.5rem;
    z-index: 40;
}
.cms-back-to-top--primary { background: var(--brand-accent, var(--brand-orange, #f7a712)); color: var(--brand-carbon-black, #0a0a0a); border-color: transparent; }
.cms-back-to-top--ghost { border-color: transparent; }

/* -----------------------------------------------------------------
 * 30. Breadcrumbs block
 *
 * Distinct from the .cms-breadcrumbs Blade component (§23 ish) — that
 * is a template-author primitive with hardcoded slash separator. The
 * block surface (.cms-block-breadcrumbs) exposes separator and
 * alignment props to editor users and bundles an optional trailing CTA
 * slot for the "breadcrumbs + Quote button in one bar" pattern.
 *
 * Markup contract (WAI-ARIA APG):
 *   .cms-block-breadcrumbs > nav[aria-label="Breadcrumb"] > ol > li
 *   .cms-block-breadcrumbs__current carries aria-current="page"
 *   Separators are CSS pseudo-elements so screen readers skip them.
 * ----------------------------------------------------------------- */
.cms-block-breadcrumbs {
    display: flex;
    align-items: center;
    gap: 1rem;
    font-family: var(--cms-font-mono);
    font-size: 0.75rem;
    color: var(--cms-ink-muted);
    letter-spacing: 0.02em;
}
.cms-block-breadcrumbs--align-left   { justify-content: flex-start; }
.cms-block-breadcrumbs--align-center { justify-content: center; }
.cms-block-breadcrumbs--align-right  { justify-content: flex-end; }

.cms-block-breadcrumbs__nav {
    min-width: 0; /* allow flex item to shrink so long trails wrap rather than overflow */
}
.cms-block-breadcrumbs__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    align-items: baseline;
}
.cms-block-breadcrumbs__item {
    display: inline-flex;
    align-items: baseline;
    gap: 0.4rem;
}
/* Separator between adjacent items, generated via ::before so it's
 * outside the document tree and skipped by screen readers (CSS
 * generated content is not exposed to AT in any current browser/AT
 * combination). */
.cms-block-breadcrumbs__item + .cms-block-breadcrumbs__item::before {
    color: var(--cms-ink-faint);
}
.cms-block-breadcrumbs--sep-chevron .cms-block-breadcrumbs__item + .cms-block-breadcrumbs__item::before { content: '\203A'; /* › */ }
.cms-block-breadcrumbs--sep-slash   .cms-block-breadcrumbs__item + .cms-block-breadcrumbs__item::before { content: '/'; }
.cms-block-breadcrumbs--sep-arrow   .cms-block-breadcrumbs__item + .cms-block-breadcrumbs__item::before { content: '\2192'; /* → */ }
.cms-block-breadcrumbs--sep-bullet  .cms-block-breadcrumbs__item + .cms-block-breadcrumbs__item::before { content: '\2022'; /* • */ }

.cms-block-breadcrumbs__link {
    color: var(--cms-ink-muted);
    text-decoration: none;
    transition: color var(--cms-dur) var(--cms-ease);
}
.cms-block-breadcrumbs__link:hover,
.cms-block-breadcrumbs__link:focus-visible {
    color: var(--cms-ink-strong);
}
.cms-block-breadcrumbs__current {
    color: var(--cms-ink);
    font-weight: 500;
}

/* Trailing CTA flush-right: only applies when alignment is left or
 * center; right alignment would have the CTA sit immediately after
 * the trail rather than at the container edge. */
.cms-block-breadcrumbs--align-left .cms-block-breadcrumbs__cta,
.cms-block-breadcrumbs--align-center .cms-block-breadcrumbs__cta {
    margin-left: auto;
}

/* ------------------------------------------------------------------ *
 * Tabs / TabPanel
 * The server renders an ARIA tablist with every panel visible (the
 * no-JS baseline). The inline enhancer hides inactive panels via the
 * [hidden] attribute once JS runs. Dark panels inherit child-text
 * contrast from the global [data-cms-bg="dark"] rules in §1.6.
 * ------------------------------------------------------------------ */
.cms-block-tabs {
    margin-block: 1.5rem;
}
.cms-tabs-tablist {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    border-bottom: 1px solid color-mix(in oklab, var(--cms-ink, #111827) 15%, transparent);
    margin-bottom: 1.25rem;
}
.cms-tabs-tablist--center {
    justify-content: center;
}
.cms-tabs-tablist--end {
    justify-content: flex-end;
}
.cms-tabs-tab {
    appearance: none;
    display: inline-block;
    padding: 0.6rem 1rem;
    border: 0;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    background: transparent;
    color: var(--cms-ink, #111827);
    font: inherit;
    font-weight: 500;
    line-height: 1.2;
    text-decoration: none;
    cursor: pointer;
    transition: color 0.15s ease, border-color 0.15s ease;
}
.cms-tabs-tab:hover {
    color: var(--brand-primary, #2238c2);
}
.cms-tabs-tab[aria-selected="true"] {
    color: var(--brand-primary, #2238c2);
    border-bottom-color: var(--brand-primary, #2238c2);
}
.cms-tabs-tab:focus-visible {
    outline: 2px solid var(--brand-primary, #2238c2);
    outline-offset: 2px;
    border-radius: 2px;
}
.cms-block-tab-panel[hidden] {
    display: none;
}

/* --- Tabs: buttons variant (opt-in via the `variant` design field) ------ *
 * Each tab renders as a real button: solid border, filled selected state,
 * no underline. Border/text use --cms-ink so they follow the section's
 * light/dark scheme (aliased to --cms-text under [data-cms-bg="dark"], see
 * §1.6); the selected fill always uses the brand primary + its declared
 * on-primary text so it stays legible regardless of scheme. */
.cms-tabs-tablist--buttons {
    border-bottom: none;
    gap: 0.5rem;
}
.cms-tabs-tablist--buttons .cms-tabs-tab {
    border: 1px solid color-mix(in oklab, var(--cms-ink, #111827) 35%, transparent);
    border-radius: var(--cms-radius, 0.375rem);
    padding: 0.75rem 1.25rem;
    margin-bottom: 0;
    color: var(--cms-ink, #111827);
}
.cms-tabs-tablist--buttons .cms-tabs-tab:hover {
    color: var(--cms-ink, #111827);
    border-color: color-mix(in oklab, var(--cms-ink, #111827) 55%, transparent);
    background: color-mix(in oklab, var(--cms-ink, #111827) 8%, transparent);
}
.cms-tabs-tablist--buttons .cms-tabs-tab[aria-selected="true"] {
    background: var(--brand-primary, #2238c2);
    border-color: var(--brand-primary, #2238c2);
    color: var(--brand-on-primary, #111827);
}
.cms-tabs-tablist--buttons .cms-tabs-tab[aria-selected="true"]:hover {
    background: var(--brand-primary, #2238c2);
    color: var(--brand-on-primary, #111827);
}
.cms-tabs-tablist--buttons .cms-tabs-tab[aria-selected="true"]:focus-visible {
    outline-color: var(--brand-on-primary, #111827);
}

/* --- Tabs: mobileSelect field --------------------------------------- *
 * Renders a native <select> alongside the tablist. It is only shown once
 * the enhancer script has run (root gets `.is-enhanced`) AND the viewport
 * is narrow — without JS, or on wider viewports, the select stays hidden
 * and the tablist (or the no-JS stacked-panel fallback) is what's shown. */
.cms-tabs-select-label {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
.cms-tabs-select {
    display: none;
    width: 100%;
    min-height: 44px;
    padding: 0.5rem 0.75rem;
    margin-bottom: 1.25rem;
    border: 1px solid var(--cms-rule-strong, #cdc6b3);
    border-radius: var(--cms-radius, 0.375rem);
    background: var(--cms-elevated, #ffffff);
    color: var(--cms-ink, #111827);
    font: inherit;
}
[data-cms-bg="dark"] .cms-tabs-select {
    color-scheme: dark;
}
@media (max-width: 639px) {
    .cms-block-tabs--mobile-select.is-enhanced > .cms-tabs-select {
        display: block;
    }
    .cms-block-tabs--mobile-select.is-enhanced > .cms-tabs-tablist {
        display: none;
    }
}

} /* end @layer base */
