/* ============================================================
   HC WEB LABS — heather-cooper.com  ·  V2 FOUNDATION
   Built on: Neon Glow Style Guide v2

   STATUS (building section by section):
     ✓ Tokens / reset / base / layout · nav header + mobile menu
     ◐ Hero · Services · Portfolio (scroll-window cards + case
       modal) · About (coin-flip photo reveal) · Review console —
       all BUILT; COPY + SCREENSHOT PASSES PENDING (hero copy =
       Claude in Heather's voice — HER SEO PASS FINAL)
     ● Footer — floating chip console (straddles the seam 768+)
       over a 3-zone glass basement: logo / Reach <address> /
       Resources; legal bar = (c) left, Legal nav right
     ⚑ BRAND DIRECTION: all avenues — custom code, CMS, page
       builders — whatever serves the client
     ✗ Own pages, footer-linked (OFF the homepage): Connect,
       Pricing, Paperwork, FAQ, Standards

   COMPATIBILITY CONTRACT (audited):
   - Hard floor: early-2022 engines — Safari/iOS 15.4+, Chrome 99+
     (incl. 109 LTS on Win7/8.1), Firefox 97+/ESR. (@layer is the
     floor-setter: below it, layered styles drop entirely.)
   - Graceful above the floor: scroll-driven anims -> JS fallback;
     @starting-style/allow-discrete -> instant open/close;
     :has() lock -> .menu-open JS class; <dialog> missing -> .no-dialog
     static row; oklch -> hex; dvh -> vh; scrollbar-gutter -> no-op
     on overlay-scrollbar platforms (which never had the shift).
   - Accepted perf exception: the bar's condense animates height —
     a bounded 140px-range layout animation, chosen over transform
     tricks that would distort the bar's content.

   Rules of the house:
   - Mobile-first from 320px; min-width queries ONLY (480/640/768/1024/1280/1440)
   - No inline style attributes, ever (nonce CSP won't allow them)
   - All colors hex-first + oklch override; gradients are the 4 tokens
   - Fluid type + spacing; icon sizes from the --icon scale
   - transform/opacity-only animation; everything motion-gated
   - Never style the FA <i> for layout (FA is unlayered, it wins)
   ============================================================ */
@layer reset, base, layout, components, sections, utilities;

/* ---------------- TOKENS (custom props only — unlayered on purpose) ---------------- */
:root {
    /* Accents — HEX ONLY here. Custom properties accept any token
       stream at parse time, so the classic "hex first, modern second"
       double-declaration NEVER falls back — the later oklch line wins
       the cascade even in browsers that can't render oklch, and every
       var() use becomes invalid-at-computed-value-time (IACVT: the
       property collapses to inherit/initial, NOT the hex). The oklch
       overrides live in the @supports block AFTER this :root — same
       specificity, later in the sheet, applied only where supported.
       (oklch: Chrome 111+/FF 113+/Safari 15.4+ — the contract floor's
       Chrome 99-110 incl. 109 LTS, and FF 97-112, take the hex.) */
    --neon-pink: #ff2e97;
    --neon-purple: #C74AC0;
    --neon-aqua: #73FDFC;
    --neon-yellow: #FFD700;

    /* Glass tint — the coin backdrop's blue (purple sibling retired
       with the old single-gradient glow; the pools use the soft set) */
    --glass-blue: #3b82f6;

    /* Soft alphas (ported) — every accent's paired fill + hairline.
       The full pair set is kept as a SYSTEM even where a -line side
       is currently unconsumed: components reach for these in pairs. */
    --pink-soft:   rgba(255, 46, 151, 0.13);
    --pink-line:   rgba(255, 46, 151, 0.5);
    --purple-soft: rgba(199, 74, 192, 0.14);
    --purple-line: rgba(199, 74, 192, 0.5);
    --aqua-soft:   rgba(115, 253, 252, 0.11);
    --aqua-line:   rgba(115, 253, 252, 0.5);
    --yellow-soft: rgba(255, 215, 0, 0.12);
    --yellow-line: rgba(255, 215, 0, 0.5);

    /* Full-strength neon glow stacks (ported) — one token per accent */
    --glow-aqua:   0 0 7px var(--neon-aqua), 0 0 21px rgba(115, 253, 252, 0.6), 0 0 42px rgba(115, 253, 252, 0.3);
    --glow-pink:   0 0 7px var(--neon-pink), 0 0 21px rgba(255, 46, 151, 0.6), 0 0 42px rgba(255, 46, 151, 0.3);
    --glow-purple: 0 0 7px var(--neon-purple), 0 0 21px rgba(199, 74, 192, 0.6), 0 0 42px rgba(199, 74, 192, 0.3);
    --glow-yellow: 0 0 7px var(--neon-yellow), 0 0 21px rgba(255, 215, 0, 0.55), 0 0 42px rgba(255, 215, 0, 0.28);

    /* Glass surface kit (ported) */
    /* SOLID-FIRST GLASS: 0.42 relied on backdrop-filter for all its
       substance — but blur is a compositor effect that lags first
       paint, flashing every card transparent before the frost lands
       (field-caught). At 0.68 the film stands alone as a dark panel
       pre-blur; the frost arrives as enhancement, not structure. */
    --glass-bg: rgba(27, 20, 56, 0.68);
    --glass-border: rgba(182, 175, 214, 0.16);
    --glass-blur: 22px;

    /* Surfaces & text */
    --bg-base: #0e0a1f;
    --bg-deep: #1a1030;
    --text-primary: #f2effc; /* ported: softer than pure white — less glare on the void */
    --text-secondary: #e8e8f5;
    --text-muted: #c9c3e4; /* lightened from #b6afd6 — body copy read
        too dim on inner pages and the footer (field-caught) */

    /* Gradients — the only four in the system */
    --grad-cta: linear-gradient(135deg, var(--neon-pink), var(--neon-purple));
    --grad-hero: linear-gradient(90deg, var(--neon-yellow) 20%, var(--neon-pink) 50%, var(--neon-purple) 80%);
    --grad-separator: linear-gradient(90deg, transparent 0%, var(--neon-yellow) 25%, var(--neon-pink) 50%, var(--neon-purple) 75%, transparent 100%);
    /* Brand gradient: the hero stops rotated to 135deg with tuned
       positions (10/50/90) — the tag's diagonal, now shared by the
       social icons. Distinct from --grad-hero, which stays 90deg. */
    --grad-brand: linear-gradient(135deg, var(--neon-yellow) 10%, var(--neon-pink) 50%, var(--neon-purple) 90%);
    /* CTA-deep: the CTA gradient tuned 7-15% darker so WHITE text
       passes WCAG AA. Measured: white on #d82780 = 4.64:1, on
       #b944b2 = 4.63:1 (standard --grad-cta maxes at 3.45:1). */
    --grad-cta-deep: linear-gradient(135deg, #d82780, #b944b2);

    /* Type */
    --font-tech: 'Orbitron', sans-serif;
    --font-body: 'Saira', sans-serif;

    --fs-h1: clamp(1.85rem, 1.05rem + 4vw, 4rem); /* ~30px -> 64px.
       Floor tuned for 320 (longest word 'Improving' ~171px vs 288
       usable); cap eased to 64px so the full-sentence H1 wraps in
       two comfortable lines on desktop instead of three tight ones. */
    --fs-h2: clamp(1.75rem, 1.2rem + 2.75vw, 2.75rem); /* 28 -> 44px —
       section titles are neon signs now; they earn sign-sized type */
    --fs-h3: clamp(1.1rem, 1rem + 0.5vw, 1.25rem);

    --fs-body: clamp(1rem, 0.9583rem + 0.2083vw, 1.125rem); /* 16 -> 18px */
    --fs-md: 0.9375rem;   /* 15px — card/support copy */
    --fs-lg: clamp(1.15rem, 1.05rem + 0.5vw, 1.35rem); /* section lede — 18->22px (was used, never defined) */
    --fs-sm: 0.875rem;    /* 14px — UI labels, buttons, eyebrows */
    --fs-xs: 0.8125rem;   /* 13px — metadata, fine print */
    --fs-2xs: 0.75rem;    /* 12px — decorative micro-labels ONLY */
    --font-mono: ui-monospace, 'Cascadia Code', 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace; /* tl-log stamps (production set) */
    --error: #ff5470; /* danger — deliberately NOT the brand pink:
       #ff2e97 is an action color (CTAs, links) and using it for
       errors would poison those associations */
    --fs-3xs: 0.6875rem;  /* 11px — sub-floor exception class:
       tracked/uppercase DECORATIVE micro-labels (eyebrow mobile
       floor, card affordances). The 12px floor protects reading
       text; these are not that. */

    /* Menu display rows: viewport-HEIGHT fluid (20.8 -> 29.6px) —
       a full-screen composition scales with the screen's height */
    --fs-menu: clamp(1.3rem, 5vh, 1.85rem);

    /* Hero buttons: 13 -> 14px (floor tuned so the 25-char primary
       label fits a 320px viewport) */
    --fs-btn: clamp(0.8125rem, 0.76rem + 0.27vw, 0.875rem);

    /* Eyebrows: 11 -> 13px (mobile floor in --fs-3xs territory) */
    --fs-eyebrow: clamp(0.6875rem, 0.62rem + 0.35vw, 0.8125rem);

    --lh-heading: 1.25;  /* was 1.15 — too tight for Orbitron's tall
        glyphs at 800 weight; multi-line h2s stacked shoulder-to-shoulder
        (field-caught) */
    --lh-subhead: 1.3;
    --lh-snug: 1.5;
    --lh-base: 1.65;
    --lh-tight: 1.25;    /* alias used by display titles (was undefined) */
    --lh-normal: 1.6;    /* alias used by card/prose bodies (was undefined) */

    /* px steps for FIXED-SIZE text (labels, caps, UI chrome).
       Fluid DISPLAY type (hero/section titles) tracks in em as
       one-offs instead — em scales with the clamp; px doesn't. */
    --ls-base: 0.3px;
    --ls-wide: 1px;
    --ls-wider: 2px;

    /* Spacing philosophy: TOKENS govern the space BETWEEN things
       (section rhythm, act transitions, the wrap's lane). INSIDE a
       component, spacing is bespoke to that component — a chip's
       padding doesn't answer to a global scale. */
    --spacing-sm: 1rem; /* the wrap gutter at base */

    /* Section rhythm — ONE tuning point for the page's vertical
       breathing. --space-section is the base block padding; the act
       tokens are the section-transition recipe (incoming clearance /
       outgoing runway) that used to live as per-section clamps.
       Retuned DOWN ~30%: the neon separators now mark the act
       boundaries, so the raw distance can relax. */
    --space-section: clamp(4.5rem, 3rem + 6.5vw, 7.5rem); /* widened —
        sections sat too close even with separators (field-caught) */
    --space-act-in:  clamp(5.5rem, 13vh, 9.5rem);
    --space-act-out: clamp(5rem, 12vh, 8.5rem);

    --icon-sm: 1.05rem; /* the working icon size; larger glyphs size in em, in context */

    --radius-sm: 0.5rem;

    /* Nav link type: fluid — 15px floor, 16px+ from tablet up, 17px cap.
       (Body text itself is 16px/1rem at 320, scaling to 18px.) */
    --fs-nav: clamp(0.9375rem, 0.85rem + 0.35vw, 1.0625rem);

    /* Brand tag dimensions — the single tuning point for the logo
       tile. Faces are inset:0, so they follow automatically. */
    /* Coin sized to MATCH the 44px burger beside it — the two
       header objects read as one family now */
    --tag-w: 48px;
    --tag-h: 44px;

    /* Motion kit (ported): one curve, three speeds. --transition
       keeps its old name so every existing use upgrades in place. */
    --ease: cubic-bezier(0.33, 1, 0.68, 1);
    --fast: 160ms;
    --med: 320ms;
    --slow: 640ms;
    --transition: var(--med) var(--ease);

    /* Bar height: slim on mobile, stately on desktop (1024 media
       below). Everything derived — scroll-padding, hero offset —
       follows automatically. (Condense tokens retired with the
       scroll-condense; the floating panel holds its height.) */
    --header-h: 5.5rem; /* grown AGAIN by request — the panel now
        renders ~72px tall (bar minus its block margins) */

    /* Header offer tier RETIRED (strip + pill both) — the review
       CTAs live in the hero, services row, and footer. --header-total
       keeps its name so every derived offset (scroll-padding, hero
       pad, console math) tracks the bar unchanged. */
    --header-total: var(--header-h);

    /* 1240 leaves a deliberate 20px/side of breathing room at the
       1280 breakpoint (border-box: the 2rem gutters live inside).
       Held flat at all desktop widths — no 1440 step-up. */
    --wrap-max: 1240px;

    /* Z LADDER — the page-level stack, lowest to highest. Native
       <dialog>s ride the browser's TOP LAYER above all of these
       (no z-index needed — the modern win). Values inside
       components (coin shine -1, card overlays 1-2, etc.) are
       LOCAL stacking-context numbers and stay literal. */
    --z-atmosphere: 0;   /* body::before radial glow */
    --z-canvas: 1;       /* starfield canvas */
    --z-content: 2;      /* sections, hero, footer */
    --z-console: 3;      /* floating footer console */
    --z-header: 1000;    /* fixed header */
    --z-skip: 10001;     /* skip link — beats the header */
    --z-scanlines: 1001; /* CRT whisper — above the header glass;
                            dialogs (top layer) still beat it */

    /* Lets block-size transition to `auto` (FAQ accordion, later) */
    interpolate-size: allow-keywords;

    scrollbar-color: var(--neon-purple) rgba(168, 85, 247, 0.1);
    scrollbar-width: thin;
}

/* oklch overrides — the ONLY correct fallback mechanism for tokens
   (see the note at the hex declarations). Gate probes a full oklch
   color; browsers below the feature skip the whole block and keep
   the hex values from :root. */
@supports (color: oklch(60% 0.1 200)) {
    :root {
        --neon-pink: oklch(66.7% 0.249 356.7);
        --neon-purple: oklch(62% 0.208 330);
        --neon-aqua: oklch(91.8% 0.12 194.6);
        --neon-yellow: oklch(88.7% 0.182 95.3);
        --glass-blue: oklch(62.3% 0.188 259.8);
        --bg-base: oklch(16.4% 0.043 289.6);
        --bg-deep: oklch(20.6% 0.061 294.9);
        --text-secondary: oklch(93.5% 0.017 286.1);
    }
}

@media (min-width: 1024px) {
    :root {
        --header-h: 6rem;
    }
}

/* ---------------- RESET ---------------- */
@layer reset {
    *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }

    img, svg, video, canvas { max-width: 100%; display: block; }

    input, select, textarea { font: inherit; color: inherit; }

    button {
        font: inherit;
        color: inherit;
        background: none;
        border: none;
        cursor: pointer;
        text-align: inherit;
    }

    ul[class], ol[class] { list-style: none; }
}

/* ---------------- BASE ---------------- */
@layer base {
    @media (prefers-reduced-motion: no-preference) {
        html { scroll-behavior: smooth; }
    }

    html {
        /* WCAG 2.4.11 — anchored targets land clear of the fixed bar */
        scroll-padding-top: calc(var(--header-total) + 1rem);

        /* Reserve the scrollbar's lane permanently. Without this, the
           menu's scroll-lock hides the scrollbar, the viewport gains
           ~15px, and the whole page lurches sideways — then lurches
           back on close (extra visible through the circle reveal).
           With the gutter stable, hiding the scrollbar leaves an empty
           dark strip instead of reflowing the page. Safari <18.2 and
           all overlay-scrollbar platforms (macOS/iOS/Android) simply
           never had the problem, so the fallback is a no-op.
           KNOWN COSMETIC TRADEOFF: fixed layers (starfield, glow,
           header glass) can't paint into the gutter, so on classic-
           scrollbar platforms the lane reads as a faint flat seam at
           the right edge. Explicit background below keeps it exactly
           bg-base so the seam is tonal only, never a random color. */
        scrollbar-gutter: stable;
        background-color: var(--bg-base);
    }

    body {
        background: var(--bg-base);
        color: var(--text-primary);
        font-family: var(--font-body);
        font-size: var(--fs-body);
        line-height: var(--lh-base);
        letter-spacing: var(--ls-base);
        overflow-x: hidden; /* Safari 15.4-15.6 fallback (clip is 16.0+) */
        overflow-x: clip;
    }

    /* Background stack layer 2: fixed radial glow (layer 3 = starfield canvas) */
    /* Scanlines (ported) — the locked-vocabulary CRT whisper.
       Fixed, blend-overlay, pointer-transparent. */
    .scanlines {
        position: fixed;
        inset: 0;
        z-index: var(--z-scanlines);
        pointer-events: none;
        background: repeating-linear-gradient(to bottom,
            rgba(255, 255, 255, 0.02) 0 1px, transparent 1px 4px);
        mix-blend-mode: overlay;
    }

    body::before {
        content: "";
        position: fixed;
        inset: 0;
        z-index: var(--z-atmosphere);
        /* four-pool recipe (ported) — corners breathe in the triad */
        background:
            radial-gradient(42rem 28rem at 85% 0%, var(--purple-soft), transparent 68%),
            radial-gradient(36rem 24rem at 0% 30%, var(--aqua-soft), transparent 70%),
            radial-gradient(40rem 28rem at 100% 75%, var(--pink-soft), transparent 70%),
            radial-gradient(30rem 22rem at 15% 100%, var(--purple-soft), transparent 72%);
        pointer-events: none;
    }

    /* Scroll lock lives on html — the actual scroller — rather than
       relying on body-to-viewport overflow propagation. Pairs with
       scrollbar-gutter: stable above: locked, but no layout shift.
       Two routes to the same lock: :has() for free, plus a JS-toggled
       class covering browsers without :has() (Safari <15.4 relatives,
       Chromium <105). Same rule, either trigger. */
    /* SCROLL LOCK — at the BODY, never the root: overflow:hidden
       on <html> makes Chromium clamp the root scroller to 0, which
       is the notorious "page jumps to the top when a modal opens"
       bug. Body-level overflow propagates to the viewport (html
       stays visible), locking scroll while PRESERVING position.
       scrollbar-gutter keeps layout width stable when the bar
       vanishes, so the lock doesn't cause a sideways jolt either. */
    html:has(dialog[open]) body,
    html.menu-open body,
    html.modal-open body { overflow: hidden; }
    /* ^ .modal-open is the JS-toggled fallback for browsers
       without :has() — the case modal and lightbox set it, the
       nav dialog keeps its own .menu-open. Same lock, three
       triggers, zero browsers left out. */

    ::selection { background: var(--neon-pink); color: var(--bg-base); } /* ported: brand pink */

    /* The hidden LAW: author display rules (flex/grid on components)
       silently defeat the hidden attribute — this makes hidden mean
       hidden, everywhere, no exceptions (pagination depends on it) */
    [hidden] { display: none !important; }

    /* Ported hardening: where backdrop-filter doesn't exist, glass
       surfaces get a near-opaque fill instead of going see-through */
    @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
        .site-header__inner,
        .site-footer,
        .service-row,
        .form-panel,
        .element,
        .tl-log__card,
        .table-pane,
        .pay-panel,
        .post__body,
        .signal-card,
        .panel__chip,
        .note-card,
        .footer-console a { background: rgba(21, 15, 45, 0.94); }
    }

    :focus-visible {
        outline: 3px solid var(--neon-aqua);
        outline-offset: 3px;
    }

    /* Mobile: the OS's translucent blue tap box read as a stuck
       highlight on the logo (field-caught). Focus feedback is ours
       (:focus-visible above); the OS layer retires. */
    a, button, summary, [tabindex] {
        -webkit-tap-highlight-color: transparent;
    }

    /* The dialog's focus landing pad: real to the focus system,
       invisible to everything else */
    .nav-dialog__focus-pad {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        outline: none;
    }

    /* Instant close: link-tap navigation must not race a dying
       animation (field-caught stacking) */
    dialog.nav-dialog--instant,
    dialog.nav-dialog--instant::backdrop {
        transition: none !important;
        animation: none !important;
    }

    h1 { line-height: var(--lh-heading); text-wrap: balance; }
    h2 { line-height: var(--lh-heading); text-wrap: balance; }
    h3 { line-height: var(--lh-subhead); text-wrap: balance; }

    p { max-width: 65ch; }

    a { color: var(--neon-aqua); }

    .skip-link {
        position: absolute;
        left: -9999px;
        top: 0;
        z-index: var(--z-skip);
        padding: 0.75rem 1.25rem;
        background: var(--bg-deep);
        color: var(--neon-aqua);
        font-family: var(--font-tech);
        font-weight: 700;
        font-size: var(--fs-sm);
        text-decoration: none;
        border: 1px solid var(--neon-aqua);
        border-radius: 0 0 var(--radius-sm) 0;
    }

    .skip-link:focus-visible { left: 0; outline-offset: 0; }
}

/* ---------------- LAYOUT ---------------- */
@layer layout {
    .wrap {
        max-width: var(--wrap-max);
        margin-inline: auto;
        padding-inline: var(--spacing-sm);
    }

    @media (min-width: 640px)  { .wrap { padding-inline: 1.5rem; } }
    @media (min-width: 1280px) { .wrap { padding-inline: 2rem; } }

    .section {
        position: relative;
        z-index: var(--z-content);
        padding-block: var(--space-section);
        scroll-margin-top: calc(var(--header-total) + 1rem);
    }

    /* Act separators: the sanctioned gradient line rides each
       section's top edge — a lit boundary between the acts (the
       tightened rhythm leans on these to mark the transitions) */
    .section::before {
        content: "";
        position: absolute;
        top: 0;
        left: 50%;
        transform: translateX(-50%);
        width: min(60%, 600px);
        height: 2px;
        border-radius: 999px;
        background: var(--grad-separator);
        box-shadow: 0 0 12px rgba(255, 46, 151, 0.3), 0 0 24px rgba(199, 74, 192, 0.18);
        pointer-events: none;
    }

    }

/* ---------------- COMPONENTS (shared primitives the nav needs) ---------------- */
@layer components {

    /* Aurora ribbons — ambient light. Blur rasterizes once; only
       transform animates (compositor-cheap). Decorative always. */
    .aurora {
        position: absolute;
        border-radius: 999px;
        pointer-events: none;
        z-index: -1;
        filter: blur(28px);
        opacity: 0.16;
        transform: rotate(var(--tilt, -14deg));
    }

    .aurora--pink { background: linear-gradient(90deg, transparent, var(--neon-pink), var(--neon-purple), transparent); }
    .aurora--aqua { background: linear-gradient(90deg, transparent, var(--neon-aqua), var(--glass-blue), transparent); }

    @media (prefers-reduced-motion: no-preference) {
        .aurora {
            animation: aurora-drift var(--dur, 26s) ease-in-out var(--delay, 0s) infinite alternate;
        }
    }

    @keyframes aurora-drift {
        from { transform: rotate(var(--tilt, -14deg)) translateX(-5%) scaleY(1); }
        to   { transform: rotate(var(--tilt, -14deg)) translateX(5%) scaleY(1.18); }
    }

    /* Circular icon buttons — 44px (WCAG 2.5.8) */
    .icon-circle {
        width: 44px;
        height: 44px;
        display: flex;
        align-items: center;
        justify-content: center;
        /* low-alpha brand glass: the same 135deg sweep as the tag,
           whispered — gold to pink to purple at ~8-10% opacity */
        background: linear-gradient(135deg, rgba(255, 215, 0, 0.08), rgba(255, 46, 151, 0.1), rgba(199, 74, 192, 0.08));
        border: 1px solid rgba(255, 46, 151, 0.3);
        border-radius: 50%;
        color: var(--text-primary);
        font-size: var(--icon-sm);
        text-decoration: none;
        transition: var(--transition);
    }

    .icon-circle:hover {
        /* pink glass — a quiet lift, not the full brand sweep */
        background: rgba(255, 46, 151, 0.15);
        border-color: rgba(255, 46, 151, 0.5);
        color: #fff;
        transform: translateY(-3px);
    }
}

/* ---------------- SECTIONS ---------------- */
@layer sections {

    /* ==================================================
       NAVIGATION — v2. IA: Services / Portfolio / About /
       Connect as peers; the Free-Review OFFER = pill CTA on
       desktop, top-tier strip on mobile. Two tiers below 768
       (strip + bar with burger); at 768 the strip retires and
       links + CTA enter the bar; 1024 the bar rises to 4.5rem
       with true-center links; 1280 wrap gutters widen. The bar
       is a FLOATING GLASS PANEL (ported skin) — rounded, ringed,
       always glass, hovering inside the wrap; the header shell
       stays transparent. Reading progress rides the panel's
       bottom edge; active link = glowing dot; links wear the
       //-prefix brand mark.
       ================================================== */

    .site-header {
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        z-index: var(--z-header);
        /* two stacked tiers: skinny offer strip + main bar. Height is
           the folded total; strip is fixed, inner flexes to the rest,
           so condensing the total shrinks only the bar portion. */
        display: flex;
        flex-direction: column;
        height: var(--header-total);
        /* the shell stays TRANSPARENT at all times — the floating
           glass panel (site-header__inner) carries the surface */
        background: transparent;
    }

    /* No-JS: the bar can't condense or collapse links into the dialog,
       so it relaxes to a static, wrappable strip that always works */
    html:not(.js) .site-header {
        position: static;
        height: auto;
        background: rgba(14, 10, 31, 0.85);
        border-bottom-color: rgba(168, 85, 247, 0.25);
        padding-block: 0.5rem;
    }

    /* No-JS companion: the header is static (in-flow) above the hero,
       so the fixed-bar offset padding would be a dead band — relax it */
    html:not(.js) .hero { padding-top: var(--space-section); }

    /* Reading progress on the bottom edge: scroll-driven where
       supported, fills in on condense elsewhere */
    .site-header__inner::after {
        content: "";
        position: absolute;
        left: 10px;   /* inset past the panel's rounded corners */
        right: 10px;
        bottom: -1px;
        height: 2px;
        background: var(--grad-separator);
        transform: scaleX(0);
        transform-origin: left;
        pointer-events: none;
        transition: transform var(--transition);
    }

    @supports (animation-timeline: scroll()) {
        .site-header__inner::after {
            animation: progress-grow linear both;
            animation-timeline: scroll();
        }
    }

    @keyframes progress-grow {
        from { transform: scaleX(0); }
        to   { transform: scaleX(1); }
    }

    /* Scroll-glass + condense RETIRED with the floating panel — the
       bar is always dressed and holds its height. .is-scrolled lives
       on solely as the progress bar's fallback hook (browsers
       without scroll-driven animations). */
    .site-header.is-scrolled .site-header__inner::after { transform: scaleX(1); }

    /* --- Bar layout: flex at base, 3-column grid at 1024 so the
           links sit at the TRUE center of the viewport --- */
    /* Main bar tier: takes whatever height the header has after the
       strip. min-height:0 lets it shrink cleanly during condense.
       width:100% is REQUIRED: as a flex item, .wrap's margin-inline
       auto would otherwise shrink-wrap the bar to its content and
       center it (flex auto-margins absorb free space — unlike block
       layout, where auto+max-width fills then centers). */
    .site-header__inner {
        position: relative; /* the progress bar's anchor */
        flex: 1;
        min-height: 0;
        display: flex;
        align-items: center;
        justify-content: space-between;
        /* the floating glass panel (ported): rounded, ringed, blurred.
           Width backs off the viewport edges so the panel never kisses
           them on small screens (wrap-max still caps it on desktop) */
        width: min(var(--wrap-max), 100% - 1.5rem);
        margin-inline: auto;
        margin-block: 0.5rem;
        background: var(--glass-bg);
        border: 1px solid var(--glass-border);
        border-radius: 10px;
        backdrop-filter: blur(var(--glass-blur)) saturate(170%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(170%);
        box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
        gap: 0.75rem;
    }

    /* 1024 true-center grid RETIRED: with the offer pill gone the
       bar is two clusters — brand LEFT, links RIGHT — and the base
       flex space-between already produces exactly that. */

    /* --- Brand: 3D coin mark + wordmark ---
       The mark is a two-faced coin (HC / </>) that flips vertically
       on hover AND keyboard focus. perspective on the wrapper gives
       real depth; backface-visibility hides each face mid-flip. */
    .brand {
        display: inline-flex;
        align-items: center;
        gap: 0.4rem; /* tight coupling: tag + wordmark read as one lockup */
        min-height: 44px;
        font-family: var(--font-tech);
        font-weight: 800;
        /* LOGO GEOMETRY, deliberately not on the type scale: the
           lockup's proportions are fixed brand dimensions (like the
           38x34 coin) and must not move if the scale is retuned */
        font-size: 1rem;
        letter-spacing: var(--ls-wide);
        text-decoration: none;
        color: var(--text-primary);
        white-space: nowrap;
    }

    .brand__coin-wrap {
        display: block; /* spans are inline — width/height are IGNORED
                           without this, collapsing the whole 3D stage */
        position: relative;
        width: var(--tag-w);
        height: var(--tag-h);
        flex-shrink: 0;
        perspective: 400px; /* the 3D stage */
    }

    /* Glow auras: clip-path clips box-shadow off the chamfered faces,
       and filter:drop-shadow() is a grouping property that can flatten
       preserve-3d — so the glow lives on the WRAPPER as two radial
       pseudos (pink for the HC front, aqua for the </> back) that
       crossfade with the flip. perspective makes the wrap a stacking
       context, so z-index:-1 keeps them behind the coin but inside it. */
    .brand__coin-wrap::before,
    .brand__coin-wrap::after {
        content: "";
        position: absolute;
        inset: -7px;
        z-index: -1;
        border-radius: 50%;
        pointer-events: none;
        transition: opacity 0.7s ease; /* paced to the flip */
    }

    .brand__coin-wrap::before {
        /* halo blends the hero gradient's dominant tones (pink core,
           warm gold fringe) so the glow matches the face it lights */
        background:
            radial-gradient(circle, rgba(255, 46, 151, 0.5) 0%, rgba(255, 215, 0, 0.18) 45%, transparent 70%);
        opacity: 1;
    }

    .brand__coin-wrap::after {
        background: radial-gradient(circle, rgba(115, 253, 252, 0.5), transparent 70%);
        opacity: 0;
    }

    .brand:hover .brand__coin-wrap::before,
    .brand:focus-visible .brand__coin-wrap::before { opacity: 0; }

    .brand:hover .brand__coin-wrap::after,
    .brand:focus-visible .brand__coin-wrap::after { opacity: 1; }

    .brand__coin {
        display: block;
        position: relative;
        width: 100%;
        height: 100%;
        transform-style: preserve-3d;
        transition: transform 0.7s cubic-bezier(0.4, 0.1, 0.2, 1);
    }

    .brand__face {
        position: absolute;
        inset: 0;
        display: grid;
        place-items: center;
        /* chamfered top-RIGHT + bottom-LEFT — mirrored from the CTA's
           TL/BR cut, so the two marks bookend the bar as opposites.
           Also puts the cuts perpendicular to the 135deg gradient flow. */
        clip-path: polygon(
            0 0, calc(100% - 9px) 0,
            100% 9px, 100% 100%,
            9px 100%, 0 calc(100% - 9px)
        );
        /* glyphs fill the tile — big letters, minimal breathing room.
           The back face's </> icon inherits this size too. */
        font-size: 1.125rem; /* 18px in the 38px tile — ~10px per side */
        line-height: 1;
        /* OPTICAL centering: grid centers the em-box, but Orbitron's
           metrics leave the ink sitting low inside it — the tile reads
           top-heavy. padding-bottom shrinks the centering area so the
           glyphs ride ~1.5px higher. Tune this, not the grid. */
        padding-bottom: 2px;
        letter-spacing: 0;
        /* keeps white glyphs crisp over the gradient's yellow edge */
        text-shadow: 0 1px 2px rgba(14, 10, 31, 0.45);
        backface-visibility: hidden;
        -webkit-backface-visibility: hidden;
    }

    .brand__face--front {
        /* THE brand gradient (hero stops: yellow 20 / pink 50 / purple 80)
           rotated to 135deg for the tile — diagonal sweep, top-left gold
           corner to bottom-right purple. The --grad-hero token itself
           stays 90deg per the style guide. */
        background: var(--grad-brand);
        color: #fff;
    }

    .brand__face--back {
        background: linear-gradient(135deg, var(--neon-aqua), var(--glass-blue));
        color: var(--bg-base);
        transform: rotateY(180deg); /* pre-turned: shows only mid-flip */
    }

    /* Vertical 3D flip — hover and keyboard focus alike */
    .brand:hover .brand__coin,
    .brand:focus-visible .brand__coin {
        transform: rotateY(180deg);
    }

    /* Wordmark stays at every width — the full logo (coin + WEB LABS)
       is always present. The caret is the wordmark's ::after, so it
       rides along automatically. */
    .brand__word { display: inline-block; line-height: 1; }

    /* Typing-cursor underscore after the wordmark. An EMPTY pseudo
       (styled box) rather than content:"_" — pseudo text content is
       announced by screen readers; an empty box is silent. Blink is
       motion-gated: reduced-motion users see a steady underscore. */
    .brand__word::after {
        content: "";
        display: inline-block;
        width: 0.55em;
        height: 0.14em;
        margin-left: 0.18em;
        background: var(--neon-aqua);
        vertical-align: baseline;
    }

    @media (prefers-reduced-motion: no-preference) {
        .brand__word::after {
            animation: caret-blink 1.1s steps(2, start) infinite;
        }
    }

    @keyframes caret-blink {
        to { visibility: hidden; }
    }

    .brand__accent { color: var(--neon-aqua); }

    /* --- Desktop links ---
       Alignment progression: 640-1023 the links cluster RIGHT beside
       the (768+) CTA; at 1024 the grid moves them to true center.
       Without the margin, 640-767 was only "centered" by accident —
       the empty actions div happened to have zero width. --- */
    .site-nav { min-width: 0; }

    @media (min-width: 768px) {
        .site-nav { margin-left: auto; }
    }

    .site-nav__links {
        display: flex;
        flex-wrap: nowrap; /* the row must never break and escape the bar */
        gap: 0.1rem;
        align-items: center;
    }

    @media (min-width: 1024px) {
        .site-nav__links { gap: 0.3rem; }
    }

    /* No-JS below 640: let the row wrap gracefully in the static bar */
    html:not(.js) .site-nav__links { flex-wrap: wrap; }

    .site-nav__links a {
        position: relative;
        display: inline-flex;
        align-items: center;
        min-height: 44px;
        padding: 0.4rem 0.7rem;
        border-radius: 999px;
        font-weight: 600;
        font-size: var(--fs-nav);
        letter-spacing: var(--ls-wide); /* 1px — airier tech tracking */
        white-space: nowrap;
        color: var(--text-secondary);
        text-decoration: none;
        transition: var(--transition);
    }

    @media (min-width: 1024px) {
        .site-nav__links a { padding: 0.45rem 0.95rem; }
    }

    /* //-prefix (ported): the brand mark rides every link — aqua at
       rest, flips GOLD on hover while the label ignites aqua */
    .site-nav__links a::before {
        content: "//";
        margin-right: 0.4rem;
        color: var(--neon-aqua);
        transition: color var(--fast) var(--ease);
    }

    .site-nav__links a:hover {
        color: var(--neon-aqua);
        /* softened from --glow-aqua (a 3-layer 42px bloom) — too hot
           for nav text; the // prefix inherits this, so both calm */
        text-shadow: 0 0 8px rgba(115, 253, 252, 0.7), 0 0 18px rgba(115, 253, 252, 0.35);
        background: rgba(115, 253, 252, 0.08);
    }

    .site-nav__links a:hover::before { color: var(--neon-yellow); }

    /* Active link = aqua glow on the label (the dot marker is
       retired — the glow carries the state on its own) */
    .site-nav__links a[aria-current] { color: var(--neon-aqua); text-shadow: var(--glow-aqua); }
    .site-nav__links a[aria-current]::before { color: var(--neon-yellow); } /* gold //, matching hover (field request) */

    /* --- Actions cluster: the burger (mobile only — the cluster
           retires entirely at 768 with it) --- */
    .site-header__actions {
        display: flex;
        align-items: center;
        gap: 0.85rem;
        flex-shrink: 0;
    }

    @media (min-width: 768px) {
        /* the burger retires at 768 and it's the cluster's only
           tenant — hide the cluster so its flex gap goes with it */
        .site-header__actions { display: none; }
    }

    /* --- Burger: hand-built, two bars that trade widths on hover.
       Chamfered TL/BR (the action corner language, shared with the
       close button and desktop CTA). No border: clip-path severs
       borders at the cut corners, so it's a gradient tag with a
       drop-shadow glow that follows the cuts. --- */
    .nav-toggle {
        display: none;
        width: 44px;
        height: 44px;
        align-items: center;
        justify-content: center;
        /* Deep gradient (swapped with the CTA): the menu is the
           primary mobile control and earns the vivid finish. White
           bars on these stops measure 4.6:1 — non-text needs 3:1. */
        background: var(--grad-cta-deep);
        clip-path: polygon(
            10px 0, 100% 0,
            100% calc(100% - 10px), calc(100% - 10px) 100%,
            0 100%, 0 10px
        );
        transition: var(--transition);
    }

    .nav-toggle:hover {
        transform: scale(1.04);
        filter: drop-shadow(0 0 10px rgba(255, 46, 151, 0.55));
    }

    .nav-toggle__box {
        display: grid;
        gap: 5px;
        width: 18px;
        justify-items: end;
    }

    .nav-toggle__bar {
        display: block;
        height: 2px;
        border-radius: 2px;
        background: #fff; /* on the gradient now — 4.6:1, non-text pass */
        transition: width 0.25s ease;
    }

    .nav-toggle__bar:nth-child(1) { width: 100%; }
    .nav-toggle__bar:nth-child(2) { width: 62%; }

    .nav-toggle:hover .nav-toggle__bar:nth-child(1) { width: 62%; }
    .nav-toggle:hover .nav-toggle__bar:nth-child(2) { width: 100%; }

    /* JS collapses links into the dialog below 768; no-JS keeps them.
       .no-dialog = JS ran but <dialog> is unsupported (old Safari):
       restore the static row, retire the burger — never a dead control. */
    .js .site-nav { display: none; }
    .js .nav-toggle { display: flex; }

    .js.no-dialog .site-nav { display: block; }
    .js.no-dialog .nav-toggle { display: none; }

    @media (min-width: 768px) {
        .js .site-nav { display: block; }
        .js .nav-toggle { display: none; }
    }

    /* ==================================================
       MOBILE MENU — full-screen <dialog>, v2
       Opens as a circular reveal expanding from the burger's
       corner (clip-path + @starting-style; older browsers get
       instant open/close). Editorial ruled rows, sliding
       arrows, contact chips. Tap any empty area to close.
       ================================================== */
    dialog.nav-dialog {
        display: none;
        position: fixed;
        inset: 0;
        margin: 0;
        width: 100%;
        height: 100vh;
        height: 100dvh;
        max-width: none;
        max-height: none;
        /* real breathing at both poles — the head row was kissing
           the top edge and the contact footer the bottom */
        padding: clamp(1.5rem, 4vh, 2.75rem) clamp(1.25rem, 6vw, 2.5rem) clamp(1.5rem, 4.5vh, 2.75rem);
        border: none;
        background:
            radial-gradient(ellipse at 20% 10%, rgba(168, 85, 247, 0.14), transparent 55%),
            radial-gradient(ellipse at 85% 90%, rgba(59, 130, 246, 0.12), transparent 55%),
            linear-gradient(160deg, rgba(20, 13, 40, 0.99), rgba(14, 10, 31, 1));
        color: var(--text-primary);
        overflow: hidden;
        /* Layout template lives on the BASE rule (inert under
           display:none) so it survives the closing transition.
           On close, allow-discrete holds display:grid until the end,
           but any layout prop left only on [open] reverts INSTANTLY —
           the 1fr row was collapsing and the head/footer visibly
           jumped a half-second before the circle finished closing. */
        grid-template-rows: auto 1fr auto;
        /* closed state: a zero-radius circle at the burger's corner */
        clip-path: circle(0% at calc(100% - 2.4rem) 2rem);
        transition:
            clip-path 0.5s ease,
            display 0.5s ease allow-discrete,
            overlay 0.5s ease allow-discrete;
    }

    @media (min-width: 480px) {
        dialog.nav-dialog { padding-inline: clamp(1.75rem, 8vw, 3rem); }
    }

    dialog.nav-dialog[open] {
        display: grid;
        clip-path: circle(150% at calc(100% - 2.4rem) 2rem);
    }

    /* Entry starts collapsed; the exit transition mirrors it */
    @starting-style {
        dialog.nav-dialog[open] {
            clip-path: circle(0% at calc(100% - 2.4rem) 2rem);
        }
    }

    dialog.nav-dialog::backdrop {
        background: rgba(10, 10, 15, 0.7);
        opacity: 0;
        transition:
            opacity 0.5s ease,
            display 0.5s ease allow-discrete,
            overlay 0.5s ease allow-discrete;
    }

    dialog.nav-dialog[open]::backdrop { opacity: 1; }

    @starting-style {
        dialog.nav-dialog[open]::backdrop { opacity: 0; }
    }

    .nav-dialog__head {
        display: flex;
        align-items: center;
        justify-content: space-between;
    }

    /* Close: chamfered TL/BR like the burger and CTA — the action
       corner language, now consistent across all three controls.
       No border-radius (clip-path defines the shape); the hover
       rotation lives on the ICON, not the container — spinning a
       chamfered box would visibly swing the cuts to wrong corners. */
    .dialog-close {
        width: 40px;
        height: 40px;
        background: var(--grad-cta);
        /* Icon = NON-text: WCAG bar is 3:1, and white measures
           3.45:1 on this gradient — compliant as-is. */
        color: #fff;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: var(--icon-sm);
        clip-path: polygon(
            10px 0, 100% 0,
            100% calc(100% - 10px), calc(100% - 10px) 100%,
            0 100%, 0 10px
        );
        transition: transform var(--transition), filter var(--transition);
    }

    .dialog-close i { transition: transform var(--transition); }

    .dialog-close:hover {
        transform: scale(1.06);
        filter: drop-shadow(0 0 10px rgba(255, 46, 151, 0.55));
    }

    .dialog-close:hover i { transform: rotate(90deg); }

    /* Link BLOCK: middle of the screen (both axes), text left-aligned.
       max-content width means taps beside it land on the dialog — close. */
    .nav-dialog nav {
        align-self: center;
        justify-self: center;
        width: min(26rem, 100%);
    }

    .nav-dialog__links { display: grid; }

    /* Editorial rules between rows */
    .nav-dialog__links li + li { border-top: 1px solid rgba(168, 85, 247, 0.18); }

    .nav-dialog__links a {
        display: grid;
        grid-template-columns: auto 1fr auto;
        align-items: baseline;
        gap: 1rem;
        min-height: 52px;
        padding: clamp(0.5rem, 1.6vh, 0.9rem) 0.25rem;
        font-family: var(--font-tech);
        font-weight: 700;
        font-size: var(--fs-menu);
        line-height: var(--lh-subhead);
        letter-spacing: var(--ls-wide);
        color: var(--text-secondary);
        text-decoration: none;
        transition: var(--transition);
    }

    @media (min-width: 480px) {
        .nav-dialog__links a { gap: 1.25rem; }
    }

    .nav-dialog__num {
        font-family: var(--font-tech);
        font-weight: 700;
        font-size: var(--fs-sm);
        color: var(--neon-pink);
        min-width: 2rem;
        transition: var(--transition);
    }

    /* Sliding arrow: hidden until hover/active */
    .nav-dialog__arrow {
        align-self: center;
        color: var(--neon-aqua);
        font-size: var(--icon-sm);
        opacity: 0;
        transform: translateX(-8px);
        transition: opacity 0.25s ease, transform 0.25s ease;
    }

    .nav-dialog__links a:hover,
    .nav-dialog__links a[aria-current] { color: var(--neon-aqua); }

    .nav-dialog__links a:hover .nav-dialog__num,
    .nav-dialog__links a[aria-current] .nav-dialog__num { color: var(--neon-aqua); }

    .nav-dialog__links a:hover .nav-dialog__arrow,
    .nav-dialog__links a[aria-current] .nav-dialog__arrow {
        opacity: 1;
        transform: translateX(0);
    }

    /* Staggered row entrance — entry only, motion-safe */
    @media (prefers-reduced-motion: no-preference) {
        dialog.nav-dialog[open] .nav-dialog__links li { animation: menu-item-in 0.4s ease 0.12s both; }
        dialog.nav-dialog[open] .nav-dialog__links li:nth-child(2) { animation-delay: 0.18s; }
        dialog.nav-dialog[open] .nav-dialog__links li:nth-child(3) { animation-delay: 0.24s; }
        dialog.nav-dialog[open] .nav-dialog__links li:nth-child(4) { animation-delay: 0.3s; }
        dialog.nav-dialog[open] .nav-dialog__footer { animation: menu-item-in 0.4s ease 0.36s both; }

        @keyframes menu-item-in {
            from { opacity: 0; transform: translateY(14px); }
            to   { opacity: 1; transform: none; }
        }
    }

    /* Footer: contact chips + socials, centered */
    .nav-dialog__footer {
        position: relative;
        z-index: 1;
        display: grid;
        /* breathes on normal phones (~14px), compresses on short
           viewports — same vh-aware rhythm the link rows use */
        gap: clamp(0.6rem, 2vh, 1.1rem);
        justify-items: center;
        text-align: center;
    }

    .nav-dialog__sep {
        width: 100%;
        max-width: 320px;
        height: 2px;
        border-radius: 2px;
        background: var(--grad-separator);
        margin-block: clamp(0.1rem, 0.8vh, 0.35rem);
    }

    .nav-dialog__chips {
        display: flex;
        flex-wrap: wrap;
        gap: 0.85rem;
        justify-content: center;
    }

    .nav-dialog__chip {
        display: inline-flex;
        align-items: center;
        gap: 0.5rem;
        min-height: 40px; /* slimmer box; still well over the 24px AA floor */
        padding: 0.25rem 1rem;
        border: 1px solid rgba(115, 253, 252, 0.3);
        /* soft-edged box, not a pill — shape variety against the
           round socials below and the chamfered controls above */
        border-radius: 6px;
        font-size: var(--fs-xs);
        color: var(--text-secondary);
        text-decoration: none;
        transition: var(--transition);
    }

    .nav-dialog__chip:hover { color: var(--neon-aqua); border-color: var(--neon-aqua); }
    .nav-dialog__chip i { color: var(--neon-pink); }

    .nav-dialog__social { display: flex; gap: 0.9rem; }

    /* Aurora bands behind the menu */
    .nav-dialog__aurora { --tilt: -18deg; --dur: 32s; width: 140%; height: clamp(120px, 20vh, 200px); inset: 22% auto auto -20%; opacity: 0.13; }
    .nav-dialog__aurora--b { --tilt: -10deg; --dur: 40s; --delay: -14s; inset: auto -20% 18% auto; opacity: 0.11; }

    /* ==================================================
       PLACEHOLDER SECTIONS (scaffolding only)
       These exist so the scrollspy, condense, and progress
       behaviors are testable. Each gets replaced by a real
       v2 section as we build.
       ================================================== */
    /* =====================================================
       HERO — center stage. The starfield (fixed, z1) shows
       through beneath the section; the nebula field sits
       inside the hero behind its own content.
       ===================================================== */
    .hero {
        position: relative;
        z-index: var(--z-content);
        overflow: hidden; /* ribbons overshoot the edges by design */
        min-height: 100vh;
        min-height: 100dvh;
        /* header offset + genuine breathing room — without the extra
           clamp, mobile (where the stack fills the viewport) pinned
           the eyebrow flush against the bar */
        padding-top: calc(var(--header-total) + clamp(1.75rem, 6vh, 4rem));
        padding-bottom: var(--space-section);
        display: grid;
        place-items: center;
        scroll-margin-top: 0; /* #top is the top — no offset needed */
    }

    .hero__content {
        position: relative;
        z-index: 1; /* above the atmosphere */
        /* Hero-specific rails: 1140px for the WHOLE content stack —
           deliberately inside the site's 1240 wrap, so the hero
           breathes a little more than the sections below it. This
           max-width overrides .wrap's (same specificity, later in
           the sheet). Subhead keeps its own tighter measure. */
        max-width: 1140px;
        display: grid;
        justify-items: center;
        gap: clamp(1.1rem, 2.5vh, 1.75rem);
        text-align: center;
    }

    .hero__eyebrow {
        margin-bottom: 1.15rem;
        font-family: var(--font-tech);
        font-size: var(--fs-eyebrow); /* rationale at the token */
        font-weight: 600;
        letter-spacing: var(--ls-wider);
        text-transform: uppercase;
        color: var(--neon-aqua);
        /* solid ink -> text-shadow is safe here: layered neon sign */
        text-shadow:
            0 0 6px  rgba(115, 253, 252, 0.6),
            0 0 16px rgba(115, 253, 252, 0.35);
    }

    .hero__eyebrow-sep { color: var(--neon-pink); }

    /* Display headline: WHITE base ink; the reserved 90deg hero
       gradient highlights only the KEYWORD spans — the searchable
       phrases literally glow. White on bg measures ~19:1; every
       gradient stop passes the 3:1 large-text bar. */
    .hero__title {
        margin-bottom: 1.5rem;
        font-family: var(--font-tech);
        font-size: var(--fs-h1);
        font-weight: 800;
        line-height: 1.24; /* display one-off, opened up from 1.12 —
            the stacked lines wanted more air between them */
        /* em-based so the tracking scales WITH the display size —
           the px tokens are for fixed-size labels (~1.9px at 64px,
           ~0.9px at the mobile floor) */
        letter-spacing: 0.03em;
        color: #fff;
        text-wrap: balance; /* progressive: even rag where supported */
    }

    /* Keyword highlights: gradient ink, NO glow — glow grammar
       belongs to SOLID neon inks only (aqua glow, pink glow, etc.);
       the brand gradient stays clean. */
    .hero__hl {
        color: var(--neon-yellow); /* fallback ink if clip:text absent */
        background: var(--grad-hero);
        -webkit-background-clip: text;
        background-clip: text;
        -webkit-text-fill-color: transparent;
    }

    .hero__sub {
        margin-bottom: 2.4rem;
        max-width: 46rem; /* measure holds even as the h1 spreads */
        font-size: var(--fs-body);
        line-height: var(--lh-base);
        color: var(--text-secondary); /* two shades up from muted */
    }

    /* --- CTA pair. Shape grammar holds: PILL = the offer (primary),
       CHAMFER = control/navigation (ghost secondary). --- */
    .hero__actions {
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        gap: 0.9rem;
        margin-top: 0.25rem;
    }

    .btn-hero {
        display: inline-flex;
        align-items: center;
        gap: 0.55rem;
        min-height: 48px;
        /* fluid inline padding (fit math lives at the --fs-btn token) */
        padding: 0.7rem clamp(1.05rem, 4vw, 1.6rem);
        font-family: var(--font-tech);
        font-size: var(--fs-btn);
        font-weight: 700;
        text-transform: uppercase;
        letter-spacing: var(--ls-wide);
        text-decoration: none;
        white-space: nowrap;
        transition: var(--transition);
    }

    /* Primary: PINK GLASS pill — translucent, blurred, bordered;
       lighter-weight than the old solid gradient. White ink over the
       glass reads ~14:1 (the tint barely lifts the dark base). The
       pill's radius keeps a real border possible (unlike chamfers). */
    .btn-hero--primary {
        border-radius: 999px;
        background: rgba(255, 46, 151, 0.13);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        border: 1px solid rgba(255, 46, 151, 0.45);
        color: #fff;
        box-shadow: 0 6px 22px rgba(255, 46, 151, 0.18);
    }

    .btn-hero--primary:hover {
        transform: translateY(-2px) scale(1.02);
        background: rgba(255, 46, 151, 0.22);
        border-color: var(--neon-pink);
        box-shadow: 0 10px 30px rgba(255, 46, 151, 0.3), 0 0 20px rgba(255, 46, 151, 0.25);
    }

    /* Ghost: chamfered aqua GLASSMORPHIC (blur behind the tint;
       borderless — clip-path severs borders — glow follows the cuts) */
    .btn-hero--ghost {
        background: rgba(115, 253, 252, 0.08);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        color: var(--neon-aqua);
        clip-path: polygon(
            12px 0, 100% 0,
            100% calc(100% - 12px), calc(100% - 12px) 100%,
            0 100%, 0 12px
        );
    }

    .btn-hero i { font-size: 1em; transition: transform var(--transition); }

    .btn-hero:hover i { transform: translateX(3px); }

    .btn-hero--ghost:hover {
        background: rgba(115, 253, 252, 0.16);
        filter: drop-shadow(0 0 12px rgba(115, 253, 252, 0.4));
    }

    /* --- Stretched trigger: the whole card is the click target.
       A <button> can't contain the card's <h3> (phrasing content
       only), so it OVERLAYS the article instead — headings keep
       their semantics, the button carries the accessible name,
       and its focus ring draws around the entire card. --- */
    .work-card__open {
        position: absolute;
        inset: 0;
        z-index: 1;
        background: transparent;
        border: 0;
        cursor: pointer;
    }

    .work-card__open:focus-visible {
        outline: 3px solid var(--neon-aqua);
        outline-offset: 2px;
        border-radius: 6px;
    }

    /* --- Case-study modal: stacked single-scroll on mobile,
       true SPLIT from 768 (tall shot left, story right, columns
       scrolling independently) --- */
    dialog.case-modal {
        width: min(94vw, 1080px);
        max-height: 88vh; /* plain fallback — min() with dvh is
            WHOLLY invalid where dvh is unsupported (audit-caught) */
        max-height: min(88vh, 88dvh);
        margin: auto;
        padding: 0;
        border: 1px solid rgba(115, 253, 252, 0.3);
        border-radius: 6px;
        background: linear-gradient(160deg, #171233, var(--bg-base));
        color: var(--text-secondary);
        overflow: hidden;
        display: none;
        flex-direction: column;
    }

    dialog.case-modal::backdrop {
        background: rgba(8, 6, 18, 0.7);
        backdrop-filter: blur(6px);
        -webkit-backdrop-filter: blur(6px);
    }

    /* Layout via grid AREAS — the same four children, two different
       arrangements. Mobile: head on TOP, media band, scrolling story,
       pinned foot. 768+: media owns the full-height left column; the
       right column stacks head / story / foot with only the story
       scrolling. Fixed frame height is what makes pinning possible. */
    dialog.case-modal[open] {
        display: grid;
        grid-template-areas:
            "head"
            "media"
            "story"
            "foot";
        grid-template-rows: auto 34vh minmax(0, 1fr) auto;
        height: min(88vh, 88dvh);
    }

    @media (min-width: 768px) {
        dialog.case-modal[open] {
            grid-template-areas:
                "media head"
                "media story"
                "media foot";
            grid-template-columns: minmax(0, 45fr) minmax(0, 55fr); /* 45/55 */
            grid-template-rows: auto minmax(0, 1fr) auto;
        }
    }

    /* Media slot: the shot flush to the modal's edges — no border,
       no radius, no margin; the dialog's own radius clips corners */
    .case-modal__media {
        grid-area: media;
        min-height: 0;
        overflow: hidden;
    }

    .case-modal__media .case-modal__viewer {
        height: 100%;
        max-height: none;
        border: 0;
        border-radius: 0;
        margin: 0;
    }

    .case-modal__head {
        grid-area: head;
        flex-shrink: 0;
        display: flex;
        align-items: flex-start;
        justify-content: space-between;
        gap: 1rem;
        padding: clamp(1rem, 3vh, 1.5rem) clamp(1rem, 3vw, 1.75rem) 0.9rem;
        border-bottom: 1px solid rgba(115, 253, 252, 0.18);
    }

    .case-modal__titles { min-width: 0; } /* lets long titles wrap,
        not shove the close button out of the head */

    .case-modal__actions { display: flex; flex-wrap: wrap; gap: 0.75rem; }

    .case-modal__scroll {
        grid-area: story;
        flex: 1;
        min-height: 0;
        overflow-y: auto;
        scrollbar-width: thin;
        padding: 1.1rem clamp(1rem, 3vw, 1.75rem);
    }

    .case-modal__foot {
        grid-area: foot;
        flex-shrink: 0;
        padding: 0.9rem clamp(1rem, 3vw, 1.75rem) clamp(1rem, 3vh, 1.4rem);
        border-top: 1px solid rgba(115, 253, 252, 0.18);
    }

    .case-modal__title {
        font-family: var(--font-body); /* Saira — card titles (was Orbitron) */
        /* fluid 16 -> 18px (down from --fs-h3): the 55% head column
           shares its row with the close button — the title trades a
           little size for never smushing */
        font-size: var(--fs-body);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        color: var(--neon-aqua);
        text-shadow:
            0 0 4px  var(--neon-aqua),
            0 0 12px rgba(115, 253, 252, 0.55); /* small neon sign */
        margin: 0 0 0.3rem;
    }

    /* User-scrolled viewer (two-column modal, 768+) — the shot is
       explored by hand. SINGLE-COLUMN exception below: the viewer
       becomes a static tappable poster (scroll-inside-scroll over
       the story column was a mess on phones). */
    .case-modal__viewer {
        overflow-y: auto;
        /* invisible-but-functional, matching the face cards — the
           story column keeps its bar (long reads earn an indicator) */
        scrollbar-width: none;
    }

    .case-modal__viewer::-webkit-scrollbar { display: none; }

    .case-modal__viewer:focus-visible {
        outline: 3px solid var(--neon-aqua);
        outline-offset: -3px;
    }

    .case-modal__scope {
        font-family: var(--font-tech);
        font-size: var(--fs-2xs); /* metadata micro-label */
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--text-muted);
        margin: 0;
    }


    /* Story type stepped DOWN a size: this is dense reading in a
       narrow column — 15px copy under 13px labels */
    .case-modal__story p {
        font-size: var(--fs-md);
        line-height: var(--lh-base);
        margin-bottom: 1rem;
    }

    .case-modal__story h4 {
        font-family: var(--font-body); /* Saira — card titles (was Orbitron) */
        font-size: var(--fs-xs);
        font-weight: 700;
        letter-spacing: var(--ls-wider);
        text-transform: uppercase;
        color: var(--neon-yellow);
        text-shadow: 0 0 6px rgba(255, 215, 0, 0.5);
        margin-bottom: 0.35rem;
    }

    /* =====================================================
       ABOUT — snippet: XL coin set-piece + copy split
       ===================================================== */
    .about {
        position: relative;
        /* section-transition recipe: incoming clearance + outgoing
           runway before the review console */
        padding-top: var(--space-act-in);
        padding-bottom: var(--space-act-out);
    }

    .about__grid {
        display: grid;
        gap: clamp(2rem, 5vw, 3.5rem);
        align-items: center;
        justify-items: center;
        text-align: center;
    }

    @media (min-width: 768px) {
        .about__grid {
            /* auto column HUGS the coin (a 2fr track was padding it
               with ~140px of dead air per side); the composition is
               capped and centered so the pair reads as one unit */
            grid-template-columns: auto minmax(0, 1fr);
            max-width: 58rem;
            margin-inline: auto;
            justify-items: start;
            text-align: left;
        }
    }

    /* Visual column: centers the coin at mobile; hugs it at the split */
    .about__visual {
        display: flex;
        justify-content: center;
    }

    /* --- XL coin: the nav mark at set-piece scale. Same physics:
       perspective on the WRAPPER, preserve-3d on the coin, glow on
       wrapper pseudos (filter on the 3D element would flatten it —
       the nav coin's hard-won lesson). Decorative: aria-hidden. --- */
    .about__coin-wrap {
        position: relative;
        width: clamp(175px, 32vw, 195px); /* larger floor + slope —
            the portrait read too small on tablet/mobile (field-caught) */
        aspect-ratio: 3 / 4; /* portrait — a standing card, not the tile */
        perspective: 900px;
    }

    .about__coin-wrap::before,
    .about__coin-wrap::after {
        content: "";
        position: absolute;
        inset: -18%;
        z-index: -1; /* BEHIND the coin — ::after paints over children
            by default, and the aqua hover halo was washing the photo
            green. (The nav coin's pseudos already knew this.) */
        border-radius: 50%;
        pointer-events: none;
        transition: opacity 0.8s ease;
    }

    .about__coin-wrap::before {
        background: radial-gradient(circle, rgba(255, 46, 151, 0.35) 0%, rgba(255, 215, 0, 0.12) 45%, transparent 70%);
        filter: blur(22px);
    }

    .about__coin-wrap::after {
        background: radial-gradient(circle, rgba(115, 253, 252, 0.3) 0%, transparent 65%);
        filter: blur(22px);
        opacity: 0;
    }

    .about__coin-wrap:hover::before { opacity: 0; }
    .about__coin-wrap:hover::after  { opacity: 1; }

    .about__coin {
        position: absolute;
        inset: 0;
        transform-style: preserve-3d;
        transition: transform 0.8s ease;
    }

    .about__coin-wrap:hover .about__coin { transform: rotateY(180deg); }

    .about__face {
        position: absolute;
        inset: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        backface-visibility: hidden;
        -webkit-backface-visibility: hidden;
        clip-path: polygon(
            26px 0, 100% 0,
            100% calc(100% - 26px), calc(100% - 26px) 100%,
            0 100%, 0 26px
        ); /* TR/BL brand cuts, scaled to the tile */
        font-family: var(--font-tech);
        font-weight: 800;
        font-size: clamp(3rem, 8vw, 4.25rem);
        line-height: 1;
        padding-bottom: 6px; /* Orbitron's low-sitting ink, optically centered */
        color: #fff;
        text-shadow: 0 2px 12px rgba(14, 10, 31, 0.5);
    }

    .about__face--front {
        background: var(--grad-brand);
        /* explicit identity transform — Chromium can mis-composite a
           backface-hidden face that has NO transform of its own,
           painting the rotated back on top (the blue-card-at-rest
           glitch). rotateY(0) forces correct 3D participation. */
        transform: rotateY(0deg);
    }

    .about__face--back {
        /* the gradient stays as the loading/failure backdrop
           BEHIND the photo (glyph + font-size retired) */
        background: linear-gradient(135deg, var(--neon-aqua), var(--glass-blue));
        transform: rotateY(180deg);
    }

    /* The reveal: Heather's photo fills the back face edge to edge.
       The face's clip-path cuts the chamfers into the image; its
       overflow model means no radius/border needed here. Own
       backface-visibility too — some engines let an untransformed
       CHILD of a hidden backface paint through (Safari's classic
       3D-card gotcha). */
    .about__photo {
        position: absolute;
        inset: 0;
        width: 100%;
        height: 100%;
        object-fit: cover;
        /* 2:3 source in the 3:4 face: ~11% height crop. Biased UP
           from center so the eye line rides the upper third and the
           trim favors the jacket over the hair crown. */
        object-position: 50% 42%;
        backface-visibility: hidden;
        -webkit-backface-visibility: hidden;
    }

    /* Idle float — gentle bob, motion-gated */
    @media (prefers-reduced-motion: no-preference) {
        .about__coin-wrap { animation: coin-float 5.5s ease-in-out infinite; }
    }

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

    .about__copy p {
        color: var(--text-secondary);
        margin-bottom: 1.15rem;
    }

    @media (min-width: 768px) {
        .about__copy p { margin-inline: 0; }
    }

    /* The gold neon action — the house "go deeper" species */
    .about__more {
        display: inline-flex;
        align-items: center;
        gap: 0.45rem;
        margin-top: 0.85rem;
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-yellow);
        text-shadow:
            0 0 4px  var(--neon-yellow),
            0 0 12px var(--neon-yellow),
            0 0 20px var(--neon-yellow);
        text-decoration: none;
    }

    .about__more i { font-size: 1em; transition: transform var(--transition); }
    .about__more:hover i { transform: translateX(3px); }

    /* =====================================================
       FREE WEBSITE REVIEW — lead capture split
       ===================================================== */
    .review {
        position: relative;
        padding-top: var(--space-act-in); /* transition recipe */
    }

    .review__head {
        text-align: center;
        margin-bottom: clamp(1.75rem, 5vh, 3rem);
    }

    .review__lede {
        color: var(--text-secondary);
        margin-inline: auto;
    }

    /* --- The console: a glass command bar. Mobile stacks; 640
       pairs name/email; 1024 = the full horizontal — three fields
       and the send button on one line, button aligned to the
       input row (labels ride above). --- */

    .review__form {
        max-width: 46rem; /* the paired-card width */
        margin-inline: auto;
        display: grid;
        gap: 1rem;
        padding: clamp(1.25rem, 4vw, 1.75rem);
        background: rgba(115, 253, 252, 0.05);
        border: 1px solid rgba(115, 253, 252, 0.22);
        border-radius: 6px;
        backdrop-filter: blur(8px);
        -webkit-backdrop-filter: blur(8px);
    }

    /* Mobile stacks; 640+ pairs Name/Email (the one pairing the
       guidance sanctions: short, tightly related fields), website
       full-width beneath. DOM order = visual order = tab order. */
    @media (min-width: 640px) {
        .review__form {
            grid-template-columns: 1fr 1fr;
            align-items: start; /* an error under Name grows its own
                cell — Email stays put. RESTORED: this fix was lost in
                a later edit (cascade-audit-caught) */
        }
        .review__field--site,
        .review__submit,
        .review__consent { grid-column: 1 / -1; }
    }

    .review__field {
        display: grid;
        gap: 0.4rem;
        position: relative; /* anchors the valid-state checkmark */
    }

    .review__field label {
        font-family: var(--font-tech);
        font-size: var(--fs-2xs); /* 12px micro-label */
        font-weight: 600;
        letter-spacing: var(--ls-wider); /* eyebrow-grade tracking —
            micro-labels earn the airier spread */
        text-transform: uppercase;
        color: var(--neon-aqua);
    }

    /* The required star — attention pink (an ACTION accent, not the
       error red; the field isn't wrong, it's important) */
    .review__req {
        color: var(--neon-pink);
        text-shadow: 0 0 6px rgba(255, 46, 151, 0.55);
    }

    /* :is(input, select, textarea) — the typed `input` selector
       left select and textarea in UA-default gray (caught in
       Heather's live screenshots). ALL controls wear the box. */
    .review__field :is(input, select, textarea) {
        width: 100%;
        padding: 0.65rem 0.85rem;
        background: rgba(14, 10, 31, 0.6);
        border: 1px solid rgba(115, 253, 252, 0.25);
        border-radius: 6px;
        color: var(--text-primary);
        font-family: var(--font-body);
        font-size: var(--fs-body);
        transition: border-color var(--transition), box-shadow var(--transition);
    }

    .review__field :is(input, select, textarea):focus-visible {
        outline: none; /* replaced by the neon ring below — never removed bare */
        border-color: var(--neon-aqua);
        box-shadow: 0 0 0 2px rgba(115, 253, 252, 0.3), 0 0 12px rgba(115, 253, 252, 0.25);
    }

    /* --- Validation states. Error red is its own token — the brand
       pink is an ACTION color and must not moonlight as danger. --- */
    .review__field.is-invalid :is(input, select, textarea) {
        border-color: var(--error);
        box-shadow: 0 0 0 2px rgba(255, 84, 112, 0.25), 0 0 10px rgba(255, 84, 112, 0.2);
    }

    .review__error {
        font-size: var(--fs-xs);
        color: var(--error);
        margin: 0;
        max-width: none;
        min-height: 1.2em; /* reserve space — revealing an error
            never shifts the form (paired fields stay level) */
    }

    /* W3C notification pattern: icon + border + text (never color
       alone). FA glyph via pseudo — decorative; the message text
       already opens with "Error:" for AT. */
    .review__error::before {
        font-family: "Font Awesome 6 Free";
        font-weight: 900;
        content: "\f071\00a0";
    }

    /* Valid: quiet aqua confirmation — border firms up and a check
       appears inside the field's right edge (live feedback) */
    .review__field.is-valid :is(input, select, textarea) { border-color: rgba(115, 253, 252, 0.55); }

    .review__field.is-valid::after {
        content: "\2713";
        position: absolute;
        right: 0.85rem;
        bottom: 0.72rem;
        color: var(--neon-aqua);
        text-shadow: 0 0 2px currentColor /* dimmed from 7px (field-caught fuzz) */;
        font-size: var(--fs-sm);
        font-weight: 700;
        pointer-events: none;
    }

    /* SELECT fields: the chevron owns the right edge — suppress the
       checkmark (aqua border still carries the valid state). MUST sit
       AFTER the generic rule above: equal specificity means source
       order decides, and an earlier suppression silently loses
       (cascade-audit-caught — the original fix never applied). */
    .review__field--select.is-valid::after { content: none; }

    .review__consent {
        /* FLEX rebuild (field-caught: grid auto-placement scrambled —
           checkbox orphaned left, label squeezed right). Explicit
           sizing on every child; nothing left to auto-place. */
        display: flex;
        flex-wrap: wrap;
        align-items: flex-start;
        justify-content: center; /* centered bottom block (field request) */
        gap: 0.5rem 0.65rem;
        font-size: var(--fs-2xs);
        line-height: var(--lh-snug);
        color: var(--text-muted);
        text-align: left;
        margin: 0;
        max-width: none;
    }

    .review__consent label {
        flex: 0 1 auto;       /* natural width — the unit centers as one */
        min-width: 0;
        max-width: none;      /* immune to any global prose measure */
        cursor: pointer;
    }

    .review__consent-box {
        width: 18px;
        height: 18px;
        margin-top: 0.1em; /* optically level with the label's first line */
        accent-color: var(--neon-pink); /* the action color, natively */
        cursor: pointer;
    }


    /* Unchecked-at-submit: the box itself wears the error ring
       (color is never the only signal — the error text names it) */
    .review__consent.is-invalid .review__consent-box {
        outline: 2px solid var(--error);
        outline-offset: 2px;
    }

    .review__consent .review__error {
        width: 100%; /* full row beneath */
        text-align: center;
    }

    /* --- In-page confirmation panel --- */
    /* Flash notice: a bounced submit's explanation (validation or
       throttle), planted above the form where the eye lands */
    .review__flash {
        display: flex;
        align-items: baseline;
        gap: 0.6rem;
        margin: 0 0 1.4rem;
        padding: 0.85rem 1.1rem;
        max-width: none;
        border: 1px solid var(--error);
        border-radius: 6px;
        background: rgba(255, 92, 138, 0.08);
        color: var(--text-secondary);
        font-size: var(--fs-sm);
        line-height: var(--lh-snug);
    }

    .review__flash:focus { outline: none; } /* focused only by the
        landing script for SR announcement — no ring needed */

    .review__flash i { color: var(--error); flex-shrink: 0; }

    .review__submit:disabled {
        opacity: 0.65;
        cursor: wait;
        transform: none;
    }

    .review__again {
        display: inline-flex;
        align-items: center;
        gap: 0.5rem;
        margin-top: 1.1rem;
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        text-decoration: none;
        color: var(--neon-aqua);
        transition: var(--transition);
    }

    .review__again:hover { text-shadow: var(--glow-aqua); }

    .review__again:hover i { transform: rotate(90deg); }

    .review__again i { font-size: 1em; transition: transform var(--transition); }

    .review__success {
        max-width: 60rem;
        margin-inline: auto;
        padding: clamp(1.75rem, 5vw, 2.5rem);
        text-align: center;
        background: rgba(115, 253, 252, 0.05);
        border: 1px solid rgba(115, 253, 252, 0.4);
        border-radius: 6px;
        box-shadow: 0 0 24px rgba(115, 253, 252, 0.12);
    }

    .review__success[hidden] { display: none; }

    .review__success i {
        font-size: 2rem;
        color: var(--neon-aqua);
        text-shadow: 0 0 2px currentColor /* dimmed from 7px (field-caught fuzz) */, 0 0 18px rgba(115, 253, 252, 0.5);
    }

    .review__success h3 {
        font-family: var(--font-body); /* Saira — card titles (was Orbitron) */
        font-size: var(--fs-h3);
        color: var(--text-primary);
        letter-spacing: var(--ls-wide);
        margin: 0.75rem 0 0.4rem;
    }

    .review__success p { color: var(--text-secondary); margin: 0 auto; }

    /* Honeypot: removed from every human pathway — visually hidden,
       untabbable, unannounced. Bots read the DOM and fill it anyway. */
    .review__hp {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
    }

    /* Solid chamfered control — the burger/close family, sized up.
       clip-path severs box-shadow, so the hover glow is drop-shadow
       (the chamfer lesson). */
    .review__submit {
        justify-self: center;
        display: inline-flex;
        align-items: center;
        gap: 0.55rem;
        padding: 0.55rem 1.1rem;
        background: var(--grad-cta-deep);
        border: 0;
        clip-path: polygon(
            9px 0, 100% 0,
            100% calc(100% - 9px), calc(100% - 9px) 100%,
            0 100%, 0 9px
        ); /* TR/BL brand cuts, scaled to the compact size */
        color: #fff; /* 4.6:1 on the deep gradient — the burger's math */
        font-family: var(--font-tech);
        font-size: var(--fs-2xs); /* compact control voice */
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        white-space: nowrap;
        cursor: pointer;
        transition: filter var(--transition), transform var(--transition);
    }

    .review__submit:hover {
        filter: brightness(1.15) drop-shadow(0 0 10px rgba(255, 46, 151, 0.45));
    }

    .review__submit:active { transform: translateY(1px); }

    .review__submit:focus-visible {
        outline: 3px solid var(--neon-aqua);
        outline-offset: 3px; /* rectangular ring around the chamfer —
            outlines trace the box, not the clip, and that's fine */
    }

    .review__submit i { font-size: 1.05em; }

    /* =====================================================
       FOOTER CONSOLE — detached floating page-link bar
       A true sibling of the footer: its own <nav>, NOT inside
       the basement. BARLESS: the container is pure layout —
       no glass, no rim, no shadow. The chamfered chips ARE the
       bar, spread wide across the wrap — HOVERING above the
       basement at every width, starfield showing in the gap
       (the 768+ seam-straddle is retired; floaty things float).
       ===================================================== */
    .footer-console {
        position: relative;
        z-index: var(--z-console); /* rides above the footer glass it overlaps */
        width: min(var(--wrap-max), 100% - 2rem); /* the wrap's lane */
        margin-inline: auto;
        /* the section->footer act gap lives HERE now (moved off
           the footer, which the console is welded to instead) */
        margin-top: clamp(6rem, 15vh, 10rem);
        /* the hover gap: clearly floating, clearly the footer's —
           a band of starfield always shows beneath the chips */
        margin-bottom: clamp(1rem, 2.5vh, 1.75rem);
    }

    .footer-console__links {
        /* BUG FIX: the reset only de-bullets ul[class] — the console
           list shipped class-less, so UA markers leaked through.
           Classed now, and the component resets explicitly anyway
           (never depend on a selector two layers away). */
        list-style: none;
        margin: 0;
        padding: 0;
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        /* elongate: the column gap grows with the viewport so the
           barless row spreads wide instead of huddling at center */
        gap: 0.6rem clamp(0.95rem, 3vw, 2.25rem);
    }

    /* Chamfered chips — the control-corner language (TL/BR cuts,
       shared with the burger/close/submit family). clip-path severs
       real borders AND box-shadow, so: the rim is the gradient-border
       technique (transparent 1px border; inner fill clipped to
       padding-box, aqua ring painted in the border area via a
       border-box layer) and glows are drop-shadow. The rim vanishes
       along the diagonal cuts — same accepted trait as the
       back-to-top chamfer. */
    .footer-console a {
        display: inline-flex;
        align-items: center;
        min-height: 44px; /* grown — the chips read a size too small */
        padding: 0.3rem 0.85rem; /* slimmed inline — five chips need to
            wrap gracefully in the mobile viewports */
        border: 1px solid transparent; /* the rim's track — never colored */
        background:
            linear-gradient(rgba(18, 13, 40, 0.96), rgba(18, 13, 40, 0.96)) padding-box,
            rgba(115, 253, 252, 0.32) border-box;
        clip-path: polygon(
            8px 0, 100% 0,
            100% calc(100% - 8px), calc(100% - 8px) 100%,
            0 100%, 0 8px
        );
        font-size: var(--fs-md); /* stepped up again — chips are the
            footer's nav; they've earned nav-grade type */
        letter-spacing: var(--ls-wide);
        color: var(--text-secondary);
        text-decoration: none;
        /* layered background images don't interpolate — transition
           the properties that can */
        transition: color var(--transition), filter var(--transition);
    }

    .footer-console a:hover {
        color: var(--neon-aqua);
        background:
            linear-gradient(rgba(18, 13, 40, 0.96), rgba(18, 13, 40, 0.96)) padding-box,
            var(--neon-aqua) border-box; /* the rim becomes a lit tube */
        filter: drop-shadow(0 0 8px rgba(115, 253, 252, 0.35));
    }

    /* Scrollspy lights the chip, same voice as the header links.
       (drop-shadow, not box-shadow — the chamfer lesson) */
    .footer-console a[aria-current] {
        color: var(--neon-aqua);
        background:
            linear-gradient(rgba(18, 13, 40, 0.96), rgba(18, 13, 40, 0.96)) padding-box,
            rgba(115, 253, 252, 0.8) border-box;
        filter: drop-shadow(0 0 7px rgba(115, 253, 252, 0.3));
    }

    /* =====================================================
       FOOTER — the basement level
       ===================================================== */
    /* GLASS basement: blur over the starfield behind it, layered
       tint, hairline top edge with a faint inner glow */
    .site-footer {
        position: relative;
        /* Above the fixed starfield canvas (z1) — same layer as the
           sections. Without this (z-auto), the stars PAINT OVER the
           glass, and backdrop-filter can only blur what's BEHIND an
           element — the blur was running with nothing in its
           backdrop. */
        z-index: var(--z-content);
        /* NO margin-top: the floating console above carries the
           section gap AND the detachment gap */
        border-top: 1px solid rgba(115, 253, 252, 0.22);
        background: linear-gradient(180deg, rgba(115, 253, 252, 0.045), rgba(20, 15, 45, 0.5) 22%, rgba(14, 10, 31, 0.78));
        backdrop-filter: blur(12px);
        -webkit-backdrop-filter: blur(12px);
        box-shadow: inset 0 1px 0 rgba(115, 253, 252, 0.08);
        padding: clamp(2.5rem, 7vh, 4.5rem) 0 0;
    }

    /* THREE ZONES per viewport via grid AREAS (Site links live in
       the floating console; the Site column is retired):
       320  — single column: brand / reach / resources
       640  — brand banner spans; reach + resources pair
       1024 — brand | reach | resources, three tracks */
    .site-footer__grid {
        display: grid;
        grid-template-areas:
            "brand"
            "reach"
            "resources";
        gap: clamp(2rem, 5vw, 3rem);
        padding-bottom: clamp(2rem, 5vh, 3rem);
    }

    @media (min-width: 640px) {
        .site-footer__grid {
            grid-template-areas:
                "brand brand"
                "reach resources";
            grid-template-columns: 1.15fr 1fr; /* reach a touch wider — the email */
            column-gap: clamp(2.5rem, 6vw, 4rem);
            /* cinch: at the banner + pair state the rows read too
               flush to the wrap's edges — pull both sides in. The
               1024 columns state releases it (tracks do the work). */
            padding-inline: clamp(1.5rem, 5vw, 3.5rem);
        }
    }

    @media (min-width: 1024px) {
        .site-footer__grid {
            grid-template-areas: "brand reach resources";
            /* Brand carries the tag paragraph — widest track;
               resources is the shortest column and takes the least */
            grid-template-columns: 1.5fr 1.3fr 1fr;
            padding-inline: 0; /* the cinch retires with the banner */
        }
    }

    .site-footer__brand     { grid-area: brand; }
    .site-footer__resources { grid-area: resources; }
    .site-footer__reachcol  { grid-area: reach; }

    .site-footer address { font-style: normal; } /* the element's
        default italic is a relic — contact info reads upright */

    /* --- Brand column --- */
    .site-footer__lockup {
        display: inline-flex;
        align-items: center;
        gap: 0.7rem;
        text-decoration: none;
        margin-bottom: 1.2rem;
    }

    .site-footer__coin {
        display: grid;
        place-items: center;
        width: 34px;
        height: 30px;
        background: var(--grad-brand);
        clip-path: polygon(9px 0, 100% 0, 100% calc(100% - 9px), calc(100% - 9px) 100%, 0 100%, 0 9px);
        font-family: var(--font-tech);
        font-weight: 800;
        font-size: var(--fs-sm);
        color: #fff;
    }

    .site-footer__wordmark {
        font-family: var(--font-tech);
        font-weight: 800;
        font-size: var(--fs-md);
        letter-spacing: var(--ls-wider);
        color: var(--text-primary);
    }

    .site-footer__tag {
        font-size: var(--fs-md);
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        margin-bottom: 1.1rem;
        /* stacked (320) and banner (640) rows: the zone runs FULL
           width — no measure cap fighting the row */
        max-width: none;
    }

    @media (min-width: 1024px) {
        /* true-column state only: cap the measure so the tag sets
           comfortably inside the wide brand track */
        .site-footer__tag { max-width: 34ch; }
    }

    .site-footer__social {
        display: flex;
        gap: 0.7rem;
        list-style: none;
        padding: 0;
        margin: 0;
    }

    /* Circles = external (the shape grammar) */
    .site-footer__social a {
        display: grid;
        place-items: center;
        width: 38px;
        height: 38px;
        border: 1px solid rgba(115, 253, 252, 0.35);
        border-radius: 50%;
        color: var(--neon-aqua);
        text-decoration: none;
        transition: var(--transition);
    }

    .site-footer__social a:hover {
        background: rgba(255, 46, 151, 0.13);
        border-color: rgba(255, 46, 151, 0.55);
        color: #fff;
        box-shadow: 0 0 12px rgba(255, 46, 151, 0.3);
    }

    /* --- Link columns --- */
    .site-footer__heading {
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        font-weight: 700;
        letter-spacing: var(--ls-wider);
        text-transform: uppercase;
        color: var(--neon-yellow);
        text-shadow: 0 0 6px rgba(255, 215, 0, 0.45);
        margin-bottom: 0.9rem;
        max-width: none;
    }

    .site-footer__col ul {
        list-style: none;
        padding: 0;
        margin: 0;
        display: grid;
        gap: 0.55rem;
    }

    .site-footer__col a {
        color: var(--text-secondary);
        text-decoration: none;
        font-size: var(--fs-md);
        transition: var(--transition);
    }

    .site-footer__col a:hover {
        color: var(--neon-aqua);
        text-shadow: 0 0 8px rgba(115, 253, 252, 0.55);
    }

    .site-footer__reach li {
        display: flex;
        align-items: baseline;
        gap: 0.6rem;
        color: var(--text-secondary);
        font-size: var(--fs-md);
    }

    .site-footer__reach i {
        color: var(--neon-aqua);
        text-shadow: 0 0 2px currentColor /* dimmed from 7px (field-caught fuzz) */;
        font-size: var(--fs-xs);
        flex-shrink: 0; /* fixed decorations never squish (the dots lesson) */
    }

    .site-footer__reach a { overflow-wrap: anywhere; } /* the long email */

    /* --- Legal bar --- */
    .site-footer__bar {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        justify-content: space-between;
        gap: 0.9rem;
        padding: 1.1rem 0 1.4rem;
        border-top: 1px solid rgba(115, 253, 252, 0.12);
    }

    .site-footer__legal {
        font-size: var(--fs-2xs);
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        margin: 0;
        max-width: none;
    }

    /* Right cluster: legal links + back-to-top, one aligned unit */
    .site-footer__bar-right {
        display: flex;
        align-items: center;
        gap: 1.25rem;
    }

    .site-footer__legal span { padding-inline: 0.3rem; }

    .site-footer__legal-links {
        display: flex;
        align-items: center;
        gap: 0.9rem;
        font-size: var(--fs-2xs);
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
    }

    .site-footer__legal-links li:not(:last-child)::after {
        content: "·";
        content: "·" / "";
        margin-left: 0.9rem; /* mirrors the gap */
    }

    .site-footer__legal-links a {
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        text-decoration: none;
        transition: var(--transition);
    }

    .site-footer__legal-links a:hover {
        color: var(--neon-aqua);
        text-shadow: 0 0 8px rgba(115, 253, 252, 0.55);
    }

    /* (.site-footer__top retired — superseded by .to-top; audit-removed) */

    /* The blog's Soon chip */
    .site-footer__soon {
        display: inline-block;
        margin-left: 0.4rem;
        padding: 0.05rem 0.4rem;
        border: 1px solid rgba(255, 215, 0, 0.5);
        border-radius: 4px;
        font-family: var(--font-tech);
        font-size: var(--fs-3xs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-yellow);
        vertical-align: middle;
    }

    /* =====================================================
       SHARED SECTION PRIMITIVES — every section below the hero
       uses this header voice (hero keeps its own larger scale)
       ===================================================== */
    .section__eyebrow {
        /* head rhythm opened up (eyebrow -> h2 -> subcopy) */
        font-family: var(--font-tech);
        font-size: var(--fs-xs);
        font-weight: 600;
        letter-spacing: var(--ls-wider);
        text-transform: uppercase;
        /* GOLD over the aqua signs — the complementary pair, same
           duo as the services column's gold link under its aqua h2 */
        color: var(--neon-yellow);
        text-shadow:
            0 0 6px  rgba(255, 215, 0, 0.6),
            0 0 16px rgba(255, 215, 0, 0.35); /* layered neon sign */
        /* it's a <p>: without this, the global 65ch cap makes a
           left-set box and "centered" text lands off-center in
           centered section heads (same bug family as the button
           wrapper) */
        max-width: none;
        margin-bottom: 0.9rem;
    }

    /* Section titles: SOLID GLOWING AQUA — deliberately a different
       voice from the h1 (white + gradient keywords). Solid ink means
       real layered neon: tight core, mid halo, far bloom. */
    .section__title {
        margin-bottom: 0.75em; /* air between the title and whatever
            follows it (field-caught on connect) */
        font-family: var(--font-tech);
        font-size: var(--fs-h2);
        font-weight: 800;
        line-height: var(--lh-heading);
        letter-spacing: 0.045em; /* em-based — scales with the size;
            widened from 0.025 (field-caught: cramped at display sizes) */
        color: var(--neon-aqua);
        /* Heather's neon helper, dialed down one notch: full-op core,
           the outer layers eased so the sign hums instead of blazes */
        text-shadow:
            0 0 4px  var(--neon-aqua),
            0 0 12px rgba(115, 253, 252, 0.65),
            0 0 24px rgba(115, 253, 252, 0.35);
        text-wrap: balance;
    }

    /* =====================================================
       SERVICES — split: copy left, glass list right
       ===================================================== */
    .services {
        position: relative; /* namespace + positioning context */
        /* Generous clearance both ways: a real horizon after the
           full-viewport hero, and a long runway before the
           portfolio section begins (values live at the act tokens) */
        padding-top: var(--space-act-in);
        padding-bottom: var(--space-act-out);
    }

    .services__grid {
        display: grid;
        gap: clamp(1.75rem, 4vw, 3.5rem);
        align-items: center;
    }

    @media (min-width: 768px) {
        .services__grid { grid-template-columns: 0.9fr 1.1fr; }
    }

    .services__copy p {
        color: var(--text-secondary);
        margin-bottom: 1.15rem;
    }

    .services__more {
        display: inline-flex;
        align-items: center;
        gap: 0.45rem;
        margin-top: 0.85rem;
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        /* GOLD neon — complementary against the aqua h2 above it;
           13.84:1 on the base. Glow grammar: solid ink, own color. */
        color: var(--neon-yellow);
        /* the neon helper pattern — full-opacity layers, scaled a
           notch tighter for the smaller type */
        text-shadow:
            0 0 4px  var(--neon-yellow),
            0 0 12px var(--neon-yellow),
            0 0 20px var(--neon-yellow);
        text-decoration: none;
    }

    .services__more i { font-size: 1em; transition: transform var(--transition); }
    .services__more:hover i { transform: translateX(3px); }

    /* --- The list: menu-chip DNA — 6px soft glass boxes --- */
    .services__list {
        display: grid;
        gap: 0.8rem;
    }

    /* Containers UNIFIED: one aqua-glass finish for every row (the
       chip DNA); the palette rotation lives on the icons alone.
       Hover = the border becomes a lit neon tube. */
    /* Two-zone row: icon + title share the TOP line; the copy spans
       the full row width beneath them both */
    .service-row {
        display: grid;
        grid-template-columns: auto 1fr;
        align-items: center;
        gap: 0.5rem 0.9rem;
        padding: clamp(1.1rem, 2vw, 1.5rem) clamp(1.05rem, 1.8vw, 1.4rem); /* was 0.85/1 — slim (field-caught) */
        background: rgba(115, 253, 252, 0.06);
        border: 1px solid rgba(115, 253, 252, 0.28);
        border-radius: 6px;
        backdrop-filter: blur(8px);
        -webkit-backdrop-filter: blur(8px);
        transition: var(--transition);
    }

    /* Hue keys (ported mechanic): each row owns an accent via three
       custom props — one selector set serves every color downstream */
    .service-row[data-hue="aqua"]   { --hue: var(--neon-aqua);   --hue-soft: var(--aqua-soft);   --hue-glow: var(--glow-aqua); }
    .service-row[data-hue="pink"]   { --hue: var(--neon-pink);   --hue-soft: var(--pink-soft);   --hue-glow: var(--glow-pink); }
    .service-row[data-hue="purple"] { --hue: var(--neon-purple); --hue-soft: var(--purple-soft); --hue-glow: var(--glow-purple); }
    .service-row[data-hue="yellow"] { --hue: var(--neon-yellow); --hue-soft: var(--yellow-soft); --hue-glow: var(--glow-yellow); }

    .service-row:hover {
        transform: translateX(4px);
        border-color: var(--hue, rgba(115, 253, 252, 0.75));
        box-shadow: var(--hue-glow, 0 0 8px rgba(115, 253, 252, 0.28));
    }

    /* Icons glow in their OWN color — text-shadow with currentColor
       means one rule serves all four tints. Shadow sits on the span
       wrapper (inherits to the FA <i>; never style <i> directly). */
    .service-row__icon {
        flex-shrink: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        width: 48px;  /* grown — the tiles read too small */
        height: 48px;
        border-radius: 6px;
        font-size: 1.35rem; /* stepped past --icon-sm; the tile earned it */
        /* COORDINATED at rest: one aqua ink across all tiles — the
           row's hue is a HOVER personality, not a resting rainbow */
        background: var(--aqua-soft);
        color: var(--neon-aqua);
        text-shadow: 0 0 2px currentColor /* dimmed from 7px (field-caught fuzz) */; /* resting ember (kept!) */
        transition: background var(--transition), color var(--transition), text-shadow var(--transition);
    }

    /* Row hover ignites the icon: the neon helper pattern */
    .service-row:hover .service-row__icon {
        /* the row's hue arrives WITH the ignite (rest is uniform aqua) */
        background: var(--hue-soft, var(--aqua-soft));
        color: var(--hue, var(--neon-aqua));
        /* toned down: was a 3-layer full-opacity bloom (too hot,
           field-caught) — now a gentler two-layer lift */
        text-shadow: 0 0 2px currentColor, 0 0 9px currentColor; /* fallback */
        text-shadow:
            0 0 4px  currentColor,
            0 0 10px color-mix(in oklch, currentColor 32%, transparent);
    }

    @media (min-width: 768px) {
        /* desktop: the copy aligns under the TITLE, leaving the
           icon column as a clean left rail */
        .service-row__copy { grid-column: 2; }
    }

    .service-row__title {
        font-family: var(--font-body); /* Saira — card titles */
        font-size: var(--fs-h3); /* bumped from fs-md — cards read too small */
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        color: var(--text-primary);
        margin: 0;
    }

    .service-row__copy {
        grid-column: 1 / -1; /* mobile: full width under both */
        font-size: var(--fs-body);
        line-height: var(--lh-normal);
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        margin: 0;
        max-width: none;
    }



    /* =====================================================
       PORTFOLIO — browser-chrome scroll-window cards over the
       perspective grid floor
       ===================================================== */
    .portfolio {
        position: relative;
        overflow: hidden; /* contains the floor */
        /* Section-transition recipe: incoming clearance + outgoing
           runway — a long stretch of starfield between the acts
           (values live at the act tokens) */
        padding-top: var(--space-act-in);
        padding-bottom: var(--space-act-out);
    }

    /* The style guide's perspective grid floor, first appearance:
       aqua gridlines receding under the work. Static + masked —
       pure atmosphere, no animation cost. */
    .portfolio__floor {
        position: absolute;
        left: -20%;
        right: -20%;
        bottom: -12%;
        height: 46%;
        background:
            repeating-linear-gradient(90deg, rgba(115, 253, 252, 0.14) 0 1px, transparent 1px 72px),
            repeating-linear-gradient(0deg,  rgba(115, 253, 252, 0.14) 0 1px, transparent 1px 56px);
        transform: perspective(600px) rotateX(58deg);
        transform-origin: center bottom;
        -webkit-mask-image: linear-gradient(to top, rgba(0,0,0,0.9), transparent 85%);
        mask-image: linear-gradient(to top, rgba(0,0,0,0.9), transparent 85%);
        pointer-events: none;
    }

    .portfolio__head {
        position: relative;
        text-align: center;
        margin-bottom: clamp(2.25rem, 6vh, 4rem);
    }

    .portfolio__lede { color: var(--text-secondary); margin-inline: auto; }

    .portfolio__grid {
        position: relative;
        display: grid;
        gap: clamp(1.5rem, 3vw, 2.25rem);
    }

    @media (min-width: 640px)  { .portfolio__grid { grid-template-columns: repeat(2, 1fr); } }
    @media (min-width: 1024px) { .portfolio__grid { grid-template-columns: repeat(4, 1fr); } } /* 4 towers */

    /* --- Card: glass body wearing a browser chrome bar.
       position:relative anchors the stretched trigger button. --- */
    .work-card {
        position: relative;
        display: flex;
        flex-direction: column;
        background: rgba(115, 253, 252, 0.05);
        border: 1px solid rgba(115, 253, 252, 0.22);
        border-radius: 6px;
        overflow: hidden;
        backdrop-filter: blur(8px);
        -webkit-backdrop-filter: blur(8px);
        transition: var(--transition);
    }

    .work-card:hover {
        transform: translateY(-4px);
        /* hue-keyed lift: each card glows in ITS project's accent */
        border-color: var(--hue, rgba(115, 253, 252, 0.6));
        box-shadow: 0 12px 32px rgba(0, 0, 0, 0.35), var(--hue-glow, 0 0 14px rgba(115, 253, 252, 0.2));
    }


    /* --- The scroll window: HAND-SCROLLED (the hover auto-pan is
       retired — users explore the page themselves). Sits ABOVE the
       stretched button (z-index 2) or the overlay would eat every
       wheel/touch gesture; a JS delegate keeps taps on the image
       opening the modal, so scroll = explore, click = open.
       tabindex + role=region give keyboard users the same scroll. --- */
    /* FACE CARDS (ported): the card preview is a STATIC screen —
       no scroll, no tab stop, no region landmark. The full scroll
       experience lives exclusively in the case modal, which also
       retires the old duplicate-region-name problem. */
    .work-card__screen {
        position: relative; /* the face's absolute frame */
        aspect-ratio: 5 / 8; /* a touch longer than 2:3 (+7% height) */
        /* FLEX GOTCHA: in the card's column flex, min-height:auto is
           CONTENT-based — a 5,000px screenshot inflates the screen
           past its ratio (and every card differently). Zeroing the
           minimum lets aspect-ratio govern... */
        min-height: 0;
        overflow: hidden; /* fallback */
        overflow: clip;
        background: var(--bg-deep);
    }

    /* Hue keys — same three-prop mechanic as the service rows */
    .work-card[data-hue="aqua"]   { --hue: var(--neon-aqua);   --hue-soft: var(--aqua-soft);   --hue-glow: var(--glow-aqua); }
    .work-card[data-hue="pink"]   { --hue: var(--neon-pink);   --hue-soft: var(--pink-soft);   --hue-glow: var(--glow-pink); }
    .work-card[data-hue="purple"] { --hue: var(--neon-purple); --hue-soft: var(--purple-soft); --hue-glow: var(--glow-purple); }
    .work-card[data-hue="yellow"] { --hue: var(--neon-yellow); --hue-soft: var(--yellow-soft); --hue-glow: var(--glow-yellow); }

    /* Card FACE: the real screenshot fills the 2:3 screen, cropped
       from the TOP — the face shows the page's opening act; the full
       scroll lives in the modal viewer */
    .work-card__face {
        /* ...and absolute positioning takes the image OUT of the
           sizing equation entirely — the screen's ratio box is the
           single source of truth, every card identical */
        position: absolute;
        inset: 0;
        width: 100%;
        height: 100%;
        object-fit: cover;
        object-position: 50% 0%;
        /* hover drift: a slight constant zoom buys sideways overflow,
           and JS drifts BOTH axes toward the cursor — slow, floaty,
           made for perusing. The full page belongs to the modal. */
        transform: scale(1.07);
        transition: object-position 1.1s var(--ease), transform 1.1s var(--ease);
    }

    .work-card__shot {
        display: block;
        width: 100%;
        height: auto;
    }


    /* Meta fills the card's remaining height so the CTA can pin to
       the bottom — grid rows stretch the cards equal, margin-top:auto
       does the alignment; titles and subs stay at the top */
    .work-card__meta {
        padding: 0.9rem 1rem 1.1rem;
        display: flex;
        flex-direction: column;
        flex: 1;
        justify-content: flex-end; /* ported: copy anchors to the
            bottom edge so all four cards read level across the row */
    }

    .work-card__name {
        font-family: var(--font-tech);
        font-size: var(--fs-md); /* card label, not a display head */
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        color: var(--text-primary);
        margin-bottom: 0.5rem;
    }

    .work-card__sub {
        font-size: var(--fs-md);
        line-height: var(--lh-snug);
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        margin-bottom: 0.7rem;
    }

    /* The visible affordance (aria-hidden span — the stretched
       button is the real control) */
    .work-card__cta {
        margin-top: auto;    /* pinned to the meta's floor */
        padding-top: 0.5rem; /* clearance when the sub runs long */
        align-self: flex-start; /* the flex column would stretch it
            full-width otherwise — keep it text-sized */
        display: inline-flex;
        align-items: center;
        gap: 0.4rem;
        font-family: var(--font-tech);
        font-size: var(--fs-3xs); /* micro-label doctrine */
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-aqua);
        text-shadow: 0 0 6px rgba(115, 253, 252, 0.5);
    }

    .work-card__cta i { font-size: 1em; transition: transform var(--transition); }
    .work-card:hover .work-card__cta i { transform: translateX(3px); }

    .portfolio__more-wrap {
        text-align: center;
        margin-top: clamp(2rem, 5vh, 3.25rem);
    }




    /* --- Atmosphere: nebula + ribbons --- */
    .hero__atmosphere {
        position: absolute;
        inset: 0;
        z-index: 0;
        pointer-events: none;
    }

    /* Nebula: three overlapping glow-pool radials in the brand triad.
       Alphas kept low (<=0.16) so text contrast never dips. */
    .hero__nebula {
        position: absolute;
        inset: -10%;
        background:
            radial-gradient(42% 34% at 32% 38%, rgba(255, 46, 151, 0.16) 0%, transparent 70%),
            radial-gradient(46% 38% at 68% 55%, rgba(168, 85, 247, 0.15) 0%, transparent 70%),
            radial-gradient(34% 30% at 52% 30%, rgba(115, 253, 252, 0.10) 0%, transparent 70%);
        filter: blur(30px);
    }

    /* Ribbons: two blurred gradient bands crossing behind the copy */
    .hero__ribbon {
        position: absolute;
        left: -12%;
        width: 124%;
        height: clamp(70px, 12vh, 130px);
        filter: blur(34px);
        opacity: 0.4;
    }

    /* Both ribbons share ONE direction (-8deg), overlapping with a
       small vertical separation — parallel bands of the same aurora,
       not a crossing. Blur radii make the 8% gap read as overlap. */
    .hero__ribbon--a {
        top: 37%;
        background: linear-gradient(90deg, transparent 0%, var(--neon-pink) 35%, var(--neon-purple) 65%, transparent 100%);
        transform: rotate(-12deg);
    }

    .hero__ribbon--b {
        top: 45%;
        background: linear-gradient(90deg, transparent 0%, var(--neon-aqua) 30%, var(--glass-blue) 70%, transparent 100%);
        transform: rotate(-12deg);
        opacity: 0.28;
    }

    /* Slow drift — translateX only, rotation held so the bands stay
       parallel; opposite phases so the pair breathes. Motion-gated. */
    @media (prefers-reduced-motion: no-preference) {
        .hero__ribbon--a { animation: ribbon-drift-a 28s ease-in-out infinite alternate; }
        .hero__ribbon--b { animation: ribbon-drift-b 34s ease-in-out infinite alternate; }
    }

    @keyframes ribbon-drift-a {
        from { transform: rotate(-12deg) translateX(-2.5%); }
        to   { transform: rotate(-12deg) translateX(2.5%); }
    }

    @keyframes ribbon-drift-b {
        from { transform: rotate(-12deg) translateX(2.5%); }
        to   { transform: rotate(-12deg) translateX(-2.5%); }
    }

    /* Starfield canvas — background stack layer 3 */
    #hcwl-stars {
        position: fixed;
        inset: 0;
        z-index: var(--z-canvas);
        width: 100%;
        height: 100%;
        pointer-events: none;
    }
}

/* ---------------- UTILITIES ---------------- */
/* FORCED COLORS (Windows High Contrast): the UA strips backgrounds,
   shadows, and text glows — states that lived in glow alone need a
   structural signal, and glass panels need visible edges. */
@media (forced-colors: active) {
    /* current page: glow is gone, underline carries the state */
    .site-nav__links a[aria-current] { text-decoration: underline; }

    /* interactive/glass surfaces keep drawn borders (colors are
       system-controlled; presence is what matters) */
    .btn-hero,
    .hazard__cta,
    .hazard { border: 1px solid; }
}

/* ============================================================
   LEGAL DOCUMENT LAYOUT — privacy & terms
   A single quiet reading column: subheads sit directly above
   their text, everything flows top to bottom. Deliberately NOT
   the expressive split layout — legal content earns calm.
   ============================================================ */
@layer components {
    .legal-doc {
        max-width: 64ch;      /* comfortable single-column measure */
        margin-inline: auto;
    }

    .legal-doc__block { margin-bottom: clamp(2rem, 5vw, 3rem); }

    .legal-doc__block:last-child { margin-bottom: 0; }

    .legal-doc__heading {
        font-family: var(--font-body);   /* Saira — reading, not display */
        font-size: clamp(1.2rem, 1rem + 1vw, 1.5rem);
        font-weight: 700;
        letter-spacing: 0;
        color: var(--neon-aqua);
        margin-bottom: 0.9rem;
        padding-bottom: 0.6rem;
        border-bottom: 1px solid var(--aqua-line);
    }

    .legal-doc__block p {
        color: var(--text-secondary);
        line-height: var(--lh-relaxed, 1.7);
        margin-bottom: 1rem;
        max-width: none;
    }

    .legal-doc__block p:last-child { margin-bottom: 0; }

    .legal-doc__block strong { color: var(--text-primary); }
}

/* ============================================================
   POST — the Lab Notes article reading layer
   ============================================================ */
@layer sections {
    .post__head {
        max-width: 46rem;
        margin-inline: auto;
        text-align: center;
        margin-bottom: clamp(2rem, 5vh, 3rem);
    }

    .post__stamps {
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        gap: 0.5rem 1.4rem;
        margin-top: 0.5rem;
        font-family: var(--font-mono, monospace);
        font-size: var(--fs-xs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--text-muted);
        max-width: none;
    }

    .post__stamp i { color: var(--hue, var(--neon-aqua)); margin-right: 0.3rem; }

    .post[data-hue="aqua"]   { --hue: var(--neon-aqua); }
    .post[data-hue="pink"]   { --hue: var(--neon-pink); }
    .post[data-hue="purple"] { --hue: var(--neon-purple); }
    .post[data-hue="yellow"] { --hue: var(--neon-yellow); }

    /* the reading column: calm, generous, editorial — on glass
       (field request: body copy in a glassmorphic container; the
       head stamps and pagination ride the starfield outside it) */
    .post__body {
        max-width: 72ch; /* padding included — inner measure ~68ch */
        margin-inline: auto;
        padding: clamp(1.7rem, 3.5vw, 2.6rem) clamp(1.4rem, 3vw, 2.4rem);
        background: var(--glass-bg);
        border: 1px solid var(--glass-border);
        border-top: 3px solid var(--hue, var(--neon-aqua));
        border-radius: 8px;
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
    }

    .post__body > :last-child { margin-bottom: 0; }

    .post__body p {
        color: var(--text-secondary);
        line-height: var(--lh-relaxed, 1.7);
        letter-spacing: -0.01em; /* slightly negative (field request):
            Saira runs open at reading sizes — the inherited +0.3px
            base tracking read loose; letters pull gently together
            while word-spacing keeps the words distinct */
        word-spacing: 0.05em; /* a touch of word-air (field request) */
        margin-bottom: 1.15rem;
        max-width: none;
    }

    .post__body h2 {
        font-family: var(--font-body);
        font-size: var(--fs-lg);
        font-weight: 700;
        color: var(--text-primary);
        margin: 3.4rem 0 0.9rem; /* main sections separate by AIR,
            not ornament (field-corrected — the spark moved down a
            level to the h3 subsections) */
        padding-bottom: 0.5rem;
        border-bottom: 1px solid var(--aqua-line);
    }

    .post__body h3 {
        font-family: var(--font-body);
        font-size: var(--fs-body);
        font-weight: 700;
        color: var(--text-primary);
        margin: 2.1rem 0 0.6rem;
    }

    /* the small hue spark marks INNER section breaks — subsections
       under a main section's copy (field-placed) */
    .post__body h3::before {
        content: "";
        display: block;
        width: 40px;
        height: 2px;
        border-radius: 999px;
        margin: 0 auto 1.5rem;
        background: linear-gradient(90deg, transparent, var(--hue, var(--neon-aqua)), transparent);
    }

    .post__body ul,
    .post__body ol {
        margin: 0 0 1.15rem 1.4rem;
        color: var(--text-secondary);
        line-height: 1.55; /* tighter within an item (field request) */
        letter-spacing: -0.01em; /* matches paragraph tracking */
        word-spacing: 0.05em;
    }

    .post__body li { margin-bottom: 0.9rem; } /* more air BETWEEN items (field request) */

    .post__body li::marker { color: var(--hue, var(--neon-aqua)); }

    .post__body blockquote {
        margin: 1.5rem 0;
        padding: 1rem 1.3rem;
        border-inline-start: 3px solid var(--hue, var(--neon-aqua));
        background: var(--glass-bg);
        border-radius: 0 6px 6px 0;
        color: var(--text-secondary);
        font-style: italic;
    }

    .post__body a { color: var(--neon-aqua); }

    /* modest code support: inline + block (ready if any article
       teaches technique; invisible if unused) */
    .post__body code {
        font-family: var(--font-mono, monospace);
        font-size: 0.92em;
        background: rgba(14, 10, 31, 0.85);
        border: 1px solid var(--glass-border);
        border-radius: 4px;
        padding: 0.1em 0.4em;
    }

    .post__body pre {
        margin: 1.4rem 0;
        padding: 1.1rem 1.3rem;
        background: rgba(14, 10, 31, 0.85);
        border: 1px solid var(--glass-border);
        border-radius: 8px;
        overflow-x: auto;
    }

    .post__body pre code { border: 0; padding: 0; background: none; }

    .post__body strong { color: var(--text-primary); }

    /* prev / next / index */
    .post__nav {
        display: flex;
        flex-wrap: wrap;
        justify-content: space-between;
        align-items: center;
        gap: 1rem;
        max-width: 68ch;
        margin: clamp(2.5rem, 6vh, 4rem) auto 0;
        padding-top: 1.4rem;
        border-top: 1px solid var(--glass-border);
    }

    .post__nav-link {
        font-size: var(--fs-sm);
        color: var(--text-secondary);
        max-width: 20rem;
    }

    .post__nav-link:hover { color: var(--neon-aqua); }

    .post__nav-link--index {
        font-family: var(--font-tech);
        font-size: var(--fs-xs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-aqua);
    }

    /* index cards: a live note's title is the link */
    .note-card__link { color: inherit; }
    .note-card__link:hover { color: var(--hue, var(--neon-aqua)); }
}

@layer utilities {
    /* 3b. MICRO ICONS: no glow at tiny sizes — halo wider than the
       glyph reads as mud, not neon (field-caught) */
    .post__stamp i,
    .note-card__meta i,
    .hazard__chip i,
    .site-footer i,
    .fact-chip i {
        text-shadow: none;
    }

    /* 2. CARD-HOVER ICON SPIN: one smooth full vertical revolution
       (field request). Transition-based: 360 lands back at identity,
       un-hover rewinds gracefully. */
    .service-row__icon i,
    .doc-card__icon i {
        display: inline-block;
        transition: transform 1.1s cubic-bezier(0.35, 0, 0.25, 1); /* slower,
            statelier glide (field-tuned from 0.65s) */
    }

    .service-row:hover .service-row__icon i,
    .doc-card:hover .doc-card__icon i {
        transform: perspective(400px) rotateY(360deg); /* HORIZONTAL flip —
            the coin's axis, not the tumble (field-corrected) */
    }

    @media (prefers-reduced-motion: reduce) {
        .service-row:hover .service-row__icon i,
        .doc-card:hover .doc-card__icon i { transform: none; }
    }

    /* 7. MOBILE BACKGROUND PERFORMANCE: the aurora layers are
       28px-blur compositing surfaces — the single heaviest paint on
       small GPUs (field/insight request). Phones keep the sprite
       starfield (cheap) and gain a whisper of static aurora tint via
       gradient instead; blur layers return at tablet+. */
    @media (max-width: 767px) {
        .aurora { display: none; }

        body {
            background-image:
                radial-gradient(60% 40% at 15% 10%, rgba(115, 253, 252, 0.05), transparent 70%),
                radial-gradient(55% 40% at 85% 85%, rgba(255, 46, 151, 0.05), transparent 70%);
            background-attachment: fixed;
        }
    }


    /* GTM noscript iframe: hidden via class — inline style would be
       CSP-stripped and trips the house no-inline-style rule */
    .gtm-ns { display: none; visibility: hidden; }

    /* Concept Build tag on mocksite portfolio cards (honesty marker) */
    .work-card__tag {
        display: inline-block;
        margin-right: 0.4rem;
        padding: 0.1rem 0.5rem;
        border: 1px solid var(--purple-line, rgba(167, 66, 245, 0.5));
        border-radius: 999px;
        font-family: var(--font-tech);
        font-size: var(--fs-2xs, 0.65rem);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-purple);
        vertical-align: middle;
    }

    /* Rework section demo disclosure */
    .rework__demo-tag {
        margin-top: 0.6rem;
        font-size: var(--fs-sm);
        font-style: italic;
        color: var(--text-muted);
        max-width: none;
    }

    .rework__demo-tag i { color: var(--neon-yellow); margin-right: 0.35rem; }


    /* section-internal top spacer (pricing terms block) */
    [data-spaced] { margin-top: clamp(1.75rem, 5vw, 2.75rem); }

    /* center a flex action row (404 page and friends) */
    .actions--center { justify-content: center; }

    /* Scroll entrances (ported) — gated behind .js so no-JS visitors
       never meet an opacity-0 page; the observer adds .is-in. Under
       reduced motion the JS reveals everything immediately and the
       global kill-switch zeroes the transition anyway. */
    html.js .reveal {
        opacity: 0;
        transform: translateY(1.4rem);
        transition: opacity var(--slow) var(--ease), transform var(--slow) var(--ease);
        /* FAILSAFE: if JS is slow/blocked and never adds .is-in,
           this animation reveals the content anyway after a short
           beat — the page can never be permanently blank. JS wins
           when present (.is-in below fires instantly on scroll). */
        animation: reveal-failsafe 0.6s var(--ease) 1.2s forwards;
    }

    html.js .reveal.is-in {
        opacity: 1;
        transform: none;
        animation: none; /* JS took over — cancel the safety net */
    }

    @keyframes reveal-failsafe {
        to { opacity: 1; transform: none; }
    }

    /* --- Lightbox: the mobile screenshot viewer. Full-screen, image
       fits the width; tapping toggles .is-zoomed (2.2x width, pan by
       scroll). Native dialog: top layer, Esc, backdrop. --- */
    /* Floating panel, not full-bleed: the screenshot viewer hovers
       inside the viewport with the dimmed page visible around it —
       breathing room on every side, same floaty language as the nav
       panel and footer chips. */
    dialog.lightbox {
        position: fixed;
        inset: 0;
        margin: auto; /* centers the panel in both axes */
        width: min(100% - 1.75rem, 40rem);
        height: calc(100vh - 2.5rem);
        height: calc(100dvh - 2.5rem);
        max-width: none;
        max-height: none;
        padding: 0;
        border: 1px solid var(--glass-border);
        border-radius: 10px;
        overflow: hidden; /* the pane scrolls; the corners stay cut */
        background: rgba(10, 7, 22, 0.97);
        box-shadow: 0 18px 60px rgba(0, 0, 0, 0.6);
    }

    dialog.lightbox::backdrop { background: rgba(10, 7, 22, 0.82); }

    .lightbox__pane {
        width: 100%;
        height: 100%;
        overflow: auto;
        -webkit-overflow-scrolling: touch;
        display: grid;
    }

    .lightbox__img {
        display: block;
        width: 100%;
        height: auto;
        cursor: zoom-in;
    }

    .lightbox__img.is-zoomed {
        width: 220%;
        max-width: none;
        cursor: zoom-out;
    }

    .lightbox__close {
        /* absolute against the DIALOG (its containing block) — a
           viewport-fixed button would float outside the inset panel */
        position: absolute;
        top: 0.65rem;
        right: 0.65rem;
        z-index: 2;
        display: grid;
        place-items: center;
        width: 44px;
        height: 44px;
        background: var(--grad-cta-deep);
        clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
        color: #fff;
        font-size: 1.15rem;
    }

    /* SINGLE-COLUMN modal (<768): the viewer stops scrolling and
       becomes a static poster — top of the page visible, whole
       thing tappable to the lightbox. Scroll-inside-scroll (image
       panning atop the story panning) was too much on phones.
       Tablets and up keep the hand-scrolled viewer. */
    @media (max-width: 767px) {
        .case-modal__viewer {
            position: relative; /* the chip's anchor */
            overflow: hidden;   /* NO internal scroll — poster mode */
            cursor: zoom-in;
        }

        .case-modal__viewer::after {
            content: "\f00e  Tap to zoom";
            /* absolute, not sticky: with the scroll gone, a sticky
               chip after the tall image would sit clipped below the
               poster's window */
            position: absolute;
            bottom: 0.6rem;
            left: 50%;
            transform: translateX(-50%);
            display: block;
            width: max-content;
            padding: 0.25rem 0.7rem;
            border-radius: 999px;
            background: rgba(14, 10, 31, 0.85);
            border: 1px solid var(--aqua-line);
            font-family: "Font Awesome 6 Free", var(--font-tech);
            font-weight: 900;
            font-size: var(--fs-3xs);
            letter-spacing: var(--ls-wide);
            color: var(--neon-aqua);
            pointer-events: none;
        }
    }

    /* =====================================================
       INNER-PAGE KIT — the small set of generics the inner
       pages need beyond the homepage's component library
       ===================================================== */

    /* Centered head variant: for sections whose content is a
       capped, centered block (the step timelines) — the head
       joins the content's axis instead of hugging the left */
    .section__head--center {
        text-align: center;
    }

    .section__head--center .page-lede { margin-inline: auto; }

    /* Section head: the eyebrow + title (+ lede) opening block.
       Carries the RHYTHM — a deliberate gap between a section's
       head and whatever content follows it. (This class existed
       once as a phantom; now it earns its keep.) */
    .section__head { margin-bottom: clamp(1.9rem, 5vh, 3rem); }

    /* Page hero: inner pages open like PAGES, not like a section
       that lost its top half — centered, display-scale title,
       extra sky above. (The About opener keeps its photo-split
       layout but shares the title scale below.) */
    /* Centering is scoped to the HEAD — section-wide text-align
       leaked into the cards below and tore icons from their
       titles (screenshot-caught). */
    .page-hero .section__head {
        text-align: center;
    }

    .page-hero .section__head .page-lede {
        margin-inline: auto;
    }

    .page-first .section__title {
        font-size: clamp(2.1rem, 1.3rem + 3.6vw, 3.3rem);
        line-height: var(--lh-tight);
    }

    .page-hero.page-first {
        padding-top: calc(var(--header-total) + clamp(2.5rem, 7vh, 4.25rem));
    }

    /* First section on an inner page: clears the fixed header
       (the homepage hero does this with its own padding), and
       carries a corner GLOW POOL so page tops breathe like the
       homepage hero does — sanctioned atmosphere vocabulary */
    .page-first {
        padding-top: calc(var(--header-total) + var(--space-section));
    }

    .page-first::after {
        content: "";
        position: absolute;
        inset: 0 0 auto;
        height: min(60vh, 34rem);
        z-index: -1; /* behind the section's content, above the void */
        pointer-events: none;
        background:
            radial-gradient(38rem 22rem at 12% 0%, var(--aqua-soft), transparent 70%),
            radial-gradient(30rem 18rem at 88% 12%, var(--purple-soft), transparent 72%);
    }

    /* Page lede: the section subcopy, promoted a size */
    .page-lede {
        font-size: var(--fs-lg);
        line-height: var(--lh-normal);
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        max-width: 62ch;
    }

    /* (.cta-band retired — every band became the advisory CTA;
       audit-removed with its media rule) */

    /* =====================================================
       SERVICES PAGE — LADDER TUNING (320 -> 1440)
       320: everything stacks, base values sized here.
       480: rows gain a touch of interior air.
       640: the includes checklist pairs up (rule lives with
            .includes above).
       768: the five services go TWO-UP; row copy tucks under
            titles (existing rule).
       1024: prose sections go EDITORIAL — heading column left,
            hairlined prose right; the step timeline and the CTA
            panel cap their measure instead of stretching.
       1280: the includes checklist takes its third column.
       1440: wrap gutters widen (existing global rule) — the
            capped measures hold the composition together.
       ===================================================== */

    @media (min-width: 480px) {
        .service-row { padding: 1rem 1.15rem; }
    }

    /* =====================================================
       ORPHAN-ROW HANDLING — the two house patterns
       A) PYRAMID: when an odd card lands alone on the last row
          of an even grid (or vice versa), it CENTERS — the grid
          tapers like an upside-down pyramid instead of listing
          left with a hole beside it. Selector logic:
          :last-child:nth-child(odd) on a 2-col grid = "the lone
          final card of an odd-count set" — it fires ONLY when
          the orphan actually exists.
       B) GHOST CARD (.ghost-card below): when centering isn't
          wanted, a dim dashed placeholder occupies the hole so
          the grid reads complete. Add it in markup with
          aria-hidden="true" and show it only at the breakpoints
          where the hole occurs.
       ===================================================== */

    /* Five services, two-up: pairs read faster than a tall stack,
       and equal-height grid rows keep the cards level. The odd
       fifth card takes the PYRAMID treatment — and centering
       Free Reviews is no accident: the taper spotlights the offer. */
    @media (min-width: 768px) {
        .services__list--grid {
            grid-template-columns: repeat(2, minmax(0, 1fr));
            gap: 1rem;
        }

        .services__list--grid > .service-row:last-child:nth-child(odd) {
            grid-column: 1 / -1; /* own the full row... */
            justify-self: center; /* ...center within it... */
            width: calc(50% - 0.5rem); /* ...at one card's width
                (half the track minus half the 1rem gap) */
        }
    }

    /* Editorial split: heading rail LEFT, prose RIGHT — the wide
       viewports stop reading as a left-locked column with a
       silent right half */
    @media (min-width: 1024px) {
        .prose-split {
            display: grid;
            grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
            gap: clamp(2rem, 5vw, 4.5rem);
            align-items: start;
        }

        .prose-split .section__title {
            margin-bottom: 0.75em; /* was 0 — the split zeroed the
                title's air, defeating the spacing fix on split pages
                (cascade-audit-caught) */
        }

        /* the head column rides along as the prose scrolls —
           the tall right column no longer leaves the left one
           marooned at the top of its own section */
        .prose-split > :first-child {
            position: sticky;
            top: calc(var(--header-total) + 1.5rem);
            align-self: start;
        }

        /* (services__list--steps retired — the tl-log mission log
           from the production set replaced both step timelines) */    }

    /* The includes checklist earns its third column where the
       wrap is widest */
    @media (min-width: 1280px) {
        .includes { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    }

    /* Step timeline: a lit thread connects the numbered tiles
       through the gaps between rows — the connector runs BEHIND
       the rows (their own fills occlude it), surfacing only in
       the spaces, reading as a circuit trace down the process */

    /* Paged portfolio grid: the full tower ladder — 1 / 2 / 3 / 4
       columns at 320 / 640 / 1024 / 1280 (the homepage's own grid
       jumps straight to its four towers; this one climbs). Pages
       hold 8 cards: clean at 1, 2, and 4 columns; the 3-column
       rung leaves one seat for a ghost. */
    .portfolio__grid--paged {
        /* page changes scroll here — clear the floating header */
        scroll-margin-top: calc(var(--header-total) + 1.25rem);
    }

    @media (min-width: 1024px) {
        .portfolio__grid--paged { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    }

    @media (min-width: 1280px) {
        .portfolio__grid--paged { grid-template-columns: repeat(4, minmax(0, 1fr)); }
    }

    /* =====================================================
       BEFORE/AFTER COMPARISON — the redesign section's proof
       component. AFTER is the base layer; BEFORE sits on top,
       clipped to the left of the divider (--pos). The control
       is a REAL <input type=range> stretched over the frame:
       drag anywhere, keyboard arrows when focused — the
       accessibility comes native. --pos is driven through the
       CSSOM (style attributes are CSP-blocked here). Both
       images crop from the TOP, same as the card faces.
       ===================================================== */
    .compare {
        --pos: 50%;
        position: relative;
        aspect-ratio: 4 / 5;
        overflow: hidden; /* fallback */
        overflow: clip;
        border: 1px solid var(--glass-border);
        border-radius: 6px;
        background: var(--bg-deep);
    }

    .compare__img {
        position: absolute;
        inset: 0;
        width: 100%;
        height: 100%;
        object-fit: cover;
        object-position: top;
    }

    .compare__img--before {
        clip-path: inset(0 calc(100% - var(--pos)) 0 0);
    }

    .compare__divider {
        position: absolute;
        inset-block: 0;
        left: var(--pos);
        width: 2px;
        transform: translateX(-50%);
        background: var(--neon-aqua);
        box-shadow: 0 0 10px var(--neon-aqua), 0 0 22px rgba(115, 253, 252, 0.4);
        pointer-events: none;
    }

    /* the handle: a chamfered grip riding the divider's center */
    .compare__divider::after {
        content: "\f337"; /* fa arrows-left-right */
        font-family: "Font Awesome 6 Free";
        font-weight: 900;
        font-size: 0.8rem;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        display: grid;
        place-items: center;
        width: 38px;
        height: 38px;
        clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
        background: var(--grad-cta-deep);
        color: #fff;
    }

    .compare__range {
        position: absolute;
        inset: 0;
        width: 100%;
        height: 100%;
        margin: 0;
        opacity: 0; /* invisible control, fully functional */
        cursor: ew-resize;
    }

    /* focus ring on the FRAME when the invisible range has it.
       :focus-within is the everywhere-fallback; the :has() rule
       refines it to keyboard-only where supported. */
    .compare:focus-within {
        outline: 3px solid var(--neon-aqua);
        outline-offset: 3px;
    }

    .compare:has(.compare__range:focus-visible) {
        outline: 3px solid var(--neon-aqua);
        outline-offset: 3px;
    }

    .compare__tag {
        position: absolute;
        top: 0.7rem;
        z-index: 1;
        padding: 0.2rem 0.65rem;
        border-radius: 999px;
        border: 1px solid var(--glass-border);
        background: rgba(14, 10, 31, 0.85);
        font-family: var(--font-tech);
        font-size: var(--fs-3xs);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--text-muted);
        pointer-events: none;
    }

    .compare__tag--before { left: 0.7rem; }
    .compare__tag--after  { right: 0.7rem; color: var(--neon-aqua); }

    /* Rework entry: comparison LEFT, case details RIGHT at 1024
       (stacked below); the details reuse the prose hairline */
    .rework {
        display: grid;
        gap: 1.5rem;
    }

    .rework + .rework { margin-top: clamp(2.5rem, 6vh, 4rem); }

    @media (min-width: 1024px) {
        .rework {
            grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
            gap: clamp(2rem, 4vw, 3.5rem);
            align-items: start;
        }
    }

    /* The slider shell: clips the horizontal glide-in so the
       arriving panel never flashes a scrollbar at narrow widths */
    .rework-slider {
        overflow-x: hidden; /* fallback */
        overflow-x: clip;
    }

    /* Slider activation: the incoming rework glides in from the
       side the user is traveling toward — a nudge, not a ride.
       Reduced-motion gets the instant swap. */
    .rework--in-next { animation: rework-in-next 0.45s var(--ease) both; }
    .rework--in-prev { animation: rework-in-prev 0.45s var(--ease) both; }

    @keyframes rework-in-next {
        from { opacity: 0; transform: translateX(1.6rem); }
        to   { opacity: 1; transform: none; }
    }

    @keyframes rework-in-prev {
        from { opacity: 0; transform: translateX(-1.6rem); }
        to   { opacity: 1; transform: none; }
    }

    @media (prefers-reduced-motion: reduce) {
        .rework--in-next,
        .rework--in-prev { animation: none; }
    }

    .rework-slider__nav { margin-top: clamp(1.5rem, 4vh, 2.25rem); }

    /* The both-ways links: proof you can click. Old = muted,
       redesigned = lit — the hierarchy states the verdict. */
    .rework__links {
        display: flex;
        flex-wrap: wrap;
        gap: 0.6rem 1.6rem;
        margin: 1.35rem 0 0;
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
    }

    .rework__links a {
        display: inline-flex;
        align-items: center;
        gap: 0.45rem;
        text-decoration: none;
        transition: var(--transition);
    }

    .rework__links a i { font-size: 0.8em; }

    .rework__links a:first-child { color: var(--text-muted); }

    .rework__links a:first-child:hover { color: var(--text-secondary); }

    .rework__links a:last-child { color: var(--neon-aqua); }

    .rework__links a:last-child:hover { text-shadow: var(--glow-aqua); }

    .rework__name {
        font-family: var(--font-tech);
        font-size: var(--fs-lg);
        letter-spacing: var(--ls-wide);
        color: var(--text-primary);
        margin: 0 0 0.35rem;
    }

    .rework__scope {
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-purple);
        margin: 0 0 1.1rem;
    }

    /* Placeholder card: a reserved seat — dim, dashed, minimal.
       No button, no modal, no hover machinery; just an honest
       "more coming" that keeps the grid architecture visible. */
    .work-card--placeholder {
        border-style: dashed;
        border-color: rgba(182, 175, 214, 0.25);
        background: rgba(115, 253, 252, 0.02);
    }

    .work-card--placeholder:hover {
        transform: none;
        border-color: rgba(182, 175, 214, 0.4);
        box-shadow: none;
    }

    .work-card__blank {
        display: grid;
        place-items: center;
        align-content: center; /* cluster the icon + label as one
            group — without this, grid rows split the tall screen
            and the two pieces drift apart (screenshot-caught) */
        gap: 0.4rem;
        height: 100%;
        color: var(--text-muted);
        opacity: 0.7;
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        text-align: center;
    }

    .work-card__blank i {
        font-size: 1.4rem;
        color: var(--neon-aqua);
        text-shadow: 0 0 2px currentColor /* dimmed from 7px (field-caught fuzz) */;
        opacity: 0.55;
    }

    /* Pager: chamfered chip controls in the footer-console family.
       Built by JS (hidden until needed); current page wears the
       pink fill, everything else rests glass. */
    .pager {
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        align-items: center;
        gap: 0.5rem;
        margin-top: clamp(1.75rem, 4vh, 2.75rem);
    }

    .pager__btn {
        display: inline-grid;
        place-items: center;
        min-width: 44px;
        min-height: 44px;
        padding: 0.25rem 0.8rem;
        border: 1px solid var(--aqua-line);
        border-radius: 0; /* the chamfer is the shape */
        clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
        background: rgba(14, 10, 31, 0.7);
        color: var(--neon-aqua);
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        cursor: pointer;
        transition: var(--transition);
    }

    .pager__btn:hover {
        color: var(--text-primary);
        border-color: var(--neon-aqua);
        text-shadow: var(--glow-aqua);
    }

    .pager__btn[aria-current="page"] {
        background: var(--grad-cta-deep);
        border-color: transparent;
        color: #fff;
        text-shadow: none;
    }

    .pager__btn:disabled {
        opacity: 0.35;
        cursor: not-allowed;
        text-shadow: none;
    }

    /* Ghost card (house pattern B): the grid-hole placeholder.
       A dim dashed outline in the row family's shape — present
       enough to complete the grid, quiet enough to read as
       intentional negative space. Markup:
       <li class="ghost-card" aria-hidden="true">Your project here</li>
       Wrap its display rule in the breakpoint where the hole
       exists; it ships hidden by default. */
    .ghost-card {
        display: none;
        place-items: center;
        border: 1px dashed rgba(182, 175, 214, 0.28);
        border-radius: 6px;
        background: rgba(115, 253, 252, 0.03);
        color: var(--text-muted);
        opacity: 0.65;
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        padding: 1rem;
        text-align: center;
    }

    .ghost-card.is-shown { display: grid; }

    /* Numbered tile: the service-row icon tile carrying a step
       number instead of a glyph (the process section) */

    /* Prose block: constrained paragraph runs for the philosophy
       and fit sections — muted body copy, comfortable rhythm */
    .prose {
        position: relative; /* the hairline's anchor */
        display: grid;
        gap: 1.05rem;
        max-width: 62ch;
        padding-inline-start: 1.35rem;
    }

    /* Neon hairline: a lit vertical thread down the prose block's
       left edge — the separator gradient, stood upright */
    .prose::before {
        content: "";
        position: absolute;
        inset-block: 0.25em;
        left: 0;
        width: 2px;
        border-radius: 999px;
        background: linear-gradient(180deg,
            var(--aqua-line), var(--purple-line) 55%, transparent);
        box-shadow: 0 0 10px rgba(115, 253, 252, 0.3);
    }

    .prose p {
        margin: 0;
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        line-height: var(--lh-normal);
    }

    .prose strong { color: var(--text-primary); }

    /* Floating back-to-top: a chamfered chip riding the lower
       right corner — appears only after real scroll depth (JS
       adds .is-shown), glides in, and never fights the dialogs
       (they sit above it and lock scroll anyway). */
    .to-top {
        position: fixed;
        inset-block-end: calc(clamp(1rem, 3vh, 1.75rem) + 2rem); /* +32px
            lift — the chip was sitting ON the footer legal line
            (field-caught) */
        inset-inline-end: clamp(1rem, 3vw, 1.75rem);
        z-index: 900; /* under dialogs + scanlines, over content */
        display: grid;
        place-items: center;
        width: 42px;
        height: 42px; /* compacted from 48 (field request) */
        clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
        border: 1px solid var(--aqua-line);
        background: rgba(14, 10, 31, 0.85);
        color: var(--neon-aqua);
        font-size: 1rem;
        text-decoration: none;
        opacity: 0;
        transform: translateY(0.5rem);
        pointer-events: none;
        transition: var(--transition);
    }

    .to-top.is-shown {
        opacity: 1;
        transform: none;
        pointer-events: auto;
    }

    .to-top:hover {
        color: var(--text-primary);
        border-color: var(--neon-aqua);
        box-shadow: 0 0 14px rgba(115, 253, 252, 0.35);
    }

    .to-top:focus-visible {
        outline: 3px solid var(--neon-aqua);
        outline-offset: 3px;
    }

    @media (prefers-reduced-motion: reduce) {
        .to-top { transform: none; }
    }

    /* =====================================================
       RESOURCE-PAGE KIT: pricing table + FAQ accordions
       ===================================================== */

    /* Price table: a real <table> in glass. Small screens get a
       scroll pane (the honest responsive table strategy — no
       data lost, no cards pretending to be rows). */
    .table-pane {
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        border: 1px solid var(--glass-border);
        border-radius: 8px;
        /* the glass surface was never applied here — the pane had the
           border but sat transparent (field-caught) */
        background: var(--glass-bg);
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
    }

    .price-table {
        width: 100%;
        min-width: 560px;
        border-collapse: collapse;
        font-size: var(--fs-sm);
    }

    .price-table caption {
        padding: 0.85rem 1rem;
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-yellow);
        text-align: left;
    }

    .price-table th,
    .price-table td {
        padding: 0.8rem 1rem;
        text-align: left;
        border-top: 1px solid rgba(115, 253, 252, 0.12);
        vertical-align: top;
    }

    .price-table thead th {
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--neon-aqua);
        background: rgba(14, 10, 31, 0.6);
        border-top: none;
    }

    .price-table tbody th {
        font-weight: 700;
        color: var(--text-primary);
        white-space: nowrap;
    }

    .price-table td { color: var(--text-secondary) /* cohesion: homepage reading color (field request) */; }

    .price-table .price { color: var(--neon-yellow); font-weight: 700; white-space: nowrap; }

    /* =====================================================
       PRODUCTION SET (Heather's component library):
       tl-log mission timeline + element tiles
       Ported verbatim from hcwl-production-set-showcase.html
       ===================================================== */


    .tl-log {
        --bus-w: 0.875rem;                 /* the rail lane; 3.5rem at 768 */
        --node: 12px;                      /* 14px at 768 */
        --stamp-fs: var(--fs-sm);
        --stamp-line: calc(var(--stamp-fs) * 1.65);
        /* 320: node centers on the stamp's own line (the entry's
           first line). Re-derived at 768 from the card metrics. */
        --node-center: calc(var(--stamp-line) / 2);
        display: grid;
        max-width: 52rem;
        margin-inline: auto;
    }



    .tl-log__entry {
        display: grid;
        grid-template-columns: var(--bus-w) 1fr;
        column-gap: 0.65rem;
    }



    .tl-log__rail  { grid-column: 1; grid-row: 1 / 3; position: relative; }


    .tl-log__body {
        grid-column: 2;
        grid-row: 2;
        margin-bottom: clamp(1.5rem, 1rem + 2.5vw, 2.25rem);
    }


    .tl-log__entry:last-child .tl-log__body { margin-bottom: 0; }


    .tl-log__rail::before {
        content: "";
        position: absolute;
        left: 50%;
        translate: -50% 0;
        top: 0;
        bottom: 0;
        width: 2px;
        background: linear-gradient(to bottom, var(--hue), var(--hue-to, var(--hue)));
        box-shadow: 0 0 8px var(--hue-line);
    }


    .tl-log__rail::after {
        content: "";
        position: absolute;
        left: 50%;
        top: var(--node-center);
        translate: -50% -50%;
        width: var(--node);
        height: var(--node);
        border-radius: 50%;
        background: var(--hue);
        box-shadow:
            0 0 0 3px var(--bg-base),
            0 0 8px var(--hue),
            0 0 18px var(--hue-line);
    }


    .tl-log__entry:first-child .tl-log__rail::before { top: var(--node-center); }


    .tl-log__entry:last-child  .tl-log__rail::before { bottom: auto; height: var(--node-center); }



    .tl-log__stamp {
        grid-column: 2;
        grid-row: 1;
        padding-bottom: 0.4rem;
        font-family: var(--font-mono);
        font-size: var(--stamp-fs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--hue);
    }



    .tl-log__card {
        background: var(--glass-bg);
        border: 1px solid var(--glass-border);
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        padding: clamp(1.15rem, 0.9rem + 1.2vw, 1.6rem) clamp(1.2rem, 1rem + 1.1vw, 1.6rem); /* roomier (field sweep) */
        clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
        transition: var(--transition);
    }

    .tl-log__entry:hover .tl-log__card {
        border-color: var(--hue);
        filter:
            drop-shadow(0 0 10px var(--hue-soft))
            drop-shadow(0 0 24px var(--hue-soft));
    }



    .tl-log__card h3 {
        font-family: var(--font-body); /* Saira — card titles (was Orbitron) */
        font-size: var(--fs-h3);
        margin-bottom: 0.35rem;
    }


    .tl-log__card p { font-size: var(--fs-md); color: var(--text-secondary) /* cohesion: homepage reading color (field request) */; }


    .tl-log__entry[data-hue="aqua"]   { --hue: var(--neon-aqua);   --hue-soft: var(--aqua-soft);   --hue-line: var(--aqua-line); --hue-tint: rgba(115, 253, 252, 0.055); }


    .tl-log__entry[data-hue="pink"]   { --hue: var(--neon-pink);   --hue-soft: var(--pink-soft);   --hue-line: var(--pink-line); --hue-tint: rgba(255, 46, 151, 0.055); }


    .tl-log__entry[data-hue="purple"]   { --hue: var(--neon-purple); --hue-soft: var(--purple-soft); --hue-line: var(--purple-line); --hue-tint: rgba(199, 74, 192, 0.065); }


    .tl-log__entry[data-hue="yellow"]   { --hue: var(--neon-yellow); --hue-soft: var(--yellow-soft); --hue-line: var(--yellow-line); --hue-tint: rgba(255, 215, 0, 0.05); }


    .tl-log__entry[data-hue-to="aqua"]   { --hue-to: var(--neon-aqua); }


    .tl-log__entry[data-hue-to="pink"]   { --hue-to: var(--neon-pink); }


    .tl-log__entry[data-hue-to="purple"] { --hue-to: var(--neon-purple); }


    .tl-log__entry[data-hue-to="yellow"] { --hue-to: var(--neon-yellow); }

    @media (min-width: 768px) {

        .tl-log {
            --bus-w: 3.5rem;
            --node: 14px;
            /* re-derive: node centers on the CARD TITLE's first line.
               Same clamps the card itself renders with — both sides
               of the equation move together at every width. */
            --card-pad: clamp(0.9rem, 0.7rem + 1vw, 1.25rem);
            --title-line: calc(var(--fs-h3) * 1.3);
            --node-center: calc(var(--card-pad) + var(--title-line) / 2);
        }


        .tl-log__entry {
            grid-template-columns: 1fr var(--bus-w) 1fr;
            column-gap: 0;                 /* spur math needs flush edges */
        }


        .tl-log__rail { grid-column: 2; grid-row: 1; }

        .tl-log__stamp {
            grid-row: 1;
            line-height: var(--stamp-line);
            padding-top: calc(var(--node-center) - var(--stamp-line) / 2);
            padding-bottom: 0;
        }

        .tl-log__body { grid-row: 1; }

        .tl-log__entry:nth-child(odd)  .tl-log__body  { grid-column: 1; }

        .tl-log__entry:nth-child(odd)  .tl-log__stamp { grid-column: 3; text-align: left;  padding-left: 1.1rem; }

        .tl-log__entry:nth-child(even) .tl-log__body  { grid-column: 3; }

        .tl-log__entry:nth-child(even) .tl-log__stamp { grid-column: 1; text-align: right; padding-right: 1.1rem; }

        .tl-log__card { position: relative; }

        .tl-log__card::before {
            content: "";
            position: absolute;
            top: var(--node-center);
            translate: 0 -50%;
            width: calc(var(--bus-w) / 2 - var(--node) / 2);
            height: 2px;
            background: var(--hue);
            opacity: 0.6;
            box-shadow: 0 0 6px var(--hue-line);
        }

        .tl-log__entry:nth-child(odd)  .tl-log__card::before { left: 100%; }

        .tl-log__entry:nth-child(even) .tl-log__card::before { right: 100%; }
    }


    .elements {
        display: grid;
        grid-template-columns: repeat(2, 1fr);
        gap: clamp(0.9rem, 2vw, 1.4rem);
        /* full content width — the tiles share the section's left
           edge with the head and the checklist below (the centered
           56rem cap made them a small strip floating off-axis) */
        margin-bottom: clamp(2.25rem, 6vh, 3.5rem);
    }

    @media (min-width: 640px) {
     .elements { grid-template-columns: repeat(3, 1fr); }
    }

    @media (min-width: 1024px) {
     .elements { grid-template-columns: repeat(6, 1fr); }
    }



    .element {
        position: relative;
        aspect-ratio: 1;
        display: grid;
        align-content: center;
        justify-items: center;
        gap: 0.15rem;
        padding: 1rem 0.7rem; /* roomier (field sweep) */
        border: 1px solid var(--glass-border); /* ignition target for the hue hover */
        background: var(--glass-bg);
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
        transition: transform var(--transition), filter var(--transition), border-color var(--transition);
    }


    /* Chamfered components glow via drop-shadow FILTERS: clip-path
       clips box-shadows away, but filters render post-clip and the
       glow traces the cut corners — the chamfer becomes neon. */
    .element:hover {
        transform: translateY(-4px);
        border-color: var(--hue);
        filter:
            drop-shadow(0 0 10px var(--hue-soft))
            drop-shadow(0 0 26px var(--hue-soft))
            drop-shadow(0 10px 22px rgba(0, 0, 0, 0.4));
    }



    .element__num {
        position: absolute;
        top: 0.5rem;
        left: 0.75rem;
        font-family: var(--font-mono);
        font-size: var(--fs-3xs);
        color: var(--text-muted);
    }



    .element__symbol {
        font-family: var(--font-tech);
        font-weight: 900;
        font-size: clamp(1.6rem, 1.2rem + 1.6vw, 2.1rem);
        line-height: 1;
        color: var(--hue);
        text-shadow: 0 0 12px var(--hue-soft), 0 0 26px var(--hue-soft);
    }



    .element__name {
        font-family: var(--font-tech);
        font-size: var(--fs-3xs);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--text-secondary);
        text-align: center;
    }



    .element__mass {
        font-family: var(--font-mono);
        font-size: var(--fs-3xs);
        color: var(--text-muted);
    }


    .panel__chip[data-hue="aqua"],   .note-card[data-hue="aqua"],   .element[data-hue="aqua"]   { --hue: var(--neon-aqua);   --hue-soft: var(--aqua-soft);   --hue-line: var(--aqua-line); --hue-tint: rgba(115, 253, 252, 0.055); }


    .panel__chip[data-hue="pink"],   .note-card[data-hue="pink"],   .element[data-hue="pink"]   { --hue: var(--neon-pink);   --hue-soft: var(--pink-soft);   --hue-line: var(--pink-line); --hue-tint: rgba(255, 46, 151, 0.055); }


    .panel__chip[data-hue="purple"], .note-card[data-hue="purple"], .element[data-hue="purple"] { --hue: var(--neon-purple); --hue-soft: var(--purple-soft); --hue-line: var(--purple-line); --hue-tint: rgba(199, 74, 192, 0.065); }


    .panel__chip[data-hue="yellow"], .note-card[data-hue="yellow"], .element[data-hue="yellow"] { --hue: var(--neon-yellow); --hue-soft: var(--yellow-soft); --hue-line: var(--yellow-line); --hue-tint: rgba(255, 215, 0, 0.05); }


    /* (shared gradient surface rule relocated below — cascade order) */

    /* --- panel chips + note cards + hazard — production set, ported --- */


    .panel {
        display: flex;
        flex-wrap: wrap;
        gap: 0.7rem;
        justify-content: center;
        max-width: 58rem;
        margin-inline: auto;
    }



    .panel__chip {
        display: inline-flex;
        align-items: center;
        gap: 0.55rem;
        padding: 0.6rem 1rem;
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--text-secondary);
        /* neon borderline AT REST — each chip wears its own hue */
        border: 1px solid var(--hue-line, var(--glass-border));
        /* doubled tint: the shared 0.055 layer reads as nothing at
           chip scale, so chips stack it twice (~0.11 effective) */
        background:
            linear-gradient(var(--hue-tint, transparent), var(--hue-tint, transparent)),
            linear-gradient(var(--hue-tint, transparent), var(--hue-tint, transparent)),
            var(--glass-bg);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
        transition: transform var(--transition), filter var(--transition), color var(--transition), border-color var(--transition);
    }


    .panel__chip i { color: var(--hue); font-size: var(--icon-sm); }



    .panel__chip:hover {
        transform: translateY(-3px);
        color: var(--hue);
        border-color: var(--hue);
        filter:
            drop-shadow(0 0 10px var(--hue-soft))
            drop-shadow(0 0 26px var(--hue-soft));
    }


    .notes {
        display: grid;
        gap: 1.25rem;
    }

    @media (min-width: 640px) {
     .notes { grid-template-columns: repeat(2, 1fr); }
    }

    @media (min-width: 1024px) {
     .notes { grid-template-columns: repeat(3, 1fr); gap: 1.5rem; }
    }



    .note-card {
        position: relative;
        /* flex column so the meta line can anchor to the card
           FLOOR — three cards, three different title lengths, one
           level "In the works" baseline across the row */
        display: flex;
        flex-direction: column;
        gap: 0.85rem;
        padding: clamp(1.7rem, 3vw, 2.1rem) clamp(1.5rem, 2.5vw, 1.9rem); /* roomier (field sweep) */
        border: 1px solid var(--glass-border); /* ignition target for the hue hover */
        background: var(--glass-bg);
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        clip-path: polygon(12px 0, 100% 0, 100% calc(100% - 12px), calc(100% - 12px) 100%, 0 100%, 0 12px);
        transition: transform var(--transition), filter var(--transition), border-color var(--transition);
    }


    .note-card:hover,
    .note-card:focus-within {
        transform: translateY(-4px);
        border-color: var(--hue);
        filter:
            drop-shadow(0 0 12px var(--hue-soft))
            drop-shadow(0 0 30px var(--hue-soft))
            drop-shadow(0 10px 24px rgba(0, 0, 0, 0.45));
    }



    .note-card__chip {
        justify-self: start;
        font-family: var(--font-tech);
        font-size: 0.65rem; /* ~10.4px — a step under --fs-3xs
            (field-caught: Orbitron's square glyphs read 2-3px larger
            than set size; at 11px the chips overpowered the cards) */
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--hue);
        background: var(--hue-soft);
        padding: 0.25rem 0.6rem; /* slimmer pill to match */
        clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px);
    }



    .note-card h3 { font-family: var(--font-body); /* Saira — card titles (was Orbitron) */ font-size: var(--fs-h3); }


    .note-card h3 a { color: var(--text-primary); text-decoration: none; }


    .note-card h3 a::after { content: ""; position: absolute; inset: 0; }


    .note-card h3 a:hover { color: var(--hue); }



    .note-card > p { font-size: var(--fs-md); color: var(--text-secondary) /* cohesion: homepage reading color (field request) */; }



    .note-card__meta {
        margin-top: auto; /* anchored to the card floor */
        display: flex;
        align-items: center;
        gap: 0.6rem;
        border-top: 1px solid var(--glass-border);
        padding-top: 0.85rem;
        font-size: var(--fs-xs);
        color: var(--text-muted);
    }


    .note-card__meta i:last-child {
        margin-left: auto;
        color: var(--hue);
        transition: transform var(--transition);
    }


    .note-card:hover .note-card__meta i:last-child,
    .note-card:focus-within .note-card__meta i:last-child { transform: translateX(4px); }


    .hazard {
        position: relative;
        max-width: 56rem;
        margin-inline: auto;
        padding: clamp(1.75rem, 5vw, 2.75rem);
        /* warm-tinted, ELEVATED surface — the old rgba(14,10,31)
           nearly matched the page background and the advisory
           sank into it (field-caught) */
        background:
            linear-gradient(rgba(255, 213, 74, 0.07), rgba(255, 213, 74, 0.02)),
            rgba(26, 20, 52, 0.88);
        backdrop-filter: blur(12px);
        -webkit-backdrop-filter: blur(12px);
        border-block: 1px solid var(--yellow-line);
        transition: var(--transition);
    }

    /* gold glow on hover — the advisory answers in its own color */
    .hazard:hover {
        border-block-color: var(--neon-yellow);
        box-shadow:
            0 0 22px rgba(255, 213, 74, 0.16),
            0 0 58px rgba(255, 213, 74, 0.07);
    }



    .hazard::before, .hazard::after {
        content: "";
        position: absolute;
        left: 0;
        right: 0;
        height: 8px;
        background: repeating-linear-gradient(-45deg,
            var(--neon-yellow) 0 12px, transparent 12px 24px);
        opacity: 0.55;
    }


    .hazard::before { top: 0; }


    .hazard::after  { bottom: 0; }



    .hazard__chip {
        display: inline-flex;
        align-items: center;
        gap: 0.5rem;
        font-family: var(--font-mono);
        font-size: var(--fs-3xs);
        font-weight: 600;
        letter-spacing: var(--ls-wider);
        text-transform: uppercase;
        color: var(--bg-base);
        background: var(--neon-yellow);
        padding: 0.35rem 0.8rem;
        margin-bottom: 1rem;
        clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
    }



    .hazard h2 {
        font-family: var(--font-body); /* Saira — card titles (was Orbitron) */
        font-size: clamp(1.3rem, 1rem + 1.5vw, 1.8rem);
        margin-bottom: 0.6rem;
    }


    /* :not(.hazard__chip) — the chip is also a direct-child <p>,
       and this rule's higher specificity was painting its text
       muted gray on the yellow plate (contrast failure, field-
       caught). The chip keeps its own dark-on-yellow colors. */
    .hazard > p:not(.hazard__chip) { color: var(--text-secondary) /* cohesion: homepage reading color (field request) */; font-size: var(--fs-md); margin-bottom: 1.25rem; }



    .hazard__cta {
        display: inline-flex;
        align-items: center;
        gap: 0.55rem;
        padding: 0.75rem 1.4rem;
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        text-decoration: none;
        color: #fff;
        background: var(--grad-cta-deep);
        clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
        transition: transform var(--transition), filter var(--transition);
    }


    .hazard__cta:hover { transform: translateY(-2px); filter: drop-shadow(0 0 12px rgba(255, 46, 151, 0.45)); }


    /* (shared surface rule already ported) */





    /* --- signal cards (testimonials) — production set, ported --- */


    .signals {
        display: grid;
        gap: 1.25rem;
    }

    @media (min-width: 768px) {
     .signals { grid-template-columns: repeat(2, 1fr); }
    }

    @media (min-width: 1024px) {
     .signals { grid-template-columns: repeat(3, 1fr); gap: 1.5rem; }
    }



    .signal-card {
        position: relative;
        display: grid;
        gap: 1rem;
        align-content: start;
        padding: 1.5rem 1.4rem 1.4rem;
        border: 1px solid var(--glass-border); /* ignition target for the hue hover */
        background: var(--glass-bg);
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        clip-path: polygon(12px 0, 100% 0, 100% calc(100% - 12px), calc(100% - 12px) 100%, 0 100%, 0 12px);
        transition: transform var(--transition), filter var(--transition), border-color var(--transition);
    }


    .signal-card::before {
        content: "";
        position: absolute;
        inset: 12px auto 12px 0;
        width: 3px;
        background: linear-gradient(to bottom, var(--hue), transparent 90%);
        opacity: 0.9;
    }


    .signal-card:hover {
        transform: translateY(-4px);
        border-color: var(--hue);
        filter:
            drop-shadow(0 0 12px var(--hue-soft))
            drop-shadow(0 0 30px var(--hue-soft))
            drop-shadow(0 12px 24px rgba(0, 0, 0, 0.45));
    }



    .signal-card__meta {
        display: flex;
        align-items: center;
        gap: 0.6rem;
        font-family: var(--font-mono);
        font-size: var(--fs-2xs);
        font-weight: 600;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--hue);
    }


    .signal-card__meta i { font-size: 0.9em; }



    .signal-card__quote p {
        font-size: var(--fs-md);
        color: var(--text-secondary);
    }



    .signal-card__source {
        display: grid;
        gap: 0.1rem;
        border-top: 1px solid var(--glass-border);
        padding-top: 0.9rem;
        font-size: var(--fs-xs);
    }


    .signal-card__source strong { color: var(--text-primary); font-size: var(--fs-sm); }


    .signal-card__source span   { color: var(--text-muted); }


    .signal-card[data-hue="aqua"]  { --hue: var(--neon-aqua);   --hue-soft: var(--aqua-soft);   --hue-line: var(--aqua-line); --hue-tint: rgba(115, 253, 252, 0.055); }


    .signal-card[data-hue="pink"]  { --hue: var(--neon-pink);   --hue-soft: var(--pink-soft);   --hue-line: var(--pink-line); --hue-tint: rgba(255, 46, 151, 0.055); }


    .signal-card[data-hue="purple"]  { --hue: var(--neon-purple); --hue-soft: var(--purple-soft); --hue-line: var(--purple-line); --hue-tint: rgba(199, 74, 192, 0.065); }


    .signal-card[data-hue="yellow"]  { --hue: var(--neon-yellow); --hue-soft: var(--yellow-soft); --hue-line: var(--yellow-line); --hue-tint: rgba(255, 215, 0, 0.05); }


    /* SHARED GRADIENT SURFACE — lives BELOW every component base
       deliberately: each base sets a plain glass background, and
       this composite (hue tint over glass) must win the cascade
       for all five components. */
    /* (.panel__chip left this roster: it composes its own DOUBLED
       tint at chip scale — see its base rule) */
    .tl-log__card,
    .signal-card,
    .note-card,
    .element {
        background:
            linear-gradient(var(--hue-tint, transparent), var(--hue-tint, transparent)),
            var(--glass-bg);
    }

    /* =====================================================
       SERVICES-PAGE KIT: fit comparison + rate fact chips
       ===================================================== */

    /* Fit comparison: two glass panels — who thrives here vs who
       needs a different studio. Replaces two bold-led paragraphs
       with something scannable (and honest in both directions). */
    .fit-grid {
        display: grid;
        gap: 1.2rem;
    }

    .fit-panel {
        padding: clamp(1.6rem, 3vw, 2.1rem) clamp(1.5rem, 2.5vw, 1.9rem);
        background: var(--glass-bg);
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        border: 1px solid var(--aqua-line);
        border-top: 3px solid var(--neon-aqua);
        border-radius: 6px;
    }

    .fit-panel--no {
        border-color: rgba(255, 46, 151, 0.35);
        border-top-color: var(--neon-pink);
    }

    .fit-panel__title {
        display: flex;
        align-items: center;
        gap: 0.7rem;
        margin-bottom: 1.25rem;
        /* separator between the head and the list (field request) */
        padding-bottom: 0.85rem;
        border-bottom: 1px solid var(--aqua-line);
        font-family: var(--font-body); /* Saira — card titles */
        font-size: var(--fs-lg);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        color: var(--text-primary);
    }

    .fit-panel__title i { font-size: 1.15em; color: var(--neon-aqua); }

    .fit-panel--no .fit-panel__title i { color: var(--neon-pink); }

    .fit-panel--no .fit-panel__title { border-bottom-color: var(--pink-line); }

    .fit-panel__list {
        display: grid;
        gap: 1rem;
        list-style: none;
    }

    .fit-panel__list li {
        display: flex;
        gap: 0.8rem;
        align-items: baseline;
        color: var(--text-secondary);
        font-size: var(--fs-body);
        line-height: var(--lh-normal);
    }

    .fit-panel__list i {
        flex-shrink: 0;
        font-size: 1em; /* was 0.8em — the marks matched the shrunk text */
        color: var(--neon-aqua);
        translate: 0 1px;
    }

    .fit-panel--no .fit-panel__list i { color: var(--neon-pink); }

    .fit-note {
        margin-top: 1.5rem;
        margin-inline: auto; /* center the BOX — the global prose
            measure was pinning it left with centered text inside
            (field-caught) */
        color: var(--text-muted);
        font-size: var(--fs-md);
        text-align: center;
        font-style: italic;
    }

    @media (min-width: 768px) {
        .fit-grid { grid-template-columns: 1fr 1fr; gap: 1.5rem; }
    }

    /* Rate fact chips: the pricing facts as chamfered hardware —
       the same 8px cut as the pager chips (house geometry) */
    .fact-chips {
        display: flex;
        flex-wrap: wrap;
        gap: 0.7rem;
        margin-top: 1.4rem;
        list-style: none;
    }

    .fact-chip {
        display: inline-flex;
        align-items: baseline;
        gap: 0.4rem;
        padding: 0.55rem 1rem;
        border: 1px solid var(--aqua-line);
        clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
        background: rgba(14, 10, 31, 0.55);
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--text-muted);
    }

    .fact-chip strong {
        font-size: 1.25em;
        color: var(--neon-yellow);
        letter-spacing: normal;
    }

    .fact-chip--link {
        padding: 0;
        border-color: var(--neon-aqua);
    }

    .fact-chip--link a {
        display: inline-flex;
        align-items: baseline;
        gap: 0.4rem;
        padding: 0.55rem 1rem;
        text-decoration: none;
        color: var(--neon-aqua);
        transition: var(--transition);
    }

    .fact-chip--link a:hover { text-shadow: var(--glow-aqua); }

    /* Connect channels: exactly three equal cards (email / phone /
       location) — a dedicated 3-up so nothing orphans, with the
       value on top and a muted qualifier note beneath it. */
    .services__list--channels {
        display: grid;
        gap: 1rem;
    }

    .service-row__note {
        display: block;
        margin-top: 0.35rem;
        color: var(--text-muted);
        font-size: var(--fs-sm);
    }

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

    /* =====================================================
       DOCUMENT CARD — a purpose-built card for the documents
       page. Icon + title form a tight header ROW (the service-row
       grid stranded long titles across a full-width cell); copy
       and the PDF link stack cleanly beneath.
       ===================================================== */
    .doc-grid {
        display: grid;
        gap: 1rem;
    }

    .doc-card {
        display: flex;
        flex-direction: column;
        gap: 0.9rem;
        padding: clamp(1.7rem, 3vw, 2.1rem) clamp(1.6rem, 2.6vw, 2rem); /* roomier (field request) */
        background: var(--glass-bg);
        border: 1px solid var(--glass-border);
        border-top: 3px solid var(--hue, var(--neon-aqua));
        border-radius: 8px;
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        transition: var(--transition);
    }

    .doc-card[data-hue="aqua"]   { --hue: var(--neon-aqua);   --hue-soft: var(--aqua-soft); }
    .doc-card[data-hue="pink"]   { --hue: var(--neon-pink);   --hue-soft: var(--pink-soft); }
    .doc-card[data-hue="purple"] { --hue: var(--neon-purple); --hue-soft: var(--purple-soft); }
    .doc-card[data-hue="yellow"] { --hue: var(--neon-yellow); --hue-soft: var(--yellow-soft); }

    .doc-card:hover {
        border-color: var(--hue);
        filter: /* fallback: hue-soft glow */
            drop-shadow(0 0 10px var(--hue-soft, rgba(115, 253, 252, 0.3)))
            drop-shadow(0 8px 20px rgba(0, 0, 0, 0.4));
    }

    @supports (color: color-mix(in oklch, red 30%, transparent)) {
        .doc-card:hover {
            filter:
                drop-shadow(0 0 10px color-mix(in oklch, var(--hue) 30%, transparent))
                drop-shadow(0 8px 20px rgba(0, 0, 0, 0.4));
        }
    }

    /* the header: icon and title locked together, left-aligned */
    .doc-card__head {
        display: flex;
        align-items: center;
        gap: 0.85rem;
    }

    .doc-card__icon {
        flex-shrink: 0;
        display: grid;
        place-items: center;
        width: 2.75rem;
        height: 2.75rem;
        border-radius: 8px;
        background: var(--hue-soft, rgba(115, 253, 252, 0.14)); /* fallback */
        background: color-mix(in oklch, var(--hue) 14%, transparent);
        color: var(--hue);
        font-size: 1.15rem;
    }

    .doc-card__title {
        font-family: var(--font-body);
        font-size: var(--fs-h3);
        font-weight: 700;
        line-height: var(--lh-subhead);
        color: var(--text-primary);
        margin: 0;
    }

    .doc-card__copy {
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        line-height: var(--lh-normal);
        margin: 0;
        max-width: none;
        flex: 1; /* push the PDF link to the card floor — even rows */
    }

    .doc-card .doc-link { margin-top: 0; align-self: flex-end; /* bottom-right (field request) */ }

    @media (min-width: 768px) {
        .doc-grid { grid-template-columns: 1fr 1fr; gap: 1.25rem; }
    }

    /* =====================================================
       PAY DUO — the Always Included section's two glass panels:
       baseline checklist (aqua) beside payment terms (gold), with
       the 50/25/25 milestones as visible chips instead of a
       buried sentence.
       ===================================================== */
    .pay-duo {
        display: grid;
        gap: 1.25rem;
    }

    .pay-panel {
        padding: clamp(1.5rem, 3vw, 2rem) clamp(1.3rem, 2.5vw, 1.8rem);
        /* RAISED SURFACE (field-chosen): the advisory's elevated
           recipe, hue-keyed — a tinted wash over a lifted plum base
           instead of near-page glass. Fallback = flat lifted base;
           color-mix browsers add the wash below. Frost pilot retired. */
        background: rgba(26, 20, 52, 0.88);
        border: 1px solid var(--glass-border);
        border-top: 3px solid var(--hue, var(--neon-aqua));
        border-radius: 8px;
        backdrop-filter: blur(12px) saturate(150%);
        -webkit-backdrop-filter: blur(12px) saturate(150%);
    }

    @supports (background: color-mix(in srgb, red 7%, transparent)) {
        .pay-panel {
            background:
                linear-gradient(
                    color-mix(in srgb, var(--hue, var(--neon-aqua)) 8%, transparent),
                    color-mix(in srgb, var(--hue, var(--neon-aqua)) 2%, transparent)),
                rgba(26, 20, 52, 0.88);
        }
    }

    .pay-panel[data-hue="aqua"]   { --hue: var(--neon-aqua);   --hue-line: var(--aqua-line); }
    .pay-panel[data-hue="yellow"] { --hue: var(--neon-yellow); --hue-line: var(--yellow-line, rgba(240, 233, 78, 0.5)); }

    .pay-panel__title {
        display: flex;
        align-items: center;
        gap: 0.6rem;
        font-family: var(--font-body);
        font-size: var(--fs-lg);
        font-weight: 700;
        color: var(--text-primary);
        margin-bottom: 1.1rem;
        padding-bottom: 0.75rem;
        border-bottom: 1px solid var(--hue-line); /* the house head rule */
    }

    .pay-panel__title i { color: var(--hue); font-size: 1.1em; }

    .pay-panel__lead { color: var(--text-secondary); margin: 0 0 0.8rem; max-width: none; }

    .pay-terms {
        display: grid;
        gap: 1rem 2.5rem;
    }

    @media (min-width: 1024px) {
        .pay-terms { grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr); align-items: start; }

        /* vertical divider between the two halves of the strip */
        .pay-terms__col + .pay-terms__col {
            border-inline-start: 1px solid var(--glass-border);
            padding-inline-start: 2.25rem;
        }
    }

    /* the milestone chips: pct in gold tech caps, stage beneath */
    .milestones {
        display: flex;
        flex-wrap: wrap;
        gap: 0.75rem;
        list-style: none;
        padding: 0;
        margin: 0 0 1.1rem;
    }

    .milestone {
        flex: 1 1 0;
        min-width: 7rem;
        display: grid;
        justify-items: center;
        gap: 0.2rem;
        padding: 0.75rem 0.6rem;
        border: 1px solid var(--yellow-line, rgba(240, 233, 78, 0.5));
        border-radius: 6px;
        background: rgba(240, 233, 78, 0.06);
    }

    .milestone__pct {
        font-family: var(--font-tech);
        font-size: var(--fs-md);
        font-weight: 800;
        letter-spacing: var(--ls-wide);
        color: var(--neon-yellow);
    }

    .milestone__at {
        font-size: var(--fs-xs);
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--text-muted);
        text-align: center;
    }

    .pay-panel__copy {
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        line-height: var(--lh-normal);
        margin: 0 0 0.8rem;
        max-width: none;
    }

    .pay-panel__copy:last-child { margin-bottom: 0; }

    /* stacked strips (field-corrected from side-by-side): checklist
       full-width on top, payment full-width beneath */

    /* Turnaround tiers: three escalating time bands — a horizontal
       scale (small -> standard -> large) that reads as duration,
       not prose. The connecting rail implies progression. */
    .tiers {
        display: grid;
        gap: 1rem;
        counter-reset: tier;
    }

    .tier {
        display: grid;
        grid-template-columns: auto 1fr;
        gap: 0.3rem 1.1rem;
        align-items: baseline;
        padding: clamp(1.4rem, 2.4vw, 1.8rem) clamp(1.3rem, 2.2vw, 1.7rem); /* roomier (field sweep) */
        background: var(--glass-bg);
        border: 1px solid var(--glass-border);
        border-left: 3px solid var(--hue, var(--neon-aqua));
        border-radius: 6px;
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
    }

    .tier[data-hue="aqua"]   { --hue: var(--neon-aqua); }
    .tier[data-hue="pink"]   { --hue: var(--neon-pink); }
    .tier[data-hue="purple"] { --hue: var(--neon-purple); }

    .tier__range {
        grid-column: 1;
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        color: var(--hue);
        white-space: nowrap;
    }

    .tier__label {
        grid-column: 2;
        font-weight: 700;
        color: var(--text-primary);
    }

    .tier__copy {
        grid-column: 1 / -1;
        margin: 0.3rem 0 0;
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        font-size: var(--fs-sm);
        line-height: var(--lh-snug);
        max-width: none;
    }

    @media (min-width: 768px) {
        .tier { grid-template-columns: 13rem 1fr; }

        /* VERTICAL divider between the range label and the content
           column (field-corrected: the earlier horizontal rule under
           the title was the wrong read) */
        .tier__label,
        .tier__copy {
            border-inline-start: 1px solid var(--glass-border);
            padding-inline-start: 1.1rem;
        }

        .tier__copy { grid-column: 2; }
    }

    /* Price badge on a service card (the pricing-page card grid) */
    .service-row__price {
        grid-column: 1 / -1; /* own row — auto-placed into col 1 it
            inflated the icon column to badge width, pushing titles
            far right (the field-caught gap) */
        display: inline-block;
        margin-top: 0.15rem;
        font-family: var(--font-tech);
        font-size: var(--fs-sm);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        color: var(--neon-yellow);
    }

    /* Document link: the PDF affordance on a document card */
    .doc-link {
        display: inline-flex;
        align-items: center;
        gap: 0.45rem;
        margin-top: 0.85rem;
        font-family: var(--font-tech);
        font-size: var(--fs-2xs);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        text-transform: uppercase;
        text-decoration: none;
        color: var(--neon-aqua);
        transition: var(--transition);
    }

    .doc-link:hover { text-shadow: var(--glow-aqua); }

    .doc-link i { font-size: 1.05em; }

    /* FAQ: native <details> accordions in the service-row skin —
       accessible for free (keyboard, AT, no JS required) */
    .faq { display: grid; gap: 0.8rem; }

    .faq details {
        border: 1px solid var(--aqua-line);
        border-radius: 6px;
        background: var(--glass-bg);
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
    }

    .faq summary {
        display: flex;
        align-items: baseline;
        gap: 0.7rem;
        padding: 1rem 1.15rem;
        cursor: pointer;
        font-family: var(--font-tech);
        font-weight: 700;
        letter-spacing: var(--ls-wide);
        color: var(--text-primary);
        list-style: none; /* the chevron below is the marker */
    }

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

    .faq summary::before {
        content: "\f054"; /* fa chevron-right */
        font-family: "Font Awesome 6 Free";
        font-weight: 900;
        font-size: 0.7em;
        color: var(--neon-aqua);
        transition: transform var(--transition);
        flex-shrink: 0;
    }

    .faq details[open] summary::before { transform: rotate(90deg); }

    .faq summary:focus-visible {
        outline: 3px solid var(--neon-aqua);
        outline-offset: 2px;
        border-radius: 6px;
    }

    .faq details > p {
        margin: 0;
        padding: 0 1.15rem 1.1rem 2.55rem;
        color: var(--text-secondary) /* cohesion: homepage reading color (field request) */;
        line-height: var(--lh-normal);
        max-width: none;
    }

    /* Placeholder links (spec: <a> without href) — the social
       icons awaiting real profile URLs. Inert, unfocusable,
       default cursor: honest about not going anywhere yet. */
    a:not([href]) { cursor: default; }

    /* Form panel: the connect console — the form in floating
       glass, same family as the nav panel and CTA band */
    .form-panel {
        padding: clamp(1.5rem, 4vw, 2.25rem);
        background: var(--glass-bg);
        border: 1px solid var(--glass-border);
        border-radius: 10px;
        backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(160%);
        box-shadow: 0 14px 44px rgba(0, 0, 0, 0.4);
    }

    /* Select joins the input family — UA chrome stripped, the
       house chevron painted in (data: URI is CSP-sanctioned for
       images). Options get the dark treatment where engines
       allow; the closed control is fully ours either way. */
    .review__input--select {
        appearance: none;
        -webkit-appearance: none;
        padding-right: 2.6rem;
        background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%2373fdfc' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
        background-repeat: no-repeat;
        background-position: right 1rem center;
        cursor: pointer;
    }

    .review__input--select option {
        background-color: var(--bg-deep);
        color: var(--text-primary);
    }

    /* the placeholder option reads muted while unchosen */
    .review__input--select:invalid { color: var(--text-muted); }

    /* Textarea joins the input family (the connect form's message) */
    textarea.review__input {
        min-height: 8.5rem; /* harmonized — this later rule was
            silently overriding the 8.5rem calm-down at 9.5
            (cascade-audit-caught) */
        max-height: 20rem;
        resize: vertical;
        line-height: var(--lh-snug);
    }

        /* --- Included checklist (services page): what every build
       ships with — compact two-column check grid --- */
    .includes {
        list-style: none;
        margin: 0;
        padding: 0;
        display: grid;
        gap: 1.15rem 2rem;
    }

    @media (min-width: 640px) {
        .includes { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    }

    .includes li {
        display: grid;
        grid-template-columns: auto 1fr;
        gap: 0.9rem;
        align-items: baseline;
        font-size: var(--fs-body); /* was fs-sm — the floor deserves body scale */
        line-height: var(--lh-normal);
        color: var(--text-secondary);
    }

    .includes i {
        font-size: 1.3em; /* checks read as marks, not specks */
        color: var(--neon-aqua);
        text-shadow: 0 0 6px currentColor;
    }

    .includes strong {
        color: var(--text-primary);
    }

    /* Gold highlight (ported) — for THE promise words, used sparingly */
    .hl-gold {
        color: var(--neon-yellow);
        text-shadow: var(--glow-yellow);
        font-weight: 600;
    }

    .visually-hidden {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
    }
}

/* ---------------- REDUCED MOTION — unlayered, always wins ---------------- */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-delay: 0s !important; /* also kill delays — the
            reveal failsafe's 1.2s wait must not strand content */
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }
}
