/* GENERATED by scripts/build-hope-skin.mjs from public-ui.css - do not edit. */
/* No @import for the Outfit webfont. Every surface that loads this file — all 20
   static pages and the worker's SEO shell — already carries the identical
   <link> in its own <head>, where the browser finds it in the first bytes of
   the document. An @import here is discovered only AFTER this stylesheet has
   downloaded and parsed, so it added a second, later, render-blocking edge to
   the critical path for a font already in flight. (offline.html is the one page
   that never loads this file at all — it is fully self-contained, on purpose,
   because it is served by the service worker when nothing else can be.) */
/* ============================================================
   JHB DESIGN TOKENS
   Single source of truth for the Joe Homebuyer visual system.
   Edit colors here, in tailwind-config.js, and in
   franchise.config.json (build-script driven) to keep all three
   in sync. CSS custom properties are referenced throughout
   public-ui.css and can be used inline anywhere on the site.
   ============================================================ */
:root {
    /* Brand colors */
    --brand-navy: #13436b;
    --brand-navy-deep: #0b1f3d;
    --brand-navy-soft: #13436b;
    --brand-red: #b11d29;
    --brand-red-deep: #8f0f1c;
    --brand-red-soft: #b11d29;
    --brand-paper: #eef3f9;

    /* Surface tokens (for cards / panels / nav) */
    --surface-0: #ffffff;
    --surface-1: #ffffff;
    --surface-2: #eef3f9;
    --surface-3: #eef3f9;

    /* Ink (text) tokens */
    --ink-strong: #0f1c33;
    --ink-body: #13436b;
    --ink-muted: #36598d;
    --ink-faint: #88a0c2;

    /* Border tokens */
    --line-strong: rgba(136, 160, 194, 0.55);
    --line: rgba(136, 160, 194, 0.32);
    --line-soft: rgba(136, 160, 194, 0.18);

    /* Radius scale */
    --radius-xs: 6px;
    --radius-sm: 12px;
    --radius-md: 12px;
    --radius-lg: 12px;
    --radius-xl: 16px;
    --radius-2xl: 16px;

    /* Shadow scale (cards / hovers / heros) */
    --shadow-sm: 0 1px 2px rgba(11, 31, 61, 0.04), 0 6px 14px -8px rgba(11, 31, 61, 0.08);
    --shadow-md: 0 1px 2px rgba(11, 31, 61, 0.04), 0 14px 28px -10px rgba(11, 31, 61, 0.12);
    --shadow-lg: 0 1px 2px rgba(11, 31, 61, 0.04), 0 22px 44px -14px rgba(11, 31, 61, 0.16);
    --shadow-hover: 0 1px 2px rgba(11, 31, 61, 0.04), 0 28px 52px -14px rgba(11, 31, 61, 0.18);

    /* Brand-tinted shadows for primary/secondary buttons */
    --shadow-red: 0 1px 0 rgba(255, 255, 255, 0.18) inset, 0 14px 28px -8px rgba(177, 29, 41, 0.45);
    --shadow-navy: 0 1px 0 rgba(255, 255, 255, 0.16) inset, 0 14px 28px -8px rgba(11, 31, 61, 0.45);

    /* Motion */
    --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
    --transition-fast: 140ms var(--ease-out);
    --transition-base: 220ms var(--ease-out);

    /* Legacy public-* tokens kept for back-compat with existing rules below */
    --public-bg-top: #ffffff;
    --public-bg-bottom: #eef3f9;
    --public-ink: var(--ink-strong);
    --public-muted: var(--ink-body);
    --public-line: var(--line);
    --public-glass: rgba(255, 255, 255, 0.82);
    --public-glass-strong: rgba(255, 255, 255, 0.92);
    --public-shadow: var(--shadow-lg);
    --public-shadow-soft: var(--shadow-md);
    --public-nav-shadow: 0 18px 42px rgba(11, 31, 61, 0.08);
    --public-hero-shadow: 0 34px 70px rgba(11, 31, 61, 0.15);
    --public-radius-xl: 16px;
    --public-radius-lg: 16px;
    --public-floating-inset-x: clamp(0.95rem, 1.35vw, 1.35rem);
    --public-floating-inset-y: clamp(0.95rem, 1.35vw, 1.2rem);
}

/* ============================================================
   JHB UTILITY CLASSES — opt-in, theme-cohesive primitives.
   New components should use these; older components still work
   via legacy tokens above.
   ============================================================ */

/* Eyebrow label — small uppercase tracker above headlines */
.jhb-eyebrow {
    display: inline-block;
    font-family: 'Inter', sans-serif;
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--brand-red);
}

/* Display headline — Outfit, tight tracking, strong weight */
.jhb-display {
    font-family: 'Inter', sans-serif;
    font-weight: 800;
    color: var(--brand-navy);
    letter-spacing: -0.024em;
    line-height: 1.08;
}

/* Card primitive — unified surface for all cards across the site */
.jhb-card {
    background: var(--surface-0);
    border: 1px solid var(--line-soft);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    transition: transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base);
}
.jhb-card-hover:hover,
.jhb-card.is-interactive:hover {
    transform: translateY(-3px);
    box-shadow: var(--shadow-hover);
    border-color: var(--line);
}

/* Top accent stripe (red→navy) for hero cards */
.jhb-accent-bar::before {
    content: '';
    display: block;
    height: 3px;
    border-radius: 3px 3px 0 0;
    background: linear-gradient(90deg, var(--brand-red), var(--brand-navy));
}

/* Focus ring — applied automatically to interactive elements */
:where(button, a, input, textarea, select, [tabindex]):focus-visible {
    outline: 2px solid var(--brand-navy);
    outline-offset: 2px;
    border-radius: 4px;
}

body.public-body {
    color: var(--public-ink);
    background:
        radial-gradient(circle at top left, rgba(136, 160, 194, 0.12), transparent 24%),
        radial-gradient(circle at top right, rgba(177, 29, 41, 0.1), transparent 22%),
        linear-gradient(180deg, var(--public-bg-top) 0%, var(--public-bg-bottom) 100%);
}

body.public-body nav.site-nav {
    /* Opaque instead of translucent+blur: the fixed nav re-rasterized its
       backdrop every scroll frame, the page's #1 scroll-jank source. */
    background: rgba(255, 255, 255, 0.97);
    border-bottom: 1px solid rgba(223, 232, 243, 0.72);
    box-shadow: var(--public-nav-shadow);
}

body.public-body .site-brand {
    gap: 0.78rem;
    text-decoration: none;
}

body.public-body .site-logo-badge {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    width: 2.72rem;
    height: 2.72rem;
    border-radius: 12px;
    background: linear-gradient(160deg, #0b1f3d 0%, #13436b 64%, #36598d 100%);
    box-shadow: 0 16px 28px rgba(11, 31, 61, 0.18);
    transition: transform 160ms ease, box-shadow 160ms ease;
}

body.public-body .site-brand:hover .site-logo-badge {
    transform: translateY(-1px);
    box-shadow: 0 20px 32px rgba(11, 31, 61, 0.22);
}

body.public-body .site-logo-badge::before {
    content: '';
    position: absolute;
    inset: 1px;
    border-radius: inherit;
    border: 1px solid rgba(255, 255, 255, 0.14);
}

body.public-body .site-logo-badge::after {
    content: '';
    position: absolute;
    inset: -12px auto auto -10px;
    width: 36px;
    height: 36px;
    border-radius: 9999px;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0.08) 48%, transparent 74%);
}

body.public-body .site-logo-house {
    position: relative;
    z-index: 1;
    width: 1.34rem;
    height: 1.34rem;
    color: #ffffff;
}

body.public-body .site-wordmark {
    color: #13436b;
    font-size: clamp(1.58rem, 1.22rem + 0.78vw, 1.88rem);
    font-family: "Outfit", "Segoe UI", Arial, sans-serif;
    font-weight: 700;
    letter-spacing: -0.05em;
    line-height: 1;
    text-rendering: optimizeLegibility;
}

body.public-body .site-nav-link {
    position: relative;
    color: #13436b;
    transition: color 160ms ease, transform 160ms ease;
}

body.public-body .site-nav-link:hover {
    color: #0f1c33;
    transform: translateY(-1px);
}

body.public-body .site-nav-link-active {
    color: #0b1f3d;
}

body.public-body .site-nav-link-active::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: -0.5rem;
    height: 2px;
    border-radius: 9999px;
    background: linear-gradient(90deg, #13436b, #b11d29);
}

body.public-body .site-mobile-panel {
    background: rgba(255, 255, 255, 0.9);
    border-top: 1px solid rgba(223, 232, 243, 0.82);
    box-shadow: 0 18px 42px rgba(11, 31, 61, 0.08);
    backdrop-filter: blur(14px);
}

body.public-body .site-mobile-link {
    border-radius: 12px;
    transition: background-color 160ms ease, color 160ms ease;
}

body.public-body .site-mobile-link:hover {
    background: rgba(238, 243, 249, 0.92);
}

body.public-body .site-hero {
    position: relative;
    overflow: hidden;
    background:
        radial-gradient(circle at top right, rgba(255, 255, 255,0.26), transparent 24%),
        linear-gradient(180deg, rgba(255, 255, 255,0.68) 0%, rgba(255, 255, 255,0.38) 100%);
}

body.public-body .site-hero::before {
    content: '';
    position: absolute;
    inset: 5rem auto auto -5rem;
    width: 15rem;
    height: 15rem;
    border-radius: 9999px;
    background: rgba(19, 67, 107, 0.08);
    filter: blur(6px);
}

body.public-body .site-hero::after {
    content: '';
    position: absolute;
    right: -4rem;
    bottom: -5rem;
    width: 17rem;
    height: 17rem;
    border-radius: 9999px;
    background: rgba(177, 29, 41, 0.12);
    filter: blur(10px);
}

body.public-body .hero-pattern {
    background-image: linear-gradient(180deg, rgba(19, 67, 107, 0.028) 0%, transparent 42%);
}

body.public-body .site-header-logo {
    height: 44px;
    width: auto;
    max-width: 180px;
    display: block;
}
@media (min-width: 768px) {
    body.public-body .site-header-logo {
        height: 48px;
    }
}

body.public-body .site-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.65rem 1rem;
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255,0.55);
    background: rgba(255, 255, 255, 0.72);
    box-shadow: 0 14px 30px rgba(11, 31, 61, 0.08);
    backdrop-filter: blur(12px);
}

body.public-body .site-hero-card {
    position: relative;
    overflow: hidden;
    border-radius: var(--public-radius-xl);
    border: 1px solid rgba(255, 255, 255,0.76);
    box-shadow: var(--public-hero-shadow);
}

body.public-body .site-hero-card::before {
    content: '';
    position: absolute;
    inset: auto auto -2rem -2rem;
    width: 9rem;
    height: 9rem;
    border-radius: 9999px;
    background: rgba(255, 255, 255,0.18);
    z-index: 0;
}

body.public-body .site-hero-stat {
    background: rgba(255, 255, 255, 0.86);
    border: 1px solid rgba(255, 255, 255,0.82);
    box-shadow: 0 22px 42px rgba(11, 31, 61, 0.12);
    backdrop-filter: blur(14px);
}

body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary {
    position: relative;
    overflow: hidden;
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-md);
    border: 1px solid rgba(255, 255, 255,0.15);
    letter-spacing: 0.01em;
    transition: transform var(--transition-base), box-shadow var(--transition-base), filter var(--transition-fast);
}

body.public-body .btn-primary,
body.public-body .site-button-primary {
    background: linear-gradient(160deg, var(--brand-red-soft) 0%, var(--brand-red) 40%, var(--brand-red-deep) 100%);
    text-shadow: 0 1px 2px rgba(11, 31, 61,0.15);
    box-shadow: var(--shadow-red);
}

body.public-body .btn-secondary,
body.public-body .site-button-secondary {
    background: linear-gradient(160deg, var(--brand-navy-soft) 0%, var(--brand-navy) 40%, var(--brand-navy-deep) 100%);
    text-shadow: 0 1px 2px rgba(11, 31, 61,0.18);
    box-shadow: var(--shadow-navy);
}

body.public-body .btn-primary:hover,
body.public-body .btn-secondary:hover,
body.public-body .site-button-primary:hover,
body.public-body .site-button-secondary:hover {
    transform: translateY(-2px);
    filter: brightness(1.05);
}

body.public-body .btn-primary:active,
body.public-body .btn-secondary:active,
body.public-body .site-button-primary:active,
body.public-body .site-button-secondary:active {
    transform: translateY(0);
    filter: brightness(0.98);
}

body.public-body .btn-primary::before,
body.public-body .btn-secondary::before,
body.public-body .site-button-primary::before,
body.public-body .site-button-secondary::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg, rgba(255, 255, 255,0.2) 0%, transparent 50%, rgba(0, 0, 0,0.06) 100%);
    pointer-events: none;
}

body.public-body .card-hover,
body.public-body .deal-card,
body.public-body .public-card-hover {
    border: 1px solid rgba(255, 255, 255,0.74);
    box-shadow: var(--public-shadow-soft);
}

body.public-body .card-hover,
body.public-body .public-card-hover {
    background: linear-gradient(180deg, rgba(255, 255, 255,0.95), rgba(255, 255, 255,0.82));
}

body.public-body .card-hover:hover,
body.public-body .deal-card:hover,
body.public-body .public-card-hover:hover {
    transform: translateY(-5px);
    box-shadow: var(--public-shadow);
}

body.public-body .deal-card {
    background: var(--surface-0);
    border: 1px solid var(--line-soft);
    border-radius: var(--radius-xl);
    box-shadow: var(--shadow-md);
    transition: transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base);
}
body.public-body .deal-card:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-hover);
    border-color: var(--line);
}

body.public-body .deal-card .property-image {
    transform: scale(1.01);
    transition: transform 220ms ease, filter 220ms ease;
    filter: saturate(1.02) contrast(1.02);
}

body.public-body .deal-card:hover .property-image {
    transform: scale(1.04);
    filter: saturate(1.06) contrast(1.04);
}

body.public-body .deal-card .status-badge {
    border: 1px solid rgba(255, 255, 255,0.22);
    box-shadow: 0 14px 26px rgba(11, 31, 61, 0.18);
}

body.public-body .deal-card .grid.grid-cols-3 > div {
    border: 1px solid rgba(223, 232, 243, 0.92);
    background: linear-gradient(180deg, rgba(255, 255, 255,0.96), rgba(238, 243, 249,0.88));
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.7);
}

body.public-body .deal-type-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.35rem;
    background: #13436b;
    color: #ffffff;
    padding: 4px 10px;
    border-radius: 8px;
    font-size: 12px;
    font-weight: 600;
    line-height: 1;
    letter-spacing: 0.01em;
    box-shadow: 0 10px 20px rgba(11, 31, 61, 0.18);
}

body.public-body .deal-address-lock {
    display: block;
    margin-top: 0.75rem;
}

body.public-body .deal-address-lock-detail {
    margin-top: 0;
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    width: fit-content;
    max-width: 100%;
}

body.public-body .deal-address-line {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.55rem;
    line-height: 1.45;
}

body.public-body .deal-street-wrap {
    display: inline-flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.32rem;
    min-height: 1.4rem;
    min-width: 0;
}

body.public-body .deal-street-number,
body.public-body .deal-street-name {
    display: inline-flex;
    align-items: center;
}

body.public-body .deal-street-number {
    white-space: nowrap;
    color: #13436b;
}

body.public-body .street-blur {
    filter: blur(4px);
    opacity: 0.95;
    user-select: none;
    pointer-events: none;
    transition: filter 220ms ease, color 220ms ease;
}

body.public-body .street-blur.unlocked,
body.public-body .deal-address-lock.is-unlocked .street-blur {
    filter: none;
    user-select: text;
    pointer-events: auto;
}

body.public-body .deal-address-inline-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    white-space: nowrap;
    border-radius: 8px;
    border: 1px solid rgba(177, 29, 41, 0.18);
    background: linear-gradient(135deg, rgba(177, 29, 41, 0.14), rgba(255, 255, 255, 0.96));
    padding: 0.38rem 0.78rem;
    font-size: 0.71rem;
    font-weight: 800;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: #b11d29;
    box-shadow: 0 12px 24px rgba(177, 29, 41, 0.12);
    cursor: pointer;
}

body.public-body .deal-address-lock.is-unlocked .deal-address-inline-badge {
    display: none;
}

body.public-body .deal-locality {
    color: #13436b;
    font-weight: 600;
    white-space: nowrap;
}

body.public-body .deal-address-meta {
    margin-top: 0.7rem;
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.85rem;
    padding: 0.9rem 1rem;
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.9);
    background: linear-gradient(180deg, rgba(238, 243, 249,0.95), rgba(255, 255, 255,0.92));
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.72);
}

body.public-body .deal-address-note {
    flex: 1 1 18rem;
    font-size: 0.82rem;
    line-height: 1.45;
    color: #36598d;
}

body.public-body .deal-address-actions {
    display: inline-flex;
    flex: 0 0 auto;
    align-items: center;
}

body.public-body .deal-address-chip,
body.public-body .buyer-secondary-cta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    border-radius: 12px;
    border: 1px solid rgba(19, 67, 107, 0.16);
    background: linear-gradient(135deg, rgba(255, 255, 255,0.96), rgba(238, 243, 249,0.92));
    padding: 0.88rem 1.2rem;
    font-size: 0.88rem;
    font-weight: 800;
    color: #13436b;
    box-shadow: 0 16px 30px rgba(11, 31, 61, 0.1);
    transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease, background-color 160ms ease;
    cursor: pointer;
}

body.public-body .deal-address-chip:hover,
body.public-body .buyer-secondary-cta:hover {
    transform: translateY(-1px);
    border-color: rgba(177, 29, 41, 0.2);
    box-shadow: 0 20px 34px rgba(11, 31, 61, 0.14);
}

body.public-body .deal-address-lock.is-unlocked .deal-address-chip {
    background: rgba(22, 163, 74, 0.08);
    border-color: rgba(22, 163, 74, 0.18);
    color: #047857;
}

body.public-body .deal-address-lock-compact {
    margin-top: 0;
}

body.public-body .deal-address-lock-compact .deal-address-line {
    gap: 0.4rem;
}

body.public-body .deal-address-lock-compact .deal-locality {
    font-weight: 500;
    white-space: normal;
}

body.public-body .deal-location-lock-shell {
    background: linear-gradient(180deg, rgba(223, 232, 243, 0.22), rgba(255, 255, 255,0.12));
}

/* Locked-map backdrop — was a CSS-gradient illusion. Now the JS embeds
   a real Google Maps iframe at city-level zoom (no street address) and
   we hard-blur it here so the map reads as authentic Google Maps tiles
   without ever revealing the property location. The .deal-location-lock-map
   selector is kept as a fallback for any caller that hasn't migrated. */
body.public-body .deal-location-lock-iframe {
    border: 0;
    pointer-events: none;
    /* Oversize the iframe + translate it back so the soft blur edges fall
       outside the visible frame — no gray fringe around the blurred tiles. */
    width: calc(100% + 80px);
    height: calc(100% + 80px);
    transform: translate(-40px, -40px);
    filter: blur(8px) saturate(1.18) contrast(1.04);
    -webkit-filter: blur(8px) saturate(1.18) contrast(1.04);
    will-change: transform;
}

body.public-body .deal-location-lock-map {
    background:
        radial-gradient(circle at 30% 25%, rgba(223, 232, 243, 0.6), transparent 55%),
        radial-gradient(circle at 75% 70%, rgba(68, 215, 146, 0.5), transparent 55%),
        linear-gradient(135deg, rgba(238, 243, 249, 0.95), rgba(230, 248, 239, 0.95));
}

body.public-body .deal-location-lock-overlay {
    background:
        radial-gradient(circle at center, rgba(255, 255, 255,0.04), rgba(255, 255, 255,0.14) 70%, rgba(255, 255, 255,0.24) 100%),
        linear-gradient(180deg, rgba(255, 255, 255,0.08), rgba(238, 243, 249,0.18));
    backdrop-filter: blur(2px) saturate(1.05);
    -webkit-backdrop-filter: blur(2px) saturate(1.05);
    pointer-events: none;
}

body.public-body .deal-location-lock-content {
    min-height: 100%;
}

body.public-body .deal-location-lock-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 3.2rem;
    height: 3.2rem;
    border-radius: 12px;
    border: 1px solid rgba(19, 67, 107, 0.12);
    background: rgba(255, 255, 255,0.78);
    color: #13436b;
    box-shadow: 0 16px 32px rgba(11, 31, 61, 0.1);
}

body.public-body .deal-location-lock-card {
    width: min(100%, 34rem);
    border-radius: 16px;
    border: 1px solid rgba(255, 255, 255,0.78);
    background:
        radial-gradient(circle at top right, rgba(136, 160, 194, 0.10), transparent 50%),
        linear-gradient(180deg, rgba(255, 255, 255,0.92) 0%, rgba(238, 243, 249,0.86) 100%);
    box-shadow:
        0 24px 50px rgba(11, 31, 61, 0.16),
        inset 0 1px 0 rgba(255, 255, 255,0.85);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    padding: 1rem;
}

body.public-body .deal-location-lock-card .deal-address-meta {
    justify-content: center;
    text-align: center;
    background: rgba(255, 255, 255,0.62);
}

body.public-body .deal-location-lock-card .deal-address-note {
    flex-basis: 100%;
}

body.public-body .deal-location-lock-card .deal-address-actions {
    width: 100%;
    justify-content: center;
}

/* Unlock CTA chip — premium navy gradient (matches View Full Address /
   View All Photos / RSVP / Visit Site CTA family). Adds a sky map-pin
   icon via ::before and a shimmer sweep on hover. */
body.public-body .deal-location-lock-card .deal-address-chip {
    position: relative;
    overflow: hidden;
    isolation: isolate;
    min-width: 14rem;
    padding: 0.75rem 1.25rem;
    border-radius: 12px;
    border: 1px solid rgba(136, 160, 194, 0.32) !important;
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 50%, #13436b 100%) !important;
    color: #ffffff !important;
    font-weight: 700;
    letter-spacing: 0.01em;
    box-shadow:
        0 16px 32px rgba(11, 31, 61, 0.28),
        0 0 0 1px rgba(255, 255, 255,0.06) inset,
        inset 0 1px 0 rgba(255, 255, 255,0.16) !important;
    transition: transform 200ms ease, box-shadow 200ms ease, border-color 200ms ease, background 200ms ease;
}

body.public-body .deal-location-lock-card .deal-address-chip::before {
    content: '';
    width: 1.05rem;
    height: 1.05rem;
    margin-right: 0.55rem;
    background-color: #88a0c2;
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0'/><circle cx='12' cy='10' r='3'/></svg>") center/contain no-repeat;
            mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0'/><circle cx='12' cy='10' r='3'/></svg>") center/contain no-repeat;
    flex-shrink: 0;
    z-index: 1;
}

body.public-body .deal-location-lock-card .deal-address-chip::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(120deg, transparent 35%, rgba(136, 160, 194, 0.20) 50%, transparent 65%);
    transform: translateX(-100%);
    transition: transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
    pointer-events: none;
    z-index: 0;
}

body.public-body .deal-location-lock-card .deal-address-chip [data-address-chip-label] {
    position: relative;
    z-index: 1;
}

body.public-body .deal-location-lock-card .deal-address-chip:hover {
    transform: translateY(-1px);
    border-color: rgba(136, 160, 194, 0.65) !important;
    background: linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 50%, #13436b 100%) !important;
    box-shadow:
        0 24px 44px rgba(11, 31, 61, 0.40),
        0 0 0 1px rgba(136, 160, 194, 0.22) inset,
        inset 0 1px 0 rgba(255, 255, 255,0.20) !important;
}

body.public-body .deal-location-lock-card .deal-address-chip:hover::after {
    transform: translateX(100%);
}

body.public-body .deal-address-lock-detail .deal-address-line {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.6rem;
    width: fit-content;
    max-width: 100%;
    font-size: 1.18rem;
    line-height: 1.35;
    text-align: center;
}

body.public-body .deal-address-lock-detail .deal-address-inline-badge {
    order: 3;
    margin-top: 0;
    padding: 0.3rem 0.72rem;
    font-size: 0.68rem;
    line-height: 1;
}

body.public-body .deal-address-lock-detail .deal-address-meta {
    margin-top: 0.5rem;
    width: 100%;
    padding: 0;
    border: 0;
    border-radius: 0;
    background: transparent;
    box-shadow: none;
    gap: 0.7rem;
    justify-content: center;
    text-align: center;
}

body.public-body .deal-address-lock-detail .deal-street-wrap,
body.public-body .deal-address-lock-detail .deal-locality {
    font-size: 1.18rem;
}

body.public-body .deal-address-lock-detail .deal-address-note {
    max-width: 44rem;
    flex-basis: 100%;
    text-align: center;
}

body.public-body .deal-address-lock-detail .deal-address-actions {
    justify-content: center;
}

body.public-body .deal-address-lock-detail .deal-address-chip {
    padding: 0.8rem 1.1rem;
}

body.public-body .buyer-unlock-point {
    display: flex;
    gap: 0.75rem;
    align-items: flex-start;
}

body.public-body .buyer-unlock-point-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    flex-shrink: 0;
    border-radius: 9999px;
    background: rgba(255, 255, 255, 0.9);
    color: #13436b;
    box-shadow: 0 10px 20px rgba(11, 31, 61, 0.08);
}

body.public-body .buyer-identity-dock {
    position: fixed;
    top: 5.9rem;
    right: 1rem;
    z-index: 45;
    display: inline-flex;
    align-items: center;
    gap: 0.8rem;
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255, 0.78);
    background: rgba(255, 255, 255, 0.9);
    padding: 0.72rem 0.9rem;
    box-shadow: 0 22px 44px rgba(11, 31, 61, 0.12);
    backdrop-filter: blur(18px);
}

body.public-body .buyer-identity-dock.hidden,
body.public-body .buyer-stay-connected.hidden,
body.public-body .buyer-stay-bubble.hidden,
body.public-body .buyer-profile-bubble.hidden {
    display: none !important;
}

body.public-body .buyer-identity-dock,
body.public-body .buyer-stay-connected,
body.public-body .buyer-stay-bubble,
body.public-body .buyer-profile-bubble,
body.public-body .public-chat-launcher {
    opacity: 1;
    transform: translate3d(0, 0, 0) scale(1);
    transition:
        opacity 180ms ease,
        transform 220ms cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 160ms ease,
        border-color 160ms ease;
    will-change: transform, opacity;
}

body.public-body .buyer-floating-enter,
body.public-body .buyer-floating-exit {
    opacity: 0;
    transform: translate3d(0, 16px, 0) scale(0.96);
    pointer-events: none;
}

body.public-body .buyer-identity-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 9999px;
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 100%);
    color: #ffffff;
    box-shadow: 0 14px 24px rgba(11, 31, 61, 0.24);
}

body.public-body .buyer-identity-copy {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
}

body.public-body .buyer-identity-greeting {
    font-size: 0.92rem;
    font-weight: 800;
    color: #0f1c33;
}

body.public-body .buyer-identity-email {
    font-size: 0.74rem;
    color: #36598d;
}

body.public-body .buyer-identity-dismiss {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: 9999px;
    background: rgba(238, 243, 249, 0.92);
    color: #36598d;
    flex-shrink: 0;
    transition: background-color 160ms ease, color 160ms ease;
}

body.public-body .buyer-identity-dismiss:hover {
    background: rgba(223, 232, 243, 0.96);
    color: #13436b;
}

body.public-body .buyer-stay-connected {
    position: fixed;
    left: var(--public-floating-inset-x);
    right: auto;
    bottom: var(--public-floating-inset-y);
    z-index: 45;
    width: min(100%, 22rem);
    border-radius: 16px;
    border: 1px solid rgba(255, 255, 255, 0.78);
    background: rgba(255, 255, 255, 0.94);
    padding: 1.1rem 1.1rem 1rem;
    box-shadow: 0 28px 50px rgba(11, 31, 61, 0.15);
    backdrop-filter: blur(18px);
}

body.public-body .buyer-stay-dismiss {
    position: absolute;
    top: 0.7rem;
    right: 0.7rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: 9999px;
    background: rgba(238, 243, 249, 0.94);
    color: #36598d;
}

body.public-body .buyer-stay-bubble {
    position: fixed;
    left: var(--public-floating-inset-x);
    right: auto;
    bottom: var(--public-floating-inset-y);
    z-index: 45;
    display: inline-flex;
    align-items: center;
    gap: 0.7rem;
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255, 0.82);
    background: rgba(255, 255, 255, 0.95);
    padding: 0.82rem 0.98rem 0.82rem 0.9rem;
    min-height: 3.4rem;
    max-width: min(18rem, calc(50vw - var(--public-floating-inset-x) - 0.4rem));
    box-shadow: 0 24px 42px rgba(11, 31, 61, 0.14);
    backdrop-filter: blur(18px);
    transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
}

body.public-body .buyer-stay-bubble:hover {
    transform: translateY(-2px);
    border-color: rgba(177, 29, 41, 0.2);
    box-shadow: 0 28px 46px rgba(11, 31, 61, 0.16);
}

body.public-body .buyer-stay-bubble-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 9999px;
    background: linear-gradient(135deg, #b11d29 0%, #d93240 100%);
    color: #ffffff;
    box-shadow: 0 12px 24px rgba(177, 29, 41, 0.2);
    flex-shrink: 0;
}

body.public-body .buyer-stay-bubble-copy {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    min-width: 0;
}

body.public-body .buyer-stay-bubble-title {
    font-size: 0.84rem;
    font-weight: 800;
    color: #0f1c33;
    line-height: 1.15;
}

body.public-body .buyer-stay-bubble-subtitle {
    font-size: 0.72rem;
    color: #36598d;
    min-height: 0;
}

body.public-body .buyer-stay-bubble-subtitle:empty {
    display: none;
}

body.public-body .public-chat-assistant {
    --public-chat-panel-bottom: 5.65rem;
    --public-chat-inset-x: var(--public-floating-inset-x);
}

body.public-body .public-chat-panel,
body.public-body .public-chat-launcher {
    position: fixed;
    left: auto;
    right: var(--public-chat-inset-x);
    z-index: 47;
}

/* Coexist with the GoHighLevel Live Chat widget (fixed bottom-right, z-index
   9999). When that widget is loaded (body.has-ghl-livechat), raise the custom
   AI Agent launcher + panel so they STACK ABOVE the GHL bubble instead of
   overlapping it. Bottom-left stays occupied by the buyer-stay bubble, so
   stacking on the right is the clean de-confliction. */
body.public-body.has-ghl-livechat .public-chat-launcher {
    bottom: calc(var(--public-floating-inset-y) + 4.9rem);
}
body.public-body.has-ghl-livechat .public-chat-assistant {
    --public-chat-panel-bottom: 10.55rem;
}

/* Same de-confliction for the deal page's sticky mobile offer bar. That bar is
   full-width at the bottom, so at its default inset the launcher sat directly on
   top of the "Submit an Offer" button — the single most important control on the
   page. Lift it clear, matching the buyer-stay bubble's lift on the left side.
   Higher specificity than the base rule, so it wins regardless of source order. */
body.public-body.has-mobile-offer-bar .public-chat-launcher {
    bottom: calc(var(--public-floating-inset-y) + 6rem);
}
body.public-body.has-mobile-offer-bar .public-chat-assistant {
    --public-chat-panel-bottom: 11.6rem;
}
/* Both at once: stack above the GHL bubble AND the offer bar. */
body.public-body.has-ghl-livechat.has-mobile-offer-bar .public-chat-launcher {
    bottom: calc(var(--public-floating-inset-y) + 10.9rem);
}

body.public-body .public-chat-panel.hidden {
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translate3d(18px, 18px, 0) scale(0.98);
}

body.public-body .public-chat-panel {
    bottom: var(--public-chat-panel-bottom);
    width: min(100%, 24rem);
    max-height: min(70vh, 40rem);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    border-radius: 16px;
    border: 1px solid rgba(255, 255, 255, 0.86);
    background: linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(238, 243, 249, 0.95));
    box-shadow: 0 28px 60px rgba(11, 31, 61, 0.18);
    backdrop-filter: blur(20px);
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translate3d(0, 0, 0) scale(1);
    transform-origin: right bottom;
    transition:
        opacity 170ms ease,
        transform 220ms cubic-bezier(0.22, 1, 0.36, 1),
        visibility 0s linear;
    will-change: transform, opacity;
    isolation: isolate;
    overscroll-behavior: contain;
}

body.public-body .public-chat-panel::before {
    content: "";
    position: absolute;
    right: 1rem;
    bottom: 0.9rem;
    width: 7.5rem;
    height: 7.5rem;
    border-radius: 9999px;
    background:
        radial-gradient(circle at 50% 55%, rgba(255, 255, 255, 0.42) 0%, rgba(223, 232, 243, 0.18) 34%, rgba(255, 255, 255, 0) 72%);
    opacity: 0;
    transform: translate3d(1.1rem, 1.25rem, 0) scale(0.42);
    pointer-events: none;
    filter: blur(4px);
    z-index: 0;
}

body.public-body .public-chat-panel > * {
    position: relative;
    z-index: 1;
}

body.public-body .public-chat-panel.public-chat-panel-opening::before {
    animation: public-chat-genie-plume 560ms cubic-bezier(0.22, 1, 0.36, 1) forwards;
}

body.public-body .public-chat-panel-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.85rem;
    flex-shrink: 0;
    padding: 1rem 1rem 0.85rem;
    border-bottom: 1px solid rgba(223, 232, 243, 0.86);
    background: linear-gradient(135deg, rgba(11, 31, 61, 0.04), rgba(177, 29, 41, 0.05));
}

@keyframes public-chat-genie-plume {
    0% {
        opacity: 0;
        transform: translate3d(1.15rem, 1.45rem, 0) scale(0.38);
    }
    24% {
        opacity: 0.38;
        transform: translate3d(0.45rem, 0.55rem, 0) scale(0.72);
    }
    62% {
        opacity: 0.2;
        transform: translate3d(-0.4rem, -0.8rem, 0) scale(1.02);
    }
    100% {
        opacity: 0;
        transform: translate3d(-0.9rem, -1.7rem, 0) scale(1.18);
    }
}

@media (prefers-reduced-motion: reduce) {
    /* The panel only. The LAUNCHER's transition is re-declared twice below this
       point, so a `transition: none` written here lost on source order and the
       launcher kept easing its hover lift under reduced motion. Its answer now
       sits after the last rule that sets it. */
    body.public-body .public-chat-panel {
        transition: none;
    }

    body.public-body .public-chat-panel.public-chat-panel-opening::before {
        animation: none;
    }
}

body.public-body .public-chat-panel-eyebrow {
    font-size: 0.66rem;
    font-weight: 800;
    letter-spacing: 0.24em;
    text-transform: uppercase;
    color: #b11d29;
}

body.public-body .public-chat-panel-title {
    margin-top: 0.35rem;
    font-size: 1.05rem;
    font-weight: 800;
    color: #0b1f3d;
}

body.public-body .public-chat-panel-copy {
    margin-top: 0.35rem;
    font-size: 0.82rem;
    line-height: 1.45;
    color: #36598d;
    max-width: 17.5rem;
}

body.public-body .public-chat-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: 9999px;
    background: rgba(238, 243, 249, 0.92);
    color: #36598d;
    flex-shrink: 0;
}

body.public-body .public-chat-close:hover {
    background: rgba(223, 232, 243, 0.95);
    color: #13436b;
}

body.public-body .public-chat-message-stream {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: 0.8rem;
    padding: 1rem;
    min-height: 0;
    max-height: 20.5rem;
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
}

body.public-body .public-chat-message {
    display: flex;
}

body.public-body .public-chat-message-assistant {
    justify-content: flex-start;
}

body.public-body .public-chat-message-user {
    justify-content: flex-end;
}

body.public-body .public-chat-bubble {
    max-width: 92%;
    border-radius: 16px;
    padding: 0.82rem 0.9rem;
    box-shadow: 0 16px 28px rgba(11, 31, 61, 0.08);
}

body.public-body .public-chat-message-assistant .public-chat-bubble {
    border: 1px solid rgba(223, 232, 243, 0.9);
    background: rgba(255, 255, 255, 0.98);
}

body.public-body .public-chat-message-user .public-chat-bubble {
    border: 1px solid rgba(19, 67, 107, 0.12);
    background: linear-gradient(135deg, rgba(11, 31, 61, 0.08), rgba(54, 89, 141, 0.08));
}

body.public-body .public-chat-message-label {
    font-size: 0.66rem;
    font-weight: 800;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: #88a0c2;
}

body.public-body .public-chat-message-copy {
    margin-top: 0.35rem;
    font-size: 0.88rem;
    line-height: 1.55;
    color: #0b1f3d;
    white-space: pre-wrap;
    word-break: break-word;
}

body.public-body .public-chat-message-time {
    margin-top: 0.38rem;
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0.01em;
    color: #88a0c2;
}

body.public-body .public-chat-message-typing .public-chat-bubble {
    min-width: 4.25rem;
}

body.public-body .public-chat-typing-dots {
    display: inline-flex;
    align-items: center;
    gap: 0.32rem;
    margin-top: 0.35rem;
    min-height: 1.1rem;
}

body.public-body .public-chat-typing-dots span {
    width: 0.48rem;
    height: 0.48rem;
    border-radius: 9999px;
    background: rgba(54, 89, 141, 0.78);
    animation: public-chat-typing-pulse 1.05s infinite ease-in-out;
}

body.public-body .public-chat-typing-dots span:nth-child(2) {
    animation-delay: 0.14s;
}

body.public-body .public-chat-typing-dots span:nth-child(3) {
    animation-delay: 0.28s;
}

@keyframes public-chat-typing-pulse {
    0%, 80%, 100% {
        opacity: 0.4;
    }
    40% {
        opacity: 1;
    }
}

body.public-body .public-chat-actions,
body.public-body .public-chat-quick-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

body.public-body .public-chat-actions {
    margin-top: 0.7rem;
}

body.public-body .public-chat-quick-actions {
    padding: 0 1rem 0.95rem;
    flex-shrink: 0;
}

body.public-body .public-chat-action-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 2.35rem;
    border-radius: 12px;
    border: 1px solid rgba(223, 232, 243, 0.92);
    background: rgba(255, 255, 255, 0.96);
    padding: 0.62rem 0.88rem;
    font-size: 0.78rem;
    font-weight: 700;
    color: #13436b;
    box-shadow: 0 10px 20px rgba(11, 31, 61, 0.06);
    transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
}

body.public-body .public-chat-action-chip:hover {
    transform: translateY(-1px);
    border-color: rgba(19, 67, 107, 0.18);
    box-shadow: 0 14px 22px rgba(11, 31, 61, 0.09);
}

body.public-body .public-chat-action-chip-accent {
    color: #b11d29;
    border-color: rgba(177, 29, 41, 0.16);
}

body.public-body .public-chat-form {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 0.75rem;
    padding: 0 1rem 1rem;
    align-items: end;
    flex-shrink: 0;
}

body.public-body .public-chat-input {
    width: 100%;
    border-radius: 12px;
    border: 1px solid rgba(223, 232, 243, 0.94);
    background: rgba(255, 255, 255, 0.96);
    padding: 0.85rem 0.95rem;
    font-size: 0.88rem;
    color: #0f1c33;
    outline: none;
    min-height: 3rem;
    max-height: 8rem;
    resize: none;
    overflow-y: auto;
    line-height: 1.45;
    transition: border-color 160ms ease, box-shadow 160ms ease;
}

body.public-body .public-chat-input:focus {
    border-color: rgba(19, 67, 107, 0.4);
    box-shadow: 0 0 0 4px rgba(11, 31, 61, 0.08);
}

body.public-body .public-chat-send {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 12px;
    padding: 0.85rem 1rem;
    font-size: 0.82rem;
    font-weight: 800;
    color: #ffffff;
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 52%, #36598d 100%);
    box-shadow: 0 18px 30px rgba(11, 31, 61, 0.2);
}

body.public-body .public-chat-send:hover {
    transform: translateY(-1px);
}

body.public-body .public-chat-send:disabled,
body.public-body .public-chat-input:disabled {
    opacity: 0.72;
    cursor: not-allowed;
}

body.public-body .public-chat-launcher {
    bottom: var(--public-floating-inset-y);
    position: fixed;
    left: auto;
    right: var(--public-chat-inset-x);
    display: inline-flex;
    align-items: center;
    gap: 0.72rem;
    min-height: 3.4rem;
    max-width: min(18rem, calc(50vw - var(--public-chat-inset-x) - 0.25rem));
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255, 0.84);
    background: rgba(255, 255, 255, 0.96);
    padding: 0.82rem 1rem 0.82rem 0.92rem;
    box-shadow: 0 24px 42px rgba(11, 31, 61, 0.14);
    backdrop-filter: blur(18px);
    transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
}

body.public-body .public-chat-launcher-status {
    position: absolute;
    top: 0.52rem;
    left: 0.62rem;
    width: 0.7rem;
    height: 0.7rem;
    border-radius: 9999px;
    background: linear-gradient(135deg, #16a34a 0%, #16a34a 100%);
    box-shadow:
        0 0 0 3px rgba(255, 255, 255, 0.96),
        0 0 0 6px rgba(22, 163, 74, 0.12),
        0 10px 18px rgba(22, 163, 74, 0.24);
}

body.public-body .public-chat-launcher:hover,
body.public-body .public-chat-launcher-active {
    transform: translateY(-2px);
    border-color: rgba(19, 67, 107, 0.18);
    box-shadow: 0 28px 46px rgba(11, 31, 61, 0.17);
}

body.public-body .public-chat-launcher-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.3rem;
    height: 2.3rem;
    border-radius: 9999px;
    flex-shrink: 0;
    font-size: 0.78rem;
    font-weight: 800;
    letter-spacing: 0.02em;
    color: #ffffff;
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 48%, #36598d 100%);
    box-shadow: 0 12px 24px rgba(11, 31, 61, 0.22);
}

body.public-body .public-chat-launcher-copy {
    display: flex;
    flex-direction: column;
    min-width: 0;
    text-align: left;
}

body.public-body .public-chat-launcher-label {
    font-size: 0.84rem;
    font-weight: 800;
    line-height: 1.15;
    color: #0f1c33;
}

body.public-body .public-chat-launcher-subtitle {
    font-size: 0.71rem;
    line-height: 1.15;
    color: #36598d;
}

body.public-body .deal-interest-prompt {
    position: fixed;
    right: 1rem;
    bottom: 6.5rem;
    z-index: 46;
    width: min(100%, 23rem);
    border-radius: 16px;
    border: 1px solid rgba(255, 255, 255, 0.82);
    background: linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(238, 243, 249, 0.95));
    padding: 1rem 1rem 1rem;
    box-shadow: 0 28px 56px rgba(11, 31, 61, 0.17);
    backdrop-filter: blur(18px);
}

body.public-body .deal-interest-dismiss {
    position: absolute;
    top: 0.7rem;
    right: 0.7rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: 9999px;
    background: rgba(238, 243, 249, 0.94);
    color: #36598d;
}

body.public-body .deal-interest-eyebrow {
    font-size: 0.68rem;
    font-weight: 800;
    letter-spacing: 0.24em;
    text-transform: uppercase;
    color: #b11d29;
}

body.public-body .deal-interest-title {
    margin-top: 0.75rem;
    font-size: 1.05rem;
    font-weight: 800;
    line-height: 1.2;
    color: #0f1c33;
    max-width: 16rem;
}

body.public-body .deal-interest-copy {
    margin-top: 0.55rem;
    font-size: 0.9rem;
    line-height: 1.55;
    color: #13436b;
}

body.public-body .deal-interest-actions {
    display: grid;
    gap: 0.8rem;
    margin-top: 1rem;
}

body.public-body .deal-interest-primary {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    width: 100%;
    border-radius: 12px;
    background: linear-gradient(135deg, #b11d29 0%, #d93240 100%);
    padding: 0.88rem 1rem;
    font-size: 0.92rem;
    font-weight: 800;
    color: #ffffff;
    box-shadow: 0 18px 34px rgba(177, 29, 41, 0.24);
    transition: transform 160ms ease, box-shadow 160ms ease;
}

body.public-body .deal-interest-primary:hover {
    transform: translateY(-1px);
    box-shadow: 0 22px 38px rgba(177, 29, 41, 0.28);
}

body.public-body .deal-interest-card-link {
    display: flex;
    align-items: center;
    gap: 0.8rem;
    width: 100%;
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.9);
    background: rgba(255, 255, 255, 0.95);
    padding: 0.85rem 0.95rem;
    color: #13436b;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.78);
}

body.public-body .deal-interest-card-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 9999px;
    background: rgba(19, 67, 107, 0.08);
    color: #13436b;
    flex-shrink: 0;
}

body.public-body .deal-interest-card-copy {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

body.public-body .deal-interest-card-title {
    font-size: 0.86rem;
    font-weight: 800;
    color: #0f1c33;
}

body.public-body .deal-interest-card-subtitle {
    font-size: 0.74rem;
    color: #36598d;
}

body.public-body .buyer-profile-bubble {
    position: fixed;
    top: 5.9rem;
    right: -0.35rem;
    z-index: 45;
    display: inline-flex;
    align-items: center;
    gap: 0.65rem;
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255, 0.82);
    background: rgba(255, 255, 255, 0.95);
    padding: 0.76rem 0.95rem 0.76rem 0.8rem;
    box-shadow: 0 24px 42px rgba(11, 31, 61, 0.14);
    backdrop-filter: blur(18px);
    transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
}

body.public-body .buyer-profile-bubble:hover {
    transform: translateY(-2px);
    border-color: rgba(19, 67, 107, 0.2);
    box-shadow: 0 28px 46px rgba(11, 31, 61, 0.16);
}

body.public-body .buyer-profile-bubble-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.2rem;
    height: 2.2rem;
    border-radius: 9999px;
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 100%);
    color: #ffffff;
    box-shadow: 0 12px 24px rgba(11, 31, 61, 0.2);
    flex-shrink: 0;
}

body.public-body .buyer-profile-bubble-copy {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    min-width: 0;
}

body.public-body .buyer-profile-bubble-title {
    font-size: 0.84rem;
    font-weight: 800;
    color: #0f1c33;
}

body.public-body .buyer-profile-bubble-subtitle {
    font-size: 0.72rem;
    color: #36598d;
}

body.public-body .public-mobile-modal {
    overscroll-behavior: contain;
    overflow-y: auto;
}

/* Cap modal height to the viewport at ALL sizes and scroll internally, so short
   viewports (iPad/tablet landscape ~810px tall, split-screen, etc.) can always
   reach every field and the submit button. Previously this only applied at
   max-width:768px, leaving wide-but-short landscape tablets with an off-screen
   submit button. */
body.public-body .public-mobile-modal-card,
body.public-body .buyer-unlock-modal-shell {
    max-height: calc(100dvh - 2rem);
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
}

body.public-body .public-mobile-modal-card {
    width: min(96vw, 70rem);
}

body.public-body .buyer-unlock-modal-shell {
    width: min(96vw, 70rem);
}

body.public-body .buyer-unlock-side {
    min-width: 0;
}

body.public-body .buyer-unlock-side #buyerUnlockIntro,
body.public-body .buyer-unlock-side .buyer-unlock-point span:last-child,
body.public-body #buyerUnlockSuccessCopy {
    max-width: 34rem;
}

@media (max-width: 768px) {
    body.public-body .public-mobile-modal {
        align-items: flex-start;
        justify-content: center;
        overflow-y: auto;
        padding: max(0.75rem, env(safe-area-inset-top)) 0.75rem calc(0.9rem + env(safe-area-inset-bottom));
    }

    body.public-body .public-mobile-modal-card,
    body.public-body .buyer-unlock-modal-shell {
        width: 100%;
        max-width: none !important;
        max-height: calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 1.5rem);
        overflow-y: auto;
        overscroll-behavior: contain;
        -webkit-overflow-scrolling: touch;
    }

    body.public-body .buyer-unlock-modal-shell {
        border-radius: 16px;
    }

    body.public-body .buyer-unlock-side {
        padding: 1.25rem;
    }

    body.public-body .buyer-unlock-side #buyerUnlockIntro,
    body.public-body .buyer-unlock-side .buyer-unlock-point span:last-child,
    body.public-body #buyerUnlockSuccessCopy {
        max-width: none;
    }

    body.public-body .buyer-identity-dock {
        top: 5.4rem;
        right: 0.85rem;
        max-width: calc(100vw - 1.7rem);
        padding: 0.65rem 0.85rem;
    }

    body.public-body .buyer-identity-email {
        max-width: 10.5rem;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    body.public-body .buyer-stay-connected {
        left: max(0.75rem, env(safe-area-inset-left));
        right: auto;
        bottom: calc(0.75rem + env(safe-area-inset-bottom));
        width: min(100%, calc(100vw - 1.5rem));
        max-height: calc(100dvh - env(safe-area-inset-bottom) - 1.5rem);
        overflow-y: auto;
        border-radius: 16px;
        padding: 0.95rem 0.95rem 0.9rem;
    }

    body.public-body .buyer-stay-bubble {
        left: max(0.75rem, env(safe-area-inset-left));
        right: auto;
        bottom: calc(0.75rem + env(safe-area-inset-bottom));
        max-width: min(12.5rem, calc(50vw - 0.9rem));
        padding: 0.72rem 0.85rem;
    }

    body.public-body .public-chat-panel,
    body.public-body .public-chat-launcher {
        left: auto;
        right: max(var(--public-floating-inset-x), env(safe-area-inset-right));
    }

    body.public-body .public-chat-launcher {
        bottom: calc(0.75rem + env(safe-area-inset-bottom));
        max-width: min(12.5rem, calc(50vw - 0.9rem));
        padding: 0.72rem 0.85rem 0.72rem 0.75rem;
    }

    body.public-body .public-chat-launcher-status {
        top: 0.44rem;
        left: 0.52rem;
        width: 0.64rem;
        height: 0.64rem;
    }

    body.public-body .public-chat-panel {
        bottom: max(calc(5.65rem + env(safe-area-inset-bottom)), var(--public-chat-panel-bottom));
        width: min(100%, calc(100vw - 1rem));
        height: min(78dvh, calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 6.35rem));
        max-height: min(78dvh, calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 6.35rem));
        border-radius: 16px;
    }

    body.public-body .public-chat-panel-header,
    body.public-body .public-chat-message-stream,
    body.public-body .public-chat-quick-actions,
    body.public-body .public-chat-form {
        padding-left: 0.9rem;
        padding-right: 0.9rem;
    }

    body.public-body .public-chat-message-stream {
        max-height: none;
        padding-top: 0.85rem;
        padding-bottom: 0.85rem;
    }

    body.public-body .public-chat-panel-header {
        padding-top: 0.9rem;
        padding-bottom: 0.8rem;
    }

    body.public-body .public-chat-panel-copy {
        max-width: none;
    }

    body.public-body .public-chat-form {
        grid-template-columns: minmax(0, 1fr);
        gap: 0.65rem;
        padding-bottom: calc(0.9rem + env(safe-area-inset-bottom));
    }

    body.public-body .public-chat-send {
        width: 100%;
    }

    body.public-body .public-chat-input {
        font-size: 16px;
        min-height: 3.15rem;
        max-height: 6.75rem;
    }

    body.public-body .public-chat-quick-actions {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 0.55rem;
        padding-bottom: 0.85rem;
    }

    body.public-body .public-chat-action-chip {
        width: 100%;
        min-height: 2.6rem;
        padding-left: 0.72rem;
        padding-right: 0.72rem;
    }

    body.public-body .public-chat-bubble {
        max-width: 96%;
    }

    body.public-body .public-chat-close {
        width: 2.1rem;
        height: 2.1rem;
    }

    body.public-body .buyer-profile-bubble {
        top: 5.4rem;
        right: -0.2rem;
        max-width: calc(100vw - 1.5rem);
        padding: 0.7rem 0.85rem 0.7rem 0.75rem;
    }

    body.public-body .deal-interest-prompt {
        right: 0.75rem;
        bottom: calc(5.6rem + env(safe-area-inset-bottom));
        width: min(100%, calc(100vw - 1.5rem));
        padding: 0.95rem 0.95rem 0.95rem;
        border-radius: 16px;
    }

    body.public-body .deal-interest-title {
        max-width: none;
        font-size: 1rem;
    }

    body.public-body .deal-address-line {
        align-items: flex-start;
        gap: 0.5rem;
    }

    body.public-body .deal-locality {
        white-space: normal;
    }

    body.public-body .deal-address-meta {
        flex-direction: column;
        padding: 0.85rem 0.9rem;
    }

    body.public-body .deal-address-actions {
        width: 100%;
    }

    body.public-body .deal-address-chip {
        width: 100%;
    }

    body.public-body .deal-address-lock-detail .deal-address-meta {
        padding: 0;
    }
}

body.public-body .cash-buyers-form-compact {
    gap: 1rem;
}

body.public-body .buyer-pref-card {
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.85);
    background: linear-gradient(180deg, rgba(238, 243, 249, 0.98), rgba(255, 255, 255, 0.94));
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.75);
}

body.public-body .buyer-pref-head {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.75rem;
}

body.public-body .buyer-pref-pill {
    display: inline-flex;
    align-items: center;
    border-radius: 0.5rem;
    background: rgba(255, 255, 255,0.96);
    border: 1px solid rgba(223, 232, 243, 0.92);
    padding: 0.35rem 0.75rem;
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: #36598d;
    box-shadow: 0 10px 22px rgba(11, 31, 61, 0.05);
}

body.public-body .buyer-chip-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.65rem;
}

body.public-body .buyer-chip-grid-tight {
    grid-template-columns: repeat(2, minmax(0, 1fr));
}

body.public-body .buyer-chip-option {
    display: flex;
    align-items: flex-start;
    gap: 0.65rem;
    border-radius: 12px;
    border: 1px solid rgba(223, 232, 243, 0.92);
    background: rgba(255, 255, 255,0.98);
    padding: 0.75rem 0.85rem;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.76);
}

body.public-body .buyer-chip-option-tight {
    padding: 0.7rem 0.8rem;
}

body.public-body .buyer-chip-option span {
    color: #13436b;
    font-weight: 600;
    line-height: 1.25rem;
}

@media (min-width: 768px) {
    body.public-body .buyer-chip-grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    body.public-body .buyer-chip-grid-tight {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

body.public-body .deal-card .pt-3.border-t,
body.public-body .deal-card .pt-4.border-t {
    border-top-color: rgba(223, 232, 243, 0.9);
}

body.public-body .public-panel,
body.public-body .public-panel-soft {
    border-radius: var(--public-radius-xl);
    border: 1px solid rgba(255, 255, 255,0.76);
    box-shadow: var(--public-shadow-soft);
    backdrop-filter: blur(14px);
}

body.public-body .public-panel {
    background: rgba(255, 255, 255, 0.88);
}

body.public-body .public-panel-soft {
    background: rgba(238, 243, 249, 0.92);
}

body.public-body .bg-white.rounded-2xl.shadow-lg,
body.public-body .bg-white.rounded-2xl.shadow-xl,
body.public-body .bg-white.rounded-3xl.shadow-lg,
body.public-body .bg-white.rounded-3xl.shadow-2xl {
    border: 1px solid rgba(255, 255, 255,0.76);
    box-shadow: var(--public-shadow-soft);
    background: rgba(255, 255, 255, 0.88);
    backdrop-filter: blur(14px);
}

body.public-body .site-filter-bar {
    background: rgba(255, 255, 255,0.74);
    border-top: 1px solid rgba(255, 255, 255,0.45);
    border-bottom: 1px solid rgba(223, 232, 243, 0.78);
    box-shadow: 0 16px 32px rgba(11, 31, 61, 0.06);
    backdrop-filter: blur(18px);
}

body.public-body .filter-btn,
body.public-body .site-chip-button {
    border-radius: 0.5rem;
    border: 1px solid rgba(223, 232, 243, 0.88);
    background: rgba(255, 255, 255,0.82);
    color: #13436b;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.65);
}

body.public-body .filter-btn:hover,
body.public-body .site-chip-button:hover {
    border-color: rgba(136, 160, 194, 0.34);
    color: #0f1c33;
}

body.public-body .filter-active {
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 100%);
    color: #ffffff;
    border-color: rgba(19, 67, 107, 0.95);
    box-shadow: 0 16px 32px rgba(11, 31, 61, 0.16);
}

body.public-body .site-input,
body.public-body input[type="text"],
body.public-body input[type="email"],
body.public-body input[type="tel"],
body.public-body input[type="number"],
body.public-body textarea,
body.public-body select {
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.58);
}

body.public-body .site-footer {
    position: relative;
    overflow: hidden;
    isolation: isolate;
    background:
        radial-gradient(circle 600px at 88% 0%, rgba(136, 160, 194, 0.22), transparent 60%),
        radial-gradient(circle 540px at 8% 100%, rgba(177, 29, 41, 0.18), transparent 60%),
        radial-gradient(circle 360px at 50% 50%, rgba(136, 160, 194, 0.10), transparent 65%),
        linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 35%, #13436b 70%, #13436b 100%) !important;
    box-shadow: 0 -1px 0 rgba(255, 255, 255, 0.04), 0 -16px 40px rgba(11, 31, 61, 0.18);
}

body.public-body .site-footer::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
        conic-gradient(from 200deg at 70% 30%,
            rgba(136, 160, 194, 0) 0deg,
            rgba(136, 160, 194, 0.14) 80deg,
            rgba(136, 160, 194, 0.10) 160deg,
            rgba(136, 160, 194, 0.08) 240deg,
            rgba(245, 179, 1, 0.05) 320deg,
            rgba(136, 160, 194, 0) 360deg);
    mix-blend-mode: screen;
    opacity: 0.6;
    pointer-events: none;
    z-index: 0;
    filter: none;
    width: auto;
    height: auto;
    border-radius: 0;
}

body.public-body .site-footer::after {
    content: '';
    position: absolute;
    top: 0;
    left: 8%;
    right: 8%;
    bottom: auto;
    width: auto;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.45), transparent);
    border-radius: 0;
    filter: none;
    pointer-events: none;
    z-index: 1;
}

body.public-body .site-footer > * {
    position: relative;
    z-index: 1;
}

body.public-body .site-footer a {
    transition: color 160ms ease, transform 160ms ease;
}

body.public-body .site-footer a:hover {
    color: #ffffff;
    transform: translateX(2px);
}

body.public-body .site-footer .bg-secondary.rounded-lg.flex.items-center.justify-center {
    background:
        radial-gradient(circle at top left, rgba(255, 255, 255,0.22), transparent 38%),
        linear-gradient(135deg, #b11d29 0%, #d93240 100%);
    box-shadow: 0 18px 28px rgba(177, 29, 41, 0.22);
}

body.public-body .site-footer .bg-blue-800.rounded-full.flex.items-center.justify-center {
    border: 1px solid rgba(255, 255, 255,0.12);
    background: rgba(255, 255, 255,0.08);
    backdrop-filter: blur(12px);
}

body.public-body .site-footer .bg-blue-800.rounded-full.flex.items-center.justify-center:hover {
    background: linear-gradient(135deg, #b11d29 0%, #d93240 100%);
    transform: translateY(-2px);
    box-shadow: 0 14px 26px rgba(177, 29, 41, 0.24);
}

body.public-body .site-section-soft {
    background: linear-gradient(180deg, rgba(255, 255, 255,0.44), rgba(238, 243, 249,0.9));
}

body.public-body .site-stat-band {
    background:
        radial-gradient(circle at top left, rgba(255, 255, 255,0.14), transparent 24%),
        linear-gradient(135deg, #0b1f3d 0%, #13436b 52%, #36598d 100%);
    box-shadow: 0 28px 56px rgba(11, 31, 61, 0.14);
}

/* ──────────────────────────────────────────────────────────────────────────
   Aurora Navy Panel — shared aesthetic for premium dark surfaces.
   Lifted from .site-cta-panel + .site-footer (commit c990969). Apply to any
   dark hero / CTA / footer / panel container that should match the upgraded
   look. Also exposed as a body-class-free `.aurora-navy-panel` so it can be
   used inside admin/tools/genie without requiring `body.public-body`.
   ────────────────────────────────────────────────────────────────────────── */
.aurora-navy-panel,
body.public-body .site-cta-panel {
    position: relative;
    overflow: hidden;
    isolation: isolate;
    border: 1px solid rgba(255, 255, 255, 0.10);
    border-radius: 16px;
    background:
        radial-gradient(circle 480px at 90% 0%, rgba(136, 160, 194, 0.30), transparent 60%),
        radial-gradient(circle 420px at 0% 100%, rgba(177, 29, 41, 0.28), transparent 60%),
        radial-gradient(circle 340px at 50% 50%, rgba(136, 160, 194, 0.14), transparent 65%),
        linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 35%, #13436b 70%, #13436b 100%);
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.08) inset,
        0 0 0 1px rgba(255, 255, 255, 0.02) inset,
        0 24px 50px rgba(11, 31, 61, 0.45),
        0 60px 120px rgba(11, 31, 61, 0.30);
    color: #ffffff;
}

.aurora-navy-panel::before,
body.public-body .site-cta-panel::before {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background:
        conic-gradient(from 220deg at 70% 30%,
            rgba(136, 160, 194, 0) 0deg,
            rgba(136, 160, 194, 0.18) 80deg,
            rgba(136, 160, 194, 0.12) 160deg,
            rgba(136, 160, 194, 0.10) 240deg,
            rgba(245, 179, 1, 0.08) 320deg,
            rgba(136, 160, 194, 0) 360deg);
    mix-blend-mode: screen;
    opacity: 0.7;
    pointer-events: none;
    z-index: 0;
}

.aurora-navy-panel::after,
body.public-body .site-cta-panel::after {
    content: '';
    position: absolute;
    top: 0;
    left: 8%;
    right: 8%;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.45), transparent);
    pointer-events: none;
    z-index: 0;
}

.aurora-navy-panel > *,
body.public-body .site-cta-panel > * {
    position: relative;
    z-index: 1;
}

/* Compact variant — for topbars / sidebars where the full radial spread is
   too much. Same colors, tighter spread, no conic shimmer overlay. */
.aurora-navy-panel--compact {
    background:
        radial-gradient(circle 320px at 92% 0%, rgba(136, 160, 194, 0.22), transparent 60%),
        radial-gradient(circle 260px at 4% 100%, rgba(177, 29, 41, 0.18), transparent 60%),
        linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 35%, #13436b 70%, #13436b 100%);
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.06) inset,
        0 16px 32px rgba(11, 31, 61, 0.28);
}
.aurora-navy-panel--compact::before { opacity: 0.45; }

/* Old per-rule .site-cta-panel ::before/::after/>* removed — now handled by
   the consolidated .aurora-navy-panel selector group above. */

body.public-body .site-footer-cta {
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255,0.16);
    background: rgba(255, 255, 255,0.08);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.08);
    backdrop-filter: blur(12px);
}

body.public-body .site-footer-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.55rem;
    padding: 0.85rem 1rem;
    border-radius: 12px;
    background: linear-gradient(135deg, #b11d29 0%, #d93240 100%);
    color: #ffffff;
    font-weight: 700;
    box-shadow: 0 16px 28px rgba(177, 29, 41, 0.24);
    transition: transform 160ms ease, box-shadow 160ms ease, color 160ms ease;
}

body.public-body .site-footer-button:hover {
    color: #ffffff;
    transform: translateY(-1px);
    box-shadow: 0 20px 32px rgba(177, 29, 41, 0.28);
}

body.public-body .site-faq-item {
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.92);
    background: linear-gradient(180deg, rgba(238, 243, 249,0.94), rgba(255, 255, 255,0.9));
    box-shadow: 0 16px 30px rgba(11, 31, 61, 0.06);
    overflow: hidden;
    transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}

body.public-body .site-faq-item:hover {
    transform: translateY(-1px);
    border-color: rgba(136, 160, 194, 0.36);
    box-shadow: 0 22px 38px rgba(11, 31, 61, 0.08);
}

body.public-body .site-faq-trigger {
    background: rgba(255, 255, 255,0.94);
    transition: background-color 180ms ease, transform 180ms ease, box-shadow 180ms ease;
}

body.public-body .site-faq-trigger:hover {
    background: rgba(238, 243, 249,0.98);
}

body.public-body .site-faq-item-open {
    border-color: rgba(19, 67, 107, 0.22);
    box-shadow: 0 24px 42px rgba(11, 31, 61, 0.1);
}

body.public-body .site-faq-item-open .site-faq-trigger {
    background: linear-gradient(180deg, rgba(238, 243, 249,0.98), rgba(255, 255, 255,0.96));
    box-shadow: inset 0 -1px 0 rgba(223, 232, 243, 0.75);
    transform: translateY(1px);
}

body.public-body .site-faq-item-open .site-faq-answer {
    background: linear-gradient(180deg, rgba(238, 243, 249,0.98), rgba(255, 255, 255,0.95));
}

body.public-body .deal-card::before {
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 4px;
    background: linear-gradient(90deg, rgba(19, 67, 107,0.9), rgba(177, 29, 41,0.92));
    opacity: 0.92;
}

body.public-body .deal-card::after {
    content: '';
    position: absolute;
    right: -28px;
    bottom: -34px;
    width: 110px;
    height: 110px;
    border-radius: 9999px;
    background: rgba(19, 67, 107, 0.06);
}

body.public-body .site-empty-state {
    background: rgba(255, 255, 255,0.7);
    border: 1px solid rgba(255, 255, 255,0.82);
    border-radius: var(--public-radius-xl);
    box-shadow: var(--public-shadow-soft);
    backdrop-filter: blur(12px);
}

body.public-body .site-inline-glass {
    background: rgba(255, 255, 255,0.78);
    border: 1px solid rgba(255, 255, 255,0.72);
    box-shadow: 0 16px 30px rgba(11, 31, 61, 0.08);
    backdrop-filter: blur(14px);
}

body.public-body #propertyContent > .flex.flex-col.md\:flex-row.justify-between.items-start.gap-4.mb-6 {
    padding: 1.4rem 1.5rem;
    border: 1px solid rgba(255, 255, 255,0.74);
    border-radius: 16px;
    background: rgba(255, 255, 255,0.78);
    box-shadow: 0 18px 38px rgba(11, 31, 61, 0.08);
    backdrop-filter: blur(12px);
}

body.public-body #propertyContent button,
body.public-body #propertyContent a.inline-flex.items-center.gap-2.bg-primary {
    transition: transform 160ms ease, box-shadow 160ms ease;
}

body.public-body #propertyContent button:hover,
body.public-body #propertyContent a.inline-flex.items-center.gap-2.bg-primary:hover {
    transform: translateY(-1px);
    box-shadow: 0 16px 28px rgba(11, 31, 61, 0.12);
}

body.public-body .site-kicker {
    font-size: 0.78rem;
    font-weight: 700;
    letter-spacing: 0.24em;
    text-transform: uppercase;
}

body.public-body .site-page-frame {
    position: relative;
}

body.public-body .site-page-frame::before {
    content: '';
    position: fixed;
    inset: auto auto 2rem 2rem;
    width: 7rem;
    height: 7rem;
    border-radius: 9999px;
    background: rgba(19, 67, 107, 0.05);
    filter: blur(10px);
    pointer-events: none;
    z-index: 0;
}

body.public-body .site-page-frame::after {
    content: '';
    position: fixed;
    inset: 10rem 2rem auto auto;
    width: 8rem;
    height: 8rem;
    border-radius: 9999px;
    background: rgba(177, 29, 41, 0.05);
    filter: blur(10px);
    pointer-events: none;
    z-index: 0;
}

body.public-body details > summary,
body.public-body button,
body.public-body a.inline-flex,
body.public-body .deal-card,
body.public-body .public-panel,
body.public-body .public-panel-soft,
body.public-body .site-inline-glass,
body.public-body .site-empty-state {
    transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease, background-color 180ms ease, color 180ms ease;
}

body.public-body details[open] > summary + * {
    animation: publicSectionReveal 220ms cubic-bezier(0.22, 1, 0.36, 1);
    transform-origin: top center;
}

/* The answer still appears, it just stops sliding to get there. Every FAQ press
   on the site runs this one. */
@media (prefers-reduced-motion: reduce) {
    body.public-body details[open] > summary + * {
        animation: none;
    }
}

body.public-body .deal-card:hover,
body.public-body .public-panel:hover,
body.public-body .public-panel-soft:hover,
body.public-body .site-inline-glass:hover {
    border-color: rgba(136, 160, 194, 0.3);
    box-shadow: 0 20px 34px rgba(11, 31, 61, 0.1);
}

@keyframes publicSectionReveal {
    0% {
        opacity: 0;
        transform: translateY(-6px) scale(0.995);
    }
    100% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

@media (max-width: 768px) {
    body.public-body .site-brand {
        gap: 0.65rem;
    }

    body.public-body .site-logo-badge {
        width: 2.48rem;
        height: 2.48rem;
        border-radius: 12px;
    }

    body.public-body .site-logo-house {
        width: 1.32rem;
        height: 1.32rem;
    }

    body.public-body .site-wordmark {
        font-size: 1.5rem;
    }

    body.public-body .site-nav-link-active::after {
        display: none;
    }

    body.public-body .site-hero-card,
    body.public-body .public-panel,
    body.public-body .public-panel-soft {
        border-radius: 16px;
    }
}

/* ============================================================
   MODERN UI REFRESH — appended enhancements
   ============================================================ */

/* ── Scroll-fade entrance animations ── */
@keyframes fadeUp {
    from { opacity: 0; transform: translateY(24px); }
    to   { opacity: 1; transform: translateY(0); }
}
@keyframes fadeIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}
@keyframes scaleIn {
    from { opacity: 0; transform: scale(0.94); }
    to   { opacity: 1; transform: scale(1); }
}
@keyframes shimmer {
    0%   { background-position: -200% center; }
    100% { background-position: 200% center; }
}
@keyframes pulseGlow {
    0%, 100% { opacity: 0; }
    50%       { opacity: 1; }
}
@keyframes floatY {
    0%, 100% { transform: translateY(0); }
    50%       { transform: translateY(-6px); }
}

body.public-body .animate-fade-up {
    animation: fadeUp 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
}
body.public-body .animate-fade-up-delay-1 { animation-delay: 0.08s; }
body.public-body .animate-fade-up-delay-2 { animation-delay: 0.16s; }
body.public-body .animate-fade-up-delay-3 { animation-delay: 0.24s; }
body.public-body .animate-fade-up-delay-4 { animation-delay: 0.32s; }
body.public-body .animate-fade-up-delay-5 { animation-delay: 0.40s; }

body.public-body .animate-scale-in { animation: scaleIn 0.45s cubic-bezier(0.22, 1, 0.36, 1) both; }
body.public-body .animate-fade-in  { animation: fadeIn  0.45s ease both; }

/* ── Section heading style ── */
body.public-body .section-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.5rem 1rem;
    border-radius: 0.5rem;
    background: rgba(177, 29, 41, 0.08);
    border: 1px solid rgba(177, 29, 41, 0.14);
    color: #b11d29;
    font-size: 0.72rem;
    font-weight: 800;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    margin-bottom: 1rem;
}

body.public-body .section-title-gradient {
    color: #13436b;
}

body.public-body .section-underline {
    display: inline-block;
    position: relative;
}
body.public-body .section-underline::after {
    content: '';
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    bottom: -0.5rem;
    height: 3px;
    width: 3.5rem;
    border-radius: 9999px;
    background: linear-gradient(90deg, #b11d29, #13436b);
}

body.public-body > section:not(.site-hero):not(.site-section-soft):not(.site-cta-band):not(.site-filter-bar):not(.how-buying-section) {
    position: relative;
}

body.public-body > section:not(.site-hero):not(.site-section-soft):not(.site-cta-band):not(.site-filter-bar):not(.how-buying-section)::before {
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 2px;
    background: linear-gradient(90deg, rgba(10, 20, 36, 0), rgba(19, 67, 107, 0.18) 16%, rgba(177, 29, 41, 0.42) 50%, rgba(19, 67, 107, 0.18) 84%, rgba(10, 20, 36, 0));
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.75), 0 0 22px rgba(11, 31, 61, 0.08);
    pointer-events: none;
    z-index: 1;
}

/* ── Stats bar ── */
body.public-body .stats-bar {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: stretch;
    justify-content: center;
    padding: 1.6rem 2rem;
    border-radius: 16px;
    background: rgba(255, 255, 255, 0.9);
    border: 1px solid rgba(255, 255, 255, 0.82);
    box-shadow: 0 28px 56px rgba(11, 31, 61, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.95);
    backdrop-filter: blur(16px);
}

body.public-body .stat-item {
    flex: 1 1 9rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 0.75rem 1.2rem;
    text-align: center;
    border-right: 1px solid rgba(223, 232, 243, 0.6);
}
body.public-body .stat-item:last-child { border-right: 0; }

body.public-body .stat-value {
    font-family: "Outfit", sans-serif;
    font-size: 1.85rem;
    font-weight: 800;
    line-height: 1;
    color: #13436b;
    letter-spacing: -0.03em;
}
body.public-body .stat-label {
    font-size: 0.76rem;
    font-weight: 600;
    color: #36598d;
    margin-top: 0.28rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

/* ── How It Works — connected steps ── */
body.public-body .steps-track {
    position: relative;
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 1.5rem;
}

body.public-body .steps-track-four {
    grid-template-columns: repeat(4, minmax(0, 1fr));
    align-items: stretch;
}

@media (max-width: 1023px) {
    body.public-body .steps-track {
        grid-template-columns: 1fr;
        gap: 1rem;
    }
}

/* Connector segments — draw a short line in each gap (not across cards) */
body.public-body .steps-track .step-node:not(:last-child)::before {
    content: '';
    position: absolute;
    top: 50%;
    right: -1.5rem;
    width: 1.5rem;
    height: 4px;
    background: linear-gradient(90deg, rgba(177, 29, 41,0.45), rgba(19, 67, 107,0.4));
    pointer-events: none;
    border-radius: 9999px;
    transform: translateY(-50%);
    z-index: 0;
}

@media (max-width: 1023px) {
    body.public-body .steps-track .step-node:not(:last-child)::before { display: none; }
}

@media (max-width: 1023px) {
    body.public-body .steps-track-four {
        grid-template-columns: 1fr;
    }
}

body.public-body .step-node {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: 1.8rem 1.2rem 1.5rem;
    border-radius: 16px;
    background: linear-gradient(180deg, rgba(255, 255, 255,0.97), rgba(238, 243, 249,0.92));
    border: 1px solid rgba(223, 232, 243, 0.88);
    box-shadow: 0 18px 38px rgba(11, 31, 61, 0.07), inset 0 1px 0 rgba(255, 255, 255,0.95);
    transition: transform 0.22s ease, box-shadow 0.22s ease;
}
body.public-body .step-node:hover {
    transform: translateY(-5px);
    box-shadow: 0 28px 50px rgba(11, 31, 61, 0.12), inset 0 1px 0 rgba(255, 255, 255,0.95);
}

body.public-body .step-number {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 3.2rem;
    height: 3.2rem;
    border-radius: 9999px;
    font-family: "Outfit", sans-serif;
    font-size: 1.25rem;
    font-weight: 800;
    color: #ffffff;
    margin: 0 auto 1rem;
    flex-shrink: 0;
    box-shadow: 0 16px 30px rgba(11, 31, 61, 0.18);
    position: relative;
    z-index: 1;
}
body.public-body .step-number-red {
    background: linear-gradient(135deg, #b11d29 0%, #d93240 100%);
}
body.public-body .step-number-navy {
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 52%, #36598d 100%);
}

body.public-body .step-title {
    font-size: 1.05rem;
    font-weight: 700;
    color: #0b1f3d;
    margin-bottom: 0.5rem;
}
body.public-body .step-body {
    font-size: 0.9rem;
    line-height: 1.55;
    color: #36598d;
}

/* ── Feature cards ── */
body.public-body .feature-card {
    position: relative;
    overflow: hidden;
    padding: 2rem 1.75rem;
    border-radius: 16px;
    background: linear-gradient(180deg, rgba(255, 255, 255,0.98), rgba(238, 243, 249,0.93));
    border: 1px solid rgba(223, 232, 243, 0.9);
    box-shadow: 0 18px 40px rgba(11, 31, 61, 0.07), inset 0 1px 0 rgba(255, 255, 255,0.9);
    transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease;
}
body.public-body .feature-card:hover {
    transform: translateY(-5px);
    box-shadow: 0 28px 55px rgba(11, 31, 61, 0.12);
    border-color: rgba(136, 160, 194, 0.52);
}
body.public-body .feature-card::before {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: linear-gradient(135deg, rgba(19, 67, 107, 0.02), transparent 50%, rgba(177, 29, 41, 0.02));
    pointer-events: none;
}

body.public-body .feature-icon-wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 3.25rem;
    height: 3.25rem;
    border-radius: 12px;
    margin-bottom: 1.25rem;
    flex-shrink: 0;
    box-shadow: 0 12px 24px rgba(11, 31, 61, 0.1);
}
body.public-body .feature-icon-wrap-red {
    background: linear-gradient(135deg, rgba(177, 29, 41, 0.12), rgba(177, 29, 41, 0.06));
    border: 1px solid rgba(177, 29, 41, 0.14);
    color: #b11d29;
}
body.public-body .feature-icon-wrap-navy {
    background: linear-gradient(135deg, rgba(19, 67, 107, 0.12), rgba(19, 67, 107, 0.05));
    border: 1px solid rgba(19, 67, 107, 0.12);
    color: #13436b;
}

/* ── FAQ Accordion (smooth height) ── */
body.public-body .faq-item {
    overflow: hidden;
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.8);
    background: rgba(255, 255, 255, 0.92);
    box-shadow: 0 8px 22px rgba(11, 31, 61, 0.05);
    transition: box-shadow 0.22s ease, border-color 0.22s ease;
}
body.public-body .faq-item.is-open {
    border-color: rgba(19, 67, 107, 0.18);
    box-shadow: 0 16px 36px rgba(11, 31, 61, 0.09);
}
body.public-body .faq-trigger {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 1.25rem 1.5rem;
    text-align: left;
    background: transparent;
    border: 0;
    cursor: pointer;
    transition: background-color 0.18s ease;
}
body.public-body .faq-trigger:hover {
    background: rgba(238, 243, 249, 0.8);
}
body.public-body .faq-trigger-icon {
    flex-shrink: 0;
    width: 1.65rem;
    height: 1.65rem;
    border-radius: 9999px;
    background: rgba(238, 243, 249, 0.9);
    display: flex;
    align-items: center;
    justify-content: center;
    transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1), background-color 0.2s ease;
    color: #36598d;
}
body.public-body .faq-item.is-open .faq-trigger-icon {
    transform: rotate(180deg);
    background: rgba(19, 67, 107, 0.1);
    color: #13436b;
}
body.public-body .faq-body {
    display: grid;
    grid-template-rows: 0fr;
    transition: grid-template-rows 0.3s cubic-bezier(0.22, 1, 0.36, 1);
}
body.public-body .faq-item.is-open .faq-body {
    grid-template-rows: 1fr;
}
body.public-body .faq-body-inner {
    overflow: hidden;
}
body.public-body .faq-answer {
    padding: 0 1.5rem 1.25rem;
    color: #13436b;
    line-height: 1.65;
    font-size: 0.96rem;
    border-top: 1px solid rgba(223, 232, 243, 0.7);
    padding-top: 1.1rem;
}

/* ── Filter pill buttons ── */
body.public-body .filter-pill {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.55rem 1.1rem;
    border-radius: 0.5rem;
    font-size: 0.85rem;
    font-weight: 600;
    border: 1px solid rgba(223, 232, 243, 0.9);
    background: rgba(255, 255, 255, 0.96);
    color: #13436b;
    cursor: pointer;
    transition: all 0.18s ease;
    box-shadow: 0 4px 12px rgba(11, 31, 61, 0.05);
}
body.public-body .filter-pill:hover {
    border-color: rgba(19, 67, 107, 0.22);
    color: #13436b;
    background: rgba(238, 243, 249, 0.98);
    box-shadow: 0 8px 20px rgba(11, 31, 61, 0.09);
    transform: translateY(-1px);
}
body.public-body .filter-pill:active {
    transform: translateY(0);
}
body.public-body .filter-pill.is-active,
body.public-body .filter-pill.filter-active {
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 100%);
    border-color: transparent;
    color: #ffffff;
    box-shadow: 0 12px 26px rgba(11, 31, 61, 0.28);
}

/* ── Better form inputs ── */
body.public-body .modern-input {
    width: 100%;
    padding: 0.85rem 1rem;
    border-radius: 12px;
    border: 1.5px solid rgba(223, 232, 243, 0.88);
    background: rgba(255, 255, 255, 0.97);
    color: #0f1c33;
    font-size: 0.95rem;
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
    outline: none;
}
body.public-body .modern-input::placeholder { color: #88a0c2; }
body.public-body .modern-input:hover { border-color: rgba(136, 160, 194, 0.7); }
body.public-body .modern-input:focus {
    border-color: #13436b;
    box-shadow: 0 0 0 3px rgba(11, 31, 61, 0.1);
}

/* ── CTA section ── */
body.public-body .site-cta-band {
    position: relative;
    overflow: hidden;
    background:
        radial-gradient(ellipse at top right, rgba(177, 29, 41, 0.22), transparent 38%),
        radial-gradient(ellipse at bottom left, rgba(54, 89, 141, 0.2), transparent 40%),
        linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 50%, #13436b 100%);
}
body.public-body .site-cta-band::before {
    content: '';
    position: absolute;
    inset: 0;
    background-image: radial-gradient(120% 60% at 50% 0%, rgba(255, 255, 255,0.05), transparent 70%);
    pointer-events: none;
}

body.public-body .site-cta-band::after {
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 2px;
    background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(136, 160, 194, 0.26) 16%, rgba(217, 50, 64, 0.4) 50%, rgba(136, 160, 194, 0.26) 84%, rgba(255, 255, 255, 0));
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.18), 0 0 24px rgba(136, 160, 194, 0.12);
    pointer-events: none;
}

/* ── Footer enhancements ── */
body.public-body .site-footer {
    position: relative;
}
body.public-body .site-footer::before {
    /* Restored: animated 3px crimson→navy→blue→crimson stripe across the top
       of the footer. Flows right-to-left (animation-direction: reverse). */
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 3px;
    background: linear-gradient(90deg, #b11d29, #13436b, #36598d, #b11d29);
    background-size: 200% 100%;
    animation: shimmer 4s linear infinite;
    animation-direction: reverse;
    z-index: 2;
}
@media (prefers-reduced-motion: reduce) {
    body.public-body .site-footer::before { animation: none; }
}

body.public-body .site-footer-cta {
    background: rgba(255, 255, 255, 0.08);
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: 16px;
    backdrop-filter: blur(8px);
    padding: 1.1rem 1.25rem;
}

body.public-body .site-footer-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.55rem;
    padding: 0.72rem 1.3rem;
    border-radius: 12px;
    font-size: 0.88rem;
    font-weight: 700;
    background: linear-gradient(135deg, #b11d29 0%, #d93240 100%);
    color: #ffffff;
    border: 0;
    cursor: pointer;
    text-decoration: none;
    transition: transform 0.18s ease, box-shadow 0.18s ease;
    box-shadow: 0 12px 26px rgba(177, 29, 41, 0.3);
}
body.public-body .site-footer-button:hover {
    transform: translateY(-2px);
    box-shadow: 0 18px 32px rgba(177, 29, 41, 0.38);
}

/* ── Deal card modern refresh ── */
body.public-body .deal-card-badge-hot {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.3rem 0.7rem;
    border-radius: 0.5rem;
    background: linear-gradient(135deg, #b11d29, #d93240);
    color: #ffffff;
    font-size: 0.68rem;
    font-weight: 800;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    box-shadow: 0 8px 18px rgba(177, 29, 41, 0.3);
}

/* ── Search input enhancements ── */
body.public-body .search-wrap {
    position: relative;
}
body.public-body .search-wrap .search-icon {
    position: absolute;
    left: 0.85rem;
    top: 50%;
    transform: translateY(-50%);
    pointer-events: none;
    color: #88a0c2;
}
body.public-body .search-input {
    width: 100%;
    padding: 0.65rem 0.9rem 0.65rem 2.5rem;
    border-radius: 12px;
    border: 1.5px solid rgba(223, 232, 243, 0.88);
    background: rgba(255, 255, 255, 0.98);
    font-size: 0.9rem;
    color: #0f1c33;
    outline: none;
    transition: border-color 0.18s ease, box-shadow 0.18s ease;
}
body.public-body .search-input:focus {
    border-color: #13436b;
    box-shadow: 0 0 0 3px rgba(11, 31, 61, 0.1);
}

/* ── Hero discount stat card ── */
body.public-body .site-hero-stat {
    animation: floatY 4.5s ease-in-out infinite;
}

/* Perpetual motion is the case the media query exists for -- a one-shot entrance
   ends, this one never does, and it sits in the hero of the page every visitor
   lands on. The card keeps its position; only the drift stops.
   The ::before ring is answered further down, NOT here: its own rule is declared
   later in this file, so an override written at this point loses to it on source
   order at equal specificity. That is invisible in the file (the media query reads
   like it wins) and only shows up in a computed style. */
@media (prefers-reduced-motion: reduce) {
    body.public-body .site-hero-stat {
        animation: none;
    }
}

/* ── Empty state ── */
body.public-body .site-empty-state-modern {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 4rem 2rem;
    text-align: center;
}
body.public-body .site-empty-state-modern.hidden {
    display: none !important;
}
body.public-body .empty-state-icon {
    width: 5rem;
    height: 5rem;
    border-radius: 16px;
    background: linear-gradient(135deg, rgba(19, 67, 107, 0.08), rgba(177, 29, 41, 0.05));
    border: 1px solid rgba(223, 232, 243, 0.9);
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 1.5rem;
    color: #88a0c2;
    box-shadow: 0 14px 30px rgba(11, 31, 61, 0.07);
}

body.public-body.deals-page {
    background: #eef3f9 !important;
}

body.public-body.deals-page .deals-hero {
    margin-bottom: 0;
    padding-bottom: 4.35rem !important;
}

body.public-body.deals-page .deals-filter-seam {
    position: relative;
    margin-top: -2.7rem;
    padding-bottom: 0;
    z-index: 2;
    pointer-events: none;
}

body.public-body.deals-page .deals-filter-seam::before {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    top: calc(50% - 0.5px);
    height: 1px;
    background: linear-gradient(90deg, transparent 5%, rgba(136, 160, 194, 0.25) 50%, transparent 95%);
    pointer-events: none;
}

body.public-body.deals-page .deals-filter-bar {
    position: relative;
    z-index: 1;
    width: 100%;
    margin: 0 auto;
    pointer-events: auto;
}

body.public-body.deals-page .deals-filter-surface {
    position: relative;
    width: min(100%, 64rem);
    margin: 0 auto;
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.9);
    background: rgba(255, 255, 255, 0.97);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 18px 40px rgba(11, 31, 61, 0.1);
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    padding: 1rem 1.1rem;
}

body.public-body.deals-page .deals-filter-surface::before {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.92);
    pointer-events: none;
}

body.public-body.deals-page .deals-filter-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
}

body.public-body.deals-page .deals-filter-group {
    display: flex;
    align-items: center;
    gap: 0.65rem;
    flex-wrap: wrap;
}

body.public-body.deals-page .deals-search-wrap .search-input {
    min-height: 3rem;
}

body.public-body.deals-page .deals-content-section {
    position: relative;
    z-index: 0;
    margin-top: 0;
    padding-top: 2.5rem !important;
    background: #eef3f9;
}

body.public-body.deals-page .deals-content-section::before {
    display: none;
}

body.public-body.deals-page .deals-results-stack {
    display: flex;
    flex-direction: column;
    gap: 2.75rem;
}

body.public-body.deals-page .deals-results-head {
    display: flex;
    align-items: end;
    justify-content: space-between;
    gap: 1rem;
    position: relative;
    z-index: 2;
}

body.public-body.deals-page .deals-results-heading {
    margin: 0.9rem 0 0;
    font-family: 'Inter', sans-serif;
    font-size: clamp(2rem, 3vw, 2.65rem);
    line-height: 1.05;
    font-weight: 800;
    color: #13436b;
}

body.public-body.deals-page .deals-results-copy {
    margin: 0.7rem 0 0;
    max-width: 42rem;
    font-size: 1rem;
    line-height: 1.7;
    color: #36598d;
}

body.public-body.deals-page .deals-grid-stage,
body.public-body.deals-page #emptyState {
    margin: 0;
}

body.public-body.deals-page .deals-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 21.5rem), 21.5rem));
    justify-content: center;
    /* Standardized cards: stretch + equal rows so every card is the same size
       regardless of how much optional content (spread, deadline, beds) it carries.
       The card itself is a flex column with the CTA on mt-auto. */
    align-items: stretch;
    grid-auto-rows: 1fr;
    gap: 1.75rem;
}

body.public-body.deals-page .deals-grid > * {
    width: 100%;
}

body.public-body.deals-page .deals-grid-stage-muted {
    padding-top: 0.5rem;
}

body.public-body.deals-page .site-empty-state-modern {
    min-height: 25rem;
    justify-content: center;
    margin-top: 0.5rem;
}

body.public-body.deals-page #dealsGrid:empty,
body.public-body.deals-page #soldGrid:empty {
    display: none;
}

/* ── VIP badge ── */
body.public-body .vip-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.45rem 0.95rem;
    border-radius: 0.5rem;
    font-size: 0.72rem;
    font-weight: 800;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    background: linear-gradient(135deg, rgba(245, 179, 1, 0.12), rgba(245, 179, 1, 0.06));
    border: 1px solid rgba(245, 179, 1, 0.2);
    color: #a86f00;
    box-shadow: 0 4px 14px rgba(245, 179, 1, 0.12);
}

/* ── Floating label section CTA ── */
body.public-body .join-cta-card {
    position: relative;
    overflow: hidden;
    border-radius: 16px;
    background: rgba(255, 255, 255, 0.97);
    border: 1px solid rgba(255, 255, 255, 0.9);
    box-shadow: 0 36px 72px rgba(11, 31, 61, 0.18);
    backdrop-filter: blur(12px);
}

/* ── Smooth section transitions ── */
body.public-body .site-section-soft {
    position: relative;
}
body.public-body .site-section-soft::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 2px;
    background: linear-gradient(90deg, rgba(10, 20, 36, 0), rgba(19, 67, 107, 0.18) 16%, rgba(177, 29, 41, 0.42) 50%, rgba(19, 67, 107, 0.18) 84%, rgba(10, 20, 36, 0));
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.75), 0 0 22px rgba(11, 31, 61, 0.08);
}

/* ── Buyer chip modernization ── */
body.public-body .buyer-chip-option {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.55rem 0.85rem;
    border-radius: 12px;
    border: 1.5px solid rgba(223, 232, 243, 0.8);
    background: rgba(255, 255, 255, 0.96);
    cursor: pointer;
    transition: all 0.18s ease;
    font-size: 0.875rem;
    font-weight: 500;
    color: #13436b;
}
body.public-body .buyer-chip-option:hover {
    border-color: rgba(19, 67, 107, 0.22);
    color: #13436b;
    background: rgba(238, 243, 249, 0.98);
    box-shadow: 0 4px 14px rgba(11, 31, 61, 0.07);
}
body.public-body .buyer-chip-option:has(input:checked) {
    border-color: #13436b;
    background: rgba(19, 67, 107, 0.06);
    color: #13436b;
    box-shadow: 0 0 0 3px rgba(11, 31, 61, 0.1), 0 6px 18px rgba(11, 31, 61, 0.08);
}

/* ── Active nav shimmer dot ── */
@media (max-width: 768px) {
    body.public-body .steps-track {
        grid-template-columns: 1fr;
    }
    body.public-body .stat-item {
        border-right: 0;
        border-bottom: 1px solid rgba(223, 232, 243, 0.6);
    }
    body.public-body .stat-item:last-child { border-bottom: 0; }
    body.public-body .stats-bar {
        flex-direction: column;
        padding: 1.2rem 1.4rem;
        gap: 0;
    }
}

/* ================================================================
   PHASE 2 — BUTTON & MICRO-INTERACTION ENHANCEMENTS
   ================================================================ */

/* ── Enhanced button base — shared across all button types ── */
@keyframes btnRipple {
    0%   { transform: translate(-50%,-50%) scale(0); opacity: 0.5; }
    100% { transform: translate(-50%,-50%) scale(4); opacity: 0; }
}
@keyframes btnShine {
    0%   { left: -80%; }
    100% { left: 130%; }
}

body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary,
body.public-body .site-footer-button,
body.public-body .btn-outline {
    position: relative;
    overflow: hidden;
    isolation: isolate;
    cursor: pointer;
    text-decoration: none;
    transition:
        transform 0.22s cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 0.22s cubic-bezier(0.22, 1, 0.36, 1),
        background-color 0.22s ease,
        border-color 0.22s ease;
}

/* Shine sweep on hover */
body.public-body .btn-primary::after,
body.public-body .btn-secondary::after,
body.public-body .site-button-primary::after,
body.public-body .site-button-secondary::after,
body.public-body .site-footer-button::after {
    content: '';
    position: absolute;
    top: 0;
    left: -80%;
    width: 50%;
    height: 100%;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255,0.22), transparent);
    transform: skewX(-18deg);
    pointer-events: none;
    z-index: 2;
    opacity: 0;
    transition: opacity 0.15s ease;
}
body.public-body .btn-primary:hover::after,
body.public-body .btn-secondary:hover::after,
body.public-body .site-button-primary:hover::after,
body.public-body .site-button-secondary:hover::after,
body.public-body .site-footer-button:hover::after {
    opacity: 1;
    animation: btnShine 0.65s ease forwards;
}

/* Active press state */
body.public-body .btn-primary:active,
body.public-body .btn-secondary:active,
body.public-body .site-button-primary:active,
body.public-body .site-button-secondary:active,
body.public-body .site-footer-button:active,
body.public-body .btn-outline:active {
    transform: translateY(0) scale(0.97);
    transition-duration: 0.08s;
}

/* Focus-visible ring for accessibility */
body.public-body .btn-primary:focus-visible,
body.public-body .btn-secondary:focus-visible,
body.public-body .site-button-primary:focus-visible,
body.public-body .site-button-secondary:focus-visible,
body.public-body .site-footer-button:focus-visible,
body.public-body .btn-outline:focus-visible {
    outline: 2px solid #13436b;
    outline-offset: 3px;
}

/* ── Outline / ghost button variant ── */
body.public-body .btn-outline {
    border-radius: 0.5rem;
    border: 2px solid rgba(19, 67, 107, 0.22);
    background: rgba(255, 255, 255, 0.92);
    color: #13436b;
    font-weight: 700;
    box-shadow: 0 8px 22px rgba(11, 31, 61, 0.06);
    backdrop-filter: blur(6px);
}
body.public-body .btn-outline:hover {
    border-color: #13436b;
    background: rgba(19, 67, 107, 0.06);
    box-shadow: 0 14px 30px rgba(11, 31, 61, 0.1);
    transform: translateY(-2px);
}
body.public-body .btn-outline-red {
    border-color: rgba(177, 29, 41, 0.22);
    color: #b11d29;
}
body.public-body .btn-outline-red:hover {
    border-color: #b11d29;
    background: rgba(177, 29, 41, 0.05);
}

/* ── Improved primary/secondary hover shadows ── */
body.public-body .btn-primary:hover,
body.public-body .site-button-primary:hover {
    transform: translateY(-3px);
    box-shadow:
        0 20px 40px rgba(177, 29, 41, 0.25),
        0 0 0 1px rgba(177, 29, 41, 0.08);
}
body.public-body .btn-secondary:hover,
body.public-body .site-button-secondary:hover {
    transform: translateY(-3px);
    box-shadow:
        0 20px 40px rgba(11, 31, 61, 0.25),
        0 0 0 1px rgba(11, 31, 61, 0.08);
}

/* ── Icon inside buttons — smooth nudge on hover ── */
body.public-body .btn-primary [data-lucide],
body.public-body .btn-secondary [data-lucide],
body.public-body .btn-outline [data-lucide],
body.public-body .site-footer-button [data-lucide] {
    transition: transform 0.22s cubic-bezier(0.22, 1, 0.36, 1);
}
body.public-body .btn-primary:hover [data-lucide],
body.public-body .btn-secondary:hover [data-lucide],
body.public-body .btn-outline:hover [data-lucide],
body.public-body .site-footer-button:hover [data-lucide] {
    transform: translateX(2px);
}

/* ── Nav link animated underline ── */
body.public-body .site-nav-link::after {
    content: '';
    position: absolute;
    bottom: -2px;
    left: 50%;
    width: 0;
    height: 2px;
    border-radius: 9999px;
    background: linear-gradient(90deg, #b11d29, #13436b);
    transition: opacity 180ms ease;
}
body.public-body .site-nav-link:hover::after {
    width: 100%;
    left: 0;
}

/* ── Card gradient border glow on hover ── */
body.public-body .feature-card::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    padding: 1px;
    background: linear-gradient(135deg, rgba(19, 67, 107,0.15), transparent, rgba(177, 29, 41,0.12));
    -webkit-mask: linear-gradient(#ffffff 0 0) content-box, linear-gradient(#ffffff 0 0);
    -webkit-mask-composite: xor;
    mask-composite: exclude;
    pointer-events: none;
    opacity: 0;
    transition: opacity 0.3s ease;
}
body.public-body .feature-card:hover::after {
    opacity: 1;
}

/* ── Step node gradient border glow ── */
body.public-body .step-node::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    padding: 1px;
    background: linear-gradient(135deg, rgba(177, 29, 41,0.18), transparent 40%, rgba(19, 67, 107,0.15));
    -webkit-mask: linear-gradient(#ffffff 0 0) content-box, linear-gradient(#ffffff 0 0);
    -webkit-mask-composite: xor;
    mask-composite: exclude;
    pointer-events: none;
    opacity: 0;
    transition: opacity 0.3s ease;
}
body.public-body .step-node:hover::after {
    opacity: 1;
}

/* ── Step number scale bounce on card hover ── */
body.public-body .step-node:hover .step-number {
    transform: scale(1.1);
    transition: transform 0.25s cubic-bezier(0.22, 1, 0.36, 1);
}

/* ── FAQ item hover glow ── */
body.public-body .faq-item:hover {
    border-color: rgba(136, 160, 194, 0.5);
    box-shadow: 0 12px 28px rgba(11, 31, 61, 0.07);
}

/* ── Modern form inputs with animated label-line effect ── */
body.public-body input.modern-input:not(:placeholder-shown),
body.public-body select.modern-input:not(:placeholder-shown),
body.public-body textarea.modern-input:not(:placeholder-shown) {
    border-color: rgba(19, 67, 107, 0.3);
}

/* Input group with left icon */
body.public-body .input-icon-wrap {
    position: relative;
}
body.public-body .input-icon-wrap .input-icon {
    position: absolute;
    left: 0.9rem;
    top: 50%;
    transform: translateY(-50%);
    color: #88a0c2;
    pointer-events: none;
    transition: color 0.2s ease;
    z-index: 1;
}
body.public-body .input-icon-wrap input:focus ~ .input-icon,
body.public-body .input-icon-wrap select:focus ~ .input-icon {
    color: #13436b;
}
body.public-body .input-icon-wrap input,
body.public-body .input-icon-wrap select {
    padding-left: 2.6rem;
}

/* ── Better inline form styling for CTA section inputs ── */
body.public-body .cash-buyers-form input,
body.public-body .cash-buyers-form select,
body.public-body .cash-buyers-form textarea {
    border-radius: 12px;
    border: 1.5px solid rgba(223, 232, 243, 0.88);
    background: rgba(255, 255, 255, 0.97);
    transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
}
body.public-body .cash-buyers-form input:hover,
body.public-body .cash-buyers-form select:hover,
body.public-body .cash-buyers-form textarea:hover {
    border-color: rgba(136, 160, 194, 0.7);
    background: #ffffff;
}
body.public-body .cash-buyers-form input:focus,
body.public-body .cash-buyers-form select:focus,
body.public-body .cash-buyers-form textarea:focus {
    border-color: #13436b;
    box-shadow: 0 0 0 3px rgba(11, 31, 61, 0.1);
    background: #ffffff;
}

/* ── Floating label helper ── */
body.public-body .form-label {
    display: block;
    font-size: 0.82rem;
    font-weight: 700;
    color: #13436b;
    margin-bottom: 0.4rem;
    letter-spacing: 0.01em;
}
body.public-body .form-label .form-required {
    color: #b11d29;
    font-weight: 800;
}

/* ── Hero stat card — pulsing ring ── */
body.public-body .site-hero-stat::before {
    content: '';
    position: absolute;
    inset: -4px;
    border-radius: inherit;
    border: 2px solid rgba(19, 67, 107, 0.06);
    /* Static ring; the pulse is a composited opacity fade, not an infinite
       box-shadow-spread animation (which repainted the card every frame). */
    box-shadow: 0 0 0 8px rgba(177, 29, 41, 0.12);
    opacity: 0;
    animation: pulseGlow 3s ease-in-out infinite;
    pointer-events: none;
}

/* The pulse half of the hero card's reduced-motion answer. It lives here rather
   than beside the card's own rule above because it has to come AFTER the
   declaration it overrides. pulseGlow runs 0 -> 1 -> 0, so a static 1 would be
   its PEAK: the calm version would be LOUDER than the animated one. 0.45 is
   roughly what the pulse averages, and the ring stays visible either way. */
@media (prefers-reduced-motion: reduce) {
    body.public-body .site-hero-stat::before {
        animation: none;
        opacity: 0.45;
    }
}

/* ── Link arrow nudge ── */
body.public-body a[href]:not(.btn-primary):not(.btn-secondary):not(.btn-outline):not(.site-nav-link):not(.site-brand):not(.site-mobile-link) [data-lucide*="arrow"] {
    transition: transform 0.2s ease;
}
body.public-body a[href]:hover [data-lucide*="arrow"] {
    transform: translateX(3px);
}

/* ── Badge bounce on load ── */
@keyframes badgeFadeIn {
    0%   { transform: translateY(4px); opacity: 0; }
    100% { transform: translateY(0); opacity: 1; }
}
body.public-body .site-badge {
    animation: badgeFadeIn 0.35s cubic-bezier(0.22, 1, 0.36, 1) 0.15s both;
}

/* `both` holds the 0% frame before the 0.15s delay elapses, so dropping the
   animation without restoring opacity would leave the badge invisible rather
   than merely still. */
@media (prefers-reduced-motion: reduce) {
    body.public-body .site-badge {
        animation: none;
        opacity: 1;
        transform: none;
    }
}

/* ── Social icon hover lift ── */
body.public-body .site-footer a[aria-label] {
    transition: transform 0.18s ease, background-color 0.18s ease, box-shadow 0.18s ease;
}
body.public-body .site-footer a[aria-label]:hover {
    transform: translateY(-3px);
    box-shadow: 0 10px 22px rgba(11, 31, 61,0.2);
}

/* ── Stats bar value count-up feel ── */
body.public-body .stat-value {
    transition: transform 0.22s ease;
}
body.public-body .stat-item:hover .stat-value {
    transform: scale(1.08);
}

/* ── Mobile touch feedback ── */
@media (hover: none) {
    body.public-body .btn-primary:active,
    body.public-body .btn-secondary:active,
    body.public-body .btn-outline:active {
        transform: scale(0.95);
    }
    body.public-body .feature-card:active,
    body.public-body .step-node:active {
        transform: scale(0.98);
    }
}

/* ── Smooth scroll-linked section separator ── */
body.public-body .site-section-divider {
    width: 100%;
    height: 1px;
    background: linear-gradient(90deg, transparent 5%, rgba(136, 160, 194, 0.25) 50%, transparent 95%);
}

/* ── Better select dropdowns ── */
body.public-body select.modern-select {
    appearance: none;
    padding-right: 2.5rem;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 0.85rem center;
    background-size: 1rem;
    cursor: pointer;
}

/* ── Loading shimmer for placeholders ── */
@keyframes contentShimmer {
    0%   { background-position: -200% center; }
    100% { background-position: 200% center; }
}
body.public-body .shimmer-placeholder {
    background: linear-gradient(90deg, rgba(223, 232, 243,0.6) 25%, rgba(238, 243, 249,0.9) 50%, rgba(223, 232, 243,0.6) 75%);
    background-size: 200% 100%;
    animation: contentShimmer 1.5s linear infinite;
    border-radius: 0.5rem;
}

/* ================================================================
   PHASE 3 — PREMIUM POLISH & REFINED DEPTH
   ================================================================ */

/* ── Upgraded nav — thinner, more refined ── */
body.public-body nav.site-nav {
    background: rgba(255, 255, 255, 0.97);
    border-bottom: 1px solid rgba(223, 232, 243, 0.5);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.9),
        0 4px 12px rgba(11, 31, 61, 0.04),
        0 16px 36px rgba(11, 31, 61, 0.06);
}

/* ── Hero section — luxury aurora mesh, sleek modern impressive ── */
body.public-body .site-hero {
    background:
        radial-gradient(circle 720px at 12% -10%, rgba(19, 67, 107, 0.22), transparent 55%),
        radial-gradient(circle 620px at 85% 5%, rgba(136, 160, 194, 0.22), transparent 60%),
        radial-gradient(circle 540px at 98% 70%, rgba(177, 29, 41, 0.10), transparent 60%),
        radial-gradient(circle 460px at 6% 95%, rgba(136, 160, 194, 0.14), transparent 60%),
        radial-gradient(circle 380px at 50% 55%, rgba(255, 255, 255, 0.72), transparent 70%),
        linear-gradient(180deg, #eef3f9 0%, #ffffff 50%, #ffffff 100%) !important;
    position: relative;
    isolation: isolate;
}
body.public-body .site-hero.hero-pattern {
    background-image:
        radial-gradient(circle 720px at 12% -10%, rgba(19, 67, 107, 0.22), transparent 55%),
        radial-gradient(circle 620px at 85% 5%, rgba(136, 160, 194, 0.22), transparent 60%),
        radial-gradient(circle 540px at 98% 70%, rgba(177, 29, 41, 0.10), transparent 60%),
        radial-gradient(circle 460px at 6% 95%, rgba(136, 160, 194, 0.14), transparent 60%),
        radial-gradient(circle 380px at 50% 55%, rgba(255, 255, 255, 0.72), transparent 70%),
        linear-gradient(180deg, #eef3f9 0%, #ffffff 50%, #ffffff 100%) !important;
}
body.public-body .site-hero::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
        conic-gradient(from 200deg at 60% 30%,
            rgba(136, 160, 194, 0) 0deg,
            rgba(136, 160, 194, 0.10) 70deg,
            rgba(136, 160, 194, 0.08) 140deg,
            rgba(136, 160, 194, 0.06) 210deg,
            rgba(245, 179, 1, 0.05) 280deg,
            rgba(136, 160, 194, 0) 360deg);
    mix-blend-mode: screen;
    pointer-events: none;
    z-index: 0;
    opacity: 0.85;
}
body.public-body .site-hero::after {
    content: none;
}
body.public-body .site-hero > * {
    position: relative;
    z-index: 1;
}

/* ── Hero card premium shadow stack ── */
body.public-body .site-hero-card {
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.04),
        0 8px 16px rgba(11, 31, 61,0.06),
        0 24px 48px rgba(11, 31, 61, 0.1),
        0 48px 80px rgba(11, 31, 61, 0.08);
    /* 4px gray→white gradient frame (3px thicker than the prior 1px). The
       padding-box fill sits behind the photos so only the ring shows. */
    border: 4px solid transparent;
    background:
        linear-gradient(#ffffff, #ffffff) padding-box,
        linear-gradient(135deg, #8496ab 0%, #dfe8f3 45%, #ffffff 100%) border-box;
}

/* ── Premium glass stats bar ── */
body.public-body .stats-bar {
    background: rgba(255, 255, 255, 0.85);
    border: 1px solid rgba(255, 255, 255, 0.9);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,1),
        0 4px 12px rgba(11, 31, 61, 0.04),
        0 16px 40px rgba(11, 31, 61, 0.08),
        inset 0 1px 0 rgba(255, 255, 255,0.95);
    backdrop-filter: blur(20px) saturate(1.3);
    -webkit-backdrop-filter: blur(20px) saturate(1.3);
}

/* ── Premium feature cards — frosted glass v2 ── */
body.public-body .feature-card {
    background:
        linear-gradient(180deg, rgba(255, 255, 255,0.99) 0%, rgba(238, 243, 249,0.95) 100%);
    border: 1px solid rgba(223, 232, 243, 0.7);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 4px 8px rgba(11, 31, 61, 0.03),
        0 12px 28px rgba(11, 31, 61, 0.06),
        inset 0 1px 0 rgba(255, 255, 255,0.95);
}
body.public-body .feature-card:hover {
    transform: translateY(-6px);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 8px 16px rgba(11, 31, 61, 0.05),
        0 24px 48px rgba(11, 31, 61, 0.1),
        inset 0 1px 0 rgba(255, 255, 255,0.95);
    border-color: rgba(136, 160, 194, 0.4);
}

/* ── Elevated icon wraps ── */
body.public-body .feature-icon-wrap {
    box-shadow:
        0 2px 4px rgba(11, 31, 61, 0.04),
        0 8px 20px rgba(11, 31, 61, 0.08);
    border-radius: 12px;
}
body.public-body .feature-icon-wrap-red {
    background: linear-gradient(145deg, rgba(177, 29, 41, 0.1), rgba(177, 29, 41, 0.04));
    border: 1px solid rgba(177, 29, 41, 0.1);
}
body.public-body .feature-icon-wrap-navy {
    background: linear-gradient(145deg, rgba(19, 67, 107, 0.1), rgba(19, 67, 107, 0.04));
    border: 1px solid rgba(19, 67, 107, 0.08);
}

/* ── Premium step nodes ── */
body.public-body .step-node {
    background:
        linear-gradient(180deg, rgba(255, 255, 255,0.99) 0%, rgba(238, 243, 249,0.94) 100%);
    border: 1px solid rgba(223, 232, 243, 0.7);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 4px 8px rgba(11, 31, 61, 0.03),
        0 14px 32px rgba(11, 31, 61, 0.06),
        inset 0 1px 0 rgba(255, 255, 255,0.95);
}
body.public-body .step-node:hover {
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 8px 16px rgba(11, 31, 61, 0.06),
        0 24px 50px rgba(11, 31, 61, 0.1),
        inset 0 1px 0 rgba(255, 255, 255,0.95);
}

/* ── Step numbers with premium depth ── */
body.public-body .step-number {
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.1),
        0 8px 20px rgba(11, 31, 61, 0.15),
        inset 0 1px 0 rgba(255, 255, 255,0.2);
    border: 1px solid rgba(255, 255, 255,0.15);
}
body.public-body .step-number-red {
    background: linear-gradient(160deg, #b11d29 0%, #b11d29 50%, #8f0f1c 100%);
}
body.public-body .step-number-navy {
    background: linear-gradient(160deg, #36598d 0%, #13436b 50%, #0b1f3d 100%);
}

/* ── Premium FAQ items ── */
body.public-body .faq-item {
    background: rgba(255, 255, 255, 0.96);
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 2px 6px rgba(11, 31, 61, 0.03),
        0 8px 24px rgba(11, 31, 61, 0.04);
}
body.public-body .faq-item.is-open {
    border-color: rgba(19, 67, 107, 0.14);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 4px 12px rgba(11, 31, 61, 0.05),
        0 16px 40px rgba(11, 31, 61, 0.08);
}
body.public-body .faq-trigger-icon {
    width: 1.8rem;
    height: 1.8rem;
    background: linear-gradient(180deg, rgba(238, 243, 249, 0.95), rgba(223, 232, 243, 0.6));
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow: 0 2px 4px rgba(11, 31, 61, 0.04);
}

/* ── Premium filter pills ── */
body.public-body .filter-pill {
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.04),
        0 4px 10px rgba(11, 31, 61, 0.04);
    border: 1px solid rgba(223, 232, 243, 0.8);
    backdrop-filter: blur(8px);
}
body.public-body .filter-pill.is-active,
body.public-body .filter-pill.filter-active {
    background: linear-gradient(160deg, #36598d 0%, #13436b 50%, #0b1f3d 100%);
    box-shadow:
        0 2px 4px rgba(11, 31, 61, 0.15),
        0 8px 20px rgba(11, 31, 61, 0.2),
        inset 0 1px 0 rgba(255, 255, 255,0.12);
    border: 1px solid rgba(255, 255, 255,0.1);
    text-shadow: 0 1px 2px rgba(11, 31, 61,0.15);
}

/* ── Premium outline button upgrade ── */
body.public-body .btn-outline {
    background: rgba(255, 255, 255, 0.96);
    border: 1.5px solid rgba(19, 67, 107, 0.16);
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.04),
        0 4px 12px rgba(11, 31, 61, 0.05);
    backdrop-filter: blur(8px);
}
body.public-body .btn-outline:hover {
    border-color: rgba(19, 67, 107, 0.4);
    background: rgba(19, 67, 107, 0.04);
    box-shadow:
        0 2px 4px rgba(11, 31, 61, 0.06),
        0 8px 24px rgba(11, 31, 61, 0.08),
        0 20px 40px rgba(11, 31, 61, 0.06);
    transform: translateY(-2px);
}
body.public-body .btn-outline-red {
    border-color: rgba(177, 29, 41, 0.16);
}
body.public-body .btn-outline-red:hover {
    border-color: rgba(177, 29, 41, 0.4);
    background: rgba(177, 29, 41, 0.03);
}

/* ── Premium CTA band — deeper, richer ── */
body.public-body .site-cta-band {
    background:
        radial-gradient(ellipse 40% 60% at 100% 0%, rgba(177, 29, 41, 0.2), transparent),
        radial-gradient(ellipse 50% 50% at 0% 100%, rgba(54, 89, 141, 0.25), transparent),
        radial-gradient(ellipse 30% 30% at 50% 50%, rgba(54, 89, 141, 0.15), transparent),
        linear-gradient(145deg, #0a1424 0%, #0b1f3d 30%, #13436b 60%, #13436b 100%);
}

/* ── Premium form cards ── */
body.public-body .cash-buyers-form {
    border: 1px solid rgba(223, 232, 243, 0.7);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 4px 8px rgba(11, 31, 61, 0.03),
        0 16px 36px rgba(11, 31, 61, 0.08),
        0 32px 64px rgba(11, 31, 61, 0.05);
}

/* ── Premium form inputs with inner depth ── */
body.public-body .cash-buyers-form input,
body.public-body .cash-buyers-form select,
body.public-body .cash-buyers-form textarea {
    border-radius: 12px;
    border: 1.5px solid rgba(223, 232, 243, 0.7);
    background: rgba(255, 255, 255, 0.98);
    box-shadow: inset 0 1px 3px rgba(11, 31, 61, 0.04);
    transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
}
body.public-body .cash-buyers-form input:hover,
body.public-body .cash-buyers-form select:hover,
body.public-body .cash-buyers-form textarea:hover {
    border-color: rgba(136, 160, 194, 0.6);
    background: #ffffff;
    box-shadow: inset 0 1px 3px rgba(11, 31, 61, 0.03);
}
body.public-body .cash-buyers-form input:focus,
body.public-body .cash-buyers-form select:focus,
body.public-body .cash-buyers-form textarea:focus {
    border-color: #13436b;
    box-shadow:
        0 0 0 3px rgba(11, 31, 61, 0.08),
        inset 0 1px 2px rgba(11, 31, 61, 0.03);
    background: #ffffff;
}

/* ── Premium buyer chip options ── */
body.public-body .buyer-chip-option {
    border: 1.5px solid rgba(223, 232, 243, 0.65);
    background: rgba(255, 255, 255, 0.98);
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.03),
        inset 0 1px 0 rgba(255, 255, 255,0.95);
    border-radius: 12px;
}
body.public-body .buyer-chip-option:hover {
    border-color: rgba(19, 67, 107, 0.18);
    background: rgba(238, 243, 249, 0.98);
    box-shadow:
        0 2px 6px rgba(11, 31, 61, 0.05),
        inset 0 1px 0 rgba(255, 255, 255,0.95);
    transform: translateY(-1px);
    transition: all 0.18s cubic-bezier(0.22, 1, 0.36, 1);
}
body.public-body .buyer-chip-option:has(input:checked) {
    border-color: #13436b;
    background: linear-gradient(180deg, rgba(19, 67, 107, 0.06), rgba(19, 67, 107, 0.03));
    box-shadow:
        0 0 0 3px rgba(11, 31, 61, 0.08),
        0 2px 8px rgba(11, 31, 61, 0.06),
        inset 0 1px 0 rgba(255, 255, 255,0.9);
}

/* ── Section eyebrow premium ── */
body.public-body .section-eyebrow {
    background: linear-gradient(135deg, rgba(177, 29, 41, 0.07), rgba(177, 29, 41, 0.03));
    border: 1px solid rgba(177, 29, 41, 0.1);
    box-shadow: 0 2px 8px rgba(177, 29, 41, 0.06);
    backdrop-filter: blur(4px);
}

/* ── Premium hero stat card ── */
body.public-body .site-hero-stat {
    background: rgba(255, 255, 255, 0.95);
    border: 1px solid rgba(255, 255, 255,0.8);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.03),
        0 8px 16px rgba(11, 31, 61,0.05),
        0 24px 48px rgba(11, 31, 61, 0.08);
    backdrop-filter: blur(16px);
}

/* ── Section underline — wider and more prominent ── */
body.public-body .section-underline::after {
    height: 3px;
    width: 4rem;
    background: linear-gradient(90deg, #b11d29, #13436b);
    box-shadow: 0 2px 6px rgba(177, 29, 41, 0.2);
}

/* ── Footer premium depth ── */
body.public-body .site-footer {
    isolation: isolate;
    position: relative;
    /* Brand ray-effect (rayeffect-m-fade.png) as the top-most background layer —
       the crisper "black" ray sheets rising from the footer floor. `screen` over the
       navy lifts the ray highlights into a subtle glow behind all content. This is the
       effective footer background rule (a later duplicate that overrides the earlier
       .site-footer block above). */
    background:
        none 50% 100% / 130% auto no-repeat,
        radial-gradient(circle 600px at 88% 0%, rgba(136, 160, 194, 0.22), transparent 60%),
        radial-gradient(circle 540px at 8% 100%, rgba(177, 29, 41, 0.18), transparent 60%),
        radial-gradient(circle 360px at 50% 50%, rgba(136, 160, 194, 0.10), transparent 65%),
        linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 35%, #13436b 70%, #13436b 100%) !important;
    background-blend-mode: screen, normal, normal, normal, normal;
    box-shadow: 0 -1px 0 rgba(255, 255, 255, 0.04), 0 -16px 40px rgba(11, 31, 61, 0.18);
}
/* Second, LIVE ray layer drifting on top of the static base ray — same treatment
   the deal flyer uses at its bottom edge (a slow screen-blended pan). z-index:-1
   sits above the footer's own ray background but below all footer content; masked
   so it fades out before the top edge. */
body.public-body .site-footer::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: min(62%, 60vh);
    background: none 50% 100% / 152% auto no-repeat;
    mix-blend-mode: screen;
    opacity: 0.5;
    pointer-events: none;
    z-index: -1;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 52%, transparent 100%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 52%, transparent 100%);
    /* ncddRayDrift is gone. The footer ray was re-declared further down this file
       with `animation: none` (it became a scroll-parallax layer driven by
       --raySlide instead), so the 19s drift, its keyframes and the
       reduced-motion block written for it had all stopped mattering -- and the
       reduced-motion block sat ABOVE the rule that overrode it, so it would have
       lost anyway. Nothing else referenced the keyframes. */
}

/* ── Footer CTA card glass upgrade ── */
body.public-body .site-footer-cta {
    background: rgba(255, 255, 255, 0.06);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 16px;
    backdrop-filter: blur(12px);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255,0.06),
        0 8px 24px rgba(11, 31, 61,0.15);
}

/* ── Footer button premium ── */
body.public-body .site-footer-button {
    background: linear-gradient(160deg, #b11d29 0%, #b11d29 50%, #8f0f1c 100%);
    border: 1px solid rgba(255, 255, 255,0.12);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.1),
        0 8px 20px rgba(177, 29, 41, 0.25);
    text-shadow: 0 1px 2px rgba(11, 31, 61,0.15);
}
body.public-body .site-footer-button:hover {
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.08),
        0 12px 28px rgba(177, 29, 41, 0.32);
}

/* ── Premium deal cards ── */
body.public-body .deal-card {
    background:
        linear-gradient(180deg, rgba(255, 255, 255,0.99) 0%, rgba(238, 243, 249,0.96) 100%);
    border: 1px solid rgba(223, 232, 243, 0.7);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 4px 8px rgba(11, 31, 61, 0.03),
        0 16px 36px rgba(11, 31, 61, 0.07),
        inset 0 1px 0 rgba(255, 255, 255,0.9);
}
body.public-body .deal-card:hover {
    transform: translateY(-6px);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 8px 16px rgba(11, 31, 61, 0.06),
        0 28px 56px rgba(11, 31, 61, 0.12),
        inset 0 1px 0 rgba(255, 255, 255,0.9);
    border-color: rgba(136, 160, 194, 0.5);
}

/* ── Deal card accent bar — smoother gradient ── */
body.public-body .deal-card-accent {
    height: 3px;
    background: linear-gradient(90deg, #b11d29 0%, #13436b 100%);
    opacity: 0.85;
}

/* ── Elevated badge styles ── */
body.public-body .site-badge {
    background: rgba(255, 255, 255, 0.95);
    border: 1px solid rgba(223, 232, 243, 0.7);
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.04),
        0 4px 12px rgba(11, 31, 61, 0.06);
    backdrop-filter: blur(8px);
}

/* ── Smoother hero photo rotated bg ── */
body.public-body .hero-photo-stack > .absolute:first-child {
    border-radius: 16px;
    background: linear-gradient(135deg, rgba(177, 29, 41,0.12), rgba(19, 67, 107,0.12)) !important;
    box-shadow: 0 24px 48px rgba(11, 31, 61, 0.08);
}

/* ── Buy box pref card — premium ── */
body.public-body .buyer-pref-card {
    background: linear-gradient(180deg, rgba(238, 243, 249,0.98), rgba(238, 243, 249,0.95));
    border: 1px solid rgba(223, 232, 243, 0.7) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255,0.95),
        0 2px 8px rgba(11, 31, 61, 0.04);
}

/* ── Premium consent checkboxes ── */
body.public-body label:has(input[name="isRealtor"]),
body.public-body label:has(input[name="textAlertsConsent"]),
body.public-body label:has(input[name="communicationConsent"]) {
    border-radius: 12px;
    box-shadow: 0 1px 3px rgba(11, 31, 61, 0.03);
    transition: box-shadow 0.18s ease, transform 0.18s ease;
}
body.public-body label:has(input[name="isRealtor"]):hover,
body.public-body label:has(input[name="textAlertsConsent"]):hover,
body.public-body label:has(input[name="communicationConsent"]):hover {
    box-shadow: 0 4px 12px rgba(11, 31, 61, 0.06);
    transform: translateY(-1px);
}

/* ── Smooth section bg transitions ── */
body.public-body section {
    position: relative;
}

/* ── Premium search input ── */
body.public-body .search-input {
    border: 1.5px solid rgba(223, 232, 243, 0.7);
    background: rgba(255, 255, 255, 0.98);
    box-shadow: inset 0 1px 3px rgba(11, 31, 61, 0.04);
}
body.public-body .search-input:focus {
    border-color: #13436b;
    box-shadow:
        0 0 0 3px rgba(11, 31, 61, 0.08),
        inset 0 1px 2px rgba(11, 31, 61, 0.03);
}

/* ── Premium mobile menu ── */
body.public-body .site-mobile-panel {
    background: rgba(255, 255, 255, 0.95);
    border-top: 1px solid rgba(223, 232, 243, 0.5);
    box-shadow: 0 16px 48px rgba(11, 31, 61, 0.1);
    backdrop-filter: blur(24px) saturate(1.4);
    -webkit-backdrop-filter: blur(24px) saturate(1.4);
}
body.public-body .site-mobile-link {
    border-radius: 12px;
    padding: 0.6rem 0.85rem;
    transition: all 0.15s ease;
}
body.public-body .site-mobile-link:hover {
    background: rgba(19, 67, 107, 0.04);
}

/* ── Decorative floating orbs for hero ── */
/* orbFloat is gone with the orbs. The two .hero-orb divs were converted into
   the ray layers further down this file, where `.hero-orb { animation: none }`
   overrides this rule outright -- so the float, its 12s timing and the two
   animation-delays that staggered it had not run in a long time, and read as a
   perpetual animation with no reduced-motion answer to anything auditing the
   source. Nothing else referenced the keyframes. */
body.public-body .hero-orb {
    position: absolute;
    border-radius: 9999px;
    pointer-events: none;
    filter: blur(60px);
    will-change: transform;
}
body.public-body .hero-orb-1 {
    width: 300px; height: 300px;
    top: -50px; left: -80px;
    background: rgba(19, 67, 107, 0.07);
}
body.public-body .hero-orb-2 {
    width: 200px; height: 200px;
    bottom: -30px; right: 10%;
    background: rgba(177, 29, 41, 0.05);
}

/* ── Section heading — larger text, better contrast ── */
body.public-body .section-title-gradient {
    color: #13436b;
}

/* ── Premium buyers panel (cash-buyers page form container) ── */
body.public-body .buyers-panel {
    background: rgba(255, 255, 255, 0.97);
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow:
        0 1px 0 rgba(255, 255, 255,0.98),
        0 4px 8px rgba(11, 31, 61, 0.03),
        0 16px 36px rgba(11, 31, 61, 0.07),
        0 32px 64px rgba(11, 31, 61, 0.04);
}

body.public-body.cash-buyers-page #cash-buyers-form {
    padding: 2rem;
}

body.public-body.cash-buyers-page #cash-buyers-form .cash-buyers-form {
    border: 0;
    box-shadow: none;
    background: transparent;
    padding: 0;
}

body.public-body.cash-buyers-page #cash-buyers-form > .mb-6 {
    margin-bottom: 1.5rem;
    padding-bottom: 1.35rem;
}

body.public-body.cash-buyers-page #cash-buyers-form .buyer-pref-card {
    border-color: rgba(223, 232, 243, 0.85);
    background:
        linear-gradient(180deg, rgba(238, 243, 249, 0.9), rgba(238, 243, 249, 0.72));
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255,0.8),
        0 10px 24px rgba(11, 31, 61, 0.04);
}

body.public-body.cash-buyers-page #cash-buyers-form .buyer-form-status,
body.public-body.cash-buyers-page #cash-buyers-form > .cash-buyers-form > label,
body.public-body.cash-buyers-page #cash-buyers-form > .cash-buyers-form > button {
    position: relative;
    z-index: 1;
}

@media (min-width: 768px) {
    body.public-body.cash-buyers-page #cash-buyers-form {
        padding: 2.15rem 2.2rem;
    }
}

/* ── Refined link hover colors ── */
body.public-body .site-nav-link:hover {
    color: #13436b;
}

/* ── Premium section backgrounds ── */
body.public-body section.bg-white,
body.public-body section[class*="bg-white"] {
    background:
        radial-gradient(ellipse 40% 30% at 80% 80%, rgba(19, 67, 107, 0.02), transparent),
        radial-gradient(ellipse 30% 30% at 20% 20%, rgba(177, 29, 41, 0.015), transparent),
        #ffffff !important;
}

/* Same container language as the deal-page Contact Team card, 2026-08-08:
   a white→gray face inside a CONTRASTING slate rim. The old #f8fbff face with
   a #d8e0ea hairline sat almost exactly on the white card behind it, so the
   panel had no readable edge — it looked like a tint, not a container. */
body.public-body .rent-estimate-shell {
    border: 2px solid transparent;
    border-radius: 16px;
    background:
        linear-gradient(180deg, #ffffff 0%, #eef3f9 58%, #eef3f9 100%) padding-box,
        linear-gradient(135deg, #dfe8f3 0%, #88a0c2 52%, #dfe8f3 100%) border-box;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 16px 34px -20px rgba(11, 31, 61, 0.28);
    padding: 1.5rem;
}

/* Median hero + range band — replaces the half-dial gauge. The value reads as
   the MIDDLE of a spread (marker centered on a min→max track, the middle half
   of the market shaded), not a needle reading. */
body.public-body .rent-estimate-hero {
    text-align: center;
    padding: 0.4rem 0 1.15rem;
}

body.public-body .rent-estimate-value {
    font-family: 'Inter', sans-serif;
    font-size: clamp(1.8rem, 4.2vw, 2.35rem);
    font-weight: 800;
    line-height: 1.02;
    letter-spacing: -0.035em;
    white-space: nowrap;
    color: #13436b;
}

body.public-body .rent-estimate-permo {
    margin-left: 0.15rem;
    font-size: 0.9rem;
    font-weight: 700;
    letter-spacing: 0;
    color: #36598d;
}

body.public-body .rent-estimate-hero-note {
    max-width: 24rem;
    margin: 0.65rem auto 0;
    font-size: 0.78rem;
    line-height: 1.5;
    color: #36598d;
}

body.public-body .rent-estimate-band { padding: 0 0.3rem; }

body.public-body .rent-estimate-band-track {
    position: relative;
    height: 0.85rem;
    border-radius: 999px;
    background: linear-gradient(180deg, #dfe8f3, #eef3f9);
    box-shadow: inset 0 1px 3px rgba(11, 31, 61, 0.16);
}

body.public-body .rent-estimate-band-core {
    position: absolute;
    top: 0;
    bottom: 0;
    border-radius: 999px;
    background: linear-gradient(90deg, #88a0c2 0%, #36598d 50%, #13436b 100%);
    box-shadow: 0 0 12px rgba(54, 89, 141, 0.35);
}

body.public-body .rent-estimate-band-marker {
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 1.35rem;
    height: 1.35rem;
    border-radius: 999px;
    background: linear-gradient(180deg, #ffffff, #eef3f9);
    border: 3px solid #13436b;
    box-shadow: 0 4px 10px rgba(11, 31, 61, 0.35);
}

body.public-body .rent-estimate-pill {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-top: 0.7rem;
    border-radius: 12px;
    padding: 0.46rem 0.95rem;
    font-size: 0.6rem;
    font-weight: 800;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: #0b1f3d;
    /* Softer, single diagonal wash — the two-stop vertical gradient plus two
       inset lines made this small label the glossiest object on the card. */
    background: linear-gradient(135deg, #f5b301 0%, #f5b301 55%, #f5b301 100%);
    border: 1px solid rgba(168, 111, 0, 0.22);
    box-shadow: 0 6px 14px -8px rgba(168, 111, 0, 0.4);
}

body.public-body .rent-estimate-range-row {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
    margin-top: 0.6rem;
}

body.public-body .rent-estimate-range-stat {
    font-size: 0.72rem;
    font-weight: 800;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: #36598d;
}

body.public-body .rent-estimate-range-value {
    margin-top: 0.35rem;
    font-family: 'Inter', sans-serif;
    font-size: 1.18rem;
    font-weight: 800;
    letter-spacing: -0.03em;
    color: #0b1f3d;
    text-transform: none;
}

body.public-body .rent-estimate-stat-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.85rem;
    margin-top: 1rem;
}

body.public-body .rent-estimate-stat-card,
body.public-body .rent-estimate-footer {
    border: 1px solid #dfe8f3;
    border-radius: 12px;
    background: #ffffff;
    box-shadow: 0 8px 18px -12px rgba(11, 31, 61, 0.3);
}

body.public-body .rent-estimate-stat-card {
    padding: 0.9rem 1rem;
    text-align: center;
}

body.public-body .rent-estimate-stat-label {
    font-size: 0.64rem;
    font-weight: 800;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: #36598d;
}

body.public-body .rent-estimate-stat-value {
    margin-top: 0.55rem;
    font-family: 'Inter', sans-serif;
    font-size: 1.5rem;
    font-weight: 800;
    letter-spacing: -0.04em;
    color: #0b1f3d;
}

body.public-body .rent-estimate-footer {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.85rem;
    margin-top: 1rem;
    padding: 0.95rem 1rem;
    background: #ffffff;
}

@media (max-width: 640px) {
    body.public-body .rent-estimate-value {
        font-size: clamp(1.5rem, 7vw, 1.9rem);
    }
}

/* ── Refined deal analyzer inputs ── */
body.public-body .deal-analyzer-input {
    border: 1.5px solid rgba(223, 232, 243, 0.7);
    background: rgba(255, 255, 255, 0.98);
    box-shadow: inset 0 1px 3px rgba(11, 31, 61, 0.04);
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
body.public-body .deal-analyzer-input:focus {
    border-color: #13436b;
    box-shadow:
        0 0 0 3px rgba(11, 31, 61, 0.08),
        inset 0 1px 2px rgba(11, 31, 61, 0.03);
    outline: none;
}

/* ── Checkbox styling ── */
body.public-body input[type="checkbox"] {
    border-radius: 0.3rem;
    border: 1.5px solid rgba(136, 160, 194, 0.6);
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
body.public-body input[type="checkbox"]:checked {
    border-color: #13436b;
    box-shadow: 0 0 0 2px rgba(11, 31, 61, 0.08);
}

/* ── Scrollbar styling ── */
body.public-body ::-webkit-scrollbar {
    width: 8px;
}
body.public-body ::-webkit-scrollbar-track {
    background: rgba(238, 243, 249, 0.8);
}
body.public-body ::-webkit-scrollbar-thumb {
    background: rgba(136, 160, 194, 0.4);
    border-radius: 9999px;
}
body.public-body ::-webkit-scrollbar-thumb:hover {
    background: rgba(136, 160, 194, 0.6);
}

/* ================================================================
   PHASE 4 — UNIFIED FLOATING UI + FONT CONSISTENCY + DETAIL PAGE
   ================================================================ */

/* ── Global font consistency ── */
body.public-body,
body.public-body * {
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
}
body.public-body h1,
body.public-body h2,
body.public-body .site-wordmark,
body.public-body .stat-value,
body.public-body .step-number {
    font-family: 'Inter', -apple-system, sans-serif;
}

/* ── Unified floating element base — consistent glass treatment ── */
body.public-body .buyer-stay-bubble,
body.public-body .buyer-profile-bubble,
body.public-body .public-chat-launcher,
body.public-body .buyer-identity-dock {
    background: rgba(255, 255, 255, 0.92);
    border: 1px solid rgba(255, 255, 255, 0.7);
    box-shadow:
        0 1px 2px rgba(11, 31, 61,0.04),
        0 8px 20px rgba(11, 31, 61, 0.08),
        0 24px 48px rgba(11, 31, 61, 0.06);
    backdrop-filter: blur(24px) saturate(1.4);
    -webkit-backdrop-filter: blur(24px) saturate(1.4);
    transition:
        transform 0.2s cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 0.2s cubic-bezier(0.22, 1, 0.36, 1),
        border-color 0.2s ease;
}

/* Last word on these two, so the reduced-motion answer has to be here. The hover
   lift still happens -- it just arrives instead of gliding, which is what a state
   change with no transition means. */
@media (prefers-reduced-motion: reduce) {
    body.public-body .public-chat-launcher,
    body.public-body .buyer-identity-dock {
        transition: none;
    }
}
body.public-body .buyer-stay-bubble:hover,
body.public-body .buyer-profile-bubble:hover,
body.public-body .public-chat-launcher:hover {
    transform: translateY(-3px);
    border-color: rgba(136, 160, 194, 0.3);
    box-shadow:
        0 1px 2px rgba(11, 31, 61,0.03),
        0 12px 28px rgba(11, 31, 61, 0.1),
        0 32px 56px rgba(11, 31, 61, 0.08);
}

/* ── Unified floating icon circles ── */
body.public-body .buyer-stay-bubble-icon {
    width: 2.35rem;
    height: 2.35rem;
    background: linear-gradient(160deg, #b11d29 0%, #b11d29 50%, #8f0f1c 100%);
    border: 1px solid rgba(255, 255, 255,0.15);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.1),
        0 8px 18px rgba(177, 29, 41, 0.2);
}
body.public-body .public-chat-launcher-icon {
    width: 2.35rem;
    height: 2.35rem;
    background: linear-gradient(160deg, #36598d 0%, #13436b 50%, #0b1f3d 100%);
    border: 1px solid rgba(255, 255, 255,0.15);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.1),
        0 8px 18px rgba(11, 31, 61, 0.2);
}
body.public-body .buyer-profile-bubble-icon {
    width: 2.35rem;
    height: 2.35rem;
    background: linear-gradient(160deg, #36598d 0%, #13436b 50%, #0b1f3d 100%);
    border: 1px solid rgba(255, 255, 255,0.15);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.1),
        0 8px 18px rgba(11, 31, 61, 0.2);
}
body.public-body .buyer-identity-icon {
    background: linear-gradient(160deg, #36598d 0%, #13436b 50%, #0b1f3d 100%);
    border: 1px solid rgba(255, 255, 255,0.15);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.1),
        0 8px 18px rgba(11, 31, 61, 0.2);
}

/* ── Unified floating text styles ── */
body.public-body .buyer-stay-bubble-title,
body.public-body .buyer-profile-bubble-title,
body.public-body .public-chat-launcher-label,
body.public-body .buyer-identity-greeting {
    font-family: 'Inter', sans-serif;
    font-size: 0.84rem;
    font-weight: 700;
    color: #0f1c33;
    line-height: 1.2;
    letter-spacing: -0.01em;
}
body.public-body .buyer-stay-bubble-subtitle,
body.public-body .buyer-profile-bubble-subtitle,
body.public-body .public-chat-launcher-subtitle,
body.public-body .buyer-identity-email {
    font-family: 'Inter', sans-serif;
    font-size: 0.72rem;
    color: #36598d;
    line-height: 1.2;
    letter-spacing: 0;
}

/* ── Stay-connected panel — match premium glass ── */
body.public-body .buyer-stay-connected {
    background: rgba(255, 255, 255, 0.94);
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow:
        0 1px 2px rgba(11, 31, 61,0.04),
        0 8px 20px rgba(11, 31, 61, 0.08),
        0 32px 56px rgba(11, 31, 61, 0.1);
    backdrop-filter: blur(24px) saturate(1.4);
    -webkit-backdrop-filter: blur(24px) saturate(1.4);
}

/* ── Chat panel — unified glass ── */
body.public-body .public-chat-panel {
    background: rgba(255, 255, 255, 0.94);
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow:
        0 1px 2px rgba(11, 31, 61,0.04),
        0 8px 20px rgba(11, 31, 61, 0.08),
        0 32px 56px rgba(11, 31, 61, 0.1);
    backdrop-filter: blur(24px) saturate(1.4);
    -webkit-backdrop-filter: blur(24px) saturate(1.4);
}

/* ── Deal interest prompt — match floating system ── */
body.public-body .deal-interest-prompt {
    background: rgba(255, 255, 255, 0.94);
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow:
        0 1px 2px rgba(11, 31, 61,0.04),
        0 8px 20px rgba(11, 31, 61, 0.08),
        0 32px 56px rgba(11, 31, 61, 0.12);
    backdrop-filter: blur(24px) saturate(1.4);
    -webkit-backdrop-filter: blur(24px) saturate(1.4);
}

/* ── Deal detail page — standardized buttons ── */
body.public-body .bg-primary {
    background: linear-gradient(160deg, #36598d 0%, #13436b 40%, #0b1f3d 100%) !important;
}
body.public-body .bg-secondary {
    background: linear-gradient(160deg, #b11d29 0%, #b11d29 40%, #8f0f1c 100%) !important;
}
body.public-body .hover\:bg-red-700:hover {
    background: linear-gradient(160deg, #b11d29 0%, #b11d29 40%, #8f0f1c 100%) !important;
}
body.public-body .hover\:bg-blue-800:hover {
    background: linear-gradient(160deg, #36598d 0%, #13436b 40%, #0b1f3d 100%) !important;
}

/* ── Deal detail — pill buttons + border radius consistency ── */
body.public-body button.rounded-lg,
body.public-body a.rounded-lg {
    border-radius: 12px;
}
body.public-body button.rounded-xl,
body.public-body a.rounded-xl {
    border-radius: 12px;
}

/* ── Deal detail — standardized shadow on action buttons ── */
body.public-body button[onclick="contactAboutDeal()"],
body.public-body button[onclick="scheduleShowing()"],
body.public-body button[onclick="shareDeal()"] {
    border-radius: 12px;
    box-shadow:
        0 1px 2px rgba(11, 31, 61,0.04),
        0 4px 12px rgba(11, 31, 61, 0.06);
    transition: all 0.2s cubic-bezier(0.22, 1, 0.36, 1);
}
body.public-body button[onclick="contactAboutDeal()"]:hover,
body.public-body button[onclick="scheduleShowing()"]:hover {
    transform: translateY(-2px);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.06),
        0 8px 24px rgba(11, 31, 61, 0.1);
}
body.public-body button[onclick="contactAboutDeal()"] {
    border: 1px solid rgba(255, 255, 255,0.15);
    text-shadow: 0 1px 2px rgba(11, 31, 61,0.15);
}

/* ── Deal detail — Make an Offer button ── */
body.public-body button[onclick="contactAboutDeal()"].w-full {
    border-radius: 12px;
    font-size: 1.05rem;
    padding: 1rem 1.5rem;
    border: 1px solid rgba(255, 255, 255,0.15);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.08),
        0 8px 20px rgba(177, 29, 41, 0.2),
        0 20px 40px rgba(177, 29, 41, 0.1);
    text-shadow: 0 1px 2px rgba(11, 31, 61,0.15);
}
body.public-body button[onclick="contactAboutDeal()"].w-full:hover {
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.06),
        0 12px 28px rgba(177, 29, 41, 0.25),
        0 28px 48px rgba(177, 29, 41, 0.12);
}

/* ── Deal detail agent card ── */
body.public-body .bg-primary.rounded-2xl {
    border: 1px solid rgba(255, 255, 255,0.08);
    box-shadow:
        0 2px 4px rgba(11, 31, 61,0.06),
        0 8px 20px rgba(11, 31, 61, 0.15),
        0 24px 48px rgba(11, 31, 61, 0.1);
}

/* ── Detail page stat boxes ── */
body.public-body .bg-gray-50.rounded-lg {
    background: linear-gradient(180deg, rgba(238, 243, 249,0.98), rgba(238, 243, 249,0.95)) !important;
    border: 1px solid rgba(223, 232, 243, 0.6);
    border-radius: 12px !important;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.95);
}

/* ── Success modal — premium ── */
body.public-body #successModal > div {
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow:
        0 4px 8px rgba(11, 31, 61,0.04),
        0 16px 36px rgba(11, 31, 61, 0.1),
        0 48px 80px rgba(11, 31, 61, 0.08);
}

/* ── Pref pill badges ── */
body.public-body .buyer-pref-pill {
    font-family: 'Inter', sans-serif;
    background: rgba(255, 255, 255, 0.95);
    border: 1px solid rgba(223, 232, 243, 0.6);
    box-shadow: 0 1px 3px rgba(11, 31, 61, 0.04);
}

/* ── Consent label text ── */
body.public-body label .text-sm.font-medium {
    font-family: 'Inter', sans-serif;
}

/* ── Chat panel title font ── */
body.public-body .public-chat-panel-title {
    font-family: 'Inter', sans-serif;
    font-weight: 700;
}

/* Public-page premium layout overrides */
body.public-body .section-stack {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.7rem;
}

body.public-body .section-stack > .section-eyebrow {
    margin-bottom: 0;
}

body.public-body .section-stack > .section-underline {
    margin-bottom: 0;
}

body.public-body .section-stack > p {
    margin-top: 0;
}

body.public-body .section-copy-tight {
    max-width: 44rem;
    margin-left: auto;
    margin-right: auto;
}

body.public-body .section-underline {
    display: inline-flex;
    width: fit-content;
    padding-bottom: 1rem;
}

body.public-body .section-underline::after {
    left: 0;
    transform: none;
    width: 100%;
    height: 4px;
    bottom: 0;
    border-radius: 9999px;
    background: linear-gradient(90deg, #b11d29 0%, #b11d29 32%, #13436b 100%);
    box-shadow: 0 8px 18px rgba(11, 31, 61, 0.14);
}

body.public-body .stats-rail-wrap {
    position: relative;
    padding: 0;
}

body.public-body .stats-rail-wrap::before {
    display: none;
}

body.public-body .stats-rail-wrap::after {
    display: none;
}

body.public-body > .hero-stats-seam.relative.z-20 {
    display: none;
}

body.public-body .how-buying-section {
    position: relative;
    padding-top: 7rem;
}

body.public-body .how-buying-section::before {
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 2px;
    background: linear-gradient(90deg, rgba(10, 20, 36, 0), rgba(19, 67, 107, 0.18) 16%, rgba(177, 29, 41, 0.42) 50%, rgba(19, 67, 107, 0.18) 84%, rgba(10, 20, 36, 0));
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.75), 0 0 22px rgba(11, 31, 61, 0.08);
    pointer-events: none;
    z-index: 1;
}

body.public-body .how-buying-section > .hero-stats-seam {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    transform: translateY(-50%);
    z-index: 2;
}

body.public-body .how-buying-section > .hero-stats-seam::before {
    display: none;
}

body.public-body .stats-bar {
    position: relative;
    width: min(100%, 48rem);
    max-width: 48rem;
    margin: 0 auto;
    z-index: 2;
    gap: 0;
    padding: 0;
    border-radius: 16px;
    background: #ffffff;
    border: 1px solid rgba(223, 232, 243, 0.92);
    box-shadow: 0 18px 40px rgba(11, 31, 61, 0.08);
    overflow: hidden;
}

body.public-body .stats-bar::before {
    display: none;
}

body.public-body .stat-item {
    position: relative;
    z-index: 1;
    min-height: 5.45rem;
    padding: 1.15rem 1.3rem 1rem;
    border-right: 0;
}

body.public-body .stat-item:not(:last-child)::after {
    content: '';
    position: absolute;
    top: 18%;
    right: 0;
    width: 1px;
    height: 64%;
    background: rgba(223, 232, 243, 0.92);
}

body.public-body .stat-value {
    font-size: 2rem;
    letter-spacing: -0.04em;
}

body.public-body .stat-label {
    margin-top: 0.34rem;
    font-size: 0.76rem;
    font-weight: 700;
    letter-spacing: 0.14em;
}

body.public-body .buyer-network-shell {
    display: grid;
    gap: 1.4rem;
}

body.public-body .buyer-network-shell-preview {
    align-content: start;
}

body.public-body .buyer-network-preview-shell {
    overflow: hidden;
    max-height: 54rem;
    opacity: 1;
    transform: translateY(0);
    transition: opacity 0.24s ease, transform 0.24s ease;
}

body.public-body .buyer-network-shell.is-open .buyer-network-preview-shell {
    max-height: 0;
    opacity: 0;
    transform: translateY(-12px);
}

body.public-body .buyer-network-preview-card {
    position: relative;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    gap: 0.95rem;
    width: 100%;
    padding: 1.35rem 1.35rem 1.2rem;
    border-radius: 16px;
    text-align: left;
    color: #0b1f3d;
    background: linear-gradient(180deg, rgba(238, 243, 249,0.98), rgba(255, 255, 255,0.96));
    border: 1px solid rgba(223, 232, 243, 0.88);
    /* Crimson top accent via inset box-shadow ONLY. An inset shadow is clipped
       to the border-radius, so it hugs the rounded top corners cleanly. The
       old straight ::before bar was NOT clipped to the radius and left a "notch"
       against the dark section at each top corner — removed to fix that. */
    box-shadow: 0 26px 46px rgba(11, 31, 61, 0.16), inset 0 3px 0 rgba(177, 29, 41, 0.92), inset 0 1px 0 rgba(255, 255, 255,0.5);
    overflow: hidden;
    transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease;
}

body.public-body .buyer-network-preview-card::after {
    content: '';
    position: absolute;
    inset: auto -4rem -4rem auto;
    width: 12rem;
    height: 12rem;
    border-radius: 9999px;
    background: radial-gradient(circle, rgba(19, 67, 107, 0.1) 0%, rgba(19, 67, 107, 0.03) 48%, transparent 72%);
    pointer-events: none;
}

body.public-body .buyer-network-preview-card:hover {
    transform: translateY(-3px);
    box-shadow: 0 30px 54px rgba(11, 31, 61, 0.18), inset 0 3px 0 rgba(177, 29, 41, 0.92), inset 0 1px 0 rgba(255, 255, 255,0.5);
    border-color: rgba(136, 160, 194, 0.34);
}

body.public-body .buyer-network-preview-header,
body.public-body .buyer-network-preview-footer {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
}

body.public-body .buyer-network-preview-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.72rem 0.95rem;
    border-radius: 12px;
    background: rgba(177, 29, 41, 0.08);
    border: 1px solid rgba(177, 29, 41, 0.12);
    color: #8f0f1c;
    font-size: 0.78rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.14em;
}

body.public-body .buyer-network-preview-action {
    display: inline-flex;
    align-items: center;
    padding: 0.42rem 0.82rem;
    border-radius: 0.5rem;
    background: rgba(19, 67, 107, 0.06);
    border: 1px solid rgba(136, 160, 194, 0.24);
    color: #13436b;
    font-size: 0.72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.14em;
}

body.public-body .buyer-network-preview-copy {
    position: relative;
    z-index: 1;
}

body.public-body .buyer-network-copy-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    margin-top: 1.2rem;
}

body.public-body .buyer-network-copy-chip {
    display: inline-flex;
    align-items: center;
    padding: 0.46rem 0.8rem;
    border-radius: 0.5rem;
    font-size: 0.72rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.12em;
}

body.public-body .buyer-network-copy-chip.is-light {
    background: rgba(255, 255, 255, 0.1);
    border: 1px solid rgba(255, 255, 255, 0.16);
    color: rgba(255, 255, 255, 0.95);
}

body.public-body .buyer-network-copy-chip.is-dark {
    background: rgba(10, 20, 36, 0.05);
    border: 1px solid rgba(136, 160, 194, 0.22);
    color: #13436b;
}

body.public-body .buyer-network-preview-title {
    font-family: 'Inter', sans-serif;
    font-size: 1.6rem;
    line-height: 1.05;
    font-weight: 800;
    color: #0b1f3d;
}

body.public-body .buyer-network-preview-text {
    margin-top: 0.5rem;
    color: #13436b;
    font-size: 0.98rem;
    line-height: 1.55;
    margin-bottom: 0;
}

body.public-body .buyer-network-preview-signal-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.55rem;
    margin-top: 1.15rem;
}

body.public-body .buyer-network-preview-signal {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.48rem 0.78rem;
    border-radius: 0.5rem;
    background: linear-gradient(180deg, rgba(177, 29, 41, 0.12), rgba(19, 67, 107, 0.08));
    border: 1px solid rgba(136, 160, 194, 0.2);
    box-shadow: 0 10px 18px rgba(11, 31, 61, 0.08), inset 0 1px 0 rgba(255, 255, 255,0.85);
    color: #13436b;
    font-size: 0.74rem;
    font-weight: 800;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}

/* "Become a VIP Buyer" sales pitch — premium gold strip inside the preview card. */
body.public-body .buyer-network-vip-pitch {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    margin-top: 0.95rem;
    padding: 0.7rem 0.85rem;
    border-radius: 12px;
    background: linear-gradient(135deg, rgba(245, 179, 1, 0.18) 0%, rgba(255, 201, 51, 0.08) 100%);
    border: 1px solid rgba(245, 179, 1, 0.4);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6);
}

body.public-body .buyer-network-vip-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    flex-shrink: 0;
    padding: 0.32rem 0.65rem;
    border-radius: 999px;
    background: linear-gradient(135deg, #f5b301 0%, #a86f00 100%);
    color: #ffffff;
    font-size: 0.68rem;
    font-weight: 800;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    box-shadow: 0 6px 14px rgba(168, 111, 0, 0.32);
}

body.public-body .buyer-network-vip-text {
    color: #0b1f3d;
    font-size: 0.84rem;
    font-weight: 600;
    line-height: 1.4;
}

body.public-body .buyer-network-vip-text strong {
    color: #0b1f3d;
    font-weight: 800;
}

body.public-body .buyer-network-preview-footer {
    margin-top: auto;
    padding-top: 0.2rem;
}

body.public-body .buyer-network-preview-footnote {
    color: #13436b;
    font-size: 0.88rem;
    line-height: 1.45;
    max-width: 26rem;
}

body.public-body .buyer-network-preview-cta {
    display: inline-flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.82rem 1.1rem;
    border-radius: 12px;
    background: linear-gradient(135deg, #b11d29 0%, #b11d29 42%, #8f0f1c 100%);
    color: #ffffff;
    font-size: 0.82rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.14em;
    box-shadow: 0 16px 28px rgba(177, 29, 41, 0.24);
}

body.public-body .buyer-network-preview-icon {
    transition: transform 0.24s ease;
}

body.public-body .buyer-network-shell.is-open .buyer-network-preview-icon {
    transform: rotate(180deg);
}

body.public-body .buyer-network-form-shell {
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    transform: translateY(-10px);
    transition: opacity 0.24s ease, transform 0.24s ease;
}

/* `max-height: none`, NOT a pixel number. The open state is a REVEAL, not a
   height animation — only opacity and transform are transitioned above, so a
   numeric cap buys nothing and can only ever be too small. It was 2400px, and
   the signup form stacked to a single column on a 390px phone measures 2218px
   with the "Dial in my criteria" block collapsed and 3211px with it open: the
   moment a buyer opened the optional criteria, 813px — deal types, timeline,
   proof of funds, both consent boxes and the submit button — was clipped by
   the `overflow: hidden` above with no scrollbar and no way to reach it. The
   form simply ended mid-row against the navy band below it. `overflow` goes
   back to visible for the same reason it is hidden while closed: hidden is
   what makes the collapse crop cleanly, and once open there is nothing left
   to crop except the form's own drop shadow. */
body.public-body .buyer-network-shell.is-open .buyer-network-form-shell {
    max-height: none;
    overflow: visible;
    opacity: 1;
    transform: translateY(0);
}

body.public-body .buyer-network-toggle {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: center;
    gap: 1rem;
    width: 100%;
    border-radius: 16px;
    background: linear-gradient(135deg, rgba(177, 29, 41, 0.96) 0%, rgba(177, 29, 41, 0.98) 46%, rgba(143, 15, 28, 0.98) 100%);
    color: #ffffff;
    padding: 1.2rem 1.25rem;
    font-weight: 800;
    letter-spacing: 0.01em;
    text-align: left;
    border: 1px solid rgba(255, 255, 255, 0.16);
    box-shadow: 0 24px 40px rgba(177, 29, 41, 0.22);
    transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}

body.public-body .buyer-network-toggle:hover {
    transform: translateY(-2px);
    box-shadow: 0 28px 44px rgba(177, 29, 41, 0.28);
    border-color: rgba(255, 255, 255, 0.24);
}

body.public-body .buyer-network-toggle-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.55rem;
    align-self: start;
    padding: 0.72rem 0.9rem;
    border-radius: 12px;
    background: rgba(255, 255, 255, 0.12);
    border: 1px solid rgba(255, 255, 255, 0.18);
    font-size: 0.8rem;
    text-transform: uppercase;
    letter-spacing: 0.14em;
}

body.public-body .buyer-network-toggle-copy {
    min-width: 0;
}

body.public-body .buyer-network-toggle-copy-top {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
}

body.public-body .buyer-network-toggle-title {
    font-family: 'Inter', sans-serif;
    font-size: 1.15rem;
    line-height: 1.1;
}

body.public-body .buyer-network-toggle-action {
    display: inline-flex;
    align-items: center;
    padding: 0.32rem 0.7rem;
    border-radius: 0.5rem;
    background: rgba(10, 20, 36, 0.16);
    border: 1px solid rgba(255, 255, 255, 0.16);
    font-size: 0.72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.14em;
}

body.public-body .buyer-network-toggle-text {
    margin-top: 0.55rem;
    color: rgba(255, 255, 255, 0.86);
    font-size: 0.95rem;
    line-height: 1.55;
}

body.public-body .buyer-network-toggle-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.55rem;
    margin-top: 0.85rem;
}

body.public-body .buyer-network-toggle-chip {
    display: inline-flex;
    align-items: center;
    padding: 0.42rem 0.72rem;
    border-radius: 0.5rem;
    background: rgba(255, 255, 255, 0.12);
    border: 1px solid rgba(255, 255, 255, 0.14);
    color: rgba(255, 255, 255, 0.92);
    font-size: 0.76rem;
    font-weight: 700;
}

body.public-body .buyer-network-home-signals {
    display: flex;
    flex-wrap: wrap;
    gap: 0.55rem;
    margin-top: 1.15rem;
}

body.public-body .buyer-network-home-signal {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.48rem 0.78rem;
    border-radius: 0.5rem;
    background: linear-gradient(180deg, rgba(255, 255, 255,0.16), rgba(255, 255, 255,0.08));
    border: 1px solid rgba(255, 255, 255,0.14);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.14), 0 10px 18px rgba(11, 31, 61, 0.16);
    color: rgba(255, 255, 255,0.94);
    font-size: 0.74rem;
    font-weight: 800;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}

body.public-body .buyer-network-home-benefits {
    display: grid;
    gap: 0.7rem;
    margin-top: 1.45rem;
}

body.public-body .buyer-network-home-benefit {
    min-height: 3.55rem;
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255,0.12);
    display: flex;
    align-items: center;
    gap: 0.9rem;
    padding: 0.9rem 1rem;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.08), 0 18px 28px rgba(11, 31, 61, 0.14);
}

body.public-body .buyer-network-home-benefit-blue {
    background: linear-gradient(135deg, rgba(54, 89, 141, 0.3), rgba(11, 31, 61, 0.58));
    border-color: rgba(136, 160, 194, 0.18);
}

body.public-body .buyer-network-home-benefit-red {
    background: linear-gradient(135deg, rgba(177, 29, 41, 0.38), rgba(11, 31, 61, 0.56));
    border-color: rgba(217, 50, 64, 0.16);
}

body.public-body .buyer-network-home-benefit-green {
    background: linear-gradient(135deg, rgba(22, 163, 74, 0.22), rgba(11, 31, 61, 0.56));
    border-color: rgba(68, 215, 146, 0.16);
}

body.public-body.cash-buyers-page .buyer-network-home-benefit {
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.12), 0 20px 36px rgba(11, 31, 61, 0.18);
}

body.public-body.cash-buyers-page .buyer-network-home-benefit-blue {
    background: linear-gradient(135deg, rgba(54, 89, 141, 0.78), rgba(10, 20, 36, 0.86));
    border-color: rgba(136, 160, 194, 0.44);
}

body.public-body.cash-buyers-page .buyer-network-home-benefit-red {
    background: linear-gradient(135deg, rgba(217, 50, 64, 0.76), rgba(11, 31, 61, 0.84));
    border-color: rgba(247, 218, 221, 0.42);
}

body.public-body.cash-buyers-page .buyer-network-home-benefit-green {
    background: linear-gradient(135deg, rgba(22, 163, 74, 0.74), rgba(10, 20, 36, 0.84));
    border-color: rgba(68, 215, 146, 0.4);
}

body.public-body.cash-buyers-page .buyer-network-home-benefit-icon {
    background: rgba(255, 255, 255,0.18);
    border-color: rgba(255, 255, 255,0.28);
    box-shadow: 0 12px 22px rgba(11, 31, 61, 0.18);
}

/* These three opt-ins were an orange one, a green one and a blue one, stacked.
   Painted HERE with !important, so neutralising the utility classes in the
   markup changed nothing on screen -- the rainbow was never in the HTML.

   Colour on this row can only mean one thing usefully, and the useful thing is
   "you have to tick this". Two are optional and go quiet; the REQUIRED consent
   keeps the only tinted ground on the stack. Same rule the deals page and the
   deal page both follow now. */
body.public-body.cash-buyers-page label:has(input[name="isRealtor"]),
body.public-body.cash-buyers-page label:has(input[name="textAlertsConsent"]) {
    background: #ffffff !important;
    border-color: #dfe8f3 !important;
    box-shadow: 0 1px 3px rgba(11, 31, 61, 0.04);
}

body.public-body.cash-buyers-page label:has(input[name="communicationConsent"]) {
    background: #eef3f9 !important;
    border-color: #dfe8f3 !important;
    box-shadow: 0 12px 22px rgba(11, 31, 61, 0.06);
}

body.public-body .buyer-network-home-benefit-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    flex-shrink: 0;
    border-radius: 999px;
    background: rgba(255, 255, 255,0.12);
    border: 1px solid rgba(255, 255, 255,0.16);
    color: #ffffff;
    box-shadow: 0 10px 18px rgba(11, 31, 61, 0.12);
}

body.public-body .buyer-network-home-benefit-text {
    color: rgba(255, 255, 255,0.96);
    font-size: 0.92rem;
    font-weight: 650;
    line-height: 1.45;
}

body.public-body .buyer-network-toggle-chevron {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.8rem;
    height: 2.8rem;
    border-radius: 999px;
    background: rgba(10, 20, 36, 0.18);
    border: 1px solid rgba(255, 255, 255, 0.16);
}

body.public-body .buyer-network-toggle-icon {
    transition: transform 0.24s ease;
}

body.public-body .buyer-network-shell.is-open .buyer-network-toggle-icon {
    transform: rotate(180deg);
}

body.public-body .buyer-network-shell.is-open .buyer-network-toggle-action {
    background: rgba(10, 20, 36, 0.26);
}

body.public-body .site-cta-band {
    padding-top: 6.5rem;
    padding-bottom: 6.5rem;
}

body.public-body .site-cta-band .cash-buyers-form {
    box-shadow: 0 24px 48px rgba(11, 31, 61, 0.18);
}

@media (max-width: 768px) {
    body.public-body .buyer-network-preview-card {
        padding: 1.1rem;
    }

    body.public-body .buyer-network-preview-footer {
        align-items: flex-start;
    }

    body.public-body .buyer-network-toggle {
        grid-template-columns: 1fr;
        gap: 0.95rem;
        padding: 1rem;
    }

    body.public-body .buyer-network-toggle-copy-top {
        align-items: flex-start;
    }

    body.public-body .buyer-network-toggle-chevron {
        width: 100%;
        height: 2.5rem;
    }
}

body.public-body .site-footer {
    position: relative;
}

body.public-body .site-footer::before {
    left: 0 !important;
    right: 0 !important;
    width: 100% !important;
    border-radius: 9999px;
}

body.public-body .site-footer-grid {
    display: grid;
    gap: 2rem;
}

@media (min-width: 768px) {
    body.public-body .site-footer-grid {
        grid-template-columns: 1.35fr 0.95fr 1.25fr 0.72fr 1.12fr;
        align-items: start;
    }
}

body.public-body .site-footer-contact {
    min-width: 0;
}

body.public-body .site-footer-social {
    padding-left: 0.25rem;
}

body.public-body .site-footer-cta {
    min-height: 100%;
}

/* These three sit inside the tracker's LEFT shell column, not the full page width,
   so a hard `repeat(3, 1fr)` handed them 157px each at 1280px — wide enough while
   their body copy was hidden, and cramped to three words a line the moment it came
   back ("Paste your / reference", "Need direct / help?"). The markup now places
   this row BELOW that shell instead of inside the rail, so three columns finally
   have ~360px each and the copy reads. Below 768px it drops to one column further
   down this file. */
body.public-body .tracker-point-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
}

/* The three cards under "Track Your Deal Status" each carry a heading AND a line
   of body copy. A blanket `display: none` on that copy shipped in the March 27
   premium pass, so all three rendered as an icon, a title, and 40px of empty
   card — which reads as a component that failed to load, not as a compact one.
   The copy is the only thing that answers "where do I find my reference ID". */
body.public-body .tracker-point-card p {
    max-width: 34ch;
}

body.public-body .metric-premium-card {
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.82);
    background: linear-gradient(180deg, rgba(255, 255, 255,0.98), rgba(238, 243, 249,0.94));
    box-shadow: 0 18px 40px rgba(11, 31, 61, 0.08);
}

body.public-body .coaching-bundle-card {
    background: linear-gradient(135deg, #0b1f3d 0%, #13436b 42%, #13436b 100%);
    box-shadow: 0 28px 56px rgba(11, 31, 61, 0.16);
}

body.public-body .site-profile-menu {
    position: relative;
    display: flex;
    align-items: center;
}

body.public-body .site-profile-trigger {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 3.2rem;
    height: 3.2rem;
    border-radius: 9999px;
    border: 1px solid rgba(223, 232, 243, 0.9);
    background:
        linear-gradient(180deg, rgba(255, 255, 255,0.98), rgba(238, 243, 249,0.96)),
        radial-gradient(circle at top, rgba(19, 67, 107,0.1), transparent 55%);
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.06),
        0 12px 28px rgba(11, 31, 61, 0.1);
    color: #13436b;
    transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease, color 160ms ease;
}

body.public-body .site-profile-trigger:hover {
    transform: translateY(-1px);
    border-color: rgba(136, 160, 194, 0.95);
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.06),
        0 16px 34px rgba(11, 31, 61, 0.12);
}

body.public-body .site-profile-trigger:focus-visible,
body.public-body .site-profile-item:focus-visible {
    outline: 2px solid #13436b;
    outline-offset: 3px;
}

body.public-body .site-profile-trigger-badge {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
}

body.public-body .site-profile-icon {
    width: 1.5rem;
    height: 1.5rem;
    color: currentColor;
}

body.public-body .site-profile-trigger-mini-badge {
    position: absolute;
    right: -0.52rem;
    bottom: -0.4rem;
    min-width: 1.2rem;
    height: 1.2rem;
    padding: 0 0.24rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 9999px;
    background: linear-gradient(160deg, #b11d29 0%, #8f0f1c 100%);
    box-shadow: 0 8px 18px rgba(177, 29, 41, 0.3);
    border: 2px solid rgba(255, 255, 255,0.95);
    color: #ffffff;
    font-size: 0.56rem;
    font-weight: 800;
    letter-spacing: 0.08em;
    line-height: 1;
    text-transform: uppercase;
}

body.public-body .site-profile-panel {
    position: absolute;
    top: calc(100% + 0.8rem);
    right: 0;
    width: min(18.5rem, calc(100vw - 2rem));
    padding: 0.95rem;
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.92);
    background:
        linear-gradient(180deg, rgba(255, 255, 255,0.985), rgba(238, 243, 249,0.97)),
        radial-gradient(circle at top right, rgba(19, 67, 107,0.08), transparent 38%);
    box-shadow: 0 28px 60px rgba(11, 31, 61, 0.16);
    backdrop-filter: blur(20px);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-8px);
    pointer-events: none;
    transition: opacity 160ms ease, transform 160ms ease, visibility 160ms ease;
    z-index: 120;
}

body.public-body .site-profile-menu.is-open .site-profile-panel {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    pointer-events: auto;
}

body.public-body .site-profile-panel-head {
    padding: 0.1rem 0.15rem 0.8rem;
}

body.public-body .site-profile-panel-title {
    color: #0b1f3d;
    font-size: 1rem;
    font-weight: 700;
    letter-spacing: -0.02em;
}

body.public-body .site-profile-panel-subtitle {
    margin-top: 0.22rem;
    color: #36598d;
    font-size: 0.82rem;
    line-height: 1.45;
}

body.public-body .site-profile-item {
    display: flex;
    width: 100%;
    align-items: center;
    justify-content: flex-start;
    border-radius: 12px;
    padding: 0.78rem 0.9rem;
    color: #0b1f3d;
    font-size: 0.95rem;
    font-weight: 600;
    line-height: 1.2;
    text-decoration: none;
    background: transparent;
    border: 1px solid transparent;
    transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease, transform 160ms ease;
}

body.public-body .site-profile-item:hover {
    background: rgba(238, 243, 249, 0.96);
    border-color: rgba(223, 232, 243, 0.92);
    transform: translateX(1px);
}

body.public-body .site-profile-item + .site-profile-item {
    margin-top: 0.2rem;
}

body.public-body .site-profile-item-primary {
    background: linear-gradient(160deg, rgba(177, 29, 41,0.1), rgba(177, 29, 41,0.04));
    border-color: rgba(177, 29, 41, 0.16);
    color: #8f0f1c;
}

body.public-body .site-profile-item-danger {
    color: #b11d29;
}

body.public-body .site-profile-item-danger:hover {
    background: rgba(252, 237, 239, 0.96);
    border-color: rgba(247, 218, 221, 0.42);
    color: #8f0f1c;
}

body.public-body .site-profile-trigger-mobile {
    width: 100%;
    height: auto;
    padding: 0.95rem 1rem;
    justify-content: space-between;
    border-radius: 12px;
}

body.public-body .site-profile-trigger-copy {
    flex: 1 1 auto;
    padding-left: 0.85rem;
    text-align: left;
    color: #0b1f3d;
    font-size: 0.96rem;
    font-weight: 700;
}

body.public-body .site-profile-trigger-chevron {
    width: 1rem;
    height: 1rem;
    color: #36598d;
}

body.public-body .site-profile-menu-mobile {
    width: 100%;
}

body.public-body .site-profile-panel-mobile {
    position: static;
    width: 100%;
    margin-top: 0.75rem;
    transform: none;
    box-shadow: 0 18px 38px rgba(11, 31, 61, 0.1);
    display: none;
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
}

body.public-body .site-profile-menu-mobile.is-open .site-profile-panel-mobile {
    display: block;
}

@media (max-width: 1023px) {
    body.public-body .stats-bar {
        gap: 0.3rem;
    }

    body.public-body .stat-item {
        flex: 1 1 calc(50% - 0.3rem);
        border-right: 0;
        border-bottom: 1px solid rgba(223, 232, 243, 0.7);
    }

    body.public-body .stat-item:nth-last-child(-n+2) {
        border-bottom: 0;
    }
}

@media (max-width: 767px) {
    body.public-body .section-stack {
        gap: 0.55rem;
    }

    body.public-body .hero-stats-seam {
        transform: translateY(-50%);
    }

    body.public-body .stats-rail-wrap {
        padding-top: 0;
        padding-bottom: 0;
    }

    body.public-body .stats-bar {
        padding: 0.85rem;
    }

    body.public-body .stat-item {
        flex-basis: 100%;
        border-bottom: 1px solid rgba(223, 232, 243, 0.7);
    }

    body.public-body .stat-item:not(:last-child)::after {
        display: none;
    }

    body.public-body .stat-item:last-child {
        border-bottom: 0;
    }

    body.public-body .how-buying-section {
        padding-top: 5.8rem;
    }

    body.public-body.deals-page .deals-hero {
        padding-bottom: 4.9rem !important;
    }

    body.public-body.deals-page .deals-filter-bar {
        width: 100%;
    }

    body.public-body.deals-page .deals-filter-surface {
        padding: 0.9rem;
        border-radius: 16px;
    }

    body.public-body.deals-page .deals-filter-toolbar {
        align-items: stretch;
    }

    body.public-body.deals-page .deals-filter-group {
        justify-content: center;
    }

    body.public-body.deals-page .deals-filter-seam {
        margin-top: -2.35rem;
        padding-bottom: 0;
    }

    body.public-body.deals-page .deals-content-section {
        padding-top: 2.15rem !important;
    }

    body.public-body.deals-page .deals-results-heading {
        font-size: 1.8rem;
    }

    body.public-body.deals-page .deals-results-copy {
        max-width: none;
    }

    body.public-body.deals-page .deals-grid {
        grid-template-columns: minmax(0, 22rem);
    }

    body.public-body .tracker-point-grid {
        grid-template-columns: 1fr;
    }
}

/* ============================================================
   v2 polish layer — additive refinement, no structural changes.
   Tightens type, modernizes hero overlay for distressed photos,
   adds subtle motion, sharpens cards and CTAs.
   ============================================================ */

body.public-body h1,
body.public-body h2,
body.public-body h3,
body.public-body .section-title-gradient {
    text-wrap: balance;
    letter-spacing: -0.018em;
}

body.public-body h1 {
    line-height: 1.04;
}

body.public-body h2 {
    line-height: 1.12;
}

body.public-body p {
    text-wrap: pretty;
}

body.public-body .gradient-text,
body.public-body .section-title-gradient {
    color: #13436b;
}

body.public-body .section-eyebrow {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    padding: 0.42rem 0.9rem;
    border-radius: 0.5rem;
    border: 1px solid rgba(177, 29, 41, 0.16);
    background: linear-gradient(135deg, rgba(177, 29, 41, 0.08), rgba(19, 67, 107, 0.06));
    color: #b11d29;
    font-size: 0.7rem;
    font-weight: 800;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    box-shadow: 0 8px 18px rgba(177, 29, 41, 0.08);
}

body.public-body .section-underline {
    position: relative;
    display: inline-block;
    padding-bottom: 0.45rem;
}

body.public-body .section-underline::after {
    content: '';
    position: absolute;
    left: 50%;
    bottom: 0;
    transform: translateX(-50%);
    width: 3.6rem;
    height: 3px;
    border-radius: 9999px;
    /* Two-Voice: red -> navy. No third brand hue on chrome. */
    background: linear-gradient(90deg, #b11d29, #13436b);
}

/* Hero photo overlay — heavier contrast so darker distressed photos read clean */
body.public-body .hero-slide-frame::after,
.hero-slide-frame::after {
    background:
        linear-gradient(180deg, rgba(10, 20, 36, 0.06) 0%, rgba(10, 20, 36, 0.18) 38%, rgba(10, 20, 36, 0.42) 100%),
        radial-gradient(circle at 86% 10%, rgba(177, 29, 41, 0.16), transparent 36%);
}

body.public-body .hero-slide,
.hero-slide {
    filter: saturate(0.92) contrast(1.08) brightness(0.86);
}

body.public-body .hero-slide-label,
.hero-slide-label {
    border: 1px solid rgba(255, 255, 255, 0.7);
    background: rgba(255, 255, 255, 0.94);
    color: #13436b;
    font-weight: 700;
    backdrop-filter: blur(6px);
}

body.public-body .site-hero-card,
.site-hero-card {
    border-radius: 16px;
}

/* Buttons — subtle inner highlight on hover, crisp focus ring */
body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary {
    will-change: transform, box-shadow;
}

body.public-body .btn-primary::after,
body.public-body .btn-secondary::after,
body.public-body .site-button-primary::after,
body.public-body .site-button-secondary::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: linear-gradient(120deg, transparent 30%, rgba(255, 255, 255, 0.18) 50%, transparent 70%);
    transform: translateX(-110%);
    transition: transform 540ms cubic-bezier(0.22, 1, 0.36, 1);
    pointer-events: none;
}

body.public-body .btn-primary:hover::after,
body.public-body .btn-secondary:hover::after,
body.public-body .site-button-primary:hover::after,
body.public-body .site-button-secondary:hover::after {
    transform: translateX(110%);
}

body.public-body .btn-primary:focus-visible,
body.public-body .btn-secondary:focus-visible,
body.public-body .site-button-primary:focus-visible,
body.public-body .site-button-secondary:focus-visible {
    outline: 2px solid rgba(177, 29, 41, 0.6);
    outline-offset: 3px;
}

/* Card polish — slightly tighter border radius, refined hover lift */
body.public-body .feature-card,
body.public-body .step-node,
body.public-body .card-hover,
body.public-body .public-card-hover {
    border-radius: 16px;
    transition:
        transform 220ms cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 220ms cubic-bezier(0.22, 1, 0.36, 1),
        border-color 220ms ease;
}

body.public-body .feature-card:hover,
body.public-body .step-node:hover {
    transform: translateY(-4px);
    box-shadow: 0 26px 50px rgba(11, 31, 61, 0.12);
    border-color: rgba(136, 160, 194, 0.55);
}

body.public-body .deal-card {
    border-radius: 16px;
}

body.public-body .deal-card-accent {
    height: 5px;
    /* Two-Voice: red (urgency) -> navy (trust). No third brand hue on chrome. */
    background:
        linear-gradient(90deg, rgba(177, 29, 41, 1) 0%, rgba(19, 67, 107, 0.96) 100%);
    box-shadow: 0 4px 14px rgba(177, 29, 41, 0.16);
}

/* Property thumbnail: one card image size for every surface that renders one.
   index.html and deals.html each carried an identical copy of this in their own
   <style> block -- two standalone documents, one fact, and nothing keeping them
   in step: retune the card height on the browse grid and the homepage rail keeps
   the old one. Both pages already load this file. (deal-detail.html does not use
   the class; its gallery cells size themselves off aspect-ratio.)
   The height is what keeps the grid from reflowing as lazy images arrive, so it
   belongs with the rule, not beside it. */
body.public-body .property-image,
.property-image {
    filter: saturate(1.04) contrast(1.04);
    height: 240px;
    object-fit: cover;
    width: 100%;
}

/* Stats bar — tighter spine, modernized rail */
body.public-body .stats-bar {
    border-radius: 16px;
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.7) inset,
        0 22px 50px rgba(11, 31, 61, 0.1);
}

/* Refined link focus rings sitewide */
body.public-body a:focus-visible,
body.public-body button:focus-visible {
    outline: 2px solid rgba(19, 67, 107, 0.55);
    outline-offset: 2px;
    border-radius: 0.5rem;
}

/* Smoother scroll on the public site */
html.scroll-smooth body.public-body {
    scroll-behavior: smooth;
}

/* Selection highlight — branded */
body.public-body ::selection {
    background: rgba(177, 29, 41, 0.18);
    color: #0f1c33;
}

/* Polished form inputs (auth, lead capture, etc) */
body.public-body input[type="text"],
body.public-body input[type="email"],
body.public-body input[type="tel"],
body.public-body input[type="password"],
body.public-body input[type="search"],
body.public-body input[type="number"],
body.public-body input[type="url"],
body.public-body textarea,
body.public-body select {
    transition: border-color 160ms ease, box-shadow 160ms ease, background-color 160ms ease;
}

body.public-body input[type="text"]:focus,
body.public-body input[type="email"]:focus,
body.public-body input[type="tel"]:focus,
body.public-body input[type="password"]:focus,
body.public-body input[type="search"]:focus,
body.public-body input[type="number"]:focus,
body.public-body input[type="url"]:focus,
body.public-body textarea:focus,
body.public-body select:focus {
    border-color: rgba(19, 67, 107, 0.55);
    box-shadow: 0 0 0 4px rgba(11, 31, 61, 0.12);
    outline: none;
}

/* The shine sweep's reduced-motion answer used to live here as `display: none`
   on the ::after. It has been wrong twice over since the brand button landed:
   that ::after is now the 4x20 ACCENT BAR, so hiding it would strip brand
   furniture rather than stop motion -- and it could not hide it anyway, because
   the bar's own rule declares `display: block !important` much further down.
   What actually still moves is `animation: btnShine` on :hover, and that is
   answered beside the rest of the button's reduced-motion rules, after every
   later declaration. */

/* Home stats bar — pure white surface */
body.public-body .stats-bar {
    background: #ffffff;
}
body.public-body .stat-value {
    color: #13436b;
}

/* Remove crimson → navy → green underline bars beneath section headings sitewide */
body.public-body .section-underline::after {
    display: none !important;
}
body.public-body .section-underline {
    padding-bottom: 0 !important;
}

/* =====================================================================
   Deal cards — premium upgrade 2026-05-01
   Lifts the card surface, refines stat tiles, swaps the navy/crimson/green
   top bar for a subtle amber hairline, upgrades the View Deal CTA to a
   navy→crimson gradient strip with amber arrow accent on hover. Loaded
   late so it wins over the earlier polish layers in this file.
   ===================================================================== */
body.public-body .deal-card {
    position: relative;
    border-radius: 16px !important;
    border: 1px solid rgba(223, 232, 243, 0.92) !important;
    background:
        radial-gradient(circle at top right, rgba(245, 179, 1, 0.06), transparent 35%),
        linear-gradient(180deg, rgba(255, 255, 255,0.99), rgba(238, 243, 249,0.96)) !important;
    box-shadow:
        0 26px 58px rgba(11, 31, 61, 0.12),
        inset 0 1px 0 rgba(255, 255, 255,0.86) !important;
    transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1),
                border-color 240ms ease,
                box-shadow 240ms ease !important;
}
body.public-body .deal-card:hover {
    transform: translateY(-6px) !important;
    border-color: rgba(245, 179, 1, 0.45) !important;
    box-shadow:
        0 36px 76px rgba(11, 31, 61, 0.18),
        0 0 0 1px rgba(245, 179, 1, 0.18),
        inset 0 1px 0 rgba(255, 255, 255,0.9) !important;
}
/* Replace the navy/crimson/green top bar with an amber hairline that
   only shows on hover — quieter at rest, premium on hover. */
body.public-body .deal-card::before {
    content: '' !important;
    position: absolute !important;
    inset: 0 0 auto 0 !important;
    height: 2px !important;
    background: linear-gradient(90deg,
        transparent 0%,
        rgba(245, 179, 1, 0.0) 12%,
        rgba(245, 179, 1, 0.85) 50%,
        rgba(217, 50, 64, 0.55) 80%,
        transparent 100%) !important;
    opacity: 0 !important;
    transition: opacity 240ms ease !important;
    z-index: 2 !important;
}
body.public-body .deal-card:hover::before { opacity: 1 !important; }
body.public-body .deal-card::after { display: none !important; }

/* Potential Spread is the most persuasive number on a deal card, and it used to
   be emerald -- "this cleared" borrowed from a vocabulary only an operator has.
   Gold rim keeps it the standout (it is the deal page's own treatment for the
   same figure) with the number itself in brand navy. */
body.public-body .deal-card .deal-card-spread {
    border: 1px solid #f5b301;
    background: linear-gradient(180deg, #fff5e0 0%, #fff5e0 100%);
}

/* The deal-card status badge takes the SAME palette as the deal page hero pill.
   It used to be `bg-green-500` / `bg-yellow-500` / `bg-red-500` straight off the
   operator status ramp, so one deal wore a green ACTIVE badge in the list and a
   gold one on its own page — the two most-linked surfaces in the product
   disagreeing about the same fact. Gold for active (the one warm accent a buyer
   surface already speaks), neutral slate for the two that are not invitations.
   Colour lives here rather than in a Tailwind class because the gold face needs
   dark ink AND a gradient, and because the badge markup can then stop hardcoding
   `text-white` beside a class that may not want it.

   Two SHAPES share this palette and must keep sharing it: the pill that floats
   over a card photo, and the corner ribbon the homepage rail and the sold card
   use. They are different affordances describing the SAME fact, and when each
   owned its own colours the product shipped three answers for one status --
   gold on the deal page, green in the list, and emerald/amber/green again on
   the homepage rail. One rule, or it happens a fourth time.

   COLOUR is a TRAFFIC LIGHT, by operator directive (2026-09-09): GREEN
   available, GOLD pending, RED sold. This deliberately overrides the
   Status-Is-Not-Brand rule the block above was written under -- the same
   override the deal page's own ACTIVE pill already took on 2026-08-25, which
   is what left the two surfaces disagreeing until now. The argument the other
   way was that green/amber/red is operator vocabulary; the argument for it is
   that it is also the vocabulary a buyer reads on every listing site they have
   ever used, and this is the operator's call.

   `is-unknown` keeps the NEUTRAL slate and must never be folded back in beside
   is-pending the way it was: an unrecognised status is not a pending one, and
   an amber UNKNOWN would advertise a withdrawn deal as still in play -- the
   same reason the homepage rail's fallback may not be `active`. */
body.public-body .deal-card .status-badge.is-active,
body.public-body .deal-status-ribbon.is-active {
    background: linear-gradient(180deg, #16a34a 0%, #16a34a 100%);
    color: #ffffff;
}
body.public-body .deal-card .status-badge.is-pending,
body.public-body .deal-status-ribbon.is-pending {
    background: linear-gradient(180deg, #f5b301 0%, #f5b301 100%);
    color: #0b1f3d;
}
body.public-body .deal-card .status-badge.is-sold,
body.public-body .deal-status-ribbon.is-sold {
    background: linear-gradient(180deg, #d93240 0%, #d93240 100%);
    color: #ffffff;
}
body.public-body .deal-card .status-badge.is-unknown,
body.public-body .deal-status-ribbon.is-unknown {
    background: linear-gradient(180deg, #36598d 0%, #36598d 100%);
    color: #ffffff;
}

/* Status badge — solid, cleaner, lightly raised (flattened from the old glassy look) */
body.public-body .deal-card .status-badge {
    border: 1px solid rgba(255, 255, 255,0.22) !important;
    box-shadow:
        0 8px 18px rgba(11, 31, 61, 0.20),
        inset 0 1px 0 rgba(255, 255, 255,0.16) !important;
    letter-spacing: 0.14em !important;
}

/* Image-overlay pills (location + views) — one shared, more-solid treatment so
   every deal-card variant AND the deal-detail hero read identically. Visual props
   only: the views pill's show/hide still rides on Tailwind .hidden/.flex toggling. */
body.public-body .deal-overlay-pill {
    border: 1px solid rgba(255, 255, 255, 0.14);
    background: rgba(10, 20, 36, 0.72);
    backdrop-filter: blur(10px);
    box-shadow: 0 10px 24px rgba(11, 31, 61, 0.34);
}

/* Card footer CTA ("View Deal Details") — reads as a pressable bar: brand tint
   deepens and the arrow nudges on hover. */
body.public-body .deal-card-cta {
    transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
}
body.public-body .deal-card:hover .deal-card-cta {
    background: linear-gradient(180deg, rgba(19, 67, 107,0.06), rgba(19, 67, 107,0.03));
    border-color: rgba(19, 67, 107, 0.22);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.8);
}
body.public-body .deal-card-cta .deal-card-cta-arrow {
    transition: transform 0.2s ease;
}
body.public-body .deal-card:hover .deal-card-cta .deal-card-cta-arrow {
    transform: translate(2px, -2px);
}

/* Sold state — muted "closed" media so live deals pop and sold reads as archive. */
body.public-body .deal-card-sold-media {
    filter: grayscale(0.28) saturate(0.9) brightness(0.98) !important;
}

/* Image area — tighter overlay, smoother zoom */
body.public-body .deal-card .property-image {
    transition: transform 280ms cubic-bezier(0.22, 1, 0.36, 1),
                filter 280ms ease !important;
}
body.public-body .deal-card:hover .property-image {
    transform: scale(1.045) !important;
    filter: saturate(1.08) contrast(1.04) !important;
}

/* Title — slight letter-spacing tightening + Outfit display feel */
body.public-body .deal-card h3 {
    letter-spacing: -0.01em;
    line-height: 1.2;
}

/* Deal type badge — subtler, glassier, hairline border */
body.public-body .deal-type-badge {
    background: linear-gradient(135deg, #13436b 0%, #13436b 100%) !important;
    border: 1px solid rgba(245, 179, 1, 0.28) !important;
    box-shadow:
        0 10px 22px rgba(11, 31, 61, 0.22),
        inset 0 1px 0 rgba(255, 255, 255,0.16) !important;
    letter-spacing: 0.04em !important;
}

/* 3-column stat tiles — premium gradient backgrounds + tabular numerics */
body.public-body .deal-card .grid.grid-cols-3 > div {
    background:
        radial-gradient(circle at top, rgba(245, 179, 1, 0.05), transparent 70%),
        linear-gradient(180deg, rgba(255, 255, 255,1), rgba(238, 243, 249,0.92)) !important;
    border: 1px solid rgba(223, 232, 243, 0.92) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255,0.86),
        0 1px 2px rgba(11, 31, 61, 0.04) !important;
    transition: border-color 200ms ease, transform 200ms ease, box-shadow 200ms ease;
}
body.public-body .deal-card .grid.grid-cols-3 > div:hover {
    border-color: rgba(245, 179, 1, 0.4) !important;
    transform: translateY(-1px);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255,0.9),
        0 8px 16px rgba(11, 31, 61, 0.08) !important;
}
body.public-body .deal-card .grid.grid-cols-3 > div p:first-child {
    font-size: 10px !important;
    font-weight: 700 !important;
    letter-spacing: 0.2em !important;
    color: rgba(54, 89, 141, 0.85) !important;
}
body.public-body .deal-card .grid.grid-cols-3 > div p:last-child {
    font-variant-numeric: tabular-nums;
    font-size: 0.95rem !important;
    line-height: 1.15;
}

/* Bed/bath/sqft row — slightly stronger contrast */
body.public-body .deal-card .flex.items-center.gap-4.text-sm.text-gray-600 {
    color: #13436b !important;
    font-weight: 500;
}
body.public-body .deal-card .flex.items-center.gap-4.text-sm.text-gray-600 i {
    color: rgba(19, 67, 107, 0.75) !important;
}

/* "View Deal Details" CTA — navy→crimson gradient strip, amber arrow on hover.
   Targets the bottom row inside the card body (4-col flex with arrow). */
body.public-body .deal-card .mt-4.flex.items-center.justify-between.rounded-2xl {
    background: linear-gradient(135deg,
        #0b1f3d 0%,
        #13436b 50%,
        #13436b 100%) !important;
    border: 1px solid rgba(245, 179, 1, 0.22) !important;
    color: #ffffff !important;
    box-shadow:
        0 12px 24px rgba(11, 31, 61, 0.22),
        inset 0 1px 0 rgba(255, 255, 255,0.12) !important;
    transition: transform 200ms ease, box-shadow 200ms ease, border-color 200ms ease;
    position: relative;
    overflow: hidden;
}
body.public-body .deal-card .mt-4.flex.items-center.justify-between.rounded-2xl::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(120deg, transparent 35%, rgba(245, 179, 1, 0.18) 50%, transparent 65%);
    transform: translateX(-100%);
    transition: transform 460ms cubic-bezier(0.22, 1, 0.36, 1);
    pointer-events: none;
}
body.public-body .deal-card:hover .mt-4.flex.items-center.justify-between.rounded-2xl::before {
    transform: translateX(100%);
}
body.public-body .deal-card .mt-4.flex.items-center.justify-between.rounded-2xl span {
    color: #ffffff !important;
}
body.public-body .deal-card .mt-4.flex.items-center.justify-between.rounded-2xl i[data-lucide="eye"] {
    color: #a86f00 !important;
}
body.public-body .deal-card .mt-4.flex.items-center.justify-between.rounded-2xl i[data-lucide="arrow-up-right"] {
    color: rgba(168, 111, 0, 0.75) !important;
    transition: transform 200ms ease, color 200ms ease;
}
body.public-body .deal-card:hover .mt-4.flex.items-center.justify-between.rounded-2xl {
    border-color: rgba(245, 179, 1, 0.45) !important;
    box-shadow:
        0 18px 32px rgba(11, 31, 61, 0.32),
        inset 0 1px 0 rgba(255, 255, 255,0.16) !important;
}
body.public-body .deal-card:hover .mt-4.flex.items-center.justify-between.rounded-2xl i[data-lucide="arrow-up-right"] {
    color: #a86f00 !important;
    transform: translate(2px, -2px);
}

/* =====================================================================
   How Buying Works — navy footer-style background with inverted text
   Matches the site footer's navy gradient so the section reads as a
   dark-mode panel. Headings, eyebrow, and step copy switch to white.
   ===================================================================== */
/* =====================================================================
   NAVY SECTION BAND — the reusable dark band that drives the site-wide
   white↔navy section rhythm. Add `section-band-navy` to any <section>
   and every shared component inside it (eyebrow, headings, body copy,
   step nodes, feature cards, stat tiles, FAQ rows, outline buttons,
   gradient headlines) auto-recolors for the deep-navy background — so
   page authors flip a band to navy with a single class, no inner markup
   changes. `.how-buying-section` and `.recently-sold-section` are kept
   as aliases so the homepage renders identically from one source.

   NOTE: only section-level copy + the shared component primitives are
   recolored — never a blanket `p`/`.text-gray-*` — so a white card
   nested inside a navy band (e.g. a CTA signup card) keeps its dark text.
   ===================================================================== */
body.public-body .section-band-navy,
body.public-body .how-buying-section,
body.public-body .recently-sold-section {
    position: relative;
    background: linear-gradient(160deg, #0b1f3d 0%, #0b1f3d 55%, #13436b 100%) !important;
    color: rgba(255, 255, 255, 0.8);
}
body.public-body .section-band-navy .section-eyebrow,
body.public-body .how-buying-section .section-eyebrow,
body.public-body .recently-sold-section .section-eyebrow {
    background: rgba(255, 255, 255, 0.12) !important;
    color: #ffffff !important;
    border-color: rgba(255, 255, 255, 0.25) !important;
}
body.public-body .section-band-navy .section-eyebrow i,
body.public-body .how-buying-section .section-eyebrow i,
body.public-body .recently-sold-section .section-eyebrow i {
    color: #a86f00 !important;
}
/* Section-level heading only (the .section-stack title / .section-underline).
   Card headings (h3) are recolored by the per-component rules below, so a
   nested white card inside a navy band keeps its own dark heading. */
body.public-body .section-band-navy .section-stack h2,
body.public-body .section-band-navy .section-underline,
body.public-body .how-buying-section h2,
body.public-body .how-buying-section .section-underline,
body.public-body .recently-sold-section h2,
body.public-body .recently-sold-section .section-underline {
    color: #ffffff !important;
}
/* navy→transparent gradient headline would vanish on dark — flip it to a
   white→sky gradient so it stays legible and on-brand. */
body.public-body .section-band-navy .section-title-gradient,
body.public-body .section-band-navy .gradient-text {
    color: #ffffff !important;
    /* The restored .section-title-gradient paints its glyphs from a background
       box, so `color` alone no longer decides what you see — the transparent
       text-fill does. Overriding only `color` here left the headline INVISIBLE
       on navy. Re-declare the fill (and a white→sky gradient to keep the same
       finish as the light bands). */
    background-image: linear-gradient(140deg, #ffffff 0%, #eef3f9 52%, #dfe8f3 100%) !important;
    -webkit-background-clip: text !important;
    background-clip: text !important;
    -webkit-text-fill-color: transparent !important;
}
@supports not ((background-clip: text) or (-webkit-background-clip: text)) {
    body.public-body .section-band-navy .section-title-gradient,
    body.public-body .section-band-navy .gradient-text {
        background-image: none !important;
        -webkit-text-fill-color: #ffffff !important;
    }
}
body.public-body .section-band-navy .section-copy-tight,
body.public-body .section-band-navy .section-stack > p,
body.public-body .how-buying-section .section-copy-tight,
body.public-body .how-buying-section .section-stack > p,
body.public-body .recently-sold-section .section-copy-tight,
body.public-body .recently-sold-section .section-stack > p {
    color: rgba(255, 255, 255, 0.78) !important;
}
body.public-body .recently-sold-section .section-stack > p.text-gray-400 {
    color: rgba(255, 255, 255, 0.55) !important;
}
/* Step nodes (How Buying Works rail) → dark glass on the band */
body.public-body .section-band-navy .step-node,
body.public-body .how-buying-section .step-node {
    background: rgba(255, 255, 255, 0.06) !important;
    border-color: rgba(255, 255, 255, 0.14) !important;
    box-shadow:
        0 18px 36px rgba(11, 31, 61, 0.32),
        inset 0 1px 0 rgba(255, 255, 255, 0.08) !important;
}
body.public-body .section-band-navy .step-node:hover,
body.public-body .how-buying-section .step-node:hover {
    background: rgba(255, 255, 255, 0.10) !important;
    border-color: rgba(245, 179, 1, 0.45) !important;
    box-shadow:
        0 22px 44px rgba(11, 31, 61, 0.4),
        inset 0 1px 0 rgba(255, 255, 255, 0.14) !important;
}
body.public-body .section-band-navy .step-title,
body.public-body .how-buying-section .step-title { color: #ffffff !important; }
body.public-body .section-band-navy .step-body,
body.public-body .how-buying-section .step-body { color: rgba(255, 255, 255, 0.78) !important; }
body.public-body .section-band-navy .steps-track::before,
body.public-body .how-buying-section .steps-track::before { background: rgba(255, 255, 255, 0.18) !important; }
body.public-body .section-band-navy .step-node::after,
body.public-body .how-buying-section .step-node::after { border-color: rgba(255, 255, 255, 0.22) !important; }
/* Feature cards → dark glass on the band */
body.public-body .section-band-navy .feature-card {
    background: rgba(255, 255, 255, 0.06) !important;
    border-color: rgba(255, 255, 255, 0.14) !important;
    box-shadow:
        0 18px 36px rgba(11, 31, 61, 0.30),
        inset 0 1px 0 rgba(255, 255, 255, 0.08) !important;
}
body.public-body .section-band-navy .feature-card h3 { color: #ffffff !important; }
body.public-body .section-band-navy .feature-card p,
body.public-body .section-band-navy .feature-card li { color: rgba(255, 255, 255, 0.74) !important; }
/* Icon chips → luminous on the dark band (the faint navy/red tints vanish otherwise) */
body.public-body .section-band-navy .feature-icon-wrap-navy {
    background: linear-gradient(145deg, rgba(136, 160, 194, 0.22), rgba(136, 160, 194, 0.07)) !important;
    border-color: rgba(136, 160, 194, 0.34) !important;
    color: #ffffff !important;
}
body.public-body .section-band-navy .feature-icon-wrap-red {
    background: linear-gradient(145deg, rgba(217, 50, 64, 0.24), rgba(217, 50, 64, 0.08)) !important;
    border-color: rgba(217, 50, 64, 0.34) !important;
    color: #ffffff !important;
}
/* Stat tiles → light gradient numerals */
body.public-body .section-band-navy .stat-value {
    color: #ffffff !important;
}
body.public-body .section-band-navy .stat-label { color: rgba(255, 255, 255, 0.7) !important; }
/* FAQ rows → dark glass on the band */
body.public-body .section-band-navy .faq-item {
    background: rgba(255, 255, 255, 0.05) !important;
    border-color: rgba(255, 255, 255, 0.12) !important;
}
body.public-body .section-band-navy .faq-trigger span { color: #ffffff !important; }
body.public-body .section-band-navy .faq-answer { color: rgba(255, 255, 255, 0.74) !important; }
body.public-body .section-band-navy .faq-answer strong { color: #ffffff !important; }
/* Outline button → light treatment so it reads on dark */
body.public-body .section-band-navy .btn-outline {
    border-color: rgba(255, 255, 255, 0.4) !important;
    color: #ffffff !important;
    background: rgba(255, 255, 255, 0.05) !important;
}
body.public-body .section-band-navy .btn-outline:hover {
    border-color: #ffffff !important;
    background: rgba(255, 255, 255, 0.13) !important;
}

/* =====================================================================
   Footer brand — Joe Homebuyer logo image stacked above the wordmark
   ===================================================================== */
body.public-body .site-footer-brand {
    line-height: 1;
}
body.public-body .site-footer-logo {
    display: block;
    width: auto;
    height: auto;
    max-width: 13rem;
    max-height: 4.5rem;
    object-fit: contain;
}

/* ============================================================
   JHB INPUT PRIMITIVE — unifies .auth-input / .admin-input / .jv-input
   so every form field on the site has identical look + focus state.
   ============================================================ */
.jhb-input,
body.public-body .auth-input,
body.public-body .admin-input,
body.public-body .jv-input,
body.public-body .public-form-input,
#settings-section .adm-brand-input,
.adm-brand-input {
    width: 100%;
    border: 1px solid var(--line);
    background: var(--surface-2);
    border-radius: var(--radius-sm);
    padding: 0.7rem 0.95rem;
    font-size: 0.92rem;
    color: var(--ink-strong);
    font-family: 'Inter', sans-serif;
    transition: border-color var(--transition-fast),
                box-shadow var(--transition-fast),
                background var(--transition-fast);
}
.jhb-input::placeholder,
body.public-body .auth-input::placeholder,
body.public-body .admin-input::placeholder,
body.public-body .jv-input::placeholder,
body.public-body .public-form-input::placeholder,
#settings-section .adm-brand-input::placeholder,
.adm-brand-input::placeholder {
    color: var(--ink-faint);
}
.jhb-input:hover,
body.public-body .auth-input:hover,
body.public-body .admin-input:hover,
body.public-body .jv-input:hover,
body.public-body .public-form-input:hover,
#settings-section .adm-brand-input:hover,
.adm-brand-input:hover {
    border-color: var(--line-strong);
}
.jhb-input:focus,
body.public-body .auth-input:focus,
body.public-body .admin-input:focus,
body.public-body .jv-input:focus,
body.public-body .public-form-input:focus,
#settings-section .adm-brand-input:focus,
.adm-brand-input:focus {
    outline: none;
    background: var(--surface-0);
    border-color: var(--brand-navy);
    box-shadow: 0 0 0 3px rgba(11, 31, 61, 0.12);
}
.jhb-input:disabled,
body.public-body .auth-input:disabled,
body.public-body .admin-input:disabled,
body.public-body .jv-input:disabled {
    opacity: 0.55;
    cursor: not-allowed;
    background: var(--surface-3);
}

/* ============================================================
   JHB LOADING + EMPTY STATE PRIMITIVES
   ============================================================ */
@keyframes jhb-skeleton-shimmer {
    0%   { background-position: -200% 0; }
    100% { background-position: 200% 0; }
}
.jhb-skeleton {
    display: block;
    border-radius: var(--radius-sm);
    background: linear-gradient(
        90deg,
        var(--surface-2) 0%,
        var(--surface-3) 40%,
        var(--surface-2) 80%
    );
    background-size: 200% 100%;
    animation: jhb-skeleton-shimmer 1.4s ease-in-out infinite;
    color: transparent;
    user-select: none;
    pointer-events: none;
}
.jhb-skeleton-line { height: 0.85rem; margin: 0.45rem 0; }
.jhb-skeleton-line.is-short { width: 40%; }
.jhb-skeleton-line.is-medium { width: 70%; }
.jhb-skeleton-card { height: 11rem; border-radius: var(--radius-lg); }
.jhb-skeleton-circle { width: 3rem; height: 3rem; border-radius: 9999px; }

.jhb-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.85rem;
    padding: 2.5rem 1.5rem;
    text-align: center;
    border: 1px dashed var(--line);
    border-radius: var(--radius-lg);
    background: var(--surface-1);
    color: var(--ink-muted);
}
.jhb-empty-icon {
    width: 3rem;
    height: 3rem;
    border-radius: 9999px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, var(--brand-navy) 0%, var(--brand-navy-deep) 100%);
    color: #ffffff;
    box-shadow: var(--shadow-md);
}
.jhb-empty-title {
    font-family: 'Inter', sans-serif;
    font-weight: 700;
    font-size: 1.05rem;
    color: var(--ink-strong);
    letter-spacing: -0.01em;
}
.jhb-empty-body {
    font-size: 0.875rem;
    line-height: 1.5;
    max-width: 26rem;
}

@keyframes jhb-spinner-rotate {
    to { transform: rotate(360deg); }
}
.jhb-spinner {
    display: inline-block;
    width: 1rem;
    height: 1rem;
    border: 2px solid currentColor;
    border-right-color: transparent;
    border-radius: 9999px;
    animation: jhb-spinner-rotate 0.7s linear infinite;
    vertical-align: -2px;
}
.jhb-spinner-lg { width: 1.5rem; height: 1.5rem; border-width: 3px; }

/* ============================================================
   JHB MOBILE / RESPONSIVE POLISH
   ============================================================ */
@media (max-width: 640px) {
    body.public-body main h1 {
        font-size: clamp(2rem, 9vw, 2.75rem);
        line-height: 1.1;
        letter-spacing: -0.02em;
    }
    body.public-body main h2 {
        font-size: clamp(1.5rem, 6vw, 2rem);
    }
    body.public-body main p.text-xl,
    body.public-body main p.text-2xl {
        font-size: 1.05rem;
        line-height: 1.55;
    }
    body.public-body .section-hero {
        padding: 1.25rem 1rem;
    }
    body.public-body .section-hero-title,
    body.public-body .admin-display-font {
        font-size: clamp(1.4rem, 6vw, 1.85rem);
    }
    body.public-body .deal-card,
    body.public-body .jhb-card {
        border-radius: var(--radius-lg);
    }
    body.public-body .btn-primary,
    body.public-body .btn-secondary,
    body.public-body .site-button-primary,
    body.public-body .site-button-secondary {
        width: 100%;
        justify-content: center;
        padding: 0.85rem 1rem;
    }
    body.public-body .btn-primary.btn-inline,
    body.public-body .btn-secondary.btn-inline {
        width: auto;
    }
    body.public-body .site-header-logo {
        height: 38px;
        max-width: 150px;
    }
    body.public-body .site-footer-grid {
        gap: 2rem;
    }
    body.public-body .public-chat-launcher,
    body.public-body .buyer-stay-bubble {
        max-width: calc(100vw - 1.5rem);
        font-size: 0.85rem;
    }
}

/* ============================================================
   JHB DARK MODE — EXPLICIT OPT-IN ONLY.
   The public site's cards/surfaces are hardcoded light (bg-white,
   inline white panels, etc.) and do NOT flip, so honoring the OS
   prefers-color-scheme flipped only the token-based TEXT → near-white
   text on still-white surfaces (e.g. the Share button = white-on-white).
   So we now require an explicit [data-theme="dark"] opt-in instead of
   auto-activating on OS dark mode. Tokens still flip when opted in.
   ============================================================ */
@media (prefers-color-scheme: dark) {
    :root[data-theme="dark"] {
        --surface-0: #0b1f3d;
        --surface-1: #0b1f3d;
        --surface-2: #0b1f3d;
        --surface-3: #13436b;
        --ink-strong: #eef3f9;
        --ink-body: #ffffff;
        --ink-muted: #88a0c2;
        --ink-faint: #36598d;
        --line-strong: rgba(136, 160, 194, 0.45);
        --line: rgba(136, 160, 194, 0.22);
        --line-soft: rgba(136, 160, 194, 0.12);
        --brand-paper: #0b1f3d;
        --shadow-sm: 0 1px 2px rgba(11, 31, 61, 0.3), 0 6px 14px -8px rgba(11, 31, 61, 0.4);
        --shadow-md: 0 1px 2px rgba(11, 31, 61, 0.3), 0 14px 28px -10px rgba(11, 31, 61, 0.5);
        --shadow-lg: 0 1px 2px rgba(11, 31, 61, 0.3), 0 22px 44px -14px rgba(11, 31, 61, 0.55);
        --shadow-hover: 0 1px 2px rgba(11, 31, 61, 0.3), 0 28px 52px -14px rgba(11, 31, 61, 0.6);
        --public-bg-top: #0a1424;
        --public-bg-bottom: #0b1f3d;
        --public-glass: rgba(11, 31, 61, 0.82);
        --public-glass-strong: rgba(11, 31, 61, 0.92);
    }
}
[data-theme="dark"] {
    --surface-0: #0b1f3d;
    --surface-1: #0b1f3d;
    --surface-2: #0b1f3d;
    --surface-3: #13436b;
    --ink-strong: #eef3f9;
    --ink-body: #ffffff;
    --ink-muted: #88a0c2;
    --ink-faint: #36598d;
    --line-strong: rgba(136, 160, 194, 0.45);
    --line: rgba(136, 160, 194, 0.22);
    --line-soft: rgba(136, 160, 194, 0.12);
    --brand-paper: #0b1f3d;
    --shadow-sm: 0 1px 2px rgba(11, 31, 61, 0.3), 0 6px 14px -8px rgba(11, 31, 61, 0.4);
    --shadow-md: 0 1px 2px rgba(11, 31, 61, 0.3), 0 14px 28px -10px rgba(11, 31, 61, 0.5);
    --shadow-lg: 0 1px 2px rgba(11, 31, 61, 0.3), 0 22px 44px -14px rgba(11, 31, 61, 0.55);
    --shadow-hover: 0 1px 2px rgba(11, 31, 61, 0.3), 0 28px 52px -14px rgba(11, 31, 61, 0.6);
    --public-bg-top: #0a1424;
    --public-bg-bottom: #0b1f3d;
    --public-glass: rgba(11, 31, 61, 0.82);
    --public-glass-strong: rgba(11, 31, 61, 0.92);
}

/* A2P form-hide LIFTED 2026-06-13 — capture forms + CTA bands restored.
   The GHL chat-widget compliance issue was the wrong widget-id (fixed via
   the location's own iframe), not the presence of forms; A2P 10DLC
   registration wants opt-in proof. Email is the required capture; SMS
   consent on the forms is optional, and SMS *sending* stays gated by
   DEAL_BLAST_AUTO_SEND until Twilio A2P approves. */

/* ===== Mobile usability: prevent iOS focus-zoom on form controls (2026-06-18) =====
   iOS Safari auto-zooms the page when you focus an input whose font-size is < 16px,
   which yanks the layout around on phones. Force >=16px for text-entry controls on
   small screens (checkboxes/radios/range excluded — they don't trigger the zoom). */
@media (max-width: 640px) {
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
  select,
  textarea {
    font-size: 16px !important;
  }
}

/* ===== Mobile usability: comfortable hamburger tap target (2026-06-18) =====
   The mobile menu toggle was a bare 24px icon. Expand the hit area to ~44px
   (WCAG) via padding + matching negative margin so the layout doesn't shift. */
@media (max-width: 767px) {
  .site-nav button.md\:hidden {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.6rem;
    margin: -0.6rem;
  }
}

/* =====================================================================
   2026 CLEAN REFRESH  (appended last → wins ties over every prior phase)
   Same brand (navy / crimson / amber), same layout, same markup + scripts
   — a lighter, more modern execution:
     • calmer page canvas (no competing corner tints)
     • softer, more diffuse shadows sitewide (tokens + heavy overrides)
     • cleaner flat-white card + tile surfaces, crisp hairline borders
     • lighter, crisper navigation
     • tighter, consistent corner radii
   Flows through the shared primitives, so index.html, deals.html and
   deal-detail.html all read as one cohesive refresh.
   ===================================================================== */

/* 1 ── Tokens: re-scope the shadow scale softer for the public site.
   Components that consume var(--shadow-*) inherit the lighter values;
   the heavy hard-coded shadows are calmed individually further down. */
body.public-body {
    --shadow-sm: 0 1px 2px rgba(11, 31, 61, 0.04), 0 4px 12px -6px rgba(11, 31, 61, 0.08);
    --shadow-md: 0 1px 2px rgba(11, 31, 61, 0.04), 0 10px 24px -12px rgba(11, 31, 61, 0.13);
    --shadow-lg: 0 2px 6px -2px rgba(11, 31, 61, 0.05), 0 18px 40px -16px rgba(11, 31, 61, 0.16);
    --shadow-hover: 0 6px 16px -8px rgba(11, 31, 61, 0.10), 0 28px 52px -22px rgba(11, 31, 61, 0.20);
    --shadow-red: 0 1px 0 rgba(255, 255, 255, 0.16) inset, 0 10px 24px -10px rgba(177, 29, 41, 0.40);
    --shadow-navy: 0 1px 0 rgba(255, 255, 255, 0.14) inset, 0 10px 24px -10px rgba(11, 31, 61, 0.40);
    --public-shadow: var(--shadow-lg);
    --public-shadow-soft: var(--shadow-md);
    --public-nav-shadow: 0 6px 20px -14px rgba(11, 31, 61, 0.18);
    --public-hero-shadow: 0 24px 56px -24px rgba(11, 31, 61, 0.22);
}

/* 2 ── Canvas: clean near-white wash with a single soft navy top glow.
   Drops the busy blue + crimson corner radials of the old background. */
body.public-body {
    background:
        radial-gradient(1200px 560px at 50% -260px, rgba(19, 67, 107, 0.06), transparent 70%),
        linear-gradient(180deg, #ffffff 0%, #eef3f9 55%, #eef3f9 100%);
    background-repeat: no-repeat;
}

/* 3 ── Navigation: lighter at rest (hairline, no big shadow), cleaner
   glass; the scroll handler's Tailwind .shadow-md stays subtle. */
body.public-body nav.site-nav {
    background: rgba(255, 255, 255, 0.97);
    border-bottom: 1px solid rgba(223, 232, 243, 0.8);
    box-shadow: none;
}
body.public-body nav.site-nav.shadow-md {
    background: rgba(255, 255, 255, 0.9);
    border-bottom-color: rgba(223, 232, 243, 0.95);
    box-shadow: 0 6px 22px -14px rgba(11, 31, 61, 0.24);
}

/* 4 ── Hero: calmer ambient orbs + softer floating proof card / badge. */
body.public-body .site-hero::before { background: rgba(19, 67, 107, 0.05); }
body.public-body .site-hero::after { background: rgba(177, 29, 41, 0.07); }
body.public-body .site-hero-stat {
    border: 1px solid rgba(223, 232, 243, 0.92);
    box-shadow: var(--shadow-lg);
}
body.public-body .site-badge {
    background: rgba(255, 255, 255, 0.85);
    border-color: rgba(223, 232, 243, 0.92);
    box-shadow: var(--shadow-sm);
}

/* 5 ── Buttons: keep the brand fill + shine sweep, trim the radius and
   lean on the softened brand shadow tokens above. */
body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary {
    border-radius: 12px;
}

/* 6 ── Deal cards: clean flat-white surface, hairline border, soft
   shadow. Keeps the premium amber hover hairline + navy→crimson "View
   Deal" strip; only calms the surface, shadow weight and radius. */
body.public-body .deal-card {
    border-radius: 16px !important;
    background: #ffffff !important;
    border: 1px solid rgba(223, 232, 243, 0.9) !important;
    box-shadow: var(--shadow-md) !important;
}
body.public-body .deal-card:hover {
    transform: translateY(-5px) !important;
    border-color: rgba(245, 179, 1, 0.5) !important;
    box-shadow: var(--shadow-hover) !important;
}
/* Top accent bar → thin, quiet hairline */
body.public-body .deal-card-accent {
    height: 3px;
    box-shadow: none;
}
/* Inner stat tiles → flat, crisp, no milky gradient */
body.public-body .deal-card .grid.grid-cols-3 > div {
    background: #eef3f9 !important;
    border: 1px solid rgba(223, 232, 243, 0.9) !important;
    border-radius: 12px !important;
    box-shadow: none !important;
}
body.public-body .deal-card .grid.grid-cols-3 > div:hover {
    background: #ffffff !important;
    border-color: rgba(223, 232, 243, 0.95) !important;
    box-shadow: var(--shadow-sm) !important;
}
/* Loading skeleton (deals.html) matches the refreshed card */
body.public-body .deal-card-skeleton {
    border-radius: 16px;
    border-color: rgba(223, 232, 243, 0.9);
    box-shadow: var(--shadow-md);
}

/* 7 ── Feature cards / step nodes / stats bar / FAQ: unified clean
   surfaces with the soft shadow scale + consistent radii. (Navy-band
   variants keep their dark-glass !important treatment.) */
body.public-body .feature-card,
body.public-body .step-node {
    border-radius: 16px;
    box-shadow: var(--shadow-sm);
}
body.public-body .feature-card:hover,
body.public-body .step-node:hover {
    box-shadow: var(--shadow-hover);
}
body.public-body .stats-bar {
    border-radius: 16px;
    border: 1px solid rgba(223, 232, 243, 0.8);
    box-shadow: var(--shadow-md);
}
body.public-body .faq-item {
    box-shadow: var(--shadow-sm);
}

/* 8 ── Section eyebrow: flatter, cleaner pill (no colored drop shadow). */
body.public-body .section-eyebrow {
    background: rgba(177, 29, 41, 0.07);
    border-color: rgba(177, 29, 41, 0.18);
    box-shadow: none;
}

/* 9 ── Deals page: calmer filter surface + crisper controls. */
body.public-body .deals-filter-surface {
    box-shadow: var(--shadow-md);
}
body.public-body .filter-pill {
    border-radius: 12px;
}
body.public-body .search-input,
body.public-body .deals-sort-wrap select {
    border-radius: 12px;
}

/* =====================================================================
   2026 CLEAN REFRESH — Phase 2: type, icons & shapes
   Finalizes the modernization across the typographic, iconographic and
   geometric layers — lighter icon strokes, calmer icon chips + step
   badges, consistent pill/chip geometry, crisper type hierarchy and
   tabular figures. Same copy, same icons, same brand — refined finish.
   ===================================================================== */

/* — Icons: a lighter, more refined Lucide stroke (default 2 → 1.75).
   Scoped to lucide-rendered SVGs, so hand-drawn footer icons are safe. */
body.public-body svg.lucide {
    stroke-width: 1.75;
}

/* — Icon chips (Why-Us) + step badges: trade the heavy drop shadows for
   the soft scale; keep the chip + circle shapes. */
body.public-body .feature-icon-wrap {
    box-shadow: var(--shadow-sm);
    border-radius: 12px;
}
body.public-body .step-number {
    box-shadow: 0 6px 16px -6px rgba(11, 31, 61, 0.30);
}
body.public-body .step-node:hover .step-number {
    box-shadow: 0 10px 22px -6px rgba(11, 31, 61, 0.36);
}
/* FAQ chevron chip + filter pills → quieter, flatter */
body.public-body .faq-trigger-icon {
    box-shadow: none;
}
body.public-body .filter-pill {
    box-shadow: var(--shadow-sm);
}

/* — Shapes: consistent badge geometry. The Cash / Subject-To deal-type
   pill gets a crisp, slightly tighter radius to match the system. */
body.public-body .deal-type-badge {
    border-radius: 12px !important;
}

/* — Typography: smoother rendering, crisper display tracking, and
   tabular figures so prices + stats align cleanly. */
body.public-body {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
}
body.public-body h1,
body.public-body h2 {
    letter-spacing: -0.022em;
}
body.public-body .stat-value,
body.public-body .pricing-amount,
body.public-body .financial-metric-value,
body.public-body .pricing-micro-value,
body.public-body .deal-card .grid.grid-cols-3 > div p:last-child {
    font-variant-numeric: tabular-nums;
}
body.public-body .section-eyebrow,
body.public-body .stat-label,
body.public-body .pricing-kicker {
    letter-spacing: 0.16em;
}
body.public-body .step-title {
    letter-spacing: -0.01em;
}
body.public-body .step-body,
body.public-body .feature-card p {
    line-height: 1.62;
}

/* Navy section seam fix — a 1px hairline of the (light) page background showed
   through at the top edge of each navy band on some DPRs (sub-pixel rounding
   between the white section above and the navy section). Pull the navy band up
   1px so its background overlaps and covers the seam. Content shift is 1px =
   imperceptible; the floating stats rail + ::before accent move with it. */
body.public-body .section-band-navy,
body.public-body .how-buying-section,
body.public-body .recently-sold-section {
    margin-top: -1px;
}

/* =====================================================================
   PREMIUM CONVERSION BAND v2 (2026-06-20) — richer dimensional navy, an
   off-white "ambient light" glow at every section seam, frosted-glass
   benefit tabs, and a premium signup card. Shared classes → lifts the
   CTA band + navy bands wherever they appear sitewide.
   ===================================================================== */

/* 1 ── Richer, dimensional navy for every navy band + the CTA band.
   Cool top-right glow + a faint warm crimson base + a deeper multi-stop
   navy = more modern + more depth than the flat 3-stop gradient. */
body.public-body .section-band-navy,
body.public-body .how-buying-section,
body.public-body .recently-sold-section,
body.public-body .site-cta-band {
    background:
        radial-gradient(125% 88% at 82% -12%, rgba(54, 89, 141, 0.42), transparent 56%),
        radial-gradient(100% 120% at 2% 112%, rgba(177, 29, 41, 0.18), transparent 52%),
        linear-gradient(158deg, #0a1424 0%, #0b1f3d 44%, #13436b 74%, #13436b 100%) !important;
    position: relative;
}

/* 2 ── Off-white seam glow — a soft luminous band where each navy section
   meets the lighter sections above + below, plus a crisp 1px highlight.
   Reads as premium "ambient light" at the seams; no pseudo needed so it
   never clashes with the bands' existing ::before/::after. */
body.public-body .section-band-navy,
body.public-body .how-buying-section,
body.public-body .recently-sold-section,
body.public-body .site-cta-band {
    background-image:
        radial-gradient(140% 130px at 50% 0%, rgba(238, 243, 249, 0.16), transparent 70%),
        radial-gradient(140% 120px at 50% 100%, rgba(238, 243, 249, 0.08), transparent 72%),
        radial-gradient(125% 88% at 82% -12%, rgba(54, 89, 141, 0.42), transparent 56%),
        radial-gradient(100% 120% at 2% 112%, rgba(177, 29, 41, 0.18), transparent 52%),
        linear-gradient(158deg, #0a1424 0%, #0b1f3d 44%, #13436b 74%, #13436b 100%) !important;
    box-shadow:
        inset 0 1px 0 rgba(238, 243, 249, 0.12),
        inset 0 -1px 0 rgba(238, 243, 249, 0.06);
}

/* 3 ── Benefit tabs, in the BRAND BUTTON style.
   These used to be three differently-coloured glass panels — a blue one, a red
   one, a green one — which read as three unrelated things stacked next to the
   one red button that is the actual call to action. They are one list of three
   equal statements, so they now wear exactly what `.btn-outline` wears on a navy
   band (see the `.section-band-navy .btn-outline` rules below): the same sky-tinted
   surface, the same 1px white border, the same 0.5rem radius, and the same glowing
   sky accent rail. Colour on this band now means ONE thing — red is the CTA. */
body.public-body .buyer-network-home-benefit {
    position: relative;
    overflow: hidden;
    isolation: isolate;
    min-height: 3.9rem;
    gap: 1rem;
    padding: 1rem 1.15rem 1rem 1.3rem;
    border-radius: 0.5rem;
    border: 1px solid rgba(255, 255, 255, 0.24) !important;
    background: linear-gradient(135deg, rgba(54, 89, 141, 0.16), rgba(255, 255, 255, 0.05)) !important;
    color: #ffffff;
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    box-shadow: 0 8px 22px rgba(11, 31, 61, 0.06), 0 20px 38px -20px rgba(11, 31, 61, 0.55) !important;
    transition:
        transform 0.22s cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 0.22s cubic-bezier(0.22, 1, 0.36, 1),
        border-color 0.22s ease,
        background-color 0.22s ease;
}
/* The button's accent rail, identical geometry and colour to .btn-outline::before
   on this band — one accent, not one per row. */
body.public-body .buyer-network-home-benefit::before {
    content: '';
    position: absolute;
    left: 0; top: 0.7rem; bottom: 0.7rem;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #88a0c2, #36598d);
    box-shadow: 0 0 16px rgba(54, 89, 141, 0.6);
    z-index: 2;
}
body.public-body .buyer-network-home-benefit:hover {
    transform: translateY(-2px);
    border-color: #ffffff !important;
    background: rgba(255, 255, 255, 0.13) !important;
    box-shadow: 0 14px 30px rgba(11, 31, 61, 0.1), 0 28px 48px -20px rgba(11, 31, 61, 0.6) !important;
}
@media (prefers-reduced-motion: reduce) {
    body.public-body .buyer-network-home-benefit:hover { transform: none; }
}
/* glass icon chip — one tint now, matching the shared accent */
body.public-body .buyer-network-home-benefit-icon {
    width: 2.4rem; height: 2.4rem;
    background: linear-gradient(160deg, rgba(255, 255, 255, 0.24), rgba(255, 255, 255, 0.06)) !important;
    border: 1px solid rgba(255, 255, 255, 0.24) !important;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.32), 0 10px 20px -6px rgba(11, 31, 61, 0.5) !important;
    color: #ffffff;
}

/* The SAME brand button, in its LIGHT clothes. On /cash-buyers this row sits inside
   `.site-hero`, which is a pale surface — the navy-band treatment above put white
   text on a light sky tint there and the copy all but vanished. `.btn-outline` has
   exactly this problem and solves it the same way: white surface, navy border, navy
   ink, navy accent rail. Same component, the contrast its background requires. */
body.public-body.cash-buyers-page .buyer-network-home-benefit {
    border: 2px solid rgba(19, 67, 107, 0.22) !important;
    background: rgba(255, 255, 255, 0.92) !important;
    box-shadow: 0 8px 22px rgba(11, 31, 61, 0.06) !important;
}
body.public-body.cash-buyers-page .buyer-network-home-benefit::before {
    background: linear-gradient(180deg, #36598d, #13436b);
    box-shadow: 0 0 14px rgba(11, 31, 61, 0.4);
}
body.public-body.cash-buyers-page .buyer-network-home-benefit:hover {
    border-color: #13436b !important;
    background: rgba(19, 67, 107, 0.06) !important;
    box-shadow: 0 14px 30px rgba(11, 31, 61, 0.1) !important;
}
body.public-body.cash-buyers-page .buyer-network-home-benefit-text {
    color: #13436b;
}
body.public-body.cash-buyers-page .buyer-network-home-benefit-icon {
    background: rgba(19, 67, 107, 0.08) !important;
    border: 1px solid rgba(19, 67, 107, 0.18) !important;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9), 0 8px 16px -8px rgba(11, 31, 61, 0.25) !important;
    color: #13436b;
}
body.public-body .buyer-network-home-benefit-text { font-size: 0.95rem; font-weight: 600; }

/* 4 ── Signal chips — cleaner frosted pills */
body.public-body .buyer-network-home-signal {
    padding: 0.5rem 0.85rem;
    border-radius: 999px;
    background: linear-gradient(180deg, rgba(255, 255, 255, 0.14), rgba(255, 255, 255, 0.05)) !important;
    border: 1px solid rgba(255, 255, 255, 0.16) !important;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.16), 0 8px 16px -8px rgba(11, 31, 61, 0.5) !important;
}

/* 5 ── Premium signup card — the white card floating on the navy band.
   Soft gradient surface, refined ring + ambient shadow, subtle lift. */
body.public-body .buyer-network-shell > div,
body.public-body .site-cta-band .rounded-3xl.bg-white {
    background:
        radial-gradient(120% 80% at 50% 0%, rgba(255, 255, 255, 1), rgba(238, 243, 249, 0.96)) !important;
    border: 1px solid rgba(255, 255, 255, 0.9);
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.9) inset,
        0 2px 8px -2px rgba(11, 31, 61, 0.18),
        0 40px 70px -30px rgba(11, 31, 61, 0.55) !important;
}

/* ── "Off-Market" hero title — navy → slightly lighter navy gradient ──
   This rule USED to be the gradient and was flattened to a solid colour by a
   later pass, which is why the homepage headline lost its finish while the
   comment above it still promised one. The gradient is restored here, and
   `color` is kept as the fallback for the (rare) engine with no
   background-clip:text — without it the text would render invisible. */
body.public-body .section-title-gradient {
    color: #13436b;
    background: linear-gradient(140deg, #0b1f3d 0%, #13436b 50%, #36598d 100%);
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
    /* Descenders (g, y) clip against the tight line-height the hero H1 uses
       once the glyphs are painted from a background box. */
    padding-bottom: 0.06em;
}
@supports not ((background-clip: text) or (-webkit-background-clip: text)) {
    body.public-body .section-title-gradient {
        background: none;
        -webkit-text-fill-color: #13436b;
    }
}

/* The homepage H1 reads as ONE headline — "Off-Market Real Estate Deals
   Across NC" — so all three lines carry the gradient treatment, not just the
   first. The middle line keeps the brand RED and the third keeps navy, so the
   colour roles are unchanged; only the flat fill becomes a gradient. */
body.public-body .site-hero h1 .text-primary,
body.public-body .site-hero h1 .text-secondary {
    background-clip: text;
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    padding-bottom: 0.06em;
}
body.public-body .site-hero h1 .text-primary {
    background-image: linear-gradient(140deg, #8f0f1c 0%, #b11d29 48%, #d93240 100%);
}
body.public-body .site-hero h1 .text-secondary {
    background-image: linear-gradient(140deg, #0b1f3d 0%, #13436b 50%, #36598d 100%);
}
@supports not ((background-clip: text) or (-webkit-background-clip: text)) {
    body.public-body .site-hero h1 .text-primary { -webkit-text-fill-color: #b11d29; }
    body.public-body .site-hero h1 .text-secondary { -webkit-text-fill-color: #13436b; }
}


/* =====================================================================
   SITE-WIDE POLISH LAYER (2026) — ported from the homepage's inline
   #polish-upgrades block and generalized to EVERY public page via the
   canonical .section-band-navy / .stats-band-premium hooks (the homepage
   .how-buying-section / .recently-sold-section / .site-cta-band selectors
   are kept so the homepage renders identically from this one source).
   Additive only: font refresh, button + card refinements, glowing section
   dividers, section-defining borders, and fixed-attachment parallax.
   ===================================================================== */
@media (prefers-reduced-motion: reduce) {
    body.public-body .animate-fade-up,
    body.public-body .animate-scale-in,
    body.public-body .animate-fade-in {
        animation: none !important;
        opacity: 1 !important;
        transform: none !important;
    }
}
body.public-body {
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
    letter-spacing: -0.006em;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
}
body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary {
    border-radius: 12px;
}
body.public-body .btn-primary,
body.public-body .site-button-primary {
    box-shadow: var(--shadow-red), 0 10px 24px -12px rgba(177, 29, 41, 0.55);
}
body.public-body .btn-secondary,
body.public-body .site-button-secondary {
    box-shadow: var(--shadow-navy), 0 10px 24px -12px rgba(11, 31, 61, 0.5);
}
body.public-body .btn-primary:hover,
body.public-body .btn-secondary:hover,
body.public-body .site-button-primary:hover,
body.public-body .site-button-secondary:hover {
    transform: translateY(-3px);
    filter: brightness(1.06);
}
body.public-body .feature-card,
body.public-body .step-node,
body.public-body .faq-item {
    border-radius: 16px;
}
body.public-body .feature-card:hover,
body.public-body .step-node:hover {
    transform: translateY(-6px);
    box-shadow: var(--shadow-hover), 0 22px 46px -24px rgba(11, 31, 61, 0.5);
}
body.public-body .deal-card {
    border-radius: 16px;
}
/* The red-fading section divider is gone. It was already invisible: a later rule
   in this file said `.section-glow-divider { display: none !important }` because
   the section border became the divider -- so ~70 lines of gradient, glow, sweep
   keyframes and a reduced-motion block were painting nothing at all. The 7 empty
   divs that carried it are removed from index.html and deal-detail.html too.
   [data-home-section] keeps its positioning context: the section scrims use it. */
body.public-body [data-home-section] {
    position: relative;
}

/* Section backgrounds scroll with content. NOTE: background-attachment:fixed
   is intentionally NOT used here — the page runs under `zoom: 0.9`
   (body.public-body), and Chrome mispaints fixed backgrounds inside a zoomed
   element: the navy gradient fill renders transparent, so each navy band shows
   through white with only its pseudo-element border visible (a stray red seam
   floating in a white void). `scroll` paints the fill correctly. */
body.public-body,
body.public-body .site-hero,
body.public-body [data-home-section],
body.public-body .section-band-navy,
body.public-body .stats-band-premium,
body.public-body .how-buying-section,
body.public-body .recently-sold-section,
body.public-body .site-cta-band {
    background-attachment: scroll !important;
}

/* Intensified navy/blue glow parallax for every navy band sitewide. */
body.public-body .section-band-navy,
body.public-body .how-buying-section,
body.public-body .recently-sold-section,
body.public-body .site-cta-band {
    background-image:
        radial-gradient(140% 130px at 50% 0%, rgba(238, 243, 249, 0.16), transparent 70%),
        radial-gradient(140% 120px at 50% 100%, rgba(238, 243, 249, 0.08), transparent 72%),
        radial-gradient(130% 135% at 88% -16%, rgba(136, 160, 194, 0.44), transparent 60%),
        radial-gradient(120% 145% at -6% 118%, rgba(136, 160, 194, 0.56), transparent 60%),
        linear-gradient(158deg, #0a1424 0%, #0b1f3d 44%, #13436b 74%, #13436b 100%) !important;
}

/* White section heros → NAVY glow parallax on every public page. */
body.public-body .site-hero,
body.public-body .site-hero.hero-pattern {
    background-image:
        radial-gradient(circle 860px at calc(10% + var(--heroGlowX, 0px)) calc(-12% + var(--heroGlowY, 0px)), rgba(19, 67, 107, 0.58), transparent 60%),
        radial-gradient(circle 800px at calc(90% - var(--heroGlowX, 0px)) calc(112% - var(--heroGlowY, 0px)), rgba(19, 67, 107, 0.46), transparent 62%),
        radial-gradient(circle 380px at 50% 55%, rgba(255, 255, 255, 0.66), transparent 70%),
        linear-gradient(180deg, #eef3f9 0%, #ffffff 50%, #ffffff 100%) !important;
}

/* ── Section-defining border ──────────────────────────────────────────
   A single crisp 3px navy→red→navy gradient border at the top AND bottom of
   each navy band (red centre, blue sides). Generalized so every navy band +
   premium stats band + CTA band across the site is framed identically. ── */
body.public-body .section-band-navy,
body.public-body .stats-band-premium {
    position: relative;
}
body.public-body .section-band-navy::before,
body.public-body .stats-band-premium::before,
body.public-body .how-buying-section::before,
body.public-body .recently-sold-section::before,
body.public-body .site-cta-band::after {
    content: '' !important;
    position: absolute !important;
    inset: 0 !important;
    top: 0 !important;
    bottom: 0 !important;
    height: auto !important;
    border-radius: 0 !important;
    background:
        linear-gradient(90deg, rgba(54, 89, 141,0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141,0) 100%) top / 100% 3px no-repeat,
        linear-gradient(90deg, rgba(54, 89, 141,0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141,0) 100%) bottom / 100% 3px no-repeat !important;
    box-shadow: none !important;
    transform: none !important;
    pointer-events: none !important;
    z-index: 1 !important;
    display: block !important;
}

/* Premium stats band only: navy sides → DARK GREY centre, top and bottom. Same
   geometry as the shared border above; it just swaps the crimson centre stop. Scoped
   to .stats-band-premium so every other navy band keeps its red centre. Declared after
   the shared rule — equal specificity and both !important, so source order decides. */
body.public-body .stats-band-premium::before {
    background:
        linear-gradient(90deg, rgba(54, 89, 141,0) 0%, #36598d 12%, #13436b 50%, #36598d 88%, rgba(54, 89, 141,0) 100%) top / 100% 3px no-repeat,
        linear-gradient(90deg, rgba(54, 89, 141,0) 0%, #36598d 12%, #13436b 50%, #36598d 88%, rgba(54, 89, 141,0) 100%) bottom / 100% 3px no-repeat !important;
}


/* The three benefit bars used to be filled ~80% solid blue / red / green here.
   They now wear the brand button surface defined with `.buyer-network-home-benefit`
   above; these per-colour fills were the last thing still painting them three
   different colours, and they carried !important, so they won on source order. */

/* Stats bar numerals on light bands — navy blue gradient */
body.public-body .stats-bar .stat-value {
    color: #13436b !important;
}
body.public-body .stats-bar .stat-label { color: #13436b !important; }

/* Signals moved under the form card must NOT get the white card surface */
body.public-body .buyer-network-shell > .buyer-network-home-signals {
    background: none !important;
    border: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
    backdrop-filter: none !important;
}

/* Step-node hover on navy bands: soft light-gray glow instead of a gold edge */
body.public-body .section-band-navy .step-node:hover,
body.public-body .how-buying-section .step-node:hover {
    border-color: rgba(255, 255, 255, 0.18) !important;
    box-shadow:
        0 18px 38px rgba(11, 31, 61, 0.36),
        0 0 16px 0 rgba(223, 232, 243, 0.12),
        inset 0 1px 0 rgba(255, 255, 255, 0.12) !important;
}

/* ── Buttons — rounded, gradient fill, glowing left accent edge, inset
   highlight + soft shadow, subtle hover lift. ── */
body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary,
body.public-body .btn-outline {
    position: relative !important;
    overflow: hidden !important;
    border-radius: 12px !important;
    font-weight: 700 !important;
    letter-spacing: -0.005em !important;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.16), 0 18px 30px -14px rgba(11, 31, 61,0.5) !important;
    transition: transform 240ms cubic-bezier(0.22,1,0.36,1), box-shadow 240ms ease, border-color 240ms ease !important;
}
body.public-body .btn-primary::before,
body.public-body .btn-secondary::before,
body.public-body .site-button-primary::before,
body.public-body .site-button-secondary::before,
body.public-body .btn-outline::before {
    content: '' !important;
    position: absolute !important;
    left: 0 !important; top: 0.7rem !important; bottom: 0.7rem !important; right: auto !important;
    width: 3px !important;
    height: auto !important;
    border-radius: 999px !important;
    transform: none !important;
    opacity: 0.95 !important;
    z-index: 2 !important;
}
body.public-body .btn-primary,
body.public-body .site-button-primary {
    background: linear-gradient(135deg, #b11d29 0%, #8f0f1c 100%) !important;
    border: 1px solid rgba(255, 255, 255,0.14) !important;
    color: #ffffff !important;
}
body.public-body .btn-primary::before,
body.public-body .site-button-primary::before {
    background: linear-gradient(180deg, #f7dadd, #d93240) !important;
    box-shadow: 0 0 16px rgba(217, 50, 64,0.6) !important;
}
body.public-body .btn-secondary,
body.public-body .site-button-secondary {
    background: linear-gradient(135deg, #13436b 0%, #0b1f3d 100%) !important;
    border: 1px solid rgba(255, 255, 255,0.14) !important;
    color: #ffffff !important;
}
body.public-body .btn-secondary::before,
body.public-body .site-button-secondary::before {
    background: linear-gradient(180deg, #88a0c2, #36598d) !important;
    box-shadow: 0 0 16px rgba(54, 89, 141,0.6) !important;
}
body.public-body .btn-outline {
    background: linear-gradient(135deg, rgba(19, 67, 107,0.06), rgba(255, 255, 255,0.92)) !important;
    border: 1px solid rgba(19, 67, 107,0.18) !important;
    color: #13436b !important;
    backdrop-filter: blur(6px) !important;
}
body.public-body .btn-outline::before {
    background: linear-gradient(180deg, #36598d, #13436b) !important;
    box-shadow: 0 0 14px rgba(11, 31, 61,0.4) !important;
}
body.public-body .section-band-navy .btn-outline,
body.public-body .how-buying-section .btn-outline,
body.public-body .recently-sold-section .btn-outline,
body.public-body .site-cta-band .btn-outline {
    background: linear-gradient(135deg, rgba(54, 89, 141,0.16), rgba(255, 255, 255,0.05)) !important;
    border: 1px solid rgba(255, 255, 255,0.24) !important;
    color: #ffffff !important;
}
body.public-body .section-band-navy .btn-outline::before,
body.public-body .how-buying-section .btn-outline::before,
body.public-body .recently-sold-section .btn-outline::before,
body.public-body .site-cta-band .btn-outline::before {
    background: linear-gradient(180deg, #88a0c2, #36598d) !important;
    box-shadow: 0 0 16px rgba(54, 89, 141,0.6) !important;
}
body.public-body .btn-primary:hover,
body.public-body .btn-secondary:hover,
body.public-body .site-button-primary:hover,
body.public-body .site-button-secondary:hover,
body.public-body .btn-outline:hover {
    transform: translateY(-2px) !important;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.2), 0 26px 44px -18px rgba(11, 31, 61,0.6) !important;
}


/* =====================================================================
   SUBTLE REFINEMENTS (2026) — dot-grid removed; these are the quiet,
   professional touches that replace it: brand text-selection, accessible
   focus rings, balanced headings, and softer layered card depth.
   ===================================================================== */

/* Brand text selection */
body.public-body ::selection {
    background: rgba(19, 67, 107, 0.16);
    color: #0b1f3d;
}
body.public-body .section-band-navy ::selection,
body.public-body .how-buying-section ::selection,
body.public-body .recently-sold-section ::selection,
body.public-body .site-cta-band ::selection {
    background: rgba(136, 160, 194, 0.28);
    color: #ffffff;
}

/* Accessible, on-brand focus ring — keyboard only, never on mouse click */
body.public-body a:focus-visible,
body.public-body button:focus-visible,
body.public-body .btn-primary:focus-visible,
body.public-body .btn-secondary:focus-visible,
body.public-body .btn-outline:focus-visible,
body.public-body .site-button-primary:focus-visible,
body.public-body .site-button-secondary:focus-visible,
body.public-body input:focus-visible,
body.public-body select:focus-visible,
body.public-body textarea:focus-visible {
    outline: 2px solid rgba(54, 89, 141, 0.9);
    outline-offset: 2px;
    border-radius: 12px;
}

/* Typography polish — balanced headings, pretty body wrap, crisper rendering */
body.public-body h1,
body.public-body h2,
body.public-body h3 {
    text-wrap: balance;
    letter-spacing: -0.02em;
}
body.public-body p {
    text-wrap: pretty;
}

/* Softer, layered card depth + hairline top highlight (replaces the flatness
   the dot grid used to hide behind). Applies to the shared card surfaces. */
body.public-body .feature-card,
body.public-body .deal-card,
body.public-body .faq-item {
    border: 1px solid rgba(10, 20, 36, 0.06);
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.9) inset,
        0 1px 2px rgba(11, 31, 61, 0.04),
        0 12px 28px -18px rgba(11, 31, 61, 0.28);
    transition: transform 240ms cubic-bezier(0.22,1,0.36,1), box-shadow 240ms ease, border-color 240ms ease;
}
body.public-body .feature-card:hover,
body.public-body .deal-card:hover {
    border-color: rgba(19, 67, 107, 0.14);
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.95) inset,
        0 22px 46px -22px rgba(11, 31, 61, 0.42);
}

/* Underline-grow affordance on inline text links inside content bands */
body.public-body .site-section-soft a:not(.btn-primary):not(.btn-secondary):not(.btn-outline):not([class*="button"]) {
    background-image: linear-gradient(currentColor, currentColor);
    background-size: 0% 1.5px;
    background-position: 0 100%;
    background-repeat: no-repeat;
    transition: background-size 220ms cubic-bezier(0.22,1,0.36,1);
    padding-bottom: 1px;
}
body.public-body .site-section-soft a:not(.btn-primary):not(.btn-secondary):not(.btn-outline):not([class*="button"]):hover {
    background-size: 100% 1.5px;
}


/* =====================================================================
   REFINEMENTS v2 (2026) — glowing section eyebrows and a few more quiet
   professional touches.

   The step-number disc rules that used to live here were deleted on
   2026-07-30. They set box-shadow/background with !important, so the
   final steps-track pass at the bottom of this file could never win, and
   the disc lost the 5px band-coloured ring that punches the rail out
   from behind it — the rail read as a line running THROUGH the discs.
   ===================================================================== */

/* Subtle glow around every section eyebrow. Light bands → soft red halo;
   navy bands → cool sky halo. */
body.public-body .section-eyebrow {
    box-shadow:
        0 0 0 1px rgba(177, 29, 41, 0.08),
        0 6px 20px -8px rgba(177, 29, 41, 0.34);
}
body.public-body .section-band-navy .section-eyebrow,
body.public-body .how-buying-section .section-eyebrow,
body.public-body .recently-sold-section .section-eyebrow,
body.public-body .site-cta-band .section-eyebrow {
    box-shadow:
        inset 0 0 0 1px rgba(255, 255, 255, 0.08),
        0 0 22px -2px rgba(136, 160, 194, 0.4) !important;
}

/* Anchor targets clear the sticky header when jumped to */
body.public-body section[id] {
    scroll-margin-top: 92px;
}

/* Deal-card imagery eases up on hover — a restrained, premium micro-motion */
body.public-body .deal-card img {
    transition: transform 420ms cubic-bezier(0.22, 1, 0.36, 1);
    will-change: transform;
}
body.public-body .deal-card:hover img {
    transform: scale(1.035);
}

/* Section underline accent gets a whisper of glow to match the eyebrows */
body.public-body .section-underline::after {
    box-shadow: 0 2px 10px -2px rgba(177, 29, 41, 0.4);
}


/* =====================================================================
   REFINEMENTS v3 (2026) — quiet, professional micro-polish.
   ===================================================================== */

/* Sticky nav gains a hairline shadow + crisper translucency so it separates
   cleanly from content as you scroll (no JS needed). */
body.public-body .site-nav {
    box-shadow: 0 1px 0 rgba(11, 31, 61, 0.05), 0 6px 24px -18px rgba(11, 31, 61, 0.5);
}

/* Form fields: focus adds a soft brand glow ring (on top of the existing
   border treatment) — reads as premium and clearly signals active field. */
body.public-body input:focus,
body.public-body textarea:focus,
body.public-body select:focus {
    box-shadow: 0 0 0 3px rgba(54, 89, 141, 0.16), 0 1px 2px rgba(11, 31, 61, 0.04) !important;
}

/* Buttons: a restrained diagonal sheen sweeps across once on hover. */
body.public-body .btn-primary::after,
body.public-body .btn-secondary::after,
body.public-body .site-button-primary::after,
body.public-body .site-button-secondary::after {
    content: '';
    position: absolute;
    top: 0;
    bottom: 0;
    left: -60%;
    width: 45%;
    background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.28), transparent);
    transform: skewX(-18deg);
    transition: left 620ms cubic-bezier(0.22, 1, 0.36, 1);
    pointer-events: none;
    z-index: 1;
}
body.public-body .btn-primary:hover::after,
body.public-body .btn-secondary:hover::after,
body.public-body .site-button-primary:hover::after,
body.public-body .site-button-secondary:hover::after {
    left: 130%;
}

/* Live "new deals" badge dot: soft pulsing halo instead of a hard dot. */
body.public-body .site-badge .bg-emerald-500 {
    box-shadow: 0 0 0 3px rgba(22, 163, 74, 0.14), 0 0 10px rgba(22, 163, 74, 0.55);
}

/* Prices and stat figures align in neat columns with tabular figures. */
body.public-body .stat-value,
body.public-body .deal-card .font-semibold,
body.public-body .step-number,
body.public-body .pricing-amount {
    font-variant-numeric: tabular-nums;
    font-feature-settings: "tnum" 1;
}

/* Deal-card image hover-zoom clips cleanly to the card's rounded corners. */
body.public-body .deal-card {
    overflow: hidden;
}

/* Feature-card icon lifts subtly with its card. */
body.public-body .feature-icon-wrap {
    transition: transform 260ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 260ms ease;
}
body.public-body .feature-card:hover .feature-icon-wrap {
    transform: translateY(-2px) scale(1.04);
}


/* =====================================================================
   TWEAKS (2026) — "Across NC" fades to a lighter red toward NC; trust-bar
   container gets a soft medium-gray underglow.
   ===================================================================== */
body.public-body [data-brand-across-state] {
    color: #b11d29;
}
body.public-body [data-home-section="trust-bar"] .rounded-full {
    box-shadow: 0 22px 46px -22px rgba(54, 89, 141, 0.65);
}


/* =====================================================================
   FAQ UPGRADE (2026) — quiet accent bar on open, refined chevron chip,
   hairline answer separator, and a gentle question nudge on hover.
   ===================================================================== */
body.public-body .faq-item {
    position: relative;
}
/* Brand accent bar slides in down the left edge when a row opens */
body.public-body .faq-item::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    border-radius: 3px;
    background: linear-gradient(180deg, #d93240 0%, #b11d29 55%, #b11d29 100%);
    transform: scaleY(0);
    transform-origin: top;
    opacity: 0;
    transition: transform 320ms cubic-bezier(0.22, 1, 0.36, 1), opacity 320ms ease;
    z-index: 2;
    pointer-events: none;
}
body.public-body .faq-item.is-open::before {
    transform: scaleY(1);
    opacity: 1;
}
body.public-body .faq-item.is-open {
    transform: translateY(-1px);
}
/* Question nudges right slightly on hover / open */
body.public-body .faq-trigger span:first-child {
    transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1), color 180ms ease;
}
body.public-body .faq-trigger:hover span:first-child,
body.public-body .faq-item.is-open .faq-trigger span:first-child {
    transform: translateX(4px);
}
/* Chevron chip: brand tint + soft ring when open */
body.public-body .faq-trigger-icon {
    transition: transform 300ms cubic-bezier(0.22, 1, 0.36, 1), background-color 200ms ease, color 200ms ease, box-shadow 200ms ease;
}
body.public-body .faq-item.is-open .faq-trigger-icon {
    background: linear-gradient(135deg, rgba(177, 29, 41, 0.14), rgba(177, 29, 41, 0.08)) !important;
    color: #b11d29 !important;
    box-shadow: 0 0 0 3px rgba(177, 29, 41, 0.08) !important;
}
/* Hairline separator between question and answer, only while open */
body.public-body .faq-item.is-open .faq-answer {
    border-top: 1px solid rgba(10, 20, 36, 0.06);
    padding-top: 1.05rem;
    margin-top: 0.15rem;
}
/* On navy bands, tune the accent + separator to read on dark glass */
body.public-body .section-band-navy .faq-item.is-open .faq-answer {
    border-top-color: rgba(255, 255, 255, 0.12) !important;
}
body.public-body .section-band-navy .faq-item.is-open .faq-trigger-icon {
    background: rgba(136, 160, 194, 0.18) !important;
    color: #88a0c2 !important;
    box-shadow: 0 0 0 3px rgba(136, 160, 194, 0.12) !important;
}


/* Trust pill icons: nothing to fake here any more — public-icons-solid.js swaps the
   GEOMETRY, so badge-check and map-pin arrive already filled. The old rules painted a
   stroke onto lucide outline sub-paths that no longer exist; on a single filled path
   they drew a white hairline around the glyph. */


/* =====================================================================
   RESTORED FUNCTIONAL RULES (kept during 2026 polish port — these are
   behavior/a11y safeguards, not visuals, and were inadvertently dropped
   when the trailing polish block was rewritten). Appended last so the
   polish layer above still wins any visual ties.
   ===================================================================== */

/* Anchor targets clear the fixed ~64px top nav when jumped to via #hash. */
html { scroll-padding-top: 5rem; }

/* Horizontal-overflow safety net: a single over-wide element must never make
   the whole page scroll sideways on mobile. `clip` keeps vertical scroll and
   position:sticky working (unlike overflow-x:hidden on <html>/<body>). */
html,
body.public-body { overflow-x: clip; }

/* Comfortable tap targets — primary/secondary/outline buttons and form
   submits never fall under the 44px accessibility floor on phones. */
@media (max-width: 640px) {
    body.public-body .btn-primary,
    body.public-body .btn-secondary,
    body.public-body .btn-outline,
    body.public-body .site-button-primary,
    body.public-body .site-button-secondary,
    body.public-body .site-footer-button,
    body.public-body form button[type="submit"] {
        min-height: 44px;
    }
}

/* Wide-table scroll affordance (tools.html amortization schedule) —
   momentum scrolling everywhere plus a right-edge fade on touch widths
   so off-screen columns read as scrollable. */
body.public-body .finance-table-wrap {
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
}
@media (max-width: 767px) {
    body.public-body .finance-table-wrap {
        -webkit-mask-image: linear-gradient(90deg, #000000 0%, #000000 calc(100% - 32px), rgba(0, 0, 0, 0.25) 100%);
        mask-image: linear-gradient(90deg, #000000 0%, #000000 calc(100% - 32px), rgba(0, 0, 0, 0.25) 100%);
    }
}

/* Footer safe-area — sitewide clearance for the iOS home indicator. */
body.public-body .site-footer {
    padding-bottom: calc(4rem + env(safe-area-inset-bottom));
}


/* =====================================================================
   PWA INSTALL CHIP — premium pill (2026). Rebuilt to match the site's
   .btn-outline idiom: light gradient surface, navy hairline border, a
   glowing navy left accent edge, inset highlight + soft layered shadow,
   with a .btn-primary-style red Install action. Positioning/stacking are
   set inline by public-pwa.js; only the look lives here.
   ===================================================================== */
.ncdd-install-chip {
    display: flex;
    align-items: center;
    gap: 12px;
    max-width: 340px;
    padding: 12px 14px 12px 18px;
    border-radius: 12px;
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
    color: #0b1f3d;
    background: linear-gradient(135deg, rgba(19, 67, 107, 0.06), rgba(255, 255, 255, 0.96));
    border: 1px solid rgba(19, 67, 107, 0.16);
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 1px 2px rgba(11, 31, 61, 0.05),
        0 22px 46px -22px rgba(11, 31, 61, 0.5);
    overflow: hidden;
    animation: ncddChipIn 420ms cubic-bezier(0.22, 1, 0.36, 1) both;
}
/* Glowing navy left accent edge — same treatment as .btn-outline::before */
.ncdd-install-chip::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0.7rem;
    bottom: 0.7rem;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #36598d, #13436b);
    box-shadow: 0 0 14px rgba(11, 31, 61, 0.45);
}
.ncdd-install-ic {
    flex: none;
    width: 36px;
    height: 36px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #ffffff;
    background: linear-gradient(135deg, #13436b 0%, #0b1f3d 100%);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18), 0 6px 14px -6px rgba(11, 31, 61, 0.6);
}
.ncdd-install-ic svg { width: 19px; height: 19px; }
.ncdd-install-copy {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    line-height: 1.25;
}
.ncdd-install-copy strong {
    font-weight: 700;
    font-size: 14px;
    letter-spacing: -0.01em;
    color: #0b1f3d;
}
.ncdd-install-copy span {
    font-weight: 500;
    font-size: 12px;
    color: #13436b;
}
.ncdd-install-go {
    flex: none;
    position: relative;
    overflow: hidden;
    border: 1px solid rgba(255, 255, 255, 0.14);
    border-radius: 12px;
    padding: 8px 15px;
    font-weight: 700;
    font-size: 13px;
    letter-spacing: -0.005em;
    color: #ffffff;
    cursor: pointer;
    background: linear-gradient(135deg, #b11d29 0%, #8f0f1c 100%);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18), 0 10px 22px -12px rgba(177, 29, 41, 0.65);
    transition: transform 200ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 200ms ease, filter 200ms ease;
}
/* Glowing red accent edge — echoes .btn-primary::before */
.ncdd-install-go::before {
    content: '';
    position: absolute;
    left: 0;
    top: 6px;
    bottom: 6px;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #f7dadd, #d93240);
    box-shadow: 0 0 12px rgba(217, 50, 64, 0.6);
}
.ncdd-install-go:hover {
    transform: translateY(-2px);
    filter: brightness(1.05);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22), 0 16px 30px -14px rgba(177, 29, 41, 0.72);
}
.ncdd-install-x {
    flex: none;
    background: transparent;
    border: 0;
    cursor: pointer;
    line-height: 1;
    color: #88a0c2;
    font-size: 18px;
    padding: 2px 4px;
    border-radius: 8px;
    transition: color 160ms ease, background 160ms ease;
}
.ncdd-install-x:hover { color: #0b1f3d; background: rgba(19, 67, 107, 0.08); }
@keyframes ncddChipIn {
    from { opacity: 0; transform: translateY(12px) scale(0.98); }
    to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
    .ncdd-install-chip { animation: none; }
}
@media (max-width: 400px) {
    .ncdd-install-chip { max-width: calc(100vw - 32px); }
}


/* =====================================================================
   2026 batch — profile avatar puck, white premium button, section border.
   ===================================================================== */

/* ── Profile avatar — full-bleed initials/photo puck with premium gloss ── */
body.public-body .site-profile-avatar {
    width: 100% !important;
    height: 100% !important;
    border-radius: 9999px;
    overflow: hidden;
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
}
body.public-body .site-profile-avatar-initials {
    background: linear-gradient(160deg, #13436b 0%, #13436b 55%, #0b1f3d 100%);
    color: #ffffff;
    font-family: 'Inter', sans-serif;
    font-weight: 800;
    font-size: 1.4rem;
    letter-spacing: 0.01em;
    line-height: 1;
    text-transform: uppercase;
}
body.public-body .site-profile-avatar-img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ── Preset avatar tiles ────────────────────────────────────────────────────
   For members who signed up with an email address and have no Google photo.
   Drawn entirely in CSS (gradient + a lucide glyph in the markup) so adding one
   is a class here, never an image asset that has to be uploaded, cached, and
   kept from 404ing. Deliberately the SAME puck geometry as the initials avatar
   above — the nav badge, the settings header and the picker all render the same
   markup, which is what keeps "my picture" from meaning three different things
   in three places. */
body.public-body .ncdd-avatar-preset {
    display: flex;
    align-items: center;
    justify-content: center;
    color: #ffffff;
}
body.public-body .ncdd-avatar-preset svg,
body.public-body .ncdd-avatar-preset i { width: 52%; height: 52%; stroke-width: 2; }
body.public-body .ncdd-avatar-preset[data-avatar-preset="skyline"]   { background: linear-gradient(160deg, #13436b 0%, #13436b 55%, #0b1f3d 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="keys"]      { background: linear-gradient(160deg, #f5b301 0%, #f5b301 55%, #a86f00 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="blueprint"] { background: linear-gradient(160deg, #36598d 0%, #13436b 55%, #13436b 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="porch"]     { background: linear-gradient(160deg, #16a34a 0%, #16a34a 55%, #16a34a 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="ledger"]    { background: linear-gradient(160deg, #5b6b82 0%, #13436b 55%, #13436b 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="handshake"] { background: linear-gradient(160deg, #b11d29 0%, #b11d29 55%, #8f0f1c 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="toolbox"]   { background: linear-gradient(160deg, #f5b301 0%, #f5b301 55%, #a86f00 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="map"]       { background: linear-gradient(160deg, #36598d 0%, #13436b 55%, #0b1f3d 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="chart"]     { background: linear-gradient(160deg, #16a34a 0%, #16a34a 55%, #16a34a 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="shield"]    { background: linear-gradient(160deg, #36598d 0%, #36598d 55%, #13436b 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="spark"]     { background: linear-gradient(160deg, #f5b301 0%, #a86f00 55%, #a86f00 100%); }
body.public-body .ncdd-avatar-preset[data-avatar-preset="compass"]   { background: linear-gradient(160deg, #36598d 0%, #36598d 55%, #13436b 100%); }
body.public-body .site-profile-avatar-gloss {
    position: absolute;
    inset: 0;
    border-radius: inherit;
    pointer-events: none;
    background:
        linear-gradient(180deg, rgba(255, 255, 255,0.42) 0%, rgba(255, 255, 255,0.12) 34%, rgba(255, 255, 255,0) 56%),
        radial-gradient(120% 80% at 28% 12%, rgba(255, 255, 255,0.34), transparent 46%);
}
/* When an avatar is present, drop the trigger's light chrome so it reads as one solid puck. */
body.public-body .site-profile-trigger:has(.site-profile-avatar) {
    background: transparent !important;
    border-color: rgba(255, 255, 255,0.55) !important;
    padding: 0;
}

/* ── White premium button (Get Deal Alerts on dark bands, etc.) ── */
body.public-body .btn-white {
    position: relative;
    overflow: hidden;
    border-radius: 12px;
    font-weight: 700;
    letter-spacing: -0.005em;
    color: #0b1f3d;
    background: linear-gradient(180deg, #ffffff 0%, #eef3f9 100%);
    border: 1px solid rgba(10, 20, 36, 0.10);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.9), 0 14px 30px -14px rgba(11, 31, 61,0.55);
    transition: transform 220ms cubic-bezier(0.22,1,0.36,1), box-shadow 220ms ease, filter 220ms ease;
}
body.public-body .btn-white::before {
    content: '';
    position: absolute;
    left: 0; top: 0.7rem; bottom: 0.7rem;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #36598d, #13436b);
    box-shadow: 0 0 14px rgba(11, 31, 61, 0.4);
}
body.public-body .btn-white:hover {
    transform: translateY(-2px);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255,0.95), 0 20px 38px -16px rgba(11, 31, 61,0.6);
}
body.public-body .btn-white i,
body.public-body .btn-white svg { color: #b11d29; }

/* ── Section-defining border (navy → crimson → navy) at the bottom of a section ── */
body.public-body .dd-section-border-b { position: relative; }
body.public-body .dd-section-border-b::after {
    content: '';
    position: absolute;
    left: 0; right: 0; bottom: 0;
    height: 3px;
    background: linear-gradient(90deg, rgba(54, 89, 141,0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141,0) 100%);
    pointer-events: none;
    z-index: 2;
}

/* ── Touch-target floor (coarse pointers only) ────────────────────────
   Audited at phone width: 39 interactive elements under 44px on the homepage,
   86 on /deals, 27 on a deal page. Most are text links in dense rows —
   breadcrumbs at 37x20, "Sign in" at 41x18, the SEO link pills at 42 tall —
   where the LABEL is the right size but the hit box is the text's own line box.
   These give the box a floor without touching the type or the layout on a
   mouse-driven screen, where a 20px link has never been a problem.

   Keyed on WIDTH, not `pointer: coarse`. Pointer type is the more precise
   question and the wrong one to bet on: a Windows touchscreen laptop reports
   `fine`, and so does every desktop emulator, so the rule silently did nothing
   in testing and would have shipped unverified. Width is the same population as
   the zoom exemption above, and it is checkable. */
@media (max-width: 767px) {
    body.public-body .site-link-pill,
    body.public-body .site-footer a,
    body.public-body .site-inline-glass a,
    body.public-body .site-nav a:not(.site-brand),
    body.public-body .site-mobile-panel a {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }
    /* Breadcrumb rows and footer link lists sit tighter than 44px on purpose;
       the extra height comes out of padding so the visual row keeps its rhythm. */
    body.public-body .site-inline-glass .flex.items-center.gap-2 > a {
        padding-block: 0.75rem;
    }
}

/* ── Global front-end zoom ─────────────────────────────────────────────
   Every public page carries body.public-body; the admin shell carries
   body.admin-body, so this never touches the CRM. Scale is a variable so
   it can be dialed without hunting through rules.

   `zoom` scales painted layout but NOT vh units, so anything sized to the
   viewport has to be divided back out or it renders 10% short.

   PHONES ARE EXEMPT. This shipped unscoped, so a 390px screen — the one with the
   least room to give — had every font and every tap target shrunk by 10% along
   with everything else. Measured on the homepage at that width: 116 text nodes
   rendering under 13px, 3 of them at 9.0px, and tap targets 10% under whatever
   their CSS claimed. Zoom is a DENSITY choice: it earns its keep on a large
   screen with room to spare, and costs legibility on a small one. Verified at
   412px that dropping it introduces no overflow — scrollWidth is unchanged. */
:root { --public-zoom: 1; }

@media (min-width: 768px) {
    :root { --public-zoom: 0.9; }
}

body.public-body {
    zoom: var(--public-zoom);
    min-height: calc(100vh / var(--public-zoom));
}

body.public-body .min-h-screen { min-height: calc(100vh / var(--public-zoom)); }
body.public-body .h-screen { height: calc(100vh / var(--public-zoom)); }

/* =====================================================================
   LIVE DEAL PROMPT — premium restyle 2026-07-13. Brings the floating
   "Interested in this deal?" card in line with the deal-detail page CTAs
   (glossy per-hue gradients, glowing accent edge, inset highlight, hover
   lift). Appended LAST so it wins the cascade. ADDITIVE ONLY — no markup
   ids/classes/JS hooks changed except the new #dealInterestBubble that
   public-address-unlock.js now renders.
     1) Card shell — richer premium surface + gold hairline top-rail.
     2) "Call Austin" primary — glossy crimson CTA skin (main-CTA idiom).
     3) "Save Contact Card" — glossy navy CTA card w/ glowing sky edge.
     4) Dismiss (×) — softer premium chip w/ hover.
     5) Mobile — collapse to a tap-to-open "thinking" bubble (space saver).
   ===================================================================== */

/* --- 1) Card shell: keep the frosted surface but add a premium gold
       hairline top-rail (mirrors the pricing card / email idiom) and a
       slightly deeper, warmer shadow stack. --- */
body.public-body .deal-interest-prompt {
    position: fixed;
    overflow: hidden;
    border: 1px solid rgba(223, 232, 243, 0.7);
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.04),
        0 10px 24px rgba(11, 31, 61, 0.1),
        0 34px 60px rgba(11, 31, 61, 0.14),
        0 0 22px 1px rgba(245, 179, 1, 0.16);
}
body.public-body .deal-interest-prompt::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 3px;
    border-radius: 16px 16px 0 0;
    background: linear-gradient(90deg, #f5b301 0%, #f5b301 38%, #ffc933 62%, #f5b301 100%);
    pointer-events: none;
    z-index: 2;
}

/* --- 2) "Call Austin" primary → glossy crimson CTA skin matching the
       page's main "Make an Offer" button (glossy gradient, hairline border,
       text-shadow, layered red glow, hover lift). --- */
body.public-body .deal-interest-primary {
    position: relative;
    overflow: hidden;
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255, 0.18);
    background: linear-gradient(135deg, #b11d29 0%, #b11d29 52%, #8f0f1c 100%);
    padding: 0.95rem 1rem;
    font-weight: 800;
    color: #ffffff;
    text-shadow: 0 1px 2px rgba(11, 31, 61, 0.18);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.22),
        0 2px 4px rgba(11, 31, 61, 0.08),
        0 10px 22px rgba(177, 29, 41, 0.28),
        0 20px 40px rgba(177, 29, 41, 0.14);
    transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 180ms ease, filter 180ms ease;
}
/* Glossy top sheen. */
body.public-body .deal-interest-primary::after {
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 48%;
    border-radius: 12px 12px 40% 40% / 12px 12px 100% 100%;
    background: linear-gradient(180deg, rgba(255, 255, 255, 0.28), rgba(255, 255, 255, 0));
    pointer-events: none;
}
body.public-body .deal-interest-primary:hover {
    transform: translateY(-2px);
    filter: brightness(1.04);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        0 2px 4px rgba(11, 31, 61, 0.06),
        0 14px 28px rgba(177, 29, 41, 0.32),
        0 28px 50px rgba(177, 29, 41, 0.16);
}
body.public-body .deal-interest-primary:active {
    transform: translateY(0);
}
body.public-body .deal-interest-primary i,
body.public-body .deal-interest-primary svg {
    position: relative;
    z-index: 1;
}

/* --- 3) "Save Contact Card" → glossy navy CTA card matching the page's
       navy CTA / "Close By" date row (deep navy gradient, white copy,
       glowing sky-blue left edge, inset highlight, hover lift). --- */
body.public-body .deal-interest-card-link {
    position: relative;
    overflow: hidden;
    border-radius: 12px;
    border: 1px solid rgba(19, 67, 107, 0.42);
    background: linear-gradient(140deg, #0b1f3d 0%, #13436b 44%, #36598d 74%, #36598d 100%);
    padding: 0.9rem 1rem 0.9rem 1.15rem;
    color: #ffffff;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.16),
        0 2px 4px rgba(11, 31, 61, 0.06),
        0 12px 24px -10px rgba(11, 31, 61, 0.5);
    transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 180ms ease, filter 180ms ease;
}
/* Glowing sky-blue left accent edge (::before) — same idiom as the page CTAs. */
body.public-body .deal-interest-card-link::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0.7rem;
    bottom: 0.7rem;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #88a0c2, #13436b);
    box-shadow: 0 0 14px rgba(54, 89, 141, 0.6);
    pointer-events: none;
    z-index: 2;
}
body.public-body .deal-interest-card-link:hover {
    transform: translateY(-2px);
    filter: brightness(1.05);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.18),
        0 2px 4px rgba(11, 31, 61, 0.06),
        0 16px 30px -10px rgba(11, 31, 61, 0.55);
}
body.public-body .deal-interest-card-link:active {
    transform: translateY(0);
}
/* Translucent white icon puck + white icon on the navy surface. */
body.public-body .deal-interest-card-link .deal-interest-card-icon {
    background: rgba(255, 255, 255, 0.14);
    border: 1px solid rgba(255, 255, 255, 0.22);
    color: #ffffff;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
body.public-body .deal-interest-card-link .deal-interest-card-title {
    color: #ffffff;
}
body.public-body .deal-interest-card-link .deal-interest-card-subtitle {
    color: rgba(255, 255, 255, 0.82);
}

/* --- 4) Dismiss (×) — premium frosted chip with a subtle hover. --- */
body.public-body .deal-interest-dismiss {
    z-index: 3;
    border: 1px solid rgba(223, 232, 243, 0.8);
    background: rgba(255, 255, 255, 0.9);
    box-shadow: 0 2px 6px rgba(11, 31, 61, 0.08);
    transition: transform 160ms ease, background 160ms ease, color 160ms ease;
}
body.public-body .deal-interest-dismiss:hover {
    transform: scale(1.06);
    background: #ffffff;
    color: #0f1c33;
}

/* --- 5) Mobile: the collapsed "thinking" bubble. A compact circular FAB
       carrying a thinking emoji that the buyer taps to expand the full card
       — saves space on small screens. Sits above the chat launcher, sharing
       the card's corner so it never overlaps other floating UI. --- */
body.public-body .deal-interest-bubble {
    position: fixed;
    right: 0.9rem;
    bottom: calc(6.5rem + env(safe-area-inset-bottom));
    z-index: 46;
    display: none; /* desktop never shows the bubble — JS opens the card directly */
    align-items: center;
    justify-content: center;
    width: 3.5rem;
    height: 3.5rem;
    border-radius: 9999px;
    border: 1px solid rgba(255, 255, 255, 0.28);
    background: linear-gradient(145deg, #36598d 0%, #13436b 50%, #b11d29 130%);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        0 10px 24px rgba(11, 31, 61, 0.28),
        0 0 20px 1px rgba(245, 179, 1, 0.28);
    cursor: pointer;
    transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 180ms ease, opacity 180ms ease;
}
body.public-body .deal-interest-bubble.hidden {
    display: none !important;
}
body.public-body .deal-interest-bubble:hover,
body.public-body .deal-interest-bubble:active {
    transform: translateY(-2px) scale(1.03);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.26),
        0 14px 30px rgba(11, 31, 61, 0.32),
        0 0 26px 2px rgba(245, 179, 1, 0.36);
}
body.public-body .deal-interest-bubble-emoji {
    position: relative;
    z-index: 1;
    font-size: 1.55rem;
    line-height: 1;
    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3));
}
/* Gentle attention ping ring behind the bubble. */
body.public-body .deal-interest-bubble-ping {
    position: absolute;
    inset: 0;
    border-radius: 9999px;
    background: rgba(245, 179, 1, 0.55);
    opacity: 0;
    z-index: 0;
    animation: dealInterestBubblePing 2.6s cubic-bezier(0, 0, 0.2, 1) infinite;
}
@keyframes dealInterestBubblePing {
    0% { transform: scale(1); opacity: 0.45; }
    70%, 100% { transform: scale(1.7); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
    body.public-body .deal-interest-bubble-ping {
        animation: none;
    }
}

/* On phones, allow the bubble to display (JS toggles .hidden to control it). */
@media (max-width: 640px) {
    body.public-body .deal-interest-bubble {
        display: inline-flex;
        right: 0.75rem;
        bottom: calc(5.6rem + env(safe-area-inset-bottom));
    }
    /* Full card keeps clear of the gold top-rail radius on small screens. */
    body.public-body .deal-interest-prompt::before {
        border-radius: 16px 16px 0 0;
    }
    body.public-body .deal-interest-actions {
        gap: 0.7rem;
    }
}

/* --- 6) Premium v2 — pull the Live Deal Prompt fully in line with the page's
       premium surfaces: the brand ray-sheen watermark (the SAME rayeffect asset
       the deal flyer + referral card use), a genuine "live" pulse dot on the
       eyebrow, and tighter display type. Appended last so it wins the cascade. */
body.public-body .deal-interest-prompt {
    padding-top: 1.15rem;
    /* Soft navy corner glow under the frosted white, echoing the premium bands. */
    background:
        radial-gradient(120% 82% at 100% 0%, rgba(19, 67, 107, 0.06), transparent 55%),
        linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(238, 243, 249, 0.96));
}
/* Faint brand ray-sheen tucked in the top-right corner, masked so it fades out
   well before it reaches the copy — brand texture without muddying the card. */
body.public-body .deal-interest-prompt::after {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    width: 64%;
    height: 60%;
    background: none top right / cover no-repeat;
    opacity: 0.06;
    mix-blend-mode: multiply;
    -webkit-mask-image: radial-gradient(120% 120% at 100% 0%, #000000 0%, transparent 68%);
            mask-image: radial-gradient(120% 120% at 100% 0%, #000000 0%, transparent 68%);
    pointer-events: none;
    z-index: 0;
}
/* Lift the copy above the watermark (the dismiss chip keeps its own z-index:3). */
body.public-body .deal-interest-eyebrow,
body.public-body .deal-interest-title,
body.public-body .deal-interest-copy,
body.public-body .deal-interest-actions {
    position: relative;
    z-index: 1;
}

/* Live pulse dot ahead of "LIVE DEAL PROMPT" — sells that the feed is live. */
body.public-body .deal-interest-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.66rem;
    letter-spacing: 0.26em;
}
body.public-body .deal-interest-eyebrow::before {
    content: '';
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 9999px;
    background: #16a34a;
    box-shadow: 0 0 0 0 rgba(22, 163, 74, 0.5);
    animation: dealInterestLivePulse 1.8s ease-out infinite;
    flex: none;
}
@keyframes dealInterestLivePulse {
    0% { box-shadow: 0 0 0 0 rgba(22, 163, 74, 0.5); }
    70% { box-shadow: 0 0 0 7px rgba(22, 163, 74, 0); }
    100% { box-shadow: 0 0 0 0 rgba(22, 163, 74, 0); }
}
@media (prefers-reduced-motion: reduce) {
    body.public-body .deal-interest-eyebrow::before { animation: none; }
}

/* Tighter, more confident display type on the heading + copy. */
body.public-body .deal-interest-title {
    margin-top: 0.6rem;
    font-size: 1.16rem;
    letter-spacing: -0.01em;
}
body.public-body .deal-interest-copy {
    font-size: 0.875rem;
    color: #13436b;
}

/* ---------------------------------------------------------------------------
   VIP-NCDD "Make me a VIP" pick.
   Shared by the cash-buyer join form (cash-buyers.html + deals.html render the
   same .cash-buyers-form) and /profile, so it lives here rather than inline on
   one page. Gold, and the only gold on any of those pages — it reads as a tier
   because nothing else competes with it.

   This styles the buyer's OWN pick (the VIP-NCDD tag). It is not the owner's
   curated `VIP` list and not `vip-buyer`; see VIP_NCDD_TAG in lib/ghl-helpers.js.
   --------------------------------------------------------------------------- */
.vip-pick {
    display: flex;
    align-items: flex-start;
    gap: 0.8rem;
    cursor: pointer;
    padding: 1rem 1.1rem;
    border-radius: 12px;
    border: 1px solid #ffc933;
    background: linear-gradient(135deg, #fff5e0 0%, #fff5e0 100%);
    box-shadow: 0 12px 30px -20px rgba(11, 31, 61, 0.5);
    transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
}
.vip-pick:hover {
    border-color: #f5b301;
    box-shadow: 0 14px 32px -18px rgba(11, 31, 61, 0.6);
}
.vip-pick input {
    margin-top: 0.2rem;
    accent-color: #a86f00;
    width: 1.05rem;
    height: 1.05rem;
    flex: none;
}
/* These are <span>s in a flex row — without an explicit block display the
   title and sub-copy run together as one paragraph. */
.vip-pick-body { display: flex; flex-direction: column; gap: 0.2rem; }
.vip-pick-title {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    font-weight: 800;
    font-size: 0.95rem;
    color: #0b1f3d;
    letter-spacing: -0.01em;
}
.vip-pick-sub { display: block; font-size: 0.8rem; line-height: 1.45; color: #0b1f3d; }
.vip-pick:has(input:checked) {
    border-color: #f5b301;
    background: linear-gradient(135deg, #fff5e0 0%, #ffc933 100%);
    box-shadow: 0 14px 34px -16px rgba(11, 31, 61, 0.55);
}
.vip-pick:has(input:checked) .vip-pick-title::after {
    content: '✓ You’re on the VIP list';
    margin-left: 0.5rem;
    font-size: 0.68rem;
    font-weight: 800;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    background: #a86f00;
    color: #ffffff;
    border-radius: 999px;
    padding: 0.16rem 0.5rem;
}

/* Progressive-disclosure block on the join form. Optional criteria stay one tap
   away so the signup stays short, without hiding them from buyers who want the
   filtering to be tight. */
.buyer-fine-tune summary::-webkit-details-marker { display: none; }
.buyer-fine-tune summary:hover { background: #eef3f9; border-radius: 12px; }
.buyer-fine-tune summary:focus-visible {
    outline: none;
    box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px rgba(11, 31, 61, 0.55);
    border-radius: 12px;
}


/* =====================================================================
   RAY PARALLAX + EMAIL-SHELL DNA (2026-07-17)
   The standardized email templates (standardized-emails/main) are the
   brand's premium reference: deep-navy surfaces washed by the signature
   light-ray PNG (rayeffect-mw-fade), a gold hairline rail, gold
   underglow, and Outfit throughout. This layer ports that DNA to every
   public page and RETIRES the blurred "glowing orb" parallax circles in
   favour of the ray effect. Appended LAST so it wins the cascade.
   ADDITIVE ONLY — no markup, ids, or copy change.
   ===================================================================== */

/* --- 1) Hero orbs → RAY layers. The two .hero-orb divs (index, deals,
       cash-buyers, submit/advertise-your-deal) stop being blurred circles
       and become the brand ray wash rising from the hero floor. The PNG's
       strokes are white-on-transparency, so invert(1) turns them ink for
       the light hero and multiply sinks them into the gradient. The
       scroll-drift vars (--heroGlowX/Y) now pan the rays instead of the
       orbs, so the parallax survives — the orbs do not. Two layers pan in
       OPPOSING directions (same choreography the orbs had) for depth. --- */
body.public-body .hero-orb {
    filter: none;
    animation: none;
    border-radius: 0;
    mix-blend-mode: multiply;
}
body.public-body .hero-orb-1 {
    top: auto; left: 0; right: 0; bottom: -260px;
    width: auto; height: calc(88% + 260px);
    transform: translateY(calc(var(--raySlide, 0px) * 0.7));
    will-change: transform;
    background:
        none
        calc(50% + var(--rayPar, var(--heroGlowX, 0px))) 100%
        / cover no-repeat;
    filter: invert(1);
    opacity: 0.38;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 55%, transparent 96%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 55%, transparent 96%);
}
body.public-body .hero-orb-2 {
    top: auto; left: 0; right: 0; bottom: -260px;
    width: auto; height: calc(62% + 260px);
    transform: translateY(calc(var(--raySlide, 0px) * 0.4));
    will-change: transform;
    background:
        none
        calc(50% - var(--rayPar, var(--heroGlowX, 0px)) * 1.6) 100%
        / 140% auto no-repeat;
    filter: invert(1);
    opacity: 0.16;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 55%, transparent 96%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 55%, transparent 96%);
}

/* Hero background: the two giant navy "glow orb" radials (the layers the
   drift vars used to move) give way to a calmer light wash — the rays now
   carry the motion and the texture. A faint navy breath stays at the top
   corners so the hero keeps its depth. */
body.public-body .site-hero,
body.public-body .site-hero.hero-pattern {
    background-image:
        radial-gradient(circle 720px at 8% -14%, rgba(19, 67, 107, 0.16), transparent 58%),
        radial-gradient(circle 640px at 94% -10%, rgba(19, 67, 107, 0.12), transparent 60%),
        radial-gradient(circle 380px at 50% 55%, rgba(255, 255, 255, 0.66), transparent 70%),
        linear-gradient(180deg, #eef3f9 0%, #ffffff 50%, #ffffff 100%) !important;
}

/* --- 2) Navy bands: the blue corner-glow "orbs" in the band background
       become the email-header ray wash — rayeffect-mw-fade rising from the
       band floor over the same deep-navy gradient the emails use, still
       panning gently with scroll via the shared drift vars. --- */
body.public-body .section-band-navy,
body.public-body .how-buying-section,
body.public-body .recently-sold-section,
body.public-body .site-cta-band {
    background-image:
        radial-gradient(140% 130px at 50% 0%, rgba(238, 243, 249, 0.14), transparent 70%),
        radial-gradient(140% 120px at 50% 100%, rgba(238, 243, 249, 0.07), transparent 72%),
        linear-gradient(158deg, #0a1424 0%, #0b1f3d 44%, #13436b 74%, #13436b 100%) !important;
    /* The m-fade ray sheet CANNOT live in this stack: its pixels are pure
       black (alpha-only art), so screen-blending it here is a no-op. The
       rays ride an element layer below (::after / ::before) where invert()
       can lift them to light — same recipe as buyer-shared.js's card wash. */
    position: relative;
    isolation: isolate;
}
body.public-body .section-band-navy::after,
body.public-body .how-buying-section::after,
body.public-body .recently-sold-section::after,
body.public-body .site-cta-band::before {
    content: '' !important;
    position: absolute !important;
    /* BLACK rays (m-fade ink, no invert/screen — subtle by construction).
       260px overhang above AND below the band: the sheet TRANSLATES (GPU,
       per-frame smooth) with --raySlide from rayParallax() and can never
       expose a gap inside the visible band. Moving background-position
       (the old approach) both janked and slid the art off the band floor
       — exactly the "rays don't reach the bottom" symptom. */
    /* Bottom-only overhang — NO top overhang and NO overflow clip on the
       band: overflow:hidden amputated the seam-straddling stats bar's top
       half (the "rays over the stats bar" ghosting). Upward translate can
       lift the sheet's top past the band edge, so the mask kills the top
       quarter of the art outright; downward translate just vacates the
       (masked) top. Bleed below lands under the next section's opaque
       fill. --- */
    inset: 0 0 -260px 0 !important;
    height: auto !important;
    transform: translateY(var(--raySlide, 0px)) !important;
    will-change: transform;
    background:
        none calc(50% + var(--rayPar, 0px)) 100% / cover no-repeat,
        none calc(50% - var(--rayPar, 0px) * 1.6) 100% / 160% auto no-repeat !important;
    filter: none;
    mix-blend-mode: normal;
    opacity: 0.72;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 42%, transparent 74%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 42%, transparent 74%);
    box-shadow: none !important;
    pointer-events: none !important;
    z-index: -1 !important;
}
/* Stats band has no free pseudo (::before = border frame, ::after = inline
   hairline), so its ray sheet rides the inner container's ::before. */
body.public-body .stats-band-premium > div::before {
    content: '';
    position: absolute;
    inset: 0 0 -260px 0;
    transform: translateY(var(--raySlide, 0px));
    will-change: transform;
    background:
        none calc(50% + var(--rayPar, 0px)) 100% / cover no-repeat,
        none calc(50% - var(--rayPar, 0px) * 1.6) 100% / 160% auto no-repeat;
    opacity: 0.72;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 42%, transparent 74%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 42%, transparent 74%);
    pointer-events: none;
    z-index: -1;
}
/* Footer's m-fade ::after — full-bleed to the floor (the old 62%-height +
   Y-position parallax is why rays never reached the bottom). */
body.public-body .site-footer::after {
    filter: none;
    mix-blend-mode: normal;
    opacity: 0.72;
    top: 0;
    bottom: -260px;
    height: auto;
    transform: translateY(var(--raySlide, 0px));
    will-change: transform;
    background-position: calc(50% + var(--rayPar, 0px)) 100%;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 42%, transparent 74%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 42%, transparent 74%);
    animation: none;
}

/* Premium stats band (advertise-your-deal) trades its blue/violet orb
   radials for the same ray wash, so every dark band on the site shares
   one light source. */
body.public-body .stats-band-premium {
    background:
        radial-gradient(circle 600px at 88% -10%, rgba(136, 160, 194, 0.16), transparent 60%),
        linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 35%, #13436b 70%, #13436b 100%) !important;
}

/* --- 3) Footer joins the same family — the m-fade sheet, screen-blended,
       so footer, navy bands, and the admin sidebar all share one light
       source. --- */
body.public-body .site-footer {
    background:
        radial-gradient(circle 600px at 88% 0%, rgba(136, 160, 194, 0.16), transparent 60%),
        radial-gradient(circle 540px at 8% 100%, rgba(177, 29, 41, 0.14), transparent 60%),
        linear-gradient(135deg, #0b1f3d 0%, #0b1f3d 35%, #13436b 70%, #13436b 100%) !important;
}

/* --- 4) Gold rail (email DNA): every email opens on a 3px gold→red
       hairline above the navy header. The site now opens the same way — a
       2px gold gradient rail across the very top of the fixed nav. --- */
body.public-body .site-nav::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    /* Same navy→red→navy rail as the section borders, dimmed — the
       reading-progress bar fills over it at full strength. */
    background: linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%);
    opacity: 0.35;
    z-index: 3;
    pointer-events: none;
}
body.public-body .site-nav { position: fixed; }

/* --- 5) Eyebrows on navy bands read GOLD, exactly like the email header
       eyebrow ("JOE HOMEBUYER · …" in #e7c277) — uppercase, letterspaced,
       warm against the navy. Light-band eyebrows keep their crimson. --- */
body.public-body .section-band-navy .section-eyebrow,
body.public-body .how-buying-section .section-eyebrow,
body.public-body .recently-sold-section .section-eyebrow,
body.public-body .site-cta-band .section-eyebrow {
    color: #a86f00 !important;
    border-color: rgba(245, 179, 1, 0.32) !important;
    background: rgba(245, 179, 1, 0.08) !important;
    box-shadow:
        inset 0 0 0 1px rgba(245, 179, 1, 0.06),
        0 0 22px -2px rgba(245, 179, 1, 0.35) !important;
}
body.public-body .section-band-navy .section-eyebrow i,
body.public-body .how-buying-section .section-eyebrow i,
body.public-body .recently-sold-section .section-eyebrow i,
body.public-body .site-cta-band .section-eyebrow i {
    color: #a86f00 !important;
}

/* --- 6) CTA band gets the email newsletter-card treatment: a soft gold
       underglow around the band so the page's strongest ask carries the
       same warmth as the email's subscribe card. --- */
body.public-body .site-cta-band {
    box-shadow:
        0 0 34px 2px rgba(245, 179, 1, 0.22),
        0 -18px 40px -30px rgba(11, 31, 61, 0.5),
        0 18px 40px -30px rgba(11, 31, 61, 0.5);
}

/* --- 7) Primary CTA hover picks up a whisper of the email gold glow on
       top of its red shadow — the tell that this is THE action. --- */
body.public-body .btn-primary:hover,
body.public-body .site-button-primary:hover {
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.2),
        0 26px 44px -18px rgba(11, 31, 61, 0.6),
        0 0 24px -4px rgba(245, 179, 1, 0.4) !important;
}

/* --- 8) Reduced motion: rays hold still. --- */
@media (prefers-reduced-motion: reduce) {
    body.public-body .hero-orb-1,
    body.public-body .hero-orb-2 {
        background-position: 50% 100%;
    }
}

/* --- 9) WHITE sections get their own ray wash — clearly visible, rising
       from the section floor like the navy bands, but inked (invert) so it
       reads on light ground. The TOP hero is untouched (its rays live on
       the .hero-orb divs above). Each section isolates its stacking
       context so the z:-1 pseudo sits above the white fill but under all
       content — rays never wash over the copy. --- */
body.public-body [data-home-section="faq"],
body.public-body [data-home-section="trust-bar"],
body.public-body section[aria-labelledby="areas-heading"] {
    position: relative;
    isolation: isolate;
}
body.public-body [data-home-section="why-us"]::before,
body.public-body [data-home-section="faq"]::before,
body.public-body [data-home-section="trust-bar"]::before,
body.public-body section[aria-labelledby="areas-heading"]::before {
    content: '' !important;
    position: absolute !important;
    inset: 0 0 -260px 0 !important;
    width: auto !important;
    height: auto !important;
    border-radius: 0 !important;
    transform: translateY(var(--raySlide, 0px)) !important;
    will-change: transform;
    animation: none !important;
    box-shadow: none !important;
    /* Pre-inked ray asset (same one deal-detail uses over light ground) —
       a CSS invert() filter here forced enormous compositor layers and
       black-frame paints, so the dark variant ships in the pixels. */
    /* Two sheets at different scales/phases melt into one field (same
       seamless-depth recipe as the navy bands); the long four-stop mask
       dissolves them into the section instead of cutting off. Translate-
       driven parallax with 260px overhang — gaps impossible in-section. */
    background:
        none calc(50% + var(--rayPar, 0px)) 100% / cover no-repeat !important;
    background-image:
        none,
        none !important;
    background-position:
        calc(50% + var(--rayPar, 0px)) 100%,
        calc(50% - var(--rayPar, 0px) * 1.6) 100% !important;
    background-size: cover, 165% auto !important;
    background-repeat: no-repeat !important;
    filter: none !important;
    opacity: 0.17;
    mix-blend-mode: multiply !important;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 28%, rgba(0, 0, 0, 0.45) 58%, transparent 76%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 28%, rgba(0, 0, 0, 0.45) 58%, transparent 76%);
    pointer-events: none !important;
    z-index: -1 !important;
}
/* (No overflow clip here — bottom-only overhang + the top mask keep the
   sheets contained; a clip would amputate any content straddling the
   section edge, exactly the stats-bar bug on the how-buying band.) */

/* --- 9a) DELETED 2026-07-30. This was the "steps on navy bands → WHITE
       cards" pass (brand call 2026-07-18), superseded by the card-free
       rail at the bottom of this file. It could not simply be ignored:
       every declaration carried !important, and `.how-buying-section
       .step-node:hover` (0,4,1) outranks the final pass's `.steps-track
       .step-node` (0,3,1). The non-hover half was beaten on source order,
       so nodes looked correct AT REST and then flipped to a solid white
       square-cornered slab the moment the pointer touched one — white
       title text on a white fill, i.e. the label vanished. --- */

/* --- 9a2) DELETED 2026-08-02. This was the first /match quiz pass, written
       against IDs (#quizCard, #qCounties, #qTypes). The quiz is now a proper
       component — see the BUY-BOX MATCH QUIZ block at the bottom of this
       file — and an ID rule outranks every class in it, so this block was
       not dead weight, it was actively winning: `#qCounties{justify-content:
       center}` beat `.quiz-chips{flex-start}` and kept painting the ragged
       centered pyramid the redesign existed to fix. The gold hairline rail
       (email DNA, brand call 2026-07-18) survived the move and now lives on
       `.quiz-card::before`. --- */

/* --- 9k) White-section ray anchor fix: the bottom overhang buried the
       art's bright base 260px below the section, so tall sections (NC
       areas) showed rays fading out HALFWAY down. Overhang now equals the
       max upward translate (170px) — the glow hugs the floor and can
       still never expose a gap. --- */
body.public-body [data-home-section="why-us"]::before,
body.public-body [data-home-section="faq"]::before,
body.public-body [data-home-section="trust-bar"]::before,
body.public-body section[aria-labelledby="areas-heading"]::before {
    inset: 0 0 -170px 0 !important;
}

/* --- 9l) SSR stats bar (locations / strategy pages) straddles the
       section boundary like the homepage seam: the -mt-10 wrapper deepens
       to half the bar's height, and the bar's opaque fill hides the rail
       passing behind it. Homepage's absolute seam is excluded. --- */
body.public-body section > div:has(> .stats-bar):not(.hero-stats-seam) {
    margin-top: -3.4rem !important;
    position: relative;
    z-index: 20;
}
/* The stats-bar section already carries the seam rail across its own top edge
   (the bar straddles it). The NEXT section's rail then landed ~110px below it
   and read as a doubled rule under the bar — drop that lower one. */
body.public-body main section:has(> div > .stats-bar) + section {
    border-top: 0 !important;
    border-image: none !important;
}
/* When a navy band follows the SSR stats bar directly (market-index "gathering
   data" state), the bar's opaque cards would otherwise butt straight against the
   navy edge. Every other SSR page buffers the bar with a pt-12 content section;
   give this seam the same breathing room so the container never looks cramped. */
body.public-body section:has(> div > .stats-bar) + .section-band-navy {
    margin-top: 3.25rem;
}

/* --- 9m) Navy CTA cards (locations "Get NC deals before they go
       public", strategy-page match panels) go premium: ray wash, crisp
       light border, gold underglow. Matched by their inline navy
       gradient. --- */
body.public-body [style*="#0f2440"] {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    border: 2.5px solid rgba(255, 255, 255, 0.14);
    box-shadow:
        0 24px 48px -24px rgba(11, 31, 61, 0.55),
        0 0 30px 2px rgba(245, 179, 1, 0.18);
}
body.public-body [style*="#0f2440"]::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
        none 50% 100% / cover no-repeat,
        none 30% 100% / 160% auto no-repeat;
    opacity: 0.6;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 45%, transparent 85%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 45%, transparent 85%);
    pointer-events: none;
    z-index: -1;
}

/* --- 9n) White premium button, universally: the .btn-outline treatment
       ("How It Works" on sell-your-deal) extends to every dark CTA panel
       so white buttons read identically sitewide — including the
       Ready-to-Partner panel and its trust chips. --- */
body.public-body .site-cta-panel .btn-outline,
body.public-body [style*="#0f2440"] .btn-outline {
    background: linear-gradient(135deg, rgba(54, 89, 141, 0.16), rgba(255, 255, 255, 0.05)) !important;
    border: 1px solid rgba(255, 255, 255, 0.24) !important;
    color: #ffffff !important;
}
body.public-body .site-cta-panel .btn-outline::before,
body.public-body [style*="#0f2440"] .btn-outline::before {
    background: linear-gradient(180deg, #88a0c2, #36598d) !important;
    box-shadow: 0 0 16px rgba(54, 89, 141, 0.6) !important;
}
/* Opt back out of the glass: a secondary action that must read as the solid
   white brand slab even on a dark CTA panel. Same values as the base
   .btn-outline further down, so the two stay one button. */
body.public-body .site-cta-panel .btn-outline.btn-outline-white,
body.public-body [style*="#0f2440"] .btn-outline.btn-outline-white {
    background: linear-gradient(180deg, #ffffff 0%, #ffffff 52%, #eef3f9 100%) !important;
    border: 1px solid rgba(11, 31, 61, 0.16) !important;
    color: #0b1f3d !important;
}
body.public-body .site-cta-panel .btn-outline.btn-outline-white::before,
body.public-body [style*="#0f2440"] .btn-outline.btn-outline-white::before {
    background: linear-gradient(180deg, #13436b 0%, #13436b 50%, #0b1f3d 100%) !important;
    box-shadow: 0 0 10px rgba(11, 31, 61, 0.35) !important;
}

/* --- 9o) FAQ everywhere animates open/close cheaply. The homepage
       already runs the 0fr→1fr grid animation; legacy pages (coaching,
       sell-your-deal, deals) toggled `hidden` — public-nav.js now swaps
       that for the class below, and max-height+opacity transition on the
       answer costs one layout, no per-frame JS. The crimson accent bar
       rides site-faq-item permanently, same as .faq-item. --- */
body.public-body .site-faq-answer {
    display: block !important;
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    transition: opacity 220ms ease;
}
body.public-body .site-faq-item-open .site-faq-answer {
    opacity: 1;
}
body.public-body .site-faq-item { position: relative; overflow: hidden; }
body.public-body .site-faq-item::before {
    content: '' !important;
    position: absolute !important;
    left: 0 !important;
    top: 0 !important;
    bottom: 0 !important;
    width: 3px !important;
    height: auto !important;
    border-radius: 3px !important;
    background: linear-gradient(180deg, #d93240 0%, #b11d29 55%, #b11d29 100%) !important;
    transform: scaleY(1) !important;
    opacity: 0.85 !important;
    transition: opacity 220ms ease, box-shadow 220ms ease !important;
    z-index: 2;
    pointer-events: none;
}
body.public-body .site-faq-item-open::before {
    opacity: 1 !important;
    box-shadow: 0 0 12px rgba(177, 29, 41, 0.4);
}
body.public-body .site-faq-item .site-faq-trigger svg,
body.public-body .site-faq-item .site-faq-trigger i {
    transition: transform 300ms cubic-bezier(0.22, 1, 0.36, 1);
}
body.public-body .site-faq-item-open .site-faq-trigger svg,
body.public-body .site-faq-item-open .site-faq-trigger i {
    transform: rotate(180deg);
}

/* --- 9p) Coaching: bundle card + What's-Included cards go premium.
       .card-hover white cards get the premium frame + slate glow
       universally (coaching, locations strategy cards, etc.). --- */
body.public-body .coaching-bundle-card {
    isolation: isolate;
    border: 2.5px solid rgba(255, 255, 255, 0.16);
    box-shadow:
        0 28px 56px -24px rgba(11, 31, 61, 0.6),
        0 0 30px 2px rgba(245, 179, 1, 0.22);
}
body.public-body .coaching-bundle-card::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    overflow: hidden;
    background: none 50% 100% / cover no-repeat;
    opacity: 0.55;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, #000000 45%, transparent 88%);
    mask-image: linear-gradient(to top, #000000 0%, #000000 45%, transparent 88%);
    pointer-events: none;
    z-index: -1;
}
body.public-body .coaching-bundle-card button {
    position: relative;
    overflow: hidden;
    border-radius: 12px !important;
    background: linear-gradient(180deg, #ffffff 0%, #eef3f9 100%) !important;
    border: 1px solid rgba(10, 20, 36, 0.1) !important;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9), 0 14px 30px -14px rgba(11, 31, 61, 0.55) !important;
    transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 220ms ease !important;
}
body.public-body .coaching-bundle-card button::before {
    content: '';
    position: absolute;
    left: 0; top: 0.7rem; bottom: 0.7rem;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #36598d, #13436b);
    box-shadow: 0 0 14px rgba(11, 31, 61, 0.4);
}
body.public-body .coaching-bundle-card button:hover {
    transform: translateY(-2px);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.95), 0 20px 38px -16px rgba(11, 31, 61, 0.6) !important;
}
body.public-body .card-hover.bg-white {
    border: 1px solid rgba(19, 67, 107, 0.12) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.95),
        0 14px 22px -14px rgba(223, 232, 243, 0.75),
        0 22px 34px -16px rgba(136, 160, 194, 0.45) !important;
    transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 240ms ease, border-color 240ms ease !important;
}
body.public-body .card-hover.bg-white:hover {
    transform: translateY(-4px);
    border-color: rgba(245, 179, 1, 0.55) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 1),
        0 18px 26px -14px rgba(223, 232, 243, 0.85),
        0 0 26px 2px rgba(245, 179, 1, 0.28) !important;
}

/* --- 9q) Homepage Why-Us cards centre their icons, coaching-style. --- */
body.public-body [data-home-section="why-us"] .feature-card {
    text-align: center;
}
body.public-body [data-home-section="why-us"] .feature-card .feature-icon-wrap {
    margin-left: auto;
    margin-right: auto;
}

/* --- 9r) Sell-your-deal: analyzer + tracker shells premium; stats-band
       bottom border matches the red-centred rail above it. --- */
body.public-body .deal-tracker-shell,
body.public-body #deal-analyzer .rounded-\[32px\],
body.public-body #deal-analyzer [class*="rounded-3xl"] {
    border: 2.5px solid rgba(19, 67, 107, 0.14);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 18px 30px -18px rgba(136, 160, 194, 0.55),
        0 30px 56px -28px rgba(11, 31, 61, 0.3);
}
body.public-body .stats-band-premium::before {
    background:
        linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%) top / 100% 3px no-repeat,
        linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%) bottom / 100% 3px no-repeat !important;
}

/* --- 9s) /deals: the filter surface straddles the hero/results border so
       the rail passes through its middle, BEHIND it; deal cards get the
       premium frame, an ink-ray body wash, and a premium View-Details
       row. Applies to the homepage rail cards too — one card language. --- */
body.public-body .deals-filter-surface {
    position: relative;
    z-index: 6;
    transform: translateY(1.6rem);
}
body.public-body .deals-results-section {
    padding-top: 3.2rem;
}
body.public-body .deal-card {
    border: 2.5px solid rgba(19, 67, 107, 0.14) !important;
}
body.public-body .deal-card > .p-6,
body.public-body .deal-card .deal-rail-body {
    background-color: #ffffff;
    background-image:
        linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)),
        none;
    background-position: center, 50% 100%;
    background-size: auto, cover;
    background-repeat: no-repeat;
    background-blend-mode: normal, multiply;
}
body.public-body .deal-card-cta {
    position: relative;
    overflow: hidden;
    border: 1px solid rgba(19, 67, 107, 0.42) !important;
    border-radius: 12px !important;
    background: linear-gradient(140deg, #0b1f3d 0%, #13436b 44%, #36598d 74%, #36598d 100%) !important;
    color: #ffffff !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.16),
        0 12px 24px -10px rgba(11, 31, 61, 0.5) !important;
    transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 180ms ease, filter 180ms ease;
}
body.public-body .deal-card-cta::before {
    content: '';
    position: absolute;
    left: 0; top: 0.6rem; bottom: 0.6rem;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #88a0c2, #13436b);
    box-shadow: 0 0 14px rgba(54, 89, 141, 0.6);
    pointer-events: none;
}
body.public-body .deal-card-cta,
body.public-body .deal-card-cta .text-secondary,
body.public-body .deal-card-cta .text-slate-400 {
    color: #ffffff !important;
}
body.public-body .deal-card:hover .deal-card-cta {
    transform: translateY(-1px);
    filter: brightness(1.06);
}

/* --- 9t) Icon fills: the bell on "Get Deal Alerts" and the grid on
       "View All Deals" render solid red inside white buttons. --- */
body.public-body .btn-white .lucide-bell,
body.public-body .btn-outline .lucide-bell {
    fill: currentColor;
}
body.public-body .btn-white .lucide-layout-grid rect,
body.public-body .btn-white .lucide-layout-grid path,
body.public-body .btn-outline .lucide-layout-grid rect,
body.public-body .btn-outline .lucide-layout-grid path {
    fill: currentColor;
}

/* --- 9i) Footer "Save Contact" button joins the premium button system —
       same glossy crimson skin, hairline border, inset highlight, and
       glowing accent edge as .btn-primary everywhere else. --- */
body.public-body .site-footer-button {
    position: relative !important;
    overflow: hidden !important;
    border-radius: 12px !important;
    background: linear-gradient(135deg, #b11d29 0%, #8f0f1c 100%) !important;
    border: 1px solid rgba(255, 255, 255, 0.14) !important;
    letter-spacing: -0.005em !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.16),
        0 18px 30px -14px rgba(11, 31, 61, 0.5) !important;
    transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 240ms ease, filter 240ms ease !important;
}
body.public-body .site-footer-button::before {
    content: '';
    position: absolute;
    left: 0; top: 0.7rem; bottom: 0.7rem;
    width: 3px;
    border-radius: 999px;
    background: linear-gradient(180deg, #f7dadd, #d93240);
    box-shadow: 0 0 16px rgba(217, 50, 64, 0.6);
    opacity: 0.95;
    z-index: 2;
    pointer-events: none;
}
body.public-body .site-footer-button:hover {
    transform: translateY(-2px) !important;
    filter: brightness(1.05);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.2),
        0 26px 44px -18px rgba(11, 31, 61, 0.6),
        0 0 24px -4px rgba(245, 179, 1, 0.4) !important;
}

/* --- 9j) DELETED 2026-07-30. The "steps track inner frame" glass shell.
       The final pass already nulls its background, border and shadow, so
       nothing of it was visible — but its `padding: 1.1rem` survived on a
       (0,3,1) selector that outranks the final pass's `padding: 0`. Padding
       does not move absolutely-positioned children, so it pushed the five
       nodes down 1.1rem while leaving the rail (::before, top: 1.45rem =
       half a disc) where it was: the connector line sat 17.6px high,
       skimming the top edge of every disc instead of running through
       their centres. --- */

/* --- 9h) Stats bar goes OPAQUE. It was frosted glass (rgba .85 +
       backdrop-blur), so the hero/band ray sheets read straight through
       it and washed the figures out. Solid white matches the step cards;
       the frosted look is not worth unreadable numbers. --- */
body.public-body .stats-bar {
    background: linear-gradient(180deg, #ffffff 0%, #eef3f9 100%) !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
}

/* --- 9g) Deal cards (the money surface): hover picks up the brand-gold
       edge + warm glow the homepage deal rail already carries, so every
       deal grid sitewide sells with the same premium tell. --- */
body.public-body .deal-card:hover {
    border-color: rgba(245, 179, 1, 0.55) !important;
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.95) inset,
        0 22px 46px -22px rgba(11, 31, 61, 0.42),
        0 0 26px 2px rgba(245, 179, 1, 0.28) !important;
}

/* --- 9f) Account pages (login / register / verify / profile) join the
       premium system: faint ink-ray wash rising from the page floor, and
       the auth card trades its old red→navy rail for the email-DNA gold
       rail + deeper layered shadow with a warm under-glow. --- */
body.public-body[data-account-page] {
    position: relative;
}
body.public-body[data-account-page]::after {
    content: '';
    position: fixed;
    left: 0; right: 0; bottom: 0;
    height: 46vh;
    background: none 50% 100% / cover no-repeat;
    opacity: 0.1;
    mix-blend-mode: multiply;
    -webkit-mask-image: linear-gradient(to top, #000000 0%, transparent 92%);
    mask-image: linear-gradient(to top, #000000 0%, transparent 92%);
    pointer-events: none;
    z-index: 0;
}
body.public-body[data-account-page] main { position: relative; z-index: 1; }
body.public-body[data-account-page] .auth-card {
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.04),
        0 24px 64px -20px rgba(11, 31, 61, 0.16),
        0 0 26px -6px rgba(245, 179, 1, 0.28);
}
body.public-body[data-account-page] .auth-card::before {
    background: linear-gradient(90deg, #f5b301 0%, #f5b301 45%, #d93240 100%);
}

/* --- 9e) Mobile perf guard: under 768px the ray sheets hold still — no
       per-frame transforms, no composited layers kept alive. The rays
       themselves stay (static), scroll stays native-cheap. rayParallax()
       mirrors this guard in JS so the vars aren't even computed. --- */
@media (max-width: 767px) {
    body.public-body .section-band-navy::after,
    body.public-body .how-buying-section::after,
    body.public-body .recently-sold-section::after,
    body.public-body .site-cta-band::before,
    body.public-body .stats-band-premium > div::before,
    body.public-body .site-footer::after,
    body.public-body [data-home-section="why-us"]::before,
    body.public-body [data-home-section="faq"]::before,
    body.public-body [data-home-section="trust-bar"]::before,
    body.public-body section[aria-labelledby="areas-heading"]::before,
    body.public-body .hero-orb-1,
    body.public-body .hero-orb-2 {
        transform: none !important;
        will-change: auto !important;
    }
}

/* --- 9d) Scroll-reveal: cards, steps, and FAQ rows rise softly into view
       as they enter the viewport. ncddReveal() (public-nav.js) stamps
       .ncdd-reveal on eligible elements and .is-revealed when they cross
       the threshold, with a per-sibling stagger via --revealDelay. Without
       JS (or with reduced motion) nothing is ever hidden. --- */
body.public-body .ncdd-reveal {
    opacity: 0;
    transform: translateY(22px);
    transition:
        opacity 640ms cubic-bezier(0.22, 1, 0.36, 1) var(--revealDelay, 0ms),
        transform 640ms cubic-bezier(0.22, 1, 0.36, 1) var(--revealDelay, 0ms);
    will-change: opacity, transform;
}
body.public-body .ncdd-reveal.is-revealed {
    opacity: 1;
    transform: none;
    will-change: auto;
}
@media (prefers-reduced-motion: reduce) {
    body.public-body .ncdd-reveal {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }
}

/* --- 9c) FAQ containers, every page: the crimson accent bar rides the
       left edge PERMANENTLY (collapsed and expanded — brand call
       2026-07-18); opening brightens it and adds a soft red bloom. Covers
       both FAQ systems: the static pages' div.faq-item (is-open) and the
       worker SEO shell's details.faq-item ([open]). overflow:hidden keeps
       the bar inside the rounded corners. --- */
body.public-body .faq-item {
    overflow: hidden;
}
body.public-body .faq-item::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    border-radius: 3px;
    background: linear-gradient(180deg, #d93240 0%, #b11d29 55%, #b11d29 100%);
    transform: scaleY(1) !important;
    opacity: 0.85 !important;
    transition: opacity 220ms ease, box-shadow 220ms ease;
    z-index: 2;
    pointer-events: none;
}
body.public-body .faq-item.is-open::before,
body.public-body details.faq-item[open]::before {
    opacity: 1 !important;
    box-shadow: 0 0 12px rgba(177, 29, 41, 0.4);
}

/* --- 9b) Smooth scrolling, site-wide — ANCHOR/PROGRAMMATIC JUMPS ONLY.
       The wheel is left NATIVE on purpose: a JS wheel lerp that calls
       scrollTo() per frame inherits this property and re-eases on every
       frame, which is what made scrolling feel sluggish and rubbery.
       Reduced motion keeps instant jumps. --- */
html {
    scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
}

/* Gold reading-progress rail: sits on the nav's gold hairline and fills
   left→right as you move down the page. public-nav.js writes scaleX()
   directly onto this element — NOT a --scrollProg custom property on
   <html>, which inherits and so restyled the whole document every frame. */
body.public-body .ncdd-scroll-progress {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 3px;
    transform: scaleX(0);
    transform-origin: 0 50%;
    will-change: transform;
    /* Matches the section-border rail exactly; the scaleX fill reveals it
       over the nav's dimmed copy of the same gradient. */
    background: linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%);
    box-shadow: 0 0 12px rgba(177, 29, 41, 0.4);
    z-index: 60;
    pointer-events: none;
}

/* --- 10) A border between EVERY section. The navy bands already frame
       themselves with the 3px navy→red→navy gradient (top + bottom), and
       .dd-section-border-b sections draw their own bottom rail — so the
       only naked junctions are section-follows-section where neither side
       owns a border (e.g. trust bar → NC areas). Give every following
       section the same 3px gradient as a border-image top rail, then
       remove it wherever the PRECEDING section already drew that line, so
       no junction ever doubles up. --- */
body.public-body main section:not(.section-band-navy):not(.how-buying-section):not(.recently-sold-section):not(.site-cta-band):not(.stats-band-premium):not(.dd-section-border-b) + section:not(.section-band-navy):not(.how-buying-section):not(.recently-sold-section):not(.site-cta-band):not(.stats-band-premium),
body.public-body main > div + section:not(.section-band-navy):not(.site-cta-band):not(.stats-band-premium) {
    border-top: 3px solid transparent;
    border-image: linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%) 1;
}

/* ...except the trust bar, which the rule above can never reach. On every page
   that has no homepage-style trust-bar section, public-nav.js INJECTS one as a
   sibling of .site-footer — i.e. outside <main> — so `main section + section`
   does not see it, and the last content section on a page usually does not own a
   bottom rail either. Measured naked on seven pages (advertise-your-deal,
   cash-buyers, coaching, faq, privacy-policy, submit-your-deal,
   terms-of-service): the bar just floated off the end of the page.

   Same 3px gradient, then cancelled wherever the thing above it ALREADY draws
   that line, so no junction doubles up. Two cancel groups because the bar has
   two shapes: injected outside main (its previous SIBLING is <main>, so the
   check has to reach inside via :has) and static inside main on the homepage,
   where an ordinary adjacent-sibling check works. */
body.public-body [data-home-section="trust-bar"] {
    border-top: 3px solid transparent;
    border-image: linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%) 1;
}
body.public-body main:has(> :last-child.dd-section-border-b) + [data-home-section="trust-bar"],
body.public-body main:has(> :last-child.section-band-navy) + [data-home-section="trust-bar"],
body.public-body main:has(> :last-child.site-cta-band) + [data-home-section="trust-bar"],
body.public-body main:has(> :last-child.stats-band-premium) + [data-home-section="trust-bar"],
body.public-body main:has(> :last-child.how-buying-section) + [data-home-section="trust-bar"],
body.public-body main:has(> :last-child.recently-sold-section) + [data-home-section="trust-bar"],
body.public-body .dd-section-border-b + [data-home-section="trust-bar"],
body.public-body .section-band-navy + [data-home-section="trust-bar"],
body.public-body .site-cta-band + [data-home-section="trust-bar"],
body.public-body .stats-band-premium + [data-home-section="trust-bar"],
body.public-body .how-buying-section + [data-home-section="trust-bar"],
body.public-body .recently-sold-section + [data-home-section="trust-bar"] {
    border-top: 0;
    border-image: none;
}

/* ─────────────────────────────────────────────────────────────────────────
   9u) Buyer-form + floating-widget polish batch (2026-07-18c)
   ───────────────────────────────────────────────────────────────────────── */

/* Stay-in-touch prompt + "Get First Look" bubble lift ABOVE the translate
   pill (.ncdd-lang-switch: fixed bottom-left, ~44px trigger + 16px inset,
   z-index 9998) — the pill was stacking on top of them in the same corner. */
body.public-body .buyer-stay-connected,
body.public-body .buyer-stay-bubble {
    bottom: calc(var(--public-floating-inset-y) + 3.9rem);
}
@media (max-width: 768px) {
    body.public-body .buyer-stay-connected,
    body.public-body .buyer-stay-bubble {
        bottom: calc(0.75rem + 3.6rem + env(safe-area-inset-bottom));
    }
}

/* Stay-in-touch box joins the premium system: gold email-DNA top rail,
   opaque layered surface, warm under-glow. overflow:hidden keeps the rail
   inside the rounded corners. */
body.public-body .buyer-stay-connected {
    overflow: hidden;
    border: 1px solid rgba(19, 67, 107, 0.16);
    background: linear-gradient(180deg, #ffffff 0%, #eef3f9 100%);
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.05),
        0 28px 56px -18px rgba(11, 31, 61, 0.28),
        0 0 24px -6px rgba(245, 179, 1, 0.3);
}
body.public-body .buyer-stay-connected::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    /* Section-border rail: fades in from the edges, navy → red → navy. */
    background: linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%);
    z-index: 2;
    pointer-events: none;
}

/* Its "Share My Info" button takes the premium crimson skin
   (.site-footer-button idiom: glossy gradient, hairline border, inset
   highlight, gold hover glow). background is set on :hover too so the old
   hover:bg-red-700 utility never shows through. */
body.public-body #buyerStayConnectedBtn {
    position: relative;
    overflow: hidden;
    border-radius: 12px;
    background: linear-gradient(135deg, #b11d29 0%, #8f0f1c 100%);
    border: 1px solid rgba(255, 255, 255, 0.14);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.16),
        0 18px 30px -14px rgba(11, 31, 61, 0.5);
    transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 240ms ease, filter 240ms ease;
}
body.public-body #buyerStayConnectedBtn:hover {
    transform: translateY(-2px);
    filter: brightness(1.05);
    background: linear-gradient(135deg, #b11d29 0%, #8f0f1c 100%);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.2),
        0 26px 44px -18px rgba(11, 31, 61, 0.6),
        0 0 24px -4px rgba(245, 179, 1, 0.4);
}

/* Collapsed "Get First Look" bubble matches: opaque premium surface,
   navy hairline, gold hover edge. */
body.public-body .buyer-stay-bubble {
    border: 1px solid rgba(19, 67, 107, 0.16);
    background: linear-gradient(180deg, #ffffff 0%, #eef3f9 100%);
}
body.public-body .buyer-stay-bubble:hover {
    border-color: rgba(245, 179, 1, 0.55);
    box-shadow:
        0 28px 46px rgba(11, 31, 61, 0.16),
        0 0 22px -4px rgba(245, 179, 1, 0.35);
}

/* First Look / Matched Deals / Fast Alerts / No Fees chips go SOLID with
   black text — every variant: copy chips (light + dark), the preview-card
   signal row, and the homepage band signals (whose older rules carry
   !important, hence the matching flags here). */
body.public-body .buyer-network-copy-chip.is-light,
body.public-body .buyer-network-copy-chip.is-dark,
body.public-body .buyer-network-preview-signal,
body.public-body .buyer-network-home-signal {
    background: #ffffff !important;
    border: 1px solid rgba(136, 160, 194, 0.5) !important;
    color: #0f1c33 !important;
    box-shadow: 0 10px 18px rgba(11, 31, 61, 0.14), inset 0 1px 0 #ffffff !important;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
}

/* Buyer-form containers lose their hard edges sitewide: the 0.5rem-radius
   chips/badges become full pills to match the premium card language. */
body.public-body .buyer-network-copy-chip,
body.public-body .buyer-network-preview-signal,
body.public-body .buyer-network-preview-action,
body.public-body .buyer-network-preview-badge,
body.public-body .buyer-pref-pill {
    border-radius: 9999px;
}

/* Megaphone on "Submit Your Deal" fills solid, same treatment as the bell
   and layout-grid icons in white buttons. */
body.public-body .btn-white .lucide-megaphone,
body.public-body .btn-outline .lucide-megaphone {
    fill: currentColor;
}

/* ─────────────────────────────────────────────────────────────────────────
   9v) Investor Newsletter band + trust-bar unification (2026-07-18d)
   ───────────────────────────────────────────────────────────────────────── */

/* The band itself rides .section-band-navy (navy gradient, black ray sheet,
   parallax, 3px navy→red→navy rails top+bottom) — which is also what fixes
   the naked seam it used to have against the trust bar. The shell is the
   glass inner frame idiom from the steps track. */
body.public-body .investor-news-shell {
    padding: 2.4rem 1.9rem 2.1rem;
    border-radius: 16px;
    border: 2.5px solid rgba(255, 255, 255, 0.16);
    background: linear-gradient(160deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.015));
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.07),
        0 18px 40px -28px rgba(11, 31, 61, 0.45),
        0 0 30px -8px rgba(245, 179, 1, 0.25);
}

body.public-body .investor-news-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 1rem;
    padding: 0.42rem 1rem;
    border-radius: 9999px;
    background: rgba(245, 179, 1, 0.12);
    border: 1px solid rgba(245, 179, 1, 0.35);
    color: #a86f00;
    font-size: 0.72rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.16em;
}

body.public-body .investor-news-input {
    padding: 0.95rem 1.3rem;
    border-radius: 12px;
    border: 1px solid rgba(255, 255, 255, 0.22);
    background: rgba(255, 255, 255, 0.96);
    color: #0f1c33;
    outline: none;
    box-shadow: inset 0 1px 2px rgba(11, 31, 61, 0.08);
    transition: border-color 180ms ease, box-shadow 180ms ease;
}
body.public-body .investor-news-input:focus {
    border-color: rgba(245, 179, 1, 0.75);
    box-shadow:
        inset 0 1px 2px rgba(11, 31, 61, 0.08),
        0 0 0 3px rgba(245, 179, 1, 0.3);
}

/* Subscribe Free — the band's money button: glossy GOLD with a glow.
   Same premium frame language as the crimson system (hairline border,
   inset highlight, lift on hover), gold email-DNA palette. */
body.public-body .investor-news-subscribe {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.95rem 1.9rem;
    border-radius: 12px;
    border: 1px solid rgba(255, 245, 224, 0.55);
    background: linear-gradient(135deg, #ffc933 0%, #f5b301 40%, #f5b301 100%);
    color: #0b1f3d;
    font-weight: 800;
    font-size: 1rem;
    letter-spacing: -0.005em;
    cursor: pointer;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.5),
        0 18px 30px -14px rgba(11, 31, 61, 0.55),
        0 0 26px -2px rgba(245, 179, 1, 0.55);
    transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 240ms ease, filter 240ms ease;
}
body.public-body .investor-news-subscribe:hover {
    transform: translateY(-2px);
    filter: brightness(1.05);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.55),
        0 26px 44px -18px rgba(11, 31, 61, 0.6),
        0 0 36px 0 rgba(245, 179, 1, 0.7);
}

body.public-body .investor-news-proof {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.5rem 1.6rem;
    margin-top: 1.4rem;
    color: rgba(255, 255, 255, 0.62);
    font-size: 0.8rem;
    font-weight: 600;
}
body.public-body .investor-news-proof span {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
}
body.public-body .investor-news-proof i,
body.public-body .investor-news-proof svg {
    color: #a86f00;
}

/* ── Trust bar icons: see public-icons-solid.js — the glyphs are genuinely filled now,
   so the sub-path fill/stroke hacks that used to fake it are gone. */

/* ─────────────────────────────────────────────────────────────────────────
   9w) Deals filter rail redo + buyer-form edge unification (2026-07-18e)
   ───────────────────────────────────────────────────────────────────────── */

/* The filter bar's "line through the middle" take 2. The old build had
   THREE different lines (the seam's faint gray hairline, the results
   section's border-image rail, and a translateY'd surface that matched
   neither). Now: the surface sits where it renders (no transform), the
   seam draws ONE 3px section rail dead-center behind the bar, and the
   results section stops drawing its own competing top rail. */
body.public-body.deals-page .deals-filter-surface {
    transform: none !important;
}
body.public-body.deals-page .deals-results-section {
    border-top: none !important;
    border-image: none !important;
    padding-top: 2.6rem !important;
}
body.public-body.deals-page .deals-filter-seam {
    margin-top: -2.6rem;
}
body.public-body.deals-page .deals-filter-seam::before {
    top: calc(50% - 1.5px);
    height: 3px;
    left: 0;
    right: 0;
    background: linear-gradient(90deg, rgba(54, 89, 141, 0) 0%, #36598d 12%, #b11d29 50%, #36598d 88%, rgba(54, 89, 141, 0) 100%);
    box-shadow: 0 0 12px rgba(177, 29, 41, 0.3);
}

/* Cash-buyer forms, one shared edge language everywhere (cash-buyers page,
   deals expanded form, deal-detail form, address-unlock modal): text-ish
   inputs and selects get the same 1rem premium rounding, choice cards get
   1.1rem, and the submit stays on the 1rem+ pill family — no more mixed
   0.5–0.75rem "squared" corners between pages. */
body.public-body .cash-buyers-form input[type="text"],
body.public-body .cash-buyers-form input[type="tel"],
body.public-body .cash-buyers-form input[type="email"],
body.public-body .cash-buyers-form select,
body.public-body .buyers-panel input[type="text"],
body.public-body .buyers-panel input[type="tel"],
body.public-body .buyers-panel input[type="email"],
body.public-body .buyers-panel select {
    border-radius: 12px !important;
}
body.public-body .cash-buyers-form .buyer-chip-option,
body.public-body .cash-buyers-form .buyer-chip-grid > label,
body.public-body .buyers-panel .buyer-chip-option,
body.public-body .buyers-panel .buyer-chip-grid > label {
    border-radius: 12px !important;
}
body.public-body .cash-buyers-form .buyer-pref-card {
    border-radius: 16px !important;
}
body.public-body .cash-buyers-form button[type="submit"] {
    border-radius: 16px !important;
}

/* =====================================================================
   TRUST BAR — FILLED ICONS + UNDERGLOW (2026-07-19)
   One canonical trust-bar icon treatment sitewide: solid brand-colored
   glyphs with a color-matched underglow (same design as the auth pages'
   .auth-trust). Used by the homepage static bar and the public-nav.js
   injected copy.
   ===================================================================== */
body.public-body .trust-glow-emerald svg,
body.public-body .trust-glow-emerald i { filter: drop-shadow(0 2px 6px rgba(22, 163, 74, 0.55)); }
body.public-body .trust-glow-crimson svg,
body.public-body .trust-glow-crimson i { filter: drop-shadow(0 2px 6px rgba(177, 29, 41, 0.50)); }
body.public-body .trust-glow-gold svg,
body.public-body .trust-glow-gold i { filter: drop-shadow(0 2px 6px rgba(245, 179, 1, 0.60)); }
body.public-body .trust-glow-navy svg,
body.public-body .trust-glow-navy i { filter: drop-shadow(0 2px 6px rgba(19, 67, 107, 0.50)); }

/* Newsletter proof chips (deals page navy band) — same underglow family. */
body.public-body .investor-news-proof i,
body.public-body .investor-news-proof svg {
    filter: drop-shadow(0 2px 6px rgba(245, 179, 1, 0.60));
}

/* =====================================================================
   PREMIUM BUTTON RESET (2026) — retire the ray decorations (the glowing
   left accent edge + the diagonal hover shine sweep) in favour of a clean,
   quiet premium style: a hairline light-gray border and a soft neutral
   shadow. Last block in the file so it wins the cascade; the pseudo kills
   also name the section-scoped `.btn-outline::before` variants because those
   carry higher specificity than the base rule.
   ===================================================================== */
body.public-body .btn-primary::before,
body.public-body .btn-primary::after,
body.public-body .btn-secondary::before,
body.public-body .btn-secondary::after,
body.public-body .site-button-primary::before,
body.public-body .site-button-primary::after,
body.public-body .site-button-secondary::before,
body.public-body .site-button-secondary::after,
body.public-body .btn-outline::before,
body.public-body .btn-outline::after,
body.public-body .section-band-navy .btn-outline::before,
body.public-body .how-buying-section .btn-outline::before,
body.public-body .recently-sold-section .btn-outline::before,
body.public-body .site-cta-band .btn-outline::before {
    content: none !important;
    display: none !important;
}
body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary,
body.public-body .btn-outline {
    border: 1px solid #dfe8f3 !important;
    box-shadow: 0 1px 2px rgba(11, 31, 61, 0.06), 0 6px 16px -8px rgba(11, 31, 61, 0.18) !important;
    transition: transform 200ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 200ms ease, border-color 200ms ease !important;
}
body.public-body .btn-primary:hover,
body.public-body .btn-secondary:hover,
body.public-body .site-button-primary:hover,
body.public-body .site-button-secondary:hover,
body.public-body .btn-outline:hover {
    transform: translateY(-1px) !important;
    border-color: #dfe8f3 !important;
    box-shadow: 0 2px 4px rgba(11, 31, 61, 0.08), 0 12px 26px -10px rgba(11, 31, 61, 0.24) !important;
}
/* On the navy bands the light-gray hairline would disappear — give the outline
   button a bright translucent rim instead so it still reads as bordered. */
body.public-body .section-band-navy .btn-outline,
body.public-body .how-buying-section .btn-outline,
body.public-body .recently-sold-section .btn-outline,
body.public-body .site-cta-band .btn-outline {
    border: 1px solid rgba(255, 255, 255, 0.28) !important;
}
body.public-body .section-band-navy .btn-outline:hover,
body.public-body .how-buying-section .btn-outline:hover,
body.public-body .recently-sold-section .btn-outline:hover,
body.public-body .site-cta-band .btn-outline:hover {
    border-color: rgba(255, 255, 255, 0.5) !important;
}

/* =====================================================================
   EMAIL-STYLE BUTTONS — one shared button system, site AND admin.
   =====================================================================
   This is the button from our emails: a solid brand fill, a glowing accent
   bar inside the LEFT edge, a bold centred Outfit label. It already existed,
   but only inside `#propertyContent` on deal-detail.html — so every other
   page and the whole admin backend reinvented their own buttons and slowly
   drifted apart. public-ui.css is loaded by all 17 public pages AND db12.html
   (the admin), so defining it here is what makes "our buttons look like our
   emails" true everywhere instead of on one screen.

   Usage:  <button class="email-btn email-btn--red"><i …></i>
             <span class="email-btn-label">Submit Your Offer</span></button>

   Variants: --navy (secondary) · --red (primary) · --green (media/positive)
             --gold (walkthrough / "come see it")
   The accent bar colour is set per-variant via --eb-bar.
   ===================================================================== */
.email-btn {
    position: relative;
    isolation: isolate;
    display: flex;
    align-items: center;
    justify-content: flex-start;
    width: 100%;
    gap: 12px;
    /* 14px left padding puts the accent bar exactly 14px in, matching
       brand-buttons.png where the bar sits at x+14 on a 49px-tall button. */
    padding: 14px 22px 14px 14px;
    border: 0;
    border-radius: 12px;
    cursor: pointer;
    font-family: 'Inter', 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;
    font-size: 15px;
    font-weight: 800;
    letter-spacing: 0.01em;
    color: #ffffff;
    text-decoration: none;
    white-space: nowrap;
    /* Face gradient sampled top-to-bottom from the reference render. Each
       variant supplies --eb-face-top / --eb-face-mid / --eb-face-bot. */
    background-image: linear-gradient(
        180deg,
        var(--eb-face-top, #13436b) 0%,
        var(--eb-face-mid, #13436b) 52%,
        var(--eb-face-bot, #0b1f3d) 100%
    );
    /* 1px lit top rim + 1px dark bottom edge. The reference has a crisp lit
       rim; without it the fill reads flat and printed-on. */
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        var(--eb-shadow, 0 12px 24px -8px rgba(11, 31, 61, 0.24));
    transition: transform 0.16s ease, box-shadow 0.16s ease, filter 0.16s ease;
}
/* The signature left accent bar. Sampled: 4px wide, 20px tall, with its own
   top-to-bottom gradient (the bar is lit from above, like the face). */
.email-btn::before {
    content: '';
    flex-shrink: 0;
    width: 4px;
    height: 20px;
    border-radius: 999px;
    background: linear-gradient(
        180deg,
        var(--eb-bar-top, var(--eb-bar, rgba(255, 255, 255,0.85))) 0%,
        var(--eb-bar, rgba(255, 255, 255, 0.65)) 50%,
        var(--eb-bar-bot, var(--eb-bar, rgba(255, 255, 255,0.5))) 100%
    );
    box-shadow: 0 0 10px var(--eb-bar, rgba(255, 255, 255, 0.65));
    z-index: 1;
}
/* The bar spills light into the face. In the reference the fill measurably
   brightens toward the bar and falls off across ~40px, so this is part of
   the mark, not a glow effect for its own sake. */
.email-btn::after {
    content: '';
    position: absolute;
    left: 16px;
    top: 50%;
    width: 96px;
    height: 96px;
    transform: translateY(-50%);
    border-radius: 50%;
    background: radial-gradient(
        closest-side,
        var(--eb-glow, rgba(255, 255, 255, 0.16)) 0%,
        transparent 100%
    );
    pointer-events: none;
    z-index: 0;
}
.email-btn > i,
.email-btn > svg { flex-shrink: 0; stroke-width: 2.5; color: currentColor; }
/* The label centres in the REMAINING space, so the accent bar and icon do not
   push it off-centre. The right margin balances their combined width. */
.email-btn .email-btn-label { flex: 1; text-align: center; margin-right: 16px; }
.email-btn:hover { transform: translateY(-1px); filter: brightness(1.05); }
.email-btn:active { transform: translateY(0); }
.email-btn:disabled,
.email-btn[aria-disabled="true"] { opacity: 0.55; cursor: not-allowed; transform: none; filter: none; }
/* Keyboard focus must stay visible — these are the primary actions on the page. */
.email-btn:focus-visible { outline: 3px solid #13436b; outline-offset: 2px; }

/* ── Variants ──────────────────────────────────────────────────────────
   Every face, bar and shadow value below was sampled pixel-by-pixel from
   brand-assets/brand-buttons.png. Do not "tidy" these into round numbers:
   the reference render IS the spec, and the off-round values are what make
   a rendered button match the approved artwork.

   The shadow is brand-TINTED, not neutral. Under the navy button the
   reference reads #8496ab against an #eef3f9 page, which is a navy-tinted
   shade; a grey shadow makes the button look pasted onto the page.
   ------------------------------------------------------------------- */
/* `.btn-secondary` / `.site-button-secondary` are the SAME button under an
   older name, used across 15 public pages. They join the variant here rather
   than restating the palette further down, which is what they used to do --
   the bar came from these tokens but the face was a hardcoded copy of the
   three stops below, so retuning the variant moved the accent bar and left
   the face behind. */
.email-btn--navy,
body.public-body .btn-secondary,
body.public-body .site-button-secondary {
    --eb-face-top: #13436b;
    --eb-face-mid: #0b1f3d;
    --eb-face-bot: #0b1f3d;
    --eb-bar-top:  #88a0c2;
    --eb-bar:      #88a0c2;
    --eb-bar-bot:  #88a0c2;
    --eb-glow:     rgba(136, 160, 194, 0.20);
    --eb-shadow:   0 10px 22px -6px rgba(11, 31, 61, 0.52), 0 2px 6px -1px rgba(11, 31, 61, 0.34);
}
.email-btn--red,
body.public-body .btn-primary,
body.public-body .site-button-primary {
    --eb-face-top: #b11d29;
    --eb-face-mid: #b11d29;
    --eb-face-bot: #b11d29;
    --eb-bar-top:  #f7dadd;
    --eb-bar:      #d93240;
    --eb-bar-bot:  #d93240;
    --eb-glow:     rgba(247, 218, 221, 0.20);
    --eb-shadow:   0 10px 22px -6px rgba(177, 29, 41, 0.48), 0 2px 6px -1px rgba(177, 29, 41, 0.32);
}
.email-btn--green {
    --eb-face-top: #16a34a;
    --eb-face-mid: #16a34a;
    --eb-face-bot: #16a34a;
    --eb-bar-top:  #e6f8ef;
    --eb-bar:      #44d792;
    --eb-bar-bot:  #44d792;
    --eb-glow:     rgba(68, 215, 146, 0.22);
    --eb-shadow:   0 10px 22px -6px rgba(11, 31, 61, 0.46), 0 2px 6px -1px rgba(11, 31, 61, 0.30);
}
/* Gold takes DARK ink — white on gold fails contrast at this weight. */
.email-btn--gold {
    --eb-face-top: #f5b301;
    --eb-face-mid: #f5b301;
    --eb-face-bot: #f5b301;
    --eb-bar-top:  #fff5e0;
    --eb-bar:      #fff5e0;
    --eb-bar-bot:  #ffc933;
    --eb-glow:     rgba(255, 245, 224, 0.30);
    --eb-shadow:   0 10px 22px -6px rgba(168, 111, 0, 0.42), 0 2px 6px -1px rgba(168, 111, 0, 0.28);
    color: #0b1f3d;
}
/* Gold is light enough that a white top rim disappears and the dark bottom
   edge reads as dirt. Re-state the rim in the ink colour instead. */
.email-btn--gold {
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.55),
        inset 0 -1px 0 rgba(11, 31, 61, 0.22),
        var(--eb-shadow);
}

/* ── Outline / white variant ───────────────────────────────────────────
   From brand-assets/Button examples.png, which shows the same silhouette
   as a white button. Used for the quieter of two side-by-side actions. */
.email-btn--outline {
    --eb-face-top: #ffffff;
    --eb-face-mid: #ffffff;
    --eb-face-bot: #eef3f9;
    --eb-bar-top:  #13436b;
    --eb-bar:      #13436b;
    --eb-bar-bot:  #0b1f3d;
    --eb-glow:     rgba(19, 67, 107, 0.07);
    --eb-shadow:   0 10px 22px -6px rgba(11, 31, 61, 0.16), 0 2px 6px -1px rgba(11, 31, 61, 0.10);
    color: #0b1f3d;
    box-shadow:
        inset 0 0 0 1px rgba(11, 31, 61, 0.16),
        var(--eb-shadow);
}
/* Auto-width variant for toolbars, where a full-width button would be absurd. */
.email-btn--inline { width: auto; display: inline-flex; }
/* On an auto-width button there IS no remaining space, so the label rule above
   inverts: `flex:1` is inert and the 16px right margin becomes pure dead space
   inside the pill. Measured on the deal page's sticky offer bar, where the two
   inline buttons sit side by side: the bare one ("Submit Offer") rendered ~4.5px
   LEFT of centre and the one with a glyph ("Walkthrough") ~8px RIGHT — two
   buttons of the same size disagreeing in opposite directions, which is what
   reads as "off-centre" even though neither is far off on its own. Inline
   buttons pack their bar/icon/label as one leading cluster against a symmetric
   right padding instead, so a row of them lines up. */
.email-btn--inline .email-btn-label { flex: none; margin-right: 0; }

/* ── Size scale ────────────────────────────────────────────────────────
   The reference button is 49px tall, which is --md. The bar scales with
   the button so the proportion (bar ≈ 40% of height) holds at every size. */
.email-btn--sm {
    padding: 9px 16px 9px 11px;
    font-size: 13.5px;
    border-radius: 12px;
    gap: 9px;
}
.email-btn--sm::before { height: 15px; width: 3px; }
.email-btn--sm::after  { left: 12px; width: 72px; height: 72px; }

.email-btn--lg {
    padding: 18px 28px 18px 18px;
    font-size: 16.5px;
    border-radius: 16px;
    gap: 14px;
}
.email-btn--lg::before { height: 25px; }
.email-btn--lg::after  { left: 20px; width: 118px; height: 118px; }

/* ── Interaction ───────────────────────────────────────────────────────
   Lift on hover, and let the tinted shadow grow with the lift so the
   button reads as rising off the page rather than just getting brighter. */
.email-btn:hover {
    transform: translateY(-1px);
    filter: brightness(1.05);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        var(--eb-shadow-hover, var(--eb-shadow, 0 16px 30px -8px rgba(11, 31, 61, 0.30)));
}
/* Pressed: settle back to the page and shrink the shadow to match. */
.email-btn:active {
    transform: translateY(0);
    filter: brightness(0.97);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.14),
        inset 0 -1px 0 rgba(11, 31, 61, 0.18),
        0 3px 8px -3px rgba(11, 31, 61, 0.32);
}

/* On a dark surface (admin panels, the dark half of Button examples.png)
   the outline variant needs to invert or it becomes a white slab. */
.email-btn--outline.email-btn--on-dark {
    --eb-face-top: rgba(255, 255, 255, 0.10);
    --eb-face-mid: rgba(255, 255, 255, 0.07);
    --eb-face-bot: rgba(255, 255, 255, 0.04);
    --eb-bar-top:  #dfe8f3;
    --eb-bar:      #88a0c2;
    --eb-bar-bot:  #88a0c2;
    color: #eef3f9;
    box-shadow:
        inset 0 0 0 1px rgba(255, 255, 255, 0.24),
        0 10px 22px -6px rgba(11, 31, 61, 0.45);
}

@media (prefers-reduced-motion: reduce) {
    .email-btn { transition: none; }
    .email-btn:hover { transform: none; }
    .email-btn:active { transform: none; }
}

/* =====================================================================
   BRAND FILL RETROFIT — legacy button classes adopt the sampled palette.
   =====================================================================
   The pages were built before .email-btn existed and still use
   .btn-primary / .site-button-primary (red) and .btn-secondary /
   .site-button-secondary (navy). Converting 17 pages of markup by hand
   would be a large, risky diff for a purely visual result, so instead the
   legacy classes inherit the SAME sampled face gradient and brand-tinted
   shadow as .email-btn. One rule, every page, no markup churn.

   These deliberately do NOT get the accent bar: the bar is the .email-btn
   signature and needs the flex layout to sit correctly. Reach for
   .email-btn when you want the full brand button.

   This block must stay last — it relies on source order to win against
   the earlier .btn-primary rules of equal specificity.
   ===================================================================== */
body.public-body .btn-primary,
body.public-body .site-button-primary {
    background-image: linear-gradient(180deg, #b11d29 0%, #b11d29 52%, #b11d29 100%);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(177, 29, 41, 0.48),
        0 2px 6px -1px rgba(177, 29, 41, 0.32);
}
body.public-body .btn-secondary,
body.public-body .site-button-secondary {
    background-image: linear-gradient(180deg, #13436b 0%, #0b1f3d 52%, #0b1f3d 100%);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(11, 31, 61, 0.52),
        0 2px 6px -1px rgba(11, 31, 61, 0.34);
}
body.public-body .btn-primary:hover,
body.public-body .site-button-primary:hover {
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 16px 30px -8px rgba(177, 29, 41, 0.52),
        0 3px 8px -2px rgba(177, 29, 41, 0.34);
}
body.public-body .btn-secondary:hover,
body.public-body .site-button-secondary:hover {
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 16px 30px -8px rgba(11, 31, 61, 0.56),
        0 3px 8px -2px rgba(11, 31, 61, 0.36);
}

/* =====================================================================
   BRAND BUTTON ROLL-OUT — brand-assets/brand-buttons.png, EVERY page.
   =====================================================================
   Why this block exists, and why it is loud with !important:

   Two earlier passes fought each other and BOTH lost. The "PREMIUM BUTTON
   RESET (2026)" block above kills every button pseudo-element with
   "content: none !important" and forces a light-gray hairline + neutral
   shadow. A later "BRAND FILL RETROFIT" block tried to restore the sampled
   brand face - but wrote it WITHOUT !important, so it was silently beaten by
   the "background: ... !important" a few thousand lines earlier. The net
   result on the live site was a button matching neither: a dull
   #b11d29 -> #8f232e face, a gray hairline, and no accent bar. That is the
   "buttons no longer match" regression.

   This block is LAST in the file and matches the reset's weight, so the
   approved artwork actually lands. Every value below is the one already
   sampled 1:1 from brand-buttons.png for .email-btn - 48px-scale face
   gradient, 16px radius, 4x20 accent bar 14px from the left edge, and a
   brand-TINTED (never neutral) shadow.

   The bar is positioned ABSOLUTELY rather than placed in flex flow the way
   .email-btn::before does it, so it lands identically on an <a>, a <button>,
   a flex row or a block - which is what lets all 17 public pages plus the
   admin adopt the mark with zero markup churn.

   Opt out with .no-brand-bar (icon-only buttons, dense toolbars).
   ===================================================================== */
body.public-body .btn-primary,
body.public-body .btn-secondary,
body.public-body .site-button-primary,
body.public-body .site-button-secondary {
    position: relative !important;
    isolation: isolate;
    border: 0 !important;
    border-radius: 12px !important;
    font-family: 'Inter', 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;
    font-weight: 800 !important;
    letter-spacing: 0.01em !important;
    color: #ffffff !important;
    /* Padding is deliberately NOT set. Every page already gives these buttons
       px-6/px-8 (24-32px) and the bar occupies 14-18px, so the label clears
       it. Forcing a left inset would shove the label off-centre inside the
       justify-center flex most of these buttons use. */
    transition: transform 0.16s ease, box-shadow 0.16s ease, filter 0.16s ease !important;
}
/* The signature 4x20 accent bar, 14px in from the left edge. */
body.public-body .btn-primary::before,
body.public-body .btn-secondary::before,
body.public-body .site-button-primary::before,
body.public-body .site-button-secondary::before {
    content: '' !important;
    display: block !important;
    position: absolute !important;
    left: 14px !important;
    right: auto !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    width: 4px !important;
    height: 20px !important;
    border-radius: 999px !important;
    opacity: 1 !important;
    background: linear-gradient(180deg, var(--eb-bar-top) 0%, var(--eb-bar) 50%, var(--eb-bar-bot) 100%) !important;
    box-shadow: 0 0 10px var(--eb-bar) !important;
    pointer-events: none !important;
    z-index: 1 !important;
}
/* The bar spills light into the face - same falloff as .email-btn::after. In
   brand-buttons.png the fill measurably brightens toward the bar and falls
   off across ~40px, so this is part of the mark, not decoration. */
body.public-body .btn-primary::after,
body.public-body .btn-secondary::after,
body.public-body .site-button-primary::after,
body.public-body .site-button-secondary::after {
    content: '' !important;
    display: block !important;
    position: absolute !important;
    left: 16px !important;
    right: auto !important;
    top: 50% !important;
    bottom: auto !important;
    width: 96px !important;
    height: 96px !important;
    transform: translateY(-50%) !important;
    border-radius: 50% !important;
    opacity: 1 !important;
    background: radial-gradient(closest-side, var(--eb-glow) 0%, transparent 100%) !important;
    box-shadow: none !important;
    pointer-events: none !important;
    z-index: 0 !important;
}
/* Keep labels and icons above the glow wash. */
body.public-body .btn-primary > *,
body.public-body .btn-secondary > *,
body.public-body .site-button-primary > *,
body.public-body .site-button-secondary > * { position: relative; z-index: 1; }

/* -- Red (primary): sampled face + brand-tinted shadow -- */
body.public-body .btn-primary,
body.public-body .site-button-primary {
    background: linear-gradient(180deg, var(--eb-face-top) 0%, var(--eb-face-mid) 52%, var(--eb-face-bot) 100%) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(177, 29, 41, 0.48),
        0 2px 6px -1px rgba(177, 29, 41, 0.32) !important;
}
/* -- Navy (secondary) -- */
body.public-body .btn-secondary,
body.public-body .site-button-secondary {
    background: linear-gradient(180deg, var(--eb-face-top) 0%, var(--eb-face-mid) 52%, var(--eb-face-bot) 100%) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(11, 31, 61, 0.52),
        0 2px 6px -1px rgba(11, 31, 61, 0.34) !important;
}

/* -- Outline / white: the quieter of two side-by-side actions. It keeps a
   real border, so it is styled apart from the filled pair above (which run
   border-less on an inset rim). -- */
body.public-body .btn-outline {
    position: relative !important;
    isolation: isolate;
    border-radius: 12px !important;
    font-family: 'Inter', 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;
    font-weight: 800 !important;
    background: linear-gradient(180deg, #ffffff 0%, #ffffff 52%, #eef3f9 100%) !important;
    border: 1px solid rgba(11, 31, 61, 0.16) !important;
    color: #0b1f3d !important;
    backdrop-filter: none !important;
    box-shadow:
        0 10px 22px -6px rgba(11, 31, 61, 0.16),
        0 2px 6px -1px rgba(11, 31, 61, 0.10) !important;
    transition: transform 0.16s ease, box-shadow 0.16s ease, filter 0.16s ease !important;
}
body.public-body .btn-outline::before {
    content: '' !important;
    display: block !important;
    position: absolute !important;
    left: 14px !important;
    right: auto !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    width: 4px !important;
    height: 20px !important;
    border-radius: 999px !important;
    opacity: 1 !important;
    background: linear-gradient(180deg, #13436b 0%, #13436b 50%, #0b1f3d 100%) !important;
    box-shadow: 0 0 10px rgba(11, 31, 61, 0.35) !important;
    pointer-events: none !important;
    z-index: 1 !important;
}
/* On the navy bands a white slab would shout louder than the primary, so the
   outline inverts to a translucent rim - the .email-btn--on-dark idiom. */
body.public-body .section-band-navy .btn-outline,
body.public-body .how-buying-section .btn-outline,
body.public-body .recently-sold-section .btn-outline,
body.public-body .site-cta-band .btn-outline {
    background: linear-gradient(180deg, rgba(255, 255, 255,0.10) 0%, rgba(255, 255, 255,0.07) 52%, rgba(255, 255, 255,0.04) 100%) !important;
    border: 1px solid rgba(255, 255, 255, 0.24) !important;
    color: #eef3f9 !important;
    box-shadow: 0 10px 22px -6px rgba(11, 31, 61, 0.45) !important;
}
body.public-body .section-band-navy .btn-outline::before,
body.public-body .how-buying-section .btn-outline::before,
body.public-body .recently-sold-section .btn-outline::before,
body.public-body .site-cta-band .btn-outline::before {
    background: linear-gradient(180deg, #dfe8f3 0%, #88a0c2 50%, #88a0c2 100%) !important;
    box-shadow: 0 0 10px rgba(136, 160, 194, 0.55) !important;
}

/* -- Interaction: lift on hover, settle on press -- */
body.public-body .btn-primary:hover,
body.public-body .btn-secondary:hover,
body.public-body .site-button-primary:hover,
body.public-body .site-button-secondary:hover,
body.public-body .btn-outline:hover {
    transform: translateY(-1px) !important;
    filter: brightness(1.05);
}
body.public-body .btn-primary:hover,
body.public-body .site-button-primary:hover {
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 16px 30px -8px rgba(177, 29, 41, 0.52),
        0 3px 8px -2px rgba(177, 29, 41, 0.34) !important;
}
body.public-body .btn-secondary:hover,
body.public-body .site-button-secondary:hover {
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 16px 30px -8px rgba(11, 31, 61, 0.56),
        0 3px 8px -2px rgba(11, 31, 61, 0.36) !important;
}
body.public-body .btn-primary:active,
body.public-body .btn-secondary:active,
body.public-body .site-button-primary:active,
body.public-body .site-button-secondary:active,
body.public-body .btn-outline:active {
    transform: translateY(0) !important;
    filter: brightness(0.97);
}
body.public-body .btn-primary:focus-visible,
body.public-body .btn-secondary:focus-visible,
body.public-body .site-button-primary:focus-visible,
body.public-body .site-button-secondary:focus-visible,
body.public-body .btn-outline:focus-visible {
    outline: 3px solid #13436b !important;
    outline-offset: 2px !important;
}

/* Opt-out for buttons the mark does not suit (icon-only, dense toolbars). */
body.public-body .no-brand-bar::before,
body.public-body .no-brand-bar::after {
    content: none !important;
    display: none !important;
}

@media (prefers-reduced-motion: reduce) {
    body.public-body .btn-primary,
    body.public-body .btn-secondary,
    body.public-body .site-button-primary,
    body.public-body .site-button-secondary,
    body.public-body .btn-outline { transition: none !important; }
    body.public-body .btn-primary:hover,
    body.public-body .btn-secondary:hover,
    body.public-body .site-button-primary:hover,
    body.public-body .site-button-secondary:hover,
    body.public-body .btn-outline:hover { transform: none !important; }
    /* The accent bar sweeping across the face on hover. `!important` because the
       bar's geometry is declared that way too, and this has to be the last word
       on a pseudo-element three separate rules have rewritten. */
    body.public-body .btn-primary:hover::after,
    body.public-body .btn-secondary:hover::after,
    body.public-body .site-button-primary:hover::after,
    body.public-body .site-button-secondary:hover::after,
    body.public-body .site-footer-button:hover::after { animation: none !important; }
}

/* =====================================================================
   DEAL CHAT NOTE — replaces the "Interested in this deal?" prompt card.
   =====================================================================
   The old .deal-interest-prompt was a 23rem decision card: gold top-rail,
   eyebrow, headline, a sentence of injected copy, a crimson Call CTA and a
   Save Contact tile, plus a separate tap-to-open bubble on phones. It read
   as an interruption, and it competed with the site chat launcher sitting
   ~90px below it offering the same conversation.

   This is one line that LOOKS like an incoming chat message and opens that
   same chat. It sits on the RIGHT, stacked above the chat launcher, so the
   box and the thing it opens read as one object.

   The old .deal-interest-* rules are left in place: their selectors no
   longer match anything, so they are inert, and deleting ~200 lines spread
   across four earlier passes would be a far larger diff than the change.
   ===================================================================== */
/* The box is a plain positioned CONTAINER; the two controls inside it are real
   sibling <button>s (open chat / dismiss). It used to be one <button> with a
   role="button" span nested inside — invalid, and the span could be tabbed to
   but not activated with Enter. */
body.public-body .deal-chat-note {
    position: fixed;
    right: 1rem;
    bottom: 6.5rem;
    z-index: 46;
    display: flex;
    align-items: stretch;
    width: min(calc(100vw - 2rem), 19.5rem);
    /* Chat-bubble silhouette: rounded everywhere, squared at the corner
       nearest the launcher it belongs to. */
    border-radius: 1.15rem 1.15rem 0.35rem 1.15rem;
    border: 1px solid rgba(223, 232, 243, 0.9);
    background: #ffffff;
    box-shadow:
        0 1px 2px rgba(11, 31, 61, 0.05),
        0 12px 28px -12px rgba(11, 31, 61, 0.22);
    transition: transform 0.16s ease, box-shadow 0.16s ease;
}
body.public-body .deal-chat-note.hidden { display: none; }
/* No whole-box hover lift any more. The box is not one target: it is a label
   plus four independent actions, and lifting the lot on hover would say
   "click anywhere", which is exactly the behaviour that made it a nag. */
body.public-body .deal-chat-note-body {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
    min-width: 0;
    padding: 0.8rem 0.4rem 0.8rem 0.85rem;
}
body.public-body .deal-chat-note-action:focus-visible,
body.public-body .deal-chat-note-dismiss:focus-visible {
    outline: 3px solid #13436b;
    outline-offset: -2px;
}
body.public-body .deal-chat-note-title {
    font-family: 'Inter', 'Segoe UI', sans-serif;
    font-size: 0.86rem;
    font-weight: 700;
    line-height: 1.25;
    color: #0f1c33;
}
/* Wraps rather than scrolls: "Save for later" is the longest and least urgent,
   so it is the one that drops to a second line on a narrow phone. */
body.public-body .deal-chat-note-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
}
body.public-body .deal-chat-note-action {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.4rem 0.6rem;
    border: 1px solid #dfe8f3;
    border-radius: 999px;
    background: #eef3f9;
    color: #13436b;
    font-family: inherit;
    font-size: 0.74rem;
    font-weight: 700;
    line-height: 1;
    text-decoration: none;
    cursor: pointer;
    transition: background-color 0.16s ease, border-color 0.16s ease;
}
body.public-body .deal-chat-note-action:hover {
    background: #eef3f9;
    border-color: #dfe8f3;
}
/* A real sibling button now, so it lays out in flow rather than being absolutely
   parked over the open button's hit area — a tap near the X used to land on
   whichever of the two the browser resolved first. 44px of touch target via
   padding while the visible pill stays 1.4rem. */
body.public-body .deal-chat-note-dismiss {
    flex: 0 0 auto;
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.2rem;
    height: 2.2rem;
    margin: 0.25rem 0.25rem 0 0;
    padding: 0;
    border: 0;
    background: none;
    border-radius: 999px;
    color: #88a0c2;
    cursor: pointer;
    transition: background-color 0.16s ease, color 0.16s ease;
}
body.public-body .deal-chat-note-dismiss:hover {
    background: #eef3f9;
    color: #13436b;
}
@media (max-width: 640px) {
    body.public-body .deal-chat-note {
        right: max(0.75rem, env(safe-area-inset-right));
        bottom: calc(5.5rem + env(safe-area-inset-bottom));
        width: min(calc(100vw - 1.5rem), 18rem);
    }
    /* The dismiss renders ~30px on this page's root font size, under the 44px
       touch minimum — and it sits next to a control that opens a chat, so a
       near-miss is a wrong action rather than a no-op. */
    body.public-body .deal-chat-note-dismiss {
        width: 44px;
        height: 44px;
        margin: 0.1rem 0.1rem 0 0;
    }
}
@media (prefers-reduced-motion: reduce) {
    body.public-body .deal-chat-note { transition: none; }
}

/* .email-btn sets display:flex and is declared AFTER tailwind.css, so it beat
   Tailwind's .hidden (both single-class, later wins) — every JS-hidden brand
   button would have rendered visible the moment it adopted the class. This is
   the same specificity trap that made hidden deal stat chips show up. */
body.public-body .email-btn.hidden,
.email-btn.hidden { display: none !important; }

/* =====================================================================
   BRAND BUTTON ROLL-OUT, ROUND 2 — the components the first pass missed.
   =====================================================================
   An audit of all 52 visible buttons across the 14 public pages turned up
   four components still painting their own near-miss version of the mark:
   two that beat the roll-out on specificity, and two that were never in
   the selector list at all but are on EVERY page and read as the same
   button to a visitor. All four are brought onto the sampled artwork:
   16px radius, a 4x20 accent bar 14px in, and a face gradient.
   ===================================================================== */

/* 1) `.cash-buyers-form button[type="submit"]` forces a 1.25rem radius at
      (0-2-2), which out-specifies the roll-out's `.btn-primary` (0-2-0) —
      so the biggest CTA on deals.html and cash-buyers.html was the one
      button on the site with a 20px corner. */
body.public-body .cash-buyers-form button[type="submit"].btn-primary,
body.public-body .cash-buyers-form button[type="submit"].btn-secondary,
body.public-body .cash-buyers-form button[type="submit"].email-btn {
    border-radius: 12px !important;
}

/* 2) `.coaching-bundle-card button::before` paints the older 3px
      full-height edge and beats the bare `.email-btn::before`. Where the
      button IS a brand button, the sampled 4x20 bar wins. */
body.public-body .coaching-bundle-card button.email-btn::before {
    position: static !important;
    left: auto !important;
    top: auto !important;
    bottom: auto !important;
    width: 4px !important;
    height: 20px !important;
    border-radius: 999px !important;
    background: linear-gradient(180deg, var(--eb-bar-top) 0%, var(--eb-bar) 50%, var(--eb-bar-bot) 100%) !important;
    box-shadow: 0 0 10px var(--eb-bar) !important;
}

/* 3) `.deal-card-cta` — the "View Deal Details" button on every deal card,
      i.e. the most-clicked control on the site. It carried a 1rem radius
      and a 3px full-height edge. Same navy face as the brand set, so only
      the corner and the mark change. */
body.public-body .deal-card-cta {
    --eb-bar-top: #88a0c2;
    --eb-bar:     #88a0c2;
    --eb-bar-bot: #88a0c2;
    border: 0 !important;
    border-radius: 12px !important;
    background: linear-gradient(180deg, #13436b 0%, #0b1f3d 52%, #0b1f3d 100%) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(11, 31, 61, 0.52),
        0 2px 6px -1px rgba(11, 31, 61, 0.34) !important;
}
body.public-body .deal-card-cta::before {
    left: 14px !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    width: 4px !important;
    height: 20px !important;
    background: linear-gradient(180deg, var(--eb-bar-top) 0%, var(--eb-bar) 50%, var(--eb-bar-bot) 100%) !important;
    box-shadow: 0 0 10px var(--eb-bar) !important;
}

/* 4) `.site-footer-button` — the footer "Save Contact", present on every
      page. Was the dull #c33a47 -> #8f232e face at a 1.1rem radius, the
      same near-miss the main buttons had before this pass. */
body.public-body .site-footer-button {
    --eb-bar-top: #f7dadd;
    --eb-bar:     #d93240;
    --eb-bar-bot: #d93240;
    border: 0 !important;
    border-radius: 12px !important;
    background: linear-gradient(180deg, #b11d29 0%, #b11d29 52%, #b11d29 100%) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(177, 29, 41, 0.48),
        0 2px 6px -1px rgba(177, 29, 41, 0.32) !important;
}
body.public-body .site-footer-button::before {
    left: 14px !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    width: 4px !important;
    height: 20px !important;
    opacity: 1 !important;
    background: linear-gradient(180deg, var(--eb-bar-top) 0%, var(--eb-bar) 50%, var(--eb-bar-bot) 100%) !important;
    box-shadow: 0 0 10px var(--eb-bar) !important;
}

/* =====================================================================
   BRAND BUTTON ROLL-OUT, ROUND 3 — the page-local button classes.
   =====================================================================
   Rounds 1 and 2 covered the shared classes. A full inventory of all 133
   button-like controls across all 18 public pages (classified by COMPUTED
   appearance, not class name, so nothing could hide) found the rest: every
   remaining real button was a page-local class defined in that page's own
   inline <style> — .btn-email on the auth pages, .btn-navy/.btn-ghost on
   profile, .wci-btn on the walkthrough check-in, .investor-news-subscribe
   on deals. Each had invented its own fill, corner and shadow.

   They are redefined here rather than rewritten in markup: .btn-ghost alone
   has 8 instances on one page, and a class redefinition cannot miss one or
   break a JS hook. Page inline styles load AFTER public-ui.css, so these
   need the extra weight to land.

   Sizing note: these are all "medium" in the brand scale, so they take the
   4x20 bar and the 16px corner. .btn-ghost is the OUTLINE variant — it is
   used for tertiary actions ("Browse all deals", "Add another LLC") where a
   filled brand button would outrank the primary action on the same screen.
   ===================================================================== */
body.public-body .btn-email,
body.public-body .btn-navy,
body.public-body .btn-ghost,
body.public-body .wci-btn,
body.public-body .investor-news-subscribe {
    position: relative !important;
    isolation: isolate;
    display: inline-flex !important;
    align-items: center !important;
    gap: 12px !important;
    border: 0 !important;
    border-radius: 12px !important;
    font-family: 'Inter', 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif !important;
    font-weight: 800 !important;
    letter-spacing: 0.01em !important;
    cursor: pointer;
    transition: transform 0.16s ease, box-shadow 0.16s ease, filter 0.16s ease !important;
}
/* Left inset clears the bar (14px in + 4px wide + 12px gap). These classes set
   their own horizontal padding, so unlike the .btn-primary family — which
   already ships px-6/px-8 — the inset has to be stated. */
body.public-body .btn-email,
body.public-body .btn-navy,
body.public-body .wci-btn,
body.public-body .investor-news-subscribe {
    padding: 14px 22px 14px 30px !important;
}
body.public-body .btn-ghost {
    padding: 11px 18px 11px 26px !important;
}
body.public-body .btn-email::before,
body.public-body .btn-navy::before,
body.public-body .btn-ghost::before,
body.public-body .wci-btn::before,
body.public-body .investor-news-subscribe::before {
    content: '' !important;
    display: block !important;
    position: absolute !important;
    left: 14px !important;
    right: auto !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    width: 4px !important;
    height: 20px !important;
    border-radius: 999px !important;
    opacity: 1 !important;
    background: linear-gradient(180deg, var(--eb-bar-top) 0%, var(--eb-bar) 50%, var(--eb-bar-bot) 100%) !important;
    box-shadow: 0 0 10px var(--eb-bar) !important;
    pointer-events: none !important;
    z-index: 1 !important;
}
body.public-body .btn-ghost::before { left: 11px !important; height: 16px !important; width: 3px !important; }
/* The bar spills light into the face, the same falloff as .email-btn::after. */
body.public-body .btn-email::after,
body.public-body .btn-navy::after,
body.public-body .wci-btn::after,
body.public-body .investor-news-subscribe::after {
    content: '' !important;
    display: block !important;
    position: absolute !important;
    left: 16px !important;
    top: 50% !important;
    width: 96px !important;
    height: 96px !important;
    transform: translateY(-50%) !important;
    border-radius: 50% !important;
    background: radial-gradient(closest-side, var(--eb-glow) 0%, transparent 100%) !important;
    pointer-events: none !important;
    z-index: 0 !important;
}
body.public-body .btn-email > *,
body.public-body .btn-navy > *,
body.public-body .btn-ghost > *,
body.public-body .wci-btn > *,
body.public-body .investor-news-subscribe > * { position: relative; z-index: 1; }

/* -- Navy: sign-in / account actions -- */
body.public-body .btn-email,
body.public-body .btn-navy {
    --eb-bar-top: #88a0c2;
    --eb-bar:     #88a0c2;
    --eb-bar-bot: #88a0c2;
    --eb-glow:    rgba(136, 160, 194, 0.20);
    background: linear-gradient(180deg, #13436b 0%, #0b1f3d 52%, #0b1f3d 100%) !important;
    color: #ffffff !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(11, 31, 61, 0.52),
        0 2px 6px -1px rgba(11, 31, 61, 0.34) !important;
}
/* -- Red: the primary commit on its page ("Check me in", "Subscribe Free") -- */
body.public-body .wci-btn,
body.public-body .investor-news-subscribe {
    --eb-bar-top: #f7dadd;
    --eb-bar:     #d93240;
    --eb-bar-bot: #d93240;
    --eb-glow:    rgba(247, 218, 221, 0.20);
    background: linear-gradient(180deg, #b11d29 0%, #b11d29 52%, #b11d29 100%) !important;
    color: #ffffff !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(177, 29, 41, 0.48),
        0 2px 6px -1px rgba(177, 29, 41, 0.32) !important;
}
/* -- Outline: tertiary actions that must not outrank the primary -- */
body.public-body .btn-ghost {
    --eb-bar-top: #13436b;
    --eb-bar:     #13436b;
    --eb-bar-bot: #0b1f3d;
    background: linear-gradient(180deg, #ffffff 0%, #ffffff 52%, #eef3f9 100%) !important;
    color: #0b1f3d !important;
    box-shadow:
        inset 0 0 0 1px rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(11, 31, 61, 0.16),
        0 2px 6px -1px rgba(11, 31, 61, 0.10) !important;
}
body.public-body .btn-ghost i,
body.public-body .btn-ghost svg { color: #13436b !important; }

body.public-body .btn-email:hover,
body.public-body .btn-navy:hover,
body.public-body .btn-ghost:hover,
body.public-body .wci-btn:hover,
body.public-body .investor-news-subscribe:hover {
    transform: translateY(-1px) !important;
    filter: brightness(1.05);
}
body.public-body .btn-email:active,
body.public-body .btn-navy:active,
body.public-body .btn-ghost:active,
body.public-body .wci-btn:active,
body.public-body .investor-news-subscribe:active {
    transform: translateY(0) !important;
    filter: brightness(0.97);
}
body.public-body .btn-email:focus-visible,
body.public-body .btn-navy:focus-visible,
body.public-body .btn-ghost:focus-visible,
body.public-body .wci-btn:focus-visible,
body.public-body .investor-news-subscribe:focus-visible {
    outline: 3px solid #13436b !important;
    outline-offset: 2px !important;
}
body.public-body .btn-email:disabled,
body.public-body .btn-navy:disabled,
body.public-body .btn-ghost:disabled,
body.public-body .wci-btn:disabled,
body.public-body .wci-btn[disabled],
body.public-body .investor-news-subscribe:disabled {
    opacity: 0.55 !important;
    cursor: not-allowed !important;
    transform: none !important;
    filter: none !important;
}
/* Full-width where the page laid them out that way (auth forms stack). */
body.public-body form .btn-email,
body.public-body .wci-btn { width: 100%; justify-content: center; }

@media (prefers-reduced-motion: reduce) {
    body.public-body .btn-email,
    body.public-body .btn-navy,
    body.public-body .btn-ghost,
    body.public-body .wci-btn,
    body.public-body .investor-news-subscribe { transition: none !important; }
    body.public-body .btn-email:hover,
    body.public-body .btn-navy:hover,
    body.public-body .btn-ghost:hover,
    body.public-body .wci-btn:hover,
    body.public-body .investor-news-subscribe:hover { transform: none !important; }
}

/* =====================================================================
   BRAND CONSISTENCY — the non-button controls.
   =====================================================================
   The inventory's remaining off-brand controls are NOT buttons: segmented
   filters, link pills, OS tabs, a back link, and the two nav icon controls.
   Giving those the full mark would be wrong — a filter pill with a glowing
   accent bar reads as a call to action, and four of them next to each other
   would outshout the one real CTA on the page.

   What they DO need is to look like they come from the same system: the
   brand's 16px corner family (12px at pill scale), the navy/red palette
   instead of raw slate, and the same lift-on-hover. Radius is the tell —
   before this the site had 8px, 9999px, 0.5rem, 0.75rem, 0.95rem, 1rem,
   1.1rem and 1.25rem corners all on screen at once.
   ===================================================================== */

/* -- Segmented filters (deals.html status tabs) ------------------------- */
body.public-body .filter-pill {
    border-radius: 12px !important;
    font-family: 'Inter', 'Segoe UI', sans-serif;
    font-weight: 700;
    transition: transform 0.16s ease, box-shadow 0.16s ease, background-color 0.16s ease, color 0.16s ease;
}
body.public-body .filter-pill:hover { transform: translateY(-1px); }
/* The selected filter takes the brand navy face — the same fill as a navy
   button, minus the accent bar, so it reads as "chosen" not "click me". */
body.public-body .filter-pill.filter-active {
    background: linear-gradient(180deg, #13436b 0%, #0b1f3d 52%, #0b1f3d 100%) !important;
    color: #ffffff !important;
    border-color: transparent !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.18),
        0 8px 18px -8px rgba(11, 31, 61, 0.45) !important;
}
body.public-body .filter-pill.filter-active i,
body.public-body .filter-pill.filter-active svg { color: #88a0c2 !important; }

/* -- Link pills (city / county / topic links on index + deals) ---------- */
body.public-body .site-link-pill,
body.public-body a.install-os-badge,
body.public-body button.install-os-badge {
    border-radius: 12px !important;
    font-family: 'Inter', 'Segoe UI', sans-serif;
    font-weight: 700;
    transition: transform 0.16s ease, box-shadow 0.16s ease, border-color 0.16s ease;
}
body.public-body .site-link-pill:hover,
body.public-body .install-os-badge:hover {
    transform: translateY(-1px);
    border-color: rgba(19, 67, 107, 0.32) !important;
    box-shadow: 0 8px 18px -8px rgba(11, 31, 61, 0.20) !important;
}

/* -- Nav icon controls (bell + account) -------------------------------- */
/* Icon-only, so no bar and no label — but the same corner family and lift as
   everything else in the header, instead of a bare circle. */
body.public-body .site-profile-item {
    transition: transform 0.16s ease, box-shadow 0.16s ease, border-color 0.16s ease;
}
body.public-body .site-profile-item:hover { transform: translateY(-1px); }
body.public-body .site-profile-item:focus-visible {
    outline: 3px solid #13436b;
    outline-offset: 2px;
}

/* -- "Back to site" on the auth pages ---------------------------------- */
body.public-body .auth-back {
    border-radius: 12px !important;
    font-family: 'Inter', 'Segoe UI', sans-serif;
    font-weight: 700;
    transition: transform 0.16s ease, box-shadow 0.16s ease;
}
body.public-body .auth-back:hover { transform: translateY(-1px); }

/* -- Gallery "view more" tile (deal-detail thumb strip) ----------------- */
/* Deliberately NOT a brand button: it is sized and stacked to match the 80px
   photo thumbnails beside it, and a 48px-scale button in that row would break
   the strip. It takes the corner family only. */
body.public-body .gallery-more-tile {
    border-radius: 12px !important;
    font-family: 'Inter', 'Segoe UI', sans-serif;
    font-weight: 700;
}

@media (prefers-reduced-motion: reduce) {
    body.public-body .filter-pill,
    body.public-body .site-link-pill,
    body.public-body .install-os-badge,
    body.public-body .site-profile-item,
    body.public-body .auth-back { transition: none; }
    body.public-body .filter-pill:hover,
    body.public-body .site-link-pill:hover,
    body.public-body .install-os-badge:hover,
    body.public-body .site-profile-item:hover,
    body.public-body .auth-back:hover { transform: none; }
}

/* The buyer-network preview card was on a 1.9rem corner — a one-off between the
   site's card scales (rounded-2xl 16px / rounded-3xl 24px). Normalised to 24px
   so the last stray radius on the public site is gone. */
body.public-body .buyer-network-preview-card,
body.public-body .buyer-network-preview-shell { border-radius: 16px !important; }

/* =====================================================================
   FOCUS RING CONTRAST — WCAG 1.4.11 (non-text contrast, 3:1).
   =====================================================================
   The focus ring was sky-300 (#7dd3fc) with a 2px offset, so the ring sits
   on the PAGE background — white on almost every public surface. #7dd3fc
   measures 1.67:1 against white and fails 1.4.11 outright: the indicator a
   keyboard user relies on was the least visible thing on the page.

   Brand navy is 11.5:1 on white. The exception is a control sitting ON a
   dark surface, where navy-on-navy would vanish — those keep a light ring
   (#dfe8f3, 12.8:1 on the navy bands).
   ===================================================================== */
body.public-body .section-band-navy :is(a, button, [role="button"], input, select, textarea):focus-visible,
body.public-body .how-buying-section :is(a, button, [role="button"]):focus-visible,
body.public-body .recently-sold-section :is(a, button, [role="button"]):focus-visible,
body.public-body .site-cta-band :is(a, button, [role="button"]):focus-visible,
body.public-body .site-footer :is(a, button, [role="button"]):focus-visible,
body.public-body .email-btn--navy:focus-visible,
body.public-body .email-btn--red:focus-visible,
body.public-body .btn-primary:focus-visible,
body.public-body .btn-secondary:focus-visible,
body.public-body .site-button-primary:focus-visible,
body.public-body .site-button-secondary:focus-visible,
body.public-body .deal-card-cta:focus-visible,
body.public-body .site-footer-button:focus-visible {
    outline-color: #dfe8f3 !important;
}

/* =====================================================================
   DEAL CARD CTA — "View Deal Details", cleaned up.
   =====================================================================
   Three things were making this button look off:

   1. `pt-4` sat INSIDE it on top of `py-3`, so padding was 16px top / 12px
      bottom and the label rode low in the box. The gap above the button is
      now a margin here, and the padding is symmetric.
   2. A four-stop `linear-gradient(140deg, …)` with `overflow: hidden` drew a
      visible diagonal band across a 44px-tall button — a full-card treatment
      applied to a control too small to carry it. It takes the flat sampled
      navy face like every other brand button.
   3. The accent bar sits 14px in, but `px-4` starts the label at 16px, so the
      two collided. Left padding now clears the mark.
   ===================================================================== */
body.public-body .deal-card-cta {
    margin-top: 1rem;                    /* was pt-4 inside the button */
    padding-left: 30px !important;       /* 14px bar + 4px + 12px gap */
    padding-right: 1rem !important;
    padding-top: 0.7rem !important;
    padding-bottom: 0.7rem !important;
    min-height: 44px;
    overflow: visible !important;        /* nothing left to clip */
    background: linear-gradient(180deg, #13436b 0%, #0b1f3d 52%, #0b1f3d 100%) !important;
    border: 0 !important;
    border-radius: 12px !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.20),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 10px 22px -6px rgba(11, 31, 61, 0.52),
        0 2px 6px -1px rgba(11, 31, 61, 0.34) !important;
}
/* The eye and the arrow read as one pair with the label between them, so the
   arrow keeps a little breathing room instead of being flung to the far edge
   by justify-between on a wide card. */
body.public-body .deal-card-cta .deal-card-cta-arrow {
    margin-left: 0.75rem;
    opacity: 0.85;
}
/* Hover: the card already lifts, so the button only brightens — two lifts on
   one gesture reads as a wobble. */
body.public-body .deal-card:hover .deal-card-cta {
    background: linear-gradient(180deg, #13436b 0%, #13436b 52%, #13436b 100%) !important;
    border-color: transparent !important;
    transform: none !important;
    filter: none !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        inset 0 -1px 0 rgba(11, 31, 61, 0.16),
        0 16px 30px -8px rgba(11, 31, 61, 0.56) !important;
}

/* =====================================================================
   HOW BUYING WORKS — the step track, re-envisioned.
   =====================================================================
   It was five equal white cards in a row, each with a numbered circle that
   alternated red / navy / red / navy / red, joined by a hairline you could
   barely see. Three problems, all of them about reading:

     · alternating two colours across a SEQUENCE reads as two categories —
       "odd steps" and "even steps" — not as one path. Colour was carrying no
       information, it was just rhythm.
     · five equal cards give five equal visual weights, so nothing says where
       the journey starts or which way it runs. A buyer scans it as a grid of
       features rather than "do this, then this".
     · five opaque white blocks on a navy band is a lot of weight for what is
       really one sentence of process.

   Re-envisioned as ONE continuous rail with the numbers sitting on it:
     · a single 2px track runs behind all five nodes with a red -> navy
       gradient, so direction is in the artwork instead of implied by reading
       order,
     · step 1 is brand RED and the rest are navy. That is a sequence with a
       beginning ("start here"), which is what the alternating fill was
       accidentally destroying,
     · the cards are gone. The nodes and their labels sit directly on the band,
       which drops four-fifths of the visual weight and lets the type carry it,
     · the node rim reuses the brand button's lit-top-edge language, so this
       section belongs to the same system as the buttons.

   Appended last so it wins over the four earlier .step-node passes.
   ===================================================================== */
body.public-body .steps-track {
    position: relative;
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 0;
    padding: 0;
    background: none !important;
    border: 0 !important;
    box-shadow: none !important;
}
/* This pass hard-codes five columns, which silently broke the four-step
   track on /sell-your-deal (four nodes in a five-column grid = an empty
   slot and four off-centre steps). `.steps-track-four` is declared far
   above, so it needs the extra class here to outrank this block.

   Gated to the wide layout: the phone rules below drop to a single column
   with a plain `.steps-track` selector, which this would otherwise outrank.
   The rail ends move with the columns — five columns put the first and last
   disc centres at 10%/90%, four columns put them at 12.5%/87.5%. */
@media (min-width: 768px) {
    body.public-body .steps-track.steps-track-four {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}
/* The rail. Sits behind the nodes, centred on them, and runs only BETWEEN the
   first and last node rather than the full width — a line that overshoots the
   first step implies the journey started somewhere off-screen.

   The band-scoped selectors are required, not decorative:
   `.section-band-navy .steps-track::before` sets a flat rgba(255,255,255,0.18)
   hairline at (0,3,1) and was replacing this gradient with a plain grey line —
   and the left-to-right red -> navy is the whole point of the rail, since it is
   what puts the direction of travel in the artwork instead of leaving it to
   reading order. */
body.public-body .steps-track::before,
body.public-body .section-band-navy .steps-track::before,
body.public-body .how-buying-section .steps-track::before {
    content: '';
    position: absolute;
    /* 1.45rem is the disc's centre line; the -1px centres the 2px rail ON it
       rather than hanging it below. */
    top: calc(1.45rem - 1px);
    left: 10%;
    right: 10%;
    height: 2px;
    border-radius: 999px;
    /* !important because the band rule at ~6429 paints its flat hairline with
       !important too — source order alone does not beat it. */
    background: linear-gradient(90deg, #b11d29 0%, #b11d29 22%, #36598d 52%, #13436b 78%, #36598d 100%) !important;
    opacity: 0.9;
    z-index: 0;
}
/* Declared after the rail so it wins on source order at equal specificity. */
@media (min-width: 768px) {
    body.public-body .steps-track.steps-track-four::before {
        left: 12.5%;
        right: 12.5%;
    }
}
body.public-body .steps-track .step-node:not(:last-child)::before { display: none !important; }
body.public-body .step-node::after { content: none !important; }

body.public-body .steps-track .step-node {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.55rem;
    padding: 0 0.75rem;
    /* the cards are gone */
    background: none !important;
    border: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    backdrop-filter: none !important;
    transform: none !important;
    transition: transform 0.18s cubic-bezier(0.22, 1, 0.36, 1);
}
/* The hover state has to re-null the card, not just lift it. Two earlier
   band passes still paint `.how-buying-section .step-node:hover` at (0,4,1)
   — the same specificity as this rule — so without these four declarations
   a hovered node grows a translucent square panel and a drop shadow that
   the at-rest node does not have. */
body.public-body .steps-track .step-node:hover {
    transform: translateY(-3px) !important;
    background: none !important;
    border-color: transparent !important;
    box-shadow: none !important;
    backdrop-filter: none !important;
}

body.public-body .steps-track .step-number {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.9rem;
    height: 2.9rem;
    margin: 0;
    border-radius: 999px;
    border: 0;
    font-family: 'Inter', sans-serif;
    font-size: 1.05rem;
    font-weight: 800;
    /* At rest every disc is WHITE — the track reads as a row of empty markers,
       so the one filled disc is a STATE rather than decoration. The number ink
       is brand navy, which keeps a white disc inside the palette. */
    color: #0b1f3d;
    background: linear-gradient(180deg, #ffffff 0%, #eef3f9 100%);
    box-shadow:
        inset 0 0 0 1px rgba(11, 31, 61, 0.16),
        inset 0 -1px 0 rgba(11, 31, 61, 0.10),
        0 8px 18px -6px rgba(11, 31, 61, 0.35),
        0 0 0 5px var(--step-ring);
    transition:
        transform 0.18s cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 0.18s ease,
        background 0.18s ease,
        color 0.18s ease;
}
/* The 5px ring punches the rail out from behind each disc, so it has to be the
   SURFACE colour rather than a fixed navy — the same rail also renders on the
   white SEO landing sections, where a navy ring reads as a drawn circle.

   Both declarations live on the TRACK, never on `.step-number`: a custom
   property set on the disc itself would beat the inherited band value, and the
   navy override below would silently do nothing. */
body.public-body .steps-track {
    --step-ring: rgba(255, 255, 255, 0.94);
}
body.public-body .section-band-navy .steps-track,
body.public-body .how-buying-section .steps-track {
    --step-ring: rgba(11, 31, 61, 0.55);
}
/* The legacy red/navy modifier classes are inert on this track: a disc's
   colour is positional (step 1) or interactive (hover), never authored into
   the markup, so every page using the rail renders the same states. */
body.public-body .steps-track .step-number-red,
body.public-body .steps-track .step-number-navy {
    background: linear-gradient(180deg, #ffffff 0%, #eef3f9 100%);
}
/* Step 1 is the entry point, so it ships pre-selected in JHB red. */
body.public-body .steps-track .step-node:first-child .step-number {
    color: #ffffff;
    background: linear-gradient(180deg, #b11d29 0%, #b11d29 52%, #b11d29 100%);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.24),
        inset 0 -1px 0 rgba(11, 31, 61, 0.18),
        0 8px 20px -6px rgba(177, 29, 41, 0.60),
        0 0 0 5px var(--step-ring);
}
/* Hover fills any disc with the same red, so pointing at a step previews the
   selected state. Declared last so it also holds step 1 steady instead of
   letting the white base flash back through it.

   The shadow stack is restated in full — an earlier pass replaces it with a
   plain drop shadow, and losing the 5px ring lets the rail show through the
   disc for the length of the hover. */
body.public-body .steps-track .step-node:hover .step-number {
    transform: scale(1.06) !important;
    color: #ffffff;
    background: linear-gradient(180deg, #b11d29 0%, #b11d29 52%, #b11d29 100%);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.26),
        inset 0 -1px 0 rgba(11, 31, 61, 0.18),
        0 12px 26px -6px rgba(177, 29, 41, 0.60),
        0 0 0 5px var(--step-ring) !important;
}

/* Copy ink follows the surface, same as --step-ring above: this rail also
   renders on the white SEO landing sections, where the navy-band white was
   painting the titles white-on-white and the step copy near-invisible. Dark is
   the default; the navy bands re-assert their own ink below. */
body.public-body .steps-track .step-title {
    margin: 0;
    font-family: 'Inter', sans-serif;
    font-size: 1.02rem;
    font-weight: 800;
    letter-spacing: -0.01em;
    color: #0b1f3d !important;
}
body.public-body .steps-track .step-body {
    margin: 0;
    max-width: 15rem;
    font-size: 0.87rem;
    line-height: 1.5;
    text-align: center;
    color: #13436b !important;
}
body.public-body .section-band-navy .steps-track .step-title,
body.public-body .how-buying-section .steps-track .step-title {
    color: #ffffff !important;
}
body.public-body .section-band-navy .steps-track .step-body,
body.public-body .how-buying-section .steps-track .step-body {
    /* 6.3:1 on the navy band — the old value sat under AA for body copy. */
    color: #ffffff !important;
}

/* ── Phones: the rail turns vertical and the copy sits beside each node ──
   Five columns at 375px gives each step ~60px, which wraps every title onto
   three lines. Vertical keeps the same "one path with a start" reading. */
@media (max-width: 767px) {
    body.public-body .steps-track {
        grid-template-columns: 1fr;
        gap: 1.4rem;
        padding-left: 0.5rem;
    }
    body.public-body .steps-track::before,
    body.public-body .section-band-navy .steps-track::before,
    body.public-body .how-buying-section .steps-track::before {
        /* 0.5rem track padding + half of the 2.5rem disc = 1.75rem. (It read
           1.95rem while the deleted 9j shell was forcing 1.1rem of padding
           the absolutely-positioned rail never saw.) */
        top: 1.25rem;
        bottom: 1.25rem;
        left: calc(1.75rem - 1px);
        right: auto;
        width: 2px;
        height: auto;
        background: linear-gradient(180deg, #b11d29 0%, #b11d29 22%, #36598d 52%, #13436b 78%, #36598d 100%);
    }
    body.public-body .steps-track .step-node {
        flex-direction: row;
        align-items: flex-start;
        gap: 1rem;
        padding: 0;
        text-align: left;
    }
    body.public-body .steps-track .step-number { flex: 0 0 auto; width: 2.5rem; height: 2.5rem; font-size: 0.95rem; }
    body.public-body .steps-track .step-title,
    body.public-body .steps-track .step-body { text-align: left; }
    body.public-body .steps-track .step-body { max-width: none; }
    /* The title and copy stack to the right of the node. */
    body.public-body .steps-track .step-node > .step-number { margin-top: 0.1rem; }
    body.public-body .steps-track .step-node { display: grid; grid-template-columns: auto 1fr; column-gap: 1rem; row-gap: 0.2rem; }
    body.public-body .steps-track .step-node > .step-number { grid-row: 1 / span 2; }
}

@media (prefers-reduced-motion: reduce) {
    body.public-body .steps-track .step-node,
    body.public-body .steps-track .step-number { transition: none !important; }
    body.public-body .steps-track .step-node:hover,
    body.public-body .steps-track .step-node:hover .step-number { transform: none !important; }
}

/* ===================================================================
   Cash Buyers List card (the CTA band's white panel) — matched to the
   Contact Team and Refer Buyers cards: light-gray face, defined rim.

   ONE rule for BOTH copies of this markup: the static one in
   index.html and the one public-cta-band.js injects above the footer
   on every other page. Editing either alone leaves the other white.

   The rim is a flat 2px gray here rather than the off-white→white
   gradient those two carry: this card sits on a NAVY band, where a
   near-white gradient rim reads as part of the card and the panel
   loses the edge the gradient was supposed to give it.
   =================================================================== */
body.public-body .buyer-network-shell > .rounded-3xl.bg-white {
    background: #eef3f9 !important;
    border: 2px solid #dfe8f3 !important;
}

/* =====================================================================
   RAY PARALLAX — SCROLL-COST FIX (2026-08-02)
   The hero was the one section of the site that visibly stuttered under
   the finger while every band past it scrolled clean. It was not the
   filter, the mask, the blend or the PNG: rayParallax() writes
   --raySlide / --rayPar onto each band once a frame, and an UNREGISTERED
   custom property INHERITS, so each write dragged that section's entire
   subtree through style recalc. An unused --zzz property measured exactly
   as expensive as --raySlide, which is the proof it was inheritance and
   never paint. Registering both properties as inherits:false confines the
   write to the section itself; each ray sheet then asks for the value
   back with an explicit "inherit", so the computed transform and
   background-position are byte-identical to before — same pixels, same
   choreography, no design change.

   Measured on the live home page, per write + forced style flush,
   4x CPU throttle:
     .site-hero   16.0ms -> 2.2ms      .site-footer 21.2ms -> 1.6ms
     .how-buying  11.5ms -> 1.4ms      .site-cta-band 10.5ms -> 1.3ms

   EVERY consumer of these two properties must be listed below. A ray
   sheet left off the bridge does not error — it silently freezes at the
   0px initial value and its parallax just stops. Browsers without
   @property ignore the registration, the properties stay inheriting, and
   the "inherit" declarations resolve to the same value anyway.
   ===================================================================== */
@property --raySlide { syntax: '<length>'; inherits: false; initial-value: 0px; }
@property --rayPar   { syntax: '<length>'; inherits: false; initial-value: 0px; }

body.public-body .hero-orb,
body.public-body .stats-band-premium > div,
body.public-body .section-band-navy::after,
body.public-body .how-buying-section::after,
body.public-body .recently-sold-section::after,
body.public-body .site-cta-band::before,
body.public-body .stats-band-premium > div::before,
body.public-body .site-footer::after,
body.public-body [data-home-section="why-us"]::before,
body.public-body [data-home-section="faq"]::before,
body.public-body [data-home-section="trust-bar"]::before,
body.public-body section[aria-labelledby="areas-heading"]::before {
    --raySlide: inherit;
    --rayPar: inherit;
}


/* =====================================================================
   BUY-BOX MATCH QUIZ (/match) — premium surface
   ---------------------------------------------------------------------
   The quiz used to be inline-styled hex soup with a single fill bar,
   center-ragged chip rows and a Back button hidden with
   `visibility:hidden` (which still ate its own row height). Everything
   the quiz paints now comes from these classes so it inherits the same
   tokens as the rest of the public site and every row has ONE alignment
   rule instead of one per element.

   Layout invariants worth keeping:
     - .quiz-body has a min-height so advancing a step never jumps the
       page; the four steps differ in height by ~180px.
     - .quiz-nav is a 3-column grid (back | hint | next) so the hint text
       centers against the CARD, not against whatever is left over
       between two buttons of different widths.
     - Chips are a flex row that starts at the left edge. Centering them
       is what produced the ragged pyramid in the old build.
   ===================================================================== */
body.public-body .quiz-shell {
    max-width: 44rem;
    margin: 0 auto;
}
body.public-body .quiz-card {
    position: relative;
    background: var(--surface-0);
    border: 1px solid var(--line-soft);
    border-radius: var(--public-radius-xl);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 2px 6px rgba(11, 31, 61, 0.03),
        0 18px 44px -18px rgba(11, 31, 61, 0.18),
        0 40px 80px -40px rgba(11, 31, 61, 0.22);
    padding: clamp(1.35rem, 3.2vw, 2.25rem);
    overflow: hidden;
}
/* Gold-to-crimson hairline rail — the email-template DNA (brand call
   2026-07-18), carried over verbatim from the deleted #quizCard pass. */
body.public-body .quiz-card::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    background: linear-gradient(90deg, #f5b301 0%, #f5b301 45%, #d93240 100%);
    pointer-events: none;
}

/* -- Header: step counter + segmented progress -- */
body.public-body .quiz-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 0.7rem;
}
body.public-body .quiz-step-label {
    font-family: 'Inter', sans-serif;
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--brand-red);
}
body.public-body .quiz-step-count {
    font-family: 'Inter', sans-serif;
    font-size: 0.78rem;
    font-weight: 700;
    color: var(--ink-muted);
    font-variant-numeric: tabular-nums;
}
body.public-body .quiz-progress {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    gap: 6px;
    margin-bottom: clamp(1.25rem, 2.6vw, 1.75rem);
}
body.public-body .quiz-seg {
    height: 6px;
    border-radius: 999px;
    background: var(--surface-3);
    overflow: hidden;
    position: relative;
}
body.public-body .quiz-seg::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: linear-gradient(135deg, var(--brand-red), var(--brand-red-deep));
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform 320ms var(--ease-out);
}
body.public-body .quiz-seg.is-done::after { transform: scaleX(1); }

/* -- Question block -- */
/* Sized to the tallest step once the option steps go two-up, so advancing
   never resizes the card under the pointer and no step shows dead air. */
body.public-body .quiz-body { min-height: 17.5rem; }
body.public-body .quiz-q-title {
    font-family: 'Inter', 'Inter', sans-serif;
    font-size: clamp(1.25rem, 2.6vw, 1.55rem);
    font-weight: 800;
    letter-spacing: -0.018em;
    color: var(--brand-navy);
    margin: 0;
}
body.public-body .quiz-q-sub {
    font-size: 0.88rem;
    color: var(--ink-muted);
    margin: 0.3rem 0 0;
}
/* The question header owns its own bottom margin so no step repeats one. */
body.public-body .quiz-q-head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 1.1rem;
}
body.public-body .quiz-bulk {
    display: inline-flex;
    gap: 0.3rem;
    flex-shrink: 0;
}
body.public-body .quiz-bulk button {
    border: 1px solid var(--line);
    background: var(--surface-1);
    color: var(--ink-muted);
    border-radius: var(--radius-xs);
    padding: 0.3rem 0.6rem;
    font-size: 0.72rem;
    font-weight: 700;
    font-family: 'Inter', sans-serif;
    cursor: pointer;
    transition: color var(--transition-fast), border-color var(--transition-fast), background var(--transition-fast);
}
body.public-body .quiz-bulk button:hover {
    color: var(--brand-navy);
    border-color: var(--line-strong);
    background: var(--surface-0);
}

/* -- Chips (counties, property types) -- */
body.public-body .quiz-chips {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    gap: 0.55rem;
}
body.public-body .quiz-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    border: 1.5px solid var(--line);
    background: var(--surface-0);
    color: var(--ink-body);
    border-radius: 999px;
    padding: 0.55rem 1rem;
    font-family: 'Inter', sans-serif;
    font-size: 0.9rem;
    font-weight: 600;
    line-height: 1.2;
    cursor: pointer;
    box-shadow: 0 1px 2px rgba(11, 31, 61, 0.04);
    transition: transform var(--transition-fast), border-color var(--transition-fast),
                background var(--transition-fast), color var(--transition-fast),
                box-shadow var(--transition-fast);
}
body.public-body .quiz-chip:hover {
    transform: translateY(-1px);
    border-color: var(--line-strong);
    box-shadow: 0 6px 14px -8px rgba(11, 31, 61, 0.28);
}
/* The tick is always in the box and only becomes visible when selected, so
   a chip is exactly the same width checked and unchecked and the rows
   never reflow as you tap through them. */
body.public-body .quiz-chip::before {
    content: '';
    width: 0.85rem;
    height: 0.85rem;
    flex: none;
    border-radius: 999px;
    border: 1.5px solid var(--line-strong);
    background: transparent;
    transition: background var(--transition-fast), border-color var(--transition-fast),
                box-shadow var(--transition-fast);
}
body.public-body .quiz-chip[aria-pressed="true"] {
    border-color: rgba(19, 67, 107, 0.6);
    background: linear-gradient(180deg, #eef3f9, #eef3f9);
    color: var(--brand-navy-deep);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 4px 12px -6px rgba(11, 31, 61, 0.35);
}
body.public-body .quiz-chip[aria-pressed="true"]::before {
    background: var(--brand-navy);
    border-color: var(--brand-navy);
    box-shadow: inset 0 0 0 2px #ffffff;
}

/* -- Option rows (strategy, price ceiling) -- */
/* Two-up above 560px. Stacked, these steps ran ~410px against a 136px
   property-types step, and a min-height sized to the tallest left a third of
   the card empty on every other step. Two columns pulls all four steps into
   the same band, so the card can hold ONE height without dead air. */
body.public-body .quiz-options {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 0.6rem;
}
@media (min-width: 560px) {
    body.public-body .quiz-options { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    /* An odd count would otherwise leave a half-width orphan on the last row. */
    body.public-body .quiz-opt:last-child:nth-child(odd) { grid-column: 1 / -1; }
}
body.public-body .quiz-opt {
    display: flex;
    align-items: center;
    gap: 0.8rem;
    width: 100%;
    text-align: left;
    border: 1.5px solid var(--line);
    background: var(--surface-0);
    border-radius: var(--radius-md);
    padding: 0.9rem 1rem;
    font-family: 'Inter', sans-serif;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--ink-body);
    cursor: pointer;
    box-shadow: 0 1px 2px rgba(11, 31, 61, 0.04);
    transition: transform var(--transition-fast), border-color var(--transition-fast),
                background var(--transition-fast), box-shadow var(--transition-fast);
}
body.public-body .quiz-opt:hover {
    transform: translateY(-1px);
    border-color: var(--line-strong);
    box-shadow: 0 8px 18px -12px rgba(11, 31, 61, 0.35);
}
body.public-body .quiz-opt-mark {
    width: 1.15rem;
    height: 1.15rem;
    flex: none;
    border-radius: 0.4rem;
    border: 1.5px solid var(--line-strong);
    position: relative;
    transition: background var(--transition-fast), border-color var(--transition-fast);
}
/* Single-answer steps read as radios, multi-answer steps as checkboxes. */
body.public-body .quiz-opt[data-single="1"] .quiz-opt-mark { border-radius: 999px; }
body.public-body .quiz-opt-mark::after {
    content: '';
    position: absolute;
    inset: 0.28rem;
    border-radius: inherit;
    background: #ffffff;
    opacity: 0;
    transition: opacity var(--transition-fast);
}
body.public-body .quiz-opt[aria-pressed="true"] {
    border-color: rgba(19, 67, 107, 0.6);
    background: linear-gradient(180deg, #eef3f9, #eef3f9);
    color: var(--brand-navy-deep);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 6px 16px -10px rgba(11, 31, 61, 0.4);
}
body.public-body .quiz-opt[aria-pressed="true"] .quiz-opt-mark {
    background: var(--brand-navy);
    border-color: var(--brand-navy);
}
body.public-body .quiz-opt[aria-pressed="true"] .quiz-opt-mark::after { opacity: 1; }
body.public-body .quiz-opt-text { display: flex; flex-direction: column; gap: 0.1rem; }
body.public-body .quiz-opt-note {
    font-size: 0.78rem;
    font-weight: 500;
    color: var(--ink-muted);
}

/* -- Footer nav -- */
body.public-body .quiz-nav {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    align-items: center;
    gap: 0.75rem;
    margin-top: clamp(1.35rem, 2.8vw, 1.9rem);
    padding-top: 1.15rem;
    border-top: 1px solid var(--line-soft);
}
body.public-body .quiz-nav .quiz-back { justify-self: start; }
body.public-body .quiz-nav .quiz-next { justify-self: end; }
body.public-body .quiz-back {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    border: 1px solid var(--line);
    background: var(--surface-1);
    color: var(--ink-body);
    border-radius: var(--radius-sm);
    padding: 0.72rem 1.1rem;
    font-family: 'Inter', sans-serif;
    font-weight: 700;
    font-size: 0.9rem;
    cursor: pointer;
    transition: background var(--transition-fast), border-color var(--transition-fast), opacity var(--transition-fast);
}
body.public-body .quiz-back:hover:not(:disabled) { background: var(--surface-0); border-color: var(--line-strong); }
/* Disabled, never hidden: keeping the button in flow is what stops the
   footer row from shifting between step 1 and step 2. */
body.public-body .quiz-back:disabled { opacity: 0.4; cursor: default; }
body.public-body .quiz-hint {
    font-size: 0.8rem;
    font-weight: 600;
    color: var(--ink-faint);
    text-align: center;
    min-height: 1.1rem;
}
body.public-body .quiz-hint.is-error { color: var(--brand-red); }

/* -- Result state -- */
body.public-body .quiz-result { text-align: center; }
body.public-body .quiz-count {
    font-family: 'Inter', sans-serif;
    font-size: clamp(3rem, 9vw, 4rem);
    font-weight: 800;
    line-height: 1;
    letter-spacing: -0.03em;
    color: var(--brand-red);
    font-variant-numeric: tabular-nums;
}
body.public-body .quiz-count-label {
    font-family: 'Inter', sans-serif;
    font-weight: 700;
    color: var(--brand-navy);
    margin-top: 0.3rem;
}
body.public-body .quiz-teasers { display: grid; gap: 0.5rem; margin: 1.25rem 0; }
body.public-body .quiz-teaser {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    border: 1px solid var(--line-soft);
    border-radius: var(--radius-md);
    background: linear-gradient(180deg, var(--surface-1), var(--surface-2));
    padding: 0.8rem 0.95rem;
    font-family: 'Inter', sans-serif;
    font-weight: 700;
    color: var(--brand-navy-deep);
    text-align: left;
}
/* Only the identifying half is blurred. The buyer can read the price and
   the type, which is what makes the locked half worth unlocking. */
body.public-body .quiz-teaser-locked {
    filter: blur(4px);
    user-select: none;
    flex: 1;
    min-width: 0;
}
body.public-body .quiz-teaser-open {
    flex: none;
    font-size: 0.85rem;
    color: var(--ink-muted);
    font-weight: 600;
}

/* Answer recap - every chip jumps back to the step that set it. */
body.public-body .quiz-recap {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.4rem;
    margin: 0 0 1.1rem;
}
body.public-body .quiz-recap-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    border: 1px solid var(--line);
    background: var(--surface-1);
    border-radius: 999px;
    padding: 0.3rem 0.7rem;
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--ink-body);
    cursor: pointer;
    font-family: 'Inter', sans-serif;
    transition: border-color var(--transition-fast), color var(--transition-fast);
}
body.public-body .quiz-recap-chip:hover { border-color: var(--brand-navy); color: var(--brand-navy); }
body.public-body .quiz-recap-edit {
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--brand-red);
}

/* -- Signup form inside the result -- */
body.public-body .quiz-form {
    display: grid;
    gap: 0.6rem;
    max-width: 26rem;
    margin: 0 auto;
    text-align: left;
}
/* 1rem = 16px, the threshold below which iOS Safari zooms the viewport on
   focus. The shared .public-form-input sits at 0.92rem, which is right for a
   dense form and wrong for the last field in a funnel. */
body.public-body .quiz-form .public-form-input {
    font-size: 1rem;
    padding: 0.8rem 0.95rem;
    border-radius: var(--radius-md);
}
body.public-body .quiz-consent {
    display: flex;
    align-items: flex-start;
    gap: 0.55rem;
    font-size: 0.8rem;
    line-height: 1.45;
    color: var(--ink-muted);
    border: 1px solid var(--line-soft);
    border-radius: var(--radius-sm);
    background: var(--surface-1);
    padding: 0.6rem 0.7rem;
    cursor: pointer;
    transition: border-color var(--transition-fast), background var(--transition-fast);
}
body.public-body .quiz-consent:hover { border-color: var(--line); background: var(--surface-0); }
body.public-body .quiz-consent input { margin-top: 0.15rem; flex: none; accent-color: var(--brand-navy); }
body.public-body .quiz-msg { font-size: 0.85rem; text-align: center; min-height: 1.05rem; }
body.public-body .quiz-msg.is-error { color: var(--brand-red); font-weight: 600; }

/* Loading + done states share the result box, so they share its padding. */
body.public-body .quiz-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.6rem;
    padding: 2.5rem 0;
    color: var(--ink-body);
    font-weight: 600;
}

@media (max-width: 480px) {
    body.public-body .quiz-nav {
        grid-template-columns: 1fr 1fr;
        row-gap: 0.6rem;
    }
    body.public-body .quiz-hint { grid-column: 1 / -1; order: -1; }
    body.public-body .quiz-body { min-height: 22rem; }
}

/* ---------------------------------------------------------------------------
   `.hidden` MUST WIN on the elements the page actually toggles it on.

   Tailwind's `.hidden` is (0,1,0) and loads FIRST on every buyer page, so any
   component rule that sets `display` beats it -- on specificity when the rule is
   scoped `body.public-body .x` (0,2,1), and on plain source order when it is not
   (deal-detail-base.css defines a bare `.deal-detail-row`, loaded after tailwind).
   Either way the JS adds the class, nothing moves, and the failure is silent: the
   toggle looks correct in every code review and in jsdom, which loads no CSS.

   A blanket `body.public-body .hidden { display: none !important }` would be the
   obvious fix and it is WRONG: `hidden md:flex` is the responsive nav idiom on
   every page here (hidden on mobile, flex from md up), and forcing it would delete
   the desktop navigation site-wide. So this list is per-class and deliberate.

   Measured 2026-08-18 by adding `.hidden` to each of the 125 elements the public
   JS toggles it on, across 15 pages, and reading the computed display back. These
   nine were immune. Two were visibly wrong at the time: install.html's
   "You're already using the app" badge showed to visitors who had not installed
   it, and faq.html's clear-search X showed over an empty search box.
   --------------------------------------------------------------------------- */
body.public-body .section-eyebrow.hidden,
body.public-body .deal-detail-row.hidden,
body.public-body .install-os-badge.hidden,
body.public-body .faq-search-clear.hidden,
body.public-body .avatar-edit-btn.hidden,
body.public-body .bb-mode.hidden,
body.public-body .profile-empty.hidden,
body.public-body .profile-security-row.hidden,
body.public-body .btn-navy.hidden { display: none !important; }
/* !important is needed on at least one of these: public-ui.css already declares
   `body.public-body .btn-navy { display: inline-flex !important }` a few hundred
   lines up, which no amount of specificity beats. It is applied to the whole list
   because the list is CLOSED and measured -- none of these nine classes is ever
   written with a responsive display utility (checked: 0 co-occurrences with
   sm:/md:/lg:/xl: flex|block|grid), which is the only case where forcing `.hidden`
   would be wrong. */


/* ===========================================================================
   THE COMMITMENT LEDGER  (.oc-*)
   ---------------------------------------------------------------------------
   The last thing a buyer sees before submitting an offer: three promises —
   funding source, close date, offer terms — each one RESTATING the answer they
   just gave, each confirmed on its own row.

   Why it is built this way rather than as three checkboxes down the form:

     • A checkbox farm gets ticked in one pass without reading. A row that opens
       with the buyer's OWN answer ("hard money", "Saturday September 12th") is
       a sentence about them, and it gets read.
     • The answer and the promise share a line, so changing the answer visibly
       revokes the tick (.is-stale) instead of leaving a promise attached to a
       value nobody agreed to.
     • The submit button counts what is left, so the gate is visible BEFORE the
       press. A refusal after the press is the same information delivered at the
       worst possible moment.

   Both offer surfaces render it: the deal-page modal (deal-detail.html) and the
   standalone /offer page (worker.js). One stylesheet, so they cannot drift.

   Brand: navy carries the confirmed state, red carries the top accent bar and
   nothing else here. No third hue, no side stripe, no glass.
   =========================================================================== */

.oc-ledger {
    position: relative;
    margin-top: 22px;
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
    background: var(--surface-0);
    box-shadow: var(--shadow-md);
    overflow: hidden;
}

/* The sanctioned 3px red-to-navy accent, on the TOP edge. Never a side stripe. */
.oc-ledger::before {
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 3px;
    background: linear-gradient(90deg, var(--brand-red) 0%, var(--brand-red-deep) 38%, var(--brand-navy) 100%);
}

.oc-head {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 6px 12px;
    padding: 20px 22px 14px;
}

/* The heading takes its own line at EVERY width. Sharing a row with the subline and
   the meter, it wrapped the sentence mid-phrase whenever the panel was narrow — and
   the panel is narrower inside the deal-page modal than on /offer, so the two surfaces
   broke differently. A container query would be the precise tool; a full-width heading
   is the one that needs no width to be right. */
.oc-head h3 {
    flex: 1 1 100%;
    margin: 0;
    font-size: 1.0625rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    color: var(--ink-strong);
    line-height: 1.3;
}

.oc-sub {
    margin: 0;
    flex: 1 1 220px;
    font-size: 0.8125rem;
    line-height: 1.5;
    color: var(--ink-muted);
}

/* Tabular numerals so 0 of 3 -> 1 of 3 does not jitter the line as it counts up. */
.oc-count {
    font-variant-numeric: tabular-nums;
    font-weight: 700;
    color: var(--brand-navy);
    white-space: nowrap;
}

/* Completion is carried by NAVY and by the copy, never by a green. DESIGN.md's
   Status-Is-Not-Brand rule keeps the success/danger/warning ramp inside the operator
   OS: a buyer sees two voices, navy for trust and red for urgency. A green tick here
   would be a third hue on a buyer surface, which is exactly what that rule forbids. */
.oc-ledger.is-complete .oc-count { color: var(--brand-navy-deep); }

/* Three segments, one per promise. State, not decoration: it is the only thing
   on the panel that answers "how much of this is left" without reading rows. */
.oc-meter {
    flex: 0 0 auto;
    display: flex;
    gap: 4px;
    width: 84px;
    margin-left: auto;
}

.oc-meter i {
    flex: 1;
    height: 4px;
    border-radius: 999px;
    background: var(--line);
    transition: background-color 240ms var(--ease-out);
}

.oc-meter i.is-on { background: var(--brand-navy); }
.oc-ledger.is-complete .oc-meter i.is-on { background: var(--brand-navy-deep); }

.oc-rows {
    margin: 0;
    padding: 0;
    list-style: none;
    border-top: 1px solid var(--line-soft);
}

.oc-row + .oc-row { border-top: 1px solid var(--line-soft); }

/* The whole row is the label, so the entire block is the hit target — a 24px box
   is not a target on a phone held one-handed at the end of a long form. */
.oc-label {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    padding: 16px 22px;
    cursor: pointer;
    background: transparent;
    transition: background-color 200ms var(--ease-out);
    -webkit-tap-highlight-color: transparent;
}

.oc-label:hover { background: rgba(19, 67, 107, 0.035); }

/* Visually hidden, never display:none — it stays focusable and it is still the
   control the form posts. */
.oc-box {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: 0;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

.oc-mark {
    flex: none;
    position: relative;
    width: 24px;
    height: 24px;
    margin-top: 1px;
    border: 2px solid var(--line-strong);
    border-radius: 8px;
    background: var(--surface-0);
    transition: border-color 180ms var(--ease-out), background-color 180ms var(--ease-out),
        box-shadow 180ms var(--ease-out);
}

.oc-mark svg {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    stroke: #ffffff;
    stroke-width: 2.6;
    stroke-linecap: round;
    stroke-linejoin: round;
    fill: none;
    stroke-dasharray: 22;
    stroke-dashoffset: 22;
    transition: stroke-dashoffset 260ms var(--ease-out) 40ms;
}

.oc-label:hover .oc-mark { border-color: var(--brand-navy-soft); }

.oc-box:checked + .oc-mark {
    border-color: var(--brand-navy);
    background: linear-gradient(180deg, var(--brand-navy-soft) 0%, var(--brand-navy) 55%, var(--brand-navy-deep) 100%);
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.18) inset, 0 6px 14px -6px rgba(11, 31, 61, 0.5);
}

.oc-box:checked + .oc-mark svg { stroke-dashoffset: 0; }

/* The global focus ring cannot reach a visually-hidden input, so the drawn box
   wears it instead. */
.oc-box:focus-visible + .oc-mark {
    outline: 2px solid var(--brand-navy);
    outline-offset: 2px;
}

.oc-copy {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 3px;
}

/* THE THREE PARTS OF A ROW ARE THREE LINES. They are <span>s, so without this they
   are INLINE and the fine print runs straight on from the promise ("...that is the
   funding source I will use.Changing my funding source after a contract..."). The
   sentence a buyer is being asked to make has to be readable as its own sentence.
   min-width:0 so a long entity name wraps instead of pushing the row wide. */
.oc-body {
    display: flex;
    flex-direction: column;
    gap: 5px;
    min-width: 0;
}

.oc-title {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 8px;
    font-size: 0.6875rem;
    font-weight: 700;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--ink-muted);
}

/* The buyer's own answer, echoed. This is the half that makes the row readable at
   a glance, and the half that goes stale when they change their mind. */
.oc-answer {
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.01em;
    text-transform: none;
    color: var(--brand-navy);
    background: rgba(19, 67, 107, 0.08);
    border-radius: 999px;
    padding: 2px 9px;
    transition: background-color 200ms var(--ease-out), color 200ms var(--ease-out);
}

.oc-box:checked ~ .oc-copy .oc-answer {
    color: #ffffff;
    background: var(--brand-navy);
}

.oc-statement {
    font-size: 0.9375rem;
    font-weight: 600;
    line-height: 1.45;
    color: var(--ink-strong);
    text-wrap: pretty;
}

/* --ink-muted, never --ink-faint: this is the consequence, and it is the line
   most worth reading on the whole form. */
.oc-fine {
    font-size: 0.78125rem;
    line-height: 1.5;
    color: var(--ink-muted);
    max-width: 62ch;
    text-wrap: pretty;
}

/* A promise about an answer that has since changed is not a promise anybody made.
   The row SAYS so rather than silently unticking, which reads as a broken form. */
.oc-stale {
    display: none;
    align-items: center;
    gap: 6px;
    margin-top: 2px;
    font-size: 0.75rem;
    font-weight: 700;
    color: var(--brand-red-deep);
}

.oc-row.is-stale .oc-stale { display: flex; }
.oc-row.is-stale .oc-mark { border-color: var(--brand-red); }

.oc-foot { padding: 0 22px 20px; }

/* The gate, stated BEFORE the press. */
.oc-remaining {
    margin: 0 0 12px;
    font-size: 0.8125rem;
    font-weight: 600;
    line-height: 1.5;
    color: var(--ink-muted);
}

.oc-ledger.is-complete .oc-remaining {
    color: var(--ink-strong);
    font-weight: 700;
}

/* ---- the close-date field -------------------------------------------------
   A date, not a phrase. The chips are shortcuts, never the only answers — a buyer
   with a closing already booked types the day they booked. */

.oc-date-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-top: 8px;
}

.oc-chip {
    appearance: none;
    border: 1px solid var(--line);
    background: var(--surface-1);
    color: var(--ink-body);
    border-radius: 999px;
    padding: 6px 13px;
    font: inherit;
    font-size: 0.78125rem;
    font-weight: 600;
    line-height: 1;
    cursor: pointer;
    transition: border-color 160ms var(--ease-out), background-color 160ms var(--ease-out),
        color 160ms var(--ease-out), transform 160ms var(--ease-out);
}

.oc-chip:hover {
    border-color: var(--brand-navy-soft);
    background: var(--surface-0);
    color: var(--brand-navy);
}

.oc-chip:active { transform: translateY(1px); }

.oc-chip.is-on {
    border-color: var(--brand-navy);
    background: var(--brand-navy);
    color: #ffffff;
}

/* Reads the chosen date back in the house voice, so a buyer sees the day of the
   week before they promise it. Nobody commits to "2026-09-12"; people commit to
   a Saturday. */
.oc-datenote {
    margin: 8px 0 0;
    font-size: 0.8125rem;
    font-weight: 600;
    color: var(--brand-navy);
}

.oc-datenote.is-bad { color: var(--brand-red-deep); }

/* WHO IS CLOSING THIS. Stated on the form rather than after acceptance, because
   title work is already open at that office and a buyer planning to bring their
   own attorney needs the chance to walk away before they promise a close date.
   Navy, not a warning colour — this is a fact about the deal, not an alarm. */
.oc-attorney {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: 0 0 12px;
    padding: 14px 16px;
    border: 1px solid rgba(19, 67, 107, 0.16);
    border-radius: var(--radius-lg, 12px);
    background: rgba(19, 67, 107, 0.045);
    font-size: 0.8125rem;
    line-height: 1.55;
    color: #13436b;
}

.oc-attorney b { color: var(--brand-navy-deep); font-weight: 800; }

.oc-attorney[hidden] { display: none; }

@media (max-width: 480px) {
    .oc-head { padding: 18px 16px 12px; }
    .oc-label { padding: 14px 16px; gap: 12px; }
    .oc-foot { padding: 0 16px 18px; }
    .oc-meter { width: 66px; }
}

/* Motion here only ever conveys state, so the reduced-motion answer is the same
   states arriving instantly — never a version with the states removed. */
@media (prefers-reduced-motion: reduce) {
    .oc-meter i,
    .oc-label,
    .oc-mark,
    .oc-mark svg,
    .oc-answer,
    .oc-chip {
        transition-duration: 1ms !important;
        transition-delay: 0ms !important;
    }
    .oc-chip:active { transform: none; }
}

/* ---- FadeArc: the ONE loading spinner --------------------------------------
   The loading-ui.com FadeArc, ported from React/TSX. The two paths, both
   linearGradient stop sets and the translate(1.5 1.625) on each path are
   byte-identical to the original; they live inside the mask below.

   WHY A MASK AND NOT AN INLINE <svg>: the original resolves currentColor on
   the gradient stops, which a data-URI cannot do -- but a MASK is alpha-only,
   so the stop-opacities become the mask's alpha and `background: currentColor`
   supplies the colour. Identical result, and it buys the two things inline SVG
   could not: no per-instance gradient id (the React original needs useId()
   precisely because a duplicate id repaints every earlier arc document-wide),
   and a one-class element that drops into a single-quoted JS string, which is
   how roughly half of this codebase's call sites are written.

   Colour is inherited -- never hardcode a fill. Size with width/height or a
   size utility. Speed with --duration. Direction with .fade-arc-reverse.

   The @keyframes name is restated in db12.html and public-ui.css because a
   stylesheet cannot import lib/fade-arc.js; tests/fade-arc.test.js asserts all
   three still name the same animation. An unknown animation-name is not an
   error -- it simply never animates, and a stationary spinner reads as a hung
   request. */
@keyframes loading-ui-fade-arc-spin { to { transform: rotate(360deg); } }
.fade-arc {
  display: inline-block;
  flex: none;
  width: 1em;
  height: 1em;
  background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'%3E%3Cdefs%3E%3ClinearGradient id='l' x1='50%25' x2='50%25' y1='5.271%25' y2='91.793%25'%3E%3Cstop offset='0%25' stop-color='%23fff'/%3E%3Cstop offset='100%25' stop-color='%23fff' stop-opacity='.55'/%3E%3C/linearGradient%3E%3ClinearGradient id='t' x1='50%25' x2='50%25' y1='15.24%25' y2='87.15%25'%3E%3Cstop offset='0%25' stop-color='%23fff' stop-opacity='0'/%3E%3Cstop offset='100%25' stop-color='%23fff' stop-opacity='.55'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg fill='none'%3E%3Cpath d='M8.749.021a1.5 1.5 0 0 1 .497 2.958A7.5 7.5 0 0 0 3 10.375a7.5 7.5 0 0 0 7.5 7.5v3c-5.799 0-10.5-4.7-10.5-10.5C0 5.23 3.726.865 8.749.021' fill='url(%23l)' transform='translate(1.5 1.625)'/%3E%3Cpath d='M15.392 2.673a1.5 1.5 0 0 1 2.119-.115A10.48 10.48 0 0 1 21 10.375c0 5.8-4.701 10.5-10.5 10.5v-3a7.5 7.5 0 0 0 5.007-13.084a1.5 1.5 0 0 1-.115-2.118' fill='url(%23t)' transform='translate(1.5 1.625)'/%3E%3C/g%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'%3E%3Cdefs%3E%3ClinearGradient id='l' x1='50%25' x2='50%25' y1='5.271%25' y2='91.793%25'%3E%3Cstop offset='0%25' stop-color='%23fff'/%3E%3Cstop offset='100%25' stop-color='%23fff' stop-opacity='.55'/%3E%3C/linearGradient%3E%3ClinearGradient id='t' x1='50%25' x2='50%25' y1='15.24%25' y2='87.15%25'%3E%3Cstop offset='0%25' stop-color='%23fff' stop-opacity='0'/%3E%3Cstop offset='100%25' stop-color='%23fff' stop-opacity='.55'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg fill='none'%3E%3Cpath d='M8.749.021a1.5 1.5 0 0 1 .497 2.958A7.5 7.5 0 0 0 3 10.375a7.5 7.5 0 0 0 7.5 7.5v3c-5.799 0-10.5-4.7-10.5-10.5C0 5.23 3.726.865 8.749.021' fill='url(%23l)' transform='translate(1.5 1.625)'/%3E%3Cpath d='M15.392 2.673a1.5 1.5 0 0 1 2.119-.115A10.48 10.48 0 0 1 21 10.375c0 5.8-4.701 10.5-10.5 10.5v-3a7.5 7.5 0 0 0 5.007-13.084a1.5 1.5 0 0 1-.115-2.118' fill='url(%23t)' transform='translate(1.5 1.625)'/%3E%3C/g%3E%3C/svg%3E");
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  -webkit-mask-size: 100% 100%;
          mask-size: 100% 100%;
  animation: loading-ui-fade-arc-spin var(--duration, 1s) linear infinite;
}
.fade-arc.hidden { display: none; }
.fade-arc-reverse { animation-direction: reverse; }
.fade-arc-inline { display: inline-flex; align-items: center; gap: .5rem; }
.fade-arc-block { display: flex; flex-direction: column; align-items: center; gap: .75rem; }
@media (prefers-reduced-motion: reduce) {
  /* A composed still, not a stopped first frame. This mark is fully drawn at
     rest -- unlike the CMA build animations, whose first frame is an empty
     cell -- so parking it is already a complete picture; the tilt stops it
     reading as a mis-rendered ring. */
  .fade-arc { animation: none; transform: rotate(-30deg); }
}


/* ============================================================
   THE JHB RAY BAND
   ============================================================
   The navy bar every branded email now wears -- black-ray-effect
   anchored BOTTOM-LEFT over a 135deg navy ramp on a solid navy
   fallback -- built by emailHeaderBand() in lib/branded-email.js.
   This is the PUBLIC twin, and it is a FORCED restatement: that
   builder emits an inline HTML attribute run for an email <td>,
   and CSS cannot import it. So the copy is deliberate and the
   AGREEMENT is what gets guarded (tests/ray-band-is-one-band.test.js)
   rather than either side being pinned on its own.

   ONE class, three surfaces: the login hero, the front-page FAQ
   hand-off and launch.html's copy of it. Three hand-written
   backgrounds is how the email bar came to be six strings
   pretending to be one -- the whole reason for this round.

   WARNING The .webp is the public twin of the email's .png: same
   art, a third of the bytes, and a browser can be trusted with
   webp where an email client cannot. BOTH are allowlisted in
   .assetsignore; branding/** is dropped by default, so an asset
   that leaves that list 404s and the band silently degrades to
   flat navy with nothing on any screen to say why.

   WARNING The declarations mirror the email band one for one
   (image, position, size, repeat) rather than collapsing into a
   `background` shorthand, so the guard can compare them without
   parsing two different grammars. */
.jhb-ray-band {
    background-color: #13436b;
    background-image:
        none,
        linear-gradient(135deg, #13436b 0%, #0b1f3d 100%);
    background-position: left bottom, center;
    background-size: cover, auto;
    background-repeat: no-repeat, no-repeat;
}
